📄 kota43b.pas
字号:
EntrySound(6);
for iii := 0 to 2 do
begin
k3 := (k1 + 660 + iii*60) mod 720;
ay := SC[k3]; ax := SC[(k3+180) mod 720];
k2 := ((k3+22) mod 720) div 45 + 1;
EntryEnemyShot(x*100,y*100,ax*6,ay*6, 0,0,8,8, k2, 1);
end;
EntryEffect(x,y,0,0,1);
end;
5 : begin
EntrySound(5);
k1 := k1 + (AL.Rnd(180)-90);
k1 := (k1 + 720) mod 720;
ay := SC[k1];
ax := SC[(k1+180) mod 720];
EntryEnemyShot(x*100,y*100,ax*3,ay*3, 0,0,8,8, 0, 0);
EntryEffect(x,y,0,0,1);
end;
6 : begin
EntrySound(5);
k1 := k1 + (AL.Rnd(120)-60);
k1 := (k1 + 720) mod 720;
ay := SC[k1]; ax := SC[(k1+180) mod 720];
k2 := ((k1+22) mod 720) div 45 + 1;
EntryEnemyShot(x*100,y*100,ax*4,ay*4, 0,0,8,8, k2, 1);
EntryEffect(x,y,0,0,1);
end;
7 : begin
EntrySound(7);
for iii := 0 to 5 do
begin
ay := SC[k1];
ax := SC[(k1+180) mod 720];
ax := trunc(ax * (3 + iii*0.5));
ay := trunc(ay * (3 + iii*0.5));
EntryEnemyShot(x*100,y*100,ax,ay, 0,0,12,12, iii, 3);
end;
end;
8 : begin
EntrySound(6);
for iii := 0 to 11 do
begin
k3 := (k1 + iii*60) mod 720;
ay := SC[k3];
ax := SC[(k3+180) mod 720];
k2 := ((k3+22) mod 720) div 45 + 1;
EntryEnemyShot(x*100,y*100,ax*3,ay*3, 0,0,8,8, k2, 0);
end;
EntryEffect(x,y,0,0,1);
end;
9 : begin
EntrySound(6);
for iii := 0 to 11 do
begin
k3 := (k1 + iii*60) mod 720;
ay := SC[k3];
ax := SC[(k3+180) mod 720];
k2 := ((k3+22) mod 720) div 45 + 1;
EntryEnemyShot(x*100,y*100,ax*6,ay*6, 0,0,8,8, k2, 1);
end;
EntryEffect(x,y,0,0,1);
end;
10 : begin
Entrysound(6);
ay := SC[k1];
ax := SC[(k1+180) mod 720];
k2 := ((k1+22) mod 720) div 45 + 1;
EntryEnemyShot(x*100+SC[(k1+360)mod 720]*10
,y*100+SC[(k1+180)mod 720]*10
,ax*3,ay*3, 0,0,8,8, k2, 1);
EntryEnemyShot(x*100-SC[(k1+360)mod 720]*10
,y*100-SC[(k1+180)mod 720]*10
,ax*3,ay*3, 0,0,8,8, k2, 1);
EntryEffect(x,y,0,0,1);
end;
11 : begin
BackESD := (BackESD + 1) mod 2;
Entrysound(6);
for iii := 0 to 5 do
begin
if (BackESD=1)then aaa := (k1 + (iii-3)*25 + 720) mod 720
else aaa := (k1 + (3-iii)*25 + 720) mod 720;
ay := trunc(SC[aaa]*(iii*0.4+2));
ax := trunc(SC[(aaa+180) mod 720]*(iii*0.4+3));
EntryEnemyShot(x*100,y*100,ax,ay, 0,0,8,8, 1, 0);
end;
EntryEffect(x,y,0,0,1);
end;
12 : begin
BackESD := (BackESD + 1) mod 2;
Entrysound(6);
for iii := 0 to 5 do
begin
if (BackESD=1)then aaa := (k1 + (iii-3)*25 + 720) mod 720
else aaa := (k1 + (3-iii)*25 + 720) mod 720;
ay := trunc(SC[aaa]*(iii*0.5+3));
ax := trunc(SC[(aaa+180) mod 720]*(iii*0.5+3));
EntryEnemyShot(x*100,y*100,ax,ay, 0,0,8,8, iii, 3);
end;
EntryEffect(x,y,0,0,1);
end;
13 : begin
Entrysound(6);
for iii := 0 to 5 do
begin
ay := trunc(SC[k1]*(iii*0.5+2));
ax := trunc(SC[(k1+180) mod 720]*(iii*0.5+2));
EntryEnemyShot(x*100,y*100,ax,ay, 0,0,8,8, iii, 0);
end;
EntryEffect(x,y,0,0,1);
end;
14 : begin
entrysound(5);
EntryEnemyShot(x*100,y*100,ax*4,ay*4, 0,0,8,8, 0, 4);
end;
15 : begin //儗亅僓亅
EntrySound(14);
EntryEnemyShot(x*100,y*100,0,0, 0,0,0,0, 0, 5);
end;
end;
end;
//曽岦傪妏搙偱曉偡-----------------------
function TSTG.keisan1(x,y : Integer) : Integer;
var
atk : Integer;
begin
//atx := x; aty := y; //壖曄悢偵戙擖
//if (atx = 0)then atx := 1; //椺奜傪旔偗傞
//if (aty = 0)then aty := 1;
//atk := trunc( arctan(aty / atx) * 18000 / 3.1415); //ArcTan傪巊偭偰妏搙傪媮傔傞
//if (atx < 0)then atk := atk + 18000; //0-360埲撪偺妏搙偵捈偡
//if ((x = 0)and(y = 0))then atk := trunc(arctan(0));
atk := AL.atant2(x,y);
keisan1 := (atk * 720) shr 10; //曄悢傊戙擖
end;
//摉偨傝敾掕傪峴偆-------------------------
function TSTG.PlayerHit : Boolean;
var
iii,aaa : Integer;
begin
PlayerHit := False;
for iii := 0 to 200 do
begin
if (ESD[iii].Empty = true)then
begin
aaa := 0;
if ((abs((PD[0].x+PD[0].h1) - (ESD[iii].x div 100 + ESD[iii].h1))
< ((PD[0].h3 + ESD[iii].h3) div 2)))then aaa := aaa + 1;
if ((abs((PD[0].y+PD[0].h2) - (ESD[iii].y div 100 + ESD[iii].h2))
< ((PD[0].h4 + ESD[iii].h4) div 2)))then aaa := aaa + 1;
if (aaa = 2)then
begin
PlayerHit := True;
if (ESD[iii].kind <> 5)then ESD[iii].Empty := False;
end;
end;
end;
{
for iii := 0 to 50 do
begin
if (ED[iii].Hit = True)then
begin
aaa := 0;
if ((abs((PD[0].x+PD[0].h1) - (ED[iii].x+ED[iii].h1))
< ((PD[0].h3 + ED[iii].h3) div 2)))then aaa := aaa + 1;
if ((abs((PD[0].y+PD[0].h2) - (ED[iii].y+ED[iii].h2))
< ((PD[0].h4 + ED[iii].h4) div 2)))then aaa := aaa + 1;
if (aaa = 2)then
begin
PlayerHit := True;
end;
end;
end;
}
end;
function TSTG.EnemyHit : Boolean;
var
iii,jjj,kkk,aaa,aaa2 : Integer;
begin
EnemyHit := False;
for iii := 0 to 50 do
if (ED[iii].Empty = true)then
for jjj := 0 to 75 do
if (PSD[jjj].Empty = true)then
if ((ED[iii].Empty = true) and (ED[iii].z > 99))then
with ED[iii] do
begin
aaa := 0;
if ((abs((x+h1) - (PSD[jjj].x + PSD[jjj].h1))
< ((h3 + PSD[jjj].h3) div 2)))then aaa := aaa + 1;
if ((abs((y+h2) - (PSD[jjj].y + PSD[jjj].h2))
< ((h4 + PSD[jjj].h4) div 2)))then aaa := aaa + 1;
if (aaa = 2)then
begin
PSD[jjj].HitNo := PSD[jjj].HitNo + 1;
PD[0].score := PD[0].score + 1;
//EnemyHit := True;
Hit := 1;//if ((PSD[jjj].kind = 4)and(hit=0))then hit := 1;
if (PSD[jjj].kind < 4)then EntryEffect(PSD[jjj].x,PSD[jjj].y,AL.Rnd(4)-2,AL.Rnd(4)-2,0);
if (PSD[jjj].kind = 4)then EntryEffect(PSD[jjj].x+AL.Rnd(40)-20,PSD[jjj].y+AL.Rnd(40)-20,0,2,0);
HP := HP - PSD[jjj].power;
if (PSD[jjj].kind < 4)then PSD[jjj].Empty := False;
if (HP < 1)then
begin
Empty := False;
DestroyEnemy := (DestroyEnemy + 1) mod 109;//Item
if ((DestroyEnemy mod 10) = 1)then
for kkk := 0 to (3+PSD[jjj].HitNo div 14) do EntryItem(x+AL.Rnd(40)-20,y+AL.Rnd(40)-20,0);
if (DestroyEnemy = 108)then EntryItem(x,y,1);
//AddScore
PD[0].score := PD[0].score + (score * (PSD[jjj].HitNo div 7 + 1));
EntryBom(x,y,0,2,BOM);
if (MaxComb < (PSD[jjj].HitNo div 7 + 1))then MaxComb := (PSD[jjj].HitNo div 7 + 1);
if (PSD[jjj].HitNo > 6)then
//EntryPText(x,y,'x'+IntToStr((PSD[jjj].HitNo div 7) + 1),0);
EntryPText(x,y,IntToStr(score)+'x'+IntToStr((PSD[jjj].HitNo div 7) + 1),0);
//愓宍傪偮偗傞
if (z = 100)then
begin
aaa2 := AL.Rnd(4);
STBack.BltFast(IB[29].img,x-25,y-25+(50-(SCount mod 500)div 10),rect(aaa2*50,0,aaa2*50+50,50),
DDBLTFAST_SRCCOLORKEY);
end;
end;
end;
end;
end;
procedure TSTG.BossHit;
var
iii,jjj,aa1 : Integer;
begin
//boss
if (BOD[0].Empty = True)then
for iii := 0 to 9 do
if ((BOD[iii].Level = 0)and(BOD[iii].Empty = True))then
for jjj := 0 to 75 do
if (PSD[jjj].Empty = true)then
if ((BOD[iii].Level = 0) and (abs(BOD[iii].z-150)<49) and (BOD[iii].Empty = True))then
with BOD[iii] do
begin
aa1 := 0;
if ((abs((x+h1) - (PSD[jjj].x + PSD[jjj].h1))
< ((h3 + PSD[jjj].h3) div 2)))then aa1 := aa1 + 1;
if ((abs((y+h2) - (PSD[jjj].y + PSD[jjj].h2))
< ((h4 + PSD[jjj].h4) div 2)))then aa1 := aa1 + 1;
if (aa1 = 2)then
begin
PSD[jjj].HitNo := PSD[jjj].HitNo + 1;
PD[0].score := PD[0].score + 1;
Hit := 1;//if ((PSD[jjj].kind = 4) and (hit=0))then Hit := 1;
if (PSD[jjj].kind < 4)then EntryEffect(PSD[jjj].x,PSD[jjj].y,AL.Rnd(4)-2,AL.Rnd(4)-2,0);
if (PSD[jjj].kind = 4)then EntryEffect(PSD[jjj].x+AL.Rnd(40)-20,PSD[jjj].y+AL.Rnd(40)-20,0,2,0);
HP := HP - PSD[jjj].power; //僸僢僩億僀儞僩尭傜偡
if (PSD[jjj].kind < 4)then PSD[jjj].Empty := False; //僫僷亅儉埲奜側傜抏傪徚偡
if (HP < 1)then
begin
//攋夡偟偨偲偒
Level := 1; a1 := 2; //攋夡偟偨偙偲傪帵偡僼儔僌
//揰悢偺昞帵偲寁嶼
PD[0].score := PD[0].score + (score * (PSD[jjj].HitNo div 7 + 1));
EntryBom(x,y,0,0,BOM);
if (MaxComb < (PSD[jjj].HitNo div 7 + 1))then MaxComb := (PSD[jjj].HitNo div 7 + 1);
if (PSD[jjj].HitNo > 6)then EntryPText(x,y,IntToStr(score)+'x'+IntToStr((PSD[jjj].HitNo div 7) + 1),0)
else EntryPText(x,y,IntToStr(score),0);
end;
end;
end;
end;
//僗僥亅僕僼傽僀儖偺撉傒崬傒-------------------------
procedure TSTG.EntryStage(FileName : String; Stage : Integer);
var
FF : FILE;
temp : TBitmap;
begin
StageNo := Stage;
BackESD := 0;
if (FileExists(FileName) = False)then begin ErrorCode := 255; exit; end;
assignfile(ff,FileName);
ReSet(ff,1);
blockRead(ff,SD,6916);
closefile(ff);
if (FileExists(SD.PartsFile) = False)then begin ErrorCode := 255; exit; end;
temp := TBitmap.Create;
temp.LoadFromFile(SD.PartsFile);
if (PEntry = True)then PBank.free;
PBank := TDDDDSurFace.Create(DD,temp.width,temp.height,0);
PBank.LoadBMP(SD.PartsFile);
PEntry := True;
PBX := round(temp.Width / 50);
PBY := round(temp.Height / 50);
temp.free;
end;
//僗僥亅僕梡弶婜愝掕---------------------------------
procedure TSTG.SetUpStage(Speed : Integer);
var
iii,jjj,ax,ay : integer;
begin
SurFaceClear(STBack,0);
BSCount := 500*6;
SCount := 500*6;
PSpeed := Speed;
PSpeed := Pspeed + (SD.MD[6,0]-127);
StageClear := False;
for iii := 0 to 6 do
for jjj := 0 to 5 do
begin
ax := SD.MD[jjj,iii] mod PBX;
ay := SD.MD[jjj,iii] div PBX;
STBack.BltFast(PBank,jjj*50,300-iii*50,
rect(ax*50,ay*50,ax*50+50,ay*50+50),DDBLTFAST_NOCOLORKEY or DDBLTFAST_WAIT);
end;
end;
//僗僥亅僕憖嶌
procedure TSTG.MoveStage;
var
iii,aaa,ax,ay : Integer;
begin
BSCount := SCount;
SCount := SCount + PSpeed;
aaa := Scount div 500;
//儔僀儞惂屼
if (aaa = SD.FromLine)then SCount := SD.ToLine*500 + (SCount mod 500);
//揋偝傫搊応
if (aaa <> (BSCount div 500))then
begin
STBack.BltFast(STBack,0,50,rect(0,0,300,300),DDBLTFAST_NOCOLORKEY or DDBLTFAST_WAIT);
for iii := 0 to 5 do
begin
ax := SD.MD[iii,aaa] mod PBX;
ay := SD.MD[iii,aaa] div PBX;
STBack.BltFast(PBank,iii*50,0,
rect(ax*50,ay*50,ax*50+50,ay*50+50),0);
end;
if (SD.MD[6,aaa] < 200)then PSpeed := Pspeed + (SD.MD[6,aaa]-127);
if (SD.MD[6,aaa] > 240)then mesivent := SD.MD[6,aaa];
for iii := 0 to 5 do
if (SD.ED[iii,aaa] > 0)then
AutoEnemy(iii*50+25,-25,SD.ED[iii,aaa]);
end;
end;
//摼揰傪昞帵
procedure TSTG.EntryPText(x,y : Integer; Text : String; opt : byte);
var
iii,jjj,aaa : Integer;
sss : String;
begin
iii := 0;
while ((TD[iii].Empty = True) and (iii<50))do iii := iii + 1;
TD[iii].Empty := True;
TD[iii].x := x;
TD[iii].y := y;
TD[iii].Count := 80;
if (opt > 0)then TD[iii].count := 120;
TD[iii].TextWidth := Length(Text);
TD[iii].opt := opt;
for jjj := 0 to TD[iii].TextWidth-1 do
begin
StrMid1(sss,Text,jjj+1,1);
if (opt > 0)then aaa := ansiPos(sss,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ (-+')
else aaa := AnsiPos(sss,'0123456789xABCDEFGHIJKLMNOPQRSTUVWXYZ %');
if (aaa = 0)then aaa := 1;
TD[iii].TextNo[jjj] := aaa;
end;
//夋柺奜偺応崌拞墰傊婑偣傞
if (TD[iii].y < 25)then
TD[iii].y := 25;
end;
procedure TSTG.MovePText;
var
iii : Integer;
begin
for iii := 0 to 50 do
if (TD[iii].Empty = True)then
begin
TD[iii].x := TD[iii].x + TD[iii].x1;
TD[iii].y := TD[iii].y + TD[iii].y1;
TD[iii].count := TD[iii].count - 1;
if (TD[iii].count < 1)then TD[iii].Empty := False;
end;
end;
procedure TSTG.StrMid1(var DsStr : String;
Var SsStr : String;
a,b : Integer);
var
nnn : Integer;
sss : string;
begin
sss := SsStr;
nnn := Length(SsStr);
if (a > 1)then delete(sss,1,a-1);
if (a+b-1 < nnn)then delete(sss,b+1,255);
if (Length(sss) > 1)then sss := '3';
DsStr := sss;
end;
//僾儗僀儎亅偺攋夡
procedure TSTG.PlayerDestroy;
begin
PDCount := PDCount + 1;
if (PDCount < 5)then Entrybom(PD[0].x,PD[0].y,0,0,5);
if (PDCount = 40)then
begin
NoMiss := 0;
PD[0].SLevel := PD[0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -