Bug Fixes

* Updated Napalm Vulcan damage to official. (bugreport:9297)
* Firing Trap should be removed immediately once it has detonated.
* Updated Expanded Super Novice ASPD values for weapons to match normal Super Novices.
* Updated Expanded Super Novice and Super Baby to be able to do anything normal Super Novices can do. Guardian Angel, Dori Dori, etc.
* Super Novices are able to equip any level 4 weapons of type Daggers, 1H Swords, 1H Axes, 1H Maces, and 1H/2H Staves while Soul Linked. (bugreport:2765, bugreport:5568)
* Reverted the Warlock elemental summons to not be limited per level from 237579c. All levels allow up to 5 summons.
This commit is contained in:
aleos89
2014-09-29 14:22:50 -04:00
parent cfef8a0088
commit 82561947e3
8 changed files with 46 additions and 37 deletions

View File

@@ -262,7 +262,7 @@
// Baby Mechanic (Mado)
4112, 30000,90 ,500 ,400 ,440 ,640 ,690 ,2000 ,2000 ,2000 ,490 ,520 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
// Super Novice (Expanded)
4190, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650 ,540
4190, 20000,0 ,500 ,100 ,440 ,590 ,610 ,2000 ,2000 ,2000 ,540 ,2000 ,540 ,540 ,690 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,690 ,540
// Super Baby (Expanded)
4191, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650 ,540
// Kagerou

View File

@@ -5387,7 +5387,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
skillratio += 40*skill_lv;
break;
case HW_NAPALMVULCAN:
skillratio += 10*skill_lv-30;
skillratio += 25;
break;
case SL_STIN:
skillratio += (tstatus->size!=SZ_SMALL?-99:10*skill_lv); //target size must be small (0) for full damage.

View File

@@ -13441,6 +13441,9 @@ void clif_parse_NoviceDoriDori(int fd, struct map_session_data *sd)
if (!sd->state.rest)
break;
case MAPID_SUPER_NOVICE:
case MAPID_SUPER_BABY:
case MAPID_SUPER_NOVICE_E:
case MAPID_SUPER_BABY_E:
sd->state.doridori=1;
break;
}
@@ -13457,8 +13460,9 @@ void clif_parse_NoviceDoriDori(int fd, struct map_session_data *sd)
/// "Help me out~ Please~ T_T"
void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd)
{
if( ( sd->class_&MAPID_UPPERMASK ) == MAPID_SUPER_NOVICE ) {
if( sd->class_&JOBL_SUPER_NOVICE ) {
unsigned int next = pc_nextbaseexp(sd);
if( next == 0 ) next = pc_thisbaseexp(sd);
if( next ) {
int percent = (int)( ( (float)sd->status.base_exp/(float)next )*1000. );

View File

@@ -114,16 +114,18 @@ enum MOBID {
//These marks the "level" of the job.
#define JOBL_2_1 0x100 //256
#define JOBL_2_2 0x200 //512
#define JOBL_2 0x300
#define JOBL_2 0x300 //1024
#define JOBL_UPPER 0x1000 //4096
#define JOBL_BABY 0x2000 //8192
#define JOBL_THIRD 0x4000 //16384
#define JOBL_SUPER_NOVICE 0x8000 //32768
//for filtering and quick checking.
#define MAPID_BASEMASK 0x00ff
#define MAPID_UPPERMASK 0x0fff
#define MAPID_THIRDMASK (JOBL_THIRD|MAPID_UPPERMASK)
//First Jobs
//Note the oddity of the novice:
//Super Novices are considered the 2-1 version of the novice! Novices are considered a first class type, too...
@@ -146,8 +148,7 @@ enum e_mapid {
MAPID_GANGSI,
MAPID_OKTOBERFEST,
//2-1 Jobs
MAPID_SUPER_NOVICE = JOBL_2_1|0x0,
MAPID_KNIGHT,
MAPID_KNIGHT = JOBL_2_1|0x1,
MAPID_WIZARD,
MAPID_HUNTER,
MAPID_PRIEST,
@@ -197,8 +198,7 @@ enum e_mapid {
MAPID_BABY_MERCHANT,
MAPID_BABY_THIEF,
//Baby 2-1 Jobs
MAPID_SUPER_BABY = JOBL_BABY|JOBL_2_1|0x0,
MAPID_BABY_KNIGHT,
MAPID_BABY_KNIGHT = JOBL_BABY|JOBL_2_1|0x1,
MAPID_BABY_WIZARD,
MAPID_BABY_HUNTER,
MAPID_BABY_PRIEST,
@@ -212,8 +212,7 @@ enum e_mapid {
MAPID_BABY_ALCHEMIST,
MAPID_BABY_ROGUE,
//3-1 Jobs
MAPID_SUPER_NOVICE_E = JOBL_THIRD|JOBL_2_1|0x0,
MAPID_RUNE_KNIGHT,
MAPID_RUNE_KNIGHT = JOBL_THIRD|JOBL_2_1|0x1,
MAPID_WARLOCK,
MAPID_RANGER,
MAPID_ARCH_BISHOP,
@@ -241,8 +240,7 @@ enum e_mapid {
MAPID_GENETIC_T,
MAPID_SHADOW_CHASER_T,
//Baby 3-1 Jobs
MAPID_SUPER_BABY_E = JOBL_THIRD|JOBL_BABY|JOBL_2_1|0x0,
MAPID_BABY_RUNE,
MAPID_BABY_RUNE = JOBL_THIRD|JOBL_BABY|JOBL_2_1|0x1,
MAPID_BABY_WARLOCK,
MAPID_BABY_RANGER,
MAPID_BABY_BISHOP,
@@ -255,6 +253,11 @@ enum e_mapid {
MAPID_BABY_SURA,
MAPID_BABY_GENETIC,
MAPID_BABY_CHASER,
//Super Novices
MAPID_SUPER_NOVICE = JOBL_SUPER_NOVICE|JOBL_2_1|0x0,
MAPID_SUPER_BABY = JOBL_SUPER_NOVICE|JOBL_BABY|JOBL_2_1|0x0,
MAPID_SUPER_NOVICE_E = JOBL_SUPER_NOVICE|JOBL_THIRD|JOBL_2_1|0x0,
MAPID_SUPER_BABY_E = JOBL_SUPER_NOVICE|JOBL_THIRD|JOBL_BABY|JOBL_2_1|0x0,
};
//Max size for inputs to Graffiti, Talkie Box and Vending text prompts

View File

@@ -237,6 +237,8 @@ static void party_check_state(struct party_data *p)
break;
case JOB_SUPER_NOVICE:
case JOB_SUPER_BABY:
case JOB_SUPER_NOVICE_E:
case JOB_SUPER_BABY_E:
p->state.snovice = 1;
break;
case JOB_TAEKWON:

View File

@@ -914,7 +914,7 @@ bool pc_can_Adopt(struct map_session_data *p1_sd, struct map_session_data *p2_sd
return false;
}
if( !( ( b_sd->status.class_ >= JOB_NOVICE && b_sd->status.class_ <= JOB_THIEF ) || b_sd->status.class_ == JOB_SUPER_NOVICE ) )
if( !( ( b_sd->status.class_ >= JOB_NOVICE && b_sd->status.class_ <= JOB_THIEF ) || b_sd->status.class_ == JOB_SUPER_NOVICE || b_sd->status.class_ == JOB_SUPER_NOVICE_E ) )
return false;
return true;
@@ -1058,13 +1058,14 @@ bool pc_isequip(struct map_session_data *sd,int n)
if (sd->status.base_level > 90 && item->equip & EQP_HELM)
return true; //Can equip all helms
if (sd->status.base_level > 96 && item->equip & EQP_ARMS && item->type == IT_WEAPON)
if (sd->status.base_level > 96 && item->equip & EQP_ARMS && item->type == IT_WEAPON && item->wlv == 4)
switch(item->look) { //In weapons, the look determines type of weapon.
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 1H Maces
case W_STAFF: //All 1H Staves
case W_DAGGER: //All level 4 - Daggers
case W_1HSWORD: //All level 4 - 1H Swords
case W_1HAXE: //All level 4 - 1H Axes
case W_MACE: //All level 4 - 1H Maces
case W_STAFF: //All level 4 - 1H Staves
case W_2HSTAFF: //All level 4 - 2H Staves
return true;
}
}
@@ -1781,7 +1782,7 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
c = MAPID_NOVICE;
}
// limit 2nd class and above to first class job levels (super novices are exempt)
else if ((sd->class_&JOBL_2) && (sd->class_&MAPID_UPPERMASK) != MAPID_SUPER_NOVICE)
else if (sd->class_&JOBL_2 && !(sd->class_&JOBL_SUPER_NOVICE))
{
// regenerate change_level_2nd
if (!sd->change_level_2nd)
@@ -6162,7 +6163,7 @@ int pc_checkbaselevelup(struct map_session_data *sd) {
status_calc_pc(sd,SCO_FORCE);
status_percent_heal(&sd->bl,100,100);
if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE) {
if(sd->class_&JOBL_SUPER_NOVICE) {
sc_start(&sd->bl,&sd->bl,status_skill2sc(PR_KYRIE),100,1,skill_get_time(PR_KYRIE,1));
sc_start(&sd->bl,&sd->bl,status_skill2sc(PR_IMPOSITIO),100,1,skill_get_time(PR_IMPOSITIO,1));
sc_start(&sd->bl,&sd->bl,status_skill2sc(PR_MAGNIFICAT),100,1,skill_get_time(PR_MAGNIFICAT,1));
@@ -7180,8 +7181,9 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
// Activate Steel body if a super novice dies at 99+% exp [celest]
// Super Novices have no kill or die functions attached when saved by their angel
if ((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && !sd->state.snovice_dead_flag) {
if (sd->class_&JOBL_SUPER_NOVICE && !sd->state.snovice_dead_flag) {
unsigned int next = pc_nextbaseexp(sd);
if( next == 0 ) next = pc_thisbaseexp(sd);
if( get_percentage(sd->status.base_exp,next) >= 99 ) {
sd->state.snovice_dead_flag = 1;
@@ -7989,7 +7991,7 @@ bool pc_jobchange(struct map_session_data *sd,int job, char upper)
return false; //Nothing to change.
// changing from 1st to 2nd job
if ((b_class&JOBL_2) && !(sd->class_&JOBL_2) && (b_class&MAPID_UPPERMASK) != MAPID_SUPER_NOVICE) {
if ((b_class&JOBL_2) && !(sd->class_&JOBL_2) && !(b_class&JOBL_SUPER_NOVICE)) {
sd->change_level_2nd = sd->status.job_level;
pc_setglobalreg (sd, "jobchange_level", sd->change_level_2nd);
}
@@ -8632,7 +8634,7 @@ bool pc_setregistry(struct map_session_data *sd,const char *reg,int val,int type
{
case 3: //Char reg
if( !strcmp(reg,"PC_DIE_COUNTER") && sd->die_counter != val ) {
i = (!sd->die_counter && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE);
i = (!sd->die_counter && sd->class_&JOBL_SUPER_NOVICE);
sd->die_counter = val;
if( i )
status_calc_pc(sd,SCO_NONE); // Lost the bonus.

View File

@@ -382,7 +382,7 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
hp += hp * skill * 2 / 100;
else if( src->type == BL_HOM && (skill = hom_checkskill(((TBL_HOM*)src), HLIF_BRAIN)) > 0 )
hp += hp * skill * 2 / 100;
if( sd && tsd && sd->status.partner_id == tsd->status.char_id && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.sex == 0 )
if( sd && tsd && sd->status.partner_id == tsd->status.char_id && sd->class_&JOBL_SUPER_NOVICE && sd->status.sex == 0 )
hp *= 2;
break;
}
@@ -2747,11 +2747,10 @@ void skill_attack_blow(struct block_list *src, struct block_list *dsrc, struct b
if (!blewcount || target == dsrc || status_isdead(target))
return;
// Skill spesific direction
// Skill specific direction
switch (skill_id) {
case MG_FIREWALL:
case PR_SANCTUARY:
case SC_TRIANGLESHOT:
case GN_WALLOFTHORN:
case EL_FIRE_MANTLE:
dir = unit_getdir(target); // Backwards
@@ -8075,7 +8074,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SL_SUPERNOVICE:
case SL_WIZARD:
//NOTE: here, 'type' has the value of the associated MAPID, not of the SC_SPIRIT constant.
if (sd && !(dstsd && (dstsd->class_&MAPID_UPPERMASK) == type)) {
if (sd && !(dstsd && ((skill_id != SL_SUPERNOVICE && (dstsd->class_&MAPID_UPPERMASK) == type) || (skill_id == SL_SUPERNOVICE && !(dstsd->class_&JOBL_SUPER_NOVICE))))) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
break;
}
@@ -8948,7 +8947,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case WL_SUMMONWB:
case WL_SUMMONSTONE:
{
short element = 0, sctype = 0, pos = -1, j = 0;
short element = 0, sctype = 0, pos = -1;
struct status_change *sc = status_get_sc(src);
if( !sc )
@@ -8957,13 +8956,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
for( i = SC_SPHERE_1; i <= SC_SPHERE_5; i++ ) {
if( !sctype && !sc->data[i] )
sctype = i; // Take the free SC
if( sc->data[i] ) {
if( sc->data[i] )
pos = max(sc->data[i]->val2,pos);
j++;
}
}
if( !sctype || j >= skill_lv ) {
if( !sctype ) {
if( sd ) // No free slots to put SC
clif_skill_fail(sd,skill_id,USESKILL_FAIL_SUMMON,0);
break;
@@ -12877,8 +12874,9 @@ int skill_unit_onplace_timer (struct skill_unit *unit, struct block_list *bl, un
if (sg->unit_id != UNT_FIREPILLAR_ACTIVE)
clif_changetraplook(&unit->bl,(sg->unit_id == UNT_LANDMINE ? UNT_FIREPILLAR_ACTIVE : UNT_USED_TRAPS));
sg->unit_id = UNT_USED_TRAPS; //Changed ID so it does not invoke a for each in area again.
sg->limit = DIFF_TICK(tick, sg->tick) + 1500 +
(sg->unit_id == UNT_CLUSTERBOMB || sg->unit_id == UNT_ICEBOUNDTRAP ? 1000 : 0); // Cluster Bomb/Icebound has 1s to disappear once activated.
sg->limit = DIFF_TICK(tick, sg->tick) +
(sg->unit_id == UNT_CLUSTERBOMB || sg->unit_id == UNT_ICEBOUNDTRAP ? 1000 : 0) + // Cluster Bomb/Icebound has 1s to disappear once activated.
(sg->unit_id == UNT_FIRINGTRAP ? 0 : 1500); // Firing Trap gets removed immediately once activated.
break;
case UNT_TALKIEBOX:

View File

@@ -2570,7 +2570,7 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
bonus += sd->bonus.hp;
if ((i = pc_checkskill(sd,CR_TRUST)) > 0)
bonus += i * 200;
if ((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.base_level >= 99)
if (sd->class_&JOBL_SUPER_NOVICE && sd->status.base_level >= 99)
bonus += 2000; // Supernovice lvl99 hp bonus.
}
@@ -3197,7 +3197,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
}
// If a Super Novice has never died and is at least joblv 70, he gets all stats +10
if(((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && (sd->status.job_level >= 70 || sd->class_&JOBL_THIRD)) && sd->die_counter == 0) {
if((sd->class_&JOBL_SUPER_NOVICE && (sd->status.job_level >= 70 || sd->class_&JOBL_THIRD)) && sd->die_counter == 0) {
status->str += 10;
status->agi += 10;
status->vit += 10;