0,]']±>Sï}WÿÍu§ðp8·d%qy;;p(5™O7¦ŠMj™G$u@GL Œÿÿÿÿÿÿÿÿ2Tv˜©»îÞͬ‰gE#2Tv˜ºÜþ2Tv˜ºÜþ°» ÀÀ˜fp€Y »»5"23 »»5"23@Tv˜ ÜîîàÞ«x0CUf‡˜ »ÜÞ¼i¬«š   """"""""" """" """"" ""03333333330033330033333033@DDDDDDDDD@@DDDD@@DDDDD@DDPUUUUUUUUUPPUUUUPPUUUUUPUU`fffffffff``ffff``fffff`ffpwwwwwwwwwppwwwwppwwwwwpww™™ ˆˆˆˆˆˆˆˆˆˆ™™™‰ˆˆ‰ˆˆ‰ˆˆ‰ˆˆ¨‰ˆˆ¨™™™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™ ˆˆ‘ˆˆ‘ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™ ™™™™™ ™™™™ ™™™™™™™™™  ªª ªªªªª ªª  ªª ªª  ªªªªª ªª °»» »»»»» »»°°»» »»°°»»»»»°»» ÀÌÌ ÌÌÌÌÌ ÌÌÀÀÌÌ ÌÌÀÀÌÌÌÌÌÀÌÌ ÐÝÝ ÝÝÝÝÝ ÝÝÐÐÝÝ ÝÝÐÐÝÝÝÝÝÐÝÝ àîîîîîîîîîààîîîîààîîîîîàîîðÿÿÿÿÿÿÿÿÿððÿÿÿÿððÿÿÿÿÿðÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‰ˆˆ¨‰ˆˆ¨‰ˆˆ¨‰ˆˆ¨‰ˆˆ¨‰ˆˆ¨‰ˆˆ¨‰ˆˆ¨ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‘ˆˆˆˆ‘ˆˆ‘ˆˆ‘ˆˆ‘ˆˆ‘ˆˆ‘ˆˆîÌÌìÎÌÌìÎìîîÎÌÌîîÌÌìîîÎìÎÌÌìÎÌÌîÎÌÌìÎÌÌìÎìîîÎÌÌìÎÌÌìÎìîîÎÌÌìÎÌÌìDÌÌLÄÌÌLÄLDDÄÌÌDDÌÌLDDÄLÄÌÌLÄÌÌDÄÌÌLÄÌÌLÄLDDÄÌÌLÄÌÌLÄLDDÄÌÌLÄÌÌL"ÌÌ,ÂÌÌ,Â,""ÂÌÌ""ÌÌ,""Â,ÂÌÌ,ÂÌÌ"ÂÌÌ,ÂÌÌ,Â,""ÂÌÌ,ÂÌÌ,Â,""ÂÌÌ,ÂÌÌ,ˆˆˆˆˆˆˆˆ‘ˆˆˆˆˆˆ‰ˆˆ¨‰ˆˆ¨‰ˆˆ‰ˆˆ‰ˆˆ‰ˆˆ‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ8ƒˆˆC4ˆ8DDƒˆC4ˆˆ8ƒˆˆˆˆˆÿððÿÿðððˆˆˆDˆˆHDˆˆD„3HDˆ3C„ˆ83ˆˆ»3ƒˆ»8ƒˆˆ†ˆDhˆ333î¾»»î¾»»3333»»»»»»»»»»»»»»»»3333»»»»»»» 33î3»ëî »»î»°ˆˆ »‹ˆ°¾»ˆëî ˆë¾°ˆ» »ˆ»°»ˆ »;ˆˆˆèfˆˆènˆˆènˆˆèˆnˆˆˆhˆˆˆhˆˆˆˆfænfæîîîîîîffFdfnDEfæTDfîNdîîîîîfVUåîî^Uæî^nfæVîînfffîfîîîæînîæîn戈f戈nn授ˆîŽˆˆîˆˆˆîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆwˆ(øwˆˆòwˆˆÿÿˆÿÿÿˆÿÿˆÿwÿw÷wÿˆÿwÿw‚ˆw/ˆˆÿÿˆˆÿÿÿˆÿ÷ÿˆÿwÿˆÿwwÿwÿxˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡ˆˆˆwˆˆˆˆˆHLˆˆÈLˆˆˆÈˆˆˆÈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆLDÌÄÌLÌÄÄLÌÄÄLÄLDÄÄ̈ÌÌ̈ÌÌ̈ȻÌÌÄÌÄÌÄÌÌÌÌÌÌÄDÌÌÄLLÄÌÌÌÌÌLÌÌÌļËDDĈÌÄ̈ÌÄ̈LLĈÄÄ„ˆLDŒˆL„ˆˆÌŒˆˆˆˆˆˆ³»ˆˆ³»ˆˆ33ˆˆ³»ˆˆ³»ˆˆ33ˆˆ³»»»»»»»ËÌ33ÃD»»»»»»33ÃD»»ÌÌ»»»»Ì»»»Ä333´»»»´»»»Ä333̼»»°»³ˆ³;»ˆ³³;ˆ3»³ˆ³;»ˆ³³;ˆ3»³ˆ³;»ˆˆˆˆˆˆˆˆˆˆˆXˆˆˆU…ˆXUUˆˆU…ˆˆXˆˆˆˆˆænfffænæhænfhfîîèVînˆXîfˆˆåfˆˆUfînînîNæfîNnnîTDîDUE„fTEˆfN†ˆfNŽˆ†ˆˆˆ†ˆˆˆ†ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆx‡ˆˆxˆˆˆxˆˆˆxˆˆˆx‡ˆˆxwˆˆxwˆˆˆˆˆÿ÷ÿˆ÷ÿˆÿÿÿˆÿÿÿˆˆ‡ˆ‡xwˆwˆˆˆˆˆˆˆÿÿˆÿ÷ˆÿÿÿˆÿÿÿˆˆxˆˆˆw‡xˆˆˆxˆˆˆˆxˆˆˆx‡ˆˆˆ‡ˆˆˆ‡ˆˆxwˆˆwwˆˆwwˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»Ìˆˆ‹ˆˆˆ‹ˆˆ¸‹ˆˆ»»ˆ¸»¸‹¸¸ˆ‹ˆˆˆˆÌÌ»‹ÌÌ»‹ˆˆˆ‹ˆˆˆ‹ˆˆ»»ˆ¸‹‹ˆˆˆ‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‹ˆˆˆ»ˆˆˆˆˆˆˆˆˆˆˆˆˆ³»ˆˆ33ˆˆããã³»ˆˆ³»ˆˆˆˆ»»»»3333»»»»¾»»ë333î»»»ë»»»»ˆˆˆˆ»»»ë333î»»»ë¾»»îî333¾»»»»»»»ˆˆˆˆ³³;ˆî»³ˆ³;Žˆ³³Žˆ3눈³‹ˆˆ³ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆVeˆˆ^eˆˆèUˆˆèVˆˆˆ^ˆˆˆXˆˆˆˆˆˆˆˆffŽˆf戈nfîˆˆŽˆˆˆŽˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆXUˆˆX…ˆˆX…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆU…XˆˆUX…ˆXˆ…ˆXwuˆwwUˆˆˆˆˆˆˆˆˆˆˆˆˆ…XUX…UˆXˆ…ˆWw…ˆUwwˆˆˆˆˆˆˆˆˆˆˆˆˆU…ˆˆX…ˆˆX…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆŒˆˆˆŒŒˆÈL̈ÈLDŒHLL̈ˆˆˆˆˆˆ‚ˆˆ""ˆˆ""ˆˆ",ˆÌÌ̈\Ì\Ì33̈ˆˆˆ(ˆˆˆ"ˆˆˆ"‚ˆˆ""‚ˆ,"ˆLÌÌLDÌÌDĈˆˆˆˆˆˆˆˆˆˆˆˆÈŒˆDDÄŒDÄD„LÌÌŒDÌL„ˆˆˆˆˆˆˆ¸ˆˆ¸»ˆˆ83ˆˆ»»ˆˆ»»ˆˆˆˆˆˆˆˆˆˆîî33îî»»>333»»»»»ËÌ»@DˆËÌ»ˆˆˆˆ333뾻㾠°îî°»ëî°»°»»»»ˆˆˆˆˆˆˆˆ»ˆˆˆ»‹ˆˆ»»‹ˆ»¾»ˆîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆfˆˆˆˆˆˆˆˆˆˆè戈næîînfènfæînîîfîîfˆˆˆˆˆˆˆˆnˆˆˆnæîˆfnæŽîîfæffîæfffˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîˆˆˆîˆˆˆn†ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUxwwWxG3wx7Ewx7Dwxwwwˆwwwˆ"gfˆ"wWuww‡w3t‡wTs‡wDs‡www‡wwwˆfv"ˆuWU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ…ˆˆXUˆˆˆUˆˆÄDÄÄÄLÄÄHDD̈HÄ̈ˆÌ̈ˆˆLˆˆˆHˆˆˆH333"Ì<3"Ì<""Ì"""L,Â"ÌÌÌÌÌÄÄÌLÄÌDÌLDDÌLLÄÂÌÌÌÂÌÌLÂÌÄÄÌÌÌÌÄÌÌÌÌÌLÄÌDÄŒÌDÌŒDÄLDDÌD„ÌDD„ÌDÈŒLĈˆŒˆÈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈˆHL»ˆ¸»»ˆ¸»»ˆ¸»»ˆ¸»»ˆ»ÌÈÌ `»» »»» »»» »»»»»»»»ÀÌ`»î»ˆ»»»ˆ°»»ˆ°»ˆ»»ˆÌˆÌ̼ˆÀ;ˆˆˆèfˆˆènˆˆènˆˆèˆnˆˆˆhˆˆˆhˆˆˆˆf6cff64æff3ffffffffffff"îf""îf"%f6cîîCcîf3ffffffînffânfî""æî%"fîn戈f戈ff授ˆîŽˆˆîˆˆˆîˆˆˆˆˆˆUˆˆ……ˆXUUˆU…UXU…ˆˆU…ˆˆˆ…ˆˆˆˆwUUøUˆ…Ruˆˆ_õ…ÿUUˆÿUUˆÿwõw÷wÿˆÿwÿwU…Uw/ˆXÿÿˆˆõÿÿˆU÷ÿˆ_uÿˆÿUwÿUÿx…ˆˆˆ…ˆ…ˆXU…ˆXUUˆˆUUˆˆˆ…ˆ‡ˆˆˆwˆˆˆˆˆˆHˆˆˆHˆˆˆÈˆˆˆÈˆˆˆˆˆˆˆˆˆˆ¸»ˆˆˆ»LDÌÄÌLÌÄÄLÌÄÄLÄLDÄÄ̈ÌÌ̈¼»Ìˆ»»ÌÌÄÌÄÌÄÌÌÌÌÌÌÄDÌÌÄLLÄÌÌÌÌÌLÌÌLļˌŒÌˆÌÌ̈ÌD̈LLĈÄÄ„ˆLDŒˆL„ˆˆÌŒˆˆˆˆÈ ˆˆ» ˆˆ»ˆˆˆˆ ˆˆ ˆˆˆˆ»»»»»»»»ËÌ03ÃD»»°»»3ÃD»»ÌÌ»»»»Ì»»»Ä333´»»´» Ä33̼ °³ˆ 0»ˆ °;ˆ°³ˆ;»ˆ³;ˆ»³ˆ;»ˆˆˆˆhˆˆˆhˆˆˆèˆˆˆnˆˆˆæˆˆèfˆˆhnˆˆnææf%UffUUffUUffVUææ&%æè&"ŽˆæfˆˆæfURfnUUffUUnnUUnî%ånˆ"âfˆffnŽˆ†ˆˆˆ†ˆˆˆfˆˆˆfˆˆˆn†ˆˆî†ˆˆè戈èfŽˆˆˆx‡ˆˆxˆˆˆxˆˆˆxˆˆˆx‡ˆˆxwˆˆxwˆˆˆˆˆÿ÷ÿˆ÷ÿˆÿÿÿˆÿÿÿˆˆ‡ˆ‡xwˆwˆˆˆˆˆˆˆÿUõˆ_Uõˆ_UUˆ_UUˆˆUˆˆˆw‡xˆˆˆxˆˆˆˆxˆˆˆx‡ˆˆˆ‡ˆˆˆ‡ˆˆxwˆˆwwˆˆwwˆˆˆˆˆˆˆˆ»»ˆˆˆ»ˆˆ¸‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»È¼»ˆˆˆˆˆˆ»ˆˆˆˆˆˆˆ¸ˆˆˆˆˆˆˆˆˆˆˆˆ»Ì»‹»Ì»‹»»»‹¸»‹ˆ»ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»ˆˆ33ˆˆëëã»»ˆˆ¸»ˆˆˆˆ»»»»3333»»»»¾»»ë333î»»»ë»»»»ˆˆˆˆ»»»ë333î»»»ë¾»»îî333¾»»»»»»»ˆˆˆˆ>³;ˆî»³ˆë;Žˆ;³Žˆ3눈;‹ˆˆ;ˆˆˆˆˆˆˆˆèn†ˆèˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆffˆˆnfˆˆè戈èfˆˆˆîˆˆˆèˆˆˆˆˆˆˆˆffŽˆf戈nfîˆˆŽˆˆˆŽˆˆˆˆˆˆˆˆˆˆˆˆnŽˆˆîŽˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÝ݈ØÝ݈HÝ݈HØÝˆˆˆØXUˆˆUU…ˆUUU…ˆEUUDETÝ„UTÝDETÝMDUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ…ˆˆˆUˆˆˆU…ˆˆUU…ˆˆHˆˆˆHˆˆDDDˆ„HHˆDHˆˆHDˆˆˆHDˆˆHH„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ8ˆˆˆ3ˆˆˆ3ˆˆˆ8ˆˆˆ8ˆˆˆˆˆ3ƒˆ33£ª38"¤ˆ""Eˆª""ƒˆ"’3ƒ¨"ˆˆˆˆ333ˆ233ƒ"ˆ8ƒ"‚ˆ3"""3)ˆ8ƒ‰ˆ3ˆˆˆˆwˆˆwwˆxwwˆxw‡ˆwwˆˆwwˆxw‡ˆxwˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆXˆˆHTˆHCTHDDTBDDTˆˆˆˆˆˆˆˆˆHDDDffDDJdt¤JdtDDfDDDFDˆˆˆˆˆˆˆˆ„ˆˆˆG„ˆˆwDˆˆwGˆˆwGˆˆDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈ̈ÈÌ̈ÈÌ̈ÌÌÌŒ]UÈÌÌ\ˆÌÌÌÌÌUUÌÌ\UÌÌÌ™ÌÌÌ™ÀÌ™ÕÝUˆÕBUˆÕ"UˆUUUŠUÝU…UÕÝ™™™ˆ‘™ˆ„Hˆ„„Hˆ„HDDˆˆHˆˆˆHˆˆˆHˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¨ˆˆˆ¨ˆˆˆªˆˆ¨ªˆˆªª¨ªª*ªªª*ª"ª*ª*ª"Šª""Ѝª*ˆ¨ª"ªˆˆˆªªŠˆªªªˆª¢ª¨¢¢ª*"ª¨"ªˆˆ(‚ˆˆwx‡ˆˆwˆˆˆ"ˆˆˆ'ˆˆˆ"‚ˆˆ'‚ˆˆ"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿˆøÿwøÿwGøwÌ$ø7ÄFøÿ$Ĉøÿÿˆèÿÿÿˆˆˆ÷ÿˆˆw÷ÿˆdw÷ˆÌ4÷ˆlôÿˆÿÿˆˆÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆHˆˆˆwˆˆHDˆˆØDˆˆØDˆˆÔMˆˆDMˆ8CÝBDCTrDDDrGDD""DCD'DDt'DDtrGDt"'DDªffEDDdEDJdUDJ¤TDJ¤DEDªDUEDCDUEDD„ˆDD„ˆFD„ˆFDˆˆfFˆˆDfˆˆª„ˆˆ¤…ˆˆˆÌ ÀÈÌ ÌÈÌ ÌÈÌ ÀÈÌ̈ÌÌ̈ÌÌ̈ÌÌÌÌÀÌ™ÌÌÌ™ÀÌ™ÌÀÌÀÌÌÌœÌÌ™ÌÌ™ˆQUHÑU…HÑ]UHÑÝUUÝ]U]UHDˆˆˆˆ„ˆˆˆD„ˆˆD„ˆˆ„ˆˆˆ…ˆˆˆ…ˆˆˆ„ˆˆˆˆˆ¢ªˆ¢¢Šˆªªˆ(ªŠˆˆ¨ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆª*ˆ¨ª*ˆØîíˆØî툨í툨êÞˆªÝÞ¨ªÝˆwªˆx‡îˆx‡ÞˆxˆÝŠwˆ­ªwˆ­ª‡ˆ¨ª‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøˆˆˆøˆˆˆÌˆˆˆÏˆèîîˆÿîîøÿÿÿÿÿÿÿ/o/oÿÿÿÿÌÌÌÌÿÿüÏîîþˆÿÿÿˆÿÿÿ/o/ÿÿÿÿÿÏÌÌÌÏÿÿüˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆŒˆˆˆˆˆˆˆ8CÔˆHDÔˆHDDˆH4CˆH4CˆˆDDˆˆHDˆˆHDDDtBMDtBÝDtrÔMD$DÝDDDDMD3DÔM3DDÝDDDUDDCDGDDDwBD4GBDDwrw„D""‚MDDˆ¥ˆˆˆ„ˆˆˆ„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌ̈Á\ˆ»[ˆˆ»»ˆˆ»»ˆˆ¸»ˆˆ¸»ˆˆˆˆU•UUUUU»»ˆˆ»»‹ˆ»»‹ˆ¸»ˆˆˆˆˆ$"ˆH3:ˆH¢ªˆH$2‹HDB»‹DD»‹ˆˆˆˆˆˆDˆˆˆBˆˆˆBˆˆˆDˆˆˆDˆˆˆ„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¨ˆˆˆ(ˆˆˆ(ˆˆˆ(¨ªÞí¨ªèݨªˆˆªªˆˆªª"x¢¢*rˆ‚ˆ"ˆ‚ˆˆ¨ªˆˆxªŠˆx§Šˆw¨ªª‡ˆªªˆ(¢"ˆ(‚(ˆˆ‚ˆˆˆˆˆˆˆˆˆˆˆˆˆ"ˆˆˆ*"ˆˆ‚(ˆˆ‚ˆˆˆ‚ˆˆˆˆˆˆÏˆˆˆÏˆˆˆÌˆˆˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÏüüÌÏÿüÿÏÌÌÌÿÿÿÿÿ/o/øÿÿÿˆˆˆˆˆˆˆˆÏÏüüÏÏÿüÌÏÌÌÿÿÿÿo/ÿÿÿÿˆˆˆˆˆˆˆˆˆŒˆˆˆˆˆˆŒˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDDDDDD3DˆH3„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÝMˆˆDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ8ƒˆˆ33ˆˆ33ˆˆ33ˆˆ33ˆˆ33ˆˆ33ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆXˆˆˆUˆˆXUˆXUUˆˆU…ˆXUUXUUUUUUˆUUTØUUÔÝUUÔMUÝÝMˆˆˆˆˆˆˆˆˆˆˆˆØÝ݈Ý݈Ý݈ÝMˆˆ„DˆˆUUU…UˆX…UˆX…X…U8ˆ…ˆ3ˆUˆ3ˆXˆ8ˆU…8ˆˆˆˆˆ3ƒˆ33£ª38"¤ˆ""Eˆª""ƒˆ"’3ƒ¨"ˆˆˆˆ333ˆ233ƒ"ˆ8ƒ"‚ˆ3"""3)ˆ8ƒ‰ˆ3ˆˆˆˆwˆˆwfˆxw†ˆxg†ˆwfˆˆgfˆxwgˆx‡hˆˆˆˆˆHD„ˆˆÄÌ(ˆHÌLˆÈÃLˆÄÌDˆÌÌ4ÈLÄ̈ˆˆˆˆˆˆˆˆˆˆDDÌL$ÃDÌÄÄdÌÌÄÌÌ4ÌLÌ̈ˆˆˆˆˆˆÈ„ˆˆHŒˆˆf̈HLÄ$DDÄDÄÌÌ,ˆÄˆˆˆˆÌˆˆˆÌ„ˆˆD„ˆˆÄDˆˆDL„ˆÌFŒˆDDŒˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ„ˆˆˆD„ˆˆˆˆˆˆˆˆˆDˆˆˆˆˆˆˆˆˆˆD„ˆˆHˆˆXˆˆHTˆˆCTˆˆ‘™ˆˆˆˆˆˆˆˆˆHDDDffDDJdt¤JdtDfDFDˆˆˆˆˆˆˆˆ„ˆˆˆG„ˆˆwDˆˆwGˆˆwGˆˆDDˆˆˆ33ˆˆ33ˆˆ8ƒˆˆˆˆˆˆˆˆˆˆ8ƒˆˆ8ƒˆˆˆˆˆˆUÝ]ˆU"]ˆUB]¨UUUX%"U("RUˆ™™™ˆ‘™UÕȈÅÌŒˆÌÌÌŒUÅÌÌU¼Ëƙ̻ę̴ËÉÌÌdD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌŒˆˆ¼ÌŒˆ´ÌŒˆ¼Ì̈ˆ……ˆˆ……ˆXUUˆXˆˆ¨XUˆ¨ˆXˆ¨ˆUˆªˆU¥ªˆˆªª¨ªª*ªªª*ª"ª*ª*ª"Šª""Ѝª*ˆ¨ª"ªˆˆˆªªŠˆªªªˆª¢ª¨¢¢ª*"ª¨"ªˆˆ(‚ˆˆwx‡ˆˆwˆˆ†"ˆhˆ'ˆˆ†"‚†ˆ'‚ˆˆ"ˆˆˆˆˆˆˆˆLĈˆÌ̈ˆFÄ„H4Ä„ÈÌÌ„ˆLLˆˆÌ„ˆˆˆˆ„ÄLÄÄHDÄÄøÏÌLøw'LøwGDøÿwĈøÿÏ„èÿÿLLˆˆDüˆˆÌ÷ÿˆ|w÷ˆ|wôˆ|÷ÿˆÿÿˆˆOÄ̈ˆÈLˆˆHD„ˆDÄŒˆ$LDˆDÌBˆÌÄDˆÈÌDˆˆDˆˆ„ˆˆˆHˆˆØˆˆØDˆˆÔMˆˆDMˆ8CÝ™™™‘™™™™™‘)D‘)t™™t™™t"™™af™Ad™™Ad™™¤™¡™"‘™B™™™™DD„ˆDD„ˆFD„ˆFDˆˆfFˆˆDfˆˆª„ˆˆ¡…ˆˆˆˆˆˆˆˆˆHˆˆHDˆˆHDˆˆˆHˆˆˆXˆˆˆXˆˆˆHˆ„U„XU„UÕUUÝUÕÝUÕD„ɼGGɼ»4™Ì´v‘ÌÌD‘ÉÌ;‘ÉÌÌ‘ÌL™ÉÄ»Ë̈»ÌÌŒÇÌŒKËÌŒK»»ŒKL̈+l̈LÄŒˆˆX¢ªˆ¢¢Šˆªªˆ(ªŠˆˆ¨ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆª*ˆ¨ª*ˆØîíˆØî툨í툨êÞˆªÝÞ¨ªÝˆwªˆx‡îˆx‡ÞˆxˆÝŠwˆ­ªwˆ­ª‡ˆ¨ª‡ˆˆˆhˆˆˆˆˆˆhˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆhˆˆˆˆˆˆˆˆˆˆHˆˆhˆˆˆˆˆ„ˆˆˆˆøˆˆˆøˆˆˆÌˆˆˆÏˆèNîˆÿîîøÿÿÿÿÿÿÿ?_?_ÿÿÿÿÌÌÌÌÿÿüÏîîþˆÿÿÿˆÿÿÿ?_?ÿÿÿÿÿÏÌÌÌÏÿÿüHD„ˆˆˆˆˆˆˆˆˆˆ‚„ˆˆˆˆ(ˆˆˆˆŒˆˆˆˆˆˆˆ8CÔˆHDÔˆHDDˆH4CˆH4CˆˆDDˆˆHDˆˆHDDD™MD™ÝDt™ÔMDDÝDDDDMD3DÔM3DDÝ™™™™™™™™™™™‘™™—™™wˆD"‚ˆMD„ˆ¡ˆˆˆˆˆˆ„ˆˆˆˆˆDˆˆˆˆˆˆˆˆˆˆDˆˆˆD„ˆˆˆˆDˆˆˆ$ˆˆˆ$ˆˆˆDˆˆˆDˆˆˆHˆˆˆˆˆˆˆˆ"Bˆ£3„ˆª*„ˆ#B„ˆ$D„¸DD¸»ˆˆ¸»ˆˆˆˆ™)»»»»ˆˆ»»ˆ¸»‹D¸ˆˆˆˆIA‚ˆˆˆ»´ˆˆ»²ˆˆ»´Hˆ»‹‚ˆ»KD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¨ˆˆˆ(ˆˆˆ(ˆˆˆ(¨ªÞí¨ªèݨªˆˆªªˆˆªª"ˆ¢¢*rˆ‚ˆ"ˆ‚ˆˆ¨ªˆˆxªŠˆx§Šˆw¨ªªwˆªª‡(¢"‡(‚(ˆˆ‚ˆˆˆˆˆˆˆˆˆˆˆˆˆ"ˆˆˆ*"ˆˆ‚(ˆˆ‚ˆˆˆ‚ˆˆˆˆ„ˆÏ(ˆˆÏˆˆˆÌˆˆˆøˆˆˆˆˆˆ„ˆˆˆˆˆˆˆˆˆÏüüÌÏÿüÿÏÌÌÌÿÿÿÿÿ?_?øÿÿÿˆˆˆˆˆˆˆˆÏÏüüÏÏÿüÌÏÌÌÿÿÿÿ_?ÿÿÿÿˆˆˆˆˆˆˆˆˆŒˆHˆˆˆˆŒ(ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆHˆˆˆˆˆˆˆˆˆDˆHˆˆˆHˆˆˆD„ˆˆH„ˆˆD„ˆˆˆˆˆˆˆˆˆDDDDDD3DˆH3„ˆˆˆˆˆˆˆˆ„HDˆˆHDˆˆˆDˆÝMˆˆDˆˆˆˆˆHDˆHDDˆDD„ˆH„ˆˆˆˆˆˆˆˆˆˆH„ˆˆH„ˆˆˆˆˆˆˆˆˆˆHˆˆˆH„ˆˆHD„ˆˆH„Æ~ #$"111!% ¤  0>=; 0 : 0 08 0 6 0 60567:<>??????????1   000<<        p p p pppp p pp #p#`#`/`/p/p/p(p(p(p'p/p/p/p,p-p-p/p/p/p/p p!p"p"p/p$p$p#p/p 1?????????????????????????????0>=; 0 : 0 08 0 6 0 60567:<>?<<< ; ;=???0$àä           e       ` g g jij{~puŒŠ‡ † … €€€€ ‰ ˆ‡†€€„€ƒ€‰ˆ‡€†€‹ŽLKðIpH Vet¢°ÁÐ@HG××ÀÈIPj› ¼ÍÞ¿s ÿ~~xww&v u 5 u t tw ttt|à{z6)HzI|[vlwlxxxxwpAõùðù# PP PP 00 0 0  fÓÉ&À?ˆˆˆDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ(‚ˆ(""(‚((""(‚ˆˆˆˆHDˆˆˆˆˆˆˆˆˆˆˆˆˆˆŽîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîáîî(‚ˆ(‚ˆ(‚((‚ˆ(‚ˆˆˆˆD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî(‚ˆ("‚(‚(("‚(‚ˆˆ3HDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî(‚ˆ(‚ˆˆ"‚(‚ˆ(‚ˆˆ3C„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€áîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî(""(""ˆ(ˆ(""(""ˆ83ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»3ƒˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»8ƒˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ3ˆˆˆˆ„HDDáîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîDDDDHˆˆˆ"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ3ˆˆˆˆDHDDDDD43îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîDDDDDˆˆˆ("ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ3ˆˆˆHHˆDDDDD43áîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîDDDDDˆˆˆˆ"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ3ˆˆˆHˆ„DDDDD43îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî0DDDDDˆˆˆˆ"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ33ƒˆHHˆDDDDD43áîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî4DDDDDˆˆˆ("‚ˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™™ˆ4ˆCDDDD43Dîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî@4DDDDD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™ˆˆ˜DD™™™™™™™ˆ4ˆCDDDD43DáîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîD4DDDDD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™ˆˆˆˆDD™™™™™™™ˆ4ˆCDDDD43DDîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî@D4DDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™ˆˆˆˆDDD™™™™™™™ˆ48CDDDD43DDáîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîDD4DDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™‰ˆˆˆˆDDD™™™‘™H„H43DDD43DDDîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîDDD4DDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™‰ˆˆˆDDDˆ™™™‘™ˆˆD43DDD43DDDDáîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî@DDD4DDDDD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™ˆˆˆˆDDDˆ˜™‘™ˆHD43DDD43DDDDáîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîDDDD4DDDDD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™33ˆDDDˆˆ˜™‘™ˆˆD43DDD43DDDDDîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî@DDDD4DDDDDˆˆˆ8338ƒ883ƒˆˆˆˆˆˆˆ‰33ˆDDDˆˆˆ™™‘™D„HDD3DD43DDDDDáîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîDDDDD4DDDDDˆˆˆ8ƒˆ8ƒ88ƒ8ˆˆˆˆˆˆˆ‰333DDˆˆˆˆ™™‘™HDHDD3DD43DDDDDDîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî@D4DDD4DDDDDˆˆˆ83ƒˆ3ƒ8ƒ8ˆˆˆˆˆˆˆ‰333DDˆˆˆˆ™™‘™ˆDˆDD3DD43DDDDDDDÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@DD4DDD4DDDDDˆˆˆ8ƒˆ8ƒ883ƒˆˆˆˆˆˆˆ‰ˆ333ˆˆˆˆˆ™™‘™HHˆDD3DD43DDDDDDDÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝDDD44DD4DDDDDHˆˆ8338ƒ88ƒˆˆˆˆˆˆˆˆ‰ˆ333ˆˆˆˆˆ™‘D„ˆDDDD433DDDDDDDDÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@DDDD3DD4DDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™»»333ˆˆˆ˜™‘D„ˆDDDD433DDDDDDCDÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝDDDDD34D4DDDDD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™»»333ˆˆˆ˜™™™™™™H„„DDDD433DDDDDDCDDÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@DDDDD33D4DDDDD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™»»ˆ33ˆˆˆ™™™™™™™HˆˆDDDD433DDDDDDCDDÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@DDDDDD3D3DDDDDDˆˆˆ3ƒˆˆˆˆˆˆˆˆˆˆˆˆˆ™»»ˆ33ˆˆˆ™™™™™™™ˆ‚(DDDD433DDDDDDDDDÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@DDDDDD343DDD"""ˆˆ8ƒ3ˆˆˆˆˆˆˆˆˆˆˆˆˆ™™ˆˆˆˆˆˆ˜™™™™™™™(ˆ("DDDDDD4DD@ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@@DDDDDDC43"""""‚ˆˆ838ˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™ˆˆˆˆ˜™™™™™™™™ˆˆ""DDDDDD4CD@ÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝD@DDDDDDD43"""""‚‚ˆ8ƒ8ˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™ˆˆ˜™™™™™™™™™ˆˆ""BDDDDD4CD@DÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@D@DDDDDDD4"""""ˆ‚ˆˆ3ƒˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™™(‚(""BDDDDDCD@DÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝDD@DDDDDDD"""""(ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™™""BDDDD4D@DDÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@DD@DDDDDD"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™™ˆ"""DDDD4D@DDDÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@DCD@DDDDD"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™™™™ˆ!"""DDD4D@DDDÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝDDCD@DDDD$"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªªªªªªªªªªªªªªªˆ!"""DDDD@DDDDÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@DD3D@DDD$""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªªfˆˆ¨DDªªªªªªª„DˆDDDDD43!"""DDD@DDDDÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝADD4D@DD$""DDDDD„DˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªªfˆˆˆDDªªªªªªªHHˆDDDDD43!"""D4@DDDDAÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@ADD4C@D$"""DDDDD„HˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªfˆˆÌ33DªªªªªªªDHˆDDDDD43!"""4@DD4DAÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝDADDDC@D"""4DDDDDDˆˆx‡xxwwx‡xxw‡ˆˆˆˆªŠfˆˆÌ33Dªªª*"¢ªDHHDDDDD43DD!""2@DD4DADÑÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ@DADDDC@"""D4DDDDDD„ˆxwxx‡ˆx‡xˆwˆˆˆˆˆªŠˆˆˆwÌ3ˆªªª*"¢ª„„8CDDDD43DDD!""@DDDDADDÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ@DDADDDD ""ADD4DDDDDDˆˆxwwxw‡ˆw‡ˆwˆˆˆˆˆªˆˆˆˆwÌ3ˆ¨ª*""¢ªˆˆ3CDDDD43DDDD"@DDDCADDÀÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌD4DADDDD "ADDD4DDDDD„H„x‡wx‡ˆx‡xˆwˆˆˆˆˆªˆˆˆ»»ẅ¨ª*""¢ªˆ83CDDDD43DDDDD BDDCADDÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ D4DADDD" ADDDD4DDDDD„D„x‡xxwwx‡xˆwˆˆˆˆˆŠˆˆˆ»»ẅˆªª*"¢ªˆˆ3CDDDD43DDDDDD "BDDADDÀÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌDDDADD""DDDDDD4DDDDDˆDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆŠˆˆ»»»ˆˆˆˆªª*"¢ªDˆH43DDD43DDDDDDD""B4AD4DÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ @DDCAD""DDDDDDD4DDDDDˆ„„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆŠˆˆ»»»ˆˆˆˆªª*"¢ªH„H43DDD43DDDDDDDDD"4AD4DÀÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌDDD3A$"@DDDD4DDD4DDDDDˆH„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆŠˆ»»»ˆˆˆfˆªª*"¢ªˆ„ˆ43DDD43DDDDDDDDDADDDDÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ @DDD4!"@DDDD4DDD4DDDDDˆH„ˆfˆhfˆhfˆˆˆˆˆˆˆˆŠˆ»»»ˆˆˆfˆª*"""¢Hˆ„43DDD43DDDDDDCDD@!DDDD°»»»»»»»»»»»»»»»»»»»@DDDD!A@DDDD4DDD4DDDDDHH„hfˆfh†fh†ˆˆˆˆˆˆˆª»»»ˆˆˆfˆ¨ª*"""¢D„„43DDD43DDDDDDCDD@D!"DDCD±»»»»»»»»»»»»»»»»» DDDD$DD@DDDDD3DD4DDDDDˆˆ„ˆfˆf††f††ˆˆˆˆˆˆˆª»»»ˆˆˆfˆ¨ªªªªªªD„„DD3DD43DDDDDDCDD@DD"BDDDD»»»»»»»»»»»»»»»»»@DDD$"DDD@DDDDD3DD4DDDDD„Hˆˆfˆfˆ†fˆ†ˆˆˆˆˆˆˆª»»ˆˆˆˆˆˆªªªªªªªHˆ„DD3DD43DDDDDD4CD@DDDD"DDDD±»»»»»»»»»»»»»»» DDDD"DDDD@DDDDD3DD4DDDDD„ˆ„hf†hfˆhfˆˆˆˆˆˆˆˆª»»ˆˆˆˆˆˆªªªªªªªˆ„ˆDD3DD43DDDDDD4CD@DDDDABDDD°»»»»»»»»»»»»»»»DDDDAADDCD@DDDDDC3D4DDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªˆˆˆˆˆˆ¨ªªªªªªªH„HDD3DD43DDDDDD4CD@DDDDAD"1DD¤ªªªªªªªªªªªªªª DDD"ADADDCD@DDDDDD3D4DDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªª("‚""¢*"ªªªªªDˆHDDDD433DDDDDDDCD@DDDDADDDD¤ªªªªªªªªªªªªª0DD!ADDADD4D@DDDDDD3D4DDDDD„H„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªª¢‚ˆ"ªª"*¢ªªªªˆˆDDDDD433DDDDDDD4D@DD4DADD"D„˜‰ˆˆˆˆˆˆˆˆˆˆˆ 44$D4DADD4D@DDDDDD343DDDDD„DHˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆª"¢*"ª""ª"¢¢ªªªªˆHDDDDD433DDDDDDD4D@DD4DADDD"¤Š¨ªŠªªš¨ªª¨ªªH4$DD4DADD4C@DDDDDDD43DDDDDˆ„Dˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªªª¢¢ª*¢"ª¢ªªªªˆˆDDDDD433DDDDDDD4D@DD4DADDDD´‹¸»›º»›¨»»©»»H4DDDDDADDDC@DDDDDDD43DDDDDHˆDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªª""ª""ª*"ªªªªª(‚("DDDDDDDD4@DDDCAD4DDD‚ˆˆˆ™ˆˆ˜ˆˆˆ‰ˆˆH4DDDDDDADDDC@DDDDDDD43"""""ˆ‚‚ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆªªªªªªªªªªªªªªªª‚"(""BDDDDDD4@DDDCAD4DCDD±‹¸»›º»›¨»»©»»HDDDDDDCADDDD@DDDDDDD"""""ˆ"(ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»»»»»»»»»»»»»‚"ˆ"""""""DD4@DDD4ADDDCDD´‹¸»‹º»«¨»»¨»»(1DDDDDDCADDDD@DDD""""""""ˆ‚‚ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»»»»»»ˆ"ˆ"""""""""@DDD4ADDDDDD´‹¸»›º»«¨»»©»»H4DDDDDD4ADDDD """""""""""ˆ‚"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»»»»»»ˆˆ"""""""" ""ADDDDDD´‹¸»‹º»«¨»»¨»»H4DDDDDD4!"""" """"""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»"3"»»»»»»»»ˆ""""" ""!""D4DD´‹¸»›º»«¨»»©»»H44DDD""!"""" """""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»‹»"3"»»»»;3³»ˆ!""""B´‹¸»›º»«¨»»©»»H44"!"""!"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»‹"333"»»»;3³»ˆ""²‹¸»›º»«¨»»©»»("ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»ˆ"333"¸»;33³»„DHD±‹¸»›º»«¨»»©»»ADDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»ˆ»"3"»¸»;33³»H„HDDDDD43DDDDDDDDD@DDDDADDDDDD´‹¸»‹º»«¨»»¨»»H4DDDDDDDADDDD@DDDDDDDD4DDDDD„ˆDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‹ˆ»"3"»ˆ»»;3³»ˆˆDDDDDD43DDDDDDDDD@DDDDADDDDDD´‹¸»‹º»«¨»»¨»»H4DDDDDDDADDDD@DDDDDDDD4DDDDD„H„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‹ˆˆ"3"ˆˆ»»;3³»ˆˆDDDDDD43DDDDDDDDD@DDDDADDDDDD´‹¸»‹º»›¨»»¨»»H4DDDDD4DADDCD@DDDDDDDD4DDDDDˆHˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‹ˆˆ"3"ˆˆ»»;3³»HˆHDDDDD43DDDDDDCDD@DDDDAD4DCDD´‹¹»‹º»›¨»»¨»»I4DDDDD4DADDCD@DDDDDDDD4DDDDDHˆ„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‹ˆˆ"3"ˆˆ»»;3³»ˆ„8CDDDD43DDDDDDCDD@DD4DAD4DDDD´‹¸»‹º»›¨»»¨»»1DDDDDDDADDCD@DDDD4DDD4DDDDDHHDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‹ˆˆ"3"ˆˆ»;333³HˆˆCDDDD43DDDDDDCDD@DD4DADDDDDD˜ˆˆˆˆˆˆˆˆˆˆˆˆ4DDDDDDADD4D@DDDD4DDD4DDDDDHHDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»ˆˆˆ"ˆˆ¸»;333³H„ƒCDDDD43DDDDDD3CD@DD4DADDD4D€ˆˆ˜™™™™™™™™™ˆDDDDCADD4D@DDDD4DDD4DDDDDHˆ„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»ˆˆˆ"ˆˆ¸»»»»»»H„ˆCDDDD43DDDDDD4CD@DDDCADDD€ˆˆˆˆˆˆˆˆˆˆˆˆˆADDCADD4D@DDDDDCDD4DDDDDˆHˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»‹ˆˆˆˆˆˆ»»»»»»»H„ˆ43DDD43DDDDDD4CD@DDDCADDˆˆˆˆˆˆˆˆˆˆ€€DD4ADDDC@DDDDD3DD4DDDDD„H„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»‹ˆˆˆˆˆˆ»»»»»»»ˆHˆ43DDD43DDDDDD44D@DDD4Aˆˆˆˆˆˆ€ˆˆˆ4ADDDC@DDDDD3DD4DDDDD„ˆDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»ˆˆˆˆˆˆ¸»»»»»»»ˆDˆ43DDD43DDDDDDD4D@DDD4ˆˆˆ€ˆˆˆˆˆˆˆˆADDDD@DDDDD3DD4DDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»83ƒ8³»3³»»»»»ˆDH43DDD43DDDDDDD4D@DD‘‰˜™™™™™™™™™™™(DDD@DDDDDDCD4DDDDDD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»³ƒˆ3³;³3»»»»»H„HDD3DD43DDDDDDDD4@DˆˆˆˆˆˆˆˆˆˆˆˆˆAD@DDDDDD3D4DDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»3³;3»;³;3;»»»»»ˆˆDDD3DD43DDDDDDDD4""!@DDDDDD3D4DDDDD„HHˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»³³;³;³;»»»»»ˆHDDD3DD43DDDDDDDD4!"!@DDDDDD3D4DDDDD„„Dˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»33»33»3³»»»»»ˆˆDDD3DD43DDDDDDD"""DDDDDDD4DDDDDˆ„Dˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»»»»»»»»»»»»»ˆ„HDDDDD43DDDDDD(""ADDDD43DDDDDˆ„„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̈DHDDDD433DDDD"!"!!DDD43DDDDDˆDHˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌÌÌ̈ˆÈÌÌÌÌÌÌÌÌ̈HˆDDDD433DDD!(!"!"AD43DDDDDˆ„„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌÌ̈ˆˆˆÈÌÌÌÌÌÌÌ̈HˆDDDD433D"!!"!!43DDDDDHˆDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌÌDˆˆˆˆDÈÌÌÌÌÌÌ̈ˆˆDDDD433!DDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌŒDˆˆˆˆDˆÌÌÌLDÄ̈ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌŒˆˆ33ˆˆˆÌÌÌLDÄ̈ˆ!"""!ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌˆˆˆ33ˆˆˆÈÌLDDÄ̈ˆˆ!""!"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌˆˆ3DD3ˆˆÈÌLDDÄ̈ˆ""!"ˆˆX…XXU…ˆˆˆˆˆˆˆˆˆˆŒˆˆ3DD3ˆˆˆÌÌLDÄ̈ˆ!!"""!€ˆ€X…XX…XˆˆˆˆˆˆˆˆˆˆŒˆ3DDDD3ˆˆÌÌLDÄ̈ˆ"""!""!€XUUX…XˆˆˆˆˆˆˆˆˆˆŒˆ3DDDD3ˆˆÌÌLDÄ̈ˆ!!"!""""ˆˆX…XXU…ˆˆˆˆˆˆˆˆˆˆŒˆˆ3DD3ˆˆˆÌÌLDÄ̈ˆ"""!"!"!X…XX…ˆˆˆˆˆˆˆˆˆˆˆŒˆˆ3DD3ˆˆˆÌLDDDĈˆ!"!""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌˆˆˆ33ˆˆˆÈÌLDDDĈˆˆ!!""""!ˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌˆˆˆ33ˆˆˆÈÌÌÌÌÌ̈ˆ€"""""""ˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌŒDˆˆˆˆDˆÌÌÌÌÌÌ̈ˆˆ!"!""""""ˆhffˆf†ˆˆhhffˆf†ˆÌŒDˆˆˆˆDˆÌÌÌÌÌÌ̈ˆˆ"""""!""ˆˆˆfh†fˆˆ†ˆˆfh†fˆÌ̈ˆˆˆˆˆÈÌÌÌÌÌÌ̈ˆˆ!!"!""!"!"ˆh†hfhˆhˆˆh†hfhˆÌÌÌHD„DDÄDDÄÌÌÌ̈ˆˆ"""!""!""!ˆˆhˆfh†hˆ†ˆhˆfh†hˆÌÌÌÄ„ˆÈLÄDÌÌÌÌÌ̈ˆ!!""!""""ˆˆf†ˆf†hˆˆˆf†ˆf†ˆÌDÄLDÌÌDÌDDÌÌÌÌ̈ˆ"""""""!ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌÌÌÌÄÄLÄÌÌLÄÌÌÌ̈ˆ!!""""!"""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌÌÌDDÌDÌÌDDÌÌÌÌ̈ˆ!""""!""!ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̈ˆ"""!""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ! """"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ"!"""""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ!"!""""""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ"!""!""ˆDDˆD„H„ˆHD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ!""""!""!""!"ˆˆˆH„ˆH„HH„ˆH„Hˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ!"!""""""""""ˆH„DH„HH„ˆH„Hˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ""""""""!"ˆˆH„HH„HH„ˆH„Hˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ!"!""""""""ˆˆˆDDˆD„HDDHD„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ""!"""!"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ!"!"""""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ""!"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ!"""ˆˆˆˆ»‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ""!"ˆˆ¸‹»ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ""""ˆˆˆ¸»¸ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ"!""ˆˆˆ¸‹¸ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ"!"ˆˆˆˆ»‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ(ˆ!"‚ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ(ˆ"""""""""‚ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ(ˆ""""""""""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ(("""""!""€"""""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‚("""""""""""""""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ"ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ""ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ!ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆB†-- title: Dungeon Heist -- author: Pilot Trip Games / visy & kide -- desc: Get gold in the dungeon and escape with your life -- license: WTFPL -- version: 1.2 -- script: lua level_starttime = 0 local SW = 240 local SH = 136 local TILE_PLAYER_START = 32 local TILE_PLAYER_END = 33 local TILE_PLAYER_START2 = 34 local last_gold = 0 local SKY_COLOR = 8 -- User value local FLOOR_COLOR = 15 -- User value (Base floor color) local FLOOR_COLOR_ALT = 6 -- Alternate floor color (e.g., Dark Gray) local encounters = 1 descending = false intro = true endseq = false current_floor = 2 steps = 0 total_steps = 0 nextfight = 4 fightstarttime = 0 startfight = false fight = false encounter_rate = 0.5 fight_estart = time() endfight = false last_exp = 0 last_hit = 0 dungeon_level = 0 shakestr = 4 shake = 0 title = "Cretin" titleranges = { {0,100}, {101,500}, {501,1000}, {1001,1500}, {1501,2000}, {2001,2500}, {2501,3000}, {3001,4000}, {4001,5000}, {5001,7000}, {7001,9999}, {10000,1000000}, } titles = { "Cretin", "Panhandler", "Wannabe", "Trainee", "Pocket Change", "Cashier", "High Roller", "Fat Stacks", "Financier", "Gold Master", "Diamond Dog", "Financial Elite", } -- Player State local px, py -- Player map coordinates (float, center of tile) local pa -- Player angle in radians (snapped to 0, PI/2, PI, 3*PI/2) -- Game Settings local FOV = math.pi / 2.17 -- Field of View (User value) local WALL_HEIGHT_SCALE = SH -- Factor to scale wall height (adjust for feel) -- Store bottom Y coordinate of walls per column local wallBottomY = {} local zBuffer = {} -- Texture Parameters local TEX_U_START = 0 local TEX_V_START = 64 -- User value (Tile 64 is U=0, V=64) local TEX_W = 32 local TEX_H = 32 enemies = { {type=0,level=1,hp=4,name="System Bug",gmul=1,runtime=0,atime=1}, {type=1,level=2,hp=10,name="Gold Chicken",gmul=2,runtime=0,atime=1}, {type=2,level=2,hp=25,name="Chest Mimic",gmul=4,runtime=0,atime=1}, {type=3,level=2,hp=50,name="Incredigem",gmul=2,runtime=0,atime=1}, {type=4,level=2,hp=200,name="Treasure Goblin",gmul=8,runtime=20000,atime=0}, {type=5,level=2,hp=80,name="Conjuring Imp",gmul=2,runtime=0,atime=1}, {type=6,level=3,hp=100,name="Pot of Greed",gmul=5,runtime=0,atime=1}, {type=7,level=3,hp=120,name="Easter Egg",gmul=3,runtime=0,atime=1} } local textbar = "FIGHT!" enemy_starthp = 0 enemy_frozen = false base_runtime = 0 enemy_runtime = 0 enemy_hp = 0 enemy_level = 0 enemy_name = "" enemy_type = 0 enemy_starttime = 0 enemy_freezetime = 0 enemy_freezestart = 0 enemy_attack = false enemy_attacktime = 0 enemy_attackstart = 0 enemy_gmul = 0 enemy_wait = false enemy_waittime = 0 enemy_waitstart = 0 active_ui = 1 actions = {} -- "stats" player_stats = { 1, 1, 1, 1 } hp_tick = 0 player_hp = 30 player_maxhp = 30 player_gold = 0 final_gold = 0 player_exp = 0 player_level = 1 player_nextlevel = 100 player_statpoints = 0 sco = 0 perpWallDist = 0 function a_is_ready(ui) i = 1 for i = 1, #actions do if (actions[i].ui == ui and actions[i].enabled) then return actions[i].ready end end return false end function a_is_active(ui) for i = 1, #actions do if (actions[i].ui == ui and actions[i].enabled) then return actions[i].active end end return false end function ui_logic(ui) -- heal if ui == 4 then sfx(8) player_hp = player_hp + player_stats[ui]*10 if (player_hp > player_maxhp) then player_hp = player_maxhp end end -- strike if ui == 1 then local hit = player_stats[ui] if (math.random(1,100-(player_level*5)) < 5) then hit = hit * 5 cls(10) end enemy_hp = enemy_hp - hit shake = 5 shakestr = 1 sfx(1) if (enemy_hp <= 0) then sfx(3) last_hit = 0 endfight = true music(-1) last_exp = math.floor(enemy_starthp/2)+(enemy_level * 10) + math.random(1,enemy_level)*3 last_gold = math.random(20,(enemy_level+enemy_gmul)*100) player_exp = player_exp + last_exp player_gold = player_gold + last_gold enemy_attack = false if (player_exp >= player_nextlevel) then player_statpoints = player_statpoints + 1 player_nextlevel = player_nextlevel + player_level*100 player_level = player_level + 1 player_maxhp = player_maxhp + (player_level*4) player_hp = player_maxhp encounter_rate = encounter_rate + 0.05 end fight_estart = time() enemy_freezetime = 0 enemy_frozen = false enemy_freezestart = 0 actions = {} end end -- magic if ui == 2 then enemy_freezetime = player_stats[ui]*5000 if (base_runtime > 0) then enemy_runtime = enemy_runtime + enemy_freezetime end enemy_frozen = true enemy_freezestart = time() shake = 30 shakestr = 2 sfx(2) end -- block if ui == 3 and enemy_attack then enemy_attackstart = enemy_attackstart + player_stats[ui]*3000 if (time()-enemy_attackstart < 0) then enemy_attack = false shake = 5 shakestr = 1 sfx(0) end end if (fight) then remove_action(ui) end end function update_action(ui,x,y,ready,active) local i = -1 for ii = 1, #actions do if actions[ii].ui == ui and actions[ii].enabled then actions[ii].x = x actions[ii].y = y actions[ii].ready = ready actions[ii].active = active actions[ii].start = time() end end end local atexts = { "STRIKE!", "CAST BEAM!", "BLOCK!", "HEAL SELF!" } local alengths = { 1000, 1500, 750, 3000 } local acosts = { 0, 50, 10, 75 } function add_action(ui,x,y,ready,active) local action = { ui = ui, x = x, y = y, start = time(), ready = ready, active = active, text = atexts[ui], length = alengths[ui], cost = acosts[ui], enabled = true } table.insert(actions, action) end function remove_action(ui) local i = -1 for ii = 1, #actions do if actions[ii].ui == ui then actions[ii].enabled = false end end end -- Map Helpers function get_map_tile(x, y) local mapX, mapY = math.floor(x), math.floor(y) if mapX < 0 or mapX >= 239 or mapY < 0 or mapY >= 135 then return 1 end return mget(mapX, mapY) end function is_wall(map_x, map_y) return fget(get_map_tile(map_x, map_y), 0) end -- Find the player start tile function find_player_start() for y = 0, 136 do for x = 0, 249 do if mget(x, y) == current_start then px = x + 0.5; py = y + 0.5; pa = math.pi / 2 -- Start North return end end end end -- Initialize pdir (Part of user's input logic) -- WARNING: pdir logic in handle_input is unconventional. North=2 based on turn logic. pdir = 2 function init() current_start = TILE_PLAYER_START find_player_start() -- Initialize wallBottomY table for x=0,SW-1 do wallBottomY[x]=SH; zBuffer[x]=1e9; end end function checkfight() if steps >= nextfight and fight == false then nextfight = nextfight + 4 if (math.random() < encounter_rate) then fight = true music(1) startfight = true local enemy = 0 if (dungeon_level == 0) then enemy = math.random(1,2) end if (dungeon_level == 1) then enemy = math.random(3,5) end if (dungeon_level == 2) then enemy = math.random(6,8) end enemy_atime = enemies[enemy].atime enemy_starthp = enemies[enemy].hp + enemies[enemy].level*math.random(1,4+dungeon_level*2) enemy_hp = enemy_starthp enemy_name = enemies[enemy].name enemy_gmul = enemies[enemy].gmul enemy_type = enemies[enemy].type base_runtime = enemies[enemy].runtime enemy_runtime = base_runtime enemy_level = enemies[enemy].level+dungeon_level enemy_starttime = time() steps = 0 fightstarttime = time() actions = {} end end end function handle_input() if (descending == true) then return end if (fight == true) then return end local moved_or_turned = false -- Rotation with pdir update if (btnp(2) or keyp(1)) then pa=pa-math.pi/2; moved_or_turned=true; pdir=pdir+1; if (pdir>3) then pdir=0 end elseif (btnp(3) or keyp(4)) then pa=pa+math.pi/2; moved_or_turned=true; pdir=pdir-1; if (pdir<0) then pdir=3 end end -- Normalize angle if moved_or_turned then pa=(pa+4*math.pi)%(2*math.pi) end -- Determine Forward Vector (Original potentially buggy version) local fwd_dx,fwd_dy=0,0; local angle_tolerance=0.01 if math.abs(pa-0) 100 then return nil, nil end -- Clip distance -- Ray direction for this specific screen column local cameraX = 2 * screenX / SW - 1 local rAng = pa + math.atan2(cameraX * tanFov2, 1.0) local rDX = math.cos(rAng); local rDY = math.sin(rAng) -- Calculate world X, Y local floorX = px + rowDistance * rDX local floorY = py + rowDistance * rDY return floorX, floorY end -- Render using Raycasting with ttri walls and procedural floor function render_raycast() -- Precalculate constants local playerFwdX = math.cos(pa); local playerFwdY = math.sin(pa) local tanFov2 = math.tan(FOV / 2) local screenCenterY = SH / 2+sco local cameraHeight = 0.5 -- Assumed player height above floor=0 local FLOOR_COLOR_NEAR = 15 -- Color at player's feet (User value) local FLOOR_COLOR_FAR = 6 -- Color fading towards horizon local maxFloorDist = 4.5 -- Distance for full fade (tune this) local pdist = 1.00 -- 1. Wall Casting Pass: Draw walls with ttri and store bottom Y for x = 32, SW - 33 do -- Ray setup & DDA (condensed) local camX=2*x/SW-1; local rAng=pa+math.atan2(camX*tanFov2,camz+1.0) local rDX,rDY=math.cos(rAng),math.sin(rAng) local mX,mY=math.floor(px),math.floor(py); local dDX=(rDX==0) and 1e9 or math.abs(1/rDX); local dDY=(rDY==0) and 1e9 or math.abs(1/rDY) local stepX,stepY; local sideDX,sideDY if rDX<0 then stepX=-1;sideDX=(px-mX)*dDX else stepX=1;sideDX=(mX+1-px)*dDX end; if rDY<0 then stepY=-1;sideDY=(py-mY)*dDY else stepY=1;sideDY=(mY+1-py)*dDY end local hit,side,hitMapX,hitMapY=false,0,0,0; local steps,max_steps=0,30 while not hit and steps= SH then colDrawEnd = SH-1 end if drawStart > colDrawEnd then drawStart = colDrawEnd end -- Ensure start <= end local wallX if side == 1 then local hY=py+t_dist*rDY; wallX=hY-math.floor(hY); if rDX>0 then wallX=1-wallX end else local hX=px+t_dist*rDX; wallX=hX-math.floor(hX); if rDY>0 then wallX=1-wallX end end -- User's texture offset logic based on wall side local dark = (side == 0) and 32 or 0 local walli = (mget(mX,mY)-1)*32 local texU = TEX_U_START + wallX * TEX_W + walli+0.5 local texV0 = TEX_V_START+0.0+dark; local texV1 = TEX_V_START + TEX_H + dark if (mget(mX,mY) == 5) then texU = 96 + wallX * TEX_W +0.5 texV0 = 0; texV1 = 0 + TEX_H end drawStart = drawStart + sco colDrawEnd = colDrawEnd + sco sco = math.cos(time()*0.001+x*0.1)*0.2 if drawStart < colDrawEnd and not skip then -- Check height > 0 and not skipped ttri(x+sco,drawStart, x+1+sco,drawStart, x+sco,colDrawEnd, texU,texV0, texU,texV0, texU,texV1, 0,-1) ttri(x+1+sco,drawStart, x+1+sco,colDrawEnd, x+sco,colDrawEnd, texU,texV0, texU,texV1, texU,texV1, 0,-1) end zBuffer[x] = perpD -- Store wall distance! end -- Store wall bottom Y for floor pass wallBottomY[x] = colDrawEnd end -- End Wall Pass loop (x) -- roof for y = math.floor(screenCenterY) + 1, SH - 1 do -- Calculate distance to this row local rowDistance = (cameraHeight * screenCenterY) / (y - screenCenterY) if rowDistance <= 0 or rowDistance > maxFloorDist * 1.2 then goto continue_y end -- Calculate shading color based on distance local shadeFactor = math.max(0, math.min(1, rowDistance / maxFloorDist)) -- 0=close, 1=far local floor_color = FLOOR_COLOR_NEAR + math.floor((FLOOR_COLOR_FAR - FLOOR_COLOR_NEAR) * shadeFactor + 0.5) floor_color = math.max(0, math.min(15, floor_color)) -- Clamp color index -- Find visible horizontal segments and draw lines local startX = -1 for x = 0, SW - 1 do if y > wallBottomY[x] then -- Is floor visible? if startX < 0 then startX = x end -- Start segment else -- Hit wall/sky if startX >= 0 then line(startX, 136-y, x - 1, 136-y, floor_color); startX = -1 end -- Draw previous segment end end if startX >= 0 then line(startX, 136-y, SW - 1, 136-y, floor_color) end -- Draw last segment ::continue_y:: end -- for y --[[ Helper Function to Draw a Floor Chunk (to avoid code duplication) ]]-- local function draw_floor_chunk(y, startX, endX,fi) -- Calculate world and UV coords for the 4 corners local tl_fx, tl_fy = get_floor_world_pos(startX, y, px, py, pa, screenCenterY, tanFov2, cameraHeight) local tr_fx, tr_fy = get_floor_world_pos(endX + 1, y, px, py, pa, screenCenterY, tanFov2, cameraHeight) local bl_fx, bl_fy = get_floor_world_pos(startX, y + 1, px, py, pa, screenCenterY, tanFov2, cameraHeight) local br_fx, br_fy = get_floor_world_pos(endX + 1, y + 1, px, py, pa, screenCenterY, tanFov2, cameraHeight) -- Draw only if all 4 world coords are valid if tl_fx and tr_fx and bl_fx and br_fx then local tl_u, tl_v = get_floor_uv(tl_fx, tl_fy,fi) local tr_u, tr_v = get_floor_uv(tr_fx, tr_fy,fi) local bl_u, bl_v = get_floor_uv(bl_fx, bl_fy,fi) local br_u, br_v = get_floor_uv(br_fx, br_fy,fi) -- Draw 2 triangles for the strip segment ttri(startX, y, endX + 1, y, startX, y + 1, tl_u, tl_v, tr_u, tr_v, bl_u, bl_v, 0, -1) ttri(endX + 1, y, endX + 1, y + 1, startX, y + 1, tr_u, tr_v, br_u, br_v, bl_u, bl_v, 0, -1) end end --floor local STRIP_CHUNK_W = 8 -- Draw floor in chunks of this width (adjust for performance/quality) for y = math.floor(screenCenterY), SH - 2 do -- Iterate screen rows for the *top* of the strip (y to y+1) local segmentStartX = -1 -- Track start of a *continuous visible segment* for x = 0, SW - 1 do -- Check if floor is visible at the top of the strip for this column local floor_visible = (y >= math.floor(screenCenterY) and y > wallBottomY[x]) if floor_visible then if segmentStartX < 0 then segmentStartX = x end -- Start a new visible segment -- Check if current pixel is end of chunk OR end of visible segment OR end of screen if (x - segmentStartX + 1 >= STRIP_CHUNK_W) or (x == SW - 1) or (y <= wallBottomY[x+1] and x+1 < SW) then local chunkEndX = x -- Current pixel is the end of this chunk if chunkEndX >= segmentStartX then -- Ensure chunk has width >= 1 draw_floor_chunk(y, segmentStartX, chunkEndX,current_floor) end segmentStartX = x + 1 -- Next chunk starts at next pixel (if still visible) -- If next pixel isn't visible, segmentStartX will be reset correctly in the 'else' block below or the next iteration end else -- Hit wall or sky gap if segmentStartX >= 0 then -- We were in a segment, need to draw the last chunk of it local chunkEndX = x - 1 if chunkEndX >= segmentStartX then -- Ensure chunk has width >= 1 draw_floor_chunk(y, segmentStartX, chunkEndX,current_floor) end end segmentStartX = -1 -- Reset segment tracking end -- if floor_visible end -- for x end -- for y for y=0,136 do circ(32,y,math.cos(y*0.05+time()*0.001)*4,8) circ(240-33,y,math.sin(y*0.05+time()*0.001)*4,8) circb(32-2,y,math.sin(y*0.5+time()*0.0002)*8,8) circb(240-33+2,y,math.cos(y*0.5+time()*0.0002)*8,8) end end camz = 5 heal_ready=false function render_ui() local ui = 1 local mx,my,mb,mm,mr = mouse() if (time()-level_starttime < 5000) then print("Dungeon Level " .. dungeon_level,40+(time()-level_starttime)*0.005,128,0) print("Dungeon Level " .. dungeon_level,41+(time()-level_starttime)*0.005,128,3) end if (camz > 0) then camz = 5-((time()-level_starttime)*0.01) if (camz < 0) then camz = 0 end end if (keyp(28)) then active_ui = 1 sfx(7) end if (keyp(29)) then active_ui = 2 sfx(7) end if (keyp(30)) then active_ui = 3 sfx(7) end if (keyp(31)) then active_ui = 4 sfx(7) end if (mb and mx > 32 and fight == false and player_gold >= acosts[active_ui]*player_stats[active_ui] and active_ui == 4) then heal_ready=true elseif(mb == false and fight == false and heal_ready and player_gold >= acosts[active_ui]*player_stats[active_ui] and active_ui == 4) then heal_ready = false cls(3) player_gold = player_gold - acosts[active_ui]*player_stats[active_ui] ui_logic(active_ui) shake = 10 shakestr = 2 cls(5) end print("L",24,8,3) for y=0,136-42,24 do rect(0,y+13,32,24,ui+8) circ(10,y+14+9,9,8) spr(64+ui-1,2,y+14,8,2) if (mx > 0 and mx < 32 and my > y+14 and my < y+14+16 and mb) then active_ui = ui sfx(7) end if (mx > 0 and mx < 32 and my > y+14 and my < y+14+16 and mr and fight == false and player_statpoints > 0) then player_stats[ui] = player_stats[ui] + 1 player_statpoints = player_statpoints - 1 sfx(9) end print(player_stats[ui],21,y+14+3,ui,2,2) if (acosts[ui] > 0) then print("-$" ..acosts[ui]*player_stats[ui],2,y+28+3,ui) end ui = ui + 1 end spr(64+active_ui-1,0,0,-1,1) print("LEVEL",209,0,2) print(player_level,209,8,2) print("EXP",209,16+4,3) print(player_exp,209,24+4,3) print("NEXT",209,32+8,7) print(player_nextlevel,209,40+8,6) print("HP",209,88+4,5) print(string.format("%02d",player_hp) .. "/" .. player_maxhp,209,88+8+4,6) print("GOLD",209,108+4,4) print(player_gold,209,108+8+4,11) if (player_statpoints > 0) then print("LVLUP",1,118+4,6) print(player_statpoints,1,118+4+8,7) end if (descending == true) then print("DESCEND TO LOWER LEVEL?",32+16+4,8,0) print("DESCEND TO LOWER LEVEL?",33+16+4,9,3) circ(92-8,76,24,6) circb(92-8,76,24,0) print("DESCEND",92-28,74,0) print("DESCEND",92-27,73,4) circ(92+60,76,24,2) circb(92+60,76,24,0) print("ESCAPE",92+43,74,0) print("ESCAPE",92+44,73,4) if(mb and mx > 92-8-24 and mx < 92-8+24 and my > 76-12 and my < 76+12) then descending = false dungeon_level = dungeon_level + 1 current_floor = current_floor - 1 current_start = TILE_PLAYER_START+dungeon_level*2 find_player_start() level_starttime = time() camz = 5 -- go to next dungeon level end if(mb and mx > 92+52-24 and mx < 92+52+24 and my > 76-12 and my < 76+12) then endseq = true final_gold = player_gold music(0) end end if (startfight == true) then return end if (mb and mx > 32 and fight and a_is_ready(active_ui) == false and a_is_active(active_ui) == false and player_gold >= acosts[active_ui]*player_stats[active_ui]) then add_action(active_ui,mx,my,true,false) elseif(mb == false and fight and a_is_ready(active_ui) and player_gold >= acosts[active_ui]*player_stats[active_ui]) then update_action(active_ui,mx,my,false,true) player_gold = player_gold - acosts[active_ui]*player_stats[active_ui] end end function render_fight() if (fight == false) then return end if (startfight) then local t = fightstarttime local s = 0.1 local tt = (time()-t)*0.05 if tt > SH/1.5 then tt = SH/1.5 startfight = false end rectb(SW/2-tt,SH/2.62+tt/3.4,2+tt*2,1+tt*0.4,8) rect(SW/2-tt+1,SH/2.62+1+tt/3.4,2+tt*2-2,2+tt*0.4-3,10) print("ENCOUNTER!",92,41+8+tt/2,1) print("ENCOUNTER!",93,41+8+tt/2,8+tt*0.2) return end if (endfight == false) then local runtime = time()-enemy_starttime if (runtime > enemy_runtime and enemy_runtime > 0) then sfx(10) last_hit = 0 endfight = true music(-1) end -- draw enemy local string="LVL" .. enemy_level .. " " .. enemy_name local width=print(string,0,-6) print(string,(239-width)//2,105+15,0) print(string,(241-width)//2,105+15,0) print(string,(240-width)//2,104+15,0) print(string,(240-width)//2,107+15,0) print(string,(239-width)//2,106+15,0) print(string,(241-width)//2,106+15,0) print(string,(240-width)//2,105+16,3) rectb(SW/2-16-8,32,32+16,78,0) rect(SW/2-15-8,31,31+16,78,8+enemy_type) for i=0,48 do local rx = math.random(-16,16) local ry = math.random(-16,16)+4 local cc = math.random(0,1) circb(SW/2+rx,SH/2+ry,4,cc*8) if (math.random() < 0.3*math.cos(time()*0.001)) then pix(SW/2+rx,SH/2+ry,4,i%16) end local es = 256 local et = enemy_type if (enemy_type >= 4) then es = 384-16 et = enemy_type - 4 end local ff = 1 if (enemy_frozen) then ff = 0 end if (last_hit == 0) then spr(es+enemy_type*4,SW/2-14+math.sin(time()*0.001*ff)*4,31+24+math.cos(enemy_type*0.5*ff+time()*0.001*ff)*4,8,1,0,0,4,4) else spr(es+64+enemy_type*4,SW/2-14+math.sin(time()*0.001*ff)*4,31+24+math.cos(enemy_type*0.5*ff+time()*0.001*ff)*4,8,1,0,0,4,4) end end if (enemy_wait and enemy_atime > 0) then if (time()-enemy_waitstart > enemy_waittime) then enemy_attackstart = time() enemy_attacktime = math.abs((4000 - (((enemy_level-1)+dungeon_level) * 500))+(math.random(1,enemy_level)*200)) if (enemy_attacktime < 1000) then enemy_attacktime = 1000 end enemy_attacktime = enemy_attacktime enemy_attack = true last_hit = 0 enemy_wait = false end end if (enemy_attack == false and enemy_wait == false) then enemy_wait = true enemy_waitstart = time() enemy_waittime = math.random(100,6000) end if (enemy_attack == true) then if (time()-enemy_attackstart > enemy_attacktime) then enemy_attack = false last_hit = math.floor((dungeon_level+enemy_level+1)*(math.random(1,7)*0.75)) shake = last_hit*2 shakestr = last_hit player_hp = player_hp - last_hit sfx(6) if (player_hp <= 0) then trace("You died on dungeon level " .. dungeon_level .. ", killed by a LVL " .. enemy_level .. " " .. enemy_name .. ", RIP...") exit() end end circ(SW/2,32,(time()-enemy_attackstart)*0.004,2) circb(SW/2,32,(time()-enemy_attackstart)*0.004,3) end end if (last_hit > 0) then print(last_hit .. " DMG!",105,15,0) print(last_hit .. " DMG!",106,16,10) print(last_hit .. " DMG!",107,17,2) end local start = enemy_starthp local hp = enemy_hp if (hp > 0) then if (start > 50) then start = start / 4 hp = hp / 4 end rect(96,105,start+5,5,1) rectb(96,105,start+5,5,0) for i=0,hp do pix(98+i,107,5) end end if endfight == false then for i = 1, #actions do if (actions and actions[i]) then if (actions[i].enabled and actions[i].active and time()-actions[i].start < (actions[i].length/math.floor(1+player_stats[actions[i].ui]*0.25))) then textbar = actions[i].text local ttt = ((time()-actions[i].start)*0.004)*4 circ(actions[i].x,actions[i].y,ttt,4+ttt/2) circb(actions[i].x,actions[i].y,ttt,4+ttt/4) spr(64+actions[i].ui-1,actions[i].x-3,actions[i].y-4) print(textbar,actions[i].x+8,actions[i].y+math.cos((time()-actions[i].start)*0.005)*8,0) print(textbar,actions[i].x+9,actions[i].y-1+math.cos((time()-actions[i].start)*0.005)*8,0) print(textbar,actions[i].x+9,actions[i].y+1+math.cos((time()-actions[i].start)*0.005)*8,0) print(textbar,actions[i].x+10,actions[i].y+math.cos((time()-actions[i].start)*0.005)*8,0) print(textbar,actions[i].x+9,actions[i].y+math.cos((time()-actions[i].start)*0.005)*8,4+(time()-actions[i].start)*0.004%4) elseif (time()-actions[i].start >= (actions[i].length//math.floor(1+player_stats[actions[i].ui]*0.25)) and actions[i].active and actions[i].enabled) then ui_logic(actions[i].ui) end end end end if (endfight) then print("WIN!" ,92+math.cos(time()*0.006)*16,107-16,14,2,2) print("WIN!",93+math.cos(time()*0.006)*16,107-16,14-8,2,2) print("gain " .. last_exp .. " EXP + " .. last_gold .. " gold" ,62+math.sin(time()*0.003)*16,107+16,0) print("gain " .. last_exp .. " EXP + " .. last_gold .. " gold" ,62+math.sin(time()*0.003)*16,108+16,3) if (time()-fight_estart > 2000) then fight = false music(-1) endfight = false startfight = false end end if (enemy_freezetime > 0) then enemy_attack = false if (time()-enemy_freezestart < enemy_freezetime) then rect(58,8,8*15,21,4+time()*0.01%4) print("ENEMY FROZEN " .. math.floor((enemy_freezetime-(time()-enemy_freezestart))/100)/10 ,73,16,0) print("ENEMY FROZEN " .. math.floor((enemy_freezetime-(time()-enemy_freezestart))/100)/10 ,74,16,11) print("ENEMY FROZEN " .. math.floor((enemy_freezetime-(time()-enemy_freezestart))/100)/10 ,75,16,3) else enemy_frozen = false enemy_freezetime = 0 end end end introtext = { "Objective:", "Hack into the", "Neo-Chiba mainframe", "and retrieve as much gold as possible", "in unmarked bearer bonds", "by defeating their", "Countermeasure Haptic", "AIs (\"C.H.A.Is\") carrying the loot", "", "the gold is untraceable", "expect violent resistance", "to attempts at acquiring it", "", "--- *** BEGIN TUTORIAL SECTION *** ---", "Left mouse to select action (\"spells\")", "Right mouse to level up action", "Left click Actions can be clicked anywhere", "Kill enemies for gold and experience", "Find the way to the exit...", "--- *** END TUTORIAL SECTION *** ---", "", "You have four \"spells\" in your", "possession - the eggheads from the lab", "tell me it's as if you're playing", "some VR-brained sim-junkie's 8-bit", "daydream... So, better get those", "emulation hours in on some classic", "pre-collapse first-person RPGs...", "", "Oh yeah, and whoever made the", "visuals is already fired, it's", "like they'd done a steady portion", "of liquid solvents making it.", "", "Don't say I didn't warn you...", "", "The C.H.A.Is are going to be", "masquerading as classic JRPG", "monsters... don't be fooled", "by their puny size...", "", "You may always tap out and escape", "with your current haul of gold", "at every dungeon level exit.", "", "Good luck, Hacker.", "", "", "See you 'round the slipstream.", "", "-- MISSIVE FROM da boss --", "", "Pilot Trip Games 2025", "", "code by visy / monsters by kide", "wall gfx by rekkimaru", "", } function any_key_pressed() for code = 1, 92 do -- Iterate through all known key codes if keyp(code) then return true -- Return true immediately if any key is pressed end end local mx,my,ml,mm,mb = mouse() if (ml or mm or mb) then return true end return false -- Return false if no key was pressed end -- Main Game Loop Function intro_y = 136+#introtext*8 intro_y_time = 0 endclear = false endframes = 800 function TIC() if (intro == false and endseq == false) then handle_input() cls(SKY_COLOR) -- Clear with sky color only render_raycast() -- Draws walls and floor pixels render_fight() render_ui() if shake>0 then poke(0x3FF9,math.random(-shakestr,shakestr)) poke(0x3FF9+1,math.random(-shakestr,shakestr)) shake=shake-1 if shake==0 then memset(0x3FF9,0,2) end end elseif (intro == true) then cls(9) for y = 0, SH, 32 do for x = -SW, SW, 32 do line(x+intro_y%240,intro_y,y+intro_y%240,y+32,1+intro_y*0.1+x*0.01) end end for i = 1, #introtext do local width=print(introtext[i],0,-8) clip(0,16,240,136-32) print(introtext[i],(241-width)//2,(intro_y+i*16)-1,0) print(introtext[i],(239-width)//2,(intro_y+i*16)-1,0) print(introtext[i],(242-width)//2,(intro_y+i*16)-1,0) print(introtext[i],(241-width)//2,(intro_y+i*16)+1,0) print(introtext[i],(239-width)//2,(intro_y+i*16)+1,0) print(introtext[i],(242-width)//2,(intro_y+i*16)+1,0) print(introtext[i],(241-width)//2,(intro_y+i*16),2+i%2) intro_y = 110-((time()-intro_y_time)*0.015) if (intro_y < -(#introtext*16)) then intro_y_time = time() end clip() print("press any key to start",-1,130,0) print("press any key to start",1,130,0) print("press any key to start",0,129,0) print("press any key to start",0,131,0) print("press any key to start",0,130,1) if (any_key_pressed() and time() > 1000) then intro = false level_starttime = time() music(-1) end end end if (endseq) then if (endclear == false) then endclear = true cls(10) end local string="You found the exit!" local width=print(string,0,-6) print(string,(215-width*2)//2,6,4,0,2) local string="Exited the dungeon with " .. player_gold .. " gold" local width=print(string,0,-6) print(string,(239-width)//2,26,3) local string="Leveled up to LVL " .. player_level local width=print(string,0,-6) print(string,(239-width)//2,33,3) local string="Took " .. total_steps .. " steps to find the exit" local width=print(string,0,-6) print(string,(239-width)//2,33+7,3) if (final_gold > 0) then for i = 0, 3 do if (final_gold > 0) then spr(48,math.random(16,240-24),math.random(50,110),8) final_gold = final_gold - 1 if (final_gold < 0) then final_gold = 0 end end end else for i = 1, #titleranges do if (player_gold >= titleranges[i][1] and player_gold <= titleranges[i][2]) then title = titles[i] end end local string="This gives you the title of \"" .. title .. "\"" local width=print(string,0,-6) print(string,(239-width)//2,120+4,4) endframes = endframes - 1 if (endframes < 0) then exit() end end end end -- Initialize init() music(0)