- Added a define list for weapon types in pc.h
- Cleaned up pc_checkallowskill and moved the Gatling fever check to it. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5912 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
7aa1324af3
commit
f3d9444348
@ -4,6 +4,9 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
|
||||
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
||||
|
||||
2006/04/05
|
||||
* Added a define list for weapon types in pc.h [Skotlex]
|
||||
* Cleaned up pc_checkallowskill and moved the Gatling fever check to it.
|
||||
[Skotlex]
|
||||
* Some cleanup of clif_parseloadendack, fixed guild-member list being sent
|
||||
on all map-changes. [Skotlex]
|
||||
* Removed the hardcoded removal of characters who spawn in a castle. All
|
||||
|
@ -485,9 +485,9 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
|
||||
|
||||
if(sc->data[SC_REJECTSWORD].timer!=-1 && flag&BF_WEAPON &&
|
||||
// Fixed the condition check [Aalye]
|
||||
(src->type==BL_MOB || (src->type==BL_PC && (((struct map_session_data *)src)->status.weapon == 1 ||
|
||||
((struct map_session_data *)src)->status.weapon == 2 ||
|
||||
((struct map_session_data *)src)->status.weapon == 3)))){
|
||||
(src->type==BL_MOB || (src->type==BL_PC && (((struct map_session_data *)src)->status.weapon == W_DAGGER ||
|
||||
((struct map_session_data *)src)->status.weapon == W_1HSWORD ||
|
||||
((struct map_session_data *)src)->status.weapon == W_2HSWORD)))){
|
||||
if(rand()%100 < (15*sc->data[SC_REJECTSWORD].val1)){
|
||||
damage = damage*50/100;
|
||||
clif_damage(bl,src,gettick(),0,0,damage,0,0,0);
|
||||
@ -685,8 +685,8 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int
|
||||
weapon = sd->weapontype2;
|
||||
switch(weapon)
|
||||
{
|
||||
case 0x01: // Knife
|
||||
case 0x02: // 1HS
|
||||
case W_DAGGER:
|
||||
case W_1HSWORD:
|
||||
{
|
||||
// 剣?C練(+4 ?` +40) 片手剣 短剣含む
|
||||
if((skill = pc_checkskill(sd,SM_SWORD)) > 0) {
|
||||
@ -694,7 +694,7 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x03: // 2HS
|
||||
case W_2HSWORD:
|
||||
{
|
||||
// 両手剣?C練(+4 ?` +40) 両手剣
|
||||
if((skill = pc_checkskill(sd,SM_TWOHAND)) > 0) {
|
||||
@ -702,8 +702,8 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x04: // 1HL
|
||||
case 0x05: // 2HL
|
||||
case W_1HSPEAR:
|
||||
case W_2HSPEAR:
|
||||
{
|
||||
// 槍?C練(+4 ?` +40,+5 ?` +50) 槍
|
||||
if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) {
|
||||
@ -714,36 +714,30 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x06: // 1H Axe
|
||||
case 0x07: // 2H Axe by Tato
|
||||
case W_1HAXE:
|
||||
case W_2HAXE:
|
||||
{
|
||||
if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) {
|
||||
damage += (skill * 3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x08: // Maces
|
||||
case W_MACE:
|
||||
{
|
||||
if((skill = pc_checkskill(sd,PR_MACEMASTERY)) > 0) {
|
||||
damage += (skill * 3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x09: // ‚È‚µ?
|
||||
break;
|
||||
case 0x0a: // Staffs
|
||||
break;
|
||||
case 0x0b: // Bows
|
||||
break;
|
||||
case 0x00: // Bare Hands
|
||||
case 0x0c: // Knuckles
|
||||
case W_FIST:
|
||||
case W_KNUCKLE:
|
||||
{
|
||||
if((skill = pc_checkskill(sd,MO_IRONHAND)) > 0) {
|
||||
damage += (skill * 3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x0d: // Musical Instrument
|
||||
case W_MUSICAL:
|
||||
{
|
||||
// 楽器の練?K(+3 ?` +30) 楽器
|
||||
if((skill = pc_checkskill(sd,BA_MUSICALLESSON)) > 0) {
|
||||
@ -751,7 +745,7 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x0e: // Whips
|
||||
case W_WHIP:
|
||||
{
|
||||
// Dance Lesson Skill Effect(+3 damage for every lvl = +30) 鞭
|
||||
if((skill = pc_checkskill(sd,DC_DANCINGLESSON)) > 0) {
|
||||
@ -759,7 +753,7 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x0f: // Book
|
||||
case W_BOOK:
|
||||
{
|
||||
// Advance Book Skill Effect(+3 damage for every lvl = +30) {
|
||||
if((skill = pc_checkskill(sd,SA_ADVANCEDBOOK)) > 0) {
|
||||
@ -767,7 +761,7 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x10: // Katars
|
||||
case W_KATAR:
|
||||
{
|
||||
if((skill = pc_checkskill(sd,ASC_KATAR)) > 0) {
|
||||
//Advanced Katar Research by zanetheinsane
|
||||
@ -780,12 +774,6 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x11: // Revolver
|
||||
case 0x12: // Rifle
|
||||
case 0x13: // Shotgun
|
||||
case 0x14: //Gatling Gun
|
||||
case 0x15: //Grenade Launcher
|
||||
break;
|
||||
}
|
||||
/*//need to add this on shuriken skills.
|
||||
if((skill = pc_checkskill(sd,NJ_TOBIDOUGU)) > 0) {
|
||||
@ -910,7 +898,7 @@ static void battle_calc_base_damage(struct block_list *src, struct block_list *t
|
||||
if (!(
|
||||
sd->special_state.no_sizefix ||
|
||||
(sc && sc->data[SC_WEAPONPERFECTION].timer!=-1) ||
|
||||
(pc_isriding(sd) && (sd->status.weapon==4 || sd->status.weapon==5) && t_size==1) ||
|
||||
(pc_isriding(sd) && (sd->status.weapon==W_1HSPEAR || sd->status.weapon==W_2HSPEAR) && t_size==1) ||
|
||||
(flag&8)
|
||||
))
|
||||
{
|
||||
@ -1034,12 +1022,12 @@ static struct Damage battle_calc_weapon_attack(
|
||||
//Set miscellaneous data that needs be filled regardless of hit/miss
|
||||
if(sd) {
|
||||
switch (sd->status.weapon) {
|
||||
case 11:
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
case 20:
|
||||
case 21:
|
||||
case W_BOW:
|
||||
case W_REVOLVER:
|
||||
case W_RIFLE:
|
||||
case W_SHOTGUN:
|
||||
case W_GATLING:
|
||||
case W_GRENADE:
|
||||
wd.flag=(wd.flag&~BF_RANGEMASK)|BF_LONG;
|
||||
flag.arrow = 1;
|
||||
break;
|
||||
@ -1427,7 +1415,7 @@ static struct Damage battle_calc_weapon_attack(
|
||||
//Add any bonuses that modify the base baseatk+watk (pre-skills)
|
||||
if(sd)
|
||||
{
|
||||
if (sd->status.weapon <= MAX_WEAPON_TYPE && (sd->atk_rate != 100 || sd->weapon_atk_rate[sd->status.weapon] != 0))
|
||||
if (sd->status.weapon < MAX_WEAPON_TYPE && (sd->atk_rate != 100 || sd->weapon_atk_rate[sd->status.weapon] != 0))
|
||||
ATK_RATE(sd->atk_rate + sd->weapon_atk_rate[sd->status.weapon]);
|
||||
|
||||
if(flag.cri && sd->crit_atk_rate)
|
||||
@ -1552,7 +1540,7 @@ static struct Damage battle_calc_weapon_attack(
|
||||
skillratio += 25*skill_lv;
|
||||
break;
|
||||
case RG_BACKSTAP:
|
||||
if(sd && sd->status.weapon == 11 && battle_config.backstab_bow_penalty)
|
||||
if(sd && sd->status.weapon == W_BOW && battle_config.backstab_bow_penalty)
|
||||
skillratio += (200+40*skill_lv)/2;
|
||||
else
|
||||
skillratio += 200+40*skill_lv;
|
||||
@ -1753,7 +1741,7 @@ static struct Damage battle_calc_weapon_attack(
|
||||
case TK_COUNTER:
|
||||
case TK_JUMPKICK:
|
||||
//TK_RUN kick damage bonus.
|
||||
if(sd && sd->weapontype1 == 0 && sd->weapontype2 == 0)
|
||||
if(sd && sd->weapontype1 == W_FIST && sd->weapontype2 == W_FIST)
|
||||
ATK_ADD(10*pc_checkskill(sd, TK_RUN));
|
||||
break;
|
||||
case GS_MAGICALBULLET:
|
||||
@ -2111,7 +2099,7 @@ static struct Damage battle_calc_weapon_attack(
|
||||
|
||||
if(sd && !skill_num && !flag.cri)
|
||||
{ //Check for double attack.
|
||||
if(( (skill_lv = 5*pc_checkskill(sd,TF_DOUBLE)) > 0 && sd->weapontype1 == 0x01) ||
|
||||
if(( (skill_lv = 5*pc_checkskill(sd,TF_DOUBLE)) > 0 && sd->weapontype1 == W_DAGGER) ||
|
||||
sd->double_rate > 0) //Success chance is not added, the higher one is used? [Skotlex]
|
||||
{
|
||||
if (rand()%100 < (skill_lv>sd->double_rate?skill_lv:sd->double_rate))
|
||||
@ -2120,7 +2108,7 @@ static struct Damage battle_calc_weapon_attack(
|
||||
damage_div_fix(wd.damage, wd.div_);
|
||||
wd.type = 0x08;
|
||||
}
|
||||
} else if (( (skill_lv = 5*pc_checkskill(sd,GS_CHAINACTION)) > 0 && sd->weapontype1 == 0x11) || sd->double_rate > 0)
|
||||
} else if (( (skill_lv = 5*pc_checkskill(sd,GS_CHAINACTION)) > 0 && sd->weapontype1 == W_REVOLVER) || sd->double_rate > 0)
|
||||
if (rand()%100 < (skill_lv>sd->double_rate?skill_lv:sd->double_rate))
|
||||
{
|
||||
wd.div_=skill_get_num(GS_CHAINACTION,skill_lv?skill_lv:1);
|
||||
@ -2157,7 +2145,7 @@ static struct Damage battle_calc_weapon_attack(
|
||||
wd.damage2 = wd.damage2 * (30 + (skill * 10))/100;
|
||||
if(wd.damage2 < 1) wd.damage2 = 1;
|
||||
}
|
||||
} else if(sd->status.weapon == 16)
|
||||
} else if(sd->status.weapon == W_KATAR)
|
||||
{ //Katars
|
||||
skill = pc_checkskill(sd,TF_DOUBLE);
|
||||
wd.damage2 = wd.damage * (1 + (skill * 2))/100;
|
||||
@ -2997,8 +2985,8 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
|
||||
race = status_get_race(target);
|
||||
ele = status_get_elem_type(target);
|
||||
|
||||
if(sd && (sd->status.weapon == 11 || sd->status.weapon == 17 || sd->status.weapon == 18
|
||||
|| sd->status.weapon == 19 || sd->status.weapon == 20 || sd->status.weapon == 21)) {
|
||||
if(sd && (sd->status.weapon == W_BOW || (sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE))
|
||||
) {
|
||||
if(sd->equip_index[10] >= 0) {
|
||||
if(battle_config.arrow_decrement)
|
||||
pc_delitem(sd,sd->equip_index[10],1,0);
|
||||
@ -3042,7 +3030,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
|
||||
|
||||
}
|
||||
//Recycled the damage variable rather than use a new one... [Skotlex]
|
||||
if(sd && (damage = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= MAX_WEAPON_TYPE) // triple blow works with bows ^^ [celest]
|
||||
if(sd && (damage = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0) // triple blow works with bows ^^ [celest]
|
||||
{
|
||||
int triple_rate= 30 - damage; //Base Rate
|
||||
if (sc && sc->data[SC_SKILLRATE_UP].timer!=-1 && sc->data[SC_SKILLRATE_UP].val1 == MO_TRIPLEATTACK)
|
||||
|
88
src/map/pc.c
88
src/map/pc.c
@ -455,24 +455,24 @@ int pc_calcweapontype(struct map_session_data *sd)
|
||||
{
|
||||
nullpo_retr(0, sd);
|
||||
|
||||
if(sd->weapontype1 != 0 && sd->weapontype2 == 0)
|
||||
if(sd->weapontype1 != W_FIST && sd->weapontype2 == W_FIST)
|
||||
sd->status.weapon = sd->weapontype1;
|
||||
if(sd->weapontype1 == 0 && sd->weapontype2 != 0)// <20>¶Žè•<C3A8>Ší Only
|
||||
else if(sd->weapontype1 == W_FIST && sd->weapontype2 != W_FIST)// <20>¶Žè•<C3A8>Ší Only
|
||||
sd->status.weapon = sd->weapontype2;
|
||||
else if(sd->weapontype1 == 1 && sd->weapontype2 == 1)// ?’Z?
|
||||
else if(sd->weapontype1 == W_DAGGER && sd->weapontype2 == W_DAGGER)// ?’Z?
|
||||
sd->status.weapon = MAX_WEAPON_TYPE+1;
|
||||
else if(sd->weapontype1 == 2 && sd->weapontype2 == 2)// ??Žè?
|
||||
else if(sd->weapontype1 == W_1HSWORD && sd->weapontype2 == W_1HSWORD)// ??Žè?
|
||||
sd->status.weapon = MAX_WEAPON_TYPE+2;
|
||||
else if(sd->weapontype1 == 6 && sd->weapontype2 == 6)// ??Žè•€
|
||||
else if(sd->weapontype1 == W_1HAXE && sd->weapontype2 == W_1HAXE)// ??Žè•€
|
||||
sd->status.weapon = MAX_WEAPON_TYPE+3;
|
||||
else if( (sd->weapontype1 == 1 && sd->weapontype2 == 2) ||
|
||||
(sd->weapontype1 == 2 && sd->weapontype2 == 1) ) // ’Z? - ?Žè?
|
||||
else if( (sd->weapontype1 == W_DAGGER && sd->weapontype2 == W_1HSWORD) ||
|
||||
(sd->weapontype1 == W_1HSWORD && sd->weapontype2 == W_DAGGER) ) // ’Z? - ?Žè?
|
||||
sd->status.weapon = MAX_WEAPON_TYPE+4;
|
||||
else if( (sd->weapontype1 == 1 && sd->weapontype2 == 6) ||
|
||||
(sd->weapontype1 == 6 && sd->weapontype2 == 1) ) // ’Z? - •€
|
||||
else if( (sd->weapontype1 == W_DAGGER && sd->weapontype2 == W_1HAXE) ||
|
||||
(sd->weapontype1 == W_1HAXE && sd->weapontype2 == W_DAGGER) ) // ’Z? - •€
|
||||
sd->status.weapon = MAX_WEAPON_TYPE+5;
|
||||
else if( (sd->weapontype1 == 2 && sd->weapontype2 == 6) ||
|
||||
(sd->weapontype1 == 6 && sd->weapontype2 == 2) ) // ?Žè? - •€
|
||||
else if( (sd->weapontype1 == W_1HSWORD && sd->weapontype2 == W_1HAXE) ||
|
||||
(sd->weapontype1 == W_1HAXE && sd->weapontype2 == W_1HSWORD) ) // ?Žè? - •€
|
||||
sd->status.weapon = MAX_WEAPON_TYPE+6;
|
||||
else
|
||||
sd->status.weapon = sd->weapontype1;
|
||||
@ -586,18 +586,14 @@ int pc_isequip(struct map_session_data *sd,int n)
|
||||
|
||||
if (sd->status.base_level > 96 && item->equip & 0x022 && item->type == 4)
|
||||
switch(item->look) { //In weapons, the look determines type of weapon.
|
||||
case 0x01: //Level 4 Knives are equippable.. this means all knives, I'd guess?
|
||||
case 0x02: //All 1H swords
|
||||
case 0x06: //All 1H Axes
|
||||
case 0x08: //All Maces
|
||||
case 0x0a: //All Staffs
|
||||
case W_DAGGER: //Level 4 Knives are equippable.. this means all knives, I'd guess?
|
||||
case W_1HSWORD: //All 1H swords
|
||||
case W_1HAXE: //All 1H Axes
|
||||
case W_MACE: //All Maces
|
||||
case W_STAFF: //All Staffs
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if((item->equip & 0x0002 || item->equip & 0x0020) && item->type == 4 && sd->status.weapon != 20 && sd->sc.data[SC_GATLINGFEVER].timer != -1)
|
||||
status_change_end(&sd->bl,SC_GATLINGFEVER,-1); // added to disable effects if new wepaon is not a Gatlin gun [Reddozen]
|
||||
|
||||
}
|
||||
//Not equipable by class. [Skotlex]
|
||||
if (!(1<<(sd->class_&MAPID_BASEMASK)&item->class_base[(sd->class_&JOBL_2_1)?1:((sd->class_&JOBL_2_2)?2:0)]))
|
||||
@ -3286,39 +3282,41 @@ int pc_checkskill(struct map_session_data *sd,int skill_id)
|
||||
*/
|
||||
int pc_checkallowskill(struct map_session_data *sd)
|
||||
{
|
||||
const int scw_list[] = {
|
||||
SC_TWOHANDQUICKEN,
|
||||
SC_ONEHAND,
|
||||
SC_AURABLADE,
|
||||
SC_PARRYING,
|
||||
SC_SPEARSQUICKEN,
|
||||
SC_ADRENALINE,
|
||||
SC_ADRENALINE2,
|
||||
SC_GATLINGFEVER
|
||||
};
|
||||
const int scs_list[] = {
|
||||
SC_AUTOGUARD,
|
||||
SC_DEFENDER,
|
||||
SC_REFLECTSHIELD
|
||||
};
|
||||
int i;
|
||||
nullpo_retr(0, sd);
|
||||
|
||||
if(!sd->sc.count)
|
||||
return 0;
|
||||
|
||||
// Skills requiring specific weapon types
|
||||
if(sd->sc.data[SC_TWOHANDQUICKEN].timer!=-1 && !(skill_get_weapontype(KN_TWOHANDQUICKEN)&(1<<sd->status.weapon)))
|
||||
status_change_end(&sd->bl,SC_TWOHANDQUICKEN,-1);
|
||||
if(sd->sc.data[SC_ONEHAND].timer!=-1 && !(skill_get_weapontype(KN_ONEHAND)&(1<<sd->status.weapon)))
|
||||
status_change_end(&sd->bl,SC_ONEHAND,-1);
|
||||
if(sd->sc.data[SC_AURABLADE].timer!=-1 && !(skill_get_weapontype(LK_AURABLADE)&(1<<sd->status.weapon)))
|
||||
// Aura Blade requires any weapon but bare fists
|
||||
status_change_end(&sd->bl,SC_AURABLADE,-1);
|
||||
if(sd->sc.data[SC_PARRYING].timer!=-1 && !(skill_get_weapontype(LK_PARRYING)&(1<<sd->status.weapon)))
|
||||
status_change_end(&sd->bl,SC_PARRYING,-1);
|
||||
if(sd->sc.data[SC_SPEARSQUICKEN].timer!=-1 && !(skill_get_weapontype(CR_SPEARQUICKEN)&(1<<sd->status.weapon)))
|
||||
// Spear Quicken requires a Two-handed spear
|
||||
status_change_end(&sd->bl,SC_SPEARSQUICKEN,-1);
|
||||
if(sd->sc.data[SC_ADRENALINE].timer!=-1 && !(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon)))
|
||||
status_change_end(&sd->bl,SC_ADRENALINE,-1);
|
||||
if(sd->sc.data[SC_ADRENALINE2].timer!=-1 && !(skill_get_weapontype(BS_ADRENALINE2)&(1<<sd->status.weapon)))
|
||||
status_change_end(&sd->bl,SC_ADRENALINE2,-1);
|
||||
if( sd->sc.data[SC_SPURT].timer!=-1 && sd->status.weapon)
|
||||
for (i = 0; i < sizeof(scw_list)/sizeof(scw_list[0]); i++)
|
||||
{ // Skills requiring specific weapon types
|
||||
if(sd->sc.data[scw_list[i]].timer!=-1 && !(skill_get_weapontype(StatusSkillChangeTable[scw_list[i]])&(1<<sd->status.weapon)))
|
||||
status_change_end(&sd->bl,scw_list[i],-1);
|
||||
}
|
||||
|
||||
if(sd->sc.data[SC_SPURT].timer!=-1 && sd->status.weapon)
|
||||
// Spurt requires bare hands (feet, in fact xD)
|
||||
status_change_end(&sd->bl,SC_SPURT,-1);
|
||||
|
||||
|
||||
if(sd->status.shield <= 0) { // Skills requiring a shield
|
||||
if(sd->sc.data[SC_AUTOGUARD].timer!=-1) // Guard
|
||||
status_change_end(&sd->bl,SC_AUTOGUARD,-1);
|
||||
if(sd->sc.data[SC_DEFENDER].timer!=-1) // Defending Aura
|
||||
status_change_end(&sd->bl,SC_DEFENDER,-1);
|
||||
if(sd->sc.data[SC_REFLECTSHIELD].timer!=-1) // Shield Reflect
|
||||
status_change_end(&sd->bl,SC_REFLECTSHIELD,-1);
|
||||
for (i = 0; i < sizeof(scs_list)/sizeof(scs_list[0]); i++)
|
||||
if(sd->sc.data[scs_list[i]].timer!=-1) // Guard
|
||||
status_change_end(&sd->bl,scs_list[i],-1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
26
src/map/pc.h
26
src/map/pc.h
@ -13,6 +13,32 @@
|
||||
//Update this max as necessary. 53 is the value needed for Super Baby currently
|
||||
#define MAX_SKILL_TREE 53
|
||||
|
||||
enum {
|
||||
W_FIST, //Bare hands
|
||||
W_DAGGER, //1
|
||||
W_1HSWORD, //2
|
||||
W_2HSWORD, //3
|
||||
W_1HSPEAR, //4
|
||||
W_2HSPEAR, //5
|
||||
W_1HAXE, //6
|
||||
W_2HAXE, //7
|
||||
W_MACE, //8
|
||||
W_UNKNOWN, //View 9 seems unused anywhere
|
||||
W_STAFF, //10
|
||||
W_BOW, //11
|
||||
W_KNUCKLE, //12
|
||||
W_MUSICAL, //13
|
||||
W_WHIP, //14
|
||||
W_BOOK, //15
|
||||
W_KATAR, //16
|
||||
W_REVOLVER, //17
|
||||
W_RIFLE, //18
|
||||
W_SHOTGUN, //19
|
||||
W_GATLING, //20
|
||||
W_GRENADE, //21
|
||||
MAX_WEAPON_TYPE
|
||||
} weapon_type;
|
||||
|
||||
#define pc_setdead(sd) ((sd)->state.dead_sit = (sd)->vd.dead_sit = 1)
|
||||
#define pc_setsit(sd) ((sd)->state.dead_sit = (sd)->vd.dead_sit = 2)
|
||||
#define pc_isdead(sd) ((sd)->state.dead_sit == 1)
|
||||
|
@ -934,13 +934,13 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
|
||||
{
|
||||
if(sd) {
|
||||
// Automatic trigger of Blitz Beat
|
||||
if (pc_isfalcon(sd) && sd->status.weapon == 11 && (skill=pc_checkskill(sd,HT_BLITZBEAT))>0 &&
|
||||
if (pc_isfalcon(sd) && sd->status.weapon == W_BOW && (skill=pc_checkskill(sd,HT_BLITZBEAT))>0 &&
|
||||
rand()%1000 <= sd->paramc[5]*10/3+1 ) {
|
||||
int lv=(sd->status.job_level+9)/10;
|
||||
skill_castend_damage_id(src,bl,HT_BLITZBEAT,(skill<lv)?skill:lv,tick,0xf00000);
|
||||
}
|
||||
// Gank
|
||||
if(dstmd && !dstmd->state.steal_flag && sd->status.weapon != 11 && (skill=pc_checkskill(sd,RG_SNATCHER)) > 0 &&
|
||||
if(dstmd && !dstmd->state.steal_flag && sd->status.weapon != W_BOW && (skill=pc_checkskill(sd,RG_SNATCHER)) > 0 &&
|
||||
(skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > rand()%1000) {
|
||||
if(pc_steal_item(sd,bl))
|
||||
clif_skill_nodamage(src,bl,TF_STEAL,skill2,1);
|
||||
@ -1507,11 +1507,12 @@ int skill_break_equip(struct block_list *bl, unsigned short where, int rate, int
|
||||
rate -= rate*sd->unbreakable/100;
|
||||
if (where&EQP_WEAPON) {
|
||||
switch (sd->status.weapon) {
|
||||
case 0: //Bare fists should not break :P
|
||||
case 7:
|
||||
case 8: // Axes and Maces can't be broken [DracoRPG]
|
||||
case 10:
|
||||
case 15: //Rods and Books can't be broken [Skotlex]
|
||||
case W_FIST: //Bare fists should not break :P
|
||||
case W_1HAXE:
|
||||
case W_2HAXE:
|
||||
case W_MACE: // Axes and Maces can't be broken [DracoRPG]
|
||||
case W_STAFF:
|
||||
case W_BOOK: //Rods and Books can't be broken [Skotlex]
|
||||
where &= ~EQP_WEAPON;
|
||||
}
|
||||
}
|
||||
@ -3567,7 +3568,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
||||
case SA_LIGHTNINGLOADER:
|
||||
case SA_SEISMICWEAPON:
|
||||
if (dstsd) {
|
||||
if(dstsd->status.weapon == 0 ||
|
||||
if(dstsd->status.weapon == W_FIST ||
|
||||
(dstsd->sc.count && dstsd->sc.data[type].timer == -1 &&
|
||||
( //Allow re-enchanting to lenghten time. [Skotlex]
|
||||
dstsd->sc.data[SC_FIREWEAPON].timer != -1 ||
|
||||
@ -4526,7 +4527,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
||||
return 1;
|
||||
}
|
||||
if(skillid == AM_BERSERKPITCHER) { //Does not override use-level, and cannot be used on bows.
|
||||
if (dstsd && (dstsd->status.base_level<(unsigned int)sd->inventory_data[i]->elv || dstsd->weapontype1 == 11)) {
|
||||
if (dstsd && (dstsd->status.base_level<(unsigned int)sd->inventory_data[i]->elv || dstsd->weapontype1 == W_BOW)) {
|
||||
clif_skill_fail(sd,skillid,0,0);
|
||||
map_freeblock_unlock();
|
||||
return 1;
|
||||
@ -7421,7 +7422,7 @@ static int skill_check_condition_char_sub (struct block_list *bl, va_list ap)
|
||||
if (sd->status.sex != tsd->status.sex &&
|
||||
(tsd->class_&MAPID_UPPERMASK) == MAPID_BARDDANCER &&
|
||||
(skilllv = pc_checkskill(tsd, skillid)) > 0 &&
|
||||
(tsd->weapontype1==13 || tsd->weapontype1==14) &&
|
||||
(tsd->weapontype1==W_MUSICAL || tsd->weapontype1==W_WHIP) &&
|
||||
sd->status.party_id && tsd->status.party_id &&
|
||||
sd->status.party_id == tsd->status.party_id &&
|
||||
tsd->sc.data[SC_DANCING].timer == -1)
|
||||
@ -7634,7 +7635,7 @@ int skill_check_condition(struct map_session_data *sd,int skill, int lv, int typ
|
||||
else
|
||||
sp += (sd->status.max_sp * abs(sp_rate))/100;
|
||||
|
||||
if (!ammo && sd->status.weapon == 11 && skill &&
|
||||
if (!ammo && sd->status.weapon == W_BOW && skill &&
|
||||
skill != HT_PHANTASMIC && skill != GS_MAGICALBULLET &&
|
||||
skill_get_type(skill) == BF_WEAPON && !(skill_get_nk(skill)&NK_NO_DAMAGE)
|
||||
)
|
||||
|
@ -919,7 +919,7 @@ int status_calc_pc(struct map_session_data* sd,int first)
|
||||
if(sd->attackrange_ < 1) sd->attackrange_ = 1;
|
||||
if(sd->attackrange < sd->attackrange_)
|
||||
sd->attackrange = sd->attackrange_;
|
||||
if(sd->status.weapon == 11)
|
||||
if(sd->status.weapon == W_BOW)
|
||||
sd->attackrange += sd->arrow_range;
|
||||
sd->double_rate += sd->double_add_rate;
|
||||
sd->perfect_hit += sd->perfect_hit_add;
|
||||
@ -1082,14 +1082,14 @@ int status_calc_pc(struct map_session_data* sd,int first)
|
||||
|
||||
// Basic Base ATK value
|
||||
switch(sd->status.weapon){
|
||||
case 11: // Bows
|
||||
case 13: // Musical Instruments
|
||||
case 14: // Whips
|
||||
case 17: // Revolver
|
||||
case 18: // Rifle
|
||||
case 19: // Shotgun
|
||||
case 20: //Gatling Gun
|
||||
case 21: //Grenade Launcher
|
||||
case W_BOW:
|
||||
case W_MUSICAL:
|
||||
case W_WHIP:
|
||||
case W_REVOLVER:
|
||||
case W_RIFLE:
|
||||
case W_SHOTGUN:
|
||||
case W_GATLING:
|
||||
case W_GRENADE:
|
||||
str = sd->paramc[4];
|
||||
dex = sd->paramc[0];
|
||||
break;
|
||||
@ -1177,16 +1177,17 @@ int status_calc_pc(struct map_session_data* sd,int first)
|
||||
sd->hit += skill*2;
|
||||
if((skill=pc_checkskill(sd,AC_VULTURE))>0){
|
||||
sd->hit += skill;
|
||||
if(sd->status.weapon == 11)
|
||||
if(sd->status.weapon == W_BOW)
|
||||
sd->attackrange += skill;
|
||||
}
|
||||
if((skill=pc_checkskill(sd,GS_SINGLEACTION))>0 && (sd->status.weapon == 17 || sd->status.weapon == 18
|
||||
|| sd->status.weapon == 19 || sd->status.weapon == 20 || sd->status.weapon == 21))
|
||||
sd->hit += 2*skill;
|
||||
if((skill=pc_checkskill(sd,GS_SNAKEEYE))>0 && (sd->status.weapon == 17 || sd->status.weapon == 18
|
||||
|| sd->status.weapon == 19 || sd->status.weapon == 20 || sd->status.weapon == 21)) {
|
||||
sd->hit += skill;
|
||||
sd->attackrange += skill;
|
||||
if(sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE)
|
||||
{
|
||||
if((skill=pc_checkskill(sd,GS_SINGLEACTION))>0)
|
||||
sd->hit += 2*skill;
|
||||
if((skill=pc_checkskill(sd,GS_SNAKEEYE))>0) {
|
||||
sd->hit += skill;
|
||||
sd->attackrange += skill;
|
||||
}
|
||||
}
|
||||
|
||||
// Absolute, then relative modifiers from status changes (shared between PC and NPC)
|
||||
@ -1345,7 +1346,7 @@ int status_calc_pc(struct map_session_data* sd,int first)
|
||||
// Unlike other stats, ASPD rate modifiers from skills/SCs/items/etc are first all added together, then the final modifier is applied
|
||||
|
||||
// Basic ASPD value
|
||||
if (sd->status.weapon <= MAX_WEAPON_TYPE)
|
||||
if (sd->status.weapon < MAX_WEAPON_TYPE)
|
||||
sd->aspd += aspd_base[sd->status.class_][sd->status.weapon]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[sd->status.class_][sd->status.weapon]/1000;
|
||||
else
|
||||
sd->aspd += (
|
||||
@ -1354,18 +1355,16 @@ int status_calc_pc(struct map_session_data* sd,int first)
|
||||
) *2/3; //From what I read in rodatazone, 2/3 should be more accurate than 0.7 -> 140 / 200; [Skotlex]
|
||||
|
||||
// Relative modifiers from passive skills
|
||||
if((skill=pc_checkskill(sd,SA_ADVANCEDBOOK))>0)
|
||||
if((skill=pc_checkskill(sd,SA_ADVANCEDBOOK))>0 && sd->status.weapon == W_BOOK)
|
||||
sd->aspd_rate -= (skill/2);
|
||||
if((skill = pc_checkskill(sd,SG_DEVIL)) > 0 && !pc_nextjobexp(sd))
|
||||
sd->aspd_rate -= (skill*3);
|
||||
|
||||
if((skill=pc_checkskill(sd,GS_SINGLEACTION))>0 &&
|
||||
(sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE))
|
||||
sd->aspd_rate -= (skill/2);
|
||||
if(pc_isriding(sd))
|
||||
sd->aspd_rate += 50-10*pc_checkskill(sd,KN_CAVALIERMASTERY);
|
||||
|
||||
if((skill=pc_checkskill(sd,GS_SINGLEACTION))>0 && (sd->status.weapon == 17 || sd->status.weapon == 18
|
||||
|| sd->status.weapon == 19 || sd->status.weapon == 20 || sd->status.weapon == 21))
|
||||
sd->aspd_rate -= (int)(skill / 2);
|
||||
|
||||
|
||||
// Relative modifiers from status changes (shared between PC and NPC)
|
||||
sd->aspd_rate = status_calc_aspd_rate(&sd->bl,sd->aspd_rate);
|
||||
|
||||
@ -2198,7 +2197,7 @@ int status_calc_aspd_rate(struct block_list *bl, int aspd_rate)
|
||||
aspd_rate -= (sc->data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty)?30:20;
|
||||
else if(sc->data[SC_SPEARSQUICKEN].timer!=-1)
|
||||
aspd_rate -= sc->data[SC_SPEARSQUICKEN].val2;
|
||||
else if(sc->data[SC_ASSNCROS].timer!=-1 && (bl->type!=BL_PC || ((struct map_session_data*)bl)->status.weapon != 11))
|
||||
else if(sc->data[SC_ASSNCROS].timer!=-1 && (bl->type!=BL_PC || ((struct map_session_data*)bl)->status.weapon != W_BOW))
|
||||
aspd_rate -= sc->data[SC_ASSNCROS].val2;
|
||||
}
|
||||
if(sc->data[SC_BERSERK].timer!=-1)
|
||||
@ -2701,7 +2700,7 @@ int status_get_batk(struct block_list *bl)
|
||||
|
||||
if(bl->type==BL_PC) {
|
||||
batk = ((struct map_session_data *)bl)->base_atk;
|
||||
if (((struct map_session_data *)bl)->status.weapon <= MAX_WEAPON_TYPE)
|
||||
if (((struct map_session_data *)bl)->status.weapon < MAX_WEAPON_TYPE)
|
||||
batk += ((struct map_session_data *)bl)->weapon_atk[((struct map_session_data *)bl)->status.weapon];
|
||||
} else {
|
||||
int str,dstr;
|
||||
|
@ -544,8 +544,6 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
|
||||
#define MAX_REFINE 10
|
||||
extern int percentrefinery[5][MAX_REFINE+1]; //The last slot always has a 0% success chance [Skotlex]
|
||||
|
||||
#define MAX_WEAPON_TYPE 22
|
||||
|
||||
int status_readdb(void);
|
||||
int do_init_status(void);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user