0K=Dº‘X’tAME9wt;³¥UÒÉ¥Œ«¡KrnWHR„xu«›ŽÑ±‡Ç{X®]@yDJ F’”–˜šœž ÿÿÿÿ2Tv˜ºÜþïÍ«‰gE#2Tv˜ºÜþ2Tv˜ºÜþðÿÿÞ`f``æææææffnnnn`f``ffæînîæîîîæîîîæîîîf`f``fîæînæîænînfnînæn`f`fæ`æî`îî`æîfî`fîfnfînnîînîfîf`f``ææææ`ffîffnnnîff`f``ff`````f``ff`f`f``f```f````f`f```f`ff`f```ff`î`æîæîî`îîîæîîîæîîî`æîî`ffîænîænîfîînænîîînîînfffîîî`îîî`æîîæîî`îî`æîfîfîîîfîîîîînîînîîînîfffîî`æîî`æîî`æîîæîîfîî`fî`fîîfîænîfnîînîînîîfîfffîîîæîîî`îîîæîî`îîæî`îîfffîîîfînænîîæîînîîînîîfff`````ff``f````fff````fff```fff```f`f`ff`f```fffÎÌÌÌ̈ˆˆ¬ªªª¬ˆˆˆ¬ÌÌ̬ÌÀ̬ÌÀ̬ÌÀÌÌÌìÌÀÀî̬ÀÌÀ¬ÀÀÀ¬ÀÀÀ¬ÀÀÎÌÌÌ̈ˆˆ¬ªªª¬ˆˆˆ¬ÌÌ̬ÌÌ̬ÌÀ̬ÌÀÌÌÌìÌÀÀî̬ÀÌ̬ÀÀÀ¬ÀÀÀ¬ÀÀff`fîf`æîæ`înæ`îff`ffænîfîfnænæfîfîænæn`ffnîfnînfæîffî`ffænf`wvgfv`f`fwfvwvwwfwwwwgvfgvwwfwg`wggwf`f`ff`vwvww`vvg`wvvgfgw`f```ffff```ff¬ÌÌ̬ªªª¬ª¬ª¬ªÊ̬ªªªŒˆˆˆÌÀÌÎÌÌÎ̬̪ªÀ쬪ÀÀÀÌîÀìîÌÌîî¬ÌÌ̬ªªª¬ª¬ª¬ªÊ̬ªªªŒˆˆˆÌÀÌÎÌÌÎ̬̪ªÀ쬪ÀÀÀÌîÀìîÌÌîîfînæîfænfînæîfænffffænænænænffffffffænænænænfffffînæîfænfînæîfæn`fvvvv`vgvfvvgvgwwwgwwwggwvggwvggwfg`v`wf`vwvw`w`w`w`w`wwfvwwgvwvgvfwwf`ww``vwvwfgfffffvwwwgwwwfwwwvwwwv`ffgvwwfwwwgwfwgwgvgwwvgwvvgf```ffff````fffààîààààààîààààààààààààà30C3T43D3033ÿðïÿÞþÿîÿðÿÿfî`ff`îff`înæ`æîæ`fîfffîfîfnænæfîfîænænfî`ffnfînæîfînfîf`ff`w`w`w`w`fw`fgw`wvg`wfffwgwvwgwvwgwvggwvggwvggwvggwwggfvwfvgvwfvfvgvwgwffwg`gfgvgvf`vffwvgfffgffgf`gg`gwff`v`fgfwgfvfwvvfwfvgfggvfffvfwwffffffffffffffffffffffffffffffff`f`fdD`ffD`Ff4D@4f@f@DD343D3C@@`D`D@DDD@@D@@@`DDDD`D@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÌÜÝíîþÿÿÌlfvw‡ˆˆffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff434D3C4@4C3D33DC@DDD4C3DD@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDD`ff``f`f````†ffˆ†ˆ†ˆ†fffˆˆf`ˆˆˆfˆˆˆhˆˆˆhˆˆˆh`fhhhhh`†ffˆ`†ˆ†ˆ†fffˆˆf`ˆˆˆfˆˆˆhˆˆˆhˆˆˆh`fhhh`hhffffffffffffffffffffffffffffffff†f†ˆ`†`†h†ˆˆ†ˆˆ††f†††ˆˆˆˆˆfˆˆˆfˆˆ†ˆˆˆh†ˆhˆhf†fˆˆˆˆffhˆˆˆh†hˆˆfˆˆhˆˆh`†ff†ˆ†h††ˆh†ˆˆ`ˆˆ†f††ˆˆˆˆˆfˆhˆfˆh†ˆˆhh†ˆhˆhf†fˆˆˆˆffˆff†ˆfˆˆhˆˆhˆˆhˆˆhˆˆhˆˆffffffffffffffffffffffffffffffff††f`††††`h``ˆ†f†ˆhhhffhˆˆhhˆ†hˆˆ†ˆ†ˆhˆˆˆh†ˆff`fˆˆhˆˆh†hhh`†f††††`h`ˆ†f†ˆhˆhffˆˆˆhˆˆ†hˆˆ†ˆ†ˆhˆˆˆh†ˆff`fˆhˆhˆfhhffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ™™™™¹ ™ ›»™¹™™°™™›¹™° ™™™™™ ™ ™™™™™¹ ™ ›¹¹™™°™¹™›¹™° ™™™™™ ™ ™ ™™™™¹ ›¹¹™™™°›™™›¹° ™™ ™ ™ ™™ ™™™™¹ ™ ›¹¹™™°™¹™›¹™° ™™™™™ ™ ™ ™™™™¹ ™ ›»™¹™™°™™›¹™° ™™™™™ ™ ™™°™ °™ ™ ™™™ ° ™›» ™™ ™™›™›¹™°›™™™™ ™°™ ° ™ ™™™™° ™›¹™™™ ™¹› ›¹™°›™ ™™ ™™™° °™ ™ ™™ ° ›¹™™™ ™›™› ›¹ °›™™™™ ™°™ ° ™ ™™™™° ™›¹™™™ ™¹› ›¹™°›™ ™™ ™™°™ °™ ™ ™™™ ° ™›» ™™ ™™›™›¹™°›™™™™ PÀÌÌ Àîî ìîîÎìÎìÎÌ ìÎÀî Àî ìÎÌÌÌ ìîîÎìîîÎìÌìÎÌ ìÎìÎÌìÎìî ÀÌìÎìÎìÎÀÌìÎìÎìÎìÎìîîÎìîîÎÌ ÌìÎÀÎÀîìÎìî ÀîÎìÎî ì ìÎÀÀÌÀîÎÀî ìÎìÎìÎÌÌìîîÎìîîÎÌÌÌÌìî ÌìÎìÎìÎÌÌìÎìîîÎìîîÎÌÌÌ ÀÌìÎìÎìÎìÎìÎìÎìÎÌÌÌì ìÎìî ìÎìì ÌÀÎ Ìì ìÎìî ìîÎìîî ìîÎìî îÎÎìÎÌÎÌìÎÌÌÎÌìÎÌìîÎìÌî ÌìÎ À ÎÌìÎîÌîÎìà¦CCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB)*%&'()*%&)*åæ…†‰Š…†‡ˆ‰Š…†BBBBBBBBBBBBB%&9:56789:569:õö•–™š•–—˜™š•–56…†‰Š…†‰Šéêåæ%&)*%&)*•–™š•–™šùúõö569:569:%&)*%&)*%&)*åæ…†‰Š…†‰Š…†‰Š569:569:569:õö•–™š•–™š•–™šTUTUTUdededecPQPQc`a`abb Ï@ABCDFGHIJKLNO@@@@@@@@@@@@@@@@012345789;<=>?0000000000000000ðР€ 00à0À0 0p0 0p0 0p0 00000000000000000000KE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E E@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E pM pM 00à0À000000000000000000000000000 0} c c c c c c c c c c c cccc c c c c c c c c c c c c c cƒ ƒƒ‚‚‚‚Bb‚ÂbBb‚‚‚‚‚‚‚Âbb‚‚bb‚‚‚‚‚‚‚‚‚‚‚‚‚‚fâââfâââfâââfâââfâââfâââfâââfâââfâââfâââfâââfâââfâââfâââfâââfâââcccccc ccccccccccƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒcƒƒc ccÂÂbbbb‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ ƒ ƒ ƒ ƒ ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ c c ccccccccƒƒƒ ƒ ƒ ƒ£££ c c ccccƒƒƒ ƒ ƒ ƒ ƒ ƒ ƒ£££ƒƒƒÃÃà ££Ã㣠£ ££££ ƒƒ££££ ƒ ƒ¢¢¢¢bÂbÂb¢¢¢¢¢¢bÂbÂbÂÂbÂbÂbÂbbÂbÂbÂâÂbbb ƒƒ ƒƒ ƒƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒƒ ƒ£ ƒ£ƒ ƒ ƒ ƒ ƒƒƒ££Ì@  ÿÿ$ÿ 0 0 4 4þÿÀ?àà`fàwwwwwwwwwww3wwwwwwwwwwwwwwwww7CEswwwwwwwwwwwwwwwwwwwwww34wwwwwwwwwwwàîà```àîàîàîîàààîàîàwwwwwwwwww7Cswwwwwwwwwwwwwwww7C4swwwwwwwwwwwwwwwwwwwww7CEswwwwwwwwwwàî`fîàààààààààààwwwwwwwwww3T4wwwwwwwwwwwwwwwww33wwwwwwwwwwwwwwwwwwwwww7C4swwwwwwwwwwà``àîàîààààààààààwwwwwwwwww3D3wwwwwwwwwwwwwwwww7swwwwwwwwwwwwwwwwwwwwwww33wwwwwwwwwwwàà`f`fàîîààààîààwwwwwwwwww73swwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7swwwwwwwwwwwwwwwwwwwwww3wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwîîfwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwàààîàîîwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwààà`fwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwààîwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgvwwwgwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwîààîîfwww7swwwwwwwwwwwwwwwwwwwwwwwwww†ffwwfwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7sw34w3wwwwwwwwwwwwwwwwwwwwwwwwfˆˆfghwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww347CE3Cs3wwwwwwwwwwwwwwwwwwwwwfˆˆˆˆfhwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwàààîàîîààCE3C43T4C3wwwwwwwwwwwwwwwwwwww†ˆˆˆˆhhwwwwwwwwwwwwwwwww7swwwwwwwwwwwwîîààààààC4s333D3T4swwwwwwwwwwwwwwwwwww†ˆˆˆˆhhvwwww3wwwwwwwwwww34wwwwwwwwwwwwààîààààà33w7s733D34wwwwwwwwwwwwwwwwwww†fˆˆˆhhvwww7Cswwwwwwwww7CEswwwwwwwwwwwààààîàà3swwww373C3wwwwwwwwwwwwwwwwwww†fˆˆˆˆˆvwww3T4wwwwwwwww7C4swwwwwwwwwwwàwwwwwwww33s3wwwwwwwwwwwwwwwwww†ˆˆfˆˆˆvwww3D3wwwwwwwwww33wwwwwwwwwwwwîîàwwwwwwwww37Cswwwwwwwwwwwwwwwwwg†ˆfˆˆˆvwww73swwwwwwwwww7swwwwwwwwwwwwàààîàîîàààààîàààwwwwwwwwww3T4wwwwwwwwwwwwwwwwg†h†ˆˆˆhvwwww3wwwwwwwwwwwwwwwwwwwwwwwwwàààààààààààààwwwwwwwwww3D3wwwwwwwwwwwwwwww†ˆˆh†ˆh†hvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwààîààààààîàààààwwwwwwwwww73s3wwwwwwwwwwwwwww†ˆˆˆhf†ˆˆfwwwwwwwwwwwwwwwwwwwwwwwwwwwwwîààîîîààààîààwwwwwwwwwww37Cswwwwwwwwwwwwww††ffˆˆˆˆˆhwwwwwwwwwwwwwwwwwwwwwwwwwwwwwàwwwwwwwwwwww3T4wwwwwwwwwwwwww†††ˆffhˆˆhwwwwwwwwwwwwwwwwwwwwwwwwwwwwwîîàààà``f`fwwwwwwwwwwww3D3wwwwwwwwwwwwww††f†ˆhhˆˆhwwwwwwwwwwwwwwwwwwwwwwwwwwwwwàààîàîîàîîî``wwwwwwwwwwww73swwwwwwwwwwwwwwg††hffhˆˆhwwwwwwwwwwwwwwwwwwwwwwwwwwwwwààààààîààà`ffwwwwwwwwwwwww3wwwwwwwwwwwwwwwv††ˆˆhh†hvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwààààààîà`w7swwwwwwwwwww3wwwwwwwwwwwwwwvghˆ†hˆhvvwwwwwwwwwwwww3wwwwwwwwwwwwwwwîààîîîàîàîf`f`ffw34wwwwwwwwww7Cswwwwwwwwwwwwwggˆˆ†ˆ†hwvwwwwwwwwwwww7Cswwwwwwwwwwwwwwà7CEswwwwwwwww3T4wwwwwwwwwwwwwww†ˆhˆˆvgwwwwwwwwwwwww3T4wwwwwwwwwwwwwwàà7C4swwwwwwwww3D3wwwwwwwwwwwwwwwfˆh†ˆvwwwwwwwwwwwwww3D3wwwwwwwwwwwwwwàîààîîîàîààààîàw33w7swwwwwww73swwwwwwwwwwwwwwwwffgfvwwwwwwwwwwwwww73swwwwwwwwwwwwwwîààààààààîàààààw7sw34wwwwwwww3swwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww3wwwwwwwwwwwwwwwàààààààààààwww7CEswwwwwww34wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwîàààîàîîààîwww7C4swwwwww7CEswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwààwwww33wwwwwww7C4swwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwàààwwww7swww7swww33wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwàààààîàîwwwwwwwww34www7swwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwîààààwwwwwwww7CEsww3wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww3wwwwwwwwwwwwwwwwàààwwwwww3w7C4sw7Cswwwwwwwwwwwwwwwwwwwwwwwwwwwwwww3ww7Cswwwwwwwwwwwwwwwààîààààààwwwww7Csw33ww3T4wwwwwwwwwwwwwwwwwwwwwwwwwwwwww7Csw3T4wwwwwwwwwwwwwwwàwwwww3T4w7sww3D3wwwwwwwwwwwwwwwwwwwwwwwwwwwwww3T4w3D3wwwwwwwwwwwwwwwàààwwwww3D3wwwww73swwwwwwwwwwwwwwwwwwwwwwwwwwwwww3D3w73swwwwwwwwwwwwwwwàààîàààîàîàwwwww73swwwww33wwwwwwwwwwwwwwwwwwwwwwwwwwwwwww73sww3wwwwwwwwwwwwwwwwîàààààààîààwwwwww3wwwww7Cswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww3wwwwwwwwwwwwwwwwwwwwàààààààààààwwwwwwwwwwww3T4wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwîààîîàîwwwwwwwwwwww3D3wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww73swwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww333wwwwwwwwwwwwwwwwwwwwwwwwwww3wwwwwwwwwwwwwwwwwwwwwwwwwwàîàwwwwwwwwww73Cswwwwwwwwwwwwwwwwwwwwwwwwww7Cswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww33T4wwwwwwwwwwwwwwwwwwwwwwwwww3T4wwwwwwwwwwwwwwwwwwwwwwwwwîwwwwwwwww333D3wwwwwwwwwwwwwwwwwwwwwwwwww3D3wwwwwwwwwwwwwwwwwwwwwwwwwààwwwwwwww7C333swwwwwwwwwwwwwwwwwwwwwwwwww73swwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww3T433wwwwwwwwwwwwwwwwwwwwwwwwwwww3wwwwwwwwwwwwwwwwwwwwwwwwww7sw7sw3w3D3wwwwwwww3wwwww3wwwwwwww3wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwàîà34w347Cs73swwwwwww7Cswww7Cswwwwww7Cswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffvwwwwwwwwwwwwwwwîvwwwwwwwwwwwwwwwààvwwwwwwwwwwwwwwwvwwwwwwwwwwwwwww`f`fffff`ff`fffvwwwwwwwwwwwwwwwff`f`fff``f``ffff`fff`fffff``ff`ff`fff`f`fvwwwwwwwwwwwwwwwfff`f``fffff`ffff``ff`f```fff`f`````fvwwwwwwwwwwwwwwwffff`ff`fffff``ff`f`f`fff`f```vwwwwwwwwwwwwwww`f`f`ffffff`f```fffff`fff`ff`ff`f`ff```vwwwwwwwwwwwww33vwww7swwwwwww733f``f`f`f`ff`vwww34wwwwwww3C3ff`f`ff`fff`f``ff`f`fffffff`vww7CEswwwwww334´»´»»»D»D»»»»»»fff`f`ff`f`f`f```f````ff`f`f`vww7C4swwwww7343»K»»D»K»K»»»´´Df`ffff`f`ff`f```ff`f`fvwww33wwwwww73C3´D´»K´K»K»»»´´K`f`fffffff`f`ff```fff`ff`f`vwww7swwwwww333s´K»»´´K»K»»»´´´fvwwwwwwwwwww333s´K»»D´D´D´D´K»Dvwwwwwwwwwww7333»»»»»»»»»»»»»»»vwwwwwwwwwww7333»»»»»»´»´DK´K´Dvwwwwwwwwwwww333»»D»K´D»»´»K»´´fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffvwwwwwwwwwwww733»»K´´»´´´´»´»´´»´»´»»K»D»´´´´»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww33»»´´´»´´´´»K»´´»´»´D´K»´»´´D»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwÿwwwwwwwwwwwww73»»D´K´´´´DK´K´DKDK´»»»´´»K´K´»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwww7swwwwwwwwwwwwwwwwwwwwwwwwwwww÷ïwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwww34wwwwwwwwwwwwwwwwwwwwwwwwwwwwÿÞþswwwwwwwwwwwww»»K»´»»»»»»»»K»K´»»K´K´»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwww7CEswwwwwwwwwwwwwwwwwwwwwwwwwwwÿîÿ4wwwwwwwwwwwww»»D´»D´K´´´D´D»´´´´´»´´»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwww7C4swwwwwwwwwwwwwwwwwwwwwwww7sw÷ÿOEsww7swwwwwwww»»K»´D´´´D»»»K»´´K»D´´´»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwww33wwwwwwwwwwwwwwwwwwwwwwwww34wwÿC4sww34wwwwwwww»»K»´´´D»´»D´K»´´´´´´´´»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwww7swwwwwwwwwwwwwwwwwwwwwwww7CEsww33ww7CEswwwwwww»»»´´´´K´´»»»D´D»»»D´D»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7C4sww7sww7C4swwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww÷www33wwwwwwww33www7swww»»»»»´»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwÿþwww7swwwwwwww7swww34wwwK´D»K´»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww÷ïíwwwwwwwwwwwwwwww7CEsww´´´´´´»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww÷ïþwwwwwwwwwwwwwwww7C4swwD»´´´´»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww‡ˆˆˆwwÿÿwwwwwwwwwwwwwwwwww33wwwK´´´K´»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww‡xwwwˆw÷wwwwwwwwwwwwwwwwww7swww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxww÷wxwwwwwwwwwwwwwwwwwwwwwwww7»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww‡wwwÿþw‡wwwwwwwwwwwwwwwÿwwwwwwww3»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7swwxww÷ïíwxwwwwwwwwwwwww÷ïwwwwww7C»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwww34w‡www÷ïþw‡wwwwwwwwwwwwwÿþÿwwwwww7C»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwww7CEsxwwwwÿÿwwwxwwwwwwwwwwwwÿÿþwwwwwww3»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwww7C4sxwwwç÷~wwwxwwwwwwwwwwww÷ïíwwwwww7»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwww33‡wwwwîçîwww‡wwwwwwwwwwww÷ïþwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwww7swwwwwwwwwwwwwwwwwwwwwwwww7s‡wwww~îçwww‡wwwwwwwwwwwwwÿÿwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwww34wwwwwwwwwwwwwwwwwwwwwwwwwww‡wwÿw~wçwww‡wwwwwwwwwwwww÷wwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»www7CEswwwwwwwwwwwwwwwwwwwwwwwwww‡w÷ïçÿ~www‡wwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»www7C4swwwwwwwwwwwwwwwwwwwwwwwwww‡wÿÞþ~ÿçwww‡wwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwww33wwwwwwwwwwwwwwwwwwwwwwwwwww‡wÿîÿ~wçwww‡wwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwww7swwwwwwwwwwwwwwwwwwwwwwwwwww‡w÷ÿçç~w÷‡wwwwwwwwwwwwwwwwwwwwww3»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwÿwwwwwÿþxwwwwwwwwwwwwwwwwwwwww7C»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwww÷ïíwwwwwwwwwwwwwwwwwwwww3T»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww‡wwwwww÷ïþwwwwwwwwww3wwwwwwwwww3D»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwÿÿwwwwwwwwww7Cswwwwwwwww73»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww‡wwwwww÷wwwwwwwwww3T4wwwwwwwwww3»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww3wxwwwwwxwwwwwwwwwww3D3wwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7Cs‡xwwwˆwwwwwwwwwwww73swwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww3T4w‡ˆˆˆwwwwwwwwwwwwww3wwwww7swwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww3D3wwwwwwwwwwwwwwwwwwwwwwwww34wwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww73swwwwwwwwwwwwwwwwwwwwwwww7CEswwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww3wwwwwwwwwwwwwwwwwwwwwwwww7C4swwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww33wwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7swwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7swwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww34wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7CEswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7C4swwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww33wwwwwwwwwwwwwwwwwwwww7swwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7swwwwwwwwwwwwwwwwwwwww34wwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7CEswwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7C4swwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww33wwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7swwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwÿwwwwwwwwwwwwwwwwwwwwww3wwwwwwwwwwwwwwwwwwwwwwwwwwww3wwww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwww÷ïwwwwwwwwwwwwwwwwwwww7Cswwwwwwwwwwwwwwwwwwwwwwwwww7Cswww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwÿÞþwwwwwwwwwwwwwwwwwwww3T4wwwwwwwwwwwwwwwwwwwwwwwwww3T4www»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwÿîÿwwwwwwwwwwwwwwwwwwww3D3wwwwwwwwwwwwwwwwwwwwwwwwww3D3www»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwww÷ÿwwwwwwwwwwwwwwwwwwww73swwwwwwwwwwwwwwwwwwwwwwwwww73swww»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»wwwwwwwwwwwÿwwwwwwwwwwwwwwwwwwwwww3wwwwwwwwwwwwwwwwwwwwwwwwwwww3wwww¥T-- title: 11BFLY.EXE -- author: verysoftwares -- desc: for Bullet Hell Jam 6 -- script: lua -- saveid: 11BF -- achievement brainstorming: -- stagesel-specific -- keypress tutorial complete -- unlocks achievement system -- shoot red bullets and finish -- unlocks viewing saved configs -- achievement for saving x configs -- get soft-locked by emptying bullets with err_msg -- for any stage -- survive with n=100+ bullets on screen -- empty board without causing err_msg -- cause err_msg -- play with shutter=1 -- get multiple achievements at timer==0 -- for each stage -- unlock entire code -- change all variables -- (repeated) survive for x time with same config -- (means no shooting away bullets) -- show a timer for this one -- must change all variables first? -- maybe at least one -- and more points if more -- get points according to amt of bullets -- saves config in pmem -- (once seen, an achievement will be public elsewhere) -- stage-specific -- achievements are triggered with timer==0 -- stage2: for loop difference of over 30 -- basically requires setting multipliers to 0 -- stage3: n>=50 -- rewards -- skip having to reveal code when retrying stage -- unlocked by changing all variables in stage -- unlock saved config screen -- unlocked by shooting all red bullets in stagesel -- increase slowdown when no input given -- an editable variable in the stage select screen -- can't be shutter<=0 -- unlocked by causing err_msg outside of stagesel -- can graze bullets for score when timer is active -- editable graze radius? -- multiple shot directions -- unlocked with n>=50 in stage3 -- this might mess up variable changing though -- multiple lives -- unlocked by surviving with n=100+ bullets -- see hidden achievements -- unlocked by having x achievements t=0; tt=0 x=240/2+(240-136)/2 y=136/6*5 cos=math.cos; sin=math.sin; pi=math.pi poke(0x7FC3F,1,1) -- hide mouse cursor cooldown=0; maxcool=6 shutter=6 keylock=true timer=nil; maxtimer=10*60 function game() if TIC==game and (ss_cor or tt==0) then trace(string.format('quest=%d',quest)); questpop(quest); ss_cor=nil end local move=false if tt%shutter==0 then move=true end if not keylock and (TIC==game or TIC==stagesel) then if btn(0) then y=y-1; move=true end if btn(1) then y=y+1; move=true end if btn(2) then x=x-1; move=true end if btn(3) then x=x+1; move=true end if x<240-136+1 then x=240-136+1 end; if x>240-1 then x=240-1 end if y<0 then y=0 end; if y>136-2 then y=136-2 end if spoil>=#code and (btn(4) or btn(5)) then move=true end if move and cooldown>0 then cooldown=cooldown-1 end if spoil>=#code then if btn(4) and cooldown==0 then sfx(9,'D-5',20,2); table.insert(plrbullets,{id=86,x=x-1,y=y-8,dy=-2}); cooldown=maxcool; timer=nil; score=nil; poke(0x3FF8,0) end if btn(5) and cooldown==0 then sfx(9,'A-4',20,2); table.insert(plrbullets,{id=87,x=x-1,y=y-8,dy=-2}); cooldown=maxcool; timer=nil; score=nil; poke(0x3FF8,0) end if btnp(6) then sfx(6,'A-6',12,2); code_split.vars.i=code_split.vars.i-1; if code_split.vars.i<1 then code_split.vars.i=#code_split.vars end; vt=tt+1 end if btnp(7) then sfx(5,'A-6',12,2); code_split.vars.i=code_split.vars.i+1; if code_split.vars.i>#code_split.vars then code_split.vars.i=1 end; vt=tt+1 end end else local keylock2=false for i=0,7 do if btn(i) then keylock2=true; break end end if not keylock2 then keylock=false end end cls(7) rect(0,0,240-136,136/2,0) rect(0,136/2,240-136,136/2,11) -- music1 --for i=0,20 do --poke(0x0FF9C+i,tt//6) --end -- music2 --for i=0,80 do --poke(0x0FF9C+i,(tt+i)*2) --end oldblen=#bullets if move then if not pcall(spawn) then error=true if code==code0 then err_msg='\nInvalid stage.' end if code==code1 or code==code2 then err_msg='t%0' end if code==code3 then err_msg='i/0' end err_msg=err_msg or '\nUnknown error.' else error=false err_msg=nil end end if error then print(string.format('Error: %s',err_msg),0,lastty+6,15) end clip(240-136,0,240-(240-136),136) for i=#plrbullets,1,-1 do local b=plrbullets[i] spr(b.id,b.x,b.y,0) for i2=#bullets,1,-1 do local b2=bullets[i2] if math.sqrt(((b.x+1)-(b2.x))^2+((b.y+4)-(b2.y))^2)<4 then table.remove(plrbullets,i) table.remove(bullets,i2) if spoil>=#code then local i3=code_split.vars[code_split.vars.i] local n=code_split[i3] n=tonumber(n) if b.id==86 then n=n+1; sfx(7,'A-6',20,2); label('+1',b.x,b.y,15) end if b.id==87 then n=n-1; sfx(8,'B-6',20,2); label('-1',b.x,b.y,8) end code_split[i3]=tostring(n) merge_code() if ostage>0 and all_vars_changed() then unlock(1) end if ostage>0 and achi[ostage][1] then timerseen=true; timer=maxtimer; score=nil; poke(0x3FF8,4) end vt=tt+1 end break end end if move then b.y=b.y+b.dy end if b.y<=-8 then table.remove(plrbullets,i) end end for i=#bullets,1,-1 do local b=bullets[i] if move then b.x=b.x+b.dx; b.y=b.y+b.dy end if spoil<#code and math.sqrt((b.x-(x-2-1+1+1))^2+(b.y-(y-1-1+1+1))^2)<11 then if move and not b.graze then b.graze=true--; if spoil>=#code then code_split.vars.i=code_split.vars.i+1; if code_split.vars.i>#code_split.vars then code_split.vars.i=1 end end end if move then spoil=spoil+1; while string.sub(code,spoil,spoil)=='\t' do spoil=spoil+1 end; sfx(10,12*6+2+t%6,2,2) end if spoil>=#code then sfx(10,12*6+2+5,30,2) unlock(0); questpop(2) end circb(x-2-1+1+1,y-1-1+1+1,11,8) end local bsp=66 if b.graze then bsp=67 end spr(bsp,b.x-3,b.y-3,0) if b.x<=240-136-3 or b.y<=-3 or b.x>=240+3 or b.y>=136+3 then table.remove(bullets,i) end end if ostage>0 then local roby=136/2-12 if ostage==3 then roby=8 end local robsp=104 if robtick then robsp=104+3; robtick=robtick-1; if robtick<=0 then robtick=nil end end spr(robsp,240-136+(240-(240-136))/2-12,roby+math.sin(t*0.1)*3,0,1,0,0,3,3) end --print(#bullets,240-136,0) for sx=1,2 do for sy=1,2 do if not (pix(x-2-1+1+sx,y-1-1+1+sy)==7) then sfx(4,'D-4',50,2); ht=tt+1; poke(0x3FF8,0); music(); TIC=function() if tt-ht>50 then if btnp(4) or ostage==0 then pmem(0,ostage); reset(); return elseif btnp(5) then pmem(0,0); pmem(1,0); reset() end rect(240/2-8*7,136/2-8*2+4,8*14,8*3-4,0) rectb(240/2-8*7,136/2-8*2+4,8*14,8*3-4,6) print('Z to retry,\nX to select stage.',240/2-8*6,136/2-8*2+4+4,6) end; tt=tt+1 end end pix(x-2-1+1+sx,y-1-1+1+sy,15) end end spr(64+(t*0.1)%2,x-4,y-4,0) for i=#labels,1,-1 do local l=labels[i] print(l.msg,l.x,l.y,l.c) l.y=l.y-0.3 if tt-l.t>90 then table.remove(labels,i) end end -- informative elements local voffy=0 if vt then local vmsg=string.format('var%d=%s',code_split.vars.i,code_split[ code_split.vars[code_split.vars.i] ]) local tw=print(vmsg,0,-6,0,false,1,true) if code==code0 and TIC==stagesel and (((not tut.key1) and (not tut[1])) or (tut.key1 and ((not tut[4]) or (not tut[5])))) then voffy=8 end if y+4+1+voffy>136-4 then voffy=-16; if code==code0 and TIC==stagesel and not tut[0] then voffy=voffy-8 end end print(vmsg,x-tw/2+1,y+4+1+voffy,12-(tt*0.2)%4,false,1,true) if tt-vt>70 then vt=nil end end if timer then score=score or 0 if move then score=score+#bullets*10 end local tmsg=string.format('%.2d:%.2d',timer//60,math.floor(timer%60*100/60)) local tw=print(tmsg,0,-6,0,true) local toffy=14 if vt and tt-vt<=70 then toffy=14+6 end if y-8+toffy>=136-4 then toffy=-2-1 if voffy<0 then toffy=-8-2 end end if not (move and timer==1) then print(tmsg,x-tw/2+1,y-8+toffy,4,true) end --print(score,240-136+1,1,4) if move then timer=timer-1 end --timer=timer-1 if timer==0 then sfx(10,12*6+2+5,30,2) if not achi[ostage][2] then unlock(2) else for i,u in ipairs(ul[ostage]) do if u.run() then unlock(u.unlock); questpop(5) end end end timer=nil; score=nil; poke(0x3FF8,0) end end clip() print_code() print_achi() --print(var(2)) if move then t=t+1 end tt=tt+1 end labels={} function label(lmsg,lx,ly,lc) table.insert(labels,{msg=lmsg,x=lx,y=ly,c=lc,t=tt+1}) end bullets={} plrbullets={} function shoot(dx,dy,ox,oy) ox=ox or 0; oy=oy or 0 table.insert(bullets,{x=240-136+(240-(240-136))/2+ox,y=136/2+oy,dx=dx,dy=dy}) robtick=shutter-2 return bullets[#bullets] end function count(tbl) return #tbl end function start_stage() if not (TIC==stagesel) then return end sfx(10,12*6+2+5,30,2) ss_cor=coroutine.create(function() while #plrbullets>0 do table.remove(plrbullets,#plrbullets) coroutine.yield() end while #bullets>0 do table.remove(bullets,#bullets) coroutine.yield() end while spoil>0 do spoil=spoil-1 spoil=spoil-1 coroutine.yield() end end) TIC=function() game() if #bullets>0 then print(string.format('%d bullets',#bullets),240-136+1,0+1) end if tt%3==0 and not coroutine.resume(ss_cor) then prep(stage) end end end function spawn0() stage=1 if count(bullets)<=0 then start_stage() end end code0=[[ stage=1 if count(bullets)<=0 then start_stage() end ]] code0_split={ 'stage=','1','\n', 'if count(bullets)<=','0',' then','\n', ' start_stage()','\n', 'end', } function spawn1() if t%4==0 then local a=13.1 shoot(cos(t*a),sin(t*a)) shoot(cos(-t*a),sin(-t*a)) end end code1=[[ if t%4==0 then local a=13.1 shoot(cos(t*a),sin(t*a)) shoot(cos(-t*a),sin(-t*a)) end ]] code1_split={ 'if t%','4','==','0',' then','\n', ' local a=','13.1','\n', ' shoot(cos(t*a),sin(t*a))','\n', ' shoot(cos(-t*a),sin(-t*a))','\n', 'end', } zero=0 six=6 function spawn2() if t%six==zero then for i=0,5 do local a=t*10.4 shoot(cos(a-i*0.2), sin(a-i*0.2), cos(a+i)*i*6.1, sin(a+i)*i*6.1) end end end code2=[[ if t%six==zero then for i=0,5 do local a=t*10.4 shoot(cos(a-i*0.2), sin(a-i*0.2), cos(a+i)*i*6.1, sin(a+i)*i*6.1) end end ]] code2_split={ 'if t%six==zero then','\n', ' for i=','0',',','5',' do','\n', ' local a=t*','10.4','\n', ' shoot(cos(a-i*','0.2','),','\n', ' sin(a-i*','0.2','),','\n', ' cos(a+i)*i*','6.1',',','\n', ' sin(a+i)*i*','6.1',')','\n', ' end','\n', 'end', } one=1 twopi=2*pi function spawn3() if t%18==0 then local n=24 for i=one,n do local a=i/n*twopi local b,dist=t*0.15,68 shoot(cos(a),sin(a), cos(b)*dist, sin(b)*dist) end end end code3=[[ if t%18==zero then local n=24 for i=one,n do local a=i/n*twopi local b,dist=t*0.15,68 shoot(cos(a),sin(a), cos(b)*dist, sin(b)*dist) end end ]] code3_split={ 'if t%','18','==zero then','\n', ' local n=','24','\n', ' for i=one,n do','\n', ' local a=i/n*twopi','\n', ' local b,dist=t*','0.15',',','68','\n', ' shoot(cos(a),sin(a),','\n', ' cos(b)*dist,','\n', ' sin(b)*dist)','\n', ' end','\n', 'end', } function prep(n) spawn=_G[string.format('spawn%d',n)] code=_G[string.format('code%d',n)] code_split=_G[string.format('code%d_split',n)] code_split.vars={i=1} code_split.old={} for i,c in ipairs(code_split) do if tonumber(c) then table.insert(code_split.vars,i) table.insert(code_split.old,var(#code_split.vars)) --trace(code_split.old[#code_split.old]) end end TIC=game spoil=0 bullets={}; plrbullets={} keylock=true if n==0 then tut={} TIC=stagesel spoil=#code for mx=30,38 do for my=0,4 do if mget(mx,my)==66 then shoot(0,0,(mx-34)*8,-4*8+my*8) end if mget(mx,my)==67 then shoot(0,0,(mx-34)*8,-4*8+my*8).graze=true end end end end ostage=n t=0; tt=0 x=240/2+(240-136)/2 y=136/6*5 end function print_code() local tx,ty=0,0 local tc=12 if spoil<#code then for i=1,math.min(spoil,#code) do local char=string.sub(code,i,i) print(char,tx,0+ty,tc,false,1,true) if char=='(' or char==')' or char=='i' or char=='.' or char==',' then tx=tx+3 else tx=tx+4 end if char=='\n' then ty=ty+6; tx=0 end end else code_split.vars.i=code_split.vars.i or 1 for i2,c in ipairs(code_split) do tc=14 if tonumber(c) then tc=6 end for i3,v in ipairs(code_split.vars) do if v==i2 and not (var(i3)==code_split.old[i3]) then tc=1 end end if i2==code_split.vars[code_split.vars.i] and tt%20>=10 then tc=0 end for i=1,#c do local char=string.sub(c,i,i) print(char,tx,0+ty,tc,false,1,true) if char=='(' or char==')' or char=='i' or char=='.' or char==',' then tx=tx+3 else tx=tx+4 end if char=='\n' then ty=ty+6; tx=0 end end end end lastty=ty end function var(n) return tonumber(code_split[code_split.vars[n]]) end function all_vars_changed() for i,v in ipairs(code_split.old) do if tonumber(var(i))==tonumber(v) then return false end end return true end achi={} ul={ [0]={ [0]={run=function() return tut.key2 end,code='tutorial_done()',unlock=0}, }, [1]={ {run=function() return var(1)==1 and var(2)==0 end,code='var1==1 and var2==0'}, }, [2]={ {run=function() return var(2)-var(1)>=20 end,code='var2-var1>=20'}, }, [3]={ --{run=function() return var(1)==1 end,code='var1==1',unlock=3}, {run=function() return var(2)>=50 end,code='var2>=50'}, }, } function print_achi() local out='' local tmsg='' local tflash=achi2_ut and tt-achi2_ut<90 and (tt-achi2_ut)%20<10 if ostage>0 then if spoil>=#code then local a1=string.format('if all_vars_changed() then\n\t\tachi[%d][1]=true\n\t\ttimer=10*60\nend\n',ostage) if (achi1_ut and tt-achi1_ut<90 and (tt-achi1_ut)%20<10) then out=out..'\n\n\n\n' else if not achi[ostage][1] or (achi1_ut and tt-achi1_ut<90) then--or (achi1_ut and tt-achi1_ut<90 and (tt-achi1_ut)%20<10) then out=out..a1 end end else out=out..string.format('if code_seen() then\n\t\tachi[%d][0]=true\nend\n',ostage) end --spoil>=#code if timerseen then --out=out..'if timer==0 then\n' local a2=string.format('\t\tachi[%d][2]=true\n',ostage) if (achi2_ut and tt-achi2_ut<90 and (tt-achi2_ut)%20<10) then tmsg=tmsg..'\n' else if not achi[ostage][2] or (achi2_ut and tt-achi2_ut<90) then--or (achi2_ut and tt-achi2_ut<90 and (tt-achi2_ut)%20<10) then tmsg=tmsg..a2 end end end --timerseen end --ostage>0 for i=0,#ul[ostage] do local u=ul[ostage][i] if u then local tab='\t\t' if ostage==0 then tab='' end local an='' if ostage==0 or achi[ostage][2] then an=an..tab..'if '..u.code..' then\n' an=an..string.format(tab..'\t\tachi[%d][%d]=true',ostage,u.unlock) an=an..'\n'..tab..'end\n' end --if ul[ostage][u.unlock] and ul[ostage][u.unlock].ut and tt-ul[ostage][u.unlock].ut<90 and (tt-ul[ostage][u.unlock].ut)%20<10 then --tflash=true --end if (achi[ostage][u.unlock] and u.ut and tt-u.ut<90 and (tt-u.ut)%20<10) then tmsg=tmsg..'\n\n\n' else if not achi[ostage][u.unlock] or (u.ut and tt-u.ut<90) then tmsg=tmsg..an end end end end if ostage>0 then --trace(tt) --trace(tmsg) if #tmsg>4 and timerseen then out=out..'if timer==0 then\n' out=out..tmsg out=out..'end' end else out=out..tmsg end print(out,0,136/2,4,false,1,true) end function unlock(n) if not achi[ostage][n] then achi[ostage][n]=true if ostage==0 then ul[ostage][n].ut=tt+1; return end if n==1 then achi1_ut=tt+1; questpop(3) end if n==2 then achi2_ut=tt+1; questpop(4) end if n>2 then for i,u in ipairs(ul[ostage]) do if u.unlock==n then u.ut=tt+1; break end end end end end maxstage=0 repeat maxstage=maxstage+1 until not _G[string.format('spawn%d',maxstage+1)] for i=0,maxstage do achi[i]={} for i2,u in ipairs(ul[i]) do if i>0 then u.unlock=i2+2 else --u.unlock=i2-1 end end end function merge_code() -- for when the source code has updated local out='' for i,v in ipairs(code_split) do out=out..v end if spoil>=#code and not (#out==#code) then spoil=#out end _G[string.format('code%d',ostage)]=out code=_G[string.format('code%d',ostage)] -- there can be hidden code... out='' for i,v in ipairs(code_split) do out=out..v if code==code0 and i==3 then out=out..string.format('\nassert(stage>=1 and stage<=%d)\n',maxstage) end end -- load is the modern loadstring spawn=load(out) end tut={} tm=0; tc=0 function stagesel() -- music2 if not (peek(0x0FF8C+8)==0) then for i=0,80 do if tm<128*4 then poke(0x0FF9C+i,(tm+i)*2) else poke(0x0FF9C+i,(tm+i*(0.04-tc*0.24))*3) end end end tm=tm+1 local end_t=128*9+48 --if tc%2==0 then end_t=end_t+64; if tc==0 then end_t=end_t-16 end end if tm==end_t then tm=0; tc=tc+1 end game() print(string.format('%d bullets',#bullets),240-136+1,0+1) local key1=true for i=0,3 do if btn(i) then tut[i]=true end if not tut[i] then key1=false end end if key1 then tut.key1=true local key2=true for i=4,7 do if btn(i) then tut[i]=true end if not tut[i] then key2=false end end if key2 then tut.key2=true; unlock(0) end end if not tut.key1 then if not tut[0] then spr(102,x-4,y-4-8,0,1,0,0) end if not tut[1] then spr(102,x-4,y-4+8,0,1,0,2) end if not tut[2] then spr(102,x-4-8,y-4,0,1,0,3) end if not tut[3] then spr(102,x-4+8,y-4,0,1,0,1) end else if not tut[4] then print('Z',x-4-3,y-4+8+2,6) end if not tut[5] then print('X',x-4+3+3,y-4+8+2,6) end if not tut[6] then print('A',x-4-8,y-4,6) end if not tut[7] then print('S',x-4+8+3,y-4,6) end end end function questpop(qi) old_TIC=TIC music() if qi<5 then savestate(qi) end qt=0 keylock=true TIC=function() local qmsg='Whoops this isn\'t\nmeant to show up.' -- ...it did show up. if qi==1 then qmsg='Quest 1 of 4 -Know Your Enemy-\nGraze bullets to reveal their code!' end if qi==2 then qmsg='Quest 2 of 4 -Unstable Pattern-\nModify all variables!' end if qi==3 then qmsg='Quest 3 of 4 -Consequences-\nSurvive the modified pattern!' end if qi==4 then qmsg='Quest 4 of 4 -Lunatic Pattern-\nFulfill the special condition!' end if qi==5 then qmsg=string.format('Stage %d clear!\nX to select stage.',ostage) end local qtw=print(qmsg,0,-12) rect(240/2-qtw/2-4,136/2-8*2+4,qtw+8,8*3-4,0) rectb(240/2-qtw/2-4,136/2-8*2+4,qtw+8,8*3-4,6) print(qmsg,240/2-qtw/2,136/2-8*2+4+4,6) local keylock2=false for i=0,7 do if btn(i) then keylock2=true; break end end if not keylock2 and qt>=60 then keylock=false end if not keylock then for i=0,7 do if btn(i) then if qi<5 then TIC=old_TIC; if qi==1 then music(1) elseif qi==2 then music(2) elseif qi==3 then music(0) elseif qi==4 then music(3) end else pmem(0,0); reset() end end end end qt=qt+1 end end function savestate(qi) pmem(1,qi) if qi>=3 then for i=1,#code_split.vars do local diff=tonumber(var(i))-tonumber(code_split.old[i])+0.001 diff=math.floor(diff) if diff<0 then pmem(1+i,1000000+(-diff)) else pmem(1+i,diff) end trace(string.format('Saved pmem(1+%d)=%d',i,pmem(1+i))) end end pmem(0,ostage) trace(string.format('quest %d saved',qi)) end function loadstate() if pmem(0)>0 and pmem(1)>0 then quest=pmem(1); pmem(1,0) end if quest>=2 then spoil=#code achi[ostage][0]=true end if quest>=3 then achi[ostage][1]=true achi1_ut=tt-90 for i=1,#code_split.vars do trace(string.format('Loaded pmem(1+%d)=%d',i,pmem(1+i))) if pmem(1+i)>1000000 then code_split[code_split.vars[i]]=tostring(tonumber(code_split[code_split.vars[i]])+(-(pmem(1+i)-1000000))) else code_split[code_split.vars[i]]=tostring(tonumber(code_split[code_split.vars[i]])+pmem(1+i)) end pmem(1+i,0) end merge_code() timerseen=true if quest==3 then timer=maxtimer; score=0; poke(0x3FF8,4) end end if quest==4 then achi[ostage][2]=true achi2_ut=tt-90 end end --spoil=#code --trace(tonumber('d')) -- modify sound registers before starting... -- this improves the instruments! -- seems that this bleeds into waveform data... for i=0,80 do poke(0x0FF9C+i,(0+i)*2) end --sync(1<<3,0,true) --pmem(1,3) trace(string.format('pmem(0)=%d; pmem(1)=%d',pmem(0),pmem(1))) prep(pmem(0)) quest=1 loadstate() pmem(0,0) --trace(math.floor(1.15-0.15)) -- prints 0, wow -- Venn diagram for the devlog --[[TIC=function() cls(7) circb(240/2-42,136/2,56,8) circb(240/2+42,136/2,56,8) print('People who enjoy\nmessing around\nwith Lua code',28,136/2-9,4,false,1,true) print('People who enjoy\nbullet hells',155,136/2-6,4,false,1,true) print('TURBO\nNERDS',240/2-6*2*2.5,136/2-12,14,false,2,false) end]] -- itch banner --[[TIC=function() cls(7) rect(0,0,240,64-8*2,0) rect(0,64-8*2+8*5,240,136,0) for mx=30,38+10 do for my=0,4 do if mget(mx,my)==66 or mget(mx,my)==67 then spr(66,(mx-30)*8+240/2-4*8-5*8-4+1,0+my*8+24+16+8+1,0) end end end end]]