Advertisement
imbuedl

ESS Turn Collision Angle Setup Script (Oceanside 1134)

Jan 11th, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.89 KB | None | 0 0
  1.  
  2.  
  3. # 53368
  4. # 1082
  5.  
  6. #goal_angle_list = [1824, 2802, 3818] #### 1824, 2802, and 3818 for sun's, this also works instead of the list of hex values
  7.  
  8. #-12168
  9.  
  10. initial_angle = 0x4000%65536 #### Input as hex or a signed or unsigned integer (python treats hex like a decimal integer; the mod 65536 allows for signed int input)
  11. goal_angle_list = [0x1134]#[0xFF4D, 0xFF5C, 0xFFBA]#[0x1134] #[0x73D6] # 1134, intro #[0x0720, 0x0AF2, 0x0EEA] #### These are the working angles for sun's song
  12. ##### 0xFF63 = razor sword, 0x1134 is itself, follow with deleting ocarina
  13.  
  14. def find_solutions(initial_angle, goal_angle_list, filename):
  15.    
  16.     if initial_angle > 65535 or initial_angle < 0 or isinstance(initial_angle, int) == False:
  17.         print('Error: The initial angle is not a valid input')
  18.    
  19.     with open(filename, "a") as file:
  20.    
  21.         Solution_Found = False
  22.         for i in range(8192):
  23.             for angle in goal_angle_list:
  24.                 if (initial_angle + i*1800)%65536 == angle:
  25.                     Solution_Found = True
  26.                     print("%d = %s is a working initial angle with %d Left ESS turns for goal angle %d = %s" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  27.                     file.write("%d = %s is a working initial angle with %d Left ESS turns for goal angle %d = %s\n" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  28.                    
  29.                 if (initial_angle - i*1800)%65536 == angle:
  30.                     Solution_Found = True
  31.                     print("%d = %s is a working initial angle with %d Right ESS turns for goal angle %d = %s" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  32.                     file.write("%d = %s is a working initial angle with %d Right ESS turns for goal angle %d = %s\n" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  33.                    
  34.         if Solution_Found == False:
  35.             print("No solutions were found for this initial angle.")
  36.  
  37.  
  38. def sortFirst(val):
  39.     return val[0]  
  40.  
  41. def find_ranked_solutions(initial_angle_list, goal_angle_list, filename):
  42.    
  43.     #solution_dict = {}
  44.     solution_list = []
  45.    
  46.     with open(filename, "a") as file:
  47.    
  48.         for initial_angle in initial_angle_list:
  49.            
  50.             print(hex(initial_angle))
  51.            
  52.             if initial_angle > 65535 or initial_angle < 0 or isinstance(initial_angle, int) == False:
  53.                 print('Error: The initial angle is not a valid input')
  54.            
  55.             Solution_Found = False
  56.             for i in range(8192):
  57.                 for angle in goal_angle_list:
  58.                    
  59.                     #if (initial_angle, angle) not in solution_dict:
  60.                      #   solution_dict[(initial_angle, angle, 'left')] = []
  61.                       #  solution_dict[(initial_angle, angle, 'right')] = []
  62.                    
  63.                     if (initial_angle + i*1800)%65536 == angle:
  64.                         Solution_Found = True
  65.                         #print("%d = %s is a working initial angle with %d Left ESS turns for goal angle %d = %s" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  66.                         #solution_dict[(initial_angle, angle, 'left')].append(i)
  67.                         solution_list.append((i, initial_angle, angle, 'Left'))
  68.                         #file.write("%d = %s is a working initial angle with %d Left ESS turns for goal angle %d = %s\n" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  69.                        
  70.                     if (initial_angle - i*1800)%65536 == angle:
  71.                         Solution_Found = True
  72.                         #print("%d = %s is a working initial angle with %d Right ESS turns for goal angle %d = %s" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  73.                         #solution_dict[(initial_angle, angle, 'right')].append(i)
  74.                         solution_list.append((i, initial_angle, angle, 'Right'))
  75.                         #file.write("%d = %s is a working initial angle with %d Right ESS turns for goal angle %d = %s\n" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  76.                        
  77.             #if Solution_Found == False:
  78.                 #print("No solutions were found for this initial angle.")
  79.        
  80.         ##### Now sort and then write to file
  81.        
  82.        
  83.         solution_list.sort(key=sortFirst)
  84.        
  85.         for entry in solution_list:
  86.            
  87.             file.write("%d = %s is a working initial angle with %d %s ESS turns for goal angle %d = %s\n" %(entry[1], hex(entry[1]), entry[0], entry[3], entry[2], hex(entry[2])))
  88.            
  89.         print("Done.")
  90.        
  91.            
  92.            
  93.  
  94. ###############
  95.  
  96. #initial_angle_list = [0xC001,0x8000,0xA54D,0xA54B,0xD8F8,0xD8F7,0x2708,0x270A,0x4000,0x59B4,0x59B6,0x0000,0x9078,0x9075,0xCF3E,0xCF35,0xA000,0xA009,0x720D,0x720C,0xADB8,0xADBD,0x5109,0x5104,0x8D87,0x8D85,0x6000,0x6008,0x313E,0x313C,0x6DB8,0x6DBD,0x1078,0x1074,0x4F3E,0x4F33,0x2000,0x2008,0xF20E,0xF20D,0x2DB8,0x2DBB,0xD109,0xD105,0x0D87,0x0D83,0xE000,0xE009,0xB13E,0xEDB8,0x254D,0x2549,0x59B4,0x59B6,0xA64C,0xA64B,0xDAB3,0xDAB8]
  97.  
  98. #oceanside
  99. #initial_angle_list = [0xC001,0x8000,0xA54D,0xA54B,0xD8F8,0xD8F7,0x2708,0x270A,0x4000,0x59B4,0x59B6,0x0000,0x9078,0x9075,0xCF3E,0xCF35,0xA000,0xA009,0x720D,0x720C,0xADB8,0xADBD,0x5109,0x5104,0x8D87,0x8D85,0x6000,0x6008,0x313E,0x313C,0x6DB8,0x6DBD,0x1078,0x1074,0x4F3E,0x4F33,0x2000,0x2008,0xF20E,0xF20D,0x2DB8,0x2DBB,0xD109,0xD105,0x0D87,0x0D83,0xE000,0xE009,0xB13E,0xEDB8,0x254D,0x2549,0x59B4,0x59B6,0xA64C,0xA64B,0xDAB3,0xDAB8]
  100.  
  101. #graveyard
  102. #initial_angle_list = [0x8000,0x92E4,0x92E6,0xB94C,0xB950,0xA325,0xA32A,0x85A7,0x85A3,0x882A,0x8823,0x7216,0x721C,0x891E,0x8914,0x76BC,0x76BD,0x6000,0x6008,0x46B4,0x46B1,0x32E7,0x32ED,0x1E53,0x1E57,0xEB20,0xEB2C,0x1DDE,0x1DD7,0xEF2A,0xEF30,0x14C1,0x14C5,0xFECF,0xFED1,0x0BCB,0x0BC3,0xF4F1,0xF4FE,0xEBCB,0xEBCC,0xDC4C,0xDC48,0xD078,0xD075,0xED1C,0x0000,0x76C5,0x76CD,0x729E,0x729C,0x4000,0x0D62,0x0D63,0x093B,0x0932,0xC000,0x40EA,0x40E0,0x0F1B,0x0F14,0x7124,0x712C]
  103. #initial_angle_list = [0xC001,0x0001,0x4001,0x8001,0xD2E6,0x12E6,0x52E6,0x12E5,0x52E5,0x52E4,0xF950,0x3950,0x7950,0xF960,0xF96F,0xE32A,0x232A,0x2329,0x632A,0x6329,0x6328,0xC5A3,0xC5A2,0xC5A1,0x05A3,0x05A1,0x45A3,0x45A2,0x45A1]
  104. #initial_angle_list = [0x4bc3,0x8bc3,0xcbc3,0x34fe,0x74f3,0xb4fe,0x2bcc,0x6bcc,0xabcc,0x1c48,0x5c48,0x9c48,0x1075,0x5075,0x9075]
  105.  
  106. #initial_angle_list = [0xC001,0x8000,0x4000,0x0000,0x9078,0x9075,0xCF3E,0xCF35,0xA000,0xA009,0x720D,0x720C,0xADB8,0xADBD,0x5109,0x5104,0x8D87,0x8D85,0x6000,0x6008,0x313E,0x313C,0x6DB8,0x6DBD,0x1078,0x1074,0x4F3E,0x4F33,0x2000,0x2008,0xF20E,0xF20D,0x2DB8,0x2DBB,0xD109,0xD105,0x0D87,0x0D83,0xE000,0xE009,0xB13E,0xEDB8]
  107.  
  108.  
  109. ###############################################################################
  110.  
  111. # Angles you get from targeting walls, walking forward to match angle with camera angle, then turning to get all 4 cardinal directions associated with that camera angle
  112. #initial_angle_list = [0x0000, 0x4000, 0x8000, 0xC000, 0xC001, 0x8001, 0x4001, 0x0001, 0xEDB8, 0xB13E, 0x713E, 0x313E, 0xF13E, 0xE000, 0xE009, 0xA009, 0x6009, 0x2009, 0xD87, 0xD83, 0xCD83, 0x8D83, 0x4D83, 0xD109, 0xD105, 0x9105, 0x5105, 0x1105, 0x2DB8, 0x2DBB, 0xEDBB, 0xADBB, 0x6DBB, 0xF20D, 0xF20E, 0xB20E, 0x720E, 0x320E, 0x2000, 0x2008, 0xE008, 0xA008, 0x6008, 0x4F3E, 0x4F33, 0xF33, 0xCF33, 0x8F33, 0x1078, 0x1074, 0xD074, 0x9074, 0x5074, 0x6DB8, 0x6DBB, 0x2DBB, 0xEDBB, 0xADBB, 0x313E, 0x313C, 0xF13C, 0xB13C, 0x713C, 0x8D87, 0x8D85, 0x4D85, 0xD85, 0xCD85, 0x5109, 0x5104, 0x1104, 0xD104, 0x9104, 0xADB8, 0xADBD, 0x6DBD, 0x2DBD, 0xEDBD, 0x720D, 0x720C, 0x320C, 0xF20C, 0xB20C, 0xA000, 0xCF3E, 0xCF35, 0x8F35, 0x4F35, 0xF35, 0x9078, 0x9075, 0x5075, 0x1075, 0xD075]
  113.  
  114.  
  115. # Angles you get from walls in Room 4 of Oceanside (work in timestop)
  116. initial_angle_list = [0x0000, 0xC000, 0xEDB8, 0xB13E, 0xE000, 0x0D87, 0xD109, 0x2DB8, 0xF20D, 0x2000, 0x4F3E, 0x1078, 0x4000, 0x6DB8, 0x313E, 0x6000, 0x8D87, 0x5109, 0x8000, 0xADB8, 0x720D, 0xA000, 0xCF3E, 0x9078]
  117.  
  118. oceanside_room4_normal_vector_angle_list = [0x0000, 0xC000, 0xEDB8, 0xB13E, 0xE000, 0x0D87, 0xD109, 0x2DB8, 0xF20D, 0x2000, 0x4F3E, 0x1078, 0x4000, 0x6DB8, 0x313E, 0x6000, 0x8D87, 0x5109, 0x8000, 0xADB8, 0x720D, 0xA000, 0xCF3E, 0x9078]
  119.  
  120.  
  121. def find_goal_collision_angles(value_string):
  122.    
  123.     # if seahorse, then value_string = '0x24', for example
  124.    
  125.     """
  126.    
  127.    This function gives us the goal collision angles for a given item that needs
  128.    the 0x40 bit to be 0
  129.    
  130.    """
  131.    
  132.     if len(value_string) != 4 or value_string[0] != '0':
  133.         print('invalid input into find_goal_collision_angles() function')
  134.    
  135.     seahorse_list = []
  136.     for i in range(256):
  137.         string = hex(i)
  138.         if len(string) == 3:
  139.             new_string = '0x0' + string[2]
  140.         elif len(string) == 4:
  141.             new_string = string
  142.         else:
  143.             print("ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!???????????????????????????")
  144.        
  145.         collision_value = value_string + new_string[2:4]
  146.        
  147.         if len(collision_value) != 6:
  148.             print(collision_value)
  149.        
  150.         # If the 0x40 bit is 0, then add the value:
  151.         if collision_value[4] != '4' and collision_value[4] != '5' and collision_value[4] != '6' and collision_value[4] != '7' and collision_value[4] != 'c' and collision_value[4] != 'd' and collision_value[4] != 'e' and collision_value[4] != 'f':
  152.             seahorse_list.append(int(collision_value, 16))
  153.             #seahorse_list.append(collision_value)
  154.     if len(seahorse_list) != 128:
  155.         print("??????????????")
  156.    
  157.     return seahorse_list
  158.  
  159.  
  160. def find_valid_goal_angles(goal_collision_angle_list, normal_vector_angle_list):
  161.    
  162.     """
  163.    
  164.    a normal vector angle is the angle you get by targeting a given wall
  165.    
  166.    
  167.    This function takes a list of normal vector angles and a list of goal collision
  168.    angles and returns a list of all in the form (goal_angle, normal_angle, goal_collision_angle)
  169.    where goal_angle is an angle that can be used to collide into a wall with a normal vector angle
  170.    of normal_angle to get a collision angle of goal_collision_angle
  171.    
  172.    """
  173.    
  174.     valid_goal_angle_list = []
  175.    
  176.     for normal_vector_angle in normal_vector_angle_list:
  177.         for i in range(65536):
  178.            
  179.             angle_diff = abs(normal_vector_angle - i)
  180.            
  181.             if angle_diff > 0x8000:
  182.            
  183.                 collision_angle = abs(0x10000 - angle_diff )
  184.            
  185.             elif angle_diff <= 0x8000 and angle_diff >= 0:
  186.                
  187.                 collision_angle = angle_diff
  188.                
  189.             else:
  190.                 print("UHHHHHHHH??????")
  191.            
  192.             if collision_angle in goal_collision_angle_list:
  193.                
  194.                 valid_goal_angle_list.append((i, normal_vector_angle, collision_angle))
  195.                
  196.    
  197.     return valid_goal_angle_list
  198.  
  199.  
  200.  
  201. def find_ranked_collision_solutions(initial_angle_list, goal_angle_list, filename):
  202.    
  203.     """
  204.    
  205.    The idea is to have goal_angle_list = find_valid_goal_angles(find_goal_collision_angles('0x24'), oceanside_room4_normal_vector_angle_list)
  206.    if doing seahorse (item 0x24)
  207.    
  208.    """
  209.    
  210.     #solution_dict = {}
  211.     solution_list = []
  212.    
  213.     with open(filename, "a") as file:
  214.    
  215.         for initial_angle in initial_angle_list:
  216.            
  217.             print(hex(initial_angle))
  218.            
  219.             if initial_angle > 65535 or initial_angle < 0 or isinstance(initial_angle, int) == False:
  220.                 print('Error: The initial angle is not a valid input')
  221.            
  222.             #Solution_Found = False
  223.             for i in range(8192):
  224.                 for entry in goal_angle_list:
  225.                    
  226.                     angle = entry[0]
  227.                     normal_vector_angle = entry[1]
  228.                     collision_angle = entry[2]
  229.                    
  230.                     #if (initial_angle, angle) not in solution_dict:
  231.                      #   solution_dict[(initial_angle, angle, 'left')] = []
  232.                       #  solution_dict[(initial_angle, angle, 'right')] = []
  233.                    
  234.                     if (initial_angle + i*1800)%65536 == angle:
  235.                         #Solution_Found = True
  236.                         #print("%d = %s is a working initial angle with %d Left ESS turns for goal angle %d = %s" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  237.                         #solution_dict[(initial_angle, angle, 'left')].append(i)
  238.                         solution_list.append((i, initial_angle, angle, 'Left', normal_vector_angle, collision_angle))
  239.                         #file.write("%d = %s is a working initial angle with %d Left ESS turns for goal angle %d = %s\n" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  240.                        
  241.                     if (initial_angle - i*1800)%65536 == angle:
  242.                         #Solution_Found = True
  243.                         #print("%d = %s is a working initial angle with %d Right ESS turns for goal angle %d = %s" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  244.                         #solution_dict[(initial_angle, angle, 'right')].append(i)
  245.                         solution_list.append((i, initial_angle, angle, 'Right', normal_vector_angle, collision_angle))
  246.                         #file.write("%d = %s is a working initial angle with %d Right ESS turns for goal angle %d = %s\n" %(initial_angle, hex(initial_angle), i, angle, hex(angle)))
  247.                        
  248.             #if Solution_Found == False:
  249.                 #print("No solutions were found for this initial angle.")
  250.        
  251.         ##### Now sort and then write to file
  252.        
  253.        
  254.         solution_list.sort(key=sortFirst)
  255.        
  256.         for entry in solution_list:
  257.            
  258.             #file.write("%d = %s is a working initial angle with %d %s ESS turns for goal angle %d = %s\n" %(entry[1], hex(entry[1]), entry[0], entry[3], entry[2], hex(entry[2])))
  259.             file.write("%s is a working initial angle with %d %s ESS turns for a goal angle of %s which can collide into a wall with normal vector angle %s to get collision angle %s\n" %(hex(entry[1]), entry[0], entry[3], hex(entry[2]), hex(entry[4]), hex(entry[5])))
  260.                        
  261.         print("Done.")
  262.  
  263.  
  264.  
  265. #goal_angle_list = find_goal_collision_angles('0x2E')
  266.  
  267.  
  268. goal_angle_list = find_valid_goal_angles(find_goal_collision_angles('0x4E'), oceanside_room4_normal_vector_angle_list)
  269.  
  270. save_path = "C:\\Users\\xyzabc\\Documents\\Bizhawk RAM Watch\\scripts\\"
  271. name_of_file = "angle output"
  272. complete_name = save_path + name_of_file + ".txt"  
  273.  
  274. """
  275. for angle in initial_angle_list:
  276.    
  277.    find_solutions(angle, goal_angle_list, complete_name)
  278.  
  279. """
  280.  
  281. #find_ranked_solutions(initial_angle_list, goal_angle_list, complete_name)
  282.  
  283.  
  284. find_ranked_collision_solutions(initial_angle_list, goal_angle_list, complete_name)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement