Advertisement
AceZephyr

FF7 PSX Chocobo Race Initial Conditions by frame

May 31st, 2023
1,032
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.68 KB | None | 0 0
  1. class RNG:
  2.  
  3.     def rng(self):
  4.         a = 0x41C64E6D
  5.         b = 0x3039
  6.  
  7.         self.rng_incrs += 1
  8.         self.rng_state = (a * self.rng_state + b) & 0xFFFFFFFF
  9.         return (self.rng_state >> 0x10) & 0x7FFF
  10.  
  11.     def __init__(self, seed=0):
  12.         self.rng_state = seed
  13.         self.rng_incrs = 0
  14.  
  15.  
  16. class ChocoboData:
  17.  
  18.     def __init__(self):
  19.         self.unknown = None
  20.         self.running_animation = None
  21.         self.stamina = None
  22.         self.ai_type = None
  23.         self.dash_speed = None
  24.         self.speed = None
  25.  
  26.     def __repr__(self):
  27.         return ",".join([str(None) if x is None else hex(x)[2:].upper().zfill(4) for x in
  28.                          [self.speed, self.dash_speed, self.stamina, self.ai_type]])
  29.  
  30.  
  31. RACER_NAMES = ['SAM',
  32.                'ELEN',
  33.                'BLUES',
  34.                'TOM',
  35.                'JOHN',
  36.                'GARY',
  37.                'MIKE',
  38.                'SANDY',
  39.                'JU',
  40.                'LY',
  41.                'JOEL',
  42.                'GREY',
  43.                'EDWARD',
  44.                'JAMES',
  45.                'HARVEY',
  46.                'DAN',
  47.                'RUDY',
  48.                'GRAHAM',
  49.                'FOX',
  50.                'CLIVE',
  51.                'SEAN',
  52.                'YOUNG',
  53.                'ROBIN',
  54.                'DARIO',
  55.                'ARL',
  56.                'SARA',
  57.                'MARIE',
  58.                'SAMMY',
  59.                'LIA',
  60.                'KNIGHT',
  61.                'PAULA',
  62.                'PAU',
  63.                'LE',
  64.                'PETER',
  65.                'AIMEE',
  66.                'TERRY',
  67.                'ANDY',
  68.                'NANCY',
  69.                'TIM',
  70.                'ROBER',
  71.                'GEORGE',
  72.                'JENNY',
  73.                'RICA',
  74.                'JULIA']
  75.  
  76. PRIZE_NAMES = [
  77.     "Sprint Shoes",
  78.     "Counter Attack",
  79.     "Magic Counter",
  80.     "Precious Watch",
  81.     "Cat's Bell",
  82.     "Enemy Away",
  83.     "Sneak Attack",
  84.     "Chocobracelet",
  85.     "Ether",
  86.     "Elixir",
  87.     "Hero Drink",
  88.     "Bolt Plume",
  89.     "Fire Fang",
  90.     "Antarctic Wind",
  91.     "Swift Bolt",
  92.     "Fire Veil",
  93.     "Ice Crystal",
  94.     "Megalixer",
  95.     "Turbo Ether",
  96.     "Potion",
  97.     "Phoenix Down",
  98.     "Hyper",
  99.     "Tranquilizer",
  100.     "Hi-Potion"
  101. ]
  102.  
  103. REWARD_TABLES = {
  104.     "C": [
  105.         [0x17, 0x00, 0x05, 0x01],
  106.         [0x08, 0x00, 0x14, 0x01],
  107.         [0x15, 0x00, 0x0A, 0x00],
  108.         [0x16, 0x00, 0x0A, 0x00],
  109.         [0x14, 0x00, 0x14, 0x00],
  110.         [0x0B, 0x00, 0x05, 0x01],
  111.         [0x0C, 0x00, 0x05, 0x00],
  112.         [0x0D, 0x00, 0x05, 0x00],
  113.         [0x13, 0x00, 0x05, 0x01],
  114.         [0x14, 0x00, 0x14, 0x01],
  115.     ], "B": [
  116.         [0x08, 0x00, 0x1E, 0x00],
  117.         [0x0A, 0x00, 0x0A, 0x00],
  118.         [0x14, 0x00, 0x14, 0x00],
  119.         [0x12, 0x00, 0x05, 0x01],
  120.         [0x08, 0x00, 0x1E, 0x00],
  121.         [0x17, 0x00, 0x05, 0x00],
  122.         [0x15, 0x00, 0x0A, 0x00],
  123.         [0x16, 0x00, 0x0A, 0x00],
  124.         [0x17, 0x00, 0x05, 0x00],
  125.         [0x0B, 0x00, 0x0A, 0x01],
  126.         [0x0C, 0x00, 0x0A, 0x00],
  127.         [0x0D, 0x00, 0x0A, 0x00],
  128.         [0x09, 0x00, 0x0A, 0x01],
  129.         [0x05, 0x01, 0x05, 0x01],
  130.         [0x17, 0x00, 0x05, 0x00],
  131.     ], "A": [
  132.         [0x08, 0x00, 0x14, 0x00],
  133.         [0x0A, 0x00, 0x0A, 0x00],
  134.         [0x0E, 0x01, 0x0A, 0x00],
  135.         [0x0F, 0x01, 0x0A, 0x00],
  136.         [0x0C, 0x00, 0x0A, 0x00],
  137.         [0x10, 0x01, 0x0A, 0x00],
  138.         [0x01, 0x00, 0x0A, 0x01],
  139.         [0x05, 0x01, 0x05, 0x01],
  140.         [0x0B, 0x00, 0x0A, 0x00],
  141.         [0x0C, 0x00, 0x0A, 0x00],
  142.         [0x0D, 0x00, 0x0A, 0x00],
  143.         [0x09, 0x00, 0x0A, 0x01],
  144.         [0x17, 0x00, 0x05, 0x00],
  145.         [0x08, 0x00, 0x14, 0x00],
  146.         [0x00, 0x01, 0x07, 0x01],
  147.         [0x09, 0x00, 0x05, 0x01],
  148.         [0x14, 0x00, 0x14, 0x00],
  149.         [0x0C, 0x00, 0x0A, 0x00],
  150.         [0x04, 0x01, 0x07, 0x01],
  151.         [0x06, 0x01, 0x07, 0x01],
  152.     ], "S": [
  153.         [0x12, 0x01, 0x05, 0x00],
  154.         [0x0A, 0x00, 0x05, 0x00],
  155.         [0x09, 0x00, 0x05, 0x01],
  156.         [0x01, 0x00, 0x05, 0x01],
  157.         [0x05, 0x01, 0x05, 0x01],
  158.         [0x06, 0x01, 0x05, 0x01],
  159.         [0x0E, 0x01, 0x05, 0x00],
  160.         [0x0F, 0x01, 0x05, 0x00],
  161.         [0x0B, 0x00, 0x02, 0x00],
  162.         [0x0F, 0x01, 0x05, 0x00],
  163.         [0x14, 0x00, 0x14, 0x00],
  164.         [0x10, 0x00, 0x05, 0x00],
  165.         [0x11, 0x01, 0x05, 0x01],
  166.         [0x12, 0x00, 0x05, 0x00],
  167.         [0x00, 0x01, 0x05, 0x01],
  168.         [0x0E, 0x00, 0x05, 0x00],
  169.         [0x04, 0x01, 0x05, 0x01],
  170.         [0x09, 0x00, 0x05, 0x01],
  171.         [0x07, 0x01, 0x05, 0x01],
  172.         [0x10, 0x01, 0x05, 0x00],
  173.         [0x03, 0x01, 0x05, 0x01],
  174.         [0x02, 0x01, 0x05, 0x01],
  175.     ]
  176. }
  177.  
  178. CHOCO_STAT_TABLE = {
  179.     "C": [0x09C4, 0x01F4, 0x06A4, 0x00C8],
  180.     "B": [0x0BB8, 0x0258, 0x0898, 0x012C],
  181.     "A": [0x0DAC, 0x02BC, 0x0BB8, 0x01F4],
  182.     "S": [0x1388, 0x0320, 0x0FA0, 0x01F4]
  183. }
  184.  
  185.  
  186. def generate_chocobo_race_data(rng=None, rank="C", _B747C=0xffffffff):
  187.     chodata = [ChocoboData() for _ in range(6)]
  188.  
  189.     if rng is None:
  190.         rng = RNG()
  191.  
  192.     for _ in range(0x28):
  193.         rng.rng()
  194.         rng.rng()
  195.  
  196.     chodata[0].ai_type = rng.rng() % 4
  197.     for x in range(5):
  198.         chodata[x + 1].dash_speed = CHOCO_STAT_TABLE[rank][0] + (rng.rng() % CHOCO_STAT_TABLE[rank][1])
  199.         chodata[x + 1].speed = CHOCO_STAT_TABLE[rank][2] + (rng.rng() % CHOCO_STAT_TABLE[rank][3])
  200.         chodata[x + 1].ai_type = rng.rng() % 4
  201.         chodata[x + 1].stamina = CHOCO_STAT_TABLE[rank][0] + (rng.rng() % 300)
  202.         chodata[x + 1].running_animation = (1 if rng.rng() & 7 == 0 else 0) * 2
  203.         chodata[x + 1].unknown = ((rng.rng() & 1) * 50) + 50
  204.  
  205.     names = [x for x in range(43)]
  206.  
  207.     x = 0
  208.     while x < 0xC8:
  209.         x += 1
  210.         swap1 = rng.rng() % 43
  211.         swap2 = rng.rng() % 43
  212.         a0 = names[swap2]
  213.         a1 = names[swap1]
  214.         names[swap1] = a0
  215.         names[swap2] = a1
  216.  
  217.     reward_table = REWARD_TABLES[rank]
  218.     reward_pool = [
  219.         0xFF, 0xFF, 0xFF
  220.     ]
  221.  
  222.     items_in = 0  # s1
  223.     s2 = 0
  224.     s3 = 0xffffffff
  225.     while items_in != 3:
  226.         v0 = rng.rng() % len(reward_table)
  227.         item = reward_table[v0]
  228.         if reward_pool[0] == item[0] or reward_pool[1] == item[0] or reward_pool[2] == item[0]:
  229.             continue
  230.         if reward_table[v0][1] != 0:
  231.             if s2 != 0:
  232.                 if item[3] != 0:
  233.                     continue
  234.             # AB5A8
  235.             if _B747C != 0:
  236.                 reward_pool[items_in] = item[0]
  237.                 items_in += 1
  238.             # AB5C8
  239.             if reward_table[v0][3] == 0:
  240.                 continue
  241.             # set rare item
  242.             s3 = item[0]
  243.             s2 = 0xffffffff
  244.             continue
  245.         # AB5F0
  246.         if s2 != 0:
  247.             if reward_table[v0][3] != 0:
  248.                 continue
  249.         # AB608
  250.         reward_pool[items_in] = item[0]
  251.         items_in += 1
  252.         if reward_table[v0][3] == 0:
  253.             continue
  254.         # set rare item
  255.         s3 = item[0]
  256.         s2 = 0xffffffff
  257.     # AB634
  258.  
  259.     reward_pool.sort()
  260.  
  261.     # there's a jump back up here but i don't think it can ever be taken
  262.     # AB714
  263.  
  264.     if s3 != 0xffffffff:
  265.         if reward_pool[0] == s3:
  266.             v0 = reward_pool[2]
  267.             reward_pool[2] = s3
  268.             reward_pool[0] = v0
  269.         elif reward_pool[1] == s3:  # AB74C
  270.             v0 = reward_pool[2]
  271.             reward_pool[2] = s3
  272.             reward_pool[1] = v0
  273.     # AB778
  274.     tile_buffer_items = []
  275.     tile_buffer_cards = []
  276.     for i in range(7):
  277.         tile_buffer_items.append(reward_pool[0])
  278.         tile_buffer_cards.append(0)
  279.     for i in range(5):
  280.         tile_buffer_items.append(reward_pool[1])
  281.         tile_buffer_cards.append(1)
  282.     for i in range(3):
  283.         tile_buffer_items.append(reward_pool[2])
  284.         tile_buffer_cards.append(2)
  285.  
  286.     x = 0
  287.     while x < 100:
  288.         x += 2
  289.         swap1 = rng.rng() % 15
  290.         swap2 = rng.rng() % 15
  291.         a2 = tile_buffer_items[swap1]
  292.         v0 = tile_buffer_items[swap2]
  293.         tile_buffer_items[swap1] = v0
  294.         v0 = tile_buffer_cards[swap2]
  295.         tile_buffer_items[swap2] = a2
  296.         a2 = tile_buffer_cards[swap1]
  297.         tile_buffer_cards[swap1] = v0
  298.         tile_buffer_cards[swap2] = a2
  299.         swap1 = rng.rng() % 15
  300.         swap2 = rng.rng() % 15
  301.         a2 = tile_buffer_items[swap1]
  302.         v0 = tile_buffer_items[swap2]
  303.         tile_buffer_items[swap1] = v0
  304.         v0 = tile_buffer_cards[swap2]
  305.         tile_buffer_items[swap2] = a2
  306.         a2 = tile_buffer_cards[swap1]
  307.         tile_buffer_cards[swap1] = v0
  308.         tile_buffer_cards[swap2] = a2
  309.  
  310.     return {"items": reward_pool, "tile_cards": tile_buffer_cards, "names": names[1:6], "chocobo_data": chodata}
  311.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement