# HG changeset patch
# User Wuzzy <almikes@aol.com>
# Date 1506193557 -7200
# Node ID 82c75a317d48ce46ae087797fd5e442c4fe67d54
# Parent  b393a63086626e97100549aeaed9bcb5153a2d5a
Randomized teams now can have any random hats (not just from types.ini)

The predefined hat sets still work, however. There are now 3 types of hat selections:
1) Use hats from types.ini
2) Randomly select one hat for all hedgehogs
3) Randomly select hat for each hedgehog (rare)

diff -r b393a6308662 -r 82c75a317d48 ChangeLog.txt
--- a/ChangeLog.txt	Sat Sep 23 20:05:16 2017 +0200
+++ b/ChangeLog.txt	Sat Sep 23 21:05:57 2017 +0200
@@ -225,6 +225,7 @@
  + New teams start with a random grave and fort
  + Hedgewars creates 4 teams instead of 1 on its first launch
  + Allow to randomize hog names, hats, team name, flag, grave, voice and fort separately
+ + “Random team” button is now able to randomly select from all available hats
  * Campaign screen does no longer show AI-controlled teams
  * Campaign names and campaign mission names can now be translated
  * Creating randomized teams now randomizes (almost) every aspect
diff -r b393a6308662 -r 82c75a317d48 QTfrontend/game.cpp
--- a/QTfrontend/game.cpp	Sat Sep 23 20:05:16 2017 +0200
+++ b/QTfrontend/game.cpp	Sat Sep 23 21:05:57 2017 +0200
@@ -154,7 +154,7 @@
     team1.setDifficulty(0);
     team1.setColor(0);
     team1.setNumHedgehogs(4);
-    HWNamegen::teamRandomEverything(team1, HWNamegen::rtmEverything);
+    HWNamegen::teamRandomEverything(team1);
     team1.setVoicepack("Default");
     HWProto::addStringListToBuffer(teamscfg,
                                    team1.teamGameConfig(100));
@@ -164,7 +164,7 @@
     team2.setColor(1);
     team2.setNumHedgehogs(4);
     do
-        HWNamegen::teamRandomEverything(team2, HWNamegen::rtmEverything);
+        HWNamegen::teamRandomEverything(team2);
     while(!team2.name().compare(team1.name()) || !team2.hedgehog(0).Hat.compare(team1.hedgehog(0).Hat));
     team2.setVoicepack("Default");
     HWProto::addStringListToBuffer(teamscfg,
diff -r b393a6308662 -r 82c75a317d48 QTfrontend/ui/page/pageeditteam.cpp
--- a/QTfrontend/ui/page/pageeditteam.cpp	Sat Sep 23 20:05:16 2017 +0200
+++ b/QTfrontend/ui/page/pageeditteam.cpp	Sat Sep 23 21:05:57 2017 +0200
@@ -474,14 +474,14 @@
 void PageEditTeam::setRandomTeam()
 {
     HWTeam team = data();
-    HWNamegen::teamRandomEverything(team, HWNamegen::rtmEverything);
+    HWNamegen::teamRandomEverything(team);
     loadTeam(team);
 }
 
 void PageEditTeam::setRandomHogNames()
 {
     HWTeam team = data();
-    HWNamegen::teamRandomEverything(team, HWNamegen::rtmHogNames);
+    HWNamegen::teamRandomHogNames(team);
     loadTeam(team);
 }
 
diff -r b393a6308662 -r 82c75a317d48 QTfrontend/util/namegen.cpp
--- a/QTfrontend/util/namegen.cpp	Sat Sep 23 20:05:16 2017 +0200
+++ b/QTfrontend/util/namegen.cpp	Sat Sep 23 21:05:57 2017 +0200
@@ -61,7 +61,7 @@
     team.setFort(getRandomFort(withDLC));
 }
 
-void HWNamegen::teamRandomEverything(HWTeam & team, const RandomTeamMode mode)
+void HWNamegen::teamRandomEverything(HWTeam & team)
 {
     // load types if not already loaded
     if (!typesAvailable)
@@ -76,43 +76,65 @@
     int kind = (rand()%(TypesHatnames.size()));
 
     // pick team name based on hat
-    if (mode == HWNamegen::rtmEverything)
-    {        team.setName(getRandomTeamName(kind));
-        team.setGrave(getRandomGrave());
-        team.setFort(getRandomFort());
-        team.setFlag(getRandomFlag());
-        team.setVoicepack(getRandomVoice());
-    }
+    team.setName(getRandomTeamName(kind));
+    team.setGrave(getRandomGrave());
+    team.setFort(getRandomFort());
+    team.setFlag(getRandomFlag());
+    team.setVoicepack(getRandomVoice());
 
     QStringList dicts;
     QStringList dict;
 
-    if ((mode == HWNamegen::rtmHogNames || mode == HWNamegen::rtmEverything) && (TypesHatnames[kind].size()) <= 0)
-    {
-        dicts = dictsForHat(team.hedgehog(0).Hat);
-        dict  = dictContents(dicts[rand()%(dicts.size())]);
-    }
+    // Randomness mode:
+    // 0: Themed hats (from types.ini)
+    // 1: Equal hats for all
+    // 2: Random hat for each hedgehog
+    int r = rand() % 10;
+    int randomMode;
+    if (r <= 4)		// 0-4 (50%)
+       randomMode = 0;
+    else if (r <= 8)	// 5-8 (40%)
+       randomMode = 1;
+    else		// 9   (10%)
+       randomMode = 2;
 
+    // Generate random hats
     for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
     {
-        if (mode == HWNamegen::rtmEverything && (TypesHatnames[kind].size()) > 0)
+        HWHog hh = team.hedgehog(i);
+
+        if (randomMode == 0)
+        {
+            hh.Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())];
+        }
+        else if (randomMode == 1)
         {
-            HWHog hh = team.hedgehog(i);
-            hh.Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())];
-            team.setHedgehog(i,hh);
+            if (i == 0)
+            {
+                hh.Hat = getRandomHat();
+            }
+            else
+            {
+                hh.Hat = team.hedgehog(i-1).Hat;
+            }
         }
+        else if (randomMode == 2)
+        {
+            hh.Hat = getRandomHat();
+        }
+
+        team.setHedgehog(i,hh);
 
         // 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 ( (mode == HWNamegen::rtmHogNames || mode == HWNamegen::rtmEverything) && ((i == 0) || (team.hedgehog(i).Hat != team.hedgehog(i-1).Hat)))
+        if ((i == 0) || (team.hedgehog(i).Hat != team.hedgehog(i-1).Hat))
         {
             dicts = dictsForHat(team.hedgehog(i).Hat);
             dict  = dictContents(dicts[rand()%(dicts.size())]);
         }
 
         // give each hedgehog a random name
-        if (mode == HWNamegen::rtmHogNames || mode == HWNamegen::rtmEverything)
-            HWNamegen::teamRandomHogName(team,i,dict);
+        HWNamegen::teamRandomHogName(team,i,dict);
     }
 
 }
@@ -153,6 +175,24 @@
     team.setHedgehog(HedgehogNumber, hh);
 }
 
+void HWNamegen::teamRandomHogNames(HWTeam & team)
+{
+    QStringList dicts, dict;
+    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) || (team.hedgehog(i).Hat != team.hedgehog(i-1).Hat))
+        {
+            dicts = dictsForHat(team.hedgehog(i).Hat);
+            dict  = dictContents(dicts[rand()%(dicts.size())]);
+        }
+
+        // give each hedgehog a random name
+        HWNamegen::teamRandomHogName(team,i,dict);
+    }
+}
+
 void HWNamegen::teamRandomHogName(HWTeam & team, const int HedgehogNumber)
 {
     QStringList dicts = dictsForHat(team.hedgehog(HedgehogNumber).Hat);
diff -r b393a6308662 -r 82c75a317d48 QTfrontend/util/namegen.h
--- a/QTfrontend/util/namegen.h	Sat Sep 23 20:05:16 2017 +0200
+++ b/QTfrontend/util/namegen.h	Sat Sep 23 21:05:57 2017 +0200
@@ -28,12 +28,6 @@
 class HWNamegen
 {
     public:
-        enum RandomTeamMode
-        {
-            rtmEverything = 0,
-            rtmHogNames = 1,
-        };
-
         static void teamRandomTeamName(HWTeam & team);
         static void teamRandomGrave(HWTeam & team, bool withDLC = true);
         static void teamRandomFort(HWTeam & team, bool withDLC = true);
@@ -41,8 +35,9 @@
         static void teamRandomVoice(HWTeam & team, bool withDLC = true);
         static void teamRandomHats(HWTeam & team, bool withDLC = true);
         static void teamRandomHat(HWTeam & team, const int HedgehogNumber, bool withDLC = true);
+        static void teamRandomHogNames(HWTeam & team);
         static void teamRandomHogName(HWTeam & team, const int HedgehogNumber);
-        static void teamRandomEverything(HWTeam & team, const enum RandomTeamMode mode);
+        static void teamRandomEverything(HWTeam & team);
 
     private:
         HWNamegen();