📄 skill.cpp
字号:
#include "..\stdafx.h"
#include "DefaultHeader.h"
#include "Citem.h"
#include "Kein_item.h"
#include "Sealstone.h"
#include "..\HigherLayers\WeatherControl.h"//020610 lsw
#include "Scrp_exe.h"
#include "..\LowerLayers\servertable.h" // BBD 040311
extern void SaveBallancingSkill( LPCHARLIST a, int skillno );
extern int CanLocalWarAttack(CHARLIST* pAttacker,CHARLIST* pDefencer); // 020115 LTS 弥己悼 ,烙惑快傍悼 //020205 lsw
extern int CheckEventAttack();
extern bool isLevelUp(CHARLIST*);
t_ItemRare ItemRare[MAX_ITEM_RARE];
t_ItemGrade ItemGrade[MAX_ITEM_GRADE];
t_ItemMutantKind ItemMutantKind[MAX_ITEM_MUTANT_KIND];
static lpMAPSKILLTABLE g_Header[8][8];
CItem_Join item_join[ ITEM_JOIN_MAX];
t_earthpower EarthPower;
int TotalItemJoinTableCount;
int Npc_Item_Table[NPC_ITEM_TABLE_X][NPC_ITEM_TABLE_Y]; //npc啊 磷阑锭 唱棵 酒捞袍甸捞 葛咯乐绰 抛捞喉
int SkillLevelExp[ SKILL_LEVEL_EXP_TABLE_MAX_ + 1 ][ SKILL_LEVEL_EXP_TABLE_MAX_ +1 ];
int SkillExp[ SKILL_EXP_TABLE_MAX_ +1 ][SKILL_EXP_TABLE_MAX_ +1 ];
int MAX_JOB_LEVEL = 100; // CSD-040223
//<! BBD 040311
unsigned short g_UsercountInServerSet = 1501; // 弥檬 1501悼立捞扼绊 焊绊 矫累茄促.
float resource_rate[6] =
{
// 悼立俊 蝶弗 磊盔 硅啦
1.0f, 1.2f, 1.4f, 1.6f, 1.8f, 2.0f
};
//<! BBD 040322 俊捞辑侩
float resource_rate2[6] =
{
// 悼立俊 蝶弗 磊盔 硅啦
1.4f, 1.55f, 1.7f, 1.85f, 2.0f, 2.15f
};
//> BBD 040322
float GetResourceRate(int nCount);
//> BBD 040311
extern HDBC hDBC;
extern void SendOtherInv( int type, int other_id, t_connection c[], int cn );
extern void SendNK( int id, int nk );
extern inline int IsHeNK( LPCHARLIST ch, int nation );
extern inline int OutNK( LPCHARLIST ch, int nation );
extern void InNK( LPCHARLIST ch, int nation, short int add_nk );
extern inline bool IsWarfare( int anation, int bnation );
extern int GetCaseOfNK( int cur_nation, int a_nation, int d_nation, int a_nk, int d_nk ) ;
extern void CheckNK( int a_id, int d_id, int type );
extern bool ExtraExp(void);
extern int addEXP(CHARLIST *a, CHARLIST *d, int criteria, int damage );
extern void RequestUsercountToProxy(); // BBD 040311
// 030307 soto眠啊 吝赋瘤开牢瘤 魄窜茄促.
bool IsNeutralZone(int nMapNumber)
{ //< CSD-030314
return (MapInfo[nMapNumber].nation == 0) ? true:false; //吝赋瘤开俊辑父 档迪龙捞 啊瓷窍促.
} //> CSD-030314
// soto End.
int skillProb_k1( const int skillno, CItem_Join *join )
{
int k1 = 65;
if( join ) // ItemJoinTable俊辑 k1阑 啊廉柯促.
{
k1 = join->k1;
}
else
{
k1 = SkillTbl[skillno].k1;
}
if( k1 < 0 ) k1 = 0;
if( k1 > 100 ) k1 = 100;
return k1;
}
//-----------------------------------------------------
// 扁 瓷 : 扁贱 己傍涪狼 弥家蔼阑 府畔茄促.
// 牢 磊 : 扁贱锅龋.
// 府畔蔼 : 0 < n < 100
//-----------------------------------------------------
int skillProb_k2( const int skillno, CItem_Join *join )
{
int k2 = 65;
if( join ) // ItemJoinTable俊辑 k2阑 啊廉柯促.
{
k2 = join->k2;
}
else
{
k2 = SkillTbl[skillno].k2;
}
if( k2 < 0 ) k2 = 0;
if( k2 > 100 ) k2 = 100;
return k2;
}
int skillProb_needmax( const int skillno, const int target_id, CItem_Join *join )
{
int ret = 0;
switch( SkillTbl[skillno].MotherSkillExp )
{
// 公炼扒 100%
case 0 : ret = 100;
break;
// 弊成 1 - 100
case 1 : ret = 100;
break;
// 秦寸 酒摹袍狼 搬钦抛捞喉曼炼..
case 2 : if( join == NULL ) ret = 0;
else
{
ret = join->skill1_maximum;
return ret;
}
break;
// 秦寸 胶懦狼 抛捞喉曼炼.
case 3 : ret = SkillTbl[ skillno].Ability_max;
break;
// 胶懦狼 怕腐磐 单捞磐 曼炼..( 抛捞怪 )
case 4 : if( target_id >= 10000 )
{
ret = NPC_Gen_Ref[NPCList[ target_id - 10000].SprNo].Taming_max;
}
else
{
ret = 100;
}break;
// 秦寸 胶懦狼 某腐磐 单捞磐 曼炼..
case 5 : if( target_id >= 10000 )
{
ret = NPC_Gen_Ref[NPCList[ target_id-10000].SprNo].Talkanimal_max;
}
else
{
ret = 100;
}break;
// 酒捞袍狼 漂己 曼炼..版累...
case 6 : ret = 100;
break;
// 拱绊扁 抛捞喉 曼炼.. 超矫.
case 7 : ret = 100;
// 秦寸 胶懦 某腐磐 单捞磐 曼炼 ( 澜厩胶懦 )
case 8 :
case 9 :
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
default : ret = 100;
break;
}
if( ret < 0 ) ret = 0;
if( ret > 100 ) ret = 100;
return ret;
}
int skillProb_needmin( const int skillno, const int target_id, CItem_Join *join )
{
int ret = 25;
switch( SkillTbl[skillno].MotherSkillExp )
{
// 公炼扒 100%
case 0 : ret = 1;
break;
// 弊成 1 - 100
case 1 : ret = 1;
break;
// 秦寸 酒摹袍狼 搬钦抛捞喉曼炼..
case 2 : if( join == NULL ) ret = 0;
else ret = join->skill1_minimum;
break;
// 秦寸 胶懦狼 抛捞喉曼炼.
case 3 : ret = SkillTbl[ skillno].Ability_min;
break;
// 胶懦狼 怕腐磐 单捞磐 曼炼..( 抛捞怪 )
case 4 : if( target_id >= 10000 )
{
ret = NPC_Gen_Ref[NPCList[ target_id - 10000].SprNo].Taming_min;
}
else
{
ret = 1;
}
break;
// 秦寸 胶懦狼 某腐磐 单捞磐 曼炼..
case 5 : if( target_id >= 10000 )
{
ret = NPC_Gen_Ref[NPCList[ target_id-10000].SprNo].Talkanimal_min;
}
else
{
ret = 1;
}
break;
// 酒捞袍狼 漂己 曼炼..版累...
case 6 : ret = 1;
break;
// 拱绊扁 抛捞喉 曼炼.. 超矫.
case 7 : ret = 1;
// 秦寸 胶懦 某腐磐 单捞磐 曼炼 ( 澜厩胶懦 )
case 8 :
case 9 :
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
default : ret = 1;
break;
}
if( ret < 0 ) ret = 0;
if( ret > 100 ) ret = 100;
return ret;
}
int ReturnSkillProbablity( const int cn, const int skillno, const int x, const int y,
const int targettype, const int target_id,CItem_Join *joinitem = NULL )
{
if( cn >= 10000 ) return 0;
const int needmin = skillProb_needmin( skillno, target_id, joinitem );//聪靛固聪肛 罐酒坷绰镑! //this2 lsw
const int needmax = skillProb_needmax( skillno, target_id, joinitem );
int base = needmax - needmin;
if( base < 0 )
{
return 0;
}
if( base <= 0 )
{
base = 1;
}
int mybase = connections[ cn].chrlst.skillexp[ SkillTbl[skillno].MotherSkillType].skillexp / 10000 - needmin;
double k = (double)mybase / (double)base;
if(k>1) k=1;
const int k1 = skillProb_k1( skillno, joinitem );
const int k2 = skillProb_k2( skillno, joinitem );
int hitrate = (int)(k * k1 + k2);
if( hitrate < 0 ) hitrate = 0;
if( hitrate > 100 ) hitrate = 100;
AddSkillExp( cn, skillno, hitrate );
return hitrate;
}
void SendSkillResultFail( const int cn, const int iSkillNo, const int iWhy = 0 )
{
t_packet p;
p.h.header.type = CMD_SKILL_RESULT_FAIL;
p.u.server_skill_result_fail.skillno = iSkillNo;
p.u.server_skill_result_fail.why = iWhy;
p.h.header.size = sizeof( t_server_skill_result_fail );
QueuePacket( connections, cn, &p, 1);
}
void SendViewCharInfo(const int cn, int target_id, int type, DWORD data, char *killer)
{
t_packet p;
int len;
p.h.header.type = CMD_VIEW_CHAR_INFO;
p.u.view_char_info.server_id= target_id;
p.u.view_char_info.type = type;
p.u.view_char_info.data = data;
if( killer )
{
if( killer[0] ) EatRearWhiteChar( killer );
len = strlen( killer );
}
else len = 0;
if( killer != NULL ) strcpy( p.u.view_char_info.killer, killer );
else p.u.view_char_info.killer[0] = 0;
p.h.header.size = sizeof( t_view_char_info ) - ( 31 - len );
QueuePacket( connections, cn, &p, 1);
}
//1013 zhh 烹唱公客 格犁俊父 阂捞 嘿绰 巴阑 官槽促
int skill_Makefire_preCheck (const int cn, const int skillno, const int x, const int y, const int targettype, const int target_id )
{
int ret = ReturnSkillProbablity( cn, skillno, x, y, targettype, target_id );
if( ret == 0 ) { SendSkillResultFail(cn, skillno); return 0; }
switch( ItemList[target_id].item_no )
{
case 1011 : // <Log> <烹唱公>
case 1012 : // <Timber> <格犁>
case 1023 : // <Nutmeg Log> <厚磊唱公>
case 1024 : // <唱公> <府扁促唱公>
case 1025 : // <Fir Log> <备惑唱公>
case 1026 : // <Oak Log> <惑荐府唱公>
case 1027 : // <唱公> <芭力荐唱公>
case 1028 : // <Beech Log> <呈档广唱公>
case 1029 : // <Whitebirch Log> <磊累唱公 >
case 1030 : // <Nutmeg Timber> <厚磊唱公 格犁>
case 1031 : // <唱公> <府扁促唱公 格犁>
case 1032 : // <Fir Timber> <备惑唱公 格犁>
case 1033 : // <Oak Timber> <惑荐府唱公 格犁>
case 1034 : // <唱公> <芭力荐唱公 格犁>
case 1035 : // <Beech Timber> <呈档广唱公 格犁>
case 1036 : // <Whitebirch Timber> <磊累唱公 格犁>
break;
default :
SendSkillResultFail(cn, skillno);
return 0;
}
if( ( ItemList[ target_id].attr[ IATTR_ATTR] & IA2_FIRE ) == 0 )
{
ItemList[ target_id].attr[ IATTR_ATTR] |= IA2_NOTMOVE;
SetArea( CHANGE_IA2_ATTR_ITEM_AREA, target_id );
}
return 1;
}
void PrintSkillItemJoin( void )
{
FILE *fp;
CItem_Join *s;
int i;
int no;
fp = fopen( "./OutPut/WhatNeededToMakeItem.txt", "wt");
if( fp == NULL ) return;
for( i = 0 ; i < TotalItemJoinTableCount ; i ++)
{
s = &item_join[i];
no = s->item_id;
CItem *ii = ItemUnit( no/1000, no%1000 );
if( ii == NULL )
{
fprintf( fp, "\n %d俊 乐绰 Item篮 荤侩登瘤 臼绰 Item捞啊夸? \n\n", no );
continue;
}
fprintf( fp, "'%s(%d)'阑 掘阑妨搁 '%s(%d)扁贱捞 鞘夸.\n", ii->GetHanName(), no,
SkillTbl[s->need_skill1].Skill_Minute, s->need_skill1 );
fprintf( fp, " 鞘夸茄 扁贱篮 ");
if( s->need_skill1 ) fprintf( fp,"'%30s(%7d)'( %d - %d )\n", SkillTbl[s->need_skill1].Skill_Minute, s->need_skill1, s->skill1_minimum, s->skill1_maximum );
if( s->need_skill2 ) fprintf( fp, " '%30s(%7d)'( %d - %d )\n", SkillTbl[s->need_skill2].Skill_Minute, s->need_skill2, s->skill2_minimum, s->skill2_maximum );
if( s->need_skill1 == 0 && s->need_skill2 == 0 )
{
fprintf( fp, "绝嚼聪促. \n" );
}
if( s->resource1 == 0 && s->resource2 == 0 && s->resource3 == 0 && s->resource4 == 0)
{
fprintf( fp, " 捞扁贱篮 酒捞袍捞 鞘夸啊 绝嚼聪促. \n" );
}
else
{
// fprintf( fp, " 鞘夸茄 Item 篮 " );
if( s->resource1 )
if( s->resource1_amount )
{
ii = ItemUnit( s->resource1/1000, s->resource1%1000 );
if( ii ) fprintf( fp, " '%15s(%7d)' %d俺 鞘夸\n", ii->GetHanName(), s->resource1, s->resource1_amount );
}
if( s->resource2 )
if( s->resource2_amount )
{
ii = ItemUnit( s->resource2/1000, s->resource2%1000 );
if( ii ) fprintf( fp, " '%15s(%7d)' %d俺 鞘夸\n", ii->GetHanName(), s->resource2, s->resource2_amount );
}
if( s->resource3 )
if( s->resource3_amount )
{
ii = ItemUnit( s->resource3/1000, s->resource3%1000 );
if( ii ) fprintf( fp, " '%15s(%7d)' %d俺 鞘夸\n", ii->GetHanName(), s->resource3, s->resource3_amount );
}
if( s->resource4 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -