TrackSignDuration = 15
RaceCountdown = 3
MaxRacers = 4
MaxTickets = 99999
Practice = 0
ToonBattle = 1
Circuit = 2
Speedway = 0
Rural = 1
Urban = 2
RT_Speedway_1 = 0
RT_Speedway_1_rev = 1
RT_Rural_1 = 20
RT_Rural_1_rev = 21
RT_Urban_1 = 40
RT_Urban_1_rev = 41
RT_Speedway_2 = 60
RT_Speedway_2_rev = 61
RT_Rural_2 = 62
RT_Rural_2_rev = 63
RT_Urban_2 = 64
RT_Urban_2_rev = 65
KARTING_TICKETS_HOLIDAY_MULTIPLIER = 2

def getTrackGenre(trackId):
    if trackId in (RT_Speedway_1,
     RT_Speedway_1_rev,
     RT_Speedway_2,
     RT_Speedway_2_rev):
        return Speedway
    elif trackId in (RT_Rural_1,
     RT_Rural_1_rev,
     RT_Rural_2,
     RT_Rural_2_rev):
        return Rural
    else:
        return Urban


RT_Speedway_1_Gags = ((923.052, -1177.431, 0.024),
 (926.099, -1187.345, 0.024),
 (925.68, -1197.327, 0.024),
 (925.169, -1209.502, 0.024),
 (394.009, 209.219, 0.025),
 (279.109, 279.744, 0.025),
 (204.366, 316.238, 0.025),
 (118.646, 358.009, 0.025),
 (-1462.098, 791.722, 0.025),
 (-1459.446, 730.064, 0.025),
 (-1450.731, 666.811, 0.025),
 (-1438.388, 615.1, 0.025))
RT_Speedway_2_Gags = ((-355.18, -2430.1, -0.126728),
 (-343.456, -2421.43, -0.0116951),
 (-329.644, -2411.06, -0.0169053),
 (-315.054, -2402.91, -0.0800667),
 (243.293, -906.412, 0.021832),
 (216.555, -910.885, -0.146125),
 (192.16, -915.93, -0.242366),
 (165.941, -922.381, -0.247588),
 (-840.626, 2405.96, 58.4195),
 (-868.154, 2370.54, 56.7396),
 (-896.126, 2332.55, 53.8607),
 (-921.952, 2291.16, 49.8209))
RT_Speedway_1_rev_Gags = ((1364.601, -664.452, 0.025),
 (1312.491, -588.218, 0.025),
 (1251.775, -509.556, 0.025),
 (1214.052, -461.743, 0.025),
 (-976.044, 995.072, 0.025),
 (-1043.917, 1018.78, 0.025),
 (-1124.555, 1038.362, 0.025),
 (-1187.95, 1047.006, 0.025),
 (-1174.542, -208.968, 0.025),
 (-1149.34, -270.698, 0.025),
 (-1121.2, -334.367, 0.025),
 (-1090.627, -392.662, 0.026))
RT_Rural_1_Gags = ((814.276, -552.928, 2.107),
 (847.738, -551.97, 2.106),
 (889.265, -549.569, 2.107),
 (922.022, -554.813, 2.106),
 (1791.42, 2523.91, 2.106),
 (1754.14, 2540.25, 2.107),
 (1689.66, 2557.28, 2.107),
 (1614.01, 2577.16, 2.106),
 (-1839.0, 654.477, 86.83),
 (-1894.33, 640.125, 80.39),
 (-1955.3, 625.09, 73.07),
 (-2016.99, 611.746, 65.86))
RT_Rural_2_Gags = ((2001.53, 560.532, 198.912),
 (2002.45, 574.292, 198.912),
 (2003.42, 588.612, 198.912),
 (2004, 602.849, 198.912),
 (-2107.4, 2209.67, 198.913),
 (-2086.13, 2224.31, 198.913),
 (-2058.11, 2244.31, 198.912),
 (-2023.85, 2268.77, 198.912),
 (-331.746, -1010.57, 222.332),
 (-358.595, -1007.68, 225.129),
 (-388.556, -1004.87, 228.239),
 (-410.122, -1003.03, 230.482),
 (69.763, -2324.5, 198.912),
 (63.5314, -2334.02, 198.913),
 (57.9662, -2349.14, 198.913),
 (51.8838, -2363.87, 198.913))
RT_Urban_1_Gags = ((51.9952, 2431.62, 55.7053),
 (39.5407, 2421.64, 65.7053),
 (27.7504, 2411.67, 55.7053),
 (15.55, 2401.65, 65.7053),
 (-1008.36, 2116.41, 0.0246798),
 (-1050.31, 2099.78, 0.025),
 (-1092.26, 2083.15, 0.0253202),
 (-1134.21, 2066.52, 0.0256404),
 (-1966.68, 1139.32, 1.76981),
 (-1970.46, 1120.57, 1.76981),
 (-1974.18, 1101.82, 1.76981),
 (-1977.93, 1084.07, 1.76981),
 (1419.05, -2987.18, 0.025),
 (1411.09, -3004.09, 0.025),
 (1403.13, -3021.01, 0.025),
 (1395.17, -3037.92, 0.025),
 (948.131, -1216.77, 0.025),
 (935.545, -1204.09, 0.025),
 (922.959, -1191.41, 0.025),
 (909.959, -1177.41, 0.025))
RT_Urban_2_Gags = ((-2761.49, -3070.97, -0.255122),
 (-2730.18, -3084.09, -0.255153),
 (-2701.45, -3096.26, -0.255669),
 (-2669.81, -3108.9, -0.255252),
 (735.479, -423.828, 23.7334),
 (759.026, -427.198, 23.0068),
 (783.232, -430.659, 22.2569),
 (809.914, -434.476, 21.4326),
 (3100.09, 240.411, 23.4672),
 (3089.09, 242.019, 23.5251),
 (3077.68, 243.688, 23.6857),
 (3064.82, 245.567, 23.8771),
 (-10.7389, 2980.48, -0.255609),
 (-41.2644, 2974.53, -0.255122),
 (-69.8423, 2989.98, -0.255682),
 (-102.331, 2986.1, -0.255637),
 (-1978.67, 588.981, -0.255685),
 (-1977.07, 560.797, -0.255415),
 (-1948.58, 544.782, -0.255122),
 (-1943.42, 510.262, -0.255866))
RT_Urban_1_rev_Gags = ((1034.43, -366.371, 0.025),
 (1051.84, -360.473, 0.025),
 (1069.25, -354.575, 0.025),
 (1086.66, -348.677, 0.025),
 (1849.66, -2807.21, 0.0246158),
 (1858.55, -2795.99, 0.0246158),
 (1867.44, -2784.76, 0.0246158),
 (1876.33, -2773.53, 0.0246158),
 (316.342, -44.9529, 0.025),
 (305.173, -63.4405, 0.025),
 (294.004, -81.9281, 0.025),
 (282.835, -100.416, 0.025),
 (-762.377, 2979.25, 0.025),
 (-753.029, 2995.69, 0.025),
 (-743.681, 3012.14, 0.025),
 (-734.333, 3028.58, 0.025),
 (470.628, 1828.32, 55.0),
 (481.284, 1836.89, 55.0),
 (491.941, 1845.47, 55.0),
 (502.597, 1854.04, 55.0))
Speedway_1_Boosts = (((-320, 685, 1), (415, 0, 0)),)
Speedway_1_Rev_Boosts = (((-320, 685, 0.1), (235, 0, 0)),)
Speedway_2_Boosts = (((-120, 430, 1.0), (-50, 0, 0)),)
Speedway_2_Rev_Boosts = (((176, 625, 1.0), (130, 0, 0)),)
Rural_1_Boosts = (((3132.64, 859.56, 5.0), (384.44, 363.5, 0)), ((-3050.33, -1804.97, 207.7), (229.4, 353.25, 342.9)))
Rural_1_Rev_Boosts = (((3132.64, 859.56, 5.0), (197.1, -2.25, 0)), ((-3151.34, -1569.56, 200.621), (189.46, 182.75, 195.255)))
Rural_2_Boosts = (((873.255, -593.664, 199.5), (87.715, 0, 0)), ((-1747.62, 801.56, 199.5), (-126.516, 0, 0)))
Rural_2_Rev_Boosts = (((-428.004, -243.692, 324.516), (51.428, 6, 1)), ((-384.043, 211.62, 193.5), (-127.859, 1, 0)))
Urban_1_Boosts = (((677.057, 1618.24, 0.025), (35.9995, 0, 0)), ((-2250.35, 1618.1, 0.0241526), (-154.8, 0, 0)), ((400.13, -1090.26, 0.025), (-175.204, 0, 0)))
Urban_1_Rev_Boosts = (((488.739, -2055.07, 0.025), (3.59753, 0, 0)), ((-1737.29, 588.138, 0.025), (26.3975, 0, 0)), ((-212.314, 2638.34, 0.025), (-128.404, 0, 0)))
Urban_2_Boosts = (((358.134, -1655.42, 0.3), (-4.95, 1, 0)), ((2058.77, 2560.03, 0.3), (77.31, 0, 0)), ((-3081.33, -1037.55, 0.25), (177.359, 0, 0)))
Urban_2_Rev_Boosts = (((-2007.38, 484.878, 0.25), (30.9102, 0, 0)), ((2646.51, 1455.15, 0.25), (-120.172, 0, 0)), ((-472.215, -2048.21, 0.25), (136.192, 0, 0)))

def RaceInfo2RacePadId(trackId, trackType):
    rev = trackId % 2
    if not rev:
        if trackType == Practice:
            padId = 0
        else:
            padId = 2
    elif trackType == Practice:
        padId = 1
    else:
        padId = 3
    return padId


def getTrackGenreString(genreId):
    genreStrings = ['Speedway', 'Country', 'City']
    return genreStrings[genreId].lower()


def getTunnelSignName(genreId, padId):
    if genreId == 2 and padId == 0:
        return 'tunne1l_citysign'
    elif genreId == 1 and padId == 0:
        return 'tunnel_countrysign1'
    else:
        return 'tunnel%s_%ssign' % (padId + 1, getTrackGenreString(genreId))


RacePadId2RaceInfo = {0: (0, Practice, 3),
 1: (1, Practice, 3),
 2: (0, ToonBattle, 3),
 3: (1, ToonBattle, 3)}

def getGenreFromString(string):
    if string == 'town':
        return Urban
    elif string == 'stadium':
        return Speedway
    else:
        return Rural


def getTrackListByType(genre, type):
    return Rural


def getTrackListByType(genre, type):
    genreDict = {Urban: [[RT_Urban_1, RT_Urban_2], [RT_Urban_1_rev, RT_Urban_2_rev]],
     Rural: [[RT_Rural_1, RT_Rural_2], [RT_Rural_1_rev, RT_Rural_2_rev]],
     Speedway: [[RT_Speedway_1, RT_Speedway_2], [RT_Speedway_1_rev, RT_Speedway_2_rev]]}
    trackIdList = genreDict.get(genre)
    return trackIdList[type]


def getCanonicalPadId(padId):
    return padId % 4


def getNextRaceInfo(prevTrackId, genreString, padId):
    genre = getGenreFromString(genreString)
    cPadId = getCanonicalPadId(padId)
    raceInfo = RacePadId2RaceInfo.get(cPadId)
    trackList = getTrackListByType(genre, raceInfo[0])
    if trackList.count(prevTrackId) == 0:
        trackId = trackList[1]
    else:
        index = trackList.index(prevTrackId)
        index += 1
        index %= len(trackList)
        trackId = trackList[index]
    return (trackId, raceInfo[1], raceInfo[2])


TrackPath = 'phase_6/models/karting/'
TrackDict = {RT_Speedway_1: (TrackPath + 'RT_SpeedwayA',
                 240.0,
                 115.0,
                 (50, 500),
                 RT_Speedway_1_Gags,
                 Speedway_1_Boosts,
                 1.0,
                 'GS_Race_SS.ogg',
                 (0.01, 0.015)),
 RT_Speedway_1_rev: (TrackPath + 'RT_SpeedwayA',
                     240.0,
                     115.0,
                     (50, 500),
                     RT_Speedway_1_rev_Gags,
                     Speedway_1_Rev_Boosts,
                     1.0,
                     'GS_Race_SS.ogg',
                     (0.01, 0.015)),
 RT_Speedway_2: (TrackPath + 'RT_SpeedwayB',
                 335.0,
                 210.0,
                 (75, 1000),
                 RT_Speedway_2_Gags,
                 Speedway_2_Boosts,
                 1.0,
                 'GS_Race_SS.ogg',
                 (0.01, 0.015)),
 RT_Speedway_2_rev: (TrackPath + 'RT_SpeedwayB',
                     335.0,
                     210.0,
                     (75, 1000),
                     RT_Speedway_2_Gags,
                     Speedway_2_Rev_Boosts,
                     1.0,
                     'GS_Race_SS.ogg',
                     (0.01, 0.015)),
 RT_Rural_1: (TrackPath + 'RT_RuralB',
              360.0,
              230.0,
              (100, 500),
              RT_Rural_1_Gags,
              Rural_1_Boosts,
              0.75,
              'GS_Race_RR.ogg',
              (0.003, 0.004)),
 RT_Rural_1_rev: (TrackPath + 'RT_RuralB',
                  360.0,
                  230.0,
                  (100, 500),
                  RT_Rural_1_Gags,
                  Rural_1_Rev_Boosts,
                  0.75,
                  'GS_Race_RR.ogg',
                  (0.003, 0.004)),
 RT_Rural_2: (TrackPath + 'RT_RuralB2',
              480.0,
              360.0,
              (150, 1000),
              RT_Rural_2_Gags,
              Rural_2_Boosts,
              0.75,
              'GS_Race_RR.ogg',
              (0.003, 0.004)),
 RT_Rural_2_rev: (TrackPath + 'RT_RuralB2',
                  480.0,
                  360.0,
                  (150, 1000),
                  RT_Rural_2_Gags,
                  Rural_2_Rev_Boosts,
                  0.75,
                  'GS_Race_RR.ogg',
                  (0.003, 0.004)),
 RT_Urban_1: (TrackPath + 'RT_UrbanA',
              480.0,
              305.0,
              (300, 500),
              RT_Urban_1_Gags,
              Urban_1_Boosts,
              1.0,
              'GS_Race_CC.ogg',
              (0.002, 0.003)),
 RT_Urban_1_rev: (TrackPath + 'RT_UrbanA',
                  480.0,
                  305.0,
                  (300, 500),
                  RT_Urban_1_rev_Gags,
                  Urban_1_Rev_Boosts,
                  1.0,
                  'GS_Race_CC.ogg',
                  (0.002, 0.003)),
 RT_Urban_2: (TrackPath + 'RT_UrbanB',
              480.0,
              280.0,
              (400, 1000),
              RT_Urban_2_Gags,
              Urban_2_Boosts,
              1.0,
              'GS_Race_CC.ogg',
              (0.002, 0.003)),
 RT_Urban_2_rev: (TrackPath + 'RT_UrbanB',
                  480.0,
                  280.0,
                  (400, 1000),
                  RT_Urban_2_Gags,
                  Urban_2_Rev_Boosts,
                  1.0,
                  'GS_Race_CC.ogg',
                  (0.002, 0.003))}
TrackIds = list(TrackDict.keys())
TrackIds.sort()

def getEntryFee(trackId, raceType):
    fee = 0
    if raceType == ToonBattle:
        fee = TrackDict[trackId][3][0]
    elif raceType == Circuit:
        fee = TrackDict[trackId][3][1]
    return fee


def getQualifyingTime(trackId):
    return TrackDict[trackId][1]


def getDefaultRecordTime(trackId):
    return TrackDict[trackId][2]


def getDefaultRecord(trackId):
    return getDefaultRecordTime(trackId), 0, 1, 'Goofy'


Daily = 0
Weekly = 1
AllTime = 2
PeriodDict = {Daily: 10,
 Weekly: 100,
 AllTime: 1000}
PeriodIds = list(PeriodDict.keys())
NumRecordPeriods = len(PeriodIds)
NumRecordsPerPeriod = 10
Winnings = [3.0,
 1.0,
 0.5,
 0.15]
PracticeWinnings = 20
SpeedwayQuals = 0
RuralQuals = 1
UrbanQuals = 2
SpeedwayWins = 3
RuralWins = 4
UrbanWins = 5
CircuitWins = 6
TwoPlayerWins = 7
ThreePlayerWins = 8
FourPlayerWins = 9
CircuitSweeps = 10
CircuitQuals = 11
QualsList = [SpeedwayQuals, RuralQuals, UrbanQuals]
WinsList = [SpeedwayWins, RuralWins, UrbanWins]
SpeedwayQuals1 = 0
SpeedwayQuals2 = 1
SpeedwayQuals3 = 2
RuralQuals1 = 3
RuralQuals2 = 4
RuralQuals3 = 5
UrbanQuals1 = 6
UrbanQuals2 = 7
UrbanQuals3 = 8
TotalQuals = 9
SpeedwayWins1 = 10
SpeedwayWins2 = 11
SpeedwayWins3 = 12
RuralWins1 = 13
RuralWins2 = 14
RuralWins3 = 15
UrbanWins1 = 16
UrbanWins2 = 17
UrbanWins3 = 18
TotalWins = 19
CircuitQuals1 = 20
CircuitQuals2 = 21
CircuitQuals3 = 22
CircuitWins1 = 23
CircuitWins2 = 24
CircuitWins3 = 25
CircuitSweeps1 = 26
CircuitSweeps2 = 27
CircuitSweeps3 = 28
GrandTouring = 29
NumTrophies = 30
TenTrophyCup = 30
TwentyTrophyCup = 31
ThirtyTrophyCup = 32
TrophyCups = [TenTrophyCup, TwentyTrophyCup, ThirtyTrophyCup]
NumCups = 3
SpeedwayQualsList = [SpeedwayQuals1, SpeedwayQuals2, SpeedwayQuals3]
RuralQualsList = [RuralQuals1, RuralQuals2, RuralQuals3]
UrbanQualsList = [UrbanQuals1, UrbanQuals2, UrbanQuals3]
SpeedwayWinsList = [SpeedwayWins1, SpeedwayWins2, SpeedwayWins3]
RuralWinsList = [RuralWins1, RuralWins2, RuralWins3]
UrbanWinsList = [UrbanWins1, UrbanWins2, UrbanWins3]
CircuitWinsList = [CircuitWins1, CircuitWins2, CircuitWins3]
CircuitSweepsList = [CircuitSweeps1, CircuitSweeps2, CircuitSweeps3]
CircuitQualList = [CircuitQuals1, CircuitQuals2, CircuitQuals3]
AllQualsList = [SpeedwayQualsList, RuralQualsList, UrbanQualsList]
AllWinsList = [SpeedwayWinsList, RuralWinsList, UrbanWinsList]
TrophiesPerCup = NumTrophies // NumCups
QualifiedRaces = [1, 10, 100]
TotalQualifiedRaces = 100
WonRaces = [1, 10, 100]
TotalWonRaces = 100
WonCircuitRaces = [1, 5, 25]
SweptCircuitRaces = [1, 5, 25]
QualifiedCircuitRaces = [1, 5, 25]
LBSubscription = {'stadium': [(RT_Speedway_1, Daily),
             (RT_Speedway_1, Weekly),
             (RT_Speedway_1, AllTime),
             (RT_Speedway_1_rev, Daily),
             (RT_Speedway_1_rev, Weekly),
             (RT_Speedway_1_rev, AllTime),
             (RT_Speedway_2, Daily),
             (RT_Speedway_2, Weekly),
             (RT_Speedway_2, AllTime),
             (RT_Speedway_2_rev, Daily),
             (RT_Speedway_2_rev, Weekly),
             (RT_Speedway_2_rev, AllTime)],
 'country': [(RT_Rural_1, Daily),
             (RT_Rural_1, Weekly),
             (RT_Rural_1, AllTime),
             (RT_Rural_1_rev, Daily),
             (RT_Rural_1_rev, Weekly),
             (RT_Rural_1_rev, AllTime),
             (RT_Rural_2, Daily),
             (RT_Rural_2, Weekly),
             (RT_Rural_2, AllTime),
             (RT_Rural_2_rev, Daily),
             (RT_Rural_2_rev, Weekly),
             (RT_Rural_2_rev, AllTime)],
 'city': [(RT_Urban_1, Daily),
          (RT_Urban_1, Weekly),
          (RT_Urban_1, AllTime),
          (RT_Urban_1_rev, Daily),
          (RT_Urban_1_rev, Weekly),
          (RT_Urban_1_rev, AllTime),
          (RT_Urban_2, Daily),
          (RT_Urban_2, Weekly),
          (RT_Urban_2, AllTime),
          (RT_Urban_2_rev, Daily),
          (RT_Urban_2_rev, Weekly),
          (RT_Urban_2_rev, AllTime)]}
BANANA = 1
TURBO = 2
ANVIL = 3
PIE = 4
GagFreq = [[PIE,
  BANANA,
  BANANA,
  BANANA,
  TURBO,
  PIE],
 [PIE,
  BANANA,
  BANANA,
  TURBO,
  ANVIL,
  PIE],
 [PIE,
  BANANA,
  TURBO,
  TURBO,
  ANVIL,
  PIE],
 [BANANA,
  TURBO,
  TURBO,
  TURBO,
  ANVIL,
  PIE]]
CircuitLoops = [[RT_Speedway_1, RT_Rural_1, RT_Urban_1],
 [RT_Speedway_1_rev, RT_Rural_1_rev, RT_Urban_1_rev],
 [RT_Speedway_2, RT_Rural_2, RT_Urban_2],
 [RT_Speedway_2_rev, RT_Rural_2_rev, RT_Urban_2_rev]]
CircuitPoints = [10,
 8,
 6,
 4]

def getCircuitLoop(startingTrack):
    circuitLoop = [startingTrack]
    for loop in CircuitLoops:
        if startingTrack in loop:
            print(loop)
            numTracks = len(loop)
            tempLoop = loop * 2
            startingIndex = tempLoop.index(startingTrack)
            circuitLoop = tempLoop[startingIndex:startingIndex + numTracks]
            break

    return circuitLoop


Exit_UserReq = 0
Exit_Barrier = 1
Exit_Slow = 2
Exit_BarrierNoRefund = 3