| 1 | #!/usr/bin/python |
| 2 | '''* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| 3 | * Mupen64plus - code_convert.c * |
| 4 | * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ * |
| 5 | * Copyright (C) 2010 Rhett Osborne * |
| 6 | * * |
| 7 | * This program is free software; you can redistribute it and/or modify * |
| 8 | * it under the terms of the GNU General Public License as published by * |
| 9 | * the Free Software Foundation; either version 2 of the License, or * |
| 10 | * (at your option) any later version. * |
| 11 | * * |
| 12 | * This program is distributed in the hope that it will be useful, * |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
| 15 | * GNU General Public License for more details. * |
| 16 | * * |
| 17 | * You should have received a copy of the GNU General Public License * |
| 18 | * along with this program; if not, write to the * |
| 19 | * Free Software Foundation, Inc., * |
| 20 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * |
| 21 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| 22 | |
| 23 | Usage: |
| 24 | |
| 25 | python code_convert.py > ../data/mupencheat.txt < ../data/mupen64plus.cht |
| 26 | |
| 27 | ''' |
| 28 | |
| 29 | from sys import stdin |
| 30 | |
| 31 | class cheat: |
| 32 | def __init__(self): |
| 33 | self.n="" |
| 34 | self.d="" |
| 35 | self.c=[] |
| 36 | self.v=0 |
| 37 | self.hb='00' |
| 38 | def add(self, l): |
| 39 | if(self.n == ""): |
| 40 | return |
| 41 | l.append(" cn %s"%(self.n)) |
| 42 | if(self.d != ""): l.append(" cd %s"%(self.d)) |
| 43 | for code in self.c: |
| 44 | l.append(" "+code) |
| 45 | def clear(self): |
| 46 | self.n="" |
| 47 | self.d="" |
| 48 | self.c=[] |
| 49 | self.v=0 |
| 50 | |
| 51 | |
| 52 | l=[] |
| 53 | cCount=0 |
| 54 | _cs = [] |
| 55 | for i in range(225): |
| 56 | _cs.append(cheat()) |
| 57 | cs = _cs[:] |
| 58 | |
| 59 | def print_l(): |
| 60 | global l, cs |
| 61 | for cheat in cs: |
| 62 | cheat.add(l) |
| 63 | for line in l: |
| 64 | print line.replace("\x00", "") |
| 65 | l=[] |
| 66 | cCount=0 |
| 67 | for i in range(225): |
| 68 | cs[i].clear() |
| 69 | |
| 70 | lines = stdin.read().split("\n") |
| 71 | |
| 72 | for line in lines: |
| 73 | if len(line) < 2: continue |
| 74 | elif(line[:2] == "//" and line != "//----" and line != "//---" ): |
| 75 | l.append(line) |
| 76 | elif len(line) < 4: continue |
| 77 | elif(line[0] == '[' and line[-1] == ']' and len(line) > 23): |
| 78 | print_l() |
| 79 | l.append("\ncrc %s" % line[1:-1]) |
| 80 | elif(line[:5] == "Name="): |
| 81 | l.append("gn %s" % (line[5:])) |
| 82 | elif(line[:5] == "Cheat"): |
| 83 | t = line[5:].split('=')[0] |
| 84 | if (len(t)>1 and t[-2] == '_'): |
| 85 | n = int(t[:-2]) |
| 86 | if(t[-1] == 'N'): |
| 87 | cs[n].d = line.split("=")[1] |
| 88 | else: |
| 89 | for option in line.split("=")[1].split("$")[1:]: |
| 90 | if(len(option) < 4): |
| 91 | break; |
| 92 | if(option[-1]==','): end =-1 |
| 93 | else: end = None |
| 94 | if(option[2] == " "): |
| 95 | cs[n].c[cs[n].v] += "%s%s:\"%s\""%(cs[n].hb,option[:2],option[3:end].replace("\"", "\\\"")) |
| 96 | else: |
| 97 | cs[n].c[cs[n].v] += "%s:\"%s\""%(option[:4],option[5:end].replace("\"", "\\\"")) |
| 98 | cs[n].c[cs[n].v]+=',' |
| 99 | cs[n].c[cs[n].v] = cs[n].c[cs[n].v][:-1] |
| 100 | else: |
| 101 | n = int(t) |
| 102 | cn = line.split('"') |
| 103 | cs[n].c = cn[2][1:].split(',') |
| 104 | cs[n].n = cn[1]; |
| 105 | i=0 |
| 106 | for cheat in cs[n].c: |
| 107 | if(cheat[-1] == '?'): |
| 108 | if(cheat[-2:] == '??' and cheat[-4:-2] != '??'): |
| 109 | cs[n].hb = cheat[-4:-2] |
| 110 | else: |
| 111 | cs[n].hb = '00' |
| 112 | cs[n].c[i] = cheat[:9] + "???? "; |
| 113 | cs[n].v=i |
| 114 | i+=1 |
| 115 | if(n > cCount): |
| 116 | cCount = n |
| 117 | elif(line != "//----" and line != "//---" ): |
| 118 | l.append("//%s" %line) |