€нннн ннннааааааарнннюнннноmfнэffнmVUннVfнmVfнmffннннннюfнэнfжонffннffжнffннffннрDDDN3334333433343DD4343434"434"DDD333ф333C333CDD3C3C3C"C3C"C3Cрџџџрџџџрџџярџџярџџорџџорџянрџянџџџџџџўџџўџџэџџэџџнўџнўџрўрџўџрџџўџџююююџџџџџџџџџџџџџџџџяюџџоўџрџџџрџџџрџџџрџюџрџоюрџонрџонрџонџџџџџџяџџџџџџџџџџџџюџџџнюџџннюџююююџџџџџџюџџџоюџџонџџонџџонююююџџџџџџџџџџџџюџџџнюџџннюџрџџџўџџџџџџџџџюџџџоюџџонџџонџџонџџџџџџяџџџџџџџџџџџџюџџџнюџџннюџ ннннаааааааннннн}ffн}ffн}gfннgfнэwfно}gюннwрнннfжннfжннffннffннfwонvзэнwннюннн434"434"434343DD43334333N333рDDD"C3C"C3C3C3CDD3C333C333C333фDDDрџонрџонряннряююрџџџрџџџрџџџрџџџнэџнэџннўююўџџџџџџџџџџџџўџџўџярџяорџџюрџџџрџџџрџџџрџџџюнўџннўџннўџнэџџюэџџџўџџџџџяџџџрџонрџонрџонрџоюрџюџрџџџрџџџрџџџннюџнюџџюџџџџџџџџџџџџџџџџџџяџџџџџонџџонџџонџџоюџџюџџџџџўџџџрџџџннюџнюџџюџџџџџџџџџџџџџџџџџџяџџџџџонџџонџџонџџоюџџюџџџџџўџџџрџџџннюџнюџџюџџџџџџџџџџџџџџџџџџяџџџрннэрннорнэнрнонрннэрннорнэнрнононнэннноннэноннэннноннэнрннорнэнрнонрннэрннорнэнрнонрннээннноннэноннэннноннэноннрнэнрнонрннэрннорнэнрнонрннэрннононнэноннэннноннэноннэннрнонрннэрннорнэнрнонрннэрннорнэннэноннэннноннэноннэнннонрорнонрнноннююююнннннннннонннэннннонннэрорнонрнноннююююнннннннннэннннонннэюнннрорнонрнноннююююнннннннннноэонэнэннннонрорнонрнноннююююннннннннннэнэонннэннннорннэрннорнэнрнонрннэрннорнэнрнононнэннноннэноннэннноннэнрннорнэнрнонрннэрннорнэнрнонрннээннноннэноннэннноннэноннрнэнрнонрннэрннорнэнрнонрннэрннононнэноннэннноннэноннэннрнонрннэрннорнэнрнонрннэрннорнэннэноннэннноннэноннэнннононэонорнэнрнннрннэрннорнэнрнононнээнноноэнноононннэннннонэнэнонюоннрнннрннэрннорнэнрнонрннэнонннэнэнэнооээнэннннонннэнэоннонноннрннэрннорнэнрнонрннэрннонноннэнноэнээннононннэнноннээнноннонэрннорнэнрнонрннэрннорнэнннноонэнэноннонэнэннонннэннэнонрнонрнэнрннорннэрнэнрннюрнннрннннэннонээнннонннннонюнэннононэнэрннэрнонрнэнрннорннэрнннрнннрнннонннэнэноннэнннонэнэононэнэннонрннорннэрнонрнэнрннорннэрнннрнннэнноннэнэннноннэннооюнэннонннэнрнэнрннорннэрнонрнэнрннорннэрннннонэннэоннннэнннонэээоэонэнннноююююннннннннонннэннннонннээоююююннннннннннонннэннннонннэююююннннннннэннннонннэнюононююююннннннннннэннннонннэюнннююююнннннннннонннэннононэнэнююююннннннннннноюонэнэннннонююююнннннннннэннононэнэнноноююююнннннннннюнэннонннэннннорнннрнннрннюрнэнрннэрннорнэнрноннэнэноноюнэнннононннэннннонэнэнрнннрнннрнннрннэрннорнэнрнонрннэнноннэнээоноонэнэннннонннэнэоннрнннрнннрннэрннорнэнрнонрннэрнноннэннноноюнээннононннэнноннээннрнннрннэрннорнэнрнонрннэрннорнэнннноонэнээоннонэнэннонннэннэноннэнэноннэннноннннннэннноонэнрнононнээнноэнэнноононннэннннонэнэнононнэннноннэннэннноннэнононрннэнонннонэнонооээнэннннонннэнэоннэнэнононнэнэнононнэнннононнэрннонноннэнноэнээннононннэнноннээннноноэнээоноонээннноннннэоннорнэнннноонэнэноннонэнэннонннэннэнонрнононэннннонннэонэнэннюнонннэнннэннонээнннонннннонюнэннононэнэрннэононннэнннноэннэнонннэннонононннэнэноннэнннонэнэононэнэннонрннооннэннонннэннононэнэононэнэнэнноннэнэннноннэннооюнэннонннэнрнэноннонннэнноннээнонооэнээнонононэннэоннннэнннонэээоэонэннннорюююўнннопнно§ннонпнон§mоннoоннfюююнннэнннннннfmffffffffUUfVeffрюююонннннннннннннннжнннffжнffжнюююнннянн§эннпэн§нэнпнэ§ннэпннэнэннноннэннюонэннннэннноонэнрноннэнэноноюнэнннононннэннннонэнэнононнэннноннэннэннноннэнононрннэнноннэнээоноонэнэннннонннэнэоннэнэнононнэнэнононнэнннононнэрнноннэннноноюнээннононннэнноннээннноноэнээоноонээннноннннэоннорнэнннноонэнээоннонэнэннонннэннэнононнfоннfоннmоннfоннfоннfоннfрннgVfffVfffVffffffffffffffffffffffffff§fffпfffнfffжfffжfffжffffffffнннэнннэнннэнннэнннэнннэнннэнннпннняюююяюююяюююяюююяююояююняюонннннюююоюююоюююоюююоэююонююонэюорнннююююэЬЬЬэюююэьЬЬэьююэььЬэььюнннююююЬЬЬоюююоЬЬЮоююЮоЬЮЮоюЮЮорнннўюююэяююэўююэюџџэюџ3эюЏ<эюЏЪнннюююяююўоююяоџџюо3џюоУњюоЌњюоаннн§юююэяююэўююэюDDэю$"эю$Bэю$Dннн юююпююўоююяоDDюо"BюоDBюо$Bюорннgоннgоннwоннwонн}онн}онннонннffffffffffffffffgfffgfffwfffwgffffffffffffffffffffffffffffffffffннннннэнннэнннэнннэнннэнннэжннэяюоняююняююояюююяюююяюююяюююџџџџнэюонююоэююоюююоюююоюююоюююоџџџџэььюэььЬэьююэьЬЬэюююэЬЬЬююююрнннюЮЮоЬЮЮоююЮоЬЬЮоюююоЬЬЬоююююнннэюЏЪэюЏ<эюџ3эюџџэўююэяююўюююрнннЌњюоУњюо3џюоџџюоююяоююўоюююянннэю$"эю$Bэю$"эюDDэўююэяюю§юююанннDBюо"Bюо"BюоDDюоююяоююўоюююпннн онн§оннпон§нонпно§ннопннўнннрююю}wffнwgfн}wgнн}wнннннннннннэюююfffffffжffvзwwwн}wннннннонннрюююпннэ§ннэнпнэн§нэннпэнн§эннняюююП а РРЭм Эм=гРЭм а Р`f`Uf`ef`ffpffpffpwvpw    ЊЊЊЊ ЊЊ  ЊЊ ЉЊ ™™00033333"3 "fffffffgfffgfffwfffpgfwwрюопюЮЯьЮџЯэўЬЭюоЯЬэрЮэю С  57:;<=>>??????????????????????Л?юююююююююююююююююююююююююююнннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннюџяюџяўяўўяўююўяџюџяўџяўџџюонннннэ№ннннннн онннннэнннннннанннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннўяўўяўўџўўяўююўџџўяўўяўўяююяюююююўўюююююююэяюююююўояюююююўннннннннўяюўяўўџџўяўююўџџўяўўяўўџяюўюююююя§юююююююнўюююююянўюююююяннннннннўяўўяўўяџюџяююўўўўяўўяўўяюююяюююўю§юююююююнюяюююўюнюяюююўюннннннннюџяюџяўяўюўюююўюўюџяўџяўџџююўџџџяю§юююююююнюўџџџяюнюNDDDфюннннннннююююююююююююююююююююююююююююў?3ѓяю§юююнюююнюў?3ѓяюнюN"""фюнннннннннннюN"D$фюнюўЪ3Ќяю§ююонэююнюўЪ3ЌяюнюN"D$фюнннннннннннюNBD"фюнюўЊЬЊяю§ююнннююнюўЊЬЊяюнюNBD"фюнннннннннннюN"B$фюнюўЊЬЊяю§ююнннююнюўЊЬЊяюнюN"B$фюнннннннннннюN"$"фюнюўЪ3Ќяю§ююонэююнюўЪ3ЌяюнюN"$"фюнннннннннннюN"""фюнюў?3ѓяю§юююнюююнюў?3ѓяюнюN"""фюнннннннннннюNDDDфюнюўџџџяю§юююююююнюўџџџяюнюNDDDфюнннннннннннюяюююўюнюяюююўю§юююююююнюяюююўюнюяюююўюнннннннннннўюююююянўюююююя§юююююююнўюююююянўюююююяннннннннннняюююююўэяюююююўўюююююююэяюююююўояюююююўнннннннннннннннннннннннннн нннннннонннннэ№џџџџџџџоннн­кэнннннннаннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн ўџџџџџяўџџџџџяонэнонэўџџџЏњяўџџџџџяанннннннннннннннннннннннннннннннннннннннннннннннннннннн рюююџџџџџџџюџџџџџџяононэнэўџџџЊЊџюџџџџџџџюююаннннннн юўџџџџџџџџџџџџџџџўџяоэн3ноэўџяџЊЊџџџџџџџџџџџџяюаннннннн рџџџџџџяўџџџџЏњџююўџяонн3ннэўџяЎЊЊњџџџџџяўџџџџџџаннннннн ўџџџџџџяэўџџџЏњюннўџяонэ3онэўџя­ЊЊњџџЏњяоўџџџџџџяаннннннн рџџџџџЊџянэўџџЊЊннэџџяон>3=нэўџџžЉЊњџџЏъонўџџџџџџџаннннннн ўџџџюўЊџяннэўџЊЊонўџџоэ=33оэрџџя™™џџџЊЊннўџџяюџџџяаннннннн рџџџяэЏЊњянннэЎЊЊкнўџџон=33нэрџџянэџџяЊЊннўџџЏкўџџџаннннннн рџџяоэЏЊњянннэЎЊЊъэџџџон-23нэрџџџоўџџЏЊЊкнўџџЏкэўџџаннннннн рџџонэЊЊЊяннэўŸЉЊъўџџяоно"тнэўџџяўџџЏЊЊкнўџџЊЊнэџџаннннннн ўџюннэЊЊЊянэўџџ™™џўџџоэннноэрџџяџџџŸЉЊкнўџџЊЊннюџяаннннннн ўџяонў™ЊЊяэўџџџџџџџџяоннюннэўџџџџџџ™™яоўџЏЊЊкэўџяаннннннн ўџџяоўŸ™љяўџџџџџџџџџонэнонэрџџџџџџџџџяўџЏЊЊъўџџяаннннннн ўџџЊяџџџџџџџџџџџџџяюононэнэюўџџџџџџџџџџŸЉЊњџџџяаннннннн ўџџЊџџџюџџџџџџџюююоэннноэрюююџџџџџџџю™™џџџџяанннннннннннннннн ўџЏЊњџяўџџџџџяонню=гэўџџџџџяўџџџџџяаннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн ўџЏЊњџяонннннэонэн>гэонннннэўџџџџџяанннннннннннннннннннннннннннннннннннннннннннннннннннннн ўџЊЊЊџџюююююююююююююююююннон=гнюююююююююююююююююџџџџџџяаннннннн ўџЊЊЊџџпЮЬЬЬЬЬьннннннннннэнн3ггнннннннннЮЬЬЬЬЬь§џџџюџџяаннннннн ўџ™ЊЊџџпюююююююнннннннннннню33гнннннннннююююююю§џџџЊџџяаннннннн ўџŸ™љџџпЮЮЬЬЬььноннннно3онэн33унэнннннэнЮЮЬЬЬьь§џџяЊўџяаннннннн ўџянўџџпЮюююююьнэнннннэ3энон"3гнонннннонЮюююююь§џџЏЊњџяаннннннн ўџонэџџпЮЮЮЬьььнноэоннн3ноон-"нэнннэоэннЮЮЮЬььь§џџЎЊъџяаннннннн ўџонэџџпЮЮюююььэнэнэон=3=энннононнэононоЮЮюююьь§џџЊЊЊџяаннннннн ўянннўџпЮЮюююььэнэннэн=33энннонон3онноноЮЮюююьь§џяЊЊЊўяаннннннн ўянннўџпЮЮЮЬьььнноннэн=33онннэнэн3оннэннЮЮЮЬььь§џя™ЊЊўяаннннннн ўонннэџпЮюююююьнэнннэн-23ннннноно3онннонЮюююююь§џо™йэяаннннннн ўюююююџпЮЮЬЬЬььноннюноо"вннюннэн=3=юннэнЮЮЬЬЬьь§џюююююяаннннннн ўџџџџџџпюююююююнннэнонннннэноннн=33нонннююююююю§џџџџџџяаннннннн ўџџЊџџџпЮЬЬЬЬЬьнннонэнннннонэннн=33нэнннЮЬЬЬЬЬь§џџџџџџяаннннннн ўџџЊџџџюююююююююнэнннонюнэннноню-23ннонюююююююююџџџџџџяанннннннннннннннн ўџЏЊњџяонннннэоннюннэоннюннэо"вюннэонннннэўџџџџџяаннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн ўџЏЊњџяонннннэонннннэонннннэонннннэонннннэўџџџџџяаннннннннннннннн-"""""""внннннннннннннннннннннннннннннн ўџЊЊЊџџюонннннэюююююююююонннннэюююююююююонннннэюџџџџџџяан-внннн ўџЊЊЊџџпэнffжнонЮЬЬЬЬЬьнэнffжнонЮЬЬЬЬЬьнэнffжно§џџџюџџяан-внннн ўџ™ЊЊџџпнnfffэннюююююююннnfffэннюююююююннnfffэн§џџџЊџџяан-внннн ўџŸ™љџџпнfUefжннЮЮЬЬЬььннfUefжннЮЮЬЬЬььннfUefжн§џџяЊўџяан-внннн ўџянўџџпнmefffннЮюююююьннmefffннЮюююююьннmefffн§џџЏЊњџяан-внннн ўџонэџџпнfeffжннЮЮЮЬьььннfeffжннЮЮЮЬьььннfeffжн§џџЎЊъџяан-внннн ўџонэџџпнffffжннЮЮюююььннffffжннЮЮюююььннffffжн§џџЊЊЊџяан-внннн ўянннўџпнgfffнннЮЮюююььннgfffнннЮЮюююььннgfffнн§џяЊЊЊўяан-внннн ўянннўџпнgfffнннЮЮЮЬьььннgfffнннЮЮЮЬьььннgfffнн§џя™ЊЊўяан-внннн ўонннэџпнwfffжннЮюююююьннwfffжннЮюююююьннwfffжн§џо™йэяан-внннн ўюююююџпн}fffжннЮЮЬЬЬььнн}fffжннЮЮЬЬЬььнн}fffжн§џюююююяан-внннн ўџџџџџџпн~gfvчннюююююююнн~gfvчннюююююююнн~gfvчн§џџџџџџяан-внннн ўџџЏњџџпэнwfwнонЮЬЬЬЬЬьнэнwfwнонЮЬЬЬЬЬьнэнwfwно§џџџџџџяан-внннн ўџџЏњџџюон}wзнэюююююююююон}wзнэюююююююююон}wзнэюџџџџџџяан-вннннннннннннн ўџџЊЊџяонннннэонннннэонннннэонннннэонннннэўџџџџџяаннннннннннннннн-"""""""вннннннннннннннннннннннннннннннннннннннн ўџџЊЊџяўџџџџџяўџџџџџяаннннннн ўџџџџџяўџџџџџяўџџџџџяанннннннннннннннннннннннннннннннннннннннннннннннннннннн ўџЏЊЊњџюџџџџџџџюџџџџџџяа ўџџџџџџюџџџџџџџюџЊџџџџяаннннннн ўџЏЊЊњџџџџџџџџџџџџџџџџяа ўџџџџџџџџџџџџџџџџЊџџўџяаннннннн ўџŸЉЊњџџџџџџяўџџџџџџяўяа ўяўџџџџџџяўџџџџџЯЊнюќџяаннннннн ўџя™™юџЏњџџяоўџЏњџџяоўяа ўяэўџџџџџяЊўџџџџЏмЬЭўџяаннннннн ўџџоннўЏњџяонўџЏњџяонўяа ўянэўџџџџяЊэўџџџЊкЬэџџяаннннннн рџџянэџЊЊяоннўџЊЊяоннўяа ўяннэўџџџЏЊкэўџџЊк3§џџаннннннн рџџянэџЊЊонннўџЊЊонннўяа ўянннэўџџЏЊкнэўџ™мЬЭџџаннннннн рџџџоўЏЊЊкнннўЏЊЊкнннўяа ўянннэўџџЊЊЊнэўџЯ™нџќџаннннннн ўџџяўЏЊЊъоннўЏЊЊъоннўяа ўяннэўџџџЊЊЊэўџџџяўџџяаннннннн рџџяџŸЉЊњяонўŸЉЊњяонўяа ўянэўџџџџ™ЊЊўџџџџџўџџаннннннн ўџџџџ™™џџяоўџ™™џџяоўяа ўяэЎњџџџџŸ™љџџџџџџџџяаннннннн рџџџџџџџџџяўџџџџџџяўяа ўяўЏњџџџџяўџџџџџџџџџаннннннн юўџџџџџџџџџџџџџџџџџяа ўџџЊЊџџџџџџџџџџџџџяюаннннннн рюююююююююююџџџџџџяа ўџџЊЊџџюююююююююююанннннннннннннннн ўџџџџџяаннннннн ўџЏЊЊњяаннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн онннннэон­ЊЊкэююююююююююююююаннннннннннннннннннннннннннннннннннннннннэююююююююююююююююююžЉЊъююююююююююююююююююпннннннюнннннн§оннннннннЮЬЬЬЬЬьнннннннннЮЬЬ™™Ььннннннннннннннннэ§нннннннннннннпоннннннннюююююююнннннннннюююююююннннннннннннннннэнпннннmжннннн§ноннннннннЮЮЬЬЬььнонннннэнЮЮЬЬЬььнэнэнэнэнэfцнэнээн§ннfffжнннннпноннннннннЮюююююьнэнннннонЮюююююьнононононоVeжоноэннпfffffнннн§нноннннннннЮЮЮЬьььннонннэннЮЮЮЬьььэнэнэнэнэнVfцнэнэнн§fVUefffннпнноннннннннЮЮюююььэнэннноноЮЮюююььннононононffжнонюннmfUfffffн§ннноннннннннЮЮюююььэнэннн>гоЮЮюююььннононононgffнонюннmfefffffжпннноннннннннЮЮЮЬьььнноонэ=гнЮЮЮЬьььэнэнэнэнэнgffнэнэннmfefffffінннноннннннннЮюююююьнэнонэ=гнЮюююююьнононононоwgwоноэнннfefffffжнннноннннннннЮЮЬЬЬььнонэно3угЮЮЬЬЬььнэнэнэнэнэнwзэнээннmffffffffнннноннннннннюююююююннннюн33гюююююююннннннннннннннннэннmffffffffнннноннннннннЮЬЬЬЬЬьннэннн33гЮЬЬЬЬЬьннннннннннннннннэннmffffffffннннонннннннэююююююююннонэ"3уююююююююююююююююююююююююннmffffffffжнннонннннннннннннннннннннннннннннн онннннэонэно-"онннннэон}ffffffffжннэаннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн онэнонэNDDDDDфаннннннн он}ffffffffжннэанннннннннннннннннннннннннннннннннннннннн ононэнню433333Cо рюююююююююююнн}ffffffffжннноннннннн оэнннонM3333333д юонннmfнннннэнн}gfffffffжннноннннннн оннннннM3333333д рнннннmUfннннэнн}gfffffffжннноннннннн онннноэM3CDDD43д онннэнmefнэнээнннwfffffffжннноннннннн оннэюноM3C33343д рннннонnffноноэнннwfffffffжннноннннннн онfжнэнM3C#"243д онэнэнэ}ffцнэнэннн}gffffffжннноннннннн онVeжонN3C#"243д рннэноно}ffжнонюннн}wfffffffнннонРЬюююююрююююююнннн онVfжонN3C#"243д рннононо}wvзнонюнннпwgfffffінннонЬЭмннннэоннннннян@DдDDDDDDDн онffжэнM3C#"243д рннонэнэн}wэнэнэнн§н}wfffffнпннонЬммннннннннннн§энн@@DM@н онgffноM3C33343д оннэннононононоэннпннwwfffwн§ннонЬ§мннннfннннннпэн@DнDD@@D@Dн онgffнэM3CDDD43д онннюоэнэнэнэнээн§ннннwwwwзннпнонЮЬпнmfffннннн§нэнд@DDDнDн онwgwннM3333333д оннннннннннннннэнпннннннwзннн§нонон§mffffжннннпнэнDDн@D@DDDDн оноwчннM3333333д оmfннонннннннннэ§нннннннннннннпононнofUUfffжн§ннэнннн оэннноню433333Cо оmUfэннюююююююююпннннннюнннннн§ононнfVeffffжнпннэнDDднDнDндннннннннннннннннн оннюннэNDDDDDфаннннннн оmefонэююююююююююююююаннннннннннннноннfVffffff§нннэннннннннDннMDнDндннннннннннннннннн онэнонэоннюннэоmffннэаннннннннннннннннннннннннннннннннннннноннfVffffffпнннэннннннннDDнD@Dнн ононэннюнэнннонюююююююююн}ffжоэанннноннmVffffffннннэн@дDD@Dнн оэннноннннонэнннннннннннн}ffцнэанннноннffffffffжнннэнDDн@нн онннннннннэнонннннннннннн}wvзнэанннноннffffffffжнннэнннн онннюоfжээнюннэнэmfнэнэнээ}wннэанннноннffffffffжнннэнннн оннэннVeжноннноноmUfононоэннннэанннноннfffffffffнннэнннн рннонэVfжноннэнэнmefнэнэнэннннаннннрннgffffffffннннРЬннннннрЬDDDDD рннонЯЬннннннононnffнЮЬнннннонаРЬннннннРЬннннн нрннgffffffffннннЬЭмннннюнЮЬ33333ф рннэнЬЮьююююоонон~ffжЬЮьюююююнаЬЮьююююянЬЮьююююпноннgffffffffнннэнЬмlffнэннЬУ33333C онэнЬььююююоэнэн}ffжЬЬЬЬЬЬЬоэаЬььюююўонЬььюююўононнwffffffffнннэнЬэlffжоннЬЬ<3333C рнннЬюьююююононо}wvзЬюьююююоаЬўьюююяонЬўьюююяононнwffffffffнннэнЭЬVUffннн4УDDDD3C оннЯЬюююююонэнэн}wэЭЬЬЬЬЬЮоаЭЬџџџџюонЭЬDDDDюононн}gfffffffнннэнннVfffжнн43433C3C рнняююоэююоннннннннэьююююЮоаэюџ33џюонэю$""Bюононн}gfffffffнннэннmVfffннн434""C3C юояююннююоннннннннэььЬЬЮЮоаэюЏ<Уњюонэю$BDBюононннwfffffffнннэннmffffннн434""C3C ряюоннэюоююююююююэььююЮЮоаэюЏЪЌњюонэю$D$Bюононннwgffffffжннэнн}fffжнннннннннн434""C3Cнн яюоннэюоэььююЮЮоанннннэюЏЪЌњюоннннннннэю$"DBюоннннннннонн§}wffffffпннэннннннннн}fffжнннннннннн434""C3CнннннннняююннююоннннннннэььЬЬЮЮоннннннннэюЏ<Уњюоннннннннэю$B"Bюонннннннноннпнwgffffж§ннэннннннннн}gfffннн43433C3CняююоэююонэьююююЮонэюџ33џюонэю$""Bюонон§нн}wgffvзнпнэнннgfffннн43DDDD3CняююююююонэьЬЬЬЬЮонэюџџџџюонэюDDDDюононпннн}wwwwнн§нэннэwffwонн4333333Cняююююююонэююююююонэўююююяонэўююююяоно§нннннн}wннннпэнно}gvзэнн4333333CняююююююонэЬЬЬЬЬЬонэяююююўонэяююююўонопнннннннннннн§энюннwwннюнN333333фняююююююонююююююююнўююююююян§ююююююпнўннннннэоннннннянрнннннннрDDDDDDнџџџџџџџџнрнннннннрнннннннанннннн нрююююююрююююююнVe-- title: Little Factory -- author: Sava -- desc: A factory game. There's no goal, just experiment! -- license: MIT License -- version: 0.1 -- script: lua w=240 h=136 grid={} gridW=50 gridH=50 t=0 playerX=gridW*8 playerY=gridH*8 playerSpdX, playerSpdY = 0, 0 camX, camY = playerX-w/2, playerY-h/2 view=0 money=100 place=false placeConv=false placePipe=false sx, sy = 0, 0 placeSelect=false selected=1 convSpeed = 1 power = 0 tutClosed = false stateDesc = { "Solid", "Liquid", "Plasma", "Gas" } elements = { {name="Beginium", desc="The start of everything. Highly unstable", state=1, idx=257, cost=1}, {name="Water", desc="One of the 2 starting elements. Very heat resistant", state=2, idx=258, cost=2}, {name="Fire", desc="One of the 2 starting elements. Produces heat", state=3, idx=259, cost=2}, {name="Earth", desc="One of the 3 starting elements. It just doesn't care (UNUSED)", state=1, idx=260, cost=2}, {name="Steam", desc="A 2nd level element", state=4, idx=261, cost=3} } buildingShop = { {name="Beginium input", desc="Supply of Beginium", price=10}, {name="Selling point", desc="Sells elements", price=20}, {name="Router", desc="Splits the input into multiple directions\n\"EVIL\" - Mindustry", price=20}, {name="Refiner", desc="Splits Beginium into Water and Fire", price=30}, {name="Heater", desc="Heats Water with Fire", price=50}, {name="Steam generator", desc="Turns steam into power!", price=100}, {name="BIG Beginium input", desc="Powerful supply of Beginium. Uses power", price=30} } buildingTile = { {size=2, idx=2, inpUpdate=function(i, j) grid[i][j].allowInp = false end, update=function(i, j) grid[i][j].progress = grid[i][j].progress + 0.02 if grid[i][j].progress >= 1 then grid[i][j].out[1] = grid[i][j].out[1] + 1 grid[i][j].progress = 0 end grid[i][j].state = 1 end}, {size=2, idx=4, inpUpdate=function(i, j) grid[i][j].allowInp = true for i1=1, #elements do grid[i][j].allowedInps[i1] = true end end, update=function(i, j) for idx,i1 in ipairs(grid[i][j].inp) do money = money + elements[idx].cost * i1 grid[i][j].inp[idx] = 0 end grid[i][j].state = 1 end}, {size=2, idx=128, inpUpdate=function(i, j) grid[i][j].allowInp = true for i1=1, #elements do grid[i][j].allowedInps[i1] = true end end, update=function(i, j) for i1=1, #elements do grid[i][j].out[i1] = grid[i][j].out[i1] + grid[i][j].inp[i1] end grid[i][j].inp = nothing() grid[i][j].state = 1 end}, {size=2, idx=130, inpUpdate=function(i, j) grid[i][j].allowInp = true grid[i][j].allowedInps[1] = true end, update=function(i, j) if grid[i][j].inp[1] > 0 then grid[i][j].state = 1 grid[i][j].progress = grid[i][j].progress + 0.1 if grid[i][j].progress >= 1 then grid[i][j].inp[1] = grid[i][j].inp[1] - 1 grid[i][j].out[2] = grid[i][j].out[2] + 1 grid[i][j].out[3] = grid[i][j].out[3] + 1 --grid[i][j].out[4] = grid[i][j].out[4] + 1 grid[i][j].progress = 0 end else grid[i][j].progress = 0 end end}, {size=2, idx=132, inpUpdate=function(i, j) grid[i][j].allowInp = true grid[i][j].allowedInps[2] = true grid[i][j].allowedInps[3] = true end, update=function(i, j) if grid[i][j].inp[2] > 1 and grid[i][j].inp[3] > 0 then grid[i][j].state = 1 grid[i][j].progress = grid[i][j].progress + 0.1 if grid[i][j].progress >= 1 then grid[i][j].inp[2] = grid[i][j].inp[2] - 2 grid[i][j].inp[3] = grid[i][j].inp[3] - 1 grid[i][j].out[5] = grid[i][j].out[5] + 1 grid[i][j].progress = 0 end else grid[i][j].progress = 0 end end}, {size=2, idx=134, inpUpdate=function(i, j) grid[i][j].allowInp = true grid[i][j].allowedInps[5] = true end, update=function(i, j) if grid[i][j].inp[5] > 0 then grid[i][j].state = 1 grid[i][j].progress = grid[i][j].progress + 0.1 if grid[i][j].progress >= 1 then grid[i][j].inp[5] = grid[i][j].inp[5] - 1 power = power + 10 grid[i][j].progress = 0 end else grid[i][j].progress = 0 end end}, {size=4, idx=104, inpUpdate=function(i, j) grid[i][j].allowInp = false end, update=function(i, j) if power > 1 then grid[i][j].progress = grid[i][j].progress + 0.2 if grid[i][j].progress >= 1 then power = power - 2 grid[i][j].out[1] = grid[i][j].out[1] + 1 grid[i][j].progress = 0 end grid[i][j].state = 1 else grid[i][j].progress = 0 end end} } buildings = {} neighbors = { {{0, -1}, {1, 0}, {0, 1}, {-1, 0}}, {{0, -1}, {1, -1}, {2, 0}, {2, 1}, {1, 2}, {0, 2}, {-1, 1}, {-1, 0}} } function nothing() local arr = {} for i=1, #elements do arr[i] = 0 end return arr end function nothing2() local arr = {} for i=1, #elements do arr[i] = false end return arr end function BOOT() --trace("-----------START-----------") grid={} for i=1, gridW do grid[i]={} for j=1, gridH do grid[i][j]=new(0) end end for i=1, #buildingShop do buildings[i] = 0 end end lefth, lefth = false, false leftp, rightp = false, false leftr, rightr = false, false function TIC() mx, my, left, middle, right, _, scrolly = mouse() leftp, rightp = false, false leftr, rightr = false, false if left and not lefth then lefth = true leftp = true tutClosed = true end if lefth and not left then lefth = false leftr = true end if right and not righth then righth = true rightp = true end if righth and not right then righth = false rightr = true end if leftp then sx, sy = screenToWorld(mx, my) end if key(23) and playerSpdY > -3 then playerSpdY = playerSpdY - 1 end if key(1) and playerSpdX > -3 then playerSpdX = playerSpdX - 1 end if key(19) and playerSpdY < 3 then playerSpdY = playerSpdY + 1 end if key(4) and playerSpdX < 3 then playerSpdX = playerSpdX + 1 end if keyp(5) and not left then view=view+1 view=view%3 end if keyp(48) then placeSelect = not placeSelect end if keyp(17) then tutClosed = not tutClosed end if keyp(3) then placeConv = not placeConv or placePipe placePipe = false end if keyp(22) then placeConv = not placePipe placePipe = not placePipe end playerSpdX = playerSpdX * 0.9 playerSpdY = playerSpdY * 0.9 playerX = playerX + playerSpdX playerY = playerY + playerSpdY camX = camX * 0.9 + (playerX-w/2) * 0.1 camY = camY * 0.9 + (playerY-h/2) * 0.1 for i=1, gridW do for j=1, gridH do if grid[i][j].type == 2 then grid[i][j].state = 0 grid[i][j].blocked = true grid[i][j].update(i, j) grid[i][j].inpUpdate(i, j) elseif grid[i][j].type == 1 then if grid[i][j].item ~= nil then grid[i][j].item.progress = grid[i][j].item.progress + 1 if grid[i][j].item.progress > convSpeed*16 then local ci, cj = dirC(grid[i][j].outd) ci, cj = ci+i, cj+j if inGrid(ci, cj) then if grid[ci][cj].type == 1 then if grid[ci][cj].item == nil and grid[ci][cj].ctype == grid[i][j].ctype then grid[ci][cj].item = {dx=i-ci, dy=j-cj, progress=0, idx=grid[i][j].item.idx} grid[i][j].item = nil else grid[i][j].item.progress = convSpeed*16 end elseif grid[ci][cj].type == 2 then grid[ci][cj].inpUpdate(ci, cj) if grid[ci][cj].allowInp and grid[ci][cj].allowedInps[grid[i][j].item.idx] then grid[ci][cj].inp[grid[i][j].item.idx] = grid[ci][cj].inp[grid[i][j].item.idx] + 1 grid[i][j].item = nil else grid[i][j].item.progress = convSpeed*16 end else grid[i][j].item.progress = convSpeed*16 end else grid[i][j].item.progress = convSpeed*16 end end end end end end for i=1, gridW do for j=1, gridH do if grid[i][j].type == 2 then local size = buildingTile[grid[i][j].building].size/2 local neigh = neighbors[size][grid[i][j].outIdx] local ci, cj = i+neigh[1], j+neigh[2] local hasOut = false for idx,i1 in ipairs(grid[i][j].out) do if i1 ~= 0 then hasOut = true --trace(buildingShop[grid[i][j].building].name.." : "..idx) if inGrid(ci, cj) then if (grid[ci][cj].type == 2 and grid[ci][cj].allowInp) or grid[ci][cj].type == 3 then if grid[ci][cj].type == 3 then ci, cj = grid[ci][cj].masterx, grid[ci][cj].mastery end grid[ci][cj].inpUpdate(ci, cj) if not grid[ci][cj].allowInp or not grid[ci][cj].allowedInps[idx] then break end grid[ci][cj].inp[idx] = grid[ci][cj].inp[idx] + 1 grid[i][j].out[idx] = grid[i][j].out[idx] - 1 grid[i][j].blocked = false grid[ci][cj].inpUpdate(ci, cj) elseif grid[ci][cj].type == 1 and grid[ci][cj].item == nil then local outx, outy = dirC(grid[ci][cj].outd) if (outx+ci ~= i or outy+cj ~= j) and (grid[ci][cj].ctype == 1 and (elements[idx].state ~= 2 and elements[idx].state ~= 4) or (grid[ci][cj].ctype == 0 and (elements[idx].state == 2 or elements[idx].state == 4))) then grid[ci][cj].item = {dx=i-ci, dy=j-cj, progress=0, idx=idx} grid[i][j].out[idx] = grid[i][j].out[idx] - 1 grid[i][j].blocked = false end end end end end if grid[i][j].blocked and hasOut then grid[i][j].state = 2 end if hasOut then grid[i][j].outIdx = grid[i][j].outIdx % #neighbors[size] + 1 end grid[i][j].inpUpdate(i, j) end end end cls(0) if not placeSelect then for i=camX//16, (camX+w)//16 do for j=camY//16, (camY+h)//16 do local x, y = worldToScreen(i*16, j*16) if inGrid(i, j) then if grid[i][j].type == 1 then gridConv(i, j, grid[i][j].outd, grid[i][j].ctype == 0 and t or 0, grid[i][j].ctype) elseif grid[i][j].type == 0 then worldSpr(0, i*16, j*16, 2) elseif grid[i][j].type == 2 then worldSpr(buildingTile[grid[i][j].building].idx, i*16, j*16, buildingTile[grid[i][j].building].size) elseif grid[i][j].type == 3 then i1, j1 = grid[i][j].masterx, grid[i][j].mastery worldSpr(buildingTile[grid[i1][j1].building].idx, i1*16, j1*16, buildingTile[grid[i1][j1].building].size) end end end end for i=camX//16, (camX+w)//16 do for j=camY//16, (camY+h)//16 do local x, y = worldToScreen(i*16, j*16) if inGrid(i, j) and grid[i][j].type == 1 then if grid[i][j].item ~= nil then local ci, cj = dirC(grid[i][j].outd) local ix, iy = lerp(grid[i][j].item.dx, ci, grid[i][j].item.progress/convSpeed/16), lerp(grid[i][j].item.dy, cj, grid[i][j].item.progress/convSpeed/16) worldSpr(elements[grid[i][j].item.idx].idx, i*16+(ix+1)/2*16-4, j*16+(iy+1)/2*16-4, 1) end end if inGrid(i, j) and mx >= x and mx < x+16 and my >= y and my < y+16 then local dx, dy, size = x, y, 16 if grid[i][j].type == 3 then dx, dy = worldToScreen(grid[i][j].masterx*16, grid[i][j].mastery*16) size = (buildingTile[grid[grid[i][j].masterx][grid[i][j].mastery].building].size/2)*16 end if grid[i][j].type == 2 then size = (buildingTile[grid[i][j].building].size/2)*16 end rectb(dx, dy, size, size, 2) if grid[i][j].type == 2 or grid[i][j].type == 3 then local building = grid[i][j].building if grid[i][j].type == 3 then i, j = grid[i][j].masterx, grid[i][j].mastery end local u = buildingShop[grid[i][j].building] --rectb(x, h-(buildingTile[building].size/2) * 16, (buildingTile[building].size/2) * 16, (buildingTile[building].size/2) * 16, 2) local nameL = print(u.name, 0, -1000) local descL = print(u.desc, 0, -1000) local _, descS = u.desc:gsub("\n", "\n") local width, height = math.max(nameL, descL)+3, (descS+1)*7+9+(descS == 0 and 1 or 0) rect(mx, my-5-height, width, height, 13) rectb(mx, my-5-height, width, height, 14) print(u.name, (width-nameL)/2+mx+1, my-3-height) local i1 = 0 for t in u.desc:gmatch("[^\n]*") do i1=i1+1 local len = print(t, 0, -1000) print(t, (width-len+1)/2+mx, my-3-height+i1*7) end if middle then selected = grid[i][j].building place = true end local amount = 0 for idx,i in ipairs(grid[i][j].out) do if i ~= 0 then spr(elements[idx].idx, mx+9*idx, my, 2, 0) amount=amount+i end end for idx,i in ipairs(grid[i][j].inp) do if i ~= 0 then spr(elements[idx].idx, mx+9*idx, my, 2, 0) amount=amount+i end end print(amount, mx, my+10, 12) end empty = true for i1=1, buildingTile[selected].size/2 do for j1=1, buildingTile[selected].size/2 do if not inGrid(i+i1-1, j+j1-1) or grid[i+i1-1][j+j1-1].type ~= 0 then empty = false end end end if place and empty then spr(buildingTile[selected].idx, x, y, 0, 1, 0, 0, buildingTile[selected].size, buildingTile[selected].size) rectb(x, y, (buildingTile[selected].size/2) * 16, (buildingTile[selected].size/2) * 16, 2) if leftp and buildings[selected] > 0 then sfx(2) buildings[selected] = buildings[selected] - 1 grid[i][j] = new(2) grid[i][j].building = selected grid[i][j].inpUpdate = buildingTile[selected].inpUpdate grid[i][j].inpUpdate(i, j) grid[i][j].update = buildingTile[selected].update --trace("--------Placed ".. buildingShop[selected].name .."--------") for i1=1, buildingTile[selected].size/2 do for j1=1, buildingTile[selected].size/2 do if i+i1-1 ~= i or j+j1-1 ~= j then grid[i+i1-1][j+j1-1] = new(3) grid[i+i1-1][j+j1-1].masterx = i grid[i+i1-1][j+j1-1].mastery = j end end end end end if rightp and grid[i][j].type == 2 then local building = grid[i][j].building for i1=1, buildingTile[building].size/2 do for j1=1, buildingTile[building].size/2 do grid[i+i1-1][j+j1-1]=new(0) end end buildings[building] = buildings[building] + 1 elseif rightp and grid[i][j].type == 3 then local bi, bj = grid[i][j].masterx, grid[i][j].mastery local building = grid[bi][bj].building for i1=1, buildingTile[building].size/2 do for j1=1, buildingTile[building].size/2 do grid[bi+i1-1][bj+j1-1]=new(0) end end buildings[building] = buildings[building] + 1 elseif right and grid[i][j].type == 1 then grid[i][j]=new(0) end end end end print("$"..money, 0, h-30, 4) print(power.."V", 0, h-24, 4) local dx = 0 for i,b in ipairs(buildings) do spr(buildingTile[i].idx, dx, h-(buildingTile[i].size/2) * 16, 0, 1, 0, 0, buildingTile[i].size, buildingTile[i].size) print(b, dx, h-(buildingTile[i].size/2) * 16, 12) if selected == i and place then rectb(dx, h-(buildingTile[i].size/2) * 16, (buildingTile[i].size/2) * 16, (buildingTile[i].size/2) * 16, 2) end dx = dx + buildingTile[i].size * 16 end local dx = 0 for i,b in ipairs(buildings) do local u = buildingShop[i] if mx >= dx and mx < dx+(buildingTile[i].size/2)*16 and my >= h-(buildingTile[i].size/2) * 16 and my < h then rectb(dx, h-(buildingTile[i].size/2) * 16, (buildingTile[i].size/2) * 16, (buildingTile[i].size/2) * 16, 2) local nameL = print(u.name, 0, -1000) local descL = print(u.desc, 0, -1000) local _, descS = u.desc:gsub("\n", "\n") local width, height = math.max(nameL, descL)+3, (descS+2)*7+9+(descS == 0 and 1 or 0) local x, y = math.min(mx, w-width), my rect(x, y-5-height, width, height, 13) rectb(x, y-5-height, width, height, 14) print(u.name, (width-nameL)/2+x+1, y-3-height) local i1 = 0 for t in u.desc:gmatch("[^\n]*") do i1=i1+1 local len = print(t, 0, -1000) print(t, (width-len+1)/2+x, y-3-height+i1*7) end local len = print("You have "..b, 0, -1000) print("You have "..b, (width-len+1)/2+x, y-12) if leftp then selected = i place = true placeConv = false placePipe = false end end dx = dx + buildingTile[i].size * 16 end if (left or leftr) and placeConv and view == 0 then local wmx, wmy = screenToWorld(mx, my) local ci, cj = math.abs(wmx-sx), math.abs(wmy-sy) if ci > cj then ci = sign(wmx-sx) cj = 0 else cj = sign(wmy-sy) ci = 0 end --print(ci..", "..cj) local outd = 1 if cj == -1 then outd = 1 end if ci == 1 then outd = 2 end if cj == 1 then outd = 3 end if ci == -1 then outd = 4 end for i1=0, math.max(math.abs(wmx-sx)//16, math.abs(wmy-sy)//16) do local i, j = i1*ci, i1*cj i, j = i+sx//16, j+sy//16 if i > 0 and j > 0 and i <= gridW and j <= gridH and (grid[i][j].type == 0 or grid[i][j].type == 1) then local x, y = worldToScreen(i*16, j*16) gridConv(i, j, outd, placePipe and 1 or 0) --conveyor(2, 0, 1, 0, i*16, j*16, math.floor(t), 0) if leftr then grid[i][j] = new(1) grid[i][j].type = 1 grid[i][j].ctype = placePipe and 0 or 1 grid[i][j].outd = outd sfx(2) end end end end worldSpr(256, playerX, playerY, 1) if view == 1 then for i=1, gridW do for j=1, gridH do if grid[i][j].type == 2 then pix(i-1, j-1, (1-grid[i][j].progress)*3+12) elseif grid[i][j].type == 3 then i1, j1 = grid[i][j].masterx, grid[i][j].mastery pix(i-1, j-1, (1-grid[i1][j1].progress)*3+12) elseif grid[i][j].type == 1 then pix(i-1, j-1, 15) else pix(i-1, j-1, 0) end end end elseif view == 2 then for i=1, gridW do for j=1, gridH do if grid[i][j].type ~= 0 then i1, j1 = i, j if grid[i][j].type == 3 then i1, j1 = grid[i][j].masterx, grid[i][j].mastery end pix(i-1, j-1, grid[i1][j1].state == 0 and 2 or (grid[i1][j1].state == 1 and 6 or 14)) else pix(i-1, j-1, 0) end end end end if view ~= 0 and mx > 0 and mx <= gridW and my > 0 and my <= gridH then local x, y = math.max(mx-w/32, 0), math.max(my-h/32, 0) local ex, ey = math.min(mx+w/32, gridW+1), math.min(my+h/32, gridH+1) rectb(x, y, ex-x, ey-y, 2) playerX, playerY = mx*16+4, my*16+4 end else local dx = 0 for i,u in ipairs(buildingShop) do spr(buildingTile[i].idx, dx, 0, 0, 1, 0, 0, buildingTile[i].size, buildingTile[i].size) print("$"..u.price, dx, (buildingTile[i].size/2) * 15 + 2, money >= u.price and 4 or 15, false, 1, true) if mx >= dx and mx < dx+(buildingTile[i].size/2) * 16 and my < (buildingTile[i].size/2) * 16 and my >= 0 then rectb(dx, 0, (buildingTile[i].size/2) * 16, (buildingTile[i].size/2) * 16, 2) local nameL = print(u.name, 0, -1000) local descL = print(u.desc, 0, -1000) local _, descS = u.desc:gsub("\n", "\n") local width, height = math.max(nameL, descL)+3, (descS+2)*7+9+(descS == 0 and 1 or 0) local x, y = math.min(mx, w-width), math.min(my, h-height) rect(x, y+20, width, height, 13) rectb(x, y+20, width, height, 14) print(u.name, (width-nameL)/2+x+1, y+22) local i1 = 0 for t in u.desc:gmatch("[^\n]*") do i1=i1+1 local len = print(t, 0, -1000) print(t, (width-len+1)/2+x, y+22+i1*7) end local len = print("$"..u.price, 0, -1000) print("$"..u.price, (width-len+1)/2+x, y+22+(descS+2)*7, money >= u.price and 4 or 15) if leftp then if money >= u.price then sfx(1) money=money-u.price if not buildings[i] then buildings[i] = 0 end buildings[i] = buildings[i] + 1 else sfx(0) end end end dx = dx + buildingTile[i].size * 16 end print("$"..money, 0, h-10, 4, false, 2) end if left and view ~= 0 then view = 0 placeConv = false end if right then place = false end if placeConv and not placePipe then rect(0, 0, 54, 7, 14) print("CONV MODE", 1, 1) elseif placeConv and placePipe then rect(0, 0, 54, 7, 14) print("PIPE MODE", 1, 1) end if not tutClosed then print("E to change minimap view\nSpace to open shop\nWASD/arrows to move\nC to place conveyors\nV to place pipes\nLMB to close this\nQ to show this again", 0, 10, 4) end t=t+1 end function lerp(a, b, t) return a+(b-a)*t end --function inpUpdateConv(i, j) --local amount = 0 --for idx,i in ipairs(grid[i][j].inp) do --if i ~= 0 then --amount=amount+1 --end --end --for idx,i in ipairs(grid[i][j].out) do --if i ~= 0 then --amount=amount+1 --end --end --grid[i][j].allowInp = amount == 0 --if amount == 0 then --grid[i][j].state = 2 --grid[i][j].active = false --end --end --function updateConv(i, j) --local amount = 0 --for idx,i in ipairs(grid[i][j].out) do --if i ~= 0 then --amount=amount+1 --end --end --if grid[i][j].progress >= 1 then --if amount == 0 then --grid[i][j].out = grid[i][j].inp --grid[i][j].inp = nothing() --end --grid[i][j].progress = 0 --end --grid[i][j].progress = grid[i][j].progress + 0.1 --end function gridConv(i, j, out, type) dirs = {0, 0, 0, 0} if j > 1 then dirs[1] = (grid[i][j-1].type == 2 or grid[i][j-1].type == 3) and 1 or ((grid[i][j-1].type == 1 and grid[i][j-1].outd == 3) and 1 or 0) end if i < gridW then dirs[2] = (grid[i+1][j].type == 2 or grid[i+1][j].type == 3) and 1 or ((grid[i+1][j].type == 1 and grid[i+1][j].outd == 4) and 1 or 0) end if j < gridH then dirs[3] = (grid[i][j+1].type == 2 or grid[i][j+1].type == 3) and 1 or ((grid[i][j+1].type == 1 and grid[i][j+1].outd == 1) and 1 or 0) end if i > 1 then dirs[4] = (grid[i-1][j].type == 2 or grid[i-1][j].type == 3) and 1 or ((grid[i-1][j].type == 1 and grid[i-1][j].outd == 2) and 1 or 0) end dirs[out] = 2 if dirs[1] + dirs[2] + dirs[3] + dirs[4] - 2 == 0 then dirs[(out+1)%4+1] = 1 end local x, y = worldToScreen(i*16, j*16) conveyor(dirs[1], dirs[2], dirs[3], dirs[4], x, y, type == 0 and t//convSpeed or 0, type) end function conveyor(dir1, dir2, dir3, dir4, x, y, t, type) if dir1 + dir2 + dir3 + dir4 - 2 ~= 1 then conveyor2(dir1, dir2, dir3, dir4, x, y, t, type) return end t1, t2 = type == 0 and 32 or 6, type == 0 and 40 or 8 if dir1 == 1 and dir3 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 2, 0, 2, 2) end if dir2 == 1 and dir4 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 3, 2, 2) end if dir3 == 1 and dir1 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 0, 2, 2) end if dir4 == 1 and dir2 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 1, 2, 2) end if dir1 == 1 and dir2 == 2 then spr(t2+(t%4)*2, x, y, 0, 1, 2, 0, 2, 2) end if dir2 == 1 and dir3 == 2 then spr(t2+(t%4)*2, x, y, 0, 1, 2, 3, 2, 2) end if dir3 == 1 and dir4 == 2 then spr(t2+(t%4)*2, x, y, 0, 1, 1, 0, 2, 2) end if dir4 == 1 and dir1 == 2 then spr(t2+(t%4)*2, x, y, 0, 1, 1, 3, 2, 2) end if dir2 == 1 and dir1 == 2 then spr(t2+(t%4)*2, x, y, 0, 1, 0, 3, 2, 2) end if dir3 == 1 and dir2 == 2 then spr(t2+(t%4)*2, x, y, 0, 1, 0, 0, 2, 2) end if dir4 == 1 and dir3 == 2 then spr(t2+(t%4)*2, x, y, 0, 1, 0, 1, 2, 2) end if dir1 == 1 and dir4 == 2 then spr(t2+(t%4)*2, x, y, 0, 1, 0, 2, 2, 2) end end function conveyor2(dir1, dir2, dir3, dir4, x, y, t, type) if dir1 + dir2 + dir3 + dir4 - 2 ~= 2 then conveyor3(dir1, dir2, dir3, dir4, x, y, t, type) return end t1, t2 = type == 0 and 72 or 12, type == 0 and 64 or 10 if dir1 == 1 and dir2 == 1 and dir3 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 1, 1, 2, 2) end if dir2 == 1 and dir3 == 1 and dir4 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 1, 0, 2, 2) end if dir3 == 1 and dir4 == 1 and dir1 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 1, 3, 2, 2) end if dir4 == 1 and dir1 == 1 and dir2 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 1, 2, 2, 2) end if dir1 == 2 and dir2 == 1 and dir3 == 1 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 3, 2, 2) end if dir2 == 2 and dir3 == 1 and dir4 == 1 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 0, 2, 2) end if dir3 == 2 and dir4 == 1 and dir1 == 1 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 1, 2, 2) end if dir4 == 2 and dir1 == 1 and dir2 == 1 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 2, 2, 2) end if dir1 == 1 and dir2 == 2 and dir3 == 1 then spr(t2+(t%4)*2, x, y, 0, 1, 0, 0, 2, 2) end if dir2 == 1 and dir3 == 2 and dir4 == 1 then spr(t2+(t%4)*2, x, y, 0, 1, 0, 1, 2, 2) end if dir3 == 1 and dir4 == 2 and dir1 == 1 then spr(t2+(t%4)*2, x, y, 0, 1, 0, 2, 2, 2) end if dir4 == 1 and dir1 == 2 and dir2 == 1 then spr(t2+(t%4)*2, x, y, 0, 1, 0, 3, 2, 2) end end function conveyor3(dir1, dir2, dir3, dir4, x, y, t, type) t1 = type == 0 and 96 or 14 if dir1 == 1 and dir2 == 1 and dir3 == 1 and dir4 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 2, 2, 2) end if dir2 == 1 and dir3 == 1 and dir4 == 1 and dir1 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 3, 2, 2) end if dir3 == 1 and dir4 == 1 and dir1 == 1 and dir2 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 0, 2, 2) end if dir4 == 1 and dir1 == 1 and dir2 == 1 and dir3 == 2 then spr(t1+(t%4)*2, x, y, 0, 1, 0, 1, 2, 2) end end function worldSpr(id, x, y, size) local x, y = worldToScreen(x, y) spr(id, math.floor(x), math.floor(y), 0, 1, 0, 0, size, size) end function screenToWorld(x, y) return camX+x, camY+y end function worldToScreen(x, y) return x-camX, y-camY end function dirC(idx) if idx == 1 then return 0, -1 end if idx == 2 then return 1, 0 end if idx == 3 then return 0, 1 end if idx == 4 then return -1, 0 end end function sign(x) return x > 0 and 1 or -1 end function inGrid(i, j) return i > 0 and i <= gridW and j > 0 and j <= gridH end function new(type) if type == 0 then return {type=0} elseif type == 1 then return {type=1, item=nil, outd=0, ctype=0} elseif type == 2 then return {type=2, blocked=false, state=0, progress=0, allowInp=false, allowedInps=nothing2(), inp=nothing(), out=nothing(), outIdx=1, building=nil, inpUpdate=function()end, update=function()end} elseif type == 3 then return {type=3, masterx=0, mastery=0} end end