⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 battle_magic.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "version.h"#include<string.h>#include"char.h"#include"char_base.h"#include"battle.h"#include"battle_event.h"#include"magic_base.h"#include"battle_magic.h"#include"item_event.h"#include"anim_tbl.h"#include"common.h"#include"lssproto_serv.h"#ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能#include "profession_skill.h"#include "skill.h"#endif#ifdef __ATTACK_MAGICextern AttMagic *ATTMAGIC_magic;extern int       ATTMAGIC_magicnum;#define AJ_SAME	(1.0)#define AJ_UP	(1.5)#define AJ_DOWN	(0.6)#define ATTR_MAX 100#define D_ATTR (1.0/(ATTR_MAX*ATTR_MAX))#ifdef _FIX_MAGICDAMAGEstatic int BATTLE_getMagicAdjustInt( int attackindex, int defindex, int MagicLv, int flg,int damage );void Magic_ComputeAttExp( int charindex, int Mnum, int MagicLv, int Expoint);void Magic_ComputeDefExp( int charindex, int Mnum, int MagicLv, int Damage);#endif#ifdef _MAGIC_TOCALL/*typedef struct tagToCallMagic{  unsigned int  uiSpriteNum;			// 此咒术在Spr_x.bin的编号  unsigned int  uiAttackType;			// 攻击的方式:单人,整排( 轮流 ) ,  整排( 轮流 ) , 整排( 同时 ) , 全体( 轮流 ) , 全体( 同时 )  unsigned int  uiSliceTime;			// 轮流攻击时的时间差  unsigned int  uiShowType;             // 显示的位置方式:中央、指定  int           siSx;                   // 显示的位置 - X轴  int           siSy;                   // 显示的位置 - Y轴  unsigned int  uiShowBehindChar;       // 显示在人物的前方或下方  unsigned int  uiShakeScreen;          // 是否震动画面  unsigned int  uiShakeFrom;            // 震动画面的起始时间( 毫秒 )  unsigned int  uiShakeTo;              // 震动画面的结束时间( 毫秒 _  unsigned int  uiPrevMagicNum;         // 前置咒术的索引号( 0XFFFFFFFFFF 表示无前置咒术 )  int           siPrevMagicSx;          // 前置咒术的显示位置 - X轴  int           siPrevMagicSy;          // 前置咒术的显示位置 - Y轴  int           siPrevMagicOnChar;      // 前置咒术显示在人物的前方或下方  unsigned int  uiPostMagicNum;         // 後置咒术的索引号( 0XFFFFFFFF 表示无後置咒术 )  int           siPostMagicSx;          // 後置咒术的显示位置 - X轴  int           siPostMagicSy;          // 後置咒术的显示位置 - Y轴  int           siPostMagicOnChar;      // 後置咒术显示在人物的前方或下方  int			isPostDisappear;		// 咒术一般攻击完时是否马上消失  int			ToCallMagicNo;			// 召唤术的编号}ToCallMagic;*/  ToCallMagic TOCALL_magic[3] = { {100354,0,0,0,50,25,1,0,0,0,101120,65528,65485,0,-1,0,0,0,1,0},								{100354,1,0,0,50,25,1,0,0,0,101120,65528,65485,0,-1,0,0,0,1,1},								{100354,5,0,0,0,0,1,1,1000,4000,101120,65528,65485,0,-1,0,0,0,0,2},								};#endif// 魔法熟练度及抗性升级所需经验值int Magic_Level_Table[101] ={	   1,   3,   6,  10,  15,  21,  28,  36,  45,  55,	//lv  1~10		66,  78,	91, 105, 120, 136, 153, 171, 190, 210,  //lv 11~20	 231, 253, 276, 300, 325, 351, 378, 406, 435, 465,  //lv 21~30	 496, 528, 561, 595, 630, 666, 703, 741, 780, 820,  //lv 31~40	 861, 903, 946, 990,1035,1081,1128,1176,1225,1275,  //lv 41~50	1326,1378,1431,1485,1540,1596,1653,1711,1770,1830,  //lv 51~60	1891,1953,2016,2080,2145,2211,2278,2346,2415,2485,  //lv 61~70	2556,2628,2701,2775,2850,2926,3003,3081,3160,3240,  //lv 71~80	3321,3403,3486,3570,3655,3741,3828,3916,4005,4095,  //lv 81~90	4186,4278,4371,4465,4560,4656,4753,4851,4950,5050,  //lv 91~100	9999};#endif#if 0int	BATTLE_PointChange(	int ToList[], 	//	int kind,	int point){	return 0;}#endifint BATTLE_MagicEffect( int battleindex, int attackNo, int ToList[], int MyEffect, int ToEffect ){	int i;	char szCommand[256];	int attackindex;	attackindex = BATTLE_No2Index( battleindex, attackNo );	if( CHAR_CHECKINDEX( attackindex ) == FALSE )return 0;	snprintf( szCommand, sizeof(szCommand),		"BJ|a%X|m%X|e%X|e%X|",		attackNo,		CHAR_getInt( attackindex, CHAR_MP ),		MyEffect,		ToEffect	);		BATTLESTR_ADD( szCommand );	for( i = 0; ToList[i] != -1; i ++ ){		snprintf( szCommand, sizeof(szCommand), "r%X|",ToList[i]);		BATTLESTR_ADD( szCommand );	}	BATTLESTR_ADD( "FF|" );	return 0;}#ifdef __ATTACK_MAGICint BATTLE_AttMagicEffect( int battleindex , int attackNo , int ToList[] , int AttackMgcNo ){   int     i;   char    szcommand[256];   int     attackindex;   attackindex = BATTLE_No2Index( battleindex , attackNo );   if( FALSE == CHAR_CHECKINDEX( attackindex ) )       return 0;   if( attackNo >= 10 )      i = AttackMgcNo * 2;   else      i = AttackMgcNo * 2 + 1;   snprintf(   szcommand , sizeof( szcommand ) , "BJ|a%X|i%X|m%X|%X|%X|%X|s%X|t%X|l%X|%X|%X|%X|%X|%X|%X|o%X|o%X|o%X|s%X|%X|%X|" ,   attackNo , 12345678 , CHAR_getInt( attackindex , CHAR_MP ) ,   ATTMAGIC_magic[i].uiPrevMagicNum ,   ATTMAGIC_magic[i].uiSpriteNum ,   ATTMAGIC_magic[i].uiPostMagicNum ,   ATTMAGIC_magic[i].uiAttackType ,   ATTMAGIC_magic[i].uiSliceTime ,   ATTMAGIC_magic[i].uiShowType ,   ATTMAGIC_magic[i].siSx ,   ATTMAGIC_magic[i].siSy ,   ATTMAGIC_magic[i].siPrevMagicSx ,   ATTMAGIC_magic[i].siPrevMagicSy ,   ATTMAGIC_magic[i].siPostMagicSx ,   ATTMAGIC_magic[i].siPostMagicSy ,   ATTMAGIC_magic[i].siPrevMagicOnChar ,   ATTMAGIC_magic[i].uiShowBehindChar ,   ATTMAGIC_magic[i].siPostMagicOnChar ,   ATTMAGIC_magic[i].uiShakeScreen ,   ATTMAGIC_magic[i].uiShakeFrom ,   ATTMAGIC_magic[i].uiShakeTo   );   BATTLESTR_ADD( szcommand );   for( i = 0 ; ToList[i] != -1 ; i++ )   {      snprintf( szcommand , sizeof( szcommand ) , "r%X|" , ToList[i] );      BATTLESTR_ADD( szcommand );   }   BATTLESTR_ADD( "FF|" );   return 0;}#endif#ifdef _MAGIC_TOCALLint BATTLE_ToCallDragonEffect( int battleindex , int attackNo , int ToList[] , int AttackMgcNo ){   int     i;   char    szcommand[256];   int     attackindex;   attackindex = BATTLE_No2Index( battleindex , attackNo );   if( FALSE == CHAR_CHECKINDEX( attackindex ) )       return 0;/*   if( attackNo >= 10 )      i = AttackMgcNo * 2;   else      i = AttackMgcNo * 2 + 1;*/   snprintf(   szcommand , sizeof( szcommand ) , "B$|a%X|i%X|m%X|%X|%X|%X|s%X|t%X|l%X|%X|%X|%X|%X|%X|%X|o%X|o%X|o%X|s%X|%X|%X|%X|%X|" ,   attackNo , 5711438 , CHAR_getInt( attackindex , CHAR_MP ) ,	TOCALL_magic[AttackMgcNo].uiPrevMagicNum ,	TOCALL_magic[AttackMgcNo].uiSpriteNum ,	TOCALL_magic[AttackMgcNo].uiPostMagicNum ,	TOCALL_magic[AttackMgcNo].uiAttackType ,	TOCALL_magic[AttackMgcNo].uiSliceTime ,	TOCALL_magic[AttackMgcNo].uiShowType ,	TOCALL_magic[AttackMgcNo].siSx ,	TOCALL_magic[AttackMgcNo].siSy ,	TOCALL_magic[AttackMgcNo].siPrevMagicSx ,	TOCALL_magic[AttackMgcNo].siPrevMagicSy ,	TOCALL_magic[AttackMgcNo].siPostMagicSx ,	TOCALL_magic[AttackMgcNo].siPostMagicSy ,	TOCALL_magic[AttackMgcNo].siPrevMagicOnChar ,	TOCALL_magic[AttackMgcNo].uiShowBehindChar ,	TOCALL_magic[AttackMgcNo].siPostMagicOnChar ,	TOCALL_magic[AttackMgcNo].uiShakeScreen ,	TOCALL_magic[AttackMgcNo].uiShakeFrom ,	TOCALL_magic[AttackMgcNo].uiShakeTo ,	TOCALL_magic[AttackMgcNo].isPostDisappear ,	TOCALL_magic[AttackMgcNo].ToCallMagicNo   );   BATTLESTR_ADD( szcommand );   for( i = 0 ; ToList[i] != -1 ; i++ )   {      snprintf( szcommand , sizeof( szcommand ) , "r%X|" , ToList[i] );      BATTLESTR_ADD( szcommand );   }   BATTLESTR_ADD( "FF|" );   return 0;}#endif#ifdef _IMPRECATE_ITEMvoid BATTLE_ImprecateRecovery(	int battleindex, int attackNo, int toNo, int kind, int powers,	int rounds, int UseEffect, int RecevEffect ){	int i, toindex, flg;	int ToList[SIDE_OFFSET*2+1];	//char szBuffer[256]="";	BATTLE_MultiList( battleindex, toNo, ToList );	BATTLE_MagicEffect(		battleindex, attackNo, ToList,		UseEffect, RecevEffect );	for( i = 0; ToList[i] != -1; i ++ ){		toindex = BATTLE_No2Index( battleindex, ToList[i] );		if( CHAR_CHECKINDEX( toindex ) == FALSE )continue;		switch( kind ){#ifdef _IMPRECATE_ITEM		case BD_KIND_CURSE:			if( CHAR_getWorkInt( toindex, CHAR_WORKIMPRECATENUM1 ) <= 0 && 				CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) {				CHAR_setWorkInt( toindex, CHAR_WORKHURTMP, powers);	//伤害 MP				CHAR_setWorkInt( toindex, CHAR_WORKIMPRECATENUM1, rounds);			}			break;		case BD_KIND_BESTOW:			if( CHAR_getWorkInt( toindex, CHAR_WORKIMPRECATENUM2 ) <= 0 ){#ifdef _TYPE_TOXICATION				if( CHAR_CanCureFlg( toindex, "HP") == FALSE ) break;#endif				CHAR_setWorkInt( toindex, CHAR_WORKWISHESHP, powers);	//祝福 hp				CHAR_setWorkInt( toindex, CHAR_WORKIMPRECATENUM2, rounds);			}			break;		case BD_KIND_WISHES:			if( CHAR_getWorkInt( toindex, CHAR_WORKIMPRECATENUM3 ) <= 0 &&				CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) {				CHAR_setWorkInt( toindex, CHAR_WORKWISHESMP, powers);	//祝福 MP				CHAR_setWorkInt( toindex, CHAR_WORKIMPRECATENUM3, rounds);			}			break;#endif		}		//BATTLE_BroadCast( battleindex, szBuffer,		//	(attackNo >= 10)? CHAR_COLORGRAY : CHAR_COLORPURPLE ) ;		if( BattleArray[battleindex].norisk == 0		&&  CHAR_getInt( toindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET){			flg = CHAR_getWorkInt( toindex, CHAR_WORKBATTLEFLG );			if(  flg & CHAR_BATTLEFLG_RECOVERY ){			}else{				CHAR_PetAddVariableAi( toindex, AI_FIX_PETRECOVERY );				CHAR_setWorkInt( toindex, CHAR_WORKBATTLEFLG, flg | CHAR_BATTLEFLG_RECOVERY );			}		}	}	return;}#endifvoid BATTLE_MultiRecovery(	int battleindex,	int attackNo,	int toNo,	int kind,	int power,	int per,	int UseEffect,#ifdef _CHANGEITEMUSE	 // Syu ADD 调整战斗中使用料理设定	int RecevEffect,	int power1#else	int RecevEffect#endif){	int i, toindex, UpPoint = 0, workhp, oldhp, flg;#ifdef _CHANGEITEMUSE	 // Syu ADD 调整战斗中使用料理设定	int UpPoint1 = 0;#endif	int ToList[SIDE_OFFSET*2+1];	//char szBuffer[256]="";	char szCommand[256];		int ridepet, petUpPoint =0;	BATTLE_MultiList( battleindex, toNo, ToList );	BATTLE_MagicEffect( battleindex, attackNo, ToList, UseEffect, RecevEffect );	for( i = 0; ToList[i] != -1; i ++ ){		toindex = BATTLE_No2Index( battleindex, ToList[i] );		if( CHAR_CHECKINDEX( toindex ) == FALSE )	continue;		ridepet = BATTLE_getRidePet( toindex );		switch( kind ){#ifdef _ITEM_UNBECOMEPIG		case BD_KIND_UNBECOMEPIG:            if( CHAR_getInt( toindex, CHAR_BECOMEPIG ) > -1 ){		        CHAR_setInt( toindex, CHAR_BECOMEPIG, -1 );                CHAR_setInt( toindex, CHAR_BASEIMAGENUMBER, CHAR_getInt( toindex, CHAR_BASEBASEIMAGENUMBER));				CHAR_complianceParameter( toindex );		        CHAR_sendCToArroundCharacter( CHAR_getWorkInt( toindex , CHAR_WORKOBJINDEX ));		        CHAR_send_P_StatusString( toindex , CHAR_P_STRING_BASEBASEIMAGENUMBER);		        CHAR_talkToCli( toindex,-1,"乌力化失效了。",CHAR_COLORWHITE);			}		break;#endif #ifdef _ITEM_PROPERTY		case BD_KIND_PROPERTY:		{			if (CHAR_getInt(toindex, CHAR_WHICHTYPE)!=CHAR_TYPEPLAYER)            return;		//print("地水火风:%d %d %d %d", CHAR_getInt( toindex, CHAR_EARTHAT ), CHAR_getInt( toindex, CHAR_WATERAT ), CHAR_getInt( toindex, CHAR_FIREAT ), CHAR_getInt( toindex, CHAR_WINDAT ) );		if( power == 1 ){//旋转属性 正转	        if( CHAR_getInt( toindex, CHAR_EARTHAT ) == 100 )                CHAR_setInt( toindex, CHAR_EARTHAT, CHAR_getInt( toindex, CHAR_EARTHAT )-10 ),			    CHAR_setInt( toindex, CHAR_WATERAT, CHAR_getInt( toindex, CHAR_WATERAT )+10 );		    else if( CHAR_getInt( toindex, CHAR_WATERAT ) == 100 )                CHAR_setInt( toindex, CHAR_WATERAT, CHAR_getInt( toindex, CHAR_WATERAT )-10 ),			    CHAR_setInt( toindex, CHAR_FIREAT, CHAR_getInt( toindex, CHAR_FIREAT )+10 );            else if( CHAR_getInt( toindex, CHAR_FIREAT ) == 100 )                CHAR_setInt( toindex, CHAR_FIREAT, CHAR_getInt( toindex, CHAR_FIREAT )-10 ),			    CHAR_setInt( toindex, CHAR_WINDAT, CHAR_getInt( toindex, CHAR_WINDAT )+10 );            else if( CHAR_getInt( toindex, CHAR_WINDAT ) == 100 )                CHAR_setInt( toindex, CHAR_WINDAT, CHAR_getInt( toindex, CHAR_WINDAT )-10 ),			    CHAR_setInt( toindex, CHAR_EARTHAT, CHAR_getInt( toindex, CHAR_EARTHAT )+10 );			else if( CHAR_getInt( toindex, CHAR_EARTHAT ) > 0 && CHAR_getInt( toindex, CHAR_WATERAT ) > 0 )                CHAR_setInt( toindex, CHAR_EARTHAT, CHAR_getInt( toindex, CHAR_EARTHAT )-10 ),			    CHAR_setInt( toindex, CHAR_WATERAT, CHAR_getInt( toindex, CHAR_WATERAT )+10 );            else if( CHAR_getInt( toindex, CHAR_WATERAT ) > 0 && CHAR_getInt( toindex, CHAR_FIREAT ) > 0 )                CHAR_setInt( toindex, CHAR_WATERAT, CHAR_getInt( toindex, CHAR_WATERAT )-10 ),			    CHAR_setInt( toindex, CHAR_FIREAT, CHAR_getInt( toindex, CHAR_FIREAT )+10 );		    else if( CHAR_getInt( toindex, CHAR_FIREAT ) > 0 && CHAR_getInt( toindex, CHAR_WINDAT ) > 0 )                CHAR_setInt( toindex, CHAR_FIREAT, CHAR_getInt( toindex, CHAR_FIREAT )-10 ),			    CHAR_setInt( toindex, CHAR_WINDAT, CHAR_getInt( toindex, CHAR_WINDAT )+10 );            else if( CHAR_getInt( toindex, CHAR_WINDAT ) > 0 && CHAR_getInt( toindex, CHAR_EARTHAT ) > 0 )                CHAR_setInt( toindex, CHAR_WINDAT, CHAR_getInt( toindex, CHAR_WINDAT )-10 ),			    CHAR_setInt( toindex, CHAR_EARTHAT, CHAR_getInt( toindex, CHAR_EARTHAT )+10 );		}        if( power == 2 ){//旋转属性 反转			if( CHAR_getInt( toindex, CHAR_EARTHAT ) == 100 )                CHAR_setInt( toindex, CHAR_EARTHAT, CHAR_getInt( toindex, CHAR_EARTHAT )-10 ),			    CHAR_setInt( toindex, CHAR_WINDAT, CHAR_getInt( toindex, CHAR_WINDAT )+10 );		    else if( CHAR_getInt( toindex, CHAR_WATERAT ) == 100 )                CHAR_setInt( toindex, CHAR_WATERAT, CHAR_getInt( toindex, CHAR_WATERAT )-10 ),			    CHAR_setInt( toindex, CHAR_EARTHAT, CHAR_getInt( toindex, CHAR_EARTHAT )+10 );            else if( CHAR_getInt( toindex, CHAR_FIREAT ) == 100 )                CHAR_setInt( toindex, CHAR_FIREAT, CHAR_getInt( toindex, CHAR_FIREAT )-10 ),

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -