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

848 lines
17 KiB
Python

from direct.directnotify import DirectNotifyGlobal
from direct.showbase.PythonUtil import invertDictLossless
from toontown.coghq import MintRoomSpecs
from toontown.toonbase import ToontownGlobals
from direct.showbase.PythonUtil import normalDistrib, lerp
import random
def printAllCashbotInfo():
print 'roomId: roomName'
for roomId, roomName in MintRoomSpecs.CashbotMintRoomId2RoomName.items():
print '%s: %s' % (roomId, roomName)
print '\nroomId: numBattles'
for roomId, numBattles in MintRoomSpecs.roomId2numBattles.items():
print '%s: %s' % (roomId, numBattles)
print '\nmintId floor roomIds'
printMintRoomIds()
print '\nmintId floor numRooms'
printNumRooms()
print '\nmintId floor numForcedBattles'
printNumBattles()
def iterateCashbotMints(func):
from toontown.toonbase import ToontownGlobals
for mintId in [ToontownGlobals.CashbotMintIntA, ToontownGlobals.CashbotMintIntB, ToontownGlobals.CashbotMintIntC]:
for floorNum in xrange(ToontownGlobals.MintNumFloors[mintId]):
func(MintLayout(mintId, floorNum))
def printMintInfo():
def func(ml):
print ml
iterateCashbotMints(func)
def printMintRoomIds():
def func(ml):
print ml.getMintId(), ml.getFloorNum(), ml.getRoomIds()
iterateCashbotMints(func)
def printMintRoomNames():
def func(ml):
print ml.getMintId(), ml.getFloorNum(), ml.getRoomNames()
iterateCashbotMints(func)
def printNumRooms():
def func(ml):
print ml.getMintId(), ml.getFloorNum(), ml.getNumRooms()
iterateCashbotMints(func)
def printNumBattles():
def func(ml):
print ml.getMintId(), ml.getFloorNum(), ml.getNumBattles()
iterateCashbotMints(func)
BakedFloorLayouts = {12500: {0: (0,
4,
9,
6,
5,
8,
17),
1: (0,
15,
13,
16,
7,
6,
22),
2: (0,
4,
11,
3,
9,
6,
14,
19),
3: (0,
1,
3,
4,
16,
14,
15,
24),
4: (0,
15,
5,
8,
9,
11,
10,
21),
5: (0,
13,
12,
8,
7,
16,
10,
18),
6: (0,
16,
13,
5,
12,
7,
1,
23),
7: (0,
10,
12,
7,
3,
13,
16,
8,
20),
8: (0,
3,
5,
7,
6,
1,
4,
9,
25),
9: (0,
6,
9,
10,
13,
16,
8,
4,
22),
10: (0,
13,
1,
7,
2,
16,
11,
3,
19),
11: (0,
3,
1,
6,
4,
14,
8,
9,
24),
12: (0,
7,
14,
2,
1,
8,
5,
10,
11,
21),
13: (0,
13,
6,
4,
11,
3,
9,
10,
8,
17),
14: (0,
15,
5,
1,
14,
10,
4,
7,
16,
23),
15: (0,
16,
10,
11,
2,
1,
3,
14,
5,
20),
16: (0,
5,
8,
10,
6,
3,
15,
14,
7,
25),
17: (0,
12,
13,
5,
8,
14,
11,
7,
16,
10,
22),
18: (0,
11,
3,
15,
7,
16,
14,
6,
1,
5,
18),
19: (0,
10,
16,
11,
3,
5,
12,
13,
7,
14,
24)},
12600: {0: (0,
8,
1,
6,
14,
2,
5,
9,
17),
1: (0,
4,
14,
7,
2,
13,
8,
9,
18),
2: (0,
7,
9,
6,
5,
14,
12,
3,
20),
3: (0,
6,
2,
13,
16,
7,
5,
3,
9,
22),
4: (0,
15,
4,
9,
8,
6,
13,
5,
11,
23),
5: (0,
13,
7,
14,
15,
11,
3,
2,
8,
25),
6: (0,
5,
14,
2,
11,
7,
16,
10,
15,
18),
7: (0,
10,
9,
5,
4,
2,
7,
13,
11,
19),
8: (0,
11,
4,
12,
6,
1,
13,
7,
3,
21),
9: (0,
15,
16,
5,
13,
9,
14,
4,
6,
3,
23),
10: (0,
16,
15,
7,
6,
8,
3,
4,
9,
10,
24),
11: (0,
5,
8,
4,
12,
13,
9,
11,
16,
3,
17),
12: (0,
13,
16,
7,
4,
12,
3,
6,
5,
1,
19),
13: (0,
14,
6,
12,
13,
7,
10,
3,
16,
9,
20),
14: (0,
9,
15,
13,
5,
6,
3,
14,
11,
4,
22),
15: (0,
13,
14,
3,
12,
16,
11,
9,
4,
5,
7,
24),
16: (0,
3,
6,
1,
7,
5,
10,
9,
4,
13,
15,
25),
17: (0,
3,
6,
14,
4,
13,
16,
12,
8,
5,
7,
18),
18: (0,
11,
13,
4,
1,
15,
6,
3,
8,
9,
16,
20),
19: (0,
11,
5,
8,
7,
2,
6,
13,
3,
14,
9,
21)},
12700: {0: (0,
16,
14,
6,
1,
5,
9,
2,
15,
8,
17),
1: (0,
3,
2,
12,
14,
8,
13,
6,
10,
7,
23),
2: (0,
15,
9,
5,
12,
7,
4,
11,
14,
16,
21),
3: (0,
2,
13,
7,
6,
8,
15,
4,
1,
11,
19),
4: (0,
12,
7,
4,
6,
10,
14,
13,
16,
15,
11,
17),
5: (0,
10,
2,
9,
13,
4,
8,
1,
15,
14,
11,
23),
6: (0,
2,
14,
4,
10,
16,
15,
1,
3,
8,
6,
21),
7: (0,
14,
11,
1,
7,
9,
10,
12,
8,
5,
2,
19),
8: (0,
9,
11,
8,
5,
1,
4,
3,
7,
15,
2,
17),
9: (0,
2,
9,
7,
11,
16,
10,
15,
3,
8,
6,
23),
10: (0,
4,
10,
6,
8,
7,
15,
2,
1,
3,
13,
21),
11: (0,
10,
14,
8,
6,
9,
15,
5,
1,
2,
13,
19),
12: (0,
16,
5,
12,
10,
6,
9,
11,
3,
15,
13,
17),
13: (0,
1,
3,
6,
14,
4,
10,
12,
15,
13,
16,
24),
14: (0,
8,
7,
14,
9,
1,
2,
6,
16,
10,
15,
13,
21),
15: (0,
4,
1,
8,
11,
12,
3,
10,
16,
13,
6,
15,
19),
16: (0,
6,
3,
10,
4,
1,
2,
13,
11,
5,
15,
16,
17),
17: (0,
6,
16,
5,
12,
11,
1,
8,
14,
15,
9,
10,
24),
18: (0,
15,
8,
12,
10,
1,
7,
11,
9,
16,
4,
5,
21),
19: (0,
10,
2,
16,
5,
6,
11,
13,
7,
12,
1,
3,
19)}}
class MintLayout:
notify = DirectNotifyGlobal.directNotify.newCategory('MintLayout')
def __init__(self, mintId, floorNum):
self.mintId = mintId
self.floorNum = floorNum
self.roomIds = []
self.hallways = []
self.numRooms = 1 + ToontownGlobals.MintNumRooms[self.mintId][self.floorNum]
self.numHallways = self.numRooms - 1
if self.mintId in BakedFloorLayouts and self.floorNum in BakedFloorLayouts[self.mintId]:
self.roomIds = list(BakedFloorLayouts[self.mintId][self.floorNum])
else:
self.roomIds = self._genFloorLayout()
hallwayRng = self.getRng()
connectorRoomNames = MintRoomSpecs.CashbotMintConnectorRooms
for i in xrange(self.numHallways):
self.hallways.append(hallwayRng.choice(connectorRoomNames))
def _genFloorLayout(self):
rng = self.getRng()
startingRoomIDs = MintRoomSpecs.CashbotMintEntranceIDs
middleRoomIDs = MintRoomSpecs.CashbotMintMiddleRoomIDs
finalRoomIDs = MintRoomSpecs.CashbotMintFinalRoomIDs
numBattlesLeft = ToontownGlobals.MintNumBattles[self.mintId]
finalRoomId = rng.choice(finalRoomIDs)
numBattlesLeft -= MintRoomSpecs.getNumBattles(finalRoomId)
middleRoomIds = []
middleRoomsLeft = self.numRooms - 2
numBattles2middleRoomIds = invertDictLossless(MintRoomSpecs.middleRoomId2numBattles)
allBattleRooms = []
for num, roomIds in numBattles2middleRoomIds.items():
if num > 0:
allBattleRooms.extend(roomIds)
while 1:
allBattleRoomIds = list(allBattleRooms)
rng.shuffle(allBattleRoomIds)
battleRoomIds = self._chooseBattleRooms(numBattlesLeft,
allBattleRoomIds)
if battleRoomIds is not None:
break
MintLayout.notify.info('could not find a valid set of battle rooms, trying again')
middleRoomIds.extend(battleRoomIds)
middleRoomsLeft -= len(battleRoomIds)
if middleRoomsLeft > 0:
actionRoomIds = numBattles2middleRoomIds[0]
for i in xrange(middleRoomsLeft):
roomId = rng.choice(actionRoomIds)
actionRoomIds.remove(roomId)
middleRoomIds.append(roomId)
roomIds = []
roomIds.append(rng.choice(startingRoomIDs))
rng.shuffle(middleRoomIds)
roomIds.extend(middleRoomIds)
roomIds.append(finalRoomId)
return roomIds
def getNumRooms(self):
return len(self.roomIds)
def getRoomId(self, n):
return self.roomIds[n]
def getRoomIds(self):
return self.roomIds[:]
def getRoomNames(self):
names = []
for roomId in self.roomIds:
names.append(MintRoomSpecs.CashbotMintRoomId2RoomName[roomId])
return names
def getNumHallways(self):
return len(self.hallways)
def getHallwayModel(self, n):
return self.hallways[n]
def getNumBattles(self):
numBattles = 0
for roomId in self.getRoomIds():
numBattles += MintRoomSpecs.roomId2numBattles[roomId]
return numBattles
def getMintId(self):
return self.mintId
def getFloorNum(self):
return self.floorNum
def getRng(self):
return random.Random(self.mintId * self.floorNum)
def _chooseBattleRooms(self, numBattlesLeft, allBattleRoomIds, baseIndex = 0, chosenBattleRooms = None):
if chosenBattleRooms is None:
chosenBattleRooms = []
while baseIndex < len(allBattleRoomIds):
nextRoomId = allBattleRoomIds[baseIndex]
baseIndex += 1
newNumBattlesLeft = numBattlesLeft - MintRoomSpecs.middleRoomId2numBattles[nextRoomId]
if newNumBattlesLeft < 0:
continue
elif newNumBattlesLeft == 0:
chosenBattleRooms.append(nextRoomId)
return chosenBattleRooms
chosenBattleRooms.append(nextRoomId)
result = self._chooseBattleRooms(newNumBattlesLeft, allBattleRoomIds, baseIndex, chosenBattleRooms)
if result is not None:
return result
else:
del chosenBattleRooms[-1:]
else:
return
return
def __str__(self):
return 'MintLayout: id=%s, floor=%s, numRooms=%s, numBattles=%s' % (self.mintId,
self.floorNum,
self.getNumRooms(),
self.getNumBattles())
def __repr__(self):
return str(self)