## Buffy
##
## Collection of utility functions for dealing with BUFFY.
##
## Notes
##   - Must be initialized externally by calling init()
##
## Copyright (c) 2009 The BUG Mod.
##
## Author: Ruff_Hi, EmperorFool

from CvPythonExtensions import *
import BugCore
import BugPath
import BugUtil
import CvUtil
import GameUtil
import os.path

gc = CyGlobalContext()
options = BugCore.game.BUFFY

IS_ACTIVE = False
IS_DLL_PRESENT = False
IS_DLL_IN_CORRECT_PATH = False


## Checking Status

def isEnabled():
    return options.isEnabled()

def isActive():
    """
    Returns True if BUFFY is active in this session.
    
    Must be a BUFFY-enabled build with the DLL present and not running on a Mac.
    """
    return IS_ACTIVE

def isDllPresent():
    """
    Returns True if this is a BUFFY-enabled build and the BUFFY DLL is present, False otherwise.
    
    Note: If this isn't a BUFFY-enabled build, this function returns False even if the BUFFY DLL is present
    since init() doesn't look for the DLL.
    """
    return IS_DLL_PRESENT

def isDllInCorrectPath():
    """
    Returns True if the BUFFY DLL is present and in the correct location (...\<BTS>\Mods\<BUFFY>\Assets\).
    """
    return IS_DLL_IN_CORRECT_PATH


## Initialization

def init():
    """
    Checks for the presence of the BUFFY DLL and sets the global flags.
    """
    if isEnabled():
        if BugPath.isMac():
            BugUtil.debug("BUFFY is not active on Mac (no DLL)")
        else:
            try:
                if gc.isBuffy():
                    global IS_DLL_PRESENT, IS_DLL_IN_CORRECT_PATH, IS_ACTIVE
                    IS_DLL_PRESENT = True
                    IS_ACTIVE = True
                    BugUtil.info("BUFFY is active (API version %d)", gc.getBuffyApiVersion())
                    try:
                        dllPath = gc.getGame().getDLLPath()
                        exePath = gc.getGame().getExePath()
                        dllPathThenUp3 = os.path.dirname(os.path.dirname(os.path.dirname(dllPath)))
                        if dllPathThenUp3 == exePath:
                            IS_DLL_IN_CORRECT_PATH = True
                    except:
                        pass # DLL path is borked
            except:
                BugUtil.info("BUFFY is not active (no DLL)")


## Random Event Changes

def canTriggerTheVedicAryans(argsList):

    kTriggeredData = argsList[0]
    player = gc.getPlayer(kTriggeredData.ePlayer)
    
#   If Barbarians are disabled in this game, this event will not occur.
    if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_NO_BARBARIANS):
        return false
            
#   At least one civ on the board must know Polytheism.
    bFoundValid = false

# BUFFY 3.19.003 - start
    # changes one of the key techs to Priesthood instead of Polytheism
    if isEnabled():
        iTech = gc.getInfoTypeForString('TECH_PRIESTHOOD')
    else:
        iTech = gc.getInfoTypeForString('TECH_POLYTHEISM')
# BUFFY 3.19.003 - end

    for iPlayer in range(gc.getMAX_CIV_PLAYERS()):
        loopPlayer = gc.getPlayer(iPlayer)
        if loopPlayer.isAlive():
            if gc.getTeam(loopPlayer.getTeam()).isHasTech(iTech):
                bFoundValid = true
                break
                
    if not bFoundValid:
        return false
                    
#   At least one civ on the board must know Archery.
    bFoundValid = false
    iTech = gc.getInfoTypeForString('TECH_ARCHERY')
    for iPlayer in range(gc.getMAX_CIV_PLAYERS()):          
        loopPlayer = gc.getPlayer(iPlayer)
        if loopPlayer.isAlive():
            if gc.getTeam(loopPlayer.getTeam()).isHasTech(iTech):
                bFoundValid = true
                break
                
    if not bFoundValid:
        return false

# BUG - 3.17 - Start
    if (GameUtil.isVersion(317)):
        # rest indented but unchanged
        # Can we build the counter unit?        
        iCounterUnitClass = gc.getInfoTypeForString('UNITCLASS_ARCHER')
        iCounterUnit = gc.getCivilizationInfo(player.getCivilizationType()).getCivilizationUnits(iCounterUnitClass)
        if iCounterUnit == -1:
            return false

        (loopCity, iter) = player.firstCity(false)
        bFound = false
        while(loopCity):
            if (loopCity.canTrain(iCounterUnit, false, false)):
                bFound = true
                break

            (loopCity, iter) = player.nextCity(iter, false)

        if not bFound:
            return false
# BUG - 3.17 - End

#   Find an eligible plot
    map = gc.getMap()   
    for i in range(map.numPlots()):
        plot = map.plotByIndex(i)
        if (plot.getOwner() == -1 and not plot.isWater() and not plot.isImpassable() and plot.area().getCitiesPerPlayer(kTriggeredData.ePlayer) > 0 and plot.isAdjacentPlayer(kTriggeredData.ePlayer, true)):
            return true

    return false
