mirror of
https://github.com/cave-story-randomizer/cave-story-randomizer
synced 2025-12-01 08:37:21 +00:00
slowly moving towards functionality. replaces items but doesn't logic
This commit is contained in:
parent
86e0ae0eea
commit
1542c25322
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -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†4yyw‚z}-|‚<>-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>-P‚y†-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-P‚y†;P‚y†-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„s‚y-€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-P‚y†;P‚y†-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-u‚zn{€-„u|4r<17>ur-rny-onq-t‚†€.I[\Qaur-Zvzvtn€-„rr-w‚€<E2809A>‚€rq-o†-<2D>urz;I[\QIR[Q
|
||||||
|
|
@ -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>4拳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>跛坐巢2䁥_皎洶釦身囝身陵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
|
||||||
|
|
@ -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„s‚y;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>-z‚puLIf[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_[
|
||||||
|
|
@ -1 +1 @@
|
||||||
\Yr<7F>\Y亨攝拠悧㈲武<E388B2>渠搏\Yr<7F>\Y亨攝拠悧㈲武<E388B2>渠搏\Yr<7F>\Y亨攝拠悧㈲武<E388B2>°駁貼Yr<7F>\Y亨攝拠悧㈲武<E388B2>k駁貼Yr<7F>\Y亨攝拠悧㈲武<E388B2>ル駁貼Yr\Y禦畑兇椄巨據<7F><7F>°武<C2B0>ル」。<EFBDA3>h<7F><7F><7F>b<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>k兆杤Y巨忿<7F>Y協据<7F>亨「幕迄」@ースウエウoセナエチoテキエo淦サーチo「テーチ}享O貼Y許丱wースウエウ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テキクツ視撼搭兆。許丱g拠孱\Y拠悧鋸」zg明テ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禦畑巨恙iо亨ィ<E4BAA8>°「椄п亨「幕」、。濫ィppp協据享椏\Y」キーテoイキエツテoクツoシクスエp享椏拠孱\Y亨「未キセニoシエoーo許丱l丙チエアーササ経ースウo<EFBDB3>ササoサエテ\Yネセトoキーナエoニキーテvツoクスツクウエ}享椏渠搏\Yrо\Y禦畑虚尸><7F>虚孵>兇椄=拠據о<D0BE>÷<7F>渠・<E6B8A0>о―Yrо―Y禦畑亨「幕」、。許丱巨忝<7F>明テoテキエo犬スーコエ継協据>享椏渠搏\Yrп\Y禦畑巨恙iп亨ィ<E4BAA8>°「椄п亨「幕」、。濫ィppp協据享椏\Y」キーテoイキエツテoクツoシクスエp享椏拠孱\Y亨「未キセニoシエoーo許丱l「ソトチ経ースウo<EFBDB3>ササoサエテoネセト\Yキーナエoニキーテvツoクスツクウエ}享椏渠搏\Yrп\Y禦畑虚尸>♂虚孵>°「椄=拠據п<D0BF>÷<7F>渠・<E6B8A0>п―Yrп―Y禦畑亨「幕」、。許丱g鋸」zg渠<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—华晻潩
|
||||||
|
|
@ -85,8 +85,7 @@ ERROR<NOD<END
|
||||||
<PRI<MSGIt's tangled up.
|
<PRI<MSGIt's tangled up.
|
||||||
You can't get it loose...<NOD<END
|
You can't get it loose...<NOD<END
|
||||||
#0243
|
#0243
|
||||||
<PRI<MSG<TUR<GIT1030<IT+0030
|
<EVE0080
|
||||||
Got the =Tow Rope=.<WAI0025<NOD<END
|
|
||||||
|
|
||||||
#0250
|
#0250
|
||||||
#0251
|
#0251
|
||||||
|
|
|
||||||
|
|
@ -186,9 +186,11 @@ up with something around here...<NOD<CLRMan, I'm hungry...<NOD<END
|
||||||
<PRI<FL+1022
|
<PRI<FL+1022
|
||||||
<MSGPeered into the bucket.<NOD
|
<MSGPeered into the bucket.<NOD
|
||||||
Looking closely, you can see
|
Looking closely, you can see
|
||||||
something down at the bottom.<NOD<CLR<EVE0075
|
something down at the bottom.<NOD<CLR<EVE0268
|
||||||
#0267
|
#0267
|
||||||
<PRI<MSGNothing in here anymore...<NOD<END
|
<PRI<MSGNothing in here anymore...<NOD<END
|
||||||
|
#0268
|
||||||
|
<EVE0075
|
||||||
|
|
||||||
#0299
|
#0299
|
||||||
<PRI<MSG.....<NOD<END
|
<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
|
<PRI<EQ+0064<EVE0324
|
||||||
|
|
||||||
#0324
|
#0324
|
||||||
<PRI<MSG<TUR<GIT1039
|
<EVE0089
|
||||||
<IT+0039Got the =Iron Bond=!<WAI0025<NOD<END
|
|
||||||
|
|
||||||
|
|
||||||
#0325
|
#0325
|
||||||
|
|
@ -307,8 +308,7 @@ at a frightening rate.<NOD<END
|
||||||
#0416
|
#0416
|
||||||
<PRI<DNP0415<FL-1028<EVE0417
|
<PRI<DNP0415<FL-1028<EVE0417
|
||||||
#0417
|
#0417
|
||||||
<MSG<TUR<GIT1028<IT+0028
|
<EVE0078
|
||||||
Got the =Broken Sprinkler=.<WAI0025<NOD<END
|
|
||||||
|
|
||||||
|
|
||||||
#0450
|
#0450
|
||||||
|
|
|
||||||
|
|
@ -163,8 +163,7 @@ the other robots...<NOD<CLO
|
||||||
to meet that gunsmith...<NOD<END
|
to meet that gunsmith...<NOD<END
|
||||||
|
|
||||||
#0518
|
#0518
|
||||||
<MSG<TUR<AM+0004:0100<GIT0004
|
<EVE0008
|
||||||
Got the =Machine Gun=!<WAI0025<NOD<END
|
|
||||||
|
|
||||||
#0520
|
#0520
|
||||||
<KEY<MSG<FAC0019Really?<NOD<CLRWell, if you ever change
|
<KEY<MSG<FAC0019Really?<NOD<CLRWell, if you ever change
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,5 @@ You're not dead, are you?<NOD<CLR.....<NOD<CLO
|
||||||
#0300
|
#0300
|
||||||
<PRI<FLJ2700:0001<FL+2700<SOU0022<CNP0300:0021:0000<CMP0024:0016:0066<EVE0301
|
<PRI<FLJ2700:0001<FL+2700<SOU0022<CNP0300:0021:0000<CMP0024:0016:0066<EVE0301
|
||||||
#0301
|
#0301
|
||||||
<PRI<MSG<TUR<GIT1026<IT+0026
|
<EVE0076
|
||||||
Got =Sue's Letter=!<WAI0025<NOD<END
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
#0200
|
#0200
|
||||||
<PRI<FLJ1564:0101<FLJ2400:0001<FL+2400<SOU0022<CNP0200:0021:0000<EVE0202
|
<PRI<FLJ1564:0101<FLJ2400:0001<FL+2400<SOU0022<CNP0200:0021:0000<EVE0202
|
||||||
#0202
|
#0202
|
||||||
<MSG<TUR<GIT1033<IT+0033Got the =Mushroom Badge=!<WAI0025<NOD<END
|
<EVE0083
|
||||||
|
|
||||||
#0400
|
#0400
|
||||||
<KEY<MYB0002<WAI0020
|
<KEY<MYB0002<WAI0020
|
||||||
|
|
@ -79,5 +79,5 @@ it, right?<YNJ0410<EVE0409
|
||||||
<MSGYou win......<NOD<CLR<FL-1564<DNP0500<EVE0501
|
<MSGYou win......<NOD<CLR<FL-1564<DNP0500<EVE0501
|
||||||
|
|
||||||
#0501
|
#0501
|
||||||
<MSG<GIT1034<IT+0034<CMU0015Got the =Ma Pignon=!<WAI0140<NOD<RMU<END
|
<EVE0084
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -114,7 +114,7 @@ let you have what's inside.<NOD<END
|
||||||
#0501
|
#0501
|
||||||
<KEY<FLJ2500:0001<FL+2500<SOU0022<CNP0500:0021:0000<EVE0502
|
<KEY<FLJ2500:0001<FL+2500<SOU0022<CNP0500:0021:0000<EVE0502
|
||||||
#0502
|
#0502
|
||||||
<KEY<MSG<TUR<GIT1020<IT+0020<EQ+0008Got the =Turbocharge=!<WAI0025<NOD<END
|
<EVE0070
|
||||||
|
|
||||||
#0510
|
#0510
|
||||||
<KEY<AMJ0003:0511<MYB0002<SOU0052<MSG<TURHEY!!!<WAI0100<NOD
|
<KEY<AMJ0003:0511<MYB0002<SOU0052<MSG<TURHEY!!!<WAI0100<NOD
|
||||||
|
|
@ -124,7 +124,7 @@ you have what's inside.<NOD<END
|
||||||
#0511
|
#0511
|
||||||
<KEY<FLJ2501:0001<FL+2501<SOU0022<CNP0510:0021:0000<EVE0512
|
<KEY<FLJ2501:0001<FL+2501<SOU0022<CNP0510:0021:0000<EVE0512
|
||||||
#0512
|
#0512
|
||||||
<KEY<MSG<TUR<GIT0001<AM+0001:0000Got the =Snake=!<WAI0025<NOD<END
|
<EVE0005
|
||||||
|
|
||||||
#0520
|
#0520
|
||||||
<KEY<AMJ0013:0521<MYB0002<SOU0052<MSG<TURHEY!!!<WAI0100<NOD
|
<KEY<AMJ0013:0521<MYB0002<SOU0052<MSG<TURHEY!!!<WAI0100<NOD
|
||||||
|
|
@ -134,4 +134,4 @@ have what's inside.<NOD<END
|
||||||
#0521
|
#0521
|
||||||
<KEY<FLJ2502:0001<FL+2502<SOU0022<CNP0520:0021:0000<EVE0522
|
<KEY<FLJ2502:0001<FL+2502<SOU0022<CNP0520:0021:0000<EVE0522
|
||||||
#0522
|
#0522
|
||||||
<KEY<MSG<TUR<GIT1038<IT+0038<EQ+0128Got the =Whimsical Star=!<WAI0025<NOD<END
|
<EVE0088
|
||||||
|
|
@ -31,7 +31,8 @@ end
|
||||||
local function event(n)
|
local function event(n)
|
||||||
return {
|
return {
|
||||||
name = "Event: " .. n,
|
name = "Event: " .. n,
|
||||||
attributes = {"event"}
|
attributes = {"event"},
|
||||||
|
placed = true
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -73,7 +74,7 @@ local function _itemData()
|
||||||
bubbler = {
|
bubbler = {
|
||||||
name = "Bubbler",
|
name = "Bubbler",
|
||||||
script = "<EVE0007",
|
script = "<EVE0007",
|
||||||
attributes = {"weaponBoss", "weaponSN", "nonProgressive"} -- have fun grinding to lv3 to get out of the first cave :)
|
attributes = {"weaponBoss", "weaponSN", "nonProgressive"}
|
||||||
},
|
},
|
||||||
machineGun = {
|
machineGun = {
|
||||||
name = "Machine Gun",
|
name = "Machine Gun",
|
||||||
|
|
@ -265,12 +266,18 @@ local function _itemData()
|
||||||
mrLittle = {
|
mrLittle = {
|
||||||
name = "Little Man",
|
name = "Little Man",
|
||||||
script = "<EVE0082",
|
script = "<EVE0082",
|
||||||
attributes = {"event"}
|
attributes = {"event"},
|
||||||
|
placed = true
|
||||||
},
|
},
|
||||||
ironBond = {
|
ironBond = {
|
||||||
name = "Iron Bond",
|
name = "Iron Bond",
|
||||||
script = "<EVE0089"
|
script = "<EVE0089"
|
||||||
},
|
},
|
||||||
|
clayMedal = {
|
||||||
|
name = "Clay Figure Medal",
|
||||||
|
script = "<EVE0081",
|
||||||
|
attributes = {"nonProgressive"}
|
||||||
|
},
|
||||||
|
|
||||||
-------------------
|
-------------------
|
||||||
-- LIFE CAPSULES --
|
-- LIFE CAPSULES --
|
||||||
|
|
@ -314,13 +321,16 @@ local function _itemData()
|
||||||
eventRocket = event("Built Rocket")
|
eventRocket = event("Built Rocket")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local array = {}
|
||||||
for k, t in pairs(data) do
|
for k, t in pairs(data) do
|
||||||
t.key = k
|
t.key = k
|
||||||
|
t.placed = t.placed or false
|
||||||
t.attributes = t.attributes or {}
|
t.attributes = t.attributes or {}
|
||||||
table.insert(t.attributes, k)
|
table.insert(t.attributes, k)
|
||||||
|
table.insert(array, t)
|
||||||
end
|
end
|
||||||
|
|
||||||
return data
|
return array
|
||||||
end
|
end
|
||||||
|
|
||||||
local C = Class:extend()
|
local C = Class:extend()
|
||||||
|
|
@ -330,17 +340,19 @@ function C:new()
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:getByKey(key)
|
function C:getByKey(key)
|
||||||
for k, v in ipairs(self.itemData) do
|
return _.filter(self.itemData, function(k,v) return v.key == key end)[1]
|
||||||
if k == key then return v end
|
end
|
||||||
end
|
|
||||||
|
function C:_getItems(filterFn)
|
||||||
|
return _.filter(self.itemData, filterFn)
|
||||||
|
end
|
||||||
|
|
||||||
|
function C:getItems()
|
||||||
|
return self:_getItems(function(k,v) return true end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:getItemsByAttribute(attribute)
|
function C:getItemsByAttribute(attribute)
|
||||||
local items = {}
|
return self:_getItems(function(k,v) return _.contains(v.attributes, attribute) end)
|
||||||
for item in ipairs(self.itemData) do
|
|
||||||
if _.contains(item.attributes, attribute) then table.insert(items, item) end
|
|
||||||
end
|
|
||||||
return items
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:getEvents()
|
function C:getEvents()
|
||||||
|
|
@ -352,7 +364,23 @@ function C:getOptionalItems()
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:getMandatoryItems()
|
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
|
end
|
||||||
|
|
||||||
return C
|
return C
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ end
|
||||||
|
|
||||||
function C:canAccess(items)
|
function C:canAccess(items)
|
||||||
if not self.region:canAccess(items) then return false end
|
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
|
end
|
||||||
|
|
||||||
function C:hasItem()
|
function C:hasItem()
|
||||||
|
|
@ -25,13 +25,15 @@ function C:hasItem()
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:setItem(item)
|
function C:setItem(item)
|
||||||
|
item.placed = true
|
||||||
self.item = item
|
self.item = item
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:writeItem(tscFiles, item)
|
function C:writeItem(tscFiles, item)
|
||||||
item = item or self.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
|
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
|
end
|
||||||
|
|
||||||
return C
|
return C
|
||||||
|
|
@ -7,27 +7,28 @@ function C:new(worldGraph, name)
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:canAccess(items)
|
function C:canAccess(items)
|
||||||
return self.requirements == nil or self.requirements(items)
|
return self.requirements == nil or self.requirements(self, items)
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:getLocation(key)
|
function C:getLocation(key)
|
||||||
return self.locations[key]
|
return self.locations[key]
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:getLocations()
|
function C:getLocations(filterFn)
|
||||||
return self.locations
|
filterFn = filterFn or function(k,v) return true end
|
||||||
|
return _.filter(self.locations, filterFn)
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:getEmptyLocations()
|
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
|
end
|
||||||
|
|
||||||
function C:getFilledLocations()
|
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
|
end
|
||||||
|
|
||||||
function C:writeItems(tscFiles)
|
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
|
end
|
||||||
|
|
||||||
return C
|
return C
|
||||||
|
|
@ -1,18 +1,12 @@
|
||||||
local Region = require 'database.region'
|
local Region = require 'database.region'
|
||||||
local Location = require 'database.location'
|
local Location = require 'database.location'
|
||||||
|
|
||||||
local function has(items, attribute)
|
function has(items, attribute)
|
||||||
for item in ipairs(items) do
|
return count(items, attribute) > 0
|
||||||
if _.contains(item.attributes, attribute) then return true end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function count(items, attribute)
|
function count(items, attribute)
|
||||||
local c = 0
|
return #_.filter(items, function(k,v) return _.contains(v.attributes, attribute) end)
|
||||||
for item in ipairs(items) do
|
|
||||||
if _.contains(item.attributes, attribute) then c = c + 1 end
|
|
||||||
end
|
|
||||||
return c
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local firstCave = Region:extend()
|
local firstCave = Region:extend()
|
||||||
|
|
@ -20,12 +14,12 @@ function firstCave:new(worldGraph)
|
||||||
firstCave.super.new(self, worldGraph, "firstCave")
|
firstCave.super.new(self, worldGraph, "firstCave")
|
||||||
self.locations = {
|
self.locations = {
|
||||||
firstCapsule = Location("First Cave Life Capsule", "Cave", "0401", self),
|
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)
|
gunsmith = Location("Tetsuzou", "Pole", "0303", self)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.locations.gunsmith.requirements = function(items)
|
self.locations.gunsmith.requirements = function(self, items)
|
||||||
return self.world.regions.mimigaVillage:canAccess(items) and has(items, "flight") and has(items, "polarStar") and has(items, "eventCore")
|
return has(items, "flight") and has(items, "polarStar") and has(items, "eventCore") and self.region.world.regions.mimigaVillage:canAccess(items)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -43,20 +37,20 @@ function mimigaVillage:new(worldGraph)
|
||||||
maPignon = Location("Ma Pignon Boss", "Mapi", "0501", self)
|
maPignon = Location("Ma Pignon Boss", "Mapi", "0501", self)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.requirements = function(items)
|
self.requirements = function(self, items)
|
||||||
if self.world.regions.firstCave:canAccess(items) and has(items, "weaponSN") then return true end
|
if has(items, "weaponSN") and self.world.regions.firstCave:canAccess(items) then return true end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
self.locations.assembly.requirements = function(items) return has(items, "juice") end
|
self.locations.assembly.requirements = function(self, items) return has(items, "juice") end
|
||||||
self.locations.mrLittle.requirements = function(items)
|
self.locations.mrLittle.requirements = function(self, items)
|
||||||
return self.world.regions.outerWall:canAccess(items) and has(items, "flight") and has(items, "locket")
|
return has(items, "flight") and has(items, "locket") and self.region.world.regions.outerWall.locations.littleHouse:canAccess(items)
|
||||||
end
|
end
|
||||||
self.locations.grave.requirements = function(items) return has(items, "locket") end
|
self.locations.grave.requirements = function(self, items) return has(items, "locket") end
|
||||||
self.locations.mushroomChest.requirements = function(items)
|
self.locations.mushroomChest.requirements = function(self, items)
|
||||||
return has(items, "flight") and has(items, "locket") and has(items, "eventCurly")
|
return has(items, "flight") and has(items, "locket") and has(items, "eventCurly")
|
||||||
end
|
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
|
-- 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, "flight") and has(items, "locket") and has(items, "mushroomBadge") then
|
||||||
if has(items, "polarStar") or has(items, "fireball") or has(items, "bubbler")
|
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)
|
risenBooster = Location("Professor Booster", "Pens1", "0652", self)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.requirements = function(items)
|
self.requirements = function(self, items)
|
||||||
if self.world.regions.mimigaVillage:canAccess(items) and has(items, "arthursKey") then return true end
|
if has(items, "arthurKey") and self.world.regions.mimigaVillage:canAccess(items) then return true end
|
||||||
return false
|
return false
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
local eggCorridor1 = Region:extend()
|
local eggCorridor1 = Region:extend()
|
||||||
|
|
@ -96,9 +90,9 @@ function eggCorridor1:new(worldGraph)
|
||||||
eventSue = Location("Saved Sue", nil, nil, self)
|
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"))
|
self.locations.eventSue:setItem(self.world.items:getByKey("eventSue"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -114,15 +108,15 @@ function grasstownWest:new(worldGraph)
|
||||||
kulala = Location("Kulala Chest", "Weed", "0702", self)
|
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
|
if self.world.regions.arthur:canAccess(items) then return true end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
self.locations.santa.requirements = function(items) return has(items, "santaKey") end
|
self.locations.santa.requirements = function(self, items) return has(items, "santaKey") end
|
||||||
self.locations.charcoal.requirements = function(items) return has(items, "santaKey") and has(items, "juice") end
|
self.locations.charcoal.requirements = function(self, items) return has(items, "santaKey") and has(items, "juice") end
|
||||||
self.locations.chaco.requirements = function(items) return has(items, "santaKey") end
|
self.locations.chaco.requirements = function(self, items) return has(items, "santaKey") end
|
||||||
self.locations.kulala.requirements = function(items) return has(items, "santaKey") and has(items, "weapon") end
|
self.locations.kulala.requirements = function(self, items) return has(items, "santaKey") and has(items, "weapon") end
|
||||||
end
|
end
|
||||||
|
|
||||||
local grasstownEast = Region:extend()
|
local grasstownEast = Region:extend()
|
||||||
|
|
@ -140,29 +134,30 @@ function grasstownEast:new(worldGraph)
|
||||||
eventKazuma = Location("Saved Kazuma", nil, nil, self)
|
eventKazuma = Location("Saved Kazuma", nil, nil, self)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.requirements = function(items)
|
self.requirements = function(self, items)
|
||||||
if self.world.regions.grasstownWest:canAccess(items) then
|
if not self.world.regions.arthur:canAccess(items) then return false end
|
||||||
if has(items, "flight") or has(items, "juice") then return true end
|
if has(items, "flight") or has(items, "juice") then
|
||||||
|
if self.world.regions.grasstownWest:canAccess(items) then return true end
|
||||||
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
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
self.locations.kazuma2.requirements = function(items) return has(items, "eventFans") end
|
self.locations.kazuma2.requirements = function(self, items) return has(items, "eventFans") end
|
||||||
self.locations.execution.requirements = function(items) return has(items, "weaponSN") end
|
self.locations.execution.requirements = function(self, items) return has(items, "weaponSN") end
|
||||||
self.locations.hutChest.requirements = function(items) return has(items, "eventFans") or has(items, "flight") end
|
self.locations.hutChest.requirements = function(self, items) return has(items, "eventFans") or has(items, "flight") end
|
||||||
self.locations.gumChest.requirements = function(items)
|
self.locations.gumChest.requirements = function(self, items)
|
||||||
if has(items, "gumKey") and has(items, "weaponBoss") then
|
if has(items, "gumKey") and has(items, "weaponBoss") then
|
||||||
if has(items, "eventFans") or has(items, "flight") then return true end
|
if has(items, "eventFans") or has(items, "flight") then return true end
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
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.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"))
|
self.locations.eventKazuma:setItem(self.world.items:getByKey("eventKazuma"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -177,14 +172,14 @@ function upperSandZone:new(worldGraph)
|
||||||
eventOmega = Location("Defeated Omega", nil, nil, self)
|
eventOmega = Location("Defeated Omega", nil, nil, self)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.requirements = function(items)
|
self.requirements = function(self, items)
|
||||||
if self.world.regions.arthur:canAccess(items) and has(items, "weaponSN") then return true end
|
if has(items, "weaponSN") and self.world.regions.arthur:canAccess(items) then return true end
|
||||||
return false
|
return false
|
||||||
end
|
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"))
|
self.locations.eventOmega:setItem(self.world.items:getByKey("eventOmega"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -202,15 +197,16 @@ function lowerSandZone:new(worldGraph)
|
||||||
eventToroko = Location("Defeated Toroko+", nil, nil, self)
|
eventToroko = Location("Defeated Toroko+", nil, nil, self)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.requirements = function(items)
|
self.requirements = function(self, items)
|
||||||
if self.world.regions.upperSandZone:canAccess(items) and has(items, "eventOmega") then return true end
|
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
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
self.locations.jenka.requirements = function(items) return count(items, "puppy") == 5 end
|
self.locations.jenka.requirements = function(self, items) return count(items, "puppy") == 5 end
|
||||||
self.locations.king.requirements = function(items) return has(items, "eventToroko") 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")
|
return count(items, "puppy") == 5 and has(items, "weaponBoss")
|
||||||
end
|
end
|
||||||
self.locations.eventToroko:setItem(self.world.items:getByKey("eventToroko"))
|
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),
|
whimChaba = Location("Chaba Chest (Spur)", "MazeA", "0522", self),
|
||||||
campChest = Location("Camp Chest", "MazeO", "0401", self),
|
campChest = Location("Camp Chest", "MazeO", "0401", self),
|
||||||
physician = Location("Dr. Gero", "MazeO", "0305", 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)
|
self.requirements = function(self, items)
|
||||||
if self.world.regions.lowerSandZone:canAccess(items) and has(items, "eventToroko") then return true end
|
if not self.world.regions.arthur:canAccess(items) then return false end
|
||||||
if self.world.regions.labyrinthB:canAccess(items) and has(items, "flight") then return true 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
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
self.locations.mazeCapsule.requirements = function(items) return has(items, "weapon") end
|
self.locations.mazeCapsule.requirements = function(self, items) return has(items, "weapon") end
|
||||||
self.locations.turboChaba.requirements = function(items) return has(items, "machineGun") end
|
self.locations.turboChaba.requirements = function(self, items) return has(items, "machineGun") end
|
||||||
self.locations.snakeChaba.requirements = function(items) return has(items, "fireball") end
|
self.locations.snakeChaba.requirements = function(self, items) return has(items, "fireball") end
|
||||||
self.locations.whimChaba.requirements = function(items) return count(items, "polarStar") == 2 end
|
self.locations.whimChaba.requirements = function(self, items) return count(items, "polarStar") == 2 end
|
||||||
self.locations.campChest.requirements = function(items) return has(items, "flight") end
|
self.locations.campChest.requirements = function(self, items) return has(items, "flight") end
|
||||||
self.locations.puuBlack.requirements = function(items) return has(items, "clinicKey") and has(items, "weaponBoss") end
|
self.locations.puuBlack.requirements = function(self, items) return has(items, "clinicKey") and has(items, "weaponBoss") end
|
||||||
end
|
end
|
||||||
|
|
||||||
local labyrinthB = Region:extend()
|
local labyrinthB = Region:extend()
|
||||||
|
|
@ -250,9 +247,8 @@ function labyrinthB:new(worldGraph)
|
||||||
fallenBooster = Location("Booster Chest", "MazeB", "0502", self)
|
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.arthur:canAccess(items) then return true end
|
||||||
if self.world.regions.labyrinthW:canAccess(items) then return true end
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -267,10 +263,10 @@ function boulder:new(worldGraph)
|
||||||
eventCore = Location("Defeated Core", nil, nil, self)
|
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 has(items, "cureAll") and has(items, "weaponBoss") then
|
||||||
if self.world.regions.labyrinthW:canAccess(items) then return true end
|
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
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
@ -282,9 +278,10 @@ local labyrinthM = Region:extend()
|
||||||
function labyrinthM:new(worldGraph)
|
function labyrinthM:new(worldGraph)
|
||||||
labyrinthM.super.new(self, worldGraph, "labyrinthM")
|
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.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
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -298,9 +295,13 @@ function waterway:new(worldGraph)
|
||||||
eventCurly = Location("Saved Curly", nil, nil, self)
|
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"))
|
self.locations.eventCurly:setItem(self.world.items:getByKey("eventCurly"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -313,14 +314,15 @@ function eggCorridor2:new(worldGraph)
|
||||||
sisters = Location("Sisters Boss", "EggR2", "0303", self)
|
sisters = Location("Sisters Boss", "EggR2", "0303", self)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.requirements = function(items)
|
self.requirements = function(self, items)
|
||||||
if has(items, "eventCore") and self.world.regions.arthur:canAccess(items) then return true end
|
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
|
if has(items, "eventKazuma") and self.world.regions.outerWall:canAccess(items) then return true end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
self.locations.dragonChest.requirements = function(items) return has(items, "weapon") end
|
self.locations.dragonChest.requirements = function(self, items) return has(items, "weapon") end
|
||||||
self.locations.sisters.requirements = function(items) return has(items, "weaponBoss") end
|
self.locations.sisters.requirements = function(self, items) return has(items, "weaponBoss") end
|
||||||
end
|
end
|
||||||
|
|
||||||
local outerWall = Region:extend()
|
local outerWall = Region:extend()
|
||||||
|
|
@ -332,13 +334,14 @@ function outerWall:new(worldGraph)
|
||||||
littleHouse = Location("Little House", "Little", "0204", self)
|
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, "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
|
if has(items, "teleportKey") and self.world.regions.plantation:canAccess(items) then return true end
|
||||||
return false
|
return false
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
local plantation = Region:extend()
|
local plantation = Region:extend()
|
||||||
|
|
@ -358,22 +361,23 @@ function plantation:new(worldGraph)
|
||||||
eventRocket = Location("Built Rocket", nil, nil, self)
|
eventRocket = Location("Built Rocket", nil, nil, self)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.requirements = function(items)
|
self.requirements = function(self, items)
|
||||||
if has(items, "teleportKey") and self.world.regions.arthur:canAccess(items) then return true end
|
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
|
if self.world.regions.outerWall:canAccess(items) then return true end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
self.locations.jail1.requirements = function(items) return has(items, "letter") end
|
self.locations.jail1.requirements = function(self, items) return has(items, "letter") end
|
||||||
self.locations.momorin.requirements = function(items) return has(items, "letter") and has(items, "booster") end
|
self.locations.momorin.requirements = function(self, items) return has(items, "letter") and has(items, "booster") end
|
||||||
self.locations.sprinkler.requirements = function(items) return has(items, "mask") end
|
self.locations.sprinkler.requirements = function(self, items) return has(items, "mask") end
|
||||||
self.locations.megane.requirements = function(items) return has(items, "brokenSprinkler") and 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(items) return has(items, "letter") end
|
self.locations.itoh.requirements = function(self, items) return has(items, "letter") end
|
||||||
self.locations.plantCeiling.requirements = function(items) return has(items, "flight") end
|
self.locations.plantCeiling.requirements = function(self, items) return has(items, "flight") end
|
||||||
self.locations.plantPup.requirements = function(items) return has(items, "eventRocket") end
|
self.locations.plantPup.requirements = function(self, items) return has(items, "eventRocket") end
|
||||||
self.locations.curlyShroom.requirements = function(items) return has(items, "eventCurly") and has(items, "maPignon") 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")
|
return has(items, "letter") and has(items, "booster") and has(items, "controller") and has(items, "sprinkler")
|
||||||
end
|
end
|
||||||
self.locations.eventRocket:setItem(self.world.items:getByKey("eventRocket"))
|
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)
|
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
|
end
|
||||||
|
|
||||||
local endgame = Region:extend()
|
local endgame = Region:extend()
|
||||||
|
|
@ -399,7 +403,7 @@ function endgame:new(worldGraph)
|
||||||
hellB3 = Location("Hell B3 Chest", "Hell3", "0400", self)
|
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)
|
return has(items, "eventSue") and has(items, "ironBond") and self.world.regions.lastCave:canAccess(items)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -433,56 +437,80 @@ end
|
||||||
|
|
||||||
function worldGraph:getLocations()
|
function worldGraph:getLocations()
|
||||||
local locations = {}
|
local locations = {}
|
||||||
for region in ipairs(self.regions) do
|
for key, region in pairs(self.regions) do
|
||||||
locations = _.union(locations, region:getLocations())
|
for k, location in pairs(region:getLocations()) do
|
||||||
|
table.insert(locations, location)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return locations
|
return locations
|
||||||
end
|
end
|
||||||
|
|
||||||
function worldGraph:getLocationsByRegion(...)
|
function worldGraph:getPuppySpots()
|
||||||
local locations = {}
|
local locations = self.locationsArray(self.regions.upperSandZone:getLocations())
|
||||||
for region in ipairs(self.regions) do
|
for k, location in pairs(self.regions.lowerSandZone:getLocations()) do
|
||||||
if _.contains({...}, region.name) then locations = _.union(locations, region:getLocations()) end
|
if k ~= "jenka" and k ~= "king" and k ~= "eventToroko" then
|
||||||
|
table.insert(locations, location)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return locations
|
return locations
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function worldGraph:getHellSpots()
|
||||||
|
return self.locationsArray(self.regions.endgame:getLocations())
|
||||||
|
end
|
||||||
|
|
||||||
function worldGraph:getEmptyLocations()
|
function worldGraph:getEmptyLocations()
|
||||||
local locations = {}
|
local locations = {}
|
||||||
for region in ipairs(self.regions) do
|
for key, region in pairs(self.regions) do
|
||||||
locations = _.union(locations, region:getEmptyLocations())
|
for k, location in pairs(region:getEmptyLocations()) do
|
||||||
|
table.insert(locations, location)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return locations
|
return locations
|
||||||
end
|
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()
|
function worldGraph:getFilledLocations()
|
||||||
local locations = {}
|
local locations = {}
|
||||||
for region in ipairs(self.regions) do
|
for key, region in pairs(self.regions) do
|
||||||
locations = _.union(locations, region:getFilledLocations())
|
for k, location in pairs(region:getFilledLocations()) do
|
||||||
|
table.insert(locations, location)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return locations
|
return locations
|
||||||
end
|
end
|
||||||
|
|
||||||
function worldGraph:writeItems(tscFiles)
|
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
|
end
|
||||||
|
|
||||||
function worldGraph:collect(preCollectedItems)
|
function worldGraph:collect(preCollectedItems)
|
||||||
local collected = preCollectedItems or {}
|
local collected = preCollectedItems or {}
|
||||||
|
assert(collected ~= nil)
|
||||||
local availableLocations = self:getFilledLocations()
|
local availableLocations = self:getFilledLocations()
|
||||||
|
|
||||||
local foundItems
|
local foundItems = 0
|
||||||
|
|
||||||
repeat
|
repeat
|
||||||
local accessible = {}
|
local accessible, _i = {}, {}
|
||||||
for location in ipairs(availableLocations) do
|
for i, location in ipairs(availableLocations) do
|
||||||
if location:canAccess(collected) then table.insert(accessible, location) end
|
if location:canAccess(collected) then
|
||||||
|
table.insert(accessible, location)
|
||||||
|
table.insert(_i, i)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
for i, v in ipairs(_i) do table.remove(availableLocations, i) end
|
||||||
availableLocations = _.difference(availableLocations, accessible)
|
|
||||||
|
|
||||||
foundItems = #accesible
|
foundItems = #accessible
|
||||||
for location in ipairs(accessible) do
|
for i, location in ipairs(accessible) do
|
||||||
table.insert(collected, location.item)
|
table.insert(collected, location.item)
|
||||||
end
|
end
|
||||||
until foundItems == 0
|
until foundItems == 0
|
||||||
|
|
@ -490,4 +518,15 @@ function worldGraph:collect(preCollectedItems)
|
||||||
return collected
|
return collected
|
||||||
end
|
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
|
return worldGraph
|
||||||
|
|
@ -6,10 +6,12 @@ local C = Class:extend()
|
||||||
|
|
||||||
local TSC_FILES = {}
|
local TSC_FILES = {}
|
||||||
do
|
do
|
||||||
for location in ipairs(WorldGraph(Items()):getLocations()) do
|
for key, location in ipairs(WorldGraph(Items()):getLocations()) do
|
||||||
local filename = location.map .. '.tsc'
|
if location.map ~= nil and location.event ~= nil then
|
||||||
if not _.contains(TSC_FILES, filename) then
|
local filename = location.map
|
||||||
table.insert(TSC_FILES, filename)
|
if not _.contains(TSC_FILES, filename) then
|
||||||
|
table.insert(TSC_FILES, filename)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -17,7 +19,7 @@ end
|
||||||
function C:new()
|
function C:new()
|
||||||
self._isCaveStoryPlus = false
|
self._isCaveStoryPlus = false
|
||||||
self.itemDeck = Items()
|
self.itemDeck = Items()
|
||||||
self.worldGraph = WorldGraph(itemDeck)
|
self.worldGraph = WorldGraph(self.itemDeck)
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:randomize(path)
|
function C:randomize(path)
|
||||||
|
|
@ -31,7 +33,7 @@ function C:randomize(path)
|
||||||
local tscFiles = self:_createTscFiles(dirStage)
|
local tscFiles = self:_createTscFiles(dirStage)
|
||||||
-- self:_writePlaintext(tscFiles)
|
-- self:_writePlaintext(tscFiles)
|
||||||
self:_shuffleItems(tscFiles)
|
self:_shuffleItems(tscFiles)
|
||||||
-- self:_writeModifiedData(tscFiles)
|
self:_writeModifiedData(tscFiles)
|
||||||
self:_writePlaintext(tscFiles)
|
self:_writePlaintext(tscFiles)
|
||||||
self:_writeLog()
|
self:_writeLog()
|
||||||
self:_unmountDirectory(path)
|
self:_unmountDirectory(path)
|
||||||
|
|
@ -77,8 +79,9 @@ end
|
||||||
function C:_createTscFiles(dirStage)
|
function C:_createTscFiles(dirStage)
|
||||||
local tscFiles = {}
|
local tscFiles = {}
|
||||||
for _, filename in ipairs(TSC_FILES) do
|
for _, filename in ipairs(TSC_FILES) do
|
||||||
local path = dirStage .. '/' .. filename
|
local path = dirStage .. '/' .. filename .. '.tsc'
|
||||||
tscFiles[filename] = TscFile(path)
|
tscFiles[filename] = TscFile(path)
|
||||||
|
tscFiles[filename].mapName = filename
|
||||||
end
|
end
|
||||||
return tscFiles
|
return tscFiles
|
||||||
end
|
end
|
||||||
|
|
@ -92,58 +95,65 @@ function C:_writePlaintext(tscFiles)
|
||||||
|
|
||||||
-- Write modified files.
|
-- Write modified files.
|
||||||
for filename, tscFile in pairs(tscFiles) do
|
for filename, tscFile in pairs(tscFiles) do
|
||||||
local path = sourcePath .. '/data/Plaintext/' .. filename
|
local path = sourcePath .. '/data/Plaintext/' .. filename .. '.txt'
|
||||||
tscFile:writePlaintextTo(path)
|
tscFile:writePlaintextTo(path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:_shuffleItems(tscFiles)
|
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
|
-- first fill puppies
|
||||||
local puppies = self.itemDeck:getItemsByAttribute("puppy")
|
self:_fastFillItems(self.itemDeck:getItemsByAttribute("puppy"), _.shuffle(self.worldGraph:getPuppySpots()))
|
||||||
local sandZone = _.shuffle(self.worldGraph:getLocationsByRegion("upperSandZone", "lowerSandZone"))
|
|
||||||
self:_fastFillItems(puppies, sandZone)
|
|
||||||
|
|
||||||
local mandatory = _.shuffle(self.itemDeck:getMandatoryItems())
|
local mandatory = _.compact(_.shuffle(self.itemDeck:getMandatoryItems()))
|
||||||
local optional = _.shuffle(self.itemDeck:getOptionalItems())
|
local optional = _.compact(_.shuffle(self.itemDeck:getOptionalItems()))
|
||||||
|
|
||||||
-- next fill hell chests, which cannot have mandatory items
|
-- 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()))
|
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
|
end
|
||||||
|
|
||||||
function C:_fillItems(items, locations)
|
function C:_fillItems(items, locations, baseItems)
|
||||||
local itemsLeft = _.clone(items)
|
local itemsLeft
|
||||||
assert(#items <= #locations, 'Trying to fill more items than there are locations!')
|
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 assumed = self.worldGraph:collect(_.remove(itemsLeft, item))
|
||||||
local fillable = {}
|
|
||||||
for location in ipairs(locations) do
|
local fillable = _.filter(locations, function(k,v) return not v:hasItem() and v:canAccess(assumed) end)
|
||||||
if not location:hasItem() and location:canAccess(assumed) then table.insert(fillable, location) end
|
local empty = _.filter(locations, function(k,v) return not v:hasItem() end)
|
||||||
end
|
assert(#fillable > 0, "No available locations!")
|
||||||
assert(#fillable > 0, 'No available locations!')
|
assert(item ~= nil, "No item found!")
|
||||||
fillable[1]:setItem(item)
|
fillable[1]:setItem(item)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:_fastFillItems(items, locations)
|
function C:_fastFillItems(items, locations)
|
||||||
for location in ipairs(locations) do
|
--assert(#items > 0, ("Items: %d Locations: %d"):format(#items, #locations))
|
||||||
if not location:hasItem() then
|
for key, location in ipairs(locations) do
|
||||||
local item = _.pop(items)
|
local item = items[#items]
|
||||||
if item == nil then break end -- no items left to place, but there are still locations open
|
table.remove(items)
|
||||||
location:setItem(item)
|
--assert(item ~= nil, ("Items: %d Locations: %d"):format(#items, key))
|
||||||
end
|
if item == nil then break end -- no items left to place, but there are still locations open
|
||||||
|
location:setItem(item)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:_writeModifiedData(tscFiles)
|
function C:_writeModifiedData(tscFiles)
|
||||||
local basePath = self:_getWritePathStage()
|
local basePath = self:_getWritePathStage()
|
||||||
for filename, tscFile in pairs(tscFiles) do
|
for filename, tscFile in pairs(tscFiles) do
|
||||||
local path = basePath .. '/' .. filename
|
local path = basePath .. '/' .. filename .. '.tsc'
|
||||||
tscFile:writeTo(path)
|
tscFile:writeTo(path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ function C:new(path)
|
||||||
assert(file:release())
|
assert(file:release())
|
||||||
|
|
||||||
-- Determine set of items which can be replaced later.
|
-- Determine set of items which can be replaced later.
|
||||||
|
--[[
|
||||||
self._unreplaced = {}
|
self._unreplaced = {}
|
||||||
self._mapName = path:match("^.+/(.+)$")
|
self._mapName = path:match("^.+/(.+)$")
|
||||||
for k, v in pairs(ITEM_DATA) do repeat
|
for k, v in pairs(ITEM_DATA) do repeat
|
||||||
|
|
@ -31,15 +32,23 @@ function C:new(path)
|
||||||
table.insert(self._unreplaced, item)
|
table.insert(self._unreplaced, item)
|
||||||
until true end
|
until true end
|
||||||
self._unreplaced = _.shuffle(self._unreplaced)
|
self._unreplaced = _.shuffle(self._unreplaced)
|
||||||
|
]]
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:hasUnreplacedItems()
|
function C:hasUnreplacedItems()
|
||||||
return #self._unreplaced >= 1
|
return #self._unreplaced >= 1
|
||||||
end
|
end
|
||||||
|
|
||||||
function C:placeItemAtLocation(script, event)
|
function C:placeItemAtLocation(item, location)
|
||||||
local labelStart = self:_getLabelPositionRange(event)
|
local template = '[%s] "%s" -> "%s"'
|
||||||
self:_stringReplace(self._text, "<EVE$%d%d%d%d", script, event)
|
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
|
end
|
||||||
|
|
||||||
function C:replaceItem(replacement)
|
function C:replaceItem(replacement)
|
||||||
|
|
@ -130,13 +139,13 @@ end
|
||||||
|
|
||||||
function C:_stringReplace(text, needle, replacement, label)
|
function C:_stringReplace(text, needle, replacement, label)
|
||||||
local pStart, pEnd = self:_getLabelPositionRange(label)
|
local pStart, pEnd = self:_getLabelPositionRange(label)
|
||||||
local i = text:find(needle, pStart, true)
|
local i = text:find(needle, pStart)
|
||||||
if i == nil then
|
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
|
return text, false
|
||||||
elseif i > pEnd then
|
elseif i > pEnd then
|
||||||
-- This is totally normal and can be ignored.
|
-- 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
|
return text, false
|
||||||
end
|
end
|
||||||
local len = needle:len()
|
local len = needle:len()
|
||||||
|
|
@ -188,7 +197,7 @@ function C:_getLabelPositionRange(label)
|
||||||
end
|
end
|
||||||
|
|
||||||
if labelStart == nil then
|
if labelStart == nil then
|
||||||
logError("Could not find label: " .. label)
|
logError(("%s: Could not find label: %s"):format(self.mapName, label))
|
||||||
labelStart = 1
|
labelStart = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue