📄 op_battle.cpp
字号:
#include "..\stdafx.h"
#include "DefaultHeader.h"
#include "../LowerLayers/mylog.h" //!!
#include "CItem.h"
#include "WeatherControl.h"
#include "Map.h"
#include "Path.h"
#include "OP_Magic.h"
#include "SealStoneGameServer.h"
#include "SealStone.h"
#include "scrp_exe.h"
#include "teambattle.h"
#include "QuestFunction.h" // 021022 kyo
#include "LogManager.h"
#include "AIManager.h"
#include "ArenaManager.h"
#include "RegenManager.h"
#include "UserManager.h"
extern void CountNationDeath(CHARLIST* pCaster,CHARLIST* pTarget);
extern void CheckLocalWarDeath(CHARLIST* pCaster,CHARLIST* pTarget); // LTS LOCALWAR
extern void CheckEventLocalWarDeath(CHARLIST* Attacker,CHARLIST* Defencer); // 020115 LTS
extern bool isNationWarfieldServer();
extern bool IsWar();
extern void UpdateGuardStoneStatus(LPCHARLIST pCaster,LPCHARLIST pTarget);
extern bool isNewWarfieldServer();
extern void CountNewWarfieldDeath(LPCHARLIST Attacker,LPCHARLIST Defencer);
// 030506 YGI
extern char g_LogoutPath[80];
extern char g_ChangeLogPath[80];
// tactics skill definition
#define FIST 0
#define SWORD 1
#define AXE 2
#define MACE 3
#define STAFF 4
#define SPEAR 5
#define THR_SW 6
#define BOW 7
#define TWO_SW 8
#define TWO_AX 9
#define SHIELD 10
#define FENCING 11
#define PLAYER 0
#define NPC 1
#define MELEE 0 // 窜芭府.
#define RANGE_BOW 1 // 厘芭府..
#define RANGE_HURL 2 // 吝芭府.
#define RANGE_DEFAULT 3 // 窜芭府..
#define MAGIC 4 // 付过.
extern NPCName_by_Gender NPC_Name_Ref[Num_Of_NPC_Name];
extern NPCLev_to_Exp NPC_Lev_Ref[Num_Of_NPC_Lev] ;
extern NPC_Generation NPC_Gen_Ref[Num_Of_NPC_Generation] ;
// 010129
extern NPC_Generation NPC_Gen_Ref[Num_Of_NPC_Generation];
extern MAGICTABLE Magic_Ref[] ;
extern int GetEnemyEnemy( CHARLIST *a, CHARLIST *d );
extern bool isLevelUp(CHARLIST *chr);
extern void getItemIndex(int, int &, int &) ;
extern void SendServerKillPc( short int cn ); //
///////////////////// 0811 yjs 眠啊 ////////////////////////
extern bool IsWar(); // 010904 LTS // 惫啊傈 惑炔俊辑 傈里捞 酒聪搁 己巩 荐龋籍 固胶
extern bool CanDestroyTarget(CHARLIST* pCaster,CHARLIST* pTarget); // 010904 LTS // 规绢磊狼 己巩 荐龋籍 固胶
extern void CheckBossAndDeActiveGroupNo(CHARLIST* Npc); // LTS AI2
void rollDice(int base_hd, int &dice_res);
int getDistance(CHARLIST *a, CHARLIST *d);
int calcClassWeaponCorrection( CHARLIST * a, int itemtype ); // 努贰胶俊 嘎绰 Item阑 荤侩沁阑版快 20%刘啊茄促.
short int getWeatherCorrection( void );
int calcRangeCorrection(CHARLIST *a, CHARLIST *d );
int AttackMapper( int a_id, int d_id, int *damage_val);
void SendNK( int id, int nk );
void SendNK( int id, int nk3, int nk4, int nk6 );
inline int IsHeNK( LPCHARLIST ch, int nation );
inline int OutNK( LPCHARLIST ch, int nation );
void InNK( LPCHARLIST ch, int nation, short int add_nk );
inline bool IsWarfare( int anation, int bnation );
int GetCaseOfNK( int cur_nation, int a_nation, int d_nation, int a_nk, int d_nk ) ;
void CheckNK( int a_id, int d_id, int type );
extern void CheckDragonLordWarTeam(CHARLIST *a,CHARLIST *d); // LTS DRAGONLORD
// 020428 YGI acer
extern int SaveLogDefault( char *file_name, char *str, int is_first );
extern void SaveCharacterBin( char *filename, CHARLIST *ch );
///////////////////////////////////////////////////////////////////////////////////////
///
/// User Function Definitions....
///
inline int ran( int r )
{
if( r == 0 ) return 0;
return rand()%r;
}
void rollDice(int base_hd, int &dice_res) // 0712 YGI
{
int dice_type, dice_repeat;
int i ;
int plus = 0;
if( base_hd > 1000000 )
{
plus = base_hd % 1000;
base_hd /= 1000;
}
dice_type = base_hd % 1000 ;
dice_repeat = base_hd / 1000 ;
dice_res= 0 ;
for(i= 0 ; i < dice_repeat ; i++) {
dice_res+= (ran(dice_type) + 1);
}
dice_res += plus;
}
int getDistance(CHARLIST *a, CHARLIST *d)
{
double dist ;
dist= pow((a->X - d->X), 2) + pow((a->Y - d->Y), 2) ;
dist= sqrt(dist) ;
//return -1 ;
return (int)dist / TILE_SIZE ;
}
int calcClassWeaponCorrection( CHARLIST * a, int itemtype )
{
int item_no= a->equip[ itemtype].item_no ;
int type, no;
getItemIndex( item_no, type, no );
if( item_no <= 0 ) return 80;
CItem *ii = ItemUnit( type, no );
if( ii == NULL ) return 80;
else
{
if ( itemtype == WT_WEAPON || itemtype == WT_SHIELD )
{
switch( a->Class )
{
case WARRIOR : return CWeapon[no].Class_Warrior * 20 + 80;
case THIEF : return CWeapon[no].Class_Archer * 20 + 80;
case ARCHER : return CWeapon[no].Class_Thief * 20 + 80;
case WIZARD : return CWeapon[no].Class_Wizard * 20 + 80;
case PRIEST : return CWeapon[no].Class_Cleric * 20 + 80;
default : return 80;
}
}
}
return 80;
}
static bool bAttackChangeCondition_slow_i = false;
static bool bAttackChangeCondition_slow_you = false;
static bool bAttackChangeCondition_daze_i =false;
static bool bAttackChangeCondition_daze_you =false;
// 努贰胶-公扁喊 焊沥: 1.傈荤(窜芭府:100/吝芭府:100/厘芭府:90) 2.档利(窜芭府:90/吝芭府:100/厘芭府:100) 3.泵荐(窜芭府:90/吝芭府:100/厘芭府:100)
// 4.付过荤(窜芭府:100/吝芭府:100/厘芭府:100) 5.己流磊(窜芭府:100/吝芭府:100/厘芭府:100)
static int rate_by_class[5][3] = { { 100, 90, 100 }, { 90, 100, 100}, { 90, 100, 100}, { 100, 100, 100 }, { 100, 100, 100 } };
extern ItemAttr *GetItemByPOS( int cn, POS item ); // itemtable.cpp
void SendItemAttrDurationChange( t_connection c[], int cn, int pos )
{
t_packet p;
ItemAttr *i = &c[cn].chrlst.equip[pos];
if( i == NULL ) return;
if( i->item_no == 0 ) return;
p.h.header.type = CMD_ITEM_DURATION_CHANGE;
{
p.u.item_duration_change.pos = pos;
p.u.item_duration_change.dur = LOWORD( i->attr[ IATTR_DURATION] );
}
p.h.header.size = sizeof( t_item_duration_change );
QueuePacket( c, cn, &p, 1 );
}
extern void GetItemDuration( ItemAttr item, WORD &d_curr, WORD &d_max ); // 酒捞袍 郴备仿 惶酒 坷扁
// 020428 YGI acer
extern int BreakItemByDuration( ItemAttr *item, CHARLIST *ch, POS pos );
/* 公扁唱 规绢备狼 付畴档 拌魂..
// type : 0 傍拜档备.
// 1 规绢备
d_curr = LOWORD( item.attr[IATTR_DURATION] );
d_max = HIWORD( item.attr[IATTR_DURATION] );
亮篮 酒捞袍篮 1000历档甫 扁霖茄促.
拌魂篮 1000阑 啊瘤绊 窍瘤父 Display绰 /10阑 窍咯 钎矫茄促.
*/
int getEquipRandomPos( void )//郴备档 别阑锭 器瘤记阑 罐酒坷绰 何盒
{
const int pos = rand()%100;
if( pos < 25 ) {return WT_ARMOR;}
if( pos < 50 ) {return WT_SHIELD;}
if( pos < 75 ) {return WT_HELMET;}
if( pos < 100 ) {return WT_SHOES;}
return WT_ARMOR;
}
// 厘芭府 公扁狼 辆幅俊 蝶弗 荤沥芭府狼 函拳客 傍拜仿狼 啊皑..
////////////////////// 0804 lkh 眠啊 ////////////////////////
int calcRangeCorrection(CHARLIST *a, CHARLIST *d )
{
int range_corr= 100;
int min = 0, mid = 0, max = 0;
const int dist= getDistance(a, d) ;
if(dist < 2 ) return 100; // 惑龋 芭府啊 64固父捞搁..
const int ino = a->equip[ WT_WEAPON].item_no; // Item捞 绝促.
if( ino == 0 ) return 100;
CItem *ii = ItemUnit( ino/1000, ino%1000 ); // Item捞 绝促.
if( ii == NULL ) return 100;
// 公扁狼 荤沥芭府..
/*
int range = ii->Getrange();
if( range < 2 ) return 100;
*/
switch( ii->GetItemKind() )
{
case IK_HURL: // general throwing weapon
min = 3;
mid = 4;
max = 5;
break ;
case IK_LONG_BOW: // 010724 LSW
case IK_DUAL_BOW://030102 lsw Dual BOW
min = 13;
mid = 19;
max = 22;
break ;
case IK_SHORT_BOW : // short BOW
min = 4;
mid = 8;
max = 12;
break ;
case IK_TWO_ARROW : //拳混.籍泵..
case IK_DUAL_ARROW:
min = 5;
mid = 10;
max = 15;
break ;
default :
min = 3;
mid = 5;
max = 7;
break;
}
if ( dist < min ) range_corr= 100;
else if ( dist < mid ) range_corr= 90;
else if ( dist < max ) range_corr= 85;
return range_corr;
}
int addEXP(CHARLIST *a, CHARLIST *d, int criteria, int damage )
{ //< CSD-030509
if (g_pArenaManager->IsColossusArena())
{
return 0;
}
//> CSD-030509
if (a == NULL || d == NULL) return 0;
if (a->IsNpc()) return 0;
if (a->IsPlayer() && d->IsPlayer()) return 0;
int exp;
float base_point;
DWORD partyexp;
int tdamage;
int t,i;
int partexpflag = 0;
bool bCanGetExpPcPc = false;
damage = abs(damage);
switch (d->Race)
{ // 版氰摹甫 林瘤 臼绰 NPC
case GUARD:
case SEALSTONE: return 0;
}
if( d->SprNo == 96 ) return 0;
if (d->IsTamedNpc()) return 0; // 怕怪等 局茄抛辑绰 版摹甫 掘阑荐 绝促.
#ifdef _NATION_APPLY_
if( d->SprType != SPRITETYPE_NPC )
if( a->name_status.nation != d->name_status.nation ) bCanGetExpPcPc = true; // 0927 YGI
#endif
switch(criteria)
{
case HIT_FAILED : return 0;
case HIT_AND_DEAD:
case HIT_AND_NOTDEAD:
{
if (bCanGetExpPcPc == false)
if (a->IsPlayer() && d->IsPlayer())
{// PK茄 惑怕捞促.
return 0;
}
if( d ) // 版氰摹甫 掘阑荐 绝绰 NPC甸..
if( d->SprType == SPRITETYPE_NPC )
{
switch( d->SprNo )
{
case 92 : // 扁嫡..
case 93 : // 扁嫡..
case 94 : // 苞翅..
case 95 : // 倾荐酒厚.
case 96 : // 倾荐酒厚.
{
if (a->GetLevel() > ENABLE_DUMMY_LEVEL)
{ //< CSD-030806
return 0;
} //> CSD-030806
}
}
// NPC狼 辆练捞 牢埃捞搁...版摹绝澜..
if( d->Race == 1 ) return 0;
}
const int nTotal = (d->IsPlayer()) ? NPC_Lev_Ref[d->GetLevel()].nTrainingExp:
NPC_Gen_Ref[d->npc_index].nEpMax; // CSD-030806
if (a->GetLevel() == d->GetLevel())
{ //< CSD-030806
t = 1;
} //> CSD-030806
if (a->GetLevel() < d->GetLevel())
{ //< CSD-030806
t = 1;
if( NPC_Lev_Ref[a->GetLevel()].nGreatRate )
{
t = (d->GetLevel() - a->GetLevel())/NPC_Lev_Ref[a->GetLevel()].nGreatRate;
}
else
{
SaveCharacterBin( "error_level_check", a);
}
} //> CSD-030806
if (a->GetLevel() > d->GetLevel())
{ //< CSD-030806
t = 1;
if( NPC_Lev_Ref[a->GetLevel()].nLessRate )
{
t = (a->GetLevel() - d->GetLevel())/NPC_Lev_Ref[a->GetLevel()].nLessRate;
}
else
{
SaveCharacterBin( "error_level_check", a);
}
} //> CSD-030806
base_point = (t < 1) ? nTotal:nTotal/t;
break;
}
case HIT_GHOSTRESURRECTION:
{
base_point = damage;
break;
}
}
// base_point甫 捞侩秦 版摹狼 樊阑 拌魂茄促.
switch(criteria)
{
case HIT_FAILED: exp = 0; partexpflag = 0; break;
case HIT_AND_DEAD:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -