def analyse_event_list(analyser, input, address, name, reference = InsReference(FE6_ELIST_INS_REFERENCE_ADDR)): """ Analysis handler for event lists ("main codes"). """ ea = EvListAnalyser(reference, analyser, input, address, name) while not ea.ended: ea.analyse_next() return anal.AnalysedObject( address, ea.address - address, ANAL_KEY_EVLIST, anal.read_data_at(input, address, ea.address - address), name)
def analyse_scene(analyser, input, address, name, reference = InsReference(FE6_SCENE_INS_REFERENCE_ADDR)): """ Analysis handler for scenes. Encapsulates a SceneAnalyser doing its thing. """ sa = SceneAnalyser(reference, analyser, input, address, name) while not sa.ended: sa.analyse_next() return anal.AnalysedObject( address, sa.address - address, ANAL_KEY_SCENE, anal.read_data_at(input, address, sa.address - address), name)
def analyse_items(analyser, input, address, name): """ Analysis handler for shop item lists. """ input.seek(anal.addr_to_offset(address)) start = address while True: item = anal.read_int(input, 2) address = address + 2 if item == 0: break return anal.AnalysedObject( start, address - start, ANAL_KEY_ITEMS, anal.read_data_at(input, start, address - start), name)
def analyse_units(analyser, input, address, name): """ Analysis handler for unit groups. """ start = address while True: input.seek(anal.addr_to_offset(address)) charId = anal.read_int(input, 1) address = address + 0x10 if charId == 0: break return anal.AnalysedObject( start, address - start, ANAL_KEY_UNITS, anal.read_data_at(input, start, address - start), name)
def analyse_chapter_events(analyser, input, address, name): """ Analysis handler for chapter events root ("pointer arrays"). """ input.seek(anal.addr_to_offset(address)) analyser.enqueue_analysis(anal.read_int(input, 4), ANAL_KEY_EVLIST, name + ".turn") # turn events analyser.enqueue_analysis(anal.read_int(input, 4), ANAL_KEY_EVLIST, name + ".char") # character events analyser.enqueue_analysis(anal.read_int(input, 4), ANAL_KEY_EVLIST, name + ".loca") # location events analyser.enqueue_analysis(anal.read_int(input, 4), ANAL_KEY_EVLIST, name + ".action") # misc events analyser.enqueue_analysis(anal.read_int(input, 4), ANAL_KEY_UNITS, name + ".blue") # initial blue units analyser.enqueue_analysis(anal.read_int(input, 4), ANAL_KEY_UNITS, name + ".red") # initial red units analyser.enqueue_analysis(anal.read_int(input, 4), ANAL_KEY_SCENE, name + ".ending") # ending scene return anal.AnalysedObject( address, 0x1C, ANAL_KEY_PTRLIST, anal.read_data_at(input, address, 0x1C), name)
def analyse_moma(analyser, input, address, name): """ Analysis handler for movement scripts ("MOMAs"). """ input.seek(anal.addr_to_offset(address)) start = address while True: cmd = anal.read_int(input, 1, True) address = address + 1 if (cmd == 12): anal.read_int(input, 1) # void speed address = address + 1 elif (cmd == -1) | (cmd == 4): break return anal.AnalysedObject( start, address - start, ANAL_KEY_MOMA, anal.read_data_at(input, start, address - start), name)