?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. #include <evo.h>
  2. #include "functions.h"
  3. #include "resources.h"
  4.  
  5. #define SFX_BUM         0
  6. #define SFX_POCKET      1
  7. #define SFX_BUM2        2
  8. #define SFX_POCKET_MAIN 3
  9. #define SFX_WINPOCKET   4
  10.  
  11. #define SPRITES_ALL     11 //11 //20 °рЁшъют Є эхЄ яЁш 130000t, 17 яЁш 100000t ё ЄЁєфюь
  12.  
  13. #define FIRSTBALLVALUE 10 /*эрўры№эр  Ўхэр °рЁр*/
  14. #define CONTINUOUSBALLBONUS 10 /*яю ёЄюы№ъю ЁрёЄ╕Є Ўхэр °рЁр яюёых єфрўэюую їюфр*/
  15. #define DOUBLEBALLBONUS 25 /*яю ёЄюы№ъю ЁрёЄ╕Є т√шуЁ√° чр ърцф√щ ёыхфє■∙шщ °рЁ яЁш фтющэюь яюярфрэшш*/
  16. #define POCKETMAINMALUS 15 /*°ЄЁрЇ чр яюЄхЁ■ сшЄър*/
  17. #define NOHITMALUS 10 /*°ЄЁрЇ чр эхяюярфрэшх яю °рЁє*/
  18. #define WINPOCKETFACTOR 2 /*ъю¤ЇЇшЎшхэЄ яЁш яюярфрэшш т ыєчє winpocket*/
  19.  
  20.  
  21. #define WRONGX 64/*0*/ /* фы  exist==0, ўЄюс√ эх яЁютхЁ Є№ exist */
  22. #define WRONGY 224/*0*/ /* фы  exist==0, ўЄюс√ эх яЁютхЁ Є№ exist */
  23.  
  24. #define XTYPE u16
  25. #define DXTYPE i16
  26. #define UTYPE u32 /* фы  dist ш SQR(BALLSIZE) */
  27. #define ITYPE i32 /* фы  p */
  28. #define SHIFTCOORDS 7
  29.  
  30. #define SCRSHIFTX 16
  31. #define SCRSHIFTY 16
  32. #define LEFTMARGIN (((XTYPE)(LEFT+2))<<SHIFTCOORDS) /*чрярё эр ёЁртэхэшх ъююЁфшэрЄ -BALLSIZE т схччэръют√ї ш яхЁхяюыэхэшх x-dx*/
  33. #define RIGHTMARGIN (((XTYPE)(RIGHT-2-ballsize))<<SHIFTCOORDS)
  34. #define TOPMARGIN (((XTYPE)(TOP+2))<<SHIFTCOORDS) /*чрярё эр ёЁртэхэшх ъююЁфшэрЄ -BALLSIZE т схччэръют√ї ш яхЁхяюыэхэшх y-dy*/
  35. #define BOTTOMMARGIN (((XTYPE)(BOTTOM-2-ballsize))<<SHIFTCOORDS)
  36. #define RNDLEFTMARGIN (LEFTMARGIN+(16<<SHIFTCOORDS))
  37. #define RNDRIGHTMARGIN (RIGHTMARGIN-(16<<SHIFTCOORDS))
  38. #define RNDTOPMARGIN (TOPMARGIN+(16<<SHIFTCOORDS))
  39. #define RNDBOTTOMMARGIN (BOTTOMMARGIN-(16<<SHIFTCOORDS))
  40.  
  41. #define CHECKMAXSPEED
  42. #define MAXSPEED ((DXTYPE)(4<<SHIFTCOORDS))
  43.  
  44. #define ballsize 15
  45. #define sqrhalfballsize (ballsize*ballsize/4)
  46. #define BALLSIZE (ballsize<<SHIFTCOORDS)
  47.  
  48. #define BRIM 11
  49. #define TOP (32+SCRSHIFTY)
  50. #define BOTTOM (200+SCRSHIFTY)
  51. #define LEFT (0+SCRSHIFTX)
  52. #define RIGHT (320+SCRSHIFTX)
  53. #define MIDX (160+SCRSHIFTX)
  54. #define POCKETSIZE 28/*24*/
  55. #define CORNERSIZE 24
  56. #define CORNERLEFT (LEFT+(CORNERSIZE-BRIM))
  57. #define CORNERRIGHT (RIGHT-(CORNERSIZE-BRIM))
  58. #define CORNERTOP (TOP+(CORNERSIZE-BRIM))
  59. #define CORNERBOTTOM (BOTTOM-(CORNERSIZE-BRIM))
  60. #define TOPY (TOP+BRIM)
  61. #define TOPLEFTMINX (LEFT+CORNERSIZE)
  62. #define TOPLEFTMAXX (MIDX-(POCKETSIZE/2))
  63. #define TOPRIGHTMINX (MIDX+(POCKETSIZE/2))
  64. #define TOPRIGHTMAXX (RIGHT-CORNERSIZE)
  65. #define BOTTOMY (BOTTOM-BRIM)
  66. #define BOTTOMLEFTMINX TOPLEFTMINX
  67. #define BOTTOMLEFTMAXX TOPLEFTMAXX
  68. #define BOTTOMRIGHTMINX TOPRIGHTMINX
  69. #define BOTTOMRIGHTMAXX TOPRIGHTMAXX
  70. #define LEFTX (LEFT+BRIM)
  71. #define LEFTMINY (TOP+CORNERSIZE)
  72. #define LEFTMAXY (BOTTOM-CORNERSIZE)
  73. #define RIGHTX (RIGHT-BRIM)
  74. #define RIGHTMINY LEFTMINY
  75. #define RIGHTMAXY LEFTMAXY
  76.  
  77.  
  78. #define MAGNETSIZE 5
  79. #define MAGNETSPEED 20
  80.  
  81. #define MIDY ((TOPY+BOTTOMY-ballsize)/2)
  82. #define MYX ((MIDX+LEFT)/2)
  83. #define PYRX ((MIDX+RIGHT)/2)
  84. #define PYRXSTEP (ballsize)
  85. #define PYRYSTEP (PYRXSTEP*50/87) /* / (sqrt(3))*/
  86.  
  87. //XTYPE initial[SPRITES_ALL]={};
  88. /*XTYPE initial[SPRITES_ALL][2]={
  89. {(u32)(MYX            )<<SHIFTCOORDS,(u32)(MIDY           )<<SHIFTCOORDS},
  90. {(u32)(PYRX           )<<SHIFTCOORDS,(u32)(MIDY           )<<SHIFTCOORDS},
  91. {(u32)(PYRX+1*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+1*PYRYSTEP)<<SHIFTCOORDS},
  92. {(u32)(PYRX+1*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY-1*PYRYSTEP)<<SHIFTCOORDS},
  93. {(u32)(PYRX+2*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+2*PYRYSTEP)<<SHIFTCOORDS},
  94. {(u32)(PYRX+2*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+0*PYRYSTEP)<<SHIFTCOORDS},
  95. {(u32)(PYRX+2*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY-2*PYRYSTEP)<<SHIFTCOORDS},
  96. {(u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+3*PYRYSTEP)<<SHIFTCOORDS},
  97. {(u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+1*PYRYSTEP)<<SHIFTCOORDS},
  98. {(u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY-1*PYRYSTEP)<<SHIFTCOORDS},
  99. {(u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY-3*PYRYSTEP)<<SHIFTCOORDS},
  100. };*/
  101.  
  102. //°рЁшъ эх фюыцхэ яюярфрЄ№ т ЄЁряхЎш■ ьхцфє ыєчрьш, эю юЄёъюъ Ёрчэ√щ т чртшёшьюёЄш юЄ ёЄюЁюэ√, ъюЄюЁє■ юэ яхЁхё╕ъ
  103. //юЄ тхЁЄшърыш: dx=-dxold
  104. //юЄ уюЁшчюэЄрыш: dy=-dyold
  105. //юЄ фшруюэрыш ыхтющ тхЁїэхщ шыш яЁртющ эшцэхщ ыєч√: dx=dyold, dy=dxold
  106. //юЄ фшруюэрыш яЁртющ тхЁїэхщ шыш ыхтющ эшцэхщ ыєч√: dx=-dyold, dy=-dxold
  107. //юЄ єуыр (ёшыр ЁхръЎшш эряЁртыхэр яхЁяхэфшъєы Ёэю, Є.х. ъ ЎхэЄЁє): ъръ яЁш ёЄюыъэютхэшш °рЁшъют
  108.  
  109. //ъююЁфшэрЄ√ °рЁшър = xleft,ytop = ъююЁфшэрЄ√ ыхтюую тхЁїэхую єуыр хую bounding box яы■ё SCRSHIFT
  110. //ъююЁфшэрЄ√ юуЁрэшўшЄхыхщ Єюцх яы■ё SCRSHIFT
  111. //яюёўшЄрхь x,y (ЎхэЄЁ), ytop, ybottom, xleft, xright
  112.  
  113. //ьюцэю яЁютхЁ Є№ яЁш Їырух т ёхЄъх[x,y], Єрь эюьхЁ тхЄъш яЁютхЁъш
  114.  
  115. //яЁютхЁъш тхЁїэшї ыєч Єюы№ъю яЁш ytop<TOPY (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш ):
  116.  
  117. //яхЁхёхўхэшх ыхтющ ўрёЄш тхЁїэхщ уюЁшчюэЄрыш: (x>TOPLEFTMINX) && (x<TOPLEFTMAXX) //&& (ytop<TOPY)
  118. //яхЁхёхўхэшх тхЁїэхщ фшруюэрыш ыхтющ тхЁїэхщ ыєч√: (x<=TOPLEFTMINX) && ((y-x-(ballsize*7/10))<(TOP-CORNERLEFT))
  119. //яхЁхёхўхэшх яЁртющ ўрёЄш тхЁїэхщ уюЁшчюэЄрыш: (x>TOPRIGHTMINX) && (x<TOPRIGHTMAXX) //&& (ytop<TOPY)
  120. //яхЁхёхўхэшх тхЁїэхщ фшруюэрыш яЁртющ тхЁїэхщ ыєч√: (x>=TOPRIGHTMAXX) && ((y+x-(ballsize*7/10))<(TOP+CORNERRIGHT))
  121. //if (y<TOPY) {
  122. //яхЁхёхўхэшх ыхтющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((TOPLEFTMAXX-xleft)<ballsize) //&& (y<TOPY)
  123. //яхЁхёхўхэшх яЁртющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((xright-TOPRIGHTMINX)<ballsize) //&& (y<TOPY)
  124. //} else {
  125. //ъюэЄръЄ ё ыхт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-TOPLEFTMAXX)+sqr(y-TOPY))<sqrhalfballsize)
  126. //ъюэЄръЄ ё яЁрт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-TOPRIGHTMINX)+sqr(y-TOPY))<sqrhalfballsize)
  127. //ъюэЄръЄ ё тхЁїэшь єуыюь ыхтющ тхЁїэхщ ыєч√: ((sqr(x-TOPLEFTMINX)+sqr(y-TOPY))<sqrhalfballsize)
  128. //ъюэЄръЄ ё тхЁїэшь єуыюь яЁртющ тхЁїэхщ ыєч√: ((sqr(x-TOPRIGHTMAXX)+sqr(y-TOPY))<sqrhalfballsize)
  129. //}
  130.  
  131. //яЁютхЁъш эшцэшї ыєч Єюы№ъю яЁш ybottom>BOTTOMY (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш ):
  132.  
  133. //яхЁхёхўхэшх ыхтющ ўрёЄш эшцэхщ уюЁшчюэЄрыш: (x>BOTTOMLEFTMINX) && (x<BOTTOMLEFTMAXX) //&& (ybottom>BOTTOMY)
  134. //яхЁхёхўхэшх эшцэхщ фшруюэрыш ыхтющ эшцэхщ ыєч√: (x<=BOTTOMLEFTMINX) && ((y+x+(ballsize*7/10))>(BOTTOM+CORNERLEFT))
  135. //яхЁхёхўхэшх яЁртющ ўрёЄш эшцэхщ уюЁшчюэЄрыш: (x>BOTTOMRIGHTMINX) && (x<BOTTOMRIGHTMAXX) //&& (ybottom>BOTTOMY)
  136. //яхЁхёхўхэшх эшцэхщ фшруюэрыш яЁртющ эшцэхщ ыєч√: (x>=BOTTOMRIGHTMAXX) && ((y-x+(ballsize*7/10))>(BOTTOM-CORNERRIGHT))
  137. //if (y>BOTTOMY) {
  138. //яхЁхёхўхэшх ыхтющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((BOTTOMLEFTMAXX-xleft)<ballsize) //&& (y>BOTTOMY)
  139. //яхЁхёхўхэшх яЁртющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((xright-BOTTOMRIGHTMINX)<ballsize) //&& (y>BOTTOMY)
  140. //} else {
  141. //ъюэЄръЄ ё ыхт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-BOTTOMLEFTMAXX)+sqr(y-BOTTOMY))<sqrhalfballsize)
  142. //ъюэЄръЄ ё яЁрт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-BOTTOMRIGHTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
  143. //ъюэЄръЄ ё эшцэшь єуыюь ыхтющ эшцэхщ ыєч√: ((sqr(x-BOTTOMLEFTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
  144. //ъюэЄръЄ ё эшцэшь єуыюь яЁртющ эшцэхщ ыєч√: ((sqr(x-BOTTOMRIGHTMAXX)+sqr(y-BOTTOMY))<sqrhalfballsize)
  145. //}
  146.  
  147. //яЁютхЁъш ыхтющ ёЄюЁюэ√ Єюы№ъю яЁш xleft<LEFTX (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш )
  148.  
  149. //яхЁхёхўхэшх ыхтющ тхЁЄшърыш: (y>LEFTMINY) && (y<LEFTMAXY) //&& (xleft<LEFTX)
  150. //яхЁхёхўхэшх эшцэхщ фшруюэрыш ыхтющ тхЁїэхщ ыєч√: (y<=LEFTMINY) && ((y-x+(ballsize*7/10))>(CORNERTOP-LEFT))
  151. //яхЁхёхўхэшх тхЁїэхщ фшруюэрыш ыхтющ эшцэхщ ыєч√: (y>=LEFTMAXY) && ((y+x-(ballsize*7/10))<(CORNERBOTTOM+LEFT))
  152. //ъюэЄръЄ ё эшцэшь єуыюь ыхтющ тхЁїэхщ ыєч√: ((sqr(x-LEFTX)+sqr(y-LEFTMINY))<sqrhalfballsize)
  153. //ъюэЄръЄ ё тхЁїэшь єуыюь ыхтющ эшцэхщ ыєч√: ((sqr(x-LEFTX)+sqr(y-LEFTMAXY))<sqrhalfballsize)
  154.  
  155. //яЁютхЁъш яЁртющ ёЄюЁюэ√ Єюы№ъю яЁш xright>RIGHTX (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш )
  156.  
  157. //яхЁхёхўхэшх яЁртющ тхЁЄшърыш: (y>RIGHTMINY) && (y<RIGHTMAXY) //&& (xright>RIGHTX)
  158. //яхЁхёхўхэшх эшцэхщ фшруюэрыш яЁртющ тхЁїэхщ ыєч√: (y<=RIGHTMINY) && ((y+x+(ballsize*7/10))>(CORNERTOP+RIGHT))
  159. //яхЁхёхўхэшх тхЁїэхщ фшруюэрыш яЁртющ эшцэхщ ыєч√: (y>=RIGHTMAXY) && ((y-x-(ballsize*7/10))<(CORNERBOTTOM-RIGHT))
  160. //ъюэЄръЄ ё эшцэшь єуыюь яЁртющ тхЁїэхщ ыєч√: ((sqr(x-RIGHTX)+sqr(y-RIGHTMINY))<sqrhalfballsize)
  161. //ъюэЄръЄ ё тхЁїэшь єуыюь яЁртющ эшцэхщ ыєч√: ((sqr(x-RIGHTX)+sqr(y-RIGHTMAXY))<sqrhalfballsize)
  162.  
  163.  
  164.  
  165. //ёЄЁєъЄєЁр юс·хъЄр
  166.  
  167. struct spriteStruct {
  168.         XTYPE x,y;      //ъююЁфшэрЄ√
  169.         DXTYPE dx,dy;   //фхы№Є√ ёъюЁюёЄш
  170.         u8 color;
  171.         u8 exist; //0=юЄёєЄёЄтєхЄ, 1=ёЄюшЄ, 2=хфхЄ
  172.         u8 wallcollided;
  173. };
  174.  
  175. //ёяшёюъ юс·хъЄют
  176.  
  177. struct spriteStruct spriteList[SPRITES_ALL];
  178.  
  179. volatile u8 spritezones[SPRITES_ALL*2];
  180.  
  181. #define ZONESHIFT 4
  182. #define XZONES ((320>>ZONESHIFT)+1)
  183. #define YZONES ((256/*200*/>>ZONESHIFT)+1)
  184. volatile i8 ballsinzone[(YZONES+1)<<8];
  185. volatile u8 slowphase;
  186. volatile XTYPE tmpx,tmpy;
  187. volatile u16 tmpxscr;
  188. volatile u8 xzone,yzone;
  189. volatile u8* spritezonesaddr;
  190. volatile DXTYPE nx,ny,px,py,tempdx,tempdy;
  191. volatile i8 p; //DXTYPE //ITYPE
  192. volatile u8* addr;
  193. volatile XTYPE tmpnewx,tmpnewy;
  194. volatile XTYPE tmpxmin,tmpymin;
  195. volatile DXTYPE dxold,dyold;
  196. volatile XTYPE sqrdy; //UTYPE эєцэю фы  ътрфЁрЄр Єюўэ√ї ъююЁфшэрЄ, р ЄєЄ эхЄюўэ√х
  197.  
  198. //NU
  199. //u8 collided[SPRITES_ALL][SPRITES_ALL];
  200. //0 -ьюцэю яЁютхЁ Є№ ёЄюыъэютхэшх
  201. //>0 - ёЄрыъштрышё№, ёўшЄрхь ЄрщьрєЄ, Єхъє∙хх ёЄюыъэютхэшх шуэюЁшЁєхь
  202.  
  203. volatile u8 i,j;
  204. volatile XTYPE x,y,xleft,xright,ytop,ybottom;
  205. volatile u8 movingballs,pocketballs,pyramidshot,washit;
  206. volatile u16 ballvalue/*эр эрўрыю єфрЁр*/,bonusballvalue/*сюэєё, яю ты хЄё  тю тЁхь  єфрЁр*/;
  207. volatile u8 winpocket,curpocket; //0 шыш 1..6
  208. volatile u8 pocketfactor;
  209. static u8 key;
  210. static u8 keys[40];
  211. static u8 joy;
  212.  
  213. #define MAXPLAYERS 2
  214. static i16 scores[MAXPLAYERS];
  215. static u8 curplayer;
  216.  
  217. #define ABS(x) (((x)<0)?(-x):(x))
  218. #define sqr(x) ((x)*(x))
  219. #define SQR(x) ((ITYPE)((UTYPE)(x)*(UTYPE)(x)))
  220.  
  221. static u8 tsqr[256];
  222.  
  223. #define DOTPRODUCT(x1,y1,x2,y2) ((x1)*(x2)+(y1)*(y2))
  224.  
  225. //static XTYPE xshow=BOTTOMLEFTMINX,yshow=BOTTOMY;
  226.  
  227. static u8 output_x,output_y;
  228. static u8 oldoutput_x,oldoutput_y;
  229. static char tnnn[4];//="012";
  230. static char tscore[7];//="012345";
  231. //static char* presskey="PRESS ANY KEY"; //Єръ эх ЁрсюЄрхЄ
  232.  
  233. u8 pocketcoords[7][2];
  234.  
  235.  
  236. unsigned int lsqrt(unsigned long arg){
  237. char count=16;
  238. unsigned long res=0,tmp=0;
  239.         if(arg!=0){
  240.                 if(!(arg&0xFF000000)){arg<<=8;count-=4;}
  241.  
  242.  
  243.                 res=1;
  244.                 while((tmp<1)&&(count)){
  245.                         count--;
  246.                         if(arg&0x80000000UL)tmp|=2;
  247.                         if(arg&0x40000000UL)tmp|=1;
  248.  
  249.                         arg<<=2;
  250.  
  251.  
  252.                 };//яюшёъ яхЁтющ 1-√
  253.                 tmp--;
  254.                 for(count;count;count--){
  255.                         tmp<<=2;
  256.                         res<<=1;
  257.  
  258.                         if(arg&0x80000000UL)tmp|=2;
  259.                         if(arg&0x40000000UL)tmp|=1;
  260.                         arg<<=2;
  261.  
  262.                         if( tmp>=((res<<1)|1)){
  263.                                 tmp-=((res<<1)|1);
  264.                                 res|=1;
  265.                         }
  266.                        
  267.                 }
  268.         }
  269.         return (unsigned int)res;
  270. }
  271.  
  272. //т√тюф юфэюую ёшьтюыр эр ¤ъЁрэ ё ртЄюьрЄшўхёъшь шчьхэхэшхь
  273. //яючшЎшш т√тюфр, Єръцх ёшьтюы '\n' яхЁхтюфшЄ ёЄЁюъє
  274. void put_char(u8 n)
  275. {
  276.         if(n>=' '&&n<='Z') draw_tile(output_x,output_y,n-' ');
  277.  
  278.         ++output_x;
  279.  
  280.         if(output_x==39||n=='\n')
  281.         {
  282.                 output_x=1;
  283.                
  284.                 ++output_y;
  285.                
  286.                 if(output_y==24) output_y=1;
  287.         }
  288. }
  289.  
  290. //т√тюф ёЄЁюъш ёшьтюыют
  291. void put_str(u8* str)
  292. {
  293.         u8 i;
  294.  
  295.         while(1)
  296.         {
  297.                 i=*str++;
  298.  
  299.                 if(!i) break;
  300.  
  301.                 put_char(i);
  302.         }
  303. }
  304.  
  305. void prstr(u8 y,u8 x,u8* str)
  306. {
  307.         select_image(IMG_FONT);
  308.         output_x=x;
  309.         output_y=y;
  310.         put_str(str);
  311. }
  312.  
  313. void prnum(u8 y,u8 x,i16 hiscore)
  314. {
  315.         select_image(IMG_FONT);
  316.         if (hiscore<(i16)0) {
  317.                 tscore[0]='-';
  318.                 hiscore=-hiscore;
  319.         } else {
  320.                 tscore[0]=' ';
  321.         };
  322.         tscore[1]='0'+(hiscore)/10000;
  323.         tscore[2]='0'+(hiscore%10000)/1000;
  324.         tscore[3]='0'+(hiscore%1000)/100;
  325.         tscore[4]='0'+(hiscore%100)/10;
  326.         tscore[5]='0'+(hiscore%10);
  327.         output_x=x;
  328.         output_y=y;
  329.         put_str(tscore);
  330. }
  331.  
  332. void prnnn(u8 y,u8 x,i16 hiscore)
  333. {
  334.         select_image(IMG_FONT);
  335.         tnnn[0]='0'+(hiscore)/100;
  336.         tnnn[1]='0'+(hiscore%100)/10;
  337.         tnnn[2]='0'+(hiscore%10);
  338.         output_x=x;
  339.         output_y=y;
  340.         put_str(tnnn);
  341. }
  342.  
  343. void prpower(u8 power)
  344. {
  345. #define POWER_LEN 8
  346.         static u8 y,x;
  347.         static u8 i;
  348.         static u8 tiles[POWER_LEN];
  349.         select_image(IMG_TILES);
  350.         y=0;
  351.         x=curplayer?32:0;
  352.         output_x=x;
  353.         output_y=y;
  354.         for (i=0;i<POWER_LEN;i++) {
  355.           tiles[i]=((i*8)<power)?15:0;
  356.         }
  357.         tiles[power/8]=8+(power&7);
  358.         if (!power) tiles[0]=0;
  359.         for (i=0;i<POWER_LEN;i++) {
  360.           draw_tile(output_x++,output_y,tiles[i]+((i>=2)?16:0)+((i>=6)?16:0));
  361.         }
  362. }
  363.  
  364.  
  365. void prscores()
  366. {
  367. //todo юсэюты Є№ Єюы№ъю яЁш шчьхэхэшш
  368.         prnum(0,12,scores[0]);
  369.         if (curplayer==0) put_char('*'); else put_char(' ');
  370.         prnum(0,21,scores[1]);
  371.         if (curplayer==1) put_char('*'); else put_char(' ');
  372.         prnnn(2,16,ballvalue);
  373.         put_char('+');
  374.         prnnn(2,21,bonusballvalue);
  375.         //prnnn(3,0,winpocket);
  376.         //prnnn(3,10,curpocket);
  377.         output_x=oldoutput_x;
  378.         output_y=oldoutput_y;
  379.         put_char(' ');
  380.         output_x=pocketcoords[winpocket][0];
  381.         output_y=pocketcoords[winpocket][1];
  382.         oldoutput_x=output_x;
  383.         oldoutput_y=output_y;
  384.         if (winpocket) put_char('*');
  385. }
  386.  
  387.  
  388. void draw_sprites() {
  389.                 //if (1) {
  390.                 i=(SPRITES_ALL-1);
  391.                 j=0;
  392.                 //for(i=(SPRITES_ALL-1);i!=(u8)(-1);--i) {
  393.                 /*
  394.                 do {
  395.                         if (spriteList[i].exist) {
  396.                         //i&3 т√сшЁрхЄ юфшэ шч ўхЄ√Ёхї ЁрчэюЎтхЄэ√ї °рЁшъют
  397.                         //i&4 = Їрчр ёфтшур яю X
  398.  
  399.                         tmpx=spriteList[i].x;
  400.                         tmpxscr=(tmpx>>(SHIFTCOORDS+1)); //>>SHIFTCOORDS ъюьяшышЄё  ёю ёфтшуюь
  401.                         //j=tmpxscr>>8; //ъюьяшышЄё  схч ёфтшур
  402.                         set_sprite(j++,
  403.                                         tmpxscr-(SCRSHIFTX>>1),
  404.                                         (spriteList[i].y>>SHIFTCOORDS)-SCRSHIFTY,
  405.                                         spriteList[i].color|((tmpx&(1<<SHIFTCOORDS))?16:0));*/
  406. __asm
  407.                         ld      a,(#_i+0)
  408.                         ld      e,a
  409. 00000$: //эрўрыю Ўшъыр
  410.                         //ld    a,(#_i+0)
  411.                         //ld    e,a
  412.                         ld a,e
  413.                         add     a,a
  414.                         add     a,a
  415.                         add     a,e
  416.                         add     a,a
  417.                         add     a,e
  418.                         ld hl,#_spriteList+9
  419.                         add     a,l //#<_spriteList
  420.                         ld      l,a
  421.                         ld      a,h //#>_spriteList
  422.                         adc     a,#0x00
  423.                         ld      h,a
  424.                         ld a,(hl) //exist
  425.                         or a
  426.                         jr z,00005$ //ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш  ЁхушёЄЁют
  427.                         push de
  428.                         dec hl
  429.                         ld c,(hl) //color
  430.                         dec hl
  431.                         dec hl
  432.                         dec hl
  433.                         dec hl
  434.                         dec hl
  435.                         ld a,(hl) //Y
  436.                         dec hl
  437.                         ld e,(hl) //y
  438.                         rl e
  439.                         rla
  440.                         add     a,#0xF0
  441.                         ld d,a //d=(spriteList[i].y>>SHIFTCOORDS)-SCRSHIFTY
  442.                         dec hl
  443.                         ld a,(hl) //X
  444.                         add     a,#0xF8
  445.                         ld e,a //e=tmpxscr-(SCRSHIFTX>>1)
  446.                         dec hl
  447.                         ld a,(hl) //x
  448.                         rla
  449.                         sbc a,a
  450.                         and #0x10
  451.                         or      a,c //color
  452.                         ld      c,a
  453.                         ld      b,#0x00
  454.                         push bc //spriteList[i].color|((tmpx&(1<<SHIFTCOORDS))?4:0)
  455.                         push de //d=(spriteList[i].y>>SHIFTCOORDS)-SCRSHIFTY //e=tmpxscr-(SCRSHIFTX>>1)
  456.                         ld      hl,#_j + 0
  457.                         ld      a,(hl)
  458.                         inc (hl)
  459.                         push    af //j++
  460.                         inc     sp
  461.                         call    _set_sprite
  462.                         pop     af
  463.                         pop     af
  464.                         inc     sp
  465.                         pop de
  466. 00005$: //ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш  ЁхушёЄЁют
  467.                         dec e
  468.                         jp p,00000$ //эрўрыю Ўшъыр
  469. __endasm;
  470.                         /*}
  471.                 }while((--i)!=(u8)(-1));*/
  472.                 //}
  473. }
  474.  
  475.  
  476.  
  477. void moveball() {
  478.                        
  479.                         //фтшцхэшх
  480. #define RESTOREX tmpnewx=tmpx;
  481. #define RESTOREY tmpnewy=tmpy;
  482. #define RESTORECOORDS /*RESTOREX;RESTOREY;*/
  483.                         /*movingballs=0;
  484.                         slowphase++;
  485.                         for(i=0;i<SPRITES_ALL;++i) if (spriteList[i].exist==2) //фтшцхЄё 
  486.                         {*/
  487.                                 tmpx=spriteList[i].x;
  488.                                 tmpy=spriteList[i].y;
  489.                                
  490.                                 tmpnewx=tmpx+spriteList[i].dx;
  491.                                 tmpnewy=tmpy+spriteList[i].dy;
  492.                                 if (((tmpnewx>=RIGHTMARGIN)/*&&(spriteList[i].dx>=0)*/)
  493.                                 || ((tmpnewx<LEFTMARGIN)/*&&(spriteList[i].dx<0)*/))
  494.                                 {
  495.                                         spriteList[i].dx=-spriteList[i].dx;
  496.                                         //tmpnewx=tmpx+spriteList[i].dx;
  497.                                         tmpnewx=WRONGX;
  498.                                         tmpnewy=WRONGY;
  499.                                         //чтєъ, юяЁхфхышЄ№ эюьхЁ ыєч√, эюьхЁ °рЁшър ш юЎхэшЄ№ яю яЁртшырь
  500.                                                 //ш∙хь, т ъръє■ ыєчє ь√ яюярыш
  501.                                                 if (tmpx<(MYX<<SHIFTCOORDS)) {
  502.                                                         curpocket=(tmpy<(MIDY<<SHIFTCOORDS))?1:4;
  503.                                                 }
  504.                                                 else {
  505.                                                         curpocket=(tmpy<(MIDY<<SHIFTCOORDS))?3:6;
  506.                                                 };
  507.                                         pocketfactor=1;
  508.                                         spriteList[i].exist=0;
  509.                                         if (i!=0) {
  510.                                                 if (curpocket==winpocket) {
  511.                                                         sfx_play(SFX_WINPOCKET,0);
  512.                                                         pocketfactor=WINPOCKETFACTOR;
  513.                                                         winpocket=0;
  514.                                                 } else {
  515.                                                         sfx_play(SFX_POCKET,0);
  516.                                                 }
  517.                                                 scores[curplayer]+=((ballvalue+bonusballvalue)*pocketfactor);
  518.                                                 bonusballvalue+=DOUBLEBALLBONUS;
  519.                                                 pocketballs+=1;
  520.                                         } else {
  521.                                                 sfx_play(SFX_POCKET_MAIN,0);
  522.                                                 scores[curplayer]-=POCKETMAINMALUS;
  523.                                         }
  524.                                         prscores();
  525.                                 }
  526.                                 else if (((tmpnewy>=BOTTOMMARGIN)/*&&(spriteList[i].dy>=0)*/)
  527.                                 || ((tmpnewy<TOPMARGIN)/*&&(spriteList[i].dy<0)*/))
  528.                                 {
  529.                                         spriteList[i].dy=-spriteList[i].dy;
  530.                                         //tmpnewy=tmpy+spriteList[i].dy;
  531.                                         tmpnewx=WRONGX;
  532.                                         tmpnewy=WRONGY;
  533.                                         //чтєъ, юяЁхфхышЄ№ эюьхЁ ыєч√, эюьхЁ °рЁшър ш юЎхэшЄ№ яю яЁртшырь
  534.                                                 //ш∙хь, т ъръє■ ыєчє ь√ яюярыш
  535.                                                 if (tmpx<(MYX<<SHIFTCOORDS)) {
  536.                                                         curpocket=(tmpy<(MIDY<<SHIFTCOORDS))?1:4;
  537.                                                 }
  538.                                                 else if (tmpx<(PYRX<<SHIFTCOORDS)) {
  539.                                                         curpocket=(tmpy<(MIDY<<SHIFTCOORDS))?2:5;
  540.                                                 }
  541.                                                 else {
  542.                                                         curpocket=(tmpy<(MIDY<<SHIFTCOORDS))?3:6;
  543.                                                 };
  544.                                         pocketfactor=1;
  545.                                         spriteList[i].exist=0;
  546.                                         if (i!=0) {
  547.                                                 if (curpocket==winpocket) {
  548.                                                         sfx_play(SFX_WINPOCKET,0);
  549.                                                         pocketfactor=WINPOCKETFACTOR;
  550.                                                         winpocket=0;
  551.                                                 } else {
  552.                                                         sfx_play(SFX_POCKET,0);
  553.                                                 }
  554.                                                 scores[curplayer]+=((ballvalue+bonusballvalue)*pocketfactor);
  555.                                                 bonusballvalue+=DOUBLEBALLBONUS;
  556.                                                 pocketballs+=1;
  557.                                         } else {
  558.                                                 sfx_play(SFX_POCKET_MAIN,0);
  559.                                                 scores[curplayer]-=POCKETMAINMALUS;
  560.                                         }
  561.                                         prscores();
  562.                                 }
  563.                                 else {
  564.  
  565.                         //}
  566.                         //ЄюЁьюцхэшх ш яЁютхЁър юёЄрэютъш
  567.  
  568.                         //for(i=0;i<SPRITES_ALL;++i)
  569.                         //{
  570.                                 if ((spriteList[i].dx)||(spriteList[i].dy)) {
  571.                                         movingballs=1;
  572.                                         if (((slowphase-i)&15)==0) {
  573.                                                 dxold=spriteList[i].dx;
  574.                                                 dyold=spriteList[i].dy;
  575.                                                 if ( (ABS(dxold) < 12)
  576.                                                   && (ABS(dyold) < 12) ) {
  577.                                                         spriteList[i].dx=0;
  578.                                                         spriteList[i].dy=0;
  579.                                                         spriteList[i].exist=1;
  580.                                                 }
  581.                                                 else if ( (ABS(dxold) < 32)
  582.                                                   && (ABS(dyold) < 32) ) {
  583.                                                         spriteList[i].dx=dxold*3/4; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
  584.                                                         spriteList[i].dy=dyold*3/4; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
  585.                                                 }
  586.                                                 else if ( (ABS(dxold) < 100)
  587.                                                   && (ABS(dyold) < 100) ) {
  588.                                                         spriteList[i].dx=dxold*7/8; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
  589.                                                         spriteList[i].dy=dyold*7/8; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
  590.                                                 }
  591.                                                 else if ( (ABS(dxold) < 256)
  592.                                                   && (ABS(dyold) < 256) ) {
  593.                                                         spriteList[i].dx=dxold*15/16; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
  594.                                                         spriteList[i].dy=dyold*15/16; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
  595.                                                 }
  596.                                                 else {
  597.                                                         spriteList[i].dx=dxold*31/32; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
  598.                                                         spriteList[i].dy=dyold*31/32; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
  599.                                                 }
  600.                                         }
  601.                                 }
  602.                         //}
  603.  
  604.                         //юяЁхфхыхэшх ъюыышчшщ
  605.                         //for(i=0;i<SPRITES_ALL;++i) {
  606.  
  607. //°рЁшъ эх фюыцхэ яюярфрЄ№ т ЄЁряхЎш■ ьхцфє ыєчрьш, эю юЄёъюъ Ёрчэ√щ т чртшёшьюёЄш юЄ ёЄюЁюэ√, ъюЄюЁє■ юэ яхЁхё╕ъ
  608. //юЄ тхЁЄшърыш: dx=-dxold
  609. //юЄ уюЁшчюэЄрыш: dy=-dyold
  610. //юЄ фшруюэрыш ыхтющ тхЁїэхщ шыш яЁртющ эшцэхщ ыєч√: dx=dyold, dy=dxold
  611. //юЄ фшруюэрыш яЁртющ тхЁїэхщ шыш ыхтющ эшцэхщ ыєч√: dx=-dyold, dy=-dxold
  612. //юЄ єуыр (ёшыр ЁхръЎшш эряЁртыхэр яхЁяхэфшъєы Ёэю, Є.х. ъ ЎхэЄЁє): TODO ъръ яЁш ёЄюыъэютхэшш °рЁшъют
  613.  
  614. //ъююЁфшэрЄ√ °рЁшър = xleft,ytop = ъююЁфшэрЄ√ ыхтюую тхЁїэхую єуыр хую bounding box яы■ё SCRSHIFT
  615. //ъююЁфшэрЄ√ юуЁрэшўшЄхыхщ Єюцх яы■ё SCRSHIFT
  616. //яюёўшЄрхь x,y (ЎхэЄЁ), ytop, ybottom, xleft, xright
  617.                                 //xleft=(XTYPE)(tmpx+SCRSHIFTX)>>SHIFTCOORDS;
  618.                                 //xright=xleft+ballsize;
  619.                                 //x=xleft+(ballsize/2);
  620.                                 //ytop=(XTYPE)(tmpy+SCRSHIFTY)>>SHIFTCOORDS;
  621.                                 //ybottom=ytop+ballsize;
  622.                                 //y=ytop+(ballsize/2);
  623.                                 __asm
  624.                                 ld hl,(#_tmpx) //(#_moveballs_tmpx_1_1+0)
  625.                                 ld bc,#0x0010 //SCRSHIFTX
  626.                                 add hl,bc
  627.                                 add hl,hl
  628.                                 ld l,h
  629.                                 ld h,b
  630.                                 rl h
  631.                                 ld (#_xleft+0),hl
  632.                                 ex de,hl
  633.                                 ld hl,(#_tmpy) //(#_moveballs_tmpy_1_1+0)
  634.                                 add hl,bc //SCRSHIFTY==SCRSHIFTX
  635.                                 add hl,hl
  636.                                 ld l,h
  637.                                 ld h,b
  638.                                 rl h
  639.                                 ld (#_ytop+0),hl
  640.                                 ld c,#0x07 //ballsize/2
  641.                                 add hl,bc
  642.                                 ld (#_y+0),hl
  643.                                 ex de,hl
  644.                                 add hl,bc
  645.                                 ld (#_x+0),hl
  646.                                 inc c //ld c,#0x08 //ballsize-(ballsize/2)
  647.                                 add hl,bc
  648.                                 ld (#_xright+0),hl
  649.                                 ex de,hl
  650.                                 add hl,bc
  651.                                 ld (#_ybottom+0),hl
  652.                                 __endasm;
  653.  
  654.                                 dxold=spriteList[i].dx;
  655.                                 dyold=spriteList[i].dy;
  656.  
  657. #define WALLCOLLIDED sfx_play(SFX_BUM2,0);
  658.  /*spriteList[i].wallcollided=2;*/
  659. //ьюцэю яЁютхЁ Є№ яЁш Їырух т ёхЄъх[x,y], Єрь эюьхЁ тхЄъш яЁютхЁъш
  660.  
  661. //яЁютхЁъш тхЁїэшї ыєч Єюы№ъю яЁш ytop<TOPY (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш ):
  662.                                 if (ytop<TOPY) {
  663. //яхЁхёхўхэшх ыхтющ ўрёЄш тхЁїэхщ уюЁшчюэЄрыш: (x>TOPLEFTMINX) && (x<TOPLEFTMAXX) //&& (ytop<TOPY)
  664.                                         if ( (x>TOPLEFTMINX) && (x<TOPLEFTMAXX) ) {
  665.                                                 spriteList[i].dy=-dyold;
  666.                                                 //RESTOREY;
  667.                                                 tmpnewy=((XTYPE)TOPY<<SHIFTCOORDS);
  668.                                                 WALLCOLLIDED;
  669.                                         }
  670. //яхЁхёхўхэшх тхЁїэхщ фшруюэрыш ыхтющ тхЁїэхщ ыєч√: (x<=TOPLEFTMINX) && ((y-x-(ballsize*7/10))<(TOP-CORNERLEFT))
  671.                                         else if ( (x<=TOPLEFTMINX) ) {
  672.                                                 if ( (y<(x+TOP-CORNERLEFT+(ballsize*7/10))) && (-dyold>-dxold) ) {
  673.                                                         spriteList[i].dx=dyold;
  674.                                                         spriteList[i].dy=dxold;
  675.                                                         RESTORECOORDS;
  676.                                                         WALLCOLLIDED;
  677.                                                 }
  678.                                         }
  679. //яхЁхёхўхэшх яЁртющ ўрёЄш тхЁїэхщ уюЁшчюэЄрыш: (x>TOPRIGHTMINX) && (x<TOPRIGHTMAXX) //&& (ytop<TOPY)
  680.                                         else if ( (x>TOPRIGHTMINX) && (x<TOPRIGHTMAXX) ) {
  681.                                                 spriteList[i].dy=-dyold;
  682.                                                 //RESTOREY;
  683.                                                 tmpnewy=((XTYPE)TOPY<<SHIFTCOORDS);
  684.                                                 WALLCOLLIDED;
  685.                                         }
  686. //яхЁхёхўхэшх тхЁїэхщ фшруюэрыш яЁртющ тхЁїэхщ ыєч√: (x>=TOPRIGHTMAXX) && ((y+x-(ballsize*7/10))<(TOP+CORNERRIGHT))
  687.                                         else if ( (x>=TOPRIGHTMAXX) ) {
  688.                                                 if ( ((y+x)<(TOP+CORNERRIGHT+(ballsize*7/10))) && (-dyold>dxold) ) {
  689.                                                         spriteList[i].dx=-dyold;
  690.                                                         spriteList[i].dy=-dxold;
  691.                                                         RESTORECOORDS;
  692.                                                         WALLCOLLIDED;
  693.                                                 }
  694.                                         }
  695.                                         else {
  696. //if (y<TOPY) {
  697.                                                 if (y<(TOPY+MAGNETSIZE)) {
  698.                                                                 spriteList[i].dy-=MAGNETSPEED;
  699.                                                 }
  700.                                                 if (y<TOPY) {
  701. //яхЁхёхўхэшх ыхтющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((TOPLEFTMAXX-xleft)<ballsize) //&& (y<TOPY)
  702.                                                         if ((TOPLEFTMAXX-xleft)<ballsize) {
  703.                                                                 spriteList[i].dx=-dxold;
  704.                                                                 RESTOREX;
  705.                                                                 WALLCOLLIDED;
  706.                                                         }
  707. //яхЁхёхўхэшх яЁртющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((xright-TOPRIGHTMINX)<ballsize) //&& (y<TOPY)
  708.                                                         else if ((xright-TOPRIGHTMINX)<ballsize) {
  709.                                                                 spriteList[i].dx=-dxold;
  710.                                                                 RESTOREX;
  711.                                                                 WALLCOLLIDED;
  712.                                                         }
  713. //} else {
  714.                                                 } else {
  715.                                                 //if(!spriteList[i].wallcollided) {
  716.                                                         sqrdy=sqrhalfballsize-sqr((DXTYPE)y-TOPY);
  717. //ъюэЄръЄ ё ыхт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-TOPLEFTMAXX)+sqr(y-TOPY))<sqrhalfballsize)
  718.                                                         if ((x>TOPLEFTMAXX) && ((sqr(x-TOPLEFTMAXX))<sqrdy)) { //x>
  719.                                                                 spriteList[i].dx=ABS(dyold); //-dyold
  720.                                                                 spriteList[i].dy=ABS(dxold); //-dxold
  721.                                                                 RESTORECOORDS;
  722.                                                                 WALLCOLLIDED;
  723.                                                         }
  724. //ъюэЄръЄ ё яЁрт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-TOPRIGHTMINX)+sqr(y-TOPY))<sqrhalfballsize)
  725.                                                         else if ((x<TOPRIGHTMINX) && ((sqr(TOPRIGHTMINX-x))<sqrdy)) { //x<
  726.                                                                 spriteList[i].dx=-ABS(dyold); //dyold
  727.                                                                 spriteList[i].dy=ABS(dxold);
  728.                                                                 RESTORECOORDS;
  729.                                                                 WALLCOLLIDED;
  730.                                                         }
  731. //ъюэЄръЄ ё тхЁїэшь єуыюь ыхтющ тхЁїэхщ ыєч√: ((sqr(x-TOPLEFTMINX)+sqr(y-TOPY))<sqrhalfballsize)
  732.                                                         else if ((x<TOPLEFTMINX) && ((sqr(TOPLEFTMINX-x))<sqrdy) && (dyold<0)) { //x<
  733.                                                                 spriteList[i].dx=dyold;
  734.                                                                 spriteList[i].dy=dxold;
  735.                                                                 RESTORECOORDS;
  736.                                                                 WALLCOLLIDED;
  737.                                                         }
  738. //ъюэЄръЄ ё тхЁїэшь єуыюь яЁртющ тхЁїэхщ ыєч√: ((sqr(x-TOPRIGHTMINX)+sqr(y-TOPY))<sqrhalfballsize)
  739.                                                         else if ((x>TOPRIGHTMAXX) && ((sqr(x-TOPRIGHTMAXX))<sqrdy) && (dyold<0)) { //x>
  740.                                                                 spriteList[i].dx=-dyold;
  741.                                                                 spriteList[i].dy=-dxold;
  742.                                                                 RESTORECOORDS;
  743.                                                                 WALLCOLLIDED;
  744.                                                         }
  745. //}
  746.                                                 } //else spriteList[i].wallcollided--;
  747.                                         }
  748.                                 }
  749.  
  750. /*
  751.                                         if ( (y<(x+TOP-CORNERLEFT+(ballsize*7/10))) ) {
  752.                                                 spriteList[i].dx=dyold;
  753.                                                 spriteList[i].dy=dxold;
  754.                                         }
  755.                                         if ( ((y+x)<(TOP+CORNERRIGHT+(ballsize*7/10))) ) {
  756.                                                                 spriteList[i].color=(spriteList[i].color+1)&3;
  757.                                                 spriteList[i].dx=-dyold;
  758.                                                 spriteList[i].dy=-dxold;
  759.                                         }
  760. */
  761.  
  762. //яЁютхЁъш эшцэшї ыєч Єюы№ъю яЁш ybottom>BOTTOMY (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш ):
  763.                                 if (ybottom>BOTTOMY) {
  764. //яхЁхёхўхэшх ыхтющ ўрёЄш эшцэхщ уюЁшчюэЄрыш: (x>BOTTOMLEFTMINX) && (x<BOTTOMLEFTMAXX) //&& (ybottom>BOTTOMY)
  765.                                         if ( (x>BOTTOMLEFTMINX) && (x<BOTTOMLEFTMAXX) ) {
  766.                                                 spriteList[i].dy=-dyold;
  767.                                                 //RESTOREY;
  768.                                                 tmpnewy=((XTYPE)BOTTOMY<<SHIFTCOORDS)-BALLSIZE;
  769.                                                 WALLCOLLIDED;
  770.                                         }
  771. //яхЁхёхўхэшх эшцэхщ фшруюэрыш ыхтющ эшцэхщ ыєч√: (x<=BOTTOMLEFTMINX) && ((y+x+(ballsize*7/10))>(BOTTOM+CORNERLEFT))
  772.                                         else if ( (x<=BOTTOMLEFTMINX) ) {
  773.                                                 if ( ((y+x)>(BOTTOM+CORNERLEFT-(ballsize*7/10))) && (dyold>-dxold) ) {
  774.                                                         spriteList[i].dx=-dyold;
  775.                                                         spriteList[i].dy=-dxold;
  776.                                                         //RESTORECOORDS;
  777.                                                         WALLCOLLIDED;
  778.                                                 }
  779.                                         }
  780. //яхЁхёхўхэшх яЁртющ ўрёЄш эшцэхщ уюЁшчюэЄрыш: (x>BOTTOMRIGHTMINX) && (x<BOTTOMRIGHTMAXX) //&& (ybottom>BOTTOMY)
  781.                                         else if ( (x>BOTTOMRIGHTMINX) && (x<BOTTOMRIGHTMAXX) ) {
  782.                                                 spriteList[i].dy=-dyold;
  783.                                                 //RESTOREY;
  784.                                                 tmpnewy=((XTYPE)BOTTOMY<<SHIFTCOORDS)-BALLSIZE;
  785.                                                 WALLCOLLIDED;
  786.                                         }
  787. //яхЁхёхўхэшх эшцэхщ фшруюэрыш яЁртющ эшцэхщ ыєч√: (x>=BOTTOMRIGHTMAXX) && ((y-x+(ballsize*7/10))>(BOTTOM-CORNERRIGHT))
  788.                                         else if ( (x>=BOTTOMRIGHTMAXX) ) {
  789.                                                 if ( (y>(x+BOTTOM-CORNERRIGHT-(ballsize*7/10))) && (dyold>dxold) ) {
  790.                                                         spriteList[i].dx=dyold;
  791.                                                         spriteList[i].dy=dxold;
  792.                                                         //RESTORECOORDS;
  793.                                                         WALLCOLLIDED;
  794.                                                 }
  795.                                         }
  796. //if (y>BOTTOMY) {
  797.                                                 if (y<(BOTTOMY-MAGNETSIZE)) {
  798.                                                                 spriteList[i].dy+=MAGNETSPEED;
  799.                                                 }
  800.                                                 if (y>BOTTOMY) {
  801. //яхЁхёхўхэшх ыхтющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((BOTTOMLEFTMAXX-xleft)<ballsize) //&& (y>BOTTOMY)
  802.                                                         if ((BOTTOMLEFTMAXX-xleft)<ballsize) { //xleft<
  803.                                                                 spriteList[i].dx=-dxold;
  804.                                                                 RESTOREX;
  805.                                                                 WALLCOLLIDED;
  806.                                                         }
  807. //яхЁхёхўхэшх яЁртющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((xright-BOTTOMRIGHTMINX)<ballsize) //&& (y>BOTTOMY)
  808.                                                         else if ((xright-BOTTOMRIGHTMINX)<ballsize) { //xright>
  809.                                                                 spriteList[i].dx=-dxold;
  810.                                                                 RESTOREX;
  811.                                                                 WALLCOLLIDED;
  812.                                                         }
  813. //} else {
  814.                                                 } else {
  815.                                                         sqrdy=sqrhalfballsize-sqr(BOTTOMY-(DXTYPE)y);
  816. //ъюэЄръЄ ё ыхт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-BOTTOMLEFTMAXX)+sqr(y-BOTTOMY))<sqrhalfballsize)
  817.                                                         if ((x>BOTTOMLEFTMAXX) && ((sqr(x-BOTTOMLEFTMAXX))<sqrdy)) { //x>
  818.                                                                 //xshow=dxold;
  819.                                                                 //yshow=dyold;
  820.                                                                 spriteList[i].dx=ABS(dyold);
  821.                                                                 spriteList[i].dy=-ABS(dxold);
  822.                                                                 RESTORECOORDS;
  823.                                                                 WALLCOLLIDED;
  824.                                                         }
  825. //ъюэЄръЄ ё яЁрт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-BOTTOMRIGHTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
  826.                                                         else if ((x<BOTTOMRIGHTMINX) && ((sqr(BOTTOMRIGHTMINX-x))<sqrdy)) { //x<
  827.                                                                 //xshow=x;
  828.                                                                 //yshow=y;
  829.                                                                 spriteList[i].dx=-ABS(dyold);
  830.                                                                 spriteList[i].dy=-ABS(dxold); //-dxold
  831.                                                                 RESTORECOORDS;
  832.                                                                 WALLCOLLIDED;
  833.                                                         }
  834. //ъюэЄръЄ ё эшцэшь єуыюь ыхтющ эшцэхщ ыєч√: ((sqr(x-BOTTOMLEFTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
  835.                                                         else if ((x<BOTTOMLEFTMINX) && ((sqr(BOTTOMLEFTMINX-x))<sqrdy) && (dyold>0)) { //x<
  836.                                                                 spriteList[i].dx=-dyold;
  837.                                                                 spriteList[i].dy=-dxold;
  838.                                                                 //RESTORECOORDS;
  839.                                                                 //tmpnewy=((XTYPE)BOTTOMY<<SHIFTCOORDS)-BALLSIZE;
  840.                                                                 WALLCOLLIDED;
  841.                                                         }
  842. //ъюэЄръЄ ё эшцэшь єуыюь яЁртющ эшцэхщ ыєч√: ((sqr(x-BOTTOMRIGHTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
  843.                                                         else if ((x>BOTTOMRIGHTMAXX) && ((sqr(x-BOTTOMRIGHTMAXX))<sqrdy) && (dyold>0)) { //x>
  844.                                                                 spriteList[i].dx=dyold;
  845.                                                                 spriteList[i].dy=dxold;
  846.                                                                 //RESTORECOORDS;
  847.                                                                 //tmpnewy=((XTYPE)BOTTOMY<<SHIFTCOORDS)-BALLSIZE;
  848.                                                                 WALLCOLLIDED;
  849.                                                         }
  850. //}
  851.                                                 }
  852.                                 }
  853.  
  854. //яЁютхЁъш ыхтющ ёЄюЁюэ√ Єюы№ъю яЁш xleft<LEFTX (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш )
  855.                                 if (xleft<LEFTX) {
  856. //яхЁхёхўхэшх ыхтющ тхЁЄшърыш: (y>LEFTMINY) && (y<LEFTMAXY) //&& (xleft<LEFTX)
  857.                                         if ( (y>LEFTMINY) && (y<LEFTMAXY) ) {
  858.                                                 spriteList[i].dx=-dxold;
  859.                                                 //RESTOREX;
  860.                                                 tmpnewx=(XTYPE)LEFTX<<SHIFTCOORDS;
  861.                                                 WALLCOLLIDED;
  862.                                         }
  863. //яхЁхёхўхэшх эшцэхщ фшруюэрыш ыхтющ тхЁїэхщ ыєч√: (y<=LEFTMINY) && ((y-x+(ballsize*7/10))>(CORNERTOP-LEFT))
  864.                                         else if ( (y<=LEFTMINY) ) {
  865.                                                 if ( (y>(x+CORNERTOP-LEFT-(ballsize*7/10))) && (dxold<dyold) ) {
  866.                                                         spriteList[i].dx=dyold;
  867.                                                         spriteList[i].dy=dxold;
  868.                                                         //RESTORECOORDS;
  869.                                                         WALLCOLLIDED;
  870.                                                 }
  871.                                         }
  872. //яхЁхёхўхэшх тхЁїэхщ фшруюэрыш ыхтющ эшцэхщ ыєч√: (y>=LEFTMAXY) && ((y+x-(ballsize*7/10))<(CORNERBOTTOM+LEFT))
  873.                                         else if ( (y>=LEFTMAXY) ) {
  874.                                                 if ( ((y+x)<(CORNERBOTTOM+LEFT+(ballsize*7/10))) && (dxold<-dyold) ) {
  875.                                                         spriteList[i].dx=-dyold;
  876.                                                         spriteList[i].dy=-dxold;
  877.                                                         //RESTORECOORDS;
  878.                                                         WALLCOLLIDED;
  879.                                                 }
  880.                                         }
  881. //ъюэЄръЄ ё эшцэшь єуыюь ыхтющ тхЁїэхщ ыєч√: ((sqr(x-LEFTX)+sqr(y-LEFTMINY))<sqrhalfballsize)
  882.                                         else if (y<(LEFTMINY+ballsize)) {
  883.                                                         if ((((DXTYPE)sqr((DXTYPE)x-LEFTX)+sqr(LEFTMINY-(DXTYPE)y))<sqrhalfballsize) && (dxold<0)) { //y<
  884.                                                                 spriteList[i].dx=-dyold;
  885.                                                                 spriteList[i].dy=-dxold;
  886.                                                                 RESTORECOORDS;
  887.                                                                 WALLCOLLIDED;
  888.                                                         }
  889.                                         }
  890. //ъюэЄръЄ ё тхЁїэшь єуыюь ыхтющ эшцэхщ ыєч√: ((sqr(x-LEFTX)+sqr(y-LEFTMAXY))<sqrhalfballsize)
  891.                                         else if (y>(LEFTMAXY-ballsize)) {
  892.                                                         if ((((DXTYPE)sqr((DXTYPE)x-LEFTX)+sqr((DXTYPE)y-LEFTMAXY))<sqrhalfballsize) && (dxold<0)) { //y>
  893.                                                                 spriteList[i].dx=dyold;
  894.                                                                 spriteList[i].dy=dxold;
  895.                                                                 RESTORECOORDS;
  896.                                                                 WALLCOLLIDED;
  897.                                                         }
  898.                                         }
  899.                                         else if (x<=(LEFTX+MAGNETSIZE)) {
  900.                                                 spriteList[i].dx-=MAGNETSPEED;
  901.                                         }
  902.                                 }
  903.  
  904. //яЁютхЁъш яЁртющ ёЄюЁюэ√ Єюы№ъю яЁш xright>RIGHTX (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш )
  905.                                 if (xright>RIGHTX) {
  906. //яхЁхёхўхэшх яЁртющ тхЁЄшърыш: (y>RIGHTMINY) && (y<RIGHTMAXY) //&& (xright>RIGHTX)
  907.                                         if ( (y>RIGHTMINY) && (y<RIGHTMAXY) ) {
  908.                                                 spriteList[i].dx=-dxold;
  909.                                                 //RESTOREX;
  910.                                                 tmpnewx=((XTYPE)RIGHTX<<SHIFTCOORDS)-BALLSIZE;
  911.                                                 WALLCOLLIDED;
  912.                                         }
  913. //яхЁхёхўхэшх эшцэхщ фшруюэрыш яЁртющ тхЁїэхщ ыєч√: (y<=RIGHTMINY) && ((y+x+(ballsize*7/10))>(CORNERTOP+RIGHT))
  914.                                         else if ( (y<=RIGHTMINY) ) {
  915.                                                 if ( ((y+x)>(CORNERTOP+RIGHT-(ballsize*7/10))) && (dxold>-dyold) ) {
  916.                                                         spriteList[i].dx=-dyold;
  917.                                                         spriteList[i].dy=-dxold;
  918.                                                         //RESTORECOORDS;
  919.                                                         WALLCOLLIDED;
  920.                                                 }
  921.                                         }
  922. //яхЁхёхўхэшх тхЁїэхщ фшруюэрыш яЁртющ эшцэхщ ыєч√: (y>=RIGHTMAXY) && ((y-x-(ballsize*7/10))<(CORNERBOTTOM-RIGHT))
  923.                                         else if ( (y>=RIGHTMAXY) ) {
  924.                                                 if ( (y<(x+CORNERBOTTOM-RIGHT+(ballsize*7/10))) && (dxold>dyold) ) {
  925.                                                         spriteList[i].dx=dyold;
  926.                                                         spriteList[i].dy=dxold;
  927.                                                         //RESTORECOORDS;
  928.                                                         WALLCOLLIDED;
  929.                                                 }
  930.                                         }
  931. //ъюэЄръЄ ё эшцэшь єуыюь яЁртющ тхЁїэхщ ыєч√: ((sqr(x-RIGHTX)+sqr(y-RIGHTMINY))<sqrhalfballsize)
  932.                                         else if (y<(RIGHTMINY+ballsize)) {
  933.                                                         if ((((DXTYPE)sqr((DXTYPE)x-RIGHTX)+sqr(RIGHTMINY-(DXTYPE)y))<sqrhalfballsize) && (dxold>0)) { //y<
  934.                                                                 spriteList[i].dx=dyold;
  935.                                                                 spriteList[i].dy=dxold;
  936.                                                                 RESTORECOORDS;
  937.                                                                 WALLCOLLIDED;
  938.                                                         }
  939.                                         }
  940. //ъюэЄръЄ ё тхЁїэшь єуыюь яЁртющ эшцэхщ ыєч√: ((sqr(x-RIGHTX)+sqr(y-RIGHTMAXY))<sqrhalfballsize)
  941.                                         else if (y>(RIGHTMAXY+ballsize)) {
  942.                                                         if ((((DXTYPE)sqr((DXTYPE)x-RIGHTX)+sqr((DXTYPE)y-RIGHTMAXY))<sqrhalfballsize) && (dxold>0)) { //y>
  943.                                                                 spriteList[i].dx=-dyold;
  944.                                                                 spriteList[i].dy=-dxold;
  945.                                                                 RESTORECOORDS;
  946.                                                                 WALLCOLLIDED;
  947.                                                         }
  948.                                         }
  949.                                         else if (x>=(RIGHTX-MAGNETSIZE)) {
  950.                                                 spriteList[i].dx+=MAGNETSPEED;
  951.                                         }
  952.                                 }
  953.                                 } //хёыш эх т ыєчх
  954.                         spriteList[i].x=tmpnewx;
  955.                         spriteList[i].y=tmpnewy;
  956.                         //} //exist==2
  957.                         /*}*/
  958. }
  959.  
  960. void uncollideballs() {
  961.         //static u8 xzone,yzone;
  962. //юсэєыхэшх чюэ
  963. //шфхюыюуш  Єрър :
  964. //шчэрўры№эю т чюэрї -1
  965. //яЁш яЁютхЁъх юўхЁхфэюую °рЁшър ь√ тэюёшь хую т чюэє, ш хёыш Єрь єцх с√ы °рЁшъ, Єю т√ыхчхЄ Їыру. шэрўх яюыєўшЄё  0 т чюэх.
  966. //фы  эхёє∙хёЄтє■∙шї °рЁшъют сєфхЄ -1, эю юэш ш т эхёє∙хёЄтє■∙шї чюэрї
  967.                         for(i=0;i<SPRITES_ALL;++i) {
  968.                                 xzone=spriteList[i].x>>(ZONESHIFT+SHIFTCOORDS);
  969.                                 yzone=spriteList[i].y>>(ZONESHIFT+SHIFTCOORDS);
  970.                                 //exist=(spriteList[i].exist);
  971.                         //addr=ballsinzone+((u16)yzone<<8)+xzone;
  972.                         //( (++(*addr)); (++(*(addr+1))); (++(*(addr+257))); (++(*(addr+256))) );
  973.                         __asm
  974.                                 ld      hl,(_xzone) //(_moveballs_xzone_1_1)
  975.                                 ld      a,(_yzone) //(_moveballs_yzone_1_1)
  976.                                 ld      h,a
  977.                                 ld      bc,#_ballsinzone
  978.                                 add     hl,bc
  979.                                 ld a,#-1
  980.                                 ld (hl),a
  981.                                 inc     l
  982.                                 ld (hl),a
  983.                                 inc     h
  984.                                 ld (hl),a
  985.                                 dec     l
  986.                                 ld (hl),a
  987.                         __endasm;
  988.                         }
  989. }
  990.  
  991. void docollide()
  992. {
  993.                                                         if ((spriteList[i].exist)&&(spriteList[j].exist)) { //фы  эрф╕цэюёЄш (ўЄюс√ ь╕ЁЄт√х °рЁшъш эх юцшты ышё№)
  994.                                                                 //шьяєы№ё, фхы╕ээ√щ эр ьрёёє (ЁрчьхЁэюёЄ№ V, Є.ъ. (nx,xy) сєфхЄ эюЁьрышчютрэ)
  995.                                                                 //эрфю єьэюцхэшх 16*16=>32 шыш 8.8*8.8=>8.8
  996.                                                                 //tempdx = (spriteList[i].dx-spriteList[j].dx);
  997.                                                                 //tempdy = (spriteList[i].dy-spriteList[j].dy);
  998.                                                                 p=DOTPRODUCT((spriteList[i].dx-spriteList[j].dx),(spriteList[i].dy-spriteList[j].dy),nx,ny)>>(4+4);
  999.                                                                                         ///(ITYPE)BALLSIZE; //эхы№ч  UTYPE - яюўхьє?
  1000.                                                                 //if (p>0) p=-p;
  1001.                                                                 if (p<0) { //шьяєы№ё эх ьюцхЄ шфЄш т ёЄюЁюэє фЁєуюую °рЁшър
  1002.                                                                 //тхъЄюЁ шьяєы№ёр, фхы╕ээ√щ эр ьрёёє (ЁрчьхЁэюёЄ№ V)
  1003.                                                                 px=(p*nx);
  1004.                                                                 ///(ITYPE)BALLSIZE; //эхы№ч  UTYPE - яюўхьє?
  1005.                                                                 py=(p*ny);
  1006.                                                                 ///(ITYPE)BALLSIZE; //эхы№ч  UTYPE - яюўхьє?
  1007.                                                                 //ьхэ хь ёъюЁюёЄш (ЁрчьхЁэюёЄ№ V)
  1008.                                                                 tempdx = spriteList[i].dx-px; //spriteList[i].dx-=px;
  1009.                                                                 #ifdef CHECKMAXSPEED
  1010.                                                                 if (tempdx/*spriteList[i].dx*/ >= MAXSPEED) tempdx/*spriteList[i].dx*/ = MAXSPEED;
  1011.                                                                 if (tempdx/*spriteList[i].dx*/ < -MAXSPEED) tempdx/*spriteList[i].dx*/ = -MAXSPEED;
  1012.                                                                 #endif
  1013.                                                                 spriteList[i].dx = tempdx;
  1014.                                                                 tempdy = spriteList[i].dy-py; //spriteList[i].dy-=py;
  1015.                                                                 #ifdef CHECKMAXSPEED
  1016.                                                                 if (tempdy/*spriteList[i].dy*/ >= MAXSPEED) tempdy/*spriteList[i].dy*/ = MAXSPEED;
  1017.                                                                 if (tempdy/*spriteList[i].dy*/ < -MAXSPEED) tempdy/*spriteList[i].dy*/ = -MAXSPEED;
  1018.                                                                 #endif
  1019.                                                                 spriteList[i].dy = tempdy;
  1020.                                                                 tempdx = spriteList[j].dx+px; //spriteList[j].dx+=px;
  1021.                                                                 #ifdef CHECKMAXSPEED
  1022.                                                                 if (tempdx/*spriteList[j].dx*/ >= MAXSPEED) tempdx/*spriteList[j].dx*/ = MAXSPEED;
  1023.                                                                 if (tempdx/*spriteList[j].dx*/ < -MAXSPEED) tempdx/*spriteList[j].dx*/ = -MAXSPEED;
  1024.                                                                 #endif
  1025.                                                                 spriteList[j].dx = tempdx;
  1026.                                                                 tempdy = spriteList[j].dy+py; //spriteList[j].dy+=py;
  1027.                                                                 #ifdef CHECKMAXSPEED
  1028.                                                                 if (tempdy/*spriteList[j].dy*/ >= MAXSPEED) tempdy/*spriteList[j].dy*/ = MAXSPEED;
  1029.                                                                 if (tempdy/*spriteList[j].dy*/ < -MAXSPEED) tempdy/*spriteList[j].dy*/ = -MAXSPEED;
  1030.                                                                 #endif
  1031.                                                                 spriteList[j].dy = tempdy;
  1032. //эрфю ўЄюс√ °рЁшъш яюёых ёЄюыъэютхэш  эх ёсышцрышё№, Є.х. dx ыхтюую °рЁшър фюыцхэ с√Є№ < dx яЁртюую, dy тхЁїэхую < dy эшцэхую
  1033.  
  1034.                 //spriteList[i].dx=rand16()%(2<<SHIFTCOORDS)-(1<<SHIFTCOORDS); //rand16()&1?-1:1;
  1035.                 //spriteList[i].dy=rand16()%(2<<SHIFTCOORDS)-(1<<SHIFTCOORDS); //rand16()&1?-1:1;
  1036.                 //spriteList[j].dx=rand16()%(2<<SHIFTCOORDS)-(1<<SHIFTCOORDS); //rand16()&1?-1:1;
  1037.                 //spriteList[j].dy=rand16()%(2<<SHIFTCOORDS)-(1<<SHIFTCOORDS); //rand16()&1?-1:1;
  1038.                                                                 //spriteList[i].color=(spriteList[i].color+1)&3;
  1039.                                                                 //spriteList[j].color=(spriteList[j].color+1)&3;
  1040.                                                                 //collided[i][j]=5;
  1041.                                                                 spriteList[i].exist=2; //фтшцхЄё 
  1042.                                                                 spriteList[j].exist=2; //фтшцхЄё 
  1043.                                                                 washit=1; //с√ы єфрЁ
  1044.                                                                 sfx_play(SFX_BUM,0);
  1045.                                                                 }
  1046.                                                         }
  1047. }
  1048.  
  1049. //юяЁхфхыхэшх ёЄюыъэютхэшщ °рЁшъют фЁєу ё фЁєуюь
  1050.                         /*for(i=0;i<SPRITES_ALL;++i) if (spriteList[i].exist)
  1051.                         {*/
  1052.  
  1053. void preparecollideball() {
  1054.                         tmpx=spriteList[i].x;
  1055.                         tmpy=spriteList[i].y;
  1056.                         xzone=tmpx>>(ZONESHIFT+SHIFTCOORDS);
  1057.                         yzone=tmpy>>(ZONESHIFT+SHIFTCOORDS);
  1058.                         //spritezones[(i<<1)+1]=(tmpnewx>>(SHIFTCOORDS+1));
  1059.                         //spritezones[(i<<1)]=(tmpnewy>>(SHIFTCOORDS+1));
  1060.                         //addr=ballsinzone+((u16)yzone<<8)+xzone;
  1061.                         //if ( (++(*addr)) + (++(*(addr+1))) + (++(*(addr+257))) + (++(*(addr+256))) ) //яюьхўрхь яюыюцхэшх ш яЁютхЁ хь эрыюцхэшх т чюэрї
  1062. //spritezones ёюфхЁцшЄ яхЁхёўшЄрээ√х x,y (8 bit) фы  тёхї °рЁшъют
  1063. __asm
  1064.         ld      a,(#_i+0) //эюьхЁ °рЁр
  1065.         add     a,a
  1066.         add     a,#<_spritezones
  1067.         ld      l,a
  1068.         adc     a,#>_spritezones
  1069.         sub     a,l
  1070.         ld      h,a
  1071.         ld      a,(#_tmpy+1) //(#_moveballs_tmpy_1_1+1)
  1072.         ld      (hl),a
  1073.         inc     hl
  1074.         ld      a,(#_tmpx+1) //(#_moveballs_tmpx_1_1+1)
  1075.         ld      (hl),a
  1076.  
  1077. //ballsinzone ёюфхЁцшЄ ўшёыю °рЁшъют т ърцфющ ъыхЄъх 16x16
  1078.         ld      hl,(_xzone) //(_moveballs_xzone_1_1)
  1079.         ld      a,(_yzone) //(_moveballs_yzone_1_1)
  1080.         ld      h,a
  1081.         ld      bc,#_ballsinzone
  1082.         add     hl,bc
  1083.         inc (hl)
  1084.         ld      a,(hl)
  1085.         inc     l
  1086.         inc (hl)
  1087.         add     a,(hl)
  1088.         inc     h
  1089.         inc (hl)
  1090.         add     a,(hl)
  1091.         dec     l
  1092.         inc (hl)
  1093.         add     a,(hl)
  1094.         //jp    Z,skipinnerloop$
  1095.         ld (_xzone),a //(_moveballs_xzone_1_1),a //ЄхяхЁ№ ¤Єю ўшёыю °рЁшъют т 4 чюэрї яюф °рЁшъюь
  1096. __endasm;
  1097. }
  1098.  
  1099. void collideball() {
  1100.                
  1101.                         //if (xzone && i)
  1102.                         //{
  1103.                                 xleft=(tmpx-BALLSIZE)>>(SHIFTCOORDS+1);
  1104.                                 ytop=(tmpy-BALLSIZE)>>(SHIFTCOORDS+1);
  1105. //                              spritezonesaddr=spritezones+i+i-1; //яюўхьє-Єю ЄєЄ эх ЁрсюЄрхЄ
  1106.  
  1107.                                 //for(j=i-1; j!=-1; --j)
  1108.                                 j=i-1; //i!=0, Єръ ўЄю ёЁртэштрхь ърцфє■ ярЁє [i] ш [j] юфшэ Ёрч, р эх фтр
  1109. //                              do
  1110. //                              /*if (spriteList[j].exist)*/ {
  1111. __asm
  1112.         ld a,(_xleft)
  1113.         ld (#00091$+1),a
  1114.         ld c,a
  1115.         ld b,#0x10
  1116.         ld a,(_ytop)
  1117.         ld (#00092$+1),a
  1118.         ld de,(_spritezonesaddr) //(_moveballs_spritezonesaddr_1_1)
  1119.         ld hl,#_j
  1120. 00099$: //эрўрыю Ўшъыр j
  1121.                                         //if(!collided[i][j]) {
  1122. //                                      if ((spriteList[j].x-tmpxmin)<(BALLSIZE<<1)) {
  1123. //                                              if ((spriteList[j].y-tmpymin)<(BALLSIZE<<1)) {
  1124. //                                      if ((u8)((spriteList[j].x>>(SHIFTCOORDS+1))-xleft)<(u8)(ballsize+1)) {
  1125. //                                              if ((u8)((spriteList[j].y>>(SHIFTCOORDS+1))-ytop)<(u8)(ballsize+1)) {
  1126.  
  1127. //                                      if ((u8)(/*(spritezones[(j<<2)])*/(*spritezonesaddr)-xleft)<(u8)(ballsize+1)) {
  1128.         ld a,(de)
  1129.         dec de
  1130. //9999491$: //яхЁхьхээр  (+1)
  1131.         sub a,c //#0 //(_moveballs_xleft_1_1)
  1132.         sub     a,b //#0x10
  1133.         jp      nc,00001$ //ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш  ЁхушёЄЁют
  1134. //                                              if ((u8)(/*(spritezones[(j<<2)+1])*/(*(spritezonesaddr+1))-ytop)<(u8)(ballsize+1)) {
  1135.         //ld a,(_ytop)
  1136.         //ex de,hl
  1137.         //sub a,(hl)
  1138.         //ex de,hl
  1139.         //neg
  1140.  
  1141.         ld a,(de)
  1142. 00092$: //яхЁхьхээр  (+1)
  1143.         sub a,#0 //(_moveballs_ytop_1_1)
  1144.         sub     a,b //#0x10
  1145.         jp      nc,00001$ //ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш  ЁхушёЄЁют
  1146.         push de //spritezonesaddr-1
  1147.                                 //ъююЁфшэрЄ√ сышчъю - ьюцэю ёўшЄрЄ№ ЁрёёЄю эшх яю ЇюЁьєых
  1148.                                                         //dist=(SQR((ITYPE)(DXTYPE)(spriteList[i].x-spriteList[j].x))+SQR((ITYPE)(DXTYPE)(spriteList[i].y-spriteList[j].y))); //фтющэюх яЁхюсЁрчютрэшх фы  эрїюцфхэш  чэрър, яюЄюь Ёрё°шЁхэш  чэрър (Ёрё°шЁхэшх, ўЄюс√ яЁртшы№эю яюёўшЄрЄ№ ътрфЁрЄ)
  1149.                                                         //if (dist < SQR((UTYPE)BALLSIZE)) {
  1150.                                                         //if ( (sqr((DXTYPE)(spriteList[i].x-spriteList[j].x)>>SHIFTCOORDS)+sqr((DXTYPE)(spriteList[i].y-spriteList[j].y)>>SHIFTCOORDS)) < sqr(ballsize) ) {
  1151.                                                         //if ( ((u16)sqr((DXTYPE)(spriteList[i].x-spriteList[j].x)>>(SHIFTCOORDS+1))) + ((u16)sqr((DXTYPE)(spriteList[i].y-spriteList[j].y)>>(SHIFTCOORDS+1))) < (u16)(sqrhalfballsize) ) { //эхЄюўэюёЄ№ тшфэр
  1152.                                                         //if ((u8)tsqr[(i8)((DXTYPE)(tmpx-spriteList[j].x)>>5)+(128)] + (u8)tsqr[(i8)((DXTYPE)(tmpy-spriteList[j].y)>>5)+(128)] < (u8)(sqr(BALLSIZE>>5)/64) ) { //tsqr[i]=(u8)(((i-128)*(i-128))/64) //(tmpx-spriteList[j].x)>>4 ьюцхЄ эх яюьхёЄшЄ№ё  т срщЄ
  1153.         ld      a,(hl)//(_j)
  1154.                 //ld hl,#_moveballs_comparisons_1_1
  1155.                 //inc (hl)
  1156.         ld      e,a
  1157.         add     a,a
  1158.         add     a,a
  1159.         add     a,e
  1160.         add     a,a
  1161.         add     a,e
  1162.         add     a,#<_spriteList
  1163.         ld      l,a
  1164.         adc     a,#>_spriteList
  1165.         sub a,l
  1166.         ld      h,a
  1167.         ld      c,(hl)
  1168.         inc     hl
  1169.         ld      b,(hl)
  1170.         inc hl
  1171.         ex de,hl
  1172.         ld hl,(#_tmpx) //(#_moveballs_tmpx_1_1+0)
  1173.         or a,a //Єрър  ЄюўэюёЄ№ эх трцэр?
  1174.         sbc hl,bc
  1175.         push hl //tmpx-spriteList[j].x
  1176.         sra     h
  1177.         rr      l
  1178.         sra     h
  1179.         rr      l
  1180.         sra     h
  1181.         rr      l
  1182.         sra     h
  1183.         rr      l
  1184.         sra     h
  1185.         rr      l
  1186.         ex de,hl
  1187.         ld      c,(hl)
  1188.         inc     hl
  1189.         ld      b,(hl)
  1190.         ld hl,(#_tmpy) //(#_moveballs_tmpy_1_1+0)
  1191.         or a,a //Єрър  ЄюўэюёЄ№ эх трцэр?
  1192.         sbc hl,bc
  1193.         push hl //tmpy-spriteList[j].y
  1194.         sra     h
  1195.         rr      l
  1196.         sra     h
  1197.         rr      l
  1198.         sra     h
  1199.         rr      l
  1200.         sra     h
  1201.         rr      l
  1202.         sra     h
  1203.         rr      l
  1204.         ld bc,#_tsqr+0x80
  1205.         add hl,bc
  1206.         ex de,hl
  1207.         add hl,bc
  1208.         ld a,(de)
  1209.         add a,(hl)
  1210.         pop bc //tmpy-spriteList[j].y
  1211.         pop hl //tmpx-spriteList[j].x
  1212.         //jp C,9999500$
  1213.         cp a,#0x38 //#0xE1
  1214.         jp nc,00010$ //ъюэхЎ Ўшъыр ё тюёёЄрэютыхэшхь ЁхушёЄЁют
  1215.                                                                 //ёЄюыъэютхэшх:
  1216.                                                                 //эюЁьры№ ьхцфє °рЁрьш (ЁрчьхЁэюёЄ№ 1, Є.ъ. яюфЁрчєьхтрхЄё  эюЁьрышчрЎш )
  1217. //                                                              nx=(DXTYPE)(tmpx-spriteList[j].x)/(BALLSIZE>>4);
  1218.         push bc
  1219.         //push  bc
  1220.         ld      de,#0x0078
  1221.         //push  de
  1222.         //push  hl //tmpx-spriteList[j].x
  1223.         call    _DIVSIGNED //_divsint_rrx_s //hl = hl/de
  1224.         //pop   af
  1225.         //pop   af
  1226.         //pop   bc
  1227.         ld      (_nx),hl //(_moveballs_nx_1_1 + 0),hl
  1228. //                                                              ny=(DXTYPE)(tmpy-spriteList[j].y)/(BALLSIZE>>4);
  1229.         pop hl
  1230.         //push  bc
  1231.         ld      de,#0x0078
  1232.         //push  de
  1233.         //push  hl //tmpy-spriteList[j].y
  1234.         call    _DIVSIGNED //_divsint_rrx_s //hl = hl/de
  1235.         //pop   af
  1236.         //pop   af
  1237.         //pop   bc
  1238.         ld      (_ny),hl //(_moveballs_ny_1_1 + 0),hl
  1239.        
  1240.         call _docollide
  1241.  
  1242. 00010$: //ъюэхЎ Ўшъыр ё тюёёЄрэютыхэшхь ЁхушёЄЁют
  1243.         pop de //spritezonesaddr-1
  1244.         ld      hl,#_j
  1245. 00091$: //яхЁхьхээр  (+1=c)
  1246.         ld bc,#0x1000 //(_moveballs_xleft_1_1)
  1247. 00001$: //ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш  ЁхушёЄЁют
  1248.         //spritezonesaddr-=2;
  1249.         dec de
  1250.         //}//else collided[i][j]--;
  1251.         //ld    hl,#_j
  1252.         //inc   (hl)
  1253.         //ld    a,(_i)
  1254.         //sub   a,(hl)
  1255.         //jp    NZ,9999499$
  1256.         dec (hl)
  1257.         jp      p,00099$ //эрўрыю Ўшъыр balls in zone
  1258. __endasm;
  1259. //                              } while ((--j) != -1); //j
  1260.                         //} //ballsinzone
  1261. /*
  1262.                         } //i //sprites
  1263. */
  1264. }
  1265.  
  1266. void initboard()
  1267. {      
  1268.         static u8 xzone,yzone;
  1269.         //шэшЎшрышчрЎш  ярЁрьхЄЁют юс·хъЄют
  1270.  
  1271.         //for(i=0;i<SPRITES_ALL;++i) for(j=0;j<SPRITES_ALL;++j) collided[i][j]=0;
  1272.  
  1273.         for(i=0;i<SPRITES_ALL;++i) {
  1274. /*
  1275.                 spriteList[i].x=RNDLEFTMARGIN+(((u32)rand16()<<16)+rand16())%((u32)(RNDRIGHTMARGIN-RNDLEFTMARGIN));
  1276.                 spriteList[i].y=RNDTOPMARGIN+(((u32)rand16()<<16)+rand16())%((u32)(RNDBOTTOMMARGIN-RNDTOPMARGIN));
  1277. */
  1278.                 /*spriteList[i].x=(initial[i][0]);
  1279.                 spriteList[i].y=(initial[i][1]);*/
  1280.                 //while(spriteList[i].y>=RNDBOTTOMMARGIN){};
  1281.                 spriteList[i].dx=0;
  1282.                 spriteList[i].dy=0;
  1283.                 spriteList[i].color=i?(i&3):4;
  1284.                 spriteList[i].exist=1;
  1285.                 spriteList[i].wallcollided=0;
  1286.         };
  1287.  
  1288. spriteList[0].x = (u32)(MYX            )<<SHIFTCOORDS;spriteList[0].y = (u32)(MIDY           )<<SHIFTCOORDS;
  1289. spriteList[1].x = (u32)(PYRX           )<<SHIFTCOORDS;spriteList[1].y = (u32)(MIDY           )<<SHIFTCOORDS;
  1290. spriteList[2].x = (u32)(PYRX+1*PYRXSTEP)<<SHIFTCOORDS;spriteList[2].y = (u32)(MIDY+1*PYRYSTEP)<<SHIFTCOORDS;
  1291. spriteList[3].x = (u32)(PYRX+1*PYRXSTEP)<<SHIFTCOORDS;spriteList[3].y = (u32)(MIDY-1*PYRYSTEP)<<SHIFTCOORDS;
  1292. spriteList[4].x = (u32)(PYRX+2*PYRXSTEP)<<SHIFTCOORDS;spriteList[4].y = (u32)(MIDY+2*PYRYSTEP)<<SHIFTCOORDS;
  1293. spriteList[5].x = (u32)(PYRX+2*PYRXSTEP)<<SHIFTCOORDS;spriteList[5].y = (u32)(MIDY+0*PYRYSTEP)<<SHIFTCOORDS;
  1294. spriteList[6].x = (u32)(PYRX+2*PYRXSTEP)<<SHIFTCOORDS;spriteList[6].y = (u32)(MIDY-2*PYRYSTEP)<<SHIFTCOORDS;
  1295. spriteList[7].x = (u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS;spriteList[7].y = (u32)(MIDY+3*PYRYSTEP)<<SHIFTCOORDS;
  1296. spriteList[8].x = (u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS;spriteList[8].y = (u32)(MIDY+1*PYRYSTEP)<<SHIFTCOORDS;
  1297. spriteList[9].x = (u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS;spriteList[9].y = (u32)(MIDY-1*PYRYSTEP)<<SHIFTCOORDS;
  1298. spriteList[10].x =(u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS;spriteList[10].y =(u32)(MIDY-3*PYRYSTEP)<<SHIFTCOORDS;
  1299.  
  1300. /*
  1301.         for(i=0;i<SPRITES_ALL;++i) {
  1302.                 spriteList[i].dx=((ITYPE)((((u32)rand16()<<16)+rand16())%((u32)8<<SHIFTCOORDS))-((u32)4<<SHIFTCOORDS))/2; //rand16()&1?-1:1;
  1303.                 spriteList[i].dy=((ITYPE)((((u32)rand16()<<16)+rand16())%((u32)8<<SHIFTCOORDS))-((u32)4<<SHIFTCOORDS))/2; //rand16()&1?-1:1;
  1304.         }
  1305. */
  1306.         for(xzone=0;xzone<XZONES;++xzone) {
  1307.                 for(yzone=0;yzone<YZONES;++yzone) {
  1308.                         ballsinzone[((u16)yzone<<8)+xzone]=-1;
  1309.                 }
  1310.         };
  1311.  
  1312.         curplayer=0;
  1313.         for(i=0;i<MAXPLAYERS;++i) {
  1314.                 scores[i]=0;
  1315.         };
  1316. }
  1317.  
  1318.  
  1319. #define CUR_BRIM (2) /* яюых ё сюъют ъєЁёюЁр фю шуЁютюую яюы */
  1320. #define CUR_SIZE (7) /* ЁрчьхЁ ъєЁёюЁр */
  1321. #define CUR_CENTERSHIFT (3) /* ёфтшу ЎхэЄЁр ъєЁёюЁр юЄэюёшЄхы№эю хую ъююЁфшэрЄ */
  1322. #define CUR_XPERIOD (RIGHT-BRIM-SCRSHIFTX + CUR_BRIM - (LEFT+BRIM-SCRSHIFTX - CUR_BRIM-CUR_SIZE))
  1323. #define CUR_YPERIOD (BOTTOM-BRIM-SCRSHIFTY + CUR_BRIM - (TOP+BRIM-SCRSHIFTY - CUR_BRIM-CUR_SIZE))
  1324. #define CUR_PERIOD ((CUR_XPERIOD+CUR_YPERIOD)*2)
  1325.  
  1326. static u16 cur_x,cur_y;
  1327. static u8 plots;
  1328.  
  1329. void draw_cursor(void) {
  1330. #define SPRITE_CUR 32
  1331. #define SPRITE_DOT 34
  1332.         static u16 plot_x,plot_y;
  1333.         static u8 cur_xscr;
  1334.         static u8 k;
  1335.                 cur_xscr=(cur_x>>1);
  1336.                 set_sprite(j++,(cur_xscr>(160-8))?cur_xscr-4:cur_xscr,cur_y,SPRITE_CUR|((cur_x&1)?16:0)|((cur_xscr>(160-8))?1:0));
  1337.                 plots=5;
  1338.                 for (k=1;k<plots;k++) { //эр 1 ьхэ№°х, Є.ъ. эєыхтющ - ¤Єю ёрь °рЁ
  1339.                         plot_x=((k*((spriteList[0].x>>SHIFTCOORDS)-SCRSHIFTX-CUR_CENTERSHIFT+(ballsize/2)))+((plots-k)*(DXTYPE)cur_x))/plots;
  1340.                         plot_y=((k*((spriteList[0].y>>SHIFTCOORDS)-SCRSHIFTY+CUR_CENTERSHIFT-(ballsize/2)))+((plots-k)*(DXTYPE)cur_y))/plots;
  1341.                         cur_xscr=(plot_x>>1);
  1342.                         set_sprite(j++,(cur_xscr>(160-8))?cur_xscr-4:cur_xscr,plot_y,SPRITE_DOT|((plot_x&1)?16:0)|((cur_xscr>(160-8))?1:0));
  1343.                 }
  1344. }
  1345.  
  1346. void main(void)
  1347. {
  1348.         static DXTYPE vx,vy;
  1349.         static XTYPE len;
  1350.         static XTYPE tryx,tryy;
  1351.         static i16 cur_place,cur_speed;
  1352.         static u8 palette[16];
  1353.         static u8 curtime,oldtime,logictime,logicframe;
  1354.         static u8 ingame;
  1355.         static u8 power;
  1356.         static i8 powerspeed;
  1357.         static u8 k;
  1358.         u8* pkeys;
  1359.  
  1360. pocketcoords[0][0]=0; pocketcoords[0][1]=4;
  1361. pocketcoords[1][0]=0; pocketcoords[1][1]=4;
  1362. pocketcoords[2][0]=20;pocketcoords[2][1]=4;
  1363. pocketcoords[3][0]=39;pocketcoords[3][1]=4;
  1364. pocketcoords[4][0]=0; pocketcoords[4][1]=24;
  1365. pocketcoords[5][0]=20;pocketcoords[5][1]=24;
  1366. pocketcoords[6][0]=39;pocketcoords[6][1]=24;
  1367.  
  1368.         pal_select(PAL_BACK);
  1369.         prstr(12,14,"PRESS ANY KEY"/*presskey*/);
  1370.         swap_screen();
  1371.  
  1372.         while (1) {
  1373.                 rand16();
  1374.                 //яюыєўхэшх ёюёЄю эш  ъыртш°
  1375.                 vsync(); //for joystick
  1376.                 joy=joystick();
  1377.                 keyboard(keys);
  1378.                 k=0;
  1379.                 pkeys=keys;
  1380.                 for (i=0;i<40;++i) k|=/*keys[i]*/ *pkeys++;
  1381.                 if (joy || k) break;
  1382.         }
  1383.  
  1384.         //ў╕Ёэ√щ ¤ъЁрэ эр тЁхь  яюфуюЄютъш
  1385.  
  1386.         pal_bright(BRIGHT_MIN);
  1387.  
  1388.         //шэшЎшрышчрЎш  ЄрсышЎ√ ътрфЁрЄют
  1389.         i=0; do { tsqr[i]=(u8)(((i-128)*(i-128))/64); ++i; } while (i!=0);
  1390.  
  1391.         initboard();
  1392.        
  1393.  
  1394.         //т√тюф Їюэр эр Єхэхтющ ¤ъЁрэ
  1395.  
  1396.         draw_image(0,0,IMG_BACK);
  1397.         pal_select(PAL_BACK);
  1398.  
  1399.         //яхЁхъы■ўхэшх ¤ъЁрэют, ЄхяхЁ№ Їюэ эр тшфшьюь ¤ъЁрэх
  1400.  
  1401.         swap_screen();
  1402.  
  1403.         //чряєёъ ёяЁрщЄют
  1404.  
  1405.         sprites_start();
  1406.  
  1407.         //єёЄрэютър эюЁьры№эющ  ЁъюёЄш
  1408.  
  1409.         pal_bright(BRIGHT_MID);
  1410.  
  1411.  
  1412.         pyramidshot=1; //яхЁт√щ єфрЁ (Ёрчсштрхь яшЁрьшфє)
  1413.         cur_place=CUR_YPERIOD/2; //яю ўрёютющ ёЄЁхыъх юЄ яЁртюую тхЁїэхую єуыр
  1414.         ballvalue=FIRSTBALLVALUE;
  1415.         winpocket=0;
  1416.         curpocket=0;
  1417.         //уыртэ√щ Ўшъы
  1418. while(1) {
  1419.  
  1420.         if ((!winpocket) && (!(rand16()&0x8000))) {
  1421.                 winpocket=(rand16()%6)+1;
  1422.         }
  1423.  
  1424.         //scores[0]+=10;
  1425.         prscores();
  1426.         ingame=0;
  1427.         cur_speed=0;
  1428.  
  1429.         oldtime = time()-1;
  1430.         //єяЁрты хь
  1431.         while(!ingame) {
  1432.                 //cur_x=LEFT+BRIM-SCRSHIFTX - CUR_BRIM-CUR_SIZE;
  1433.                 //cur_x=RIGHT-BRIM-SCRSHIFTX + CUR_BRIM;
  1434.                 //cur_y=100;
  1435.                 //яю ўрёютющ ёЄЁхыъх юЄ яЁртюую тхЁїэхую єуыр
  1436.                 if (cur_place<CUR_YPERIOD) { //яЁртр  ёЄюЁюэр
  1437.                         cur_x=RIGHT-BRIM-SCRSHIFTX + CUR_BRIM;
  1438.                         cur_y=(TOP+BRIM-SCRSHIFTY -9 - CUR_BRIM-CUR_SIZE) + cur_place;
  1439.                 }
  1440.                 else if (cur_place<(CUR_YPERIOD+CUR_XPERIOD)) { //эшцэ   ёЄюЁюэр (ёяЁртр эрыхтю)
  1441.                         cur_x=(RIGHT-BRIM-SCRSHIFTX + CUR_BRIM) - (cur_place-CUR_YPERIOD);
  1442.                         cur_y=BOTTOM-BRIM-SCRSHIFTY -9 + CUR_BRIM;
  1443.                 }
  1444.                 else if (cur_place<(CUR_YPERIOD+CUR_XPERIOD+CUR_YPERIOD)) { //ыхтр  ёЄюЁюэр (ёэшчє ттхЁї)
  1445.                         cur_x=LEFT+BRIM-SCRSHIFTX - CUR_BRIM-CUR_SIZE;
  1446.                         cur_y=(BOTTOM-BRIM-SCRSHIFTY -9 + CUR_BRIM) - (cur_place-(CUR_YPERIOD+CUR_XPERIOD));
  1447.                 }
  1448.                 else { //тхЁїэ   ёЄюЁюэр
  1449.                         cur_x=(LEFT+BRIM-SCRSHIFTX - CUR_BRIM-CUR_SIZE) + (cur_place-(CUR_YPERIOD+CUR_XPERIOD+CUR_YPERIOD));
  1450.                         cur_y=TOP+BRIM-SCRSHIFTY -9 - CUR_BRIM-CUR_SIZE;
  1451.                 }
  1452.  
  1453.                 //чряюыэхэшх ёяшёър ёяЁрщЄют
  1454.                 j=0;
  1455.                 draw_sprites();
  1456.                 draw_cursor();
  1457.                 set_sprite(j,0,0,SPRITE_END);
  1458.                 swap_screen();
  1459.                
  1460.                 //яюыєўхэшх ёюёЄю эш  ъыртш°
  1461.                 keyboard(keys);
  1462.                 //vsync(); //for joystick
  1463.                 joy=joystick();
  1464.  
  1465.                 curtime = time();
  1466.                 logictime = curtime-oldtime;
  1467.                 oldtime = curtime;
  1468.                 for (logicframe = 0 ; logicframe < logictime; logicframe++)
  1469.                 {
  1470.  
  1471.                 //if(gameover==0)
  1472.                 {
  1473.                         if(joy&JOY_FIRE) { joy=JOY_FIRE; ingame=1;}
  1474.                         if(joy&JOY_LEFT) { joy=JOY_LEFT; cur_speed++; if (cur_speed<8)cur_speed=8; cur_place-=(cur_speed/8);}
  1475.                         if(joy&JOY_RIGHT) { joy=JOY_RIGHT; cur_speed++; if (cur_speed<8)cur_speed=8; cur_place+=(cur_speed/8);}
  1476.                         if(!(joy&(JOY_LEFT|JOY_RIGHT))) cur_speed=0;
  1477.                         if (cur_place<0) cur_place+=CUR_PERIOD;
  1478.                         if (cur_place>=CUR_PERIOD) cur_place-=CUR_PERIOD;
  1479.                         //if(joy&JOY_UP) { joy=JOY_UP; move_up();}
  1480.                         //if(joy&JOY_DOWN) { joy=JOY_DOWN; move_down();}
  1481.  
  1482.                         //юсэютыхэшх ¤ъЁрэр
  1483.                         //if(joy==0) put_board();
  1484.  
  1485.                         //if (check_gameover()!=0) do_gameover();
  1486.  
  1487.                         //if (win==1) {win++; do_win();};
  1488.                 }
  1489.  
  1490.                 }
  1491.                
  1492.                 //if(keys[KEY_R]&KEY_PRESS) new_game();
  1493.         }
  1494.  
  1495.         //Єръшх цх ёяЁрщЄ√ эр тЄюЁюь ¤ъЁрэх
  1496.                 j=0;
  1497.                 draw_sprites();
  1498.                 //set_sprite(j++,(cur_xscr>(160-8))?cur_xscr-4:cur_xscr,cur_y,SPRITE_CUR|((cur_x&1)?16:0)|((cur_xscr>(160-8))?1:0));
  1499.                 draw_cursor();
  1500.                 set_sprite(j,0,0,SPRITE_END);
  1501.                 swap_screen();
  1502.  
  1503.        
  1504.         oldtime = time()-1;
  1505.         //эрсшЁрхь ёъюЁюёЄ№
  1506.         power=0;
  1507.         powerspeed=+1;
  1508.         do {
  1509.                 //j=0;
  1510.                 //draw_sprites();
  1511.                 //set_sprite(j++,(cur_xscr>(160-8))?cur_xscr-4:cur_xscr,cur_y,SPRITE_CUR|((cur_x&1)?16:0)|((cur_xscr>(160-8))?1:0));
  1512.                 //set_sprite(j,0,0,SPRITE_END);
  1513.                 prpower(power);
  1514.                 //prnum(0,10,power);
  1515.                 swap_screen();
  1516.  
  1517.                 //яюыєўхэшх ёюёЄю эш  ъыртш°
  1518.                 keyboard(keys);
  1519.                 //vsync(); //for joystick
  1520.                 joy=joystick();
  1521.  
  1522.                 curtime = time();
  1523.                 logictime = curtime-oldtime;
  1524.                 oldtime = curtime;
  1525.                 for (logicframe = 0 ; logicframe < logictime; logicframe++)
  1526.                 {
  1527.                         if(joy&JOY_FIRE) {
  1528.                                 power+=powerspeed;
  1529.                                 if ((power==0)||(power==63)) powerspeed=-powerspeed;
  1530.                                 //power=(power+1)&63;
  1531.                         } else {
  1532.                                 ingame=2;
  1533.                         }
  1534.                 }
  1535.        
  1536.         }while(ingame!=2);
  1537.         i = 0;
  1538. //ёъюЁюёЄ№ = хфшэшўэ√щ тхъЄюЁ * power
  1539.         vx = (DXTYPE)(cur_x-CUR_CENTERSHIFT+SCRSHIFTX)-(spriteList[i].x>>SHIFTCOORDS);
  1540.         vy = (DXTYPE)(cur_y+CUR_CENTERSHIFT+SCRSHIFTY)-(spriteList[i].y>>SHIFTCOORDS);
  1541.         //prnum(1,0,vx);
  1542.         //prnum(1,10,vy);
  1543.         len = lsqrt(SQR(ABS(vx)) + SQR(ABS(vy))); //OK
  1544.         //prnum(1,20,len);
  1545.         //prnum(2,20,power);
  1546.         vx = ((ITYPE)vx * 8) * (ITYPE)power / len;
  1547.         vy = ((ITYPE)vy * 8) * (ITYPE)power / len;
  1548.         spriteList[0].dx=vx;
  1549.         spriteList[0].dy=vy;
  1550.         //prnum(2,0,spriteList[0].dx);
  1551.         //prnum(2,10,spriteList[0].dy);
  1552.         spriteList[i].exist=2; //фтшцхЄё 
  1553.  
  1554.         //єёЄрэртыштрхь ёъюЁюёЄш °рЁшъют
  1555.         for(i=1;i<SPRITES_ALL;++i) {
  1556.                 spriteList[i].dx=0;
  1557.                 spriteList[i].dy=0;
  1558.         }
  1559.  
  1560.         pocketballs=0;
  1561.         washit=0;
  1562.         bonusballvalue=0; //сюэєё т Єхъє∙хь єфрЁх (сєфхЄ ЁрёЄш ё ърцф√ь чрсшЄ√ь т ¤Єюь єфрЁх °рЁшъюь)
  1563.         oldtime = time()-1;
  1564.         //фхырхь їюф
  1565.         do {
  1566.                 //чряюыэхэшх ёяшёър ёяЁрщЄют
  1567.                 j=0;
  1568.                 draw_sprites();
  1569.                 set_sprite(j,0,0,SPRITE_END);
  1570.  
  1571.                 //яхЁхьх∙хэшх юс·хъЄют
  1572.                 curtime = time();
  1573.                 logictime = (curtime-oldtime)*2;
  1574.                 oldtime = curtime;
  1575.                 for (logicframe = 0 ; logicframe < logictime; logicframe++)
  1576.                 {
  1577.                         //comparisons=0;
  1578.                         movingballs=0;
  1579.                         slowphase++;
  1580.                         for(i=0;i<SPRITES_ALL;++i) if (spriteList[i].exist==2) //фтшцхЄё 
  1581.                         {
  1582.                                 moveball();
  1583.                         }
  1584.                         uncollideballs();                        
  1585.                         for(i=0;i<SPRITES_ALL;++i) if (spriteList[i].exist) //ёЄюшЄ шыш фтшцхЄё 
  1586.                         {
  1587.                                 preparecollideball();
  1588.                                 if (xzone && i) /*т чюэрї °рЁшър ўЄю-Єю хёЄ№ ш °рЁшъ эх ╣0 (ўЄюс√ ъЁєЄшЄ№ Ўшъы j=i-1...0)*/
  1589.                                 {
  1590.                                         spritezonesaddr=spritezones+i+i-1;
  1591.                                         collideball();
  1592.                                 }
  1593.                         }
  1594.  
  1595.                 } //logicframes
  1596.                 //spritezonesaddr+=2; //эрфю фы  Єюую, ўЄюс√ яхЁхьхээр  эх тюёяЁшэ ырё№ ъръ ъюэёЄрэЄр (эх яюьюурхЄ)
  1597.  
  1598.                 //prnum(0,0,comparisons);
  1599.                 //przones(1,0);
  1600.                 //prnum(2,0,xshow);
  1601.                 //prnum(2,10,yshow);
  1602.                
  1603.                 //юсэютыхэшх ¤ъЁрэр, ёяЁрщЄ√ т√тюф Єё  ртЄюьрЄшўхёъш
  1604.                 swap_screen();
  1605.         }while(movingballs);
  1606.         bonusballvalue=0; //сюэєё т Єхъє∙хь єфрЁх (сєфхЄ ЁрёЄш ё ърцф√ь чрсшЄ√ь т ¤Єюь єфрЁх °рЁшъюь)
  1607.        
  1608.         //prnum(0,0,0/*power*/);
  1609.         prpower(0/*power*/);
  1610.  
  1611.         //ёў╕Є
  1612. //хёыш єфрЁ єфрўэ√щ, Ўхэр °рЁшър ЁрёЄ╕Є
  1613.         if (pocketballs) {
  1614.                 sfx_play(SFX_POCKET,0);
  1615.                 ballvalue+=CONTINUOUSBALLBONUS;
  1616.         }
  1617.  
  1618.         //хёыш эшўхую эх чрсшы (эх эр Ёрчсштъх яшЁрьшф√) шыш яюЄхЁ ы сшЄюъ, Єю эрфю ёьхэшЄ№ шуЁюър (Єюы№ъю эх фтр Ёрчр, ёь. эшцх)
  1619.         if (((pocketballs+pyramidshot)==0)||(!(spriteList[0].exist))) {
  1620.                 //хёыш яюЄхЁ ы сшЄюъ - °ЄЁрЇ (єцх яюёўшЄрэ яЁш яюЄхЁх)
  1621.                 /*if (!(spriteList[0].exist)) {
  1622.                         sfx_play(SFX_POCKET_MAIN,0);
  1623.                         scores[curplayer]-=POCKETMAINMALUS;
  1624.                 }*/
  1625.                 //хёыш эх єфрЁшы фЁєующ °рЁ - °ЄЁрЇ
  1626.                 if (!washit) {
  1627.                         sfx_play(SFX_POCKET_MAIN,0);
  1628.                         scores[curplayer]-=NOHITMALUS;
  1629.                 }
  1630.                 curplayer++; if (curplayer>=MAXPLAYERS) curplayer=0;
  1631.                 ballvalue=FIRSTBALLVALUE; //ёсЁрё√трхь Ўхэє °рЁшър
  1632.         }
  1633.  
  1634.         prscores();
  1635.  
  1636.         //хёыш сшЄюъ яюЄхЁ э, ёЄртшь хую ёэютр
  1637.         if (!(spriteList[0].exist))
  1638.         {
  1639.                 //curplayer++; if (curplayer>=MAXPLAYERS) curplayer=0;
  1640.                 spriteList[0].exist=1;
  1641.                 tryx=(LEFT+64)<<SHIFTCOORDS;
  1642.                 tryy=((TOP+(BOTTOM-ballsize))/2)<<SHIFTCOORDS;
  1643.                 do {
  1644.                         ingame=0;
  1645.                         for (i=1;i<SPRITES_ALL;++i) if(spriteList[i].exist) {
  1646.                                 if( ((spriteList[i].x-(tryx-BALLSIZE))<(BALLSIZE*2))
  1647.                                  && ((spriteList[i].y-(tryy-BALLSIZE))<(BALLSIZE*2)) ) ingame=1; //яхЁхёхўхэшх
  1648.                         }
  1649.                         if (ingame) { //яхЁхёхўхэшх - яЁюсєхь фЁєушх ъююЁфшэрЄ√
  1650.                                 tryy+=(16<<SHIFTCOORDS);
  1651.                                 if (tryy > (((TOP+(BOTTOM-ballsize))/2+50)<<SHIFTCOORDS) ) {
  1652.                                         tryy=((TOP+(BOTTOM-ballsize))/2-50)<<SHIFTCOORDS;
  1653.                                         tryx+=(16<<SHIFTCOORDS);
  1654.                                 }
  1655.                         }
  1656.                 } while (ingame!=0);
  1657.                 spriteList[0].x=tryx;
  1658.                 spriteList[0].y=tryy;
  1659.         }
  1660.         pyramidshot=0;
  1661.        
  1662. }
  1663. }