Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Offset Organizer
- # Written by Full Metal
- # Feel free to modify
- # And redistribute.
- import bottle
- import json
- def safe_insert(l,i):
- if i not in l:
- l.append(i)
- return len(l)-1
- else:
- for index,obj in enumerate(l):
- if obj==i:return index
- return -1
- class Collection:
- store_name="offsets.json"
- def __init__(self):
- try:
- self.data=json.load(open(self.store_name))
- except:
- self.data={'roms':[],'offsets':[]}
- def __enter__(self):return self
- def __exit__(self, type, value, traceback):
- json.dump(self.data,open(self.store_name,'w+'))
- def add_offset(self,offset,name,rom,length=4,type="pointer",desc=None,tags=None):
- if isinstance(rom,str):
- rom=rom.lower()
- for i,obj in enumerate(self.data['roms']):
- if rom in obj['name'].lower():rom=i
- self.data['offsets'].append({'rom':rom,'name':name,'desc':desc,'offset':offset,'type':type,'length':length,'tags':[a.lower() for a in tags] or []})
- def add_rom(self,name,desc,shortname=None,tags=None):
- self.data['roms'].append({'name':name,'desc':desc,'shortname':shortname,'tags':[a.lower() for a in tags] or []})
- def get_roms(self):
- for rom in self.data['roms']:
- yield rom
- def get_offsets(self):
- for offset in self.data['offsets']:
- obj=offset.copy()
- rom=self.data['roms'][obj['rom']]
- obj['rom']=rom['name']
- obj['tags'].extend(rom['tags'])
- yield obj
- def search_for_offsets(self,tags):
- tags=list(set([a.lower() for a in tags]))#Remove duplicate search terms.
- results=[]
- for offset in self.get_offsets():
- num_matches=len([a for a in tags if a in offset['tags']])
- if num_matches>0:
- results.append({'strength':num_matches,'type':'offset','object':offset})
- return sorted(results,reverse=True,key=lambda obj:obj['strength'])
- def search_for_roms(self,tags):
- tags=list(set([a.lower() for a in tags]))#Remove duplicate search terms.
- results=[]
- for rom in self.get_roms():
- num_matches=len([a for a in tags if a in rom['tags']])
- if num_matches>0:
- results.append({'strength':num_matches,'type':'rom','object':rom})
- return sorted(results,reverse=True,key=lambda obj:obj['strength'])
- def search_all(self,tags):
- res = []
- res.extend(self.search_for_roms(tags))
- res.extend(self.search_for_offsets(tags))
- res=sorted(res,reverse=True,key=lambda obj:obj['strength'])
- for r in res:print("Strength:",r['strength'],"type:",r['type'])
- return res
- def get_number(cmd_prompt="#> "):
- base_prefix={'0x':16,'&h':16,'&b':2,'&o':8,'&d':10}
- while True:
- try:
- r=input(cmd_prompt)
- if r[:2] in base_prefix.keys():return int(r[2:],base_prefix[r[:2]])
- return int(r)
- except:continue
- if __name__=="__main__":
- quit_words=['exit','quit','cancel','stop']
- with Collection() as collection:
- cmd=None
- while True:
- cmd=input("> ").lower().split(' ') # Get each word.
- if 'new' in cmd:
- if len(cmd)<2:
- cmd.extend(input("New what? > ").lower().split(' '))
- if 'rom' in cmd[0]:
- con=True
- while con:
- collection.add_rom(input("Name > "),input("Description > "))
- con=input("Quit, or continue?").lower().split(' ')[0] not in quit_words
- if 'offset' in cmd[0]:
- con=True
- while con:
- collection.add_offset(get_number("offset> "),input("Name> "),input("ROM> "))
- con=input("Quit, or continue?").lower().split(' ')[0] not in quit_words
- elif 'search' in cmd[0]:
- if len(cmd)<2:
- cmd.extend(input("Search for what? > ").lower().split(' '))
- for result in collection.search_all(cmd[1:]):
- if result['type']=='rom':
- obj=result['object']
- desc=obj['desc'] if obj['desc'] else "No description available."
- print("ROM : {: >10}|{: >40}".format(obj['name'][:10],desc[:40]))
- elif result['type']=='offset':
- obj=result['object']
- desc=obj['desc'] if obj['desc'] else "No description available."
- print("Offset: {: >10}|{: >40} |{: >10}".format(obj['name'][:10],desc[:40],obj['rom'][:10]))
- elif 'tag' in cmd[0]:
- if len(cmd)<2:
- cmd.extend([a.lower for a in input("Tag what? > ").split(' ') if len(a)>0])
- if 'roms' in cmd:
- con=True
- while con:con=False
- if 'offsets' in cmd:
- con=True
- while con:con=False
- elif 'list' in cmd[0]:
- if len(cmd)<2:cmd.extend(input("List what? > ").lower().split(' '))
- if 'roms' in cmd:
- for rom in collection.get_roms():
- print("{}:\t{}".format(rom['name'],rom['desc']))
- if 'offsets' in cmd:
- print("{: ^15}|{: >15}|{: >10}|{: >10}| {: >6}|".format("Name","ROM","Location","Type","Length"))
- for offset in collection.get_offsets():
- print("{: ^15}|{: >15}|0x{:0>8X}|{: >10}| {: ^6}|".format(offset['name'][:15],offset['rom'][:15],offset['offset'],offset['type'],offset['length']))
- if len([w for w in cmd if w in quit_words])>0:
- break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement