Blame |
Last modification |
View Log
| Download
| RSS feed
#include <evo.h>
#include "functions.h"
#include "resources.h"
#define SFX_BUM 0
#define SFX_POCKET 1
#define SFX_BUM2 2
#define SFX_POCKET_MAIN 3
#define SFX_WINPOCKET 4
#define SPRITES_ALL 11 //11 //20 °рЁшъют Є эхЄ яЁш 130000t, 17 яЁш 100000t ё ЄЁєфюь
#define FIRSTBALLVALUE 10 /*эрўры№эр Ўхэр °рЁр*/
#define CONTINUOUSBALLBONUS 10 /*яю ёЄюы№ъю ЁрёЄ╕Є Ўхэр °рЁр яюёых єфрўэюую їюфр*/
#define DOUBLEBALLBONUS 25 /*яю ёЄюы№ъю ЁрёЄ╕Є т√шуЁ√° чр ърцф√щ ёыхфє■∙шщ °рЁ яЁш фтющэюь яюярфрэшш*/
#define POCKETMAINMALUS 15 /*°ЄЁрЇ чр яюЄхЁ■ сшЄър*/
#define NOHITMALUS 10 /*°ЄЁрЇ чр эхяюярфрэшх яю °рЁє*/
#define WINPOCKETFACTOR 2 /*ъю¤ЇЇшЎшхэЄ яЁш яюярфрэшш т ыєчє winpocket*/
#define WRONGX 64/*0*/ /* фы exist==0, ўЄюс√ эх яЁютхЁ Є№ exist */
#define WRONGY 224/*0*/ /* фы exist==0, ўЄюс√ эх яЁютхЁ Є№ exist */
#define XTYPE u16
#define DXTYPE i16
#define UTYPE u32 /* фы dist ш SQR(BALLSIZE) */
#define ITYPE i32 /* фы p */
#define SHIFTCOORDS 7
#define SCRSHIFTX 16
#define SCRSHIFTY 16
#define LEFTMARGIN (((XTYPE)(LEFT+2))<<SHIFTCOORDS) /*чрярё эр ёЁртэхэшх ъююЁфшэрЄ -BALLSIZE т схччэръют√ї ш яхЁхяюыэхэшх x-dx*/
#define RIGHTMARGIN (((XTYPE)(RIGHT-2-ballsize))<<SHIFTCOORDS)
#define TOPMARGIN (((XTYPE)(TOP+2))<<SHIFTCOORDS) /*чрярё эр ёЁртэхэшх ъююЁфшэрЄ -BALLSIZE т схччэръют√ї ш яхЁхяюыэхэшх y-dy*/
#define BOTTOMMARGIN (((XTYPE)(BOTTOM-2-ballsize))<<SHIFTCOORDS)
#define RNDLEFTMARGIN (LEFTMARGIN+(16<<SHIFTCOORDS))
#define RNDRIGHTMARGIN (RIGHTMARGIN-(16<<SHIFTCOORDS))
#define RNDTOPMARGIN (TOPMARGIN+(16<<SHIFTCOORDS))
#define RNDBOTTOMMARGIN (BOTTOMMARGIN-(16<<SHIFTCOORDS))
#define CHECKMAXSPEED
#define MAXSPEED ((DXTYPE)(4<<SHIFTCOORDS))
#define ballsize 15
#define sqrhalfballsize (ballsize*ballsize/4)
#define BALLSIZE (ballsize<<SHIFTCOORDS)
#define BRIM 11
#define TOP (32+SCRSHIFTY)
#define BOTTOM (200+SCRSHIFTY)
#define LEFT (0+SCRSHIFTX)
#define RIGHT (320+SCRSHIFTX)
#define MIDX (160+SCRSHIFTX)
#define POCKETSIZE 28/*24*/
#define CORNERSIZE 24
#define CORNERLEFT (LEFT+(CORNERSIZE-BRIM))
#define CORNERRIGHT (RIGHT-(CORNERSIZE-BRIM))
#define CORNERTOP (TOP+(CORNERSIZE-BRIM))
#define CORNERBOTTOM (BOTTOM-(CORNERSIZE-BRIM))
#define TOPY (TOP+BRIM)
#define TOPLEFTMINX (LEFT+CORNERSIZE)
#define TOPLEFTMAXX (MIDX-(POCKETSIZE/2))
#define TOPRIGHTMINX (MIDX+(POCKETSIZE/2))
#define TOPRIGHTMAXX (RIGHT-CORNERSIZE)
#define BOTTOMY (BOTTOM-BRIM)
#define BOTTOMLEFTMINX TOPLEFTMINX
#define BOTTOMLEFTMAXX TOPLEFTMAXX
#define BOTTOMRIGHTMINX TOPRIGHTMINX
#define BOTTOMRIGHTMAXX TOPRIGHTMAXX
#define LEFTX (LEFT+BRIM)
#define LEFTMINY (TOP+CORNERSIZE)
#define LEFTMAXY (BOTTOM-CORNERSIZE)
#define RIGHTX (RIGHT-BRIM)
#define RIGHTMINY LEFTMINY
#define RIGHTMAXY LEFTMAXY
#define MAGNETSIZE 5
#define MAGNETSPEED 20
#define MIDY ((TOPY+BOTTOMY-ballsize)/2)
#define MYX ((MIDX+LEFT)/2)
#define PYRX ((MIDX+RIGHT)/2)
#define PYRXSTEP (ballsize)
#define PYRYSTEP (PYRXSTEP*50/87) /* / (sqrt(3))*/
//XTYPE initial[SPRITES_ALL]={};
/*XTYPE initial[SPRITES_ALL][2]={
{(u32)(MYX )<<SHIFTCOORDS,(u32)(MIDY )<<SHIFTCOORDS},
{(u32)(PYRX )<<SHIFTCOORDS,(u32)(MIDY )<<SHIFTCOORDS},
{(u32)(PYRX+1*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+1*PYRYSTEP)<<SHIFTCOORDS},
{(u32)(PYRX+1*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY-1*PYRYSTEP)<<SHIFTCOORDS},
{(u32)(PYRX+2*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+2*PYRYSTEP)<<SHIFTCOORDS},
{(u32)(PYRX+2*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+0*PYRYSTEP)<<SHIFTCOORDS},
{(u32)(PYRX+2*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY-2*PYRYSTEP)<<SHIFTCOORDS},
{(u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+3*PYRYSTEP)<<SHIFTCOORDS},
{(u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY+1*PYRYSTEP)<<SHIFTCOORDS},
{(u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY-1*PYRYSTEP)<<SHIFTCOORDS},
{(u32)(PYRX+3*PYRXSTEP)<<SHIFTCOORDS,(u32)(MIDY-3*PYRYSTEP)<<SHIFTCOORDS},
};*/
//°рЁшъ эх фюыцхэ яюярфрЄ№ т ЄЁряхЎш■ ьхцфє ыєчрьш, эю юЄёъюъ Ёрчэ√щ т чртшёшьюёЄш юЄ ёЄюЁюэ√, ъюЄюЁє■ юэ яхЁхё╕ъ
//юЄ тхЁЄшърыш: dx=-dxold
//юЄ уюЁшчюэЄрыш: dy=-dyold
//юЄ фшруюэрыш ыхтющ тхЁїэхщ шыш яЁртющ эшцэхщ ыєч√: dx=dyold, dy=dxold
//юЄ фшруюэрыш яЁртющ тхЁїэхщ шыш ыхтющ эшцэхщ ыєч√: dx=-dyold, dy=-dxold
//юЄ єуыр (ёшыр ЁхръЎшш эряЁртыхэр яхЁяхэфшъєы Ёэю, Є.х. ъ ЎхэЄЁє): ъръ яЁш ёЄюыъэютхэшш °рЁшъют
//ъююЁфшэрЄ√ °рЁшър = xleft,ytop = ъююЁфшэрЄ√ ыхтюую тхЁїэхую єуыр хую bounding box яы■ё SCRSHIFT
//ъююЁфшэрЄ√ юуЁрэшўшЄхыхщ Єюцх яы■ё SCRSHIFT
//яюёўшЄрхь x,y (ЎхэЄЁ), ytop, ybottom, xleft, xright
//ьюцэю яЁютхЁ Є№ яЁш Їырух т ёхЄъх[x,y], Єрь эюьхЁ тхЄъш яЁютхЁъш
//яЁютхЁъш тхЁїэшї ыєч Єюы№ъю яЁш ytop<TOPY (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш ):
//яхЁхёхўхэшх ыхтющ ўрёЄш тхЁїэхщ уюЁшчюэЄрыш: (x>TOPLEFTMINX) && (x<TOPLEFTMAXX) //&& (ytop<TOPY)
//яхЁхёхўхэшх тхЁїэхщ фшруюэрыш ыхтющ тхЁїэхщ ыєч√: (x<=TOPLEFTMINX) && ((y-x-(ballsize*7/10))<(TOP-CORNERLEFT))
//яхЁхёхўхэшх яЁртющ ўрёЄш тхЁїэхщ уюЁшчюэЄрыш: (x>TOPRIGHTMINX) && (x<TOPRIGHTMAXX) //&& (ytop<TOPY)
//яхЁхёхўхэшх тхЁїэхщ фшруюэрыш яЁртющ тхЁїэхщ ыєч√: (x>=TOPRIGHTMAXX) && ((y+x-(ballsize*7/10))<(TOP+CORNERRIGHT))
//if (y<TOPY) {
//яхЁхёхўхэшх ыхтющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((TOPLEFTMAXX-xleft)<ballsize) //&& (y<TOPY)
//яхЁхёхўхэшх яЁртющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((xright-TOPRIGHTMINX)<ballsize) //&& (y<TOPY)
//} else {
//ъюэЄръЄ ё ыхт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-TOPLEFTMAXX)+sqr(y-TOPY))<sqrhalfballsize)
//ъюэЄръЄ ё яЁрт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-TOPRIGHTMINX)+sqr(y-TOPY))<sqrhalfballsize)
//ъюэЄръЄ ё тхЁїэшь єуыюь ыхтющ тхЁїэхщ ыєч√: ((sqr(x-TOPLEFTMINX)+sqr(y-TOPY))<sqrhalfballsize)
//ъюэЄръЄ ё тхЁїэшь єуыюь яЁртющ тхЁїэхщ ыєч√: ((sqr(x-TOPRIGHTMAXX)+sqr(y-TOPY))<sqrhalfballsize)
//}
//яЁютхЁъш эшцэшї ыєч Єюы№ъю яЁш ybottom>BOTTOMY (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш ):
//яхЁхёхўхэшх ыхтющ ўрёЄш эшцэхщ уюЁшчюэЄрыш: (x>BOTTOMLEFTMINX) && (x<BOTTOMLEFTMAXX) //&& (ybottom>BOTTOMY)
//яхЁхёхўхэшх эшцэхщ фшруюэрыш ыхтющ эшцэхщ ыєч√: (x<=BOTTOMLEFTMINX) && ((y+x+(ballsize*7/10))>(BOTTOM+CORNERLEFT))
//яхЁхёхўхэшх яЁртющ ўрёЄш эшцэхщ уюЁшчюэЄрыш: (x>BOTTOMRIGHTMINX) && (x<BOTTOMRIGHTMAXX) //&& (ybottom>BOTTOMY)
//яхЁхёхўхэшх эшцэхщ фшруюэрыш яЁртющ эшцэхщ ыєч√: (x>=BOTTOMRIGHTMAXX) && ((y-x+(ballsize*7/10))>(BOTTOM-CORNERRIGHT))
//if (y>BOTTOMY) {
//яхЁхёхўхэшх ыхтющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((BOTTOMLEFTMAXX-xleft)<ballsize) //&& (y>BOTTOMY)
//яхЁхёхўхэшх яЁртющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((xright-BOTTOMRIGHTMINX)<ballsize) //&& (y>BOTTOMY)
//} else {
//ъюэЄръЄ ё ыхт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-BOTTOMLEFTMAXX)+sqr(y-BOTTOMY))<sqrhalfballsize)
//ъюэЄръЄ ё яЁрт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-BOTTOMRIGHTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
//ъюэЄръЄ ё эшцэшь єуыюь ыхтющ эшцэхщ ыєч√: ((sqr(x-BOTTOMLEFTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
//ъюэЄръЄ ё эшцэшь єуыюь яЁртющ эшцэхщ ыєч√: ((sqr(x-BOTTOMRIGHTMAXX)+sqr(y-BOTTOMY))<sqrhalfballsize)
//}
//яЁютхЁъш ыхтющ ёЄюЁюэ√ Єюы№ъю яЁш xleft<LEFTX (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш )
//яхЁхёхўхэшх ыхтющ тхЁЄшърыш: (y>LEFTMINY) && (y<LEFTMAXY) //&& (xleft<LEFTX)
//яхЁхёхўхэшх эшцэхщ фшруюэрыш ыхтющ тхЁїэхщ ыєч√: (y<=LEFTMINY) && ((y-x+(ballsize*7/10))>(CORNERTOP-LEFT))
//яхЁхёхўхэшх тхЁїэхщ фшруюэрыш ыхтющ эшцэхщ ыєч√: (y>=LEFTMAXY) && ((y+x-(ballsize*7/10))<(CORNERBOTTOM+LEFT))
//ъюэЄръЄ ё эшцэшь єуыюь ыхтющ тхЁїэхщ ыєч√: ((sqr(x-LEFTX)+sqr(y-LEFTMINY))<sqrhalfballsize)
//ъюэЄръЄ ё тхЁїэшь єуыюь ыхтющ эшцэхщ ыєч√: ((sqr(x-LEFTX)+sqr(y-LEFTMAXY))<sqrhalfballsize)
//яЁютхЁъш яЁртющ ёЄюЁюэ√ Єюы№ъю яЁш xright>RIGHTX (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш )
//яхЁхёхўхэшх яЁртющ тхЁЄшърыш: (y>RIGHTMINY) && (y<RIGHTMAXY) //&& (xright>RIGHTX)
//яхЁхёхўхэшх эшцэхщ фшруюэрыш яЁртющ тхЁїэхщ ыєч√: (y<=RIGHTMINY) && ((y+x+(ballsize*7/10))>(CORNERTOP+RIGHT))
//яхЁхёхўхэшх тхЁїэхщ фшруюэрыш яЁртющ эшцэхщ ыєч√: (y>=RIGHTMAXY) && ((y-x-(ballsize*7/10))<(CORNERBOTTOM-RIGHT))
//ъюэЄръЄ ё эшцэшь єуыюь яЁртющ тхЁїэхщ ыєч√: ((sqr(x-RIGHTX)+sqr(y-RIGHTMINY))<sqrhalfballsize)
//ъюэЄръЄ ё тхЁїэшь єуыюь яЁртющ эшцэхщ ыєч√: ((sqr(x-RIGHTX)+sqr(y-RIGHTMAXY))<sqrhalfballsize)
//ёЄЁєъЄєЁр юс·хъЄр
struct spriteStruct
{
XTYPE x
,y
; //ъююЁфшэрЄ√
DXTYPE dx
,dy
; //фхы№Є√ ёъюЁюёЄш
u8 color
;
u8 exist
; //0=юЄёєЄёЄтєхЄ, 1=ёЄюшЄ, 2=хфхЄ
u8 wallcollided
;
};
//ёяшёюъ юс·хъЄют
struct spriteStruct spriteList
[SPRITES_ALL
];
volatile u8 spritezones
[SPRITES_ALL
*2];
#define ZONESHIFT 4
#define XZONES ((320>>ZONESHIFT)+1)
#define YZONES ((256/*200*/>>ZONESHIFT)+1)
volatile i8 ballsinzone
[(YZONES
+1)<<8];
volatile u8 slowphase
;
volatile XTYPE tmpx
,tmpy
;
volatile u16 tmpxscr
;
volatile u8 xzone
,yzone
;
volatile u8
* spritezonesaddr
;
volatile DXTYPE nx
,ny
,px
,py
,tempdx
,tempdy
;
volatile i8 p
; //DXTYPE //ITYPE
volatile u8
* addr
;
volatile XTYPE tmpnewx
,tmpnewy
;
volatile XTYPE tmpxmin
,tmpymin
;
volatile DXTYPE dxold
,dyold
;
volatile XTYPE sqrdy
; //UTYPE эєцэю фы ътрфЁрЄр Єюўэ√ї ъююЁфшэрЄ, р ЄєЄ эхЄюўэ√х
//NU
//u8 collided[SPRITES_ALL][SPRITES_ALL];
//0 -ьюцэю яЁютхЁ Є№ ёЄюыъэютхэшх
//>0 - ёЄрыъштрышё№, ёўшЄрхь ЄрщьрєЄ, Єхъє∙хх ёЄюыъэютхэшх шуэюЁшЁєхь
volatile u8 i
,j
;
volatile XTYPE x
,y
,xleft
,xright
,ytop
,ybottom
;
volatile u8 movingballs
,pocketballs
,pyramidshot
,washit
;
volatile u16 ballvalue
/*эр эрўрыю єфрЁр*/,bonusballvalue
/*сюэєё, яю ты хЄё тю тЁхь єфрЁр*/;
volatile u8 winpocket
,curpocket
; //0 шыш 1..6
volatile u8 pocketfactor
;
static u8 key
;
static u8 keys
[40];
static u8 joy
;
#define MAXPLAYERS 2
static i16 scores
[MAXPLAYERS
];
static u8 curplayer
;
#define ABS(x) (((x)<0)?(-x):(x))
#define sqr(x) ((x)*(x))
#define SQR(x) ((ITYPE)((UTYPE)(x)*(UTYPE)(x)))
static u8 tsqr
[256];
#define DOTPRODUCT(x1,y1,x2,y2) ((x1)*(x2)+(y1)*(y2))
//static XTYPE xshow=BOTTOMLEFTMINX,yshow=BOTTOMY;
static u8 output_x
,output_y
;
static u8 oldoutput_x
,oldoutput_y
;
static char tnnn
[4];//="012";
static char tscore
[7];//="012345";
//static char* presskey="PRESS ANY KEY"; //Єръ эх ЁрсюЄрхЄ
u8 pocketcoords
[7][2];
unsigned int lsqrt
(unsigned long arg
){
char count
=16;
unsigned long res
=0,tmp
=0;
if(arg
!=0){
if(!(arg
&0xFF000000)){arg
<<=8;count
-=4;}
res
=1;
while((tmp
<1)&&(count
)){
count
--;
if(arg
&0x80000000UL
)tmp
|=2;
if(arg
&0x40000000UL
)tmp
|=1;
arg
<<=2;
};//яюшёъ яхЁтющ 1-√
tmp
--;
for(count
;count
;count
--){
tmp
<<=2;
res
<<=1;
if(arg
&0x80000000UL
)tmp
|=2;
if(arg
&0x40000000UL
)tmp
|=1;
arg
<<=2;
if( tmp
>=((res
<<1)|1)){
tmp
-=((res
<<1)|1);
res
|=1;
}
}
}
return (unsigned int)res
;
}
//т√тюф юфэюую ёшьтюыр эр ¤ъЁрэ ё ртЄюьрЄшўхёъшь шчьхэхэшхь
//яючшЎшш т√тюфр, Єръцх ёшьтюы '\n' яхЁхтюфшЄ ёЄЁюъє
void put_char
(u8 n
)
{
if(n
>=' '&&n
<='Z') draw_tile
(output_x
,output_y
,n
-' ');
++output_x
;
if(output_x
==39||n
=='\n')
{
output_x
=1;
++output_y
;
if(output_y
==24) output_y
=1;
}
}
//т√тюф ёЄЁюъш ёшьтюыют
void put_str
(u8
* str
)
{
u8 i
;
while(1)
{
i
=*str
++;
if(!i
) break;
put_char
(i
);
}
}
void prstr
(u8 y
,u8 x
,u8
* str
)
{
select_image
(IMG_FONT
);
output_x
=x
;
output_y
=y
;
put_str
(str
);
}
void prnum
(u8 y
,u8 x
,i16 hiscore
)
{
select_image
(IMG_FONT
);
if (hiscore
<(i16
)0) {
tscore
[0]='-';
hiscore
=-hiscore
;
} else {
tscore
[0]=' ';
};
tscore
[1]='0'+(hiscore
)/10000;
tscore
[2]='0'+(hiscore
%10000)/1000;
tscore
[3]='0'+(hiscore
%1000)/100;
tscore
[4]='0'+(hiscore
%100)/10;
tscore
[5]='0'+(hiscore
%10);
output_x
=x
;
output_y
=y
;
put_str
(tscore
);
}
void prnnn
(u8 y
,u8 x
,i16 hiscore
)
{
select_image
(IMG_FONT
);
tnnn
[0]='0'+(hiscore
)/100;
tnnn
[1]='0'+(hiscore
%100)/10;
tnnn
[2]='0'+(hiscore
%10);
output_x
=x
;
output_y
=y
;
put_str
(tnnn
);
}
void prpower
(u8 power
)
{
#define POWER_LEN 8
static u8 y
,x
;
static u8 i
;
static u8 tiles
[POWER_LEN
];
select_image
(IMG_TILES
);
y
=0;
x
=curplayer
?32:0;
output_x
=x
;
output_y
=y
;
for (i
=0;i
<POWER_LEN
;i
++) {
tiles
[i
]=((i
*8)<power
)?15:0;
}
tiles
[power
/8]=8+(power
&7);
if (!power
) tiles
[0]=0;
for (i
=0;i
<POWER_LEN
;i
++) {
draw_tile
(output_x
++,output_y
,tiles
[i
]+((i
>=2)?16:0)+((i
>=6)?16:0));
}
}
void prscores
()
{
//todo юсэюты Є№ Єюы№ъю яЁш шчьхэхэшш
prnum
(0,12,scores
[0]);
if (curplayer
==0) put_char
('*'); else put_char
(' ');
prnum
(0,21,scores
[1]);
if (curplayer
==1) put_char
('*'); else put_char
(' ');
prnnn
(2,16,ballvalue
);
put_char
('+');
prnnn
(2,21,bonusballvalue
);
//prnnn(3,0,winpocket);
//prnnn(3,10,curpocket);
output_x
=oldoutput_x
;
output_y
=oldoutput_y
;
put_char
(' ');
output_x
=pocketcoords
[winpocket
][0];
output_y
=pocketcoords
[winpocket
][1];
oldoutput_x
=output_x
;
oldoutput_y
=output_y
;
if (winpocket
) put_char
('*');
}
void draw_sprites
() {
//if (1) {
i
=(SPRITES_ALL
-1);
j
=0;
//for(i=(SPRITES_ALL-1);i!=(u8)(-1);--i) {
/*
do {
if (spriteList[i].exist) {
//i&3 т√сшЁрхЄ юфшэ шч ўхЄ√Ёхї ЁрчэюЎтхЄэ√ї °рЁшъют
//i&4 = Їрчр ёфтшур яю X
tmpx=spriteList[i].x;
tmpxscr=(tmpx>>(SHIFTCOORDS+1)); //>>SHIFTCOORDS ъюьяшышЄё ёю ёфтшуюь
//j=tmpxscr>>8; //ъюьяшышЄё схч ёфтшур
set_sprite(j++,
tmpxscr-(SCRSHIFTX>>1),
(spriteList[i].y>>SHIFTCOORDS)-SCRSHIFTY,
spriteList[i].color|((tmpx&(1<<SHIFTCOORDS))?16:0));*/
__asm
ld a
,(#_i+0)
ld e
,a
00000$
: //эрўрыю Ўшъыр
//ld a,(#_i+0)
//ld e,a
ld a
,e
add a
,a
add a
,a
add a
,e
add a
,a
add a
,e
ld hl
,#_spriteList+9
add a
,l
//#<_spriteList
ld l
,a
ld a
,h
//#>_spriteList
adc a
,#0x00
ld h
,a
ld a
,(hl
) //exist
or a
jr z
,00005$
//ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш ЁхушёЄЁют
push de
dec hl
ld c
,(hl
) //color
dec hl
dec hl
dec hl
dec hl
dec hl
ld a
,(hl
) //Y
dec hl
ld e
,(hl
) //y
rl e
rla
add a
,#0xF0
ld d
,a
//d=(spriteList[i].y>>SHIFTCOORDS)-SCRSHIFTY
dec hl
ld a
,(hl
) //X
add a
,#0xF8
ld e
,a
//e=tmpxscr-(SCRSHIFTX>>1)
dec hl
ld a
,(hl
) //x
rla
sbc a
,a
and
#0x10
or a
,c
//color
ld c
,a
ld b
,#0x00
push bc
//spriteList[i].color|((tmpx&(1<<SHIFTCOORDS))?4:0)
push de
//d=(spriteList[i].y>>SHIFTCOORDS)-SCRSHIFTY //e=tmpxscr-(SCRSHIFTX>>1)
ld hl
,#_j + 0
ld a
,(hl
)
inc
(hl
)
push af
//j++
inc sp
call _set_sprite
pop af
pop af
inc sp
pop de
00005$
: //ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш ЁхушёЄЁют
dec e
jp p
,00000$
//эрўрыю Ўшъыр
__endasm
;
/*}
}while((--i)!=(u8)(-1));*/
//}
}
void moveball
() {
//фтшцхэшх
#define RESTOREX tmpnewx=tmpx;
#define RESTOREY tmpnewy=tmpy;
#define RESTORECOORDS /*RESTOREX;RESTOREY;*/
/*movingballs=0;
slowphase++;
for(i=0;i<SPRITES_ALL;++i) if (spriteList[i].exist==2) //фтшцхЄё
{*/
tmpx
=spriteList
[i
].
x;
tmpy
=spriteList
[i
].
y;
tmpnewx
=tmpx
+spriteList
[i
].
dx;
tmpnewy
=tmpy
+spriteList
[i
].
dy;
if (((tmpnewx
>=RIGHTMARGIN
)/*&&(spriteList[i].dx>=0)*/)
|| ((tmpnewx
<LEFTMARGIN
)/*&&(spriteList[i].dx<0)*/))
{
spriteList
[i
].
dx=-spriteList
[i
].
dx;
//tmpnewx=tmpx+spriteList[i].dx;
tmpnewx
=WRONGX
;
tmpnewy
=WRONGY
;
//чтєъ, юяЁхфхышЄ№ эюьхЁ ыєч√, эюьхЁ °рЁшър ш юЎхэшЄ№ яю яЁртшырь
//ш∙хь, т ъръє■ ыєчє ь√ яюярыш
if (tmpx
<(MYX
<<SHIFTCOORDS
)) {
curpocket
=(tmpy
<(MIDY
<<SHIFTCOORDS
))?1:4;
}
else {
curpocket
=(tmpy
<(MIDY
<<SHIFTCOORDS
))?3:6;
};
pocketfactor
=1;
spriteList
[i
].
exist=0;
if (i
!=0) {
if (curpocket
==winpocket
) {
sfx_play
(SFX_WINPOCKET
,0);
pocketfactor
=WINPOCKETFACTOR
;
winpocket
=0;
} else {
sfx_play
(SFX_POCKET
,0);
}
scores
[curplayer
]+=((ballvalue
+bonusballvalue
)*pocketfactor
);
bonusballvalue
+=DOUBLEBALLBONUS
;
pocketballs
+=1;
} else {
sfx_play
(SFX_POCKET_MAIN
,0);
scores
[curplayer
]-=POCKETMAINMALUS
;
}
prscores
();
}
else if (((tmpnewy
>=BOTTOMMARGIN
)/*&&(spriteList[i].dy>=0)*/)
|| ((tmpnewy
<TOPMARGIN
)/*&&(spriteList[i].dy<0)*/))
{
spriteList
[i
].
dy=-spriteList
[i
].
dy;
//tmpnewy=tmpy+spriteList[i].dy;
tmpnewx
=WRONGX
;
tmpnewy
=WRONGY
;
//чтєъ, юяЁхфхышЄ№ эюьхЁ ыєч√, эюьхЁ °рЁшър ш юЎхэшЄ№ яю яЁртшырь
//ш∙хь, т ъръє■ ыєчє ь√ яюярыш
if (tmpx
<(MYX
<<SHIFTCOORDS
)) {
curpocket
=(tmpy
<(MIDY
<<SHIFTCOORDS
))?1:4;
}
else if (tmpx
<(PYRX
<<SHIFTCOORDS
)) {
curpocket
=(tmpy
<(MIDY
<<SHIFTCOORDS
))?2:5;
}
else {
curpocket
=(tmpy
<(MIDY
<<SHIFTCOORDS
))?3:6;
};
pocketfactor
=1;
spriteList
[i
].
exist=0;
if (i
!=0) {
if (curpocket
==winpocket
) {
sfx_play
(SFX_WINPOCKET
,0);
pocketfactor
=WINPOCKETFACTOR
;
winpocket
=0;
} else {
sfx_play
(SFX_POCKET
,0);
}
scores
[curplayer
]+=((ballvalue
+bonusballvalue
)*pocketfactor
);
bonusballvalue
+=DOUBLEBALLBONUS
;
pocketballs
+=1;
} else {
sfx_play
(SFX_POCKET_MAIN
,0);
scores
[curplayer
]-=POCKETMAINMALUS
;
}
prscores
();
}
else {
//}
//ЄюЁьюцхэшх ш яЁютхЁър юёЄрэютъш
//for(i=0;i<SPRITES_ALL;++i)
//{
if ((spriteList
[i
].
dx)||(spriteList
[i
].
dy)) {
movingballs
=1;
if (((slowphase
-i
)&15)==0) {
dxold
=spriteList
[i
].
dx;
dyold
=spriteList
[i
].
dy;
if ( (ABS
(dxold
) < 12)
&& (ABS
(dyold
) < 12) ) {
spriteList
[i
].
dx=0;
spriteList
[i
].
dy=0;
spriteList
[i
].
exist=1;
}
else if ( (ABS
(dxold
) < 32)
&& (ABS
(dyold
) < 32) ) {
spriteList
[i
].
dx=dxold
*3/4; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
spriteList
[i
].
dy=dyold
*3/4; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
}
else if ( (ABS
(dxold
) < 100)
&& (ABS
(dyold
) < 100) ) {
spriteList
[i
].
dx=dxold
*7/8; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
spriteList
[i
].
dy=dyold
*7/8; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
}
else if ( (ABS
(dxold
) < 256)
&& (ABS
(dyold
) < 256) ) {
spriteList
[i
].
dx=dxold
*15/16; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
spriteList
[i
].
dy=dyold
*15/16; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
}
else {
spriteList
[i
].
dx=dxold
*31/32; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
spriteList
[i
].
dy=dyold
*31/32; //юъЁєуыхэшх юЄЁшЎрЄхы№э√ї Єюцх ъ эєы■
}
}
}
//}
//юяЁхфхыхэшх ъюыышчшщ
//for(i=0;i<SPRITES_ALL;++i) {
//°рЁшъ эх фюыцхэ яюярфрЄ№ т ЄЁряхЎш■ ьхцфє ыєчрьш, эю юЄёъюъ Ёрчэ√щ т чртшёшьюёЄш юЄ ёЄюЁюэ√, ъюЄюЁє■ юэ яхЁхё╕ъ
//юЄ тхЁЄшърыш: dx=-dxold
//юЄ уюЁшчюэЄрыш: dy=-dyold
//юЄ фшруюэрыш ыхтющ тхЁїэхщ шыш яЁртющ эшцэхщ ыєч√: dx=dyold, dy=dxold
//юЄ фшруюэрыш яЁртющ тхЁїэхщ шыш ыхтющ эшцэхщ ыєч√: dx=-dyold, dy=-dxold
//юЄ єуыр (ёшыр ЁхръЎшш эряЁртыхэр яхЁяхэфшъєы Ёэю, Є.х. ъ ЎхэЄЁє): TODO ъръ яЁш ёЄюыъэютхэшш °рЁшъют
//ъююЁфшэрЄ√ °рЁшър = xleft,ytop = ъююЁфшэрЄ√ ыхтюую тхЁїэхую єуыр хую bounding box яы■ё SCRSHIFT
//ъююЁфшэрЄ√ юуЁрэшўшЄхыхщ Єюцх яы■ё SCRSHIFT
//яюёўшЄрхь x,y (ЎхэЄЁ), ytop, ybottom, xleft, xright
//xleft=(XTYPE)(tmpx+SCRSHIFTX)>>SHIFTCOORDS;
//xright=xleft+ballsize;
//x=xleft+(ballsize/2);
//ytop=(XTYPE)(tmpy+SCRSHIFTY)>>SHIFTCOORDS;
//ybottom=ytop+ballsize;
//y=ytop+(ballsize/2);
__asm
ld hl
,(#_tmpx) //(#_moveballs_tmpx_1_1+0)
ld bc
,#0x0010 //SCRSHIFTX
add hl
,bc
add hl
,hl
ld l
,h
ld h
,b
rl h
ld
(#_xleft+0),hl
ex de
,hl
ld hl
,(#_tmpy) //(#_moveballs_tmpy_1_1+0)
add hl
,bc
//SCRSHIFTY==SCRSHIFTX
add hl
,hl
ld l
,h
ld h
,b
rl h
ld
(#_ytop+0),hl
ld c
,#0x07 //ballsize/2
add hl
,bc
ld
(#_y+0),hl
ex de
,hl
add hl
,bc
ld
(#_x+0),hl
inc c
//ld c,#0x08 //ballsize-(ballsize/2)
add hl
,bc
ld
(#_xright+0),hl
ex de
,hl
add hl
,bc
ld
(#_ybottom+0),hl
__endasm
;
dxold
=spriteList
[i
].
dx;
dyold
=spriteList
[i
].
dy;
#define WALLCOLLIDED sfx_play(SFX_BUM2,0);
/*spriteList[i].wallcollided=2;*/
//ьюцэю яЁютхЁ Є№ яЁш Їырух т ёхЄъх[x,y], Єрь эюьхЁ тхЄъш яЁютхЁъш
//яЁютхЁъш тхЁїэшї ыєч Єюы№ъю яЁш ytop<TOPY (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш ):
if (ytop
<TOPY
) {
//яхЁхёхўхэшх ыхтющ ўрёЄш тхЁїэхщ уюЁшчюэЄрыш: (x>TOPLEFTMINX) && (x<TOPLEFTMAXX) //&& (ytop<TOPY)
if ( (x
>TOPLEFTMINX
) && (x
<TOPLEFTMAXX
) ) {
spriteList
[i
].
dy=-dyold
;
//RESTOREY;
tmpnewy
=((XTYPE
)TOPY
<<SHIFTCOORDS
);
WALLCOLLIDED
;
}
//яхЁхёхўхэшх тхЁїэхщ фшруюэрыш ыхтющ тхЁїэхщ ыєч√: (x<=TOPLEFTMINX) && ((y-x-(ballsize*7/10))<(TOP-CORNERLEFT))
else if ( (x
<=TOPLEFTMINX
) ) {
if ( (y
<(x
+TOP
-CORNERLEFT
+(ballsize
*7/10))) && (-dyold
>-dxold
) ) {
spriteList
[i
].
dx=dyold
;
spriteList
[i
].
dy=dxold
;
RESTORECOORDS
;
WALLCOLLIDED
;
}
}
//яхЁхёхўхэшх яЁртющ ўрёЄш тхЁїэхщ уюЁшчюэЄрыш: (x>TOPRIGHTMINX) && (x<TOPRIGHTMAXX) //&& (ytop<TOPY)
else if ( (x
>TOPRIGHTMINX
) && (x
<TOPRIGHTMAXX
) ) {
spriteList
[i
].
dy=-dyold
;
//RESTOREY;
tmpnewy
=((XTYPE
)TOPY
<<SHIFTCOORDS
);
WALLCOLLIDED
;
}
//яхЁхёхўхэшх тхЁїэхщ фшруюэрыш яЁртющ тхЁїэхщ ыєч√: (x>=TOPRIGHTMAXX) && ((y+x-(ballsize*7/10))<(TOP+CORNERRIGHT))
else if ( (x
>=TOPRIGHTMAXX
) ) {
if ( ((y
+x
)<(TOP
+CORNERRIGHT
+(ballsize
*7/10))) && (-dyold
>dxold
) ) {
spriteList
[i
].
dx=-dyold
;
spriteList
[i
].
dy=-dxold
;
RESTORECOORDS
;
WALLCOLLIDED
;
}
}
else {
//if (y<TOPY) {
if (y
<(TOPY
+MAGNETSIZE
)) {
spriteList
[i
].
dy-=MAGNETSPEED
;
}
if (y
<TOPY
) {
//яхЁхёхўхэшх ыхтющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((TOPLEFTMAXX-xleft)<ballsize) //&& (y<TOPY)
if ((TOPLEFTMAXX
-xleft
)<ballsize
) {
spriteList
[i
].
dx=-dxold
;
RESTOREX
;
WALLCOLLIDED
;
}
//яхЁхёхўхэшх яЁртющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((xright-TOPRIGHTMINX)<ballsize) //&& (y<TOPY)
else if ((xright
-TOPRIGHTMINX
)<ballsize
) {
spriteList
[i
].
dx=-dxold
;
RESTOREX
;
WALLCOLLIDED
;
}
//} else {
} else {
//if(!spriteList[i].wallcollided) {
sqrdy
=sqrhalfballsize
-sqr
((DXTYPE
)y
-TOPY
);
//ъюэЄръЄ ё ыхт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-TOPLEFTMAXX)+sqr(y-TOPY))<sqrhalfballsize)
if ((x
>TOPLEFTMAXX
) && ((sqr
(x
-TOPLEFTMAXX
))<sqrdy
)) { //x>
spriteList
[i
].
dx=ABS
(dyold
); //-dyold
spriteList
[i
].
dy=ABS
(dxold
); //-dxold
RESTORECOORDS
;
WALLCOLLIDED
;
}
//ъюэЄръЄ ё яЁрт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-TOPRIGHTMINX)+sqr(y-TOPY))<sqrhalfballsize)
else if ((x
<TOPRIGHTMINX
) && ((sqr
(TOPRIGHTMINX
-x
))<sqrdy
)) { //x<
spriteList
[i
].
dx=-ABS
(dyold
); //dyold
spriteList
[i
].
dy=ABS
(dxold
);
RESTORECOORDS
;
WALLCOLLIDED
;
}
//ъюэЄръЄ ё тхЁїэшь єуыюь ыхтющ тхЁїэхщ ыєч√: ((sqr(x-TOPLEFTMINX)+sqr(y-TOPY))<sqrhalfballsize)
else if ((x
<TOPLEFTMINX
) && ((sqr
(TOPLEFTMINX
-x
))<sqrdy
) && (dyold
<0)) { //x<
spriteList
[i
].
dx=dyold
;
spriteList
[i
].
dy=dxold
;
RESTORECOORDS
;
WALLCOLLIDED
;
}
//ъюэЄръЄ ё тхЁїэшь єуыюь яЁртющ тхЁїэхщ ыєч√: ((sqr(x-TOPRIGHTMINX)+sqr(y-TOPY))<sqrhalfballsize)
else if ((x
>TOPRIGHTMAXX
) && ((sqr
(x
-TOPRIGHTMAXX
))<sqrdy
) && (dyold
<0)) { //x>
spriteList
[i
].
dx=-dyold
;
spriteList
[i
].
dy=-dxold
;
RESTORECOORDS
;
WALLCOLLIDED
;
}
//}
} //else spriteList[i].wallcollided--;
}
}
/*
if ( (y<(x+TOP-CORNERLEFT+(ballsize*7/10))) ) {
spriteList[i].dx=dyold;
spriteList[i].dy=dxold;
}
if ( ((y+x)<(TOP+CORNERRIGHT+(ballsize*7/10))) ) {
spriteList[i].color=(spriteList[i].color+1)&3;
spriteList[i].dx=-dyold;
spriteList[i].dy=-dxold;
}
*/
//яЁютхЁъш эшцэшї ыєч Єюы№ъю яЁш ybottom>BOTTOMY (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш ):
if (ybottom
>BOTTOMY
) {
//яхЁхёхўхэшх ыхтющ ўрёЄш эшцэхщ уюЁшчюэЄрыш: (x>BOTTOMLEFTMINX) && (x<BOTTOMLEFTMAXX) //&& (ybottom>BOTTOMY)
if ( (x
>BOTTOMLEFTMINX
) && (x
<BOTTOMLEFTMAXX
) ) {
spriteList
[i
].
dy=-dyold
;
//RESTOREY;
tmpnewy
=((XTYPE
)BOTTOMY
<<SHIFTCOORDS
)-BALLSIZE
;
WALLCOLLIDED
;
}
//яхЁхёхўхэшх эшцэхщ фшруюэрыш ыхтющ эшцэхщ ыєч√: (x<=BOTTOMLEFTMINX) && ((y+x+(ballsize*7/10))>(BOTTOM+CORNERLEFT))
else if ( (x
<=BOTTOMLEFTMINX
) ) {
if ( ((y
+x
)>(BOTTOM
+CORNERLEFT
-(ballsize
*7/10))) && (dyold
>-dxold
) ) {
spriteList
[i
].
dx=-dyold
;
spriteList
[i
].
dy=-dxold
;
//RESTORECOORDS;
WALLCOLLIDED
;
}
}
//яхЁхёхўхэшх яЁртющ ўрёЄш эшцэхщ уюЁшчюэЄрыш: (x>BOTTOMRIGHTMINX) && (x<BOTTOMRIGHTMAXX) //&& (ybottom>BOTTOMY)
else if ( (x
>BOTTOMRIGHTMINX
) && (x
<BOTTOMRIGHTMAXX
) ) {
spriteList
[i
].
dy=-dyold
;
//RESTOREY;
tmpnewy
=((XTYPE
)BOTTOMY
<<SHIFTCOORDS
)-BALLSIZE
;
WALLCOLLIDED
;
}
//яхЁхёхўхэшх эшцэхщ фшруюэрыш яЁртющ эшцэхщ ыєч√: (x>=BOTTOMRIGHTMAXX) && ((y-x+(ballsize*7/10))>(BOTTOM-CORNERRIGHT))
else if ( (x
>=BOTTOMRIGHTMAXX
) ) {
if ( (y
>(x
+BOTTOM
-CORNERRIGHT
-(ballsize
*7/10))) && (dyold
>dxold
) ) {
spriteList
[i
].
dx=dyold
;
spriteList
[i
].
dy=dxold
;
//RESTORECOORDS;
WALLCOLLIDED
;
}
}
//if (y>BOTTOMY) {
if (y
<(BOTTOMY
-MAGNETSIZE
)) {
spriteList
[i
].
dy+=MAGNETSPEED
;
}
if (y
>BOTTOMY
) {
//яхЁхёхўхэшх ыхтющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((BOTTOMLEFTMAXX-xleft)<ballsize) //&& (y>BOTTOMY)
if ((BOTTOMLEFTMAXX
-xleft
)<ballsize
) { //xleft<
spriteList
[i
].
dx=-dxold
;
RESTOREX
;
WALLCOLLIDED
;
}
//яхЁхёхўхэшх яЁртющ тхЁЄшърыш т ЎхэЄЁры№эющ ыєчх: ((xright-BOTTOMRIGHTMINX)<ballsize) //&& (y>BOTTOMY)
else if ((xright
-BOTTOMRIGHTMINX
)<ballsize
) { //xright>
spriteList
[i
].
dx=-dxold
;
RESTOREX
;
WALLCOLLIDED
;
}
//} else {
} else {
sqrdy
=sqrhalfballsize
-sqr
(BOTTOMY
-(DXTYPE
)y
);
//ъюэЄръЄ ё ыхт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-BOTTOMLEFTMAXX)+sqr(y-BOTTOMY))<sqrhalfballsize)
if ((x
>BOTTOMLEFTMAXX
) && ((sqr
(x
-BOTTOMLEFTMAXX
))<sqrdy
)) { //x>
//xshow=dxold;
//yshow=dyold;
spriteList
[i
].
dx=ABS
(dyold
);
spriteList
[i
].
dy=-ABS
(dxold
);
RESTORECOORDS
;
WALLCOLLIDED
;
}
//ъюэЄръЄ ё яЁрт√ь єуыюь ЎхэЄЁры№эющ ыєч√: ((sqr(x-BOTTOMRIGHTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
else if ((x
<BOTTOMRIGHTMINX
) && ((sqr
(BOTTOMRIGHTMINX
-x
))<sqrdy
)) { //x<
//xshow=x;
//yshow=y;
spriteList
[i
].
dx=-ABS
(dyold
);
spriteList
[i
].
dy=-ABS
(dxold
); //-dxold
RESTORECOORDS
;
WALLCOLLIDED
;
}
//ъюэЄръЄ ё эшцэшь єуыюь ыхтющ эшцэхщ ыєч√: ((sqr(x-BOTTOMLEFTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
else if ((x
<BOTTOMLEFTMINX
) && ((sqr
(BOTTOMLEFTMINX
-x
))<sqrdy
) && (dyold
>0)) { //x<
spriteList
[i
].
dx=-dyold
;
spriteList
[i
].
dy=-dxold
;
//RESTORECOORDS;
//tmpnewy=((XTYPE)BOTTOMY<<SHIFTCOORDS)-BALLSIZE;
WALLCOLLIDED
;
}
//ъюэЄръЄ ё эшцэшь єуыюь яЁртющ эшцэхщ ыєч√: ((sqr(x-BOTTOMRIGHTMINX)+sqr(y-BOTTOMY))<sqrhalfballsize)
else if ((x
>BOTTOMRIGHTMAXX
) && ((sqr
(x
-BOTTOMRIGHTMAXX
))<sqrdy
) && (dyold
>0)) { //x>
spriteList
[i
].
dx=dyold
;
spriteList
[i
].
dy=dxold
;
//RESTORECOORDS;
//tmpnewy=((XTYPE)BOTTOMY<<SHIFTCOORDS)-BALLSIZE;
WALLCOLLIDED
;
}
//}
}
}
//яЁютхЁъш ыхтющ ёЄюЁюэ√ Єюы№ъю яЁш xleft<LEFTX (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш )
if (xleft
<LEFTX
) {
//яхЁхёхўхэшх ыхтющ тхЁЄшърыш: (y>LEFTMINY) && (y<LEFTMAXY) //&& (xleft<LEFTX)
if ( (y
>LEFTMINY
) && (y
<LEFTMAXY
) ) {
spriteList
[i
].
dx=-dxold
;
//RESTOREX;
tmpnewx
=(XTYPE
)LEFTX
<<SHIFTCOORDS
;
WALLCOLLIDED
;
}
//яхЁхёхўхэшх эшцэхщ фшруюэрыш ыхтющ тхЁїэхщ ыєч√: (y<=LEFTMINY) && ((y-x+(ballsize*7/10))>(CORNERTOP-LEFT))
else if ( (y
<=LEFTMINY
) ) {
if ( (y
>(x
+CORNERTOP
-LEFT
-(ballsize
*7/10))) && (dxold
<dyold
) ) {
spriteList
[i
].
dx=dyold
;
spriteList
[i
].
dy=dxold
;
//RESTORECOORDS;
WALLCOLLIDED
;
}
}
//яхЁхёхўхэшх тхЁїэхщ фшруюэрыш ыхтющ эшцэхщ ыєч√: (y>=LEFTMAXY) && ((y+x-(ballsize*7/10))<(CORNERBOTTOM+LEFT))
else if ( (y
>=LEFTMAXY
) ) {
if ( ((y
+x
)<(CORNERBOTTOM
+LEFT
+(ballsize
*7/10))) && (dxold
<-dyold
) ) {
spriteList
[i
].
dx=-dyold
;
spriteList
[i
].
dy=-dxold
;
//RESTORECOORDS;
WALLCOLLIDED
;
}
}
//ъюэЄръЄ ё эшцэшь єуыюь ыхтющ тхЁїэхщ ыєч√: ((sqr(x-LEFTX)+sqr(y-LEFTMINY))<sqrhalfballsize)
else if (y
<(LEFTMINY
+ballsize
)) {
if ((((DXTYPE
)sqr
((DXTYPE
)x
-LEFTX
)+sqr
(LEFTMINY
-(DXTYPE
)y
))<sqrhalfballsize
) && (dxold
<0)) { //y<
spriteList
[i
].
dx=-dyold
;
spriteList
[i
].
dy=-dxold
;
RESTORECOORDS
;
WALLCOLLIDED
;
}
}
//ъюэЄръЄ ё тхЁїэшь єуыюь ыхтющ эшцэхщ ыєч√: ((sqr(x-LEFTX)+sqr(y-LEFTMAXY))<sqrhalfballsize)
else if (y
>(LEFTMAXY
-ballsize
)) {
if ((((DXTYPE
)sqr
((DXTYPE
)x
-LEFTX
)+sqr
((DXTYPE
)y
-LEFTMAXY
))<sqrhalfballsize
) && (dxold
<0)) { //y>
spriteList
[i
].
dx=dyold
;
spriteList
[i
].
dy=dxold
;
RESTORECOORDS
;
WALLCOLLIDED
;
}
}
else if (x
<=(LEFTX
+MAGNETSIZE
)) {
spriteList
[i
].
dx-=MAGNETSPEED
;
}
}
//яЁютхЁъш яЁртющ ёЄюЁюэ√ Єюы№ъю яЁш xright>RIGHTX (ърцф√щ трЁшрэЄ шёъы■ўрхЄ тёх эшцхёЄю ∙шх, шфєЄ т яюЁ фъх єёыюцэхэш )
if (xright
>RIGHTX
) {
//яхЁхёхўхэшх яЁртющ тхЁЄшърыш: (y>RIGHTMINY) && (y<RIGHTMAXY) //&& (xright>RIGHTX)
if ( (y
>RIGHTMINY
) && (y
<RIGHTMAXY
) ) {
spriteList
[i
].
dx=-dxold
;
//RESTOREX;
tmpnewx
=((XTYPE
)RIGHTX
<<SHIFTCOORDS
)-BALLSIZE
;
WALLCOLLIDED
;
}
//яхЁхёхўхэшх эшцэхщ фшруюэрыш яЁртющ тхЁїэхщ ыєч√: (y<=RIGHTMINY) && ((y+x+(ballsize*7/10))>(CORNERTOP+RIGHT))
else if ( (y
<=RIGHTMINY
) ) {
if ( ((y
+x
)>(CORNERTOP
+RIGHT
-(ballsize
*7/10))) && (dxold
>-dyold
) ) {
spriteList
[i
].
dx=-dyold
;
spriteList
[i
].
dy=-dxold
;
//RESTORECOORDS;
WALLCOLLIDED
;
}
}
//яхЁхёхўхэшх тхЁїэхщ фшруюэрыш яЁртющ эшцэхщ ыєч√: (y>=RIGHTMAXY) && ((y-x-(ballsize*7/10))<(CORNERBOTTOM-RIGHT))
else if ( (y
>=RIGHTMAXY
) ) {
if ( (y
<(x
+CORNERBOTTOM
-RIGHT
+(ballsize
*7/10))) && (dxold
>dyold
) ) {
spriteList
[i
].
dx=dyold
;
spriteList
[i
].
dy=dxold
;
//RESTORECOORDS;
WALLCOLLIDED
;
}
}
//ъюэЄръЄ ё эшцэшь єуыюь яЁртющ тхЁїэхщ ыєч√: ((sqr(x-RIGHTX)+sqr(y-RIGHTMINY))<sqrhalfballsize)
else if (y
<(RIGHTMINY
+ballsize
)) {
if ((((DXTYPE
)sqr
((DXTYPE
)x
-RIGHTX
)+sqr
(RIGHTMINY
-(DXTYPE
)y
))<sqrhalfballsize
) && (dxold
>0)) { //y<
spriteList
[i
].
dx=dyold
;
spriteList
[i
].
dy=dxold
;
RESTORECOORDS
;
WALLCOLLIDED
;
}
}
//ъюэЄръЄ ё тхЁїэшь єуыюь яЁртющ эшцэхщ ыєч√: ((sqr(x-RIGHTX)+sqr(y-RIGHTMAXY))<sqrhalfballsize)
else if (y
>(RIGHTMAXY
+ballsize
)) {
if ((((DXTYPE
)sqr
((DXTYPE
)x
-RIGHTX
)+sqr
((DXTYPE
)y
-RIGHTMAXY
))<sqrhalfballsize
) && (dxold
>0)) { //y>
spriteList
[i
].
dx=-dyold
;
spriteList
[i
].
dy=-dxold
;
RESTORECOORDS
;
WALLCOLLIDED
;
}
}
else if (x
>=(RIGHTX
-MAGNETSIZE
)) {
spriteList
[i
].
dx+=MAGNETSPEED
;
}
}
} //хёыш эх т ыєчх
spriteList
[i
].
x=tmpnewx
;
spriteList
[i
].
y=tmpnewy
;
//} //exist==2
/*}*/
}
void uncollideballs
() {
//static u8 xzone,yzone;
//юсэєыхэшх чюэ
//шфхюыюуш Єрър :
//шчэрўры№эю т чюэрї -1
//яЁш яЁютхЁъх юўхЁхфэюую °рЁшър ь√ тэюёшь хую т чюэє, ш хёыш Єрь єцх с√ы °рЁшъ, Єю т√ыхчхЄ Їыру. шэрўх яюыєўшЄё 0 т чюэх.
//фы эхёє∙хёЄтє■∙шї °рЁшъют сєфхЄ -1, эю юэш ш т эхёє∙хёЄтє■∙шї чюэрї
for(i
=0;i
<SPRITES_ALL
;++i
) {
xzone
=spriteList
[i
].
x>>(ZONESHIFT
+SHIFTCOORDS
);
yzone
=spriteList
[i
].
y>>(ZONESHIFT
+SHIFTCOORDS
);
//exist=(spriteList[i].exist);
//addr=ballsinzone+((u16)yzone<<8)+xzone;
//( (++(*addr)); (++(*(addr+1))); (++(*(addr+257))); (++(*(addr+256))) );
__asm
ld hl
,(_xzone
) //(_moveballs_xzone_1_1)
ld a
,(_yzone
) //(_moveballs_yzone_1_1)
ld h
,a
ld bc
,#_ballsinzone
add hl
,bc
ld a
,#-1
ld
(hl
),a
inc l
ld
(hl
),a
inc h
ld
(hl
),a
dec l
ld
(hl
),a
__endasm
;
}
}
void docollide
()
{
if ((spriteList
[i
].
exist)&&(spriteList
[j
].
exist)) { //фы эрф╕цэюёЄш (ўЄюс√ ь╕ЁЄт√х °рЁшъш эх юцшты ышё№)
//шьяєы№ё, фхы╕ээ√щ эр ьрёёє (ЁрчьхЁэюёЄ№ V, Є.ъ. (nx,xy) сєфхЄ эюЁьрышчютрэ)
//эрфю єьэюцхэшх 16*16=>32 шыш 8.8*8.8=>8.8
//tempdx = (spriteList[i].dx-spriteList[j].dx);
//tempdy = (spriteList[i].dy-spriteList[j].dy);
p
=DOTPRODUCT
((spriteList
[i
].
dx-spriteList
[j
].
dx),(spriteList
[i
].
dy-spriteList
[j
].
dy),nx
,ny
)>>(4+4);
///(ITYPE)BALLSIZE; //эхы№ч UTYPE - яюўхьє?
//if (p>0) p=-p;
if (p
<0) { //шьяєы№ё эх ьюцхЄ шфЄш т ёЄюЁюэє фЁєуюую °рЁшър
//тхъЄюЁ шьяєы№ёр, фхы╕ээ√щ эр ьрёёє (ЁрчьхЁэюёЄ№ V)
px
=(p
*nx
);
///(ITYPE)BALLSIZE; //эхы№ч UTYPE - яюўхьє?
py
=(p
*ny
);
///(ITYPE)BALLSIZE; //эхы№ч UTYPE - яюўхьє?
//ьхэ хь ёъюЁюёЄш (ЁрчьхЁэюёЄ№ V)
tempdx
= spriteList
[i
].
dx-px
; //spriteList[i].dx-=px;
#ifdef CHECKMAXSPEED
if (tempdx
/*spriteList[i].dx*/ >= MAXSPEED
) tempdx
/*spriteList[i].dx*/ = MAXSPEED
;
if (tempdx
/*spriteList[i].dx*/ < -MAXSPEED
) tempdx
/*spriteList[i].dx*/ = -MAXSPEED
;
#endif
spriteList
[i
].
dx = tempdx
;
tempdy
= spriteList
[i
].
dy-py
; //spriteList[i].dy-=py;
#ifdef CHECKMAXSPEED
if (tempdy
/*spriteList[i].dy*/ >= MAXSPEED
) tempdy
/*spriteList[i].dy*/ = MAXSPEED
;
if (tempdy
/*spriteList[i].dy*/ < -MAXSPEED
) tempdy
/*spriteList[i].dy*/ = -MAXSPEED
;
#endif
spriteList
[i
].
dy = tempdy
;
tempdx
= spriteList
[j
].
dx+px
; //spriteList[j].dx+=px;
#ifdef CHECKMAXSPEED
if (tempdx
/*spriteList[j].dx*/ >= MAXSPEED
) tempdx
/*spriteList[j].dx*/ = MAXSPEED
;
if (tempdx
/*spriteList[j].dx*/ < -MAXSPEED
) tempdx
/*spriteList[j].dx*/ = -MAXSPEED
;
#endif
spriteList
[j
].
dx = tempdx
;
tempdy
= spriteList
[j
].
dy+py
; //spriteList[j].dy+=py;
#ifdef CHECKMAXSPEED
if (tempdy
/*spriteList[j].dy*/ >= MAXSPEED
) tempdy
/*spriteList[j].dy*/ = MAXSPEED
;
if (tempdy
/*spriteList[j].dy*/ < -MAXSPEED
) tempdy
/*spriteList[j].dy*/ = -MAXSPEED
;
#endif
spriteList
[j
].
dy = tempdy
;
//эрфю ўЄюс√ °рЁшъш яюёых ёЄюыъэютхэш эх ёсышцрышё№, Є.х. dx ыхтюую °рЁшър фюыцхэ с√Є№ < dx яЁртюую, dy тхЁїэхую < dy эшцэхую
//spriteList[i].dx=rand16()%(2<<SHIFTCOORDS)-(1<<SHIFTCOORDS); //rand16()&1?-1:1;
//spriteList[i].dy=rand16()%(2<<SHIFTCOORDS)-(1<<SHIFTCOORDS); //rand16()&1?-1:1;
//spriteList[j].dx=rand16()%(2<<SHIFTCOORDS)-(1<<SHIFTCOORDS); //rand16()&1?-1:1;
//spriteList[j].dy=rand16()%(2<<SHIFTCOORDS)-(1<<SHIFTCOORDS); //rand16()&1?-1:1;
//spriteList[i].color=(spriteList[i].color+1)&3;
//spriteList[j].color=(spriteList[j].color+1)&3;
//collided[i][j]=5;
spriteList
[i
].
exist=2; //фтшцхЄё
spriteList
[j
].
exist=2; //фтшцхЄё
washit
=1; //с√ы єфрЁ
sfx_play
(SFX_BUM
,0);
}
}
}
//юяЁхфхыхэшх ёЄюыъэютхэшщ °рЁшъют фЁєу ё фЁєуюь
/*for(i=0;i<SPRITES_ALL;++i) if (spriteList[i].exist)
{*/
void preparecollideball
() {
tmpx
=spriteList
[i
].
x;
tmpy
=spriteList
[i
].
y;
xzone
=tmpx
>>(ZONESHIFT
+SHIFTCOORDS
);
yzone
=tmpy
>>(ZONESHIFT
+SHIFTCOORDS
);
//spritezones[(i<<1)+1]=(tmpnewx>>(SHIFTCOORDS+1));
//spritezones[(i<<1)]=(tmpnewy>>(SHIFTCOORDS+1));
//addr=ballsinzone+((u16)yzone<<8)+xzone;
//if ( (++(*addr)) + (++(*(addr+1))) + (++(*(addr+257))) + (++(*(addr+256))) ) //яюьхўрхь яюыюцхэшх ш яЁютхЁ хь эрыюцхэшх т чюэрї
//spritezones ёюфхЁцшЄ яхЁхёўшЄрээ√х x,y (8 bit) фы тёхї °рЁшъют
__asm
ld a
,(#_i+0) //эюьхЁ °рЁр
add a
,a
add a
,#<_spritezones
ld l
,a
adc a
,#>_spritezones
sub a
,l
ld h
,a
ld a
,(#_tmpy+1) //(#_moveballs_tmpy_1_1+1)
ld
(hl
),a
inc hl
ld a
,(#_tmpx+1) //(#_moveballs_tmpx_1_1+1)
ld
(hl
),a
//ballsinzone ёюфхЁцшЄ ўшёыю °рЁшъют т ърцфющ ъыхЄъх 16x16
ld hl
,(_xzone
) //(_moveballs_xzone_1_1)
ld a
,(_yzone
) //(_moveballs_yzone_1_1)
ld h
,a
ld bc
,#_ballsinzone
add hl
,bc
inc
(hl
)
ld a
,(hl
)
inc l
inc
(hl
)
add a
,(hl
)
inc h
inc
(hl
)
add a
,(hl
)
dec l
inc
(hl
)
add a
,(hl
)
//jp Z,skipinnerloop$
ld
(_xzone
),a
//(_moveballs_xzone_1_1),a //ЄхяхЁ№ ¤Єю ўшёыю °рЁшъют т 4 чюэрї яюф °рЁшъюь
__endasm
;
}
void collideball
() {
//if (xzone && i)
//{
xleft
=(tmpx
-BALLSIZE
)>>(SHIFTCOORDS
+1);
ytop
=(tmpy
-BALLSIZE
)>>(SHIFTCOORDS
+1);
// spritezonesaddr=spritezones+i+i-1; //яюўхьє-Єю ЄєЄ эх ЁрсюЄрхЄ
//for(j=i-1; j!=-1; --j)
j
=i
-1; //i!=0, Єръ ўЄю ёЁртэштрхь ърцфє■ ярЁє [i] ш [j] юфшэ Ёрч, р эх фтр
// do
// /*if (spriteList[j].exist)*/ {
__asm
ld a
,(_xleft
)
ld
(#00091$+1),a
ld c
,a
ld b
,#0x10
ld a
,(_ytop
)
ld
(#00092$+1),a
ld de
,(_spritezonesaddr
) //(_moveballs_spritezonesaddr_1_1)
ld hl
,#_j
00099$
: //эрўрыю Ўшъыр j
//if(!collided[i][j]) {
// if ((spriteList[j].x-tmpxmin)<(BALLSIZE<<1)) {
// if ((spriteList[j].y-tmpymin)<(BALLSIZE<<1)) {
// if ((u8)((spriteList[j].x>>(SHIFTCOORDS+1))-xleft)<(u8)(ballsize+1)) {
// if ((u8)((spriteList[j].y>>(SHIFTCOORDS+1))-ytop)<(u8)(ballsize+1)) {
// if ((u8)(/*(spritezones[(j<<2)])*/(*spritezonesaddr)-xleft)<(u8)(ballsize+1)) {
ld a
,(de
)
dec de
//9999491$: //яхЁхьхээр (+1)
sub a
,c
//#0 //(_moveballs_xleft_1_1)
sub a
,b
//#0x10
jp nc
,00001$
//ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш ЁхушёЄЁют
// if ((u8)(/*(spritezones[(j<<2)+1])*/(*(spritezonesaddr+1))-ytop)<(u8)(ballsize+1)) {
//ld a,(_ytop)
//ex de,hl
//sub a,(hl)
//ex de,hl
//neg
ld a
,(de
)
00092$
: //яхЁхьхээр (+1)
sub a
,#0 //(_moveballs_ytop_1_1)
sub a
,b
//#0x10
jp nc
,00001$
//ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш ЁхушёЄЁют
push de
//spritezonesaddr-1
//ъююЁфшэрЄ√ сышчъю - ьюцэю ёўшЄрЄ№ ЁрёёЄю эшх яю ЇюЁьєых
//dist=(SQR((ITYPE)(DXTYPE)(spriteList[i].x-spriteList[j].x))+SQR((ITYPE)(DXTYPE)(spriteList[i].y-spriteList[j].y))); //фтющэюх яЁхюсЁрчютрэшх фы эрїюцфхэш чэрър, яюЄюь Ёрё°шЁхэш чэрър (Ёрё°шЁхэшх, ўЄюс√ яЁртшы№эю яюёўшЄрЄ№ ътрфЁрЄ)
//if (dist < SQR((UTYPE)BALLSIZE)) {
//if ( (sqr((DXTYPE)(spriteList[i].x-spriteList[j].x)>>SHIFTCOORDS)+sqr((DXTYPE)(spriteList[i].y-spriteList[j].y)>>SHIFTCOORDS)) < sqr(ballsize) ) {
//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) ) { //эхЄюўэюёЄ№ тшфэр
//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 ьюцхЄ эх яюьхёЄшЄ№ё т срщЄ
ld a
,(hl
)//(_j)
//ld hl,#_moveballs_comparisons_1_1
//inc (hl)
ld e
,a
add a
,a
add a
,a
add a
,e
add a
,a
add a
,e
add a
,#<_spriteList
ld l
,a
adc a
,#>_spriteList
sub a
,l
ld h
,a
ld c
,(hl
)
inc hl
ld b
,(hl
)
inc hl
ex de
,hl
ld hl
,(#_tmpx) //(#_moveballs_tmpx_1_1+0)
or a
,a
//Єрър ЄюўэюёЄ№ эх трцэр?
sbc hl
,bc
push hl
//tmpx-spriteList[j].x
sra h
rr l
sra h
rr l
sra h
rr l
sra h
rr l
sra h
rr l
ex de
,hl
ld c
,(hl
)
inc hl
ld b
,(hl
)
ld hl
,(#_tmpy) //(#_moveballs_tmpy_1_1+0)
or a
,a
//Єрър ЄюўэюёЄ№ эх трцэр?
sbc hl
,bc
push hl
//tmpy-spriteList[j].y
sra h
rr l
sra h
rr l
sra h
rr l
sra h
rr l
sra h
rr l
ld bc
,#_tsqr+0x80
add hl
,bc
ex de
,hl
add hl
,bc
ld a
,(de
)
add a
,(hl
)
pop bc
//tmpy-spriteList[j].y
pop hl
//tmpx-spriteList[j].x
//jp C,9999500$
cp a
,#0x38 //#0xE1
jp nc
,00010$
//ъюэхЎ Ўшъыр ё тюёёЄрэютыхэшхь ЁхушёЄЁют
//ёЄюыъэютхэшх:
//эюЁьры№ ьхцфє °рЁрьш (ЁрчьхЁэюёЄ№ 1, Є.ъ. яюфЁрчєьхтрхЄё эюЁьрышчрЎш )
// nx=(DXTYPE)(tmpx-spriteList[j].x)/(BALLSIZE>>4);
push bc
//push bc
ld de
,#0x0078
//push de
//push hl //tmpx-spriteList[j].x
call _DIVSIGNED
//_divsint_rrx_s //hl = hl/de
//pop af
//pop af
//pop bc
ld
(_nx
),hl
//(_moveballs_nx_1_1 + 0),hl
// ny=(DXTYPE)(tmpy-spriteList[j].y)/(BALLSIZE>>4);
pop hl
//push bc
ld de
,#0x0078
//push de
//push hl //tmpy-spriteList[j].y
call _DIVSIGNED
//_divsint_rrx_s //hl = hl/de
//pop af
//pop af
//pop bc
ld
(_ny
),hl
//(_moveballs_ny_1_1 + 0),hl
call _docollide
00010$
: //ъюэхЎ Ўшъыр ё тюёёЄрэютыхэшхь ЁхушёЄЁют
pop de
//spritezonesaddr-1
ld hl
,#_j
00091$
: //яхЁхьхээр (+1=c)
ld bc
,#0x1000 //(_moveballs_xleft_1_1)
00001$
: //ъюэхЎ Ўшъыр схч тюёёЄрэютыхэш ЁхушёЄЁют
//spritezonesaddr-=2;
dec de
//}//else collided[i][j]--;
//ld hl,#_j
//inc (hl)
//ld a,(_i)
//sub a,(hl)
//jp NZ,9999499$
dec
(hl
)
jp p
,00099$
//эрўрыю Ўшъыр balls in zone
__endasm
;
// } while ((--j) != -1); //j
//} //ballsinzone
/*
} //i //sprites
*/
}
void initboard
()
{
static u8 xzone
,yzone
;
//шэшЎшрышчрЎш ярЁрьхЄЁют юс·хъЄют
//for(i=0;i<SPRITES_ALL;++i) for(j=0;j<SPRITES_ALL;++j) collided[i][j]=0;
for(i
=0;i
<SPRITES_ALL
;++i
) {
/*
spriteList[i].x=RNDLEFTMARGIN+(((u32)rand16()<<16)+rand16())%((u32)(RNDRIGHTMARGIN-RNDLEFTMARGIN));
spriteList[i].y=RNDTOPMARGIN+(((u32)rand16()<<16)+rand16())%((u32)(RNDBOTTOMMARGIN-RNDTOPMARGIN));
*/
/*spriteList[i].x=(initial[i][0]);
spriteList[i].y=(initial[i][1]);*/
//while(spriteList[i].y>=RNDBOTTOMMARGIN){};
spriteList
[i
].
dx=0;
spriteList
[i
].
dy=0;
spriteList
[i
].
color=i
?(i
&3):4;
spriteList
[i
].
exist=1;
spriteList
[i
].
wallcollided=0;
};
spriteList
[0].
x = (u32
)(MYX
)<<SHIFTCOORDS
;spriteList
[0].
y = (u32
)(MIDY
)<<SHIFTCOORDS
;
spriteList
[1].
x = (u32
)(PYRX
)<<SHIFTCOORDS
;spriteList
[1].
y = (u32
)(MIDY
)<<SHIFTCOORDS
;
spriteList
[2].
x = (u32
)(PYRX
+1*PYRXSTEP
)<<SHIFTCOORDS
;spriteList
[2].
y = (u32
)(MIDY
+1*PYRYSTEP
)<<SHIFTCOORDS
;
spriteList
[3].
x = (u32
)(PYRX
+1*PYRXSTEP
)<<SHIFTCOORDS
;spriteList
[3].
y = (u32
)(MIDY
-1*PYRYSTEP
)<<SHIFTCOORDS
;
spriteList
[4].
x = (u32
)(PYRX
+2*PYRXSTEP
)<<SHIFTCOORDS
;spriteList
[4].
y = (u32
)(MIDY
+2*PYRYSTEP
)<<SHIFTCOORDS
;
spriteList
[5].
x = (u32
)(PYRX
+2*PYRXSTEP
)<<SHIFTCOORDS
;spriteList
[5].
y = (u32
)(MIDY
+0*PYRYSTEP
)<<SHIFTCOORDS
;
spriteList
[6].
x = (u32
)(PYRX
+2*PYRXSTEP
)<<SHIFTCOORDS
;spriteList
[6].
y = (u32
)(MIDY
-2*PYRYSTEP
)<<SHIFTCOORDS
;
spriteList
[7].
x = (u32
)(PYRX
+3*PYRXSTEP
)<<SHIFTCOORDS
;spriteList
[7].
y = (u32
)(MIDY
+3*PYRYSTEP
)<<SHIFTCOORDS
;
spriteList
[8].
x = (u32
)(PYRX
+3*PYRXSTEP
)<<SHIFTCOORDS
;spriteList
[8].
y = (u32
)(MIDY
+1*PYRYSTEP
)<<SHIFTCOORDS
;
spriteList
[9].
x = (u32
)(PYRX
+3*PYRXSTEP
)<<SHIFTCOORDS
;spriteList
[9].
y = (u32
)(MIDY
-1*PYRYSTEP
)<<SHIFTCOORDS
;
spriteList
[10].
x =(u32
)(PYRX
+3*PYRXSTEP
)<<SHIFTCOORDS
;spriteList
[10].
y =(u32
)(MIDY
-3*PYRYSTEP
)<<SHIFTCOORDS
;
/*
for(i=0;i<SPRITES_ALL;++i) {
spriteList[i].dx=((ITYPE)((((u32)rand16()<<16)+rand16())%((u32)8<<SHIFTCOORDS))-((u32)4<<SHIFTCOORDS))/2; //rand16()&1?-1:1;
spriteList[i].dy=((ITYPE)((((u32)rand16()<<16)+rand16())%((u32)8<<SHIFTCOORDS))-((u32)4<<SHIFTCOORDS))/2; //rand16()&1?-1:1;
}
*/
for(xzone
=0;xzone
<XZONES
;++xzone
) {
for(yzone
=0;yzone
<YZONES
;++yzone
) {
ballsinzone
[((u16
)yzone
<<8)+xzone
]=-1;
}
};
curplayer
=0;
for(i
=0;i
<MAXPLAYERS
;++i
) {
scores
[i
]=0;
};
}
#define CUR_BRIM (2) /* яюых ё сюъют ъєЁёюЁр фю шуЁютюую яюы */
#define CUR_SIZE (7) /* ЁрчьхЁ ъєЁёюЁр */
#define CUR_CENTERSHIFT (3) /* ёфтшу ЎхэЄЁр ъєЁёюЁр юЄэюёшЄхы№эю хую ъююЁфшэрЄ */
#define CUR_XPERIOD (RIGHT-BRIM-SCRSHIFTX + CUR_BRIM - (LEFT+BRIM-SCRSHIFTX - CUR_BRIM-CUR_SIZE))
#define CUR_YPERIOD (BOTTOM-BRIM-SCRSHIFTY + CUR_BRIM - (TOP+BRIM-SCRSHIFTY - CUR_BRIM-CUR_SIZE))
#define CUR_PERIOD ((CUR_XPERIOD+CUR_YPERIOD)*2)
static u16 cur_x
,cur_y
;
static u8 plots
;
void draw_cursor
(void) {
#define SPRITE_CUR 32
#define SPRITE_DOT 34
static u16 plot_x
,plot_y
;
static u8 cur_xscr
;
static u8 k
;
cur_xscr
=(cur_x
>>1);
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));
plots
=5;
for (k
=1;k
<plots
;k
++) { //эр 1 ьхэ№°х, Є.ъ. эєыхтющ - ¤Єю ёрь °рЁ
plot_x
=((k
*((spriteList
[0].
x>>SHIFTCOORDS
)-SCRSHIFTX
-CUR_CENTERSHIFT
+(ballsize
/2)))+((plots
-k
)*(DXTYPE
)cur_x
))/plots
;
plot_y
=((k
*((spriteList
[0].
y>>SHIFTCOORDS
)-SCRSHIFTY
+CUR_CENTERSHIFT
-(ballsize
/2)))+((plots
-k
)*(DXTYPE
)cur_y
))/plots
;
cur_xscr
=(plot_x
>>1);
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));
}
}
void main
(void)
{
static DXTYPE vx
,vy
;
static XTYPE len
;
static XTYPE tryx
,tryy
;
static i16 cur_place
,cur_speed
;
static u8 palette
[16];
static u8 curtime
,oldtime
,logictime
,logicframe
;
static u8 ingame
;
static u8 power
;
static i8 powerspeed
;
static u8 k
;
u8
* pkeys
;
pocketcoords
[0][0]=0; pocketcoords
[0][1]=4;
pocketcoords
[1][0]=0; pocketcoords
[1][1]=4;
pocketcoords
[2][0]=20;pocketcoords
[2][1]=4;
pocketcoords
[3][0]=39;pocketcoords
[3][1]=4;
pocketcoords
[4][0]=0; pocketcoords
[4][1]=24;
pocketcoords
[5][0]=20;pocketcoords
[5][1]=24;
pocketcoords
[6][0]=39;pocketcoords
[6][1]=24;
pal_select
(PAL_BACK
);
prstr
(12,14,"PRESS ANY KEY"/*presskey*/);
swap_screen
();
while (1) {
rand16
();
//яюыєўхэшх ёюёЄю эш ъыртш°
vsync
(); //for joystick
joy
=joystick
();
keyboard
(keys
);
k
=0;
pkeys
=keys
;
for (i
=0;i
<40;++i
) k
|=/*keys[i]*/ *pkeys
++;
if (joy
|| k
) break;
}
//ў╕Ёэ√щ ¤ъЁрэ эр тЁхь яюфуюЄютъш
pal_bright
(BRIGHT_MIN
);
//шэшЎшрышчрЎш ЄрсышЎ√ ътрфЁрЄют
i
=0; do { tsqr
[i
]=(u8
)(((i
-128)*(i
-128))/64); ++i
; } while (i
!=0);
initboard
();
//т√тюф Їюэр эр Єхэхтющ ¤ъЁрэ
draw_image
(0,0,IMG_BACK
);
pal_select
(PAL_BACK
);
//яхЁхъы■ўхэшх ¤ъЁрэют, ЄхяхЁ№ Їюэ эр тшфшьюь ¤ъЁрэх
swap_screen
();
//чряєёъ ёяЁрщЄют
sprites_start
();
//єёЄрэютър эюЁьры№эющ ЁъюёЄш
pal_bright
(BRIGHT_MID
);
pyramidshot
=1; //яхЁт√щ єфрЁ (Ёрчсштрхь яшЁрьшфє)
cur_place
=CUR_YPERIOD
/2; //яю ўрёютющ ёЄЁхыъх юЄ яЁртюую тхЁїэхую єуыр
ballvalue
=FIRSTBALLVALUE
;
winpocket
=0;
curpocket
=0;
//уыртэ√щ Ўшъы
while(1) {
if ((!winpocket
) && (!(rand16
()&0x8000))) {
winpocket
=(rand16
()%6)+1;
}
//scores[0]+=10;
prscores
();
ingame
=0;
cur_speed
=0;
oldtime
= time()-1;
//єяЁрты хь
while(!ingame
) {
//cur_x=LEFT+BRIM-SCRSHIFTX - CUR_BRIM-CUR_SIZE;
//cur_x=RIGHT-BRIM-SCRSHIFTX + CUR_BRIM;
//cur_y=100;
//яю ўрёютющ ёЄЁхыъх юЄ яЁртюую тхЁїэхую єуыр
if (cur_place
<CUR_YPERIOD
) { //яЁртр ёЄюЁюэр
cur_x
=RIGHT
-BRIM
-SCRSHIFTX
+ CUR_BRIM
;
cur_y
=(TOP
+BRIM
-SCRSHIFTY
-9 - CUR_BRIM
-CUR_SIZE
) + cur_place
;
}
else if (cur_place
<(CUR_YPERIOD
+CUR_XPERIOD
)) { //эшцэ ёЄюЁюэр (ёяЁртр эрыхтю)
cur_x
=(RIGHT
-BRIM
-SCRSHIFTX
+ CUR_BRIM
) - (cur_place
-CUR_YPERIOD
);
cur_y
=BOTTOM
-BRIM
-SCRSHIFTY
-9 + CUR_BRIM
;
}
else if (cur_place
<(CUR_YPERIOD
+CUR_XPERIOD
+CUR_YPERIOD
)) { //ыхтр ёЄюЁюэр (ёэшчє ттхЁї)
cur_x
=LEFT
+BRIM
-SCRSHIFTX
- CUR_BRIM
-CUR_SIZE
;
cur_y
=(BOTTOM
-BRIM
-SCRSHIFTY
-9 + CUR_BRIM
) - (cur_place
-(CUR_YPERIOD
+CUR_XPERIOD
));
}
else { //тхЁїэ ёЄюЁюэр
cur_x
=(LEFT
+BRIM
-SCRSHIFTX
- CUR_BRIM
-CUR_SIZE
) + (cur_place
-(CUR_YPERIOD
+CUR_XPERIOD
+CUR_YPERIOD
));
cur_y
=TOP
+BRIM
-SCRSHIFTY
-9 - CUR_BRIM
-CUR_SIZE
;
}
//чряюыэхэшх ёяшёър ёяЁрщЄют
j
=0;
draw_sprites
();
draw_cursor
();
set_sprite
(j
,0,0,SPRITE_END
);
swap_screen
();
//яюыєўхэшх ёюёЄю эш ъыртш°
keyboard
(keys
);
//vsync(); //for joystick
joy
=joystick
();
curtime
= time();
logictime
= curtime
-oldtime
;
oldtime
= curtime
;
for (logicframe
= 0 ; logicframe
< logictime
; logicframe
++)
{
//if(gameover==0)
{
if(joy
&JOY_FIRE
) { joy
=JOY_FIRE
; ingame
=1;}
if(joy
&JOY_LEFT
) { joy
=JOY_LEFT
; cur_speed
++; if (cur_speed
<8)cur_speed
=8; cur_place
-=(cur_speed
/8);}
if(joy
&JOY_RIGHT
) { joy
=JOY_RIGHT
; cur_speed
++; if (cur_speed
<8)cur_speed
=8; cur_place
+=(cur_speed
/8);}
if(!(joy
&(JOY_LEFT
|JOY_RIGHT
))) cur_speed
=0;
if (cur_place
<0) cur_place
+=CUR_PERIOD
;
if (cur_place
>=CUR_PERIOD
) cur_place
-=CUR_PERIOD
;
//if(joy&JOY_UP) { joy=JOY_UP; move_up();}
//if(joy&JOY_DOWN) { joy=JOY_DOWN; move_down();}
//юсэютыхэшх ¤ъЁрэр
//if(joy==0) put_board();
//if (check_gameover()!=0) do_gameover();
//if (win==1) {win++; do_win();};
}
}
//if(keys[KEY_R]&KEY_PRESS) new_game();
}
//Єръшх цх ёяЁрщЄ√ эр тЄюЁюь ¤ъЁрэх
j
=0;
draw_sprites
();
//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));
draw_cursor
();
set_sprite
(j
,0,0,SPRITE_END
);
swap_screen
();
oldtime
= time()-1;
//эрсшЁрхь ёъюЁюёЄ№
power
=0;
powerspeed
=+1;
do {
//j=0;
//draw_sprites();
//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));
//set_sprite(j,0,0,SPRITE_END);
prpower
(power
);
//prnum(0,10,power);
swap_screen
();
//яюыєўхэшх ёюёЄю эш ъыртш°
keyboard
(keys
);
//vsync(); //for joystick
joy
=joystick
();
curtime
= time();
logictime
= curtime
-oldtime
;
oldtime
= curtime
;
for (logicframe
= 0 ; logicframe
< logictime
; logicframe
++)
{
if(joy
&JOY_FIRE
) {
power
+=powerspeed
;
if ((power
==0)||(power
==63)) powerspeed
=-powerspeed
;
//power=(power+1)&63;
} else {
ingame
=2;
}
}
}while(ingame
!=2);
i
= 0;
//ёъюЁюёЄ№ = хфшэшўэ√щ тхъЄюЁ * power
vx
= (DXTYPE
)(cur_x
-CUR_CENTERSHIFT
+SCRSHIFTX
)-(spriteList
[i
].
x>>SHIFTCOORDS
);
vy
= (DXTYPE
)(cur_y
+CUR_CENTERSHIFT
+SCRSHIFTY
)-(spriteList
[i
].
y>>SHIFTCOORDS
);
//prnum(1,0,vx);
//prnum(1,10,vy);
len
= lsqrt
(SQR
(ABS
(vx
)) + SQR
(ABS
(vy
))); //OK
//prnum(1,20,len);
//prnum(2,20,power);
vx
= ((ITYPE
)vx
* 8) * (ITYPE
)power
/ len
;
vy
= ((ITYPE
)vy
* 8) * (ITYPE
)power
/ len
;
spriteList
[0].
dx=vx
;
spriteList
[0].
dy=vy
;
//prnum(2,0,spriteList[0].dx);
//prnum(2,10,spriteList[0].dy);
spriteList
[i
].
exist=2; //фтшцхЄё
//єёЄрэртыштрхь ёъюЁюёЄш °рЁшъют
for(i
=1;i
<SPRITES_ALL
;++i
) {
spriteList
[i
].
dx=0;
spriteList
[i
].
dy=0;
}
pocketballs
=0;
washit
=0;
bonusballvalue
=0; //сюэєё т Єхъє∙хь єфрЁх (сєфхЄ ЁрёЄш ё ърцф√ь чрсшЄ√ь т ¤Єюь єфрЁх °рЁшъюь)
oldtime
= time()-1;
//фхырхь їюф
do {
//чряюыэхэшх ёяшёър ёяЁрщЄют
j
=0;
draw_sprites
();
set_sprite
(j
,0,0,SPRITE_END
);
//яхЁхьх∙хэшх юс·хъЄют
curtime
= time();
logictime
= (curtime
-oldtime
)*2;
oldtime
= curtime
;
for (logicframe
= 0 ; logicframe
< logictime
; logicframe
++)
{
//comparisons=0;
movingballs
=0;
slowphase
++;
for(i
=0;i
<SPRITES_ALL
;++i
) if (spriteList
[i
].
exist==2) //фтшцхЄё
{
moveball
();
}
uncollideballs
();
for(i
=0;i
<SPRITES_ALL
;++i
) if (spriteList
[i
].
exist) //ёЄюшЄ шыш фтшцхЄё
{
preparecollideball
();
if (xzone
&& i
) /*т чюэрї °рЁшър ўЄю-Єю хёЄ№ ш °рЁшъ эх ╣0 (ўЄюс√ ъЁєЄшЄ№ Ўшъы j=i-1...0)*/
{
spritezonesaddr
=spritezones
+i
+i
-1;
collideball
();
}
}
} //logicframes
//spritezonesaddr+=2; //эрфю фы Єюую, ўЄюс√ яхЁхьхээр эх тюёяЁшэ ырё№ ъръ ъюэёЄрэЄр (эх яюьюурхЄ)
//prnum(0,0,comparisons);
//przones(1,0);
//prnum(2,0,xshow);
//prnum(2,10,yshow);
//юсэютыхэшх ¤ъЁрэр, ёяЁрщЄ√ т√тюф Єё ртЄюьрЄшўхёъш
swap_screen
();
}while(movingballs
);
bonusballvalue
=0; //сюэєё т Єхъє∙хь єфрЁх (сєфхЄ ЁрёЄш ё ърцф√ь чрсшЄ√ь т ¤Єюь єфрЁх °рЁшъюь)
//prnum(0,0,0/*power*/);
prpower
(0/*power*/);
//ёў╕Є
//хёыш єфрЁ єфрўэ√щ, Ўхэр °рЁшър ЁрёЄ╕Є
if (pocketballs
) {
sfx_play
(SFX_POCKET
,0);
ballvalue
+=CONTINUOUSBALLBONUS
;
}
//хёыш эшўхую эх чрсшы (эх эр Ёрчсштъх яшЁрьшф√) шыш яюЄхЁ ы сшЄюъ, Єю эрфю ёьхэшЄ№ шуЁюър (Єюы№ъю эх фтр Ёрчр, ёь. эшцх)
if (((pocketballs
+pyramidshot
)==0)||(!(spriteList
[0].
exist))) {
//хёыш яюЄхЁ ы сшЄюъ - °ЄЁрЇ (єцх яюёўшЄрэ яЁш яюЄхЁх)
/*if (!(spriteList[0].exist)) {
sfx_play(SFX_POCKET_MAIN,0);
scores[curplayer]-=POCKETMAINMALUS;
}*/
//хёыш эх єфрЁшы фЁєующ °рЁ - °ЄЁрЇ
if (!washit
) {
sfx_play
(SFX_POCKET_MAIN
,0);
scores
[curplayer
]-=NOHITMALUS
;
}
curplayer
++; if (curplayer
>=MAXPLAYERS
) curplayer
=0;
ballvalue
=FIRSTBALLVALUE
; //ёсЁрё√трхь Ўхэє °рЁшър
}
prscores
();
//хёыш сшЄюъ яюЄхЁ э, ёЄртшь хую ёэютр
if (!(spriteList
[0].
exist))
{
//curplayer++; if (curplayer>=MAXPLAYERS) curplayer=0;
spriteList
[0].
exist=1;
tryx
=(LEFT
+64)<<SHIFTCOORDS
;
tryy
=((TOP
+(BOTTOM
-ballsize
))/2)<<SHIFTCOORDS
;
do {
ingame
=0;
for (i
=1;i
<SPRITES_ALL
;++i
) if(spriteList
[i
].
exist) {
if( ((spriteList
[i
].
x-(tryx
-BALLSIZE
))<(BALLSIZE
*2))
&& ((spriteList
[i
].
y-(tryy
-BALLSIZE
))<(BALLSIZE
*2)) ) ingame
=1; //яхЁхёхўхэшх
}
if (ingame
) { //яхЁхёхўхэшх - яЁюсєхь фЁєушх ъююЁфшэрЄ√
tryy
+=(16<<SHIFTCOORDS
);
if (tryy
> (((TOP
+(BOTTOM
-ballsize
))/2+50)<<SHIFTCOORDS
) ) {
tryy
=((TOP
+(BOTTOM
-ballsize
))/2-50)<<SHIFTCOORDS
;
tryx
+=(16<<SHIFTCOORDS
);
}
}
} while (ingame
!=0);
spriteList
[0].
x=tryx
;
spriteList
[0].
y=tryy
;
}
pyramidshot
=0;
}
}