from CvPythonExtensions import *
import os

gc = CyGlobalContext()
pathname = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\My Documents\\My Games\\Sid Meier\'s Civilization 4\\PublicMaps\\"
def savemap(filename = 'civ4map'):
    newfilename = str(filename)
    if(type(filename) == type(25)):
        newfilename = 'civ4map' + newfilename
    width = CyMap().getGridWidth()
    height = CyMap().getGridHeight()
    extrawidth = int(width%4)
    extraheight = int(height%4)
    if(extrawidth != 0):
        extrawidth = 4 - extrawidth
    if(extraheight != 0):
        extraheight = 4 - extraheight
    wrapx = CyMap().isWrapX()
    wrapy = CyMap().isWrapY()
    toplat = CyMap().getTopLatitude()
    bottomlat = CyMap().getBottomLatitude()
    numberofplayers = CyGame().countCivPlayersEverAlive()
    civs = []
    startingplots = []

    for i in range(numberofplayers):
        player = gc.getPlayer(i)
        pPlot = player.getStartingPlot()
        if(CyMap().isPlot(pPlot.getX(), pPlot.getY())):
            pIndex = CyMap().plotNum(pPlot.getX(), pPlot.getY()) + (extrawidth * pPlot.getY())
            startingplots.append(pIndex)
            civs.append(int(player.getCivilizationType()))
        elif(player.getCapitalCity().plot() != None):
            pPlot = player.getCapitalCity().plot()
            pIndex = CyMap().plotNum(pPlot.getX(), pPlot.getY()) + (extrawidth * pPlot.getY())
            startingplots.append(pIndex)
            civs.append(int(player.getCivilizationType()))
        elif((player.getCapitalCity().plot() == None) and (player.getNumCities() > 0)):
            pPlot = player.getCity(0).plot()
            pIndex = CyMap().plotNum(pPlot.getX(), pPlot.getY()) + (extrawidth * pPlot.getY())
            startingplots.append(pIndex)
            civs.append(int(player.getCivilizationType()))
        elif(player.getNumCities() < 1):
            pIndex = 0
            for j in range(player.getNumUnits()):
                unit = player.getUnit(j)
                if(unit.getUnitType()==gc.getInfoTypeForString("UNIT_SETTLER")):
                    pPlot = unit.plot()
                    if(pPlot.isWater() == 0):
                        pIndex = CyMap().plotNum(pPlot.getX(), pPlot.getY()) + (extrawidth * pPlot.getY())
                        startingplots.append(pIndex)
                        civs.append(int(player.getCivilizationType()))
                        break                   

    plotlist = []
    terrainlist = []
    bonuslist = []
    featurelist = []
    varietylist = []
    nofriverlist = []
    riverwelist = []
    wofriverlist = []
    rivernslist = []
    improvementlist = []

    for i in range(0,height):
        for j in range(0,width):
            pPlot = CyMap().plot(j,i)
            plotlist.append(int(pPlot.getPlotType()))
            terrainlist.append(pPlot.getTerrainType())
            bonuslist.append(pPlot.getBonusType(-1))
            featurelist.append(pPlot.getFeatureType())
            varietylist.append(pPlot.getFeatureVariety())
            nofriverlist.append(int(pPlot.isNOfRiver()))
            riverwelist.append(int(pPlot.getRiverWEDirection()))
            wofriverlist.append(int(pPlot.isWOfRiver()))
            rivernslist.append(int(pPlot.getRiverNSDirection()))
            improvementlist.append(pPlot.getImprovementType())
            if(j == width-1):
                for k in range(0,extrawidth):
                    plotlist.append(0)
                    terrainlist.append(0)
                    bonuslist.append(-1)
                    featurelist.append(-1)
                    varietylist.append(-1)
                    nofriverlist.append(0)
                    riverwelist.append(-1)
                    wofriverlist.append(0)
                    rivernslist.append(-1)
                    improvementlist.append(-1)
        if(i == height-1):
            for l in range(0,extraheight):
                for m in range(0, width + extrawidth):
                    plotlist.append(0)
                    terrainlist.append(0)
                    bonuslist.append(-1)
                    featurelist.append(-1)
                    varietylist.append(-1)
                    nofriverlist.append(0)
                    riverwelist.append(-1)
                    wofriverlist.append(0)
                    rivernslist.append(-1)
                    improvementlist.append(-1)   
    string = pathname + newfilename + '.py'
    f=open(string, 'w')
    f.write('from CvPythonExtensions import *\n')
    f.write('import CvMapGeneratorUtil\n')
    f.write('\n')
    string = 'plotTypes = ' + str(plotlist) + '\n'
    f.write(string)
    string = 'terrainTypes = ' + str(terrainlist) + '\n'
    f.write(string)
    string = 'bonuslist = ' + str(bonuslist) + '\n'
    f.write(string)
    string = 'featurelist = ' + str(featurelist) + '\n'
    f.write(string)
    string = 'varietylist = ' + str(varietylist) + '\n'
    f.write(string)
    string = 'nofriverlist = ' + str(nofriverlist) + '\n'
    f.write(string)
    string = 'riverwelist = ' + str(riverwelist) + '\n'
    f.write(string)
    string = 'wofriverlist = ' + str(wofriverlist) + '\n'
    f.write(string)
    string = 'rivernslist = ' + str(rivernslist) + '\n'
    f.write(string)
    string = 'improvementlist = ' + str(improvementlist) + '\n'
    f.write(string)
    string = 'numberofplots = ' + str(len(plotlist)) + '\n'
    f.write(string)    
    f.write('def getDescription():\n')
    f.write('\treturn "This map was copied with tywiggins help"\n')
    f.write('def isAdvancedMap():\n')
    f.write('\treturn 0\n')
    f.write('def isClimateMap():\n')
    f.write('\treturn 0\n')
    f.write('def isSeaLevelMap():\n')
    f.write('\treturn 0\n')
    f.write('def getNumCustomMapOptions():\n')
    f.write('\treturn 0\n')
    f.write('def getWrapX():\n')
    string = '\treturn ' + str(wrapx) + '\n'
    f.write(string)
    f.write('def getWrapY():\n')
    string = '\treturn ' + str(wrapy) + '\n'
    f.write(string)
    f.write('def getTopLatitude():\n')
    string = '\treturn ' + str(toplat) + '\n'
    f.write(string)
    f.write('def getBottomLatitude():\n')
    string = '\treturn ' + str(bottomlat) + '\n'
    f.write(string)
    f.write('def getGridSize(argsList):\n')
    string = '\treturn (' + str((width + extrawidth)/4) + ', ' + str((height + extraheight)/4) + ')\n'
    f.write(string)
    f.write('def generatePlotTypes():\n')
    f.write('\treturn plotTypes\n')
    f.write('def generateTerrainTypes():\n')
    f.write('\treturn terrainTypes\n')
    f.write('def beforeInit():\n')
    f.write('\treturn None\n')
    f.write('def beforeGeneration():\n')
    f.write('\treturn None\n')
    f.write('def addRivers():\n')
    f.write('\tfor i in range(numberofplots):\n')
    f.write('\t\tpPlot = CyMap().plotByIndex(i)\n')
    f.write('\t\tif(nofriverlist[i] == 1):\n')
    f.write('\t\t\tpPlot.setNOfRiver(1, CardinalDirectionTypes(riverwelist[i]))\n')
    f.write('\t\tif(wofriverlist[i] == 1):\n')
    f.write('\t\t\tpPlot.setWOfRiver(1, CardinalDirectionTypes(rivernslist[i]))\n')
    f.write('\treturn None\n')
    f.write('def addLakes():\n')
    f.write('\treturn None\n')
    f.write('def addFeatures():\n')
    f.write('\tfor i in range(numberofplots):\n')
    f.write('\t\tpPlot = CyMap().plotByIndex(i)\n')
    f.write('\t\tpPlot.setFeatureType(featurelist[i], varietylist[i])\n')
    f.write('\treturn 0\n')
    f.write('def addBonuses():\n')
    f.write('\tfor i in range(numberofplots):\n')
    f.write('\t\tpPlot = CyMap().plotByIndex(i)\n')
    f.write('\t\tif(bonuslist[i] != -1):\n')
    f.write('\t\t\tpPlot.setBonusType(bonuslist[i])\n')
    f.write('\treturn None\n')
    f.write('def addGoodies():\n')
    f.write('\tfor i in range(numberofplots):\n')
    f.write('\t\tpPlot = CyMap().plotByIndex(i)\n')
    f.write('\t\tif(improvementlist[i] == 3):\n')
    f.write('\t\t\tpPlot.setImprovementType(3)\n')
    f.write('\treturn None\n')
    f.write('def afterGeneration():\n')
    f.write('\tfor i in range(numberofplots):\n')
    f.write('\t\tpPlot = CyMap().plotByIndex(i)\n')
    f.write('\t\tif(pPlot.getPlotType() == 3):\n')
    f.write('\t\t\tif(pPlot.isAdjacentToLand() == 1):\n')
    f.write('\t\t\t\tpPlot.setTerrainType(5,true,true)\n')
    f.write('\t\t\telse:\n')
    f.write('\t\t\t\tpPlot.setTerrainType(6,true,true)\n')
    f.write('\t\telif(pPlot.getTerrainType() == 2):\n')
    f.write('\t\t\tif(pPlot.getPlotType() == 2 and pPlot.isRiver()):\n')
    f.write('\t\t\t\tpPlot.setFeatureType(3,-1)\n')
    f.write('\t\telif(pPlot.getFeatureType() == 3 and (pPlot.getPlotType() != 2 or pPlot.isRiver() == 0)):\n')
    f.write('\t\t\tpPlot.setFeatureType(-1,-1)\n')
    f.write('\treturn None\n')
    f.write('def assignStartingPlots():\n')
    string = '\tcivs = ' + str(civs) + '\n'
    f.write(string)
    string = '\tstartingplots = ' + str(startingplots) + '\n'
    f.write(string)
    f.write('\tnumberofplayers = CyGame().countCivPlayersEverAlive()\n')
    f.write('\tnotinlist = []\n')
    f.write('\tfor i in range(0, numberofplayers):\n')
    f.write('\t\tplayer = CyGlobalContext().getPlayer(i)\n')
    f.write('\t\tciv = int(player.getCivilizationType())\n')
    f.write('\t\tif(civs.count(civ) == 1):\n')
    f.write('\t\t\tpindex = civs.index(civ)\n')
    f.write('\t\t\tplotindex = startingplots[pindex]\n')
    f.write('\t\t\tplayer.setStartingPlot(CyMap().plotByIndex(plotindex), 1)\n')
    f.write('\t\telse:\n')
    f.write('\t\t\tnotinlist.append(i)\n')
    f.write('\tfor i in range(len(notinlist)):\n')
    f.write('\t\tplayer = CyGlobalContext().getPlayer(notinlist[i])\n')
    f.write('\t\tplotindex = findStartingPlot(notinlist[i])\n')
    f.write('\t\tplayer.setStartingPlot(CyMap().plotByIndex(plotindex), 1)\n')     
    f.write('\treturn None\n')
    f.write('def findStartingPlot(argsList):\n')
    f.write('\tplayerID = argsList\n')
    f.write('\treturn CvMapGeneratorUtil.findStartingPlot(playerID)\n')
    f.write('def normalizeStartingPlotLocations():\n')
    f.write('\treturn None\n')
    f.write('def normalizeAddRiver():\n')
    f.write('\treturn None\n')
    f.write('def normalizeRemovePeaks():\n')
    f.write('\treturn None\n')
    f.write('def normalizeAddLakes():\n')
    f.write('\treturn None\n')
    f.write('def normalizeRemoveBadFeatures():\n')
    f.write('\treturn None\n')
    f.write('def normalizeRemoveBadTerrain():\n')
    f.write('\treturn None\n')
    f.write('def normalizeAddFoodBonuses():\n')
    f.write('\treturn None\n')
    f.write('def normalizeAddGoodTerrain():\n')
    f.write('\treturn None\n')
    f.write('def normalizeAddExtras():\n')
    f.write('\treturn None\n')
    f.write('def startHumansOnSameTile():\n')
    f.write('\treturn True\n')
    f.write('\n')
    f.close()
    return None
