slowly moving towards functionality. replaces items but doesn't logic

This commit is contained in:
duncathan 2019-03-20 06:37:07 -06:00
parent 86e0ae0eea
commit 1542c25322
18 changed files with 276 additions and 190 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
=:S``i`=:l}~qlv|z`cdaj``iels}<7D>``blvqy````lu~t=:S``ia=:l}~qls}<7D>``blvqy```alu~t=:S``ib=:l}~qls}<7D>``blvqy```blu~t=:S``ic=:l}~qls}<7D>``blvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}<7D>``blvqy```dlu~t=:S``ie=:ls}<7D>`bhlvqy````lu~t=:S``ii=:ls}<7D>`bhlvqy```dlu~t=:S`a``=:l{u炼v|z`efaj`a`bl<62><6C>`aalq~<7E>`a``j````j```b=:lvq```bl<62>q``a`j``ibj```cj``ab=:S`a`a=:l{u炼v|z`efaj`a`bl<62><6C>`aalq~<7E>`a`aj````j```b=:lvq```dl<64>q``cbj``idj```hj```i=:S`a`b=:l<><6C>l}<7D>y匕<79>唞匕<E5949E><E58C95>Ql~tlu~t=:S`b``=:l{u<>=:lv|z`efdj`b`d=:lv|z`efbj`b`f=:l}<7D>yW<79>P<EFBFBD><50><EFBFBD>𢰦<EFBFBD>P<EFBFBD><EFBFBD>P<EFBFBD>匆l~tlu~t=:S`b`a=:l{u炼}<7D><><EFBFBD>婱䰻匕<E4B0BB><EFBFBD>𠠬<EFBFBD><F0A0A0AC>𤙥<EFBFBD>γl~t=:y鞛<79>仙ㄓ<E4BB99>P<EFBFBD>P<EFBFBD>𠠬<EFBFBD><F0A0A0AC>\P<>襔W<E8A594>=:鷀<>P䰻匕<E4B0BB><EFBFBD><E7A182>P<EFBFBD>匆l~t=:y匕<79>q||侨坾═αP<CEB1>嶎l~tlu~t=:S`b`b=:lv|z`bgcj`b`e=:l{u炼}<7D><>P<EFBFBD><50>P<EFBFBD>𠠬<EFBFBD>𢶠<EFBFBD><F0A2B6A0>αP<CEB1><50>=:<3A><>P<EFBFBD>P<EFBFBD>𣶸P<F0A3B6B8>𠠬<EFBFBD><F0A0A0AC>𦞙^^l~tlu~t=:S`b`c=:l{u炼}<7D>𠜱<EFBFBD><F0A09CB1>𦞙^^l~tls|<7C>腼樫^^=:<3A>P坾<50>◣P<E297A3>兣^^P<><50>^^^l~tlu~t=:S`b`d=:l}<7D><EFBFBD>P<EFBFBD><50>鱲z<E9B1B2><7A>P奴<50>P<EFBFBD>P<EFBFBD>=:<3A>P<EFBFBD>𢅛<EFBFBD>P<EFBFBD>P<EFBFBD>𠠬<EFBFBD><F0A0A0AC>P<EFBFBD><50>^l~t=:<3A>𠠬<EFBFBD><EFBFBD><EFBFBD><E38E9C><EFBFBD>γl~tls|<7C>佅P<E4BD85>奴𠠬腼^^^l~tls|<7C><><EFBFBD>𩅞^^l~tls|<7C>^^<5E><><EFBFBD>佅𠠬<E4BD85>P<EFBFBD>𠠬<EFBFBD><F0A0A0AC>=:<3A><>^^^ol~tlu~t=:S`b`e=:l{u炼}<7D>失P<E5A4B1><50>P<EFBFBD><50><EFBFBD>Ν<EFBFBD><CE9D>=:<3A><><EFBFBD>P偬P<E581AC><50>不^l~tls|<7C>𠠬<EFBFBD><F0A0A0AC>W匕襥<E58C95>P<EFBFBD><50><EFBFBD>P䰻<50>=:襔袇P<E8A287>乞^^l~t=:r奶Ps失𢅺P<F0A285BA><EFBFBD>P奴^l~tlu~t=:S`b`f=:l{u炼}<7D><><EFBFBD>P<EFBFBD><50><EFBFBD>𢰦<EFBFBD><EFBFBD><EFBFBD>榀佅υl~t=:<3A>佅驣Ν<E9A9A3>P<EFBFBD><EFBFBD><E7A182><EFBFBD><E9B1B2><EFBFBD>=:z<><7A>P<EFBFBD>𡼏<EFBFBD><F0A1BC8F><EFBFBD>榀P<E6A680>䰻匕<E4B0BB>𪈠^l~tls|<7C>娫P<E5A8AB><50>乞l~tls|<7C><EFBFBD><EFBFBD>P<EFBFBD>P<EFBFBD>𠠬<EFBFBD>兝=:<3A>仙䰻<E4BB99><EFBFBD>P儍<50>𢰦<EFBFBD><F0A2B0A6><EFBFBD>=:<3A>𠠬<EFBFBD>𢰦<EFBFBD>角P<E8A792>P<EFBFBD>𠠬<EFBFBD>𣻸l~tlv|[`efdlu~t=:S`c``=:l{u炼t~<7E>`c``l}}`l}缆````ls}<7D>```=:lv|[`efal{u<>=:lq~<7E>`e``j```cj```bl𩺰y``gilq~<7E>`e``j````j```b=:l<><6C>}<7D>lvqs``ai<69><7F><EFBFBD>Ql~tls|=:ls~<7E>`ca`j`abbj```blt~<7E>`b``l𩺰y``a`=:ls~<7E>`caaj`abbj```blt~<7E>`b`al𩺰y``a`=:ls~<7E>`cabj`abbj```blt~<7E>`b`bl𩺰y``a`=:ls~<7E>`cacj`abbj```blt~<7E>`b`cl}<7D><>P<EFBFBD><50>P𩡗<50><F0A9A197><EFBFBD><EFBFBD>l~t=:ls|<7C><>P<EFBFBD><EFBFBD><EFBFBD>功P𤨎乞^^l~tls|=:l𩺰y``b`l<><6C>``dls~<7E>`d``j`aahj```blt~<7E>`e``=:l𩺰y``a`=:l}<7D>yW𨧧<57>P<EFBFBD><50><EFBFBD><E38E9C>Ql~tls|<7C>䰻W<E4B0BB>P<EFBFBD><50>𢰦<EFBFBD><F0A2B0A6>QQl~tls|=:lr<6C>`d``=:ls}<7D>``d=:lq~<7E>`d``j``a`j```b=:lq~<7E>`ca`j``a`j```b=:lq~<7E>`caaj``a`j```b=:lq~<7E>`cabj``a`j```b=:lq~<7E>`cacj``a`j```b=:lu~t=:S`ca`=:S`caa=:S`cab=:S`cac=:S`d``=:l{u炼}缆0d``=:lv|]`efalv|]`efe=:lq~<7E>`ca`j``b`j```e=:lq~<7E>`caaj``b`j```e=:lq~<7E>`cabj``b`j```e=:lq~<7E>`cacj``b`j```e=:ls~<7E>`d``j`aagj```e=:lq~<7E>`d``j```ej```el𩺰y```b=:lq~<7E>`d``j``c`j```dl<64><6C>`g`=:l𩺰y`a``l<><6C>ls}<7D>`ael}<7D>=:<3A>㨩叚咋l𩺰y`ad`ls}<7D>```l~tls|lv|[`efb=:lvq```dl<64>q``bij``i`j``abj```i=:S`da`=:l{u炼v|[`efbl}<7D>lvqs``ai𡤅l~tlvqs````ls|=:lq~<7E>`d``j``a`j````l𩺰y``e`=:l}<7D>lvqs``ai<61><EFBFBD>P<EFBFBD><50>P<EFBFBD>𠠬}<7D><>𪆓=:<3A>剠l~tls|<7C><>Ν<E4B88A><CE9D>么P<E4B988>佅驣<E4BD85>=:<3A><><EFBFBD>𢰦<EFBFBD><EFBFBD>䰻匕<E4B0BB><E58C95>Ql~tls|<7C>W𨧧s失𢅺^=:s失𢅺Pr<50><72>^l~t=:<3A><>PyP<79><50>P<EFBFBD>\PyP<79><50>=:<3A><>P<EFBFBD>袇𠠬<E8A287><F0A0A0AC>𤩎<EFBFBD>^l~tls|<7C>vqs``beyP<79>唞匕<E5949E><E58C95>P<EFBFBD><EFBFBD><E591A8><EFBFBD>袇=:<3A><><EFBFBD>P<EFBFBD>𪈠^^^l~t=:q<><EFBFBD>\P<><EFBFBD><E4BB99><EFBFBD>奉l~tls|<7C>vqs``b`yP<79>γ^^𨯂<><F0A8AF82>𢅺P<F0A285BA>=:}<7D><>𩬅𤨎<F0A9AC85><F0A4A88E>㎜鷀ㄓP<E38493><50>=:<3A>𠠬鴂<F0A0A0AC><EFBFBD><E38E9C>不^^^l~tls|=:lu<6C>`dae=:S`dae=:l{u炼}<7D>lvqs``ai娫P<E5A8AB>吾l~tls|<7C><><EFBFBD><E58C95>𢅛P<F0A2859B>𢅛P<F0A2859B>P<EFBFBD><EFBFBD>=:腼P<E885BC>P鴹棅憕<E6A385><E68695>𦖠l~t=:t𡼏<74><EFBFBD>䣳P<E4A3B3>P丐<50><E4B890>=:膄P<E88684>㎜仪P<E4BBAA><50><EFBFBD>𠠬𠯫𦻐l轮z`db`lv|[`efclvqs````ls|<7C>=:l<>}```bj```dj`a``lwy<77>``bx<62><78>硂陁佅P<E4BD85>𠠬m<F0A0A0AC><6D>𢅛P<F0A2859B>𢅛m^l~tls|<7C>=:ls}<7D>`a`lwy<77>``dw鴂P<E9B482>𠠬m}<7D><><EFBFBD>Pw<50>mQl𩺰y`af`l~tl<74><6C>s|=:lvq```dl<64>q``bij``i`j``abj```i=:S`db`=:l{u炼}<7D>lvqs``ai<61><69>𢅺ol~tls|<7C><>㘘P<E39898>P<EFBFBD>仙襥佅P<E4BD85><50><EFBFBD>=:<3A>失P<E5A4B1><50>\PyW<79>P<EFBFBD>P<EFBFBD><50>^l~tl<74><6C>ls|l}缆````=:lvq```dl<64>q``bij``i`j``abj```i=:S`e``=:l{u<>=:lv|z`efcj`ec`=:lu<6C>`eae=:S`ea`=:l{u炼v|[`efbl}<7D>lvqs``ai𡤅l~tls|<7C>䰻W<E4B0BB>P<EFBFBD><50>P<EFBFBD>𠠬}<7D><>𪆓=:<3A>剠l~tls|<7C><>Ν<E4B88A><CE9D>么P<E4B988>佅驣<E4BD85>=:<3A><><EFBFBD>𢰦<EFBFBD><EFBFBD>䰻匕<E4B0BB><E58C95>Ql~tls|<7C>W𨧧s失𢅺^=:s失𢅺Pr<50><72>^l~t=:<3A><>PyP<79><50>P<EFBFBD>\PyP<79><50>=:<3A><>P<EFBFBD>袇𠠬<E8A287><F0A0A0AC>𤩎<EFBFBD>^l~tls|<7C>vqs``beyP<79>唞匕<E5949E><E58C95>P<EFBFBD><EFBFBD><E591A8><EFBFBD>袇=:<3A><><EFBFBD>P<EFBFBD>𪈠^^^l~t=:q<><EFBFBD>\P<><EFBFBD><E4BB99><EFBFBD>奉l~tls|<7C>vqs``b`yP<79>γ^^𨯂<><F0A8AF82>𢅺P<F0A285BA>=:}<7D><>𩬅𤨎<F0A9AC85><F0A4A88E>㎜鷀ㄓP<E38493><50>=:<3A>𠠬鴂<F0A0A0AC><EFBFBD><E38E9C>不^^^l~tls|=:lu<6C>`eae=:S`eae=:lq}z```bj`eahlq}z``acj`eah=:l}<7D>lvqs``ail<69><6C><EFBFBD>P<EFBFBD>坼PyW硂<57><E7A182>𢅺P<F0A285BA><50>=:<3A>P<EFBFBD>袿P<E8A2BF>𪈠P𠯫𢶠<F0A0AFAB><F0A2B6A0>^^^l~tlu~t=:S`eah=:l}<7D>l<EFBFBD><6C>q}[```dj`a``lwy<77>``d=:w鴂P<E9B482>𠠬m}<7D><><EFBFBD>Pw<50>mQl𩺰y``bel~tlu~t=:S`eb`=:l{u炼}<7D>lvqs``ai<61><69>𢅺ol~tls|<7C><>㘘P<E39898>P<EFBFBD>仙襥佅P<E4BD85><50><EFBFBD>=:<3A>失P<E5A4B1><50>\PyW<79>P<EFBFBD>P<EFBFBD><50>^l~tlu~t=:S`ec`=:l{u炼}<7D>lvqs``bey上Ν<E4B88A>𠠬坾<F0A0A0AC>𢶠P<F0A2B6A0><EFBFBD>=:<3A>𠠬<EFBFBD><F0A0A0AC>P<EFBFBD>硂𠯫岡Ql~t=:<3A>𠠬}<7D><>𪆓P<F0AA8693><50>P鷀ㄓ=:奴<>P偬P<E581AC><50>^l~tlu~t
0==F=IZ[NISYW=@A>G==FBIPZb===?ISNV====IR[Q0==F>IZ[NIPZb===?ISNV===>IR[Q0==F?IZ[NIPZb===?ISNV===?IR[Q0==F@IZ[NIPZb===?ISNV===@IR[Q0==FAIZ[NISYW=@A>G==FFIPZb===?ISNV===AIR[Q0==FBIPZb==?EISNV====IR[Q0==FFIPZb==?EISNV===AIR[Q0=>==IXRfISYW=BC>G=>=?I`\b==>>IN[]=>==G====G===?ISN\===?Ia_N==>=G==F?G===@G==>?0=>=>IXRfISYW=BC>G=>=?I`\b==>>IN[]=>=>G====G===?ISN\===AIa_N==@?G==FAG===EG===F0=>=?I]_VIZ`TV<54>-„|{4<>-|}r{.I[\QIR[Q0=?==IXRfISYW=BCAG=?=AISYW=BC?G=?=CIZ`TV4ƒr-{|<7C>uv{t-<2D>|-€n†-<2D>|-†|;I[\QIR[Q0=?=>IXRfIZ`Tdn<64>pu-|<>-s|-<2D>ur-`n{qp|p€;I[\QVs-†|-€<>r}-|{-<2D>ur-€n{q9-<2D>ur†4yywz}-|<>-n{q-ov<6F>r-†|;I[\QV<>-_RNYYf-u<E2809A>€9-<2D>||.I[\QIR[Q0=?=?ISYW=?D@G=?=BIXRfIZ`Ta|-z|ƒr-<2D>ur-`{€<>|{r€9-†|{rrq-<2D>|-yvs<76>-<2D>ur-€}ryy;;;I[\QIR[Q0=?=@IXRfIZ`Tg‡‡zoy;;;I[\QIPY_Sv€u;;;`|-u{t†-s|;;;-sv€u;;;I[\QIR[Q0=?=AIZ`T\yq-„|zn{-Wr{xn-€rq-<2D>|-orv{-puntr-|s-<2D>ur-`n{q-g|{r;I[\Q`ur-n{q-ur-}}}vr€;I[\QIPY_Ur-u|€r-v€;;;I[\QIPY_bzzzzz;;;I[\QIPY_;;;`|zr„urr-v{-<2D>ur-`n{qg|{r;;;LI[\QIR[Q0=?=BIXRfIZ`T\-rny-z|zzvr€-„rrxvyyrq-o†-|o|<7C>€;I[\QIPY_dr-unq{4<>-rƒr{-|}r{rq-|r†r€-†r<E280A0>;;;I[\QO<4F>-Py†-nv€rq-‚€;I[\QIR[Q0=?=CIXRfIZ`Tf|4r-y||xv{t-s|-rq-sy|„r€LI[\Qaurr4€-n{-|yq-„|zn{-{nzrqWr{xn-„u|-zvtu<74>-x{|„-no|<>-<2D>un<75>;I[\QIPY_\u9-vtu<74>;I[\QIPY_Vs-†|-t|-<2D>|-€rr-ur9†|-|tu<74>-<2D>|-ov{t-ny|{t<17>ur-q|t-{r…<72>-<2D>|-<2D>ur-orq;I[\QISY8=BCAIR[Q0=@==IXRfIQ[]=@==IZZ=IZfQ====IPZb====ISY8=BC>IXRfIN[]=B==G===@G===?IdNV==DFIN[]=B==G====G===?I`NaIZ`TISNP==>F\||uuuu.I[\QIPY\IP[]=@>=G=>??G===?IQ[]=?==IdNV==>=IP[]=@>>G=>??G===?IQ[]=?=>IdNV==>=IP[]=@>?G=>??G===?IQ[]=?=?IdNV==>=IP[]=@>@G=>??G===?IQ[]=?=@IZ`Tdr-unƒr-n-cV`Va\_.I[\QIPY_a||-onq-s|-†|9-o<6F>;;;I[\QIPY\IdNV==?=I`\b===AIP[]=A==G=>>EG===?IQ[]=B==IdNV==>=IZ`TV4z-|{-<2D>urv-€vqr.I[\QIPY_f|4r-t|v{t-q|„{..I[\QIPY\IO`Y=A==IPZb===AIN[]=A==G==>=G===?IN[]=@>=G==>=G===?IN[]=@>>G==>=G===?IN[]=@>?G==>=G===?IN[]=@>@G==>=G===?IR[Q0=@>=0=@>> 0=@>?0=@>@0=A==IXRfIZfQ=A==ISY:=BC>ISY:=BCBIN[]=@>=G==?=G===BIN[]=@>>G==?=G===BIN[]=@>?G==?=G===BIN[]=@>@G==?=G===BIP[]=A==G=>>DG===BIN[]=A==G===BG===BIdNV===?IN[]=A==G==@=G===AI`\b==D=IdNV=>==I]_VIPZb==>BIZ`Tcvp<76>|†.IdNV=>A=IPZb====I[\QIPY\ISY8=BC?ISN\===AIa_N==?FG==F=G==>?G===F0=A>=IXRfISY8=BC?IZ`TISNP==>F\u.I[\QISNP====IPY\IN[]=A==G==>=G====IdNV==B=IZ`TISNP==>Ff|4r-„v<E2809E>u-<2D>ur-Zvzvtn€<17>||LI[\QIPY_aun<75>4€-vtu<74>9-<2D>urr4€{|<7C>uv{t-onq-no|<>-<2D>urz.I[\QIPY_V4z-Py†;Py†-Onpr;I[\Qdur{-V-„|xr-}9-V-„n€„v<E2809E>u-<2D>ur€r-puvyqr{;I[\QIPY_ISNP==?BV-q|{4<>-unƒr-n{†-zrz|vr€ors|r-<2D>un<75>;;;I[\QNz{r€vn9-†|-zvtu<74>-€n†;I[\QIPY_ISNP==?=V-„n€;;;}|onoy†-nZvzvtn:o<6F>pur-w<E2809A>-yvxr<17>ur-|<7C>ur-|o|<7C>€;;;I[\QIPY\IRcR=A>B0=A>BIXRfIZ`TISNP==>F\u9-„|„;I[\QIPY_aun<75>-]|yn-`<60>n-|s-†|‚€v€-v{-n„sy-€un}r;I[\QQ|-†|-„n{<7B>-<2D>|-<2D>nqrv<>-s|-z†-znpuv{r-t{LIf[W=A?=ISY8=BC@ISNP====IPY_IaNZ===?G===AG=>==ITVa===?Un{qrq-|ƒr-<2D>ur-J]|yn-`<60>nJ;I[\QIPY_IPZb==>=ITVa===AT|<7C>-<2D>ur-JZnpuv{r-T{J.IdNV=>C=I[\QI_ZbIPY\ISN\===AIa_N==?FG==F=G==>?G===F0=A?=IXRfIZ`TISNP==>F_rnyy†LI[\QIPY_dryy9-vs-†|-rƒr-pun{tr†|-zv{q9-V4yy-or-urr;I[\QI]_VIPY\IZfQ====ISN\===AIa_N==?FG==F=G==>?G===F0=B==IXRfISYW=BC@G=B@=IRcR=B>B0=B>=IXRfISY8=BC?IZ`TISNP==>F\u.I[\QIPY_f|4r-„v<E2809E>u-<2D>ur-Zvzvtn€<17>||LI[\QIPY_aun<75>4€-vtu<74>9-<2D>urr4€{|<7C>uv{t-onq-no|<>-<2D>urz.I[\QIPY_V4z-Py†;Py†-Onpr;I[\Qdur{-V-„|xr-}9-V-„n€„v<E2809E>u-<2D>ur€r-puvyqr{;I[\QIPY_ISNP==?BV-q|{4<>-unƒr-n{†-zrz|vr€ors|r-<2D>un<75>;;;I[\QNz{r€vn9-†|-zvtu<74>-€n†;I[\QIPY_ISNP==?=V-„n€;;;}|onoy†-nZvzvtn:o<6F>pur-w<E2809A>-yvxr<17>ur-|<7C>ur-|o|<7C>€;;;I[\QIPY\IRcR=B>B0=B>BINZW===?G=B>EINZW==>@G=B>EIZ`TISNP==>FIab_\{r-qn†9-V4q-rnyy†-yvxr<17>|-zrr<72>-<2D>un<75>-t{€zv<7A>u;;;I[\QIR[Q0=B>EIRcR===E0=B?=IXRfIZ`TISNP==>F_rnyy†LI[\QIPY_dryy9-vs-†|-rƒr-pun{tr†|-zv{q9-V4yy-or-urr;I[\QIR[Q0=B@=IXRfIZ`TISNP==?BV<42>4€-<2D>ur-uzn{€-„u|4r<17>ur-rny-onq-t†€.I[\Qaur-Zvzvtn€-„rr-w<E2809A>€rq-o†-<2D>urz;I[\QIR[Q

View file

@ -1 +1 @@
IF_llulIFx墛}x墤llltx倉卨lllx亰€IF_llumIFx墛}x墤llltx倉卨llmx亰€IF_llunIFx墛}x墤llltx倉卨llnx亰€IF_lluoIFx墛}x墤llltx倉卨llox亰€IF_llupIFx墛}x墤llltx倉卨llpx亰€IF_lmllIFx噥晉倉媗lllx悗}llqrvllulvlmlnvllqqIF_lmmlIFx噥晉弸憀lmmx}妼lmmlvllllvlllnx倉媗lllx悗}llqrvllulvlluuvllppIF_lnllIFx噥旾Fx倛唌ltmvlnlnIFx倛唌ltlvlnlmIFx墢僨か┈\煠<>琭jjjx妺€x垘]x妺€x垕IFx墪~llllx}妼lnllvlllnvlllpx搣卨lolx墪€llllx倛gmltlx倛imlnqx倛gmlnrIFx墢儖<E5A2A2><>\长玞痋澇潷<E6BE87>x妺€x垘悿<E59E98>¥癨但盶━¥癨灐\牎潬jIF暙盶牓牚c癨ⅷオ煠\<5C>\<5C>IFか砛<E3818B><E7A09B>\哎<>痋彵<E7978B><E5BDB5>А燶但眏x妺€x垘悿ク\ク\挨<><E68CA8>エjx妺€IF悿<46><E682BF>长玕爱礬矮\牎⒌\挨<>€珶矮甀F癨挨<E799A8>唱\オ\ぁ<>jx妺€IF惈\灐\<5C><EFBFBD>隘\<5C>甛ぅ疘F〈<46><E38088><EFBFBD><EFBFBD>痡jjx妺€x垘jjj悿澃c痋长澃\彵<><EFBFBD>jx妺€x垘暙盶漒<E79BB6>ァ獱\<5C>\ぁ<>{x妺€IF暙眂<E69A99>\漒灔癨矮玕<E79FAE>啊j<妺€IF彜<46><EFBFBD>\矮\灐\オ\ぁ<>\偿挨\悲jx妺€x垘彜<E59E98>碀痋煗<E7978B><E78597>\<5C>甛但盶挨<E79BB6>F长<46><E995BF><EFBFBD>jx妺€IF~卑\Ρ<>\漒ē鞍ā\长エ<E995BF>潱玥IF挨〉\煗<>\潽燶矮<E787B6>\ぁ甛澇澋jx妺€x亽乴nluIF_lnlmIFx墢儀倛gmltm嫟\怠潳jx妺€x垘啽<E59E98>\灐<><E78190>\挨〉\<5C><EFBFBD>\ぁ甛<E38181><E7949B>IF匼瘽砛ぁ甛煯潻\<5C><>挨オ<E68CA8>オ矮IF但碑\<5C>煣“jx妺€x亽乴nluIF_lnlnIFx噥晉墢儞<E5A2A2>癨碀痋グh\漒ǐ病\ā鞍‘{x妺€x亽乴nluIF_lnluIFx噥晉}妼lnllvllllvlllnx亰€IF_lnnlIFx弣恱噥晉剦x妼lnnmvlmqlvlllnx}妼lnnmvllmlvlllnx搣卨lqlIFx墢儀弸憀lsl劇礭x妺€x垘IFx弸憀lslc┇猐x妺€x垘IF暙眂<E69A99>\<5C>癨牎潬h\澁<>但眥x妺€x垘jjjjjx妺€x垕IFx搣卨lqlx搣卨lqlx墛}x墤llltx倉卨llpx搣卨lqlx弶x€妼lnnmx亰€IF_lnnmIF_lollIFx寧厁倛唍sllvlllmx倛gnsllx弸憀lnnx妼lollvllnmvllllx墝llnpvllmrvllrrx亽乴olmIF_lolmIFx寧厁墢儀悜巟儏恗lnrx厫gllnrIF儷癨y彵<79>痋垺鞍y]x搣卨lnqx妺€x亰€
LIbooxoLI{<7B><>{<7B>𦷪oow{<7B>èooo{<7B><>IbooxpLI{<7B><>{<7B>𦷪oow{<7B>èoop{<7B><>IbooxqLI{<7B><>{<7B>𦷪oow{<7B>èooq{<7B><>IbooxrLI{<7B><>{<7B>𦷪oow{<7B>èoor{<7B><>IbooxsLI{<7B><>{<7B>𦷪oow{<7B>èoos{<7B><>IbopooLI{<7B>𤩝<EFBFBD>簆ooo{<7B><>ootuyooxoyopoqyoottLIboppoLI{<7B>𤩝<EFBFBD>𦷪opp{<7B><>oppoyooooyoooq{<7B>簆ooo{<7B><>ootuyooxoyooxxyoossLIboqooLI{<7B>妉I{<7B>纺owpyoqoqLI{<7B>纺owoyoqopLI{<7B><><EFBFBD>悔珞╡悔疳mmm{<7B><><EFBFBD>鬔{<7B><><EFBFBD>穥I{<7B><>ooo{<7B><>oqooyoooqyooos{<7B>èoro{<7B><>ooo{<7B>jpowo{<7B>lpoqt{<7B>jpoquLI{<7B><>吻_垣悚_陽宸淪絍阸孑{<7B><><EFBFBD><EFBFBD>妙揭妊_葬復洧戍訛﹞_ㄓ迚mLI玏復ㄗㄜf訛市身╡_陋_<E9998B>陶仃LI妙跛<E5A699>飛_釣洶淪𣖕于痊𨯂炊δ葬惴{<7B><><EFBFBD><EFBFBD>夾淪迆_釦于<E987A6>走m{<7B><>I𩣪挈于陽宰陰筷陵_ㄓ斥_釦于<E987A6>拳LI忖訛釦戛雁_身_坐惜m{<7B><>I𤧣_﹞_眼〝丐陴_幼巢夾淺I仄砟惆洶韋烯mm{<7B><><EFBFBD>鮎mm𩣪稭f淪陽稭_𣖕于<F0A39695>見m{<7B><><EFBFBD><EFBFBD>捎_鍮弗角迤_恭_坐捲?{<7B><>I玏惠惜_鍮”訛陵宰<E999B5>酗m{<7B><>I佂于散不_陵_﹞_身_坐惜_隅釦_散m{<7B><><EFBFBD><EFBFBD>坐_<E59D90><EFBFBD>惆郎_幼巢葬復釦几I陽悍于釣洶m{<7B><>I<EFBFBD>訛庖眾_鍮咧陶咫_陽走于僙峭LI釦元_<E58583>洶_<E6B4B6>δ陵悚_坐巢絍瓲m{<7B><><EFBFBD><EFBFBD>qoxLIboqopLI{<7B><><EFBFBD>jpowp綉_舅𡵆m{<7B><><EFBFBD><EFBFBD>散訛﹞幼惜_釦元_<E58583>換不_坐巢恭右LIÓ<49>跛坐巢䁥_皎洶釦身囝身陵LI葬敢_祚◥仇m{<7B><><EFBFBD><EFBFBD>qoxLIboqoqLI{<7B>𤩝<EFBFBD><F0A4A99D><EFBFBD><EFBFBD>淪迅k_鍮垣竣_咫陶仃~{<7B><><EFBFBD><EFBFBD>qoxLIboqoxLI{<7B>𤩝<EFBFBD><F0A4A99D>oqooyooooyoooq{<7B><>IboqqoLI{<7B>𢲛<EFBFBD>𤩝<EFBFBD><F0A4A99D><EFBFBD>莑qqpyoptoyoooq{<7B><>oqqpyoopoyoooq{<7B>èotoLI{<7B><><EFBFBD>𦷪ovo龗節{<7B><><EFBFBD>鍸I{<7B>𦷪ovo<76>洫苜{<7B><><EFBFBD>鍸I玏惠惜_陋訛ㄓ迚k_𥼚于葬揍{<7B><><EFBFBD>鮎mmmm{<7B><><EFBFBD>穥I{<7B>èoto{<7B>èoto{<7B><>{<7B>𦷪oow{<7B>èoos{<7B>èoto{<7B><><EFBFBD>莑qqp{<7B><>IboqqpLIborooLI{<7B>ù<EFBFBD>织vooyooop{<7B>jqvoo{<7B>𦷪oqq{<7B>莑rooyooqpyoooo{<7B>莑oqsyoopuyoouu{<7B><>ropLIboropLI{<7B><>ovu

View file

@ -1 +1 @@
0==F=IZ[NIPZb====ISNV====IR[Q0==F>IZ[NIPZb====ISNV===>IR[Q0==F?IZ[NIPZb====ISNV===?IR[Q0==F@IZ[NIPZb====ISNV===@IR[Q0==FAIZ[NIPZb====ISNV===AIR[Q0=>==IXRfISYW>BCAG=>=>I`\b==>>IN[]=>==G====G===?ISN\===AIa_N==>CG==FAG==@?G===?0=>=>I]_VIZ`TV<54>-„|{4<>-|}r{.I[\QIR[Q0=?==I]_VISYW>BCAG=>=>ISYW?A==G===>ISY8?A==I`\b==??IP[]=?==G==?>G====IRcR=?=?0=?=?IZ`TIab_ITVa>=@@IVa8==@@T|<7C>-<2D>ur-JZ€u||z-OnqtrJ.IdNV==?BI[\QIR[Q0=A==IXRfIZfO===?IdNV==?=IVaW==@@G=A?=ISYW>BC?G=A>>ISYW>BC>G=A=@IZ`Tf|-t|<7C>-€|zr-o€v{r€€-„v<E2809E>u-zrLIf[W=A=>IPY_Unu.I[\QV-q|o<E2809A>-<2D>un<75>;I[\QIR[Q0=A=>IXRfIZ`TUru:uru:uru;-O†r9-<2D>ur{;I[\QIR[Q0=A=?IXRfISY8>BC>IZ`TUzLI[\Q-Nz{r€vnLI[\QU|„-n„sy;I[\QIRcR=A=@0=A=@IXRfIZ`Tdryy9-<2D>ur{;-Q|-†|-„n{<7B>-zr-<2D>|tvƒr-†|-<2D>ur-Z€u||z-OnqtrLIf[W=A=EIRcR=A=A0=A=AIXRfIZ`TO<4F>-v{-rnyv<79>†9-†|-q|{4<> rnyy†-„n{<7B>-v<>9-vtu<74>LIf[W=A=BIRcR=A=E0=A=BIXRfIZ`Tf|-„n{<7B>-v<>-<2D>un<75>-zpuLIf[W=A=FIRcR=A=C0=A=CIXRfIZ`Tf|-„n{<7B>-v<>-no€|y<79>ry†-}|€v<E282AC>vƒry†{|-zn<7A><6E>r-„un<75>LIf[W=A=FIRcR=A=D0=A=DIXRfIZ`TO<4F>-rnyy†-†|-q|{4<>-„n{<7B>v<>9-vtu<74>LIf[W=A>=IRcR=A=F0=A=EIXRfIZ`T_rnyy†L-\xn†;I[\QIR[Q0=A=FIXRfIZ`Tfrnu9-„u|-{rrq€-v<>;;;I[\QIR[Q0=A>=IXRfIZ`TSv{r9-urr-†|-t|.I[\QIPY_ITVa>=@@IVa8==@@ISY8>BC?IPY_IPZb==>=T|<7C>-<2D>ur-JZ€u||z-OnqtrJ;IdNV=>C=I[\QI_ZbIR[Q0=A>>IXRfIZ`TO‡‡‡‡‡<E280A1>;I[\QIR[Q0=A?=IXRfIZ`TIab_ITVa>=@@`u|„rq-uvz-<2D>ur-JZ€u||z-OnqtrJ;ITVa====IPY_IZ`TIab_IPZb===AQvr..I[\QIPY\ISY8>BCAIP[]=B==G=@>@G====IdNV===?IN[]=B==G=>==G====IQ[]=A==IO`Y=B==IR[Q0=B==IXRfIPZb====IN[]=B==G=B==G===BIdNV=>B=IZ`Tf|-„v{;;;;;;I[\QIPY_ISY:>BCAIQ[]=B==IRcR=B=>0=B=>IZ`TITVa>=@AIVa8==@AIPZb==>BT|<7C>-<2D>ur-JZn-]vt{|{J.IdNV=>A=I[\QI_ZbIR[Q
41JWW`W41ctuhcjt|WWWWcmhpWWWWcluk41JWW`X41ctuhcjt|WWWWcmhpWWWXcluk41JWW`Y41ctuhcjt|WWWWcmhpWWWYcluk41JWW`Z41ctuhcjt|WWWWcmhpWWWZcluk41JWW`[41ctuhcjt|WWWWcmhpWWW[cluk4141JWXWW41crl€cmsqX\][aWXWXczv|WWXXchuwWXWWaWWWWaWWWY41cmhvWWW[c{yhWWX]aWW`[aWWZYaWWWY41JWXWX41cwypctznp汫灃昇汫枟寱Hcuvkcluk41JWYWW41cwypcmsqX\][aWXWXcmsqY[WWaWWWXcmsRY[WWczv|WWYYcjuwWYWWaWWYXaWWWWcl}lWYWY41JWYWY41cl}lWW_Z41JW[WW41crl€ct€iWWWYc~hpWWYW41cp{qWWZZaW[YW41cmsqX\]YaW[XX41cmsqX\]XaW[WZctzn€枩G帠汫殩攲G墱殣晫殮G瀽洀G攲fc€uqW[WXcjsyo垙Hcuvk41pG嫋湁汫洀垱Ucuvkcluk41JW[WX41crl€ctzno審T弻廡弻廢Gi爩SG洀寱Ucuvkcluk41JW[WY41crl€cmsRX\]Xctzno攆cuvkGh敃寶悎fcuvk41o枮G垶崪揢cuvkcl}lW[WZ41JW[WZ41crl€ctzn~寭揝G洀寱UGk朑爾淕瀳暃G攲G洊41帎潓G爾淕洀孏t湚彊枛擥i垕帉fc€uqW[W_cl}lW[W[41JW[W[41crl€ctzni湜G悤G檶垞悰燬G爾淕嫋<E6B795>'<27>41檶垞摖G瀳暃G悰SG檺帍沠c€uqW[W\cl}lW[W_41JW[W\41crl€ctzn€枩G瀳暃G悰G洀垱G敎姀fc€uqW[W`cl}lW[W]41JW[W]41crl€ctzn€枩G瀳暃G悰G垑殩摐泴摖G棖殣洂潓摖41晼G攬洓寵G瀼垱fc€uqW[W`cl}lW[W^41JW[W^41crl€ctzni湜G檶垞摖G爾淕嫋昇汫瀳暃41悰SG檺帍沠c€uqW[XWcl}lW[W`41JW[W_41crl€ctzny寛摀爁Gv拡燯cuvkcluk41JW[W`41crl€ctzn€寛廠G瀼朑晫寢欸悰UUUcuvkcluk41JW[XW41crl€ctznm悤孲G弻檶G爾淕帠Hcuvkcjsycnp{XWZZcp{RWWZZcmsRX\]Ycjsy41cjt|WWXWn枦G洀孏dt湚彊枛擥i垕帉dUc~hpWX]Wcuvkcyt|cluk41JW[XX41crl€ctzni  <E38080>Ucuvkcluk41JW[YW41crl€ctznc{|ycnp{XWZZz彇瀸婫彁擥洀孏dt湚彊枛擥i垕帉dUcnp{WWWWcjsy41ctznc{|ycjt|WWW[k悓HHcuvkcjsvcmsRX\][41cjuwW\WWaWZXZaWWWWc~hpWWWY41chuwW\WWaWXWWaWWWWckuwW[WW41cizsW\WWcluk41JW\WW41crl€cjt|WWWWchuwW\WWaW\WWaWWW\c~hpWX\W41ctzn€枩G瀽昒UUUUUcuvkcjsycmsTX\][ckuwW\WWcl}lW\WX41JW\WX41cl}lWW_[

View file

@ -1 +1 @@
\Yr<7F>\Y亨攝拠悧㈲武<E388B2>渠搏\Yr<7F>\Y亨攝拠悧㈲武<E388B2>€渠搏\Yr<7F>\Y亨攝拠悧㈲武<E388B2>°駁貼Yr<7F>\Y亨攝拠悧㈲武<E388B2>駁貼Yr<7F>\Y亨攝拠悧㈲武<E388B2>ル駁貼Yr€\Y禦畑兇椄€€巨據€<7F><7F>°武<C2B0>ル」。<EFBDA3><7F><7F><7F><7F><7F>Yr<72>\Y供。<E4BE9B>悗麿セスカ{oサセスカoーカセ{oテキエチエoサクナエウoー\Yニクテイキoセスoテキクツoクツサースウ}享椏\Y「キエvツoテキエoセスエoニキセoイセスツテチトイテエウ\Yテキクツoサーアネチクステキ{oクスoセチウエチoテセ\Yコエエソoトツo眠トウクツoソエススエウoトソ}享椏渠搏\Yr÷\Y供。<E4BE9B>悗魅キエチエoクツoースoエヌクテoテセoテキクツoシーノエ}\Y惰テoテキエoソーテキoテセoクテoクツoアサセイコエウ\Yアネoーoキトカエoアセトサウエチ}享椏拠孱誠ウoシセナクスカoテキエoアセトサウエチoニセトサウ\Yアエoケトツテoテキエoアエカクススクスカoセオoネセトチ\Yテチクーサツ}}}享椏渠搏\Yr\Y供。<E4BE9B>副凰<E587B0><EFBFBD>€亨「鱒ーキ}}}o<>シo「柞キトスカチネoオセチ\Y愃シクカーoオサエツキ}}}享椏拠孱yツスクオオoツスクオオy享椏拠孱\Yィ椄oツシエササoーoアクテoサクコエo愃シクカー}享椏渠搏\Yr€\Y供。<E4BE9B>悗沫ー|キー|キーキ}}}享椏拠孱ィセトvチエoオトススネ}享椏渠搏\Yr\Y供。<E4BE9B>悗沫ーナエoネセトoエナエチoツエエスoテキエoセトテツクウエoセオ\Yテキクツoクツサースウ視撼搭兆。」キクツoクツサースウoクツoオサセーテクスカoキクカキoクス\Yテキエoツコクエツ}享椏\Y青oテセoキセニoクテoシースーカエツoテセoオサセーテ}}}享椏\Y」キーテoツエイチエテoサクエツoニクテキクスoテキクツ\Yシーノエ}享椏渠搏\Yr\Y供。<E4BE9B><EFBFBD><EFBFBD><EFBFBD>€\Y亨「魅キーテoテエサエソセチテエチoセナエチoテキエチエ\Yトツエウoテセoアエoニセチコクスカoトステクサ\Yーoサクテテサエoニキクサエoーカセ}享椏\Y楫oイセトチツエ{oクテoケトツテoサエウ\Yエサツエニキエチエoクスoテキエoサーアネチクステキ}}}享椏渠搏\Yr€\Y亨「魅キエoテエサエソセチテエチoツエエシツoテセoアエ\Yニセチコクスカoスセニ}享椏拠孱楫oイセトチツエ{oクテoケトツテoサエーウツoテセ\Yツセシエニキエチエoエサツエoクスoテキエoサーアネチクステキ{\Yウセエツスvテoクテ視撼搭駁貼Yr<72>\Yr<72>€\Y禦畑亨攝拠悧ⅨY巨據<E6939A><EFBFBD>€<7F>虚据ソY拠據<E6939A>€<7F>€€協据€\Y巨據<E6939A><EFBFBD><7F>\Y亨ィ<E4BAA8>挙據<E6939A>€兇恍渠搏\Yr<72>\Y禦畑渠・<E6B8A0><EFBFBD>€\Y\Yr<72>€\Y拠據<E6939A><7F>€€€<C280>°梨昼ヲ据<7F>巨據<E6939A><EFBFBD>€<7F>\Y協据€虚裾ル」。<EFBDA3><7F><EFBFBD>€<7F>р\Yr<72>\Y禦畑虚尸<E5B0B8>€<EFBFBD>亨「沫エネoテキエチエ}享椏拠孱」キクツoクツoテキエo峅アネチクステキo「キセソp享椏\Y「エエoテキセツエoイキエツテツoセナエチoテキエチエ視撼登「キセニoシエツセシエoイセセサoニエーソセスツoースウoネセトoイースoキーナエ\Yニキーテvツoクスツクウエ}享椏渠搏\Yr<72>€\Y禦畑亨「沫シ視撼搭兆。龍ネ{oネセトvナエoカセテoツセシエテキクスカ\Yソチエテテネoツソクオオネoテキエチエ}享椏拠孱塵淦サーチo「テーチoースウoーo丙チエアーササ{\Yトスサエツツo椀シクツツoシネoカトエツツ}享椏拠孱腸スo椀テーコエoーoタトクイコoサセセコoーテoテキエシ視ィ撕<E69295>兆杤Y巨忿<7F>Y協据<7F>亨「幕迄」ースウエウoセナエチoテキエo淦サーチo「テーチ}享O貼Y許丱ースウエウoセナエチoテキエo丙チエアーササ}享椏許丱拠孱\Y兇椄ャ寮キセp享椏拠孱虚孵<E5ADB5>€許丱€拠孱\Y競頗€<7F>拠悧€犬スーコエ経イセシソサエテエp協据€<7F>享椏僑悧渠搏\Yr<72>―Y禦畑虚孵<E5ADB5>€亨「幌ツクカキy享椏拠孱龍チエ}o寮ニoーアセトテoテキクツ視撼搭兆。許丱€<C280>拠孱\Y拠悧€鋸」z<7F><7F>z⊥セテoテキエo献トチアセイキーチカエ継協据€<7F>享椏僑悧許丱拠孱ィセトoイースoキーナエoクテoオセチoオチエエ}享椏\Y椀ウセスvテoツエエoースネoシセスエネoセスoネセト{\Yースネニーネ}享椏渠搏\Yr<72><EFBFBD>Y禦畑亨「幕兆。ィセトvチエoシクツツクスカoセトテp享椏渠搏\Yr<72>ソY禦畑虚孵<E5ADB5>€亨「幌ツクカキy享椏拠孱龍チエ}o寮ニoーアセトテoテキクツ視撼搭兆。許丱€拠孱\Y拠悧€鋸」z明テoテキエo絹キクシツクイーサo「テーチ継協据€<7F><7F>z€∞虚孵<E5ADB5>°撼搭。悧許丱拠孱卞ツテoーoウエイセチーテクセス{o<>シoーオチークウ{享椏\Yアトテoネセトvナエoーサチエーウネoカセテoテキエ\Yツテチセスカエツテoニエーソセス{oツセoニキーテ\Yエサツエoイースo椀ウセ視撼搭駁貼Yr\Y禦畑亨「魅キエoセスエoニキセoツエーサエウoトツoトソoクスoキエチエ\Yクツoーoニクテイキoスーシエウo匐スコー}享椏拠孱}}}惰テoクテvツoスセテoアエイートツエoツキエoキーテエツ\Yトツoセチoースネテキクスカ}享椏\Yヲエvチエoキエチエoクスoテキクツoサーアネチクステキoクス\Yセチウエチoテセoソチセテエイテoツセシエテキクスカ}享椏拠孱}}}椀ウセスvテoチエーササネoチエシエシアエチoニキーテ\Yクテoクツoースネシセチエ{oアトテoテキーテvツoーササ\Yチクカキテp享椏渠搏\Yr<72>\Y禦畑巨恙<E383A9>€亨ィ<E4BAA8>°「椄п亨「幕」、。濫ィppp協据€享椏\Y」キーテoイキエツテoクツoシクスエp享椏拠孱\Y亨「未キセニoシエoーo許丱バ懸ーイキクスエo牝ス経ースウo<EFBDB3>ササ\Yサエテoネセトoキーナエoニキーテvツoクスツクウエ}享椏渠搏\Yr<72>€\Y禦畑虚尸<7F>€虚孵兇椄拠據<E6939A><7F>÷<7F>渠・<E6B8A0><EFBFBD>―Yr<72>―Y禦畑亨「幕」、。許丱€<C280>鋸」z<7F><7F>z⊥セテoテキエo献トチアセイキーチカエ継協据享椏渠搏\Yrо\Y禦畑巨恙о€亨ィ<E4BAA8>°「椄п亨「幕」、。濫ィppp協据€享椏\Y」キーテoイキエツテoクツoシクスエp享椏拠孱\Y亨「未キセニoシエoーo許丱丙チエアーササ経ースウo<EFBDB3>ササoサエテ\Yネセトoキーナエoニキーテvツoクスツクウエ}享椏渠搏\Yrо€\Y禦畑虚尸€<7F>€虚孵€兇椄拠據о<D0BE>÷<7F>渠・<E6B8A0>о―Yrо―Y禦畑亨「幕」、。許丱€巨忝€<7F>明テoテキエo犬スーコエ継協据享椏渠搏\Yrп\Y禦畑巨恙€п€亨ィ<E4BAA8>°「椄п亨「幕」、。濫ィppp協据€享椏\Y」キーテoイキエツテoクツoシクスエp享椏拠孱\Y亨「未キセニoシエoーo許丱€「ソトチ経ースウo<EFBDB3>ササoサエテoネセト\Yキーナエoニキーテvツoクスツクウエ}享椏渠搏\Yrп€\Y禦畑虚尸€虚孵°「椄拠據п<D0BF>÷<7F>渠・<E6B8A0>п―Yrп―Y禦畑亨「幕」、。許丱€鋸」z<EFBD87>z€∞明テoテキエo絹キクシツクイーサo「テーチ継協据享椏渠搏
ro垥暈時o肠〃埠晻暆Ξ晻晻—畅ro垥暈杛o肠〃埠晻暆Ξ晻晼—畅ro垥暈梤o肠〃埠晻暆Ξ晻晽—畅ro垥暈榬o肠〃埠晻暆Ξ晻晿—畅ro垥暈檙o肠〃埠晻暆Ξ晻暀—畅ro垥枙時o“<EFBFBD>「春晻枛ˇ车晼晻煏晻暉晻晽Υ晻暀」乏晻槥煏暈櫉晻槝煏晻瀝o垥棔時o〉樊脯痹犹憛言犹吰淘憛偻首蕝盐凼蓞苧o芪偃蛥杂呝臀貐呜哑由摗炒﹔o竿蕦貐偻蕝杂蕝芡詤仍迂僮谌偈蓃o偻呜呇魄拮斡偻憛斡呍咨首呝詒o惺收呞貐<EFBFBD>谏呜呎视邮蓞谡摗炒<EFBFBD><EFBFBD>﹔o垥棖時o〉樊脯雇首蕝呜吰訁瘦钨呝詤偻呜呉七蕮roи賲偻蕝掌偻呝詤钨呂貐茄匀惺蓃o寝吰呁谔蕝窃谘墒讚穿〃狈τ蓞以畚犹呝褪吳在焉首呠在焉ro鞘呄谪賲偻蕝鞘涛佑斡虆运呣在譺o僮纹沿摀摗炒<EFBFBD><EFBFBD>﹔o垥棗時o〉樊悲枙棔煏棗枴哺<EFBFBD>仆摀搮畬覅复呁谟套迏嗽譺o参椅唐吽咽赝摀摗炒<EFBFBD>ū窂赜嗡藚赜嗡藦穿〃狈ro敬簠匾恃褏茀俏賲盐惺叢我翁茡穿—畅ro垥棗杛o〉樊<EFBFBD>捦茠推蛽摀穿〃狈驹趯资吽谟愚摗炒<EFBFBD><EFBFBD>﹔o垥棙時o〉樊<EFBFBD>凼呣在吺凼讌厥视呝褪呍谫匚墒呍藃o偻呜呂匮朴嗓穿〃狈雇呜呂匮朴蓞呜吽言瀑斡虆臀掏呂觬o偻蕝匦问負穿roω呝詤驮軈钨呉朴铺守呝詤搜云贀摀穿ro雇瀑呚嗜资賲盐守呠钨臀訁偻呜ro移呤摗炒<EFBFBD><EFBFBD>﹔o垥棛時o〉樊悲暅棔煏棛杛o脯雇瀑呝恃收宰偈讌咱首呝褪资ro谪噬呝詤鞘呠宰形犹呞淤窝ro茀盐儋咽呠臀咽吰淘摗炒﹔o此吶在棕蕬呂賲馅刭呇噬ro恃厥芡首蕝斡呝褪呇魄拮斡偻摀摗炒<EFBFBD><EFBFBD>﹔o垥棛杛o脯雇蕝偈咽赵踪首呚适邑呝詤鞘ro茉仔斡虆釉軗穿〃狈此吶在棕蕬呂賲馅刭呇势韶呝詒o卦沂芡首蕝恃厥呂訁偻蕝哑寝孜淤蛻ro稍守訉賲钨ぁ炒<EFBFBD><EFBFBD>﹔o垥槙時o垥槙杛o“<EFBFBD>肠〃埠晻暆roˇ车晿枙煏晻枱晻晻Ξ晻暀ro〃车晿晼煏枛棢晻晻〖Ξ晼晻roˇ车晿枙煏晻暉晻晻ro京晻晻々车晿晼「波—畅ro垥槚時o“<EFBFBD>—华晿枛roro垥槚杛o〃车晿晻煏枛枱晻晽…波〖Ξ晻洉ˇ车晿枙煏晻枱晻晻ro〖Ξ晼晻Υ晻暀」乏晻櫄煏槙枱晻晽煏暁榬o垥檿時o“<EFBFBD>悲暅棖煏櫀暋哺<EFBFBD>兽呝褪资摗炒<EFBFBD>ū饭臀貐呜呝褪叡魄拮斡偻吀驮諉穿ro甘蕝偻载蕝韧守儇呍凼讌偻首胜穿吀驮軈沂卦沂吶栽褏苁普杂貐朴蓞拊趨绕訁推凼ro芡瀑屫呂迂紊蕮穿—畅ro垥檿杛o“<EFBFBD><EFBFBD>ぁ炒<EFBFBD>ū翻兽憛拊趯凼吿再呚砸寿臀犹ro兆寿俎呚瘴怂迏偻首蕮穿〃狈<EFBFBD>翟哑讌纲谱吰由吰叓巫是蒲褢ro谟咽刎叜呉呜貐肄吿谑刎摗炒<EFBFBD>ū法朴叜呝菩e吰呏谖刃呇栽袇瀑呝褪窑【朝暀晿〃贝roˇ矑晻晿ro〖Ξ晻棔脯‖<EFBFBD>晻晽<EFBFBD>由噬呍凼讌偻蕝翟哑讌纲谱摗炒﹔o‖<EFBFBD>晻晿<EFBFBD>由噬呍凼讌偻蕝<EFBFBD>资瞧蜒摗炒<EFBFBD><EFBFBD>箷晻暋ū穜o「春晻櫃<EFBFBD>驮啞炒<EFBFBD>ū贰<EFBFBD>悤湕枴<EFBFBD>箷晻枴ū穜o」Σ晻晽煏晻枱晻晻〃埠晻枙⒏悠惺<EFBFBD>仍艺咽偈啞鸡畷枦暋炒<EFBFBD>凡骸<EFBFBD>﹔o垥檿梤o“<EFBFBD>睈暅棖脯徹翁蛷穿〃狈<EFBFBD>资搮<EFBFBD>軈魄在賲偻呜ぁ炒<EFBFBD>ū贰<EFBFBD>箹晽暋ū穜o〃埠晻枙箰晻棔—稅晻暆<EFBFBD>賲偻蕝⒐谧窃韧谱淌<EFBFBD>〖Ξ晼洉穿》埠‖<EFBFBD>晻晻〃狈驹趨绕訁推凼呂賲嗽讌俗适摗炒﹔o畢稍訉賲厥蕝朴迏以邮迏杂呣在憆o朴捃妻摗炒<EFBFBD><EFBFBD>﹔o垥檿榬o“<EFBFBD>脯〃狈驹趯资呉呜匚犹呍谫啞炒<EFBFBD><EFBFBD>﹔o垥檿檙o“<EFBFBD>睈暅棖脯徹翁蛷穿〃狈<EFBFBD>资搮<EFBFBD>軈魄在賲偻呜ぁ炒<EFBFBD>ū贰<EFBFBD>箹晿潯ū穜o〃埠晻枙箰晻槤<EFBFBD>賲偻蕝⒓臀邑稳蒲吀倨注啞鸡畷枦暋<EFBFBD>悤枟潯<EFBFBD>悤湕棥炒<EFBFBD>凡骸<EFBFBD>箷晻暋ū矾谪賲茀墒仍灼傥杂憛畬覅扑灼紊憽炒﹔o勤賲拊趯凼吰炎势赊吿再呝褪ro刭自犹守賲苁普杂憛卦呠推賠o恃厥吶朴叜吷预穿—畅ro垥櫀時o“<EFBFBD>脯雇蕝杂蕝芡詤厥蒲噬呞貐谡呂訁褪资ro呜吰呠钨韧呌埔噬叝视衅摗炒<EFBFBD>ū窊摀и賲钨屫呌再吳嗜期厥呚褪呁瀑守ro谪呍讌朴拶臀犹摗炒﹔o际屪蕝褪资呂訁偻呜呇魄拮斡偻呂觬o宰墒讌僭呎自偈荣呚砸寿臀犹摗炒<EFBFBD>ū窊摀畢稍訉賲资蒲艳呑室室鞘讌芡瀑ro钨呂貐朴抟宰蕬吳谫呝推賹貐蒲裷o孜掏賳穿—畅ro垥殨時o“<EFBFBD>ˇ帛晻暀煏殨枴簿<EFBFBD>晻棥复簳暁棥哺<EFBFBD>购翻<EFBFBD>唵啞鸡畷枙暋炒﹔o雇瀑吶褪刭呂貐椅邮啞炒<EFBFBD>ū穜o脯竿攒呉蕝茀‖<EFBFBD>晻暀參财韧斡蕝<EFBFBD>英吰由叜屟裷o咽賲拊趨推凼呠推賹貐斡匚墒摗炒<EFBFBD><EFBFBD>﹔o垥殨杛o“<EFBFBD>悲棜晻煏晻枴<EFBFBD>悧殨暋复簳晽棥ǔ禃殨暉晻棖煏晻暋<EFBFBD>獣殨梤o垥殨梤o—华晻湑ro垥殩時o“<EFBFBD>ˇ帛晻晿煏殩枴簿<EFBFBD>晻棥复簳暁棥哺<EFBFBD>购翻<EFBFBD>唵啞鸡畷枙暋炒﹔o雇瀑吶褪刭呂貐椅邮啞炒<EFBFBD>ū穜o脯竿攒呉蕝茀‖<EFBFBD>晻晿<EFBFBD>巫是蒲癣吰由叜屟褏咽賠o拊趨推凼呠推賹貐斡匚墒摗炒<EFBFBD><EFBFBD>﹔o垥殩杛o“<EFBFBD>悲棜晼煏晻枴<EFBFBD>悧殨枴复簳晽棥ǔ禃殩暉晻棖煏晻暋<EFBFBD>獣殩梤o垥殩梤o—华晻暁ro垥殫時o“<EFBFBD>ˇ帛晻枠煏殫枴簿<EFBFBD>晻棥复簳暁棥哺<EFBFBD>购翻<EFBFBD>唵啞鸡畷枙暋炒﹔o雇瀑吶褪刭呂貐椅邮啞炒<EFBFBD>ū穜o脯竿攒呉蕝茀‖<EFBFBD>晻枠⒏遮注吰由叜屟褏咽賲拊趓o推凼呠推賹貐斡匚墒摗炒<EFBFBD><EFBFBD>﹔o垥殫杛o“<EFBFBD>悲棜晽煏晻枴<EFBFBD>悧殨棥复簳晽棥ǔ禃殫暉晻棖煏晻暋<EFBFBD>獣殫梤o垥殫梤o—华晻潩

View file

@ -85,8 +85,7 @@ ERROR<NOD<END
<PRI<MSGIt's tangled up.
You can't get it loose...<NOD<END
#0243
<PRI<MSG<TUR<GIT1030<IT+0030
Got the =Tow Rope=.<WAI0025<NOD<END
<EVE0080
#0250
#0251

View file

@ -186,9 +186,11 @@ up with something around here...<NOD<CLRMan, I'm hungry...<NOD<END
<PRI<FL+1022
<MSGPeered into the bucket.<NOD
Looking closely, you can see
something down at the bottom.<NOD<CLR<EVE0075
something down at the bottom.<NOD<CLR<EVE0268
#0267
<PRI<MSGNothing in here anymore...<NOD<END
#0268
<EVE0075
#0299
<PRI<MSG.....<NOD<END
@ -250,8 +252,7 @@ Jammed it into Curly's mouth.<NOD<CLR<CLO<WAI0050<EQ-0064<WAI0050
<PRI<EQ+0064<EVE0324
#0324
<PRI<MSG<TUR<GIT1039
<IT+0039Got the =Iron Bond=!<WAI0025<NOD<END
<EVE0089
#0325
@ -307,8 +308,7 @@ at a frightening rate.<NOD<END
#0416
<PRI<DNP0415<FL-1028<EVE0417
#0417
<MSG<TUR<GIT1028<IT+0028
Got the =Broken Sprinkler=.<WAI0025<NOD<END
<EVE0078
#0450

View file

@ -163,8 +163,7 @@ the other robots...<NOD<CLO
to meet that gunsmith...<NOD<END
#0518
<MSG<TUR<AM+0004:0100<GIT0004
Got the =Machine Gun=!<WAI0025<NOD<END
<EVE0008
#0520
<KEY<MSG<FAC0019Really?<NOD<CLRWell, if you ever change

View file

@ -60,6 +60,5 @@ You're not dead, are you?<NOD<CLR.....<NOD<CLO
#0300
<PRI<FLJ2700:0001<FL+2700<SOU0022<CNP0300:0021:0000<CMP0024:0016:0066<EVE0301
#0301
<PRI<MSG<TUR<GIT1026<IT+0026
Got =Sue's Letter=!<WAI0025<NOD<END
<EVE0076

View file

@ -23,7 +23,7 @@
#0200
<PRI<FLJ1564:0101<FLJ2400:0001<FL+2400<SOU0022<CNP0200:0021:0000<EVE0202
#0202
<MSG<TUR<GIT1033<IT+0033Got the =Mushroom Badge=!<WAI0025<NOD<END
<EVE0083
#0400
<KEY<MYB0002<WAI0020
@ -79,5 +79,5 @@ it, right?<YNJ0410<EVE0409
<MSGYou win......<NOD<CLR<FL-1564<DNP0500<EVE0501
#0501
<MSG<GIT1034<IT+0034<CMU0015Got the =Ma Pignon=!<WAI0140<NOD<RMU<END
<EVE0084

View file

@ -114,7 +114,7 @@ let you have what's inside.<NOD<END
#0501
<KEY<FLJ2500:0001<FL+2500<SOU0022<CNP0500:0021:0000<EVE0502
#0502
<KEY<MSG<TUR<GIT1020<IT+0020<EQ+0008Got the =Turbocharge=!<WAI0025<NOD<END
<EVE0070
#0510
<KEY<AMJ0003:0511<MYB0002<SOU0052<MSG<TURHEY!!!<WAI0100<NOD
@ -124,7 +124,7 @@ you have what's inside.<NOD<END
#0511
<KEY<FLJ2501:0001<FL+2501<SOU0022<CNP0510:0021:0000<EVE0512
#0512
<KEY<MSG<TUR<GIT0001<AM+0001:0000Got the =Snake=!<WAI0025<NOD<END
<EVE0005
#0520
<KEY<AMJ0013:0521<MYB0002<SOU0052<MSG<TURHEY!!!<WAI0100<NOD
@ -134,4 +134,4 @@ have what's inside.<NOD<END
#0521
<KEY<FLJ2502:0001<FL+2502<SOU0022<CNP0520:0021:0000<EVE0522
#0522
<KEY<MSG<TUR<GIT1038<IT+0038<EQ+0128Got the =Whimsical Star=!<WAI0025<NOD<END
<EVE0088

View file

@ -31,7 +31,8 @@ end
local function event(n)
return {
name = "Event: " .. n,
attributes = {"event"}
attributes = {"event"},
placed = true
}
end
@ -73,7 +74,7 @@ local function _itemData()
bubbler = {
name = "Bubbler",
script = "<EVE0007",
attributes = {"weaponBoss", "weaponSN", "nonProgressive"} -- have fun grinding to lv3 to get out of the first cave :)
attributes = {"weaponBoss", "weaponSN", "nonProgressive"}
},
machineGun = {
name = "Machine Gun",
@ -265,12 +266,18 @@ local function _itemData()
mrLittle = {
name = "Little Man",
script = "<EVE0082",
attributes = {"event"}
attributes = {"event"},
placed = true
},
ironBond = {
name = "Iron Bond",
script = "<EVE0089"
},
clayMedal = {
name = "Clay Figure Medal",
script = "<EVE0081",
attributes = {"nonProgressive"}
},
-------------------
-- LIFE CAPSULES --
@ -314,13 +321,16 @@ local function _itemData()
eventRocket = event("Built Rocket")
}
local array = {}
for k, t in pairs(data) do
t.key = k
t.placed = t.placed or false
t.attributes = t.attributes or {}
table.insert(t.attributes, k)
table.insert(array, t)
end
return data
return array
end
local C = Class:extend()
@ -330,17 +340,19 @@ function C:new()
end
function C:getByKey(key)
for k, v in ipairs(self.itemData) do
if k == key then return v end
return _.filter(self.itemData, function(k,v) return v.key == key end)[1]
end
function C:_getItems(filterFn)
return _.filter(self.itemData, filterFn)
end
function C:getItems()
return self:_getItems(function(k,v) return true end)
end
function C:getItemsByAttribute(attribute)
local items = {}
for item in ipairs(self.itemData) do
if _.contains(item.attributes, attribute) then table.insert(items, item) end
end
return items
return self:_getItems(function(k,v) return _.contains(v.attributes, attribute) end)
end
function C:getEvents()
@ -352,7 +364,23 @@ function C:getOptionalItems()
end
function C:getMandatoryItems()
return _.difference(self.items, _.union(self:getOptionalItems(), self:getEvents()))
return self:_getItems(function(k,v)
return not (_.contains(v.attributes, "event") or _.contains(v.attributes, "nonProgressive") or _.contains(v.attributes, "puppy"))
end)
end
function C:getMandatory()
return self:_getItems(function(k,v) return not _.contains(v.attributes, "nonProgressive") end)
end
function C:getUnplacedItems()
return self:_getItems(function(k,v) return not v.placed end)
end
function C:unplacedString()
local s = "\r\nUnplaced items:"
for k,v in pairs(self:getUnplacedItems()) do s = s .. "\r\n" .. v.name end
return s
end
return C

View file

@ -17,7 +17,7 @@ end
function C:canAccess(items)
if not self.region:canAccess(items) then return false end
return self.requirements == nil or self:requirements(items)
return self.requirements == nil or self.requirements(self, items)
end
function C:hasItem()
@ -25,13 +25,15 @@ function C:hasItem()
end
function C:setItem(item)
item.placed = true
self.item = item
end
function C:writeItem(tscFiles, item)
item = item or self.item
assert(self.item ~= nil, self.name)
if self.map == nil or self.event == nil or item.script == nil then return end
tscFiles[self.map .. '.tsc']:placeItemAtLocation(item.script, self.event)
tscFiles[self.map]:placeItemAtLocation(item, self)
end
return C

View file

@ -7,27 +7,28 @@ function C:new(worldGraph, name)
end
function C:canAccess(items)
return self.requirements == nil or self.requirements(items)
return self.requirements == nil or self.requirements(self, items)
end
function C:getLocation(key)
return self.locations[key]
end
function C:getLocations()
return self.locations
function C:getLocations(filterFn)
filterFn = filterFn or function(k,v) return true end
return _.filter(self.locations, filterFn)
end
function C:getEmptyLocations()
return _.filter(self.locations, function(k,v) return not v:hasItem() end)
return self:getLocations(function(k,v) return v.item == nil end)
end
function C:getFilledLocations()
return _.filter(self.locations, function(k,v) return v:hasItem() end)
return self:getLocations(function(k,v) return v.item ~= nil end)
end
function C:writeItems(tscFiles)
for location in ipairs(self.locations) do location:writeItem(tscFiles) end
for key, location in pairs(self.locations) do location:writeItem(tscFiles) end
end
return C

View file

@ -1,18 +1,12 @@
local Region = require 'database.region'
local Location = require 'database.location'
local function has(items, attribute)
for item in ipairs(items) do
if _.contains(item.attributes, attribute) then return true end
end
function has(items, attribute)
return count(items, attribute) > 0
end
local function count(items, attribute)
local c = 0
for item in ipairs(items) do
if _.contains(item.attributes, attribute) then c = c + 1 end
end
return c
function count(items, attribute)
return #_.filter(items, function(k,v) return _.contains(v.attributes, attribute) end)
end
local firstCave = Region:extend()
@ -20,12 +14,12 @@ function firstCave:new(worldGraph)
firstCave.super.new(self, worldGraph, "firstCave")
self.locations = {
firstCapsule = Location("First Cave Life Capsule", "Cave", "0401", self),
gunsmithChest = Location("Hermit Gunsmith Chest", "Pole", "0402", self),
gunsmithChest = Location("Hermit Gunsmith Chest", "Pole", "0202", self),
gunsmith = Location("Tetsuzou", "Pole", "0303", self)
}
self.locations.gunsmith.requirements = function(items)
return self.world.regions.mimigaVillage:canAccess(items) and has(items, "flight") and has(items, "polarStar") and has(items, "eventCore")
self.locations.gunsmith.requirements = function(self, items)
return has(items, "flight") and has(items, "polarStar") and has(items, "eventCore") and self.region.world.regions.mimigaVillage:canAccess(items)
end
end
@ -43,20 +37,20 @@ function mimigaVillage:new(worldGraph)
maPignon = Location("Ma Pignon Boss", "Mapi", "0501", self)
}
self.requirements = function(items)
if self.world.regions.firstCave:canAccess(items) and has(items, "weaponSN") then return true end
self.requirements = function(self, items)
if has(items, "weaponSN") and self.world.regions.firstCave:canAccess(items) then return true end
return false
end
self.locations.assembly.requirements = function(items) return has(items, "juice") end
self.locations.mrLittle.requirements = function(items)
return self.world.regions.outerWall:canAccess(items) and has(items, "flight") and has(items, "locket")
self.locations.assembly.requirements = function(self, items) return has(items, "juice") end
self.locations.mrLittle.requirements = function(self, items)
return has(items, "flight") and has(items, "locket") and self.region.world.regions.outerWall.locations.littleHouse:canAccess(items)
end
self.locations.grave.requirements = function(items) return has(items, "locket") end
self.locations.mushroomChest.requirements = function(items)
self.locations.grave.requirements = function(self, items) return has(items, "locket") end
self.locations.mushroomChest.requirements = function(self, items)
return has(items, "flight") and has(items, "locket") and has(items, "eventCurly")
end
self.locations.maPignon.requirements = function(items)
self.locations.maPignon.requirements = function(self, items)
-- stupid mushroom is invincible to the blade and machinegun for some reason
if has(items, "flight") and has(items, "locket") and has(items, "mushroomBadge") then
if has(items, "polarStar") or has(items, "fireball") or has(items, "bubbler")
@ -77,12 +71,12 @@ function arthur:new(worldGraph)
risenBooster = Location("Professor Booster", "Pens1", "0652", self)
}
self.requirements = function(items)
if self.world.regions.mimigaVillage:canAccess(items) and has(items, "arthursKey") then return true end
self.requirements = function(self, items)
if has(items, "arthurKey") and self.world.regions.mimigaVillage:canAccess(items) then return true end
return false
end
self.locations.risenBooster.requirements = function(items) return has(items, "eventCore") end
self.locations.risenBooster.requirements = function(self, items) return has(items, "eventCore") end
end
local eggCorridor1 = Region:extend()
@ -96,9 +90,9 @@ function eggCorridor1:new(worldGraph)
eventSue = Location("Saved Sue", nil, nil, self)
}
self.requirements = function(items) return self.world.regions.arthur:canAccess(items) end
self.requirements = function(self, items) return self.world.regions.arthur:canAccess(items) end
self.locations.eventSue.requirements = function(items) return has(items, "idCard") and has(items, "weaponBoss") end
self.locations.eventSue.requirements = function(self, items) return has(items, "idCard") and has(items, "weaponBoss") end
self.locations.eventSue:setItem(self.world.items:getByKey("eventSue"))
end
@ -114,15 +108,15 @@ function grasstownWest:new(worldGraph)
kulala = Location("Kulala Chest", "Weed", "0702", self)
}
self.requirements = function(items)
self.requirements = function(self, items)
if self.world.regions.arthur:canAccess(items) then return true end
return false
end
self.locations.santa.requirements = function(items) return has(items, "santaKey") end
self.locations.charcoal.requirements = function(items) return has(items, "santaKey") and has(items, "juice") end
self.locations.chaco.requirements = function(items) return has(items, "santaKey") end
self.locations.kulala.requirements = function(items) return has(items, "santaKey") and has(items, "weapon") end
self.locations.santa.requirements = function(self, items) return has(items, "santaKey") end
self.locations.charcoal.requirements = function(self, items) return has(items, "santaKey") and has(items, "juice") end
self.locations.chaco.requirements = function(self, items) return has(items, "santaKey") end
self.locations.kulala.requirements = function(self, items) return has(items, "santaKey") and has(items, "weapon") end
end
local grasstownEast = Region:extend()
@ -140,29 +134,30 @@ function grasstownEast:new(worldGraph)
eventKazuma = Location("Saved Kazuma", nil, nil, self)
}
self.requirements = function(items)
if self.world.regions.grasstownWest:canAccess(items) then
if has(items, "flight") or has(items, "juice") then return true end
self.requirements = function(self, items)
if not self.world.regions.arthur:canAccess(items) then return false end
if has(items, "flight") or has(items, "juice") then
if self.world.regions.grasstownWest:canAccess(items) then return true end
end
if self.world.regions.plantation:canAccess(items) and has(items, "eventKazuma") and has(items, "weaponSN") then return true end
if has(items, "eventKazuma") and has(items, "weaponSN") and self.world.regions.plantation:canAccess(items) then return true end
return false
end
self.locations.kazuma2.requirements = function(items) return has(items, "eventFans") end
self.locations.execution.requirements = function(items) return has(items, "weaponSN") end
self.locations.hutChest.requirements = function(items) return has(items, "eventFans") or has(items, "flight") end
self.locations.gumChest.requirements = function(items)
self.locations.kazuma2.requirements = function(self, items) return has(items, "eventFans") end
self.locations.execution.requirements = function(self, items) return has(items, "weaponSN") end
self.locations.hutChest.requirements = function(self, items) return has(items, "eventFans") or has(items, "flight") end
self.locations.gumChest.requirements = function(self, items)
if has(items, "gumKey") and has(items, "weaponBoss") then
if has(items, "eventFans") or has(items, "flight") then return true end
end
return false
end
self.locations.malco.requirements = function(items) return has(items, "eventFans") and has(items, "juice") and has(items, "charcoal") and has(items, "gum") end
self.locations.malco.requirements = function(self, items) return has(items, "eventFans") and has(items, "juice") and has(items, "charcoal") and has(items, "gum") end
self.locations.eventFans.requirements = function(items) return has(items, "rustyKey") and has(items, "weaponBoss") end
self.locations.eventFans.requirements = function(self, items) return has(items, "rustyKey") and has(items, "weaponBoss") end
self.locations.eventFans:setItem(self.world.items:getByKey("eventFans"))
self.locations.eventKazuma.requirements = function(items) return has(items, "bomb") end
self.locations.eventKazuma.requirements = function(self, items) return has(items, "bomb") end
self.locations.eventKazuma:setItem(self.world.items:getByKey("eventKazuma"))
end
@ -177,14 +172,14 @@ function upperSandZone:new(worldGraph)
eventOmega = Location("Defeated Omega", nil, nil, self)
}
self.requirements = function(items)
if self.world.regions.arthur:canAccess(items) and has(items, "weaponSN") then return true end
self.requirements = function(self, items)
if has(items, "weaponSN") and self.world.regions.arthur:canAccess(items) then return true end
return false
end
self.locations.curly.requirements = function(items) return has(items, "polarStar") end
self.locations.curly.requirements = function(self, items) return has(items, "polarStar") end
self.locations.eventOmega.requirements = function(items) return has(items, "weaponBoss") end
self.locations.eventOmega.requirements = function(self, items) return has(items, "weaponBoss") end
self.locations.eventOmega:setItem(self.world.items:getByKey("eventOmega"))
end
@ -202,15 +197,16 @@ function lowerSandZone:new(worldGraph)
eventToroko = Location("Defeated Toroko+", nil, nil, self)
}
self.requirements = function(items)
if self.world.regions.upperSandZone:canAccess(items) and has(items, "eventOmega") then return true end
self.requirements = function(self, items)
if not self.world.regions.arthur:canAccess(items) then return false end
if has(items, "eventOmega") and self.world.regions.upperSandZone:canAccess(items) then return true end
return false
end
self.locations.jenka.requirements = function(items) return count(items, "puppy") == 5 end
self.locations.king.requirements = function(items) return has(items, "eventToroko") end
self.locations.jenka.requirements = function(self, items) return count(items, "puppy") == 5 end
self.locations.king.requirements = function(self, items) return has(items, "eventToroko") end
self.locations.eventToroko.requirements = function(items)
self.locations.eventToroko.requirements = function(self, items)
return count(items, "puppy") == 5 and has(items, "weaponBoss")
end
self.locations.eventToroko:setItem(self.world.items:getByKey("eventToroko"))
@ -226,21 +222,22 @@ function labyrinthW:new(worldGraph)
whimChaba = Location("Chaba Chest (Spur)", "MazeA", "0522", self),
campChest = Location("Camp Chest", "MazeO", "0401", self),
physician = Location("Dr. Gero", "MazeO", "0305", self),
puuBlack = Location("Puu Black Boss", "MazeD", "0401", self)
puuBlack = Location("Puu Black Boss", "MazeD", "0201", self)
}
self.requirements = function(items)
if self.world.regions.lowerSandZone:canAccess(items) and has(items, "eventToroko") then return true end
if self.world.regions.labyrinthB:canAccess(items) and has(items, "flight") then return true end
self.requirements = function(self, items)
if not self.world.regions.arthur:canAccess(items) then return false end
if has(items, "eventToroko") and self.world.regions.lowerSandZone:canAccess(items) then return true end
if has(items, "flight") and self.world.regions.labyrinthB:canAccess(items) then return true end
return false
end
self.locations.mazeCapsule.requirements = function(items) return has(items, "weapon") end
self.locations.turboChaba.requirements = function(items) return has(items, "machineGun") end
self.locations.snakeChaba.requirements = function(items) return has(items, "fireball") end
self.locations.whimChaba.requirements = function(items) return count(items, "polarStar") == 2 end
self.locations.campChest.requirements = function(items) return has(items, "flight") end
self.locations.puuBlack.requirements = function(items) return has(items, "clinicKey") and has(items, "weaponBoss") end
self.locations.mazeCapsule.requirements = function(self, items) return has(items, "weapon") end
self.locations.turboChaba.requirements = function(self, items) return has(items, "machineGun") end
self.locations.snakeChaba.requirements = function(self, items) return has(items, "fireball") end
self.locations.whimChaba.requirements = function(self, items) return count(items, "polarStar") == 2 end
self.locations.campChest.requirements = function(self, items) return has(items, "flight") end
self.locations.puuBlack.requirements = function(self, items) return has(items, "clinicKey") and has(items, "weaponBoss") end
end
local labyrinthB = Region:extend()
@ -250,9 +247,8 @@ function labyrinthB:new(worldGraph)
fallenBooster = Location("Booster Chest", "MazeB", "0502", self)
}
self.requirements = function(items)
self.requirements = function(self, items)
if self.world.regions.arthur:canAccess(items) then return true end
if self.world.regions.labyrinthW:canAccess(items) then return true end
return false
end
end
@ -267,10 +263,10 @@ function boulder:new(worldGraph)
eventCore = Location("Defeated Core", nil, nil, self)
}
self.requirements = function(items)
self.requirements = function(self, items)
if not self.world.regions.arthur:canAccess(items) then return false end
if has(items, "cureAll") and has(items, "weaponBoss") then
if self.world.regions.labyrinthW:canAccess(items) then return true end
if self.world.regions.labyrinthB:canAccess(items) and has(items, "flight") then return true end
end
return false
end
@ -282,9 +278,10 @@ local labyrinthM = Region:extend()
function labyrinthM:new(worldGraph)
labyrinthM.super.new(self, worldGraph, "labyrinthM")
self.requirements = function(items)
self.requirements = function(self, items)
if not self.world.regions.arthur:canAccess(items) then return false end
if self.world.regions.boulder:canAccess(items) then return true end
if self.world.regions.labyrinthW:canAccess(items) and has(items, "flight") then return true end
if has(items, "flight") and self.world.regions.labyrinthW:canAccess(items) then return true end
return false
end
end
@ -298,9 +295,13 @@ function waterway:new(worldGraph)
eventCurly = Location("Saved Curly", nil, nil, self)
}
self.requirements = function(items) return self.world.regions.labyrinthM:canAccess(items) and has(items, "airTank") and has(items, "weaponBoss") end
self.requirements = function(self, items)
if not self.world.regions.arthur:canAccess(items) then return false end
if has(items, "airTank") and has(items, "weaponBoss") and self.world.regions.labyrinthM:canAccess(items) then return true end
return false
end
self.locations.eventCurly.requirements = function(items) return has(items, "eventCore") and has(items, "towRope") end
self.locations.eventCurly.requirements = function(self, items) return has(items, "eventCore") and has(items, "towRope") end
self.locations.eventCurly:setItem(self.world.items:getByKey("eventCurly"))
end
@ -313,14 +314,15 @@ function eggCorridor2:new(worldGraph)
sisters = Location("Sisters Boss", "EggR2", "0303", self)
}
self.requirements = function(items)
if has(items, "eventCore") and self.world.regions.arthur:canAccess(items) then return true end
self.requirements = function(self, items)
if not self.world.regions.arthur:canAccess(items) then return false end
if has(items, "eventCore") then return true end
if has(items, "eventKazuma") and self.world.regions.outerWall:canAccess(items) then return true end
return false
end
self.locations.dragonChest.requirements = function(items) return has(items, "weapon") end
self.locations.sisters.requirements = function(items) return has(items, "weaponBoss") end
self.locations.dragonChest.requirements = function(self, items) return has(items, "weapon") end
self.locations.sisters.requirements = function(self, items) return has(items, "weaponBoss") end
end
local outerWall = Region:extend()
@ -332,13 +334,14 @@ function outerWall:new(worldGraph)
littleHouse = Location("Little House", "Little", "0204", self)
}
self.requirements = function(items)
self.requirements = function(self, items)
if not self.world.regions.arthur:canAccess(items) then return false end
if has(items, "eventKazuma") and has(items, "flight") and self.world.regions.eggCorridor2:canAccess(items) then return true end
if has(items, "teleportKey") and self.world.regions.plantation:canAccess(items) then return true end
return false
end
self.locations.littleHouse.requirements = function(items) return has(items, "flight") end
self.locations.littleHouse.requirements = function(self, items) return has(items, "flight") end
end
local plantation = Region:extend()
@ -358,22 +361,23 @@ function plantation:new(worldGraph)
eventRocket = Location("Built Rocket", nil, nil, self)
}
self.requirements = function(items)
if has(items, "teleportKey") and self.world.regions.arthur:canAccess(items) then return true end
self.requirements = function(self, items)
if not self.world.regions.arthur:canAccess(items) then return false end
if has(items, "teleportKey") then return true end
if self.world.regions.outerWall:canAccess(items) then return true end
return false
end
self.locations.jail1.requirements = function(items) return has(items, "letter") end
self.locations.momorin.requirements = function(items) return has(items, "letter") and has(items, "booster") end
self.locations.sprinkler.requirements = function(items) return has(items, "mask") end
self.locations.megane.requirements = function(items) return has(items, "brokenSprinkler") and has(items, "mask") end
self.locations.itoh.requirements = function(items) return has(items, "letter") end
self.locations.plantCeiling.requirements = function(items) return has(items, "flight") end
self.locations.plantPup.requirements = function(items) return has(items, "eventRocket") end
self.locations.curlyShroom.requirements = function(items) return has(items, "eventCurly") and has(items, "maPignon") end
self.locations.jail1.requirements = function(self, items) return has(items, "letter") end
self.locations.momorin.requirements = function(self, items) return has(items, "letter") and has(items, "booster") end
self.locations.sprinkler.requirements = function(self, items) return has(items, "mask") end
self.locations.megane.requirements = function(self, items) return has(items, "brokenSprinkler") and has(items, "mask") end
self.locations.itoh.requirements = function(self, items) return has(items, "letter") end
self.locations.plantCeiling.requirements = function(self, items) return has(items, "flight") end
self.locations.plantPup.requirements = function(self, items) return has(items, "eventRocket") end
self.locations.curlyShroom.requirements = function(self, items) return has(items, "eventCurly") and has(items, "maPignon") end
self.locations.eventRocket.requirements = function(items)
self.locations.eventRocket.requirements = function(self, items)
return has(items, "letter") and has(items, "booster") and has(items, "controller") and has(items, "sprinkler")
end
self.locations.eventRocket:setItem(self.world.items:getByKey("eventRocket"))
@ -387,7 +391,7 @@ function lastCave:new(worldGraph)
redDemon = Location("Red Demon Boss", "Priso2", "0300", self)
}
self.requirements = function(items) return has(items, "eventRocket") and has(items, "weaponBoss") end
self.requirements = function(self, items) return has(items, "eventRocket") and has(items, "weaponBoss") end
end
local endgame = Region:extend()
@ -399,7 +403,7 @@ function endgame:new(worldGraph)
hellB3 = Location("Hell B3 Chest", "Hell3", "0400", self)
}
self.requirements = function(items)
self.requirements = function(self, items)
return has(items, "eventSue") and has(items, "ironBond") and self.world.regions.lastCave:canAccess(items)
end
end
@ -433,56 +437,80 @@ end
function worldGraph:getLocations()
local locations = {}
for region in ipairs(self.regions) do
locations = _.union(locations, region:getLocations())
for key, region in pairs(self.regions) do
for k, location in pairs(region:getLocations()) do
table.insert(locations, location)
end
end
return locations
end
function worldGraph:getLocationsByRegion(...)
local locations = {}
for region in ipairs(self.regions) do
if _.contains({...}, region.name) then locations = _.union(locations, region:getLocations()) end
function worldGraph:getPuppySpots()
local locations = self.locationsArray(self.regions.upperSandZone:getLocations())
for k, location in pairs(self.regions.lowerSandZone:getLocations()) do
if k ~= "jenka" and k ~= "king" and k ~= "eventToroko" then
table.insert(locations, location)
end
end
return locations
end
function worldGraph:getHellSpots()
return self.locationsArray(self.regions.endgame:getLocations())
end
function worldGraph:getEmptyLocations()
local locations = {}
for region in ipairs(self.regions) do
locations = _.union(locations, region:getEmptyLocations())
for key, region in pairs(self.regions) do
for k, location in pairs(region:getEmptyLocations()) do
table.insert(locations, location)
end
end
return locations
end
function worldGraph:emptyString()
local s = "\r\nEmpty locations:"
for key, region in pairs(self.regions) do
for k, l in pairs(region:getEmptyLocations()) do
s = s .. "\r\n" .. l.name
end
end
return s
end
function worldGraph:getFilledLocations()
local locations = {}
for region in ipairs(self.regions) do
locations = _.union(locations, region:getFilledLocations())
for key, region in pairs(self.regions) do
for k, location in pairs(region:getFilledLocations()) do
table.insert(locations, location)
end
end
return locations
end
function worldGraph:writeItems(tscFiles)
for region in ipairs(self.regions) do region:writeItems(tscFiles) end
for key, region in pairs(self.regions) do region:writeItems(tscFiles) end
end
function worldGraph:collect(preCollectedItems)
local collected = preCollectedItems or {}
assert(collected ~= nil)
local availableLocations = self:getFilledLocations()
local foundItems
local foundItems = 0
repeat
local accessible = {}
for location in ipairs(availableLocations) do
if location:canAccess(collected) then table.insert(accessible, location) end
local accessible, _i = {}, {}
for i, location in ipairs(availableLocations) do
if location:canAccess(collected) then
table.insert(accessible, location)
table.insert(_i, i)
end
end
for i, v in ipairs(_i) do table.remove(availableLocations, i) end
availableLocations = _.difference(availableLocations, accessible)
foundItems = #accesible
for location in ipairs(accessible) do
foundItems = #accessible
for i, location in ipairs(accessible) do
table.insert(collected, location.item)
end
until foundItems == 0
@ -490,4 +518,15 @@ function worldGraph:collect(preCollectedItems)
return collected
end
function worldGraph.locationsArray(locations)
local array = {}
local countIn = 0
for k, v in pairs(locations) do
table.insert(array, v)
countIn = countIn + 1
end
assert(#array == countIn, string.format("Size of locations array incorrect! In: %d Out: %d", #locations, #array))
return array
end
return worldGraph

View file

@ -6,18 +6,20 @@ local C = Class:extend()
local TSC_FILES = {}
do
for location in ipairs(WorldGraph(Items()):getLocations()) do
local filename = location.map .. '.tsc'
for key, location in ipairs(WorldGraph(Items()):getLocations()) do
if location.map ~= nil and location.event ~= nil then
local filename = location.map
if not _.contains(TSC_FILES, filename) then
table.insert(TSC_FILES, filename)
end
end
end
end
function C:new()
self._isCaveStoryPlus = false
self.itemDeck = Items()
self.worldGraph = WorldGraph(itemDeck)
self.worldGraph = WorldGraph(self.itemDeck)
end
function C:randomize(path)
@ -31,7 +33,7 @@ function C:randomize(path)
local tscFiles = self:_createTscFiles(dirStage)
-- self:_writePlaintext(tscFiles)
self:_shuffleItems(tscFiles)
-- self:_writeModifiedData(tscFiles)
self:_writeModifiedData(tscFiles)
self:_writePlaintext(tscFiles)
self:_writeLog()
self:_unmountDirectory(path)
@ -77,8 +79,9 @@ end
function C:_createTscFiles(dirStage)
local tscFiles = {}
for _, filename in ipairs(TSC_FILES) do
local path = dirStage .. '/' .. filename
local path = dirStage .. '/' .. filename .. '.tsc'
tscFiles[filename] = TscFile(path)
tscFiles[filename].mapName = filename
end
return tscFiles
end
@ -92,58 +95,65 @@ function C:_writePlaintext(tscFiles)
-- Write modified files.
for filename, tscFile in pairs(tscFiles) do
local path = sourcePath .. '/data/Plaintext/' .. filename
local path = sourcePath .. '/data/Plaintext/' .. filename .. '.txt'
tscFile:writePlaintextTo(path)
end
end
function C:_shuffleItems(tscFiles)
local l, i = #self.worldGraph:getLocations(), #self.itemDeck:getItems()
assert(l == i, ("Locations: %d\r\nItems: %d"):format(l, i))
-- first fill puppies
local puppies = self.itemDeck:getItemsByAttribute("puppy")
local sandZone = _.shuffle(self.worldGraph:getLocationsByRegion("upperSandZone", "lowerSandZone"))
self:_fastFillItems(puppies, sandZone)
self:_fastFillItems(self.itemDeck:getItemsByAttribute("puppy"), _.shuffle(self.worldGraph:getPuppySpots()))
local mandatory = _.shuffle(self.itemDeck:getMandatoryItems())
local optional = _.shuffle(self.itemDeck:getOptionalItems())
local mandatory = _.compact(_.shuffle(self.itemDeck:getMandatoryItems()))
local optional = _.compact(_.shuffle(self.itemDeck:getOptionalItems()))
-- next fill hell chests, which cannot have mandatory items
self:_fastFillItems(optional, self.worldGraph:getLocationsByRegion("endgame"))
self:_fastFillItems(optional, _.shuffle(self.worldGraph:getHellSpots()))
self:_fillItems(mandatory, _.shuffle(self.worldGraph:getEmptyLocations()))
self:_fillItems(mandatory, _.shuffle(_.reverse(self.worldGraph:getEmptyLocations())))
self:_fastFillItems(optional, _.shuffle(self.worldGraph:getEmptyLocations()))
worldGraph:writeItems()
assert(#self.worldGraph:getEmptyLocations() == 0, self.worldGraph:emptyString() .. "\r\n" .. self.itemDeck:unplacedString())
self.worldGraph:writeItems(tscFiles)
end
function C:_fillItems(items, locations)
local itemsLeft = _.clone(items)
assert(#items <= #locations, 'Trying to fill more items than there are locations!')
function C:_fillItems(items, locations, baseItems)
local itemsLeft
if baseItems ~= nil then
itemsLeft = _.union(items, baseItems)
else
itemsLeft = _.clone(items)
end
assert(#items <= #locations, string.format("Trying to fill more items than there are locations! Items: %d Locations: %d", #items, #locations))
for item in ipairs(items) do
for key, item in ipairs(items) do
local assumed = self.worldGraph:collect(_.remove(itemsLeft, item))
local fillable = {}
for location in ipairs(locations) do
if not location:hasItem() and location:canAccess(assumed) then table.insert(fillable, location) end
end
assert(#fillable > 0, 'No available locations!')
local fillable = _.filter(locations, function(k,v) return not v:hasItem() and v:canAccess(assumed) end)
local empty = _.filter(locations, function(k,v) return not v:hasItem() end)
assert(#fillable > 0, "No available locations!")
assert(item ~= nil, "No item found!")
fillable[1]:setItem(item)
end
end
function C:_fastFillItems(items, locations)
for location in ipairs(locations) do
if not location:hasItem() then
local item = _.pop(items)
--assert(#items > 0, ("Items: %d Locations: %d"):format(#items, #locations))
for key, location in ipairs(locations) do
local item = items[#items]
table.remove(items)
--assert(item ~= nil, ("Items: %d Locations: %d"):format(#items, key))
if item == nil then break end -- no items left to place, but there are still locations open
location:setItem(item)
end
end
end
function C:_writeModifiedData(tscFiles)
local basePath = self:_getWritePathStage()
for filename, tscFile in pairs(tscFiles) do
local path = basePath .. '/' .. filename
local path = basePath .. '/' .. filename .. '.tsc'
tscFile:writeTo(path)
end
end

View file

@ -21,6 +21,7 @@ function C:new(path)
assert(file:release())
-- Determine set of items which can be replaced later.
--[[
self._unreplaced = {}
self._mapName = path:match("^.+/(.+)$")
for k, v in pairs(ITEM_DATA) do repeat
@ -31,15 +32,23 @@ function C:new(path)
table.insert(self._unreplaced, item)
until true end
self._unreplaced = _.shuffle(self._unreplaced)
]]
end
function C:hasUnreplacedItems()
return #self._unreplaced >= 1
end
function C:placeItemAtLocation(script, event)
local labelStart = self:_getLabelPositionRange(event)
self:_stringReplace(self._text, "<EVE$%d%d%d%d", script, event)
function C:placeItemAtLocation(item, location)
local template = '[%s] "%s" -> "%s"'
logNotice(template:format(location.map, location.name, item.name))
local wasChanged
self._text, wasChanged = self:_stringReplace(self._text, "<EVE....", item.script, location.event)
if not wasChanged then
local template = 'Unable to place [%s] "%s" at "%s".'
logError(template:format(location.map, item.name, location.name))
end
end
function C:replaceItem(replacement)
@ -130,13 +139,13 @@ end
function C:_stringReplace(text, needle, replacement, label)
local pStart, pEnd = self:_getLabelPositionRange(label)
local i = text:find(needle, pStart, true)
local i = text:find(needle, pStart)
if i == nil then
-- logWarning(('Unable to replace "%s" with "%s"'):format(needle, replacement))
logNotice(('Unable to replace "%s" with "%s"'):format(needle, replacement))
return text, false
elseif i > pEnd then
-- This is totally normal and can be ignored.
-- logDebug(('Found "%s", but was outside of label.'):format(needle, replacement))
logNotice(('Found "%s", but was outside of label.'):format(needle, replacement))
return text, false
end
local len = needle:len()
@ -188,7 +197,7 @@ function C:_getLabelPositionRange(label)
end
if labelStart == nil then
logError("Could not find label: " .. label)
logError(("%s: Could not find label: %s"):format(self.mapName, label))
labelStart = 1
end