From 7de3708efae39bafdd8786287f59e7157b29f1ea Mon Sep 17 00:00:00 2001 From: Michael Taboada Date: Tue, 6 Aug 2024 09:41:40 -0700 Subject: [PATCH] Hopefully made this python3 compatible.. Need exhaustive tessting. --- image_util.py | 38 ++++++++++++++++++------------------- image_util.pyc | Bin 25332 -> 0 bytes test.py | 50 ++++++++++++++++++++++++------------------------- test.pyc | Bin 78062 -> 0 bytes test_serve.py | 9 +++++---- 5 files changed, 49 insertions(+), 48 deletions(-) delete mode 100644 image_util.pyc delete mode 100644 test.pyc diff --git a/image_util.py b/image_util.py index 16dbc38..38bd689 100644 --- a/image_util.py +++ b/image_util.py @@ -1,4 +1,4 @@ -from io import StringIO +from io import BytesIO import io import base64 import colorsys @@ -43,7 +43,7 @@ def image_to_binary(image, crush=False): if output == 1: print("failed to crush") s=bson.binary.Binary(open(outfile).read()) - print(time.time()-t_time) + print((time.time()-t_time)) return s else: output = StringIO.StringIO() @@ -69,7 +69,7 @@ def load_image(image_data): image = Image.open(io.BytesIO(byte_data)) except: byte_data = image_data - image = Image.open(io.BytesIO(byte_data)) + image = Image.open(io.BytesIO(base64.b64decode(byte_data, validate=True))) image = image.convert("RGBA") return image @@ -87,9 +87,9 @@ def image_to_bmp_string(img): return base64.b64encode(string) def image_to_string_format(img,format_type, conv="RGB"): - output = StringIO.StringIO() + output = BytesIO() img.convert(conv).save(output, format=format_type) - string = output.getvalue() + string = output.getbuffer() return base64.b64encode(string) def color_byte_to_hex(byte_color): @@ -147,7 +147,7 @@ def rectify_sub(image): # _ # | curr_pixel = BLACK - for i in reversed(range(w)): + for i in reversed(list(range(w))): if i == w-1: continue for j in range(h): @@ -164,7 +164,7 @@ def rectify_sub(image): # # |_ curr_pixel = BLACK - for j in reversed(range(h)): + for j in reversed(list(range(h))): if j == h-1: continue for i in range(w): @@ -181,10 +181,10 @@ def rectify_sub(image): # # curr_pixel = BLACK - for j in reversed(range(h)): + for j in reversed(list(range(h))): if j == h-1: continue - for i in reversed(range(w)): + for i in reversed(list(range(w))): last_pixel = curr_pixel curr_pixel = image.getpixel((i,j)) @@ -258,7 +258,7 @@ def segfill(image, mark_color, target_color): last_red = False - for entry in new_h_range.keys(): + for entry in list(new_h_range.keys()): if entry > 0: new_h_range[entry-1] = 1 new_h_range = sorted(new_h_range.keys()) @@ -348,7 +348,7 @@ def floodfill2(image, center, bg_color): last_marked = [[0,i] for i in range(h)]#center] last_marked2 = list() rounds = 0 - print(time.time()-t) + print((time.time()-t)) a = 0 b = 0 while last_marked: @@ -367,10 +367,10 @@ def floodfill2(image, center, bg_color): ########## #print([chr(x) for x in bytes_array]) - print(time.time()-t) + print((time.time()-t)) print([a,b]) image_out = Image.frombytes(mode, (w,h),"".join([chr(x) for x in bytes_array])) - print(time.time()-t) + print((time.time()-t)) image_out.show() @@ -472,7 +472,7 @@ def reduce_to_multi_color(img, bg, colors_map, threshold): else: tc, tc_map = entry, entry - if isinstance(tc, basestring): + if isinstance(tc, str): tc = color_hex_to_byte(tc) rr = r-tc[0] @@ -601,7 +601,7 @@ def fix_bounding_box(img, bounding_box): w = img.width h = img.height for key in bounding_box: - if isinstance(bounding_box[key], basestring): + if isinstance(bounding_box[key], str): bounding_box[key] = int(bounding_box[key]) if 'w' in bounding_box: if bounding_box['x'] < 0: @@ -718,7 +718,7 @@ def tint_image(image, color, border=2): def black_expand(image, mark_color, target_colors): w = image.width h = image.height - if isinstance(target_colors, basestring): + if isinstance(target_colors, str): target_colors = [target_colors] mark_color = tuple(color_hex_to_byte(mark_color)[0:3]) @@ -755,7 +755,7 @@ def black_expand(image, mark_color, target_colors): if j < h-1 and image.getpixel((i, j+1)) in target_colors: image.putpixel((i,j+1), mark_color) break - print("Black expand took: "+str(time.time()-t_time)) + print(("Black expand took: "+str(time.time()-t_time))) return image def expand_vertical(img, bg_color, target_color): @@ -800,7 +800,7 @@ def expand_vertical(img, bg_color, target_color): upset[j] = 1 for key in upset: image.putpixel((i, key), target) - print("vert expand ", time.time()-t_time) + print(("vert expand ", time.time()-t_time)) return image def expand_horizontal(img, bg_color, target_color): @@ -848,7 +848,7 @@ def expand_horizontal(img, bg_color, target_color): upset[i] = 1 for key in upset: image.putpixel((key, j), target) - print("horizontal expand ", time.time()-t_time) + print(("horizontal expand ", time.time()-t_time)) return image diff --git a/image_util.pyc b/image_util.pyc deleted file mode 100644 index e98cf05263bf6707e7f7ca433b95e2a787aab6f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25332 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 diff --git a/test.py b/test.py index 1f7e0cc..f793488 100644 --- a/test.py +++ b/test.py @@ -502,7 +502,7 @@ def main(): plud = {"person_box": person_box, "person_dict": {}} for i, key in enumerate(person_tiles): - print("p", i,key) + print(("p", i,key)) if pmap[i] >= 0: cropped_pic = person_dict[key] plud['person_dict'][cropped_pic] = { @@ -513,7 +513,7 @@ def main(): } for i, key in enumerate(fail_person_tiles): - print("pp", i,key) + print(("pp", i,key)) if pmapf[i] >= 0: cropped_pic = fail_person_dict[key] plud['person_dict'][cropped_pic] = { @@ -537,7 +537,7 @@ def main(): t = time.time() k, map_data = ParseScreenObstructions.parse_screen(im, tile_info, lud, plud, partial_center=True) - print(time.time()-t) + print((time.time()-t)) import pdb pdb.set_trace() @@ -608,7 +608,7 @@ class PathFinder: path.append((py,px, vy,vx)) py-=vy px-=vx - print("path", path[-1]) + print(("path", path[-1])) path = path[::-1] return path @@ -669,8 +669,8 @@ class PackageOutput: spec = " ".join(sp[:i]) break if spec not in " ".join(mem): - print("spec", spec) - print(" ".join(mem).split()) + print(("spec", spec)) + print((" ".join(mem).split())) specials[spec] = 1 else: sp = entry.split(" ") @@ -684,7 +684,7 @@ class PackageOutput: if not output: output.append("None") if specials: - print("____++", mem) + print(("____++", mem)) output.append("special,") for key in specials: output.append(key+",") @@ -803,7 +803,7 @@ class PackageOutput: if state_dict.get("paused") == 1: if self.pause_mode['active'] is True: output = list() - print(self.pause_mode) + print((self.pause_mode)) if self.pause_mode['active'] is False and clicked.get('start'): self.pause_mode['active'] = True self.pause_mode['goal'] = "menu" @@ -820,7 +820,7 @@ class PackageOutput: elif self.pause_mode['active'] and state_dict.get("start") and self.pause_mode['goal'] != "menu": pass elif self.pause_mode['active'] and not state_dict.get("start") and self.pause_mode['goal'] != "menu": - print(self.pause_mode['goal']) + print((self.pause_mode['goal'])) press_output = ["unpause"] elif self.pause_mode['active'] and self.pause_mode['total'] > 0: if state_dict.get("a"):#clicked.get("a"): @@ -860,7 +860,7 @@ class PackageOutput: break if path_data and x is not None and y is not None: path = PathFinder.find_path(path_data, 6-y,7+x) - print("X Y ",x,y,target, num, goal) + print(("X Y ",x,y,target, num, goal)) if path: vy = -1*path[0][2] vx = path[0][3] @@ -873,7 +873,7 @@ class PackageOutput: press_output.append("left") elif vx > 0: press_output.append("right") - print("AAAA ", map_data['tiles'][6-vy][7+vx]['type'], target) + print(("AAAA ", map_data['tiles'][6-vy][7+vx]['type'], target)) if map_data['tiles'][6-vy][7+vx]['type'] == target.replace(",", "").strip(): press_output.append("a") output = list() @@ -915,7 +915,7 @@ def main_b(): t = time.time() k, map_data = ParseScreenObstructions.parse_screen(im, tile_info, lud, plud, partial_center=True) - print( time.time()-t) + print(( time.time()-t)) import pdb pdb.set_trace() @@ -924,9 +924,9 @@ def main_c(): for i in range(10): im = Image.open("maps_"+str(2+i)+".png") t = time.time() - print ("--", po.memory) - print (po.run(im)) - print (time.time()-t) + print(("--", po.memory)) + print((po.run(im))) + print((time.time()-t)) import pdb pdb.set_trace() @@ -1052,7 +1052,7 @@ class ParseScreenObstructions: east_obs = i-8; for j, doc in enumerate(results['vertical']): - if doc and j != 6 and doc['obs']%2 == 1: + if doc and j != 6 and doc['obs']%2 == 1: if j < 6: north_obs = 5-j; if j > 6 and south_obs == None: @@ -1165,11 +1165,11 @@ class ParseScreenText: ch = seen[k] im.paste(load_image(ch), (c*8, 0)) - kk = found_tiles.keys() + kk = list(found_tiles.keys()) stra = [x for x in " >>ABCDEFGHIJ KLMNOPQRSTUVWXYZ',.123456789abcdefghijklmnopqrstuvwxyz-"] stra.extend(["..", "!", "?", " "," "," "," "," "," "," "," ",">",">"," "," ", "Mail", "Rod", " ", "Sword", " ", " "," "," "," "," "," ","Nunchucks", " ", " ","Hammer", " ", " ", " ", "Level", "/", "Weapon", " ", " ", " ", " ", "Status", " ", " ", " ", " ", " ", " ", ">", ">", " ", "E", ">", ">", "Fight", " ", " ", " "," ", " ", "Magic", " ", " ", " ", "Drink", " ", " ", " "]) output_dict = OrderedDict() - kk2 = [seen[x] for x in seen.keys()] + kk2 = [seen[x] for x in list(seen.keys())] for i, ch in enumerate(kk2): subi = load_image(ch) new_subi = reduce_to_colors(subi.convert("P", palette=Image.ADAPTIVE), ["FFFFFF"], 32) @@ -1267,7 +1267,7 @@ class TileTools: return ress[0][0:2] def to_image_key(img): - if isinstance(img, basestring): + if isinstance(img, str): img = load_image(img) key = image_to_string_format(img, "BMP") return key @@ -1314,11 +1314,11 @@ class ScreenSelector: #images have different bmp headers sometimes, so reformat them here. new_dict = dict() - for key, val in cls.luds['plud']['person_dict'].items(): + for key, val in list(cls.luds['plud']['person_dict'].items()): new_dict[image_to_string_format(load_image(key),"BMP")] = val cls.luds['plud']['person_dict'] = new_dict new_dict = dict() - for key, val in cls.luds['lud'].items(): + for key, val in list(cls.luds['lud'].items()): new_dict[image_to_string_format(load_image(key), "BMP")] = val cls.luds['lud'] = new_dict @@ -2159,9 +2159,9 @@ def main2(): im = load_image(image['image_data']) t = time.time() tex = ParseScreenText.parse_screen(im, f) - print (time.time()-t) + print((time.time()-t)) for coord, line in tex: - print(coord, line) + print((coord, line)) if tex: import pdb pdb.set_trace() @@ -2351,8 +2351,8 @@ def test_person(): po = PackageOutput("ff1_data.lud", "enemy_lookup.dat") import pdb pdb.set_trace() - print ("--", po.memory) - print (po.run(im, {"paused": 1})) + print(("--", po.memory)) + print((po.run(im, {"paused": 1}))) if __name__=='__main__': diff --git a/test.pyc b/test.pyc deleted file mode 100644 index 95d0a058809aebe89ff995eab25df3991d3a501e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78062 zcmeFa33z1LRVH{}NU4-ErQEZW%B517m06Wls!FY?r7CTgq|m-UNg0wTSq{aE2!#}i z?S-U}kh(pTZEUcOVY+Q&7PA;^z<_NqUZBAX;A(6zThlYZ&~*3ExIaAoO~cU4eC@B9 z|3Bx&Q%IRvFM%UE;=Ofq2B%gjQVSuZyW_^SQ(W1T5EL0Zl zRkUxPDmssug<~d^I%+J-N?B%(xghp&vvAyOpA)EZldLxDHD;m4Scf2wnB)nwe$p(Q zH0!6#!YQ+U+AN$l*7ju+J!V$V7^lL#2=vdI=vlLR&Mcfikk?W37GoA3F;1n4A>S%G zUo>WZq1HIZBedtEfnNddoPoKs@CY@E{qbjAm|Vw|($bk;4Us&Q&1g?i&$kgz&G?3!^dO4xPdToTJ;#c)<*`yysnfTvqHPm@kAJt&z9xSh#zfAE=Auq85y{_T^XHGi7+Mdxj9p_^joB*`i^V>QZkZ35)iN}- zwWk2(EcaeHi$lv1Q}_{+N8coj2`+x0*{d+S<;E#DyA|eK-QLj>mvh9_*6mf6`c%-T z%IpFR*&Q`?tlnQUy8wdwi0=jn+!en2h*?FH0Q0Fw##Xl1?5ZEU5xL651tSK8STOhj zV?fejnOzB;zQuYT&$H1c^G9K3!pUepA59o|C0I)dh9v?t@MmtZvGV0G*3(W@qD0cE z&1f!fOUpC8?qK)i%+S3)X=gOIm!`x@CfvOAgj_g55%?Bc2X&8Z z*9A(Nv3cLxVzZM8<{3#a72R6Oh&v%>PRzKN%eMe)#BiU2t#Kv29&KC>=W^SPJ9(hu zCd2t?V=UIZ6fK0;Gs$RUKI-OgXSVY-0MA7;$uN48;BW~Z?nM~JseX}cFGhQv>cB~IZ%{JvsPhpwRg$nPncB{_L4X+o88N16;+7|4#{6K ztAb?=lV}xJOU%7iDTD`f#vFvGHLIwtOJ?_i*{$>NvFIpAZQuvrd9!xJvB69(K&%1jG&YF!IXarKS1)dX`jAz1|xJ_ zX2=9*E}1oD!gDtw5t*OX!x?wUEl1$(Oe&t>B8A~#j6KjJfU!g}nRqiiT#kIqJ*l`% zuX)TPF6LzMrCnyqSU8bfk{}64$6`wb-?oizfg}i=*oodcM+Y+=Pp6_be%Z8`eNr3i z(H!PIadEnuNvD%;{w%^`iIk(sNApWaoCq)urfe@)q7IjqF}xX-vS1yS-$W`ezsYDy zmjyy&g0@)*n+}P`^2hi@GTAB+7{on=(g75#&SX|4l3rgFIm;d zAj4%xNhS9gxLuIjSbZw2ia-@stg1j=pxU~G^{d8uJW%8PR#$Z?$#W zstg=K%nSH`$vTG6Cj-Zggt3p$Nxv*TMfU{R!!Lj>lQnl^uwj4RCqnQv?R5? zv;?|gBS|OM??^K2y6e&WO4_l<;odLwYgw#q_K~OY=dz9~tO!igjlUPLi1y;wtw(3b zV;PkNV-I%AtO|jL0Sm$ivw1sbC^#?~m6^IdSzItv*MTf#M4_Q*5%NEdDX-kbWl=`M zy{PN5T8^4Rkdsev@vZ^QcOWNBC4NrmO3VzTA9KdySs}|`mCQof3|3Gib3~Ilb}*S^ zFPF^G(qukmLckL92_|f06I{f~hvgV6Ev8tV=VjWf#eB<2{*3{XEw`}Z>okwGoygUE z3w5WJf)(SqtlNK5EJ+QCOHc@?<95=sWu_gIE(vd0Be1T-*;rO^@xx{h>pE)dq+eU7 z1V60V_-bSU!b*n)utpX@0tQSSTT9kRT28Vcw45qhPSX-E7Xn}~fRwQO(8Lz+xO`{C zi5(V-fQI@C^Wnw^3#a=j3su8~Rg$x^pW+wFpEIji6+sXo1a*$x=6UmCnT3_!!JZJy z3RXz$_OQFdz79J&?BK9t!w#+9IMk*qj8#y(`=j;>hs^n61%rZofo(=pEsNsR z>W4p^>Z35~MCc)>#)T(74OIXi3;^m6Q-S?N{2-04*}>EIhXtPMqcFZ*@L^@33N#3& zW}&G15#J~&EEPjF1wWlb&eEh15edGj_`!)!ou#qVj@czF@XN-Dh(+^t#2z(l68OUe zfFB*P;DgV%07gS&#)%iBC=ARMNzHev1#Rj_Pe^L3f+|9R1AGv=R?JAFXcNE$K(hF) z8>jSBfAvWj2Or>l%OM=Tb!XZ*nS)4v>uHvzkd?%>Zcz|ea>j9swe7b^sReC^6yT$# zACx!FhH+rRXVW-aVgd#hn8*nJY9fWR#pnpqP?!KH7-zfW+Y!6Q`u0~s%*VvfsMP0> z9XRX?wu*q_0OWnA+BIuE{A@FPdm>)5r9KjA!YagH_g`% z)kOYjG2i<`H5N=jzPSjdHSZ%(YC&8757KpE(RRmFpxNnoRPzu5r78S(W&aN2yeQvW zjN^Ygim#P>Y6sGbVZ?%8oHonzH7l(S3j4QkraOM2)2;kb%Xo z6ODrT>K(@UF5`T+bP{BZL7_drG|hjkb`33QisyN-{}|U{-6i? zplh9##MLZ?*)1u!B8*pm5qrhNwQp#Tg{j}6iuzvT_#eg*K7e7oV2*m3 zap(8CLzY9m)KBUV*aMx&P7&}!6=B~A%c1oBAQVa`8Q-VWf|*C1?-EOCB0fQ))$)DD z`5%kGrC^|zeSbe?w+Q*|#k%!_VA(B(`spAqlo1t+)ZqDw)r(|H6I8pVb_i`n{(iGG zx~8VhsuiNOp_CF#RG>ey?zbTEe(XR_kEZNL!&^`p_JO8sig)@2#cnpjRFMF9B3w(u;W9@+D7Vx38!y|1-bhj($5r@`!QEA%?Me1 zzhndw1r4Wr0gVoP{Py~QaqyL9_y5~pZ4ID$u|1S8{z3)L1@k!j1Jmz9(Nbre-09Q=mX9Ibh=bbUm4+wKSxcCDB9`J&L{3s8n^Ef#KlhKk>y+5nXewH76 z5LAc#HP8AcFL>^~t8$on6^#6Po>%VDc1_sHk1~n9>n4B2>|Qs{4+zjqbU(*$lf&81)*|b@8*)Yu_AQG1xG8+m94g4i z<+%L`vvrc)jyGg5FAZh1irYQ=Qix)2Clj1`Lt2AcX8DIG*R_21kS9MXGEF+n0p96 zO0V5#$U;?wzbXj7w{9}~-a33CgysIUju1c}$*w+TXr49aFn^t2!|Be~Bvj=ap1eqS zLzD2Bh;UdlFi7DBwDZ%&cD`+P@zt5#N6lRxJ%eE{{lUuG7Y_sCl-dtwETn^2+1ZQQ z^Fp9*_ZrE2-EG7HdXvfDkd~EGZup)@$>ac?q0Msmf)4UyX1B@gHWv@jTZrvmtC(%3 zu*nnc;9`nBo;5GH`9~AT2WejLe)N0-9eKA!&M;tUHM?#8Q8*lpI2XYWz9tzSpSY;G z0ZPK!O!gBO@r9VgBgXl0Hnc^D$ILIm?Y?qeCh#{~&O1`J%dfs{cfQ%Oz5CLAWqbFf z?7J_8c98_i_8~1B9DdmlfnSY$SQlV{b5TqNeG`<4eps6hS-{5kKk(=M4;jG@6QRBdO!Pw#EHJ^(f7s_|3IHDySP)T* zrl_iUUiNf{Odm0|C>m-9BrHe@7Byi308Au^523yZ<}Hp7@BtDZ!2C~BTa(iSn0i3) zKvN;rM9OF*%}6c26Qzb7pI>~fb2T*xCR!68Qd0{|A0@S~mk{=-XN?F8KGdF?u=xH8 zuK-9EPBl?p1%m~^Km(tjmv8ZloRR|(RE2(N=U&_>aTWqBGw_uL+L!siKanNsfji!1wP~~4f4vwWvRw>gk)M79Y~Ll*Ur~H)&#Mzar!z7?ip+N~u%rhfLoIi*H8? zYA;O+b{!yxJRj!7&?^l(#|*ueV6k&kqds*#L7TU@3xojwpwl~C0)1otZbjW zKyI2kjR#uC9Tk^0?x@hwxs~c-u64W5f|zc(i7!<64#{08%HU$YB=^rB$i1U9_mACF zid=FBt?UJQxvT2|x#u4@&KC|M@v)oPkKGJG{GEHxFJklXMTEop>#+X1TF=3H4mI^0 zrQ~;?GtO_o|AKLTQ&aj9g6>kx(s{`^|5A2puQR)^GppF_-7>3Bn%%o3KS^B|zDwk? zB6I{7cT425ev1N%So~2<+&2_uvmlt9f6A;rCHv{un>_YFDgpJJ2)Uv%zid#b7t2K& z`VD69`F;4^*P9CvI>s=%UnVE}gO7*cJ$>tUAt^VWzX0=&6YFw1Tbeqr~)UBb6t*D38axUS-qb>z$6Zz=6LR0l10@+-s@Gu8= z3#t*4X)YaE6R+GxBIUZ2WnPAc#9BQ>auX5Fnx0!LNUX$DB8#l8NbCZQoLj$ zmIa3hC6=X3Ya6HmR^(1XWxZx*iQ93lWCSr`MO=JTj5| zlVJx6Pm;e>qvuBHq?v%X#9s-oL+V=d-b&{jv4vBciKHNy#NZ)b;bgIAL<tSd|X>s%EEo5E^=tz1U+BP00 zxeXM;rK(FlnvAjwq9hv`_vAqzsauwYts=!*LkG35!$%{lsQS{9NVroSOcjUNOkk(M zV9_914}&-)q`QeMH#=&Ag3AeFkvKtvxhGE3pmcqLV%dpvG|tly1u$ySBslUDbu_4! zlc0i5;xY}211Bhxoe=%BYqSyBL@$jV8jsPqLE|Qk$7wu4gYw6TCuuxIqk#rRixZUP zPTZ!^NTZ2HGmRD+tu)$bQ1Cm^L8FsK7ma6WJV)a$jn~n5J&iZec%BA@wG)(C7BO|{ z6Fp;-QrY?KjCT1nx*h8j0{qh2kQQH3!Eq=Pbldd^5+#BR+reeu$SlP~p@8+jm0l00 zBwldbS*GB*z6)UyNC{d^!BAhDwdXXlN*jyP6ig29hu5xT*7WM#Dd3`&0Ywx zX5@xSON5h4k!T7fyA^%JTQxVBOd5VRdwZV1qR}=T!Ag{x!J;gwQ7n}b9mMsn$l=t_tnzbFLQ9BC4W z^=wOOI)egL!51yE1l_%e&P393Pr}>gV6@pQY>r`@l`9qCBw{gWq@ttSL_yL3-l`v} zdKw(eHpj8#IFrL7#3tCvVHp#zRZhJ0ayHhX1tN8vfc^sKp^|!;zyQr{MDhuA-CG>Y z(&|{Da(Qh7(nuV^PC8=G;Mbld5T`z0jRhd?zK`@l_}H961aE;xunl8kH)D?eo=p9mFuKio|W;MF$jg&{jVB*n2LkA{fe+Gf} zCu#g5VWnMlRH-@*r*6T)8(iwku2t$Q4L8D6KEPB2o9&GK{qz~74_6ATVu>ZH$*}I% z!-b`Yb^$0?iGGf_*ud)Ia9g!q#%5_8t?W%Ks!WXCEE9E_OC2o&2vsdMX$Cn7MR!Ph zCzDvWhY)TL!%)b?dW%|6BZ6E87M;Vi)UN$m0(1O&`7UJ=5&P5hojzF z^tatQ2`!-_RE6~j;2ClTu})Eo2(|`j2AvC>fkx3u=m9J7Dx|J0Xy(mGWR?J4}f0?nyMt;^Oq387Cd{?6n7CH$U+ zehqe^|9QBoEg685*h%$c#VS$K zuEX%?;XwI57*SEub})r-PSKEj;@Z)G~s85fnom zFb&Rn`aizr&q|$HKsq=82h-)!0sWsi?zSj1QKVmQ-l7WON5pxp=&YcA_;sLV{}7EI zrtv`!}{49;1qw(`J zK1So?G(G`CGWIrL*fwyoE7^`6+z#EhS>meqirWtRoq&pP7GvUEmN(_kGw(nn9Wn5K zN11uM1!mXwY@je6fI?U9R|0vt&jWgWg}=8%$NBGs+kz8$0Y>MjL(+A~s4n+uQ9_rD za1IV<_N`R1M>w*h_V_i6_MFcV zGd~bzysH^ubwd$|6&Oj(X$@=r`@L*y4`d79Vzvxmw(u&+mcH!v``O|Ofnv5^T9Pfm zw0u?oI58G722Ni2;42w<0n7+q#f&^(q<~n(@~K8$X2Gh4rpj(ee(5>aF2>x>4>-NH63tH$? z27maaZsXf={Xm6rpSv#%weWVi&V=_Gyn&S8H0o$t_7>x+0WB2P`;o5RuflQVkt|Ex z?0gk&p=kQUNjEBc6q_4Xn_E|jVsm3_e}izuGp)C5yxI#kNYQ~ZOE?Wk#O25~)^k?5 zb$=Z!Bk19Euy9{kX&tx^4Tks-s_2a@!!)SRhg1<~9{cZM!*ahIGkPJ4wOWc*a zQd>4JO?ml>60%mPxK~?EY@U*AoAxVf0hN_NsCP>X=S68?VT#sg9w7|b@}N+7t=q41TNw;}*bCcLI^as25$7B+js;Vu9# z?LH;Fgnr{XA+V+PJBQpAq+Q|&Tg#t4Bxz|}T(HBY&J^rQLR7)f)@Guwwq;rWe#?f~ zuosvNHYeq1s+vF@2te7)SZ4!gty|nS+Y>Yf4cWyE5Nwqvx_9Kc5~dzDDp{|$*< zBQD(cR!H|^7Xx`8IC)$4_mg0pgDo?GyN@>V5kSd5t4k!y<&s)iB+?h+b;UQaL9N%=SpRolqc- z=v~1nftI613)X!e5iyT(Wf+0W0bY7JJmTqaQtyZ2BBmUoY4DRHc`%eoj3;qkB1@M6`z@0$`&ya7O;TX3 zq16Bh(heo29oI{!1y?yJ#eu$oD-A%`{0$r1Pl2;az_>p~-b3#9Ipp1s(+(m9sTJ zv+u*65LhRmVRg8zf%J;Q^wDHqD`_<#xmpjb7TZl88e0Gh0m%KJkk+VJk(idK)h74v z0=S9->xC3a)56A-@e0@V_NZFkPvzx;-E1+{Uk`*d_uQp2gkmdOw{N2hkZeFd6n^yz zNRqwqg+S@nH_oPq1Tu0$9#>HcT*!qQzg3B$>O0Gxy&t;{J$36zBTQo9m z%3$>)xHvrgD)}g*c>T7voOqorRvi3`6$hxAl7Us43;J^$gBer;C;~{#>#(_C3jfyN zQYJJk+9kO72OIaGHgGov_ldFd0aIMMSI&wI@|5{A%hMyjwy!389Fum-o7e^7Z;AVSrB;r;{ zw5rSiysZmeAan%M`uh_R`VNQ2BPAt5jY?a1Nodf1b!R_X#sMIGa!4BQ!$;IzkM84j z;?GukAUWSw(uqs`ik%oeF7>YiobMi&j()YG@Dew)!Nu#v0_Y8J|Ao2j7a;pzj^GQW zen8?rA#uO0qVUcK#%-xM7`LS&+forqElJ#468C?v$m6OR*`(5uAt9pK$Ekb-%_AT+qxD&tVE4?>^EtOVNd3~ru8s=ri3NWBnf zWq+vxUnuok7AxZ^L8>Hqf6hn$!#>;VmlKtR_gVXw*&t`u+y&l{!x8_qr1Bd_A6&Eo z7a?MlgAH{HZH^Lj1}lr9gOvpc-Dps7@%DbRP>lZ!#~Kh~AA6T1v%lEA>uB~}M?=}c z%52kvQE>n3QPi|1qZQ=aSxZes(D#8;%R!U@jhg4o*v2k*KknLBO3Kr86j;dOyHdRV z=eFDcgi7PJP~*~EUWG&}AC%PxACT2Ah#$&al2x=a8?BUi9T!bu9t4(uBDD$P2VmGm zz;ZKR3@h8HG8^##aXIxZ6UZuYM#@rB?T z7%V^&LL!of!mc3n0-%tD`&<=J+D{?-Tot~M-@O2WNs1_ce>I^Xi`9s`pN`3F{{AYz zyK}%xFof6k!F1B!Jq9#@G_F-ba=G1O9?p{1U5pPeMzgt#e(X6~;Ar(0qkZz{*=lqz z&f2(^inDgGIBP@E2@^M1!__kR;?|~GZ{mXXiReh_wTdjy9aE2=THNVW%L}=VAM>(& z0u_i!P|?Sr29W3IK!rYAo%&VlKtaAb<_QEHnwp0+GWQbo;rBzRl;)#(I2y8H>lJ$_J8&*=>R?@ zg8l+ECDaWl1>7a}0(cdd3>5E3nW4M#y3@i(_#0gO5t)o1m1K)+IW_Y@K7k@4g*8}% z!G~z9jryYJ#TxDcVEPmZ=_lw2))zbMp&_&f6+hsAjabRttBz`M1Qb0a2EkFz9G|V3 z%zm~edy!uV?33IVPeT0)8{V}lv0vS{a}S5&W3Is1yJ{|w#c~NF8q4c--nRw^yrHi} znbgZBR)NApyD;}dCqY+G%@Fu-fSua|&E+|v__lY0DtXKi4e``TXc&53?TsgR-7d(s z*R!NnYKGc}3_~B^DTcj4!!WRshIY~S7Q>#`FsMvw7~*}R7}l*}pl*A}Qo`kMbu89n z<^q|_h)`SS1ks<0LccEyLW&e5EbeVZ70HCgszq58e;J2G5*(DsQzy~Fyoe499|%Ap zWZ2n+kYO!xf&Si;K1u85Pv%jpBA86eRpMUDsUI`;_n!3DhzHEr+0UKy7lG_oUIq|X z;_0l1!Q#hAwH61~LkH!7tU1uob3qYdJB+q$ICUWSz*<5;aP+FU3!A<*0v5u!ivN&9 zCCm|FhNx^6WCkG?iU1Xrpx6Py+)OkAi6W8ks2B4Yupa_N$5ixQU1D+;Er92-Dv1R|L_|-VrZhIGfCG=#}u0D1``7QM`;|FpvndPolE45ER+5PtnOl z!DIqAO9bM&hw8_Wz1%eVY<=Rtft@b)r|T7wbRNehVdw$Jqp%(53gSIJE-wMtrxBVzgX~q# zYm1_*OP;hB8KTNvJfcu zxF;yPiW-+lNlLrgPcl*y4c3s&TCvYF*K;%);q;n12f;!z@PIV>5oEWd?+X)H#FE0x z?kzI;>{>?Tu^g5tRD&=hMU3e$8Twyoe1oBySbjytd&=NN1|~Za#s-+ZDl#RUP0xda z3ouJO=@G2JD1{(z$(ZwG!gRR1df_oUxi=)2V##n^chM4KLn4T6;5G8t*mq!4w||9o6Mv`hcN{V{yd(Jr;3)re%Bs{{ z09A$apKAQoKx(Ri`2Zd{LQbawayUF8;u`^HAhUA?F#N5DGz#UaPQi5zY1JTI!tf^L z+LGT3)}zRUM;4dh%eMx|ZoZB@j^U2w3&67vq2~gZ0+-<yZA! zNM}dnVClu5OJQ7+s4zj2fLku->R4FynFM_<#15ek=#1r$O}m%fopS@v713XA!TQ>S z=ZFkM`es%TGY&f)2vY!GoGAQxJL-U3~P;|QuAfjcBuS&QnC zJZpmU4NzYgydcRyk8$fz3)VS*d3XW7hi?Ay0tIL`?8&hemZl-K1I7U;zjBMjzZ_Kh z@Sv5cdIS;{C%;f7Lqt%7!a29HLwL}E=SrN(#_toKwkeP$B9kg}N{LDlix!D$R+P32 zMcnOQVIU8;Z}G^<{yiApVi3kW^m#hj!E(^!*cWq_Wx)OeM)*S-U!w6<8ox#3%P{0c z68n$n{4|Zv&>$u{!*V$gvCaMYU*hifgjd-KWcH-U=F;+av*U3dHyC6hM2O*8D##{X zgB_AHu5=A9b?6#?r$ApQK&cKJH#t?JQXM)4cQI%*G&{P1G^4h*z9j(>7StRLqh178 z8en=hCCAgsJb{NuvkVOSaOeYUWjQ8HR+>Gqjlc@SW#+&=d)aGcu8a4#vYe1At(Huu z*ETY@AwK`GW)@oOnP;@2IVfz7nUV%&LzlFw&>9?>B@N07lcg$?KHP?E^?!hti+rFA zEk{DgVCvI0JAvtu!iUn)A`Id`!0B=CldwePxEJrjL{aN_8b*$@aLUVkZv%y3t zCp8Q{h3zcZ3jdZzPITY^qz z2-8-@wx2EQ#lcVR7p3}GuB&9~xIYv?;XGd!@q+A)zY^e)7$Sn>3r$wk`B|O^Fyri3 z0@+_Q_(Iw5g3tUJkRsIdg6zkwaA>z#dnmExrSO1R);m2 zeMcF-Pi{BB?}DS$T3cDj8<&sb7A@izT>J^L;tD?~$l~&=;Np7>8EzP_ z;Eut(F6LvV&_;GzaPeuWi|a+SI{*NV5DNiBJN95jJa(OHCi{GO2(PYzj|IQ;zyJxb zsQ9}}e}OIaKab0n!2Cnu6i|@9RvyZpDi0xG5064145Y#(bbLrvU&asG>I#0af<20f z>V^=7U>MzCKPmD~>M;wB@2hEv4#y!@imF`cj#)?r#^LV7Q%>YWEV_!K)MCF6PStUt zteNg0KS0|L5Dx2!(i%d8*uTI4ZnYu|;2%?)#-FSKAY(Zt^9S>>Fnbv8JsU)DU2dDEwGNQ?&dv&f?_UC92d7+tPTL~>P7utU-Dj_Hve6F|lOEkD*$$npm z9O`gmPuT+$WuK0-jp7cO5BQNOqx=AKm`G4luI)&84?=%j?pIiK?Wml7nn<3^#asn`G55vj3X?EK6~39?zvA z9WN>7!O|faB>Vd%x|k{+8`{XUNJVqg;>9ZhE=hcwdU?9-7Q$Cw5^}d?s{>xbMl$be zKSF}9R)$Up-w&h1xa{Oc^em297mu9BUQhp1x1?#h*zaB_s|Ja4 z5}H9IagO8v>2eLN4AgMHEBnFo*sY$jo`9Wu?<%;?K@_eIyT3O4RbnT2Bv6mMxO-(@ z+^;je6WH-`2h8_{POEV6d0@y|>&2hjkKTo405mI2p_@Q_(vBw@-%84tQwN40ri8F<1iSUTG&OVz79*_Bi@qdhhtvGO_ZRFu$e(tTo6))OF|71 z!PdVa)CK4i-~l`Q0{|*F*&9~&;|5>Is|mo%+ml$mm8zMrFp+ZN1|66J{<=%kY9rZ3 zQFds$C@`MCgPp*T9aCTg0~lo!dQ;BRJ>Z|BER+BrF9IXj1Fk|EB01#&{}CV65nwFZ znlju%YU+NY7K9w%8LS1pg@H%vl$_;qrO;% zR(?>_?=1r%$f#GXgAjhyUo8WT^Ps3-DFaE!sQ)WTuo4JA>i<;+imfETFYD2A9IP?w zPm!i8f$*cYm4lop3Gk!#l!L%vRNO{%0K$)&E(h)Lps0K0phg%K$3w+7kS4&4^x<-N z`SIv`j_vxfauCCeg1H0FIAVh$eSySM9lJ2QsceU&o5JPPlQKS6?Be*9w;(|XW5zgg z1gisjE$Cv9);!8ak5orpNy2xt^MMf0PJ51!*2bJ5Sy*&n)QV`CQ28}r!d%0AI&O2l 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 diff --git a/test_serve.py b/test_serve.py index b694311..1b50b72 100644 --- a/test_serve.py +++ b/test_serve.py @@ -7,6 +7,7 @@ import time import accessible_output2.outputs.auto import os import base64 +import test po = test.PackageOutput("ff1_data.lud", "enemy_lookup.dat") auto_obj = accessible_output2.outputs.auto.Auto() @@ -17,7 +18,7 @@ def text_to_sound(string): data = base64.b64encode(open("wave_out.wav").read()) return data -class MainHandler(BaseHTTPServer.BaseHTTPRequestHandler): +class MainHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header("Content-type", "text/html") @@ -57,7 +58,7 @@ class MainHandler(BaseHTTPServer.BaseHTTPRequestHandler): state = doc.get('state', {}) t_time = time.time() strings, presses = po.run(im, state) - print('aaa', time.time()-t_time) + print(('aaa', time.time()-t_time)) words = " ".join(strings).replace(">", " ").split(" ") nw = list() for idx, word in enumerate(words): @@ -88,7 +89,7 @@ class MainHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.send_response(200) self.send_header("Content-type", "text/html") output = json.dumps(res) - print(len(output), time.time()-t_time) + print((len(output), time.time()-t_time)) self.send_header("Content-Length", len(output)) self.end_headers() self.wfile.write(output) @@ -97,7 +98,7 @@ class MainHandler(BaseHTTPServer.BaseHTTPRequestHandler): def main(): host = "localhost" port = 4404 - server_class = BaseHTTPServer.HTTPServer + server_class = HTTPServer httpd = server_class((host, port), MainHandler) try: httpd.serve_forever()