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:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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. );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
26
src/map/pc.c
26
src/map/pc.c
@@ -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.
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user