summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map/battle.c15
-rw-r--r--src/map/battle.h3
-rw-r--r--src/map/mob.c4
-rw-r--r--src/map/pc.c7
-rw-r--r--src/map/skill.c13
-rw-r--r--src/map/status.c2
-rw-r--r--src/map/status.h1
7 files changed, 37 insertions, 8 deletions
diff --git a/src/map/battle.c b/src/map/battle.c
index f7965a5b7..7439760b5 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -1995,7 +1995,12 @@ static struct Damage battle_calc_weapon_attack(
{ //SG Anger bonus - ATK_ADDRATE [Komurka]
static int type[] = { SG_SUN_ANGER, SG_MOON_ANGER, SG_STAR_ANGER };
short t_class = status_get_class(target);
- for (i = 0; i < 3; i++)
+ if (sc->data && sc->data[SC_MIRACLE].timer!=-1 && (skill = pc_checkskill(sd,type[2])))
+ {
+ skillratio = (sd->status.base_level + status_get_str(src) + status_get_dex(src)+ status_get_luk(src))/(skill<4?12-3*skill:1);
+ ATK_ADDRATE(skillratio);
+ }
+ else for (i = 0; i < 3; i++)
{
if (t_class == sd->hate_mob[i] && (skill = pc_checkskill(sd,type[i])))
{
@@ -3826,6 +3831,7 @@ static const struct battle_data_short {
{ "mob_status_def_rate", &battle_config.mob_sc_def_rate },
{ "pc_max_status_def", &battle_config.pc_max_sc_def },
{ "mob_max_status_def", &battle_config.mob_max_sc_def },
+ { "sg_miracle_skill_ratio", &battle_config.sg_miracle_skill_ratio },
};
static const struct battle_data_int {
@@ -3861,6 +3867,8 @@ static const struct battle_data_int {
{ "day_duration", &battle_config.day_duration }, // added by [Yor]
{ "night_duration", &battle_config.night_duration }, // added by [Yor]
{ "mob_remove_delay", &battle_config.mob_remove_delay },
+ { "sg_miracle_skill_duration", &battle_config.sg_miracle_skill_duration },
+
};
int battle_set_value(char *w1, char *w2) {
@@ -4221,6 +4229,8 @@ void battle_set_defaults() {
battle_config.mob_sc_def_rate = 100;
battle_config.pc_max_sc_def = 10000;
battle_config.mob_max_sc_def = 5000;
+ battle_config.sg_miracle_skill_ratio=1;
+ battle_config.sg_miracle_skill_duration=600000;
}
void battle_validate_conf() {
@@ -4413,6 +4423,9 @@ void battle_validate_conf() {
battle_config.pc_max_sc_def = 10000;
if (battle_config.mob_max_sc_def > 10000)
battle_config.mob_max_sc_def = 10000;
+ if (battle_config.sg_miracle_skill_ratio > 10000)
+ battle_config.sg_miracle_skill_ratio = 10000;
+
#ifdef CELL_NOSTACK
if (battle_config.cell_stack_limit < 1)
battle_config.cell_stack_limit = 1;
diff --git a/src/map/battle.h b/src/map/battle.h
index 92828223e..09eddf294 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -427,6 +427,9 @@ extern struct Battle_Config {
unsigned short pc_max_sc_def;
unsigned short mob_max_sc_def;
+ unsigned short sg_miracle_skill_ratio;
+ int sg_miracle_skill_duration;
+
} battle_config;
void do_init_battle(void);
diff --git a/src/map/mob.c b/src/map/mob.c
index 6be660c9e..af8cb9dea 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -2474,7 +2474,9 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
per *= 1.15; // pk_mode additional exp if monster >20 levels [Valaris]
//SG additional exp from Blessings [Komurka] - probably can be optimalized ^^;;
- if(md->class_ == tmpsd[i]->hate_mob[0] && (battle_config.allow_skill_without_day || is_day_of_sun()))
+ if (tmpsd[i]->sc.data[SC_MIRACLE].timer!=-1)
+ per += per*20*pc_checkskill(tmpsd[i],SG_STAR_BLESS)/100.;
+ else if(md->class_ == tmpsd[i]->hate_mob[0] && (battle_config.allow_skill_without_day || is_day_of_sun()))
per += per*10*pc_checkskill(tmpsd[i],SG_SUN_BLESS)/100.;
else if(md->class_ == tmpsd[i]->hate_mob[1] && (battle_config.allow_skill_without_day || is_day_of_moon()))
per += per*10*pc_checkskill(tmpsd[i],SG_MOON_BLESS)/100.;
diff --git a/src/map/pc.c b/src/map/pc.c
index 0d10dfc69..216d9cfd2 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -3728,6 +3728,13 @@ int pc_walktoxy (struct map_session_data *sd, int x, int y)
map_foreachinrange(skill_guildaura_sub, &sd->bl,2, BL_PC,
sd->bl.id, sd->status.guild_id, &guildflag);
}
+ //SG_MIRACLE [Komurka]
+ if (sd->sc.data && sd->sc.data[SC_MIRACLE].timer==-1 && ((sd->status.class_==JOB_STAR_GLADIATOR) || (sd->status.class_==JOB_STAR_GLADIATOR2)) && (rand()%10000 < battle_config.sg_miracle_skill_ratio) )
+ {
+ clif_displaymessage(sd->fd,"[Miracle of the Sun, Moon and Stars]");
+ status_change_start(&sd->bl,SC_MIRACLE,100,
+ 1,0,0,0,battle_config.sg_miracle_skill_duration,0);
+ }
return 0;
}
diff --git a/src/map/skill.c b/src/map/skill.c
index d18b87c22..405e5a109 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -7968,36 +7968,37 @@ int skill_check_condition(struct map_session_data *sd,int type)
clif_skill_fail(sd,skill,0,0);
return 0;
}
+ //SHOULD BE OPTIMALIZED [Komurka]
case SG_SUN_WARM:
- if(sd->bl.m == sd->feel_map[0].m)
+ if ((sd->bl.m == sd->feel_map[0].m) || (sd->sc.data[SC_MIRACLE].timer!=-1))
break;
clif_skill_fail(sd,skill,0,0);
return 0;
break;
case SG_MOON_WARM:
- if(sd->bl.m == sd->feel_map[1].m)
+ if ((sd->bl.m == sd->feel_map[1].m) || (sd->sc.data[SC_MIRACLE].timer!=-1))
break;
clif_skill_fail(sd,skill,0,0);
return 0;
break;
case SG_STAR_WARM:
- if(sd->bl.m == sd->feel_map[2].m)
+ if ((sd->bl.m == sd->feel_map[2].m) || (sd->sc.data[SC_MIRACLE].timer!=-1))
break;
clif_skill_fail(sd,skill,0,0);
return 0;
break;
case SG_SUN_COMFORT:
- if(sd->bl.m == sd->feel_map[0].m && (battle_config.allow_skill_without_day || is_day_of_sun()))
+ if ((sd->bl.m == sd->feel_map[0].m && (battle_config.allow_skill_without_day || is_day_of_sun())) || (sd->sc.data[SC_MIRACLE].timer!=-1))
break;
clif_skill_fail(sd,skill,0,0);
return 0;
case SG_MOON_COMFORT:
- if(sd->bl.m == sd->feel_map[1].m && (battle_config.allow_skill_without_day || is_day_of_moon()))
+ if ((sd->bl.m == sd->feel_map[1].m && (battle_config.allow_skill_without_day || is_day_of_moon())) || (sd->sc.data[SC_MIRACLE].timer!=-1))
break;
clif_skill_fail(sd,skill,0,0);
return 0;
case SG_STAR_COMFORT:
- if(sd->bl.m == sd->feel_map[2].m && (battle_config.allow_skill_without_day || is_day_of_star()))
+ if ((sd->bl.m == sd->feel_map[2].m && (battle_config.allow_skill_without_day || is_day_of_star())) || (sd->sc.data[SC_MIRACLE].timer!=-1))
break;
clif_skill_fail(sd,skill,0,0);
return 0;
diff --git a/src/map/status.c b/src/map/status.c
index 1dc45a26f..6c1350a0f 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -302,6 +302,7 @@ void initChangeTables(void) {
StatusIconChangeTable[SC_ASPDPOTION3] = SI_ASPDPOTION;
StatusIconChangeTable[SC_SPEEDUP0] = SI_SPEEDPOTION;
StatusIconChangeTable[SC_SPEEDUP1] = SI_SPEEDPOTION;
+ StatusIconChangeTable[SC_MIRACLE] = SI_SPIRIT;
//Guild skills don't fit due to their range being beyond MAX_SKILL
StatusIconChangeTable[SC_GUILDAURA] = SI_GUILDAURA;
@@ -4366,6 +4367,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
case SC_STEELBODY: //
case SC_SKA:
case SC_TWOHANDQUICKEN: /* 2HQ */
+ case SC_MIRACLE:
calc_flag = 1;
break;
diff --git a/src/map/status.h b/src/map/status.h
index 2ad97bf9b..13989080f 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -229,6 +229,7 @@ enum {
SC_SWOO, // [marquis007]
SC_SKA, // [marquis007]
SC_TKDORI, // [marquis007]
+ SC_MIRACLE, //SG 'hidden' skill [Komurka]
//
SC_MAX, //Automatically updated max, used in for's and at startup to check we are within bounds. [Skotlex]
};