Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 53368
- # 1082
- #goal_angle_list = [1824, 2802, 3818] #### 1824, 2802, and 3818 for sun's, this also works instead of the list of hex values
- #-12168
- initial_angle = 0xD554%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)
- goal_angle_list = [0x1134]#[0x9414, 0x9644]#[0x1134]#[0xFF4D, 0xFF5C, 0xFFBA]#[0x1134] #[0x73D6] # 1134, intro #[0x0720, 0x0AF2, 0x0EEA] #### These are the working angles for sun's song
- ##### 0xFF63 = razor sword, 0x1134 is itself, follow with deleting ocarina
- def find_solutions(initial_angle, goal_angle_list, filename):
- if initial_angle > 65535 or initial_angle < 0 or isinstance(initial_angle, int) == False:
- print('Error: The initial angle is not a valid input')
- with open(filename, "a") as file:
- Solution_Found = False
- for i in range(8192):
- for angle in goal_angle_list:
- if (initial_angle + i*1800)%65536 == angle:
- Solution_Found = True
- 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)))
- 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)))
- if (initial_angle - i*1800)%65536 == angle:
- Solution_Found = True
- 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)))
- 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)))
- if Solution_Found == False:
- print("No solutions were found for this initial angle.")
- def sortFirst(val):
- return val[0]
- def find_ranked_solutions(initial_angle_list, goal_angle_list, filename):
- #solution_dict = {}
- solution_list = []
- with open(filename, "a") as file:
- for initial_angle in initial_angle_list:
- print(hex(initial_angle))
- if initial_angle > 65535 or initial_angle < 0 or isinstance(initial_angle, int) == False:
- print('Error: The initial angle is not a valid input')
- Solution_Found = False
- for i in range(8192):
- for angle in goal_angle_list:
- #if (initial_angle, angle) not in solution_dict:
- # solution_dict[(initial_angle, angle, 'left')] = []
- # solution_dict[(initial_angle, angle, 'right')] = []
- if (initial_angle + i*1800)%65536 == angle:
- Solution_Found = True
- #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)))
- #solution_dict[(initial_angle, angle, 'left')].append(i)
- solution_list.append((i, initial_angle, angle, 'Left'))
- #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)))
- if (initial_angle - i*1800)%65536 == angle:
- Solution_Found = True
- #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)))
- #solution_dict[(initial_angle, angle, 'right')].append(i)
- solution_list.append((i, initial_angle, angle, 'Right'))
- #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)))
- #if Solution_Found == False:
- #print("No solutions were found for this initial angle.")
- ##### Now sort and then write to file
- solution_list.sort(key=sortFirst)
- for entry in solution_list:
- 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])))
- print("Done.")
- ###############
- #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]
- #oceanside
- #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]
- #graveyard
- #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]
- #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]
- #initial_angle_list = [0x4bc3,0x8bc3,0xcbc3,0x34fe,0x74f3,0xb4fe,0x2bcc,0x6bcc,0xabcc,0x1c48,0x5c48,0x9c48,0x1075,0x5075,0x9075]
- #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]
- ###############################################################################
- # 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
- #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]
- # Angles from camera manip things in oceanside:
- #initial_angle_list = [0x926E, 0x526E, 0x5285, 0x3FCD, 0x7FCD, 0x2008, 0x5FC9, 0x1FC2, 0x1F88, 0x5F88, 0x5F7C, 0x1FC9, 0x5FC9, 0x9FC9, 0xDFC9, 0x5FC2, 0x1FC2, 0x9FC2, 0xDFC2, 0x1F88, 0x5F88, 0x9F88, 0xDF88]
- # Angles you get from walls in Room 4 of Oceanside (work in timestop) AND 4 cardinal direction 0xC001, 0x4001, 0x0001, 0x8001
- ######initial_angle_list = [0xC001, 0x4001, 0x0001, 0x8001, 0x0000, 0xC000, 0xEDB8, 0xB13E, 0xE000, 0x0D87, 0xD109, 0x2DB8, 0xF20D, 0x2000, 0x4F3E, 0x1078, 0x4000, 0x6DB8, 0x313E, 0x6000, 0x8D87, 0x5109, 0x8000, 0xADB8, 0x720D, 0xA000, 0xCF3E, 0x9078]
- 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]
- def find_goal_collision_angles(value_string):
- # if seahorse, then value_string = '0x24', for example
- """
- This function gives us the goal collision angles for a given item that needs
- the 0x40 bit to be 0
- """
- if len(value_string) != 4 or value_string[0] != '0':
- print('invalid input into find_goal_collision_angles() function')
- seahorse_list = []
- for i in range(256):
- string = hex(i)
- if len(string) == 3:
- new_string = '0x0' + string[2]
- elif len(string) == 4:
- new_string = string
- else:
- print("ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!???????????????????????????")
- collision_value = value_string + new_string[2:4]
- if len(collision_value) != 6:
- print(collision_value)
- # If the 0x40 bit is 0, then add the value:
- 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':
- seahorse_list.append(int(collision_value, 16))
- #seahorse_list.append(collision_value)
- if len(seahorse_list) != 128:
- print("??????????????")
- return seahorse_list
- #################### NEW FOR 0x20 bit
- def find_goal_collision_angles_20_bit(value_string):
- # if seahorse, then value_string = '0x24', for example
- """
- This function gives us the goal collision angles for a given item that needs
- the 0x40 bit to be 0
- """
- if len(value_string) != 4 or value_string[0] != '0':
- print('invalid input into find_goal_collision_angles() function')
- seahorse_list = []
- for i in range(256):
- string = hex(i)
- if len(string) == 3:
- new_string = '0x0' + string[2]
- elif len(string) == 4:
- new_string = string
- else:
- print("ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!???????????????????????????")
- collision_value = value_string + new_string[2:4]
- if len(collision_value) != 6:
- print(collision_value)
- # If the 0x20 bit is 0, then add the value:
- if collision_value[4] != '2' and collision_value[4] != '3' and collision_value[4] != '6' and collision_value[4] != '7' and collision_value[4] != 'a' and collision_value[4] != 'b' and collision_value[4] != 'e' and collision_value[4] != 'f':
- seahorse_list.append(int(collision_value, 16))
- #seahorse_list.append(collision_value)
- if len(seahorse_list) != 128:
- print("??????????????")
- return seahorse_list
- #####################################
- def find_valid_goal_angles(goal_collision_angle_list, normal_vector_angle_list):
- """
- a normal vector angle is the angle you get by targeting a given wall
- This function takes a list of normal vector angles and a list of goal collision
- angles and returns a list of all in the form (goal_angle, normal_angle, goal_collision_angle)
- where goal_angle is an angle that can be used to collide into a wall with a normal vector angle
- of normal_angle to get a collision angle of goal_collision_angle
- """
- valid_goal_angle_list = []
- for normal_vector_angle in normal_vector_angle_list:
- for i in range(65536):
- angle_diff = abs(normal_vector_angle - i)
- if angle_diff > 0x8000:
- collision_angle = abs(0x10000 - angle_diff )
- elif angle_diff <= 0x8000 and angle_diff >= 0:
- collision_angle = angle_diff
- else:
- print("UHHHHHHHH??????")
- if collision_angle in goal_collision_angle_list:
- valid_goal_angle_list.append((i, normal_vector_angle, collision_angle))
- return valid_goal_angle_list
- def find_ranked_collision_solutions(initial_angle_list, goal_angle_list, filename):
- """
- The idea is to have goal_angle_list = find_valid_goal_angles(find_goal_collision_angles('0x24'), oceanside_room4_normal_vector_angle_list)
- if doing seahorse (item 0x24)
- """
- #solution_dict = {}
- solution_list = []
- with open(filename, "a") as file:
- for initial_angle in initial_angle_list:
- print(hex(initial_angle))
- if initial_angle > 65535 or initial_angle < 0 or isinstance(initial_angle, int) == False:
- print('Error: The initial angle is not a valid input')
- #Solution_Found = False
- for i in range(8192):
- for entry in goal_angle_list:
- angle = entry[0]
- normal_vector_angle = entry[1]
- collision_angle = entry[2]
- #if (initial_angle, angle) not in solution_dict:
- # solution_dict[(initial_angle, angle, 'left')] = []
- # solution_dict[(initial_angle, angle, 'right')] = []
- if (initial_angle + i*1800)%65536 == angle:
- #Solution_Found = True
- #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)))
- #solution_dict[(initial_angle, angle, 'left')].append(i)
- solution_list.append((i, initial_angle, angle, 'Left', normal_vector_angle, collision_angle))
- #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)))
- if (initial_angle - i*1800)%65536 == angle:
- #Solution_Found = True
- #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)))
- #solution_dict[(initial_angle, angle, 'right')].append(i)
- solution_list.append((i, initial_angle, angle, 'Right', normal_vector_angle, collision_angle))
- #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)))
- #if Solution_Found == False:
- #print("No solutions were found for this initial angle.")
- ##### Now sort and then write to file
- solution_list.sort(key=sortFirst)
- for entry in solution_list:
- #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])))
- 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])))
- print("Done.")
- #goal_angle_list = find_goal_collision_angles('0x2E')
- ################################ USE FOR OCEANSIDE
- ###################goal_angle_list = find_valid_goal_angles(find_goal_collision_angles('0x54'), oceanside_room4_normal_vector_angle_list)
- bomber_normal_vector_angle_list = [0x0000, 0x4000, 0x8000, 0xC000]
- ########### USE FOR BOMBER'S
- goal_angle_list = find_valid_goal_angles(find_goal_collision_angles('0x66'), bomber_normal_vector_angle_list)
- #goal_angle_list = find_valid_goal_angles(find_goal_collision_angles_20_bit('0x73'), bomber_normal_vector_angle_list)
- save_path = "C:\\Users\\xyzabc\\Documents\\Bizhawk RAM Watch\\scripts\\"
- name_of_file = "angle output"
- complete_name = save_path + name_of_file + ".txt"
- #####initial_angle_list = [0xD6B4]
- #####
- """
- for angle in initial_angle_list:
- find_solutions(angle, goal_angle_list, complete_name)
- """
- #####
- #find_ranked_solutions(initial_angle_list, goal_angle_list, complete_name)
- #initial_angle_list = [0x0AB4, 0x354F, 0x8AB3, 0xCAB2]
- initial_angle_list = [0x3880, 0x0000, 0x4000, 0x8000, 0xC000, 0x788E, 0xF88E, 0xB88E, 0x388E, 0x2DCD]
- #initial_angle_list = [0x7C4F]
- find_ranked_collision_solutions(initial_angle_list, goal_angle_list, complete_name)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement