summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-SVN.txt8
-rw-r--r--conf-tmpl/battle_athena.conf3
-rw-r--r--db/const.txt3
-rw-r--r--doc/item_bonus.txt16
-rw-r--r--src/map/battle.c18
-rw-r--r--src/map/itemdb.c1
-rw-r--r--src/map/map.h8
-rw-r--r--src/map/mob.c9
-rw-r--r--src/map/pc.c49
-rw-r--r--src/map/skill.c5
-rw-r--r--src/map/skill.h3
-rw-r--r--src/map/status.c14
12 files changed, 121 insertions, 16 deletions
diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt
index 3b227cee5..08755e4a8 100644
--- a/Changelog-SVN.txt
+++ b/Changelog-SVN.txt
@@ -1,5 +1,13 @@
Date Added
+02/19
+ * Added bSubSize, bHPGainValue, and bDamageWhenUnequip [celest]
+ * Updated bSPDrainValue/Rate to accept a 'type' [celest]
+ * Set baby class players' size to 0(small) [celest]
+ * Fixed item_db2.txt reading printing wrong number of entries read [celest]
+ * Fixed @allskill not giving the newer stalker, whitesmith and creator skills
+ [celest]
+
02/18
* Fixed a bug with statpoint.txt reading and giving too much stat points,
thanks to Benz / eAthenaC [celest]
diff --git a/conf-tmpl/battle_athena.conf b/conf-tmpl/battle_athena.conf
index 34e047990..a6615b9e2 100644
--- a/conf-tmpl/battle_athena.conf
+++ b/conf-tmpl/battle_athena.conf
@@ -258,7 +258,8 @@ gm_skill_unconditional: no
// Can a normal player by-pass the skill tree? (Note 1)
player_skillfree: no
-// When doing a skill reset, whether the skill's restriction is to be ignored or not. (Note 1)
+// When set to yes, forces skill points gained from 1st class to be put into 1st class
+// sklls, and forces novice skill points to be put into the basic skill. (Note 1)
player_skillup_limit: no
// Forging success rate. (Note 2)
diff --git a/db/const.txt b/db/const.txt
index 5e3976c86..b902d4350 100644
--- a/db/const.txt
+++ b/db/const.txt
@@ -246,6 +246,9 @@ bSPGainValue 2021
bIgnoreDefMob 2022
bHPLossRate 2023
bAddRace2 2024
+bHPGainValue 2025
+bSubSize 2026
+bDamageWhenUnequip 2027
Eff_Stone 0
diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt
index 3403bc3c5..96a2ebe5f 100644
--- a/doc/item_bonus.txt
+++ b/doc/item_bonus.txt
@@ -1,4 +1,4 @@
-//eAthena Items Scripting Manual
+//eAthena Items Scripting Manual
skill n,x; skill n of level x
@@ -150,9 +150,12 @@ bonus bNoRegen,n; Stops regeneration for n.
bonus bUnstripable,n; Armor cannot be taken off via Strip skills
bonus bSPGainValue,n; When killing a monster by physical attack
gain n amount of sp
+bonus bHPGainValue,n; When killing a monster by physical attack
+ gain n amount of hp
bonus bIgnoreDefMob,n; Ignore monster's DEF when attacking.
n:0=All normal monsters, except Bosses
1=All monsters
+bonus bDamageWhenUnequip,n; Lose n HP when the item is unequipped
bonus2 bCriticalAddRace,n,x; Increase critical + n vs. enemies of type x
bonus2 bHPLossRate,n,x; Lose n amount of hp every x amount of time
@@ -163,11 +166,22 @@ bonus2 bAddDamageByClass,n,x; When being hit by monster of class n increase
damage taken by x%
bonus2 bAddRace2,n,x; Increase damage by x% vs. enemies of race n
(Check db/mob_race2_db.txt)
+bonus2 bSubSize,n,x; Damage x% reduction from n size
+ n:0=Small 1=Medium 2=Large
bonus3 bHPLossRate,n,x,y; Lose n amount of hp every x amount of time
y:0=Don't show damage 1=Show damage
bonus3 bAutoSpellWhenHit,x,y,n; n% chance to cast skill x of level y when
being hit by physical close range damage
+bonus3 bSPDrainRate,n,x,y; When attacking there is a n% chance to either
+ gain SP equivalent to x% of damage dealt, OR
+ drain the amount of sp from the enemy.
+ y:0=gain sp 1:drain enemy sp
+bonus3 bSPDrainValue,n,x,y; When attacking there is a n% chance to either
+ gain x SP, OR drain the amount of sp from the
+ enemy. y:0=gain sp 1:drain enemy sp
+ (Note: setting x to -1 or below will reduce
+ YOUR sp)
bonus4 bAutoSpellWhenHit,x,y,n,i; n% chance to cast skill x of level y when
being hit by physical close range damage
diff --git a/src/map/battle.c b/src/map/battle.c
index 6b46a357e..707362f7f 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -1058,7 +1058,7 @@ static struct Damage battle_calc_mob_weapon_attack(
struct Damage wd;
int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
int flag,skill,ac_flag = 0,dmg_lv = 0;
- int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
+ int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0,s_size=0;
struct status_change *sc_data,*t_sc_data;
short *sc_count;
short *option, *opt1, *opt2;
@@ -1074,6 +1074,7 @@ static struct Damage battle_calc_mob_weapon_attack(
s_race = status_get_race(src);
s_ele = status_get_attack_element(src);
+ s_size = status_get_size(src);
sc_data = status_get_sc_data(src);
sc_count = status_get_sc_count(src);
option = status_get_option(src);
@@ -1498,6 +1499,7 @@ static struct Damage battle_calc_mob_weapon_attack(
int cardfix=100,i;
cardfix=cardfix*(100-tsd->subele[s_ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
cardfix=cardfix*(100-tsd->subrace[s_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->subsize[s_size])/100;
if(mob_db[md->class_].mode & 0x20)
cardfix=cardfix*(100-tsd->subrace[10])/100;
else
@@ -1616,7 +1618,7 @@ static struct Damage battle_calc_pc_weapon_attack(
struct Damage wd;
int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
int flag,skill,dmg_lv = 0;
- int t_mode=0,t_race=0,t_size=1,s_race=7,s_ele=0;
+ int t_mode=0,t_race=0,t_size=1,s_race=7,s_ele=0,s_size=1;
int t_race2=0;
struct status_change *sc_data,*t_sc_data;
short *sc_count;
@@ -1640,6 +1642,7 @@ static struct Damage battle_calc_pc_weapon_attack(
s_race=status_get_race(src); //Ží‘°
s_ele=status_get_attack_element(src); //‘®«
s_ele_=status_get_attack_element2(src); //¶Žè‘®«
+ s_size=status_get_size(src);
sc_data=status_get_sc_data(src); //ƒXƒe[ƒ^ƒXˆÙí
sc_count=status_get_sc_count(src); //ƒXƒe[ƒ^ƒXˆÙí‚Ì”
option=status_get_option(src); //‘é‚Æ‚©ƒyƒR‚Æ‚©ƒJ[ƒg‚Æ‚©
@@ -2602,6 +2605,7 @@ static struct Damage battle_calc_pc_weapon_attack(
cardfix=100;
cardfix=cardfix*(100-tsd->subrace[s_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
cardfix=cardfix*(100-tsd->subele[s_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->subsize[s_size])/100;
if(status_get_mode(src) & 0x20)
cardfix=cardfix*(100-tsd->subrace[10])/100; //ƒ{ƒX‚©‚ç‚ÌUŒ‚‚̓_ƒ[ƒWŒ¸­
else
@@ -2904,7 +2908,7 @@ struct Damage battle_calc_magic_attack(
int aflag;
int normalmagic_flag=1;
int matk_flag = 1;
- int ele=0,race=7,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i;
+ int ele=0,race=7,size=1,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i;
struct map_session_data *sd=NULL,*tsd=NULL;
struct mob_data *tmd = NULL;
@@ -2925,6 +2929,7 @@ struct Damage battle_calc_magic_attack(
matk2=status_get_matk2(bl);
ele = skill_get_pl(skill_num);
race = status_get_race(bl);
+ size = status_get_size(bl);
t_ele = status_get_elem_type(target);
t_race = status_get_race(target);
t_mode = status_get_mode(target);
@@ -3131,6 +3136,7 @@ struct Damage battle_calc_magic_attack(
cardfix=100;
cardfix=cardfix*(100-tsd->subele[ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
cardfix=cardfix*(100-tsd->subrace[race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->subsize[size])/100;
cardfix=cardfix*(100-tsd->magic_subrace[race])/100;
if(status_get_mode(bl) & 0x20)
cardfix=cardfix*(100-tsd->magic_subrace[10])/100;
@@ -3207,7 +3213,7 @@ struct Damage battle_calc_misc_attack(
int int_=status_get_int(bl);
// int luk=status_get_luk(bl);
int dex=status_get_dex(bl);
- int skill,ele,race,cardfix;
+ int skill,ele,race,size,cardfix;
struct map_session_data *sd=NULL,*tsd=NULL;
int damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv);
struct Damage md;
@@ -3311,6 +3317,7 @@ struct Damage battle_calc_misc_attack(
ele = skill_get_pl(skill_num);
race = status_get_race(bl);
+ size = status_get_size(bl);
if(damagefix){
if(damage<1 && skill_num != NPC_DARKBREATH)
@@ -3320,6 +3327,7 @@ struct Damage battle_calc_misc_attack(
cardfix=100;
cardfix=cardfix*(100-tsd->subele[ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
cardfix=cardfix*(100-tsd->subrace[race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->subsize[size])/100;
cardfix=cardfix*(100-tsd->misc_def_rate)/100;
damage=damage*cardfix/100;
}
@@ -3605,6 +3613,8 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
}
if (hp || sp) pc_heal(sd, hp, sp);
+ if (sd->sp_drain_type && target->type == BL_PC)
+ battle_heal(NULL,target,0,-sp,0);
}
}
if (target->type == BL_PC) {
diff --git a/src/map/itemdb.c b/src/map/itemdb.c
index 5e19b1aca..41e2e2a75 100644
--- a/src/map/itemdb.c
+++ b/src/map/itemdb.c
@@ -381,6 +381,7 @@ static int itemdb_readdb(void)
fclose(fp);
sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]);
ShowStatus(tmp_output);
+ ln=0; // reset to 0
}
return 0;
}
diff --git a/src/map/map.h b/src/map/map.h
index b8fe82539..99bceb884 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -285,11 +285,14 @@ struct map_session_data {
unsigned short unstripable_equip;
short add_damage_classid2[10],add_damage_class_count2;
int add_damage_classrate2[10];
- short sp_gain_value;
+ short sp_gain_value, hp_gain_value;
+ short sp_drain_type;
short ignore_def_mob, ignore_def_mob_;
int hp_loss_tick, hp_loss_rate;
short hp_loss_value, hp_loss_type;
int addrace2[6],addrace2_[6];
+ int subsize[3];
+ short unequip_damage;
short spiritball, spiritball_old;
int spirit_timer[MAX_SKILL_LEVEL];
@@ -631,7 +634,8 @@ enum {
SP_CRIT_ATK_RATE, SP_CRITICAL_ADDRACE, SP_NO_REGEN, SP_ADDEFF_WHENHIT, SP_AUTOSPELL_WHENHIT, // 2013-2017
SP_SKILL_ATK, SP_UNSTRIPABLE, SP_ADD_DAMAGE_BY_CLASS, // 2018-2020
- SP_SP_GAIN_VALUE, SP_IGNORE_DEF_MOB, SP_HP_LOSS_RATE, SP_ADDRACE2 // 2021-2023
+ SP_SP_GAIN_VALUE, SP_IGNORE_DEF_MOB, SP_HP_LOSS_RATE, SP_ADDRACE2, SP_HP_GAIN_VALUE, // 2021-2025
+ SP_SUBSIZE, SP_DAMAGE_WHEN_UNEQUIP // 2026
};
enum {
diff --git a/src/map/mob.c b/src/map/mob.c
index 14a9b564b..6b2e4e37a 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -2384,18 +2384,25 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
if(sd) {
- int sp = 0;
+ int sp = 0, hp = 0;
if (sd->state.attack_type == BF_MAGIC && (i=pc_checkskill(sd,HW_SOULDRAIN))>0){ /* ƒ\ƒEƒ‹ƒhƒŒƒCƒ“ */
clif_skill_nodamage(src,&md->bl,HW_SOULDRAIN,i,1);
sp += (status_get_lv(&md->bl))*(65+15*i)/100;
}
sp += sd->sp_gain_value;
+ hp += sd->hp_gain_value;
if (sp > 0) {
if(sd->status.sp + sp > sd->status.max_sp)
sp = sd->status.max_sp - sd->status.sp;
sd->status.sp += sp;
clif_heal(sd->fd,SP_SP,sp);
}
+ if (hp > 0) {
+ if(sd->status.hp + hp > sd->status.max_hp)
+ hp = sd->status.max_hp - sd->status.hp;
+ sd->status.hp += hp;
+ clif_heal(sd->fd,SP_HP,hp);
+ }
}
// mapŠO‚ÉÁ‚¦‚½l‚ÍŒvŽZ‚©‚眂­‚Ì‚Å
diff --git a/src/map/pc.c b/src/map/pc.c
index eac66bb97..4b2131f57 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -980,6 +980,8 @@ int pc_calc_skilltree(struct map_session_data *sd)
if(battle_config.enable_upper_class){ //conf‚Å–³?‚Å‚È‚¯‚ê‚Î?‚Ý?‚Þ
for(i=355;i<411;i++)
sd->status.skill[i].id=i;
+ for(i=475;i<480;i++)
+ sd->status.skill[i].id=i;
}
}else{
do {
@@ -1585,6 +1587,14 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
else if(sd->state.lr_flag == 1)
sd->ignore_def_mob_ |= 1<<val;
break;
+ case SP_HP_GAIN_VALUE:
+ if(!sd->state.lr_flag)
+ sd->hp_gain_value += val;
+ break;
+ case SP_DAMAGE_WHEN_UNEQUIP:
+ if(!sd->state.lr_flag)
+ sd->unequip_damage += val;
+ break;
default:
if(battle_config.error_log)
printf("pc_bonus: unknown type %d %d !\n",type,val);
@@ -1764,8 +1774,9 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
}
else if(sd->state.lr_flag == 1) {
sd->sp_drain_rate_ += type2;
- sd->sp_drain_per_ += val;
+ sd->sp_drain_per_ += val;
}
+ sd->sp_drain_type = 0;
break;
case SP_SP_DRAIN_VALUE:
if(!sd->state.lr_flag) {
@@ -1776,7 +1787,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
sd->sp_drain_rate_ += type2;
sd->sp_drain_value_ += val;
}
-
+ sd->sp_drain_type = 0;
break;
case SP_WEAPON_COMA_ELE:
if(sd->state.lr_flag != 2)
@@ -1847,6 +1858,10 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
else
sd->addrace2_[type2] += val;
break;
+ case SP_SUBSIZE:
+ if(sd->state.lr_flag != 2)
+ sd->subsize[type2]+=val;
+ break;
default:
if(battle_config.error_log)
@@ -1900,6 +1915,27 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
sd->hp_loss_type = val;
}
break;
+ case SP_SP_DRAIN_RATE:
+ if(!sd->state.lr_flag) {
+ sd->sp_drain_rate += type2;
+ sd->sp_drain_per += type3;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->sp_drain_rate_ += type2;
+ sd->sp_drain_per_ += type3;
+ }
+ sd->sp_drain_type = val;
+ break;
+ case SP_SP_DRAIN_VALUE:
+ if(!sd->state.lr_flag) {
+ sd->sp_drain_rate += type2;
+ sd->sp_drain_value += type3;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->sp_drain_rate_ += type2;
+ sd->sp_drain_value_ += type3;
+ }
+ sd->sp_drain_type = val;
default:
if(battle_config.error_log)
printf("pc_bonus3: unknown type %d %d %d %d!\n",type,type2,type3,val);
@@ -4306,6 +4342,8 @@ int pc_allskillup(struct map_session_data *sd)
if(battle_config.enable_upper_class){ //conf‚Å–³?‚Å‚È‚¯‚ê‚Î?‚Ý?‚Þ
for(i=355;i<411;i++)
sd->status.skill[i].id=i;
+ for(i=475;i<480;i++)
+ sd->status.skill[i].id=i;
}
}
else {
@@ -6067,6 +6105,13 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag)
} else {
clif_unequipitemack(sd,n,0,0);
}
+ if (sd->unequip_damage > 0) {
+ short dmg = sd->unequip_damage;
+ if (dmg > sd->status.hp)
+ dmg = sd->status.hp;
+ pc_heal(sd,-dmg,0);
+ }
+
if(flag&1) {
status_calc_pc(sd,0);
if(sd->sc_count && sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
diff --git a/src/map/skill.c b/src/map/skill.c
index 4bdf4ae2a..03704839f 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1588,7 +1588,10 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds
if(sd->sp_drain_rate_ > 0 && sp < 1) sp = 1;
else if(sd->sp_drain_rate_ < 0 && sp > -1) sp = -1;
}
- if(hp || sp) pc_heal(sd,hp,sp);
+ if(hp || sp)
+ pc_heal(sd,hp,sp);
+ if (sd->sp_drain_type && bl->type == BL_PC)
+ battle_heal(NULL,bl,0,-sp,0);
}
if((skillid || flag) && rdamage > 0)
diff --git a/src/map/skill.h b/src/map/skill.h
index c06ab270f..dc789aa4a 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -611,7 +611,8 @@ enum {
WE_BABY,
WE_CALLPARENT,
WE_CALLBABY,
- TK_RUN,
+
+ TK_RUN = 411,
TK_READYSTORM,
TK_STORMKICK,
TK_READYDOWN,
diff --git a/src/map/status.c b/src/map/status.c
index 74a7bd320..05c6c8baa 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -512,6 +512,9 @@ int status_calc_pc(struct map_session_data* sd,int first)
sd->hp_loss_rate = sd->hp_loss_value = sd->hp_loss_type = 0;
memset(sd->addrace2,0,sizeof(sd->addrace2));
memset(sd->addrace2_,0,sizeof(sd->addrace2_));
+ sd->hp_gain_value = sd->sp_drain_type = 0;
+ memset(sd->subsize,0,sizeof(sd->subsize));
+ sd->unequip_damage = 0;
if(!sd->disguiseflag && sd->disguise) {
sd->disguise=0;
@@ -2786,11 +2789,16 @@ int status_get_size(struct block_list *bl)
nullpo_retr(1, bl);
if(bl->type==BL_MOB && (struct mob_data *)bl)
return mob_db[((struct mob_data *)bl)->class_].size;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return 1;
else if(bl->type==BL_PET && (struct pet_data *)bl)
return mob_db[((struct pet_data *)bl)->class_].size;
- else
+ else if(bl->type==BL_PC) {
+ struct map_session_data *sd = (struct map_session_data *)bl;
+ //if (pc_isriding(sd)) // fact or rumour?
+ // return 2;
+ if (pc_calc_upper(sd->status.class_) == 2)
+ return 0;
+ return 1;
+ } else
return 1;
}
int status_get_mode(struct block_list *bl)