From 8ea4c32e51aec089c149b4826aa88872700b880a Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Thu, 20 Aug 2026 15:16:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B2=D1=83=D0=BA=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B5=20=D1=8D=D1=84=D1=84=D0=B5=D0=BA=D1=82=D1=8B=20PoP:=20?= =?UTF-8?q?=D0=BE=D1=86=D0=B8=D1=84=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=B3=D0=B8=D0=BD=D0=B0=D0=BB=D0=B0=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20CBL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Набор digisnd1..3.dat приведён упаковщиком к 10 937,5 Гц (частота железа), склеен в 8 EMM-страниц с выравниванием каждого звука на 128 — размер блока запроса CBL, поэтому ни один блок не пересекает границу страницы и проигрыватель не знает слова «стык». Насос (pop_sfx.c) резидентный: его зовут из прерывания CBL, из горячих мест физики и из play_seq. Тишину льём свою (первый блок набора), а не через CBL_UNDERRUN_SILENCE с его malloc — куча в резиденте W2 тесная. Открытие CBL разведено с загрузкой (pop_sfx_start отдельно от pop_sfx_init): пока ESTEX читает файлы, насос не успевает долить блок и железо крутит хвост буфера — на слух скрежет. Разведены все места play_sound() SDLPoP, у которых есть оцифровка (id 0..23, 44..49): посадки, падение, удары о стену, зацеп, тряска и провал плит, ворота, дверь уровня, пики, чомпер, кнопки, боёвка, меч, зеркало, скелет, зелье. Таблица соответствий — docs/sound_plan.md §8. Музыкальные id остаются с нулевой длиной до фазы музыки. Co-Authored-By: Claude Opus 5 --- applications/PoP/docs/sound_plan.md | 50 ++++++++ applications/PoP/poc/res/sound/s0.bin | 2 +- applications/PoP/poc/res/sound/s1.bin | 4 +- applications/PoP/poc/res/sound/s2.bin | 4 +- applications/PoP/poc/res/sound/s3.bin | Bin 16384 -> 16384 bytes applications/PoP/poc/res/sound/s4.bin | 4 +- applications/PoP/poc/res/sound/s5.bin | 2 +- applications/PoP/poc/res/sound/s6.bin | 2 +- applications/PoP/poc/res/sound/s7.bin | 2 +- applications/PoP/roomtest/Makefile | 15 ++- applications/PoP/roomtest/_pop_sfx.h | 26 ++++ applications/PoP/roomtest/guards.c | 8 +- applications/PoP/roomtest/pop_ctrl.c | 4 +- applications/PoP/roomtest/pop_kid.c | 29 +++-- applications/PoP/roomtest/pop_map.c | 79 +++++++++--- applications/PoP/roomtest/pop_room.c | 3 + applications/PoP/roomtest/pop_sfx.c | 121 +++++++++++++++++++ applications/PoP/roomtest/pop_sfx.h | 15 ++- applications/PoP/roomtest/pop_sfx_cold.c | 76 ++++++++++++ applications/PoP/roomtest/pop_sound_tbl.h | 71 ++++++----- applications/PoP/roomtest/pop_trob.c | 31 +++-- applications/PoP/roomtest/roomtest.c | 56 +-------- applications/PoP/roomtest/roomtest_cold.c | 73 +++++++++++ applications/PoP/roomtest/roomtest_cold.h | 4 + applications/PoP/toolchain/pop_pack_sound.py | 17 ++- 25 files changed, 561 insertions(+), 137 deletions(-) create mode 100644 applications/PoP/roomtest/_pop_sfx.h create mode 100644 applications/PoP/roomtest/pop_sfx.c create mode 100644 applications/PoP/roomtest/pop_sfx_cold.c diff --git a/applications/PoP/docs/sound_plan.md b/applications/PoP/docs/sound_plan.md index 5ba3d8c..d3369fb 100644 --- a/applications/PoP/docs/sound_plan.md +++ b/applications/PoP/docs/sound_plan.md @@ -333,3 +333,53 @@ IBM PC 1989 года: один квадратный голос. Он у нас Если позже захочется богаче — материал уже будет разобран, и можно разложить те же мелодии на три канала AY (бас/мелодия/арпеджио), не трогая ни данные, ни секвенсор. + +--- + +## 8. Разводка вызовов по коду (сделано 2026-08-20) + +Портированы ВСЕ места `play_sound()` SDLPoP, у которых есть оцифровка +(id 0..23, 44..49, 51 — остальные id это музыка, у них в +`pop_sound_tbl.h` длина 0, и вызов просто глушит текущий эффект). + +| id | что | где у нас | оригинал | +|----|-----|-----------|----------| +| 0 | разбился насмерть | `pop_map.c` land | seg005 | +| 1 | крик падения | `pop_map.c` do_fall | seg005:39 | +| 2 | плита рухнула | `pop_room.c` (обе ветки посадки) | seg007 | +| 3 | кнопка нажата | `pop_trob.c` | seg007 | +| 4/5/6/7 | ворота: закрываются / открываются / рухнули / стоп | `pop_trob.c` | seg007 | +| 8 | удар о стену | `pop_map.c` bumped_fall/bumped_floor + seqtbl | seg004/seg006 | +| 9 | зацеп за карниз | `pop_map.c` check_grab | seg006 | +| 11 | свист клинка мимо | `guards.c` check_hurting | seg002:0DAE | +| 12/13 | ранен соперник / Кид | `guards.c` hurt_by_sword | seg002:0C1F | +| 13 | Кид ранен зельем | `pop_map.c` ветка «злого» зелья | seg006:1894 | +| 14/15 | дверь уровня: закрывается / едет | `pop_trob.c` | seg007 | +| 16 | средняя посадка; толчок о стража | `pop_map.c` land / bump_into_opponent | seg005/seg003:0654 | +| 17 | мягкая посадка | `pop_map.c` land | seg005 | +| 18 | пьёт | seqtbl (SEQ_SOUND) | seg006 | +| 19 | вынул меч | `pop_ctrl.c` | seg005:945 | +| 20/21/22 | дрожит плита | `pop_map.c` loose_shake | seg007:0E55 | +| 23 | шаг | seqtbl (SEQ_SOUND) | seg006 | +| 44 | скелет оживает | `guards.c` pop_check_skel | seg002:106D | +| 45 | прыжок в зеркало | `pop_map.c` jump_through_mirror | seg003:0617 | +| 46 | сожрал чомпер | `pop_map.c` | seg004 | +| 47 | чомпер щёлкнул | `pop_trob.c` (кадр 2) | seg007 | +| 48 | напоролся на пики | `pop_map.c` | seg005 | +| 49 | пики пошли | `pop_map.c` start_anim_spike | seg007:08F6 | + +Что осталось не разведено — только МУЗЫКА (25 презентация, 26 объятия, +27/35/40 заставки, 29 встреча Джафара, 30/33 зелья, 32/41 конец уровня, +36 время вышло, 37 победа, 43 смерть Джафара, 50/52/53 сюжетные вставки) +и 51 (дверь принцессы, тоже из заставки). Их черёд — фаза «музыка». + +**Квирк, за которым следить.** Звук ворот у оригинала звучит не всегда, а +по условию видимости (`play_door_sound_if_visible`, seg007:1250): либо +ворота в комнате слева и стоят в 9-й колонке, либо ворота в НАРИСОВАННОЙ +комнате и колонка не 9-я. У нас это параметр `audible` у `animate_door`. + +**Тряска плиты — свой домен prandom.** Оригинал берёт номер сэмпла (20/21/22) +из общего генератора и вдобавок «сжигает» один бросок ради совместимости с +DOS-версией; у нас последовательности разведены по доменам +(`impl_diff.md`), поэтому у тряски свой сид, а холостой бросок не делаем — +на розыгрыши физики и кладки это не влияет. diff --git a/applications/PoP/poc/res/sound/s0.bin b/applications/PoP/poc/res/sound/s0.bin index 00c2472..276ca8f 100644 --- a/applications/PoP/poc/res/sound/s0.bin +++ b/applications/PoP/poc/res/sound/s0.bin @@ -1 +1 @@ -{{yzyz}}iG0!#=]t_PLI_q}}R]g`E*JG^Ƽc9%.GME5( !A[{ǻ|zkdkgnmZ\K:/4<>Snw|}mUVRH8-4NoX[x˹u|o{y`MXvqmQKabl|yȰξbcszif_x}ib_aNK[aoz~i[P7JowfD4OfjZOQS\lx}wpxflearvsq|~|lenkJBVw|wxpprWVg|tfPWtxZc~||^o}}sS\ns`X]nt~jhnmulhXY[`u~pjnqlqzraOKKUWYiosxtgbturk^YR`s~~{up{xtxtpzmhovyw~yvxxivtoy|ypuglwxwnlz{}{}yqvxyyr}rpy}wzxpsu||~|zuqkopopnsuz{|{vnmpu{swstuv{ljsxxuhvw||t{~}xu{}|xwzyrqv||zz~zxuqty|vv|}zz{uswuuwtonsx|~|urtyyux~~}|}{}xvtyyqinnptx}{zz{|zvy}z{|||~~tx|}||||{zxwyxz{tqx~}~|ustx{{yxz}|||}}}z{|~~{z~}}}|~~|zw|~}y{{}}{~~}zxzz|{{z~~}}~}}z~~xuy}~~}||}}{{|yx||z{}yxyyxy{}|~|{{~~}~}||zz{}}~}}}~~|z{{~||}yxxy~~~~||yzz}|}||~~z{~}{|{yy{~~|||}~~}}~~~~~}}~~~}}~~}}}z|}~~}||~yy{}~~}|~~|{}}|z}~}|}~~~~|zyyy{|}}zyzyxy{||zxz|}~}~~{{~yy{|||~~~|}~~}|{|}~~~~~}||{{|}~~}}~~~~~~}~}||~}y{~|{}yxy}wx~vttzyy}|z}{|~wwzztv|zsqyzz}~}}|trxtkjvwty|~|wt{tjnzurvy~vt|xx~wpt|ulnyuopxww{~~tnuxibq{tv||{|y~olt~{srx}vrw{z}{y{|poxunqzxqysu}rr{upt|{x{}||{qs~rlr~|stzxw|voxpks~}zwwy~z}uuroyxv|~~~xv|urwymjswnq|uywnr}ljuphn{zvv{~kjykZi|qsx}{~qozzigpk`cxyjk{zs|vfh{yrswvpuzptvnuxtw~{wxtqx}mjsnah}wgfwvt}rrzscl}tbbtwqm|wysjsmY`z|urnw}tvvjqj[bxxqpoy{svvouoch{wrqv|uz|twtjm{urryxt|tpu~mhn|sf]omgupqlXU}lcqqix{rwi[bzvjdrnizvnvdYe~}tniw|oo~kkxx]Xlzujk{rzslvlW_{yrhotn|mit~`R^|tm^ppi~jh{w_Qjxshd~|jrzloo[]uuphprkxwhnfWa{{spkw~mlrgngYd|{tll{nv}jhzz`Znzqgoum|oit`S_~ri^qidag{kVFpkRLpX^~xw^_zfS`lT_|~uyk^g|xmfu}icxljwjW]u~{qaqpg}sgokXaw|tfrvpkguaR]{um[kof{^kgQIl|ufR}z_dyjtiTYx|xhktgrxlpm]`ruldoohzwhljU]vvk]pfd}pgoeVfyje}{holjuz_[j|rebpai]dqmPPhvh[dgScheumOZzzk\oeVlwhmmVcz{upopbcw{TNljLMlnjhkrYaVPmiLVrhiqzsnwmfro`iz`\p\Wj`Oa[IUymZdtoeezoPZubL[uwciuxnncawsaj~d^l]Re_TcXPbjU^lfW^|TOknO]ukdft|lelgZft]f|pasvjqa\mSKcaQcxjUbwgITygJGmw^Yexzfbwr]f]WijZbxxdcrgUa[Rgkbmztioy\Q\{PF^gP]kd[dzUX{bTb~hV]{p[_ucHY[Kbl`mvrrwa\lkIZxu[YjYThaDPhFGrzcZWfiYmi]o[E\{xgUUvvUIk^RbxgnxxLFwǮ[9LsZlt^ixďSFTH=Xwl\TXxpRU|aQf]F^{oXWk}[QbiLVa\o]RfWKd}_assdkzcHKuY8BvaS^d{iVU{—RNYȵ_=TiyUS[]IM|qG=hӯ]EQul]]v}c[o_G[zEIgkR[upJSo{HDUĀ>5RƨmGHWreLPl„RNe̲kHNfrNA`UCZ[FW{JG^|WN]hZ\zUOdd@OpaKdq^D]r_I6_`D1fĚlGW`hSVxϯfOQˇNIY[GLrnG>b}B>dΦ\9iةK6IqŃMCOxFOgeW[{hY_oND_̽k5CsS7KmĮb3@meB\pyQfr~tdYkhRPexSAHzB8GzvVK[mSV{Ȱ{\JhgUaX?T˾l45`ƜMERq_RZgiOIdʠJ8WcMIrͶhzکX1Wvf\aTcIRڕV':a9&dzLgf``Url?1oN*JȨ{^Ub^ujT^ʟV2F~;6`•iVZgmaZtyE?gܧP1Mĥ~]Xicyi^cԜX3Eڄ>1bȖkXjphm^rI4]_2;vdUebfx^Y|²^;8w8(Y—ujWcPvfOZmJ7fL,PԤkc[o^iy_PƮb@FzӁ:5gəcHNZgjJHhӥW4BӁ::_ȝiGL^{iLS|υA(R^,BvʻSNama\fμyB2iܯa5F|ƳQOhuv][o͟S/9؎9*Qţd?TkqfQZv݂=#GV4&s̈́YG`jtkQ[k;9nܠN3TɣqVVajcRc®j;Bz͎I8Zr[_fpfWfY@Ny5@nĠVG}B?W̤YG?gcJPiϲfI4dͭ^GFqмnOEj¡aM[vƳrPB\ìoJGcſW9IU?QŎT=UƯi@LmÇTAD|K@Ktՠ`F9k̙WGQtԷ}X:Q½WDRPKcҒ\Q(bǮmS9^؞dM=}DGcΦiQIZwQOZĽlPENͬ[DRhΆ_=>~ʟd@@p̱qJDlTMg˦eOMfΨ]@JgāY<@\HQƋV@SȷoADb˛bI5]ūhJ8^_A,q݌G9O۶sT@R}SKW{L;Da4@\\; yX;auL0W̪_DWwxH>Sѿo<@Y֢S>$fбY>9kת\<@ˆGAaΨkJFbëpKLa|Lvӯk?=oUEUu˫aB6]ѫY>@a}]*6ڐY5;{b8>̂BD\ר\E8cӮUzÏ^MOyҠc9:wѝW5=txK3OzDCHV12~L5bɩ^>MlvE9SqC=Y֣d>3lӳoA5^ƇM9TijqDLhǏR?DӐM8CwڽyO'IʈR5GӕS5Iv@C`Ѧ]E0[νeB/NiK%Nk>:Zݞ\>:rΣW?IgӺbD4YұX=F^}T+2ޏO-=ղe>:lƛ\ETrƳqC?_ϴi>FeԞ\?.mбiB7aѸnCDa֮sK0RLJI3EΕF8Kѻb2KpǕOCBs˟YBEg~O6KľQDV͕P9IŁ?;T˱oJ5I]CK~˒U8L~GCdɦiJLcxTQYtK6Jh@EYܟl;*m׵pA*XϔO9FRO]~ҟF<8E4KwӀ[-0٦`92g|A8\ʭb;NmƒMBEϗN>GrϿmH5^˶nF>\×_CJufQWlnJF`ƯkFLg˒Y>C~ϗV=Fqƾ\@Aq¦pMB_˹jFBsכR6Z~վyOEA~ǞbI<_ʽpI5\ͪaBNjM?EϒG9GtĺqHG>]MIs֤Z=EԎP=WʳyPELskKF]¶lDCaȞYEUoQ>OďTQo|vhw]G\D(NZd~sb;lmKK{oCNqqko|e~oqaTbgn|mowk[ateSc|mvʺ|Mfmeg{sloWabtnwo;b}v\oxY{Ȟh[kMRrkc`Pynd_5ifRof^wws}jJMlznZ\oz|}wozwzxu}j<@f{}nWc_T]daYC,8XgF-Odtrp|ýǚjj<=qt}}NWR'Cm|ZN~lXsv{pstRSvs|KLffF8RVM>)M\KIdzkhn~}hsxsxnwhp}xtn{kJYlP@VzeYܧϹeHv`ocoUjgNTYph{}vvovUN:0^p[H9}cTT`acz}tplg۱m}w~y{~QEd|}xdeZwihnObtgsplnogn{|or}wqaJ=X|T(QwjWtaVtkJ–x_fl|w|s{uysvmpƣiGc`qs=~ngU?tbC?BtNq^fSmJr_Ty~|opvjrkafPzzs[r~aWgwkv|qck_}֫tYsiu`UifgHQ~KEe7\\FIzkqrqc@xbV6_}NdqNycOfxvztgTPlo`t|i]=II~BS}julgwq[Lny[i}gyocef[VkŤdU]PAAO|~dxzi_rRi_sewwpUZW}tkeaVK>8y|_̐|ub`gxv~ix}kP\Rgzjs}qs^orpaayzSWxMS}unl_|eVCaj^jsjlzl\RcdB>NNnodo{xe{xxitnLD\tuguxwkеʥ|l]o[aSV^T5[sM[F[Y}czrzQFSx^Swsprò̸wvy\cjJ:CPmxOK^_n_LTKLiv~|fgyam{t0AfS:=EfJ!7OnRB9AzfsuNJu|~o\TFDIOKdj|o{oMnr|qcbwJNo~ia[VNaqiMavdgis{viqyv\Xn]Xk}e\UuaknO_Slq-8_OwtXiZYgH|qIefXvySktpl`egp\kYTxh`\||yoxsaTkryyvriXdlt`bm~iTdleztrypn~bri~tjmp{axzy}|SrbWdut:BA^LTtPWj}hQzfew~}{mpaEUtlmhmjRAepqlitdf|yw~^Wgvk_`ctsvj]umM_qx~hZxwxm~o]|ztxsmOa{rez~Zm}yfe|{|kn~ok{fme_k[p||pjonlz^juawŶsl]UYcg~~ns}uy|wUGa{}bptFCojOYZnzjmurnfsdlcpu~ylhX}fqzc]{1JU`C[~zigqrmbaxha{gdxti{uJJ}sqrzjhrekk[n{jxfhvaklgpr~nVQvzm٦yjVKsgl6XRHkScsR^Oniftkr`̗¤{vpypvvkmp`FQ^qghmnzr[lvn~qq]RiX@JyM9WRxpbdKRVhsci|zt`iG[\ttyyyXw}idt{amot}bXt~jI^v`a{ngyz||wZLaUKValagf|}{|{tcloplxn{fU\p}rX_twit~p{]de_jdcjadyjr}usnahzxyw[E{^kzxWlqv{tgt~Vhl{p~lxtuqwmRGRbldG\ \ No newline at end of file +{{yzyz}}iG0!#=]t_PLI_q}}R]g`E*JG^Ƽc9%.GME5( !A[{ǻ|zkdkgnmZ\K:/4<>Snw|}mUVRH8-4NoX[x˹u|o{y`MXvqmQKabl|yȰξbcszif_x}ib_aNK[aoz~i[P7JowfD4OfjZOQS\lx}wpxflearvsq|~|lenkJBVw|wxpprWVg|tfPWtxZc~||^o}}sS\ns`X]nt~jhnmulhXY[`u~pjnqlqzraOKKUWYiosxtgbturk^YR`s~~{up{xtxtpzmhovyw~yvxxivtoy|ypuglwxwnlz{}{}yqvxyyr}rpy}wzxpsu||~|zuqkopopnsuz{|{vnmpu{swstuv{ljsxxuhvw||t{~}xu{}|xwzyrqv||zz~zxuqty|vv|}zz{uswuuwtonsx|~|urtyyux~~}|}{}xvtyyqinnptx}{zz{|zvy}z{|||~~tx|}||||{zxwyxz{tqx~}~|ustx{{yxz}|||}}}z{|~~{z~}}}|~~|zw|~}y{{}}{~~}zxzz|{{z~~}}~}}z~~xuy}~~}||}}{{|yx||z{}yxyyxy{}|~|{{~~}~}||zz{}}~}}}~~|z{{~||}yxxy~~~~||yzz}|}||~~z{~}{|{yy{~~|||}~~}}~~~~~}}~~~}}~~}}}z|}~~}||~yy{}~~}|~~|{}}|z}~}|}~~~~|zyyy{|}}zyzyxy{||zxz|}~}~~{{~yy{|||~~~|}~~}|{|}~~~~~}||{{|}~~}}~~~~~~}~}||~}y{~|{}yxy}wx~vttzyy}|z}{|~wwzztv|zsqyzz}~}}|trxtkjvwty|~|wt{tjnzurvy~vt|xx~wpt|ulnyuopxww{~~tnuxibq{tv||{|y~olt~{srx}vrw{z}{y{|poxunqzxqysu}rr{upt|{x{}||{qs~rlr~|stzxw|voxpks~}zwwy~z}uuroyxv|~~~xv|urwymjswnq|uywnr}ljuphn{zvv{~kjykZi|qsx}{~qozzigpk`cxyjk{zs|vfh{yrswvpuzptvnuxtw~{wxtqx}mjsnah}wgfwvt}rrzscl}tbbtwqm|wysjsmY`z|urnw}tvvjqj[bxxqpoy{svvouoch{wrqv|uz|twtjm{urryxt|tpu~mhn|sf]omgupqlXU}lcqqix{rwi[bzvjdrnizvnvdYe~}tniw|oo~kkxx]Xlzujk{rzslvlW_{yrhotn|mit~`R^|tm^ppi~jh{w_Qjxshd~|jrzloo[]uuphprkxwhnfWa{{spkw~mlrgngYd|{tll{nv}jhzz`Znzqgoum|oit`S_~ri^qidag{kVFpkRLpX^~xw^_zfS`lT_|~uyk^g|xmfu}icxljwjW]u~{qaqpg}sgokXaw|tfrvpkguaR]{um[kof{^kgQIl|ufR}z_dyjtiTYx|xhktgrxlpm]`ruldoohzwhljU]vvk]pfd}pgoeVfyje}{holjuz_[j|rebpai]dqmPPhvh[dgScheumOZzzk\oeVlwhmmVcz{upopbcw{TNljLMlnjhkrYaVPmiLVrhiqzsnwmfro`iz`\p\Wj`Oa[IUymZdtoeezoPZubL[uwciuxnncawsaj~d^l]Re_TcXPbjU^lfW^|TOknO]ukdft|lelgZft]f|pasvjqa\mSKcaQcxjUbwgITygJGmw^Yexzfbwr]f]WijZbxxdcrgUa[Rgkbmztioy\Q\{PF^gP]kd[dzUX{bTb~hV]{p[_ucHY[Kbl`mvrrwa\lkIZxu[YjYThaDPhFGrzcZWfiYmi]o[E\{xgUUvvUIk^RbxgnxxLFwǮ[9LsZlt^ixďSFTH=Xwl\TXxpRU|aQf]F^{oXWk}[QbiLVa\o]RfWKd}_assdkzcHKuY8BvaS^d{iVU{—RNYȵ_=TiyUS[]IM|qG=hӯ]EQul]]v}c[o_G[zEIgkR[upJSo{HDUĀ>5RƨmGHWreLPl„RNe̲kHNfrNA`UCZ[FW{JG^|WN]hZ\zUOdd@OpaKdq^D]r_I6_`D1fĚlGW`hSVxϯfOQˇNIY[GLrnG>b}B>dΦ\9iةK6IqŃMCOxFOgeW[{hY_oND_̽k5CsS7KmĮb3@meB\pyQfr~tdYkhRPexSAHzB8GzvVK[mSV{Ȱ{\JhgUaX?T˾l45`ƜMERq_RZgiOIdʠJ8WcMIrͶhzکX1Wvf\aTcIRڕV':a9&dzLgf``Url?1oN*JȨ{^Ub^ujT^ʟV2F~;6`•iVZgmaZtyE?gܧP1Mĥ~]Xicyi^cԜX3Eڄ>1bȖkXjphm^rI4]_2;vdUebfx^Y|²^;8w8(Y—ujWcPvfOZmJ7fL,PԤkc[o^iy_PƮb@FzӁ:5gəcHNZgjJHhӥW4BӁ::_ȝiGL^{iLS|υA(R^,BvʻSNama\fμyB2iܯa5F|ƳQOhuv][o͟S/9؎9*Qţd?TkqfQZv݂=#GV4&s̈́YG`jtkQ[k;9nܠN3TɣqVVajcRc®j;Bz͎I8Zr[_fpfWfY@Ny5@nĠVG}B?W̤YG?gcJPiϲfI4dͭ^GFqмnOEj¡aM[vƳrPB\ìoJGcſW9IU?QŎT=UƯi@LmÇTAD|K@Ktՠ`F9k̙WGQtԷ}X:Q½WDRPKcҒ\Q(bǮmS9^؞dM=}DGcΦiQIZwQOZĽlPENͬ[DRhΆ_=>~ʟd@@p̱qJDlTMg˦eOMfΨ]@JgāY<@\HQƋV@SȷoADb˛bI5]ūhJ8^_A,q݌G9O۶sT@R}SKW{L;Da4@\\; yX;auL0W̪_DWwxH>Sѿo<@Y֢S>$fбY>9kת\<@ˆGAaΨkJFbëpKLa|Lvӯk?=oUEUu˫aB6]ѫY>@a}]*6ڐY5;{b8>̂BD\ר\E8cӮUzÏ^MOyҠc9:wѝW5=txK3OzDCHV12~L5bɩ^>MlvE9SqC=Y֣d>3lӳoA5^ƇM9TijqDLhǏR?DӐM8CwڽyO'IʈR5GӕS5Iv@C`Ѧ]E0[νeB/NiK%Nk>:Zݞ\>:rΣW?IgӺbD4YұX=F^}T+2ޏO-=ղe>:lƛ\ETrƳqC?_ϴi>FeԞ\?.mбiB7aѸnCDa֮sK0RLJI3EΕF8Kѻb2KpǕOCBs˟YBEg~O6KľQDV͕P9IŁ?;T˱oJ5I]CK~˒U8L~GCdɦiJLcxTQYtK6Jh@EYܟl;*m׵pA*XϔO9FRO]~ҟF<8E4KwӀ[-0٦`92g|A8\ʭb;NmƒMBEϗN>GrϿmH5^˶nF>\×_CJufQWlnJF`ƯkFLg˒Y>C~ϗV=Fqƾ\@Aq¦pMB_˹jFBsכR6Z~վyOEA~ǞbI<_ʽpI5\ͪaBNjM?EϒG9GtĺqHG>]MIs֤Z=EԎP=WʳyPELskKF]¶lDCaȞYEUoQ>OďTQo|vhw]G\D(NZd~sb;lmKK{oCNqqko|e~oqaTbgn|mowk[ateSc|mvʺ|Mfmeg{sloWabtnwo;b}v\oxY{Ȟh[kMRrkc`Pynd_5ifRof^wws}jJMlznZ\oz|}wozwzxu}j<@f{}nWc_T]daYC,8XgF-Odtrp|ýǚjj<=qt}}NWR'Cm|ZN~lXsv{pstRSvs|KLffF8RVM>)M\KIdzkhn~}hsxsxnwhp}xtn{kJYlP@VzeYܧϹeHv`ocoUjgNTYph{}vvovUN:0^p[H9}cTT`acz}tplg۱m}w~y{~QEd|}xdeZwihnObtgsplnogn{|or}wqaJ=X|T(QwjWtaVtkJ–x_fl|w|s{uysvmpƣiGc`qs=~ngU?tbC?BtNq^fSmJr_Ty~|opvjrkafPzzs[r~aWgwkv|qck_}֫tYsiu`UifgHQ~KEe7\\FIzkqrqc@xbV6_}NdqNycOfxvztgTPlo`t|i]=II~BS}julgwq[Lny[i}gyocef[VkŤdU]PAAO|~dxzi_rRi_sewwpUZW}tkeaVK>8y|_̐|ub`gxv~ix}kP\Rgzjs}qs^orpaayzSWxMS}unl_|eVCaj^jsjlzl\RcdB>NNnodo{xe{xxitnLD\tuguxwkеʥ|l]o[aSV^T5[sM[F[Y}czrzQFSx^Swsprò̸wvy\cjJ:CPmxOK^_n_LTKLiv~|fgyam{t0AfS:=EfJ!7OnRB9AzfsuNJu|~o\TFDIOKdj|o{oMnr|qcbwJNo~ia[VNaqiMavdgis{viqyv\Xn]Xk}e\UuaknO_Slq-8_OwtXiZYgH|qIefXvySktpl`egp\kYTxh`\||yoxsaTkryyvriXdlt`bm~iTdleztrypn~bri~tjmp{axzy}|SrbWdut:BA^LTtPWj}hQzfew~}{mpaEUtlmhmjRAepqlitdf|yw~^Wgvk_`ctsvj]umM_qx~hZxwxm~o]|ztxsmOa{rez~Zm}yfe|{|kn~ok{fme_k[p||pjonlz^juawŶsl]UYcg~~ns}uy|wUGa{}bptFCojOYZnzjmurnfsdlcpu~ylhX}fqzc]{1JU`C[~zigqrmbaxha{gdxti{uJJ}sqrzjhrekk[n{jxfhvaklgpr~nVQvzm٦yjVKsgl6XRHkScsR^Oniftkr`̗¤{vpypvvkmp`FQ^qghmnzr[lvn~qq]RiX@JyM9WRxpbdKRVhsci|zt`iG[\ttyyyXw}idt{amot}bXt~jI^v`a{ngyz||wZLaUKValagf|}{|{tcloplxn{fU\p} \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s1.bin b/applications/PoP/poc/res/sound/s1.bin index 23eabf7..d177bb6 100644 --- a/applications/PoP/poc/res/sound/s1.bin +++ b/applications/PoP/poc/res/sound/s1.bin @@ -1,2 +1,2 @@ -jtp]ons}vwyhax[T~_`|yegnjpwqp]elgkv}mmN_oo_hsxqv}f}u|}fvxsuUTmobab}~f[lyWly~on|qswzt{woke{vtyywufj^XY_ibq{{yw}~iQGJQb|xont~|oyes}]NSUfwn{wyobPaIDAVk]9Bdyy_cnYnKTz~cdkQSqsvnjqu{q|zm^hnYkwqn^]qYgslr{wl}~~srlrvX`au|nht~ix~n]byhxkxp}~oa^jzokid[yw|uty}kpu|va_sgPJVeinnvzeZhu~z|r}}|YZjojojltr{~jjzv{r}l||lY}y|~x|Vjmbb[sq{mqrguhMVe\n}|xq{ubyv{s{~sxnrqUQdvu{wohv}uhh{wcsq~g]k}wldewuqpkqoo|w~z{wwjslhnm||oux~xrux}~Nc|{i]OhdVQM\aWY]brv|orwztolz|x{{{irrcrztj]i}wts{|oXm~nit{zm|u}borye[ozs`_jibnr}tXnSIyuy|}nmc\swn}xkr~utxyuvdarymbio}qfcfw{rlj{}tllus~|gkx}|mj~fsrnutysvwt|}wxu|wp]K\nmz[r|vfsx|rox\WI5Nfn`S`ywsuvnkrvysvu}}v|~~|vxyyrzxrqtzz{vxkWiujMGcvo_fxz{wu|tzx_d{sttyju|ojis~rv}y}xc_hrz~|w~ri~okqyvq{{|{z~nhhc^bprimpbdjz{pq}yhbnnseYk{t~~wxbtnqvvfp_fmhmc}anpvq{vzostqmzz~~t|ru}~kjsuririjuqkowtim|xrr~yz}{~y|zts~xlrcheit{z{~vy\j~nvwwsmthgxnwkx}ysm~ztvzzmmwxr{wvz}}~{zoendbv}pbi~uq~|ry{xdl}tvzz||{ux{vspprkmtotw{v}}yxvvtkqgf^cYgkdmonu{{|}qkx}~v{}ztz~}zzswy{}|rpysssz|zx}~xvyjbmkejlqxux}z~~mt~txx}{}}{{rt|zvmhzqp|hstypq{}}z}srp{xovjoegelowmpmirzwuzy~|xfwohpw}em}ertd|vz~~yiWYikpxss{~vlw~|n]lwnnkl}x}qxsv~oz~||t|~|}p}}~~uuwjhppkqant|wo~{wznlmw{i`jpfdd]gmafs|tbmxxv|~{{es|wtsrlyyt||{~yxx|{|sjzsqymw}gmpvthwn|ivoyvyyzwnxuvkwpqrgqq|zyzqxy{|ttvqssjghekyvsvt}u}wuqs~}y|uw{{z{~}}tspgfpnw~uvxz}}}sx|yy{}vyyz{kvylwvlr~zz~|{zw|wvy}yvtxsmrtz|xxtx~ywytr{z{us|{||}zxz|}zpl}}~}y~xzyyzwz}ytw{sn}|x{}}{yt{||y}}}z{y{z~wswxw~{pw{y|yw{}|zz|}{sux{wv|}|{x{zw{}|z{|}~|wu}x~yu{yvwx}yxy}~z~}zy{z}|}z||{||}{{}{}z|}}~|wxzzywwyyyxx{|~}xvy}zy{}ztuxz~}~|{}y|{}}~}~}}}}z|{|yxxvvx|y{|z~}}{|}||||z~~}~~~}~~{{~z}~~}~zy{{|}}~}~{{||{{zyz}{}}y~~|~}~}|~z|~|}||~~~~|~~|{}~}~}}~~}~}|~}}}|{~~~}}~~~}~~|}~smrr`bOGg^Drpqg,)IIJO3>TmjEUbӵb/P~qw›j]}ݸe" "^{XcuƓE *LŖdTmˈxYmqLAHE~Ćfz~eu4JfcQpr_^apmP`mi|jrpxfvTPɍdvcSObğ|zrdto_O=^}{~m|hJQr~jWlƼwmJ>SjwncqvxW7#@yljzn\HKd~u[Yuepmizyqs|vberyfohah^N_x|x`o}qgq{~zig{iUUtarrfdvzx}rzwsvys|qxyzrjcg\[q|vwrrx{jczsxwm^Xs{|~}~zlrnjbli^fu~tpx{n_l}yps|wjm}|pv~zwyy~xnmvyyv|usvusvx{pl}z{{{~~urxtnx|~wtvyvry{wsuz~~upw~{sqw{vtw}pgt~usv}{}|xz{zwux~|{~~|}|y|}z{ywwvz}~}~~yvxyvuzz{|z~~{y{{wx|}wyrpty}~{try{|zuw{}}~}~~{wuu{~~}zz~{zz}}ztv|||}|~xv|}}}{zz|zx|}}wtv{|}{xxy}}~|~|{}z{}~|~|zz~~}|~}}~{~}}~~|{~}|}~~z|}ypaRpfgcNryNOm{kMI^n|mctv|tsQexMNxYFkaAMzhL\ePer}omfZmmsn[\h_djYxFQsq]cY`irze|hXl|WebZh|}lfmjVA8?JVbrxrorsusosobSP[ky̾˺`DDR\[\ev}w|}rb\fnXZf`KFWmvuvxvojmmeepxfiwsc^c`RE=756647BXuÿsfbdhms|wommmoxy|{m^\eomb\cllb^epy}{qf_``\WUX^bel{ú÷xmfb_`flppnrx|~wePA=<703M^grxm\^xzzȻԵмɺs`_soI9IhmPFZsyun`QO]lpk`TR^lka\_``egb[[`eksreZ`p|ysxwtihp|sa^jrrqmaU[ozreZW[ixtbY`efnvsgbjrvz|uot}smw~pfdgnsqhgknorxwojq|yvv}{qr|wonqsohb^[_imh][cillh``dlkhe`]courlmt}y|ywvqlnrollnkhkjqmhijpwxpijpuw{yqou}xokox{riimnnrskfint{xpu}|~z{{stvyywrjimqssqlefnsnihilsyxqooooqxyngmv{|yrmt}{|}~|yrlmpqomligjorpkhiovwpgflrwyxtruz{wz|xvvvy||xx~zux}}zxtpsz{vqqttv{{vtttwz|xrv|}yy|~~|yvvwwursuuuvwutsrqrvxyz}}}}zz}|{}}~~}}{ywy||{wtrtxxsopqrrrqnnqtv{{y{~~||{zxxzzzywuwy{yvuwz|~~{y{~~}{zz|~}|}}||}~~|z|~|}~~~x}~}}vns}}phbyok~cX{giswUXw|yumhqpU`}|hspioqsk^j[JX|[kh,)Wsn_RUwnCV}znzcubtvleiowG[hov`9Hn`O5Qͺw߭G4.KbetqvYVA"']hvɳm?5EgptikY29~ȺdyԻwzfFT޿wFHuylhpF#&fldȷTHUHgY\ybAXsttuam\*-]\`hax:Grv}B@/yOcǒ}ടʹȜUg|voN\",]VHGwFTsd`s|{`B7IozjB9XhjHVXAas^l|LU˽wTPJAXtѫu]Kcƶ|nscFbu> 3fB1Wgal|Y&<~RR[v=30Fhlf9elN!PϓUlmᣆȬ~o}|S)2`ytgfuoM$;Zlr]Vl]3HXd|pfsv`gqzvsy{~siwɹԺſrjgrV@Kh_|vY`yxJ..;Xcwc\KWdsoz]FaL1FW55X_dsr^WbAHx|I[JCě}}~^`؜U)Nm'*hs/?sh`fxc23cΜǯÎ`RgwhgRBRdnsvu`D$(`}wbND?>9QZu`509;AsVeͻˬ~ʹМqx]iy`VicG_qi[M[kpf[Z`hpqfpsWayZ@7>OXNOrzgbpmnxz{w}WKmiNIblsf\PB<.1GMhcKCSjodes{XENYYbif^gr~~nƼyrzxyws{[JOSaxwTE=Gf|uSH[rw^EAJT_pnt~tzwt}xsvsį{jh[Y\ff]]lyw{xiW:Ikwrmztqldi_R[go|tkgkmpvzvyxy~yaU[joquya]hpwstteZ[dhj|prpgmxustYJYojkov{y{xwx}|xe[Xatw{z{uk[ZfnpgikcU[caMHEBT[NJUsyrx}~xyzutuu~zyypt~}|ocejov~urphdqvzwfuxkuwabskbgywityykwoowtnne\UV^hmehr}yfV\nzfbaVC9=Oi}vmdPBN`p{vgaaeuzsmlpuy|{{xi[]ppp}tglzxyplnqmg]Xar}ps~q~~ydVSYYcrxt{u_Z^]nxsh[OKSUWTTguyyy}zxtmifnt|{yz|~yuv}|l_o}zwus}|zv{~xmhp~qbVQW^`XWURTU`lilgr|wcamgc]_ev~sxycXewxwzo\TLDBGIJU`jnpzwh`jyyqikxsqysotqcev{nfoytou~vqk`ixu~|ou{zfmurloff^_kme^QXfqonvwhjidiyqib]]dq{~vg\W]luutmyups}~~zqrx|wjmv{tkiir|}vzttw~vji~~yov|rklks~}}}~zyuy}yrlmoqi^baag^OP[dbK22DSY\]`hnmnojgpyzxukfba`fv~~|nor{yy}}s}wztt}wx||trvz{sllllihhmvvnjegmuyxullw|wvz|zyxztkhf^^eefe`cr~yxzz{xpks}{|{olr~zowsw~xnknvth`dqoc]gonquxodahnlmjllnmjedeny|yuqnkhoxtkjlpw}~yonmmmozzuztlmnwsqt}wxz|~{z{~ws{}wz}~ssv|yyzw}}|{~|v}}z~{w{zqru{{trtyxniov{}yv|{}zw{ytx{zz{xla]gw~|zmotuwxz~xsvmn|{x~njhlpkZ[fkjljfijebglz}xvx|{~|ystw~~yyvtw{wprtzvrv~|{spy||~rhmty~xssvw{wx{yywumpqswz||qmtxwnot~}}yy|x||wodgprry|tpswz}wtz{yz}{sov~zvuxxvuojlloz{}~z}ypls~~unlnpmlorru~wv{~zupmpvy~z{|~}xz}{xxzttx}{vuz{wtw~}|}zxxqtz~}~~z{{|}znljhmpvyxtmjjknrruxz}~yxwx|~zzropx|wzzyxvy|~zz}}wrw|yqnjgjpqsy~~~xy{}zqptwxvy~|xy{tlnuy{|truyts||www{~|{~xtruxxxrkflx}vosy|wrrtz~rmlqw|~ytvwxtzxpjjjlnjlkgebbeknllsyvswz||}}||wtyywywrsv|~{|{y|}}truvxvsstvsqvzzxqlmsx|}{xvy~~}}~{}|z{}{~}zz{}tnntyy|~{y~z{~}}{upu}{yxy}zvzzpjpxyrnopou|~|{}}~yy~}urty}|wuz{|||yspuzzz|unpwzuomrvvsusrx~xw~}~}zy||zxtonpu}~xy~|yusw|~~|yz|~~|}{|}xy|}xy~~~}~|{~}}yyy{~z{|~~x|}}}}~zz}~|}~|}}{y{|{{|}xv{}{zyz{}~~}}zyyyvv}~~~z{{z{|~}xx|{|~{|~{{}}{~~}}}{wtwz|~}~yvtw|zqptutwyzz{||{|~~}|zxxyzyvtv|}zz{{{}}||{ywuuwyyy|{x{~~|~~{z|~~~|zz{{}~}}}|}zyz|}|}~~~~}~{{}}{{|}||}~~~~nNZvl]fhfl|{SPrmGe[egYrs]nhHZ_Rbvi[vnfs|xi[ilZq}kvzk`bjqu~lekt||syki|mZ[k}mfxhQYk~|mc^U_wfvmwwporkkwvsghk|}u|xcP\ykkhkv]qfIDYsygSUo{hl|xfktmmcoxqtx~yz}}hbu|pz{jegs{or|mjv|qr~u`QZssbevv{g_fy~zsyhm}rx{vxjagi_UR\v|y{rrw|}vmmyxnhjxypmt~sowwv~zulkr}xnv~ww}vrphfe[U\]dpbbfh{|unhq||~ur~{wzxqt{ztkfefjlkigipuoikpz~vuvvnhgks|~}}}{yy~~{}zvtwvrrx{wy}{smlsz~~~~{y{|}}{}|usvxxvu{{z{||{{{}|xy}~wrpruuttx}z~voh`Z[]^_cfjou{~vof\OB855;GT`hov~}vgS=( -?KQYft˿xgTC91' -*6CQ[clvƽw_J8% "2@Qf{ƺseXK?4* (5@MYcoĺwi]SKD=60+'# (3?JU`js}}tld^WQLHD@<950,-3;BKU]ciq{ºyrlhd`\XTRPLHDA=:89>DLQUY_goxýyupligeb_][YUPJE?:89=AFKOSY`it}yuspnljfb\XSNID<62//38=AFKQX`hr{xuromlifda]WPIB?<8423679:753112359=AFKOU]hv{vsqpruwwurmigeedb_[WTSSROMLLOT[aglpu}ý|yvrnjfb_\YVSPNKJIKMPSTVX\agoy|yvtsrokgeca`_\YVUWY]bgknrv|~yuqmhda\XTOKHDA?>>>>@BFIMQU[bjt}}zxtpkhedb`^\[[ZY\_cgjmpsw|~zvsqnljfb_\YXWVVVVVVWZ^cgkorvz|yvtpmkigdb`^\ZYXXZ[[[[Z[]afknprtw|{ywtqnkhfdbaa`_^]\[[[\^_aaabcfjouy|~|{zyyyyyyyxwvutsrrqpnmkihffffghhijkkllmnoqsuwz|~}{zxwusrpnmlljhgggghhhijjjkkklmoqstuwy{~~|zxxxwwvvuuuvuuuuvvuutssssstttuwxz{}~~~}}||{zzxutroke\K:-+^zP\tDGlɈE')5F[ealfUW]\TXoww}zpf^\]^`ejouy|}}|{}{xjf|sg_abdinu~oh^TPPU^kv}zvrnjmruxyuojebdjs}tkhgebbhpx~vnllmptwy|}|}~~|xtqtx|~|wuxypkjnw}zropsvxwuuy~|zyyxwttwz~zwsrsqnklnrx~}|{{~zvtssuxxwz}}zwttuw|{ywvvx}|xvvvvxzzyz{}~|z{~~{xwwx{~}{xvuuvxy}}yvuttwx|{xxxyz{}||zyxz{|~~||||||{yz{{~~~||}~~~vu}yvz|}~xw{zwz~~~|}}}~~rhnmm{wzyno~vq{ztwutz|z~|ut|vuvajyqasygivwhp|{qv~nvzrt}~{ohlu~xxy{~syogkuoq{ikquv~|ztzyyxtnijny~~zpiu}z{linm \ No newline at end of file +rX_twit~p{]de_jdcjadyjr}usnahzxyw[E{^kzxWlqv{tgt~Vhl{p~lxtuqwmRGRbldG\jtp]ons}vwyhax[T~_`|yegnjpwqp]elgkv}mmN_oo_hsxqv}f}u|}fvxsuUTmobab}~f[lyWly~on|qswzt{woke{vtyywufj^XY_ibq{{yw}~iQGJQb|xont~|oyes}]NSUfwn{wyobPaIDAVk]9Bdyy_cnYnKTz~cdkQSqsvnjqu{q|zm^hnYkwqn^]qYgslr{wl}~~srlrvX`au|nht~ix~n]byhxkxp}~oa^jzokid[yw|uty}kpu|va_sgPJVeinnvzeZhu~z|r}}|YZjojojltr{~jjzv{r}l||lY}y|~x|Vjmbb[sq{mqrguhMVe\n}|xq{ubyv{s{~sxnrqUQdvu{wohv}uhh{wcsq~g]k}wldewuqpkqoo|w~z{wwjslhnm||oux~xrux}~Nc|{i]OhdVQM\aWY]brv|orwztolz|x{{{irrcrztj]i}wts{|oXm~nit{zm|u}borye[ozs`_jibnr}tXnSIyuy|}nmc\swn}xkr~utxyuvdarymbio}qfcfw{rlj{}tllus~|gkx}|mj~fsrnutysvwt|}wxu|wp]K\nmz[r|vfsx|rox\WI5Nfn`S`ywsuvnkrvysvu}}v|~~|vxyyrzxrqtzz{vxkWiujMGcvo_fxz{wu|tzx_d{sttyju|ojis~rv}y}xc_hrz~|w~ri~okqyvq{{|{z~nhhc^bprimpbdjz{pq}yhbnnseYk{t~~wxbtnqvvfp_fmhmc}anpvq{vzostqmzz~~t|ru}~kjsuririjuqkowtim|xrr~yz}{~y|zts~xlrcheit{z{~vy\j~nvwwsmthgxnwkx}ysm~ztvzzmmwxr{wvz}}~{zoendbv}pbi~uq~|ry{xdl}tvzz||{ux{vspprkmtotw{v}}yxvvtkqgf^cYgkdmonu{{|}qkx}~v{}ztz~}zzswy{}|rpysssz|zx}~xvyjbmkejlqxux}z~~mt~txx}{}}{{rt|zvmhzqp|hstypq{}}z}srp{xovjoegelowmpmirzwuzy~|xfwohpw}em}ertd|vz~~yiWYikpxss{~vlw~|n]lwnnkl}x}qxsv~oz~||t|~|}p}}~~uuwjhppkqant|wo~{wznlmw{i`jpfdd]gmafs|tbmxxv|~{{es|wtsrlyyt||{~yxx|{|sjzsqymw}gmpvthwn|ivoyvyyzwnxuvkwpqrgqq|zyzqxy{|ttvqssjghekyvsvt}u}wuqs~}y|uw{{z{~}}tspgfpnw~uvxz}}}sx|yy{}vyyz{kvylwvlr~zz~|{zw|wvy}yvtxsmrtz|xxtx~ywytr{z{us|{||}zxz|}zpl}}~}y~xzyyzwz}ytw{sn}|x{}}{yt{||y}}}z{y{z~wswxw~{pw{y|yw{}|zz|}{sux{wv|}|{x{zw{}|z{|}~|wu}x~yu{yvwx}yxy}~z~}zy{z}|}z||{||}{{}{}z|}}~|wxzzywwyyyxx{|~}xvy}zy{}ztuxz~}~|{}y|{}}~}~}}}}z|{|yxxvvx|y{|z~}}{|}||||z~~}~~~}~~{{~z}~~}~zy{{|}}~}~{{||{{zyz}{}}y~~|~}~}|~z|~|}||~~~~|~~|{}~}~}}~~}~}|~}}}|{~~~}}~~~}~~|}~smrr`bOGg^Drpqg,)IIJO3>TmjEUbӵb/P~qw›j]}ݸe" "^{XcuƓE *LŖdTmˈxYmqLAHE~Ćfz~eu4JfcQpr_^apmP`mi|jrpxfvTPɍdvcSObğ|zrdto_O=^}{~m|hJQr~jWlƼwmJ>SjwncqvxW7#@yljzn\HKd~u[Yuepmizyqs|vberyfohah^N_x|x`o}qgq{~zig{iUUtarrfdvzx}rzwsvys|qxyzrjcg\[q|vwrrx{jczsxwm^Xs{|~}~zlrnjbli^fu~tpx{n_l}yps|wjm}|pv~zwyy~xnmvyyv|usvusvx{pl}z{{{~~urxtnx|~wtvyvry{wsuz~~upw~{sqw{vtw}pgt~usv}{}|xz{zwux~|{~~|}|y|}z{ywwvz}~}~~yvxyvuzz{|z~~{y{{wx|}wyrpty}~{try{|zuw{}}~}~~{wuu{~~}zz~{zz}}ztv|||}|~xv|}}}{zz|zx|}}wtv{|}{xxy}}~|~|{}z{}~|~|zz~~}|~}}~{~}}~~|{~}|}~~z|}ypaRpfgcNryNOm{kMI^n|mctv|tsQexMNxYFkaAMzhL\ePer}omfZmmsn[\h_djYxFQsq]cY`irze|hXl|WebZh|}lfmjVA8?JVbrxrorsusosobSP[ky̾˺`DDR\[\ev}w|}rb\fnXZf`KFWmvuvxvojmmeepxfiwsc^c`RE=756647BXuÿsfbdhms|wommmoxy|{m^\eomb\cllb^epy}{qf_``\WUX^bel{ú÷xmfb_`flppnrx|~wePA=<703M^grxm\^xzzȻԵмɺs`_soI9IhmPFZsyun`QO]lpk`TR^lka\_``egb[[`eksreZ`p|ysxwtihp|sa^jrrqmaU[ozreZW[ixtbY`efnvsgbjrvz|uot}smw~pfdgnsqhgknorxwojq|yvv}{qr|wonqsohb^[_imh][cillh``dlkhe`]courlmt}y|ywvqlnrollnkhkjqmhijpwxpijpuw{yqou}xokox{riimnnrskfint{xpu}|~z{{stvyywrjimqssqlefnsnihilsyxqooooqxyngmv{|yrmt}{|}~|yrlmpqomligjorpkhiovwpgflrwyxtruz{wz|xvvvy||xx~zux}}zxtpsz{vqqttv{{vtttwz|xrv|}yy|~~|yvvwwursuuuvwutsrqrvxyz}}}}zz}|{}}~~}}{ywy||{wtrtxxsopqrrrqnnqtv{{y{~~||{zxxzzzywuwy{yvuwz|~~{y{~~}{zz|~}|}}||}~~|z|~|}~~~x}~}}vns}}phbyok~cX{giswUXw|yumhqpU`}|hspioqsk^j[JX|[kh,)Wsn_RUwnCV}znzcubtvleiowG[hov`9Hn`O5Qͺw߭G4.KbetqvYVA"']hvɳm?5EgptikY29~ȺdyԻwzfFT޿wFHuylhpF#&fldȷTHUHgY\ybAXsttuam\*-]\`hax:Grv}B@/yOcǒ}ടʹȜUg|voN\",]VHGwFTsd`s|{`B7IozjB9XhjHVXAas^l|LU˽wTPJAXtѫu]Kcƶ|nscFbu> 3fB1Wgal|Y&<~RR[v=30Fhlf9elN!PϓUlmᣆȬ~o}|S)2`ytgfuoM$;Zlr]Vl]3HXd|pfsv`gqzvsy{~siwɹԺſrjgrV@Kh_|vY`yxJ..;Xcwc\KWdsoz]FaL1FW55X_dsr^WbAHx|I[JCě}}~^`؜U)Nm'*hs/?sh`fxc23cΜǯÎ`RgwhgRBRdnsvu`D$(`}wbND?>9QZu`509;AsVeͻˬ~ʹМqx]iy`VicG_qi[M[kpf[Z`hpqfpsWayZ@7>OXNOrzgbpmnxz{w}WKmiNIblsf\PB<.1GMhcKCSjodes{XENYYbif^gr~~nƼyrzxyws{[JOSaxwTE=Gf|uSH[rw^EAJT_pnt~tzwt}xsvsį{jh[Y\ff]]lyw{xiW:Ikwrmztqldi_R[go|tkgkmpvzvyxy~yaU[joquya]hpwstteZ[dhj|prpgmxustYJYojkov{y{xwx}|xe[Xatw{z{uk[ZfnpgikcU[caMHEBT[NJUsyrx}~xyzutuu~zyypt~}|ocejov~urphdqvzwfuxkuwabskbgywityykwoowtnne\UV^hmehr}yfV\nzfbaVC9=Oi}vmdPBN`p{vgaaeuzsmlpuy|{{xi[]ppp}tglzxyplnqmg]Xar}ps~q~~ydVSYYcrxt{u_Z^]nxsh[OKSUWTTguyyy}zxtmifnt|{yz|~yuv}|l_o}zwus}|zv{~xmhp~qbVQW^`XWURTU`lilgr|wcamgc]_ev~sxycXewxwzo\TLDBGIJU`jnpzwh`jyyqikxsqysotqcev{nfoytou~vqk`ixu~|ou{zfmurloff^_kme^QXfqonvwhjidiyqib]]dq{~vg\W]luutmyups}~~zqrx|wjmv{tkiir|}vzttw~vji~~yov|rklks~}}}~zyuy}yrlmoqi^baag^OP[dbK22DSY\]`hnmnojgpyzxukfba`fv~~|nor{yy}}s}wztt}wx||trvz{sllllihhmvvnjegmuyxullw|wvz|zyxztkhf^^eefe`cr~yxzz{xpks}{|{olr~zowsw~xnknvth`dqoc]gonquxodahnlmjllnmjedeny|yuqnkhoxtkjlpw}~yonmmmozzuztlmnwsqt}wxz|~{z{~ws{}wz}~ssv|yyzw}}|{~|v}}z~{w{zqru{{trtyxniov{}yv|{}zw{ytx{zz{xla]gw~|zmotuwxz~xsvmn|{x~njhlpkZ[fkjljfijebglz}xvx|{~|ystw~~yyvtw{wprtzvrv~|{spy||~rhmty~xssvw{wx{yywumpqswz||qmtxwnot~}}yy|x||wodgprry|tpswz}wtz{yz}{sov~zvuxxvuojlloz{}~z}ypls~~unlnpmlorru~wv{~zupmpvy~z{|~}xz}{xxzttx}{vuz{wtw~}|}zxxqtz~}~~z{{|}znljhmpvyxtmjjknrruxz}~yxwx|~zzropx|wzzyxvy|~zz}}wrw|yqnjgjpqsy~~~xy{}zqptwxvy~|xy{tlnuy{|truyts||www{~|{~xtruxxxrkflx}vosy|wrrtz~rmlqw|~ytvwxtzxpjjjlnjlkgebbeknllsyvswz||}}||wtyywywrsv|~{|{y|}}truvxvsstvsqvzzxqlmsx|}{xvy~~}}~{}|z{}{~}zz{}tnntyy|~{y~z{~}}{upu}{yxy}zvzzpjpxyrnopou|~|{}}~yy~}urty}|wuz{|||yspuzzz|unpwzuomrvvsusrx~xw~}~}zy||zxtonpu}~xy~|yusw|~~|yz|~~|}{|}xy|}xy~~~}~|{~}}yyy{~z{|~~x|}}}}~zz}~|}~|}}{y{|{{|}xv{}{zyz{}~~}}zyyyvv}~~~z{{z{|~}xx|{|~{|~{{}}{~~}}}{wtwz|~}~yvtw|zqptutwyzz{||{|~~}|zxxyzyvtv|}zz{{{}}||{ywuuwyyy|{x{~~|~~{z|~~~|zz{{}~}}}|}zyz|}|}~~~~}~{{}}{{|}||}~~~~nNZvl]fhfl|{SPrmGe[egYrs]nhHZ_Rbvi[vnfs|xi[ilZq}kvzk`bjqu~lekt||syki|mZ[k}mfxhQYk~|mc^U_wfvmwwporkkwvsghk|}u|xcP\ykkhkv]qfIDYsygSUo{hl|xfktmmcoxqtx~yz}}hbu|pz{jegs{or|mjv|qr~u`QZssbevv{g_fy~zsyhm}rx{vxjagi_UR\v|y{rrw|}vmmyxnhjxypmt~sowwv~zulkr}xnv~ww}vrphfe[U\]dpbbfh{|unhq||~ur~{wzxqt{ztkfefjlkigipuoikpz~vuvvnhgks|~}}}{yy~~{}zvtwvrrx{wy}{smlsz~~~~{y{|}}{}|usvxxvu{{z{||{{{}|xy}~wrpruuttx}z~voh`Z[]^_cfjou{~vof\OB855;GT`hov~}vgS=( -?KQYft˿xgTC91' +*6CQ[clvƽw_J8% "2@Qf{ƺseXK?4* (5@MYcoĺwi]SKD=60+'# (3?JU`js}}tld^WQLHD@<950,-3;BKU]ciq{ºyrlhd`\XTRPLHDA=:89>DLQUY_goxýyupligeb_][YUPJE?:89=AFKOSY`it}yuspnljfb\XSNID<62//38=AFKQX`hr{xuromlifda]WPIB?<8423679:753112359=AFKOU]hv{vsqpruwwurmigeedb_[WTSSROMLLOT[aglpu}ý|yvrnjfb_\YVSPNKJIKMPSTVX\agoy|yvtsrokgeca`_\YVUWY]bgknrv|~yuqmhda\XTOKHDA?>>>>@BFIMQU[bjt}}zxtpkhedb`^\[[ZY\_cgjmpsw|~zvsqnljfb_\YXWVVVVVVWZ^cgkorvz|yvtpmkigdb`^\ZYXXZ[[[[Z[]afknprtw|{ywtqnkhfdbaa`_^]\[[[\^_aaabcfjouy|~|{zyyyyyyyxwvutsrrqpnmkihffffghhijkkllmnoqsuwz|~}{zxwusrpnmlljhgggghhhijjjkkklmoqstuwy{~~|zxxxwwvvuuuvuuuuvvuutssssstttuwxz{}~~~}}||{zzxutroke\K:-+^zP\tDGlɈE')5F[ealfUW]\TXoww}zpf^\]^`ejouy|}}|{}{xjf|sg_abdinu~oh^TPPU^kv}zvrnjmruxyuojebdjs}tkhgebbhpx~vnllmptwy|}|}~~|xtqtx|~|wuxypkjnw}zropsvxwuuy~|zyyxwttwz~zwsrsqnklnrx~}|{{~zvtssuxxwz}}zwttuw|{ywvvx}|xvvvvxzzyz{}~|z{~~{xwwx{~}{xvuuvxy}}yvuttwx|{xxxyz{}||zyxz{|~~||||||{yz{{~~~||}~~~vu}yvz|}~xw{zwz~~~|}}}~~rhnmm{wzyno~vq{ztwutz|z~|ut|vuvajyqasygivwhp|{qv~nvzrt \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s2.bin b/applications/PoP/poc/res/sound/s2.bin index 357897f..9e27779 100644 --- a/applications/PoP/poc/res/sound/s2.bin +++ b/applications/PoP/poc/res/sound/s2.bin @@ -1,7 +1,7 @@ -jlnkn}{vz}yhgmt|v}znv|rqy~wnow{xsr}xvehxxgcsq`g{xjmx{}|yxt{zz{{|zyzvznm|vkhuxlgl}t`f}qgwzq{}wwswzxywyrklgZ^htqeagotvx}~w|~|y{{mdqn`bp~zijz{nqyu}~}xxtqqrsuy~ui{kalrsvio}pZcmjwjbeiowkuzio~qfqvoj_hw~ytx~~zy|ogghiknv}yxwvwtvz{{{}y}yryw{tbaghdejjfjxty||}tmz{lw{iit}u~|kpyyv}p}}zpyqjt}opknvxvulwxvvthdktzmjqwwvz~}}yutuspcXZ_cghf`\alkekposz}~}upzzvuswi{~qswtrmut\fyaquknvvpu~vzyzvrwz{ypjjr{{qfky}pkzygnsx~|~|xxwpryyrqprxvj||vrxuuykr~sm}uin}pwsu||{t~vtz}uus}wqsuqvvqvrllssuztrsrw|yv{~}|{~}xw||vsuurrsnloqmjlrplpsrswzuty~~~zxuz~|{}{xv{}xx~zy{y|zxx{wwyywxz{xx{|z{~{z||{|~}|{~}|}~|{zxx{xvxxvtvyxvwwvxzyyxy{{|}}|}~}{~|~~}}|~~~|~~{|}|z~~yvzzyy|}y{~|yy{||~}}}zy{~~{z{|~}{zz|}~}{}~~~|}||}||}~|z~}zy{|~}~~}~~}~|||z{||zyyz{|{{|}~|}~}{xz}}~}{z|~~}|{}~~~~}~~}zz{{|}|{{||}}}~~~~~~~~~|{||}|~~{}~~~||~|~||}~{{}}}}|}}|~~~~~}||||||{{|}}|}~}||}~}~~|{|||~~|||~~~~|~~}~~}}|||~|{{||}}|}~~~~~}|}~~~||}~~~}~~~~~~}~|~}~~|{{}~zvuuu{~}}{zxz}~}{zyyzz}{y{|z|~}}~~}zxpuqy~xurkrqxurpy}qkkjpuxyqlnr}}m`ZYjxrdZYcttmc\^fxymgbfgoxvrmgimvz~xpXYasoecdehrjnp}wbWYly{_[SPdyr_RdslHBFZbzla]mx{l^^iuk[VU]js{ypkhneLDISm{eadp|srw}|}vz{zwgqzw|pknoq{}|upwnv}|lnmuus|s^eukNEo__~FRj@g[zl|w]ayjp}V`P[smnfcAeltnuekJAQgu|shnz¹~nknoqof`\XQIJP\n~z}~z{{|{yz{~dKI^lqwxurpl`SR[j{|oWC:=CN]voZJEObs~|vl^RMQ\iu~rc]Z[_fnw~|umfcehozcTOUbp||twz}{}y}|rnqxztlks{zxuv{{z}smkfb_^`fr}rbQFEP_n~ug`^aegnx~|xtojmqx~tifcXOKSam{paZXXY]gsxusrpot||uniilosvz{|zvokhijmqtvy}}~{xwusqoquxwxxyz|~}xrorttssuvwwusronptvusu{~|{|{yvttqnprrsuwyvrttrpnouxz}xyyz~}y}~}~~|~}{xuuvz~}|}}|{}~~~~{wtqrruxxxyxxwxyzxxyz{zyyzzxxy}~{{||}}}~~~~|||zxvuvvttuwz|}}}~}{yxwvuttuvwxxxz{||{}}{zz{{{{|~|zyxxxy{}~~}|zxxxxyz}~|zyxxy||~}}~w|uj`y̗[3WƔĹn0*̌kml0 +F[]F96>Siwzmfn~vlqy{wl`XTMB:>I\p|tpvz{xwxX=5AG:7=HPIBCHMNKLX^\aurWJSXPWivpor~vjca^bmt{|aMJP^jr}u_RR]nmK42Hn~f[`tÛuZC:Mq?'$5Qpk7$(:W}MMsynieu—eHHWfs|rwqhni]`ks~}xaD,,@WgvuI" Cex|kH)%=fT #IpJ, 0QmrQ5'/Eb~rH3,/=Pauzj[QMOaͦs<:`oYZjzzmrvoyvmqvwſvsw|~yifl}¾{leacrxy|z|zx||uhda_ZST]hw~q[C59Mcvzj[UW__aiv~zqhgou{xj`b^QFDRco|zgZTUUV\fpw|yqs|~vnd][_iq{~~zpha]\`hptvz~}ywtokkouxvsoqw}~vnmrxyuronrtrpmhhntvtqrxzyz}}ytrqnkmommosupmprspmpuvywvtw{|~~}zvtrsx||zwwz|{zz{||{|}~~}}}~~}|{{{zxtpnmkjjjkmptwxwwxvspqrrsuwz~~~}{yxyxxwwwwxyz{|}|xuttux{~~}}{zz{{zz{|{zyz{|}}}}~~~~}{|~~}~}|~{z|ztzrr|}{{zuxyw|rqrsxv{umyznqz}vr}~pl|zhcqvkk}_dy{nmxYYimzn^eqqs|ofqy|sntvtx{jjt|~}~|wss{znebdmj`iuzx|wibpzsUM`v~u}lRK\q|}hTT^ozg]^j}kohdzlZ]ZUgtfiovr|tZScoxsvqnurbXRYw~snv~qy}c>8^|kZVjvvvifjoxgduo`XVWeƯl_iusieipwylgm~k]`zx]SWNOwoULepglspΐ\U_xsTQok^RDJo[OPQUarνcGQhnw\M[utlhmuzyokhghiho̚gOQm~zoMNiyfaa_h{iNO\o|upvԠZ=GeNAX|v`KF`ui\Xf{~tpWK[|zXMa}zm_]exvogemqpmckȾfW^mu`Tau~smcYeqgmpjpwodeyж}ZR\px|~c\fwvqkadpzhqqes|zilrs}bcr{ry|pouy|y}vihtnino~{vtdewkqyvv~}vs}~vsvvuyvq|vyzuqh\UXfкXLWq}ye^l|yfaqx}odgz{jY[bm~}{mgrz{{pp{xs|uruzmfvor}xvvohhgdzʬyZXkyx{gdswqqu~yhdhsgkz~~||~zrf[cc`q}{vuyyeb}vY[n{|{y{{gly}sqy~~ue^j|ebr}rygJJežp`cxuruyoq|zqr{wc\chws]bpyr[MY~rhkpstw|xpsz~ysu{}tijpgaxr_enzz}yhbfdnhfnmq~tprw}uuytorkbm|}~}{omwxsuzztlfhwpchsw{zqszyw|vkryplz|~}~st{zy}m_VWqŶjaiuy|}}xmoxuqxxj`dnswwoksmjzxrrqieuvmmqyzux|}wkhnv|~zwx|zxuoic`l~c_ht~|vu|~}~{tehxzsyzpsz}~{quunmrph`kt`_j{|{vy}wwzqikmsx{xsty}{y|uqqtwtosvmo{}|~~~omvs\O_~xniu||~|vv}vhbirsy{}~||}~{{|}~{mhqt}{wz}yxx}{vsv|}{tkkv|}}z|~ywx~ssutv|~~~}qovz|yyvpryzvsoqzzvy||}ro~{trv~sr||vwyx|~{~~{}~~|}}ysosz~|{{~~|}~~yy||{{|~{z}lcm}u~ztr|pgo{|{y{{wy~rlp||{}|}ztvz~wu|~zz~zz}|{~~~~}|}yw{}yxx|~tmox}{}|xwz|wy}|}|}}yy}ut~{vz~qnxztw}}{}||}wow{yx|xmmvvw}~xz{{~|y{||~~}}}}~}|{}ytvwv}}{|~}{|}~|}||}xtxz~xmp}ynxyt{zz~|{~|z{{|vv||wz~{wy{wv|~yz~~}~~~~~}~{~|{}~|}|}stkm{vn|N31;I\ieW`xȹrjjb[XWUQQ[gq{xpok`TPRE+%0202AQgu|shnz¹~nknoqof`\XQIJP\n~z}~z{{|{yz{~dKI^lqwxurpl`SR[j{|oWC:=CN]voZJEObs~|vl^RMQ\iu~rc]Z[_fnw~|umfcehozcTOUbp||twz}{}y}|rnqxztlks{zxuv{{z}smkfb_^`fr}rbQFEP_n~ug`^aegnx~|xtojmqx~tifcXOKSam{paZXXY]gsxusrpot||uniilosvz{|zvokhijmqtvy}}~{xwusqoquxwxxyz|~}xrorttssuvwwusronptvusu{~|{|{yvttqnprrsuwyvrttrpnouxz}xyyz~}y}~}~~|~}{xuuvz~}|}}|{}~~~~{wtqrruxxxyxxwxyzxxyz{zyyzzxxy}~{{||}}}~~~~|||zxvuvvttuwz|}}}~}{yxwvuttuvwxxxz{||{}}{zz{{{{|~|zyxxxy{}~~}|zxxxxyz}~|zyxxy||~}}~w|uj`y̗[3WƔĹn0*̌kml0 +F[]F96>Siwzmfn~vlqy{wl`XTMB:>I\p|tpvz{xwxX=5AG:7=HPIBCHMNKLX^\aurWJSXPWivpor~vjca^bmt{|aMJP^jr}u_RR]nmK42Hn~f[`tÛuZC:Mq?'$5Qpk7$(:W}MMsynieu—eHHWfs|rwqhni]`ks~}xaD,,@WgvuI" Cex|kH)%=fT #IpJ, 0QmrQ5'/Eb~rH3,/=Pauzj[QMOaͦs<:`oYZjzzmrvoyvmqvwſvsw|~yifl}¾{leacrxy|z|zx||uhda_ZST]hw~q[C59Mcvzj[UW__aiv~zqhgou{xj`b^QFDRco|zgZTUUV\fpw|yqs|~vnd][_iq{~~zpha]\`hptvz~}ywtokkouxvsoqw}~vnmrxyuronrtrpmhhntvtqrxzyz}}ytrqnkmommosupmprspmpuvywvtw{|~~}zvtrsx||zwwz|{zz{||{|}~~}}}~~}|{{{zxtpnmkjjjkmptwxwwxvspqrrsuwz~~~}{yxyxxwwwwxyz{|}|xuttux{~~}}{zz{{zz{|{zyz{|}}}}~~~~}{|~~}~}|~{z|ztzrr|}{{zuxyw|rqrsxv{umyznqz}vr}~pl|zhcqvkk}_dy{nmxYYimzn^eqqs|ofqy|sntvtx{jjt|~}~|wss{znebdmj`iuzx|wibpzsUM`v~u}lRK\q|}hTT^ozg]^j}kohdzlZ]ZUgtfiovr|tZScoxsvqnurbXRYw~snv~qy}c>8^|kZVjvvvifjoxgduo`XVWeƯl_iusieipwylgm~k]`zx]SWNOwoULepglspΐ\U_xsTQok^RDJo[OPQUarνcGQhnw\M[utlhmuzyokhghiho̚gOQm~zoMNiyfaa_h{iNO\o|upvԠZ=GeNAX|v`KF`ui\Xf{~tpWK[|zXMa}zm_]exvogemqpmckȾfW^mu`Tau~smcYeqgmpjpwodeyж}ZR\px|~c\fwvqkadpzhqqes|zilrs}bcr{ry|pouy|y}vihtnino~{vtdewkqyvv~}vs}~vsvvuyvq|vyzuqh\UXfкXLWq}ye^l|yfaqx}odgz{jY[bm~}{mgrz{{pp{xs|uruzmfvor}xvvohhgdzʬyZXkyx{gdswqqu~yhdhsgkz~~||~zrf[cc`q}{vuyyeb}vY[n{|{y{{gly}sqy~~ue^j|ebr}rygJJežp`cxuruyoq|zqr{wc\chws]bpyr[MY~rhkpstw|xpsz~ysu{}tijpgaxr_enzz}yhbfdnhfnmq~tprw}uuytorkbm|}~}{omwxsuzztlfhwpchsw{zqszyw|vkryplz|~}~st{zy}m_VWqŶjaiuy|}}xmoxuqxxj`dnswwoksmjzxrrqieuvmmqyzux|}wkhnv|~zwx|zxuoic`l~c_ht~|vu|~}~{tehxzsyzpsz}~{quunmrph`kt`_j{|{vy}wwzqikmsx{xsty}{y|uqqtwtosvmo{}|~~~omvs\O_~xniu||~|vv}vhbirsy{}~||}~{{|}~{mhqt}{wz}yxx}{vsv|}{tkkv|}}z|~ywx~ssutv|~~~}qovz|yyvpryzvsoqzzvy||}ro~{trv~sr||vwyx|~{~~{}~~|}}ysosz~|{{~~|}~~yy||{{|~{z}lcm}u~ztr|pgo{|{y{{wy~rlp||{}|}ztvz~wu|~zz~zz}|{~~~~}|}yw{}yxx|~tmox}{}|xwz|wy}|}|}}yy}ut~{vz~qnxztw}}{}||}wow{yx|xmmvvw}~xz{{~|y{||~~}}}}~}|{}ytvwv}}{|~}{|}~|}||}xtxz~xmp}ynxyt{zz~|{~|z{{|vv||wz~{wy{wv|~yz~~}~~~~~}~{~|{}~|}|}stkm{vn|N31;I\ieW`xȹrjjb[XWUQQ[gq{xpok`TPRE+%0202>A@7)""+=Uistusswwu|vzŻwnp}ue\WTQQUSF5(%.6=FP\ejnr{~n_UKA;?Qk~{vw{ʿzi]PGAD<41,%%%&(%"%( -I\fjtü|_JDGKME826AGRjvj_P?4/-7HZn©l[SLJLTe|yuvvolr~qiaTOQMFAAIZmxwµ}q_L?BRcnqv|ulfa_ZUSU\`ZX\YON^tıynd`elqvy|zrf]^fv׽ykgp~xthP=665;@@4#   !(-01.!$$ !7UppT9  .Qejf_ZSOOKC:3)  !?Ziouwnh[HU!~u(i3q!^zRs)zHn##lgYE$H~da$;r&t;_UD3=ibxDy#c$hfIr6VRPq1- delta 140 zcmV;70CWFCZ+q@$vtpPihUmXnZ=j*g9ujgF3shJk!`Z)jp$ uR8B`jKRY-$I5|2yJwHK0LqtVIMMOkFJ~}rvF)b=5B_bak8W?@ABEHKOSW\^_`a^YTOID>96778:@CEGKPTX[]`b_\ZWTQNKNPSV[`eilortvxz|~}|yvroljhfdcbaa``_____]ZWTRPOMORTWYYZ[XTQMLKKJNSY^bfjmnnnnnoopqrtuxz}}xtrpmkpv{yxwww~}|ywurolifb_[YWVTTSSRQPONNNMMNOPQPONMHB=71,'" !"$(,15:@EKLMMNKHEBAA@@CGJNSY^djpv{~~}{zz}}yusrpnnnmmmllkhea^XQKEDBA@HPYajs|}}ulfc`]\_bdghijjhgecba``cehjmorsstttssrrsstvz}~xrlf_YSMJHECHMRW^elsvx{~|zywsolhea^[[ZZZ^adhov}~}|{zxvtrojfa\WRNJIHGFFEEEDCBAAAA@?=<:864479;?DINQSUWWVUTUWXZ^chmqsuwwutrqqpooonnprtwxz|~{xurpnlilpsw|{vqrrssx}}wqkihhghjkmnpqstvwyyyyyzz{|~~||{{{zyxwtqnkgc_\XUROLJHFFEEEEFFFDB@?>=<;98766666655532001346:?CFJMQSTUVVSPNJFB=:741////0134679:??@ABBCDDCCBCEFHLRW]cioux{~¿}{ywvusqoljgc_[WRNIFDA?=<;99887788999::::9986420-+(&$" !"$%),047:>AEINRVZ]abccdddddgknry}zwtrpmkjjiiiihhgfedb`][WRMIEB>;9753210..//024689:;<:752/,)&$#! &,26:?CFHKNOPPQSUVX\`dhknqtx{~yupljhgefhikkkjjgc_[UPJE?93-)&# !"#$&'&&%$$$##$&')*+,-+)(&"#(-39>??@@><:9;<>?BDFHIJJKLMNOPPQQPONMNOPRVY]`bdggfdb`^\YXWVUVWXY]bglrw|Ŀ~|{wtronpruy~ytplgghijmptwwwvutrpnnnnnljhfa\VQLHD??>>=AFJOTY^cbba`[WRMKHFDFGIJLOQSUWXZXWUTRPNLMOPQTX[^adgiiiiihgffhjlnsw|}|zxvsqnlifedba`_^]]^^^`bdfghijiihhggffghhiihhgd`\XTPLIGFDCDDEDB?=94/*%#   +ĿĿ|vohb[TNGC?;8889:;=?ABCDEEEDDA>:741-*'%"!)19AFJOSRRQQRRSTY_djnsw{xvtqmiebccdfnv{rkfb]]_behmquz~~|zxvuttsrqqponnmnopqqppolheb`^\ZYWUSPLIFDB?>?@ABEHKOSW\^_`a^YTOID>96778:@CEGKPTX[]`b_\ZWTQNKNPSV[`eilortvxz|~}|yvroljhfdcbaa``_____]ZWTRPOMORTWYYZ[XTQMLKKJNSY^bfjmnnnnnoopqrtuxz}}xtrpmkpv{yxwww~}|ywurolifb_[YWVTTSSRQPONNNMMNOPQPONMHB=71,'" !"$(,15:@EKLMMNKHEBAA@@CGJNSY^djpv{~~}{zz}}yusrpnnnmmmllkhea^XQKEDBA@HPYajs|}}ulfc`]\_bdghijjhgecba``cehjmorsstttssrrsstvz}~xrlf_YSMJHECHMRW^elsvx{~|zywsolhea^[[ZZZ^adhov}~}|{zxvtrojfa\WRNJIHGFFEEEDCBAAAA@?=<:864479;?DINQSUWWVUTUWXZ^chmqsuwwutrqqpooonnprtwxz|~{xurpnlilpsw|{vqrrssx}}wqkihhghjkmnpqstvwyyyyyzz{|~~||{{{zyxwtqnkgc_\XUROLJHFFEEEEFFFDB@?>=<;98766666655532001346:?CFJMQSTUVVSPNJFB=:741////0134679:??@ABBCDDCCBCEFHLRW]cioux{~¿}{ywvusqoljgc_[WRNIFDA?=<;99887788999::::9986420-+(&$" !"$%),047:>AEINRVZ]abccdddddgknry}zwtrpmkjjiiiihhgfedb`][WRMIEB>;9753210..//024689:;<:752/,)&$#! &,26:?CFHKNOPPQSUVX\`dhknqtx{~yupljhgefhikkkjjgc_[UPJE?93-)&# !"#$&'&&%$$$##$&')*+,-+)(&"#(-39>??@@><:9;<>?BDFHIJJKLMNOPPQQPONMNOPRVY]`bdggfdb`^\YXWVUVWXY]bglrw|Ŀ~|{wtronpruy~ytplgghijmptwwwvutrpnnnnnljhfa\VQLHD??>>=AFJOTY^cbba`[WRMKHFDFGIJLOQSUWXZXWUTRPNLMOPQTX[^adgiiiiihgffhjlnsw|}|zxvsqnlifedba`_^]]^^^`bdfghijiihhggffghhiihhgd`\XTPLIGFDCDDEDB?=94/*%#   !&+06=EMSY_ehjlnpqrsuy}}|zywuspmjgeb_\ZWTPLHC>94/*%   !(/47:>?@ABBCDEGILOSX]afkpty~zvqnlkiilorux|{vrnjfbabcdfimpponmhb[TOLHDEHKMPSVXWURPKE@:51,('(()/7>ELSZadegigeb``__^adhkorvy|~~~~~}{zxvttwz~~ytomjhfghiiklmnpqrsttuuvwxyyzzzyxwxyz{þ~~}}|xndZTNHBFIMQ[epyysonmmmpsvy|~}vojgebcfilorvy|}~|zvqmhc_ZVSQOMMNOPSX]behknnljhffedfiloqqrsoje`\XTPOOOORUX[]_ac`]ZWQKD><:86:50+%  -  #(/7>FLPTWXWUTRPNMNQTX]ciotx|}yuqmkjihkpty}}yuromkikmoqsuxzyxwvspmjigfddeefhjlnprtvvwwwwvvvxy{|~~{xussrrsux{}|{zxtokhfdbacdfimrw|xqjfb^Z[]_aeimqqqrromjgggffhjlnmllkgd`]ZXUSUWY\dlu}|void_ZZ\_bfkptvwxyxvtssstux|{vrmmmnou{|qg`ZTNOPQRUX[^__``aabbdfgiklnoooookhea\WQMLKKKNQTX\afjmqtvtrpnid_[XVSQQQQRSUWZ_dintz~}|{}|yvspnligfecbbbccfimpswz}{zxwqke`[WSOQRTUY\_bdfhjkklljhfdb`^]_acehkoqonmkfb^ZYWUUXZ]aejnrtwz{||}}|{zyxxwwwwwvutsqpnmkihfeeeegjmprstusqnlifc`__^^__`aaaaaabbcccbbbaa``aabbbaaaa``abdefhikmpruwy|~~~~~}}}xsrtuwy{~~|zwtqnljighhijkmnpppoolhd`\WSNMLJIKNPSVZ]aabbc`\YVTRQOOPPPRTUWZ]`ceghjjjjjklmnqsuwxyyzzzzzz{{{|}~}zxwvuuwz|}yvsqopruwz|~|zyxwvtsrqonljhfdcbaa`aaba_]ZWPJD>83-*+,-048ACDLSY`dijqzzphd]YRND><697=COXajmtrw}zxrrnkknie`\XVRPKGA?BFQUZffkmpszzsmkihgijjhfida]XUNJGHJMUY_ehmpu{xspnlorrsppmkga\WPNLORVY^_ehos|~{yxvvtvvuqnnjfebYUXS\]fimwx{~ywxtslffddcbdfhijloquuz}{vqlmnomilnponnotuz~~xtqrpprpofebdgkmnprw|~|wspmkigcdfjmptw~}yvqlgda]XVWUTQNKKNSY_dhjjlosy~yuqpmnlnonkhhac]_[XUTRNNNNLMNQRTUTSVYZ\cfs{xwuwwrjfddehgjigfeffheaXRLKKLJGHKOTY\`dhmrx~~zvsqrpnhd`]ZXUSRPMHFFHLPRQQTY\cmt|~}zz|{~wzxyusogd`_YWRQMOS\bjoptt}yuttuwvsqmhea^ZURNJHFGILORVX[`elv}}zvqnopsrsqnia_]`eiotx}vqkiopttrlgeabafdeehlt~~zvrnje_ZWWZ[\\]]_acfgfdeghnpsw||zurptronlmghgfgfhe_^WWRTWW_ajllqr{}~|z{{~|{{{{z|{yxvututuvuuyy{~~|wrmhdbciptutrqppolhda__beinsuwz}}|}~}ywtrmjihhlmmkhgghfda`aaaceghklnrttsuux|~}{yxwutusux~}{xvuusttuusstuvx|~~~~{z|~|tpmnopqomlhhhilosvusqopux||{xusttxz}}|~}~||}|yvspmjgda_^adhlosvxxvusrqonoqsvz~~~|zyz{|~}{xvvwvwvvupnllmnprttuutussrppmknqv{}}}~~~~~|{|}||{}|zxvutvvuttsrnjhffgijklmnonnonooppprsuvwvvwvwvvwwxz~~{z{~~|zvsqpqsuvutuxz}}{{z{}}{zyzz|}||{zzzxxx{{{|}~~}}~}|{|}~~~|xttsrqonmnoqqpnllmoponomkllmopopopnpqtx{|~~||{|{{z{zwvututuvz}~~~~~~}||||~~|}~|{zyz{}~~}zxxy|~|yxyz|~~}{yyz||~~~}|zwrnommnpsw{}|{z|~~{xvvwz{{|{|}}~{yurssvx|||{{{|{zyyyyxy{~~~~~}|zyyz}{xxz}~~~}}|}~||}~~}}}~~}~~~~~~|{zxxyz}}}{ywvwxz{{||{xusqrqpruwy{~~|zyy|~~~}|{z{zz|~~}~~~~|~~}}}}~~~~~~~}}|{{zz{}}}}}~||{{{|{}~~|}||{{~~||}~~~}}{yxwwwxy|~|zyzz|~}|zyxx{~~|{{}~{ywtrqqsvxyzyxwwy||{{z{}~~}}yyxx{~~}}|~|yxx{{xwvvvvvwxzz|~~|{}~}{{zzzz{~}{ywwxy{|{{z{{{{{||~~~~~~}}{yxwwusssvy{}}}{zxyy{}}{zwwvvwxy{{~~}yurrrttvy|}zyxy|~~~~}zxyzz{z{}~~}{yzyyyyz|~~}|yyyz|~}{zyxxx{|~}|||{|}}~~~~~~~}|~}}}}zwvvuuvx{}~~|{||}~~|zyxxy{~~||{|~~|z{|~}{{z{||||{|}}{zyxxyz|~~~~~~~{{yxxy|~~~}||}}|||{|}~~~}}~~}||{}~~}||{zyzzz{|~~}{zyyy{}~~~~}~~}e@(")%(/6DcwbN>3..16;@FLRY\V[he[[]`cfjmortwz|~¼~wrsqnrupmquoe]VZ]ZZ]bgeemnnpopsvusuuuuw|{zyz~}|~~|}zvvwxywwxuuuvy}~~|uokkiffjllmomgb_\^daWZffcfhhgbadbcedeecacikkllmmnqsqv{{yywwurtusw{}}|yuronopruxz}|xuqmkklkkloruy||}~|{{|}|zzyxwwxy{}~~}|}~~|zxvtsrpnlkkkjhgffghjlklllmnoqqponnnopomjhfcaaa``a`bdgjlmopqppomjgea^ZWWWWWXYZ]`bflptx||zxvtrpomlkjhijklnqstuxyyxurponpqsuvy{|||}~}{yvutstuwy{}}}}~}{yyyyyyz|}}zxvuvwxyyyz|~zyz|~|yvplhe`[TOMNRV[_dfhhikkkjihhhiknmllmorux{|}~|{zzxtrpnmlkihhhilpsuuuuuuvwxuqnic_ZWVUUVZ^bglqtwyxvsojfb_\YWWWY[_ejosuw}{upmlotwx{|}}|}|zz{|}}}|||~~~}|zxtqmklnqstw|}|||{yxwxyxwwusppqrrruxz|~~|zwspppppprssuz}{zz{}{xuuvwxwutv{}xvuutsqonnpsvyzz{}~~}{yuqmkmoruy|}|||}~{xsqooqvzzvsplhc_^]\]]ZVUVWZ]bdfjlmnprrsssssssttuvx{|~}ysmkllkkmrw|~{wsponosx|{unigda`aadgjmqx{xutux{~{xsnifdba`_^]\^`cfkpuwxz|}}{ywvwxwvwvtqomlkkkjjkmoruwz|}||}|zwutuuvwxyz|}~|zwspljhfefhjmpuzzuonnlkkkkkkllnopoprtutsrrrrqpoliecbdfhhjkkjklnnnnnmmnqtvvwwxz}~|zxurqsuvvvwxwvvvvusrpmkjhfc_[YXXYZ[\]_aabceghijlmnpsuwz|}~~|{yvspppprrsuw{}|{{{z{}~{wsokhhfefiknosvy||}|{yunhd^[XVTTVVX[`eiloruuwxyz{||{zxwwwxwtrponmlllkkkkklmnmmnnnmljihgecba`aabdgjnqtwyzyxvutrpljhffgjlmprtuvwy{||{zyxvuutttuuwxyyz{||~{yyxwwxxwwx{|}~|||}~|ywusrstuvxz}}zwrollllkklmmmnnprrtuvx{|~{vqmjgdbba_^^^^`abaa`^^^_``bcddegjlpuz~|yvtrrrqqqrsuw{}~}}|{zyxtrpnoprsuwz|}|yyyyz|~}|~}|{ywvvw{|{zzz{z{|}~~||}}}~|zxvvxz|||{{}~|{{z{|}{zyy{}~~~}|}||}|{zyyxwvvuuuvvwxz|~~}{{|{{zyxusttvy{~}|||{yvttuvwyzz{{|~~~~{yxwwwwwwwuuuvy{{|zxwvwxxxvtrpppprsttuuvvwy{|||{ywvvvvurqpoprtuuttuvxyz|~~{xvvusrrrrstuwxyyxxxyz{{{zxvustuuuuuvwy{|~}}{zyxxyz{||z{||~~~}|{{}~}zyyyyyyxwxz}~}{yxwwxyz}}{zzz{|}}{z|~{xwwz|~~{ywvtsqonmnnnnnooooppqrtttsrrqqsuuuuvvvwyz|{yz|~~}yyyxwvvuuvw{}|{{zyyyz|~}||}~}|{ywutuutuuvwxyy{|~}zxusrqqrtvxz|~}{ywusqonnoruwxyz|}}zxwwxxyyyyz|~~|zxvtrpnmnnnnpprsuwz|~~}|{zzyyyz{zzyxxxyzzzzzyyyyyzzz{|||}~~~}~~}{yxxwvvuwyz{|}~~}||}}}|||{{||}}}~~~}|||}}}~~}|}|{zzyyyxxxyz{||~~}}}|||{{{{|||~~}}}|||||||{zzzyyyxxxxxxxyyyyyyyzzz{{|||}}~~~}}|{{zyyxxxwwwwvvvuuuuuuvvwwwwxyyyzz{|}~~~}|{zyxwvutssrqpppooooopqqrstvwyz|}~|zxvtsponmmmlmmmnopqsuvxz|~}{zxwwvvuuuuvvwxyz{}~~}|{zyxwwwwwwxxxyz{}~~}{zzyxxxxxxyyyzz{{|}~~~}}||{{{{{|||}}~~~~~~t}}barkKLfkZWr{xw}vtwwqmmmha^_]YWZ]^_bfijjlnoopruwx{~}||}|||{zywusrqpppqrqqqrsrpppooopqrrtuvwwxxxxyxwyz{{}~~}|||||}}||||{zzyxxxwwwwxxwwwwwwvvvvvvvvwxxxxyyyyyyyyzzzz{{|}}}~}~~~~~~~~~}}}}}}}}|||{zzzzyyyyyxxyyyyyxxxxxxxxxxxyyyyyzzzz{{|||||}}||}}}}}}}~~~~~~~~~~~~~}}}}|||||||{{{{{{{{zzzzzzyzzzzzzzzzzzzzzzzzzzzzzz{{{||}}}}}}~~~~~~~~~~}}|||||{{{{{{{{{{{{{{{{|{|{{{{{{{{zzz{{{|||||||||||||||||||||||||}}~~~~~~~~~}}}}}||{||{{{{zzzzzzzzzzzzzzzzzz{{{{zzz{{{{{{{{{{{||||}}||}}}}~~~~~~}}}}||||||{{{{{{ \ No newline at end of file +  #(/7>FLPTWXWUTRPNMNQTX]ciotx|}yuqmkjihkpty}}yuromkikmoqsuxzyxwvspmjigfddeefhjlnprtvvwwwwvvvxy{|~~{xussrrsux{}|{zxtokhfdbacdfimrw|xqjfb^Z[]_aeimqqqrromjgggffhjlnmllkgd`]ZXUSUWY\dlu}|void_ZZ\_bfkptvwxyxvtssstux|{vrmmmnou{|qg`ZTNOPQRUX[^__``aabbdfgiklnoooookhea\WQMLKKKNQTX\afjmqtvtrpnid_[XVSQQQQRSUWZ_dintz~}|{}|yvspnligfecbbbccfimpswz}{zxwqke`[WSOQRTUY\_bdfhjkklljhfdb`^]_acehkoqonmkfb^ZYWUUXZ]aejnrtwz{||}}|{zyxxwwwwwvutsqpnmkihfeeeegjmprstusqnlifc`__^^__`aaaaaabbcccbbbaa``aabbbaaaa``abdefhikmpruwy|~~~~~}}}xsrtuwy{~~|zwtqnljighhijkmnpppoolhd`\WSNMLJIKNPSVZ]aabbc`\YVTRQOOPPPRTUWZ]`ceghjjjjjklmnqsuwxyyzzzzzz{{{|}~}zxwvuuwz|}yvsqopruwz|~|zyxwvtsrqonljhfdcbaa`aaba_]ZWPJD>83-*+,-048ACDLSY`dijqzzphd]YRND><697=COXajmtrw}zxrrnkknie`\XVRPKGA?BFQUZffkmpszzsmkihgijjhfida]XUNJGHJMUY_ehmpu{xspnlorrsppmkga\WPNLORVY^_ehos|~{yxvvtvvuqnnjfebYUXS\]fimwx{~ywxtslffddcbdfhijloquuz}{vqlmnomilnponnotuz~~xtqrpprpofebdgkmnprw|~|wspmkigcdfjmptw~}yvqlgda]XVWUTQNKKNSY_dhjjlosy~yuqpmnlnonkhhac]_[XUTRNNNNLMNQRTUTSVYZ\cfs{xwuwwrjfddehgjigfeffheaXRLKKLJGHKOTY\`dhmrx~~zvsqrpnhd`]ZXUSRPMHFFHLPRQQTY\cmt|~}zz|{~wzxyusogd`_YWRQMOS\bjoptt}yuttuwvsqmhea^ZURNJHFGILORVX[`elv}}zvqnopsrsqnia_]`eiotx}vqkiopttrlgeabafdeehlt~~zvrnje_ZWWZ[\\]]_acfgfdeghnpsw||zurptronlmghgfgfhe_^WWRTWW_ajllqr{}~|z{{~|{{{{z|{yxvututuvuuyy{~~|wrmhdbciptutrqppolhda__beinsuwz}}|}~}ywtrmjihhlmmkhgghfda`aaaceghklnrttsuux|~}{yxwutusux~}{xvuusttuusstuvx|~~~~{z|~|tpmnopqomlhhhilosvusqopux||{xusttxz}}|~}~||}|yvspmjgda_^adhlosvxxvusrqonoqsvz~~~|zyz{|~}{xvvwvwvvupnllmnprttuutussrppmknqv{}}}~~~~~|{|}||{}|zxvutvvuttsrnjhffgijklmnonnonooppprsuvwvvwvwvvwwxz~~{z{~~|zvsqpqsuvutuxz}}{{z{}}{zyzz|}||{zzzxxx{{{|}~~}}~}|{|}~~~|xttsrqonmnoqqpnllmoponomkllmopopopnpqtx{|~~||{|{{z{zwvututuvz}~~~~~~}||||~~|}~|{zyz{}~~}zxxy|~|yxyz|~~}{yyz||~~~}|zwrnommnpsw{}|{z|~~{xvvwz{{|{|}}~{yurssvx|||{{{|{zyyyyxy{~~~~~}|zyyz}{xxz}~~~}}|}~||}~~}}}~~}~~~~~~|{zxxyz}}}{ywvwxz{{||{xusqrqpruwy{~~|zyy|~~~}|{z{zz|~~}~~~~|~~}}}}~~~~~~~}}|{{zz{}}}}}~||{{{|{}~~|}||{{~~||}~~~}}{yxwwwxy|~|zyzz|~}|zyxx{~~|{{}~{ywtrqqsvxyzyxwwy||{{z{}~~}}yyxx{~~}}|~|yxx{{xwvvvvvwxzz|~~|{}~}{{zzzz{~}{ywwxy{|{{z{{{{{||~~~~~~}}{yxwwusssvy{}}}{zxyy{}}{zwwvvwxy{{~~}yurrrttvy|}zyxy|~~~~}zxyzz{z{}~~}{yzyyyyz|~~}|yyyz|~}{zyxxx{|~}|||{|}}~~~~~~~}|~}}}}zwvvuuvx{}~~|{||}~~|zyxxy{~~||{|~~|z{|~}{{z{||||{|}}{zyxxyz|~~~~~~~{{yxxy|~~~}||}}|||{|}~~~}}~~}||{}~~}||{zyzzz{|~~}{zyyy{}~~~~}~~}e@(")%(/6DcwbN>3..16;@FLRY\V[he[[]`cfjmortwz|~¼~wrsqnrupmquoe]VZ]ZZ]bgeemnnpopsvusuuuuw|{zyz~}|~~|}zvvwxywwxuuuvy}~~|uokkiffjllmomgb_\^daWZffcfhhgbadbcedeecacikkllmmnqsqv{{yywwurtusw{}}|yuronopruxz}|xuqmkklkkloruy||}~|{{|}|zzyxwwxy{}~~}|}~~|zxvtsrpnlkkkjhgffghjlklllmnoqqponnnopomjhfcaaa``a`bdgjlmopqppomjgea^ZWWWWWXYZ]`bflptx||zxvtrpomlkjhijklnqstuxyyxurponpqsuvy{|||}~}{yvutstuwy{}}}}~}{yyyyyyz|}}zxvuvwxyyyz|~zyz|~|yvplhe`[TOMNRV[_dfhhikkkjihhhiknmllmorux{|}~|{zzxtrpnmlkihhhilpsuuuuuuvwxuqnic_ZWVUUVZ^bglqtwyxvsojfb_\YWWWY[_ejosuw}{upmlotwx{|}}|}|zz{|}}}|||~~~}|zxtqmklnqstw|}|||{yxwxyxwwusppqrrruxz|~~|zwspppppprssuz}{zz{}{xuuvwxwutv{}xvuutsqonnpsvyzz{}~~}{yuqmkmoruy|}|||}~{xsqooqvzzvsplhc_^]\]]ZVUVWZ]bdfjlmnprrsssssssttuvx{|~}ysmkllkkmrw|~{wsponosx|{unigda`aadgjmqx{xutux{~{xsnifdba`_^]\^`cfkpuwxz|}}{ywvwxwvwvtqomlkkkjjkmoruwz|}||}|zwutuuvwxyz|}~|zwspljhfefhjmpuzzuonnlkkkkkkllnopoprtutsrrrrqpoliecbdfhhjkkjklnnnnnmmnqtvvwwxz}~|zxurqsuvvvwxwvvvvusrpmkjhfc_[YXXYZ[\]_aabceghijlmnpsuwz|}~~|{yvspppprrsuw{}|{{{z{}~{wsokhhfefiknosvy||}|{yunhd^[XVTTVVX[`eiloruuwxyz{||{zxwwwxwtrponmlllkkkkklmnmmnnnmljihgecba`aabdgjnqtwyzyxvutrpljhffgjlmprtuvwy{||{zyxvuutttuuwxyyz{||~{yyxwwxxwwx{|}~|||}~|ywusrstuvxz}}zwrollllkklmmmnnprrtuvx{|~{vqmjgdbba_^^^^`abaa`^^^_``bcddegjlpuz~|yvtrrrqqqrsuw{}~}}|{zyxtrpnoprsuwz|}|yyyyz|~}|~}|{ywvvw{|{zzz{z{|}~~||}}}~|zxvvxz|||{{}~|{{z{|}{zyy{}~~~}|}||}|{zyyxwvvuuuvvwxz|~~}{{|{{zyxusttvy{~}|||{yvttuvwyzz{{|~~~~{yxwwwwwwwuuuvy{{|zxwvwxxxvtrpppprsttuuvvwy{|||{ywvvvvurqpoprtuuttuvxyz|~~{xvvusrrrrstuwxyyxxxyz{{{zxvustuuuuuvwy{|~}}{zyxxyz{||z{||~~~}|{{}~}zyyyyyyxwxz}~}{yxwwxyz}}{zzz{|}}{z|~{xwwz|~~{ywvtsqonmnnnnnooooppqrtttsrrqqsuuuuvvvwyz|{yz|~~}yyyxwvvuuvw{}|{{zyyyz|~}||}~}|{ywutuutuuvwxyy{|~}zxusrqqrtvxz|~}{ywusqonnoruwxyz|}}zxwwxxyyyyz|~~|zxvtrpnmnnnnpprsuwz|~~}|{zzyyyz{zzyxxxyzzzzzyyyyyzzz{|||}~~~}~~}{yxxwvvuwyz{|}~~}||}}}|||{{||}}}~~~}|||}}}~~}|}|{zzyyyxxxyz{||~~}}}|||{{{{|||~~}}}|||||||{zzzyyyxxxxxxxyyyyyyyzzz{{|||}}~~~}}|{{zyyxxxwwwwvvvuuuuuuvvwwwwxyyyzz{|}~~~}|{zyxwvutssrqpppooooopqqrstvwyz|}~|zxvtsponmmmlmmmnopqsuvxz|~}{zxwwvvuuuuvvwxyz{}~~}|{zyxwwwwwwxxxyz{}~~}{zzyxxxxxxyyyzz{{|}~~~}}||{{{{{|||}}~~~~~~t}}barkKLfkZWr{xw}vtwwqmmmha^_]YWZ]^_bfijjlnoopruwx{~}||}|||{zywusrqpppqrqqqrsrpppooopqrrtuvwwxxxxyxwyz{{}~~}|||||}}||||{zzyxxxwwwwxxwwwwwwvvvvvvvvwxxxxyyyyyyyyzzzz{{|}}}~}~~~~~~~~~}}}}}}}}|||{zzzzyyyyyxxyyyyyxxxxxxxxxxxyyyyyzzzz{{|||||}}||}}}}}}}~~~~~~~~~~~~~}}}}|||||||{{{{{{{{zzzzzzyzzzzzzzzzzzzzzzzzzzzzzz{{{||}}}}}}~~~~~~~~~~}}|||||{{{{{{{{{{{{{{{{|{|{{{{{{{{zzz{{{|||||||||||||||||||||||||}}~~~~~~~~~}}}}}||{||{{{{zzzzzzzzzzzzzzzzzz{{{{zzz{{{{{{{ \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s5.bin b/applications/PoP/poc/res/sound/s5.bin index 332e9af..91f46f9 100644 --- a/applications/PoP/poc/res/sound/s5.bin +++ b/applications/PoP/poc/res/sound/s5.bin @@ -1 +1 @@ -{{{{zzzzzyyyyyyzzzzzz{{{{{{{|||||||||||}}~~~~~~}}}~~~~~~~}}}|||{{{{{{zzzzzzzzzzyyyyyyyyyzzzzzzyzzzzz{{{||||||}}~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}||{{{{{zzzyyyyyxxxyyyyyyyyyyyyyzzzzz{{{{{{{|||}}}}~~~~~~~}}||||{{{zzzzyyyyyyxxxxxxxxxxxwwxxxxxxxxxxxxxxxxyyyzzzzz{{z{|||}}~~~}|||{{zyyyxxxxwwwvuuvuvuvvvvvvvvvvvuuuuuuuvvvvwwwxxxxxxyyyz{{||}}~~~~~}||{{zzyxxxwwvvuutsssrrqqqqqppppqqqrrrrssssttttuuvwwxxyz{|}}~~}|{{yxxwvutsrqpponnmmlllkkkkjjjkkkkkkkllmnoppqrstuvwxyz{}~~|zywutsqpomljigedcba`__^]]\\]]]^^^__`abdeghjkmortvxz}|yurolifc`]ZWUROMKIHFEEEEEFGHIKLNPSUX[_bfimquy}{tmga[TNHC=840,)&%$$%&(*-048<@EKPV\cjrzſ}rg[QG>60*%!"&+18?HR\gq|Žwmc[SKE?:620.-.037@CGKOSX]chntzĿyqh_WOG?82-($" !$'*.28>DKRZcluľzqibZTNHC?<:87789:<@CGKPV[bhnu|~xrmhc_[WUSQONNNOPRTWZ^bfjnsw|}yurnlifdba`_____abdfiknqsvy|umu_AHTTFEVconl}Ҫ{~wjmg|jqvj\Z]UVNJLPTPT\bnt|}zyy}{qgfeiu~yi\RLOWbqrdVMLOXfu{naXUYcqsg_]akxpcZY^huyj^WW[ftzla[[`jxzl`[[`lzuf]YZbm{vh_[[bm{rf]X[blzrg^[^eq~xlebdjtuia^`gp|tjc`bgp|xngcejr|zqjggjr|{rkhhkrz{slggkpvvpljlqxzsommrx~zsnlmptz|wqppruz}xp{sm}|zwsrqu||wstootwz{tspmswy{urpopux~}wtrqsvz}ywuuy|}yuttvz~{xvvwz|yvvwy}{yvuvx{}zwuttvx{~}zxvuuvx{}{{{|~~~~~~}|{zz{|}}|{zzz|}~}||||}~~||{{|}}~~||{{{{{|}~~}}}|||}}~~~}}~~}|{{{z{{|}~~}}}||}~~~~~~}||{{|||}~~}~~~{~~~~}~~z~|~~~}~}}~~~}|~}{}{z~~~~||~}~~{~}~~~|{}~}}}x|~x|vx~|||}~}~}{{}}~|~~~}~}~}}{|~}}}{z||~|{||{}}|z{|~|~z~{x~|~{yz~{~w~~|{|z}w}yw}|uwz~z{~~}zx}|}|y~{}~zz|~z~~}}|}}}~}{}||~y|~~|~|z~||}~{|{yz{z{t~~|xxy~xu}|{qvy{r{~~~yyx{|{}s{~x}ox}||y~yw|x~{}~}~||}~}y~~}}}}}}y{}}w}}}z}y~xyw{wr|xtxklkhowvoqt|~xkwourzzrixvxqy~~yt~wxwz|yr}tw~usyv}|xzp~ux}}rz~}|t~xu~tzwv|s{x{{x~{vqnmlnt~{{ny^[sdiqjtovop|euzpwku|r|~qwjzuqyszyj{}x{owy{hx}olglasfy}cultzXqzrxk{ylyv~`avrv_v{xywZfryuyw~~pxeucygyh~xyvgi~o{qywv~{zpyxqwtu{ko}hzf{akfpueqvwlrvyltwvalHzeoy~gprt^d{p~bfuga[va~uab`hp{wynzsr{pzlwfiv~ht|zxu{x{|}~}r|i}sxbyl~t|co|tivor}pskkvq_[u`wuomxvizqsp~wT{mw|fqqe_xgUtx|V{no{sxot~tlou|}mw||sidnzvi}}z~pquohxk}{mrvrimjwpvznxw{r]tsuyzzg{wlz~_{yrwbvquqqirzrayxwzmukvbsirjuvykbletmnx}~yikz~{n}kowrltk_~fyozbw|t]ZrKtoV]`xl_lxTqlrevo{nkmy~dzosnm}_~wI{kxthsqszpo~vx{}h_}t^_slgwzvew|uhjfjhzbw~k}{uomxx|xkpl\vgK~xivpvprqr~y{gzpo|~xrzys{qno~xqhui{}jkq|zw|}{yu~y}mtzsk{uwy{nvlrh~ry|qpxutnstvolavtqhett|jv}qwV~eiisw}wlvivrnxr}rthzxgw||~rv{|}qg|bh}}~znk|e{|xxejxuynutrvq]}ztupyotxvwzhpfqu{y{rzudyrv{ptnxvxyx~n{yy{ozyz{|s|yv}|z~}{{z}v{~|z}~}|~|x{~~}{|w~ys||{x~zx}{|y{x|~zz|{~}~{~q{~}~}w|~|~~{{w~~|{{}|y~yzz{~zy}~~~~}~z{||}~~~}~|}z}||}{~|~}{}~}~|}z~}|~~~x}y~|z~{~~~~~}~~~~}|~~~|{~~~}|~|~}~}~}~}}~~~|~}}}~~|}~~~~y~lp{|tqq]ytaeqkUMYbny\ax|ujivojkuvrzp~zloxlf{xoYenqz}uoqltreT`gbv}er]UbkycOmkctw[v~buIi{LTejiWTp}|v~ym^ltlxzty{wfLivprtrk]Xc|yr~z~sqry{n_`qvjdnwt~vltqelmjxtydqndqrvpW~daurrsyvcn`khXUclfzők~XRle\{xb]p{neZcryy}x~|srwwlwqXd{tpqbtd`8Hmxyn`wǭs[TSeoUb{pql\kogn{`U`jxhknmy|gyvvqoox~vhzsy}q^Rl~zkhhgnlmlgovzwxz|}t^lUL~gpzm[^}wynat|aUf}yrw}tt~tot}{t[tqg~{rclniz{~ysz|{sqypitz}}zw|yxwqy||y|whn|}yy~~xt~x{}rjnv{~{xz{vqrywtw|}zy{xyuvxry~ztx~~y~~}zy{xz{}~||{}~~}~~}}yv{~}}xx}~~{w|~}}|~|{~z}z~y{~}}|}}{|~}~}}zwz}~zz~}~~|{~|~~yy~~zyz~~}}~}{wz}y}}~}{~{z~}}{{~}~|~}}~~~{~~~}}|}~~|~~~~~}~~~uvmgfe~{gcgTUKex}uRIf[dfSOhҊI2KpYW]h͓A'A^=\ďW)&WϹxE6\Z;EpБI8`tGAerINmVW|X:Rznjn[Hg~hfvlroneSY}vbnw}~Y^u^bhftmwy|ff}x{}uyo`rvt}qvy~wkyti|shxzz}u{v|}wrhp{l]gpgrkjxzzuqnrxisxvtihk_swkfskeiu}cfh]cofWnrjfne_swmk~oepqdilhwztzvqw~qp{xx{zz}vuu|xowwu|~xs}{{x~tu~yvwzvw}vu{y}~{z{yr{{{~}{}}~}~~}}xu||xy||}}{~~xw|z{~|y|~{}|{zz|{zx{~{uw{|}~}}xy}|z}zy}~{yz|}{~xx}|~~~}~~}~~{|~~~|~~||~}}~~z|~}{}~{~{{~~}}|}~|||}~}~~z{|{}}}|~}{|~|}~~~{z}~}~{|~}}}~~}|{{~~}}~~~|}~~~~|}~smrr`bOGg^Drpqg,)IIJO3>TmjEUbӵb/P~qw›j]}ݸe" "^{XcuƓE *LŖdTmˈxYmqLAHE~Ćfz~eu4JfcQpr_^apmP`mi|jrpxfvTPɍdvcSObğ|zrdto_O=^}{~m|hJQr~jWlƼwmJ>SjwncqvxW7#@yljzn\HKd~u[Yuepmizyqs|vberyfohah^N_x|x`o}qgq{~zig{iUUtarrfdvzx}rzwsvys|qxyzrjcg\[q|vwrrx{jczsxwm^Xs{|~}~zlrnjbli^fu~tpx{n_l}yps|wjm}|pv~zwyy~xnmvyyv|usvusvx{pl}z{{{~~urxtnx|~wtvyvry{wsuz~~upw~{sqw{vtw}pgt~usv}{}|xz{zwux~|{~~|}|y|}z{ywwvz}~}~~yvxyvuzz{|z~~{y{{wx|}wyrpty}~{try{|zuw{}}~}~~{wuu{~~}zz~{zz}}ztv|||}|~xv|}}}{zz|zx|}}wtv{|}{xxy}}~|~|{}z{}~|~|zz~~}|~}}~{~}}~~|{~}|}~~~}~wx{}}}z{}~~zwqlndmam[jpoo^|kfuobv|`oomklmmllnjj||vtxwx|}~{wx~}zy~~~~|}}{xxy{}}zy{|yy~}{zzy{|}~}~~}~~~}z}~{x{~{~}||~}|}}~xxwwz}z|}~~{wvx~~~{xz}~|}|yy}}|{zz{~{vrqqsy~yvy~|z{~}|{yxy|{yz}}zy{~|}~|z|~{yz|}|}}}}}|{}~~~~~|{z|~~~}~}{z~~~}|}~}}{|~~}|}~zxy|~|{|}}||~}|~~~~~}}|}~~~}yxz|~}|}~~}|}}}~~}}~}}~~~~||}}}}}}~}~}}~~~~~~~}}~~~~~}}~~}}~}~~~~}~~~~~~}}~~}~~~~~}|~~~~}}}~~~~}}}}|}jeq}|z|yrryyux}{xqjq}|{uf_`^[f|zyv_NXf[LNQKY~htr[K=,(ǁ:g̝aFeC]^%ja;Z½O)ۙKA]Tsp!C}ƭyUUi~fLF`ʨ\=;OalsiWTamqz[1-L{ǬoI2;füX.$:b|zҠ_1%8Z{umq|~o^V`}uYQXemh\SWktXQ`}|w_C5?arfmiVUkw]RZpkQELa{ykhqzƦo?.9CI^uzw`SkhjyykhvzlkxebpzpkdfwstvjRMo~}vjfs}lfeeiqpd^k{yf]mq=*DoɹjUXx¶nadg_TQUc`;;^}o\SfƗo]cry~zWAKow\J=:ETf}rmq|jYZlzaTS^qq`Z]ht{dC5FiaB8Gayza[ltehu\LYu}jaepskdi~mUQ_qyozxh`gqvwzhQO]ktvqmqwxrlmz{oms||wz~znaY[clrvzshehlmpzsel|xtor|wgdm{xoszzrlp~vuxyxuqrwyshag{pho{}vrszyswzrns~lfimnlhgmtvtpoyytx||{|zy~|vtvwtrrtvvvtsv{}wngfn{zuv|aMXp}~wjjtrhimlsoillp|{quzhXlwkn}z~F$Bijkuã~vt[Tpi3;[ceq|ûqr|vS,0LXbq`tӶod{|WHA2:^vx|fn~xpr];1DZl{}{ֵ~lQ6"$C]_`ltx_A@KS\jtztP?EP]kpowhB,&1NgfbjntĬnJ4?bvvzzjfydF8CUg|}|hO?^}yaX_oxmXMSk|igpvo_OGJ\t~{|}sf^^gr{|rhdhs}zvxzz|~|vmfeipx}z~neiw|k`]ezzpr}|eSOZpsdajm`bp|kaeuxe^fzs_V\po``m~j\Zfx}qkm{vfdkxrijt{tsw~xplms{zx{zohhoz}upqz~xy}tpqqwznpmWYtgOaW7GʼnF6b^?`|R8NZJupQIoRS~_D:icbaȃhm^y73Mcf_Ukz}wV0IINoYgq`XXZom||fTi|smt}|obUb~~sdl~}{qxrjqmelupnwvso\PJKZlzzwol|}i]YTUafdkqqu||xbYVR\ox{woljm{~wssuy~|unh\W^fr~yjb\RQYeoyuqmlgbbackw{zzxvvyuqlklnrv}~|~zyxuttw{}{z{~{wy}}xrnov~}zyyxurswzyurnkkklow}{ysnlqtx~|xtstvz}{wtwx|}~~{www{||{|~~~~}|}|{{|{zyzyyyxwvututssrpooonnlkjkjiiijjjkjjjiiihjklklnopqrstuuuuttuvwyyz{|}~|{{~}ytrrruuoloolkhghihfeeedgihfedfhhiijlmjghkntvutsrqquvwxxz|zvu{~{|zwttrpqolpqqphcgknmjffgdbdgomlkkjfbgknnllmnkfgkrvqmmppppuxvspos \ No newline at end of file +{{{{||||}}||}}}}~~~~~~}}}}||||||{{{{{{{{{{zzzzzyyyyyyzzzzzz{{{{{{{|||||||||||}}~~~~~~}}}~~~~~~~}}}|||{{{{{{zzzzzzzzzzyyyyyyyyyzzzzzzyzzzzz{{{||||||}}~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}||{{{{{zzzyyyyyxxxyyyyyyyyyyyyyzzzzz{{{{{{{|||}}}}~~~~~~~}}||||{{{zzzzyyyyyyxxxxxxxxxxxwwxxxxxxxxxxxxxxxxyyyzzzzz{{z{|||}}~~~}|||{{zyyyxxxxwwwvuuvuvuvvvvvvvvvvvuuuuuuuvvvvwwwxxxxxxyyyz{{||}}~~~~~}||{{zzyxxxwwvvuutsssrrqqqqqppppqqqrrrrssssttttuuvwwxxyz{|}}~~}|{{yxxwvutsrqpponnmmlllkkkkjjjkkkkkkkllmnoppqrstuvwxyz{}~~|zywutsqpomljigedcba`__^]]\\]]]^^^__`abdeghjkmortvxz}|yurolifc`]ZWUROMKIHFEEEEEFGHIKLNPSUX[_bfimquy}{tmga[TNHC=840,)&%$$%&(*-048<@EKPV\cjrzſ}rg[QG>60*%!"&+18?HR\gq|Žwmc[SKE?:620.-.037@CGKOSX]chntzĿyqh_WOG?82-($" !$'*.28>DKRZcluľzqibZTNHC?<:87789:<@CGKPV[bhnu|~xrmhc_[WUSQONNNOPRTWZ^bfjnsw|}yurnlifdba`_____abdfiknqsvy|umu_AHTTFEVconl}Ҫ{~wjmg|jqvj\Z]UVNJLPTPT\bnt|}zyy}{qgfeiu~yi\RLOWbqrdVMLOXfu{naXUYcqsg_]akxpcZY^huyj^WW[ftzla[[`jxzl`[[`lzuf]YZbm{vh_[[bm{rf]X[blzrg^[^eq~xlebdjtuia^`gp|tjc`bgp|xngcejr|zqjggjr|{rkhhkrz{slggkpvvpljlqxzsommrx~zsnlmptz|wqppruz}xp{sm}|zwsrqu||wstootwz{tspmswy{urpopux~}wtrqsvz}ywuuy|}yuttvz~{xvvwz|yvvwy}{yvuvx{}zwuttvx{~}zxvuuvx{}{{{|~~~~~~}|{zz{|}}|{zzz|}~}||||}~~||{{|}}~~||{{{{{|}~~}}}|||}}~~~}}~~}|{{{z{{|}~~}}}||}~~~~~~}||{{|||}~~}~~~{~~~~}~~z~|~~~}~}}~~~}|~}{}{z~~~~||~}~~{~}~~~|{}~}}}x|~x|vx~|||}~}~}{{}}~|~~~}~}~}}{|~}}}{z||~|{||{}}|z{|~|~z~{x~|~{yz~{~w~~|{|z}w}yw}|uwz~z{~~}zx}|}|y~{}~zz|~z~~}}|}}}~}{}||~y|~~|~|z~||}~{|{yz{z{t~~|xxy~xu}|{qvy{r{~~~yyx{|{}s{~x}ox}||y~yw|x~{}~}~||}~}y~~}}}}}}y{}}w}}}z}y~xyw{wr|xtxklkhowvoqt|~xkwourzzrixvxqy~~yt~wxwz|yr}tw~usyv}|xzp~ux}}rz~}|t~xu~tzwv|s{x{{x~{vqnmlnt~{{ny^[sdiqjtovop|euzpwku|r|~qwjzuqyszyj{}x{owy{hx}olglasfy}cultzXqzrxk{ylyv~`avrv_v{xywZfryuyw~~pxeucygyh~xyvgi~o{qywv~{zpyxqwtu{ko}hzf{akfpueqvwlrvyltwvalHzeoy~gprt^d{p~bfuga[va~uab`hp{wynzsr{pzlwfiv~ht|zxu{x{|}~}r|i}sxbyl~t|co|tivor}pskkvq_[u`wuomxvizqsp~wT{mw|fqqe_xgUtx|V{no{sxot~tlou|}mw||sidnzvi}}z~pquohxk}{mrvrimjwpvznxw{r]tsuyzzg{wlz~_{yrwbvquqqirzrayxwzmukvbsirjuvykbletmnx}~yikz~{n}kowrltk_~fyozbw|t]ZrKtoV]`xl_lxTqlrevo{nkmy~dzosnm}_~wI{kxthsqszpo~vx{}h_}t^_slgwzvew|uhjfjhzbw~k}{uomxx|xkpl\vgK~xivpvprqr~y{gzpo|~xrzys{qno~xqhui{}jkq|zw|}{yu~y}mtzsk{uwy{nvlrh~ry|qpxutnstvolavtqhett|jv}qwV~eiisw}wlvivrnxr}rthzxgw||~rv{|}qg|bh}}~znk|e{|xxejxuynutrvq]}ztupyotxvwzhpfqu{y{rzudyrv{ptnxvxyx~n{yy{ozyz{|s|yv}|z~}{{z}v{~|z}~}|~|x{~~}{|w~ys||{x~zx}{|y{x|~zz|{~}~{~q{~}~}w|~|~~{{w~~|{{}|y~yzz{~zy}~~~~}~z{||}~~~}~|}z}||}{~|~}{}~}~|}z~}|~~~x}y~|z~{~~~~~}~~~~}|~~~|{~~~}|~|~}~}~}~}}~~~|~}}}~~|}~~~~y~lp{|tqq]ytaeqkUMYbny\ax|ujivojkuvrzp~zloxlf{xoYenqz}uoqltreT`gbv}er]UbkycOmkctw[v~buIi{LTejiWTp}|v~ym^ltlxzty{wfLivprtrk]Xc|yr~z~sqry{n_`qvjdnwt~vltqelmjxtydqndqrvpW~daurrsyvcn`khXUclfzők~XRle\{xb]p{neZcryy}x~|srwwlwqXd{tpqbtd`8Hmxyn`wǭs[TSeoUb{pql\kogn{`U`jxhknmy|gyvvqoox~vhzsy}q^Rl~zkhhgnlmlgovzwxz|}t^lUL~gpzm[^}wynat|aUf}yrw}tt~tot}{t[tqg~{rclniz{~ysz|{sqypitz}}zw|yxwqy||y|whn|}yy~~xt~x{}rjnv{~{xz{vqrywtw|}zy{xyuvxry~ztx~~y~~}zy{xz{}~||{}~~}~~}}yv{~}}xx}~~{w|~}}|~|{~z}z~y{~}}|}}{|~}~}}zwz}~zz~}~~|{~|~~yy~~zyz~~}}~}{wz}y}}~}{~{z~}}{{~}~|~}}~~~{~~~}}|}~~|~~~~~}~~~uvmgfe~{gcgTUKex}uRIf[dfSOhҊI2KpYW]h͓A'A^=\ďW)&WϹxE6\Z;EpБI8`tGAerINmVW|X:Rznjn[Hg~hfvlroneSY}vbnw}~Y^u^bhftmwy|ff}x{}uyo`rvt}qvy~wkyti|shxzz}u{v|}wrhp{l]gpgrkjxzzuqnrxisxvtihk_swkfskeiu}cfh]cofWnrjfne_swmk~oepqdilhwztzvqw~qp{xx{zz}vuu|xowwu|~xs}{{x~tu~yvwzvw}vu{y}~{z{yr{{{~}{}}~}~~}}xu||xy||}}{~~xw|z{~|y|~{}|{zz|{zx{~{uw{|}~}}xy}|z}zy}~{yz|}{~xx}|~~~}~~}~~{|~~~|~~||~}}~~z|~}{}~{~{{~~}}|}~|||}~}~~z{|{}}}|~}{|~|}~~~{z}~}~{|~}}}~~}|{{~~}}~~~|}~~~~|}~smrr`bOGg^Drpqg,)IIJO3>TmjEUbӵb/P~qw›j]}ݸe" "^{XcuƓE *LŖdTmˈxYmqLAHE~Ćfz~eu4JfcQpr_^apmP`mi|jrpxfvTPɍdvcSObğ|zrdto_O=^}{~m|hJQr~jWlƼwmJ>SjwncqvxW7#@yljzn\HKd~u[Yuepmizyqs|vberyfohah^N_x|x`o}qgq{~zig{iUUtarrfdvzx}rzwsvys|qxyzrjcg\[q|vwrrx{jczsxwm^Xs{|~}~zlrnjbli^fu~tpx{n_l}yps|wjm}|pv~zwyy~xnmvyyv|usvusvx{pl}z{{{~~urxtnx|~wtvyvry{wsuz~~upw~{sqw{vtw}pgt~usv}{}|xz{zwux~|{~~|}|y|}z{ywwvz}~}~~yvxyvuzz{|z~~{y{{wx|}wyrpty}~{try{|zuw{}}~}~~{wuu{~~}zz~{zz}}ztv|||}|~xv|}}}{zz|zx|}}wtv{|}{xxy}}~|~|{}z{}~|~|zz~~}|~}}~{~}}~~|{~}|}~~~}~wx{}}}z{}~~zwqlndmam[jpoo^|kfuobv|`oomklmmllnjj||vtxwx|}~{wx~}zy~~~~|}}{xxy{}}zy{|yy~}{zzy{|}~}~~}~~~}z}~{x{~{~}||~}|}}~xxwwz}z|}~~{wvx~~~{xz}~|}|yy}}|{zz{~{vrqqsy~yvy~|z{~}|{yxy|{yz}}zy{~|}~|z|~{yz|}|}}}}}|{}~~~~~|{z|~~~}~}{z~~~}|}~}}{|~~}|}~zxy|~|{|}}||~}|~~~~~}}|}~~~}yxz|~}|}~~}|}}}~~}}~}}~~~~||}}}}}}~}~}}~~~~~~~}}~~~~~}}~~}}~}~~~~}~~~~~~}}~~}~~~~~}|~~~~}}}~~~~}}}}|}jeq}|z|yrryyux}{xqjq}|{uf_`^[f|zyv_NXf[LNQKY~htr[K=,(ǁ:g̝aFeC]^%ja;Z½O)ۙKA]Tsp!C}ƭyUUi~fLF`ʨ\=;OalsiWTamqz[1-L{ǬoI2;füX.$:b|zҠ_1%8Z{umq|~o^V`}uYQXemh\SWktXQ`}|w_C5?arfmiVUkw]RZpkQELa{ykhqzƦo?.9CI^uzw`SkhjyykhvzlkxebpzpkdfwstvjRMo~}vjfs}lfeeiqpd^k{yf]mq=*DoɹjUXx¶nadg_TQUc`;;^}o\SfƗo]cry~zWAKow\J=:ETf}rmq|jYZlzaTS^qq`Z]ht{dC5FiaB8Gayza[ltehu\LYu}jaepskdi~mUQ_qyozxh`gqvwzhQO]ktvqmqwxrlmz{oms||wz~znaY[clrvzshehlmpzsel|xtor|wgdm{xoszzrlp~vuxyxuqrwyshag{pho{}vrszyswzrns~lfimnlhgmtvtpoyytx||{|zy~|vtvwtrrtvvvtsv{}wngfn{zuv|aMXp}~wjjtrhimlsoillp|{quzhXlwkn}z~F$Bijkuã~vt[Tpi3;[ceq|ûqr|vS,0LXbq`tӶod{|WHA2:^vx|fn~xpr];1DZl{}{ֵ~lQ6"$C]_`ltx_A@KS\jtztP?EP]kpowhB,&1NgfbjntĬnJ4?bvvzzjfydF8CUg|}|hO?^}yaX_oxmXMSk|igpvo_OGJ\t~{|}sf^^gr{|rhdhs}zvxzz|~|vmfeipx}z~neiw|k`]ezzpr}|eSOZpsdajm`bp|kaeuxe^fzs_V\po``m~j\Zfx}qkm{vfdkxrijt{tsw~xplms{zx{zohhoz}upqz~xy}tpqqwznpmWYtgOaW7GʼnF6b^?`|R8NZJupQIoRS~_D:icbaȃhm^y73Mcf_Ukz}wV0IINoYgq`XXZom||fTi|smt}|obUb~~sdl~}{qxrjqmelupnwvso\PJKZlzzwol|}i]YTUafdkqqu||xbYVR\ox{woljm{~wssuy~|unh\W^fr~yjb\RQYeoyuqmlgbbackw{zzxvvyuqlklnrv}~|~zyxuttw{}{z{~{wy}}xrnov~}zyyxurswzyurnkkklow}{ysnlqtx~|xtstvz}{wtwx|}~~{www{||{|~~~~}|}|{{|{zyzyyyxwvututssrpooonnlkjkjiiijjjkjjjiiihjklklnopqrstuuuuttuvwyyz{|}~|{{~}ytrrruuoloolkhghihfeeedgihfedfhhiijlmjghkntvutsrqquvwxxz|zvu{ \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s6.bin b/applications/PoP/poc/res/sound/s6.bin index 99dcdaf..3a3be2f 100644 --- a/applications/PoP/poc/res/sound/s6.bin +++ b/applications/PoP/poc/res/sound/s6.bin @@ -1 +1 @@ -uvv{~~}zwttw}xtsqonnpmidceimonkgedeknkcZ[djigeglqmjnsz|yuw||{zvvvzzsrrokeceig_^flnd]^didY\chd]]gsvpmouxwy|||wruy|vrvwwtsuyxqkpw}~zqr|~~wurniclqtxsry|{|~|y}}~vonnlc]][[VRX\WNMWeuxruy{vlp{uhilsmaagf]RRY__]`iqvxvxotmcad\YV_daS>AOWbXYlifa]irunlvz}wuynjkrsnigd\TW`kttty|uokryz~{}{jco}}j\]^^VOZdkh^gpme\^k{}qswz|yĺȷy}mTEIVWH>:4. )30!&::7/3FVYOISX^YXr{lyyyprzylmiheetxx}wtoq}~~syshjnwjWH;0)#1:;/ 2DURQ[ihd]y˼Ȼxs~xYXQNLEQbeaQRZUH>DOVWD1W_bPPzwKVamransVbѶzp}|mtrd_z[XdhoinsZL?BQ]lhWGHRJIWmvwwwpT@AFKSTemjuyh`ON^btr`GDLXlgm~henzii\^eYm|ziUSKQccxdo޽ͿŪƯrc\TYZjpX:'5IO_e}zhXceaZ[}^X]fniqweJ69@BLUm~mUVcgqw·›{|{mVH,% "-9FDN\}t}ʹ~oxtvTH9:PRZRFMIQk|}_fhqna\NH>'/OxĺrtyR7CQ]XMOE7$"D]ffr`Zlqalv{ueZftduK?UhvbSD>;2P{mlUC]zǺƸvtrVrnfaiFBcoXT\\YEYxusun^:A^l{wtZ.GlqkqtmZioIG]sumpmdOX_@QpcSU[P@Xrs{s79UhV+'$(Euʠ_\|s`fňe|nF 5byj;Hp|c-/Pso\ryweqĴ˶tbntZ7+Zɲe-0]P331),Uw}snhֳN-@ex`@BNULBLa}bvpqqXK_{aiyqmYmyVNl\qokUB>2IeinnYMAUxorVZVglmydO^o}|xznkloybr~naj^ae^TpeoyuusviZbdRI7.02NMKwsz]KQBDUagOI0Dchzkntp[^~|g[XL]XYx{yssr~wrskecf`eyx|}~yxg]\RRV^pz}o`epsi`r{jhjasrla^USPQopmbl||zx{}~pjbejp|t|{{piclokcu|qtzuyrn|{{}vilpuql~}s|h^ct{w}|wngjlp}|yklrumt~yyskovz|~~yiqpyyqx{}wifi}{}ytpkorz|{skmxzvy|{z{ttsxz~rkrx}{zz}}njlw}~quruuu|}|ynpuwz{yzsuxzz{}y}~iow~|}z{vlpr}~xotxzyx|yztqu}|{}~}~usx|}|~|}tms||~|}qru|}}}otz~~v{~}|y|wrw{~z}|xty}~{z}}}qrz~~}}wtwz~~~xtx}|{{||vx{}~|vx{}|~}vsw~}~{vx{~}}~~uw{|}~~|}zx{~~~~zy{~}~|wx|~~~zz{~~~|z|~~~~}{|~}z|}}~{z|~~~x{}}}|~}{|}{}~|~~ww|{|}{~{|}~~}{z}|}~|ww~z{}}~}xzy|~~{||z{yz~}z|zwz{{~}{}}w{z~~~~{||~}yz|{x|xxywy{}~~}}|~{}}~}}}}}~y~zx|}}}yxy}~||xx~|x{|{}{y}zz~vvxxswx}~|y~{||x~|xy}}}|}}y~z{}z|z~~{}}}{x|t~|}}}}z~||{}~x|~}}||}ztsvzwr~w{}}t{|wx}|wy~|wmsxyzvz~~|~zzx}~{~bbexzhy{iyvwz|x|~sy~|{w}yz~ru|z{t{vn~}wszx}stv{{wxy|~~xrwupx}{}|~u|~|ls}}r~pqs|{yylu|xtwyrvusbywvvup}jqglxysxyzu}r}xx}{||}xuyxyz~|zsmutyytq{wzvz|hxwwvty}|{xtvym|xz}wq~p{~{}|vy|{~||xz{}{{yryvxtn~w}}x|zyn}pryn}xl{rlvxn}rz}|nvwdurn|zspvrtyxpz}~vmr}{{vtjf`{sfwdxzxww}jhup}waXztxl{q]quq}jpxvRp}amqZH?mxoWkh{urzb+1zoO^vVUdwNȎP]Lgqcը*M;buGfƩ?C|RloplҔ4[j%gWRl[i%gn>-]kUYr^e_KX{pUcy]QO.DxdGZikr|پuMKcu{ursw͹{m`^k}}tlgYKMZfg^VMELduvrph`affW>/-8Q\VSX[Zns{x}|}ɿs_[`cfims{~xpgZL=1/7<@DHMXaa`_VOUYVW^gkpw|xwvx{zrmljec_YVUSTURNKHHIMU]doy}vplc]]ZWWVVVVWWTRQNJGECBBCBDGDEMPOSYXYZ\]Z\bcdlw{}}~yttv|~~xsttxyrrx{ww{{~x{ytpmg_[SR]^WVW[VICDED@<9?LQB>QWMPTONOTOG\gWTZ]fqsstvn\]pxsoXRW^fq}}sswy{{xvtty{~{w{~vojhd]\bghjmoruy{ywz|ytvz{yxwy{{yxzyxvrsuspruwxvuxytrsonuz|~xrwxuwyy|~~xsojfhjlnigjmosxywvusqole^YTOMORUY]^_bdfkrxzxwvwwupkkprsw}}}{xvtqnjhhfcdb`dedjrv}yvvvvwwuw{|}~}~~~~|zyxvsokga\WQKFCCDHIGEGJNTY]diihhgilmkjnommoqux{|~|xtpnnoponmptx{~~}||{{}}yvwwvvvuttuvxyyz||zxurpmigfcbbbbb`aba_]]]\\[ZYXWXZ\_a``dfgknljlnprtx~~|zyxspopnmlkmmkhfffec``chha_bcbcgiiihghmrstw{}~{z{|{|~~||{y{||}~}~~~|yzyy{~}~}zxxxxwwxwy{zyxwvxyyxxyxwvwyzz{zxvsqqqpooonmkklkkkklnqsuwyyzzyxwxxvwyxvuw|~|{zyxyzyyzyxywuttrqpqqrsqponmkigedbaabcdegjnoqtvuvxwwxxy{|}~~}}~~}}~~}|zwuttsrrqpqpooqrponnoooopqrrtvyzzyz|}}}}}~~}{zxwvvvwxwuuuuuuvvvwwvwwwxxwxyzzz|~|yxxwvvtsrponmkjijklklnoonpqqrstttsssrsrstuvxz{|{{{{zyyz{{|}~~~~~~}|zxvuusqqpoooopqrssrqpoooponmnnmmmnmnoprqppqppqpppoonnoooopqrssrqrsstuwyyxwxwxyxy}~~}~}zwtqooruwy{zwutstuvwwwutrqppqrtuuutsrqpqsttsssrrqonmmkjjknrtw{~~|zxyz}~}|{|}~~}}|}~}{zz{|||{|}||~~|zxvutsrssrqponmlkjiijiiklllmnopppppoonmkkklmprtvvwyyz|~~~~}|{{{zyyxxwvvvxxwwvvutsrrqqpooppqrtuvvvwxyyyyyyxyzzzzyzzz{{||||}}~~}~}|~~~~~}{z{|}~~}|{{yxxxwyzzyzxwwwvvxyxwxyyyzzyyzzyxxwwxxxxxxyxwvutsrrrrstwyzz{}}}}|{{zzxvuwxwvvvuttuvutstttuuuvvwxxxwwwxxxyyyz{|}}}||}}}~~~{~{{~{{olftRq``gՓurIkb?=* ,T/ ob;jtG_Ŷkc̰ũP5qPBLw9ZvrP=A8P^boаth8]t`hafd^Y5&^]t}]Hwgr{lHCRB Q{aJju;jvdqw^R#Br'AwCkBsmӺǵynyOPQ)):+bnGRȵw^2[flfejpveW;45=CVAqpRˉjpʦqx7,\ANMY|SybRBjf}wzklJPJW>R(q/mov͠w͖jrgM22;Z0IKPVdYB/g[F@l|szëȬrz|wwvHOhC_|`fks`XZlPf[[qq~y}gZpyimfoxd\T]\fwsyzvnwhTdWLTR[qdowzm}|{mSmw]cJLiwYQhiftdzhhV@^L`mQ^Xy`ph8\_ujx}}zow~zzvaN\`mqdapzvvl[`jfeilwz{grnv|vzyrggW_za^xwjlsygknogkmp~plujRrlHTV1WYUNcWM^_ejvxkiyvyhe~zspOV`e__vvwuohdkVP\i_SWYTXmefzeZ`NJUi_cjdy{r{qblyWqz{v}n`jXcsqrgyuirpfiV>@C5Gd@EfQIeerƽqlkJOf_]krr{v|peuvibYPTTPcnsjYZ[U`qbp|nrx|qidRMPQdld}uur~|w\opYYQSSO\n|{ntx}snaiQMOUZbdq{rle\S?@RUYdlwx_fdYrslu|pqzndS\LJZekzzrdMLBNtkwQByPSttoXRnjhjSiiSmѧz~nlrrj}y\lÜU|]LSqql[bgb|f=xqr=vSAYcktPo.dvm_fc{Ldkbpk`~qA`o7qvfx|ilvOL~eo{]_\WIVB[jZ{eYgSvqIv{{yjr0;uY;$0TVPcy[uTjJMlIvj;^uhuMev|\XРcmdjAdcix]uqTO]^`Y{xv˚r}yyzimVc`r}d[``~RpVrtyvxnw~sG{ʈ>xsVfxUr^IleyNT=R#Yr~{zmRam|nik|ll`|r}tyuyƉ~uyuiayg@[|eKp{uF?zeyq^LtinosldRYkokvn{bbnt|mi{fnqowiWapIcURGUuhtZLb8viOm_|bhPribhm}yjv~Wpog}{ĬÑywnw}byzuxy`xmmw}f}i}}{ywm}xmvz_~mdgw`hZ|WnMSyYdkv^n}U|wz}mvolo^nwqqWkpd{lglgvhgBP|z}d`Zye^q]PyXq~HqriM_j>crL{A{exLdX{PwQh]PzYkuY_qag}Y}ul[UliQoZedY|ot`fu~nrm|kbw|woqa|uvnzlr{pz{su}j}ydym{tpyv{czhwowtw}xfhNrk}oalfLhseJ=FJDMx{A\e^q`ka]dVSUW[fqSOGDz_jmXO3ZuPGUKa7=QO~xt@H,Faz[}}|R5dFTE4pYXmz{ZelfMM[Zmhb[mVoRzTz|}wnm}{~tK{yx|~~ew}jt~Qþh{yrnnw~{rwy}rxzuzzehq~~evrdVqup]baxjdWt`gyykejz|_ofythik~zzvxyzuvvn}uu~ss{zry}|s~~}tcajs|~qw~z}z|pdqzbbvy}|znjvjn|xaQvyx|wtx||yq~t~~tj{j~u~t{}{z}zx~kjqnf[uxp^l}|pfcsvfqzskzop}lTRnto|q|xtwk}tp{ikn~y}mfsut}|wrv{|{sxvnrxo \ No newline at end of file +~{|zwttrpqolpqqphcgknmjffgdbdgomlkkjfbgknnllmnkfgkrvqmmppppuxvsposuvv{~~}zwttw}xtsqonnpmidceimonkgedeknkcZ[djigeglqmjnsz|yuw||{zvvvzzsrrokeceig_^flnd]^didY\chd]]gsvpmouxwy|||wruy|vrvwwtsuyxqkpw}~zqr|~~wurniclqtxsry|{|~|y}}~vonnlc]][[VRX\WNMWeuxruy{vlp{uhilsmaagf]RRY__]`iqvxvxotmcad\YV_daS>AOWbXYlifa]irunlvz}wuynjkrsnigd\TW`kttty|uokryz~{}{jco}}j\]^^VOZdkh^gpme\^k{}qswz|yĺȷy}mTEIVWH>:4. )30!&::7/3FVYOISX^YXr{lyyyprzylmiheetxx}wtoq}~~syshjnwjWH;0)#1:;/ 2DURQ[ihd]y˼Ȼxs~xYXQNLEQbeaQRZUH>DOVWD1W_bPPzwKVamransVbѶzp}|mtrd_z[XdhoinsZL?BQ]lhWGHRJIWmvwwwpT@AFKSTemjuyh`ON^btr`GDLXlgm~henzii\^eYm|ziUSKQccxdo޽ͿŪƯrc\TYZjpX:'5IO_e}zhXceaZ[}^X]fniqweJ69@BLUm~mUVcgqw·›{|{mVH,% "-9FDN\}t}ʹ~oxtvTH9:PRZRFMIQk|}_fhqna\NH>'/OxĺrtyR7CQ]XMOE7$"D]ffr`Zlqalv{ueZftduK?UhvbSD>;2P{mlUC]zǺƸvtrVrnfaiFBcoXT\\YEYxusun^:A^l{wtZ.GlqkqtmZioIG]sumpmdOX_@QpcSU[P@Xrs{s79UhV+'$(Euʠ_\|s`fňe|nF 5byj;Hp|c-/Pso\ryweqĴ˶tbntZ7+Zɲe-0]P331),Uw}snhֳN-@ex`@BNULBLa}bvpqqXK_{aiyqmYmyVNl\qokUB>2IeinnYMAUxorVZVglmydO^o}|xznkloybr~naj^ae^TpeoyuusviZbdRI7.02NMKwsz]KQBDUagOI0Dchzkntp[^~|g[XL]XYx{yssr~wrskecf`eyx|}~yxg]\RRV^pz}o`epsi`r{jhjasrla^USPQopmbl||zx{}~pjbejp|t|{{piclokcu|qtzuyrn|{{}vilpuql~}s|h^ct{w}|wngjlp}|yklrumt~yyskovz|~~yiqpyyqx{}wifi}{}ytpkorz|{skmxzvy|{z{ttsxz~rkrx}{zz}}njlw}~quruuu|}|ynpuwz{yzsuxzz{}y}~iow~|}z{vlpr}~xotxzyx|yztqu}|{}~}~usx|}|~|}tms||~|}qru|}}}otz~~v{~}|y|wrw{~z}|xty}~{z}}}qrz~~}}wtwz~~~xtx}|{{||vx{}~|vx{}|~}vsw~}~{vx{~}}~~uw{|}~~|}zx{~~~~zy{~}~|wx|~~~zz{~~~|z|~~~~}{|~}z|}}~{z|~~~x{}}}|~}{|}{}~|~~ww|{|}{~{|}~~}{z}|}~|ww~z{}}~}xzy|~~{||z{yz~}z|zwz{{~}{}}w{z~~~~{||~}yz|{x|xxywy{}~~}}|~{}}~}}}}}~y~zx|}}}yxy}~||xx~|x{|{}{y}zz~vvxxswx}~|y~{||x~|xy}}}|}}y~z{}z|z~~{}}}{x|t~|}}}}z~||{}~x|~}}||}ztsvzwr~w{}}t{|wx}|wy~|wmsxyzvz~~|~zzx}~{~bbexzhy{iyvwz|x|~sy~|{w}yz~ru|z{t{vn~}wszx}stv{{wxy|~~xrwupx}{}|~u|~|ls}}r~pqs|{yylu|xtwyrvusbywvvup}jqglxysxyzu}r}xx}{||}xuyxyz~|zsmutyytq{wzvz|hxwwvty}|{xtvym|xz}wq~p{~{}|vy|{~||xz{}{{yryvxtn~w}}x|zyn}pryn}xl{rlvxn}rz}|nvwdurn|zspvrtyxpz}~vmr}{{vtjf`{sfwdxzxww}jhup}waXztxl{q]quq}jpxvRp}amqZH?mxoWkh{urzb+1zoO^vVUdwNȎP]Lgqcը*M;buGfƩ?C|RloplҔ4[j%gWRl[i%gn>-]kUYr^e_KX{pUcy]QO.DxdGZikr|پuMKcu{ursw͹{m`^k}}tlgYKMZfg^VMELduvrph`affW>/-8Q\VSX[Zns{x}|}ɿs_[`cfims{~xpgZL=1/7<@DHMXaa`_VOUYVW^gkpw|xwvx{zrmljec_YVUSTURNKHHIMU]doy}vplc]]ZWWVVVVWWTRQNJGECBBCBDGDEMPOSYXYZ\]Z\bcdlw{}}~yttv|~~xsttxyrrx{ww{{~x{ytpmg_[SR]^WVW[VICDED@<9?LQB>QWMPTONOTOG\gWTZ]fqsstvn\]pxsoXRW^fq}}sswy{{xvtty{~{w{~vojhd]\bghjmoruy{ywz|ytvz{yxwy{{yxzyxvrsuspruwxvuxytrsonuz|~xrwxuwyy|~~xsojfhjlnigjmosxywvusqole^YTOMORUY]^_bdfkrxzxwvwwupkkprsw}}}{xvtqnjhhfcdb`dedjrv}yvvvvwwuw{|}~}~~~~|zyxvsokga\WQKFCCDHIGEGJNTY]diihhgilmkjnommoqux{|~|xtpnnoponmptx{~~}||{{}}yvwwvvvuttuvxyyz||zxurpmigfcbbbbb`aba_]]]\\[ZYXWXZ\_a``dfgknljlnprtx~~|zyxspopnmlkmmkhfffec``chha_bcbcgiiihghmrstw{}~{z{|{|~~||{y{||}~}~~~|yzyy{~}~}zxxxxwwxwy{zyxwvxyyxxyxwvwyzz{zxvsqqqpooonmkklkkkklnqsuwyyzzyxwxxvwyxvuw|~|{zyxyzyyzyxywuttrqpqqrsqponmkigedbaabcdegjnoqtvuvxwwxxy{|}~~}}~~}}~~}|zwuttsrrqpqpooqrponnoooopqrrtvyzzyz|}}}}}~~}{zxwvvvwxwuuuuuuvvvwwvwwwxxwxyzzz|~|yxxwvvtsrponmkjijklklnoonpqqrstttsssrsrstuvxz{|{{{{zyyz{{|}~~~~~~}|zxvuusqqpoooopqrssrqpoooponmnnmmmnmnoprqppqppqpppoonnoooopqrssrqrsstuwyyxwxwxyxy}~~}~}zwtqooruwy{zwutstuvwwwutrqppqrtuuutsrqpqsttsssrrqonmmkjjknrtw{~~|zxyz}~}|{|}~~}}|}~}{zz{|||{|}||~~|zxvutsrssrqponmlkjiijiiklllmnopppppoonmkkklmprtvvwyyz|~~~~}|{{{zyyxxwvvvxxwwvvutsrrqqpooppqrtuvvvwxyyyyyyxyzzzzyzzz{{||||}}~~}~}|~~~~~}{z{|}~~}|{{yxxxwyzzyzxwwwvvxyxwxyyyzzyyzzyxxwwxxxxxxyxwvutsrrrrstwyzz{}}}}|{{zzxvuwxwvvvuttuvutstttuuuvvwxxxwwwxxxyyyz{|}}}||}}}~~~{~{{~{{olftRq``gՓurIkb?=* ,T/ ob;jtG_Ŷkc̰ũP5qPBLw9ZvrP=A8P^boаth8]t`hafd^Y5&^]t}]Hwgr{lHCRB Q{aJju;jvdqw^R#Br'AwCkBsmӺǵynyOPQ)):+bnGRȵw^2[flfejpveW;45=CVAqpRˉjpʦqx7,\ANMY|SybRBjf}wzklJPJW>R(q/mov͠w͖jrgM22;Z0IKPVdYB/g[F@l|szëȬrz|wwvHOhC_|`fks`XZlPf[[qq~y}gZpyimfoxd\T]\fwsyzvnwhTdWLTR[qdowzm}|{mSmw]cJLiwYQhiftdzhhV@^L`mQ^Xy`ph8\_ujx}}zow~zzvaN\`mqdapzvvl[`jfeilwz{grnv|vzyrggW_za^xwjlsygknogkmp~plujRrlHTV1WYUNcWM^_ejvxkiyvyhe~zspOV`e__vvwuohdkVP\i_SWYTXmefzeZ`NJUi_cjdy{r{qblyWqz{v}n`jXcsqrgyuirpfiV>@C5Gd@EfQIeerƽqlkJOf_]krr{v|peuvibYPTTPcnsjYZ[U`qbp|nrx|qidRMPQdld}uur~|w\opYYQSSO\n|{ntx}snaiQMOUZbdq{rle\S?@RUYdlwx_fdYrslu|pqzndS\LJZekzzrdMLBNtkwQByPSttoXRnjhjSiiSmѧz~nlrrj}y\lÜU|]LSqql[bgb|f=xqr=vSAYcktPo.dvm_fc{Ldkbpk`~qA`o7qvfx|ilvOL~eo{]_\WIVB[jZ{eYgSvqIv{{yjr0;uY;$0TVPcy[uTjJMlIvj;^uhuMev|\XРcmdjAdcix]uqTO]^`Y{xv˚r}yyzimVc`r}d[``~RpVrtyvxnw~sG{ʈ>xsVfxUr^IleyNT=R#Yr~{zmRam|nik|ll`|r}tyuyƉ~uyuiayg@[|eKp{uF?zeyq^LtinosldRYkokvn{bbnt|mi{fnqowiWapIcURGUuhtZLb8viOm_|bhPribhm}yjv~Wpog}{ĬÑywnw}byzuxy`xmmw}f}i}}{ywm}xmvz_~mdgw`hZ|WnMSyYdkv^n}U|wz}mvolo^nwqqWkpd{lglgvhgBP|z}d`Zye^q]PyXq~HqriM_j>crL{A{exLdX{PwQh]PzYkuY_qag}Y}ul[UliQoZedY|ot`fu~nrm|kbw|woqa|uvnzlr{pz{su}j}ydym{tpyv{czhwowtw}xfhNrk}oalfLhseJ=FJDMx{A\e^q`ka]dVSUW[fqSOGDz_jmXO3ZuPGUKa7=QO~xt@H,Faz[}}|R5dFTE4pYXmz{ZelfMM[Zmhb[mVoRzTz|}wnm}{~tK{yx|~~ew}jt~Qþh{yrnnw~{rwy}rxzuzzehq~~evrdVqup]baxjdWt`gyykejz|_ofythik~zzvxyzuvvn}uu~ss{zry}|s~~}tcajs|~qw~z}z|pdqzbbvy}|znjvjn|xaQvyx|wtx||yq~t~~tj{j~u~t{}{z}zx \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s7.bin b/applications/PoP/poc/res/sound/s7.bin index a0befc2..07834ed 100644 --- a/applications/PoP/poc/res/sound/s7.bin +++ b/applications/PoP/poc/res/sound/s7.bin @@ -1 +1 @@ -ux|nq~wuyw||qx~~t~~}yz||tzs~rrps{}}|vwpr`omiflyz}x}z{no|rs~txuvs|pfks||~y~wu}v}z~|rwuu}y~voj{xz{|{wyyvv|}|~|~zz}zwu|~}|v~~}~~}|w{wx~x~}z~{u{yf|cuza_czv^yxtgerbixw}ok~ytzl`p~hiwrs~z|{w~z{u|mzvw|~xyr|_x{lw|~spzuzxxuxz~xv|w{}|xuvyy|{w|{|{z}}}|xz{{y}~}}{}~|{{}|vyzz}x|{ux}vsxn{zswvx{y~umkfhurlhglvgg}oi^w`o|vyikpzjzxnq}xz|~}}|{z~|x~xz{xv|~|~zzoyz||}}~{}~~{~||x|z~y{xw||}z~~z||}}~|~}~|{}||||~~}||{~}{||}~{||}xy}|xz~}~||{~}~}}{x|~}}}||}~~}~~}}~z~~y~}~~~|~~~~~~~~~}~~~~~}~~~~~~}~~}y{}~~~~~~~~~}~~~~~~}~~}~~~~~zz|}}|~|}}~~~~~~~~}}~~~{|}z|}~~~}|}~~}}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}}~~}~}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~|}}}~~~}~~~~~~~~~~~~|{{{{{|}}|~~||}{|~~|{{}~~}||zvsrsuxz}|xwxz|zyyz|||{zxyzzyxvtssrqpnmlmooosx}yvvtqmd[VW[_dgkljgffeimopsyz{{{}~xuvwvwupnqtrrrpmjjlooqrsstvz~~}}~~zurruy{yursx}~}~~||~|~|z|oux}}}}vtnkghinw}|}~zsvrsy}~|~}}{}|yx|}~yxtsonppssptxz~~}|}{{zuqrwzz|~y|vpptz|}~~}~}yldflpv}zz}~~{snikptxyyz~{xwkig`adl}ywzo`W[hqrty~}zxyn_Zblszvqsy|wssvwcL=>JYqykdfkotzytxsianx}raWY`o|trnv|iZ[pvk\[wi\[cnt{uqoeclkp}wljwq[Waz{ePSgtimx|}ne_]\[j|~toqu|xjlqyvbKFMn|jgr|uwr|~pm}~xtxyurvw{tikgdemmu}|vrmpiehdl~yqot}|tqnpyx{zywtpopxyqnljmrx~xvrjhmmrwtxznkt~wrz}~{{iduyt{rv{upw}saYSJiieqxtxx~pwxhc]]mm_VMOkwT<7Ikzpx~spon{`VVXavzmf_^[[_gw|~~{roowwzrknns~su}|xiekm{wswy}snx~wofaitpqtsv}{nefiwrlf__trhnpd`zlp^N_|y[Sct~z}x`Vi{z^RYjty~uivtsx|b\mwzywv^Ycxm[ey}aTZlg_o|Z=An}nkx|jai|z~wsorvs{wzi_ipttocajkmv~yhZOWeunqyv|rqbZcrhX]kmtkqw}here}rkvstnovuࢢsfbfnqn~GOax~}}tztzuqno}sY]|_TkBJetp{yefYWdcmiebyqz`R^|ycmvXBUsxy|zholyxg{pq~edRtz_J+Npk^_OV|yalqKrv}k{|mj_M5HsqS_acqvrZV_vx}lo{aSZtlein{n_jwhs~~xknag?3<[qO83[eJgrrmbpGhYNw|Htqnۥy~{{sa=44>=Qmv|wU;.<_bnO +Vӭyp{fhywywzri]UYTJSY\|nwgZ}ֶzxi|mj}ovMICUcj[[n{hOtdTko}uww~nkp{{uwlnt|mnw{uviboxydYq|v`ix~{h[]SNE+2=" &1Halnwұ|npmxttjkia_DF7B;38WQc|wYOdixzw}tTUvzuoy{|shcYcry|w{ƽ|uhRB@BHJEK\y}ngjVQ\__mujefloulfe^ZSSfmosqwbgolmjnlnow\Lfuqr~~j\UYfrzq_eiuofopw}}unkg\Z^eq}gabehkjmpy~xs~srvtgljtzx{s~zot~wuyUHOfn|x|momd\^pnsv^qs^LLWeeiou{n~~zhlnkjrz~uj_epqu{wmpxy|||}uxy}sy}rmkcackpicljnokhuytzqqcjjleq~yrxzzzqjldefhkqqx|rlttio{}}ywyrt{zqsskfkpt}zqq{}~wogWOR[ejhosrukpriakpnwx}xtzyonoimukfa`]dirpu|yyyzsy{urysjjifmppqmhdcgnpx|~|~{txxy~~yvtvz~~~z|wu|zwtvzx{p}{}|zyspllmnyxvz~uligeiiimopqv|{vvy}~xnjggjmptyyyyzz{{y|}}}wyy}}~}zwx}x|{xwvtuww|{zwtrpnmpqsusolmkkkiffhjmruwwvvx||xwxwyvsqqnkklosyyvvwy}}|{ww}rjdaainqpsvvuxyxy{~|{yyz~{yzyz~|wtqtz|yzxz~}zvtssqpopokjnrtw|~z{ytxz{zrnklnrux|wstux{|~zvsohdbaeipu}~{z{z|}|yututpmkjkmoopppppqsuxz|zxyy{~~|{yxvxywtqnmoqssuvvvvvvvuvvy|{xvx{~|{{zzxvuuwyxwvvuvx{|{{|}}|}~~~}||zxvtstuvx{~~{xssssuvuuvvvvvuvuuttvw||}}~}}~~{ywvwz|}~|{z{}~zwtrrsux{{z{|}~|{zyyxwwxxy{~}zzz{|~~|yyxy|~}}}}}}||zyyyyxyz|||||{z|||~}|}~}~~~~~}~~}}|{zyyzzyyz{{|||||}~~}}~}}|||||||}~~~~~~~~~~}|z{}~|yxy{~}zwwy||ywx|}zy{}|yy|}{{}~|zxxz}}|zwutux|~~}}|{z{~|zz|~ywtsrsw{~|||zyz}}{zyyz~~~~yutv||vrqonorx}{spsvwz}zvx|}xsswy|zusv{}yz}{ussstuwxxurnmnmmnqvz}~{yyxvvx|}}xtrty~tlhioy{tomqywnjjp{zqjgktwpknvyqlnu~|smmr|vpnr|~ulgiq|~xod_akxzrnqzyrrxzogekvxogdisxokmu~wpnry~umjls{~ulghox~tmlqz{tqsyvmggmv}{qkjpyvnkoxwmhir}xmfgmxsgcgqwjejtqiiq{xmglwxlb`ix|sg`bn{tjeitxvurqyulow}|nhhhhp||g\cott{~oecixskjihlw~|~{vv~{{ztvztpw~~qfjxyqlgis|pkr~~zspruyyvvyywvvwvw}~}wsv}y}z}{{|ysquvts|zppuwqjlwztvzzwy~{{}yppw~|wsvyvtuyysruzxohly{tsvvpmswsywt{~x{oehsy|{upjipxmo{{|xnnyvf^amyri`Z_q{pkr|||}}ukb^br{necflt||qhejs|zsppryxrkkv{|qlmpwtkeck{uf\atyj`cmws\V`p~jdhkmv|z{seey}{o^Xh|bU_w{pmkhgo{zslkvvrqkb^dqqb_huzppv~uebn{z~ycQZ|qimztebk{wmfgoz}rhfp{~}~{x|zuppy{qfcm}xhVQ^uxoqz~ytlegwrmssh]b~seamxoaVXlo[MPlyrbL@OttVGQmvaTS`tjWTao~|ikuqiq~ttqf`ksmlgXQ`suzq_Wfx\Xi|wnprrzzsj^^t|ri\R]{uhXLTokSQhhT[n~e\fnnnz|f_gpqpxtmuxu~srtq|ystrdTVoyxwjUQgsZQf}fVdlZaywcaozzxsmt{yst}~plqx{}rjoutqwyhciot~|nkllrzne]\m|meXKKe~vaOSpl^guyu}xrtl_`ysYKYyy`PWr}hevw|yu~rw}laj}pqz|m\[m{zrr~men{|us}||qtuuocgqtrum^]flotwqsrnp~||ypio{uy{sik~ytozw|txzxxr}yspvwpkqvlnohagy{vundh{zpc[cyyePIUnz[OYm~ladpx}unhaZ]m|scY`tngnpdeoz~|k]]iuz{w}yps{sy{~{nhpwhgr{xrv~lhs~{lfpzwjdo||k_g{zqw~mouksrkpn]MObuvliu}ta]j|wovsktux}zvovyrxqddpy{z|qtywomwrdcovsournxysz|{nku~wrv~ysy~tpu~{v{~rnt||yy}|rlr|zxyvrpty~}}||zz{}}zz}~}xwy|xpmt}~~ssz|yz~{rjkpttuy~{yvtsw~}~~~yrpv|uqsutpowzuuxyxvx~||}{x|}yqljmqsrpppmga][^dinrw}|zz}~}}xttvunhdee`[VYbjmmmoqnf_^fs~wpot~}yx||xtszviabhnmjehq{yohgknnigiotw|}yssx}~ztmhfghec``chovzxsoosxxtpkknv~~~~|xutx}{{xqpt|zspokc\Y^gqvuqqyzqprtsrrx|phhnv}}sh`bn|ypjhhgdbelsyzl`[^hzpeemwtifhlqsu{|vla_ht~}nd_blw|vwtaSORZesymdadm{wlgimomknwzoiiigddhoxzmeceijhhmuui`[Y[ahnt~vsv||pnrzyrooljhhjq{}|unmortqjedkt{zoffmw{wsu|tnnsyxqhekxzngfgfcabjuyz|nglstqtz|{~|uoiiu|ywuuvzuqrstwz|~zsot}rlosqmjhfglt{~}ymc^ZWZdsrg^WST_qtd]XRKGLYgopsz~wokijknrw|}|}}|zy|{tnlotyzvrswyvsx}}}}yyytleaafr~{pd[X\cijlpu|zqhdcfkpw|yz}|sf``aaeoy}yussx|vuy~}~|unlnu||wsswywros|ywvtsxzssz~wpnpqqrw~}urstsqrtwyzyxz}tt}}}zngfjoruywd_fqvrkghp}vomptx{~{okq{}uopv{~~~~||xvtqlgefjpwyrnlnrtvy||yusv{zussuxy}~{{zsmhddhov|{yyxwy{{xsoou}tqw}|ukegoy~~sos|yzxpifinrsrv}sga`ciry~|xxz{xsposy}wja\]agox}{||xwywsnmr~wneaaeoz~yuw|yrmklptvx|~zvssvz{vsruwwxz|}||}}vnkmrvy}~|zxuqkefqtpoliec`bkw}vstx|}|wsru|xttuvwxyxwxy}{usuy|yrljq|~~}{yy{}~|xuuxzxtppt{|vsuz}}|{|{yxxyywtqquz|}|~~}|~|{{zwspqtxz{}~~~}zxxyzzyy{~~zwuuvxyyyy{}~{yy}{ursvz}~{yy|~}|z}~{yyz{{{{|||{zywvwwvspnosy~}~~~{yxvurpnnooooqsvy{||||}~~|zyywuttvxz|~}|{zyyyzzzz{{{||}~~}}|}~|yxwwxxwvuuvxz{{{yvuvwy}~~~~}||{{{{{||{zywvuuvwxyxwvvvwxyz{|~}{z{{}~~|zwwxz{|}}||zzyyxwvvvvwwxxyyz}~~~~}|zzz{||}}||{zzzyyyz{{{|}~~~~}||||||||| \ No newline at end of file +~kjqnf[uxp^l}|pfcsvfqzskzop}lTRnto|q|xtwk}tp{ikn~y}mfsut}|wrv{|{sxvnrxoux|nq~wuyw||qx~~t~~}yz||tzs~rrps{}}|vwpr`omiflyz}x}z{no|rs~txuvs|pfks||~y~wu}v}z~|rwuu}y~voj{xz{|{wyyvv|}|~|~zz}zwu|~}|v~~}~~}|w{wx~x~}z~{u{yf|cuza_czv^yxtgerbixw}ok~ytzl`p~hiwrs~z|{w~z{u|mzvw|~xyr|_x{lw|~spzuzxxuxz~xv|w{}|xuvyy|{w|{|{z}}}|xz{{y}~}}{}~|{{}|vyzz}x|{ux}vsxn{zswvx{y~umkfhurlhglvgg}oi^w`o|vyikpzjzxnq}xz|~}}|{z~|x~xz{xv|~|~zzoyz||}}~{}~~{~||x|z~y{xw||}z~~z||}}~|~}~|{}||||~~}||{~}{||}~{||}xy}|xz~}~||{~}~}}{x|~}}}||}~~}~~}}~z~~y~}~~~|~~~~~~~~~}~~~~~}~~~~~~}~~}y{}~~~~~~~~~}~~~~~~}~~}~~~~~zz|}}|~|}}~~~~~~~~}}~~~{|}z|}~~~}|}~~}}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}}~~}~}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~|}}}~~~}~~~~~~~~~~~~|{{{{{|}}|~~||}{|~~|{{}~~}||zvsrsuxz}|xwxz|zyyz|||{zxyzzyxvtssrqpnmlmooosx}yvvtqmd[VW[_dgkljgffeimopsyz{{{}~xuvwvwupnqtrrrpmjjlooqrsstvz~~}}~~zurruy{yursx}~}~~||~|~|z|oux}}}}vtnkghinw}|}~zsvrsy}~|~}}{}|yx|}~yxtsonppssptxz~~}|}{{zuqrwzz|~y|vpptz|}~~}~}yldflpv}zz}~~{snikptxyyz~{xwkig`adl}ywzo`W[hqrty~}zxyn_Zblszvqsy|wssvwcL=>JYqykdfkotzytxsianx}raWY`o|trnv|iZ[pvk\[wi\[cnt{uqoeclkp}wljwq[Waz{ePSgtimx|}ne_]\[j|~toqu|xjlqyvbKFMn|jgr|uwr|~pm}~xtxyurvw{tikgdemmu}|vrmpiehdl~yqot}|tqnpyx{zywtpopxyqnljmrx~xvrjhmmrwtxznkt~wrz}~{{iduyt{rv{upw}saYSJiieqxtxx~pwxhc]]mm_VMOkwT<7Ikzpx~spon{`VVXavzmf_^[[_gw|~~{roowwzrknns~su}|xiekm{wswy}snx~wofaitpqtsv}{nefiwrlf__trhnpd`zlp^N_|y[Sct~z}x`Vi{z^RYjty~uivtsx|b\mwzywv^Ycxm[ey}aTZlg_o|Z=An}nkx|jai|z~wsorvs{wzi_ipttocajkmv~yhZOWeunqyv|rqbZcrhX]kmtkqw}here}rkvstnovuࢢsfbfnqn~GOax~}}tztzuqno}sY]|_TkBJetp{yefYWdcmiebyqz`R^|ycmvXBUsxy|zholyxg{pq~edRtz_J+Npk^_OV|yalqKrv}k{|mj_M5HsqS_acqvrZV_vx}lo{aSZtlein{n_jwhs~~xknag?3<[qO83[eJgrrmbpGhYNw|Htqnۥy~{{sa=44>=Qmv|wU;.<_bnO +Vӭyp{fhywywzri]UYTJSY\|nwgZ}ֶzxi|mj}ovMICUcj[[n{hOtdTko}uww~nkp{{uwlnt|mnw{uviboxydYq|v`ix~{h[]SNE+2=" &1Halnwұ|npmxttjkia_DF7B;38WQc|wYOdixzw}tTUvzuoy{|shcYcry|w{ƽ|uhRB@BHJEK\y}ngjVQ\__mujefloulfe^ZSSfmosqwbgolmjnlnow\Lfuqr~~j\UYfrzq_eiuofopw}}unkg\Z^eq}gabehkjmpy~xs~srvtgljtzx{s~zot~wuyUHOfn|x|momd\^pnsv^qs^LLWeeiou{n~~zhlnkjrz~uj_epqu{wmpxy|||}uxy}sy}rmkcackpicljnokhuytzqqcjjleq~yrxzzzqjldefhkqqx|rlttio{}}ywyrt{zqsskfkpt}zqq{}~wogWOR[ejhosrukpriakpnwx}xtzyonoimukfa`]dirpu|yyyzsy{urysjjifmppqmhdcgnpx|~|~{txxy~~yvtvz~~~z|wu|zwtvzx{p}{}|zyspllmnyxvz~uligeiiimopqv|{vvy}~xnjggjmptyyyyzz{{y|}}}wyy}}~}zwx}x|{xwvtuww|{zwtrpnmpqsusolmkkkiffhjmruwwvvx||xwxwyvsqqnkklosyyvvwy}}|{ww}rjdaainqpsvvuxyxy{~|{yyz~{yzyz~|wtqtz|yzxz~}zvtssqpopokjnrtw|~z{ytxz{zrnklnrux|wstux{|~zvsohdbaeipu}~{z{z|}|yututpmkjkmoopppppqsuxz|zxyy{~~|{yxvxywtqnmoqssuvvvvvvvuvvy|{xvx{~|{{zzxvuuwyxwvvuvx{|{{|}}|}~~~}||zxvtstuvx{~~{xssssuvuuvvvvvuvuuttvw||}}~}}~~{ywvwz|}~|{z{}~zwtrrsux{{z{|}~|{zyyxwwxxy{~}zzz{|~~|yyxy|~}}}}}}||zyyyyxyz|||||{z|||~}|}~}~~~~~}~~}}|{zyyzzyyz{{|||||}~~}}~}}|||||||}~~~~~~~~~~}|z{}~|yxy{~}zwwy||ywx|}zy{}|yy|}{{}~|zxxz}}|zwutux|~~}}|{z{~|zz|~ywtsrsw{~|||zyz}}{zyyz~~~~yutv||vrqonorx}{spsvwz}zvx|}xsswy|zusv{}yz}{ussstuwxxurnmnmmnqvz}~{yyxvvx|}}xtrty~tlhioy{tomqywnjjp{zqjgktwpknvyqlnu~|smmr|vpnr|~ulgiq|~xod_akxzrnqzyrrxzogekvxogdisxokmu~wpnry~umjls{~ulghox~tmlqz{tqsyvmggmv}{qkjpyvnkoxwmhir}xmfgmxsgcgqwjejtqiiq{xmglwxlb`ix|sg`bn{tjeitxvurqyulow}|nhhhhp||g\cott{~oecixskjihlw~|~{vv~{{ztvztpw~~qfjxyqlgis|pkr~~zspruyyvvyywvvwvw}~}wsv}y}z}{{|ysquvts|zppuwqjlwztvzzwy~{{}yppw~|wsvyvtuyysruzxohly{tsvvpmswsywt{~x{oehsy|{upjipxmo{{|xnnyvf^amyri`Z_q{pkr|||}}ukb^br{necflt||qhejs|zsppryxrkkv{|qlmpwtkeck{uf\atyj`cmws\V`p~jdhkmv|z{seey}{o^Xh|bU_w{pmkhgo{zslkvvrqkb^dqqb_huzppv~uebn{z~ycQZ|qimztebk{wmfgoz}rhfp{~}~{x|zuppy{qfcm}xhVQ^uxoqz~ytlegwrmssh]b~seamxoaVXlo[MPlyrbL@OttVGQmvaTS`tjWTao~|ikuqiq~ttqf`ksmlgXQ`suzq_Wfx\Xi|wnprrzzsj^^t|ri\R]{uhXLTokSQhhT[n~e\fnnnz|f_gpqpxtmuxu~srtq|ystrdTVoyxwjUQgsZQf}fVdlZaywcaozzxsmt{yst}~plqx{}rjoutqwyhciot~|nkllrzne]\m|meXKKe~vaOSpl^guyu}xrtl_`ysYKYyy`PWr}hevw|yu~rw}laj}pqz|m\[m{zrr~men{|us}||qtuuocgqtrum^]flotwqsrnp~||ypio{uy{sik~ytozw|txzxxr}yspvwpkqvlnohagy{vundh{zpc[cyyePIUnz[OYm~ladpx}unhaZ]m|scY`tngnpdeoz~|k]]iuz{w}yps{sy{~{nhpwhgr{xrv~lhs~{lfpzwjdo||k_g{zqw~mouksrkpn]MObuvliu}ta]j|wovsktux}zvovyrxqddpy{z|qtywomwrdcovsournxysz|{nku~wrv~ysy~tpu~{v{~rnt||yy}|rlr|zxyvrpty~}}||zz{}}zz}~}xwy|xpmt}~~ssz|yz~{rjkpttuy~{yvtsw~}~~~yrpv|uqsutpowzuuxyxvx~||}{x|}yqljmqsrpppmga][^dinrw}|zz}~}}xttvunhdee`[VYbjmmmoqnf_^fs~wpot~}yx||xtszviabhnmjehq{yohgknnigiotw|}yssx}~ztmhfghec``chovzxsoosxxtpkknv~~~~|xutx}{{xqpt|zspokc\Y^gqvuqqyzqprtsrrx|phhnv}}sh`bn|ypjhhgdbelsyzl`[^hzpeemwtifhlqsu{|vla_ht~}nd_blw|vwtaSORZesymdadm{wlgimomknwzoiiigddhoxzmeceijhhmuui`[Y[ahnt~vsv||pnrzyrooljhhjq{}|unmortqjedkt{zoffmw{wsu|tnnsyxqhekxzngfgfcabjuyz|nglstqtz|{~|uoiiu|ywuuvzuqrstwz|~zsot}rlosqmjhfglt{~}ymc^ZWZdsrg^WST_qtd]XRKGLYgopsz~wokijknrw|}|}}|zy|{tnlotyzvrswyvsx}}}}yyytleaafr~{pd[X\cijlpu|zqhdcfkpw|yz}|sf``aaeoy}yussx|vuy~}~|unlnu||wsswywros|ywvtsxzssz~wpnpqqrw~}urstsqrtwyzyxz}tt}}}zngfjoruywd_fqvrkghp}vomptx{~{okq{}uopv{~~~~||xvtqlgefjpwyrnlnrtvy||yusv{zussuxy}~{{zsmhddhov|{yyxwy{{xsoou}tqw}|ukegoy~~sos|yzxpifinrsrv}sga`ciry~|xxz{xsposy}wja\]agox}{||xwywsnmr~wneaaeoz~yuw|yrmklptvx|~zvssvz{vsruwwxz|}||}}vnkmrvy}~|zxuqkefqtpoliec`bkw}vstx|}|wsru|xttuvwxyxwxy}{usuy|yrljq|~~}{yy{}~|xuuxzxtppt{|vsuz}}|{|{yxxyywtqquz|}|~~}|~|{{zwspqtxz{}~~~}zxxyzzyy{~~zwuuvxyyyy{}~{yy}{ursvz}~{yy|~}|z}~{yyz{{{{|||{zywvwwvspnosy~}~~~{yxvurpnnooooqsvy{||||}~~|zyywuttvxz|~}|{zyyyzzzz{{{||}~~}}|}~|yxwwxxwvuuvxz{{{yvuvwy}~~~~}||{{{{{||{zywvuuvwxyxwvvvwxyz{|~}{z{{}~~|zwwxz{|}}||zzyyxwvvvvwwxxyyz}~~~~}|zzz{||}}||{zzzyyyz{{{|}~~~~}||||||||| \ No newline at end of file diff --git a/applications/PoP/roomtest/Makefile b/applications/PoP/roomtest/Makefile index d81074e..184b93c 100644 --- a/applications/PoP/roomtest/Makefile +++ b/applications/PoP/roomtest/Makefile @@ -35,7 +35,7 @@ MEMORY ?= huge # small-раскладка + банки кода в W # ВАЖНО: любое сравнение занятости банков имеет смысл только при ОДНОМ и том # же ALLOCS — иначе сравниваются не правки, а уровни оптимизации. ALLOCS ?= 3000 -EXTRA_FLAGS ?= --gfx 256 -I $(CURDIR)/../poc/res/bg --max-allocs $(ALLOCS) --bank 2=pop_bg.c --bank 7=pop_room.c --bank 4=pop_cdraw.c --bank 4=pop_kdraw.c --bank 3=pop_map.c --bank 1=guards.c --bank 5=pop_ctrl.c --bank 6=pop_trob.c --bank 7=pop_redraw.c --bank 8=roomtest_cold.c --bank 8=pop_level_cold.c --bank 8=pop_kboot.c --bank 8=pop_guard_cold.c --bank 8=pop_shadow.c $(PROF_FLAGS) +EXTRA_FLAGS ?= --gfx 256 -I $(CURDIR)/../poc/res/bg --max-allocs $(ALLOCS) --bank 2=pop_bg.c --bank 7=pop_room.c --bank 4=pop_cdraw.c --bank 4=pop_kdraw.c --bank 3=pop_map.c --bank 1=guards.c --bank 5=pop_ctrl.c --bank 6=pop_trob.c --bank 7=pop_redraw.c --bank 8=roomtest_cold.c --bank 8=pop_level_cold.c --bank 8=pop_kboot.c --bank 8=pop_guard_cold.c --bank 8=pop_shadow.c --bank 8=pop_sfx_cold.c $(PROF_FLAGS) # Профилирование полосами бордюра (см. PROF() в roomtest.c) — ВКЛЮЧЕНО по # умолчанию, пока идёт работа с производительностью; make PROF=0 выключает. # Каждая фаза кадра красит бордюр в свой цвет, высота полосы на скриншоте @@ -57,7 +57,7 @@ POS ?= 2 ifneq ($(strip $(ROOM)),) PROF_FLAGS += -DDBG_START_ROOM=$(ROOM) -DDBG_START_POS=$(POS) endif -EXTRA_SRCS := pop_vflip.c pop_pace.c pop_state.c pop_draw.c pop_tile.c pop_kid.c pop_level.c pop_geom.c pop_guard.c +EXTRA_SRCS := pop_vflip.c pop_pace.c pop_sfx.c pop_state.c pop_draw.c pop_tile.c pop_kid.c pop_level.c pop_geom.c pop_guard.c BG_DIR := $(CURDIR)/../poc/res/bg KID_DIR := $(CURDIR)/../poc/res/kid @@ -120,8 +120,13 @@ SHADOW_DIR := $(CURDIR)/../poc/res/shadow SHADOW_DATA := $(foreach n,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27,$(SHADOW_DIR)/sk$(n).atl) \ $(foreach n,0 1 2 3,$(SHADOW_DIR)/sf$(n).atl) +# ЗВУКОВЫЕ ЭФФЕКТЫ — оригинальная оцифровка, приведённая к частоте CBL +# (10 937,5 Гц, 8 бит моно). 8 страниц по 16 КБ; см. ../docs/sound_plan.md. +SND_DIR := $(CURDIR)/../poc/res/sound +SND_DATA := $(foreach n,0 1 2 3 4 5 6 7,$(SND_DIR)/s$(n).bin) + EXTRA_DATA := $(BG_DATA) $(KID_DATA) $(KID_BIN) $(GUARD_DATA) $(SKEL_DATA) \ - $(VIZIER_DATA) $(SHADOW_DATA) $(LVL_DATA) + $(VIZIER_DATA) $(SHADOW_DATA) $(SND_DATA) $(LVL_DATA) include $(PROJ_ROOT)/app.mk # Образ HDD для MAME: ресурсы раскладываются ПО КАТАЛОГАМ (8.3, как в DSS), @@ -139,6 +144,7 @@ hdd: $(EXAMPLE).exe $(foreach f,$(SKEL_DATA),SKEL:$(f)) \ $(foreach f,$(VIZIER_DATA),VIZIER:$(f)) \ $(foreach f,$(SHADOW_DATA),SHADOW:$(f)) \ + $(foreach f,$(SND_DATA),SND:$(f)) \ $(foreach f,$(LVL_DATA),LEVELS:$(f)) TC := $(PROJ_ROOT)/applications/PoP/toolchain @@ -156,6 +162,9 @@ $(VIZIER_DATA): $(TC)/pop_pack_guard.py $(SHADOW_DATA) pop_shadow_atlas.h: $(TC)/pop_pack_shadow.py $(TC)/pop_pack_bg.py $(TC)/pop_pack_kid.py cd $(TC) && python3 pop_pack_shadow.py +$(SND_DATA) pop_sound_tbl.h: $(TC)/pop_pack_sound.py + cd $(TC) && python3 pop_pack_sound.py + $(KID_DATA): $(TC)/pop_pack_kid.py $(TC)/pop_pack_bg.py cd $(TC) && python3 pop_pack_kid.py kid_data.h $(KID_BIN): $(TC)/pop_extract_kid_data.py diff --git a/applications/PoP/roomtest/_pop_sfx.h b/applications/PoP/roomtest/_pop_sfx.h new file mode 100644 index 0000000..3e9ccfe --- /dev/null +++ b/applications/PoP/roomtest/_pop_sfx.h @@ -0,0 +1,26 @@ +/* + * _pop_sfx.h — внутренний контракт между половинами звука (НЕ публичный, + * публичный — pop_sfx.h). Горячая половина живёт в резиденте + * (pop_sfx.c), холодная в банке (pop_sfx_cold.c); делят они таблицу + * звуков, массив физических страниц и насос. + */ +#ifndef _POP_SFX_INTERNAL_H +#define _POP_SFX_INTERNAL_H + +#include +#include "pop_sound_tbl.h" /* pop_snd_tbl, POP_SND_* — генерит упаковщик */ + +/* Физические страницы набора, по индексу из pop_snd_tbl[].page. */ +extern uint8_t pop_snd_page[POP_SND_PAGES]; +/* 1 — набор поднят и CBL открыт; 0 — играем молча. */ +extern uint8_t pop_snd_ok; + +/* Насос: отдать n байт в CBL. Резидентный — его адрес отдаётся в + * cbl_open() холодной половиной. */ +int pop_sfx_fill(uint16_t n); + +/* Прочитать файл целиком в ФИЗИЧЕСКУЮ страницу (через W3). Резидентный: + * банковый код, переключив W3, вырезал бы сам себя. */ +int pop_page_read(const char *path, uint8_t phys, uint16_t want); + +#endif diff --git a/applications/PoP/roomtest/guards.c b/applications/PoP/roomtest/guards.c index 02e4def..6724ce9 100644 --- a/applications/PoP/roomtest/guards.c +++ b/applications/PoP/roomtest/guards.c @@ -16,6 +16,7 @@ * дальше работает общий pop_control(). */ #include "pop_guard.h" +#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ #include "pop_kid.h" #include "pop_ctrl.h" #include "pop_map.h" @@ -189,6 +190,7 @@ void pop_check_skel(void) __banked Char.charid = CHARID_4_SKELETON; Char.fall_x = Char.fall_y = 0; pop_char_set_seq(SEQ_88_SKEL_WAKE_UP); + pop_sfx_play(44); /* seg002:106D — скелет оживает */ play_seq(); pop_saveshad(); @@ -989,7 +991,9 @@ static void hurt_by_sword(void) } Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; Char.fall_y = 0; - play_seq(); /* TODO: звук 12/13 */ + /* seg002:0C1F: у Кида свой звук боли, у соперника свой. */ + pop_sfx_play((uint8_t)(Char.charid == CHARID_0_KID ? 13 : 12)); + play_seq(); } /* check_hurting (seg002:0D56): достал ли АКТИВНЫЙ персонаж соперника. @@ -1010,6 +1014,8 @@ static void check_hurting(void) (of != FRAME_161_PARRY && of != FRAME_150_PARRY)) { /* Соперник НЕ парирует. */ if (cf == FRAME_154_POKING) { + /* seg002:0DAE — свист клинка мимо цели. */ + pop_sfx_play(11); min_range = (uint8_t)(Opp.sword < SWORD_2_DRAWN ? 8 : 12); distance = pop_char_opp_dist(); if (distance >= (int16_t)min_range && distance < 29) diff --git a/applications/PoP/roomtest/pop_ctrl.c b/applications/PoP/roomtest/pop_ctrl.c index b7cc5de..27591fb 100644 --- a/applications/PoP/roomtest/pop_ctrl.c +++ b/applications/PoP/roomtest/pop_ctrl.c @@ -20,6 +20,7 @@ #include "pop_state.h" #include "pop_ctrl.h" /* свой API (__banked) + объявления шины control_* */ #include "pop_kid.h" +#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ #include "pop_map.h" #include "pop_guard.h" /* charid, состояние меча, seq стража */ @@ -405,7 +406,8 @@ static void draw_sword(void) uint8_t seq_id = SEQ_55_DRAW_SWORD; control_forward = control_shift2 = release_arrows(); if (Char.charid == CHARID_0_KID) { - offguard = 0; /* TODO: play_sound(19) — звука пока нет */ + offguard = 0; + pop_sfx_play(19); /* seg005:945 — меч из ножен */ } else if (Char.charid != CHARID_1_SHADOW) { seq_id = SEQ_90_EN_GARDE; /* соперник встаёт сразу в стойку */ } diff --git a/applications/PoP/roomtest/pop_kid.c b/applications/PoP/roomtest/pop_kid.c index f0af4c1..c0a6ea1 100644 --- a/applications/PoP/roomtest/pop_kid.c +++ b/applications/PoP/roomtest/pop_kid.c @@ -10,6 +10,7 @@ #include #include #include "pop_kid.h" +#include "pop_sfx.h" /* звуковые эффекты: опкод SOUND в play_seq */ #include "pop_trob.h" /* pop_start_chompers — смена ряда будит чомперы */ #include "pop_guard.h" /* Guard/pop_gframe/CHARID_* — интерпретатор общий */ #include "pop_bg.h" /* POP_YOFF — вертикальное центрирование */ @@ -323,14 +324,26 @@ void play_seq(void) case 0xF4: /* KNOCK_DOWN: приземление трясёт loose В СВОЁМ РЯДУ */ knock = -1; break; - case 0xF2: /* SOUND (seg006:0611): звука у нас нет, но опкод несёт - * ВТОРОЙ смысл — «Кид нашумел», и его терять нельзя. - * Шумом считаются id 0..2 (SILENT/FOOTSTEP/BUMP); id 0 - * назван silent потому, что НЕ звучит, а стражи его всё - * равно замечают (стоит, например, в seq доставания меча). - * DRINK(3)/LEVEL(4) — не шум. См. BUG-GUARD-DEAF-1. */ - if (SEQ(Char.curr_seq) < 3) is_guard_notice = 1; - Char.curr_seq++; + case 0xF2: /* SOUND (seg006:0627). Аргумент — НЕ номер звука игры, а + * одно из пяти событий; отображение взято оттуда же: + * 0 SILENT — не звучит, но стражи Кида ЗАМЕЧАЮТ + * (стоит, например, в seq доставания меча); + * 1 FOOTSTEP — звук 23, и шум; + * 2 BUMP — звук 8, и шум; + * 3 DRINK — звук 18, не шум; + * 4 LEVEL — МУЗЫКА конца уровня (32 на 4-м, иначе 41, + * на 13/15 молчок). Оцифровки у неё нет, + * это путь A на AY — пока тишина. + * Второй смысл опкода («Кид нашумел») терять нельзя даже + * без звука, см. BUG-GUARD-DEAF-1. */ + { + uint8_t ev = SEQ(Char.curr_seq); + Char.curr_seq++; + if (ev < 3) is_guard_notice = 1; + if (ev == 1) pop_sfx_play(23); + else if (ev == 2) pop_sfx_play(8); + else if (ev == 3) pop_sfx_play(18); + } break; case 0xF1: /* END_LEVEL: seq_70 доиграл — уровень пройден. * В оригинале это `++next_level`, а главный цикл diff --git a/applications/PoP/roomtest/pop_map.c b/applications/PoP/roomtest/pop_map.c index b4959af..c84bd04 100644 --- a/applications/PoP/roomtest/pop_map.c +++ b/applications/PoP/roomtest/pop_map.c @@ -21,6 +21,7 @@ #include "pop_map.h" #include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ #include "pop_ctrl.h" /* pop_ctrl_shift_held() — для check_grab */ +#include "pop_sfx.h" /* звуковые эффекты (sound_plan.md) */ #include "pop_geom.h" /* общая геометрия (x_bump/y_land/y_to_row) */ #include "pop_tile.h" /* POP_TILE_DIV/MOD — деление на ширину тайла таблицей */ #include "pop_redraw.h" /* пометки перерисовки (порт set_redraw_*) */ @@ -143,6 +144,11 @@ uint8_t pop_leave_timer; /* exit_room_timer (seg002): >0 = leave заб uint8_t pop_loose_fell; /* 0=нет; иначе tilepos+1 упавшего loose (кусок улетел вниз) */ uint8_t pop_kid_dead; /* 1 = Kid мёртв (напоролся на пики и т.п.) */ uint8_t pop_kid_hurt; /* 1 = в этом кадре убавилось HP → «брызги» */ + +/* is_screaming (seg005:38): крик падения звучит ОДИН раз за полёт, а не + * каждый кадр. Сбрасывается там же, где у оригинала: приземление (land), + * зацеп за карниз (check_grab) и постановка на старт (set_start_pos). */ +static uint8_t is_screaming; uint8_t hitp_curr; /* текущее HP (0 = мёртв); pop_kid_hp_reset ставит старт */ uint8_t hitp_max; /* стартовое HP Кида (для индикатора) */ /* hitp_beg_lev (seg003 init_game/play_level_2): HP, с которым НАЧАТ уровень. @@ -666,6 +672,7 @@ static void land(void) * control_crouched(), а при `sword == sword_2_drawn` управление уходит в * control_with_sword и до него не доходит — Кид садится в присед * НАВСЕГДА (BUG-LAND-SWORD-1). */ + is_screaming = 0; /* seg005:116 */ if (Char.fall_y < 22) { soft_land: if (Char.charid >= CHARID_2_GUARD || Char.sword == SWORD_2_DRAWN) { @@ -674,8 +681,8 @@ static void land(void) } else { seq = SEQ_17_SOFT_LAND; } - /* seg005:185 — мягкое приземление слышно (звука нет, флаг есть). */ - if (Char.charid == CHARID_0_KID) is_guard_notice = 1; + /* seg005:185 — мягкое приземление слышно И стражам, и игроку. */ + if (Char.charid == CHARID_0_KID) { pop_sfx_play(17); is_guard_notice = 1; } } else { uint8_t deadly = (uint8_t)(Char.fall_y >= 33); /* СНЯТЬ до обнуления */ if (!deadly && Char.charid == CHARID_1_SHADOW) goto soft_land; /* seg005:189 */ @@ -683,13 +690,14 @@ static void land(void) Char.fall_x = Char.fall_y = 0; if (deadly || pop_take_hp(1)) { /* 3+ этажа или последнее HP */ pop_take_hp(100); + if (Char.charid == CHARID_0_KID) pop_sfx_play(0); /* разбился */ pop_char_set_seq(SEQ_22_CRUSHED); play_seq(); determine_col(); if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; return; } - if (Char.charid == CHARID_0_KID) is_guard_notice = 1; /* seg005:195 */ + if (Char.charid == CHARID_0_KID) { pop_sfx_play(16); is_guard_notice = 1; } /* seg005:195 */ seq = SEQ_20_MEDIUM_LAND; } Char.fall_x = Char.fall_y = 0; @@ -811,7 +819,9 @@ static void check_grab(void) pop_char_set_seq(SEQ_15_GRAB_LEDGE_MIDAIR); play_seq(); determine_col(); - grab_timer = 12; /* (TODO: sound grab) */ + grab_timer = 12; + pop_sfx_play(9); /* seg006 check_grab */ + is_screaming = 0; /* seg006:1219 */ } } @@ -882,6 +892,10 @@ static uint8_t check_grab_run_jump(void) static void do_fall(void) { uint8_t nrow = (uint8_t)(Char.curr_row + 1); + if (!is_screaming && Char.fall_y >= 31) { + pop_sfx_play(1); /* seg005:39 — крик падения */ + is_screaming = 1; + } if (nrow > 4) nrow = 4; /* защита pop_y_land[] от выхода */ if ((uint16_t)pop_y_land[nrow] > (uint16_t)Char.y) { check_grab(); /* ещё летит — попытка зацепа */ @@ -1355,6 +1369,8 @@ void pop_proc_get_object(void) __banked * ставили вспышку руками, то есть красили экран дважды. * Спецсобытие уровня зелий: там синие склянки забирают ПОЛОВИНУ * запаса, а не одну единицу. */ + pop_sfx_stop(); /* seg006:1893 — stop_sounds */ + pop_sfx_play(13); if (pop_current_level == POP_POTIONS_LEVEL) hitp_delta = (int8_t)(-((hitp_max + 1) >> 1)); else @@ -1508,8 +1524,9 @@ static void bumped_fall(void) play_seq(); } /* bumped_sound (seg004:05F1) — ВНЕ ветвления, как в оригинале: удар о - * стену слышен и в свободном падении. Звука у нас нет, но «Кид нашумел» - * взводить обязаны — см. BUG-GUARD-DEAF-1. */ + * стену слышен и в свободном падении. Флаг «Кид нашумел» взводится + * вместе со звуком — см. BUG-GUARD-DEAF-1. */ + pop_sfx_play(8); is_guard_notice = 1; } @@ -1560,7 +1577,8 @@ static void bumped_floor(void) else pop_char_set_seq(SEQ_47_BUMP); play_seq(); - is_guard_notice = 1; /* bumped_sound (seg004:05F1) */ + pop_sfx_play(8); /* bumped_sound (seg004:05F1) */ + is_guard_notice = 1; } /* bump_into_opponent (seg003:08AA). Зовётся из play_kid_frame (seg000:1238) @@ -1593,6 +1611,7 @@ static void bump_into_opponent(void) if (distance > 15) return; Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; Char.fall_y = 0; + pop_sfx_play(16); /* seg003:0654 — толчок о стража */ pop_char_set_seq(SEQ_47_BUMP); play_seq(); } @@ -2367,6 +2386,28 @@ static void check_press(void) } } +/* ---- Звук дрожащей плиты (loose_shake, seg007:0E55) ------------------ * + * Три сэмпла 20/21/22 вперемешку, но НЕ на каждый кадр фазы: гейт-таблица + * loose_sound (data:2734) даёт звук на фазах 1,2,3,5,8, а на остальных + * молчит — иначе тряска трещит без пауз. Повтор подряд одного и того же + * сэмпла оригинал запрещает (цикл do/while), иначе слышно «заедание». + * + * Сид СВОЙ, а не общий с trob/боёвкой: домены prandom у нас разведены + * (../docs/impl_diff.md), и звук не должен сдвигать чужие розыгрыши. */ +static const uint8_t loose_sound[12] = { 0,1,1,1,0,1,0,0,1,0,0,0 }; +static pop_rnd_t loose_seed; +static uint8_t last_loose_snd; + +static void loose_shake(uint8_t force, uint8_t modif) +{ + uint8_t id; + if (!force && !loose_sound[modif & 0x7F]) return; + do { id = (uint8_t)(pop_prandom(&loose_seed, 2) + 20); } + while (id == last_loose_snd); + last_loose_snd = id; + pop_sfx_play(id); +} + /* do_knock (seg007:0FE0) + loose_make_shake (seg007:0FB4): сотрясение от * приземления/удара трясёт ВСЕ loose-полы в ряду tile_row (не роняя их — * modif 0x80..0x83 = чистая тряска, сбрасывается в pop_loose_tick). Трясём @@ -2718,11 +2759,13 @@ void pop_loose_tick(void) __banked /* ждём молча */ } else if (m >= 0x84) { /* конец тряски: сброс + покой */ *lm = 0; + loose_shake(1, 0); /* последний удар — без гейта */ /* modif уже 0 → кадр покоя обоих тайлов (col и col+1: * правая грань loose живёт в соседе). ОБЕ страницы — * иначе на одной застывает дрожащий кадр → мерцание. */ pop_set_redraw(pos, POP_RD_LOOSE, 2); } else { + loose_shake(0, m); pop_set_redraw(pos, POP_RD_LOOSE, 1); /* дрожащий кадр */ } } else if (m >= 11 && pop_loose_fell) { @@ -2753,6 +2796,7 @@ void pop_loose_tick(void) __banked pop_loose_mob_spawn(row, col); /* отрыв падающего куска */ pop_loose_fell = (uint8_t)(pos + 1); /* сигнал приложению */ } else { /* отсчёт 1..10 — дрожащий кадр */ + loose_shake(0, m); pop_set_redraw(pos, POP_RD_LOOSE, 1); } if (*lm) found = 1; /* фаза ещё жива — гейт держим */ @@ -2774,9 +2818,10 @@ void pop_loose_tick(void) __banked * цикл, а не соседний. */ if (pop_current_level == POP_LOOSE_TILES_LEVEL) { /* ждём молча */ - } else if (m >= 0x84) { *lm = 0; + } else if (m >= 0x84) { *lm = 0; loose_shake(1, 0); pop_set_redraw_above(col, POP_RDA_CEIL, 2); } - else pop_set_redraw_above(col, POP_RDA_CEIL, 1); + else { loose_shake(0, m); + pop_set_redraw_above(col, POP_RDA_CEIL, 1); } } else if (m >= 11 && pop_ceil_fell) { *lm = 10; /* сигнал занят — кадр подождём */ } else if (m >= 11) { /* loose_floor_delay — плита рушится */ @@ -2786,6 +2831,7 @@ void pop_loose_tick(void) __banked pop_loose_mob_spawn(-1, col); /* кусок отрывается от потолка */ pop_ceil_fell = (uint8_t)(col + 1); /* сигнал приложению */ } else { + loose_shake(0, m); pop_set_redraw_above(col, POP_RDA_CEIL, 1); /* отсчёт 1..10 */ } if (*lm) found = 1; /* фаза ещё жива — гейт держим */ @@ -3005,9 +3051,10 @@ static void start_anim_spike(uint8_t tilepos) if (!mod) return; old = (int8_t)mod[tilepos]; if (old <= 0) { - if (old == 0) - pop_add_trob(g_room, tilepos, 1); /* (TODO: sound_49_spikes) */ - else if ((uint8_t)old != 0xFF) + if (old == 0) { + pop_add_trob(g_room, tilepos, 1); + pop_sfx_play(49); /* seg007:08F6 — пики пошли */ + } else if ((uint8_t)old != 0xFF) mod[tilepos] = 0x8F; } } @@ -3032,7 +3079,8 @@ static void spiked(uint8_t tilepos) Char.x = (uint8_t)(pop_x_bump[Char.curr_col + FIRST_ONSCREEN_COLUMN] + 10); Char.x = (uint8_t)char_dx_forward(8); Char.fall_y = 0; - pop_take_hp(100); /* (TODO: sound_48_spiked) */ + pop_sfx_play(48); + pop_take_hp(100); pop_char_set_seq(SEQ_51_SPIKED); play_seq(); determine_col(); @@ -3104,7 +3152,8 @@ static void chomped(uint8_t tilepos, int8_t col) Char.x = (uint8_t)(pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX); Char.x = (uint8_t)char_dx_forward(7 - !Char.direction); Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - pop_take_hp(100); /* (TODO: sound_46_chomped) */ + pop_sfx_play(46); + pop_take_hp(100); pop_char_set_seq(SEQ_54_CHOMPED); play_seq(); if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; @@ -3312,7 +3361,7 @@ static void jump_through_mirror(void) (void)mirror_image(); pop_jumped_mirror = 0; Char.charid = CHARID_1_SHADOW; - /* play_sound(45) — звука в порте пока нет */ + pop_sfx_play(45); /* seg003:0617 — прыжок в зеркало */ pop_saveshad(); guardhp_max = guardhp_curr = hitp_max; hitp_curr = 1; diff --git a/applications/PoP/roomtest/pop_room.c b/applications/PoP/roomtest/pop_room.c index 0f2d10e..0616e6c 100644 --- a/applications/PoP/roomtest/pop_room.c +++ b/applications/PoP/roomtest/pop_room.c @@ -17,6 +17,7 @@ #include #include #include "pop_bg.h" +#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ #include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ #include "_pop_bg.h" /* контракт с горячей половиной (pop_bg.c, банк 2) */ #include "pop_tile.h" /* общие листья слоя фона (резидент): блит, тайлы, таблица */ @@ -1493,6 +1494,7 @@ static void mob_tick_one(mob_t *m, uint8_t pg) * КНОПКА под куском обязаны сработать — сигналим главному циклу * комнатой и тайлом (loose_land, seg007:11E8, работает с * curmob.room, а не с отрисованной). */ + pop_sfx_play(2); /* tile crashing, seg007:1041 */ pop_loose_exit_room = mt_m->room; pop_loose_exit = (uint8_t)(mt_m->row * 10 + mt_m->col + 1); /* clean = 2 даже для чужой комнаты: пока кусок летел, он мог @@ -1504,6 +1506,7 @@ static void mob_tick_one(mob_t *m, uint8_t pg) * подержим кусок на границе и приземлим следующим кадром */ mt_m->y = MOB_Y_BOUND[mt_m->row + 1]; } else { + pop_sfx_play(2); /* tile crashing, seg007:1041 */ mt_m->y = MOB_Y_BOUND[mt_m->row + 1]; pop_loose_landed = (uint8_t)(mt_m->row * 10 + mt_m->col + 1); mt_m->active = 0; mt_m->clean = 2; /* кусок исчез — на его месте debris */ diff --git a/applications/PoP/roomtest/pop_sfx.c b/applications/PoP/roomtest/pop_sfx.c new file mode 100644 index 0000000..a5a30c9 --- /dev/null +++ b/applications/PoP/roomtest/pop_sfx.c @@ -0,0 +1,121 @@ +/* + * pop_sfx.c — ГОРЯЧАЯ часть звуковых эффектов: насос в прерывании CBL, + * запуск/останов и таблица звуков. Зачем всё это и в каком виде лежат + * данные — в шапке pop_sfx.h и ../docs/sound_plan.md. + * + * ПОЧЕМУ МОДУЛЬ РЕЗИДЕНТНЫЙ (в EXTRA_SRCS, а не в банке). Три причины, + * и каждой хватило бы одной: + * - callback насоса зовётся ИЗ ПРЕРЫВАНИЯ; трамплин перед вызовом + * ставит базовую страницу W1, значит хендлер обязан быть в базе; + * - pop_sfx_play дёргается из горячих мест (play_seq на каждый шаг + * Кида, физика, боёвка) — трамплин там был бы чистой потерей; + * - pop_page_read маппит W3 на время чтения, а банковый код сам живёт + * в W3 и вырезал бы себя из-под ног (та же причина, по которой + * резидентен pop_level_read_file, см. _pop_level.h). + * Холодная половина (аллокация страниц, cbl_open) — в pop_sfx_cold.c. + */ + +#include +#include +#include +#include +#include +#include /* IRQ_DISABLE/IRQ_ENABLE вокруг курсора */ +#include "pop_sfx.h" +#include "_pop_sfx.h" + +/* Физические страницы набора; заполняет холодная половина. */ +uint8_t pop_snd_page[POP_SND_PAGES]; +uint8_t pop_snd_ok; + +/* Курсор проигрывания. volatile: пишет главный цикл, читает прерывание. + * Всё в 8/16 бит — 32-битной арифметики на Z80 избегаем (см. memory + * avoid_32bit_arith_z80); поэтому и в таблице смещение уже разобрано на + * страницу и адрес в окне. */ +static volatile uint8_t sfx_pg; /* индекс в pop_snd_page[] */ +static volatile uint16_t sfx_ptr; /* адрес в окне W0: 0x0000..0x3FFF */ +static volatile uint16_t sfx_left; /* сколько байт осталось (кратно 128) */ + +/* ---- насос ---------------------------------------------------------- * + * Зовётся из ISR CBL раз в ~11,7 мс за очередными 128 байтами. + * + * ОКНО W0 БЕРЁМ ВЗАЙМЫ. Фон в этот момент может держать в W0 страницу + * атласа (pop_blit_b делает map ... blit ... unmap), поэтому сохраняем + * порт, подставляем свою страницу и возвращаем как было. Для фона + * подмена невидима: прерывание для него атомарно. Тот же приём, что у + * трамплина с W1 (_irq_tramp.c). + * + * Заплатки ISR-стаба в 0x38/0x66 нашим страницам НЕ нужны (в отличие от + * страницы уровня, pop_level_read_file): пока страница замаплена, мы + * внутри прерывания и IFF сброшен — прерваться некому. + * + * ТИШИНУ ЛЬЁМ СВОЮ. Когда эффект кончился, отдавать в CBL всё равно надо: + * иначе железо крутит по кругу хвост своего буфера и это слышно как + * жужжание. Готовый блок 0x80 лежит первым в наборе (упаковщик), поэтому + * libc-шный CBL_UNDERRUN_SILENCE с его malloc нам не нужен — а куча в + * тесном резиденте W2 отказала бы и уронила весь звук. */ +int pop_sfx_fill(uint16_t n) +{ + uint8_t saved, pg; + uint16_t ptr; + if (sfx_left) { pg = sfx_pg; ptr = sfx_ptr; } + else { pg = POP_SND_SILENCE_PAGE; ptr = POP_SND_SILENCE_OFF; } + saved = _io_page_w0; + _io_page_w0 = pop_snd_page[pg]; + cbl_push_otir((const void *)ptr, n); + _io_page_w0 = saved; + if (!sfx_left) return 1; /* играли тишину — курсор не двигаем */ + + sfx_ptr += n; + if (sfx_ptr >= 0x4000) { /* граница страницы — ровно по блоку */ + sfx_ptr = 0; + sfx_pg++; + } + sfx_left -= n; + return 1; +} + +/* ---- запуск / останов ------------------------------------------------ */ + +void pop_sfx_play(uint8_t id) +{ + uint8_t pg; + uint16_t off, len; + if (!pop_snd_ok || id >= POP_SND_COUNT) return; + pg = pop_snd_tbl[id].page; + off = pop_snd_tbl[id].off; + len = pop_snd_tbl[id].len; + /* Курсор из трёх полей, а читает его прерывание — обновляем под DI, + * иначе насос может застать наполовину обновлённое состояние и уехать + * в чужие данные. */ + IRQ_DISABLE(); + sfx_pg = pg; + sfx_ptr = off; + sfx_left = len; /* len == 0 — просто глушим */ + IRQ_ENABLE(); +} + +void pop_sfx_stop(void) +{ + IRQ_DISABLE(); + sfx_left = 0; + IRQ_ENABLE(); +} + +/* ---- чтение файла в ФИЗИЧЕСКУЮ страницу ------------------------------ * + * Резидентно по причине из шапки: маппим W3, читаем, возвращаем окно. + * Ровно то же делает atlas_load, поэтому вызов из банка безопасен. + * 0 — прочитано ожидаемое число байт, -1 — нет. */ +int pop_page_read(const char *path, uint8_t phys, uint16_t want) +{ + uint8_t saved_w3; + int fd, n; + fd = open(path, O_RDONLY); + if (fd < 0) return -1; + saved_w3 = _io_page_w3; + sprinter_page_w3(phys); + n = read(fd, (uint8_t *)0xC000, want); + _io_page_w3 = saved_w3; + close(fd); + return (n == (int)want) ? 0 : -1; +} diff --git a/applications/PoP/roomtest/pop_sfx.h b/applications/PoP/roomtest/pop_sfx.h index a4d60e6..cdc155f 100644 --- a/applications/PoP/roomtest/pop_sfx.h +++ b/applications/PoP/roomtest/pop_sfx.h @@ -21,11 +21,20 @@ #include -/* Поднять звук: занять 8 EMM-страниц, вычитать в них набор, открыть CBL. - * 0 — OK, -1 — не получилось (тогда pop_sfx_play молча ничего не делает, - * игра идёт без звука). Звать один раз при старте. */ +/* Поднять набор: занять 8 EMM-страниц и вычитать в них данные. ВЫВОД НЕ + * ВКЛЮЧАЕТ — см. pop_sfx_start. 0 — OK, -1 — не получилось (тогда всё + * дальнейшее молча ничего не делает, игра идёт без звука). */ int pop_sfx_init(void) __banked; +/* Включить вывод (открыть CBL). Звать ПОСЛЕ всей загрузки: пока идёт + * чтение файлов, ESTEX уходит в диск надолго, насос не успевает долить + * блок, и железо крутит хвост своего буфера — на слух сплошной скрежет. + * Идемпотентно. */ +int pop_sfx_start(void) __banked; + +/* Заглушить вывод на время загрузки (закрывает CBL). Парная к start. */ +void pop_sfx_pause(void) __banked; + /* Закрыть CBL и отпустить страницы; звать на выходе. */ void pop_sfx_close(void) __banked; diff --git a/applications/PoP/roomtest/pop_sfx_cold.c b/applications/PoP/roomtest/pop_sfx_cold.c new file mode 100644 index 0000000..316fc81 --- /dev/null +++ b/applications/PoP/roomtest/pop_sfx_cold.c @@ -0,0 +1,76 @@ +/* + * pop_sfx_cold.c — ХОЛОДНАЯ половина звука: поднять набор и открыть CBL. + * Отрабатывает один раз за запуск, поэтому живёт в банке 8; горячая + * половина (насос, запуск эффекта) — в резиденте, см. pop_sfx.c. + */ + +#include +#include +#include +#include "pop_sfx.h" +#define POP_SND_FILES /* имена файлов нужны ТОЛЬКО здесь, см. pop_sound_tbl.h */ +#include "_pop_sfx.h" + +static uint8_t snd_blk; /* блок EMM под весь набор */ + +int pop_sfx_init(void) __banked +{ + uint8_t i, blk; + + if (pop_snd_ok) return 0; + + /* Одним блоком: страницы блока идут подряд по логическому индексу, и + * таблица звуков адресует их именно так (page = смещение >> 14). */ + blk = mem_alloc_pages(POP_SND_PAGES); + if (!blk) return -1; + for (i = 0; i < POP_SND_PAGES; i++) { + pop_snd_page[i] = mem_get_page(blk, i); + if (!pop_snd_page[i] || + pop_page_read(pop_snd_files[i], pop_snd_page[i], 16384) != 0) { + mem_free_block(blk); + return -1; + } + } + snd_blk = blk; + return 0; +} + +/* ЗАПУСТИТЬ ВЫВОД — ОТДЕЛЬНО ОТ ЗАГРУЗКИ, и это не косметика. + * + * Пока идёт чтение файлов, CBL держать открытым НЕЛЬЗЯ: ESTEX уходит в + * диск надолго, насос не успевает долить очередные 128 байт, и железо + * крутит по кругу хвост своего 256-байтового буфера. На слух это + * сплошной скрежет (поймано пользователем на старте, 2026-08-20). + * Поэтому загрузка страниц и открытие CBL разведены: грузим молча, + * включаем звук последним действием, а на время загрузки уровня глушим + * (pop_sfx_pause). + * + * Параметры: 10 937,5 Гц, 8 бит моно — формат данных один в один + * (sound_plan.md). OTIR, а не акселератор: тот нужен только для 16 бит. + * UNDERRUN_APP, а не SILENCE: тишину насос льёт СВОЮ (первый блок + * набора), и просить у libc буфер через malloc не надо — куча в + * резиденте W2 тесная, и её отказ ронял бы весь звук. */ +int pop_sfx_start(void) __banked +{ + if (pop_snd_ok) return 0; + if (!snd_blk) return -1; /* набор не загружен */ + if (cbl_open(CBL_FREQ_10K9, CBL_FMT_MONO8, CBL_PUMP_OTIR, + CBL_UNDERRUN_APP, pop_sfx_fill) != 0) + return -1; + pop_snd_ok = 1; + return 0; +} + +void pop_sfx_pause(void) __banked +{ + if (!pop_snd_ok) return; + pop_sfx_stop(); + cbl_close(); + pop_snd_ok = 0; +} + +void pop_sfx_close(void) __banked +{ + pop_sfx_pause(); + if (snd_blk) { mem_free_block(snd_blk); snd_blk = 0; } +} diff --git a/applications/PoP/roomtest/pop_sound_tbl.h b/applications/PoP/roomtest/pop_sound_tbl.h index e7fe6af..77acc4b 100644 --- a/applications/PoP/roomtest/pop_sound_tbl.h +++ b/applications/PoP/roomtest/pop_sound_tbl.h @@ -20,35 +20,38 @@ #define POP_SND_PAGES 8 #define POP_SND_COUNT 57 #define POP_SND_BLOCK 128 +/* Первый блок страницы 0 — тишина для насоса (см. упаковщик). */ +#define POP_SND_SILENCE_PAGE 0 +#define POP_SND_SILENCE_OFF 0x0000 typedef struct { uint8_t page; uint16_t off; uint16_t len; } pop_snd_ent_t; /* len == 0 — у звука нет оцифровки (это музыка, см. sound_plan.md). */ static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = { - { 0, 0x0000, 1664 }, /* 0 */ - { 0, 0x0680, 12032 }, /* 1 */ - { 0, 0x3580, 6272 }, /* 2 */ - { 1, 0x0E00, 1280 }, /* 3 */ - { 1, 0x1300, 1152 }, /* 4 */ - { 1, 0x1780, 1408 }, /* 5 */ - { 1, 0x1D00, 5504 }, /* 6 */ - { 1, 0x3280, 896 }, /* 7 */ - { 1, 0x3600, 1664 }, /* 8 */ - { 1, 0x3C80, 2816 }, /* 9 */ - { 2, 0x0780, 4992 }, /* 10 */ - { 2, 0x1B00, 1280 }, /* 11 */ - { 2, 0x2000, 1280 }, /* 12 */ - { 2, 0x2500, 3840 }, /* 13 */ - { 2, 0x3400, 7552 }, /* 14 */ - { 3, 0x1180, 17664 }, /* 15 */ - { 4, 0x1680, 4736 }, /* 16 */ - { 4, 0x2900, 4224 }, /* 17 */ - { 4, 0x3980, 6912 }, /* 18 */ - { 5, 0x1480, 2816 }, /* 19 */ - { 5, 0x1F80, 1408 }, /* 20 */ - { 5, 0x2500, 1152 }, /* 21 */ - { 5, 0x2980, 1280 }, /* 22 */ - { 5, 0x2E80, 1408 }, /* 23 */ + { 0, 0x0080, 1664 }, /* 0 */ + { 0, 0x0700, 12032 }, /* 1 */ + { 0, 0x3600, 6272 }, /* 2 */ + { 1, 0x0E80, 1280 }, /* 3 */ + { 1, 0x1380, 1152 }, /* 4 */ + { 1, 0x1800, 1408 }, /* 5 */ + { 1, 0x1D80, 5504 }, /* 6 */ + { 1, 0x3300, 896 }, /* 7 */ + { 1, 0x3680, 1664 }, /* 8 */ + { 1, 0x3D00, 2816 }, /* 9 */ + { 2, 0x0800, 4992 }, /* 10 */ + { 2, 0x1B80, 1280 }, /* 11 */ + { 2, 0x2080, 1280 }, /* 12 */ + { 2, 0x2580, 3840 }, /* 13 */ + { 2, 0x3480, 7552 }, /* 14 */ + { 3, 0x1200, 17664 }, /* 15 */ + { 4, 0x1700, 4736 }, /* 16 */ + { 4, 0x2980, 4224 }, /* 17 */ + { 4, 0x3A00, 6912 }, /* 18 */ + { 5, 0x1500, 2816 }, /* 19 */ + { 5, 0x2000, 1408 }, /* 20 */ + { 5, 0x2580, 1152 }, /* 21 */ + { 5, 0x2A00, 1280 }, /* 22 */ + { 5, 0x2F00, 1408 }, /* 23 */ { 0, 0x0000, 0 }, /* 24 */ { 0, 0x0000, 0 }, /* 25 */ { 0, 0x0000, 0 }, /* 26 */ @@ -69,14 +72,14 @@ static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = { { 0, 0x0000, 0 }, /* 41 */ { 0, 0x0000, 0 }, /* 42 */ { 0, 0x0000, 0 }, /* 43 */ - { 5, 0x3400, 2688 }, /* 44 */ - { 5, 0x3E80, 4224 }, /* 45 */ - { 6, 0x0F00, 4608 }, /* 46 */ - { 6, 0x2100, 5120 }, /* 47 */ - { 6, 0x3500, 5120 }, /* 48 */ - { 7, 0x0900, 4480 }, /* 49 */ + { 5, 0x3480, 2688 }, /* 44 */ + { 5, 0x3F00, 4224 }, /* 45 */ + { 6, 0x0F80, 4608 }, /* 46 */ + { 6, 0x2180, 5120 }, /* 47 */ + { 6, 0x3580, 5120 }, /* 48 */ + { 7, 0x0980, 4480 }, /* 49 */ { 0, 0x0000, 0 }, /* 50 */ - { 7, 0x1A80, 4864 }, /* 51 */ + { 7, 0x1B00, 4864 }, /* 51 */ { 0, 0x0000, 0 }, /* 52 */ { 0, 0x0000, 0 }, /* 53 */ { 0, 0x0000, 0 }, /* 54 */ @@ -84,6 +87,11 @@ static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = { { 0, 0x0000, 0 }, /* 56 */ }; +/* Имена файлов видит ТОЛЬКО тот, кто попросил POP_SND_FILES (холодная + * половина): иначе копия строк уезжает в каждый включивший заголовок + * модуль, а в резиденте W1/W2 каждая сотня байт на счету. Тот же + * приём, что у POP_BG_ATLAS_NAMES в pop_bg_atlas.h. */ +#ifdef POP_SND_FILES static const char *const pop_snd_files[POP_SND_PAGES] = { "SND\\s0.bin", "SND\\s1.bin", @@ -94,5 +102,6 @@ static const char *const pop_snd_files[POP_SND_PAGES] = { "SND\\s6.bin", "SND\\s7.bin", }; +#endif #endif diff --git a/applications/PoP/roomtest/pop_trob.c b/applications/PoP/roomtest/pop_trob.c index 53627c1..7db3767 100644 --- a/applications/PoP/roomtest/pop_trob.c +++ b/applications/PoP/roomtest/pop_trob.c @@ -4,6 +4,7 @@ * См. pop_trob.h. */ #include "pop_trob.h" +#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ #include "pop_state.h" /* pop_leveldoor_open */ #include "pop_level.h" #include "pop_geom.h" @@ -265,6 +266,7 @@ static void animate_chomper(uint8_t *m, int8_t *type, frame = (uint8_t)((*m & 0x7F) + 1); if (frame > POP_CHOMPER_SPEED) frame = 1; *m = (uint8_t)(blood | frame); + if (frame == 2) pop_sfx_play(47); /* щелчок челюстей, seg007:297 */ if ((room != drawn_room || (int8_t)TP_ROW[tp] != Kid.curr_row || (Kid.alive >= 0 && blood == 0)) && frame >= 6) *type = -1; @@ -463,8 +465,9 @@ void pop_trigger_button(uint8_t room, uint8_t tilepos, set_doorlink_timer(modifier, POP_DBG_GATE_HOLD); if (link_timer < 2) { pop_add_trob(room, tilepos, 1); /* кнопка нажимается */ - /* seg007:766: щелчок кнопки — шум, страж оборачивается. Звука у - * нас нет, флаг обязан быть (BUG-GUARD-DEAF-1). */ + /* seg007:766: щелчок кнопки — шум, и страж оборачивается + * (флаг обязателен даже без звука, BUG-GUARD-DEAF-1). */ + pop_sfx_play(3); is_guard_notice = 1; } do_trigger_list(modifier, button_type); @@ -523,10 +526,13 @@ static void animate_leveldoor(uint8_t *m, int8_t *type, uint8_t cur_room) uint8_t sp; if (*type < 7) (*type)++; sp = leveldoor_close_speeds[*type - 3]; - if (sp >= *m) { *m = 0; *type = -1; } - else *m = (uint8_t)(*m - sp); + if (sp >= *m) { *m = 0; *type = -1; pop_sfx_play(14); } /* seg007:437 */ + else { + *m = (uint8_t)(*m - sp); + if (*type == 4) pop_sfx_play(15); /* seg007:443 */ + } } else { - if (*m < 43) (*m)++; + if (*m < 43) { (*m)++; pop_sfx_play(15); } /* seg007:465 */ if (*m >= 43) { *m = 43; *type = -1; /* Условие оригинала — переход ИЗ 0 или 2, то есть ровно один раз @@ -546,7 +552,7 @@ static void animate_leveldoor(uint8_t *m, int8_t *type, uint8_t cur_room) static const uint8_t gate_close_speeds[9] = {0, 0, 0, 20, 40, 60, 80, 100, 120}; static const int8_t door_delta[3] = {-1, 4, 4}; -static void animate_door(uint8_t *m, int8_t *type) +static void animate_door(uint8_t *m, int8_t *type, uint8_t audible) { int8_t anim_type = *type; uint8_t mod = *m; @@ -555,18 +561,23 @@ static void animate_door(uint8_t *m, int8_t *type) if (anim_type < 8) { anim_type++; *type = anim_type; } { int new_mod = (int)mod - gate_close_speeds[anim_type]; - if (new_mod < 0) { mod = 0; *type = -1; } + if (new_mod < 0) { mod = 0; *type = -1; pop_sfx_play(6); } else mod = (uint8_t)new_mod; } } else if (mod != 0xFF) { mod = (uint8_t)(mod + door_delta[anim_type]); if (anim_type == 0) { /* закрытие */ if (mod == 0) *type = -1; /* gate_stop */ + /* seg007:376: скрип закрывающейся решётки — раз в четыре + * шага модификатора и ТОЛЬКО если комната на экране + * (play_door_sound_if_visible), иначе на 13-м уровне + * скрипели бы решётки из соседних комнат. */ + else if (mod < 188 && (mod & 3) == 3 && audible) pop_sfx_play(4); } else { /* открытие */ if (mod >= 188) { - if (anim_type < 2) { mod = 238; *type = 0; } /* открыт → потом закрывать */ + if (anim_type < 2) { mod = 238; *type = 0; pop_sfx_play(7); } else { mod = 0xFF; *type = -1; } /* насовсем */ - } + } else if ((mod & 7) == 0) pop_sfx_play(5); /* seg007:386 */ } } else { *type = -1; @@ -672,7 +683,7 @@ void pop_process_trobs(uint8_t cur_room) __banked animate_button(mod[tp], &type); /* mod[tp] = индекс LINKLOC кнопки */ break; case TILE_GATE: - animate_door(&mod[tp], &type); + animate_door(&mod[tp], &type, (uint8_t)(room == cur_room)); break; case TILE_LOOSE: animate_loose(&mod[tp], &type, room, tp, cur_room); diff --git a/applications/PoP/roomtest/roomtest.c b/applications/PoP/roomtest/roomtest.c index 1221c19..a2f05bd 100644 --- a/applications/PoP/roomtest/roomtest.c +++ b/applications/PoP/roomtest/roomtest.c @@ -282,59 +282,9 @@ int main(void) * стоит, можно спокойно разбирать позу Kid и окклюзию. */ if (kbd_raw_down(0x16)) frozen = 1; if (kbd_raw_down(0x1E)) frozen = 0; - { /* Читы (seg000: switch под if (cheats_enabled)). Все — по - * ФРОНТУ нажатия, иначе срабатывали бы каждый кадр. - * K — убить стража; - * I — бессмертие Кида (наш отладочный, в оригинале его нет: - * иначе боёвку проверять получается ровно три раза); - * S — выдать меч, не бегая за ним в комнату 15. Штатно меч - * берётся с пола (pop_have_sword ставит подбор); - * Shift+L — следующий уровень (seg000:698, ветка next_level = - * current_level + 1). Единственный вменяемый способ - * тестировать уровни 2..15. NB: L без Shift — отладочный - * «осторожный шаг вправо» (pop_ctrl KBD_DBG_STEPR); с - * Shift шаг тоже пройдёт, но уровень тут же сменится, так - * что конфликта на практике нет; - * [ / ] — подвинуть Кида на ПИКСЕЛЬ влево/вправо (seg000:1828, - * `--Char.x` / `++Char.x`). Нужен потому, что мост MAME - * теряет нажатия при быстрой отправке, и подогнать Кида в - * нужную позу скриптом нельзя (на это упёрлись BUG-LOOSE-2 - * и BUG-GATE-PASS-1). Пишем прямо в Kid.x: геометрию - * персонажа в этом порте задаёт не диспетчер (грабли - * L1-EXIT). Колонку не трогаем — её пересчитает физика - * следующего кадра. */ - uint8_t k = kbd_raw_down(KBD_CHEAT_KILL); - uint8_t i = kbd_raw_down(KBD_CHEAT_IMMO); - uint8_t s = kbd_raw_down(KBD_CHEAT_SWORD); - uint8_t nl = (uint8_t)(kbd_raw_down(KBD_CHEAT_NEXTLVL) && - (kbd_raw_down(KBD_LSHIFT) || kbd_raw_down(KBD_RSHIFT))); - uint8_t up = kbd_raw_down(KBD_CHEAT_UPSIDE); - uint8_t xd = kbd_raw_down(KBD_CHEAT_XDEC); - uint8_t xi = kbd_raw_down(KBD_CHEAT_XINC); - if (pop_cheats && k && !cheat_prev) pop_guard_kill(); - /* Бессмертие по кругу: 0 выкл -> 1 «только бой» -> 2 «бой и - * мелкий урон» -> 0. Что означают уровни — pop_state.h. */ - if (pop_cheats && i && !immo_prev) - pop_immortal = (uint8_t)(pop_immortal >= 2 ? 0 : pop_immortal + 1); - if (pop_cheats && s && !sword_prev) pop_have_sword = 1; - if (pop_cheats && nl && !nlvl_prev && pop_current_level < POP_LAST_LEVEL) - pop_next_level = (uint8_t)(pop_current_level + 1); - /* U — переворот экрана (seg000:0793 — чит и в оригинале). - * Тот же путь, что у зелья типа 4: флаг + пометка «перевернулись». */ - if (pop_cheats && up && !upsd_prev) { /* тот же путь, что у зелья */ - pop_upside_want = (uint8_t)!pop_upside_want; - pop_upside_dirty = 1; - } - if (pop_cheats && xd && !xdec_prev) Kid.x = (uint8_t)(Kid.x - 1); - if (pop_cheats && xi && !xinc_prev) Kid.x = (uint8_t)(Kid.x + 1); - cheat_prev = k; - immo_prev = i; - sword_prev = s; - nlvl_prev = nl; - upsd_prev = up; - xdec_prev = xd; - xinc_prev = xi; - } + /* Читы — В БАНКЕ (roomtest_cold.c): они дёргаются раз в кадр, а места + * в резиденте W1/W2 нет (см. TASKS_OPEN, MEM). */ + pop_cheat_tick(); if (frozen) { PROF(0); /* чёрный: ждём vsync */ /* Заморозка — тоже полноценный логический кадр: иначе якорь diff --git a/applications/PoP/roomtest/roomtest_cold.c b/applications/PoP/roomtest/roomtest_cold.c index c8d5051..25858d8 100644 --- a/applications/PoP/roomtest/roomtest_cold.c +++ b/applications/PoP/roomtest/roomtest_cold.c @@ -24,6 +24,7 @@ #include "pop_tune.h" #include "pop_ctrl.h" /* pop_ctrl_init/close — ввод поднимает и закрывает boot */ #include "pop_shadow.h" /* запечённый набор Тени */ +#include "pop_sfx.h" /* звуковые эффекты через CBL */ #include "pop_vflip.h" /* сброс зеркальных страниц на смене уровня */ #include "pop_cheat.h" /* pop_cheats — режим разработки включает pop_boot */ #include "pop_pace.h" /* pop_speed_mode — режим скорости в отладочной метке */ @@ -308,6 +309,74 @@ uint8_t pop_dbg_roomnav(uint8_t dir) __banked return 1; } + +/* ---- ЧИТЫ (seg000: switch под if (cheats_enabled)) -------------------- * + * Переехали из главного цикла в банк 8: дёргаются раз в кадр, то есть + * один трамплин на кадр, а места в резиденте W1/W2 не осталось (звук, + * атлас Тени и пейсинг съели остаток; см. TASKS_OPEN, MEM). + * + * Флаги «фронта» стали статиками модуля — раньше они были локалями main. + * Смысл прежний: одно нажатие = одно срабатывание. + */ +static uint8_t cheat_prev, immo_prev, sword_prev, nlvl_prev; +static uint8_t upsd_prev, xdec_prev, xinc_prev; + +void pop_cheat_tick(void) __banked +{ + /* Читы (seg000: switch под if (cheats_enabled)). Все — по + * ФРОНТУ нажатия, иначе срабатывали бы каждый кадр. + * K — убить стража; + * I — бессмертие Кида (наш отладочный, в оригинале его нет: + * иначе боёвку проверять получается ровно три раза); + * S — выдать меч, не бегая за ним в комнату 15. Штатно меч + * берётся с пола (pop_have_sword ставит подбор); + * Shift+L — следующий уровень (seg000:698, ветка next_level = + * current_level + 1). Единственный вменяемый способ + * тестировать уровни 2..15. NB: L без Shift — отладочный + * «осторожный шаг вправо» (pop_ctrl KBD_DBG_STEPR); с + * Shift шаг тоже пройдёт, но уровень тут же сменится, так + * что конфликта на практике нет; + * [ / ] — подвинуть Кида на ПИКСЕЛЬ влево/вправо (seg000:1828, + * `--Char.x` / `++Char.x`). Нужен потому, что мост MAME + * теряет нажатия при быстрой отправке, и подогнать Кида в + * нужную позу скриптом нельзя (на это упёрлись BUG-LOOSE-2 + * и BUG-GATE-PASS-1). Пишем прямо в Kid.x: геометрию + * персонажа в этом порте задаёт не диспетчер (грабли + * L1-EXIT). Колонку не трогаем — её пересчитает физика + * следующего кадра. */ + uint8_t k = kbd_raw_down(KBD_CHEAT_KILL); + uint8_t i = kbd_raw_down(KBD_CHEAT_IMMO); + uint8_t s = kbd_raw_down(KBD_CHEAT_SWORD); + uint8_t nl = (uint8_t)(kbd_raw_down(KBD_CHEAT_NEXTLVL) && + (kbd_raw_down(KBD_LSHIFT) || kbd_raw_down(KBD_RSHIFT))); + uint8_t up = kbd_raw_down(KBD_CHEAT_UPSIDE); + uint8_t xd = kbd_raw_down(KBD_CHEAT_XDEC); + uint8_t xi = kbd_raw_down(KBD_CHEAT_XINC); + if (pop_cheats && k && !cheat_prev) pop_guard_kill(); + /* Бессмертие по кругу: 0 выкл -> 1 «только бой» -> 2 «бой и + * мелкий урон» -> 0. Что означают уровни — pop_state.h. */ + if (pop_cheats && i && !immo_prev) + pop_immortal = (uint8_t)(pop_immortal >= 2 ? 0 : pop_immortal + 1); + if (pop_cheats && s && !sword_prev) pop_have_sword = 1; + if (pop_cheats && nl && !nlvl_prev && pop_current_level < POP_LAST_LEVEL) + pop_next_level = (uint8_t)(pop_current_level + 1); + /* U — переворот экрана (seg000:0793 — чит и в оригинале). + * Тот же путь, что у зелья типа 4: флаг + пометка «перевернулись». */ + if (pop_cheats && up && !upsd_prev) { /* тот же путь, что у зелья */ + pop_upside_want = (uint8_t)!pop_upside_want; + pop_upside_dirty = 1; + } + if (pop_cheats && xd && !xdec_prev) Kid.x = (uint8_t)(Kid.x - 1); + if (pop_cheats && xi && !xinc_prev) Kid.x = (uint8_t)(Kid.x + 1); + cheat_prev = k; + immo_prev = i; + sword_prev = s; + nlvl_prev = nl; + upsd_prev = up; + xdec_prev = xd; + xinc_prev = xi; +} + /* ---- ОТЛАДКА: состояние прогона в верхнем борте ---------------------- * * * Четыре блока ПАЛОЧКАМИ, каждый своим цветом (outtextxy не годится: текст @@ -766,6 +835,7 @@ int pop_boot(void) __banked pop_sword_load(); /* меч в руке (без него кадры 229+ без клинка) */ pop_guard_load(); /* атласы стража (GUARD\\g0..g4) */ pop_shadow_load(); /* запечённый набор Тени — один раз на запуск */ + pop_sfx_init(); /* звук: 8 страниц оцифровки (вывод пока молчит) */ if (pop_kid_load(28) != 0) { /* ВСЕ страницы: бег+стоп+разворот+присед+прыжок */ puts("kid atlas load failed"); return -1; @@ -830,6 +900,7 @@ int pop_level_switch(void) __banked * дальше, а урон — нет (do_startpos дольёт до потолка). */ hitp_beg_lev = hitp_max; pop_checkpoint = 0; /* уровень пройден (seg003:413) */ + pop_sfx_pause(); /* загрузка уровня — ESTEX надолго, звук глушим */ if (pop_level_load_num(pop_next_level) != 0) { pop_next_level = pop_current_level; /* файла нет — остаёмся */ } else { @@ -861,6 +932,7 @@ int pop_level_switch(void) __banked * и делать это в момент глотка нельзя. Звать можно откуда * угодно — функция идемпотентна. */ if (pop_current_level == POP_UPSIDE_LEVEL) pop_vflip_load_all(); + pop_sfx_start(); /* ...и обратно, когда всё прочитано */ } return 0; } @@ -872,6 +944,7 @@ void pop_shutdown(void) __banked closegraph(); pop_bg_free(); pop_kid_free(); + pop_sfx_close(); pop_shadow_free(); pop_guard_free(); pop_kid_data_free(); diff --git a/applications/PoP/roomtest/roomtest_cold.h b/applications/PoP/roomtest/roomtest_cold.h index 5613717..7076ef2 100644 --- a/applications/PoP/roomtest/roomtest_cold.h +++ b/applications/PoP/roomtest/roomtest_cold.h @@ -66,6 +66,10 @@ uint8_t pop_dbg_roomnav(uint8_t dir) __banked; * звать можно каждый кадр. */ void pop_dbg_room_label(uint8_t room) __banked; +/* Читы по фронту нажатия (K/I/S/Shift+L/U/[/]). В банке: раз в кадр, + * а резидент W1/W2 переполнен — см. шапку функции. */ +void pop_cheat_tick(void) __banked; + /* Кто рисуется ПОЗЖЕ — Кид или соперник (порядок обхода тайлов оригинала, * set_objtile_at_char + sort_curr_objs). 1 = соперник поверх. Зовётся раз * в кадр, поэтому живёт в банке: трамплин на кадр дешевле полукилобайта diff --git a/applications/PoP/toolchain/pop_pack_sound.py b/applications/PoP/toolchain/pop_pack_sound.py index 02efe6f..935f2c8 100644 --- a/applications/PoP/toolchain/pop_pack_sound.py +++ b/applications/PoP/toolchain/pop_pack_sound.py @@ -117,7 +117,12 @@ def main(): print(f" звук {sid}: {rate} Гц -> {RATE:g} Гц, {len(samples)} -> {len(pcm)} сэмплов") # Раскладка: начало каждого звука кратно BLOCK, страницы по PAGE. - blob = bytearray() + # ПЕРВЫЙ БЛОК — ТИШИНА. Он нужен насосу: когда эффект кончился, в CBL + # всё равно надо что-то отдавать, иначе железо доигрывает по кругу хвост + # своего буфера (жужжание). Держим тишину СВОЮ, а не просим у libc + # (CBL_UNDERRUN_SILENCE делает malloc), потому что куча в резиденте W2 + # тесная и её отказ ронял бы весь звук. + blob = bytearray([0x80] * BLOCK) table = {} for sid in sorted(sounds): pad = (-len(blob)) % BLOCK @@ -158,6 +163,9 @@ def main(): "#define POP_SND_PAGES %d" % npages, "#define POP_SND_COUNT %d" % NSOUND, "#define POP_SND_BLOCK %d" % BLOCK, + "/* Первый блок страницы 0 — тишина для насоса (см. упаковщик). */", + "#define POP_SND_SILENCE_PAGE 0", + "#define POP_SND_SILENCE_OFF 0x0000", "", "typedef struct { uint8_t page; uint16_t off; uint16_t len; } pop_snd_ent_t;", "", @@ -170,10 +178,15 @@ def main(): lines += [ "};", "", + "/* Имена файлов видит ТОЛЬКО тот, кто попросил POP_SND_FILES (холодная", + " * половина): иначе копия строк уезжает в каждый включивший заголовок", + " * модуль, а в резиденте W1/W2 каждая сотня байт на счету. Тот же", + " * приём, что у POP_BG_ATLAS_NAMES в pop_bg_atlas.h. */", + "#ifdef POP_SND_FILES", "static const char *const pop_snd_files[POP_SND_PAGES] = {", ] lines += [' "SND\\\\s%d.bin",' % i for i in range(npages)] - lines += ["};", "", "#endif", ""] + lines += ["};", "#endif", "", "#endif", ""] with open(HDR, "w") as f: f.write("\n".join(lines))