From 5a7d20d39332d06ae73fc85912e866aafe2133f4 Mon Sep 17 00:00:00 2001 From: zig-for Date: Sat, 15 Apr 2023 00:17:33 -0700 Subject: [PATCH] Lua: Further centralize code, fix Bizhawk 2.9 (#1685) * Fixes the socket library for bizhawk 2.9/lua 5.4 by including another one in parallel * Fixes lua 5.4 support by making socket.lua into a "modern" module (the `module` keyword is gone) * Adds the linux version and 32 bit windows socket dlls because why not * Merges common functions into `common.lua` - the only functional change of this should be that: * Some things that were locals are globals now - this can be changed, I just was lazy and it likely doesn't matter * `drawText` now uses middle/bottom for all prints - feel free to do what you like with that change --- AdventureClient.py | 6 +- FF1Client.py | 6 +- OoTClient.py | 6 +- Zelda1Client.py | 6 +- data/lua/ADVENTURE/socket.lua | 132 ------ data/lua/FF1/core.dll | Bin 29184 -> 0 bytes data/lua/FF1/json.lua | 380 ----------------- data/lua/FF1/socket.lua | 132 ------ data/lua/OOT/core.dll | Bin 29184 -> 0 bytes data/lua/OOT/json.lua | 380 ----------------- data/lua/OOT/socket.lua | 132 ------ data/lua/PKMN_RB/core.dll | Bin 29184 -> 0 bytes data/lua/PKMN_RB/json.lua | 389 ------------------ data/lua/PKMN_RB/socket.lua | 132 ------ data/lua/TLoZ/core.dll | Bin 29184 -> 0 bytes data/lua/TLoZ/json.lua | 380 ----------------- data/lua/TLoZ/socket.lua | 132 ------ data/lua/common.lua | 102 +++++ ..._connector.lua => connector_adventure.lua} | 117 +----- .../ff1_connector.lua => connector_ff1.lua} | 108 +---- .../oot_connector.lua => connector_oot.lua} | 8 +- .../pkmn_rb.lua => connector_pkmn_rb.lua} | 55 +-- ...fZeldaConnector.lua => connector_tloz.lua} | 97 +---- data/lua/core.dll | Bin 29184 -> 0 bytes data/lua/{ADVENTURE => }/json.lua | 0 data/lua/lua_5_3_compat.lua | 12 + data/lua/socket.lua | 53 ++- data/lua/x64/luasocket.LICENSE.txt | 20 + data/lua/x64/socket-linux-5-1.so | Bin 0 -> 70808 bytes data/lua/x64/socket-linux-5-4.so | Bin 0 -> 81104 bytes data/lua/x64/socket-windows-5-1.dll | Bin 0 -> 56832 bytes data/lua/x64/socket-windows-5-4.dll | Bin 0 -> 51712 bytes data/lua/x86/luasocket.LICENSE.txt | 20 + data/lua/x86/socket-windows-5-1.dll | Bin 0 -> 40448 bytes host.yaml | 2 +- worlds/adventure/docs/setup_en.md | 6 +- worlds/ff1/docs/multiworld_en.md | 2 +- worlds/oot/docs/setup_en.md | 2 +- worlds/oot/docs/setup_fr.md | 4 +- worlds/pokemon_rb/docs/setup_en.md | 2 +- worlds/tloz/docs/multiworld_en.md | 2 +- 41 files changed, 255 insertions(+), 2570 deletions(-) delete mode 100644 data/lua/ADVENTURE/socket.lua delete mode 100644 data/lua/FF1/core.dll delete mode 100644 data/lua/FF1/json.lua delete mode 100644 data/lua/FF1/socket.lua delete mode 100644 data/lua/OOT/core.dll delete mode 100644 data/lua/OOT/json.lua delete mode 100644 data/lua/OOT/socket.lua delete mode 100644 data/lua/PKMN_RB/core.dll delete mode 100644 data/lua/PKMN_RB/json.lua delete mode 100644 data/lua/PKMN_RB/socket.lua delete mode 100644 data/lua/TLoZ/core.dll delete mode 100644 data/lua/TLoZ/json.lua delete mode 100644 data/lua/TLoZ/socket.lua create mode 100644 data/lua/common.lua rename data/lua/{ADVENTURE/adventure_connector.lua => connector_adventure.lua} (91%) rename data/lua/{FF1/ff1_connector.lua => connector_ff1.lua} (85%) rename data/lua/{OOT/oot_connector.lua => connector_oot.lua} (99%) rename data/lua/{PKMN_RB/pkmn_rb.lua => connector_pkmn_rb.lua} (89%) rename data/lua/{TLoZ/TheLegendOfZeldaConnector.lua => connector_tloz.lua} (87%) delete mode 100644 data/lua/core.dll rename data/lua/{ADVENTURE => }/json.lua (100%) create mode 100644 data/lua/lua_5_3_compat.lua create mode 100644 data/lua/x64/luasocket.LICENSE.txt create mode 100644 data/lua/x64/socket-linux-5-1.so create mode 100644 data/lua/x64/socket-linux-5-4.so create mode 100644 data/lua/x64/socket-windows-5-1.dll create mode 100644 data/lua/x64/socket-windows-5-4.dll create mode 100644 data/lua/x86/luasocket.LICENSE.txt create mode 100644 data/lua/x86/socket-windows-5-1.dll diff --git a/AdventureClient.py b/AdventureClient.py index 06eea5215c39..0977203e2b92 100644 --- a/AdventureClient.py +++ b/AdventureClient.py @@ -25,11 +25,11 @@ SYSTEM_MESSAGE_ID = 0 CONNECTION_TIMING_OUT_STATUS = \ - "Connection timing out. Please restart your emulator, then restart adventure_connector.lua" + "Connection timing out. Please restart your emulator, then restart connector_adventure.lua" CONNECTION_REFUSED_STATUS = \ - "Connection Refused. Please start your emulator and make sure adventure_connector.lua is running" + "Connection Refused. Please start your emulator and make sure connector_adventure.lua is running" CONNECTION_RESET_STATUS = \ - "Connection was reset. Please restart your emulator, then restart adventure_connector.lua" + "Connection was reset. Please restart your emulator, then restart connector_adventure.lua" CONNECTION_TENTATIVE_STATUS = "Initial Connection Made" CONNECTION_CONNECTED_STATUS = "Connected" CONNECTION_INITIAL_STATUS = "Connection has not been initiated" diff --git a/FF1Client.py b/FF1Client.py index 83c2484682fc..6256744222c3 100644 --- a/FF1Client.py +++ b/FF1Client.py @@ -13,9 +13,9 @@ SYSTEM_MESSAGE_ID = 0 -CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart ff1_connector.lua" -CONNECTION_REFUSED_STATUS = "Connection Refused. Please start your emulator and make sure ff1_connector.lua is running" -CONNECTION_RESET_STATUS = "Connection was reset. Please restart your emulator, then restart ff1_connector.lua" +CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart connector_ff1.lua" +CONNECTION_REFUSED_STATUS = "Connection Refused. Please start your emulator and make sure connector_ff1.lua is running" +CONNECTION_RESET_STATUS = "Connection was reset. Please restart your emulator, then restart connector_ff1.lua" CONNECTION_TENTATIVE_STATUS = "Initial Connection Made" CONNECTION_CONNECTED_STATUS = "Connected" CONNECTION_INITIAL_STATUS = "Connection has not been initiated" diff --git a/OoTClient.py b/OoTClient.py index f8a052402f1a..c05151a28511 100644 --- a/OoTClient.py +++ b/OoTClient.py @@ -17,9 +17,9 @@ from worlds.oot.Utils import data_path -CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart oot_connector.lua" -CONNECTION_REFUSED_STATUS = "Connection refused. Please start your emulator and make sure oot_connector.lua is running" -CONNECTION_RESET_STATUS = "Connection was reset. Please restart your emulator, then restart oot_connector.lua" +CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart connector_oot.lua" +CONNECTION_REFUSED_STATUS = "Connection refused. Please start your emulator and make sure connector_oot.lua is running" +CONNECTION_RESET_STATUS = "Connection was reset. Please restart your emulator, then restart connector_oot.lua" CONNECTION_TENTATIVE_STATUS = "Initial Connection Made" CONNECTION_CONNECTED_STATUS = "Connected" CONNECTION_INITIAL_STATUS = "Connection has not been initiated" diff --git a/Zelda1Client.py b/Zelda1Client.py index a325e4aebe78..b30bad51384f 100644 --- a/Zelda1Client.py +++ b/Zelda1Client.py @@ -23,9 +23,9 @@ SYSTEM_MESSAGE_ID = 0 -CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart Zelda_connector.lua" -CONNECTION_REFUSED_STATUS = "Connection Refused. Please start your emulator and make sure Zelda_connector.lua is running" -CONNECTION_RESET_STATUS = "Connection was reset. Please restart your emulator, then restart Zelda_connector.lua" +CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart connector_tloz.lua" +CONNECTION_REFUSED_STATUS = "Connection Refused. Please start your emulator and make sure connector_tloz.lua is running" +CONNECTION_RESET_STATUS = "Connection was reset. Please restart your emulator, then restart connector_tloz.lua" CONNECTION_TENTATIVE_STATUS = "Initial Connection Made" CONNECTION_CONNECTED_STATUS = "Connected" CONNECTION_INITIAL_STATUS = "Connection has not been initiated" diff --git a/data/lua/ADVENTURE/socket.lua b/data/lua/ADVENTURE/socket.lua deleted file mode 100644 index a98e95211544..000000000000 --- a/data/lua/ADVENTURE/socket.lua +++ /dev/null @@ -1,132 +0,0 @@ ------------------------------------------------------------------------------ --- LuaSocket helper module --- Author: Diego Nehab --- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ ------------------------------------------------------------------------------ - ------------------------------------------------------------------------------ --- Declare module and import dependencies ------------------------------------------------------------------------------ -local base = _G -local string = require("string") -local math = require("math") -local socket = require("socket.core") -module("socket") - ------------------------------------------------------------------------------ --- Exported auxiliar functions ------------------------------------------------------------------------------ -function connect(address, port, laddress, lport) - local sock, err = socket.tcp() - if not sock then return nil, err end - if laddress then - local res, err = sock:bind(laddress, lport, -1) - if not res then return nil, err end - end - local res, err = sock:connect(address, port) - if not res then return nil, err end - return sock -end - -function bind(host, port, backlog) - local sock, err = socket.tcp() - if not sock then return nil, err end - sock:setoption("reuseaddr", true) - local res, err = sock:bind(host, port) - if not res then return nil, err end - res, err = sock:listen(backlog) - if not res then return nil, err end - return sock -end - -try = newtry() - -function choose(table) - return function(name, opt1, opt2) - if base.type(name) ~= "string" then - name, opt1, opt2 = "default", name, opt1 - end - local f = table[name or "nil"] - if not f then base.error("unknown key (".. base.tostring(name) ..")", 3) - else return f(opt1, opt2) end - end -end - ------------------------------------------------------------------------------ --- Socket sources and sinks, conforming to LTN12 ------------------------------------------------------------------------------ --- create namespaces inside LuaSocket namespace -sourcet = {} -sinkt = {} - -BLOCKSIZE = 2048 - -sinkt["close-when-done"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if not chunk then - sock:close() - return 1 - else return sock:send(chunk) end - end - }) -end - -sinkt["keep-open"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if chunk then return sock:send(chunk) - else return 1 end - end - }) -end - -sinkt["default"] = sinkt["keep-open"] - -sink = choose(sinkt) - -sourcet["by-length"] = function(sock, length) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if length <= 0 then return nil end - local size = math.min(socket.BLOCKSIZE, length) - local chunk, err = sock:receive(size) - if err then return nil, err end - length = length - string.len(chunk) - return chunk - end - }) -end - -sourcet["until-closed"] = function(sock) - local done - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if done then return nil end - local chunk, err, partial = sock:receive(socket.BLOCKSIZE) - if not err then return chunk - elseif err == "closed" then - sock:close() - done = 1 - return partial - else return nil, err end - end - }) -end - - -sourcet["default"] = sourcet["until-closed"] - -source = choose(sourcet) diff --git a/data/lua/FF1/core.dll b/data/lua/FF1/core.dll deleted file mode 100644 index 3e9569571ab0947dcb7bcd789dc9c06c009d072d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29184 zcmeIbe|(hHwKw`CnS=ocGU9-vjyU3gQ9_)_OhPh~UqFIU1D#}&84x6dWWprmS0~RP zC}MDkB@R(;ORcB17OQVBr}eb7$D^@wG>{ZfX-m=4P(bM^S2qoMQsro@=-lsG&+|+Y z#GZ5S`~Gp?`#A&q_u6}}wf0(Tuf3mVCQI+$DWyn~q(g|uC8-Z7eM&g~`;kENv>Sdo zO?rOvuW#&2s`&Md)uEMUq~U?nI4>P-QjpMuas8l%ssI z!XK(2KJjNSViac0O`>Le07$TjR4E>fNKz$gEp3w2K+QWP>A57zT=Lm1NiC_8bfyll zmo$wpo@u#cZPrNAzRQiLcFK~28)f9h9f$}&qBTJT^7vRmZC1FUPR86f&P2r;1T(@i zgmIq|Or52GNlyY-sSAO|YD5_KDUqc9tZ-+z9(7DBXl5ogj{`!sgvJX8TiOA*m&V(T zkcI#n$A3yBY0>!df9L<#aljvwZTdiLv&|Ur3umz;g>-8rqhHKMwi*BYVmeh`tfR`Q z$O0^l+CKM-4~rxTJuUdhpfv6mF@`WlM^huSRrHssARAPWwF(F@xFuv}sxwjJ7o}Wp z=p(gS9jmZeokzqp&>S7K4bbGX(C+OmwHZSu^zz1MY+EB4ql2d23Y)GHOvCK|QApqh zZ^*#oo>8Ju9)MZbsKNVFmvFd^Ns+m=cf2|MU5lU1q-5xo+Zo&i)D09|3y$ zShdaI>}SsQEV1+~G50Jp_V`UbOY}WU4B~G$Nz&P+hFt>?yZg*B|Xq8mL5tz9tqjLBKW|ogX{{o)3WuiVEm z_OzK5EENoat2qhAAkbSq&06IZ?=AQ;c4<9r7IgERmcJSO?2CxW`I@J~W~hZeoJqbX zWnd+#3nNMy#xF32RUG{5!35!qufPnFN1DsHZDHJ&m}700d7^if-6|J8qPwABikw|A zRh~n*_HH-8o6gsVr+URg;EFozJi3_i5yK7Jr$nWs=%FOf=i%3eb%<|C@Oc80(Fe9L zeOrJT%;=-nSHsrc!!XJcY(1X=1hg$@o6Uxjuf`vH-d2EIAhu6Q#S^(ePC!x2-cSsR zNEYm;RJRPPGbFxEas=_O3V{9+@hG*F+FV|&UWKnxtU;N~rW+~yPU+qM4Egegw$o5( zsOJV_SKh6W+a4)NDrkvJ$8Z@{Vl&hb3^_Ld@PazjLaDvt;O9#1KcP0%p^ouJ4y&00 zk%j>S;y9`T;;7Of_FfOH;NC!ytd-)MC_#~Iq(}j=iy?o3IJU!93eurZwX5g-iZ{+A z47PQU7&QQbGAaqPS=#0ZPN9})t3~P;|E!kY zV_0h+78!1UU);uJokHt(l>%smRO^8F-s|89i<8+zo8maDcyqfH!ch_UdBro_(KzPy zFn>b(AhLe(Q*>9(98YmBWaeIe(TZNQ8Y{SWCgGs1`PTD#>|bO0szZsi)rd4CA%a}# zy$84149H6&=73w$|G;g2@dl;{_4B;BD%wmc#GS@~dw3mY+d4?Yla%Y=fKLS=+G%Wv zR>G725Y;Lm&MOuT8Q2C;Z;JsRnf5uGz7jfYtnwbh20}-1k*;8Km0uJRHg7RDdr*n3 zksJ#l>@W&`@oiK=eP&|PD)AfCrN2ntf)2(Qo2Ig<{+VE)jNm^ZMzn|(OqeCXEHLf= z5q=R&1#SVq?_>0kVEpvs@GDpF`wt`u{IV{O-{Q;Q_Y&%G1RRf_<{uRV6iL{H(fs08 z>O30K*F#LO+f<7v&6on#+=mRjsA2$wbkr?Oa(CT|0NQdXp1sYxiXQFCK^;Hs;8zweJ%Sj zkSINtnNHWu$rxoWMiHOPCkPYqF?!wv&k{Z;%RPk7LPBS$LeWCIkEPOiGGt^vuCitH ztb)r4HwwXpV2jTv;G--~XT$}=FR=2`4AguNfTq-g+^hQc_6D{$}EaLO=krAtHU z-o?Pxy!CIKUjY0pTR-LeJfM={`AEKc{~3MCA&L%AwBIXk$bvtWR=b+591mTq&7tWw zrC1pv$4KG;Q+FM)cof8#y#cJK1#?S6k3E2x-Y?HgXj!waN*v7~wit$|F)spQgv?lz3iyx}3k0Ol@mavr=2n})D!>IF%r?>?dC6~cp zL|_t}@%+M_=pf(d?2mQrqOS3yI0^LXJ|{B3)o35JOOZd-CVZ`l_dg^mrNoj_x^60k z4T7ip9ZVdC4nJ~@``XC0+fK^UA6b#)zB?&0ExJEBdLVh*$;esfYs0D6 zy%s%zBd$CJ_af1Q`tD)^ve+(ISH z@B(Dn;(?kK17j}X<5W+38rP4P4-BZ>Pd4j9Wct10KDNFF)g>EiPiju{ihCwBVxX~h zz1rVB0c5P*sJ37G7425F{cmhtzdS!}k>d1(M$8{QZ=m%w5!*tFy@fk0o0?Po;vtm1 z)X>QdrqE7i($y$YZ84?rq8;3do8=_g7?J@(jjOrRK<&378zS}clU+26Kfv-4NSso% zmocan_QDvdR=eLY*4>IM4pP(TATrpHM}L#9epDid4$V%^xp$JiXI6OR|QdE=*DLH7&IDL(OQ#d@ks;}h?p zjHU63A#N~*GJ=xPCpM!*wa-!-_lcd{ifcizRtE@b8{|4eug>O${sL%)QsEUxKjt$i zL!ae^@QKHj#?TPTK4C$L#weu}UG3bejQ_maqe1E6hle8WoC7$5q=n~QLkyz|+>DJR zcFWq;auzFR6%F}@((VH8$(9^14cJAGdo~daJ~{xZlGXU+)ta zF$}MZHMOYvNV}rGIhFL~0YzU{CTuF{qtc#6?e|=!9f}t6 zs^_}_re@sv4*C`dxv&)e=x^iV2=Jw&<^@Wj3WPuQGwc`3sCp%OHz(2N&`UW0T*Kp$ zJ360=IusMS0SYwLpi2flE*bQ&(v(l5(QfC#^|3>>328oZBoHbfWSntPqT&)#ak)Ez z%MH}~w^YrzB&oOr7{C%6rRKlD2LS>YJi#h9lZo?-KQ`i{Lq`c84L(=E=~{|zZpJKa zCI?6-VfUJfkE6N}BybNu3MYOgWk%<@g- zu#Pt?=+Ld{1BUQ3${BJz0^0m}KIOpuauRWT7JB=|^N6uX{QQAD!7h{uJ-=`vM=LcK zDT{~PaYEo4G4J%a!*nG9VLiH$;)wnv5;RxCUuWiJE7jDB2MjoUR)C@ksOo9ln=*tE zO^|aO#|N#-d@ms7`67?g$U!dZYsX#jZ$0ly)*g;1_qKF-8Bk<|wy|HM4=~Mi#!;fX zgr0r2B~jD`U4oQ>2k`jk>ki0NG3qm-d#)j~oZHwbu+iVSKjHO=u}JdI@D#SV(m z&q!V&7#44H63T)P2sr-%*0e=;;)7uw7-3PL;G8!C9Wv}L5M3#TC-Kd39`?~Gl2qgC z-Dg_^^j-!P62^KGWA|=M!v0Z;?W}i)Erdoo;)kjNqIL!$hDY%amPK(kmmVyFx>*!o zM0nwtV=duC_AX9Zxpk2EG!QB!Ybacaw!Re1qqTwr6DhNoo^zE3D#bF=L>v{HrJCMd z%(g(4$fruuH}Ny%eBvJw<7yTY@h+qdrbr#1FG6eRWU#7{roR83cw8xaxx7A6F6Ht{ zD(4}q!k;{&l@<6m5@iMcWt5|X<#hbmN_UR%$Cxa1A@I0lTjO zQefzrR7)E$xXrun#QC41#R0!XH^`&IDC{hl|5x1O0QCuosQj%pn6`B1!WeU?<+b3QB^Lv<>e9Z1jb^01AlPfp&A8S3D3K5!Ye_=!>;V z?3@W`m~VfmV;SVDt6VbnZqbE0ZpTDDY2xXTcwBqRYJpMG_dZ3lf^|Morh|D6L=T$% z;!YMgD{fk#iPGv70|C(vdi`hkeX%J>S=vh~bJxOa_8<(j=D8 z!$`1Gc%l?R4$RM@V?mbY_t?Q|JKTRex&LVhNwHgJGx zTgs>yaOp2ci5U7Mv zp^bD5_jkuy$0HB?C(7R}VD1&=SC8A*#E+G}s_-%V*jhXQR3HNoJw<7hRp~(&F&&6u zd519=aoP-YXZeMUrhsU~<6_A5>1)O>J>DH+A@+;!oQlV3V^!4f78Uu+iT@Gyy=!o| zP}t)W!{`g+wjC%nC;PBJ<)M3QB>k0X*chYd*2<3PIiq|H?q?z^Ufl=l{t~#18=8-P z6uG%MX}I9kL8{YJ9d7O-S5*z)@+u9M0F$o{btr?29>$-Tj@#dX=Hwc&6e-rwp91pW%OBoN7{iI}Ta@;|m~oxhz8dYRBv2S+Emr!=78~}04y4U^ zW8rrKIzTU;z#!Nf-pWSriXW2P><;!XV5PJ8{kORR#eM+BAcZ z4X-qySME ztFcQpa-8^06Iuw>)usoh4}%o=Ehh9miUG;9`WdRyUqN?kRIHV6i3+29byOtF(?fkK zM7~1*@YSGIhnY>FcX$dHaHKtbjV4y`;T1?lC9r%6r}=-5e#}WUXl#Hf_lh4wqQU$5k*oE}=OaCSgzw45Fi7MyQRwdqeSF`oEf=ywE~dY=cN1E*Fi z9pziZC>*RyVRR?<4=11KKQ&7keem>&(?h4zRu7y$G0`FTpXXnKdCSL%k*e*gy$!8_ zIE8ksBe&#xzbF5W${V>HqjC$fYWo#`(8@~tXU9=qHP$|yC@bwJQC9rBjE5Be?rZGz zs{S45Ba>-TOeUe=6MdKhJ_9cK@yyKEyG4&fDK4>K!;hF?tzkpo1=pcD_5kdFy|Svt zFRBe>Rq=4Y`(wG>C%zBBC@ze@_#$#`-;)^C>l1M}8<2|H-X%Id(HaKuq#70kaA^IL z+NycMBo!oCP)a=f*VIxum-xgS9-p^2bpuoH-=gO;#-3l;=tLvi@@O|uxN#cX;O9;J z#u(@#J0yte#I`p($9RKhD_c$|!BAk2$Mk{4-`T)?lMk>^lA#~Xy@2&=%aYA^Qe zlA1<{cxn2Jzr&N5Qb66=TdNnl{!Gh&qXur;o&`V10Nl+a8vt#rq{l^gK|~aRAwIg7 zyj5(4*rLtm!-Eg-x(W2!hc#L_g@4a1n zZe+u4_yz{dfYbG%QDMDbG%A1zUx6kC=v^u(R>6W*!2QC+Rq%@+pd)}w$VT%kqHGt$ zbhRT1d7sG&{vJe)wk+FhMpP+hO&fBwI3(ZjuOaHEQ~QvINWj*R^DrbTFbURRHm$*I zZ4GSEL1XWFy1FvKrkJp8;mN9m(NHrzocbzdYeezIc$}WH*}RIN`ozEDjHr1Z1%C1I zm5P{xZ6=Lv%eju&Hk=(0N76Mel_>SR7Y);+1Aa(McNrGupK>mU?XX!fx55sgN6Xeh zVu5Cm`!Y}vFQ9&mAH)TPAGB4E39J3B%kTqol8Kd*gbVn5nJ-{U4S0|Nu4I5K8OYBS z3vdX=)~|3#;|}XL^f!}E!>5fOdSX?VL=i!DV7xO_BTv%+cco1v> z<%9`fvY^(LB8a;57mq^f>HdWzhEGlRv78xtZ%-MX?-$z?sUtz1#2g=<41ac-#^jUC zZap&@taO1NDl7jL9q|qoDl}HI4b}V|MS|Mi9DiP;?{5HGWm8mp!QN39K0YXY+~}jY zsfz#)j!t|f%lcnCuPI}FaEzQyzwj~{rU^4ECSSvM2TS}iz=MsSum{A4X{}uu?ZH#?vhJ#VD_z^v>C)XOK#=tT!C z@}6JkrGk$L6NOtszO(0>`j38u8k0O3XVf8jeb&S`DzcLv2b@DEF!owf;cFo)niliB z&M=u~vY6)d7x$C)4(FfvKr!>wb(zvt(S9iXWxC>dclwJ5sB14SzvvO34G)PIqwg;AT!- zuMg12E6h+KI<6?!toJG1R9V1aW9L_8Pr3u0wDaqF0Ap)_+4~pdz_b72`L&Fw9Xr3` zg+e+6_F_|J+kCn6>%S!$RchF2)XoFRUa=oiIsQCQ(QL(ggoI$6Swv@n&ws;b0ZXOm zOw+CrVH&MC{=Z5su@0d__}~ck*>%RurHrj@q+PQE&p(es?mic-%Gn*~YlbDVs9AQ^3WxKX9oX3=Iv z(z}n7j}N5D(_%(?sRJ)jn0s-ffKlxj)hqr0X2RV)fo+oA*ZXWI`o%9mIrPr>#|E46 z)YN`xuK0mcW$MM9i)I=a9~AG|@8t|v)O!NKm_Yp6~{?CAhRHmR>JcfLs6Ax^OD0xz$3)x6LL<(4)x`xm#y)O;Y z1K7&uG->adM(XZ8JdLMiXUg=Mj7*vnBpQk zl^*`kfGWmcdVh((6O>6WYGjh_qHjhazqX6^qtCkUSVucA=C{iJ_&N9$_GJ@|y z*l>M=6mD0*=M}%gwIUeOQzk|7#dlF)qCs#O5uAY$jFt41@@MeJKp)s+ip>o8s>F^& zNBIyI4DarcG-9^jf}$wB=}7CtHuey>04kaBlN81eC{NA^aZ9sAh%CZ*U_uV4v-N(D zI*2P!#ppzCuAzhYyaWzc$EJA$col3aciQrMl9wLH4c>1b+ZO-s{6LsbPZnaQnefO6 z_;A+`MR^70kT4N3WR&?Gm>{!?aQHvjA0s|oADafeF^R3lTPb?D)0Q_bi;1$Je;1!G z@uNt=!a@9y^F$n1TPiL!v>rDk@VHUqg@VDGgaP{va(+*Y~rcjx~*{P-oN20s?a zi^Qe`79NEoz~tM1(8nq?!1IGfJ5eA@m{++n;LC8laMkqtL z3!xGrfN&2&Jwg*gJ3<8EeuS+E-$3X^_!h!HAp8K~e<1t>;pYf1BK#}D0K#hszeV^x z!byZbA-sq1KEg)`pCZH&Qty(CS0H2{NORRsQnH#!nXA+4=FUw`o1~vSEenS1@LxpQx@&b@IAbV6?SO*XYWN4@W1D<;o{9oJW~)bcCtY_6Vw z2N1*eJ${JvP#R2me9RV+e5(5oy`rmAB)$?7kF5ZvZWZ;V_d(OJ53S>YFojN;f)s;Z z#Fs=4S`r(CHXh#sD+4;?m3Yo;5>u7o_+`@AG;E;a8r0wxV3K$N1K}%NX*e3{tHvnc z;g3_>p;~o@zccop{YlQa#cUq|=Z}Y5(abi6D}b(^8P=QZ+=?l+6@h*;ca=e4% z?Hq68xQpY>9B^T*2}49G7!k%5e$D1svyb z?BdwYaVEzS$2yMn92+<`a%|$*%&~=IE5|mDGZ1^G()aQs$sY}zyJc+Gi5BkahLp(j z>BW-s`smqFoR~gL&(zso8_?RWjGot>D6lPWjGlS0F*^F7{3Ziiqi07>^q;`-7neQ8 zckp%(w28D8_oZ^d+vmEEZJKq$Lf-P$ze4Z3w(f@%Js3U8N*6sQ4QHyYO8t;h|3_(< zd|A^c2M9XScLKg1h1V24qHitg<{iGS|C6IP9gYpok?_#hb2vODwtvO0nAD@Q4a}!& zmu_kJoIlisY2!0WArP?GTk4qSnm&TAti|gZKu#qv3+kQLJWY5YeGjY9~O^$d1#B74jqueg&#R{RFiSktjvm zik=*T&2O<;Rz&o8NqL4IIOWfO0+sTt5G7&_dmSs}^tf!Z_$i9dpoVxV5qj(YQi^;icq7 zg%_^y1Sn$Vi9{?gzEgb90fW?R3_Z~bGFyR6?9)QICa z{GgJ~v0ZA_JJ2jJyI~XHZ0gXQgQHqI9V2A{~?kj!$?Q z?5ubm5Cex&iC9#}>GnyV6iF3tq8@DKZzMqf4C2@5wgPN}uH#F#kkV(CN5P<})fCV0 zQha>{#X02^7nUM!+%cnrlc^1yTwlUTY5^y6@;I6ALh|HesUak>GU=IBoa&xggS59y z|4a*&yU$?%Je0ZzXePnUeVQ7dS%uP}R4?MmI;sCqYBjg2*E2ocL+J8!0qT0XPazwh zVa57Cvl|u7N#YyCnPv!u1(l&8EMt6z8QEwd0Z0)%f)@1z6QZ%>GfZg1TmD8QuMIRC zLj5E<*;@sSsk-FHb4N+bjL-+(Wpug-{oP`0v6H18hId z&VC={t*7ilPuZyN$>p)bIg(_Ryx)KF?s>nHZ>apfvp@ZZ)OwHTsX5=XbcC;kP*sCI zqboltyNKy^@-(p;v_dAxmeIY#%GU$X+qLu30bEQ9q(t0goRCoT{?NSD@3G-m){^-m3a_{o-FnJS#Up3q$5}Pwku&k*(Loa{>qMbEC2jyZ1DNasq$>tU3`G?vpf`>_ z8Cp?3;1Bd|2imVvSz$cXc`#;qI8S0ttH+8?8@%J2tvAHO$Ika9Tv#fA8$Uiyn)PjepY z{uu76-n?NJPTZzgxxw>kcyesHKIMexv#=q0ASv3P;W-|D7f1Qkm%d>BU4NqeYB`@E~2KbiIQ8w!Q6&O0w@C-He1O=Eyxe$U;6o4)8#6WxvUhSMubzY@~ z7#8I(FnMAnw*BIUPmV^@yg$N{}6TiPDOVUAvvk0RI2GnODEJ3&%VFSWWgxv_s z08gLoNS~s<2(KU9)>6#T?Ah)V86nrK!Q%zP347FIzhR8Eml1?be&?A{(1pn(D$?_3qkQxxG^k zH?`3heb6twt!N^*N5i+mF>ghSlcIUdH^Sl84-^P*oz5QC!M_`1&a`t=j) zKwurwPowc9$j^ynY5(W6p^R%F@Tncd<36aVHP{}JrAXWQw)T75tif=&9m@{>McP{0 z>zLxs^$KpC!4@J#iZpaca(xH*8AJ&(5NT`-qEm2VeXs*H8aJtpK3(;ak$x3oBhob% z$w=QLlky~Ehgu(^6!i^AJM4f#>UB%Txi?E-$@0g$wp8mctMc9PwPn;+TUxfL=5|RUh7s10w$4aLM|&8HYHjb3 zo7&r~Yj~}(>YYKEz)+oFwbT}AT^kHrZ&vwrv$e4)*wQd27;D?xTY`0M)|=bgzSPzZ zrfV{Cb5k2+qp_|&c(b*s!&=wS5Dt>SDk5hc-+ajoG=|z0^d!b>jkJIj80PZhjcfkW zc!@TQ2l;BG#cpT{%fw7g4qBiHw6<99`EB@}%a*!LQaBjt4APW4vcyA8v^0LQIHF#YW2#qJufX&CoxwJiIaQaWmZnZQh!JT`+9;N4K&_g*S6^aE#DaoZwQ7T;QIQOreK?_ z5Q>N**g|>X_dUZts}i8YG$Q43T!C4l6RDit2cY>w)k5miBhS zVM3iO!$M*FFch7DkZ)*jlfy6wyq;JK8Jm>47LDQdR;&Zrfcr@inE|i`37%0t(x!4g z*pO%+UlR^CLU`@GbPobzvFk5YC%mmpY*O?cr9?A82YL z8`q|rqz~28dpam2o7Omz-O`Yqqn4**1ATB zzE!cJ2_68($99zvBw7{986yU?_b z*rmygX1o_FM%=1V2#Ek*lBCr)*0naZY+}ZYZ8}5`e1rD-_7?0i1R!}QmM3-qO<#lf zKoNjH@i;M*#$yuUOImPj(#D+FMOswXFgCwxg%hy%hTGfLu}VPGwAGfRrI4?>b+iGu zTU!7@d@hChG_@&Msr+CLHHFE$NXSKd0(HioWuKjgF`CA44~$u-Y>N|UzSlZY*Q$b@ z?U6792daUsye>>!{wn^ZQ3Kwk;#4aysaAZv=}6}yX!Urt zG6DCk8p-%G1nRG~9~sw9^(WP{g4T{_Mv4A+EXQ+81OxUn?NfjaamO0$HRI|Qk%v)- zI`(1|$PTIl+`e&j-$Y#j>Mr;B@AK#XzUR+?FT2*6P1`bjB?(eri=6^)Dy%P;IwGB+ zdU7fwVOaQkxGr3GFKs8%ZCt9yP9g_o-b(z5K8k-YNmo-%MJ0G_E}0zM>yD_9&^`l50qQrvq;OiL|Ec(Arh2sP~lO59SmnPDNU)N z-gIomFX1!qfTcFaLLLJSVUT>65SK{mloeabocq{&K|DWcOM9o4QF zSEupeRvtsyuI}VK1TY~?KCU4eG>m{@PL@N_g4dI756V9FKda#tF6>-_O_XwyKgGu< zo4d-YmX%d#TH{ac?7;Pj+$i0h+SyrO*VYKn!RKFGm1pMx!%4M491KIC@ZGhuGuAea(mpn~$*U~CoIhL;tO4ldV z*0px7s|{`h!=giO^f{wWw+iOX_JCQ}NwmR5|k5c%eq<+2h4}gZ*Xm8_5A4;wTLF=WAlv=gs ze$c}gB(a3~z$-L`R&uw))^=oYIK9?+{+qP4(-! z0{5@u@Kgr61HR(oakVP;RIPo~zj2X_^&=le3!}KZy@(*8{-_PU2U5rmpGH{RAj;(W z)hbnBIoa+1{`~)$1H0DZ4iP`zx&vtm?iDp!pQrMT@S&0Jw&M9J(*AMnUfeetZIZE+ z?j4b8{pcR@Xx3QSj;~LiaY;rS(%txLDi%t!C8G%`F71s5wOxnQ3OM?8o;7HvpA0(V zkc^{L&XtVkk#-?HgVc-qx2TNt2vTE?WTbC3TT!NOJdfaB^m(esID3%pMg5c1j`4RQ zrFpj@-Hq`!Qi}c>{%|pj9dj`!QvBMJu^OotX$8^|q#7LEzaB+@t^7nI=D|JfPNc^C zv3jE4xM+-iqL<1zg=NhC$kG&9c<0ZqAB89G_xaTcLdACQQuOI!0 zzAnHMeP@soeI*#5=-Z33hF<~t?VO7-k?uvR(Pu#!zc^;pBRz`x3&0PT-o`UXt>f;K z>7Mxv#?{87Ctg3l=2iNQ8~$kZ|DFEt$pIasoy33k2d^1*X;f(S$*8bjrXDXhNOZlM#60xRTF6_NYpd6WBrS~3rkDySa$pJ zQRZ0VcsBd@*{8Bi&N63(^O*BPXO3&L>*btK?zeKU&M(b>EdR~?EuKd`w->A{c(~yE z1&0d0D5x&nQFx&+v*@3Sjuic&=s$`jD_;e`=v;8*W}nTT>-@<1DZXm7%2nrTaec$} zP1jFd@3_vn;x1E8H0P0=(VXiSlq^`j;K2pw7Oc(d%ll)VKHr@0&R>=Pc>b^RZ+8dX zAG&|U4D_shH^dB^k4=KUq_)4Ut= zm*zj1|F?XDd#2mwzSW)U_PbZQ8{O;O8{GH1A9lywkGsF;{*n79?w8$fyIr39Jo8|8&7S1E!FjK9kIR?Sl=EoLrrhUqXS;84XSrQ&x4Xo>#9iU8axZtUb~m`2-5tPT zv-=_UcK4(1UGDF?cLR^-+`n-5xnFS)x?gu6bsu-1a{rrKxIb`TaR1FMdD1)v&vef% zp4&V*9*?KQQ|c-ARCv6eYR_`dD$g2EgD2!^@pO1(&qmK?PnTz#XS-*IXQyYE=Lye~ zp535rkLNkhUeEKMKF>Z+zh}^M*mJ~l)bo~S$n(>}cM9Jv94`E8;U|Tk7p4?VE;1FF zi!4RfB3n^LQD#wB(ZfYMioRL&MA1`4&ldf-Xm8OAMf-{l6df-5P0?FLe=Isv^ls7l zq7REki@qq*6;CNP7SAlU6wfZsD9$Q&6}yW|ikB2u6jv25FJ4{TP~2SHQM{pebMZsP z+lwD9-c|hF;@!nRDt@l`7sY+WuM`g!zg~Q__;~TD;(sd^#UB)3DE=GCl^4(E!F$P` zW;fWU+s*b_cANcHyWO5^FR)kH+w4w90d(X}$7)BjqubHzc---{;|0g7jz2j5-J#2# zoSmM1YxZr~p6olbz1e~6j_eKDJ=u?De-E#;l z3^}`;Z#pGcIkfB{*LK&Vu3fJ0x}J9JasABog6m&hgRVDRZ@Nyp{_Og9*Qo1rS4z&* zoS8W{=FHE@&RLXmd(P4vl7x<&O*xsluG~erOLKj>>vA{eek1n>x&M-TAotVUFLJM6 zFnhtl1#c`kz2LJ2>3K8qw&ZQgdn9jX-uLr!96yT!;T}4oz7j(C!9|@cRQbT?r}cn-0OVa+2`En z>~{`24?B-IhYC&=SPHF$dkgyt_Z7ZXI8-=VNNX*1;T;ByA=!0yJveN(TkKYFIK!T4 z&jW``?4@?Ez1qIU-T>Kev3J;I`$qd_dzXD1G+~E*C$!-S`;+$FuvmNS&)N6dpNDqr zv-jHv?T770>__cy*@x_>>}Tv}?ZSTEK4QNBJ8;o1Idl%A!{jhKEDo!~=E!hlI`XiR z<&Fx6*HI0d*Wd^_S{xk?*|E{F+0o_L2FtO-vD2~3@r2_^$8N{7jy;a&9D5zl!=CJO z^uwkQAC5ZSatt|6!M>b#j5sbhMjaO&QnoHzpKZuCW}C9j*_P~#?96N;`TuL5{~I$@ B{xARl diff --git a/data/lua/FF1/json.lua b/data/lua/FF1/json.lua deleted file mode 100644 index 0833bf6fb4eb..000000000000 --- a/data/lua/FF1/json.lua +++ /dev/null @@ -1,380 +0,0 @@ --- --- json.lua --- --- Copyright (c) 2015 rxi --- --- This library is free software; you can redistribute it and/or modify it --- under the terms of the MIT license. See LICENSE for details. --- - -local json = { _version = "0.1.0" } - -------------------------------------------------------------------------------- --- Encode -------------------------------------------------------------------------------- - -local encode - -local escape_char_map = { - [ "\\" ] = "\\\\", - [ "\"" ] = "\\\"", - [ "\b" ] = "\\b", - [ "\f" ] = "\\f", - [ "\n" ] = "\\n", - [ "\r" ] = "\\r", - [ "\t" ] = "\\t", -} - -local escape_char_map_inv = { [ "\\/" ] = "/" } -for k, v in pairs(escape_char_map) do - escape_char_map_inv[v] = k -end - - -local function escape_char(c) - return escape_char_map[c] or string.format("\\u%04x", c:byte()) -end - - -local function encode_nil(val) - return "null" -end - - -local function encode_table(val, stack) - local res = {} - stack = stack or {} - - -- Circular reference? - if stack[val] then error("circular reference") end - - stack[val] = true - - if val[1] ~= nil or next(val) == nil then - -- Treat as array -- check keys are valid and it is not sparse - local n = 0 - for k in pairs(val) do - if type(k) ~= "number" then - error("invalid table: mixed or invalid key types") - end - n = n + 1 - end - if n ~= #val then - error("invalid table: sparse array") - end - -- Encode - for i, v in ipairs(val) do - table.insert(res, encode(v, stack)) - end - stack[val] = nil - return "[" .. table.concat(res, ",") .. "]" - - else - -- Treat as an object - for k, v in pairs(val) do - if type(k) ~= "string" then - error("invalid table: mixed or invalid key types") - end - table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) - end - stack[val] = nil - return "{" .. table.concat(res, ",") .. "}" - end -end - - -local function encode_string(val) - return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' -end - - -local function encode_number(val) - -- Check for NaN, -inf and inf - if val ~= val or val <= -math.huge or val >= math.huge then - error("unexpected number value '" .. tostring(val) .. "'") - end - return string.format("%.14g", val) -end - - -local type_func_map = { - [ "nil" ] = encode_nil, - [ "table" ] = encode_table, - [ "string" ] = encode_string, - [ "number" ] = encode_number, - [ "boolean" ] = tostring, -} - - -encode = function(val, stack) - local t = type(val) - local f = type_func_map[t] - if f then - return f(val, stack) - end - error("unexpected type '" .. t .. "'") -end - - -function json.encode(val) - return ( encode(val) ) -end - - -------------------------------------------------------------------------------- --- Decode -------------------------------------------------------------------------------- - -local parse - -local function create_set(...) - local res = {} - for i = 1, select("#", ...) do - res[ select(i, ...) ] = true - end - return res -end - -local space_chars = create_set(" ", "\t", "\r", "\n") -local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") -local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") -local literals = create_set("true", "false", "null") - -local literal_map = { - [ "true" ] = true, - [ "false" ] = false, - [ "null" ] = nil, -} - - -local function next_char(str, idx, set, negate) - for i = idx, #str do - if set[str:sub(i, i)] ~= negate then - return i - end - end - return #str + 1 -end - - -local function decode_error(str, idx, msg) - --local line_count = 1 - --local col_count = 1 - --for i = 1, idx - 1 do - -- col_count = col_count + 1 - -- if str:sub(i, i) == "\n" then - -- line_count = line_count + 1 - -- col_count = 1 - -- end - -- end - -- emu.message( string.format("%s at line %d col %d", msg, line_count, col_count) ) -end - - -local function codepoint_to_utf8(n) - -- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa - local f = math.floor - if n <= 0x7f then - return string.char(n) - elseif n <= 0x7ff then - return string.char(f(n / 64) + 192, n % 64 + 128) - elseif n <= 0xffff then - return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) - elseif n <= 0x10ffff then - return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, - f(n % 4096 / 64) + 128, n % 64 + 128) - end - error( string.format("invalid unicode codepoint '%x'", n) ) -end - - -local function parse_unicode_escape(s) - local n1 = tonumber( s:sub(3, 6), 16 ) - local n2 = tonumber( s:sub(9, 12), 16 ) - -- Surrogate pair? - if n2 then - return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) - else - return codepoint_to_utf8(n1) - end -end - - -local function parse_string(str, i) - local has_unicode_escape = false - local has_surrogate_escape = false - local has_escape = false - local last - for j = i + 1, #str do - local x = str:byte(j) - - if x < 32 then - decode_error(str, j, "control character in string") - end - - if last == 92 then -- "\\" (escape char) - if x == 117 then -- "u" (unicode escape sequence) - local hex = str:sub(j + 1, j + 5) - if not hex:find("%x%x%x%x") then - decode_error(str, j, "invalid unicode escape in string") - end - if hex:find("^[dD][89aAbB]") then - has_surrogate_escape = true - else - has_unicode_escape = true - end - else - local c = string.char(x) - if not escape_chars[c] then - decode_error(str, j, "invalid escape char '" .. c .. "' in string") - end - has_escape = true - end - last = nil - - elseif x == 34 then -- '"' (end of string) - local s = str:sub(i + 1, j - 1) - if has_surrogate_escape then - s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape) - end - if has_unicode_escape then - s = s:gsub("\\u....", parse_unicode_escape) - end - if has_escape then - s = s:gsub("\\.", escape_char_map_inv) - end - return s, j + 1 - - else - last = x - end - end - decode_error(str, i, "expected closing quote for string") -end - - -local function parse_number(str, i) - local x = next_char(str, i, delim_chars) - local s = str:sub(i, x - 1) - local n = tonumber(s) - if not n then - decode_error(str, i, "invalid number '" .. s .. "'") - end - return n, x -end - - -local function parse_literal(str, i) - local x = next_char(str, i, delim_chars) - local word = str:sub(i, x - 1) - if not literals[word] then - decode_error(str, i, "invalid literal '" .. word .. "'") - end - return literal_map[word], x -end - - -local function parse_array(str, i) - local res = {} - local n = 1 - i = i + 1 - while 1 do - local x - i = next_char(str, i, space_chars, true) - -- Empty / end of array? - if str:sub(i, i) == "]" then - i = i + 1 - break - end - -- Read token - x, i = parse(str, i) - res[n] = x - n = n + 1 - -- Next token - i = next_char(str, i, space_chars, true) - local chr = str:sub(i, i) - i = i + 1 - if chr == "]" then break end - if chr ~= "," then decode_error(str, i, "expected ']' or ','") end - end - return res, i -end - - -local function parse_object(str, i) - local res = {} - i = i + 1 - while 1 do - local key, val - i = next_char(str, i, space_chars, true) - -- Empty / end of object? - if str:sub(i, i) == "}" then - i = i + 1 - break - end - -- Read key - if str:sub(i, i) ~= '"' then - decode_error(str, i, "expected string for key") - end - key, i = parse(str, i) - -- Read ':' delimiter - i = next_char(str, i, space_chars, true) - if str:sub(i, i) ~= ":" then - decode_error(str, i, "expected ':' after key") - end - i = next_char(str, i + 1, space_chars, true) - -- Read value - val, i = parse(str, i) - -- Set - res[key] = val - -- Next token - i = next_char(str, i, space_chars, true) - local chr = str:sub(i, i) - i = i + 1 - if chr == "}" then break end - if chr ~= "," then decode_error(str, i, "expected '}' or ','") end - end - return res, i -end - - -local char_func_map = { - [ '"' ] = parse_string, - [ "0" ] = parse_number, - [ "1" ] = parse_number, - [ "2" ] = parse_number, - [ "3" ] = parse_number, - [ "4" ] = parse_number, - [ "5" ] = parse_number, - [ "6" ] = parse_number, - [ "7" ] = parse_number, - [ "8" ] = parse_number, - [ "9" ] = parse_number, - [ "-" ] = parse_number, - [ "t" ] = parse_literal, - [ "f" ] = parse_literal, - [ "n" ] = parse_literal, - [ "[" ] = parse_array, - [ "{" ] = parse_object, -} - - -parse = function(str, idx) - local chr = str:sub(idx, idx) - local f = char_func_map[chr] - if f then - return f(str, idx) - end - decode_error(str, idx, "unexpected character '" .. chr .. "'") -end - - -function json.decode(str) - if type(str) ~= "string" then - error("expected argument of type string, got " .. type(str)) - end - return ( parse(str, next_char(str, 1, space_chars, true)) ) -end - - -return json \ No newline at end of file diff --git a/data/lua/FF1/socket.lua b/data/lua/FF1/socket.lua deleted file mode 100644 index a98e95211544..000000000000 --- a/data/lua/FF1/socket.lua +++ /dev/null @@ -1,132 +0,0 @@ ------------------------------------------------------------------------------ --- LuaSocket helper module --- Author: Diego Nehab --- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ ------------------------------------------------------------------------------ - ------------------------------------------------------------------------------ --- Declare module and import dependencies ------------------------------------------------------------------------------ -local base = _G -local string = require("string") -local math = require("math") -local socket = require("socket.core") -module("socket") - ------------------------------------------------------------------------------ --- Exported auxiliar functions ------------------------------------------------------------------------------ -function connect(address, port, laddress, lport) - local sock, err = socket.tcp() - if not sock then return nil, err end - if laddress then - local res, err = sock:bind(laddress, lport, -1) - if not res then return nil, err end - end - local res, err = sock:connect(address, port) - if not res then return nil, err end - return sock -end - -function bind(host, port, backlog) - local sock, err = socket.tcp() - if not sock then return nil, err end - sock:setoption("reuseaddr", true) - local res, err = sock:bind(host, port) - if not res then return nil, err end - res, err = sock:listen(backlog) - if not res then return nil, err end - return sock -end - -try = newtry() - -function choose(table) - return function(name, opt1, opt2) - if base.type(name) ~= "string" then - name, opt1, opt2 = "default", name, opt1 - end - local f = table[name or "nil"] - if not f then base.error("unknown key (".. base.tostring(name) ..")", 3) - else return f(opt1, opt2) end - end -end - ------------------------------------------------------------------------------ --- Socket sources and sinks, conforming to LTN12 ------------------------------------------------------------------------------ --- create namespaces inside LuaSocket namespace -sourcet = {} -sinkt = {} - -BLOCKSIZE = 2048 - -sinkt["close-when-done"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if not chunk then - sock:close() - return 1 - else return sock:send(chunk) end - end - }) -end - -sinkt["keep-open"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if chunk then return sock:send(chunk) - else return 1 end - end - }) -end - -sinkt["default"] = sinkt["keep-open"] - -sink = choose(sinkt) - -sourcet["by-length"] = function(sock, length) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if length <= 0 then return nil end - local size = math.min(socket.BLOCKSIZE, length) - local chunk, err = sock:receive(size) - if err then return nil, err end - length = length - string.len(chunk) - return chunk - end - }) -end - -sourcet["until-closed"] = function(sock) - local done - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if done then return nil end - local chunk, err, partial = sock:receive(socket.BLOCKSIZE) - if not err then return chunk - elseif err == "closed" then - sock:close() - done = 1 - return partial - else return nil, err end - end - }) -end - - -sourcet["default"] = sourcet["until-closed"] - -source = choose(sourcet) diff --git a/data/lua/OOT/core.dll b/data/lua/OOT/core.dll deleted file mode 100644 index 3e9569571ab0947dcb7bcd789dc9c06c009d072d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29184 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 B{xARl diff --git a/data/lua/OOT/json.lua b/data/lua/OOT/json.lua deleted file mode 100644 index 0833bf6fb4eb..000000000000 --- a/data/lua/OOT/json.lua +++ /dev/null @@ -1,380 +0,0 @@ --- --- json.lua --- --- Copyright (c) 2015 rxi --- --- This library is free software; you can redistribute it and/or modify it --- under the terms of the MIT license. See LICENSE for details. --- - -local json = { _version = "0.1.0" } - -------------------------------------------------------------------------------- --- Encode -------------------------------------------------------------------------------- - -local encode - -local escape_char_map = { - [ "\\" ] = "\\\\", - [ "\"" ] = "\\\"", - [ "\b" ] = "\\b", - [ "\f" ] = "\\f", - [ "\n" ] = "\\n", - [ "\r" ] = "\\r", - [ "\t" ] = "\\t", -} - -local escape_char_map_inv = { [ "\\/" ] = "/" } -for k, v in pairs(escape_char_map) do - escape_char_map_inv[v] = k -end - - -local function escape_char(c) - return escape_char_map[c] or string.format("\\u%04x", c:byte()) -end - - -local function encode_nil(val) - return "null" -end - - -local function encode_table(val, stack) - local res = {} - stack = stack or {} - - -- Circular reference? - if stack[val] then error("circular reference") end - - stack[val] = true - - if val[1] ~= nil or next(val) == nil then - -- Treat as array -- check keys are valid and it is not sparse - local n = 0 - for k in pairs(val) do - if type(k) ~= "number" then - error("invalid table: mixed or invalid key types") - end - n = n + 1 - end - if n ~= #val then - error("invalid table: sparse array") - end - -- Encode - for i, v in ipairs(val) do - table.insert(res, encode(v, stack)) - end - stack[val] = nil - return "[" .. table.concat(res, ",") .. "]" - - else - -- Treat as an object - for k, v in pairs(val) do - if type(k) ~= "string" then - error("invalid table: mixed or invalid key types") - end - table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) - end - stack[val] = nil - return "{" .. table.concat(res, ",") .. "}" - end -end - - -local function encode_string(val) - return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' -end - - -local function encode_number(val) - -- Check for NaN, -inf and inf - if val ~= val or val <= -math.huge or val >= math.huge then - error("unexpected number value '" .. tostring(val) .. "'") - end - return string.format("%.14g", val) -end - - -local type_func_map = { - [ "nil" ] = encode_nil, - [ "table" ] = encode_table, - [ "string" ] = encode_string, - [ "number" ] = encode_number, - [ "boolean" ] = tostring, -} - - -encode = function(val, stack) - local t = type(val) - local f = type_func_map[t] - if f then - return f(val, stack) - end - error("unexpected type '" .. t .. "'") -end - - -function json.encode(val) - return ( encode(val) ) -end - - -------------------------------------------------------------------------------- --- Decode -------------------------------------------------------------------------------- - -local parse - -local function create_set(...) - local res = {} - for i = 1, select("#", ...) do - res[ select(i, ...) ] = true - end - return res -end - -local space_chars = create_set(" ", "\t", "\r", "\n") -local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") -local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") -local literals = create_set("true", "false", "null") - -local literal_map = { - [ "true" ] = true, - [ "false" ] = false, - [ "null" ] = nil, -} - - -local function next_char(str, idx, set, negate) - for i = idx, #str do - if set[str:sub(i, i)] ~= negate then - return i - end - end - return #str + 1 -end - - -local function decode_error(str, idx, msg) - --local line_count = 1 - --local col_count = 1 - --for i = 1, idx - 1 do - -- col_count = col_count + 1 - -- if str:sub(i, i) == "\n" then - -- line_count = line_count + 1 - -- col_count = 1 - -- end - -- end - -- emu.message( string.format("%s at line %d col %d", msg, line_count, col_count) ) -end - - -local function codepoint_to_utf8(n) - -- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa - local f = math.floor - if n <= 0x7f then - return string.char(n) - elseif n <= 0x7ff then - return string.char(f(n / 64) + 192, n % 64 + 128) - elseif n <= 0xffff then - return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) - elseif n <= 0x10ffff then - return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, - f(n % 4096 / 64) + 128, n % 64 + 128) - end - error( string.format("invalid unicode codepoint '%x'", n) ) -end - - -local function parse_unicode_escape(s) - local n1 = tonumber( s:sub(3, 6), 16 ) - local n2 = tonumber( s:sub(9, 12), 16 ) - -- Surrogate pair? - if n2 then - return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) - else - return codepoint_to_utf8(n1) - end -end - - -local function parse_string(str, i) - local has_unicode_escape = false - local has_surrogate_escape = false - local has_escape = false - local last - for j = i + 1, #str do - local x = str:byte(j) - - if x < 32 then - decode_error(str, j, "control character in string") - end - - if last == 92 then -- "\\" (escape char) - if x == 117 then -- "u" (unicode escape sequence) - local hex = str:sub(j + 1, j + 5) - if not hex:find("%x%x%x%x") then - decode_error(str, j, "invalid unicode escape in string") - end - if hex:find("^[dD][89aAbB]") then - has_surrogate_escape = true - else - has_unicode_escape = true - end - else - local c = string.char(x) - if not escape_chars[c] then - decode_error(str, j, "invalid escape char '" .. c .. "' in string") - end - has_escape = true - end - last = nil - - elseif x == 34 then -- '"' (end of string) - local s = str:sub(i + 1, j - 1) - if has_surrogate_escape then - s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape) - end - if has_unicode_escape then - s = s:gsub("\\u....", parse_unicode_escape) - end - if has_escape then - s = s:gsub("\\.", escape_char_map_inv) - end - return s, j + 1 - - else - last = x - end - end - decode_error(str, i, "expected closing quote for string") -end - - -local function parse_number(str, i) - local x = next_char(str, i, delim_chars) - local s = str:sub(i, x - 1) - local n = tonumber(s) - if not n then - decode_error(str, i, "invalid number '" .. s .. "'") - end - return n, x -end - - -local function parse_literal(str, i) - local x = next_char(str, i, delim_chars) - local word = str:sub(i, x - 1) - if not literals[word] then - decode_error(str, i, "invalid literal '" .. word .. "'") - end - return literal_map[word], x -end - - -local function parse_array(str, i) - local res = {} - local n = 1 - i = i + 1 - while 1 do - local x - i = next_char(str, i, space_chars, true) - -- Empty / end of array? - if str:sub(i, i) == "]" then - i = i + 1 - break - end - -- Read token - x, i = parse(str, i) - res[n] = x - n = n + 1 - -- Next token - i = next_char(str, i, space_chars, true) - local chr = str:sub(i, i) - i = i + 1 - if chr == "]" then break end - if chr ~= "," then decode_error(str, i, "expected ']' or ','") end - end - return res, i -end - - -local function parse_object(str, i) - local res = {} - i = i + 1 - while 1 do - local key, val - i = next_char(str, i, space_chars, true) - -- Empty / end of object? - if str:sub(i, i) == "}" then - i = i + 1 - break - end - -- Read key - if str:sub(i, i) ~= '"' then - decode_error(str, i, "expected string for key") - end - key, i = parse(str, i) - -- Read ':' delimiter - i = next_char(str, i, space_chars, true) - if str:sub(i, i) ~= ":" then - decode_error(str, i, "expected ':' after key") - end - i = next_char(str, i + 1, space_chars, true) - -- Read value - val, i = parse(str, i) - -- Set - res[key] = val - -- Next token - i = next_char(str, i, space_chars, true) - local chr = str:sub(i, i) - i = i + 1 - if chr == "}" then break end - if chr ~= "," then decode_error(str, i, "expected '}' or ','") end - end - return res, i -end - - -local char_func_map = { - [ '"' ] = parse_string, - [ "0" ] = parse_number, - [ "1" ] = parse_number, - [ "2" ] = parse_number, - [ "3" ] = parse_number, - [ "4" ] = parse_number, - [ "5" ] = parse_number, - [ "6" ] = parse_number, - [ "7" ] = parse_number, - [ "8" ] = parse_number, - [ "9" ] = parse_number, - [ "-" ] = parse_number, - [ "t" ] = parse_literal, - [ "f" ] = parse_literal, - [ "n" ] = parse_literal, - [ "[" ] = parse_array, - [ "{" ] = parse_object, -} - - -parse = function(str, idx) - local chr = str:sub(idx, idx) - local f = char_func_map[chr] - if f then - return f(str, idx) - end - decode_error(str, idx, "unexpected character '" .. chr .. "'") -end - - -function json.decode(str) - if type(str) ~= "string" then - error("expected argument of type string, got " .. type(str)) - end - return ( parse(str, next_char(str, 1, space_chars, true)) ) -end - - -return json \ No newline at end of file diff --git a/data/lua/OOT/socket.lua b/data/lua/OOT/socket.lua deleted file mode 100644 index a98e95211544..000000000000 --- a/data/lua/OOT/socket.lua +++ /dev/null @@ -1,132 +0,0 @@ ------------------------------------------------------------------------------ --- LuaSocket helper module --- Author: Diego Nehab --- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ ------------------------------------------------------------------------------ - ------------------------------------------------------------------------------ --- Declare module and import dependencies ------------------------------------------------------------------------------ -local base = _G -local string = require("string") -local math = require("math") -local socket = require("socket.core") -module("socket") - ------------------------------------------------------------------------------ --- Exported auxiliar functions ------------------------------------------------------------------------------ -function connect(address, port, laddress, lport) - local sock, err = socket.tcp() - if not sock then return nil, err end - if laddress then - local res, err = sock:bind(laddress, lport, -1) - if not res then return nil, err end - end - local res, err = sock:connect(address, port) - if not res then return nil, err end - return sock -end - -function bind(host, port, backlog) - local sock, err = socket.tcp() - if not sock then return nil, err end - sock:setoption("reuseaddr", true) - local res, err = sock:bind(host, port) - if not res then return nil, err end - res, err = sock:listen(backlog) - if not res then return nil, err end - return sock -end - -try = newtry() - -function choose(table) - return function(name, opt1, opt2) - if base.type(name) ~= "string" then - name, opt1, opt2 = "default", name, opt1 - end - local f = table[name or "nil"] - if not f then base.error("unknown key (".. base.tostring(name) ..")", 3) - else return f(opt1, opt2) end - end -end - ------------------------------------------------------------------------------ --- Socket sources and sinks, conforming to LTN12 ------------------------------------------------------------------------------ --- create namespaces inside LuaSocket namespace -sourcet = {} -sinkt = {} - -BLOCKSIZE = 2048 - -sinkt["close-when-done"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if not chunk then - sock:close() - return 1 - else return sock:send(chunk) end - end - }) -end - -sinkt["keep-open"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if chunk then return sock:send(chunk) - else return 1 end - end - }) -end - -sinkt["default"] = sinkt["keep-open"] - -sink = choose(sinkt) - -sourcet["by-length"] = function(sock, length) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if length <= 0 then return nil end - local size = math.min(socket.BLOCKSIZE, length) - local chunk, err = sock:receive(size) - if err then return nil, err end - length = length - string.len(chunk) - return chunk - end - }) -end - -sourcet["until-closed"] = function(sock) - local done - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if done then return nil end - local chunk, err, partial = sock:receive(socket.BLOCKSIZE) - if not err then return chunk - elseif err == "closed" then - sock:close() - done = 1 - return partial - else return nil, err end - end - }) -end - - -sourcet["default"] = sourcet["until-closed"] - -source = choose(sourcet) diff --git a/data/lua/PKMN_RB/core.dll b/data/lua/PKMN_RB/core.dll deleted file mode 100644 index 3e9569571ab0947dcb7bcd789dc9c06c009d072d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29184 zcmeIbe|(hHwKw`CnS=ocGU9-vjyU3gQ9_)_OhPh~UqFIU1D#}&84x6dWWprmS0~RP zC}MDkB@R(;ORcB17OQVBr}eb7$D^@wG>{ZfX-m=4P(bM^S2qoMQsro@=-lsG&+|+Y z#GZ5S`~Gp?`#A&q_u6}}wf0(Tuf3mVCQI+$DWyn~q(g|uC8-Z7eM&g~`;kENv>Sdo zO?rOvuW#&2s`&Md)uEMUq~U?nI4>P-QjpMuas8l%ssI z!XK(2KJjNSViac0O`>Le07$TjR4E>fNKz$gEp3w2K+QWP>A57zT=Lm1NiC_8bfyll zmo$wpo@u#cZPrNAzRQiLcFK~28)f9h9f$}&qBTJT^7vRmZC1FUPR86f&P2r;1T(@i zgmIq|Or52GNlyY-sSAO|YD5_KDUqc9tZ-+z9(7DBXl5ogj{`!sgvJX8TiOA*m&V(T zkcI#n$A3yBY0>!df9L<#aljvwZTdiLv&|Ur3umz;g>-8rqhHKMwi*BYVmeh`tfR`Q z$O0^l+CKM-4~rxTJuUdhpfv6mF@`WlM^huSRrHssARAPWwF(F@xFuv}sxwjJ7o}Wp z=p(gS9jmZeokzqp&>S7K4bbGX(C+OmwHZSu^zz1MY+EB4ql2d23Y)GHOvCK|QApqh zZ^*#oo>8Ju9)MZbsKNVFmvFd^Ns+m=cf2|MU5lU1q-5xo+Zo&i)D09|3y$ zShdaI>}SsQEV1+~G50Jp_V`UbOY}WU4B~G$Nz&P+hFt>?yZg*B|Xq8mL5tz9tqjLBKW|ogX{{o)3WuiVEm z_OzK5EENoat2qhAAkbSq&06IZ?=AQ;c4<9r7IgERmcJSO?2CxW`I@J~W~hZeoJqbX zWnd+#3nNMy#xF32RUG{5!35!qufPnFN1DsHZDHJ&m}700d7^if-6|J8qPwABikw|A zRh~n*_HH-8o6gsVr+URg;EFozJi3_i5yK7Jr$nWs=%FOf=i%3eb%<|C@Oc80(Fe9L zeOrJT%;=-nSHsrc!!XJcY(1X=1hg$@o6Uxjuf`vH-d2EIAhu6Q#S^(ePC!x2-cSsR zNEYm;RJRPPGbFxEas=_O3V{9+@hG*F+FV|&UWKnxtU;N~rW+~yPU+qM4Egegw$o5( zsOJV_SKh6W+a4)NDrkvJ$8Z@{Vl&hb3^_Ld@PazjLaDvt;O9#1KcP0%p^ouJ4y&00 zk%j>S;y9`T;;7Of_FfOH;NC!ytd-)MC_#~Iq(}j=iy?o3IJU!93eurZwX5g-iZ{+A z47PQU7&QQbGAaqPS=#0ZPN9})t3~P;|E!kY zV_0h+78!1UU);uJokHt(l>%smRO^8F-s|89i<8+zo8maDcyqfH!ch_UdBro_(KzPy zFn>b(AhLe(Q*>9(98YmBWaeIe(TZNQ8Y{SWCgGs1`PTD#>|bO0szZsi)rd4CA%a}# zy$84149H6&=73w$|G;g2@dl;{_4B;BD%wmc#GS@~dw3mY+d4?Yla%Y=fKLS=+G%Wv zR>G725Y;Lm&MOuT8Q2C;Z;JsRnf5uGz7jfYtnwbh20}-1k*;8Km0uJRHg7RDdr*n3 zksJ#l>@W&`@oiK=eP&|PD)AfCrN2ntf)2(Qo2Ig<{+VE)jNm^ZMzn|(OqeCXEHLf= z5q=R&1#SVq?_>0kVEpvs@GDpF`wt`u{IV{O-{Q;Q_Y&%G1RRf_<{uRV6iL{H(fs08 z>O30K*F#LO+f<7v&6on#+=mRjsA2$wbkr?Oa(CT|0NQdXp1sYxiXQFCK^;Hs;8zweJ%Sj zkSINtnNHWu$rxoWMiHOPCkPYqF?!wv&k{Z;%RPk7LPBS$LeWCIkEPOiGGt^vuCitH ztb)r4HwwXpV2jTv;G--~XT$}=FR=2`4AguNfTq-g+^hQc_6D{$}EaLO=krAtHU z-o?Pxy!CIKUjY0pTR-LeJfM={`AEKc{~3MCA&L%AwBIXk$bvtWR=b+591mTq&7tWw zrC1pv$4KG;Q+FM)cof8#y#cJK1#?S6k3E2x-Y?HgXj!waN*v7~wit$|F)spQgv?lz3iyx}3k0Ol@mavr=2n})D!>IF%r?>?dC6~cp zL|_t}@%+M_=pf(d?2mQrqOS3yI0^LXJ|{B3)o35JOOZd-CVZ`l_dg^mrNoj_x^60k z4T7ip9ZVdC4nJ~@``XC0+fK^UA6b#)zB?&0ExJEBdLVh*$;esfYs0D6 zy%s%zBd$CJ_af1Q`tD)^ve+(ISH z@B(Dn;(?kK17j}X<5W+38rP4P4-BZ>Pd4j9Wct10KDNFF)g>EiPiju{ihCwBVxX~h zz1rVB0c5P*sJ37G7425F{cmhtzdS!}k>d1(M$8{QZ=m%w5!*tFy@fk0o0?Po;vtm1 z)X>QdrqE7i($y$YZ84?rq8;3do8=_g7?J@(jjOrRK<&378zS}clU+26Kfv-4NSso% zmocan_QDvdR=eLY*4>IM4pP(TATrpHM}L#9epDid4$V%^xp$JiXI6OR|QdE=*DLH7&IDL(OQ#d@ks;}h?p zjHU63A#N~*GJ=xPCpM!*wa-!-_lcd{ifcizRtE@b8{|4eug>O${sL%)QsEUxKjt$i zL!ae^@QKHj#?TPTK4C$L#weu}UG3bejQ_maqe1E6hle8WoC7$5q=n~QLkyz|+>DJR zcFWq;auzFR6%F}@((VH8$(9^14cJAGdo~daJ~{xZlGXU+)ta zF$}MZHMOYvNV}rGIhFL~0YzU{CTuF{qtc#6?e|=!9f}t6 zs^_}_re@sv4*C`dxv&)e=x^iV2=Jw&<^@Wj3WPuQGwc`3sCp%OHz(2N&`UW0T*Kp$ zJ360=IusMS0SYwLpi2flE*bQ&(v(l5(QfC#^|3>>328oZBoHbfWSntPqT&)#ak)Ez z%MH}~w^YrzB&oOr7{C%6rRKlD2LS>YJi#h9lZo?-KQ`i{Lq`c84L(=E=~{|zZpJKa zCI?6-VfUJfkE6N}BybNu3MYOgWk%<@g- zu#Pt?=+Ld{1BUQ3${BJz0^0m}KIOpuauRWT7JB=|^N6uX{QQAD!7h{uJ-=`vM=LcK zDT{~PaYEo4G4J%a!*nG9VLiH$;)wnv5;RxCUuWiJE7jDB2MjoUR)C@ksOo9ln=*tE zO^|aO#|N#-d@ms7`67?g$U!dZYsX#jZ$0ly)*g;1_qKF-8Bk<|wy|HM4=~Mi#!;fX zgr0r2B~jD`U4oQ>2k`jk>ki0NG3qm-d#)j~oZHwbu+iVSKjHO=u}JdI@D#SV(m z&q!V&7#44H63T)P2sr-%*0e=;;)7uw7-3PL;G8!C9Wv}L5M3#TC-Kd39`?~Gl2qgC z-Dg_^^j-!P62^KGWA|=M!v0Z;?W}i)Erdoo;)kjNqIL!$hDY%amPK(kmmVyFx>*!o zM0nwtV=duC_AX9Zxpk2EG!QB!Ybacaw!Re1qqTwr6DhNoo^zE3D#bF=L>v{HrJCMd z%(g(4$fruuH}Ny%eBvJw<7yTY@h+qdrbr#1FG6eRWU#7{roR83cw8xaxx7A6F6Ht{ zD(4}q!k;{&l@<6m5@iMcWt5|X<#hbmN_UR%$Cxa1A@I0lTjO zQefzrR7)E$xXrun#QC41#R0!XH^`&IDC{hl|5x1O0QCuosQj%pn6`B1!WeU?<+b3QB^Lv<>e9Z1jb^01AlPfp&A8S3D3K5!Ye_=!>;V z?3@W`m~VfmV;SVDt6VbnZqbE0ZpTDDY2xXTcwBqRYJpMG_dZ3lf^|Morh|D6L=T$% z;!YMgD{fk#iPGv70|C(vdi`hkeX%J>S=vh~bJxOa_8<(j=D8 z!$`1Gc%l?R4$RM@V?mbY_t?Q|JKTRex&LVhNwHgJGx zTgs>yaOp2ci5U7Mv zp^bD5_jkuy$0HB?C(7R}VD1&=SC8A*#E+G}s_-%V*jhXQR3HNoJw<7hRp~(&F&&6u zd519=aoP-YXZeMUrhsU~<6_A5>1)O>J>DH+A@+;!oQlV3V^!4f78Uu+iT@Gyy=!o| zP}t)W!{`g+wjC%nC;PBJ<)M3QB>k0X*chYd*2<3PIiq|H?q?z^Ufl=l{t~#18=8-P z6uG%MX}I9kL8{YJ9d7O-S5*z)@+u9M0F$o{btr?29>$-Tj@#dX=Hwc&6e-rwp91pW%OBoN7{iI}Ta@;|m~oxhz8dYRBv2S+Emr!=78~}04y4U^ zW8rrKIzTU;z#!Nf-pWSriXW2P><;!XV5PJ8{kORR#eM+BAcZ z4X-qySME ztFcQpa-8^06Iuw>)usoh4}%o=Ehh9miUG;9`WdRyUqN?kRIHV6i3+29byOtF(?fkK zM7~1*@YSGIhnY>FcX$dHaHKtbjV4y`;T1?lC9r%6r}=-5e#}WUXl#Hf_lh4wqQU$5k*oE}=OaCSgzw45Fi7MyQRwdqeSF`oEf=ywE~dY=cN1E*Fi z9pziZC>*RyVRR?<4=11KKQ&7keem>&(?h4zRu7y$G0`FTpXXnKdCSL%k*e*gy$!8_ zIE8ksBe&#xzbF5W${V>HqjC$fYWo#`(8@~tXU9=qHP$|yC@bwJQC9rBjE5Be?rZGz zs{S45Ba>-TOeUe=6MdKhJ_9cK@yyKEyG4&fDK4>K!;hF?tzkpo1=pcD_5kdFy|Svt zFRBe>Rq=4Y`(wG>C%zBBC@ze@_#$#`-;)^C>l1M}8<2|H-X%Id(HaKuq#70kaA^IL z+NycMBo!oCP)a=f*VIxum-xgS9-p^2bpuoH-=gO;#-3l;=tLvi@@O|uxN#cX;O9;J z#u(@#J0yte#I`p($9RKhD_c$|!BAk2$Mk{4-`T)?lMk>^lA#~Xy@2&=%aYA^Qe zlA1<{cxn2Jzr&N5Qb66=TdNnl{!Gh&qXur;o&`V10Nl+a8vt#rq{l^gK|~aRAwIg7 zyj5(4*rLtm!-Eg-x(W2!hc#L_g@4a1n zZe+u4_yz{dfYbG%QDMDbG%A1zUx6kC=v^u(R>6W*!2QC+Rq%@+pd)}w$VT%kqHGt$ zbhRT1d7sG&{vJe)wk+FhMpP+hO&fBwI3(ZjuOaHEQ~QvINWj*R^DrbTFbURRHm$*I zZ4GSEL1XWFy1FvKrkJp8;mN9m(NHrzocbzdYeezIc$}WH*}RIN`ozEDjHr1Z1%C1I zm5P{xZ6=Lv%eju&Hk=(0N76Mel_>SR7Y);+1Aa(McNrGupK>mU?XX!fx55sgN6Xeh zVu5Cm`!Y}vFQ9&mAH)TPAGB4E39J3B%kTqol8Kd*gbVn5nJ-{U4S0|Nu4I5K8OYBS z3vdX=)~|3#;|}XL^f!}E!>5fOdSX?VL=i!DV7xO_BTv%+cco1v> z<%9`fvY^(LB8a;57mq^f>HdWzhEGlRv78xtZ%-MX?-$z?sUtz1#2g=<41ac-#^jUC zZap&@taO1NDl7jL9q|qoDl}HI4b}V|MS|Mi9DiP;?{5HGWm8mp!QN39K0YXY+~}jY zsfz#)j!t|f%lcnCuPI}FaEzQyzwj~{rU^4ECSSvM2TS}iz=MsSum{A4X{}uu?ZH#?vhJ#VD_z^v>C)XOK#=tT!C z@}6JkrGk$L6NOtszO(0>`j38u8k0O3XVf8jeb&S`DzcLv2b@DEF!owf;cFo)niliB z&M=u~vY6)d7x$C)4(FfvKr!>wb(zvt(S9iXWxC>dclwJ5sB14SzvvO34G)PIqwg;AT!- zuMg12E6h+KI<6?!toJG1R9V1aW9L_8Pr3u0wDaqF0Ap)_+4~pdz_b72`L&Fw9Xr3` zg+e+6_F_|J+kCn6>%S!$RchF2)XoFRUa=oiIsQCQ(QL(ggoI$6Swv@n&ws;b0ZXOm zOw+CrVH&MC{=Z5su@0d__}~ck*>%RurHrj@q+PQE&p(es?mic-%Gn*~YlbDVs9AQ^3WxKX9oX3=Iv z(z}n7j}N5D(_%(?sRJ)jn0s-ffKlxj)hqr0X2RV)fo+oA*ZXWI`o%9mIrPr>#|E46 z)YN`xuK0mcW$MM9i)I=a9~AG|@8t|v)O!NKm_Yp6~{?CAhRHmR>JcfLs6Ax^OD0xz$3)x6LL<(4)x`xm#y)O;Y z1K7&uG->adM(XZ8JdLMiXUg=Mj7*vnBpQk zl^*`kfGWmcdVh((6O>6WYGjh_qHjhazqX6^qtCkUSVucA=C{iJ_&N9$_GJ@|y z*l>M=6mD0*=M}%gwIUeOQzk|7#dlF)qCs#O5uAY$jFt41@@MeJKp)s+ip>o8s>F^& zNBIyI4DarcG-9^jf}$wB=}7CtHuey>04kaBlN81eC{NA^aZ9sAh%CZ*U_uV4v-N(D zI*2P!#ppzCuAzhYyaWzc$EJA$col3aciQrMl9wLH4c>1b+ZO-s{6LsbPZnaQnefO6 z_;A+`MR^70kT4N3WR&?Gm>{!?aQHvjA0s|oADafeF^R3lTPb?D)0Q_bi;1$Je;1!G z@uNt=!a@9y^F$n1TPiL!v>rDk@VHUqg@VDGgaP{va(+*Y~rcjx~*{P-oN20s?a zi^Qe`79NEoz~tM1(8nq?!1IGfJ5eA@m{++n;LC8laMkqtL z3!xGrfN&2&Jwg*gJ3<8EeuS+E-$3X^_!h!HAp8K~e<1t>;pYf1BK#}D0K#hszeV^x z!byZbA-sq1KEg)`pCZH&Qty(CS0H2{NORRsQnH#!nXA+4=FUw`o1~vSEenS1@LxpQx@&b@IAbV6?SO*XYWN4@W1D<;o{9oJW~)bcCtY_6Vw z2N1*eJ${JvP#R2me9RV+e5(5oy`rmAB)$?7kF5ZvZWZ;V_d(OJ53S>YFojN;f)s;Z z#Fs=4S`r(CHXh#sD+4;?m3Yo;5>u7o_+`@AG;E;a8r0wxV3K$N1K}%NX*e3{tHvnc z;g3_>p;~o@zccop{YlQa#cUq|=Z}Y5(abi6D}b(^8P=QZ+=?l+6@h*;ca=e4% z?Hq68xQpY>9B^T*2}49G7!k%5e$D1svyb z?BdwYaVEzS$2yMn92+<`a%|$*%&~=IE5|mDGZ1^G()aQs$sY}zyJc+Gi5BkahLp(j z>BW-s`smqFoR~gL&(zso8_?RWjGot>D6lPWjGlS0F*^F7{3Ziiqi07>^q;`-7neQ8 zckp%(w28D8_oZ^d+vmEEZJKq$Lf-P$ze4Z3w(f@%Js3U8N*6sQ4QHyYO8t;h|3_(< zd|A^c2M9XScLKg1h1V24qHitg<{iGS|C6IP9gYpok?_#hb2vODwtvO0nAD@Q4a}!& zmu_kJoIlisY2!0WArP?GTk4qSnm&TAti|gZKu#qv3+kQLJWY5YeGjY9~O^$d1#B74jqueg&#R{RFiSktjvm zik=*T&2O<;Rz&o8NqL4IIOWfO0+sTt5G7&_dmSs}^tf!Z_$i9dpoVxV5qj(YQi^;icq7 zg%_^y1Sn$Vi9{?gzEgb90fW?R3_Z~bGFyR6?9)QICa z{GgJ~v0ZA_JJ2jJyI~XHZ0gXQgQHqI9V2A{~?kj!$?Q z?5ubm5Cex&iC9#}>GnyV6iF3tq8@DKZzMqf4C2@5wgPN}uH#F#kkV(CN5P<})fCV0 zQha>{#X02^7nUM!+%cnrlc^1yTwlUTY5^y6@;I6ALh|HesUak>GU=IBoa&xggS59y z|4a*&yU$?%Je0ZzXePnUeVQ7dS%uP}R4?MmI;sCqYBjg2*E2ocL+J8!0qT0XPazwh zVa57Cvl|u7N#YyCnPv!u1(l&8EMt6z8QEwd0Z0)%f)@1z6QZ%>GfZg1TmD8QuMIRC zLj5E<*;@sSsk-FHb4N+bjL-+(Wpug-{oP`0v6H18hId z&VC={t*7ilPuZyN$>p)bIg(_Ryx)KF?s>nHZ>apfvp@ZZ)OwHTsX5=XbcC;kP*sCI zqboltyNKy^@-(p;v_dAxmeIY#%GU$X+qLu30bEQ9q(t0goRCoT{?NSD@3G-m){^-m3a_{o-FnJS#Up3q$5}Pwku&k*(Loa{>qMbEC2jyZ1DNasq$>tU3`G?vpf`>_ z8Cp?3;1Bd|2imVvSz$cXc`#;qI8S0ttH+8?8@%J2tvAHO$Ika9Tv#fA8$Uiyn)PjepY z{uu76-n?NJPTZzgxxw>kcyesHKIMexv#=q0ASv3P;W-|D7f1Qkm%d>BU4NqeYB`@E~2KbiIQ8w!Q6&O0w@C-He1O=Eyxe$U;6o4)8#6WxvUhSMubzY@~ z7#8I(FnMAnw*BIUPmV^@yg$N{}6TiPDOVUAvvk0RI2GnODEJ3&%VFSWWgxv_s z08gLoNS~s<2(KU9)>6#T?Ah)V86nrK!Q%zP347FIzhR8Eml1?be&?A{(1pn(D$?_3qkQxxG^k zH?`3heb6twt!N^*N5i+mF>ghSlcIUdH^Sl84-^P*oz5QC!M_`1&a`t=j) zKwurwPowc9$j^ynY5(W6p^R%F@Tncd<36aVHP{}JrAXWQw)T75tif=&9m@{>McP{0 z>zLxs^$KpC!4@J#iZpaca(xH*8AJ&(5NT`-qEm2VeXs*H8aJtpK3(;ak$x3oBhob% z$w=QLlky~Ehgu(^6!i^AJM4f#>UB%Txi?E-$@0g$wp8mctMc9PwPn;+TUxfL=5|RUh7s10w$4aLM|&8HYHjb3 zo7&r~Yj~}(>YYKEz)+oFwbT}AT^kHrZ&vwrv$e4)*wQd27;D?xTY`0M)|=bgzSPzZ zrfV{Cb5k2+qp_|&c(b*s!&=wS5Dt>SDk5hc-+ajoG=|z0^d!b>jkJIj80PZhjcfkW zc!@TQ2l;BG#cpT{%fw7g4qBiHw6<99`EB@}%a*!LQaBjt4APW4vcyA8v^0LQIHF#YW2#qJufX&CoxwJiIaQaWmZnZQh!JT`+9;N4K&_g*S6^aE#DaoZwQ7T;QIQOreK?_ z5Q>N**g|>X_dUZts}i8YG$Q43T!C4l6RDit2cY>w)k5miBhS zVM3iO!$M*FFch7DkZ)*jlfy6wyq;JK8Jm>47LDQdR;&Zrfcr@inE|i`37%0t(x!4g z*pO%+UlR^CLU`@GbPobzvFk5YC%mmpY*O?cr9?A82YL z8`q|rqz~28dpam2o7Omz-O`Yqqn4**1ATB zzE!cJ2_68($99zvBw7{986yU?_b z*rmygX1o_FM%=1V2#Ek*lBCr)*0naZY+}ZYZ8}5`e1rD-_7?0i1R!}QmM3-qO<#lf zKoNjH@i;M*#$yuUOImPj(#D+FMOswXFgCwxg%hy%hTGfLu}VPGwAGfRrI4?>b+iGu zTU!7@d@hChG_@&Msr+CLHHFE$NXSKd0(HioWuKjgF`CA44~$u-Y>N|UzSlZY*Q$b@ z?U6792daUsye>>!{wn^ZQ3Kwk;#4aysaAZv=}6}yX!Urt zG6DCk8p-%G1nRG~9~sw9^(WP{g4T{_Mv4A+EXQ+81OxUn?NfjaamO0$HRI|Qk%v)- zI`(1|$PTIl+`e&j-$Y#j>Mr;B@AK#XzUR+?FT2*6P1`bjB?(eri=6^)Dy%P;IwGB+ zdU7fwVOaQkxGr3GFKs8%ZCt9yP9g_o-b(z5K8k-YNmo-%MJ0G_E}0zM>yD_9&^`l50qQrvq;OiL|Ec(Arh2sP~lO59SmnPDNU)N z-gIomFX1!qfTcFaLLLJSVUT>65SK{mloeabocq{&K|DWcOM9o4QF zSEupeRvtsyuI}VK1TY~?KCU4eG>m{@PL@N_g4dI756V9FKda#tF6>-_O_XwyKgGu< zo4d-YmX%d#TH{ac?7;Pj+$i0h+SyrO*VYKn!RKFGm1pMx!%4M491KIC@ZGhuGuAea(mpn~$*U~CoIhL;tO4ldV z*0px7s|{`h!=giO^f{wWw+iOX_JCQ}NwmR5|k5c%eq<+2h4}gZ*Xm8_5A4;wTLF=WAlv=gs ze$c}gB(a3~z$-L`R&uw))^=oYIK9?+{+qP4(-! z0{5@u@Kgr61HR(oakVP;RIPo~zj2X_^&=le3!}KZy@(*8{-_PU2U5rmpGH{RAj;(W z)hbnBIoa+1{`~)$1H0DZ4iP`zx&vtm?iDp!pQrMT@S&0Jw&M9J(*AMnUfeetZIZE+ z?j4b8{pcR@Xx3QSj;~LiaY;rS(%txLDi%t!C8G%`F71s5wOxnQ3OM?8o;7HvpA0(V zkc^{L&XtVkk#-?HgVc-qx2TNt2vTE?WTbC3TT!NOJdfaB^m(esID3%pMg5c1j`4RQ zrFpj@-Hq`!Qi}c>{%|pj9dj`!QvBMJu^OotX$8^|q#7LEzaB+@t^7nI=D|JfPNc^C zv3jE4xM+-iqL<1zg=NhC$kG&9c<0ZqAB89G_xaTcLdACQQuOI!0 zzAnHMeP@soeI*#5=-Z33hF<~t?VO7-k?uvR(Pu#!zc^;pBRz`x3&0PT-o`UXt>f;K z>7Mxv#?{87Ctg3l=2iNQ8~$kZ|DFEt$pIasoy33k2d^1*X;f(S$*8bjrXDXhNOZlM#60xRTF6_NYpd6WBrS~3rkDySa$pJ zQRZ0VcsBd@*{8Bi&N63(^O*BPXO3&L>*btK?zeKU&M(b>EdR~?EuKd`w->A{c(~yE z1&0d0D5x&nQFx&+v*@3Sjuic&=s$`jD_;e`=v;8*W}nTT>-@<1DZXm7%2nrTaec$} zP1jFd@3_vn;x1E8H0P0=(VXiSlq^`j;K2pw7Oc(d%ll)VKHr@0&R>=Pc>b^RZ+8dX zAG&|U4D_shH^dB^k4=KUq_)4Ut= zm*zj1|F?XDd#2mwzSW)U_PbZQ8{O;O8{GH1A9lywkGsF;{*n79?w8$fyIr39Jo8|8&7S1E!FjK9kIR?Sl=EoLrrhUqXS;84XSrQ&x4Xo>#9iU8axZtUb~m`2-5tPT zv-=_UcK4(1UGDF?cLR^-+`n-5xnFS)x?gu6bsu-1a{rrKxIb`TaR1FMdD1)v&vef% zp4&V*9*?KQQ|c-ARCv6eYR_`dD$g2EgD2!^@pO1(&qmK?PnTz#XS-*IXQyYE=Lye~ zp535rkLNkhUeEKMKF>Z+zh}^M*mJ~l)bo~S$n(>}cM9Jv94`E8;U|Tk7p4?VE;1FF zi!4RfB3n^LQD#wB(ZfYMioRL&MA1`4&ldf-Xm8OAMf-{l6df-5P0?FLe=Isv^ls7l zq7REki@qq*6;CNP7SAlU6wfZsD9$Q&6}yW|ikB2u6jv25FJ4{TP~2SHQM{pebMZsP z+lwD9-c|hF;@!nRDt@l`7sY+WuM`g!zg~Q__;~TD;(sd^#UB)3DE=GCl^4(E!F$P` zW;fWU+s*b_cANcHyWO5^FR)kH+w4w90d(X}$7)BjqubHzc---{;|0g7jz2j5-J#2# zoSmM1YxZr~p6olbz1e~6j_eKDJ=u?De-E#;l z3^}`;Z#pGcIkfB{*LK&Vu3fJ0x}J9JasABog6m&hgRVDRZ@Nyp{_Og9*Qo1rS4z&* zoS8W{=FHE@&RLXmd(P4vl7x<&O*xsluG~erOLKj>>vA{eek1n>x&M-TAotVUFLJM6 zFnhtl1#c`kz2LJ2>3K8qw&ZQgdn9jX-uLr!96yT!;T}4oz7j(C!9|@cRQbT?r}cn-0OVa+2`En z>~{`24?B-IhYC&=SPHF$dkgyt_Z7ZXI8-=VNNX*1;T;ByA=!0yJveN(TkKYFIK!T4 z&jW``?4@?Ez1qIU-T>Kev3J;I`$qd_dzXD1G+~E*C$!-S`;+$FuvmNS&)N6dpNDqr zv-jHv?T770>__cy*@x_>>}Tv}?ZSTEK4QNBJ8;o1Idl%A!{jhKEDo!~=E!hlI`XiR z<&Fx6*HI0d*Wd^_S{xk?*|E{F+0o_L2FtO-vD2~3@r2_^$8N{7jy;a&9D5zl!=CJO z^uwkQAC5ZSatt|6!M>b#j5sbhMjaO&QnoHzpKZuCW}C9j*_P~#?96N;`TuL5{~I$@ B{xARl diff --git a/data/lua/PKMN_RB/json.lua b/data/lua/PKMN_RB/json.lua deleted file mode 100644 index a1f6e4ede24e..000000000000 --- a/data/lua/PKMN_RB/json.lua +++ /dev/null @@ -1,389 +0,0 @@ --- --- json.lua --- --- Copyright (c) 2015 rxi --- --- This library is free software; you can redistribute it and/or modify it --- under the terms of the MIT license. See LICENSE for details. --- - -local json = { _version = "0.1.0" } - -------------------------------------------------------------------------------- --- Encode -------------------------------------------------------------------------------- - -local encode - -function error(err) - print(err) -end - -local escape_char_map = { - [ "\\" ] = "\\\\", - [ "\"" ] = "\\\"", - [ "\b" ] = "\\b", - [ "\f" ] = "\\f", - [ "\n" ] = "\\n", - [ "\r" ] = "\\r", - [ "\t" ] = "\\t", -} - -local escape_char_map_inv = { [ "\\/" ] = "/" } -for k, v in pairs(escape_char_map) do - escape_char_map_inv[v] = k -end - - -local function escape_char(c) - return escape_char_map[c] or string.format("\\u%04x", c:byte()) -end - - -local function encode_nil(val) - return "null" -end - - -local function encode_table(val, stack) - local res = {} - stack = stack or {} - - -- Circular reference? - if stack[val] then error("circular reference") end - - stack[val] = true - - if val[1] ~= nil or next(val) == nil then - -- Treat as array -- check keys are valid and it is not sparse - local n = 0 - for k in pairs(val) do - if type(k) ~= "number" then - error("invalid table: mixed or invalid key types") - end - n = n + 1 - end - if n ~= #val then - print("invalid table: sparse array") - print(n) - print("VAL:") - print(val) - print("STACK:") - print(stack) - end - -- Encode - for i, v in ipairs(val) do - table.insert(res, encode(v, stack)) - end - stack[val] = nil - return "[" .. table.concat(res, ",") .. "]" - - else - -- Treat as an object - for k, v in pairs(val) do - if type(k) ~= "string" then - error("invalid table: mixed or invalid key types") - end - table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) - end - stack[val] = nil - return "{" .. table.concat(res, ",") .. "}" - end -end - - -local function encode_string(val) - return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' -end - - -local function encode_number(val) - -- Check for NaN, -inf and inf - if val ~= val or val <= -math.huge or val >= math.huge then - error("unexpected number value '" .. tostring(val) .. "'") - end - return string.format("%.14g", val) -end - - -local type_func_map = { - [ "nil" ] = encode_nil, - [ "table" ] = encode_table, - [ "string" ] = encode_string, - [ "number" ] = encode_number, - [ "boolean" ] = tostring, -} - - -encode = function(val, stack) - local t = type(val) - local f = type_func_map[t] - if f then - return f(val, stack) - end - error("unexpected type '" .. t .. "'") -end - - -function json.encode(val) - return ( encode(val) ) -end - - -------------------------------------------------------------------------------- --- Decode -------------------------------------------------------------------------------- - -local parse - -local function create_set(...) - local res = {} - for i = 1, select("#", ...) do - res[ select(i, ...) ] = true - end - return res -end - -local space_chars = create_set(" ", "\t", "\r", "\n") -local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") -local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") -local literals = create_set("true", "false", "null") - -local literal_map = { - [ "true" ] = true, - [ "false" ] = false, - [ "null" ] = nil, -} - - -local function next_char(str, idx, set, negate) - for i = idx, #str do - if set[str:sub(i, i)] ~= negate then - return i - end - end - return #str + 1 -end - - -local function decode_error(str, idx, msg) - --local line_count = 1 - --local col_count = 1 - --for i = 1, idx - 1 do - -- col_count = col_count + 1 - -- if str:sub(i, i) == "\n" then - -- line_count = line_count + 1 - -- col_count = 1 - -- end - -- end - -- emu.message( string.format("%s at line %d col %d", msg, line_count, col_count) ) -end - - -local function codepoint_to_utf8(n) - -- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa - local f = math.floor - if n <= 0x7f then - return string.char(n) - elseif n <= 0x7ff then - return string.char(f(n / 64) + 192, n % 64 + 128) - elseif n <= 0xffff then - return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) - elseif n <= 0x10ffff then - return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, - f(n % 4096 / 64) + 128, n % 64 + 128) - end - error( string.format("invalid unicode codepoint '%x'", n) ) -end - - -local function parse_unicode_escape(s) - local n1 = tonumber( s:sub(3, 6), 16 ) - local n2 = tonumber( s:sub(9, 12), 16 ) - -- Surrogate pair? - if n2 then - return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) - else - return codepoint_to_utf8(n1) - end -end - - -local function parse_string(str, i) - local has_unicode_escape = false - local has_surrogate_escape = false - local has_escape = false - local last - for j = i + 1, #str do - local x = str:byte(j) - - if x < 32 then - decode_error(str, j, "control character in string") - end - - if last == 92 then -- "\\" (escape char) - if x == 117 then -- "u" (unicode escape sequence) - local hex = str:sub(j + 1, j + 5) - if not hex:find("%x%x%x%x") then - decode_error(str, j, "invalid unicode escape in string") - end - if hex:find("^[dD][89aAbB]") then - has_surrogate_escape = true - else - has_unicode_escape = true - end - else - local c = string.char(x) - if not escape_chars[c] then - decode_error(str, j, "invalid escape char '" .. c .. "' in string") - end - has_escape = true - end - last = nil - - elseif x == 34 then -- '"' (end of string) - local s = str:sub(i + 1, j - 1) - if has_surrogate_escape then - s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape) - end - if has_unicode_escape then - s = s:gsub("\\u....", parse_unicode_escape) - end - if has_escape then - s = s:gsub("\\.", escape_char_map_inv) - end - return s, j + 1 - - else - last = x - end - end - decode_error(str, i, "expected closing quote for string") -end - - -local function parse_number(str, i) - local x = next_char(str, i, delim_chars) - local s = str:sub(i, x - 1) - local n = tonumber(s) - if not n then - decode_error(str, i, "invalid number '" .. s .. "'") - end - return n, x -end - - -local function parse_literal(str, i) - local x = next_char(str, i, delim_chars) - local word = str:sub(i, x - 1) - if not literals[word] then - decode_error(str, i, "invalid literal '" .. word .. "'") - end - return literal_map[word], x -end - - -local function parse_array(str, i) - local res = {} - local n = 1 - i = i + 1 - while 1 do - local x - i = next_char(str, i, space_chars, true) - -- Empty / end of array? - if str:sub(i, i) == "]" then - i = i + 1 - break - end - -- Read token - x, i = parse(str, i) - res[n] = x - n = n + 1 - -- Next token - i = next_char(str, i, space_chars, true) - local chr = str:sub(i, i) - i = i + 1 - if chr == "]" then break end - if chr ~= "," then decode_error(str, i, "expected ']' or ','") end - end - return res, i -end - - -local function parse_object(str, i) - local res = {} - i = i + 1 - while 1 do - local key, val - i = next_char(str, i, space_chars, true) - -- Empty / end of object? - if str:sub(i, i) == "}" then - i = i + 1 - break - end - -- Read key - if str:sub(i, i) ~= '"' then - decode_error(str, i, "expected string for key") - end - key, i = parse(str, i) - -- Read ':' delimiter - i = next_char(str, i, space_chars, true) - if str:sub(i, i) ~= ":" then - decode_error(str, i, "expected ':' after key") - end - i = next_char(str, i + 1, space_chars, true) - -- Read value - val, i = parse(str, i) - -- Set - res[key] = val - -- Next token - i = next_char(str, i, space_chars, true) - local chr = str:sub(i, i) - i = i + 1 - if chr == "}" then break end - if chr ~= "," then decode_error(str, i, "expected '}' or ','") end - end - return res, i -end - - -local char_func_map = { - [ '"' ] = parse_string, - [ "0" ] = parse_number, - [ "1" ] = parse_number, - [ "2" ] = parse_number, - [ "3" ] = parse_number, - [ "4" ] = parse_number, - [ "5" ] = parse_number, - [ "6" ] = parse_number, - [ "7" ] = parse_number, - [ "8" ] = parse_number, - [ "9" ] = parse_number, - [ "-" ] = parse_number, - [ "t" ] = parse_literal, - [ "f" ] = parse_literal, - [ "n" ] = parse_literal, - [ "[" ] = parse_array, - [ "{" ] = parse_object, -} - - -parse = function(str, idx) - local chr = str:sub(idx, idx) - local f = char_func_map[chr] - if f then - return f(str, idx) - end - decode_error(str, idx, "unexpected character '" .. chr .. "'") -end - - -function json.decode(str) - if type(str) ~= "string" then - error("expected argument of type string, got " .. type(str)) - end - return ( parse(str, next_char(str, 1, space_chars, true)) ) -end - - -return json \ No newline at end of file diff --git a/data/lua/PKMN_RB/socket.lua b/data/lua/PKMN_RB/socket.lua deleted file mode 100644 index a98e95211544..000000000000 --- a/data/lua/PKMN_RB/socket.lua +++ /dev/null @@ -1,132 +0,0 @@ ------------------------------------------------------------------------------ --- LuaSocket helper module --- Author: Diego Nehab --- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ ------------------------------------------------------------------------------ - ------------------------------------------------------------------------------ --- Declare module and import dependencies ------------------------------------------------------------------------------ -local base = _G -local string = require("string") -local math = require("math") -local socket = require("socket.core") -module("socket") - ------------------------------------------------------------------------------ --- Exported auxiliar functions ------------------------------------------------------------------------------ -function connect(address, port, laddress, lport) - local sock, err = socket.tcp() - if not sock then return nil, err end - if laddress then - local res, err = sock:bind(laddress, lport, -1) - if not res then return nil, err end - end - local res, err = sock:connect(address, port) - if not res then return nil, err end - return sock -end - -function bind(host, port, backlog) - local sock, err = socket.tcp() - if not sock then return nil, err end - sock:setoption("reuseaddr", true) - local res, err = sock:bind(host, port) - if not res then return nil, err end - res, err = sock:listen(backlog) - if not res then return nil, err end - return sock -end - -try = newtry() - -function choose(table) - return function(name, opt1, opt2) - if base.type(name) ~= "string" then - name, opt1, opt2 = "default", name, opt1 - end - local f = table[name or "nil"] - if not f then base.error("unknown key (".. base.tostring(name) ..")", 3) - else return f(opt1, opt2) end - end -end - ------------------------------------------------------------------------------ --- Socket sources and sinks, conforming to LTN12 ------------------------------------------------------------------------------ --- create namespaces inside LuaSocket namespace -sourcet = {} -sinkt = {} - -BLOCKSIZE = 2048 - -sinkt["close-when-done"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if not chunk then - sock:close() - return 1 - else return sock:send(chunk) end - end - }) -end - -sinkt["keep-open"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if chunk then return sock:send(chunk) - else return 1 end - end - }) -end - -sinkt["default"] = sinkt["keep-open"] - -sink = choose(sinkt) - -sourcet["by-length"] = function(sock, length) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if length <= 0 then return nil end - local size = math.min(socket.BLOCKSIZE, length) - local chunk, err = sock:receive(size) - if err then return nil, err end - length = length - string.len(chunk) - return chunk - end - }) -end - -sourcet["until-closed"] = function(sock) - local done - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if done then return nil end - local chunk, err, partial = sock:receive(socket.BLOCKSIZE) - if not err then return chunk - elseif err == "closed" then - sock:close() - done = 1 - return partial - else return nil, err end - end - }) -end - - -sourcet["default"] = sourcet["until-closed"] - -source = choose(sourcet) diff --git a/data/lua/TLoZ/core.dll b/data/lua/TLoZ/core.dll deleted file mode 100644 index 3e9569571ab0947dcb7bcd789dc9c06c009d072d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29184 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 B{xARl diff --git a/data/lua/TLoZ/json.lua b/data/lua/TLoZ/json.lua deleted file mode 100644 index 0833bf6fb4eb..000000000000 --- a/data/lua/TLoZ/json.lua +++ /dev/null @@ -1,380 +0,0 @@ --- --- json.lua --- --- Copyright (c) 2015 rxi --- --- This library is free software; you can redistribute it and/or modify it --- under the terms of the MIT license. See LICENSE for details. --- - -local json = { _version = "0.1.0" } - -------------------------------------------------------------------------------- --- Encode -------------------------------------------------------------------------------- - -local encode - -local escape_char_map = { - [ "\\" ] = "\\\\", - [ "\"" ] = "\\\"", - [ "\b" ] = "\\b", - [ "\f" ] = "\\f", - [ "\n" ] = "\\n", - [ "\r" ] = "\\r", - [ "\t" ] = "\\t", -} - -local escape_char_map_inv = { [ "\\/" ] = "/" } -for k, v in pairs(escape_char_map) do - escape_char_map_inv[v] = k -end - - -local function escape_char(c) - return escape_char_map[c] or string.format("\\u%04x", c:byte()) -end - - -local function encode_nil(val) - return "null" -end - - -local function encode_table(val, stack) - local res = {} - stack = stack or {} - - -- Circular reference? - if stack[val] then error("circular reference") end - - stack[val] = true - - if val[1] ~= nil or next(val) == nil then - -- Treat as array -- check keys are valid and it is not sparse - local n = 0 - for k in pairs(val) do - if type(k) ~= "number" then - error("invalid table: mixed or invalid key types") - end - n = n + 1 - end - if n ~= #val then - error("invalid table: sparse array") - end - -- Encode - for i, v in ipairs(val) do - table.insert(res, encode(v, stack)) - end - stack[val] = nil - return "[" .. table.concat(res, ",") .. "]" - - else - -- Treat as an object - for k, v in pairs(val) do - if type(k) ~= "string" then - error("invalid table: mixed or invalid key types") - end - table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) - end - stack[val] = nil - return "{" .. table.concat(res, ",") .. "}" - end -end - - -local function encode_string(val) - return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' -end - - -local function encode_number(val) - -- Check for NaN, -inf and inf - if val ~= val or val <= -math.huge or val >= math.huge then - error("unexpected number value '" .. tostring(val) .. "'") - end - return string.format("%.14g", val) -end - - -local type_func_map = { - [ "nil" ] = encode_nil, - [ "table" ] = encode_table, - [ "string" ] = encode_string, - [ "number" ] = encode_number, - [ "boolean" ] = tostring, -} - - -encode = function(val, stack) - local t = type(val) - local f = type_func_map[t] - if f then - return f(val, stack) - end - error("unexpected type '" .. t .. "'") -end - - -function json.encode(val) - return ( encode(val) ) -end - - -------------------------------------------------------------------------------- --- Decode -------------------------------------------------------------------------------- - -local parse - -local function create_set(...) - local res = {} - for i = 1, select("#", ...) do - res[ select(i, ...) ] = true - end - return res -end - -local space_chars = create_set(" ", "\t", "\r", "\n") -local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") -local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") -local literals = create_set("true", "false", "null") - -local literal_map = { - [ "true" ] = true, - [ "false" ] = false, - [ "null" ] = nil, -} - - -local function next_char(str, idx, set, negate) - for i = idx, #str do - if set[str:sub(i, i)] ~= negate then - return i - end - end - return #str + 1 -end - - -local function decode_error(str, idx, msg) - --local line_count = 1 - --local col_count = 1 - --for i = 1, idx - 1 do - -- col_count = col_count + 1 - -- if str:sub(i, i) == "\n" then - -- line_count = line_count + 1 - -- col_count = 1 - -- end - -- end - -- emu.message( string.format("%s at line %d col %d", msg, line_count, col_count) ) -end - - -local function codepoint_to_utf8(n) - -- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa - local f = math.floor - if n <= 0x7f then - return string.char(n) - elseif n <= 0x7ff then - return string.char(f(n / 64) + 192, n % 64 + 128) - elseif n <= 0xffff then - return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) - elseif n <= 0x10ffff then - return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, - f(n % 4096 / 64) + 128, n % 64 + 128) - end - error( string.format("invalid unicode codepoint '%x'", n) ) -end - - -local function parse_unicode_escape(s) - local n1 = tonumber( s:sub(3, 6), 16 ) - local n2 = tonumber( s:sub(9, 12), 16 ) - -- Surrogate pair? - if n2 then - return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) - else - return codepoint_to_utf8(n1) - end -end - - -local function parse_string(str, i) - local has_unicode_escape = false - local has_surrogate_escape = false - local has_escape = false - local last - for j = i + 1, #str do - local x = str:byte(j) - - if x < 32 then - decode_error(str, j, "control character in string") - end - - if last == 92 then -- "\\" (escape char) - if x == 117 then -- "u" (unicode escape sequence) - local hex = str:sub(j + 1, j + 5) - if not hex:find("%x%x%x%x") then - decode_error(str, j, "invalid unicode escape in string") - end - if hex:find("^[dD][89aAbB]") then - has_surrogate_escape = true - else - has_unicode_escape = true - end - else - local c = string.char(x) - if not escape_chars[c] then - decode_error(str, j, "invalid escape char '" .. c .. "' in string") - end - has_escape = true - end - last = nil - - elseif x == 34 then -- '"' (end of string) - local s = str:sub(i + 1, j - 1) - if has_surrogate_escape then - s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape) - end - if has_unicode_escape then - s = s:gsub("\\u....", parse_unicode_escape) - end - if has_escape then - s = s:gsub("\\.", escape_char_map_inv) - end - return s, j + 1 - - else - last = x - end - end - decode_error(str, i, "expected closing quote for string") -end - - -local function parse_number(str, i) - local x = next_char(str, i, delim_chars) - local s = str:sub(i, x - 1) - local n = tonumber(s) - if not n then - decode_error(str, i, "invalid number '" .. s .. "'") - end - return n, x -end - - -local function parse_literal(str, i) - local x = next_char(str, i, delim_chars) - local word = str:sub(i, x - 1) - if not literals[word] then - decode_error(str, i, "invalid literal '" .. word .. "'") - end - return literal_map[word], x -end - - -local function parse_array(str, i) - local res = {} - local n = 1 - i = i + 1 - while 1 do - local x - i = next_char(str, i, space_chars, true) - -- Empty / end of array? - if str:sub(i, i) == "]" then - i = i + 1 - break - end - -- Read token - x, i = parse(str, i) - res[n] = x - n = n + 1 - -- Next token - i = next_char(str, i, space_chars, true) - local chr = str:sub(i, i) - i = i + 1 - if chr == "]" then break end - if chr ~= "," then decode_error(str, i, "expected ']' or ','") end - end - return res, i -end - - -local function parse_object(str, i) - local res = {} - i = i + 1 - while 1 do - local key, val - i = next_char(str, i, space_chars, true) - -- Empty / end of object? - if str:sub(i, i) == "}" then - i = i + 1 - break - end - -- Read key - if str:sub(i, i) ~= '"' then - decode_error(str, i, "expected string for key") - end - key, i = parse(str, i) - -- Read ':' delimiter - i = next_char(str, i, space_chars, true) - if str:sub(i, i) ~= ":" then - decode_error(str, i, "expected ':' after key") - end - i = next_char(str, i + 1, space_chars, true) - -- Read value - val, i = parse(str, i) - -- Set - res[key] = val - -- Next token - i = next_char(str, i, space_chars, true) - local chr = str:sub(i, i) - i = i + 1 - if chr == "}" then break end - if chr ~= "," then decode_error(str, i, "expected '}' or ','") end - end - return res, i -end - - -local char_func_map = { - [ '"' ] = parse_string, - [ "0" ] = parse_number, - [ "1" ] = parse_number, - [ "2" ] = parse_number, - [ "3" ] = parse_number, - [ "4" ] = parse_number, - [ "5" ] = parse_number, - [ "6" ] = parse_number, - [ "7" ] = parse_number, - [ "8" ] = parse_number, - [ "9" ] = parse_number, - [ "-" ] = parse_number, - [ "t" ] = parse_literal, - [ "f" ] = parse_literal, - [ "n" ] = parse_literal, - [ "[" ] = parse_array, - [ "{" ] = parse_object, -} - - -parse = function(str, idx) - local chr = str:sub(idx, idx) - local f = char_func_map[chr] - if f then - return f(str, idx) - end - decode_error(str, idx, "unexpected character '" .. chr .. "'") -end - - -function json.decode(str) - if type(str) ~= "string" then - error("expected argument of type string, got " .. type(str)) - end - return ( parse(str, next_char(str, 1, space_chars, true)) ) -end - - -return json \ No newline at end of file diff --git a/data/lua/TLoZ/socket.lua b/data/lua/TLoZ/socket.lua deleted file mode 100644 index a98e95211544..000000000000 --- a/data/lua/TLoZ/socket.lua +++ /dev/null @@ -1,132 +0,0 @@ ------------------------------------------------------------------------------ --- LuaSocket helper module --- Author: Diego Nehab --- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ ------------------------------------------------------------------------------ - ------------------------------------------------------------------------------ --- Declare module and import dependencies ------------------------------------------------------------------------------ -local base = _G -local string = require("string") -local math = require("math") -local socket = require("socket.core") -module("socket") - ------------------------------------------------------------------------------ --- Exported auxiliar functions ------------------------------------------------------------------------------ -function connect(address, port, laddress, lport) - local sock, err = socket.tcp() - if not sock then return nil, err end - if laddress then - local res, err = sock:bind(laddress, lport, -1) - if not res then return nil, err end - end - local res, err = sock:connect(address, port) - if not res then return nil, err end - return sock -end - -function bind(host, port, backlog) - local sock, err = socket.tcp() - if not sock then return nil, err end - sock:setoption("reuseaddr", true) - local res, err = sock:bind(host, port) - if not res then return nil, err end - res, err = sock:listen(backlog) - if not res then return nil, err end - return sock -end - -try = newtry() - -function choose(table) - return function(name, opt1, opt2) - if base.type(name) ~= "string" then - name, opt1, opt2 = "default", name, opt1 - end - local f = table[name or "nil"] - if not f then base.error("unknown key (".. base.tostring(name) ..")", 3) - else return f(opt1, opt2) end - end -end - ------------------------------------------------------------------------------ --- Socket sources and sinks, conforming to LTN12 ------------------------------------------------------------------------------ --- create namespaces inside LuaSocket namespace -sourcet = {} -sinkt = {} - -BLOCKSIZE = 2048 - -sinkt["close-when-done"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if not chunk then - sock:close() - return 1 - else return sock:send(chunk) end - end - }) -end - -sinkt["keep-open"] = function(sock) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function(self, chunk, err) - if chunk then return sock:send(chunk) - else return 1 end - end - }) -end - -sinkt["default"] = sinkt["keep-open"] - -sink = choose(sinkt) - -sourcet["by-length"] = function(sock, length) - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if length <= 0 then return nil end - local size = math.min(socket.BLOCKSIZE, length) - local chunk, err = sock:receive(size) - if err then return nil, err end - length = length - string.len(chunk) - return chunk - end - }) -end - -sourcet["until-closed"] = function(sock) - local done - return base.setmetatable({ - getfd = function() return sock:getfd() end, - dirty = function() return sock:dirty() end - }, { - __call = function() - if done then return nil end - local chunk, err, partial = sock:receive(socket.BLOCKSIZE) - if not err then return chunk - elseif err == "closed" then - sock:close() - done = 1 - return partial - else return nil, err end - end - }) -end - - -sourcet["default"] = sourcet["until-closed"] - -source = choose(sourcet) diff --git a/data/lua/common.lua b/data/lua/common.lua new file mode 100644 index 000000000000..4df2ab8470e3 --- /dev/null +++ b/data/lua/common.lua @@ -0,0 +1,102 @@ +local lua_major, lua_minor = _VERSION:match("Lua (%d+)%.(%d+)") +lua_major = tonumber(lua_major) +lua_minor = tonumber(lua_minor) +-- lua compat shims +if lua_major > 5 or (lua_major == 5 and lua_minor >= 3) then + require("lua_5_3_compat") +end + +function table.empty (self) + for _, _ in pairs(self) do + return false + end + return true +end + +local bizhawk_version = client.getversion() +local bizhawk_major, bizhawk_minor, bizhawk_patch = bizhawk_version:match("(%d+)%.(%d+)%.?(%d*)") +bizhawk_major = tonumber(bizhawk_major) +bizhawk_minor = tonumber(bizhawk_minor) +if bizhawk_patch == "" then + bizhawk_patch = 0 +else + bizhawk_patch = tonumber(bizhawk_patch) +end + +local is23Or24Or25 = (bizhawk_version=="2.3.1") or (bizhawk_major == 2 and bizhawk_minor >= 3 and bizhawk_minor <= 5) +local isGreaterOrEqualTo26 = bizhawk_major > 2 or (bizhawk_major == 2 and bizhawk_minor >= 6) +local isUntestedBizhawk = bizhawk_major > 2 or (bizhawk_major == 2 and bizhawk_minor > 9) +local untestedBizhawkMessage = "Warning: this version of bizhawk is newer than we know about. If it doesn't work, consider downgrading to 2.9" + +u8 = memory.read_u8 +wU8 = memory.write_u8 +u16 = memory.read_u16_le + +function getMaxMessageLength() + local denominator = 12 + if is23Or24Or25 then + denominator = 11 + end + return math.floor(client.screenwidth()/denominator) +end + +function drawText(x, y, message, color) + if is23Or24Or25 then + gui.addmessage(message) + elseif isGreaterOrEqualTo26 then + gui.drawText(x, y, message, color, 0xB0000000, 18, "Courier New", "middle", "bottom", nil, "client") + end +end + +function clearScreen() + if is23Or24Or25 then + return + elseif isGreaterOrEqualTo26 then + drawText(0, 0, "", "black") + end +end + +itemMessages = {} + +function drawMessages() + if table.empty(itemMessages) then + clearScreen() + return + end + local y = 10 + found = false + maxMessageLength = getMaxMessageLength() + for k, v in pairs(itemMessages) do + if v["TTL"] > 0 then + message = v["message"] + while true do + drawText(5, y, message:sub(1, maxMessageLength), v["color"]) + y = y + 16 + + message = message:sub(maxMessageLength + 1, message:len()) + if message:len() == 0 then + break + end + end + newTTL = 0 + if isGreaterOrEqualTo26 then + newTTL = itemMessages[k]["TTL"] - 1 + end + itemMessages[k]["TTL"] = newTTL + found = true + end + end + if found == false then + clearScreen() + end +end + +function checkBizhawkVersion() + if not is23Or24Or25 and not isGreaterOrEqualTo26 then + print("Must use a version of bizhawk 2.3.1 or higher") + return false + elseif isUntestedBizhawk then + print(untestedBizhawkMessage) + end + return true +end \ No newline at end of file diff --git a/data/lua/ADVENTURE/adventure_connector.lua b/data/lua/connector_adventure.lua similarity index 91% rename from data/lua/ADVENTURE/adventure_connector.lua rename to data/lua/connector_adventure.lua index 598d6d74fffd..8ad62bf5cbb3 100644 --- a/data/lua/ADVENTURE/adventure_connector.lua +++ b/data/lua/connector_adventure.lua @@ -1,6 +1,7 @@ local socket = require("socket") local json = require('json') local math = require('math') +require("common") local STATE_OK = "Ok" local STATE_TENTATIVELY_CONNECTED = "Tentatively Connected" @@ -32,8 +33,6 @@ local frames_with_no_item = 0 local ItemTableStart = 0xfe9d local PlayerSlotAddress = 0xfff9 -local itemMessages = {} - local nullObjectId = 0xB4 local ItemsReceived = nil local sha256hash = nil @@ -101,17 +100,6 @@ local current_bat_ap_item = nil local was_in_number_room = false -local u8 = nil -local wU8 = nil -local u16 - -local bizhawk_version = client.getversion() -local is23Or24Or25 = (bizhawk_version=="2.3.1") or (bizhawk_version:sub(1,3)=="2.4") or (bizhawk_version:sub(1,3)=="2.5") -local is26To28 = (bizhawk_version:sub(1,3)=="2.6") or (bizhawk_version:sub(1,3)=="2.7") or (bizhawk_version:sub(1,3)=="2.8") - -u8 = memory.read_u8 -wU8 = memory.write_u8 -u16 = memory.read_u16_le function uRangeRam(address, bytes) data = memory.read_bytes_as_array(address, bytes, "Main RAM") return data @@ -125,23 +113,6 @@ function uRangeAddress(address, bytes) return data end - -function table.empty (self) - for _, _ in pairs(self) do - return false - end - return true -end - -function slice (tbl, s, e) - local pos, new = 1, {} - for i = s + 1, e do - new[pos] = tbl[i] - pos = pos + 1 - end - return new -end - local function createForeignItemsByRoom() foreign_items_by_room = {} if foreign_items == nil then @@ -294,94 +265,11 @@ function processBlock(block) end end -local function clearScreen() - if is23Or24Or25 then - return - elseif is26To28 then - drawText(0, 0, "", "black") - end -end - -local function getMaxMessageLength() - if is23Or24Or25 then - return client.screenwidth()/11 - elseif is26To28 then - return client.screenwidth()/12 - end -end - -function drawText(x, y, message, color) - if is23Or24Or25 then - gui.addmessage(message) - elseif is26To28 then - gui.drawText(x, y, message, color, 0xB0000000, 18, "Courier New", nil, nil, nil, "client") - end -end - -local function drawMessages() - if table.empty(itemMessages) then - clearScreen() - return - end - local y = 10 - found = false - maxMessageLength = getMaxMessageLength() - for k, v in pairs(itemMessages) do - if v["TTL"] > 0 then - message = v["message"] - while true do - drawText(5, y, message:sub(1, maxMessageLength), v["color"]) - y = y + 16 - - message = message:sub(maxMessageLength + 1, message:len()) - if message:len() == 0 then - break - end - end - newTTL = 0 - if is26To28 then - newTTL = itemMessages[k]["TTL"] - 1 - end - itemMessages[k]["TTL"] = newTTL - found = true - end - end - if found == false then - clearScreen() - end -end - -function difference(a, b) - local aa = {} - for k,v in pairs(a) do aa[v]=true end - for k,v in pairs(b) do aa[v]=nil end - local ret = {} - local n = 0 - for k,v in pairs(a) do - if aa[v] then n=n+1 ret[n]=v end - end - return ret -end - function getAllRam() uRangeRAM(0,128); return data end -local function arrayEqual(a1, a2) - if #a1 ~= #a2 then - return false - end - - for i, v in ipairs(a1) do - if v ~= a2[i] then - return false - end - end - - return true -end - local function alive_mode() return (u8(PlayerRoomAddr) ~= 0x00 and u8(WinAddr) == 0x00) end @@ -569,8 +457,7 @@ end function main() memory.usememorydomain("System Bus") - if (is23Or24Or25 or is26To28) == false then - print("Must use a version of bizhawk 2.3.1 or higher") + if not checkBizhawkVersion() then return end local playerSlot = memory.read_u8(PlayerSlotAddress) diff --git a/data/lua/FF1/ff1_connector.lua b/data/lua/connector_ff1.lua similarity index 85% rename from data/lua/FF1/ff1_connector.lua rename to data/lua/connector_ff1.lua index 6b2eec269ae6..95f94a06dcce 100644 --- a/data/lua/FF1/ff1_connector.lua +++ b/data/lua/connector_ff1.lua @@ -1,6 +1,7 @@ local socket = require("socket") local json = require('json') local math = require('math') +require("common") local STATE_OK = "Ok" local STATE_TENTATIVELY_CONNECTED = "Tentatively Connected" @@ -102,15 +103,12 @@ local noOverworldItemsLookup = { [500] = 0x12, } -local itemMessages = {} local consumableStacks = nil local prevstate = "" local curstate = STATE_UNINITIALIZED local ff1Socket = nil local frame = 0 -local u8 = nil -local wU8 = nil local isNesHawk = false @@ -134,9 +132,6 @@ local function defineMemoryFunctions() end local memDomain = defineMemoryFunctions() -u8 = memory.read_u8 -wU8 = memory.write_u8 -uRange = memory.readbyterange local function StateOKForMainLoop() memDomain.saveram() @@ -146,83 +141,6 @@ local function StateOKForMainLoop() return A ~= 0x00 and not (A== 0xF2 and B == 0xF2 and C == 0xF2) end -function table.empty (self) - for _, _ in pairs(self) do - return false - end - return true -end - -function slice (tbl, s, e) - local pos, new = 1, {} - for i = s + 1, e do - new[pos] = tbl[i] - pos = pos + 1 - end - return new -end - -local bizhawk_version = client.getversion() -local is23Or24Or25 = (bizhawk_version=="2.3.1") or (bizhawk_version:sub(1,3)=="2.4") or (bizhawk_version:sub(1,3)=="2.5") -local is26To28 = (bizhawk_version:sub(1,3)=="2.6") or (bizhawk_version:sub(1,3)=="2.7") or (bizhawk_version:sub(1,3)=="2.8") - -local function getMaxMessageLength() - if is23Or24Or25 then - return client.screenwidth()/11 - elseif is26To28 then - return client.screenwidth()/12 - end -end - -local function drawText(x, y, message, color) - if is23Or24Or25 then - gui.addmessage(message) - elseif is26To28 then - gui.drawText(x, y, message, color, 0xB0000000, 18, "Courier New", nil, nil, nil, "client") - end -end - -local function clearScreen() - if is23Or24Or25 then - return - elseif is26To28 then - drawText(0, 0, "", "black") - end -end - -local function drawMessages() - if table.empty(itemMessages) then - clearScreen() - return - end - local y = 10 - found = false - maxMessageLength = getMaxMessageLength() - for k, v in pairs(itemMessages) do - if v["TTL"] > 0 then - message = v["message"] - while true do - drawText(5, y, message:sub(1, maxMessageLength), v["color"]) - y = y + 16 - - message = message:sub(maxMessageLength + 1, message:len()) - if message:len() == 0 then - break - end - end - newTTL = 0 - if is26To28 then - newTTL = itemMessages[k]["TTL"] - 1 - end - itemMessages[k]["TTL"] = newTTL - found = true - end - end - if found == false then - clearScreen() - end -end - function generateLocationChecked() memDomain.saveram() data = uRange(0x01FF, 0x101) @@ -316,7 +234,14 @@ function getEmptyArmorSlots() end return ret end - +local function slice (tbl, s, e) + local pos, new = 1, {} + for i = s + 1, e do + new[pos] = tbl[i] + pos = pos + 1 + end + return new +end function processBlock(block) local msgBlock = block['messages'] if msgBlock ~= nil then @@ -448,18 +373,6 @@ function processBlock(block) end end -function difference(a, b) - local aa = {} - for k,v in pairs(a) do aa[v]=true end - for k,v in pairs(b) do aa[v]=nil end - local ret = {} - local n = 0 - for k,v in pairs(a) do - if aa[v] then n=n+1 ret[n]=v end - end - return ret -end - function receive() l, e = ff1Socket:receive() if e == 'closed' then @@ -501,8 +414,7 @@ function receive() end function main() - if (is23Or24Or25 or is26To28) == false then - print("Must use a version of bizhawk 2.3.1 or higher") + if not checkBizhawkVersion() then return end server, error = socket.bind('localhost', 52980) diff --git a/data/lua/OOT/oot_connector.lua b/data/lua/connector_oot.lua similarity index 99% rename from data/lua/OOT/oot_connector.lua rename to data/lua/connector_oot.lua index cfcf6e334d0b..a5248e5ba433 100644 --- a/data/lua/OOT/oot_connector.lua +++ b/data/lua/connector_oot.lua @@ -1,8 +1,9 @@ local socket = require("socket") local json = require('json') local math = require('math') +require('common.lua') -local last_modified_date = '2022-11-27' -- Should be the last modified date +local last_modified_date = '2022-4-9' -- Should be the last modified date local script_version = 3 -------------------------------------------------- @@ -1861,8 +1862,7 @@ function receive() end function main() - if (is23Or24Or25 or is26To27) == false then - print("Must use a version of bizhawk 2.3.1 or higher") + if not checkBizhawkVersion() then return end server, error = socket.bind('localhost', 28921) @@ -1886,7 +1886,7 @@ function main() ootSocket = client ootSocket:settimeout(0) else - print('Connection failed, ensure OoTClient is running and rerun oot_connector.lua') + print('Connection failed, ensure OoTClient is running and rerun connector_oot.lua') return end end diff --git a/data/lua/PKMN_RB/pkmn_rb.lua b/data/lua/connector_pkmn_rb.lua similarity index 89% rename from data/lua/PKMN_RB/pkmn_rb.lua rename to data/lua/connector_pkmn_rb.lua index 036f7a6255be..1c214c4a7424 100644 --- a/data/lua/PKMN_RB/pkmn_rb.lua +++ b/data/lua/connector_pkmn_rb.lua @@ -1,7 +1,7 @@ local socket = require("socket") local json = require('json') local math = require('math') - +require("common") local STATE_OK = "Ok" local STATE_TENTATIVELY_CONNECTED = "Tentatively Connected" local STATE_INITIAL_CONNECTION_MADE = "Initial Connection Made" @@ -32,9 +32,6 @@ local curstate = STATE_UNINITIALIZED local gbSocket = nil local frame = 0 -local u8 = nil -local wU8 = nil -local u16 local compat = nil local function defineMemoryFunctions() @@ -55,35 +52,6 @@ function uRange(address, bytes) return data end - -function table.empty (self) - for _, _ in pairs(self) do - return false - end - return true -end - -function slice (tbl, s, e) - local pos, new = 1, {} - for i = s + 1, e do - new[pos] = tbl[i] - pos = pos + 1 - end - return new -end - -function difference(a, b) - local aa = {} - for k,v in pairs(a) do aa[v]=true end - for k,v in pairs(b) do aa[v]=nil end - local ret = {} - local n = 0 - for k,v in pairs(a) do - if aa[v] then n=n+1 ret[n]=v end - end - return ret -end - function generateLocationsChecked() memDomain.wram() events = uRange(EventFlagAddress, 0x140) @@ -106,17 +74,17 @@ function generateLocationsChecked() end local function arrayEqual(a1, a2) - if #a1 ~= #a2 then - return false - end - - for i, v in ipairs(a1) do - if v ~= a2[i] then + if #a1 ~= #a2 then return false end - end - - return true + + for i, v in ipairs(a1) do + if v ~= a2[i] then + return false + end + end + + return true end function receive() @@ -196,8 +164,7 @@ function receive() end function main() - if (is23Or24Or25 or is26To28) == false then - print("Must use a version of bizhawk 2.3.1 or higher") + if not checkBizhawkVersion() then return end server, error = socket.bind('localhost', 17242) diff --git a/data/lua/TLoZ/TheLegendOfZeldaConnector.lua b/data/lua/connector_tloz.lua similarity index 87% rename from data/lua/TLoZ/TheLegendOfZeldaConnector.lua rename to data/lua/connector_tloz.lua index ac33ed3cc4b2..1764f5487cc1 100644 --- a/data/lua/TLoZ/TheLegendOfZeldaConnector.lua +++ b/data/lua/connector_tloz.lua @@ -3,13 +3,12 @@ local socket = require("socket") local json = require('json') local math = require('math') - +require("common") local STATE_OK = "Ok" local STATE_TENTATIVELY_CONNECTED = "Tentatively Connected" local STATE_INITIAL_CONNECTION_MADE = "Initial Connection Made" local STATE_UNINITIALIZED = "Uninitialized" -local itemMessages = {} local consumableStacks = nil local prevstate = "" local curstate = STATE_UNINITIALIZED @@ -21,8 +20,6 @@ local cave_index local triforce_byte local game_state -local u8 = nil -local wU8 = nil local isNesHawk = false local shopsChecked = {} @@ -420,83 +417,6 @@ local function checkCaveItemObtained() return returnTable end -function table.empty (self) - for _, _ in pairs(self) do - return false - end - return true -end - -function slice (tbl, s, e) - local pos, new = 1, {} - for i = s + 1, e do - new[pos] = tbl[i] - pos = pos + 1 - end - return new -end - -local bizhawk_version = client.getversion() -local is23Or24Or25 = (bizhawk_version=="2.3.1") or (bizhawk_version:sub(1,3)=="2.4") or (bizhawk_version:sub(1,3)=="2.5") -local is26To28 = (bizhawk_version:sub(1,3)=="2.6") or (bizhawk_version:sub(1,3)=="2.7") or (bizhawk_version:sub(1,3)=="2.8") - -local function getMaxMessageLength() - if is23Or24Or25 then - return client.screenwidth()/11 - elseif is26To28 then - return client.screenwidth()/12 - end -end - -local function drawText(x, y, message, color) - if is23Or24Or25 then - gui.addmessage(message) - elseif is26To28 then - gui.drawText(x, y, message, color, 0xB0000000, 18, "Courier New", "middle", "bottom", nil, "client") - end -end - -local function clearScreen() - if is23Or24Or25 then - return - elseif is26To28 then - drawText(0, 0, "", "black") - end -end - -local function drawMessages() - if table.empty(itemMessages) then - clearScreen() - return - end - local y = 10 - found = false - maxMessageLength = getMaxMessageLength() - for k, v in pairs(itemMessages) do - if v["TTL"] > 0 then - message = v["message"] - while true do - drawText(5, y, message:sub(1, maxMessageLength), v["color"]) - y = y + 16 - - message = message:sub(maxMessageLength + 1, message:len()) - if message:len() == 0 then - break - end - end - newTTL = 0 - if is26To28 then - newTTL = itemMessages[k]["TTL"] - 1 - end - itemMessages[k]["TTL"] = newTTL - found = true - end - end - if found == false then - clearScreen() - end -end - function generateOverworldLocationChecked() memDomain.ram() data = uRange(0x067E, 0x81) @@ -589,18 +509,6 @@ function processBlock(block) end end -function difference(a, b) - local aa = {} - for k,v in pairs(a) do aa[v]=true end - for k,v in pairs(b) do aa[v]=nil end - local ret = {} - local n = 0 - for k,v in pairs(a) do - if aa[v] then n=n+1 ret[n]=v end - end - return ret -end - function receive() l, e = zeldaSocket:receive() if e == 'closed' then @@ -653,8 +561,7 @@ function receive() end function main() - if (is23Or24Or25 or is26To28) == false then - print("Must use a version of bizhawk 2.3.1 or higher") + if not checkBizhawkVersion() then return end server, error = socket.bind('localhost', 52980) diff --git a/data/lua/core.dll b/data/lua/core.dll deleted file mode 100644 index 3e9569571ab0947dcb7bcd789dc9c06c009d072d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29184 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 B{xARl diff --git a/data/lua/ADVENTURE/json.lua b/data/lua/json.lua similarity index 100% rename from data/lua/ADVENTURE/json.lua rename to data/lua/json.lua diff --git a/data/lua/lua_5_3_compat.lua b/data/lua/lua_5_3_compat.lua new file mode 100644 index 000000000000..0d9990a4303b --- /dev/null +++ b/data/lua/lua_5_3_compat.lua @@ -0,0 +1,12 @@ +function bit.rshift(a, b) + return a >> b +end +function bit.lshift(a, b) + return a << b +end +function bit.bor(a, b) + return a | b +end +function bit.band(a, b) + return a & b +end \ No newline at end of file diff --git a/data/lua/socket.lua b/data/lua/socket.lua index a98e95211544..696f53a3279b 100644 --- a/data/lua/socket.lua +++ b/data/lua/socket.lua @@ -10,8 +10,53 @@ local base = _G local string = require("string") local math = require("math") -local socket = require("socket.core") -module("socket") + +function get_lua_version() + local major, minor = _VERSION:match("Lua (%d+)%.(%d+)") + assert(tonumber(major) == 5) + if tonumber(minor) >= 4 then + return "5-4" + end + return "5-1" +end + +function get_os() + local the_os, ext, arch + if package.config:sub(1,1) == "\\" then + the_os, ext = "windows", "dll" + arch = os.getenv"PROCESSOR_ARCHITECTURE" + else + -- TODO: macos? + the_os, ext = "linux", "so" + arch = "x86_64" -- TODO: read ELF header from /proc/$PID/exe to get arch + end + + if arch:find("64") ~= nil then + arch = "x64" + else + arch = "x86" + end + + return the_os, ext, arch +end + +function get_socket_path() + local the_os, ext, arch = get_os() + -- for some reason ./ isn't working, so use a horrible hack to get the pwd + local pwd = (io.popen and io.popen("cd"):read'*l') or "." + return pwd .. "/" .. arch .. "/socket-" .. the_os .. "-" .. get_lua_version() .. "." .. ext +end + +local socket_path = get_socket_path() +local socket = assert(package.loadlib(socket_path, "luaopen_socket_core"))() + +-- http://lua-users.org/wiki/ModulesTutorial +local M = {} +if setfenv then + setfenv(1, M) -- for 5.1 +else + _ENV = M -- for 5.2 +end ----------------------------------------------------------------------------- -- Exported auxiliar functions @@ -39,7 +84,7 @@ function bind(host, port, backlog) return sock end -try = newtry() +try = socket.newtry() function choose(table) return function(name, opt1, opt2) @@ -130,3 +175,5 @@ end sourcet["default"] = sourcet["until-closed"] source = choose(sourcet) + +return M diff --git a/data/lua/x64/luasocket.LICENSE.txt b/data/lua/x64/luasocket.LICENSE.txt new file mode 100644 index 000000000000..ff5c6a73c01c --- /dev/null +++ b/data/lua/x64/luasocket.LICENSE.txt @@ -0,0 +1,20 @@ +LuaSocket 3.0 license +Copyright � 2004-2013 Diego Nehab + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/data/lua/x64/socket-linux-5-1.so b/data/lua/x64/socket-linux-5-1.so new file mode 100644 index 0000000000000000000000000000000000000000..df95403fcdb5c354197b1bd6d5a37f20cbaa51bc GIT binary patch literal 70808 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 literal 0 HcmV?d00001 diff --git a/data/lua/x64/socket-linux-5-4.so b/data/lua/x64/socket-linux-5-4.so new file mode 100644 index 0000000000000000000000000000000000000000..059899d21c106fc3c7ea8ad68d466297240bb786 GIT binary patch literal 81104 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 OqC^!eoV-3XGw>hb3TzMn literal 0 HcmV?d00001 diff --git a/data/lua/x64/socket-windows-5-4.dll b/data/lua/x64/socket-windows-5-4.dll new file mode 100644 index 0000000000000000000000000000000000000000..896b3cbacd5e05ed2d5f5b4e02b61d33dd8a3e82 GIT binary patch literal 51712 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 G1^y1ZM6uBT literal 0 HcmV?d00001 diff --git a/data/lua/x86/luasocket.LICENSE.txt b/data/lua/x86/luasocket.LICENSE.txt new file mode 100644 index 000000000000..ff5c6a73c01c --- /dev/null +++ b/data/lua/x86/luasocket.LICENSE.txt @@ -0,0 +1,20 @@ +LuaSocket 3.0 license +Copyright � 2004-2013 Diego Nehab + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/data/lua/x86/socket-windows-5-1.dll b/data/lua/x86/socket-windows-5-1.dll new file mode 100644 index 0000000000000000000000000000000000000000..2255fed700af24f8e0ab3ad71582ff7ab4ffd835 GIT binary patch literal 40448 zcmeIbdwi2c_CNl#O(9?*QHxfs8ng(?#awzxo3<1oTvot9Apr$yp($xCZA}vdoJa$U2T!a=hdH=ij6Jxt|PqZzW>Cq3*o| z#2>C(d1N)m-XlK5pRNnPNAZX2YB@c(Vws29`k|gV?20loVUY5IwQOM&rd>%Kc~-)3 zMX5qgw#?1)BGx0+b6U^uiHb6alYOz$jtpWh{!k2#p%T@L#WHE!swfWR)+2s~iklRr z9nh!!wJJ)>U_~)*QIvV774~IpLU~bNlIc7nJ{4wy&%Mfr_dnl+haQ3Ys?v=&{xc}b zjT5|OrM^-{>AVRaeqbV<%H$s6=ijbl1lkI z5x^wn9!m866%jsfop%|sxDQQuA-JswaeqY&=dP*&An{0PMbIMLhY!nVpphE^#(8id~^Dk%$+EOC(U_^wi$2=w0F* zN}$$E#DRU8OYr*X0(#Y!+#s?YSJ2)fEIv-AH$?m+L0cceMwMUyGjVz%uiD;129dMTP^+1I9%Rp5pLipxh}+ zIH_+WO}zwTV>u*dQcMa;tCZmDrqvN@ssnU({4I5WOm&JbeP4+R(I=a$R-PSGrG{c8g0-=oV=H(gd!Z(4DQxaEe>e)6g`C zl;%f(<^xDPYgLq^qXBp<9rdn37C7BVc8!#}J|2U<4V?x|tUi&7=?|AUjwLnNAij@8 z!VR5xIy@UePGyoye2bD$SGb{za$VwUBqO^BL}oc1q6=A-i7xRc#DRTANM^%*Ai&|- zL?}@392e;8tylT8HWwx2SNTV%_=?5s#Wa>NrKq*V z8YEp}DnE;4kxN{F7nV59SniPJP|1=T#2+aa!b$Y#7*u=g!FF`xgihZ;vA7FD6-|V? z%5_&K??9_{`dH(CC}!@4m_e8}T3eUyj+>ze!eL_0*seLwVlfKKJ%%9E)o@a`aUK;) z&WTpk4o%iOBgRlsN~9I6JP$dfCaMv;L_MW?U7{RuVBeU}EU4QzdaC|UD`tJ~5}AMs z+Pf@A!uFnKdk=V|IMB7=;$ATsMd(NJPEZfd2JPJ}RWz1Vi;5a$(Xqwigl?Q44@g}l zv|K96L$gRF%ObmIIJr7$YSNbtO{^%@^^V|3{~2WujAj z3MAqrW?XPu3iyoq`h(r5Omd1w0&fO*rN$YYrWG5RhBR;}O>|{a_OZo1(3i+Qx&lL> zJqER)j$)@)RSczEDTNhj$&!AnAm%sdE+z$LdCL`?-y52mW;qg?t+!20_l}FKgevcG zcoYLnfvE;Z#1xvOjkNM$r-lIB7FBe!(?jdhQFrXRv_O-=m9#(U9q8Z`AQXeqdIGZd zr6jCN0SI9p-d|4wRl^bA#=v){{O4GjYhVS)wJJXxydYtuv5riCXPLdEH?Q01|I4bJZh zYasbOKHFx^p!}geWBxGTW#Kzhp#E|Pdm&BP4v61;*h-p^y(gpt)TV^UV7yPYo$$Wi zp}})PLS0%yT?*(TYKAvYmg|9R6rxKj@H9+PRUD@R9I&VXa1;-$p@PMxbo_W7A*lmH zFaO`FX=<8_R!%YRx}P30dvDVFXy5jJ z9a|N?zCOi>jgFU=tw1t4Ehj_M^dT3GgQY1rzXzjk3#|oH{HCB?|2)ZAXz$qlw%v1e zQ(@WZp&e4@Ks!WoLen&n)+92vAb35tue`4VU1(Nn(3EhCwvS8TPi2CqDP7UiT7GgC zs{t1Ln0*vAi5@{AnJ|wt5Ns;H&f(d48<{Du$a=tJ1SY5WLmZyIwVV1$?I|AY*z{yV zXoYn)wWzl=sVh0kqwQVGNWd)r3eOk3SNI)r$i}RM#q$llLq7~t^PIwkx7b|Xm!Zz( zd#N1Ti5fM2kz$x|zgOc!Gs%9kAcaNM(gbRqqJUExqFkj%CEzNm1QygX0J=aXn@&Pc zhbdJi^Pz3#Q^{K3hKeEcFegS?Ov`+SQlccx6nv_tMlcFPBj%98#B5_E8kMw%Wh%y0 z&`0_d>c|CZK-%vB5W-@`6P%QhORP#JGE!j#+j|{8Ju)jb4&g1L+?0+XF7Zo#)rNW+ zBEFHZL4m?09!4g*^v<;ere}JjF2tj|g>ap{2ia!A;;_r2eLonX@L&poZ z9RCfSMy%d(_E8-5UvO(F%?;hK{1yC#!}O+eHR;Z7XvN!$v^F+399E0xgu|2@e6S7A zIhBe7VC{H~jCcx^afhyQiV(26#9s@!LxW_8!jltd7O+YE9kSSJVad`_>Sbyc>}iPT zHolD}D-%iVJPDvY+|YwEN8}cLzG_+|DiN1>hVuasTImlBMplOpsV9B1DNOYveaz|3G#xsRMQYis(?gpN~J_GWr zIKLNZl`yBc90>w?Q;nMuht{VD_GL^)e;SP7kL;i;GGYhFFImDfUggFY1dWy7DT?tH z*+pFwTML+Z2WFs*_8EHYGe|_iL-CSYL7m_I@SZ36;GGP57B}ukApE%wAQQg zco2iJOunf+CkE}mLoD5>VZ0KAxK>kS6((sT6;bx$r_fQ)d zdJmGIiN)NeA=DMzb&$sSi2oey{fB$fzmQP5kBi!&Ppd3!fBE1wNeg<)K z!&7)l`Q3pxa8FU?6lSb%oJ)K(opjNa`Czq6EJ32L8|v81L0eHtbqO~>Lc3@JfN?xC z$Q-^GctZ_DXednNf89pbf#K_SgAFZ6UUXo?2PDS9@IIt4WoYv`C)_|Y$PrnokE~RM zI`A^pR(ul%%Ck!pp<%U#OYE9P(&iGSOmKQ=W%}e0w-n+Qz^VHskxnUXftQIk#dkS1 zj6FZ9W3Z#rBxhs=^^B~~S-q+iMlO_MHFw~6YQfY#eM0I4Q{hx3;vs*iV?PY{$cUYg zbJ*7=Xk|1Q8KGdG8ZnCWYgn$ooZ821b)WqSz=#Bi3QFz}U|9CGu|4)46{e4%#xbY) zy8@l5OcIoD*xni4MuhEM&Gv4R0pxZ!+q=|POqEW4^*l-wTUF#jqa_02`|vGeqsX_Y zKHsSLogsTq0ZGy=GefhwH+;jdlVEaf_?BO@L;lVUr}%X&SwB$lX}jCCNxSK>haRvM zMl_NN8(hMiW^)&d4Rsye;`wqI4fOFBCPp|s4myN-1qDp%q`84I>H#;0mW8Gmv-MzF zjM+~YF|#+q2OgDdmD#I_w`kE-Ika*RnWL4H!uFkx$Sy(~W{m|p9|c-g3fDTtbBsho z#sq}fV|ZNA^Ba~yPvjhGG!xLA?-b`Sa8$;mhz(Mkq;{O5YYK#TC|bsZh>U1KRb)Pd zYVc8j?}45~{}5FPcZ>-1oR5^Ms0UXL^W4Qccol(1oiNflAhuJUWF-s9f5y+3V*G3Z zoiTovOk{p$B5wdcuT-1;_xZV;k^Gzd+%uV4?9b0@=^K&~OXdIp5KD;p#_5T(V zErezO6K_yaOL-)*^K4>{=K;4|SFh(cPug}eES=&5N@4{(gc#0aHlCvV_e=*6tafa- z$O3(XLG&R_LmBc_Gn8TJf$^HdyFD_mfcOOTg;S)XPN>b}BO=Hd@F(PAc13bv9pe=a z)p>yMtYISWMUJPQUpEundJU^;iSJ?L1olnAyvzwqRD9-vy4EQU1A-9GMoeA$7IAnz zEQs{UsNsKu*SwFZkO*YdVkVNHhiw1#H0P%g?rU_H7M;O1@e%A`EFf|A+=r87TX#p> z(sNsTxUJR5#NhYsA!5vu{MyjD33{MUUj){soZqNN7Iq(@`O>@nD(&)gQ<~=l8&>fQ zrzaN9H5AQtiexh+Tdc=Q$g+?|-X$@QD2Jtj{~! zf8oZreCKR-B;?IW@DC3(B?fjUZhXss+|tyMjHR(9!E!*_#t>88lrJNGn99#@2R@y> zWeygtr!e~*;vRSp$d9f8KQCe(tlRkC=mpdT*-)Wol_4R2FIMw4x=ZU(s07w($?d)} zC2ZG5R^oqH-fb4@+`~4BFBN`y6V_b@NOOqI-1UuWDZKVR>~poYBp;!0h}Th>_R}lV zv9LbWakfrBC}dC7ovrBfQ}w#Di}Yw;U1(7)m=vQ+juPaV{1?~>s0_mXH61;s`Ji_6 z3A7MuqmCZ&jgX7Y;AkhMUjcmXb)l1Wu$vHye#&LEQLFKslVlYKGMF`Ap?69DFiu}@gBxRHN(zMjnU1u)Nj*qh1)vzKG&2pa#fBzD-+1U6E@V{^V8gr&rL$g;)zW06U z@j49sqyE@af|KBb(FZ5tJvBHfC1g(vCdmCQ$^+k=@?9ACCgK}zd8=_BB){Q+Zpxm; zdmCTEJECVeQsNWBbvmY|!lyM)OQ7okU%rq~G} z=z&iUqW~oiW5$Nnx*lrRbK^$Z09^%49uL2kU_0RP@#{RilIFV|F?_btOu+%jCN9lJ zu2XoqETvD;OLp=8oy>cexE*Y=oP><#X0@R^z6=b)rAny&C=#wnYj|Y>%EB5R&Ojr9 zDE<#ro2ZYYEH7Gi2lrB6VZ31`^=Rl7T=ooxqVte#Pvfy2dI2^kPTjO(FbMSM8>FA* zb|^MBc)>IhDG0H+CkH49(oKahT+vr9RC^K|f6U(>Y`^lX$}0!990tBv%UUFWmm61G zrZ$r}Tg%P%Q?cl8r3N_VS~)w3YR4~Ez-7<12??nh#+4*7$~Wr!~~0x-Y2zU$RE{k@liH*a71WexKIt#qrHWb2*-BByu)ubzFFspRUaMor|OLcX1lkb0qfC)1YMw*iUC{7=c3rXPvX$#y?A z8l7w-;%JN$c|B(j9P*!PFQIbKKrtI1-`EaoA4B3AdxWzGHilmQSbJEOF%YzP4G`=X zfi2d(Y$W1!2`oq)_{6!NNWOngKxfh^+`gf2{UhTVYZL7iah!tnN~jxFu@m|UW*?lH zzSPQOr+AF?6&<-e@d5cCQau?^Zm@rmO}Woe3?FD6S4+c!ulE=ML1nLV9_$%`gJc3K zml=-A^CKg+vC;(eJQeyuS?KXG{%J@N4j09!dI6ULzb~JXTRBNf%f*xo$>g!c?eM?a z+r@AQ8qALly=Na`2gF2%NU6jjh=BTKLntRQ;sL3;uY}zV0FU6dU(fCvTo@qiJA4(z zG|;E}cQ2xn=uU=s4-@vkROtTlecF8!a_FYejw7*{Zk)V>c0JQy09tqttgHXQK39$2SQ{Fk`s_Qwv)Mu#xBV`q)) zDriIGamUhdI|N2qF&$XJ#RoSBdH4Q7jmNBR$V;U`&N;ax{I36!K;`=Q^3dt!DY5lr z9S(F)TTd#7#mbkQv7FX8+4zM1$mM*BTd(duV>zu!vi?64X+Q_8XO$^rG0MH+8S4*= zmH**P<#T8b(cnQ!FV13#3H6|gbhFrdU!bi@=*@E7rBf7Tb3$ICI+BwT@~)wg+?|NQ z+&Ew)N0M50iQj)g41;)MerVMBu@)N>$VR0`)!fmgP!-`zF$(~pim+A!v%-+>{L=+@ zsR|=ywr}i7XlZJEl9Fq4m~wbS})=iv3&VjTC6v*U3 z5E_7}BTm&A#D8_oll&VCn7ARJa$2KgA?}pM7s~Nt`K12t#Gx8G02Y9H90~PXZ~ADT zMck4K@HOnreuDN+KsJgZ_)OP2>bhcQoiJx_BUix?ne|ue*T-Q^g1r(VV#PK-|huf~8>sNvvFb#nn8j4sl%^rH`uZUMewH(w^go#$_yE z)N$D%aj|}3(LG(dlO)D77<*DaH+1GhZSjM4BD>dNUZZr!H z9(!;fN}3zm;rxf_
;()1=io&X4T;av?_r&vfeC>?4O7jw=u&LLIp48GiodLkJ) zaL(ZlDqeyO2a$(U4?N+iq9z>0bmICMsEuV)d&tJY^jnE&C`|&_0T~M2uA#bBN#1rR`EA_ZTG~p%mGPO_1N;FEXO^Xua z5|@qw05;;|Lb8zq>m3bE>t|y5&yea)3;`D)@Qqlv=;%(GFulkmE$``NE9bd0!L+F` zaLE&EWdDm@Fy!CEHVi_!OLB)O;_SW1matCIjOHYOQ@n_GHZO|eP7rTZv8(oQ3SXI{ zRkYX=!6^yNVBCf6730P;`OwURRbS8P;`JzC;DF6RM04qzaa1Lpu90K_PiSqbQ~VM` z!yc}{cR1cX2<)EJJFt*MP2G=BhqfhOQ4Acr7zf#y2FlJL)Cn}E)D{73XMl8AmQ;Q# zr?i2!J&Ml@2O31S2s0IiIp0K7&xCskIiTN03>)7mMgm#re9#Ja0aP-m;X}wYZkG^(XE|3pzW34?!HTW4@eYlK~x!WiMd>nhv`G$3oTA{a{pZ7b4t<`qQEH( z)*VO%*7g>yIop$tA;UW75^K0_O6Xim6BwrpU#rPA`LsoW-5T2-Z?|oa|E$2bMRkLM zzJMl@6q=P5!3BndKu^S{vF)!*44S~9{pyBk_djtRY=P!~Vz)$HVjfY5`-2k@W1L)K zwIr4Dwp>MQ?g5*7`mxz1E@5a8_cTDLgEu2q**pfCYYA1K!+E%U-e+U=txqmb3dv;P z&4?%_92k^kjLRuTaXpg98z_4#WwSh{60I21yBPr7^yN{q0ZCqF^}NhRFI{>s6sJfC zPC4Pk`^%L?9}hTDgJuc!)BST};~zC~73Zro{Nf1UV0WRNzLD03+A!93tnPffFikKF z&3zXyxP5UC%DCmr@j@+sJVqT0{}w|28Yjt=%UG6^a6_*knP*IUfeD1;_%&V5 z?(~7<4*-&@(0=vuF$B2({bStuMZ2)MTq49TX^x z3e=-#fq|}hEG7VY#RUwdSfs$YQta8X1TNy*5-g8(8jqorSaCUQ72TNRop&NLUV)a>AFFDH*o}7l8)0_SZwKl5<>n$nceTL>FvK^WO4%DJQ2xV-l&Xtd|(2;b$OFm8NIct>J-)|V<5t~|B35)cLB0k+bkQ#o4Isl^Dn(h2e)Q0`UWMqhtF4X1>&N?cLL&-2{b2y9Pzjj4{={Lk8 zKW@|)!Hh~^x}2io4W^3@vYbKzdVI#R0hY=DuEi8bZ1TUS0uhT;)~fz8zMhQ+Jlyf= z2ibl~-hmXRS*VMr23wjesMN!U@3IzUo z#=isXicuF^!1DW17uDe4H*anvt8r2c+R)KJBeC=R%4Gj}e7(ylu8pgXIqKPlrkook5CJ?QNhK{pQ`K6-i@?^4X#ap0s%aaZW)EQ_;_hiA3VaX7JL z^MH!oA4)mPBzZ0t<*1CC^`Bn;lOt0sikMjgM2!^)=@&Whq(uJk8hYQ92Km;Chg*pg z>Ss4n+2Gk9eq9{AnZ@SE;b+IeKa5%aL-V?b)cjt3csX3 z{J)N#2|g-}au&XL0QZi>L(o^-(I|uv<8l*t3h}$~;`rq;ou$+zx-XLqmr@>23o)rb zf0h7wl%MxND$m$oEJ*5&1u4KzF&foEZNbGo;Sf#YIb!7?5JVfm$e)QB#lj9}ARTTS z=zic9MODGLK?veh1w$L9-+&)dPZtX>TpENzEKDaOs5g9@CQebamZsy~+dk^k(|?wF zdW^7{w7m%ozfFZV{3QIT=13%& zn8M=d07C|jXn%U%06a7t3=1V@$fg-B_v$)Mq3N(y_&-(Au3{@QMAAA*A|O(pNHI2BcHr}4Lt=)wFJZU_e5Gc4kc?7Ec5 zN#o(`PmZd;AvbJ7q`-i1hy^5kI7x0p7aES}8h(%QU@3Eo>p)>yMUU@2t>~JUr1h1oYnEB#KEVJbU%QcSwAeIZD>DgN~j{Lks?a|WmQBc(;Twn zj)NgiHq})LcQ(;u*r!ikBF6#y%h-w)FP%J}*`C`0J5BA!6Z4*~6S1^}{}s}KebZqKwm=Zc82lTPg^LUWj6pe`&=>668DW%MLK*_r z0s%W9KblM7kLEBxqc$#QFC5kdn&NEQCCSPr&S*KITQp41?`NlEkj&{-zR*mI6Q)@E z@yji22T9H=O1OGepa1&>gx9R%R=z%o>mAIc@G!&2rqIl$91nL0kPCKHX!uA^XV$kIiAB3NDOC)ln&ehLl?0Z zne@^8Xrx;6}hPa*8D|l3}60&q_7AuZdAi^z#1j@*%{i=&%l$Z!!C03=t(BZvxfWNc5sD*bMNH zCpyEoX+;EWkbU$ioQ61=ggN5xfe9+~Ae?R%(Pyp^-&E|-nHWtVa>{=}qX#%0PEp8t zTDZwnE$kB4p~qMrQ8-c-s>fVxK@clgv;ENLz&CN70Y)v$Yo@y2O<*Rw#5=Fb{&dU! zbm0mpy5tg90|VLOycNDoCN$K+^YG42Pb19pz+Mc3{UE~8&`x&z$fq+Je$x zz(mIu6e}?t{ZElbrjG-zaf$tD+&M@~{|nDf=GjxIC?>s`(G^T=}T>UPjRGH zAE`~F+qu|xV$VspkGjEgGQW_sza(&jxJj)67Eu4&x&N5uXXroA`rxi{)Ssf4f3W|Ou44~o0FL@ku}FYaqW{ee zW00zcz>)g6;ahY+%vm^CFroyJfucqQbl7@y*EAz%C*>52i&efD;`l_W(7cg+&Jm4!EDQd%!UDPkN zFSyGDSotx)N6;gueGIS_#XM4DaBu;;kPJMrn=<3A4vd$&|7Xb*=`WF@O$n?r#Bcs* zGg(sL`!@g9{<%B>fDg7i;iA>yjTa-h>uJEe)rvo{yQkmgRmuzCN$nEMggAJ)pFRV8 zptH}vK;l#^zJ8(4ziCoSOSCk{FO|jOBNd2@#i-jyDg)WSK1E z$h#0nqDOEfdioWM2(Exf0&gZ@N}o;Lbc#yZe5kb}`2})Z;sbc}Iee`FeI;j@+HDa^ z2*N`c@%@ZkVByJH$6TmRxbN<#o|CFT85~|Zpu=*yg%xDKo~z@8-*mw!fh!&9ge77s z7R&zz{>#M%cVf9TZ6Kd;lBS~U$EW`C@|))|OT{+qD`VC7!5D&8BzOub-)>QNZnEe-+*DCSt$qA%Api zzw56hBd#2j#EiH$kp)Kb-nJJ$R$g{~YHy2E4wfR7}vhF4_DViv-F|)spJ(6Hgv<31<5I)q~I=r_h7h_p7(a) zi9QmS9!-(LcFmoGZQ~Z$Il)1I(lvYl(FqmIL`LMD0tOD9o|KE1A=^!AiA-}RB6C-FzYr(H8(D#*J z4VQT_ZOirt_8&O*B5CxjE7#OpPDXNqs!1&&~>-^dB zIzK*^XvA(Mf)6CF+a2E#m1meg>LpU#z#4HQv0|1sn1Igs@CpCoy^ABGh(9q7tMiS! z>l+oGrERu@GVB7F*XS;D8I5m3t>!^!InvLGgZkJELktoZ?=4u1&aa>3vlisj%jNi_ zqetr-UT_8Rq_FX+yZKv=6v!4n=~%;2!9*&%tg%~`&Ew2a%ZAUs!D+3p5MOfm%=Eb8 zv~33@F>c$@NZ(%qYm3CQQAT4JU97M40(wdL((TH~h(*jEeJ}w6d`9jtJcBM^(3I0a zqy1k$1Vg#_v+;)_kpiY&rq_a*jjN!GqN@Vn(YhD~2RLTq;=M@!xP0TIzQ~9*X#GDB zZrR@rom>0quW&;Z&*a3&hm4blMfA&~8*rjYb2UG~{|NvP zy^m?jlLj9M6{w}mXXZyL&sfXJpb;PTVHyoC2~Rx*v7wV}9IAo=5Uf?)_WFsw8FI?X z88ob5DoKRV*5w;Vo53_X;(eSQ(asb{9sCd>ox@&fW9==fSPr)yvk=pLJSD*m{Jy_ph zQ^u`t^KtDTOB~&T!um!(deuxuC%)LH9|XfXcQ5^d7!7Qyo3y@F zF)wvL{}{FVEpEDoqm;$JsC9-_t(6LCRqLU~8@ll%O@7)c_ZysWV3k8LuX2dbu*xA9 zs~ny`vdWdp=;nF`l0c7ms|Vk@fiLYjR##Yr17Bm^zon@dO^N9_`~Bt zqxEl$M<$QQM4Ed%8tTB%5YWJ={k=Pl28Q_-927S&4PfHHfw@`DV_l}sk2!Is1lBrU z80m``S{ctYpXT&4S5&WK)cjDjR~hQYp_Mpe778X&lmODFv+w~0)|XjWUk>3cCcNRJ zHX3x}EmqyL_4#gCK^YAOM2(wxp=sPMqi1B)qNcEwjD1kaxIVy?+LC~Jon?w%i}+i_ zI>cWgJ`b@n=qLXY2qH0YP!b|da!jAVJrSo*X3=R1S@kY5iY%Ci6Ltq*7VriJU+%<{ z&7*Tm*gj(0utOt91`{CVKQVcE~6?LZIaQWGHQ}hn~Zv8lp2<;%g8FDnKHUjMjK_cLq@GK>f&hpw`7c78W0J- zbLla-(I@T8DKaw12tWUf8HPKvmgR~*4`C9*bcE{=oCu2%$`Ecs@FJ{6s7JUH;ckR` z5gtHz1mQ`9KO!_Dyo#_N;Sj=Mgd+$aB7BC>h43}PDTHJUUJAmw2p1xZL>Pl`H9|JR zd<5kR^)De&eM!1P6V1EgisV6qwL^xUl`?F&PJi|}=cbN0@BFk2F1#rHiiKO6b^3_o}B^C^Dr;O9Jk zI`}!0pVRp{g`Y+I%;)C={Ct$3Mt+Xt=NNuw@YBH0bbhAsGnJoKelFnWB7WY;&nkY_ z^3%u9Rs3AT&w74t^ z>sY#@${+Fbq{*O^#8Df-dr{u8bG0$VA<+^oEw8>tNFTLy6>jE=T^()== zO@VI`{p7wI(StfL4)?4a`hp(yL;(Ph{);X!5^sRWYLyWCb+_xdtfr-0SNA3Mv2}k< z2z-;^%Of;h66m#C#+B<_Zvnw;zRMiHem6g(Jfz7ee?qS;@SpPn(J9ErvoyVcXFblB zT_*wihHm3yNCVHsJAnuBs7A(DJzl?s$g6=xyyr{MRrA+!-I2eQ>pBio^O?x_pj`Le z$B5r6*L`&qG2XvJUd^}Vy1(Ied-Z7^lrKCeSF^5@p`%LUta*`GvvL2y#GPo zm*7%+phsDEIgp^zzurMcD_VFDu90=(Q0wcVdncFNx=oBUWiI9{-OZ}`y+ zbV{N6xP@`mYw>7eU=ke=?2egV2LlDiAA{EPRS?~Ls+FW>s!qp6c<6ZAIy*n=>?fo?w`uD3c^dY>5APiW`^Z)T#!&|E_ zc{e>Hl#;RGOHf(AVKolRfqP`VzwzBg8EF&_ z^ihBC;GFQx49(b#w9XmmaW*}YElouoMsY8!bHb*@p9b8$N}!;V z`8~LDuvmu;Wpgs6St36ND0~xcu>n45&&FGUbv93)p8`7$l?oN# zB~H;IyW%?+CcX6MXNTSpHqaJ%JCfW4jSi-X+mYV8dGV(a|3|_A)xL0VWs0YTIC2?E z9wIP&A_eDD$92;mp_F(88ekK?!iq5?(MQaiPCv)y*X0&av+HR@4g(jr8%gjD4MY-s z$#B?onD8jZPEspKljBDS{m1EN{(ggm%>E0_%xLzVvFxR^38m~nB*A|fel6&dV)!Gp z;%CS&#*e^j#a*Z<-)=-LoL40WB1!(~5^GH#R$rFP$^%rWt0N;ct22b(dN+E;*Th`F zK$is0;jChB$SvS|@*h`O6xuI(!8~%cIYU_)(9EEPCHfo)a0owOMczQM0WgubmypoX zq+Oem;7=Bb;F{{w0mv&52^{mNAmI9l3@qQM92qeNFP4u}&hcqXr;XOe~P#&VfM-F4y zo0D7cB)XfE58{m`T61!n`c|n~a8r}gTz?d4ni(=3Vsj-pGZ{bQx?p#^5*k*Ia!Px~ zfVtuWaEZ1q#KlppJ?X^Ma%A$5i?;)?a;P{9tfo)2R-n0ny9?`SU>Fr8S`Ii}!HcO* zcx_v;?%~i^Hv|UBoW_2PG=L^nzN7Mie*(B`I)J-$>D5WF{&8 zvqJ>}bl_+<$S)m()Qq(~_yK89A<#bDaro+Fjk$900?Pr}YIt#5FezB430|uW7K7xY zPbgp=K1RX)AK#F`n~4%#$&x1&T31%co@<(usn^70a z*}Lh7yxZ~bQv`Yj`7QXY^6H0(ZGjf8tWMV8Nqd*!5z6(Q6KFBWe5e40^RPcuM+Tch zXJ~qUQj6}nNvYvEX-Tbk8FW+En4}Z7w|y7D0cHDHig#$}8g0@wDfq50C9r3V?QQ?( ze1|i%r{f!O99W@Jlgv$f%O0X7!1+oSx)5?`@VnZr{IgZBb?N>%957wxrX_oKCM?-2 zp5{uv!Qy?)?v6C^Yor~5Zel|{`v{kK4T+rzd$Cx&38WjF7Gh1=EB=98tQ!pRmV6&9 z4&bHZ3jm8(@g`ot0}05Tn1)w0oW|3br}?Z@RzAOmj)=^MQxrcsmL}!`Y~jMid&T(- z?@RG?qYGjoW$zWWoT=OBL`?KtPuZW54rT?RRs4hZC#O7)StIo5j>tm^Xw;Z-&LYOk z1b&M^Tt@XeKHG`kyP}GnDdY>m^`_*&sRaKTK_sE`S3xUXA=^KM9O4Hsb+|kVS`aTF z>+80K7dD-0>X^d5m9W3t6==WoRie1kuyAY({3m~Fu_V)8f&|9i1L^$jZ-4tL)t4El zg1nsx$d$M4DwD+pkhz1ET90-sTH)WTz{1lw>v~wfxu6^7?Ba*=5p8Is1pV_-{+Z98 zg^639y9uMN_ZLExo~N?0yYT~J4}lT1)cQsTR%Iw_Myfh^XF|uNA$w;?u^iZ71==Rv zRxDAZsZ{`TlW;+NdGI#l1sHVoaEbeeSel+Exw=zwufBj7uJ{JkuT4?>7+I~@3vi0* z%ie_xRW37&LSP56C-4DG746?z_$)$f09?melG7Db2YhAw2nRUSKHu3?o(MItn-3%)?htWFC&I4!m}{ez#s4!Aq?4R7FBdH1lhrzy(rcKul` zLDsxq|24=OR}LYIBG#&N0tK|RfnlH@Kg9;Tus>+2^60^_$OsK`_VT+Zz?eh6+wX&- zo~{XKHNoi`vF8ajm59{dM(ghY4&-w6Dt2Q1nulr_mt;634_#?FiO;{Ws(20}*Xamm zrIDB(BaOZ!Wmu=`5OPO#tuvr*^>*8V4P0vm5aK(u}rHv)W|U1vwP|5f|1G8 zN%`+m6gyve0G8B?^ss$Zm*xr;!hjhPdQ(`@Oyr%weht2&{2a#sdja|=fzqQt=&*sH zkx}h1N#pkao{R7U_hpeR04lU$2x9XPMi|?UJE1J(kSWVw96`6h^&hM;>U^SJ*}KXf zp?W89$lg^Jq{ftmCGrx+oD)*i)#D+^jOWoxm@uS0#N_~lA+>lfBnTllc_(s74evb| z88rnwiHs`ZXFfk$`Ps|Q9)5Q7vx}dd{1p5=&d+v!9_42nKhyAp=0?BqQ+;UsfA6pD zK}Fev@EF1tgj*4AM3{nLL`X+C^?;&$i15t)it-Y|!wB>@{MU-|PrM&j(>2(d`4H+5 zG7&5YxG7nW>wNX82)Jogk1I{}xJpxx9aTLTUJo0*9;&+@dZr!|r5-X^|4W3;zzMOe zhb>&c2Jck}OAvCAPCv}F+JqlzxOODsi-bEUl_2Gt?}tbT9K6Y60OcGx%x@qf7m(Dyk|U`dc>gA)U#ZeP1 zS#<{Ys#?@=ml3X5Vw_<){&`43jK8a@`tW<*%iI+!-Dtq)b9<|~y#J$XqD*(aIv{^i zwfh#IcQttCt?{8r#aB~-9w^Fkx39FU3}ltpAkPC5t4mk7IiFrQA26{3dNGt%ml^8Z z-j#9xl;zSIpT|&L0cx?(SJ$CiM7JAaFXL>)=)Svjg`$+vKZA*MdFhIZD$qm(5S(lo z@SqF~EhP?=Ro5y0o2qMWsWwExm8+0%L>T3t5dD7?absCk4HyrXd<Ojo$}4WJR~v zTf+?i#;_3@17kl9u^#{C$4dc4Z@5m;XR7&Akak?5=<})kT18((`3n{O6vRc7`eY_L zvOuZ0S1ohbqNhv!<>hWPqu{h|S6he-$W_gC|AXFgliZ8n!+;jt4>;guzXdssg(*Z+Yo5h#$!c zrix*7Ebqtg#R0|Ri}o+BcmM~`&Kde8$E~lQ=zBT!x2(eJBc}UmY78q%t5+N3Ao4^l zDYnlmo^ib$#c_X*qLPy3m7f2Z->WL>d~V2qsyEPA*&blHKZs+v@gBoXIHI`m9-U4~oyYGh z!%QTaZ*se9A&e_&th{c2om-Uy$o}|h{9CqFrK^=Hj3CX2==`gwU70<8Wp+(9COzOt zB~X0Zic-+&UCZywsw&*oKKV{6CYld+uO)cWDVc~#-%wiq6&1-is`t8H1%HTcrLGEu zqHrlfR8OlN;(v2j*25a~^h@`jc<0t4P8a>0cvD~hK}K#`9pIQ?-jMgfcbsknI$Sd>K0AXAv^VnZq!T3EjwImdr*ViiN4#?wHIB!5J zoOfC)&^u*v{1D%!%B{N$BSdL`b$pJ@i;kb1Tep!?ii)~Af-7@ZS8z)+NY8lvwWKr4 zK`d*{Wu;Zbe8(B!uPH5yDXAIiT3_m2?q2~(MHOXUR3FsTy0J__JJu<4-E}p7?=om^ z_X-SssTV7q0m^(OlqYqb>RkuoO1W{YZ`3pX7ou4e#+5~T)xW%0E)-}{MS%`h*HlZ5 z1l&{Hb-s#fi9O0gulr_yg;z3r7MdwtP76zop{k~OInm>QZBVnUrpj=O7dZys>RLC3 z!Keo7G)h+FuPZ zT;`D@7|o~YQH%Pj+>xxYSVDJ#59PjFO1*BFN+jp;Fr`bSN>C%{n z;__p2ZaUe6QASC6Sp|~CLUWnw#pVZuXBp%U(<8>?I{(tT)!_aLLNZ`}xGGqlCzMrH z8L$xWBnBylnsS4;6iW-?F7{(Ft*a~dR~cNzlZt(%UZ1~~MPoG>iP-@GMi-Q6UT}|~ zqWv5&-?$&dDpl{yuBk5d!|e4|U^OM9dw^m>IhKGLkj3^Ht;3i{H8-L0=yInxc~?M1 z<3N#t{^f5-+p-!jIEpUB2mNHI$?Y~p=7-M5GJa{c1QoIrC@!j@verD;a?D!8b!r|wwW!YBd}Ii zKt73u80M7~W$vRo8e?@^})ncMVy9VjRTyZgY?)LbqDpge&YmMkK_KjCSj4r zAHEIXKYg^UzJI!1brQ5smib*2<7D$+(`2l(%KRJcT8RSNZu;voSTu?<5rO{Q^vL;m zKbH#>ItHQR5lX#aEn7%2_Up<#gzhZ}^?1Qwv@8YhsR+~m3tDNiI`Q|Re;aaO>b8inrS#PcmJ!(G zyhZadc6Ey;RhLyPBGtHP`J%dNcU|tPMOFUNMN2EH7tO_9r?k$!hz8E>TLd9@PpB;; zs|)*XHPAbJ9`X;={P`yM0DSIMzKj(t$4WiuM1vD5XsTqe?+SD)#P$hB%Khnf;G~G}uWa7iOpz{gDAOZk8ZOzs3d3aHGLL)NO@7v!xr~A6 zCT`E=6!C+tJmq>$d)>8F(Mc} zQ08Hu7tOgSmJ`LRkvX(OA@`(`F4MK3E9wlDIoMi7v0SXeperzA;X+hwlmq`d1|Qs9 z#wn6AIbPE^UCaCP^JQI9m+*lq%C)i#sL01h&Zb$hoM?N)WgXQjA1YJa)2Q=na9my# z&l1K1DpV=S;IwoSq{P8Xd7r|i7|@si4~c_`atpo8GO^0PkNkJE-DLmzy-K;)%?>n9 z;)nyKG;uijIP7~Y3$++c#Z_!Bv6vZ!@~ecY*xHo()Sdh!$VhTAd%NCFoaXiw^R8+h z_HUEwrotsbZ_2gyxwGvvqZp=>WzP~k3jWDDUs(zD1_M!EQ&NU4vA1S*3HcBeB}*xh zPVN#9eE(H$Zzh(h6)QlIbMoBzv**p2WjAFSC0)ZLu8JBJq-14XE&Ayz$AZbN#Fx}9 zE3Gb9l*@tN>#c?lt&}{!Pz*R3ina+`z^Z_%3Oe;zfs?M-dx=|_q(C8gO5k)sVF@j# z7bs}By1ZgJ^g&5=DSZF8(9~PWz36kIM~mFmD=XmckiML3iCenaOKPg!t15gYsvH(7 zC0_S(a;bWwB~j;*l0me(m%;THEs~Wk1ub4*33Le%Dd!`_FG^``#rPF<<8P^`9*^?z zV0}f+_$t$Q(|F0m0p(tQHEqOy1Oh$AR@C<+5Rep4e6ezS^89K!nq_uAz`$-2f`abB z;!iGi`+l%^2+7xEzt;=@7koCf|5i$q=aJ_O9w&D+OIeXLqfSlKc&9?6VniI6^W-)g zubJa_dsoBVMjQ0f>SgZ9aQIQNi$+6CdD%`ZqrdoSq_?}xR?5uLs>*=Ig>5Zir=(vx=7KtA>NKS3e%1>eh*VG z5aZY3^xcTNE=4)cjkXx@9R=bWFYAM+pA4RYFcX1r%tO3LeWx_G0FVp$NA@D6>2D^^ zn_9;z`gw?zaeervAZ^U+OHaQ;(brDLnHA#g=KwdQr{U-yagkloSE=Pb#PyREJ^fyM z>kLJ|1~LBaSUvq#cM;N?5bp$@trSlMF2wbSpF(Uv+=$qLcpt^6cMx$A+BuB43+)_5 zTn{|Q5w`Im_Q~T&QAZ@%F=W&ROjEdfhcqig1h_@quCgRq( z{u8`DTf#eXBz!I6dC1?ADeD0@QoSV?kVwG<=cN~Xw zlSAbn>Jk5T0xyk6J7VIa!zuZ=9e9|JfQ$Ao6ZN|+z=^mOG4YZ3G81Wv7f?C);-NST zbP^omEr@p_|4~XKZbV#*_@ElMBX%I&jaZLZ8^kyvj`BI$KH+yvka(LAN5_lsHQ|Cd z;iH)GA*TB6d~sZ2p!3xt@WBB5t%##||9HWxQ|O{pH0|FOeUmZG6>Q0PPewVE{@?t| z1~PIA{S1M8Hn@-R|Nj23uci~@^Lj9dlBiwSbGNH%%8YwMa-*R zFxoW1INIRGxmg*`ObbTOpEq^9b+iE|xz%N*IG%AAj9%@o8$Gdb*wB2sU9w^+PLqJ3 zx~^cf-&>tm2YVK$sN+{uEc4dX;mBb;%(J}Gx)l>vnnu%EbwxSsIj8iY%hrI(V957* z{dK+>F!)q#m;D4b%Vk^-HS1vRz&XBJO(Q4f&~|t$R>I<3?yid!#uwY!Qi8QH)4kGN zWvHTO!RXRD9Ie&d_$wx{Q@>zzd1+Ohd$i%|7@qvAf4G(WtNYQEe|4;LsGfgy zly6A%AH*}Kpou&vNig1Fe9ri>akS|^(?_Nr)8pnAbBFl?ORnVx%TtywE&rAIZ05I_ zhOA{-zt6fn`>N~@vU{^1$T^ymXBNU7q5%W$Eg`z!c+5D`^qfg&t~3YDzcPPmwpo5_dChXtGAMIarYG~Z%zCu+ zX6CWXPckpenwsUzdN8Xo>-DVGtkmqwvd3mG$gauWn*CJvvFz`&wK-4ce4A5Yecrmy z`muFY?(cJ7%bk~3p7(g(3frG;uiEz8F3%s6Z^Ca{?nJt5Lq5bo#!HNq#@meV7=>|$>3Y-SrVi6Ev)ODj zUki#G&CTX7%%d$^Eh$;4SvO?embE$Sv8+G7n-*&ds_q>$s{7o!KqKI-PZGRr{-?XeLHu4 z-W_@O9$$61-8XDk8Oo*t?emr@~G`&+ZVQPY?=9v z`~~^T^Pd1W-^~9w|DX9M^9L7PP%yvXu7XDjo-f!_@LIv!1?h#B!Wo5g3l|qw6mBm3 zZQ*N$-xgjmv2x<3i4p3b1NZ9?6&tr3-!vAQ7MiL|H=CX{9Wq^Lo{c{G%(E>wT6~tG z%+gF>=IYG7=%qgE3P{7stf#X^WtU{H&3+~OlAQdUSvf0n?#g*KXJ5`I=;e9Vsn*Tb zx2;!$&o#M?xi9CoQ@);=G^b{U-0}ylmS%+iKep+h?|~ zY{T*|%b%NHn!h3cPx%M)PvxImFsWchL8#!Kf?pLpUhs#4)`E`;M8UrbP8NJ$aB-oj zaC+gQ!i|M57Va->E&RN2=)_AV=1#nS;$tL3H!8|g(1T`Up>egb+1O@0Zv5JKmgy?f zI@4XIbn`^>GV_z>6w8H}Rc~5)EjMJ|mHErer!zmu6q#RSc4vNJDx;1M__NMG#WRJow+A4E~j!ec|-H`dFSP&=UtXJCT~JsCgw*`-qgIAd2{m? zK_^R=+@f=fz=^v)E%_U}!xz2p6`F`_u^JC_x%zwiCf7QI-e8_y*e8l{r z`7>y+Z_EjnVV3hO7gnvoW(iIbN-U^7G`aN^+M}BYmN0b z$n`HU8gE+P0k?asn%tqe`rO>y%G?p)Rbk$Bd5iK&^X|;MEANkayYv2$H`ZpfO|{L% z9A088vsKz^Z7XeSY`5Ds+3vP&wcT&qZhOpze%IsfDx!8%o8_pb-E!O_ES;7vOSh#5 zlBr~BGPRj0nflDsOaN_R6|Rgijx+8vwisKDO{hUo>6r#9-wt%lON~)$OfjYz(~SmW zhLPZn#!REtm~WhJoN06z7Z?{A>x~U`y$!A(+T4Sm=Z8UAd9NcDlz_i`;sA-4kDbr5VGp0t-)Fe!urY@|2y(Y!1G3(8#<}`D<*xk8_k(!t2y6XWS(N4Zk}m&nCF=n zm={57l|fRf%(c*7tITW6_2!M{P3F7ITg+R{+sqG`cR+S_nxBF6yku@N@5AbP(A)|c zYBL`-x0{cfg}Kw*W$rfjn0w8NMPt!gQY?B)swK^mZW&`4XE9nbEmljurN}bHGTk!M Z;;_uKEU+xHcq~1je*jVOXxsn* literal 0 HcmV?d00001 diff --git a/host.yaml b/host.yaml index fd5c75903247..463ffc39b301 100644 --- a/host.yaml +++ b/host.yaml @@ -181,7 +181,7 @@ adventure_options: # For example, this can be used to autoload the connector script in BizHawk # (see BizHawk --lua= option) # Windows example: - # rom_args: "--lua=C:/ProgramData/Archipelago/data/lua/ADVENTURE/adventure_connector.lua" + # rom_args: "--lua=C:/ProgramData/Archipelago/data/lua/connector_adventure.lua" rom_args: " " # Set this to true to display item received messages in Emuhawk display_msgs: true diff --git a/worlds/adventure/docs/setup_en.md b/worlds/adventure/docs/setup_en.md index 658162d8c208..3afa4544b078 100644 --- a/worlds/adventure/docs/setup_en.md +++ b/worlds/adventure/docs/setup_en.md @@ -27,10 +27,10 @@ Once Bizhawk has been installed, open Bizhawk and change the following settings: BizHawk is running in the background. - It is recommended that you provide a path to BizHawk in your host.yaml for Adventure so the client can start it automatically -- At the same time, you can set an option to automatically load the adventure_connector.lua script when launching BizHawk +- At the same time, you can set an option to automatically load the connector_adventure.lua script when launching BizHawk from AdventureClient. Default Windows install example: -```rom_args: "--lua=C:/ProgramData/Archipelago/data/lua/ADVENTURE/adventure_connector.lua"``` +```rom_args: "--lua=C:/ProgramData/Archipelago/data/lua/connector_adventure.lua"``` ## Configuring your YAML file @@ -66,7 +66,7 @@ path as recommended). Once both the client and the emulator are started, you must connect them. Within the emulator click on the "Tools" menu and select "Lua Console". Click the folder button or press Ctrl+O to open a Lua script. -Navigate to your Archipelago install folder and open `data/lua/ADVENTURE/adventure_connector.lua`, if it is not +Navigate to your Archipelago install folder and open `data/lua/connector_adventure.lua`, if it is not configured to do this automatically. To connect the client to the multiserver simply put `
:` on the textfield on top and press enter (if the diff --git a/worlds/ff1/docs/multiworld_en.md b/worlds/ff1/docs/multiworld_en.md index 1c943fcf6674..a827fb6e7d7b 100644 --- a/worlds/ff1/docs/multiworld_en.md +++ b/worlds/ff1/docs/multiworld_en.md @@ -58,7 +58,7 @@ Once the Archipelago server has been hosted: extension `*.nes` 2. Click on the Tools menu and click on **Lua Console** 3. Click the folder button to open a new Lua script. (CTL-O or **Script** -> **Open Script**) -4. Navigate to the location you installed Archipelago to. Open data/lua/FF1/ff1_connector.lua +4. Navigate to the location you installed Archipelago to. Open data/lua/connector_ff1.lua 1. If it gives a `NLua.Exceptions.LuaScriptException: .\socket.lua:13: module 'socket.core' not found:` exception close your emulator entirely, restart it and re-run these steps 2. If it says `Must use a version of bizhawk 2.3.1 or higher`, double-check your Bizhawk version by clicking ** diff --git a/worlds/oot/docs/setup_en.md b/worlds/oot/docs/setup_en.md index 2c652ff62fce..414271d8e6d2 100644 --- a/worlds/oot/docs/setup_en.md +++ b/worlds/oot/docs/setup_en.md @@ -414,7 +414,7 @@ to the emulator as recommended). Once both the client and the emulator are started, you must connect them. Within the emulator click on the "Tools" menu and select "Lua Console". Click the folder button or press Ctrl+O to open a Lua script. -Navigate to your Archipelago install folder and open `data/lua/OOT/oot_connector.lua`. +Navigate to your Archipelago install folder and open `data/lua/connector_oot.lua`. To connect the client to the multiserver simply put `
:` on the textfield on top and press enter (if the server uses password, type in the bottom textfield `/connect
: [password]`) diff --git a/worlds/oot/docs/setup_fr.md b/worlds/oot/docs/setup_fr.md index 6248f8c44bd9..37df146def7c 100644 --- a/worlds/oot/docs/setup_fr.md +++ b/worlds/oot/docs/setup_fr.md @@ -414,9 +414,9 @@ Double-cliquez sur votre fichier `.apz5` pour démarrer votre client et démarre Une fois le client et l'émulateur démarrés, vous devez les connecter. Dans l'émulateur, cliquez sur "Outils" menu et sélectionnez "Console Lua". Cliquez sur le bouton du dossier ou appuyez sur Ctrl+O pour ouvrir un script Lua. -Accédez à votre dossier d'installation Archipelago et ouvrez `data/lua/OOT/oot_connector.lua`. +Accédez à votre dossier d'installation Archipelago et ouvrez `data/lua/connector_oot.lua`. Pour connecter le client au multiserveur, mettez simplement `:` dans le champ de texte en haut et appuyez sur Entrée (si le le serveur utilise un mot de passe, saisissez dans le champ de texte inférieur `/connect : [mot de passe]`) -Vous êtes maintenant prêt à commencer votre aventure à Hyrule. \ No newline at end of file +Vous êtes maintenant prêt à commencer votre aventure à Hyrule. diff --git a/worlds/pokemon_rb/docs/setup_en.md b/worlds/pokemon_rb/docs/setup_en.md index 3c54cf9008c6..92c12de1bd0e 100644 --- a/worlds/pokemon_rb/docs/setup_en.md +++ b/worlds/pokemon_rb/docs/setup_en.md @@ -86,7 +86,7 @@ to the emulator as recommended). Once both the client and the emulator are started, you must connect them. Within the emulator click on the "Tools" menu and select "Lua Console". Click the folder button or press Ctrl+O to open a Lua script. -Navigate to your Archipelago install folder and open `data/lua/PKMN_RB/pkmr_rb.lua`. +Navigate to your Archipelago install folder and open `data/lua/connector_pkmn_rb.lua`. To connect the client to the multiserver simply put `
:` on the textfield on top and press enter (if the server uses password, type in the bottom textfield `/connect
: [password]`) diff --git a/worlds/tloz/docs/multiworld_en.md b/worlds/tloz/docs/multiworld_en.md index 031d4eee8795..ab3acf0b291c 100644 --- a/worlds/tloz/docs/multiworld_en.md +++ b/worlds/tloz/docs/multiworld_en.md @@ -80,7 +80,7 @@ Once the Archipelago server has been hosted: extension `*.nes`. 2. Click on the Tools menu and click on **Lua Console**. 3. Click the folder button to open a new Lua script. (CTL-O or **Script** -> **Open Script**) -4. Navigate to the location you installed Archipelago to. Open `data/lua/TLOZ/tloz_connector.lua`. +4. Navigate to the location you installed Archipelago to. Open `data/lua/connector_tloz.lua`. 1. If it gives a `NLua.Exceptions.LuaScriptException: .\socket.lua:13: module 'socket.core' not found:` exception close your emulator entirely, restart it and re-run these steps. 2. If it says `Must use a version of bizhawk 2.3.1 or higher`, double-check your Bizhawk version by clicking **