From 7b45554f2a387d32aab480cc930a863dc688038d Mon Sep 17 00:00:00 2001 From: aaschaer Date: Wed, 7 Aug 2019 22:21:25 -0500 Subject: [PATCH] pre-c --- .vs/ProjectSettings.json | 3 + .vs/ShinyShadow/v16/.suo | Bin 0 -> 20480 bytes .vs/ShinyShadow/v16/Browse.VC.db | Bin 0 -> 278528 bytes .vs/VSWorkspaceState.json | 7 + .vs/slnx.sqlite | Bin 0 -> 98304 bytes execution.py | 13 +- npc.cpp | 261 +++++++++++++++++++++++++++++++ npc.py | 44 +++--- prediction_vid.py | 37 ++--- prng_predictor.py | 55 +++---- 10 files changed, 339 insertions(+), 81 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/ShinyShadow/v16/.suo create mode 100644 .vs/ShinyShadow/v16/Browse.VC.db create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/slnx.sqlite create mode 100644 npc.cpp diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..0cf5ea5 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": "No Configurations" +} \ No newline at end of file diff --git a/.vs/ShinyShadow/v16/.suo b/.vs/ShinyShadow/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..52c0c88e426ce4afa5f998e6f6d225f383415efa GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/.vs/ShinyShadow/v16/Browse.VC.db b/.vs/ShinyShadow/v16/Browse.VC.db new file mode 100644 index 0000000000000000000000000000000000000000..c2103d387fdf057d4ea1f13bc230f2da1850a0e2 GIT binary patch literal 278528 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 literal 0 HcmV?d00001 diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..8b0d1b7 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\test.cpp", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..7822bc15c8e1b598e3e383793e23d7603da0cb94 GIT binary patch literal 98304 zcmeHw3v}DonI=K-k_1TrdQl9m$f6&zCEJuJN~9#GjxE!)tyq?1J?z+y!tepgjQNlW z%CwxMiIQoWG}&&_W@nq(*-qwUyGf^$X?r@|>0_GNPTR@J^t99Mv^$+mn(m(2$@DSl zbK7pV*>?YX0T2L1MUJzZY?I3a`~d#%|1a+SaPP&%4-l9=F_EiCfo!Q7qq7}nQY?X>ivF@%l9UtyaT@mHQFJx%UouJ>{eIG=N{ z_7m*G)|ag_)*IGKg6e-e7_f_WlF`-eg2Q(z$gG~o6*JPM*_A@7ls_b8bH!XGS1Kly z)#BpeTwWT_B*q&ViLsgZ*jzj?K6xm9W8mx+rLn-f0`QxfTx-7&=s9cN?LzOWmv{JL zkj*2FvpJb8NR2ZmY>+wKbAv2l!-YU>YGMMHb#f{;HXHAK*FKNK7Ys7*309J+yi{NG z`fXm#%-q<)iFkvO^R6C+mo+4gXBL3px%iRzOkjFu{P@_+>AA=|h+|>9aBzrtQ zIS09dd46JIkDAJKxpXm?k;+DI%|^EB`Vb}pXo!s+ikqNA@rk$&X_-+7oIE);6FWLK(-V$FdTSZ3<5hDxyqwRkoLElg zbJ?7fX_SEZcxZmdpqA)-X(iUsv2Rs)3JA4UfR|(RtNKVtqVo@r` zlIe3&Vr|xyR#tE5F}JdMc-?diZLZ!2>fYMDFZA9s?;b>f>-R2fo55xYo z7FQ1$+sqZTIQ4)w%JZ6S(W^F8#R^Lsz(F|*qS5vHM|BV~@+{zO4 zl3Gut?LupLbGd>fSCWOLg#hk6=EjdhPYV4Nu8Bd;;p^{Z?iNW+)OL&0OJJcXl#IF5 z!#Y1Xeqz3M=Fx0wPKN5GVQRtP9HVKJEZ21;HT0xZmZ71o>G|)rI32#;UgnJX^jZG+S{DBG(P!i$W)sRY!|~L-E67^AmG{^m3WB*oxLoLnAM-4&Oirv)V

$$?VYyTeYk38K4YM1}Fnp&A_S?Axms^ z0ir^;O6f|hRLtfUm&+vFJPVhQxwLc}zEs_+8XR2CA|~k-^a5Kqx3>M@OX8XegM0Qqk(~ey+gx$BLnS>&9c)s3wK}&Ni`}v&^Oo@;l;nUAn|^S z_%rd_;vb0ji=VjaW=k38Q6${HX9pc$ipax zrzM3JmhENWil01lt2_y2^&&QCt$z;Kau@8Nl{1^RS+z6`kIJ;U8McE_pFuz_a6{sK z7V*D`UlgAd?-PHtQAR0F8K4YM1}FoR0m=YnfHFWCpbSt3C(xu`>=sUs1CZ-~@iB||iug;20lWn70sIH?1@Z62Z-{>*{4n%w!f;bzwht1`7PRwf0C+p=br%Tt^a0Qx5a$#pJ+@s|66Q3 zEp>PQowimBx&1HL;Ew?M{eS%bf2;U@3*75}|J$t!(ehFTCUw z-~YFYk67UU{$G9*%S?Ao8K4YM1}FoR0m=YnfHFWCpbSt3CP<$Sq0r(XB&;JqeZgEMxS)35}iaW(Nk$Kx409s(m0A+wO zKpCJ6PzERilmW^BWq>k38F=e4&L^UYGvV__yZqo^G!CxCkC*pg{TIjKk>f5 z8NM!nRSv~!>nqLQX@V~cFdSnSv0wik>B3i=;FAJaBPg0=`CJoxLjY?$ie~1HTbtmc z0a)WwH0`VZqX|A3fHh63=ImS(d@BHJkfLe+;ejUjP5{=}6;0Ct)C6A#z#1pf-2RhK z|GOsmCIHshbPaq60BcxP^S(!#;5z_V!zr2{drJ8JKQDg5BK} z|C9J-c=z95h<_)3LVW72chG5xC{a_s_A&c* zJBNOVzKK4A9!C$NWppz-f4!t4N7rDJM%yEBZR; z@}oVsgWc}kiXHw&CH~l@RF+`ZdgXWg?)$96{a{fLdD#bg5K^3Dno4j!U5S`-wVNDksuqMFKd2yj9%?)G&d%A9Y;> zb!R8>S&|cl<-8oymSE70I+wwqqeC;0mkSuj3xGGF&WZ^xBr_T84hw)is6z%=&61L= zA^~JjN7)3*%PEp_ibK|4ppFYBP)V00YyAQ0STcea5^`lp#u7ZAM}CNsX~bc5o(O=R zMgF1=$>n4yHM$IS*m_{3`Ua+XN&+l71!0IG)~ zl__4vGXUF=|0X@blyo6qCIX;qk@qY>>QMzPOrZ86?-_%-D5Z)Ls0HLbZBXZ>R357x z$a|wfy(py?vD$*XrwrknHQ0NR`U`=$vB z&@tpY0+3o5k|Ov65JMe@0Z@qpKuHoLfcua)4xn0-0E7wDL&$eXPYkMZ4$lDWLEe~d z4@#Io9YEfLx;meeVFGnKY8?Z$+Q9O;JWiqs`3~r57b~3+0NWE@0&F8|2%k`+kmHrRPV|fAjM|IC^CU;RL0-$do-v~e|{aA}<0KSa;!v-IGBFbU` z(C3jaYVZLqMgaH}@QQK~Vwt6{V1?_&+zRQquHghQtGlzyzTd%=7n*lY4 zdQn@CQ7h+ht~*fMPF%PU( z5=XxyD@djd&N;-jcjzg|6=@02oO2Vmc@yZ>QfsBrmYh@I zTK#~xwvtj!PRC$!dK}kY14`188TCtHlJd?liL*^|dwhV_Mw_`}B~g|ZVWbNm7hfuy zHaXitZloQohlj~QD@(~t;v5Wzq!j6q} zoGr)&+Q5(W{0zKLjbtcUsI73eP2AR2uuwb5v5V5b_Hw>WkR zg#@te?z~(AJYZM%e+e5tWA?J#VCXY1=j@^$!9^J!0y^{JG1;_41A$LO$ zC3S;`qTtvF+T{Wdl^=rv6xh7Qu|c#8-axO}s*I>c<}HrhhWeaf8w?VD^uj4wuixg_ z&8W|z+w1fxmi5~l>qk9yuvc5Ajzd078ywq)dXR3Z=2NjTZE&oJcG$pDz1+*@OG#1# zz{3BXW8w1As@tWZnZf1b#au=z8P_?k742Zw*kz%8Nva)Qhl^ex zT-sVJce%D%gr|fa{_Ajk|3Utv?vJ>ihO7Jk?0!-BGXJFetNdf`7u;V0sw;_vXE6ZW|m-N)Qx9=C^aKgRPsD}K)XyY2@(|L9)j1AM!ClY5)z zm!9W6UvrPR`}i-3o#MDSD7*mQ6a1=plj}pS-{VVsmj4d_5dUue1ANu!7gU z+2=XwIV$k{kHwPca69=h-z#+S3;Z0vm!IHcp5OI6;JMp#$#dS56m0xI302pi>wWG8 zAb|cT1C#;E0A+wOKpCJ6PzE#xM0SgHrFKKZa+knvG292a6Mt#ibeH3u_+!+@+ZlJX zvb&YHVCy$6ZpW$UcPehkZRL9+5WqJp(Wyn;jIS&Wf5xujqzIfGRs44$^L&9Igt{y5H^B>N#z z?OPNjq?I5_60*J-r-4J%3m7F4>6>s~VeKqg7Ns*}nU_wJ<)U<>vRyf)Y*$WVPZB1c z$BE&v@Eq9{gkP6uwYAa=-YE&==1vd~9P^!4*Q&WG;tK)WNo=QtXOH8ro!26<6B#`%TSIL3g5+##%hl^9+^i1Q#OFP|I3 zI1XYSAS)2G+>dL58lk)%D{(|}ANGO}VNi3^;{??9}`q`I*Z;$qwJ5+Y&SFtb|NYb)N+qCs1* z1w^$1IDH(h>cUO2E?Bi$0dtj3+>}jGsB1BV!%iK>R5#&NA*$rZEUH1IYm_#QFIQ`k zBcGogW*UZq+OJ_FOruzj7uTa&T&GRxBygfQgwtxwL<{a^jDeZv7Pgl$2Vk18O1*+s z5z))`Gy3(s8fy@+Ru3VlS{`c+Aq&OLQ>Rtj+;~?8TiC11uy+;V+Ss6BKT3j5tkkol zr02lLLRUg^cC1kgqW}m~U<@SKutGHwkC&06hKwJ$U;6 z+wjD{_U!+s@w5Np6XG9=|3>^*;=dH{7w-}85Ub(^v0v;Jx50J1Piz+5A`*Thye#}o zcuDvt;lByb!IuL6MtD~Eg77)v&xDT)9}zwz{DJVO@P6T62=5kFh1-N>p(Nylw6GwY z5>5!mgt)L@7!?MEps-WeB6J8|K@>QF<^MPTOa3SP5BPtC*udZOf6IS`e}?}&|5^T% z{73l@^N;iYmjBoM!~6sMyZAf#6<+2G{34&^&+_y96hF?#_O(sc)sw-b3Amgq8(D@0x*vP$GdBA1D*5GfN`Ch`K2OGK84ED~8D zGEd}rB5x%!N8~vo7m3UgDG`|=GEHQP$Rv@s5SbwIW+E4eyot!OM4ln?G?6zFd5XxB zM9vdAN8~J#Gen*sa+=5~A}5JFPUHlU$B4Xv$Z;Z%5_yEk!$ii3JVa!S$b&?V5qW^f z{X||*@R$PprkiHs5%A##YwK_bIM4iFh4vY*I4B7;QkA#yj7yNK*1 zvWLi>L_*93j(#_h+lkzUrF|=rTZjx`>FgqMGm)J{UQ1*Lk(-G0V`;mFNFR~yM0$yA zBeIpq79yLmWSfW-i6qbevpiY%5J{f@hi3?|C4LT?VafCVEP4K)wG#~@l05&k38K4YM1}FoR0m=YnfHFWCczZK|um4>R)*?oQ|1QX$ zCp}H>W3Kmd4>+H5u=W$|!`7FrGu9j4-W<`=zZM2ow+jy6sUWj@A_xD|yEMB}NR{%3 zq-?I3tK>?>gtA&(Je^Qkosek482 z=5iPw|64h+oXqF4IVsa90rTGf33yUL&i391uafJppEjprskMh9NF*273THT7p++v3#HX}Q*JcF zTIJOgYubO~Mn1Q)1ihrzQ)#=*2>`%*{gJ;P~2M;6zfcOr>P0d{Kg7k>2yFqs73X_~EhniMc>}xlCFt zdA|kjrlFCSSch+*gIVn&&16=pRN&18q)n^iZAD`<*Qd31q#BXozT&W6qwSrx+I{eD zi_@g$$QNLYCM9I)!ZLoBTHPjVsyB6DPZ28r9`Nj4J;FGA@G_0NC6cC^H+5k(rEyl( z8mgSCdBbYj$z*;Rj$>WzR8ErQ`rq``G)`QZEACP zgF)v5r!MBCDjus(CoAX3889cw_1h}XC&%Nb0`*uRDf6yV<8w!$-Nfc+X2(y)*V>HD zszWv0zGmSPBQ_UU+aCnRW&;P4vS|!Hp4k&vuK{EGm{RW*6Xgt!U2r#Hf-C0&hi9ga zui2~Ka$!6&HK}hZxzx9D&ZqktWY27Jc((7gXLn5!B>T7D9@u%)&HyZ?`)b96au`cp zIj8$7<*PfC*m_#G8K0bltI!+Zx^oQ^*z)i!T-NK>P?!csX`eAaxYN;Shc1VAX-9Xq zZ`Yo>e9N_p!Mk29vsaQy$m)7|TYHS4f*ys-&fAQ3ok3 z8K4YM1}FoR0m=YnfHFWCpbWf`4AATUHk38K4YM1}FoR0m=Yn;EiN}-v56i*{1uV3{VCr z1C#;E0A+wOKpCJ6PzERilmW`Xo5KLU|9>a5%_4qF{Fr#3c#9YnJ;L+C9}9O0bHY~s z$Nba$gZwT05YKyF@;vK#!c+1@JP!Bw+~08jsr&ccW%n8P9(Swj*RB^_PrIIUz0Y-* zEAKk#I^f#nYT;htUgW;UeTsXGyN@e#r?~@MFW2P!rSo~`7o1Nz?{^lRr<~V2yPS5% zOO9_jKJWM=$HR`xjs?ddN3X+af64we`&0IZ>{a_s_A&c*JBNOVzKK4A9!C$NWppz- zfjmG7NJmk;%d9hT+AL`Wh$lsOOzv zvvVi0Sz4)_tC^WLI1!;8cYtMgw`y6&@1iW0a3Jk@Iayqk^fk`KA^&Bt@%bP{D^sYXD`g_!gONv&cLku4`!0$jL+iw1|8e z-6xxbticSxEy$nNeG0ht5CPB`)S3dQxtXv~06i$@kw2;1X9)pV0CWTDxCJ1M99$XX zERg_SkNgRvA1;nkU95ws<7R_jx{|A2&JqcJyO3`IK=n|hGR4by24EZV-=rs)k}l-S zL;!Rx@}31qJ*uFE3DjQXJ!4Q8rBqP@wSc^*4eGoE-*W)919@*Ws28QwB34_F_mn}M zucY!&{g{`L_oP9+SV=8n^-qz19@J{BOqbL7G7$j%GxE&=q!uh)E&+lYC-Wlm&+0ze zbYW?k2!NoH&zPYShDrc^9d(=lNF^VX`D#v)0DcMir*%J~CIX<(BL9>LB5u_jK%YRq zNr1E*7M7~uR0ZI}sN=Z4uQKeZkW(ap??ziD0PN}_wFaw;1*lZD6);&v9mmZ6#e#wZ zm_+^?08}Z1nw67@0O&O88V5-2wy-u0DQinGm_`1hX5TbH0Xl|!M*va_LsA5P0Ai@) zFaRoX04Pa<1aKen#sO4o5`Zv)dI4`yA&fyt=J;)o=?Li3>r~}A*P*>-3GEAUu zN3CO^RvTCzK1%`0CgeMyr(LMz;RKM!d2u7(eglvN0A>K}sPlRN)Xq9vmM@emlDgoK zb@n)g@@1xGWhCPw)PgeRr zD39d@`}dN}UqQG1`R&!;Xg>cIlIVh-lF3P_#jEHl7OGGX1y9DhUiEmXhUUL9W~6oJYC#PAwURsU~w3Jaf){T+g+j zSBHv<8{~?-ADtwrZg9>auDwG~0Y3k-glEpViQBvh^lGWK(r8Q0DR8ZRz*}2MsV1jm zFgZPrYp($%X~_&DU6Rtv6-ixiwn=V}5763ZGY8*TC`*el(uGe|ER{{0ob4bt(hkWrJTr?ON9jR(NM|RB3#r9o{o&V%R}+}QhdM}|%@s+>A^WhWlxd4&PorI;Zi}-5cB+wii({uyNC4aZev)pc zv<#yKY_1ZtM!~_jJ;duCGQ36Kk38K4YM1}FoR0m=Yn;J1%~t*aJ@0jMFdmD(L?eT@@a(EkC8C?*;J literal 0 HcmV?d00001 diff --git a/execution.py b/execution.py index 3eefb1a..99bd2e5 100644 --- a/execution.py +++ b/execution.py @@ -16,6 +16,8 @@ def __init__(self, start_address, starting_ram={}, starting_registers={}): self.cr0 = None self.cr1 = None self.ctr = None + self.debug = False + self.breakpoints = [] def print_line(self): print(hex(self.current_address), SOURCE[self.current_address]) @@ -74,13 +76,10 @@ def print_registers(self): print("") def execute(self): - DEBUG = False - breakpoints = [] - while not self.end_reached: - if self.current_address in breakpoints: - DEBUG = True + if self.current_address in self.breakpoints: + self.debug = True try: args = SOURCE[self.current_address].replace(",", " ").split() @@ -88,7 +87,7 @@ def execute(self): raise Exception("no source code for address", hex( self.current_address)) - if DEBUG: + if self.debug: self.print_line() input("press Enter to run line") @@ -102,6 +101,6 @@ def execute(self): self.print_ram() raise - if DEBUG: + if self.debug: self.print_registers() self.print_ram() diff --git a/npc.cpp b/npc.cpp new file mode 100644 index 0000000..efd5da4 --- /dev/null +++ b/npc.cpp @@ -0,0 +1,261 @@ +// class for simulating NPC interactions with pRNG + +# include PPC_executor +# include LCG + +class NPC { + LCG lcg; + float destX; + float destY; + float currentX; + float currentY; + float nextX; + float nextY; + float walk_speed; + float wait_time; + bool walking; + bool first_step; + bool debug; + + NPC(LCG lcg, float startX, float startY) { + wait_time = 0.0; + walk_speed = 0.0; + currentX = startX + currentY = startY + self.nextX = None + self.nextY = None + self.state = WAITING + self.first_step = True + self.debug = False + + } + +void step () { + // simulates one frame of NPC action + if (walking) { + walk(); + if (nextX == destX and nextY == destY) { + set_wait_time(); + walking = false; + } + + + } +} + + + def step(self): + """ + simulates one frame of NPC action + """ + if self.state == WALKING: + self.walk() + + + elif self.state == WAITING: + if self.nextX: + self.currentX = self.destX + self.nextX = None + if self.nextY: + self.currentY = self.destY + self.nextX = None + + if self.wait_time <= float32(0.0): + self.set_walk_params() + self.walk() + self.state = WALKING + else: + self.wait() + + def set_wait_time(self): + """ + simulates logic for selecting a pseudo random wait time + """ + prn1 = self.lcg.generate() + prn2 = self.lcg.generate() + rand = (prn1 + prn2) - 1.0 # constant from rtoc + self.wait_time = float32((3.0 * rand) + 5.0) # constants from r31 + + def wait(self): + """ + simulates waiting one frame + """ + val = single_to_double(self.wait_time) + val -= 0.03333333507180214 # 0x3fa1111120000000 + if val >= 0: + self.wait_time = double_to_single(val) + else: + self.wait_time = float32(0.0) + + def set_walk_params(self): + """ + executes logic for selecting a pseudo random walk destination + and walk speed + """ + prn = self.lcg.generate() + + starting_ram = { + 0x809e5458: "41700000", + 0x80270184: "400921fb", + 0x80270188: "4012d97c", + 0x8027018c: "401921fb", + 0x809e544c: "4080000000000000", + 0x809e5454: "41c0000041700000", + 0x8048e610: "00000000", + 0x8048e618: "ffffffff", + + 0x809e53e0: "8050f0c0", + 0x8050f0dc: "00000000", + 0x809e5404: "00000000", + 0x809e5400: "00000020", + 0x8047b1f8: "00000030", + 0x8047b200: "809e5220", + 0x809e5220: "01", + 0x809e5248: "00000000", + 0x809e52fc: "01", + 0x809e5324: "00000000", + 0x809e53d8: "01", + 0x809e53dc: "809e53d8", + 0x809e5224: "809e5220", + 0x809e5300: "809e52fc", + + 0x8050f0e4: "000000000000000000000000", + + 0x80270348: "3f90ad3ae322da11", + 0x80270338: "3fa97b4b24760deb", + 0x80270328: "3fb10d66a0d03d51", + 0x80270340: "bfa2b4442c6a6c2f", + 0x80270330: "bfadde2d52defd9a", + 0x80270318: "3fb745cdc54c206e", + 0x80270320: "bfb3b0f2af749a6d", + 0x80270308: "3fc24924920083ff", + 0x80270310: "bfbc71c6fe231671", + 0x802702f8: "3fd555555555550d", + 0x80270300: "bfc999999998ebc4", + 0x802702f0: "3c9aa62633145c07", + 0x802702d0: "3ff921fb54442d18", + 0x802702d8: "3c7a2b7f222f65e2", + 0x802702b8: "3fddac670561bb4f", + 0x802702e0: "3c81a62633145c07", + 0x802702c0: "3fe921fb54442d18", + 0x802702e8: "3c7007887af0cbbd", + 0x802702c8: "3fef730bd281f69b", + + 0x8050f0d8: single_to_hex_str(self.currentX), + 0x8050f0e0: single_to_hex_str(self.currentY), + } + starting_registers = { + "sp": "8048e5e0", + "r13": "80480820", + "r30": "809e53d8", + "r31": "809e53d8", + "f1": single_to_hex_str(prn), + } + exc = PPC_executor(0x80184e64, starting_ram, starting_registers) + exc.execute() + self.destX = hex_str_to_single( + exc.read_hex_str_from_ram(0x809e5434, 4)) + self.destY = hex_str_to_single( + exc.read_hex_str_from_ram(0x809e543c, 4)) + self.walk_speed = hex_str_to_single( + exc.read_hex_str_from_ram(0x809e5418, 4)) + + def walk(self): + """ + executes logic for walking one frame + """ + starting_registers = { + "lr": "80185afc", + "sp": "8048e5b0", + "r3": "00000020", + "r4": "00000000", + "r13": "80480820", + "r28": "00000001", # 0x809e53d8, # unused? + "r29": "807f1048", # 0x00000002, # unused? + "r30": "809e53d8", + "r31": "809e53d8", + "f1": "3ff0000000000000", + "f30": "ffffffffffffffff", + "p30": "4070000000000000", + "f31": "402d6b5aa0000000", # unused? + "p31": "0000000000000000", + } + starting_ram = { + # constants + 0x8047b1f8: "00000030", + 0x8047b200: "809e5220", + 0x8047aa94: "0000003c", + 0x809e5220: "01", + 0x809e5248: "00000000", + 0x809e52fc: "01", + 0x809e5324: "00000000", + 0x809e53d8: "01", + 0x809e5400: "00000020", + 0x809e5404: "00000000", + 0x809e540c: "3e94a529", + 0x809e53dc: "809e53d8", + 0x809e5224: "809e5220", + 0x809e5300: "809e52fc", + 0x809e53e0: "8050f0c0", + 0x8050f0dc: "00000000", + 0x8050f160: "41f00000", + 0x8031554c: "000000003f800000", + 0x80315554: "0000000000000000", + 0x8047aa80: "e0000000", + + 0x809e5418: single_to_hex_str(self.walk_speed), + + # changes between some steps, but doesn't seem to be used + 0x8050f0c0: "10102027", + } + + # fist step on load changes this out of memory value, very strange + if self.first_step: + starting_ram[0xe0000054] = "00000001" + self.first_step = False + else: + starting_ram[0xe0000054] = "00000002" + + # if this is the first step in the walk, use current vals for calc + if self.nextX is None: + starting_ram[0x8050f0d8] = single_to_hex_str(self.currentX) + else: + starting_ram[0x8050f0d8] = single_to_hex_str(self.nextX) + + if self.nextY is None: + starting_ram[0x8050f0e0] = single_to_hex_str(self.currentY) + else: + starting_ram[0x8050f0e0] = single_to_hex_str(self.nextY) + + exc = PPC_executor(0x80188214, starting_ram, starting_registers) + + if self.debug: + exc.breakpoints = [0x800cc2f0] + + exc.execute() + + calcedX = hex_str_to_single( + exc.read_hex_str_from_ram(0x8048e540, 4)) + calcedY = hex_str_to_single( + exc.read_hex_str_from_ram(0x8048e548, 4)) + + # check if we would pass the destination and if so stop at it + if (self.nextX and ((self.nextX <= self.destX and self.destX <= calcedX) or + (self.nextX >= self.destX and self.destX >= calcedX))): + print("stopping instead of going to ", single_to_hex_str(calcedX), single_to_hex_str(calcedY)) + calcedX = self.destX + + if (self.nextY and ((self.nextY <= self.destY and self.destY <= calcedY) or + (self.nextY >= self.destY and self.destY >= calcedY))): + calcedY = self.destY + + # move to next vals + if self.nextX: + self.currentX = self.nextX + self.nextX = calcedX + if self.nextY: + self.currentY = self.nextY + self.nextY = calcedY + + +}; \ No newline at end of file diff --git a/npc.py b/npc.py index 6e71cfe..654f0dd 100644 --- a/npc.py +++ b/npc.py @@ -21,6 +21,7 @@ def __init__(self, lcg, startingX, startingY): self.nextY = None self.state = WAITING self.first_step = True + self.debug = False def step(self): """ @@ -126,11 +127,11 @@ def set_walk_params(self): 0x8050f0e0: single_to_hex_str(self.currentY), } starting_registers = { - "sp": 0x8048e5e0, - "r13": 0x80480820, - "r30": 0x809e53d8, - "r31": 0x809e53d8, - "f1": prn, + "sp": "8048e5e0", + "r13": "80480820", + "r30": "809e53d8", + "r31": "809e53d8", + "f1": single_to_hex_str(prn), } exc = PPC_executor(0x80184e64, starting_ram, starting_registers) exc.execute() @@ -146,20 +147,20 @@ def walk(self): executes logic for walking one frame """ starting_registers = { - "lr": 0x80185afc, - "sp": 0x8048e5b0, - "r3": 0x00000020, - "r4": 0x00000000, - "r13": 0x80480820, - "r28": 0x00000001, # 0x809e53d8, # unused? - "r29": 0x807f1048, # 0x00000002, # unused? - "r30": 0x809e53d8, - "r31": 0x809e53d8, - "f1": hex_str_to_double("3ff0000000000000"), - "f30": hex_str_to_double("ffffffffffffffff"), - "p30": hex_str_to_double("4070000000000000"), - "f31": hex_str_to_double("402d6b5aa0000000"), # unused? - "p31": hex_str_to_double("0000000000000000"), + "lr": "80185afc", + "sp": "8048e5b0", + "r3": "00000020", + "r4": "00000000", + "r13": "80480820", + "r28": "00000001", # 0x809e53d8, # unused? + "r29": "807f1048", # 0x00000002, # unused? + "r30": "809e53d8", + "r31": "809e53d8", + "f1": "3ff0000000000000", + "f30": "ffffffffffffffff", + "p30": "4070000000000000", + "f31": "402d6b5aa0000000", # unused? + "p31": "0000000000000000", } starting_ram = { # constants @@ -209,6 +210,10 @@ def walk(self): starting_ram[0x8050f0e0] = single_to_hex_str(self.nextY) exc = PPC_executor(0x80188214, starting_ram, starting_registers) + + if self.debug: + exc.breakpoints = [0x800cc2f0] + exc.execute() calcedX = hex_str_to_single( @@ -219,6 +224,7 @@ def walk(self): # check if we would pass the destination and if so stop at it if (self.nextX and ((self.nextX <= self.destX and self.destX <= calcedX) or (self.nextX >= self.destX and self.destX >= calcedX))): + print("stopping instead of going to ", single_to_hex_str(calcedX), single_to_hex_str(calcedY)) calcedX = self.destX if (self.nextY and ((self.nextY <= self.destY and self.destY <= calcedY) or diff --git a/prediction_vid.py b/prediction_vid.py index a28242a..58e6292 100644 --- a/prediction_vid.py +++ b/prediction_vid.py @@ -3,42 +3,27 @@ import numpy import os -from conversion import * -from walk_analysis import paths - -def create_frames(cors): +def create_frame(frame, x, y): """ - For each cordinate pair, output a graph to be used as a frame + For given frame and position output a graph to be used as a frame """ - - for i in range(len(cors)): - fig = plt.figure() - plt.ylim(-50, 50) - plt.xlim(-50, 50) - - plt.plot(cors[i][0], cors[i][1], "ro") - fig.savefig("frames/{}.png".format(i)) - plt.close() + fig = plt.figure() + plt.ylim(-50, 50) + plt.xlim(-50, 50) + plt.plot(x, -y, "ro") + fig.savefig("frames/{}.png".format(frame)) + plt.close() -def create_video(): +def create_video(fps=60): """ - Merges images in /frames into a 60 fps prediction video + Merges images in /frames into a prediction video """ fnames = os.listdir("frames/") fnames.sort(key= lambda a : int(a[:-4])) - videowriter = imageio.get_writer('prediction_video.mp4', fps=60) + videowriter = imageio.get_writer('prediction_video.mp4', fps=fps) for fname in fnames: videowriter.append_data(plt.imread("frames/{}".format(fname))) videowriter.close() - -positions = [] -for path in paths: - for c in path: - positions.append((hex_str_to_single(c[0]), - hex_str_to_single(c[1]))) - -create_frames(positions) -create_video() \ No newline at end of file diff --git a/prng_predictor.py b/prng_predictor.py index a9dbcda..27c6413 100644 --- a/prng_predictor.py +++ b/prng_predictor.py @@ -3,7 +3,7 @@ from npc import NPC import random -from walk_analysis import paths +from prediction_vid import create_frame, create_video def prng_range(prng_state, n): @@ -62,32 +62,29 @@ def pyrite_noise(prng_state, noise_state): lcg = LCG(seed) npc = NPC(lcg, float32(4.0), float32(24.0)) - for i in range(1, 52000): + for i in range(1, 60*60*2): npc.step() - print("step: ", i) - print("prng: ", int_to_hex_str(lcg.state)) - print("destX: ", single_to_hex_str(npc.destX)) - print("destY: ", single_to_hex_str(npc.destY)) - print("speed: ", single_to_hex_str(npc.walk_speed)) - print("currentX: ", single_to_hex_str(npc.currentX)) - print("currentY: ", single_to_hex_str(npc.currentY)) - print("wait_time: ", single_to_hex_str(npc.wait_time)) - if i >= 165: - input("press ENTER to continue") - print() - - ''' - npc.step() - assert single_to_hex_str(npc.destX) == "40327ef7" - assert single_to_hex_str(npc.destY) == "421bcddc" - if single_to_hex_str(npc.walk_speed) != "bda585a9": - raise ValueError(single_to_hex_str(npc.walk_speed)) - - for step in paths[0]: - npc.step() - if single_to_hex_str(npc.currentX).lower() != step[0].lower(): - raise ValueError("unexpected currentX", single_to_hex_str(npc.currentX), step[0]) - if single_to_hex_str(npc.currentY).lower() != step[1].lower(): - raise ValueError("unexpected currentY", single_to_hex_str(npc.currentY), step[1]) - print("good step!") - ''' + # create_frame(i, npc.currentX, npc.currentY) + + if i >= 368: + print("step: ", i) + print("prng: ", int_to_hex_str(lcg.state)) + print("destX: ", single_to_hex_str(npc.destX)) + print("destY: ", single_to_hex_str(npc.destY)) + print("speed: ", single_to_hex_str(npc.walk_speed)) + print("currentX: ", single_to_hex_str(npc.currentX)) + print("currentY: ", single_to_hex_str(npc.currentY)) + try: + print("nextX: ", single_to_hex_str(npc.nextX)) + print("nextY: ", single_to_hex_str(npc.nextY)) + except: + print("nextX: None") + print("nextY: None") + print("wait_time: ", single_to_hex_str(npc.wait_time)) + + npc.debug = True + + # input("press ENTER to continue") + print() + + # create_video(fps=18) \ No newline at end of file