Skip to content

Instantly share code, notes, and snippets.

@cydh
Last active April 13, 2020 05:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save cydh/43f60c7f6e29a931ccd8ed62cff1ff60 to your computer and use it in GitHub Desktop.
Save cydh/43f60c7f6e29a931ccd8ed62cff1ff60 to your computer and use it in GitHub Desktop.
Item bonus to change player's race to race 'r' for rAthena
doc/item_bonus.txt | 1 +
src/map/map.hpp | 1 +
src/map/pc.cpp | 4 ++++
src/map/pc.hpp | 1 +
src/map/script_constants.hpp | 1 +
src/map/status.cpp | 5 +++++
6 files changed, 13 insertions(+)
diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt
index 7ffe172b5..08ef4a571 100644
--- a/doc/item_bonus.txt
+++ b/doc/item_bonus.txt
@@ -260,6 +260,7 @@ Atk/Def
-------
bonus bAtkEle,e; Gives the player's attacks element e
bonus bDefEle,e; Gives the player's defense element e
+bonus bRace,r; Set the player's race to race r
bonus2 bMagicAtkEle,e,x; Increases damage of e element magic by x%
diff --git a/src/map/map.hpp b/src/map/map.hpp
index 5200ff6b4..44073fbb2 100644
--- a/src/map/map.hpp
+++ b/src/map/map.hpp
@@ -429,6 +429,7 @@ enum _sp {
// Mercenaries
SP_MERCFLEE=165, SP_MERCKILLS=189, SP_MERCFAITH=190,
+ SP_RACE,
// original 1000-
SP_ATTACKRANGE=1000, SP_ATKELE,SP_DEFELE, // 1000-1002
diff --git a/src/map/pc.cpp b/src/map/pc.cpp
index ab1040eca..be3d1cdee 100755
--- a/src/map/pc.cpp
+++ b/src/map/pc.cpp
@@ -3217,6 +3217,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
if (sd->state.lr_flag != 2)
sd->special_state.no_mado_fuel = 1;
break;
+ case SP_RACE:
+ PC_BONUS_CHK_RACE(val, SP_RACE);
+ sd->bonus.change_race = (enum e_race)val;
+ break;
default:
if (running_npc_stat_calc_event) {
ShowWarning("pc_bonus: unknown bonus type %d %d in OnPCStatCalcEvent!\n", type, val);
diff --git a/src/map/pc.hpp b/src/map/pc.hpp
index 05e861c64..dfebca1d9 100644
--- a/src/map/pc.hpp
+++ b/src/map/pc.hpp
@@ -497,6 +497,7 @@ struct map_session_data {
int ematk; // matk bonus from equipment
int eatk; // atk bonus from equipment
uint8 absorb_dmg_maxhp; // [Cydh]
+ enum e_race change_race;
short critical_rangeatk;
short weapon_atk_rate, weapon_matk_rate;
} bonus;
diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp
index 5d5066a4e..2c8a2f0e9 100644
--- a/src/map/script_constants.hpp
+++ b/src/map/script_constants.hpp
@@ -731,6 +731,7 @@
export_constant2("bRegenPercentHP", SP_REGEN_PERCENT_HP);
export_constant2("bRegenPercentSP", SP_REGEN_PERCENT_SP);
export_constant2("bSkillDelay",SP_SKILL_DELAY);
+ export_constant2("bRace", SP_RACE);
/* equip indices */
export_constant(EQI_COMPOUND_ON);
diff --git a/src/map/status.cpp b/src/map/status.cpp
index d08be8e81..67546d1c2 100644
--- a/src/map/status.cpp
+++ b/src/map/status.cpp
@@ -3495,6 +3495,7 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
);
memset (&sd->bonus, 0, sizeof(sd->bonus));
+ sd->bonus.change_race = RC_NONE_;
// Autobonus
pc_delautobonus(sd,sd->autobonus,ARRAYLENGTH(sd->autobonus),true);
@@ -4208,6 +4209,10 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
if (sc->data[SC_LAUDARAMUS])
sd->bonus.crit_atk_rate += 5 * sc->data[SC_LAUDARAMUS]->val1;
}
+
+ if (sd->bonus.change_race != RC_NONE_)
+ base_status->race = sd->bonus.change_race;
+
status_cpy(&sd->battle_status, base_status);
// ----- CLIENT-SIDE REFRESH -----
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment