BotE.log: Unterschied zwischen den Versionen

Aus BotE Wiki
Zur Navigation springen Zur Suche springen
(→‎CommandLineParameters: added: command line parameter after r77640: "--test" (just took that from repository comment))
Zeile 24: Zeile 24:
 
internal Thread: http://forum.birth-of-the-empires.de/viewtopic.php?p=27789#p27789
 
internal Thread: http://forum.birth-of-the-empires.de/viewtopic.php?p=27789#p27789
  
*additional command line parameter after r77378: '''--autoturn='''X -> you can use it to automatically terminated a round till a number of rounds is reached.
+
== autoturn ==
**For example '--autoturn=50' will automatically terminated and close all eventscreens during the first 50 rounds of the game. For Autoturn just start BotE normally, select race, start game...then it will be running
 
  
*additional command line parameter after r77640: '''--test'''=shipmap,genshipname -> enables tests for shipmap and genshipname while shipmap and genshipname are the log domains used for each of these, enable or disable the test. If missing, and are automatically added to the normal log domains.
+
additional command line parameter after r77378: '''--autoturn='''X -> you can use it to automatically terminated a round till a number of rounds is reached.
**--test without parameters enables all tests
+
*For example '--autoturn=50' will automatically terminated and close all eventscreens during the first 50 rounds of the game. For Autoturn just start BotE normally, select race, start game...then it will be running
 +
 
 +
== test shipmap,genshipname ==
 +
 
 +
additional command line parameter after r77640: '''--test'''=shipmap,genshipname -> enables tests for shipmap and genshipname while shipmap and genshipname are the log domains used for each of these, enable or disable the test. If missing, and are automatically added to the normal log domains.
 +
*--test without parameters enables all tests
  
 
== Log-Directory ==
 
== Log-Directory ==
Zeile 66: Zeile 70:
 
*"intel",
 
*"intel",
 
*"intelai",
 
*"intelai",
 +
 +
== see-all ==
 +
 +
"--see-all" opens galaxy map
  
 
= Info-Meldungen =
 
= Info-Meldungen =

Version vom 23. Dezember 2012, 20:24 Uhr

Englisch-Symbol.jpg for English just click here

Einleitung

Die Datei BotE.log liegt ab Version 0.81 im Verzeichnis des Windows-Users \Eigene Dateien\Birth of the Empires. Bis Version 0.80 lag sie im Programmverzeichnis von Birth of the Empires.

Sie dient zur Nachvollziehung von technischen Problemen. In ihr werden Ereignisse sowie Fehler-Meldungen festgehalten, die während des Spiels auftreten.


Gerne kann die BotE.log hier noch näher beschrieben werden - nur zu !


Sie wird bei jedem BotE-Start angelegt, die vorherige bote.log wird dabei überschrieben. Wer z.B. für die 70 Runden, die er zuvor gespielt hat, behalten will, kann diese ja dorthin kopieren, wo die Savegame sind und die BotE.log ähnlich benennen.

Das Modifizieren der BotE.log ist sinnlos, da sie bei jedem Spiel neu geschrieben wird und BotE aus ihr keine Informationen bezieht.

CommandLineParameters

only interesting for developers, not for players


only available after r76393, not available in Version Alpha 6.1 (V0.81) and before

internal Thread: http://forum.birth-of-the-empires.de/viewtopic.php?p=27789#p27789

autoturn

additional command line parameter after r77378: --autoturn=X -> you can use it to automatically terminated a round till a number of rounds is reached.

  • For example '--autoturn=50' will automatically terminated and close all eventscreens during the first 50 rounds of the game. For Autoturn just start BotE normally, select race, start game...then it will be running

test shipmap,genshipname

additional command line parameter after r77640: --test=shipmap,genshipname -> enables tests for shipmap and genshipname while shipmap and genshipname are the log domains used for each of these, enable or disable the test. If missing, and are automatically added to the normal log domains.

  • --test without parameters enables all tests

Log-Directory

"--log-dir=c:\\BotE\\log\\" (for example)

storages BotE.log therein instead of into default userdata folder

Log-Level

Please note: use lowercase !

"--log-level=error" -> only MT::LEVEL::ERROR is logged

"--log-level=warning" -> MT::LEVEL::ERROR + WARNING is logged

no option, because it's default: info -> MT::LEVEL::ERROR + WARNING + INFO is logged

"--log-level=debug" -> MT::LEVEL::ERROR + WARNING + INFO + DEBUG is logged

Log Domains

"--log-domains=ai,graphicload" (for example)

additional: "--passive-domains" (reverts the listed log-domains)

Example for Coding: MYTRACE_DOMAIN("graphicload")(MT::LEVEL_WARNING, "CGalaxyMenuView::GenerateGalaxy(): Could not load a star graphic");

Domains are a group of log info. By default are defined (in Options.h, only available if --log-domains isn't used)

  • "general",
  • "logging",
  • "ai",
  • "graphicload",
  • "shipai",
  • "diplomacy",
  • "intel",
  • "intelai",

see-all

"--see-all" opens galaxy map

Info-Meldungen

Used seed for randomgenerator

?? benutzter Einstiegswert für Zufallsgenerator - wofür (oder generell??)

Major AI

Ein Major = Imperium nach dem anderen wird durchgegangen - vom Menschen gespielte Majors bleiben außen vor.

Favorite Minorrace of Major is

(Quelle:MajorAI.cpp)

Deutsch-Symbol.jpg Englisch-Symbol.jpg
Favorite Minor wird einer von den dreien, zu denen
  • die beste Beziehung besteht
  • wer nicht schon Mitglied ist
  • welche nicht von einer anderen Rasse unterworfen ist
  • deren Akzeptanz-Punkte zu einem anderen Major nicht zu hoch ist (kleiner 3000 bzw. 4000 Punkte)

Zwischen den 3 besten Favoriten wird "Favorite Minor"

  • mit einer zufälligen Wahrscheinlichkeit von 10 % der Dritt-Platzierte ausgewählt
  • mit einer zufälligen Wahrscheinlichkeit von 33 % der Zweit-Platzierte ausgewählt
  • ansonsten der Erst-Platzierte ausgewählt
Favorite Minor will get one of the three which
  • we have best relation to
  • who isn't member anywhere yet
  • who isn't subjugated
  • which acceptance to another major isn't to high (less than 3000 or 4000 points)

Between the three best "Favorite Minor" will be

  • by random probability of 10 % the 3rd
  • by random probability of 22 % the 2nd
  • otherwise the 1st


makes offer

Eintrag Bemerkung Deutsch-Symbol.jpg Englisch-Symbol.jpg
-1 Major: MAJOR3 makes offer -1 to Major MAJOR2 Kriegserklärung Declares War

Source: Options.h

  • WARPACT = -5, // bei Annahme des Partners gemeinsame Kriegserklärung
  • DEFENCEPACT = -2, // zusätzlich anbietbar, außer bei Bündnis oder Krieg
  • WAR = -1, // Kriegserklärung
  • NONE = 0,
  • NAP = 1, (Non-aggression)
  • TRADE = 2, // Handel mgl. & Rohstoffe als Zugabe möglich
  • FRIENDSHIP = 3, // sehen dipl. Verträge mit anderen Rassen
  • COOPERATION = 4, // gemeinsame Nutzung der Werften und Basen
  • AFFILIATION = 5, // Zusammenarbeit auf dipl. Ebene
  • MEMBERSHIP = 6,
  • PRESENT = 10,
  • CORRUPTION = 11,
  • REQUEST = 12

MinorAI.cpp

Minor makes offer

Eintrag Bemerkung Deutsch-Symbol.jpg Englisch-Symbol.jpg
-1 similar to "Minor: x makes offer -1 to Major MAJOR2" Kriegserklärung Declares War

Source: Options.h

  • WARPACT = -5, // bei Annahme des Partners gemeinsame Kriegserklärung
  • DEFENCEPACT = -2, // zusätzlich anbietbar, außer bei Bündnis oder Krieg
  • WAR = -1, // Kriegserklärung
  • NONE = 0,
  • NAP = 1, (Non-aggression)
  • TRADE = 2, // Handel mgl. & Rohstoffe als Zugabe möglich
  • FRIENDSHIP = 3, // sehen dipl. Verträge mit anderen Rassen
  • COOPERATION = 4, // gemeinsame Nutzung der Werften und Basen
  • AFFILIATION = 5, // Zusammenarbeit auf dipl. Ebene
  • MEMBERSHIP = 6,
  • PRESENT = 10,
  • CORRUPTION = 11,
  • REQUEST = 12

Sectors to terraform or colonize

(im Original "colinize", weil Tippfehler)


Neben der Race-ID werden hier Ziel-Sektoren angezeigt. Beispiel:

POP: 22 - KO: 24/9

KO 24/9 = 24 rüber (horizontal), 9 runter (vertikal) = Sektor j25

(programm-intern wird bei null begonnen, nicht bei 1 oder bei a, insofern hat Sektor a1 die Koordinaten (KO) 0/0, b2 hat 1/1. Hilfreich ist diese Sektorenkarte)


Darin findet sich ein Ziel mit Rest-Kolonisierungs-Bevölkerungs-Potenzial POP (Population) = 24

(es kann 1 Mrd. zuwenig anzeigen sein, Beispiel: 17.000 Mrd. => POP 16).

Rest-Kolonisierungs-Bevölkerungs-Potenzial bedeutet: Besitzt das System z.B. Planeten mit insgesamt 36 Mrd., ist einer mit 19.800 bereits kolonisiert und die anderen mit 16.200 noch nicht, wird 16 angezeigt. Hinweis: Begonnenes Terraforming mit anschließendem Kolonisieren führt die KI immer bis zum Ende durch, so dass die KI relevante Systeme auch vollständig erkennt und kolonisiert. (Fraglich: wenn die KI ein System erobert mit einem nicht-kolonisiertem Planeten unter 6 Mrd., kolonisiert es den dann?)


Die Sortierung ist absteigend nach POP, d.h. Ziele mit höchstem Bevölkerungszuwachs stehen ganz oben.

Es werden keine Ziele unter 6 Mrd. angezeigt bzw. angesteuert.

Raumschlacht

Raumschlachten werden (nur) folgendermassen festgehalten (eigentlich selbsterklärend):

  Eintrag Bemerkung
1 Combat in Sector 18/11  
2 Server is sending CombatData to client...  
3 Client is receiving CombatData from server...  
4 Getting Message to Show CombatView...  
5 Showing CombatView  
6 Client 0 sending CombatData to server...  
7 Server receiving CombatData from client 1...  
8 COMBAT ROUND  
9 Race MAJOR1 is involved in combat. Tactic: User  
10 Race MAJOR6 is involved in combat. Tactic: Auto  


KI: CalcShipPrio

Die folgenden Meldungen aus der AIPrios.cpp benützt die KI, um zu entscheiden, ob Kolonie-, Transport- oder Kriegsschiffe gebaut werden sollen.

Eintrag Bemerkung
CAIPrios::CalcShipPrios() begin...  
CAIPrios::CalcShipPrios(): max Combatship Priority is: 14919  
Calc Shippowers: Race: MAJOR6 has a complete shippower of 8152 - all shippower is 8152  
Calc Priorities: Race: MAJOR6 - CombatShipPrio: 3 - ColoshipPrio: 4 - TransportPrio: 8  
Number of shiptypes: Race: MAJOR6 - Colonyships: 12 - Transporthips: 1  
CAIPrios::CalcShipPrios() ... ready  

SystemAI::ChooseShip()

Die folgenden Meldungen aus der SystemAI.cpp benützt die KI, um zu entscheiden, ob und welches Kriegsschiff gebaut werden soll.

Eintrag Bemerkung
CSystemAI::GetShipBuildPrios(): Race MAJOR1 - System: Belamar - CombatShipPrio: 1 (max 4) für jeden AI-Major wird System für System durchgegangen
CSystemAI::GetShipBuildPrios(): ... ready das erfolgreiche Holen der ShipBuild-Prios ist ready
CSystemAI::ChooseBuilding(): min priority after ships: 1  
CSystemAI::ChooseBuilding(): min priority after ships, updates and workers: 1  
CSystemAI::ChooseShip(): build combatship in system: Belamar Entscheidung, in Belamar ein Kampfschiff zu bauen
CSystemAI::ChooseShip(): buildable combatships Wolf - ID: 34 - Power: 9127 baubare Kampfschiffe werden aufgelistet, nach Power absteigend
CSystemAI::ChooseShip(): choosen combatship to build: Wolf meist wird die Schiffsklasse mit der höchste Power (hier: Wolf) gewählt
CSystemAI::GetShipBuildPrios(): ... ready nochmal wird ShipBuildPrios eingelesen
CSystemAI::ChooseBuilding(): min priority after ships: 0 nochmal festgestellt (verändert zu oben)
CSystemAI::ChooseBuilding(): min priority after ships, updates and workers: -13 nochmal festgestellt (verändert zu oben)
CSystemAI::ChooseBuilding(): choosen prio: 2
jetzt wird das nächste System durchlaufen

KI: Geheimdienst

Die KI verwendet nur Sabotage. Eine Geheimdienstaktion wird gestartet, wenn die Geheimdienstpunkte + Punkte aus Depot größer sind als die gegnerische Innere Sicherheit + deren Inneres Depot. (Quelle+Details: IntelAI.cpp)

Eintrag Bemerkung
Intel-AI: Intel Prio of MAJOR6 is 3 Bei einer feindlichen Sabotage in den letzten 5 Runden erhöht sich die Prio zusätzlich um eins
Intel-AI: assigned intel victim of MAJOR2 is MAJOR5  
Intel-AI: our SP: 76 - enemies SP: 189 Der entscheidende Vergleich, ob eine Sabotage gestartet wird.

weitere Info-Meldungen

Bereich Befehl Bemerkung zugehöriger Befehl (Start/Ende der Aktion)
INFO storing savegame Speichern eines Spiel mit Angabe des Pfades  
INFO Begin preparing game data... Start eines Spieles (ab Runde 1) Preparing game data ready...
INFO Preparing game data ready...   Begin preparing game data...
INFO Server is sending NextRoundData to client... Zu Rundenbeginn und -ende werden alle 6 Spieler abgefragt/informiert/Daten übertragen ... serialization of NextRoundData succesfull
INFO ... serialization of NextRoundData succesfull Zu Rundenbeginn und -ende werden alle 6 Spieler abgefragt/informiert/Daten übertragen Server is sending NextRoundData to client...
INFO Client is receiving NextRoundData from server... Der jeweilige Spieler erhält die jeweiligen Daten ... serialization of NextRoundData succesfull
INFO ... serialization of NextRoundData succesfull Der jeweilige Spieler erhält die jeweiligen Daten Client is receiving NextRoundData from server...
INFO CNetworkHandler::OnNextRound ready Alle sind bereit für die nächste Runde ??  
INFO Init sound ready... Soundausgabe ist bereit  
INFO Client x sending EndOfRoundData to server... Client x sendet "Runde beenden" ... serialization of RoundEndData succesfull
INFO ... serialization of RoundEndData succesfull Client x sendet "Runde beenden" Client x sending EndOfRoundData to server...
INFO START NEXT ROUND (round: x) Beginn der nächsten Runde (Runden-Nummer in Klammern) NEXT ROUND calculation successfull
INFO NEXT ROUND calculation successfull Berechnung der nächsten Runde erfolgreich (nach "Rundenende") START NEXT ROUND (round: x)


Fehlermeldungen

WARNING Could not load graphic

Beispiel: "WARNING Could not load graphic: ...\Graphics\Planets\Gaspar 1.bop"

Das Thema ist bekannt. BotE versucht immer zuerst spezielle Planetennamen zu finden. Wenn es diese nicht gibt, werden zufällige Planetengrafiken genutzt.

Eigentlich bräuchten diese Meldungen nicht im Log stehen (tun sie aber im aktuellen Stand des Projekts).

MyTrace-Vorschläge

Specifier-Tabelle (z.B. s = string, f = floating) http://www.cplusplus.com/reference/clibrary/cstdio/printf/

existing examples

MYTRACE(MT::LEVEL_ERROR, "savegame: error during compression\n");

MYTRACE(MT::LEVEL_INFO, "Stardate: %f", m_fStardate);

MYTRACE(MT::LEVEL_INFO, "m_NumberOfTheShipInArray: %i", m_NumberOfTheShipInArray);

  • s=string

MYTRACE(MT::LEVEL_INFO, "Intel-AI: Intel Prio of %s is %d\n", it->first, m_byIntelPrio[it->first]); = INFO Intel-AI: Intel Prio of MAJOR1 is 1

  • d=decimal (old?, better use i)

MYTRACE(MT::LEVEL_INFO, "Intel-AI: our SP: %d - enemies SP: %d\n", ourPoints, enemyPoints);

MYTRACE(MT::LEVEL_INFO, "\n############### START NEXT ROUND (round: %d)############### \n", GetCurrentRound());

Source\Framework\botf2Doc.cpp

//Kartengröße aus ini lesen

int mapHeight=20;

pIni->ReadValue("Special", "MAPSIZEV", mapHeight);

STARMAP_SECTORS_VCOUNT=mapHeight;

MYTRACE(MT::LEVEL_INFO, "MAPSIZEV: %i", mapHeight);


int mapWidth=30;

pIni->ReadValue("Special", "MAPSIZEH", mapWidth);

STARMAP_SECTORS_HCOUNT=mapWidth;

MYTRACE(MT::LEVEL_INFO, "MAPSIZEH: %i", mapWidth);


Stardate

//f(x):=min(731,max(14,trunc(743-x^3)))

m_fStardate += (float)(min(731, max(14, 743-pow((float)m_Statistics.GetAverageTechLevel(),3.0f))));

MYTRACE(MT::LEVEL_INFO, "Stardate: %f", m_fStardate);


Difficulty

difficulty.MakeUpper();

MYTRACE(MT::LEVEL_INFO, "DIFFICULTY: %s", difficulty);

-> DIFFICULTY: BABY

if (difficulty == "BABY")

...

else

m_fDifficultyLevel = 0.5f;

MYTRACE(MT::LEVEL_INFO, "m_fDifficultyLevel: %f", m_fDifficultyLevel);


CSoundManager* pSoundManager = CSoundManager::GetInstance();

ASSERT(pSoundManager);

MYTRACE(MT::LEVEL_INFO, "pSoundManager: %s", pSoundManager);

-> Output with %d: 7078520

-> Output with %s: nichts vernünftiges

-> Output with %i: ?


Schiffsnummer beim Gruppieren

CSmallInfoView::SetShip(&m_ShipArray.GetAt(NumberOfTheShipInArray));

MYTRACE(MT::LEVEL_INFO, "m_NumberOfTheShipInArray: %i", m_NumberOfTheShipInArray);


??

CSmallInfoView::SetShip(&m_ShipArray.GetAt(NumberOfFleetShip));

MYTRACE(MT::LEVEL_INFO, "m_iNumberOfFleetShip: %i", m_iNumberOfFleetShip);


CMajor* pPlayersRace = GetPlayersRace();

ASSERT(pPlayersRace);

MYTRACE(MT::LEVEL_INFO, "pPlayersRace: %s", pPlayersRace->GetRaceName());


CIniLoader::GetInstance()->ReadValue("Special", "STARDENSITY", nStarDensity);

CIniLoader::GetInstance()->ReadValue("Special", "MINORDENSITY", nMinorDensity);

CIniLoader::GetInstance()->ReadValue("Special", "ANOMALYDENSITY", nAnomalyDensity);

MYTRACE(MT::LEVEL_INFO, "STARDENSITY: %i", nStarDensity);

MYTRACE(MT::LEVEL_INFO, "MINORDENSITY: %i", nMinorDensity);

MYTRACE(MT::LEVEL_INFO, "ANOMALYDENSITY: %i", nAnomalyDensity);

-> %i ist ok, mit %s -> Absturz = kein Start *NICHT EINSETZEN !!!*

Gamedata\AI\SystemAI

CString sRace = m_pDoc->GetSystem(ko).GetOwnerOfSystem();

MYTRACE(MT::LEVEL_INFO, "Owner of System is: %s", sRace);


ASSERT(m_pMajor);

MYTRACE(MT::LEVEL_INFO, "Major of System is: %s", m_pMajor);

Gamedata\General\Statistics

CStatistics::CalcDemoValues

nPlace = ++i;

MYTRACE(MT::LEVEL_INFO, "STATISTICS.CPP: %s nPlace = %i", sRaceID, nPlace); -> zeigt Platz aus Demografie (nur wenn der Screen aufgerufen wird, also nur PlayerRace)


Die weiteren Werte sind zu nehmen:

  • bei BSP mal 5
  • Productivity 1 zu 1
  • Military geteilt 10
  • Forschung mal 2
  • Moral 1 zu 1


fAverage /= vSortedVec.size();

MYTRACE(MT::LEVEL_INFO, "STATISTICS.CPP: fAverage = %f", fAverage); -> zeigt Durchschnitt


// eigener Wert

fValue = it->second;

MYTRACE(MT::LEVEL_INFO, "STATISTICS.CPP: fValue = %f", fValue);


// bester Wert

fFirst = vSortedVec.front();

MYTRACE(MT::LEVEL_INFO, "STATISTICS.CPP: fFirst = %f", fFirst);


// schlechtester Wert

fLast = vSortedVec.back();

MYTRACE(MT::LEVEL_INFO, "STATISTICS.CPP: fLast = %f", fLast);

Gamedata\Races\Empire.cpp

void CEmpire::Serialize(CArchive &ar)

// wenn gespeichert wird

for (int i = 0; i <= DERITIUM; i++)

#ifdef SEE_ALL_OF_MAP

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: %s m_lResourceStorages[i] = %i", m_sEmpireID, m_lResourceStorages[i]);

ar << m_lResourceStorages[i];

#ifdef SEE_ALL_OF_MAP

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: only...if SEE_ALL_OF_MAP = true");

//MYTRACE(MT::LEVEL_INFO, "Empire.cpp: m_sEmpireID = %s", m_sEmpireID);

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: %s: m_byNumberOfSystems = %i", m_sEmpireID, m_byNumberOfSystems);

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: %s: m_iCredits = %i", m_sEmpireID, m_iCredits);

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: %s: m_iCreditsChange = %i", m_sEmpireID, m_iCreditsChange);

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: %s: m_iShipCosts = %i", m_sEmpireID, m_iShipCosts);

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: %s: m_iPopSupportCosts = %i", m_sEmpireID, m_iPopSupportCosts);

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: %s: m_lFP Research points = %i", m_sEmpireID, m_lFP);



void CEmpire::AddFP(int add)

  1. ifdef SEE_ALL_OF_MAP

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: only...if SEE_ALL_OF_MAP = true");

//MYTRACE(MT::LEVEL_INFO, "Empire.cpp: %s m_lFP Research points add = %i", m_sEmpireID, add);

MYTRACE(MT::LEVEL_INFO, "Empire.cpp: %s m_lFP Research points = %i", m_sEmpireID, m_lFP);

Gamedata\Races\Major.cpp

void CMajor::Serialize(CArchive &ar)

// wenn gespeichert wird

ar << m_sEmpireName; // längerer Imperiumsname

MYTRACE(MT::LEVEL_INFO, "Major.cpp: Empire = %s", m_sEmpireName);

Gamedata\Races\MoralObserver.cpp

CString CMoralObserver::GenerateText

...

text += s;

MYTRACE(MT::LEVEL_INFO, "MoralObserver: %s", text);


short CMoralObserver::GetMoralValue(BYTE byMappedRaceNumber, unsigned short Event)

MYTRACE(MT::LEVEL_INFO, "MoralObserver - MoralValue of ? = %i", m_iMoralMatrix[Event][byMappedRaceNumber - 1]);

Gamedata\Races\VictoryObserver.cpp

pIni->ReadValue("Victory_Conditions", "Elimination", m_bConditionStatus[VICTORYTYPE_ELIMINATION]);

MYTRACE(MT::LEVEL_INFO, "Victory_Conditions - Elimination: %s", m_bConditionStatus[VICTORYTYPE_ELIMINATION] ? "true" : "false");

pIni->ReadValue("Victory_Conditions", "Diplomacy", m_bConditionStatus[VICTORYTYPE_DIPLOMACY]);

MYTRACE(MT::LEVEL_INFO, "Victory_Conditions - Diplomacy: %s", m_bConditionStatus[VICTORYTYPE_DIPLOMACY] ? "true" : "false");

pIni->ReadValue("Victory_Conditions", "Conquest", m_bConditionStatus[VICTORYTYPE_CONQUEST]);

MYTRACE(MT::LEVEL_INFO, "Victory_Conditions - Conquest: %s", m_bConditionStatus[VICTORYTYPE_CONQUEST] ? "true" : "false");

pIni->ReadValue("Victory_Conditions", "Research", m_bConditionStatus[VICTORYTYPE_RESEARCH]);

MYTRACE(MT::LEVEL_INFO, "Victory_Conditions - Research: %s", m_bConditionStatus[VICTORYTYPE_RESEARCH] ? "true" : "false");

pIni->ReadValue("Victory_Conditions", "Combat", m_bConditionStatus[VICTORYTYPE_COMBATWINS]);

MYTRACE(MT::LEVEL_INFO, "Victory_Conditions - Combat: %s", m_bConditionStatus[VICTORYTYPE_COMBATWINS] ? "true" : "false");

pIni->ReadValue("Victory_Conditions", "Sabotage", m_bConditionStatus[VICTORYTYPE_SABOTAGE]);

MYTRACE(MT::LEVEL_INFO, "Victory_Conditions - Sabotage: %s", m_bConditionStatus[VICTORYTYPE_SABOTAGE] ? "true" : "false");


case VICTORYTYPE_DIPLOMACY:

// über 50% der Rassen auf Mitgliedschaft bzw. Bündnis (mindestens 10)

nValue = pDoc->GetRaceCtrl()->GetRaces()->size();

// eigene Rasse nicht mitzählen

nValue--;

MYTRACE(MT::LEVEL_INFO, "VICTORYTYPE_DIPLOMACY - needed value: %i", nValue/2);


case VICTORYTYPE_CONQUEST:

// über 50% aller bewohnten Systeme sind erobert (mindestens 10)

MYTRACE(MT::LEVEL_INFO, "VICTORYTYPE_CONQUEST - needed value: %i", nValue/2);


// Anzahl Majorraces noch im Spiel

int nMajorsAlive = 0;

map<CString, CMajor*>* pmMajors = pDoc->GetRaceCtrl()->GetMajors();

for (map<CString, CMajor*>::const_iterator it = pmMajors->begin(); it != pmMajors->end(); ++it)

if (it->second->GetEmpire()->GetNumberOfSystems())

nMajorsAlive++;

MYTRACE(MT::LEVEL_INFO, "nMajorsAlive: %i", nMajorsAlive);