historical/toontown-classic.git/toontown/minigame/MinigameCreatorAI.py
2024-01-16 11:20:27 -06:00

186 lines
7.5 KiB
Python

import copy
import random
import time
from toontown.toonbase import ToontownGlobals
import DistributedMinigameTemplateAI
import DistributedRaceGameAI
import DistributedCannonGameAI
import DistributedTagGameAI
import DistributedPatternGameAI
import DistributedRingGameAI
import DistributedMazeGameAI
import DistributedTugOfWarGameAI
import DistributedCatchGameAI
import DistributedDivingGameAI
import DistributedTargetGameAI
import DistributedPairingGameAI
import DistributedPhotoGameAI
import DistributedVineGameAI
import DistributedIceGameAI
import DistributedCogThiefGameAI
import DistributedTwoDGameAI
import DistributedTravelGameAI
import TravelGameGlobals
ALLOW_TEMP_MINIGAMES = simbase.config.GetBool('allow-temp-minigames', False)
if ALLOW_TEMP_MINIGAMES:
from toontown.minigame.TempMinigameAI import *
simbase.forcedMinigameId = simbase.config.GetInt('minigame-id', 0)
RequestMinigame = {}
MinigameZoneRefs = {}
def createMinigame(air, playerArray, trolleyZone, minigameZone = None, previousGameId = ToontownGlobals.NoPreviousGameId, newbieIds = [], startingVotes = None, metagameRound = -1, desiredNextGame = None):
if minigameZone == None:
minigameZone = air.allocateZone()
acquireMinigameZone(minigameZone)
mgId = None
mgDiff = None
mgSzId = None
for avId in playerArray:
request = RequestMinigame.get(avId)
if request != None:
mgId, mgKeep, mgDiff, mgSzId = request
if not mgKeep:
del RequestMinigame[avId]
break
if mgId != None:
pass
elif simbase.forcedMinigameId:
mgId = simbase.forcedMinigameId
else:
randomList = list(copy.copy(ToontownGlobals.MinigamePlayerMatrix[len(playerArray)]))
if simbase.air.useAllMinigames and len(playerArray) > 1:
randomList = list(copy.copy(ToontownGlobals.MinigameIDs))
for gameId in [ToontownGlobals.TravelGameId]:
if gameId in randomList:
randomList.remove(gameId)
for gameId in [ToontownGlobals.TravelGameId]:
if gameId in randomList:
randomList.remove(gameId)
if previousGameId != ToontownGlobals.NoPreviousGameId:
if randomList.count(previousGameId) != 0:
randomList.remove(previousGameId)
randomList = removeUnreleasedMinigames(randomList, True)
mgId = random.choice(randomList)
if metagameRound > -1:
if metagameRound % 2 == 0:
mgId = ToontownGlobals.TravelGameId
elif desiredNextGame:
mgId = desiredNextGame
mgCtors = {ToontownGlobals.RaceGameId: DistributedRaceGameAI.DistributedRaceGameAI,
ToontownGlobals.CannonGameId: DistributedCannonGameAI.DistributedCannonGameAI,
ToontownGlobals.TagGameId: DistributedTagGameAI.DistributedTagGameAI,
ToontownGlobals.PatternGameId: DistributedPatternGameAI.DistributedPatternGameAI,
ToontownGlobals.RingGameId: DistributedRingGameAI.DistributedRingGameAI,
ToontownGlobals.MazeGameId: DistributedMazeGameAI.DistributedMazeGameAI,
ToontownGlobals.TugOfWarGameId: DistributedTugOfWarGameAI.DistributedTugOfWarGameAI,
ToontownGlobals.CatchGameId: DistributedCatchGameAI.DistributedCatchGameAI,
ToontownGlobals.DivingGameId: DistributedDivingGameAI.DistributedDivingGameAI,
ToontownGlobals.TargetGameId: DistributedTargetGameAI.DistributedTargetGameAI,
ToontownGlobals.MinigameTemplateId: DistributedMinigameTemplateAI.DistributedMinigameTemplateAI,
ToontownGlobals.PairingGameId: DistributedPairingGameAI.DistributedPairingGameAI,
ToontownGlobals.VineGameId: DistributedVineGameAI.DistributedVineGameAI,
ToontownGlobals.IceGameId: DistributedIceGameAI.DistributedIceGameAI,
ToontownGlobals.CogThiefGameId: DistributedCogThiefGameAI.DistributedCogThiefGameAI,
ToontownGlobals.TwoDGameId: DistributedTwoDGameAI.DistributedTwoDGameAI,
ToontownGlobals.TravelGameId: DistributedTravelGameAI.DistributedTravelGameAI,
ToontownGlobals.PhotoGameId: DistributedPhotoGameAI.DistributedPhotoGameAI}
if ALLOW_TEMP_MINIGAMES:
from TempMinigameAI import TempMgCtors
for key, value in TempMgCtors.items():
mgCtors[key] = value
try:
mg = mgCtors[mgId](air, mgId)
except KeyError:
raise Exception, 'unknown minigame ID: %s' % mgId
mg.setExpectedAvatars(playerArray)
mg.setNewbieIds(newbieIds)
mg.setTrolleyZone(trolleyZone)
mg.setDifficultyOverrides(mgDiff, mgSzId)
if startingVotes == None:
for avId in playerArray:
mg.setStartingVote(avId, TravelGameGlobals.DefaultStartingVotes)
else:
for index in xrange(len(startingVotes)):
avId = playerArray[index]
votes = startingVotes[index]
if votes < 0:
print 'createMinigame negative votes, avId=%s votes=%s' % (avId, votes)
votes = 0
mg.setStartingVote(avId, votes)
mg.setMetagameRound(metagameRound)
mg.generateWithRequired(minigameZone)
toons = []
for id in playerArray:
toon = simbase.air.doId2do.get(id)
if toon != None:
toons.append(toon)
for toon in toons:
simbase.air.questManager.toonPlayedMinigame(toon, toons)
retVal = {}
retVal['minigameZone'] = minigameZone
retVal['minigameId'] = mgId
return retVal
def acquireMinigameZone(zoneId):
if zoneId not in MinigameZoneRefs:
MinigameZoneRefs[zoneId] = 0
MinigameZoneRefs[zoneId] += 1
def releaseMinigameZone(zoneId):
MinigameZoneRefs[zoneId] -= 1
if MinigameZoneRefs[zoneId] <= 0:
del MinigameZoneRefs[zoneId]
simbase.air.deallocateZone(zoneId)
def removeUnreleasedMinigames(startList, increaseChanceOfNewGames = 0):
randomList = startList[:]
for gameId in ToontownGlobals.MinigameReleaseDates:
dateTuple = ToontownGlobals.MinigameReleaseDates[gameId]
currentTime = time.time()
releaseTime = time.mktime((dateTuple[0],
dateTuple[1],
dateTuple[2],
0,
0,
0,
0,
0,
-1))
releaseTimePlus1Week = releaseTime + 7 * 24 * 60 * 60
if currentTime < releaseTime:
if gameId in randomList:
doRemove = True
if gameId == ToontownGlobals.CogThiefGameId and simbase.air.config.GetBool('force-allow-thief-game', 0):
doRemove = False
if increaseChanceOfNewGames:
randomList += [gameId] * 4
elif gameId == ToontownGlobals.IceGameId and simbase.air.config.GetBool('force-allow-ice-game', 0):
doRemove = False
if increaseChanceOfNewGames:
randomList += [gameId] * 4
elif gameId == ToontownGlobals.TwoDGameId and simbase.air.config.GetBool('force-allow-2d-game', 0):
doRemove = False
if increaseChanceOfNewGames:
randomList += [gameId] * 4
elif gameId == ToontownGlobals.PhotoGameId and simbase.air.config.GetBool('force-allow-photo-game', 0):
doRemove = False
if increaseChanceOfNewGames:
randomList += [gameId] * 4
if doRemove:
randomList.remove(gameId)
if releaseTime < currentTime and currentTime < releaseTimePlus1Week and gameId in randomList and increaseChanceOfNewGames:
randomList += [gameId] * 4
return randomList