`ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""ffffffffffffffffffffffffffffffffÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ Ð Ð Ð Ð Ð ÐÝÝÝÝîîîîà Ðàààààîîîî""""!!!!!!!"""" E    01111222333445566778899:;<=>>?c<>????????????????????????????À?ÿ™™™™™™™™™™™ÿ™™™ùÿÿ™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yÿ™™ùÿ™ÿ™Ÿùÿ™ÿ™™™™™ÿ™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yÿ™™ÿùŸÿ™ŸÿùŸÿ™™™™ùŸ™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yÿ™™ÿŸ™ùÿ™ÿŸ™ÿ™™™ù™ÿ™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YÿÿŸùÿ™™Ÿ™ùÿ™ùÿ™™™ÿŸ™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™ÝÝÝÝÝÝÝÝ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™ÝÝÝÝÝÝÝÝ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™ÝÝÝÝÝÝÝÝ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™ÝÝÝÝÝÝÝÝ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™ÝÝÝÝÝÝÝÝ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™ÝÝÝÝÝÝÝÝ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™ÝÝÝÝÝÝÝÝ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™ÝÝÝÝÝÝÝÝ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™ÝÝÝÝÝÝÝÝ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™ˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™ˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™ˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™ˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™ˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™ˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆÝÝÝÝ݈ˆˆˆˆˆˆˆˆˆÝÝÝÝ݈ˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""""""""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""""""""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""""""""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîÕÝÝÝ݈ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™""""""""™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îîîîîîîîÝÝÝÝÝÝÝÝ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îîîîîîîîÝÝÝÝÝÝÝÝ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆîÝ™™ˆˆ™™Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆî݉ˆˆˆˆ˜Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆÝˆˆÝˆî݉ˆˆˆˆ˜Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆÝˆˆÝˆî݉ˆˆˆˆ˜Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆî݈ˆ™™"’Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆî݈ˆ™™’Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆî݈ˆ™™’Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆî݈ˆ™™"’Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆîÝ™™ÞíUÝ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆîÝ™™Žè•Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆîÝ™™îîÝÝ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îˆˆˆˆˆˆîÝ™™™™™™Ý™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îîîîîîîîÝÝÝÝÝÝÝÝ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™îîîîîîîîÝÝÝÝÝÝÝÝ™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Yîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî•™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™YB-- title: Patrick's Parabox demake -- author: Sava -- desc: Patrick's Parabox demake - 3rd revision, finally a complete one! -- license: MIT License -- version: 0.2 -- script: lua -- input: gamepad w=240 h=136 boxSize=40 levels = { { { { {2,2,2,2,2}, {2,0,0,0,2}, {2,0,0,1,2}, {2,0,2,0,2}, {2,2,2,2,2} } }, {1,3,2}, { {1,2,2,1}, {1,4,4,0} } }, { { { {2,2,2,2,2}, {2,0,0,5,2}, {2,2,2,0,2}, {2,0,0,4,2}, {2,2,2,2,2} }, { {2,0,2}, {0,0,2}, {2,2,2} }, { {2,2,2}, {6,0,2}, {2,0,2} }, { {2,2,2}, {2,0,0}, {2,2,2} } }, {1,2,4}, { {1,2,2,0}, {4,2,2,1} } }, { { { {2,2,2,2,2}, {2,0,4,5,2}, {2,0,0,0,2}, {2,0,0,0,2}, {2,2,2,2,2} }, { {2,2,2}, {0,0,0}, {2,2,2} }, { {2,2,2}, {2,0,0}, {2,0,2} } }, {1,2,3}, { {2,3,2,0}, {1,3,4,1} } }, { { { {2,2,0,2,2}, {2,0,0,0,2}, {0,0,2,3,2}, {2,2,0,0,2}, {2,2,2,2,2} } }, {1,2,3}, { {1,4,4,0}, {1,3,4,1} } }, { { { {2,2,2,2,2,2,2}, {2,0,0,2,2,2,2}, {2,1,0,2,3,2,2}, {0,0,0,0,0,0,2}, {2,0,0,0,0,0,2}, {2,0,7,0,0,0,2}, {2,2,2,0,2,2,2} } }, {1,3,4}, { {1,6,6,1}, {1,6,5,0}, {1,6,4,0} } }, { { { {2,2,2,2,2,2,2}, {2,0,0,0,0,0,2}, {2,0,0,0,0,0,2}, {0,0,0,0,4,2,2}, {2,0,0,0,0,0,2}, {2,0,0,0,0,0,2}, {2,2,2,0,2,2,2} }, { {2,2,2,2,2,2,2}, {2,0,0,0,0,0,2}, {2,0,0,0,0,0,2}, {2,2,3,0,0,0,0}, {2,0,0,0,0,0,2}, {2,0,0,0,0,0,2}, {2,2,2,2,2,2,2} } }, {1,3,2}, { {2,2,2,1}, {2,2,3,0}, {2,3,2,0} } } } boxes = {} targets = {} backwardLinks = {} player = {} prevMove = {dx=0, dy=0} animProgress = 0 level = 1 wonTmr = -1 undoStack = {} explosionTmr = -1 explosionPosX, explosionPosY = 0, 0 function parseLevel(level) undoStack = {} boxes = {} targets = {} backwardLinks = {} player = {} for idx, b in ipairs(level[1]) do boxes[idx] = {} for j=1, #b[1] do boxes[idx][j] = {} for i=1, #b do if b[i][j] ~= 0 then boxes[idx][j][i] = {type=b[i][j], prevBoxID=idx, prevX=j, prevY=i, anim=0, pushing=false} if b[i][j] > 2 and b[i][j] < 7 then backwardLinks[b[i][j]-2] = {boxID=idx, x=j, y=i, prevBoxID=idx, prevX=j, prevY=i, prevMove={dx=0, dy=0}} end else boxes[idx][j][i] = {type=0} end end end end player = {boxID=level[2][1], x=level[2][2], y=level[2][3], prevBoxID=level[2][1], prevX=level[2][2], prevY=level[2][3], anim=0} for i, b in ipairs(level[3]) do targets[i] = {boxID=b[1], x=b[2], y=b[3], type=b[4]} end end function BOOT() --trace("----------------start") parseLevel(levels[level]) end function TIC() if wonTmr < 0 then if explosionTmr < 0 then if btnp(0) then move(0, -1) end if btnp(1) then move(0, 1) end if btnp(2) then move(-1, 0) end if btnp(3) then move(1, 0) end end if btnp(4) then undo() end if btnp(5) then parseLevel(levels[level]) end end animProgress = animProgress + 0.1 if animProgress >= 1 then for boxID=1, #boxes do for i=1, #boxes[boxID] do for j=1, #boxes[boxID][i] do if boxes[boxID][i][j] ~= 0 then boxes[boxID][i][j].prevBoxID, boxes[boxID][i][j].prevX, boxes[boxID][i][j].prevY, boxes[boxID][i][j].anim, boxes[boxID][i][j].prevMove = boxID, i, j, 0, {dx=0, dy=0} end end end if backwardLinks[boxID] ~= nil then local l = backwardLinks[boxID] l.prevBoxID, l.prevX, l.prevY = l.boxID, l.x, l.y end end player.prevBoxID, player.prevX, player.prevY, player.anim = player.boxID, player.x, player.y, 0 prevMove = {dx=0, dy=0} animProgress = 0 end cls(0) draw() print("Level "..level) if explosionTmr > 0 then local t = time() - explosionTmr if t/20 < w+h then circ(explosionPosX, explosionPosY, t/20, 4) elseif 4-(t/20-(w+h))/25 > 0 then cls(4-(t/20-(w+h))/25) else cls(0) if 4-(t/20-(w+h))/25 < -4 then print("why", w/2-7, h/2-7, 15) print("Game over", w/2-23, h/2+25, 15) elseif 4-(t/20-(w+h))/25 < -3 then print("why", w/2-7, h/2-7, 15) elseif 4-(t/20-(w+h))/25 < -2 then print("wh", w/2-7, h/2-7, 15) elseif 4-(t/20-(w+h))/25 < -1 then print("w", w/2-7, h/2-7, 15) end end end if wonTmr > 0 and time() > wonTmr then if level < #levels then level = level + 1 parseLevel(levels[level]) wonTmr = -1 else cls(0) print("Congratulations!\nYou win!", w/2-50, h/2-10, time()/125) end end if level == 1 then print("Arrows to move\nZ/A to undo\nX/B to restart", 0, h-17) end end function undo() if #undoStack == 0 then return end local undoState = undoStack[#undoStack] boxes = undoState[1] backwardLinks = undoState[2] player = undoState[3] explosionTmr = -1 undoStack[#undoStack] = nil end -- MOVEMENT function move(dx, dy) undoPos = #undoStack+1 undoStack[undoPos] = {} undoStack[undoPos][1] = {} undoStack[undoPos][2] = {} animProgress = 0 for boxID=1, #boxes do undoStack[undoPos][1][boxID] = {} for i=1, #boxes[boxID] do undoStack[undoPos][1][boxID][i] = {} for j=1, #boxes[boxID][i] do if boxes[boxID][i][j] ~= 0 then boxes[boxID][i][j].prevBoxID, boxes[boxID][i][j].prevX, boxes[boxID][i][j].prevY, boxes[boxID][i][j].anim, boxes[boxID][i][j].prevMove, boxes[boxID][i][j].pushing = boxID, i, j, 0, {dx=0, dy=0}, false end undoStack[undoPos][1][boxID][i][j] = {type=boxes[boxID][i][j].type, prevBoxID=boxID, prevX=i, prevY=j} end end if backwardLinks[boxID] ~= nil then local l = backwardLinks[boxID] l.prevBoxID, l.prevX, l.prevY = l.boxID, l.x, l.y undoStack[undoPos][2][boxID] = {boxID=l.boxID, x=l.x, y=l.y, prevBoxID=l.boxID, prevX=l.x, prevY=l.y} end end player.prevBoxID, player.prevX, player.prevY, player.anim = player.boxID, player.x, player.y, 0 undoStack[undoPos][3] = {boxID=player.boxID, x=player.x, y=player.y, prevBoxID=player.boxID, prevX=player.x, prevY=player.y, anim=0} prevMove = {dx=dx, dy=dy} playerPush(player.boxID, player.x, player.y, dx, dy) local won = true for _, t in ipairs(targets) do if t.type == 0 and not (boxes[t.boxID][t.x][t.y].type == 1 or boxes[t.boxID][t.x][t.y].type > 2) then won = false elseif t.type == 1 and (player.x ~= t.x or player.y ~= t.y or player.boxID ~= t.boxID) then won = false end end if won then wonTmr = time()+500 sfx(2) end end function playerPush(boxID, x, y, dx, dy) if boxes[player.boxID][player.x+dx] == nil or boxes[player.boxID][player.x+dx][player.y+dy] == nil then local exitBoxID, exitX, exitY = backwardLinks[boxID].boxID, backwardLinks[boxID].x, backwardLinks[boxID].y if exitBoxID == nil then return end if push(exitBoxID, exitX+dx, exitY+dy, dx, dy) then player.boxID, player.x, player.y = exitBoxID, exitX+dx, exitY+dy player.anim = 1 sfx(0) end else if push(player.boxID, player.x+dx, player.y+dy, dx, dy) then player.x, player.y = player.x+dx, player.y+dy sfx(4) elseif boxes[player.boxID][player.x+dx][player.y+dy].type > 2 then if boxes[player.boxID][player.x+dx+dx] ~= nil and boxes[player.boxID][player.x+dx+dx][player.y+dy+dy] ~= nil and (boxes[player.boxID][player.x+dx+dx][player.y+dy+dy].type == 1 or boxes[player.boxID][player.x+dx+dx][player.y+dy+dy].type > 2) then local enterBoxID = (boxes[boxID][player.x+dx][player.y+dy].type-3)%4+1 local enterBoxSizeX, enterBoxSizeY = #boxes[enterBoxID], #boxes[enterBoxID][1] local enterX, enterY = 0, 0 if dx == -1 then enterX, enterY = 1, enterBoxSizeY//2+1 elseif dx == 1 then enterX, enterY = enterBoxSizeX, enterBoxSizeY//2+1 elseif dy == -1 then enterX, enterY = enterBoxSizeX//2+1, 1 elseif dy == 1 then enterX, enterY = enterBoxSizeX//2+1, enterBoxSizeY end --trace("test") local pushing = boxes[enterBoxID][enterX][enterY].pushing if pushing or push(enterBoxID, enterX, enterY, -dx, -dy) then swap(boxID, player.x+dx+dx, player.y+dy+dy, enterBoxID, enterX, enterY) boxes[enterBoxID][enterX][enterY].anim = 3 if not pushing then push(player.boxID, player.x+dx, player.y+dy, dx, dy) player.x, player.y = player.x+dx, player.y+dy sfx(4) end return end end local enterBoxID = (boxes[player.boxID][player.x+dx][player.y+dy].type-3)%4+1 local enterBoxSizeX, enterBoxSizeY = #boxes[enterBoxID], #boxes[enterBoxID][1] local enterX, enterY = 0, 0 if dx == 1 then enterX, enterY = 1, enterBoxSizeY//2+1 elseif dx == -1 then enterX, enterY = enterBoxSizeX, enterBoxSizeY//2+1 elseif dy == 1 then enterX, enterY = enterBoxSizeX//2+1, 1 elseif dy == -1 then enterX, enterY = enterBoxSizeX//2+1, enterBoxSizeY end if push(enterBoxID, enterX, enterY, dx, dy) then player.boxID, player.x, player.y = enterBoxID, enterX, enterY player.anim = 2 sfx(1) end end end end function push(boxID, x, y, dx, dy) --trace(boxID..", "..x..", "..y.." -> "..dx..", "..dy) if boxes[boxID][x] == nil or boxes[boxID][x][y] == nil then sfx(3) explosionTmr = time() local fr = posToFrame({sx=w/2-boxSize, sy=h/2-boxSize, ex=w/2+boxSize, ey=h/2+boxSize}, boxID, x-1, y-1) explosionPosX, explosionPosY = (fr.sx+fr.ex)/2, (fr.sy+fr.ey)/2 return false end if boxes[boxID][x][y].type == 0 then return true elseif boxes[boxID][x][y].type == 1 or boxes[boxID][x][y].type > 2 then boxes[boxID][x][y].prevMove = {dx=dx, dy=dy} boxes[boxID][x][y].pushing = true if boxes[boxID][x+dx] == nil or boxes[boxID][x+dx][y+dy] == nil then local exitBoxID, exitX, exitY = backwardLinks[boxID].boxID, backwardLinks[boxID].x, backwardLinks[boxID].y if exitBoxID == nil then return false end if push(exitBoxID, exitX+dx, exitY+dy, dx, dy) then swap(boxID, x, y, exitBoxID, exitX+dx, exitY+dy) boxes[exitBoxID][exitX+dx][exitY+dy].anim = 1 return true else return false end elseif push(boxID, x+dx, y+dy, dx, dy) then swap(boxID, x, y, boxID, x+dx, y+dy) return true else if boxes[boxID][x+dx][y+dy].type > 2 then local enterBoxID = (boxes[boxID][x+dx][y+dy].type-3)%4+1 local enterBoxSizeX, enterBoxSizeY = #boxes[enterBoxID], #boxes[enterBoxID][1] local enterX, enterY = 0, 0 if dx == 1 then enterX, enterY = 1, enterBoxSizeY//2+1 elseif dx == -1 then enterX, enterY = enterBoxSizeX, enterBoxSizeY//2+1 elseif dy == 1 then enterX, enterY = enterBoxSizeX//2+1, 1 elseif dy == -1 then enterX, enterY = enterBoxSizeX//2+1, enterBoxSizeY end if push(enterBoxID, enterX, enterY, dx, dy) then swap(boxID, x, y, enterBoxID, enterX, enterY) boxes[enterBoxID][enterX][enterY].anim = 2 return true end end end end return false end function swap(boxID, x, y, toBoxID, toX, toY) --trace(boxID..", "..x..", "..y.." <-> "..toBoxID..", "..toX..", "..toY) if boxes[boxID][x][y].type > 2 and boxes[boxID][x][y].type < 7 then local id = boxes[boxID][x][y].type-2 backwardLinks[id].x = toX backwardLinks[id].y = toY backwardLinks[id].boxID = toBoxID end boxes[toBoxID][toX][toY], boxes[boxID][x][y] = boxes[boxID][x][y], boxes[toBoxID][toX][toY] end -- DRAWING function draw() local frame = {sx=w/2-boxSize, sy=h/2-boxSize, ex=w/2+boxSize, ey=h/2+boxSize} local oldFrame = frame if player.anim == 1 and player.prevBoxID ~= player.boxID then oldFrame = parentFrame(player.boxID, backwardLinks[player.prevBoxID].x, backwardLinks[player.prevBoxID].y, frame) end if player.anim == 2 and player.prevBoxID ~= player.boxID then oldFrame = posToFrame(frame, backwardLinks[player.boxID].boxID, backwardLinks[player.boxID].x-1, backwardLinks[player.boxID].y-1) end --local prevBoxID, prevX, prevY = player.prevBoxID, player.prevX, player.prevY --local oldFrame = parentFrame(prevBoxID, prevX, prevY, {sx=w/2-4, sy=h/2-4, ex=w/2+4, ey=h/2+4}) drawSubBox(player.boxID, oldFrame, frame, 1, true) end function drawSubBox(boxID, oldFrame, frame, recurse, parentRec, clone) local drawFrame = lerpFrame(oldFrame, frame, animProgress) scaleSpr(boxID*8-8, 0, drawFrame.sx, drawFrame.sy, (drawFrame.ex-drawFrame.sx), (drawFrame.ey-drawFrame.sy)) if recurse <= 3 then if parentRec then --trace(#backwardLinks) local pos = backwardLinks[boxID] if pos ~= nil then local parentF = parentFrame(pos.boxID, pos.x, pos.y, frame) local oldParentF = parentFrame(pos.prevBoxID, pos.prevX, pos.prevY, oldFrame) drawSubBox(pos.boxID, oldParentF, parentF, recurse+1, true) end end for i=1, #boxes[boxID] do for j=1, #boxes[boxID][i] do local oldFrameB = posToFrame(oldFrame, boxID, i-1, j-1) if boxes[boxID][i][j].type ~= 0 then local prevBoxID, prevX, prevY, prevMove = boxes[boxID][i][j].prevBoxID, boxes[boxID][i][j].prevX, boxes[boxID][i][j].prevY, boxes[boxID][i][j].prevMove local bFrame = posToFrame(frame, boxID, i-1, j-1) if boxes[boxID][i][j].anim == 1 then --oldFrameB = posToFrame(posToFrame(oldFrame, prevBoxID, backwardLinks[prevBoxID].x-1, backwardLinks[prevBoxID].y-1), prevBoxID, prevX-1, prevY-1) oldFrameB = posToFrame(posToFrame(oldFrame, boxID, backwardLinks[prevBoxID].x-1, backwardLinks[prevBoxID].y-1), prevBoxID, prevX-1, prevY-1) elseif boxes[boxID][i][j].anim == 2 then oldFrameB = posToFrame(parentFrame(prevBoxID, prevX+prevMove.dx, prevY+prevMove.dy, oldFrame), prevBoxID, prevX-1, prevY-1) elseif boxes[boxID][i][j].anim == 3 then oldFrameB = posToFrame(parentFrame(prevBoxID, prevX, prevY, frame), prevBoxID, prevX-1, prevY-1) else oldFrameB = posToFrame(oldFrame, prevBoxID, prevX-1, prevY-1) end local drawFrameB = lerpFrame(oldFrameB, bFrame, animProgress) end drawBox(boxID, boxes[boxID][i][j].type, oldFrameB, posToFrame(frame, boxID, i-1, j-1), recurse) end end end for _, t in ipairs(targets) do if t.boxID == boxID then local trFrame = posToFrame(frame, t.boxID, t.x-1, t.y-1) local trOldFrame = posToFrame(oldFrame, t.boxID, t.x-1, t.y-1) local trDrawFrame = lerpFrame(trOldFrame, trFrame, animProgress) scaleSpr(t.type*8, 24, trDrawFrame.sx, trDrawFrame.sy, (trDrawFrame.ex-trDrawFrame.sx), (trDrawFrame.ey-trDrawFrame.sy)) end end if boxID == player.boxID then local prevBoxID, prevX, prevY = player.prevBoxID, player.prevX, player.prevY local plFrame = posToFrame(frame, player.boxID, player.x-1, player.y-1) local oldPlFrame = posToFrame(frame, prevBoxID, prevX-1, prevY-1) if player.anim == 1 then oldPlFrame = posToFrame(posToFrame(oldFrame, boxID, backwardLinks[prevBoxID].x-1, backwardLinks[prevBoxID].y-1), prevBoxID, prevX-1, prevY-1) elseif player.anim == 2 then oldPlFrame = posToFrame(parentFrame(prevBoxID, player.prevX+prevMove.dx, player.prevY+prevMove.dy, oldFrame), prevBoxID, prevX-1, prevY-1) else oldPlFrame = posToFrame(oldFrame, prevBoxID, prevX-1, prevY-1) end local drawPlFrame = lerpFrame(oldPlFrame, plFrame, animProgress) scaleSpr(16, 24, drawPlFrame.sx, drawPlFrame.sy, (drawPlFrame.ex-drawPlFrame.sx), (drawPlFrame.ey-drawPlFrame.sy)) end rectb(round(drawFrame.sx), round(drawFrame.sy), round((drawFrame.ex-drawFrame.sx)), round((drawFrame.ey-drawFrame.sy)), clone and 2 or 5) end function drawBox(boxID, type, oldFrame, frame, recurse) local newFrame = lerpFrame(oldFrame, frame, animProgress) if type > 2 then --local newFrame = {sx=frame.sx, ex=frame.ex, sy=frame.sy, ey=frame.ey} drawSubBox((type-3)%4+1, oldFrame, frame, recurse+1, false, type-2 > 4) elseif type ~= 0 then scaleSpr(boxID*8-8, type*8, newFrame.sx, newFrame.sy, (newFrame.ex-newFrame.sx), (newFrame.ey-newFrame.sy)) end end function scaleSpr(sx, sy, x, y, scaleX, scaleY) ttri(x, y, x+scaleX, y, x, y+scaleY, sx, sy, sx+8, sy, sx, sy+8, 0, 0) ttri(x+scaleX, y, x, y+scaleY, x+scaleX, y+scaleY, sx+8, sy, sx, sy+8, sx+8, sy+8, 0, 0) --print(sy, x, y) end function posToFrame(origFrame, boxID, i, j) local scaleX1, scaleY1 = i/#boxes[boxID], j/#boxes[boxID][1] local scaleX2, scaleY2 = (i+1)/#boxes[boxID], (j+1)/#boxes[boxID][1] local sx, sy = lerp(origFrame.sx, origFrame.ex, scaleX1), lerp(origFrame.sy, origFrame.ey, scaleY1) local ex, ey = lerp(origFrame.sx, origFrame.ex, scaleX2), lerp(origFrame.sy, origFrame.ey, scaleY2) return {sx=sx, sy=sy, ex=ex, ey=ey} end function parentFrame(boxID, i, j, subFrame) local scaleX, scaleY = (subFrame.ex-subFrame.sx), (subFrame.ey-subFrame.sy) local boxSizeX, boxSizeY = #boxes[boxID], #boxes[boxID][1] --trace(i*scaleX) --trace(subFrame.sy-(j-1)*scaleY) return {sx=subFrame.sx-(i-1)*scaleX, sy=subFrame.sy-(j-1)*scaleY, ex=subFrame.ex+(boxSizeX-i)*scaleX, ey=subFrame.ey+(boxSizeY-j)*scaleY} end function lerpFrame(frame, newFrame, t) return {sx=lerp(frame.sx, newFrame.sx, t), sy=lerp(frame.sy, newFrame.sy, t), ex=lerp(frame.ex, newFrame.ex, t), ey=lerp(frame.ey, newFrame.ey, t)} end function lerp(a, b, t) return a+(b-a)*t end function round(n) return (n+0.5)//1 end