Fixed bugreport:5757 Added missing Sorcerer Insignias, Credits to brAthena
git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16115 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
2990091a11
commit
df2f149052
@ -136,10 +136,10 @@
|
|||||||
2450,0xe0, , 3, 0, 500,enemy, 0x010 //SO_CLOUD_KILL
|
2450,0xe0, , 3, 0, 500,enemy, 0x010 //SO_CLOUD_KILL
|
||||||
2452,0xe4, , 0, 3,3000,all, 0x010 //SO_WARMER
|
2452,0xe4, , 0, 3,3000,all, 0x010 //SO_WARMER
|
||||||
2453,0xeb, , 0, 1:1:2:2:3,1000,enemy,0x010 //SO_VACUUM_EXTREME
|
2453,0xeb, , 0, 1:1:2:2:3,1000,enemy,0x010 //SO_VACUUM_EXTREME
|
||||||
2465,0xf1, , 0, 1,1000,all, 0x010 //SO_FIRE_INSIGNIA
|
2465,0xf1, , 0, 2,1000,all, 0x010 //SO_FIRE_INSIGNIA
|
||||||
2466,0xf2, , 0, 1,1000,all, 0x010 //SO_WATER_INSIGNIA
|
2466,0xf2, , 0, 2,1000,all, 0x010 //SO_WATER_INSIGNIA
|
||||||
2467,0xf3, , 0, 1,1000,all, 0x010 //SO_WIND_INSIGNIA
|
2467,0xf3, , 0, 2,1000,all, 0x010 //SO_WIND_INSIGNIA
|
||||||
2468,0xf4, , 0, 1,1000,all, 0x010 //SO_EARTH_INSIGNIA
|
2468,0xf4, , 0, 2,1000,all, 0x010 //SO_EARTH_INSIGNIA
|
||||||
|
|
||||||
2479,0xe5, , 0, 1,1000,enemy, 0x000 //GN_THORNS_TRAP
|
2479,0xe5, , 0, 1,1000,enemy, 0x000 //GN_THORNS_TRAP
|
||||||
2482,0xe6,0x7f, -1, 1, -1,all, 0x000 //GN_WALLOFTHORN
|
2482,0xe6,0x7f, -1, 1, -1,all, 0x000 //GN_WALLOFTHORN
|
||||||
|
@ -136,10 +136,10 @@
|
|||||||
2450,0xe0, , 3, 0, 500,enemy, 0x010 //SO_CLOUD_KILL
|
2450,0xe0, , 3, 0, 500,enemy, 0x010 //SO_CLOUD_KILL
|
||||||
2452,0xe4, , 0, 3,3000,all, 0x010 //SO_WARMER
|
2452,0xe4, , 0, 3,3000,all, 0x010 //SO_WARMER
|
||||||
2453,0xeb, , 0, 1:1:2:2:3,1000,enemy,0x010 //SO_VACUUM_EXTREME
|
2453,0xeb, , 0, 1:1:2:2:3,1000,enemy,0x010 //SO_VACUUM_EXTREME
|
||||||
2465,0xf1, , 0, 1,1000,all, 0x010 //SO_FIRE_INSIGNIA
|
2465,0xf1, , 0, 2,1000,all, 0x010 //SO_FIRE_INSIGNIA
|
||||||
2466,0xf2, , 0, 1,1000,all, 0x010 //SO_WATER_INSIGNIA
|
2466,0xf2, , 0, 2,1000,all, 0x010 //SO_WATER_INSIGNIA
|
||||||
2467,0xf3, , 0, 1,1000,all, 0x010 //SO_WIND_INSIGNIA
|
2467,0xf3, , 0, 2,1000,all, 0x010 //SO_WIND_INSIGNIA
|
||||||
2468,0xf4, , 0, 1,1000,all, 0x010 //SO_EARTH_INSIGNIA
|
2468,0xf4, , 0, 2,1000,all, 0x010 //SO_EARTH_INSIGNIA
|
||||||
|
|
||||||
2479,0xe5, , 0, 1,1000,enemy, 0x000 //GN_THORNS_TRAP
|
2479,0xe5, , 0, 1,1000,enemy, 0x000 //GN_THORNS_TRAP
|
||||||
2482,0xe6,0x7f, -1, 1, -1,all, 0x000 //GN_WALLOFTHORN
|
2482,0xe6,0x7f, -1, 1, -1,all, 0x000 //GN_WALLOFTHORN
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
//============================================================
|
//============================================================
|
||||||
|
|
||||||
nyd_dun02,100,201,3 script Yggdrasil Gatekeeper 111,8,8,{
|
nyd_dun02,100,201,3 script Yggdrasil Gatekeeper 111,8,8,{
|
||||||
|
Set ins_nyd,132;//debug
|
||||||
if (ins_nyd == 0) {
|
if (ins_nyd == 0) {
|
||||||
mes "A great stone gate stands before you. The sculpture of a terrible dragon spreads its powerful looking wings.";
|
mes "A great stone gate stands before you. The sculpture of a terrible dragon spreads its powerful looking wings.";
|
||||||
next;
|
next;
|
||||||
|
@ -2541,8 +2541,7 @@ const char* npc_parse_duplicate(char* w1, char* w2, char* w3, char* w4, const ch
|
|||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
|
|
||||||
int npc_duplicate4instance(struct npc_data *snd, int m)
|
int npc_duplicate4instance(struct npc_data *snd, int m) {
|
||||||
{
|
|
||||||
char newname[NAME_LENGTH];
|
char newname[NAME_LENGTH];
|
||||||
|
|
||||||
if( map[m].instance_id == 0 )
|
if( map[m].instance_id == 0 )
|
||||||
|
22
src/map/pc.c
22
src/map/pc.c
@ -6758,17 +6758,21 @@ int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp)
|
|||||||
if(bonus != 100)
|
if(bonus != 100)
|
||||||
sp = sp * bonus / 100;
|
sp = sp * bonus / 100;
|
||||||
}
|
}
|
||||||
|
if( sd->sc.count ) {
|
||||||
|
if ( sd->sc.data[SC_CRITICALWOUND] ) {
|
||||||
|
hp -= hp * sd->sc.data[SC_CRITICALWOUND]->val2 / 100;
|
||||||
|
sp -= sp * sd->sc.data[SC_CRITICALWOUND]->val2 / 100;
|
||||||
|
}
|
||||||
|
|
||||||
if (sd->sc.data[SC_CRITICALWOUND])
|
if ( sd->sc.data[SC_DEATHHURT] ) {
|
||||||
{
|
hp -= hp * 20 / 100;
|
||||||
hp -= hp * sd->sc.data[SC_CRITICALWOUND]->val2 / 100;
|
sp -= sp * 20 / 100;
|
||||||
sp -= sp * sd->sc.data[SC_CRITICALWOUND]->val2 / 100;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (sd->sc.data[SC_DEATHHURT])
|
if( sd->sc.data[SC_WATER_INSIGNIA] && sd->sc.data[SC_WATER_INSIGNIA]->val1 == 2 ) {
|
||||||
{
|
hp += hp / 10;
|
||||||
hp -= hp * 20 / 100;
|
sp += sp / 10;
|
||||||
sp -= sp * 20 / 100;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return status_heal(&sd->bl, hp, sp, 1);
|
return status_heal(&sd->bl, hp, sp, 1);
|
||||||
|
176
src/map/skill.c
176
src/map/skill.c
@ -356,45 +356,43 @@ int skill_get_range2 (struct block_list *bl, int id, int lv)
|
|||||||
return range;
|
return range;
|
||||||
}
|
}
|
||||||
|
|
||||||
int skill_calc_heal(struct block_list *src, struct block_list *target, int skill_id, int skill_lv, bool heal)
|
int skill_calc_heal(struct block_list *src, struct block_list *target, int skill_id, int skill_lv, bool heal) {
|
||||||
{
|
|
||||||
int skill, hp;
|
int skill, hp;
|
||||||
struct map_session_data *sd = BL_CAST(BL_PC, src);
|
struct map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
struct map_session_data *tsd = BL_CAST(BL_PC, target);
|
struct map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||||
struct status_change* sc;
|
struct status_change* sc;
|
||||||
|
|
||||||
switch( skill_id )
|
switch( skill_id ) {
|
||||||
{
|
case BA_APPLEIDUN:
|
||||||
case BA_APPLEIDUN:
|
hp = 30+5*skill_lv+5*(status_get_vit(src)/10); // HP recovery
|
||||||
hp = 30+5*skill_lv+5*(status_get_vit(src)/10); // HP recovery
|
if( sd )
|
||||||
if( sd )
|
hp += 5*pc_checkskill(sd,BA_MUSICALLESSON);
|
||||||
hp += 5*pc_checkskill(sd,BA_MUSICALLESSON);
|
break;
|
||||||
break;
|
case PR_SANCTUARY:
|
||||||
case PR_SANCTUARY:
|
hp = (skill_lv>6)?777:skill_lv*100;
|
||||||
hp = (skill_lv>6)?777:skill_lv*100;
|
break;
|
||||||
break;
|
case NPC_EVILLAND:
|
||||||
case NPC_EVILLAND:
|
hp = (skill_lv>6)?666:skill_lv*100;
|
||||||
hp = (skill_lv>6)?666:skill_lv*100;
|
break;
|
||||||
break;
|
default:
|
||||||
default:
|
if (skill_lv >= battle_config.max_heal_lv)
|
||||||
if (skill_lv >= battle_config.max_heal_lv)
|
return battle_config.max_heal;
|
||||||
return battle_config.max_heal;
|
#ifdef RENEWAL
|
||||||
#ifdef RENEWAL
|
/**
|
||||||
/**
|
* Renewal Heal Formula (from Doddler)
|
||||||
* Renewal Heal Formula (from Doddler)
|
* TODO: whats that( 1+ %Modifier / 100 ) ? currently using 'x1' (100/100) until found out
|
||||||
* TODO: whats that( 1+ %Modifier / 100 ) ? currently using 'x1' (100/100) until found out
|
* - Min = ( [ ( BaseLvl + INT ) / 5 ] * 30 ) * (1+( %Modifier / 100)) * (HealLvl * 0.1) + StatusMATK + EquipMATK - [(WeaponMATK * WeaponLvl) / 10]
|
||||||
* - Min = ( [ ( BaseLvl + INT ) / 5 ] * 30 ) * (1+( %Modifier / 100)) * (HealLvl * 0.1) + StatusMATK + EquipMATK - [(WeaponMATK * WeaponLvl) / 10]
|
* - Max = ( [ ( BaseLvl + INT ) / 5 ] * 30 ) * (1+( %Modifier / 100)) * (HealLvl * 0.1) + StatusMATK + EquipMATK + [(WeaponMATK * WeaponLvl) / 10]
|
||||||
* - Max = ( [ ( BaseLvl + INT ) / 5 ] * 30 ) * (1+( %Modifier / 100)) * (HealLvl * 0.1) + StatusMATK + EquipMATK + [(WeaponMATK * WeaponLvl) / 10]
|
**/
|
||||||
**/
|
hp = ( ( ( ( status_get_lv(src) + status_get_int(src) ) / 5 ) * 3 ) * skill_lv + status_get_matk_min(src) + status_get_matk_max(src) - ( ( status_get_matk_max(src) * status_get_wlv(src) ) / 10 ) ) + rnd()%( ( ( ( status_get_lv(src) + status_get_int(src) ) / 5 ) * 3 ) * skill_lv + status_get_matk_min(src) + status_get_matk_max(src) + ( ( status_get_matk_max(src) * status_get_wlv(src) ) / 10 ) );
|
||||||
hp = ( ( ( ( status_get_lv(src) + status_get_int(src) ) / 5 ) * 3 ) * skill_lv + status_get_matk_min(src) + status_get_matk_max(src) - ( ( status_get_matk_max(src) * status_get_wlv(src) ) / 10 ) ) + rnd()%( ( ( ( status_get_lv(src) + status_get_int(src) ) / 5 ) * 3 ) * skill_lv + status_get_matk_min(src) + status_get_matk_max(src) + ( ( status_get_matk_max(src) * status_get_wlv(src) ) / 10 ) );
|
#else
|
||||||
#else
|
hp = ( status_get_lv(src) + status_get_int(src) ) / 8 * (4 + ( skill_id == AB_HIGHNESSHEAL ? ( sd ? pc_checkskill(sd,AL_HEAL) : 10 ) : skill_lv ) * 8);
|
||||||
hp = ( status_get_lv(src) + status_get_int(src) ) / 8 * (4 + ( skill_id == AB_HIGHNESSHEAL ? ( sd ? pc_checkskill(sd,AL_HEAL) : 10 ) : skill_lv ) * 8);
|
#endif
|
||||||
#endif
|
if( sd && ((skill = pc_checkskill(sd, HP_MEDITATIO)) > 0) )
|
||||||
if( sd && ((skill = pc_checkskill(sd, HP_MEDITATIO)) > 0) )
|
hp += hp * skill * 2 / 100;
|
||||||
hp += hp * skill * 2 / 100;
|
else if( src->type == BL_HOM && (skill = merc_hom_checkskill(((TBL_HOM*)src), HLIF_BRAIN)) > 0 )
|
||||||
else if( src->type == BL_HOM && (skill = merc_hom_checkskill(((TBL_HOM*)src), HLIF_BRAIN)) > 0 )
|
hp += hp * skill * 2 / 100;
|
||||||
hp += hp * skill * 2 / 100;
|
break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( (target && target->type == BL_MER) || !heal ) && skill_id != NPC_EVILLAND )
|
if( ( (target && target->type == BL_MER) || !heal ) && skill_id != NPC_EVILLAND )
|
||||||
@ -407,14 +405,15 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, int skill
|
|||||||
hp += hp*skill/100;
|
hp += hp*skill/100;
|
||||||
|
|
||||||
sc = status_get_sc(target);
|
sc = status_get_sc(target);
|
||||||
if( sc && sc->count )
|
if( sc && sc->count ) {
|
||||||
{
|
|
||||||
if( sc->data[SC_CRITICALWOUND] && heal ) // Critical Wound has no effect on offensive heal. [Inkfish]
|
if( sc->data[SC_CRITICALWOUND] && heal ) // Critical Wound has no effect on offensive heal. [Inkfish]
|
||||||
hp -= hp * sc->data[SC_CRITICALWOUND]->val2/100;
|
hp -= hp * sc->data[SC_CRITICALWOUND]->val2/100;
|
||||||
if( sc->data[SC_DEATHHURT] && heal )
|
if( sc->data[SC_DEATHHURT] && heal )
|
||||||
hp -= hp * 20/100;
|
hp -= hp * 20/100;
|
||||||
if( sc->data[SC_INCHEALRATE] && skill_id != NPC_EVILLAND && skill_id != BA_APPLEIDUN )
|
if( sc->data[SC_INCHEALRATE] && skill_id != NPC_EVILLAND && skill_id != BA_APPLEIDUN )
|
||||||
hp += hp * sc->data[SC_INCHEALRATE]->val1/100; // Only affects Heal, Sanctuary and PotionPitcher.(like bHealPower) [Inkfish]
|
hp += hp * sc->data[SC_INCHEALRATE]->val1/100; // Only affects Heal, Sanctuary and PotionPitcher.(like bHealPower) [Inkfish]
|
||||||
|
if( sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 2)
|
||||||
|
hp += hp / 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
return hp;
|
return hp;
|
||||||
@ -6010,34 +6009,27 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
case AM_BERSERKPITCHER:
|
case AM_BERSERKPITCHER:
|
||||||
case AM_POTIONPITCHER:
|
case AM_POTIONPITCHER: {
|
||||||
{
|
|
||||||
int i,x,hp = 0,sp = 0,bonus=100;
|
int i,x,hp = 0,sp = 0,bonus=100;
|
||||||
if( dstmd && dstmd->class_ == MOBID_EMPERIUM )
|
if( dstmd && dstmd->class_ == MOBID_EMPERIUM ) {
|
||||||
{
|
|
||||||
map_freeblock_unlock();
|
map_freeblock_unlock();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if( sd )
|
if( sd ) {
|
||||||
{
|
|
||||||
x = skilllv%11 - 1;
|
x = skilllv%11 - 1;
|
||||||
i = pc_search_inventory(sd,skill_db[skillid].itemid[x]);
|
i = pc_search_inventory(sd,skill_db[skillid].itemid[x]);
|
||||||
if(i < 0 || skill_db[skillid].itemid[x] <= 0)
|
if( i < 0 || skill_db[skillid].itemid[x] <= 0 ) {
|
||||||
{
|
|
||||||
clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
|
clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
|
||||||
map_freeblock_unlock();
|
map_freeblock_unlock();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if(sd->inventory_data[i] == NULL || sd->status.inventory[i].amount < skill_db[skillid].amount[x])
|
if(sd->inventory_data[i] == NULL || sd->status.inventory[i].amount < skill_db[skillid].amount[x]) {
|
||||||
{
|
|
||||||
clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
|
clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
|
||||||
map_freeblock_unlock();
|
map_freeblock_unlock();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if( skillid == AM_BERSERKPITCHER )
|
if( skillid == AM_BERSERKPITCHER ) {
|
||||||
{
|
if( dstsd && dstsd->status.base_level < (unsigned int)sd->inventory_data[i]->elv ) {
|
||||||
if( dstsd && dstsd->status.base_level < (unsigned int)sd->inventory_data[i]->elv )
|
|
||||||
{
|
|
||||||
clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
|
clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
|
||||||
map_freeblock_unlock();
|
map_freeblock_unlock();
|
||||||
return 1;
|
return 1;
|
||||||
@ -6050,27 +6042,21 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
potion_flag = potion_target = 0;
|
potion_flag = potion_target = 0;
|
||||||
if( sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_ALCHEMIST )
|
if( sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_ALCHEMIST )
|
||||||
bonus += sd->status.base_level;
|
bonus += sd->status.base_level;
|
||||||
if( potion_per_hp > 0 || potion_per_sp > 0 )
|
if( potion_per_hp > 0 || potion_per_sp > 0 ) {
|
||||||
{
|
|
||||||
hp = tstatus->max_hp * potion_per_hp / 100;
|
hp = tstatus->max_hp * potion_per_hp / 100;
|
||||||
hp = hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)*bonus/10000;
|
hp = hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)*bonus/10000;
|
||||||
if( dstsd )
|
if( dstsd ) {
|
||||||
{
|
|
||||||
sp = dstsd->status.max_sp * potion_per_sp / 100;
|
sp = dstsd->status.max_sp * potion_per_sp / 100;
|
||||||
sp = sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)*bonus/10000;
|
sp = sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)*bonus/10000;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
if( potion_hp > 0 ) {
|
||||||
{
|
|
||||||
if( potion_hp > 0 )
|
|
||||||
{
|
|
||||||
hp = potion_hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)*bonus/10000;
|
hp = potion_hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)*bonus/10000;
|
||||||
hp = hp * (100 + (tstatus->vit<<1)) / 100;
|
hp = hp * (100 + (tstatus->vit<<1)) / 100;
|
||||||
if( dstsd )
|
if( dstsd )
|
||||||
hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
|
hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
|
||||||
}
|
}
|
||||||
if( potion_sp > 0 )
|
if( potion_sp > 0 ) {
|
||||||
{
|
|
||||||
sp = potion_sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)*bonus/10000;
|
sp = potion_sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)*bonus/10000;
|
||||||
sp = sp * (100 + (tstatus->int_<<1)) / 100;
|
sp = sp * (100 + (tstatus->int_<<1)) / 100;
|
||||||
if( dstsd )
|
if( dstsd )
|
||||||
@ -6078,39 +6064,38 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sd->itemgrouphealrate[IG_POTION]>0)
|
if (sd->itemgrouphealrate[IG_POTION]>0) {
|
||||||
{
|
|
||||||
hp += hp * sd->itemgrouphealrate[IG_POTION] / 100;
|
hp += hp * sd->itemgrouphealrate[IG_POTION] / 100;
|
||||||
sp += sp * sd->itemgrouphealrate[IG_POTION] / 100;
|
sp += sp * sd->itemgrouphealrate[IG_POTION] / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (i = pc_skillheal_bonus(sd, skillid)) )
|
if( (i = pc_skillheal_bonus(sd, skillid)) ) {
|
||||||
{
|
|
||||||
hp += hp * i / 100;
|
hp += hp * i / 100;
|
||||||
sp += sp * i / 100;
|
sp += sp * i / 100;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
hp = (1 + rnd()%400) * (100 + skilllv*10) / 100;
|
hp = (1 + rnd()%400) * (100 + skilllv*10) / 100;
|
||||||
hp = hp * (100 + (tstatus->vit<<1)) / 100;
|
hp = hp * (100 + (tstatus->vit<<1)) / 100;
|
||||||
if( dstsd )
|
if( dstsd )
|
||||||
hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
|
hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
|
||||||
}
|
}
|
||||||
if( dstsd && (i = pc_skillheal2_bonus(dstsd, skillid)) )
|
if( dstsd && (i = pc_skillheal2_bonus(dstsd, skillid)) ) {
|
||||||
{
|
|
||||||
hp += hp * i / 100;
|
hp += hp * i / 100;
|
||||||
sp += sp * i / 100;
|
sp += sp * i / 100;
|
||||||
}
|
}
|
||||||
if( tsc && tsc->data[SC_CRITICALWOUND] )
|
if( tsc && tsc->count ) {
|
||||||
{
|
if( tsc->data[SC_CRITICALWOUND] ) {
|
||||||
hp -= hp * tsc->data[SC_CRITICALWOUND]->val2 / 100;
|
hp -= hp * tsc->data[SC_CRITICALWOUND]->val2 / 100;
|
||||||
sp -= sp * tsc->data[SC_CRITICALWOUND]->val2 / 100;
|
sp -= sp * tsc->data[SC_CRITICALWOUND]->val2 / 100;
|
||||||
}
|
}
|
||||||
if( tsc && tsc->data[SC_DEATHHURT] )
|
if( tsc->data[SC_DEATHHURT] ) {
|
||||||
{
|
hp -= hp * 20 / 100;
|
||||||
hp -= hp * 20 / 100;
|
sp -= sp * 20 / 100;
|
||||||
sp -= sp * 20 / 100;
|
}
|
||||||
|
if( tsc->data[SC_WATER_INSIGNIA] && tsc->data[SC_WATER_INSIGNIA]->val1 == 2 ) {
|
||||||
|
hp += hp / 10;
|
||||||
|
sp += sp / 10;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
clif_skill_nodamage(src,bl,skillid,skilllv,1);
|
clif_skill_nodamage(src,bl,skillid,skilllv,1);
|
||||||
if( hp > 0 || (skillid == AM_POTIONPITCHER && sp <= 0) )
|
if( hp > 0 || (skillid == AM_POTIONPITCHER && sp <= 0) )
|
||||||
@ -6792,15 +6777,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
if (sp)
|
if (sp)
|
||||||
sp = sp * (100 + pc_checkskill(dstsd,MG_SRECOVERY)*10 + pc_skillheal2_bonus(dstsd, skillid))/100;
|
sp = sp * (100 + pc_checkskill(dstsd,MG_SRECOVERY)*10 + pc_skillheal2_bonus(dstsd, skillid))/100;
|
||||||
}
|
}
|
||||||
if (tsc && tsc->data[SC_CRITICALWOUND])
|
if( tsc && tsc->count ) {
|
||||||
{
|
if (tsc->data[SC_CRITICALWOUND]) {
|
||||||
hp -= hp * tsc->data[SC_CRITICALWOUND]->val2 / 100;
|
hp -= hp * tsc->data[SC_CRITICALWOUND]->val2 / 100;
|
||||||
sp -= sp * tsc->data[SC_CRITICALWOUND]->val2 / 100;
|
sp -= sp * tsc->data[SC_CRITICALWOUND]->val2 / 100;
|
||||||
}
|
}
|
||||||
if (tsc && tsc->data[SC_DEATHHURT])
|
if (tsc->data[SC_DEATHHURT]) {
|
||||||
{
|
hp -= hp * 20 / 100;
|
||||||
hp -= hp * 20 / 100;
|
sp -= sp * 20 / 100;
|
||||||
sp -= sp * 20 / 100;
|
}
|
||||||
|
if( tsc->data[SC_WATER_INSIGNIA] && tsc->data[SC_WATER_INSIGNIA]->val1 == 2) {
|
||||||
|
hp += hp / 10;
|
||||||
|
sp += sp / 10;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(hp > 0)
|
if(hp > 0)
|
||||||
clif_skill_nodamage(NULL,bl,AL_HEAL,hp,1);
|
clif_skill_nodamage(NULL,bl,AL_HEAL,hp,1);
|
||||||
@ -11215,6 +11204,13 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case UNT_FIRE_INSIGNIA:
|
||||||
|
case UNT_WATER_INSIGNIA:
|
||||||
|
case UNT_WIND_INSIGNIA:
|
||||||
|
case UNT_EARTH_INSIGNIA:
|
||||||
|
sc_start(bl,type, 100, sg->skill_lv, sg->interval);
|
||||||
|
break;
|
||||||
|
|
||||||
case UNT_VACUUM_EXTREME:
|
case UNT_VACUUM_EXTREME:
|
||||||
sc_start(bl, SC_VACUUM_EXTREME, 100, sg->skill_lv, sg->limit);
|
sc_start(bl, SC_VACUUM_EXTREME, 100, sg->skill_lv, sg->limit);
|
||||||
break;
|
break;
|
||||||
@ -11341,6 +11337,10 @@ static int skill_unit_onleft (int skill_id, struct block_list *bl, unsigned int
|
|||||||
case EL_WATER_BARRIER:
|
case EL_WATER_BARRIER:
|
||||||
case EL_ZEPHYR:
|
case EL_ZEPHYR:
|
||||||
case EL_POWER_OF_GAIA:
|
case EL_POWER_OF_GAIA:
|
||||||
|
case SO_FIRE_INSIGNIA:
|
||||||
|
case SO_WATER_INSIGNIA:
|
||||||
|
case SO_WIND_INSIGNIA:
|
||||||
|
case SO_EARTH_INSIGNIA:
|
||||||
if (sce)
|
if (sce)
|
||||||
status_change_end(bl, type, INVALID_TIMER);
|
status_change_end(bl, type, INVALID_TIMER);
|
||||||
break;
|
break;
|
||||||
|
@ -660,6 +660,10 @@ void initChangeTables(void)
|
|||||||
set_sc( SO_WARMER , SC_WARMER , SI_WARMER , SCB_NONE );
|
set_sc( SO_WARMER , SC_WARMER , SI_WARMER , SCB_NONE );
|
||||||
set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , SI_VACUUM_EXTREME , SCB_NONE );
|
set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , SI_VACUUM_EXTREME , SCB_NONE );
|
||||||
set_sc( SO_ARRULLO , SC_DEEPSLEEP , SI_DEEPSLEEP , SCB_NONE );
|
set_sc( SO_ARRULLO , SC_DEEPSLEEP , SI_DEEPSLEEP , SCB_NONE );
|
||||||
|
set_sc( SO_FIRE_INSIGNIA , SC_FIRE_INSIGNIA , SI_FIRE_INSIGNIA , SCB_MATK );
|
||||||
|
set_sc( SO_WATER_INSIGNIA , SC_WATER_INSIGNIA , SI_WATER_INSIGNIA , SCB_NONE );
|
||||||
|
set_sc( SO_WIND_INSIGNIA , SC_WIND_INSIGNIA , SI_WIND_INSIGNIA , SCB_NONE );
|
||||||
|
set_sc( SO_EARTH_INSIGNIA , SC_EARTH_INSIGNIA , SI_EARTH_INSIGNIA , SCB_MDEF|SCB_DEF|SCB_MAXHP|SCB_MAXSP|SCB_WATK );
|
||||||
/**
|
/**
|
||||||
* Genetic
|
* Genetic
|
||||||
**/
|
**/
|
||||||
@ -2970,6 +2974,14 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
|
|||||||
sd->subele[ELE_EARTH] += i;
|
sd->subele[ELE_EARTH] += i;
|
||||||
sd->subele[ELE_FIRE] -= i;
|
sd->subele[ELE_FIRE] -= i;
|
||||||
}
|
}
|
||||||
|
if( sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 3 )
|
||||||
|
sd->magic_addele[ELE_FIRE] += 25;
|
||||||
|
if( sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 3 )
|
||||||
|
sd->magic_addele[ELE_WATER] += 25;
|
||||||
|
if( sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 3 )
|
||||||
|
sd->magic_addele[ELE_WIND] += 25;
|
||||||
|
if( sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3 )
|
||||||
|
sd->magic_addele[ELE_EARTH] += 25;
|
||||||
}
|
}
|
||||||
status_cpy(&sd->battle_status, status);
|
status_cpy(&sd->battle_status, status);
|
||||||
|
|
||||||
@ -4199,6 +4211,15 @@ static unsigned short status_calc_batk(struct block_list *bl, struct status_chan
|
|||||||
batk += batk * sc->data[SC_BEYONDOFWARCRY]->val3/100;
|
batk += batk * sc->data[SC_BEYONDOFWARCRY]->val3/100;
|
||||||
if(sc->data[SC_GT_CHANGE])
|
if(sc->data[SC_GT_CHANGE])
|
||||||
batk += batk * sc->data[SC_GT_CHANGE]->val3 / 100;
|
batk += batk * sc->data[SC_GT_CHANGE]->val3 / 100;
|
||||||
|
if(sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2)
|
||||||
|
batk += 50;
|
||||||
|
if(bl->type == BL_ELEM
|
||||||
|
&& ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1)
|
||||||
|
|| (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 1)
|
||||||
|
|| (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 1)
|
||||||
|
|| (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 1))
|
||||||
|
)
|
||||||
|
batk += batk / 5;
|
||||||
if(sc->data[SC_FULL_SWING_K])
|
if(sc->data[SC_FULL_SWING_K])
|
||||||
batk += sc->data[SC_FULL_SWING_K]->val1;
|
batk += sc->data[SC_FULL_SWING_K]->val1;
|
||||||
if(sc->data[SC_ODINS_POWER])
|
if(sc->data[SC_ODINS_POWER])
|
||||||
@ -4276,6 +4297,12 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan
|
|||||||
watk -= sc->data[SC_WATER_BARRIER]->val3;
|
watk -= sc->data[SC_WATER_BARRIER]->val3;
|
||||||
if( sc->data[SC_PYROTECHNIC_OPTION] )
|
if( sc->data[SC_PYROTECHNIC_OPTION] )
|
||||||
watk += sc->data[SC_PYROTECHNIC_OPTION]->val2;
|
watk += sc->data[SC_PYROTECHNIC_OPTION]->val2;
|
||||||
|
if((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2)
|
||||||
|
|| (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 2)
|
||||||
|
|| (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2)
|
||||||
|
|| (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2)
|
||||||
|
)
|
||||||
|
watk += watk / 10;
|
||||||
if( sc && sc->data[SC_TIDAL_WEAPON] )
|
if( sc && sc->data[SC_TIDAL_WEAPON] )
|
||||||
watk += watk * sc->data[SC_TIDAL_WEAPON]->val2 / 100;
|
watk += watk * sc->data[SC_TIDAL_WEAPON]->val2 / 100;
|
||||||
|
|
||||||
@ -4317,6 +4344,8 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan
|
|||||||
matk += sc->data[SC_CHILLY_AIR_OPTION]->val2;
|
matk += sc->data[SC_CHILLY_AIR_OPTION]->val2;
|
||||||
if(sc->data[SC_WATER_BARRIER])
|
if(sc->data[SC_WATER_BARRIER])
|
||||||
matk -= sc->data[SC_WATER_BARRIER]->val3;
|
matk -= sc->data[SC_WATER_BARRIER]->val3;
|
||||||
|
if(sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 3)
|
||||||
|
matk += 50;
|
||||||
if(sc->data[SC_ODINS_POWER])
|
if(sc->data[SC_ODINS_POWER])
|
||||||
matk += 70;
|
matk += 70;
|
||||||
|
|
||||||
@ -4543,6 +4572,8 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc,
|
|||||||
def += def * sc->data[SC_POWER_OF_GAIA]->val2 / 100;
|
def += def * sc->data[SC_POWER_OF_GAIA]->val2 / 100;
|
||||||
if( sc->data[SC_PRESTIGE] )
|
if( sc->data[SC_PRESTIGE] )
|
||||||
def += def * sc->data[SC_PRESTIGE]->val1 / 100;
|
def += def * sc->data[SC_PRESTIGE]->val1 / 100;
|
||||||
|
if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2)
|
||||||
|
def += 50;
|
||||||
if(sc->data[SC_ODINS_POWER])
|
if(sc->data[SC_ODINS_POWER])
|
||||||
def -= 20;
|
def -= 20;
|
||||||
|
|
||||||
@ -4639,6 +4670,8 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc,
|
|||||||
mdef -= mdef * sc->data[SC_GT_CHANGE]->val3 / 100;
|
mdef -= mdef * sc->data[SC_GT_CHANGE]->val3 / 100;
|
||||||
if(sc->data[SC_WATER_BARRIER])
|
if(sc->data[SC_WATER_BARRIER])
|
||||||
mdef += sc->data[SC_WATER_BARRIER]->val2;
|
mdef += sc->data[SC_WATER_BARRIER]->val2;
|
||||||
|
if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3)
|
||||||
|
mdef += 50;
|
||||||
if(sc->data[SC_ODINS_POWER])
|
if(sc->data[SC_ODINS_POWER])
|
||||||
mdef -= 20;
|
mdef -= 20;
|
||||||
|
|
||||||
@ -5065,6 +5098,8 @@ static unsigned int status_calc_maxhp(struct block_list *bl, struct status_chang
|
|||||||
maxhp += 3000;
|
maxhp += 3000;
|
||||||
if(sc->data[SC_MYSTERIOUS_POWDER])
|
if(sc->data[SC_MYSTERIOUS_POWDER])
|
||||||
maxhp -= sc->data[SC_MYSTERIOUS_POWDER]->val1 / 100;
|
maxhp -= sc->data[SC_MYSTERIOUS_POWDER]->val1 / 100;
|
||||||
|
if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2)
|
||||||
|
maxhp += 500;
|
||||||
|
|
||||||
return cap_value(maxhp,1,UINT_MAX);
|
return cap_value(maxhp,1,UINT_MAX);
|
||||||
}
|
}
|
||||||
@ -5084,6 +5119,8 @@ static unsigned int status_calc_maxsp(struct block_list *bl, struct status_chang
|
|||||||
maxsp += maxsp * (2 + sc->data[SC_RAISINGDRAGON]->val1) / 100;
|
maxsp += maxsp * (2 + sc->data[SC_RAISINGDRAGON]->val1) / 100;
|
||||||
if(sc->data[SC_LIFE_FORCE_F])
|
if(sc->data[SC_LIFE_FORCE_F])
|
||||||
maxsp += maxsp * sc->data[SC_LIFE_FORCE_F]->val1/100;
|
maxsp += maxsp * sc->data[SC_LIFE_FORCE_F]->val1/100;
|
||||||
|
if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3)
|
||||||
|
maxsp += 50;
|
||||||
|
|
||||||
return cap_value(maxsp,1,UINT_MAX);
|
return cap_value(maxsp,1,UINT_MAX);
|
||||||
}
|
}
|
||||||
@ -5139,8 +5176,17 @@ unsigned char status_calc_attack_element(struct block_list *bl, struct status_ch
|
|||||||
return element;
|
return element;
|
||||||
if(sc->data[SC_ENCHANTARMS])
|
if(sc->data[SC_ENCHANTARMS])
|
||||||
return sc->data[SC_ENCHANTARMS]->val2;
|
return sc->data[SC_ENCHANTARMS]->val2;
|
||||||
if(sc->data[SC_WATERWEAPON])
|
if(sc->data[SC_WATERWEAPON]
|
||||||
|
|| sc->data[SC_TIDAL_WEAPON_OPTION]
|
||||||
|
|| sc->data[SC_TIDAL_WEAPON]
|
||||||
|
|| (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 2) )
|
||||||
return ELE_WATER;
|
return ELE_WATER;
|
||||||
|
if(sc->data[SC_EARTHWEAPON] || (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2) )
|
||||||
|
return ELE_EARTH;
|
||||||
|
if(sc->data[SC_FIREWEAPON] || (sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2) )
|
||||||
|
return ELE_FIRE;
|
||||||
|
if(sc->data[SC_WINDWEAPON] || (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2) )
|
||||||
|
return ELE_WIND;
|
||||||
if(sc->data[SC_EARTHWEAPON])
|
if(sc->data[SC_EARTHWEAPON])
|
||||||
return ELE_EARTH;
|
return ELE_EARTH;
|
||||||
if(sc->data[SC_FIREWEAPON])
|
if(sc->data[SC_FIREWEAPON])
|
||||||
|
@ -590,8 +590,14 @@ typedef enum sc_type {
|
|||||||
SC_GLORYWOUNDS,
|
SC_GLORYWOUNDS,
|
||||||
SC_SOULCOLD, //509
|
SC_SOULCOLD, //509
|
||||||
SC_HAWKEYES,
|
SC_HAWKEYES,
|
||||||
|
/* ... */
|
||||||
SC_ODINS_POWER,
|
SC_ODINS_POWER,
|
||||||
SC_RAID,
|
SC_RAID,
|
||||||
|
/* Sorcerer .extra */
|
||||||
|
SC_FIRE_INSIGNIA,
|
||||||
|
SC_WATER_INSIGNIA,
|
||||||
|
SC_WIND_INSIGNIA, //515
|
||||||
|
SC_EARTH_INSIGNIA,
|
||||||
|
|
||||||
SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
|
SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
|
||||||
} sc_type;
|
} sc_type;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user