#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;
//єяЁрты хь
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();
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();
//эрсшЁрхь ёъюЁюёЄ№
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();
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; //сюэєё т Єхъє∙хь єфрЁх (сєфхЄ ЁрёЄш ё ърцф√ь чрсшЄ√ь т ¤Єюь єфрЁх °рЁшъюь)
//фхырхь їюф
do {
//чряюыэхэшх ёяшёър ёяЁрщЄют
j=0;
draw_sprites();
set_sprite(j,0,0,SPRITE_END);
//яхЁхьх∙хэшх юс·хъЄют
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;
}
}