?? battle_magic.c
字號:
#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 + -