845 lines
13 KiB
Python
845 lines
13 KiB
Python
from .ToontownGlobals import *
|
|
import math
|
|
from . import TTLocalizer
|
|
BattleCamFaceOffFov = 30.0
|
|
BattleCamFaceOffPos = Point3(0, -10, 4)
|
|
BattleCamDefaultPos = Point3(0, -8.6, 16.5)
|
|
BattleCamDefaultHpr = Vec3(0, -61, 0)
|
|
BattleCamDefaultFov = 80.0
|
|
BattleCamMenuFov = 65.0
|
|
BattleCamJoinPos = Point3(0, -12, 13)
|
|
BattleCamJoinHpr = Vec3(0, -45, 0)
|
|
SkipMovie = 0
|
|
BaseHp = 15
|
|
Tracks = TTLocalizer.BattleGlobalTracks
|
|
NPCTracks = TTLocalizer.BattleGlobalNPCTracks
|
|
TrackColors = ((211 / 255.0, 148 / 255.0, 255 / 255.0),
|
|
(249 / 255.0, 255 / 255.0, 93 / 255.0),
|
|
(79 / 255.0, 190 / 255.0, 76 / 255.0),
|
|
(93 / 255.0, 108 / 255.0, 239 / 255.0),
|
|
(255 / 255.0, 145 / 255.0, 66 / 255.0),
|
|
(255 / 255.0, 65 / 255.0, 199 / 255.0),
|
|
(67 / 255.0, 243 / 255.0, 255 / 255.0))
|
|
HEAL_TRACK = 0
|
|
TRAP_TRACK = 1
|
|
LURE_TRACK = 2
|
|
SOUND_TRACK = 3
|
|
THROW_TRACK = 4
|
|
SQUIRT_TRACK = 5
|
|
DROP_TRACK = 6
|
|
NPC_RESTOCK_GAGS = 7
|
|
NPC_TOONS_HIT = 8
|
|
NPC_COGS_MISS = 9
|
|
MIN_TRACK_INDEX = 0
|
|
MAX_TRACK_INDEX = 6
|
|
MIN_LEVEL_INDEX = 0
|
|
MAX_LEVEL_INDEX = 6
|
|
MAX_UNPAID_LEVEL_INDEX = 4
|
|
LAST_REGULAR_GAG_LEVEL = 5
|
|
UBER_GAG_LEVEL_INDEX = 6
|
|
NUM_GAG_TRACKS = 7
|
|
PropTypeToTrackBonus = {AnimPropTypes.Hydrant: SQUIRT_TRACK,
|
|
AnimPropTypes.Mailbox: THROW_TRACK,
|
|
AnimPropTypes.Trashcan: HEAL_TRACK}
|
|
Levels = [[0,
|
|
20,
|
|
200,
|
|
800,
|
|
2000,
|
|
6000,
|
|
10000],
|
|
[0,
|
|
20,
|
|
100,
|
|
800,
|
|
2000,
|
|
6000,
|
|
10000],
|
|
[0,
|
|
20,
|
|
100,
|
|
800,
|
|
2000,
|
|
6000,
|
|
10000],
|
|
[0,
|
|
40,
|
|
200,
|
|
1000,
|
|
2500,
|
|
7500,
|
|
10000],
|
|
[0,
|
|
10,
|
|
50,
|
|
400,
|
|
2000,
|
|
6000,
|
|
10000],
|
|
[0,
|
|
10,
|
|
50,
|
|
400,
|
|
2000,
|
|
6000,
|
|
10000],
|
|
[0,
|
|
20,
|
|
100,
|
|
500,
|
|
2000,
|
|
6000,
|
|
10000]]
|
|
regMaxSkill = 10000
|
|
UberSkill = 500
|
|
MaxSkill = UberSkill + regMaxSkill
|
|
UnpaidMaxSkills = [Levels[0][1] - 1,
|
|
Levels[1][1] - 1,
|
|
Levels[2][1] - 1,
|
|
Levels[3][1] - 1,
|
|
Levels[4][4] - 1,
|
|
Levels[5][4] - 1,
|
|
Levels[6][1] - 1]
|
|
ExperienceCap = 200
|
|
|
|
def gagIsPaidOnly(track, level):
|
|
return Levels[track][level] > UnpaidMaxSkills[track]
|
|
|
|
|
|
def gagIsVelvetRoped(track, level):
|
|
if level > 0:
|
|
if track in [4, 5]:
|
|
if level > 3:
|
|
return True
|
|
else:
|
|
return True
|
|
return False
|
|
|
|
|
|
MaxToonAcc = 95
|
|
StartingLevel = 0
|
|
CarryLimits = (((10,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(20,
|
|
15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0),
|
|
(25,
|
|
20,
|
|
15,
|
|
10,
|
|
3,
|
|
0,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
1)),
|
|
((5,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(7,
|
|
3,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(10,
|
|
7,
|
|
3,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(15,
|
|
10,
|
|
7,
|
|
3,
|
|
0,
|
|
0,
|
|
0),
|
|
(15,
|
|
15,
|
|
10,
|
|
5,
|
|
3,
|
|
0,
|
|
0),
|
|
(20,
|
|
15,
|
|
15,
|
|
10,
|
|
5,
|
|
2,
|
|
0),
|
|
(20,
|
|
15,
|
|
15,
|
|
10,
|
|
5,
|
|
2,
|
|
1)),
|
|
((10,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(20,
|
|
15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0),
|
|
(25,
|
|
20,
|
|
15,
|
|
10,
|
|
3,
|
|
0,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
1)),
|
|
((10,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(20,
|
|
15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0),
|
|
(25,
|
|
20,
|
|
15,
|
|
10,
|
|
3,
|
|
0,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
1)),
|
|
((10,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(20,
|
|
15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0),
|
|
(25,
|
|
20,
|
|
15,
|
|
10,
|
|
3,
|
|
0,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
1)),
|
|
((10,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(20,
|
|
15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0),
|
|
(25,
|
|
20,
|
|
15,
|
|
10,
|
|
3,
|
|
0,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
1)),
|
|
((10,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(20,
|
|
15,
|
|
10,
|
|
5,
|
|
0,
|
|
0,
|
|
0),
|
|
(25,
|
|
20,
|
|
15,
|
|
10,
|
|
3,
|
|
0,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
0),
|
|
(30,
|
|
25,
|
|
20,
|
|
15,
|
|
7,
|
|
3,
|
|
1)))
|
|
MaxProps = ((15, 40), (30, 60), (75, 80))
|
|
DLF_SKELECOG = 1
|
|
DLF_FOREMAN = 2
|
|
DLF_VP = 4
|
|
DLF_CFO = 8
|
|
DLF_SUPERVISOR = 16
|
|
DLF_VIRTUAL = 32
|
|
DLF_REVIVES = 64
|
|
pieNames = ['tart',
|
|
'fruitpie-slice',
|
|
'creampie-slice',
|
|
'fruitpie',
|
|
'creampie',
|
|
'birthday-cake',
|
|
'wedding-cake',
|
|
'lawbook']
|
|
AvProps = (('feather',
|
|
'bullhorn',
|
|
'lipstick',
|
|
'bamboocane',
|
|
'pixiedust',
|
|
'baton',
|
|
'baton'),
|
|
('banana',
|
|
'rake',
|
|
'marbles',
|
|
'quicksand',
|
|
'trapdoor',
|
|
'tnt',
|
|
'traintrack'),
|
|
('1dollar',
|
|
'smmagnet',
|
|
'5dollar',
|
|
'bigmagnet',
|
|
'10dollar',
|
|
'hypnogogs',
|
|
'hypnogogs'),
|
|
('bikehorn',
|
|
'whistle',
|
|
'bugle',
|
|
'aoogah',
|
|
'elephant',
|
|
'foghorn',
|
|
'singing'),
|
|
('cupcake',
|
|
'fruitpieslice',
|
|
'creampieslice',
|
|
'fruitpie',
|
|
'creampie',
|
|
'cake',
|
|
'cake'),
|
|
('flower',
|
|
'waterglass',
|
|
'waterballoon',
|
|
'bottle',
|
|
'firehose',
|
|
'stormcloud',
|
|
'stormcloud'),
|
|
('flowerpot',
|
|
'sandbag',
|
|
'anvil',
|
|
'weight',
|
|
'safe',
|
|
'piano',
|
|
'piano'))
|
|
AvPropsNew = (('inventory_feather',
|
|
'inventory_megaphone',
|
|
'inventory_lipstick',
|
|
'inventory_bamboo_cane',
|
|
'inventory_pixiedust',
|
|
'inventory_juggling_cubes',
|
|
'inventory_ladder'),
|
|
('inventory_bannana_peel',
|
|
'inventory_rake',
|
|
'inventory_marbles',
|
|
'inventory_quicksand_icon',
|
|
'inventory_trapdoor',
|
|
'inventory_tnt',
|
|
'inventory_traintracks'),
|
|
('inventory_1dollarbill',
|
|
'inventory_small_magnet',
|
|
'inventory_5dollarbill',
|
|
'inventory_big_magnet',
|
|
'inventory_10dollarbill',
|
|
'inventory_hypno_goggles',
|
|
'inventory_screen'),
|
|
('inventory_bikehorn',
|
|
'inventory_whistle',
|
|
'inventory_bugle',
|
|
'inventory_aoogah',
|
|
'inventory_elephant',
|
|
'inventory_fog_horn',
|
|
'inventory_opera_singer'),
|
|
('inventory_tart',
|
|
'inventory_fruit_pie_slice',
|
|
'inventory_cream_pie_slice',
|
|
'inventory_fruitpie',
|
|
'inventory_creampie',
|
|
'inventory_cake',
|
|
'inventory_wedding'),
|
|
('inventory_squirt_flower',
|
|
'inventory_glass_of_water',
|
|
'inventory_water_gun',
|
|
'inventory_seltzer_bottle',
|
|
'inventory_firehose',
|
|
'inventory_storm_cloud',
|
|
'inventory_geyser'),
|
|
('inventory_flower_pot',
|
|
'inventory_sandbag',
|
|
'inventory_anvil',
|
|
'inventory_weight',
|
|
'inventory_safe_box',
|
|
'inventory_piano',
|
|
'inventory_ship'))
|
|
AvPropStrings = TTLocalizer.BattleGlobalAvPropStrings
|
|
AvPropStringsSingular = TTLocalizer.BattleGlobalAvPropStringsSingular
|
|
AvPropStringsPlural = TTLocalizer.BattleGlobalAvPropStringsPlural
|
|
AvPropAccuracy = ((70,
|
|
70,
|
|
70,
|
|
70,
|
|
70,
|
|
70,
|
|
100),
|
|
(0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0),
|
|
(50,
|
|
50,
|
|
60,
|
|
60,
|
|
70,
|
|
70,
|
|
90),
|
|
(95,
|
|
95,
|
|
95,
|
|
95,
|
|
95,
|
|
95,
|
|
95),
|
|
(75,
|
|
75,
|
|
75,
|
|
75,
|
|
75,
|
|
75,
|
|
75),
|
|
(95,
|
|
95,
|
|
95,
|
|
95,
|
|
95,
|
|
95,
|
|
95),
|
|
(50,
|
|
50,
|
|
50,
|
|
50,
|
|
50,
|
|
50,
|
|
50))
|
|
AvLureBonusAccuracy = (60,
|
|
60,
|
|
70,
|
|
70,
|
|
80,
|
|
80,
|
|
100)
|
|
AvTrackAccStrings = TTLocalizer.BattleGlobalAvTrackAccStrings
|
|
AvPropDamage = ((((8, 10), (Levels[0][0], Levels[0][1])),
|
|
((15, 18), (Levels[0][1], Levels[0][2])),
|
|
((25, 30), (Levels[0][2], Levels[0][3])),
|
|
((40, 45), (Levels[0][3], Levels[0][4])),
|
|
((60, 70), (Levels[0][4], Levels[0][5])),
|
|
((90, 120), (Levels[0][5], Levels[0][6])),
|
|
((210, 210), (Levels[0][6], MaxSkill))),
|
|
(((10, 12), (Levels[1][0], Levels[1][1])),
|
|
((18, 20), (Levels[1][1], Levels[1][2])),
|
|
((30, 35), (Levels[1][2], Levels[1][3])),
|
|
((45, 50), (Levels[1][3], Levels[1][4])),
|
|
((60, 70), (Levels[1][4], Levels[1][5])),
|
|
((90, 180), (Levels[1][5], Levels[1][6])),
|
|
((195, 195), (Levels[1][6], MaxSkill))),
|
|
(((0, 0), (0, 0)),
|
|
((0, 0), (0, 0)),
|
|
((0, 0), (0, 0)),
|
|
((0, 0), (0, 0)),
|
|
((0, 0), (0, 0)),
|
|
((0, 0), (0, 0)),
|
|
((0, 0), (0, 0))),
|
|
(((3, 4), (Levels[3][0], Levels[3][1])),
|
|
((5, 7), (Levels[3][1], Levels[3][2])),
|
|
((9, 11), (Levels[3][2], Levels[3][3])),
|
|
((14, 16), (Levels[3][3], Levels[3][4])),
|
|
((19, 21), (Levels[3][4], Levels[3][5])),
|
|
((25, 50), (Levels[3][5], Levels[3][6])),
|
|
((90, 90), (Levels[3][6], MaxSkill))),
|
|
(((4, 6), (Levels[4][0], Levels[4][1])),
|
|
((8, 10), (Levels[4][1], Levels[4][2])),
|
|
((14, 17), (Levels[4][2], Levels[4][3])),
|
|
((24, 27), (Levels[4][3], Levels[4][4])),
|
|
((36, 40), (Levels[4][4], Levels[4][5])),
|
|
((48, 100), (Levels[4][5], Levels[4][6])),
|
|
((120, 120), (Levels[4][6], MaxSkill))),
|
|
(((3, 4), (Levels[5][0], Levels[5][1])),
|
|
((6, 8), (Levels[5][1], Levels[5][2])),
|
|
((10, 12), (Levels[5][2], Levels[5][3])),
|
|
((18, 21), (Levels[5][3], Levels[5][4])),
|
|
((27, 30), (Levels[5][4], Levels[5][5])),
|
|
((36, 80), (Levels[5][5], Levels[5][6])),
|
|
((105, 105), (Levels[5][6], MaxSkill))),
|
|
(((10, 10), (Levels[6][0], Levels[6][1])),
|
|
((18, 18), (Levels[6][1], Levels[6][2])),
|
|
((30, 30), (Levels[6][2], Levels[6][3])),
|
|
((45, 45), (Levels[6][3], Levels[6][4])),
|
|
((60, 60), (Levels[6][4], Levels[6][5])),
|
|
((85, 170), (Levels[6][5], Levels[6][6])),
|
|
((180, 180), (Levels[6][6], MaxSkill))))
|
|
ATK_SINGLE_TARGET = 0
|
|
ATK_GROUP_TARGET = 1
|
|
AvPropTargetCat = ((ATK_SINGLE_TARGET,
|
|
ATK_GROUP_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_GROUP_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_GROUP_TARGET,
|
|
ATK_GROUP_TARGET),
|
|
(ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET),
|
|
(ATK_GROUP_TARGET,
|
|
ATK_GROUP_TARGET,
|
|
ATK_GROUP_TARGET,
|
|
ATK_GROUP_TARGET,
|
|
ATK_GROUP_TARGET,
|
|
ATK_GROUP_TARGET,
|
|
ATK_GROUP_TARGET),
|
|
(ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_SINGLE_TARGET,
|
|
ATK_GROUP_TARGET))
|
|
AvPropTarget = (0,
|
|
3,
|
|
0,
|
|
2,
|
|
3,
|
|
3,
|
|
3)
|
|
|
|
def getAvPropDamage(attackTrack, attackLevel, exp, organicBonus = False, propBonus = False, propAndOrganicBonusStack = False):
|
|
minD = AvPropDamage[attackTrack][attackLevel][0][0]
|
|
maxD = AvPropDamage[attackTrack][attackLevel][0][1]
|
|
minE = AvPropDamage[attackTrack][attackLevel][1][0]
|
|
maxE = AvPropDamage[attackTrack][attackLevel][1][1]
|
|
expVal = min(exp, maxE)
|
|
expPerHp = float(maxE - minE + 1) / float(maxD - minD + 1)
|
|
damage = math.floor((expVal - minE) / expPerHp) + minD
|
|
if damage <= 0:
|
|
damage = minD
|
|
if propAndOrganicBonusStack:
|
|
originalDamage = damage
|
|
if organicBonus:
|
|
damage += getDamageBonus(originalDamage)
|
|
if propBonus:
|
|
damage += getDamageBonus(originalDamage)
|
|
elif organicBonus or propBonus:
|
|
damage += getDamageBonus(damage)
|
|
return damage
|
|
|
|
|
|
def getDamageBonus(normal):
|
|
bonus = int(normal * 0.1)
|
|
if bonus < 1 and normal > 0:
|
|
bonus = 1
|
|
return bonus
|
|
|
|
|
|
def isGroup(track, level):
|
|
return AvPropTargetCat[AvPropTarget[track]][level]
|
|
|
|
|
|
def getCreditMultiplier(floorIndex):
|
|
return 1 + floorIndex * 0.5
|
|
|
|
|
|
def getFactoryCreditMultiplier(factoryId):
|
|
return 2.0
|
|
|
|
|
|
def getFactoryMeritMultiplier(factoryId):
|
|
return 4.0
|
|
|
|
|
|
def getMintCreditMultiplier(mintId):
|
|
return {CashbotMintIntA: 2.0,
|
|
CashbotMintIntB: 2.5,
|
|
CashbotMintIntC: 3.0}.get(mintId, 1.0)
|
|
|
|
|
|
def getStageCreditMultiplier(floor):
|
|
return getCreditMultiplier(floor)
|
|
|
|
|
|
def getCountryClubCreditMultiplier(countryClubId):
|
|
return {BossbotCountryClubIntA: 2.0,
|
|
BossbotCountryClubIntB: 2.5,
|
|
BossbotCountryClubIntC: 3.0}.get(countryClubId, 1.0)
|
|
|
|
|
|
def getBossBattleCreditMultiplier(battleNumber):
|
|
return 1 + battleNumber
|
|
|
|
|
|
def getInvasionMultiplier():
|
|
return 2.0
|
|
|
|
|
|
def getMoreXpHolidayMultiplier():
|
|
return 2.0
|
|
|
|
|
|
def encodeUber(trackList):
|
|
bitField = 0
|
|
for trackIndex in range(len(trackList)):
|
|
if trackList[trackIndex] > 0:
|
|
bitField += pow(2, trackIndex)
|
|
|
|
return bitField
|
|
|
|
|
|
def decodeUber(flagMask):
|
|
if flagMask == 0:
|
|
return []
|
|
maxPower = 16
|
|
workNumber = flagMask
|
|
workPower = maxPower
|
|
trackList = []
|
|
while workPower >= 0:
|
|
if workNumber >= pow(2, workPower):
|
|
workNumber -= pow(2, workPower)
|
|
trackList.insert(0, 1)
|
|
else:
|
|
trackList.insert(0, 0)
|
|
workPower -= 1
|
|
|
|
endList = len(trackList)
|
|
foundOne = 0
|
|
while not foundOne:
|
|
if trackList[endList - 1] == 0:
|
|
trackList.pop(endList - 1)
|
|
endList -= 1
|
|
else:
|
|
foundOne = 1
|
|
|
|
return trackList
|
|
|
|
|
|
def getUberFlag(flagMask, index):
|
|
decode = decodeUber(flagMask)
|
|
if index >= len(decode):
|
|
return 0
|
|
else:
|
|
return decode[index]
|
|
|
|
|
|
def getUberFlagSafe(flagMask, index):
|
|
if flagMask == 'unknown' or flagMask < 0:
|
|
return -1
|
|
else:
|
|
return getUberFlag(flagMask, index)
|