Ejemplo n.º 1
0
def combatMessageBuilder(cdAttacker, cdDefender, iCombatOdds):
    combatMessage = ""
    if (cdAttacker.eOwner == cdAttacker.eVisualOwner):
        combatMessage += "%s's" % (gc.getPlayer(cdAttacker.eOwner).getName(), )
    combatMessage += " %s (%.2f)" % (
        cdAttacker.sUnitName,
        cdAttacker.iCurrCombatStr / 100.0,
    )
    combatMessage += " " + localText.getText("TXT_KEY_COMBAT_MESSAGE_VS",
                                             ()) + " "
    if (cdDefender.eOwner == cdDefender.eVisualOwner):
        combatMessage += "%s's" % (gc.getPlayer(cdDefender.eOwner).getName(), )
    combatMessage += "%s (%.2f)" % (
        cdDefender.sUnitName,
        cdDefender.iCurrCombatStr / 100.0,
    )
    CyInterface().addCombatMessage(cdAttacker.eOwner, combatMessage)
    CyInterface().addCombatMessage(cdDefender.eOwner, combatMessage)
    # CtHCombat.log start
    combatMessageVs = combatMessage
    # CtHCombat.log end
    combatMessage = "%s %.1f%%" % (
        localText.getText("TXT_KEY_COMBAT_MESSAGE_ODDS", ()),
        iCombatOdds / 10.0,
    )
    CyInterface().addCombatMessage(cdAttacker.eOwner, combatMessage)
    CyInterface().addCombatMessage(cdDefender.eOwner, combatMessage)
    combatDetailMessageBuilder(cdAttacker, cdAttacker.eOwner, -1)
    combatDetailMessageBuilder(cdDefender, cdAttacker.eOwner, 1)
    combatDetailMessageBuilder(cdAttacker, cdDefender.eOwner, -1)
    combatDetailMessageBuilder(cdDefender, cdDefender.eOwner, 1)
    # CtHCombat.log
    combatMessageOdds = combatMessage
    combatLogName = None
    if not CyGame().isPitbossHost():
        isActivePlayer = gc.getGame().getActivePlayer() in [
            cdDefender.eOwner, cdAttacker.eOwner
        ]

        if isActivePlayer:
            combatLogName = BugPath.join(BugPath.getRootDir(), "Combat.log")
            f = codecs.open(combatLogName, "a", 'utf-8')
            f.write(combatMessageVs + " \n")
            f.write(combatMessageOdds + " \n")
            f.close()
Ejemplo n.º 2
0
def savemap(argsList=None):
    # <advc.savem>
    if gc.getGame().isNetworkMultiPlayer(
    ) and not CvEventInterface.getEventManager().isCheatsEnabled():
        return
    if not BugCore.game.MainInterface.isSavemapEnabled():
        return
    # </advc.savem>
    # First choice: Mod folder
    pathnames.append(str(BugPath.getModDir()) + "\\PrivateMaps\\")
    # Under MyGames. Can't load it from there into AdvCiv w/o toggling NoCustomAssets.
    myGamesPathFromBUG = str(BugPath.getRootDir()) + "\\PublicMaps\\"
    pathnames.append(myGamesPathFromBUG)
    # Try tywiggins's code as a fallback
    pathFromOSEnv = str(
        os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") +
        "\\Documents\\My Games\\Beyond The Sword\\PublicMaps\\")
    if pathFromOSEnv != myGamesPathFromBUG:
        pathnames.append(pathFromOSEnv)
    # As for the file name: Will generate that based on the map settings
    # </advc.savem>

    map = CyMap()  # advc.savem
    game = CyGame()  # advc.savem
    width = map.getGridWidth()  # returns num plots, not gridsize
    height = map.getGridHeight()
    # add extra plots if plots-x or plots-y are no multiples of 4 to obtain valid gridsizes (= numplots/4)
    extraWidth = int(width % 4)
    extraHeight = int(height % 4)
    if (extraWidth != 0):
        extraWidth = 4 - extraWidth
    if (extraHeight != 0):
        extraHeight = 4 - extraHeight
    numPlots = (width + extraWidth) * (height + extraHeight)
    # <advc.savem> Make sure not to create a huge file if the map somehow returns crazy dimensions
    if numPlots < 0 or numPlots > 50000:
        BugUtil.error("savemap: Invalid number of plots: '%d'", numPlots)
        msg = "Savemap failed. Invalid number of tiles: " + str(numPlots)
        _showOnScreenMessage(msg)
        return
    # </advc.savem>
    wrapX = map.isWrapX()
    wrapY = map.isWrapY()
    topLat = map.getTopLatitude()
    bottomLat = map.getBottomLatitude()
    numPlayers = game.countCivPlayersEverAlive()

    # determine starting locations
    civs = []
    civsDesc = []
    startingPlots = []
    startingPlotsXY = []

    for i in range(numPlayers):
        player = gc.getPlayer(i)
        pIndex = 0
        civInfo = gc.getCivilizationInfo(
            player.getCivilizationType())  # advc.savem
        # determine starting location from first settler found, since player.getStartingPlot() is somewhat unreliable; only do this at gamestart
        if (game.getElapsedGameTurns() == 0
                and game.getStartEra() == 0):  # advc.savem: was getGameTurn==0
            if (player.getNumUnits() > 0):
                for j in range(player.getNumUnits()):
                    unit = player.getUnit(j)
                    if (unit.getUnitClassType() == gc.getInfoTypeForString(
                            "UNITCLASS_SETTLER")):
                        pPlot = unit.plot()
                        if (pPlot.isWater() == 0):
                            pIndex = map.plotNum(
                                pPlot.getX(),
                                pPlot.getY()) + (extraWidth * pPlot.getY())
                            # advc.savem: was print
                            BugUtil.debug(
                                "savemap: Found settler of civ '%d' ('%s') at plot '%d' ('%d', '%d')",
                                int(player.getCivilizationType()),
                                civInfo.getShortDescription(0), pIndex,
                                map.plotX(pIndex), map.plotY(pIndex))
                            startingPlots.append(pIndex)
                            civs.append(int(player.getCivilizationType()))
                            civsDesc.append(civInfo.getType())
                            break

        # fallback; determine starting location from (a) stored location, (b) capital, or (c) first city
        if (pIndex == 0):
            pPlot = player.getStartingPlot()
            if (map.isPlot(pPlot.getX(), pPlot.getY())):
                pIndex = map.plotNum(
                    pPlot.getX(), pPlot.getY()) + (extraWidth * pPlot.getY())
                startingPlots.append(pIndex)
                civs.append(int(player.getCivilizationType()))
                civsDesc.append(civInfo.getType())
            elif (player.getCapitalCity().plot() != None):
                pPlot = player.getCapitalCity().plot()
                pIndex = map.plotNum(
                    pPlot.getX(), pPlot.getY()) + (extraWidth * pPlot.getY())
                startingPlots.append(pIndex)
                civs.append(int(player.getCivilizationType()))
                civsDesc.append(civInfo.getType())
            elif ((player.getCapitalCity().plot() == None)
                  and (player.getNumCities() > 0)):
                pPlot = player.getCity(0).plot()
                pIndex = map.plotNum(
                    pPlot.getX(), pPlot.getY()) + (extraWidth * pPlot.getY())
                startingPlots.append(pIndex)
                civs.append(int(player.getCivilizationType()))
                civsDesc.append(civInfo.getType())
            # advc.savem: was print
            BugUtil.debug(
                "savemap: No settler found (or not saving on the initial turn) for civ '%d' ('%s'); setting starting location at plot '%d' ('%d', '%d')",
                int(player.getCivilizationType()),
                civInfo.getShortDescription(0), pIndex, map.plotX(pIndex),
                map.plotY(pIndex))

    # also store starting coords, not actually required, but makes debugging easier
    for i in range(len(startingPlots)):
        pIndex = startingPlots[i]
        pPlotXY = [map.plotX(pIndex), map.plotY(pIndex)]
        startingPlotsXY.append(pPlotXY)

    # determine terrain etc
    plotTypes = {}  # default 3 (PLOT_OCEAN in BTS)
    terrainTypes = {}  # default 6 (TERRAIN_OCEAN in BTS)
    bonuses = {}  # default -1
    features = {}  # default -1
    featureVarieties = {}  # default 0
    improvements = {}  # default -1
    riverwe = {}  # default -1
    riverns = {}  # default -1

    for i in range(0, height):
        for j in range(0, width):
            pPlot = map.plot(j, i)
            pIndex = map.plotNum(pPlot.getX(),
                                 pPlot.getY()) + (extraWidth * pPlot.getY())

            if (int(pPlot.getPlotType()) != 3):
                plotTypes[pIndex] = int(pPlot.getPlotType())
            if (pPlot.getTerrainType() != 6):
                terrainTypes[pIndex] = pPlot.getTerrainType()
            if (pPlot.getBonusType(-1) != -1):
                bonuses[pIndex] = pPlot.getBonusType(-1)
            if (pPlot.getFeatureType() != -1):
                features[pIndex] = pPlot.getFeatureType()
                featureVarieties[pIndex] = pPlot.getFeatureVariety()
            if (pPlot.getImprovementType() != -1):
                improvements[pIndex] = pPlot.getImprovementType()
            if (pPlot.isNOfRiver()):
                riverwe[pIndex] = int(pPlot.getRiverWEDirection())
            if (pPlot.isWOfRiver()):
                riverns[pIndex] = int(pPlot.getRiverNSDirection())

    # write mapscript
    # <advc.savem>
    mapScriptName = str(map.getMapScriptName())
    dimensionsInName = True
    wbEnding = ".CivBeyondSwordWBSave"
    if wbEnding in mapScriptName:
        mapScriptName = mapScriptName.replace(wbEnding, "")
        # Scenario dimensions aren't so interesting
        dimensionsInName = False
    # If the script is used recursively (who would do that?) the map script name can get long
    if len(mapScriptName) > 100:
        mapScriptName = mapScriptName[:100]
    filename = mapScriptName + "_"
    if dimensionsInName:
        filename += str(width) + "x" + str(height) + "_"
    filename += str(numPlayers) + "civs"
    # A bit complicated b/c I want to make sure not to overwrite anything
    goodPath = None
    goodName = None
    customAssets = False
    for pathname in pathnames:
        idSuffix = ""
        attempts = 10
        for id in range(attempts):
            if id > 0:
                idSuffix = "_" + str(id)
            goodName = filename + idSuffix
            pathStr = pathname + goodName + ".py"
            try:
                f = open(pathStr)
            except:
                # File doesn't exist yet: good (or pathname is inaccessible; we'll see about that)
                break
            BugUtil.debug("savemap: File '%s' already exists", pathStr)
            if id == attempts - 1:
                BugUtil.error(
                    "savemap: Files '%s' already exist",
                    pathname + filename + "[0.." + str(attempts - 1) + "].py")
                msg = "Failed to save map to " + pathname + " -- file " + goodName + ".py already exists."
                _showOnScreenMessage(msg)
                return
            f.close()
        try:
            f = open(pathStr, 'w')
        except:
            BugUtil.debug("savemap: Cannot open path '%s' for writing",
                          pathStr)
            customAssets = True
            continue
        goodPath = pathname
        msg = "Saving map to " + pathStr + "\nNote:"
        if customAssets:
            msg += "\n"
        else:
            msg += " "
        # I see no way to make CvDLLPythonIFaceBase aware of the new map script
        # (CvDLLPythonIFaceBase::moduleExists doesn't do the trick either)
        msg += "Playing the saved map will require a restart of Civ 4"
        if customAssets:
            msg += ", and mods that disable CustomAssets cannot load maps from that location"
        msg += "."
        _showOnScreenMessage(msg, customAssets)
        break
    if goodPath is None:
        path1 = pathnames[0]
        path2 = pathnames[1]
        BugUtil.error("savemap: Failed to write to '%s' and '%s'", path1,
                      path2)
        msg = "Unable to save map to either:\n" + path1 + " or \n" + path2
        _showOnScreenMessage(msg)
        return
    # </advc.savem>

    f.write('from CvPythonExtensions import *\n')
    f.write('import CvMapGeneratorUtil\n')
    f.write('from random import random, seed, shuffle\n')
    f.write('\n')
    # advc.savem: Moved up for quick inspection
    f.write('def getDescription():\n')
    #string = '\treturn "Saved Map, based on ' + str(map.getMapScriptName()) + ' ('+str(width)+' x '+str(height)+') with '+str(numPlayers)+' civs"\n'
    # <advc.savem> Use the above for the file name instead
    string = '\treturn '
    string += "\"Originally created with the following settings by:\\n"
    # This isn't portable; based on advc.106h.
    settingsStr = map.getSettingsString()
    settingsStr = settingsStr.replace('\n', '\\n')
    string += settingsStr + "\\n"
    string += "Original players:\\n"
    for playerID in range(numPlayers):
        player = gc.getPlayer(playerID)
        civInfo = gc.getCivilizationInfo(player.getCivilizationType())
        leaderInfo = gc.getLeaderHeadInfo(player.getLeaderType())
        string += str(playerID) + " - " + leaderInfo.getDescription(
        ) + " of " + civInfo.getShortDescription(0)
        if player.isHuman():
            string += " (human)"
        string += "\\n"
    string += "Saved on turn " + str(game.getGameTurn()) + "\""
    string += '\n'
    # </advc.savem>
    f.write(string)
    f.write('\n')
    f.write('gc = CyGlobalContext()\n')
    f.write('\n')
    f.write(
        '# seed random generator with MapRand (synchronized source for multiplayer)\n'
    )
    f.write(
        'seedValue = gc.getGame().getMapRand().get(65535, "Seeding mapRand - savemap.py")\n'
    )
    f.write('seed(seedValue)\n')
    f.write('\n')
    string = 'plotTypes = ' + str(plotTypes) + '\n'
    f.write(string)
    string = 'terrainTypes = ' + str(terrainTypes) + '\n'
    f.write(string)
    string = 'bonuses = ' + str(bonuses) + '\n'
    f.write(string)
    string = 'features = ' + str(features) + '\n'
    f.write(string)
    string = 'featureVarieties = ' + str(featureVarieties) + '\n'
    f.write(string)
    string = 'riverwe = ' + str(riverwe) + '\n'
    f.write(string)
    string = 'riverns = ' + str(riverns) + '\n'
    f.write(string)
    string = 'improvements = ' + str(improvements) + '\n'
    f.write(string)
    string = 'numPlots = ' + str(numPlots) + '\n'
    f.write(string)
    f.write('\n')
    f.write('def isAdvancedMap():\n')
    f.write('\treturn 0\n')
    f.write('\n')
    f.write('def isClimateMap():\n')
    f.write('\treturn 0\n')
    f.write('\n')
    f.write('def isSeaLevelMap():\n')
    f.write('\treturn 0\n')
    f.write('\n')
    f.write('def getNumCustomMapOptions():\n')
    f.write('\treturn 3\n')
    f.write('\n')
    f.write('def getCustomMapOptionName(argsList):\n')
    f.write('\t[iOption] = argsList\n')
    f.write('\toption_names = {\n')
    # (advc.savem: Tbd.: Options "Players", "Difficulty")
    f.write(
        '\t\t0:\t"Starting Sites",\n')  # advc.savem: was "Starting Locations"
    f.write('\t\t1:\t"Bonus Resources",\n')  # advc.savem: was "Bonuses"
    f.write('\t\t2:\t"Goody Huts"\n')
    f.write('\t\t}\n')
    f.write(
        '\ttranslated_text = unicode(CyTranslator().getText(option_names[iOption], ()))\n'
    )
    f.write('\treturn translated_text\n')
    f.write('\n')
    f.write('def getNumCustomMapOptionValues(argsList):\n')
    f.write('\t[iOption] = argsList\n')
    f.write('\toption_values = {\n')
    f.write('\t\t0:\t3,\n')
    f.write('\t\t1:\t2,\n')
    f.write('\t\t2:\t2\n')
    f.write('\t\t}\n')
    f.write('\treturn option_values[iOption]\n')
    f.write('\n')
    f.write('def getCustomMapOptionDescAt(argsList):\n')
    f.write('\t[iOption, iSelection] = argsList\n')
    f.write('\tselection_names = {\n')
    f.write('\t\t0:\t{\n')
    # (advc.savem: Tbd.: "Players" selections: "Original Players" / "Custom [Override?] Players".
    # Also: "Difficulty": "Custom Difficulty" / "Original Difficulty"
    # Could shorten the selection names further; the longer names are better for the in-game Settings tab.)
    f.write('\t\t\t0: "Original Starts",\n'
            )  # advc.savem: was "Use Fixed Starting Locations"
    # advc.savem: was "Use Fixed Starting Locations, but assign Civs at Random".
    f.write('\t\t\t1: "Shuffled Starts",\n')
    # advc.savem: Was "Ignore Fixed Locations". Warn that the normalization step will be skipped?
    f.write('\t\t\t2: "New Starts"\n')
    f.write('\t\t\t},\n')
    f.write('\t\t1:\t{\n')
    f.write('\t\t\t0: "Original Bonuses",\n'
            )  # advc.savem: was "Use Fixed Bonuses"
    f.write('\t\t\t1: "New Bonuses"\n')  # advc.savem: was "Randomize Bonuses"
    f.write('\t\t\t},\n')
    f.write('\t\t2:\t{\n')
    f.write('\t\t\t0: "Original Huts",\n'
            )  # advc.savem: was "Use fixed Goody Huts"
    f.write('\t\t\t1: "New Huts"\n')  # advc.savem: was "Randomize Goody Huts"
    f.write('\t\t\t}\n')
    f.write('\t\t}\n')
    f.write(
        '\ttranslated_text = unicode(CyTranslator().getText(selection_names[iOption][iSelection], ()))\n'
    )
    f.write('\treturn translated_text\n')
    f.write('\n')
    f.write('def getCustomMapOptionDefault(argsList):\n')
    f.write('\t[iOption] = argsList\n')
    f.write('\toption_defaults = {\n')
    f.write('\t\t0:\t0,\n')
    f.write('\t\t1:\t0,\n')
    f.write('\t\t2:\t0\n')
    f.write('\t\t}\n')
    f.write('\treturn option_defaults[iOption]\n')
    f.write('\n')
    # advc.savem: Rather confusing together with selections like "Random Bonuses"
    #f.write('def isRandomCustomMapOption(argsList):\n')
    #f.write('\t[iOption] = argsList\n')
    #f.write('\toption_random = {\n')
    #f.write('\t\t0:\tTrue,\n')
    #f.write('\t\t1:\tTrue,\n')
    #f.write('\t\t2:\tTrue\n')
    #f.write('\t\t}\n')
    #f.write('\treturn option_random[iOption]\n')
    #f.write('\n')
    f.write('def getWrapX():\n')
    string = '\treturn ' + str(wrapX) + '\n'
    f.write(string)
    f.write('\n')
    f.write('def getWrapY():\n')
    string = '\treturn ' + str(wrapY) + '\n'
    f.write(string)
    f.write('\n')
    f.write('def getTopLatitude():\n')
    string = '\treturn ' + str(topLat) + '\n'
    f.write(string)
    f.write('\n')
    f.write('def getBottomLatitude():\n')
    string = '\treturn ' + str(bottomLat) + '\n'
    f.write(string)
    f.write('\n')
    f.write('def getGridSize(argsList):\n')
    string = '\treturn (' + str((width + extraWidth) / 4) + ', ' + str(
        (height + extraHeight) / 4) + ')\n'
    f.write(string)
    f.write('\n')
    f.write('def generatePlotTypes():\n')
    f.write('\tplots = []\n')
    f.write('\tfor i in range(numPlots):\n')
    f.write('\t\tif(i in plotTypes):\n')
    f.write('\t\t\tplots.append(plotTypes[i])\n')
    f.write('\t\telse:\n')
    f.write('\t\t\tplots.append(3)\n')
    f.write('\treturn plots\n')
    f.write('\n')
    f.write('def generateTerrainTypes():\n')
    f.write('\tterrain = []\n')
    f.write('\tfor i in range(numPlots):\n')
    f.write('\t\tif(i in terrainTypes):\n')
    f.write('\t\t\tterrain.append(terrainTypes[i]) \n')
    f.write('\t\telse:\n')
    f.write('\t\t\tterrain.append(6)\n')
    f.write('\treturn terrain\n')
    f.write('\n')
    f.write('def beforeInit():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def beforeGeneration():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def addRivers():\n')
    f.write(
        '\t# yes, use riverwe for setNOfRiver and riverns for setWOfRiver\n')
    f.write('\tfor plotIdx in riverwe:\n')
    f.write('\t\tpPlot = CyMap().plotByIndex(plotIdx)\n')
    f.write(
        '\t\tpPlot.setNOfRiver(1, CardinalDirectionTypes(riverwe[plotIdx]))\n')
    f.write('\tfor plotIdx in riverns:\n')
    f.write('\t\tpPlot = CyMap().plotByIndex(plotIdx)\n')
    f.write(
        '\t\tpPlot.setWOfRiver(1, CardinalDirectionTypes(riverns[plotIdx]))\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def addLakes():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def addFeatures():\n')
    f.write('\tfor plotIdx in features:\n')
    f.write('\t\tpPlot = CyMap().plotByIndex(plotIdx)\n')
    f.write(
        '\t\tpPlot.setFeatureType(features[plotIdx], featureVarieties[plotIdx])\n'
    )
    f.write('\treturn 0\n')
    f.write('\n')
    f.write('def addBonuses():\n')
    f.write('\tif CyMap().getCustomMapOption(1) == 0:\n')
    f.write('\t\tfor plotIdx in bonuses:\n')
    f.write('\t\t\tpPlot = CyMap().plotByIndex(plotIdx)\n')
    f.write('\t\t\tpPlot.setBonusType(bonuses[plotIdx])\n')
    f.write('\telse:\n')
    f.write('\t\tCyPythonMgr().allowDefaultImpl()\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def addGoodies():\n')
    f.write('\tif CyMap().getCustomMapOption(2) == 0:\n')
    f.write('\t\tfor plotIdx in improvements:\n')
    f.write(
        '\t\t\tif(improvements[plotIdx] == gc.getInfoTypeForString("IMPROVEMENT_GOODY_HUT")):\n'
    )
    f.write('\t\t\t\tpPlot = CyMap().plotByIndex(plotIdx)\n')
    f.write(
        '\t\t\t\tpPlot.setImprovementType(gc.getInfoTypeForString("IMPROVEMENT_GOODY_HUT"))\n'
    )
    f.write('\telse:\n')
    f.write('\t\tCyPythonMgr().allowDefaultImpl()\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def assignStartingPlots():\n')
    # <advc.027> Allow StartingPositionIteration to assign the plots
    f.write('\tif CyMap().getCustomMapOption(0) == 2:\n')
    f.write('\t\tCyPythonMgr().allowDefaultImpl()\n')
    f.write('\t\treturn None\n')
    # </advc.027>
    string = '\t# civs are ' + str(civsDesc) + '\n'
    f.write(string)
    string = '\tcivs = ' + str(civs) + '\n'
    f.write(string)
    string = '\tstartingPlots = ' + str(startingPlots) + '\n'
    f.write(string)
    string = '\tstartingPlotsXY = ' + str(startingPlotsXY) + '\n'
    f.write(string)
    f.write('\tif CyMap().getCustomMapOption(0) == 1:\n')
    f.write('\t\tshuffle(startingPlots)\n')
    f.write('\tusedstartingPlots = []\n')
    f.write('\tnumPlayers = CyGame().countCivPlayersEverAlive()\n')
    f.write('\tnotinlist = []\n')
    f.write('\tfor i in range(0, numPlayers):\n')
    f.write('\t\tplayer = gc.getPlayer(i)\n')
    f.write('\t\t# partly random assignment to fixed locations\n')
    f.write('\t\tif CyMap().getCustomMapOption(0) == 1:\n')
    f.write('\t\t\tif(i < len(startingPlots)):\n')
    f.write('\t\t\t\tplotindex = startingPlots[i]\n')
    f.write('\t\t\telse:\n')
    f.write('\t\t\t\tplotindex = findStartingPlot(i)\n')
    f.write(
        '\t\t\tplayer.setStartingPlot(CyMap().plotByIndex(plotindex), 1)\n')
    f.write('\t\t# fixed locations\n')
    #f.write('\t\telif CyMap().getCustomMapOption(0) == 0:\n')
    f.write('\t\telse:\n')  # advc.027: Replacing the above
    f.write('\t\t\tciv = int(player.getCivilizationType())\n')
    f.write('\t\t\tif(civs.count(civ) == 1):\n')
    f.write('\t\t\t\tpindex = civs.index(civ)\n')
    f.write('\t\t\t\tplotindex = startingPlots[pindex]\n')
    f.write('\t\t\t\tusedstartingPlots.append(plotindex)\n')
    f.write(
        '\t\t\t\tplayer.setStartingPlot(CyMap().plotByIndex(plotindex), 1)\n')
    f.write('\t\t\telse:\n')
    f.write('\t\t\t\tnotinlist.append(i)\n')
    # advc.027: Commented out (now handled upfront)
    #f.write('\t\t# fully random (ignore fixed locations)\n')
    #f.write('\t\telse:\n')
    #f.write('\t\t\tplotindex = findStartingPlot(i)\n')
    #f.write('\t\t\tplayer.setStartingPlot(CyMap().plotByIndex(plotindex), 1)\n')
    f.write('\t\n')
    f.write('\t# handle unassigned civs\n')
    f.write(
        '\topenstartingPlots = list(set(startingPlots) - set(usedstartingPlots))\n'
    )
    f.write(
        '\tshuffle(openstartingPlots) # so that unassigned civs get different position when regenerating a map\n'
    )
    f.write('\tfor i in range(len(notinlist)):\n')
    f.write('\t\tplayer = gc.getPlayer(notinlist[i])\n')
    f.write('\t\t# try to reuse unassigned starting plots\n')
    f.write('\t\tif len(openstartingPlots) > 0:\n')
    f.write('\t\t\tplotindex = openstartingPlots[0]\n')
    f.write('\t\t\topenstartingPlots.remove(plotindex)\n')
    f.write('\t\telse:\n')
    f.write('\t\t\tplotindex = findStartingPlot(notinlist[i])\n')
    f.write('\t\tplayer.setStartingPlot(CyMap().plotByIndex(plotindex), 1)\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def findStartingPlot(argsList):\n')
    f.write('\tplayerID = argsList\n')
    # <advc.027>
    f.write('\tif CyMap().getCustomMapOption(0) == 2:\n')
    f.write('\t\tCyPythonMgr().allowDefaultImpl()\n')
    f.write('\t\treturn None\n')
    # </advc.027>
    f.write('\treturn CvMapGeneratorUtil.findStartingPlot(playerID)\n')
    f.write('\n')
    f.write('def normalizeStartingPlotLocations():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def normalizeAddRiver():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def normalizeRemovePeaks():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def normalizeAddLakes():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def normalizeRemoveBadFeatures():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def normalizeRemoveBadTerrain():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def normalizeAddFoodBonuses():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def normalizeAddGoodTerrain():\n')
    f.write('\treturn None\n')
    f.write('\n')
    f.write('def normalizeAddExtras():\n')
    f.write('\treturn None\n')
    f.write('\n')
    # advc.savem: AdvCiv doesn't place free AI units in the same tile; doing it only for humans won't really help.
    #f.write('def startHumansOnSameTile():\n')
    #f.write('\treturn True\n')
    f.close()
    # <advc.savem>
    BugUtil.debug("savemap: Done saving map to '%s'", string)
Ejemplo n.º 3
0
def writeLog():

    if CyGame().isPitbossHost():
        playername = "PitBoss"
    else:
        # advc: Prepend id b/c player names can be the same (that happens easily when testing on a single machine)
        activePlayer = gc.getPlayer(gc.getGame().getActivePlayer())
        playername = str(activePlayer.getID()) + CvUtil.convertToStr(
            activePlayer.getName())
    szNewFilename = BugPath.getRootDir() + "\\Logs\\" + "OOSLog - %s - " % (
        playername) + "Turn %s" % (gc.getGame().getGameTurn()) + ".log"
    # <advc> Replacement for the bWroteLog mechanism above
    if os.path.isfile(szNewFilename):
        return  # </advc>
    pFile = open(szNewFilename, "w")

    # Backup current language
    iLanguage = CyGame().getCurrentLanguage()
    # Force english language for logs
    CyGame().setCurrentLanguage(0)

    #
    # Global data
    #
    pFile.write(SEPERATOR)
    pFile.write(SEPERATOR)

    #pFile.write(CvUtil.convertToStr(CyTranslator().getText("TXT_KEY_VERSION", ())))
    #pFile.write("\n\n")

    # The log follows the order in CvGame::calculateSyncChecksum()

    pFile.write("  GLOBALS  \n")

    pFile.write(SEPERATOR)
    pFile.write(SEPERATOR)
    pFile.write("\n\n")
    # advc: Call getSeed instead of get -- don't want to change the state of the RNGs here.
    pFile.write("Last Map Rand Value: %d\n" % CyGame().getMapRand().getSeed())
    pFile.write("Last Soren Rand Value: %d\n" %
                CyGame().getSorenRand().getSeed())

    pFile.write("Total cities: %d\n" % CyGame().getNumCities())
    pFile.write("Total population: %d\n" % CyGame().getTotalPopulation())
    pFile.write("Total deals: %d\n" % CyGame().getNumDeals())

    pFile.write("Total owned plots: %d\n" % CyMap().getOwnedPlots())
    pFile.write("Total number of areas: %d\n" % CyMap().getNumAreas())

    #pFile.write("Global counter: %d\n" % CyGame().getGlobalCounter() )
    #pFile.write("Total civilization cities: %d\n" % CyGame().getNumCivCities() )

    pFile.write("Turn slice: %d\n" % (CyGame().getTurnSlice() % 8))

    pFile.write("\n\n")

    #
    # Player data
    #
    iPlayer = 0
    for iPlayer in range(gc.getMAX_PLAYERS()):
        pPlayer = gc.getPlayer(iPlayer)
        if (pPlayer.isEverAlive()):
            pFile.write(SEPERATOR)
            pFile.write(SEPERATOR)

            pFile.write("  PLAYER %d: %s  \n" %
                        (iPlayer, CvUtil.convertToStr(pPlayer.getName())))
            #pFile.write("  Civilization: %s  \n" % (CvUtil.convertToStr(pPlayer.getCivilizationDescriptionKey())))

            pFile.write(SEPERATOR)
            pFile.write(SEPERATOR)
            pFile.write("\n\n")

            pFile.write("Basic data:\n")
            pFile.write("-----------\n")
            pFile.write("Player %d Score: %d\n" %
                        (iPlayer, gc.getGame().getPlayerScore(iPlayer)))

            pFile.write("Player %d Population: %d\n" %
                        (iPlayer, pPlayer.getTotalPopulation()))
            pFile.write("Player %d Total Land: %d\n" %
                        (iPlayer, pPlayer.getTotalLand()))
            pFile.write("Player %d Gold: %d\n" % (iPlayer, pPlayer.getGold()))
            pFile.write("Player %d Assets: %d\n" %
                        (iPlayer, pPlayer.getAssets()))
            pFile.write("Player %d Power: %d\n" %
                        (iPlayer, pPlayer.getPower()))
            pFile.write("Player %d Num Cities: %d\n" %
                        (iPlayer, pPlayer.getNumCities()))
            pFile.write("Player %d Num Units: %d\n" %
                        (iPlayer, pPlayer.getNumUnits()))
            pFile.write("Player %d Num Selection Groups: %d\n" %
                        (iPlayer, pPlayer.getNumSelectionGroups()))
            #pFile.write("Player %d Difficulty: %d\n" % (iPlayer, pPlayer.getHandicapType() ))
            #pFile.write("Player %d Religion: %s\n" % (iPlayer, CvUtil.convertToStr(pPlayer.getStateReligionKey()) ))
            #.pFile.write("Player %d Total culture: %d\n" % (iPlayer, pPlayer.countTotalCulture() ))

            pFile.write("\n\n")

            pFile.write("Yields:\n")
            pFile.write("-------\n")
            for iYield in range(int(YieldTypes.NUM_YIELD_TYPES)):
                pFile.write("Player %d %s Total Yield: %d\n" %
                            (iPlayer, gc.getYieldInfo(iYield).getDescription(),
                             pPlayer.calculateTotalYield(iYield)))

            pFile.write("\n\n")

            pFile.write("Commerce:\n")
            pFile.write("---------\n")
            for iCommerce in range(int(CommerceTypes.NUM_COMMERCE_TYPES)):
                pFile.write(
                    "Player %d %s Total Commerce: %d\n" %
                    (iPlayer, gc.getCommerceInfo(iCommerce).getDescription(),
                     pPlayer.getCommerceRate(CommerceTypes(iCommerce))))

            pFile.write("\n\n")

            pFile.write("Bonus Info:\n")
            pFile.write("-----------\n")
            for iBonus in range(gc.getNumBonusInfos()):
                pFile.write("Player %d, %s, Number Available: %d\n" %
                            (iPlayer, gc.getBonusInfo(iBonus).getDescription(),
                             pPlayer.getNumAvailableBonuses(iBonus)))
                pFile.write("Player %d, %s, Import: %d\n" %
                            (iPlayer, gc.getBonusInfo(iBonus).getDescription(),
                             pPlayer.getBonusImport(iBonus)))
                pFile.write("Player %d, %s, Export: %d\n" %
                            (iPlayer, gc.getBonusInfo(iBonus).getDescription(),
                             pPlayer.getBonusExport(iBonus)))
                pFile.write("\n")

            pFile.write("\n\n")

            pFile.write("Improvement Info:\n")
            pFile.write("-----------------\n")
            for iImprovement in range(gc.getNumImprovementInfos()):
                pFile.write(
                    "Player %d, %s, Improvement count: %d\n" %
                    (iPlayer,
                     CvUtil.convertToStr(
                         gc.getImprovementInfo(iImprovement).getDescription()),
                     pPlayer.getImprovementCount(iImprovement)))

            pFile.write("\n\n")

            pFile.write("Building Class Info:\n")
            pFile.write("--------------------\n")
            for iBuildingClass in range(gc.getNumBuildingClassInfos()):
                pFile.write(
                    "Player %d, %s, Building class count plus making: %d\n" %
                    (iPlayer,
                     CvUtil.convertToStr(
                         gc.getBuildingClassInfo(
                             iBuildingClass).getDescription()),
                     pPlayer.getBuildingClassCountPlusMaking(iBuildingClass)))

            pFile.write("\n\n")

            pFile.write("Unit Class Info:\n")
            pFile.write("--------------------\n")
            for iUnitClass in range(gc.getNumUnitClassInfos()):
                pFile.write(
                    "Player %d, %s, Unit class count plus training: %d\n" %
                    (iPlayer,
                     CvUtil.convertToStr(
                         gc.getUnitClassInfo(iUnitClass).getDescription()),
                     pPlayer.getUnitClassCountPlusMaking(iUnitClass)))

            pFile.write("\n\n")

            pFile.write("UnitAI Types Info:\n")
            pFile.write("------------------\n")
            for iUnitAIType in range(int(UnitAITypes.NUM_UNITAI_TYPES)):
                pFile.write(
                    "Player %d, %s, Unit AI Type count: %d\n" %
                    (iPlayer, gc.getUnitAIInfo(iUnitAIType).getDescription(),
                     pPlayer.AI_totalUnitAIs(UnitAITypes(iUnitAIType))))

            pFile.write("\n\n")

            pFile.write("Unit Info:\n")
            pFile.write("----------\n")
            iNumUnits = pPlayer.getNumUnits()

            if (iNumUnits == 0):
                pFile.write("No Units")
            else:
                pLoopUnitTuple = pPlayer.firstUnit(False)
                while (pLoopUnitTuple[0] != None):
                    pUnit = pLoopUnitTuple[0]
                    pFile.write("Player %d, Unit ID: %d, %s\n" %
                                (iPlayer, pUnit.getID(),
                                 CvUtil.convertToStr(pUnit.getName())))

                    pFile.write("X: %d, Y: %d\n" %
                                (pUnit.getX(), pUnit.getY()))
                    pFile.write("Damage: %d\n" % pUnit.getDamage())
                    #pFile.write("Experience: %d\n" % pUnit.getExperienceTimes100() )
                    pFile.write("Experience: %d\n" % pUnit.getExperience())
                    pFile.write("Level: %d\n" % pUnit.getLevel())
                    #pFile.write("Promotions:\n")
                    #for j in range(gc.getNumPromotionInfos()):
                    #	if (pUnit.isHasPromotion(j)):
                    #		pFile.write("%s\n" % (CvUtil.convertToStr(gc.getPromotionInfo(j).getDescription()) ))

                    pLoopUnitTuple = pPlayer.nextUnit(pLoopUnitTuple[1], False)
                    pFile.write("\n")

            if not pPlayer.isBarbarian():  # advc.003n
                pFile.write("\n\n")
                pFile.write("Attitude Info:\n")
                pFile.write("----------\n")

                iLoopPlayer = 0
                # <advc.003n> was MAX_PLAYERS
                for iLoopPlayer in range(gc.getMAX_CIV_PLAYERS()):
                    if iPlayer == iLoopPlayer:
                        continue  # </advc.003n>
                    pLoopPlayer = gc.getPlayer(iLoopPlayer)
                    pFile.write(
                        "Players %d - %d, Attitude: %d (Note, actual attitudeval number is used for the OOS checksum.)\n"
                        % (iPlayer, iLoopPlayer,
                           pPlayer.AI_getAttitude(iLoopPlayer)))

            pFile.write("\n\n")

            pFile.write("City Info:\n")
            pFile.write("----------\n")
            iNumCities = pPlayer.getNumCities()

            if (iNumCities == 0):
                pFile.write("No Cities")
            else:  # advc: Don't print this for each city
                pFile.write(
                    "(Events that have occurred are also used for the checksum.)\n"
                )
                pLoopCityTuple = pPlayer.firstCity(False)
                while (pLoopCityTuple[0] != None):
                    pCity = pLoopCityTuple[0]
                    pFile.write("Player %d, City ID: %d, %s, X: %d, Y: %d\n" %
                                (iPlayer, pCity.getID(),
                                 CvUtil.convertToStr(pCity.getName()),
                                 pCity.getX(), pCity.getY()))

                    pFile.write(
                        "Religions and corporations present are also used for the checksum.\n"
                    )
                    #pFile.write("Founded: %d\n" % pCity.getGameTurnFounded() )
                    #pFile.write("Population: %d\n" % pCity.getPopulation() )
                    #pFile.write("Buildings: %d\n" % pCity.getNumBuildings() )
                    #pFile.write("Improved Plots: %d\n" % pCity.countNumImprovedPlots() )
                    #pFile.write("Producing: %s\n" % pCity.getProductionName() )
                    #pFile.write("Turns remaining for production: %d\n" % pCity.getProductionTurnsLeft() )
                    pFile.write(
                        "%d happiness, %d unhappiness, %d health, %d unhealth, %d food\n"
                        % (pCity.happyLevel(), pCity.unhappyLevel(0),
                           pCity.goodHealth(), pCity.badHealth(False),
                           pCity.getFood()))
                    # advc.007:
                    pFile.write("Needed floating defenders: %d\n" %
                                pCity.AI_neededFloatingDefenders())
                    #pFile.write("%d Tiles Worked, %d Specialists, %d Great People\n" % (pCity.getWorkingPopulation(), pCity.getSpecialistPopulation(), pCity.getNumGreatPeople()) )
                    #pFile.write("City radius: %d\n" % pCity.getPlotRadius() )

                    pLoopCityTuple = pPlayer.nextCity(pLoopCityTuple[1], False)
                    pFile.write("\n")

            # Space at end of player's info
            pFile.write("\n\n")

    # Restore current language
    CyGame().setCurrentLanguage(iLanguage)

    # Close file

    pFile.close()
Ejemplo n.º 4
0
def init():
    global _saveDir
    _saveDir = BugPath.join(BugPath.getRootDir(), "Saves")
    if not _saveDir:
        BugUtil.error("Could not find Saves directory")
Ejemplo n.º 5
0
def init():
	global _saveDir
	_saveDir = BugPath.join(BugPath.getRootDir(), "Saves")
	if not _saveDir:
		BugUtil.error("Could not find Saves directory")
Ejemplo n.º 6
0
def log_path():
    # filepath='D:\\DoC_Log\\'
    filepath = BugPath.join(BugPath.getRootDir(), 'Saves', 'logs', '')
    return filepath
Ejemplo n.º 7
0
def writeLog():
	
	if gc.getGame().getActivePlayer() == -1:
		playername = "Pitboss"
	else:
		playername = CvUtil.convertToStr(gc.getPlayer(gc.getGame().getActivePlayer()).getNameKey())
	szNewFilename = BugPath.getRootDir() + "\\Logs\\" + "%s - Player %s - " % (playername, gc.getGame().getActivePlayer()) + "OOSLog - Turn " + "%s" % (gc.getGame().getGameTurn()) + ".txt"
	pFile = open(szNewFilename, "w")
	
	#
	# Global data
	#
	pFile.write(SEPERATOR)
	pFile.write(SEPERATOR)

	pFile.write("  GLOBALS  \n")

	pFile.write(SEPERATOR)
	pFile.write(SEPERATOR)
	pFile.write("\n\n")

	#pFile.write("Next Map Rand Value: %d\n" % CyGame().getMapRand().get(10000, "OOS Log"))
	#pFile.write("Next Soren Rand Value: %d\n" % CyGame().getSorenRand().get(10000, "OOS Log"))

	pFile.write("Total num cities: %d\n" % CyGame().getNumCities() )
	pFile.write("Total population: %d\n" % CyGame().getTotalPopulation() )
	pFile.write("Total Deals: %d\n" % CyGame().getNumDeals() )

	pFile.write("Total owned plots: %d\n" % CyMap().getOwnedPlots() )
	pFile.write("Total num areas: %d\n" % CyMap().getNumAreas() )

	pFile.write("\n\n")

	#
	# Player data
	#
	iPlayer = 0
	for iPlayer in range(gc.getMAX_PLAYERS()):
		pPlayer = gc.getPlayer(iPlayer)
		if (pPlayer.isEverAlive()):
			pFile.write(SEPERATOR)
			pFile.write(SEPERATOR)

			pFile.write("  PLAYER %d: %s  \n" % (iPlayer, CvUtil.convertToStr(pPlayer.getName())))
			pFile.write("  Civilizations: %s  \n" % (CvUtil.convertToStr(pPlayer.getCivilizationDescriptionKey())))

			pFile.write(SEPERATOR)
			pFile.write(SEPERATOR)
			pFile.write("\n\n")

			pFile.write("Basic data:\n")
			pFile.write("-----------\n")
			pFile.write("Player %d Score: %d\n" % (iPlayer, gc.getGame().getPlayerScore(iPlayer) ))

			pFile.write("Player %d Population: %d\n" % (iPlayer, pPlayer.getTotalPopulation() ) )
			pFile.write("Player %d Total Land: %d\n" % (iPlayer, pPlayer.getTotalLand() ) )
			pFile.write("Player %d Gold: %d\n" % (iPlayer, pPlayer.getGold() ) )
			pFile.write("Player %d Assets: %d\n" % (iPlayer, pPlayer.getAssets() ) )
			pFile.write("Player %d Power: %d\n" % (iPlayer, pPlayer.getPower() ) )
			pFile.write("Player %d Num Cities: %d\n" % (iPlayer, pPlayer.getNumCities() ) )
			pFile.write("Player %d Num Units: %d\n" % (iPlayer, pPlayer.getNumUnits() ) )
			pFile.write("Player %d Num Selection Groups: %d\n" % (iPlayer, pPlayer.getNumSelectionGroups() ) )
			pFile.write("Player %d Difficulty: %d\n" % (iPlayer, pPlayer.getHandicapType() ))

			pFile.write("\n\n")

			pFile.write("Yields:\n")
			pFile.write("-------\n")
			for iYield in range( int(YieldTypes.NUM_YIELD_TYPES) ):
				pFile.write("Player %d %s Total Yield: %d\n" % (iPlayer, gc.getYieldInfo(iYield).getDescription(), pPlayer.calculateTotalYield(iYield) ))

			pFile.write("\n\n")

			pFile.write("Commerce:\n")
			pFile.write("---------\n")
			for iCommerce in range( int(CommerceTypes.NUM_COMMERCE_TYPES) ):
				pFile.write("Player %d %s Total Commerce: %d\n" % (iPlayer, gc.getCommerceInfo(iCommerce).getDescription(), pPlayer.getCommerceRate(CommerceTypes(iCommerce)) ))

			pFile.write("\n\n")

			pFile.write("Bonus Info:\n")
			pFile.write("-----------\n")
			for iBonus in range(gc.getNumBonusInfos()):
				pFile.write("Player %d, %s, Number Available: %d\n" % (iPlayer, gc.getBonusInfo(iBonus).getDescription(), pPlayer.getNumAvailableBonuses(iBonus) ))
				pFile.write("Player %d, %s, Import: %d\n" % (iPlayer, gc.getBonusInfo(iBonus).getDescription(), pPlayer.getBonusImport(iBonus) ))
				pFile.write("Player %d, %s, Export: %d\n" % (iPlayer, gc.getBonusInfo(iBonus).getDescription(), pPlayer.getBonusExport(iBonus) ))
				pFile.write("\n")

			pFile.write("\n\n")

			pFile.write("Improvement Info:\n")
			pFile.write("-----------------\n")
			for iImprovement in range(gc.getNumImprovementInfos()):
				pFile.write("Player %d, %s, Improvement count: %d\n" % (iPlayer, CvUtil.convertToStr(gc.getImprovementInfo(iImprovement).getDescription()), pPlayer.getImprovementCount(iImprovement) ))

			pFile.write("\n\n")

			pFile.write("Building Class Info:\n")
			pFile.write("--------------------\n")
			for iBuildingClass in range(gc.getNumBuildingClassInfos()):
				pFile.write("Player %d, %s, Building class count plus building: %d\n" % (iPlayer, CvUtil.convertToStr(gc.getBuildingClassInfo(iBuildingClass).getDescription()), pPlayer.getBuildingClassCountPlusMaking(iBuildingClass) ))

			pFile.write("\n\n")

			pFile.write("Unit Class Info:\n")
			pFile.write("--------------------\n")
			for iUnitClass in range(gc.getNumUnitClassInfos()):
				pFile.write("Player %d, %s, Unit class count plus training: %d\n" % (iPlayer, CvUtil.convertToStr(gc.getUnitClassInfo(iUnitClass).getDescription()), pPlayer.getUnitClassCountPlusMaking(iUnitClass) ))

			pFile.write("\n\n")

			pFile.write("UnitAI Types Info:\n")
			pFile.write("------------------\n")
			for iUnitAIType in range(int(UnitAITypes.NUM_UNITAI_TYPES)):
				pFile.write("Player %d, %s, Unit AI Type count: %d\n" % (iPlayer, gc.getUnitAIInfo(iUnitAIType).getDescription(), pPlayer.AI_totalUnitAIs(UnitAITypes(iUnitAIType)) ))
			

			pFile.write("\n\n")

			pFile.write("City Info:\n")
			pFile.write("----------\n")
			iNumCities = pPlayer.getNumCities()

			if (iNumCities == 0):
				pFile.write("No Cities")
			else:
				pLoopCityTuple = pPlayer.firstCity(False)
				while (pLoopCityTuple[0] != None):
					pCity = pLoopCityTuple[0]
					#pFile.write("Player %d, City ID: %d, %s, Plot Radius: %d\n" % (iPlayer, pCity.getID(), CvUtil.convertToStr(pCity.getName()), pCity.getPlotRadius() ))

					pFile.write("X: %d, Y: %d\n" % (pCity.getX(), pCity.getY()) )
					pFile.write("Founded: %d\n" % pCity.getGameTurnFounded() )
					pFile.write("Population: %d\n" % pCity.getPopulation() )
					pFile.write("Buildings: %d\n" % pCity.getNumBuildings() )
					pFile.write("Improved Plots: %d\n" % pCity.countNumImprovedPlots() )
					pFile.write("Producing: %s\n" % pCity.getProductionName() )
					pFile.write("%d Tiles Worked, %d Specialists, %d Great People\n" % (pCity.getWorkingPopulation(), pCity.getSpecialistPopulation(), pCity.getNumGreatPeople()) )

					pLoopCityTuple = pPlayer.nextCity(pLoopCityTuple[1], False)
					pFile.write("\n")


			pFile.write("\n\n")

			pFile.write("Unit Info:\n")
			pFile.write("----------\n")
			iNumUnits = pPlayer.getNumUnits()

			if (iNumUnits == 0):
				pFile.write("No Units")
			else:
				pLoopUnitTuple = pPlayer.firstUnit(False)
				while (pLoopUnitTuple[0] != None):
					pUnit = pLoopUnitTuple[0]
					pFile.write("Player %d, Unit ID: %d, %s\n" % (iPlayer, pUnit.getID(), CvUtil.convertToStr(pUnit.getName()) ))
					pFile.write("X: %d, Y: %d\n" % (pUnit.getX(), pUnit.getY()) )
					pFile.write("Damage: %d\n" % pUnit.getDamage() )
					pFile.write("ExperienceTimes100: %d\n" % pUnit.getExperience100() )
					pFile.write("RealExperience: %d\n" % pUnit.getRealExperience() )
					pFile.write("Experience: %d\n" % pUnit.getExperience() )
					pFile.write("Level: %d\n" % pUnit.getLevel() )
					pFile.write("Promotions:\n")
					for j in range(gc.getNumPromotionInfos()):
						if (pUnit.isHasPromotion(j)):
							pFile.write("%s\n" % (CvUtil.convertToStr(gc.getPromotionInfo(j).getDescription()) ))

					pLoopUnitTuple = pPlayer.nextUnit(pLoopUnitTuple[1], False)
					pFile.write("\n")
				

			# Space at end of player's info
			pFile.write("\n\n")
		
	# Close file

	pFile.close()
Ejemplo n.º 8
0
def writeLog():
    playername = CvUtil.convertToStr(
        gc.getPlayer(gc.getGame().getActivePlayer()).getName())
    szNewFilename = BugPath.getRootDir() + "\\Logs\\" + "OOSLog - %s - " % (
        playername) + "Turn %s" % (gc.getGame().getGameTurn()) + ".txt"
    pFile = open(szNewFilename, "w")

    # Backup current language
    iLanguage = CyGame().getCurrentLanguage()
    # Force english language for logs
    CyGame().setCurrentLanguage(0)

    #
    # Global data
    #
    pFile.write(SEPERATOR)
    pFile.write(SEPERATOR)

    pFile.write("  GLOBALS  \n")

    pFile.write(SEPERATOR)
    pFile.write(SEPERATOR)
    pFile.write("\n\n")

    pFile.write("Next Map Rand Value: %d\n" %
                CyGame().getMapRand().get(10000, "OOS Log"))
    pFile.write("Next Soren Rand Value: %d\n" %
                CyGame().getSorenRand().get(10000, "OOS Log"))

    pFile.write("Total num cities: %d\n" % CyGame().getNumCities())
    pFile.write("Total population: %d\n" % CyGame().getTotalPopulation())
    pFile.write("Total Deals: %d\n" % CyGame().getNumDeals())

    pFile.write("Total owned plots: %d\n" % CyMap().getOwnedPlots())
    pFile.write("Total num areas: %d\n" % CyMap().getNumAreas())

    pFile.write("\n\n")

    #
    # Player data
    #
    iPlayer = 0
    for iPlayer in range(gc.getMAX_PLAYERS()):
        pPlayer = gc.getPlayer(iPlayer)
        if (pPlayer.isEverAlive()):
            pFile.write(SEPERATOR)
            pFile.write(SEPERATOR)

            pFile.write("  PLAYER %d: %s  \n" %
                        (iPlayer, CvUtil.convertToStr(pPlayer.getName())))
            pFile.write(
                "  Civilizations: %s  \n" %
                (CvUtil.convertToStr(pPlayer.getCivilizationDescriptionKey())))

            pFile.write(SEPERATOR)
            pFile.write(SEPERATOR)
            pFile.write("\n\n")

            pFile.write("Basic data:\n")
            pFile.write("-----------\n")
            pFile.write("Player %d Score: %d\n" %
                        (iPlayer, gc.getGame().getPlayerScore(iPlayer)))

            pFile.write("Player %d Population: %d\n" %
                        (iPlayer, pPlayer.getTotalPopulation()))
            pFile.write("Player %d Total Land: %d\n" %
                        (iPlayer, pPlayer.getTotalLand()))
            pFile.write("Player %d Gold: %d\n" % (iPlayer, pPlayer.getGold()))
            pFile.write("Player %d Assets: %d\n" %
                        (iPlayer, pPlayer.getAssets()))
            pFile.write("Player %d Power: %d\n" %
                        (iPlayer, pPlayer.getPower()))
            pFile.write("Player %d Num Cities: %d\n" %
                        (iPlayer, pPlayer.getNumCities()))
            pFile.write("Player %d Num Units: %d\n" %
                        (iPlayer, pPlayer.getNumUnits()))
            pFile.write("Player %d Num Selection Groups: %d\n" %
                        (iPlayer, pPlayer.getNumSelectionGroups()))
            pFile.write("Player %d Difficulty: %d\n" %
                        (iPlayer, pPlayer.getHandicapType()))

            pFile.write("\n\n")

            pFile.write("Yields:\n")
            pFile.write("-------\n")
            for iYield in range(int(YieldTypes.NUM_YIELD_TYPES)):
                pFile.write("Player %d %s Total Yield: %d\n" %
                            (iPlayer, gc.getYieldInfo(iYield).getDescription(),
                             pPlayer.calculateTotalYield(iYield)))

            pFile.write("\n\n")

            pFile.write("Commerce:\n")
            pFile.write("---------\n")
            for iCommerce in range(int(CommerceTypes.NUM_COMMERCE_TYPES)):
                pFile.write(
                    "Player %d %s Total Commerce: %d\n" %
                    (iPlayer, gc.getCommerceInfo(iCommerce).getDescription(),
                     pPlayer.getCommerceRate(CommerceTypes(iCommerce))))

            pFile.write("\n\n")

            pFile.write("Bonus Info:\n")
            pFile.write("-----------\n")
            for iBonus in range(gc.getNumBonusInfos()):
                pFile.write("Player %d, %s, Number Available: %d\n" %
                            (iPlayer, gc.getBonusInfo(iBonus).getDescription(),
                             pPlayer.getNumAvailableBonuses(iBonus)))
                pFile.write("Player %d, %s, Import: %d\n" %
                            (iPlayer, gc.getBonusInfo(iBonus).getDescription(),
                             pPlayer.getBonusImport(iBonus)))
                pFile.write("Player %d, %s, Export: %d\n" %
                            (iPlayer, gc.getBonusInfo(iBonus).getDescription(),
                             pPlayer.getBonusExport(iBonus)))
                pFile.write("\n")

            pFile.write("\n\n")

            pFile.write("Improvement Info:\n")
            pFile.write("-----------------\n")
            for iImprovement in range(gc.getNumImprovementInfos()):
                pFile.write(
                    "Player %d, %s, Improvement count: %d\n" %
                    (iPlayer,
                     CvUtil.convertToStr(
                         gc.getImprovementInfo(iImprovement).getDescription()),
                     pPlayer.getImprovementCount(iImprovement)))

            pFile.write("\n\n")

            pFile.write("Building Class Info:\n")
            pFile.write("--------------------\n")
            for iBuildingClass in range(gc.getNumBuildingClassInfos()):
                pFile.write(
                    "Player %d, %s, Building class count plus building: %d\n" %
                    (iPlayer,
                     CvUtil.convertToStr(
                         gc.getBuildingClassInfo(
                             iBuildingClass).getDescription()),
                     pPlayer.getBuildingClassCountPlusMaking(iBuildingClass)))

            pFile.write("\n\n")

            pFile.write("Unit Class Info:\n")
            pFile.write("--------------------\n")
            for iUnitClass in range(gc.getNumUnitClassInfos()):
                pFile.write(
                    "Player %d, %s, Unit class count plus training: %d\n" %
                    (iPlayer,
                     CvUtil.convertToStr(
                         gc.getUnitClassInfo(iUnitClass).getDescription()),
                     pPlayer.getUnitClassCountPlusMaking(iUnitClass)))

            pFile.write("\n\n")

            pFile.write("UnitAI Types Info:\n")
            pFile.write("------------------\n")
            for iUnitAIType in range(int(UnitAITypes.NUM_UNITAI_TYPES)):
                pFile.write(
                    "Player %d, %s, Unit AI Type count: %d\n" %
                    (iPlayer, gc.getUnitAIInfo(iUnitAIType).getDescription(),
                     pPlayer.AI_totalUnitAIs(UnitAITypes(iUnitAIType))))

            pFile.write("\n\n")

            pFile.write("City Info:\n")
            pFile.write("----------\n")
            iNumCities = pPlayer.getNumCities()

            if (iNumCities == 0):
                pFile.write("No Cities")
            else:
                pLoopCityTuple = pPlayer.firstCity(False)
                while (pLoopCityTuple[0] != None):
                    pCity = pLoopCityTuple[0]
                    #pFile.write("Player %d, City ID: %d, %s, Plot Radius: %d\n" % (iPlayer, pCity.getID(), CvUtil.convertToStr(pCity.getName()), pCity.getPlotRadius() ))

                    pFile.write("X: %d, Y: %d\n" %
                                (pCity.getX(), pCity.getY()))
                    pFile.write("Founded: %d\n" % pCity.getGameTurnFounded())
                    pFile.write("Population: %d\n" % pCity.getPopulation())
                    pFile.write("Buildings: %d\n" % pCity.getNumBuildings())
                    pFile.write("Improved Plots: %d\n" %
                                pCity.countNumImprovedPlots())
                    pFile.write("Producing: %s\n" % pCity.getProductionName())
                    pFile.write(
                        "%d Tiles Worked, %d Specialists, %d Great People\n" %
                        (pCity.getWorkingPopulation(),
                         pCity.getSpecialistPopulation(),
                         pCity.getNumGreatPeople()))

                    pLoopCityTuple = pPlayer.nextCity(pLoopCityTuple[1], False)
                    pFile.write("\n")

            pFile.write("\n\n")

            pFile.write("Unit Info:\n")
            pFile.write("----------\n")
            iNumUnits = pPlayer.getNumUnits()

            if (iNumUnits == 0):
                pFile.write("No Units")
            else:
                pLoopUnitTuple = pPlayer.firstUnit(False)
                while (pLoopUnitTuple[0] != None):
                    pUnit = pLoopUnitTuple[0]
                    pFile.write("Player %d, Unit ID: %d, %s\n" %
                                (iPlayer, pUnit.getID(),
                                 CvUtil.convertToStr(pUnit.getName())))
                    pFile.write("X: %d, Y: %d\n" %
                                (pUnit.getX(), pUnit.getY()))
                    pFile.write("Damage: %d\n" % pUnit.getDamage())
                    #pFile.write("Experience: %d\n" % pUnit.getExperienceTimes100() )
                    pFile.write("Experience: %d\n" % pUnit.getExperience())
                    pFile.write("Level: %d\n" % pUnit.getLevel())
                    pFile.write("Promotions:\n")
                    for j in range(gc.getNumPromotionInfos()):
                        if (pUnit.isHasPromotion(j)):
                            pFile.write("%s\n" % (CvUtil.convertToStr(
                                gc.getPromotionInfo(j).getDescription())))

                    pLoopUnitTuple = pPlayer.nextUnit(pLoopUnitTuple[1], False)
                    pFile.write("\n")

            # Space at end of player's info
            pFile.write("\n\n")

    # Restore current language
    CyGame().setCurrentLanguage(iLanguage)

    # Close file

    pFile.close()