📄 fight.cpp
字号:
//===================打斗模块====================
int X1=130, Y1=270, X2=470, Y2=270;
int SoundIt[]={2,1,2,2,1, 2,1,1,2,1, 1,1,1,1,2}; //声音映射
void ShowFight(int MenuIt,Role Enemy);
Role MyFight(Role Enemy);
Role EnemyFight(Role Enemy);
int Win(Role Enemy);
//进入打斗
int Fight(Role Enemy,int FightScene, int Escape)
{
int MenuIt=0;
int OldScene=Scene;
Role Old=Hero;
int Sx=SX,Sy=SY,Dx=DX,Dy=DY,oSx=old_SX, oSy=old_SY, oDx=old_DX, oDy=old_DY;
Scene=FightScene;
SX=SY=DX=DY=old_SX=old_SY=old_DX=old_DY=0;
Hero.x=X1;
Hero.y=Y1;
Hero.Way=2;
Hero.Stats=0;
Map[Scene].NPC[0]=Enemy;
Map[Scene].Npc_Nums=1;
Map[Scene].NPC[0].x=X2;
Map[Scene].NPC[0].y=Y2;
Map[Scene].NPC[0].Way=1;
Map[Scene].NPC[0].Stats=0;
ChangePalette(MainPal, NullPal, -1);
ShowFight(0,Enemy);
ChangePalette(NullPal, MainPal, 1);
PressKey(VK_RETURN,1);
while(1)
{
if( GetAsyncKeyState(VK_DOWN) ) //下一项
{
PressKey(VK_DOWN,1);
MenuIt=(MenuIt+1)%4;
ShowFight(MenuIt,Enemy);
}
if( GetAsyncKeyState(VK_UP) ) //上一项
{
PressKey(VK_UP,1);
if( MenuIt==0 ) MenuIt=3;
else MenuIt--;
ShowFight(MenuIt,Enemy);
}
if( GetAsyncKeyState(VK_RETURN) ) //确定
{
while( GetAsyncKeyState(VK_RETURN) ) {}
switch( MenuIt )
{
case 0: //打斗
Enemy=MyFight(Enemy);
if( Win(Enemy)==0 ) //胜利
{
Scene=OldScene;
SX=Sx; SY=Sy; DX=Dx; DY=Dy;
old_SX=oSx; old_SY=oSy; old_DX=oDx; old_DY=oDy;
Hero.x=Hero.old_x=Old.x; Hero.y=Hero.old_y=Old.y; Hero.Way=Old.Way; Hero.Stats=Old.Stats;
ChangePalette(MainPal, NullPal, -1);
MainMove();
Flip();
ChangePalette(NullPal, MainPal, 1);
return 0;
}
Delay(500);
Enemy=EnemyFight(Enemy);
if( Win(Enemy)==1 ) //失败
{
ChangePalette(MainPal,NullPal,-1);
//PostMessage(hWnd, WM_CLOSE, 0, 0);
//GameTitle();
return 2;
}
break;
case 1: //状态
ShowFight(MenuIt,Enemy);
ShowState();
break;
case 2: //物品
if( GoodsDialog()==1 ) //轮到敌人攻击(用过了物品)
{
Enemy=EnemyFight(Enemy);
if( Win(Enemy)==1 ) //失败
{
ChangePalette(MainPal,NullPal,-1);
//PostMessage(hWnd, WM_CLOSE, 0, 0);
return 2;
}
}
ShowFight(MenuIt,Enemy);
break;
case 3: //逃走
if( random(100)>Escape )
{
Scene=OldScene;
SX=Sx; SY=Sy; DX=Dx; DY=Dy;
old_SX=oSx; old_SY=oSy; old_DX=oDx; old_DY=oDy;
Hero.x=Hero.old_x=Old.x; Hero.y=Hero.old_y=Old.y; Hero.Way=Old.Way; Hero.Stats=Old.Stats;
ChangePalette(MainPal, NullPal, -1);
MainMove();
Flip();
ChangePalette(NullPal, MainPal, 1);
return 1;
}
else
{
for(int j=0; j<6; j++)
{
ShowFight(MenuIt,Enemy);
if( j%2==0 )
PrintText(lpDDSPrimary, 280,200, "逃跑失败!",RGB(255,255,255));
Delay(80);
}
Enemy=EnemyFight(Enemy);
if( Win(Enemy)==1 ) //失败
{
ChangePalette(MainPal,NullPal,-1);
//PostMessage(hWnd, WM_CLOSE, 0, 0);
//GameTitle();
return 2;
}
ShowFight(MenuIt,Enemy);
}
break;
}
}
}
}
//显示打斗场景
void ShowFight(int MenuIt,Role Enemy)
{
int x=96,y=304;
char *MainMenu[]={"攻击","状态","物品","逃走"};
char Temp[100];
MainMove();
rect=GetRect(0,0,448,112);
Blt(lpDDSBack, x, y, lpDDSFightBar, rect, FALSE);
rect=GetRect(0,0,32,48);
Blt(lpDDSBack, x+10, y+10, lpDDSSpirit, rect, TRUE);
rect=GetRect(0,0,32,32);
Blt(lpDDSBack, x+265, y+26, Enemy.Surface, rect, TRUE);
sprintf(Temp,"生命:%4d 攻击:%4d 防御:%4d 等级:%4d",Hero.Lift, Hero.Attack, Hero.Defend, Hero.Level);
PrintText(lpDDSBack, x+50, y+15, Temp, RGB(0,0,0), TRANSPARENT, 0, 12);
sprintf(Temp,"生命:%4d 攻击:%4d 防御:%4d 等级:%4d",Enemy.Lift, Enemy.Attack, Enemy.Defend, Enemy.Level);
PrintText(lpDDSBack, x+305, y+15, Temp, RGB(0,0,0), TRANSPARENT, 0, 12);
for( int i=0; i<4; i++ )
{
DWORD T1=0,T2=0;
if( MenuIt == i )
{
T1=OPAQUE;
T2=RGB(255,255,255);
}
PrintText(lpDDSBack, x+202, y+10+i*24, MainMenu[i],RGB(255,0,0), T1, T2);
}
Flip();
}
//**********************
//我方攻击
Role MyFight(Role Enemy)
{
int i,tmp=5, SubBlood;
char temp[100];
SubBlood= Hero.Attack*2 - Enemy.Defend;
if( SubBlood<=10 ) SubBlood=random(10);
else SubBlood= SubBlood+random(SubBlood*1);
sprintf(temp,"-%d",SubBlood);
//我方攻击
PlayDirectSound(SoundAttack[0]); //攻击声
for( i=0; i<10; i++)
{
ShowFight(0, Enemy);
rect=GetRect(i*54, 0, i*54+54, 50);
Blt(lpDDSPrimary, X2-10, Y2-32, lpDDSBomb, rect, TRUE);
Delay(60);
}
PlayDirectSound( SoundAo[SoundIt[ Enemy.Pic] ] ); //痛苦声
for( i=0; i<10; i++)
{
Map[Scene].NPC[0].x+=tmp; tmp=-tmp;
ShowFight(0, Enemy);
PrintText(lpDDSPrimary, X2, Y2-32-i*5, temp, RGB(255,255,255));
Delay(50);
}
Enemy.Lift-=SubBlood;
ShowFight(0, Enemy);
return Enemy;
}
//胜负判断
int Win(Role Enemy)
{
//胜利
if( Enemy.Lift<=0 )
{
PlayDirectSound( SoundDead[SoundIt[ Enemy.Pic] ] ); //死亡声
Map[Scene].Npc_Nums=0;
ShowFight(0, Enemy);
PrintText(lpDDSPrimary, 280, 180, "胜利了!", RGB(255,255,255));
PressKey(VK_RETURN);
char TempChar[200];
sprintf(TempChar,"获得:经验=[%d] 金钱=[%d] ",Enemy.Level*25,Enemy.Money);
PrintText(lpDDSPrimary, 200, 210, TempChar, RGB(255,255,255));
Hero.Money+=Enemy.Money;
Hero.Exp+=Enemy.Level*20;
if( Enemy.Goods[0]!='0' ) //得到宝物
{
PrintText(lpDDSPrimary, 200, 240, "缴获物品:", RGB(255,255,255));
for(int i=0; i<16; i++)
{
if( Enemy.Goods[i]!=NULL )
{
sprintf(TempChar,"%s ",Goods[Enemy.Goods[i]-'0'].Name);
PrintText(lpDDSPrimary, 290+i*15*strlen(Goods[Enemy.Goods[i]-'0'].Name), 240, TempChar, RGB(255,255,0));
for(int j=0; j<16; j++) //放宝物
{
if( Hero.Goods[j]==' ' )
{
Hero.Goods[j]=Enemy.Goods[i];
break;
}
}
}
}
}
PressKey(VK_RETURN);
if( Hero.Exp>=100 ) //升级了
{
Hero.Level+=Hero.Exp/100;
sprintf(TempChar, "等级升为(%d)^_^",Hero.Level);
PrintText(lpDDSPrimary, 250, 270, TempChar, RGB(255,255,0));
Hero.MaxLift+=Hero.Exp/100 * 30;
Hero.Attack+=Hero.Exp/100 * 1;
Hero.Defend+=Hero.Exp/100 * 1;
Hero.Lift+=(Hero.MaxLift-Hero.Lift)/2;
Hero.Exp%=100;
PressKey(VK_RETURN);
}
return 0;
}
if( Hero.Lift<=0 )
{
PlayDirectSound( SoundDead[0] ); //死亡声
Hero.x=Hero.old_x=640;
ShowFight(0, Enemy);
PrintText(lpDDSPrimary, 280, 200, "你死了!", RGB(255,255,255));
PressKey(VK_RETURN);
return 1;
}
return 2;
}
//敌人攻击
Role EnemyFight(Role Enemy)
{
int i,tmp=5, SubBlood;
char temp[100];
SubBlood= Enemy.Attack*2 - Hero.Defend;
if( SubBlood<=10 ) SubBlood=random(10);
else SubBlood=SubBlood+random(SubBlood*1);
sprintf(temp,"-%d",SubBlood);
//敌人攻击
PlayDirectSound(SoundAttack[ SoundIt[Enemy.Pic] ]); //攻击声
for( i=0; i<10; i++)
{
ShowFight(0, Enemy);
rect=GetRect(i*54, 0, i*54+54, 50);
Blt(lpDDSPrimary, X1-10, Y1-32, lpDDSBomb, rect, TRUE);
Delay(60);
}
PlayDirectSound(SoundAo[0]); //痛苦声
for( i=0; i<10; i++)
{
Hero.x+=-tmp; tmp=-tmp;
ShowFight(0, Enemy);
PrintText(lpDDSPrimary, X1, Y1-32-i*5, temp, RGB(255,255,255));
Delay(50);
}
Hero.Lift-=SubBlood;
ShowFight(0, Enemy);
return Enemy;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -