-Fix bugreport:5757 (insignia) implement remaning effect stated from irowiki, remove duplicate atk_ele

-Fix bugreport:6096 (saturday_night), add rate failure, fix sit icone, add restrict to pvp map
-Fix bugreport:6831 (sc_intravision), prevent item starting (and so ending) intravision while wearing maya purple

DB:
-Upd *INSIGNIA duration to 60s, fix requirement indigo per level (itemid ain't split in src =( )
-Upd WM_SATURDAY_NIGHT_FEVER hp/sp drain interval to 12-2*skilllv
-Upd skill_require_db fix add note about some state status wich were present but not mentionned.
-Add poisonweapon and rollingcutter code implantation. (was used in require db without effect and removed hardcoded check)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16847 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
glighta 2012-10-31 01:38:20 +00:00
parent 558748e111
commit 234beac39d
7 changed files with 159 additions and 102 deletions

View File

@ -1511,7 +1511,7 @@
//-- WM_SOUND_OF_DESTRUCTION
2429,0:500:1000:1500:2000,1000,0,0,0,20000,500
//-- WM_SATURDAY_NIGHT_FEVER
2430,1000:2000:3000:4000:5000,1000,0,10000:15000:20000:25000:30000,3000,180000,1000
2430,1000:2000:3000:4000:5000,1000,0,10000:15000:20000:25000:30000,10000:8000:6000:4000:2000,180000,1000
//-- WM_LERADS_DEW
2431,1000,1000,0,20000:30000:40000:50000:60000,0,180000,500
//-- WM_MELODYOFSINK
@ -1567,13 +1567,13 @@
//-- SO_EL_CURE
2464,2000,1000,0,0,0,0,-1
//-- SO_FIRE_INSIGNIA
2465,1000,0,0,600000:900000:1200000,0,60000,1000
2465,1000,0,0,60000,0,60000,1000
//-- SO_WATER_INSIGNIA
2466,1000,0,0,600000:900000:1200000,0,60000,1000
2466,1000,0,0,60000,0,60000,1000
//-- SO_WIND_INSIGNIA
2467,1000,0,0,600000:900000:1200000,0,60000,1000
2467,1000,0,0,60000,0,60000,1000
//-- SO_EARTH_INSIGNIA
2468,1000,0,0,600000:900000:1200000,0,60000,1000
2468,1000,0,0,60000,0,60000,1000
//==========================================
//==== Genetic skills ======================
@ -1911,4 +1911,4 @@
10012,10000,0,0,0,300000,0,0
//-- GD_EMERGENCYCALL
10013,5000,0,0,0,300000,0,0
//==========================================
//==========================================

View File

@ -20,7 +20,12 @@
// cartboost = Requires a Pushcart and Cart Boost skill activated
// shield = Requires a 0,shield equipped
// warg = Requires a Warg
// dragon = Requires to ride a Dragon
// ridingwarg = Requires to ride a Warg
// mado = Requires to have an active mado
// poisonweapon = Requires to be under Poisoning Weapon.
// rollingcutter = Requires at least one Rotation Counter from Rolling Cutter.
// elementalspirit = Requires to have an Elemental Spirit summoned.
5,0,0,8:8:8:8:8:15:15:15:15:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_BASH#バッシュ#
6,0,0,4:5:6:7:8:9:10:11:12:13,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#プロボック#
@ -171,7 +176,7 @@
234,0,0,30,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#ケミカルウェポンチャ?ジ#
235,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#ケミカルシ?ルドチャ?ジ#
236,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#ケミカルア?マ?チャ?ジ#
237,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_HELM#ケミカルヘルチャ?ジ#
237,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_HELM#ケミカルヘル??チャ?ジ#
243,0,0,10,0,0,0,99,0,0,none,0,7142,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CALLHOMUNCULUS
244,0,0,50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_REST
@ -443,7 +448,7 @@
1004,0,0,15,0,0,0,99,2,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#ベナムナイフ#
1005,0,0,25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#ク??[ズコンファイン#
1006,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#サイトブラスタ?[#
1007,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#エルレ?ンタルコンバ?[タ?サ<EFBFBD>?
1007,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#エルレ?ンタルコンバ?[タ?サ??
1008,0,0,30,0,0,0,99,0,0,none,0,12115,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#エルレ?ンタルチェンジ#
1009,0,0,10,0,0,0,11,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#ファンタスミックア??[#
1010,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#パンボイス#
@ -749,10 +754,10 @@
2461,0,0,50,0,0,0,99,0,0,elementalspirit,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EL_ACTION#Elemental Action#
2462,0,0,10:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EL_ANALYSIS#Four Spirit Analysis#
2464,0,0,10,0,0,0,99,0,0,elementalspirit,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EL_CURE#Spirit Recovery#
2465,0,0,22:30:38,0,0,0,99,0,0,none,0,6360,1:2:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_FIRE_INSIGNIA#Fire Insignia#
2466,0,0,22:30:38,0,0,0,99,0,0,none,0,6361,1:2:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_WATER_INSIGNIA#Water Insignia#
2467,0,0,22:30:38,0,0,0,99,0,0,none,0,6362,1:2:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_WIND_INSIGNIA#Wind Insignia#
2468,0,0,22:30:38,0,0,0,99,0,0,none,0,6363,1:2:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EARTH_INSIGNIA#Earth Insignia#
2465,0,0,22:30:38,0,0,0,99,0,0,none,0,6360,1,6360,2,6360,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_FIRE_INSIGNIA#Fire Insignia#
2466,0,0,22:30:38,0,0,0,99,0,0,none,0,6361,1,6361,2,6361,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_WATER_INSIGNIA#Water Insignia#
2467,0,0,22:30:38,0,0,0,99,0,0,none,0,6362,1,6362,2,6362,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_WIND_INSIGNIA#Wind Insignia#
2468,0,0,22:30:38,0,0,0,99,0,0,none,0,6363,1,6363,2,6363,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EARTH_INSIGNIA#Earth Insignia#
//****
// GN Genetic

View File

@ -352,34 +352,38 @@ int battle_attr_fix(struct block_list *src, struct block_list *target, int damag
}
if( tsc && tsc->count ) { //since an atk can only have one type let's optimise this a bit
switch(atk_elem){
case ELE_FIRE:
if (tsc->data[SC_SPIDERWEB]) {
tsc->data[SC_SPIDERWEB]->val1 = 0; // free to move now
if( tsc->data[SC_SPIDERWEB]->val2-- > 0 )
damage <<= 1; // double damage
if( tsc->data[SC_SPIDERWEB]->val2 == 0 )
status_change_end(target, SC_SPIDERWEB, INVALID_TIMER);
}
if( tsc->data[SC_THORNSTRAP])
status_change_end(target, SC_THORNSTRAP, INVALID_TIMER);
if( tsc->data[SC_FIRE_CLOAK_OPTION])
damage -= damage * tsc->data[SC_FIRE_CLOAK_OPTION]->val2 / 100;
if( tsc->data[SC_CRYSTALIZE] && target->type != BL_MOB){
status_change_end(target, SC_CRYSTALIZE, INVALID_TIMER);
}
break;
case ELE_HOLY:
if( tsc->data[SC_ORATIO])
ratio += tsc->data[SC_ORATIO]->val1 * 2;
break;
case ELE_POISON:
if( tsc->data[SC_VENOMIMPRESS])
ratio += tsc->data[SC_VENOMIMPRESS]->val2;
break;
case ELE_WIND:
if( tsc->data[SC_CRYSTALIZE] && target->type != BL_MOB)
damage = damage * 150 / 100;
break;
case ELE_FIRE:
if( tsc->data[SC_SPIDERWEB]) {
tsc->data[SC_SPIDERWEB]->val1 = 0; // free to move now
if( tsc->data[SC_SPIDERWEB]->val2-- > 0 )
damage <<= 1; // double damage
if( tsc->data[SC_SPIDERWEB]->val2 == 0 )
status_change_end(target, SC_SPIDERWEB, INVALID_TIMER);
}
if( tsc->data[SC_THORNSTRAP])
status_change_end(target, SC_THORNSTRAP, INVALID_TIMER);
if( tsc->data[SC_FIRE_CLOAK_OPTION])
damage -= damage * tsc->data[SC_FIRE_CLOAK_OPTION]->val2 / 100;
if( tsc->data[SC_CRYSTALIZE] && target->type != BL_MOB)
status_change_end(target, SC_CRYSTALIZE, INVALID_TIMER);
if( tsc->data[SC_EARTH_INSIGNIA]) damage += damage/2;
break;
case ELE_HOLY:
if( tsc->data[SC_ORATIO]) ratio += tsc->data[SC_ORATIO]->val1 * 2;
break;
case ELE_POISON:
if( tsc->data[SC_VENOMIMPRESS]) ratio += tsc->data[SC_VENOMIMPRESS]->val2;
break;
case ELE_WIND:
if( tsc->data[SC_CRYSTALIZE] && target->type != BL_MOB) damage += damage/2;
if( tsc->data[SC_WATER_INSIGNIA]) damage += damage/2;
break;
case ELE_WATER:
if( tsc->data[SC_FIRE_INSIGNIA]) damage += damage/2;
break;
case ELE_EARTH:
if( tsc->data[SC_WIND_INSIGNIA]) damage += damage/2;
break;
}
} //end tsc check
if( src && src->type == BL_PC ){

View File

@ -2020,7 +2020,7 @@ int pc_bonus_subele(struct map_session_data* sd, unsigned char ele, short rate,
}
/*==========================================
* ? ???i????\????~{??i?X???
* Add a bonus(type) to player sd
*------------------------------------------*/
int pc_bonus(struct map_session_data *sd,int type,int val)
{
@ -8944,7 +8944,7 @@ void pc_setstand(struct map_session_data *sd){
nullpo_retv(sd);
status_change_end(&sd->bl, SC_TENSIONRELAX, INVALID_TIMER);
clif_status_load(&sd->bl,SI_SIT,0);
//Reset sitting tick.
sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0;
sd->state.dead_sit = sd->vd.dead_sit = 0;

View File

@ -591,6 +591,7 @@ int skillnotok (int skillid, struct map_session_data *sd)
break;
case WM_LULLABY_DEEPSLEEP:
case WM_SIRCLEOFNATURE:
case WM_SATURDAY_NIGHT_FEVER:
if( !map_flag_vs(m) ) {
clif_skill_teleportmessage(sd,2); // This skill uses this msg instead of skill fails.
return 1;
@ -3069,19 +3070,19 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
do {
if(src->prev == NULL)
break;
break; // Source not on Map
if(skl->target_id) {
target = map_id2bl(skl->target_id);
if( ( skl->skill_id == RG_INTIMIDATE || skl->skill_id == SC_FATALMENACE ) && (!target || target->prev == NULL || !check_distance_bl(src,target,AREA_SIZE)) )
target = src; //Required since it has to warp.
if(target == NULL)
break;
break; // Target offline?
if(target->prev == NULL)
break;
break; // Target not on Map
if(src->m != target->m)
break;
break; // Different Maps
if(status_isdead(src))
break;
break; // Caster is Dead
if(status_isdead(target) && skl->skill_id != RG_INTIMIDATE && skl->skill_id != WZ_WATERBALL)
break;
@ -8335,7 +8336,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
if( src->id != bl->id && battle_check_target(src,bl,BCT_ENEMY) > 0 )
status_fix_damage(src,bl,9999,clif_damage(src,bl,tick,0,0,9999,0,0,0));
} else if( sd ) {
if( !sd->status.party_id ) {
short chance = sstatus->int_/6 + sd->status.job_level/5 + skilllv*4;
if( !sd->status.party_id || (rnd()%100 > chance)) {
clif_skill_fail(sd,skillid,USESKILL_FAIL_NEED_HELPER,0);
break;
}
@ -11567,6 +11569,23 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
case UNT_EARTH_INSIGNIA:
case UNT_ZEPHYR:
sc_start(bl,type, 100, sg->skill_lv, sg->interval);
if (!battle_check_undead(tstatus->race, tstatus->def_ele)) {
int hp = tstatus->max_hp / 100; //+1% each 5s
if ((sg->val3) % 5) { //each 5s
if (tstatus->def_ele == skill_get_ele(sg->skill_id,sg->skill_lv)){
status_heal(bl, hp, 0, 2);
} else if((sg->unit_id == UNT_FIRE_INSIGNIA && tstatus->def_ele == ELE_EARTH)
||(sg->unit_id == UNT_WATER_INSIGNIA && tstatus->def_ele == ELE_FIRE)
||(sg->unit_id == UNT_WIND_INSIGNIA && tstatus->def_ele == ELE_WATER)
||(sg->unit_id == UNT_EARTH_INSIGNIA && tstatus->def_ele == ELE_WIND)
){
status_heal(bl, -hp, 0, 0);
}
}
}
sg->val3++; //timer
if (sg->val3 > 5)
sg->val3 = 0;
break;
case UNT_VACUUM_EXTREME:
@ -12554,19 +12573,6 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh
return 0;
}
break;
case GC_CROSSRIPPERSLASHER:
if( !(sc && sc->data[SC_ROLLINGCUTTER]) ) {
clif_skill_fail(sd, skill, USESKILL_FAIL_CONDITION, 0);
return 0;
}
break;
case GC_POISONSMOKE:
case GC_VENOMPRESSURE:
if( !(sc && sc->data[SC_POISONINGWEAPON]) ) {
clif_skill_fail(sd, skill, USESKILL_FAIL_GC_POISONINGWEAPON, 0);
return 0;
}
break;
/**
* Ranger
**/
@ -12848,6 +12854,18 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh
return 0;
}
break;
case ST_POISONINGWEAPON:
if (!(sc && sc->data[SC_POISONINGWEAPON])) {
clif_skill_fail(sd, skill, USESKILL_FAIL_GC_POISONINGWEAPON, 0);
return 0;
}
break;
case ST_ROLLINGCUTTER:
if (!(sc && sc->data[SC_ROLLINGCUTTER])) {
clif_skill_fail(sd, skill, USESKILL_FAIL_CONDITION, 0);
return 0;
}
break;
}
if(require.mhp > 0 && get_percentage(status->hp, status->max_hp) > require.mhp) {
@ -13218,6 +13236,10 @@ struct skill_condition skill_get_requirement(struct map_session_data* sd, short
case SO_SUMMON_AQUA:
case SO_SUMMON_VENTUS:
case SO_SUMMON_TERA:
case SO_WATER_INSIGNIA:
case SO_FIRE_INSIGNIA:
case SO_WIND_INSIGNIA:
case SO_EARTH_INSIGNIA:
if( i < 3 )
continue;
break;
@ -13258,6 +13280,10 @@ struct skill_condition skill_get_requirement(struct map_session_data* sd, short
case SO_SUMMON_AQUA:
case SO_SUMMON_VENTUS:
case SO_SUMMON_TERA:
case SO_WATER_INSIGNIA:
case SO_FIRE_INSIGNIA:
case SO_WIND_INSIGNIA:
case SO_EARTH_INSIGNIA:
req.itemid[lv-1] = skill_db[j].itemid[lv-1];
req.amount[lv-1] = skill_db[j].amount[lv-1];
break;
@ -13386,7 +13412,10 @@ int skill_castfix (struct block_list *bl, int skill_id, int skill_lv) {
if (battle_config.cast_rate != 100)
time = time * battle_config.cast_rate / 100;
// return final cast time
return (time > 0) ? time : 0;
time = max(time, 0);
// ShowInfo("Castime castfix = %d\n",time);
return time;
}
/*==========================================
@ -13416,8 +13445,10 @@ int skill_castfix_sc (struct block_list *bl, int time)
if (sc->data[SC_IZAYOI])
time -= time * 50 / 100;
}
return (time > 0) ? time : 0;
time = max(time, 0);
// ShowInfo("Castime castfix_sc = %d\n",time);
return time;
}
#ifdef RENEWAL_CAST
int skill_vfcastfix (struct block_list *bl, double time, int skill_id, int skill_lv)
@ -13475,6 +13506,8 @@ int skill_vfcastfix (struct block_list *bl, double time, int skill_id, int skill
VARCAST_REDUCTION(sc->data[SC_POEMBRAGI]->val2);
if (sc->data[SC_IZAYOI])
VARCAST_REDUCTION(50);
if (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 3 && (skill_get_ele(skill_id, skill_lv) == ELE_WATER))
VARCAST_REDUCTION(30); //Reduces 30% Variable Cast Time of Water spells.
// Fixed cast reduction bonuses
if( sc->data[SC__LAZINESS] )
fixcast_r = max(fixcast_r, sc->data[SC__LAZINESS]->val2);
@ -13486,7 +13519,7 @@ int skill_vfcastfix (struct block_list *bl, double time, int skill_id, int skill
if( sc->data[SC_MANDRAGORA] && (skill_id >= SM_BASH && skill_id <= RETURN_TO_ELDICASTES) )
fixed += sc->data[SC_MANDRAGORA]->val1 * 1000 / 2;
if (sc->data[SC_IZAYOI] && (skill_id >= NJ_TOBIDOUGU && skill_id <= NJ_ISSEN))
fixed = 0;
fixed = 0;
}
if( sd && !(skill_get_castnodex(skill_id, skill_lv)&4) ){
@ -13500,7 +13533,8 @@ int skill_vfcastfix (struct block_list *bl, double time, int skill_id, int skill
time = (1 - sqrt( ((float)(status_get_dex(bl)*2 + status_get_int(bl)) / battle_config.vcast_stat_scale) )) * time;
// underflow checking/capping
time = max(time, 0) + (1 - (float)min(fixcast_r, 100) / 100) * fixed;
// ShowInfo("Casttime vfcastfix = %d\n",time);
return (int)time;
}
#endif
@ -13580,7 +13614,10 @@ int skill_delayfix (struct block_list *bl, int skill_id, int skill_lv)
if (sc && sc->count) {
if (sc->data[SC_POEMBRAGI])
time -= time * sc->data[SC_POEMBRAGI]->val3 / 100;
if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 3 && (skill_get_ele(skill_id, skill_lv) == ELE_WIND))
time /= 2; // After Delay of Wind element spells reduced by 50%.
}
}
if( !(delaynodex&4) && sd && sd->delayrate != 100 )
@ -13589,10 +13626,12 @@ int skill_delayfix (struct block_list *bl, int skill_id, int skill_lv)
if (battle_config.delay_rate != 100)
time = time * battle_config.delay_rate / 100;
if (time < status_get_amotion(bl))
time = status_get_amotion(bl); // Delay can never be below amotion [Playtester]
return max(time, battle_config.min_skill_delay_limit);
//min delay
time = max(time, status_get_amotion(bl)); // Delay can never be below amotion [Playtester]
time = max(time, battle_config.min_skill_delay_limit);
// ShowInfo("Delay delayfix = %d\n",time);
return time;
}
/*=========================================
@ -17071,16 +17110,8 @@ void skill_cooldown_load(struct map_session_data * sd)
}
/*==========================================
* DB reading.
* sub-function of DB reading.
* skill_db.txt
* skill_require_db.txt
* skill_cast_db.txt
* skill_castnodex_db.txt
* skill_nocast_db.txt
* skill_unit_db.txt
* produce_db.txt
* create_arrow_db.txt
* abra_db.txt
*------------------------------------------*/
static bool skill_parse_row_skilldb(char* split[], int columns, int current)
@ -17148,7 +17179,7 @@ static bool skill_parse_row_requiredb(char* split[], int columns, int current)
skill_split_atoi(split[5],skill_db[i].sp_rate);
skill_split_atoi(split[6],skill_db[i].zeny);
//FIXME: document this
//Wich weapon type are required, see doc/item_db for types
p = split[7];
for( j = 0; j < 32; j++ )
{
@ -17206,6 +17237,9 @@ static bool skill_parse_row_requiredb(char* split[], int columns, int current)
else if( strcmpi(split[10],"ridingwarg")==0 ) skill_db[i].state = ST_RIDINGWUG;
else if( strcmpi(split[10],"mado")==0 ) skill_db[i].state = ST_MADO;
else if( strcmpi(split[10],"elementalspirit")==0 ) skill_db[i].state = ST_ELEMENTALSPIRIT;
else if (strcmpi(split[10], "poisonweapon") == 0) skill_db[i].state = ST_POISONINGWEAPON;
else if (strcmpi(split[10], "rollingcutter") == 0) skill_db[i].state = ST_ROLLINGCUTTER;
/**
* Unknown or no state
**/
@ -17215,7 +17249,7 @@ static bool skill_parse_row_requiredb(char* split[], int columns, int current)
for( j = 0; j < MAX_SKILL_ITEM_REQUIRE; j++ ) {
skill_db[i].itemid[j] = atoi(split[12+ 2*j]);
skill_db[i].amount[j] = atoi(split[13+ 2*j]);
}
}
return true;
}
@ -17482,6 +17516,18 @@ static bool skill_parse_row_changematerialdb(char* split[], int columns, int cur
return true;
}
/*===============================
* DB reading.
* skill_db.txt
* skill_require_db.txt
* skill_cast_db.txt
* skill_castnodex_db.txt
* skill_nocast_db.txt
* skill_unit_db.txt
* produce_db.txt
* create_arrow_db.txt
* abra_db.txt
*------------------------------*/
static void skill_readdb(void)
{
// init skill db structures

View File

@ -398,6 +398,8 @@ enum {
ST_RIDINGWUG,
ST_MADO,
ST_ELEMENTALSPIRIT,
ST_POISONINGWEAPON,
ST_ROLLINGCUTTER,
};
enum e_skill {

View File

@ -670,10 +670,10 @@ void initChangeTables(void) {
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_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 );
set_sc( SO_FIRE_INSIGNIA , SC_FIRE_INSIGNIA , SI_FIRE_INSIGNIA , SCB_MATK | SCB_BATK | SCB_WATK | SCB_ATK_ELE | SCB_REGEN );
set_sc( SO_WATER_INSIGNIA , SC_WATER_INSIGNIA , SI_WATER_INSIGNIA , SCB_WATK | SCB_ATK_ELE | SCB_REGEN );
set_sc( SO_WIND_INSIGNIA , SC_WIND_INSIGNIA , SI_WIND_INSIGNIA , SCB_WATK | SCB_ATK_ELE | SCB_REGEN );
set_sc( SO_EARTH_INSIGNIA , SC_EARTH_INSIGNIA , SI_EARTH_INSIGNIA , SCB_MDEF|SCB_DEF|SCB_MAXHP|SCB_MAXSP|SCB_WATK | SCB_ATK_ELE | SCB_REGEN );
/**
* Genetic
**/
@ -3433,6 +3433,11 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
regen->hp = cap_value(regen->hp*sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX);
regen->state.walk= 1;
}
if ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1) //if insignia lvl 1
|| (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 1)
|| (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 1)
|| (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 1))
regen->rate.hp *= 2;
}
void status_calc_state( struct block_list *bl, struct status_change *sc, enum scs_flag flag, bool start ) {
@ -5283,9 +5288,7 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
if(sc->data[SC_BERSERK])
aspd_rate -= 300;
else
if(sc->data[SC_MADNESSCANCEL])
else if(sc->data[SC_MADNESSCANCEL])
aspd_rate -= 200;
}
@ -5496,21 +5499,16 @@ unsigned char status_calc_attack_element(struct block_list *bl, struct status_ch
if(sc->data[SC_ENCHANTARMS])
return sc->data[SC_ENCHANTARMS]->val2;
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) )
|| (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 2) )
return ELE_WATER;
if(sc->data[SC_EARTHWEAPON] || (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2) )
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) )
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])
return ELE_EARTH;
if(sc->data[SC_FIREWEAPON])
return ELE_FIRE;
if(sc->data[SC_WINDWEAPON])
if(sc->data[SC_WINDWEAPON]
|| (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2) )
return ELE_WIND;
if(sc->data[SC_ENCPOISON])
return ELE_POISON;
@ -6378,7 +6376,6 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
case SC_INCREASEAGI:
if(sd && pc_issit(sd)){
pc_setstand(sd);
clif_status_load(&sd->bl,SI_SIT,0);
}
case SC_CONCENTRATE:
@ -6572,6 +6569,9 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
if(sc->data[i]) return 0;
}
break;
case SC_INTRAVISION:
if(sd && sd->special_state.intravision) return 0; //we already have the status by maya P
break;
}
//Check for BOSS resistances
@ -10118,7 +10118,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
case SC_SATURDAYNIGHTFEVER:
// 1% HP/SP drain every 3 seconds [Jobbie]
// 1% HP/SP drain every val4 seconds [Jobbie]
if( --(sce->val3) >= 0 )
{
int hp = status->hp / 100;