summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2013-01-09 15:21:53 -0800
committerBen Longbons <b.r.longbons@gmail.com>2013-01-17 17:35:36 -0800
commitf909528c7e64ac7180d9a544f12912efd0867a67 (patch)
tree90819c55e866b7e891693d757dc1c730894fafea /src/map
parenta8b4244aea48a5b7118acb2c136adcd50e8b650f (diff)
downloadtmwa-f909528c7e64ac7180d9a544f12912efd0867a67.tar.gz
tmwa-f909528c7e64ac7180d9a544f12912efd0867a67.tar.bz2
tmwa-f909528c7e64ac7180d9a544f12912efd0867a67.tar.xz
tmwa-f909528c7e64ac7180d9a544f12912efd0867a67.zip
Remove all non-NPC skills
Diffstat (limited to 'src/map')
-rw-r--r--src/map/atcommand.cpp551
-rw-r--r--src/map/battle.cpp1438
-rw-r--r--src/map/clif.cpp108
-rw-r--r--src/map/map.hpp1
-rw-r--r--src/map/map.t.hpp12
-rw-r--r--src/map/mob.cpp136
-rw-r--r--src/map/npc.cpp58
-rw-r--r--src/map/pc.cpp563
-rw-r--r--src/map/pc.hpp21
-rw-r--r--src/map/script.cpp11
-rw-r--r--src/map/skill.cpp5529
-rw-r--r--src/map/skill.hpp3
-rw-r--r--src/map/skill.t.hpp834
13 files changed, 176 insertions, 9089 deletions
diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp
index 3216f91..bc19cd8 100644
--- a/src/map/atcommand.cpp
+++ b/src/map/atcommand.cpp
@@ -77,7 +77,6 @@ ATCOMMAND_FUNC(spawn);
ATCOMMAND_FUNC(killmonster);
ATCOMMAND_FUNC(killmonster2);
ATCOMMAND_FUNC(produce);
-ATCOMMAND_FUNC(memo);
ATCOMMAND_FUNC(gat);
ATCOMMAND_FUNC(packet);
ATCOMMAND_FUNC(statuspoint);
@@ -132,8 +131,6 @@ ATCOMMAND_FUNC(char_block); // by Yor
ATCOMMAND_FUNC(char_ban); // by Yor
ATCOMMAND_FUNC(char_unblock); // by Yor
ATCOMMAND_FUNC(char_unban); // by Yor
-ATCOMMAND_FUNC(mount_peco); // by Valaris
-ATCOMMAND_FUNC(char_mount_peco); // by Yor
ATCOMMAND_FUNC(partyspy); // [Syrus22]
ATCOMMAND_FUNC(partyrecall); // by Yor
ATCOMMAND_FUNC(enablenpc);
@@ -142,22 +139,16 @@ ATCOMMAND_FUNC(servertime); // by Yor
ATCOMMAND_FUNC(chardelitem); // by Yor
ATCOMMAND_FUNC(jail); // by Yor
ATCOMMAND_FUNC(unjail); // by Yor
-ATCOMMAND_FUNC(disguise); // [Valaris]
-ATCOMMAND_FUNC(undisguise); // by Yor
ATCOMMAND_FUNC(ignorelist); // by Yor
ATCOMMAND_FUNC(charignorelist); // by Yor
ATCOMMAND_FUNC(inall); // by Yor
ATCOMMAND_FUNC(exall); // by Yor
-ATCOMMAND_FUNC(chardisguise); // Kalaspuff
-ATCOMMAND_FUNC(charundisguise); // Kalaspuff
ATCOMMAND_FUNC(email); // by Yor
ATCOMMAND_FUNC(effect); //by Apple
ATCOMMAND_FUNC(character_item_list); // by Yor
ATCOMMAND_FUNC(character_storage_list); // by Yor
ATCOMMAND_FUNC(character_cart_list); // by Yor
ATCOMMAND_FUNC(addwarp); // by MouseJstr
-ATCOMMAND_FUNC(skillon); // by MouseJstr
-ATCOMMAND_FUNC(skilloff); // by MouseJstr
ATCOMMAND_FUNC(killer); // by MouseJstr
ATCOMMAND_FUNC(npcmove); // by MouseJstr
ATCOMMAND_FUNC(killable); // by MouseJstr
@@ -167,8 +158,6 @@ ATCOMMAND_FUNC(dropall); // by MouseJstr
ATCOMMAND_FUNC(chardropall); // by MouseJstr
ATCOMMAND_FUNC(storeall); // by MouseJstr
ATCOMMAND_FUNC(charstoreall); // by MouseJstr
-ATCOMMAND_FUNC(skillid); // by MouseJstr
-ATCOMMAND_FUNC(useskill); // by MouseJstr
ATCOMMAND_FUNC(summon);
ATCOMMAND_FUNC(rain);
ATCOMMAND_FUNC(snow);
@@ -243,7 +232,6 @@ AtCommandInfo atcommand_info[] = {
{AtCommand_KillMonster, "@killmonster", 60, atcommand_killmonster},
{AtCommand_KillMonster2, "@killmonster2", 40, atcommand_killmonster2},
{AtCommand_Produce, "@produce", 60, atcommand_produce},
- {AtCommand_Memo, "@memo", 40, atcommand_memo},
{AtCommand_GAT, "@gat", 99, atcommand_gat}, // debug function
{AtCommand_Packet, "@packet", 99, atcommand_packet}, // debug function
{AtCommand_StatusPoint, "@stpoint", 60, atcommand_statuspoint},
@@ -311,8 +299,6 @@ AtCommandInfo atcommand_info[] = {
{AtCommand_CharUnBlock, "@unblock", 60, atcommand_char_unblock}, // by Yor
{AtCommand_CharBan, "@ban", 60, atcommand_char_ban}, // by Yor
{AtCommand_CharUnBan, "@unban", 60, atcommand_char_unban}, // by Yor
- {AtCommand_MountPeco, "@mountpeco", 20, atcommand_mount_peco}, // by Valaris
- {AtCommand_CharMountPeco, "@charmountpeco", 50, atcommand_char_mount_peco}, // by Yor
{AtCommand_PartySpy, "@partyspy", 60, atcommand_partyspy}, // [Syrus22]
{AtCommand_PartyRecall, "@partyrecall", 60, atcommand_partyrecall}, // by Yor
{AtCommand_Enablenpc, "@enablenpc", 80, atcommand_enablenpc}, // []
@@ -322,22 +308,16 @@ AtCommandInfo atcommand_info[] = {
{AtCommand_ListNearby, "@listnearby", 40, atcommand_list_nearby}, // by Yor
{AtCommand_Jail, "@jail", 60, atcommand_jail}, // by Yor
{AtCommand_UnJail, "@unjail", 60, atcommand_unjail}, // by Yor
- {AtCommand_Disguise, "@disguise", 20, atcommand_disguise}, // [Valaris]
- {AtCommand_UnDisguise, "@undisguise", 20, atcommand_undisguise}, // by Yor
{AtCommand_IgnoreList, "@ignorelist", 0, atcommand_ignorelist}, // by Yor
{AtCommand_CharIgnoreList, "@charignorelist", 20, atcommand_charignorelist}, // by Yor
{AtCommand_IgnoreList, "@inall", 20, atcommand_inall}, // by Yor
{AtCommand_ExAll, "@exall", 20, atcommand_exall}, // by Yor
- {AtCommand_CharDisguise, "@chardisguise", 60, atcommand_chardisguise}, // Kalaspuff
- {AtCommand_CharUnDisguise, "@charundisguise", 60, atcommand_charundisguise}, // Kalaspuff
{AtCommand_EMail, "@email", 0, atcommand_email}, // by Yor
{AtCommand_Effect, "@effect", 40, atcommand_effect}, // by Apple
{AtCommand_Char_Item_List, "@charitemlist", 40, atcommand_character_item_list}, // by Yor
{AtCommand_Char_Storage_List, "@charstoragelist", 40, atcommand_character_storage_list}, // by Yor
{AtCommand_Char_Cart_List, "@charcartlist", 40, atcommand_character_cart_list}, // by Yor
{AtCommand_AddWarp, "@addwarp", 20, atcommand_addwarp}, // by MouseJstr
- {AtCommand_SkillOn, "@skillon", 20, atcommand_skillon}, // by MouseJstr
- {AtCommand_SkillOff, "@skilloff", 20, atcommand_skilloff}, // by MouseJstr
{AtCommand_Killer, "@killer", 60, atcommand_killer}, // by MouseJstr
{AtCommand_NpcMove, "@npcmove", 20, atcommand_npcmove}, // by MouseJstr
{AtCommand_Killable, "@killable", 40, atcommand_killable}, // by MouseJstr
@@ -347,8 +327,6 @@ AtCommandInfo atcommand_info[] = {
{AtCommand_Chardropall, "@chardropall", 40, atcommand_chardropall}, // MouseJstr
{AtCommand_Storeall, "@storeall", 40, atcommand_storeall}, // MouseJstr
{AtCommand_Charstoreall, "@charstoreall", 40, atcommand_charstoreall}, // MouseJstr
- {AtCommand_Skillid, "@skillid", 40, atcommand_skillid}, // MouseJstr
- {AtCommand_Useskill, "@useskill", 40, atcommand_useskill}, // MouseJstr
{AtCommand_Rain, "@rain", 99, atcommand_rain},
{AtCommand_Snow, "@snow", 99, atcommand_snow},
{AtCommand_Sakura, "@sakura", 99, atcommand_sakura},
@@ -1628,7 +1606,6 @@ int atcommand_option(const int fd, struct map_session_data *sd,
if (sd->status.pc_class == 13 || sd->status.pc_class == 21
|| sd->status.pc_class == 4014 || sd->status.pc_class == 4022)
{
- if (!pc_isriding(sd))
{ // sd have the new value...
if (sd->status.pc_class == 13)
sd->status.pc_class = sd->view_class = 7;
@@ -1640,29 +1617,6 @@ int atcommand_option(const int fd, struct map_session_data *sd,
sd->status.pc_class = sd->view_class = 4015;
}
}
- else
- {
- if (pc_isriding(sd))
- { // sd have the new value...
- if (sd->disguise > 0)
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor])
- sd->status.option &= ~Option::RIDING;
- }
- else
- {
- if (sd->status.pc_class == 7)
- sd->status.pc_class = sd->view_class = 13;
- else if (sd->status.pc_class == 14)
- sd->status.pc_class = sd->view_class = 21;
- else if (sd->status.pc_class == 4008)
- sd->status.pc_class = sd->view_class = 4014;
- else if (sd->status.pc_class == 4015)
- sd->status.pc_class = sd->view_class = 4022;
- else
- sd->status.option &= ~Option::RIDING;
- }
- }
- }
clif_changeoption(&sd->bl);
pc_calcstatus(sd, 0);
@@ -2640,86 +2594,6 @@ int atcommand_produce(const int fd, struct map_session_data *sd,
}
/*==========================================
- * Sub-function to display actual memo points
- *------------------------------------------
- */
-static
-void atcommand_memo_sub(struct map_session_data *sd)
-{
- clif_displaymessage(sd->fd,
- "Your actual memo positions are (except respawn point):");
- for (int i = MIN_PORTAL_MEMO; i <= MAX_PORTAL_MEMO; i++)
- {
- std::string output;
- if (sd->status.memo_point[i].map[0])
- output = STRPRINTF("%d - %s (%d,%d)",
- i,
- sd->status.memo_point[i].map,
- sd->status.memo_point[i].x,
- sd->status.memo_point[i].y);
- else
- output = STRPRINTF("%d - void", i);
- clif_displaymessage(sd->fd, output);
- }
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_memo(const int fd, struct map_session_data *sd,
- const char *, const char *message)
-{
- int position = 0;
-
- if (!message || !*message || sscanf(message, "%d", &position) < 1)
- atcommand_memo_sub(sd);
- else
- {
- if (position >= MIN_PORTAL_MEMO && position <= MAX_PORTAL_MEMO)
- {
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM(sd))
- {
- clif_displaymessage(fd,
- "You are not authorised to memo this map.");
- return -1;
- }
- if (sd->status.memo_point[position].map[0])
- {
- std::string output = STRPRINTF(
- "You replace previous memo position %d - %s (%d,%d).",
- position,
- sd->status.memo_point[position].map,
- sd->status.memo_point[position].x,
- sd->status.memo_point[position].y);
- clif_displaymessage(fd, output);
- }
- memcpy(sd->status.memo_point[position].map, map[sd->bl.m].name,
- 24);
- sd->status.memo_point[position].x = sd->bl.x;
- sd->status.memo_point[position].y = sd->bl.y;
- if (pc_checkskill(sd, AL_WARP) <= (position + 1))
- clif_displaymessage(fd, "Note: you don't have the 'Warp' skill level to use it.");
- atcommand_memo_sub(sd);
- }
- else
- {
- std::string output = STRPRINTF(
- "Please, enter a valid position (usage: @memo <memo_position:%d-%d>).",
- MIN_PORTAL_MEMO, MAX_PORTAL_MEMO);
- clif_displaymessage(fd, output);
- atcommand_memo_sub(sd);
- return -1;
- }
- }
-
- return 0;
-}
-
-/*==========================================
*
*------------------------------------------
*/
@@ -3232,7 +3106,6 @@ int atcommand_character_option(const int fd, struct map_session_data *sd,
if (pl_sd->status.pc_class == 13 || pl_sd->status.pc_class == 21
|| pl_sd->status.pc_class == 4014 || pl_sd->status.pc_class == 4022)
{
- if (!pc_isriding(pl_sd))
{ // pl_sd have the new value...
if (pl_sd->status.pc_class == 13)
pl_sd->status.pc_class = pl_sd->view_class = 7;
@@ -3244,29 +3117,6 @@ int atcommand_character_option(const int fd, struct map_session_data *sd,
pl_sd->status.pc_class = pl_sd->view_class = 4015;
}
}
- else
- {
- if (pc_isriding(pl_sd))
- { // pl_sd have the new value...
- if (pl_sd->disguise > 0)
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor])
- pl_sd->status.option &= ~Option::RIDING;
- }
- else
- {
- if (pl_sd->status.pc_class == 7)
- pl_sd->status.pc_class = pl_sd->view_class = 13;
- else if (pl_sd->status.pc_class == 14)
- pl_sd->status.pc_class = pl_sd->view_class = 21;
- else if (pl_sd->status.pc_class == 4008)
- pl_sd->status.pc_class = pl_sd->view_class = 4014;
- else if (pl_sd->status.pc_class == 4015)
- pl_sd->status.pc_class = pl_sd->view_class = 4022;
- else
- pl_sd->status.option &= ~Option::RIDING;
- }
- }
- }
clif_changeoption(&pl_sd->bl);
pc_calcstatus(pl_sd, 0);
clif_displaymessage(fd, "Character's options changed.");
@@ -5187,130 +5037,6 @@ int atcommand_mapinfo(const int fd, struct map_session_data *sd,
}
/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_mount_peco(const int fd, struct map_session_data *sd,
- const char *, const char *)
-{
- if (sd->disguise > 0)
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, "Cannot mount a Peco while in disguise.");
- return -1;
- }
-
- if (!pc_isriding(sd))
- { // if actually no peco
- if (sd->status.pc_class == 7 || sd->status.pc_class == 14
- || sd->status.pc_class == 4008 || sd->status.pc_class == 4015)
- {
- if (sd->status.pc_class == 7)
- sd->status.pc_class = sd->view_class = 13;
- else if (sd->status.pc_class == 14)
- sd->status.pc_class = sd->view_class = 21;
- else if (sd->status.pc_class == 4008)
- sd->status.pc_class = sd->view_class = 4014;
- else if (sd->status.pc_class == 4015)
- sd->status.pc_class = sd->view_class = 4022;
- pc_setoption(sd, sd->status.option | Option::RIDING);
- clif_displaymessage(fd, "Mounted Peco.");
- }
- else
- {
- clif_displaymessage(fd, "You can not mount a peco with your job.");
- return -1;
- }
- }
- else
- {
- if (sd->status.pc_class == 13)
- sd->status.pc_class = sd->view_class = 7;
- else if (sd->status.pc_class == 21)
- sd->status.pc_class = sd->view_class = 14;
- else if (sd->status.pc_class == 4014)
- sd->status.pc_class = sd->view_class = 4008;
- else if (sd->status.pc_class == 4022)
- sd->status.pc_class = sd->view_class = 4015;
- pc_setoption(sd, sd->status.option & ~Option::RIDING);
- clif_displaymessage(fd, "Unmounted Peco.");
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_char_mount_peco(const int fd, struct map_session_data *,
- const char *, const char *message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
- {
- clif_displaymessage(fd,
- "Please, enter a player name (usage: @charmountpeco <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL)
- {
- if (pl_sd->disguise > 0)
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, "This player cannot mount a Peco while in disguise.");
- return -1;
- }
-
- if (!pc_isriding(pl_sd))
- { // if actually no peco
- if (pl_sd->status.pc_class == 7 || pl_sd->status.pc_class == 14
- || pl_sd->status.pc_class == 4008 || pl_sd->status.pc_class == 4015)
- {
- if (pl_sd->status.pc_class == 7)
- pl_sd->status.pc_class = pl_sd->view_class = 13;
- else if (pl_sd->status.pc_class == 14)
- pl_sd->status.pc_class = pl_sd->view_class = 21;
- else if (pl_sd->status.pc_class == 4008)
- pl_sd->status.pc_class = pl_sd->view_class = 4014;
- else if (pl_sd->status.pc_class == 4015)
- pl_sd->status.pc_class = pl_sd->view_class = 4022;
- pc_setoption(pl_sd, pl_sd->status.option | Option::RIDING);
- clif_displaymessage(fd, "Now, this player mounts a peco.");
- }
- else
- {
- clif_displaymessage(fd, "This player can not mount a peco with his/her job.");
- return -1;
- }
- }
- else
- {
- if (pl_sd->status.pc_class == 13)
- pl_sd->status.pc_class = pl_sd->view_class = 7;
- else if (pl_sd->status.pc_class == 21)
- pl_sd->status.pc_class = pl_sd->view_class = 14;
- else if (pl_sd->status.pc_class == 4014)
- pl_sd->status.pc_class = pl_sd->view_class = 4008;
- else if (pl_sd->status.pc_class == 4022)
- pl_sd->status.pc_class = pl_sd->view_class = 4015;
- pc_setoption(pl_sd, pl_sd->status.option & ~Option::RIDING);
- clif_displaymessage(fd, "Now, this player has not more peco.");
- }
- }
- else
- {
- clif_displaymessage(fd, "Character not found.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
*Spy Commands by Syrus22
*------------------------------------------
*/
@@ -5730,72 +5456,6 @@ int atcommand_unjail(const int fd, struct map_session_data *sd,
}
/*==========================================
- * @disguise <mob_id> by [Valaris] (simplified by [Yor])
- *------------------------------------------
- */
-int atcommand_disguise(const int fd, struct map_session_data *sd,
- const char *, const char *message)
-{
- int mob_id;
-
- if (!message || !*message)
- {
- clif_displaymessage(fd,
- "Please, enter a Monster/NPC name/id (usage: @disguise <monster_name_or_monster_ID>).");
- return -1;
- }
-
- if ((mob_id = mobdb_searchname(message)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(message);
-
- if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
- (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
- (mob_id >= 813 && mob_id <= 834) || // NPC
- (mob_id > 1000 && mob_id < 1521))
- { // monsters
- if (pc_isriding(sd))
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, "Cannot wear disguise while riding a Peco.");
- return -1;
- }
- sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
- sd->disguise = mob_id;
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- clif_displaymessage(fd, "Disguise applied.");
- }
- else
- {
- clif_displaymessage(fd, "Monster/NPC name/id hasn't been found.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @undisguise by [Yor]
- *------------------------------------------
- */
-int atcommand_undisguise(const int fd, struct map_session_data *sd,
- const char *, const char *)
-{
- if (sd->disguise)
- {
- clif_clearchar(&sd->bl, 9);
- sd->disguise = 0;
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- clif_displaymessage(fd, "Undisguise applied.");
- }
- else
- {
- clif_displaymessage(fd, "You're not disguised.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
* @broadcast by [Valaris]
*------------------------------------------
*/
@@ -6081,125 +5741,6 @@ int atcommand_exall(const int fd, struct map_session_data *sd,
}
/*==========================================
- * @chardisguise <mob_id> <character> by Kalaspuff (based off Valaris' and Yor's work)
- *------------------------------------------
- */
-int atcommand_chardisguise(const int fd, struct map_session_data *sd,
- const char *, const char *message)
-{
- int mob_id;
- char character[100];
- char mob_name[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
- memset(mob_name, '\0', sizeof(mob_name));
-
- if (!message || !*message
- || sscanf(message, "%s %99[^\n]", mob_name, character) < 2)
- {
- clif_displaymessage(fd,
- "Please, enter a Monster/NPC name/id and a player name (usage: @chardisguise <monster_name_or_monster_ID> <char name>).");
- return -1;
- }
-
- if ((mob_id = mobdb_searchname(mob_name)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(mob_name);
-
- if ((pl_sd = map_nick2sd(character)) != NULL)
- {
- if (pc_isGM(sd) >= pc_isGM(pl_sd))
- { // you can disguise only lower or same level
- if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
- (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
- (mob_id >= 813 && mob_id <= 834) || // NPC
- (mob_id > 1000 && mob_id < 1521))
- { // monsters
- if (pc_isriding(pl_sd))
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, "Character cannot wear disguise while riding a Peco.");
- return -1;
- }
- pl_sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
- pl_sd->disguise = mob_id;
- pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y,
- 3);
- clif_displaymessage(fd, "Character's disguise applied.");
- }
- else
- {
- clif_displaymessage(fd, "Monster/NPC name/id hasn't been found.");
- return -1;
- }
- }
- else
- {
- clif_displaymessage(fd, "Your GM level don't authorise you to do this action on this player.");
- return -1;
- }
- }
- else
- {
- clif_displaymessage(fd, "Character not found.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @charundisguise <character> by Kalaspuff (based off Yor's work)
- *------------------------------------------
- */
-int atcommand_charundisguise(const int fd, struct map_session_data *sd,
- const char *, const char *message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
- {
- clif_displaymessage(fd,
- "Please, enter a player name (usage: @charundisguise <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL)
- {
- if (pc_isGM(sd) >= pc_isGM(pl_sd))
- { // you can undisguise only lower or same level
- if (pl_sd->disguise)
- {
- clif_clearchar(&pl_sd->bl, 9);
- pl_sd->disguise = 0;
- pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y,
- 3);
- clif_displaymessage(fd, "Character's undisguise applied.");
- }
- else
- {
- clif_displaymessage(fd, "Character is not disguised.");
- return -1;
- }
- }
- else
- {
- clif_displaymessage(fd, "Your GM level don't authorise you to do this action on this player.");
- return -1;
- }
- }
- else
- {
- clif_displaymessage(fd, "Character not found.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
* @email <actual@email> <new@email> by [Yor]
*------------------------------------------
*/
@@ -6765,32 +6306,6 @@ int atcommand_charkillable(const int fd, struct map_session_data *,
}
/*==========================================
- * @skillon by MouseJstr
- * turn skills on for the map
- *------------------------------------------
- */
-int atcommand_skillon(const int fd, struct map_session_data *sd,
- const char *, const char *)
-{
- map[sd->bl.m].flag.noskill = 0;
- clif_displaymessage(fd, "Map skills are on.");
- return 0;
-}
-
-/*==========================================
- * @skilloff by MouseJstr
- * Turn skills off on the map
- *------------------------------------------
- */
-int atcommand_skilloff(const int fd, struct map_session_data *sd,
- const char *, const char *)
-{
- map[sd->bl.m].flag.noskill = 1;
- clif_displaymessage(fd, "Map skills are off.");
- return 0;
-}
-
-/*==========================================
* @npcmove by MouseJstr
*
* move a npc
@@ -7029,72 +6544,6 @@ int atcommand_charstoreall(const int fd, struct map_session_data *sd,
}
/*==========================================
- * @skillid by [MouseJstr]
- *
- * lookup a skill by name
- *------------------------------------------
- */
-int atcommand_skillid(const int fd, struct map_session_data *,
- const char *, const char *message)
-{
- int skillen = 0, idx = 0;
- if (!message || !*message)
- return -1;
- skillen = strlen(message);
- while (skill_names[idx].id != SkillID::ZERO)
- {
- if ((strncasecmp(skill_names[idx].name, message, skillen) == 0) ||
- (strncasecmp(skill_names[idx].desc, message, skillen) == 0))
- {
- std::string output = STRPRINTF("skill %d: %s",
- skill_names[idx].id, skill_names[idx].desc);
- clif_displaymessage(fd, output);
- }
- idx++;
- }
- return 0;
-}
-
-/*==========================================
- * @useskill by [MouseJstr]
- *
- * A way of using skills without having to find them in the skills menu
- *------------------------------------------
- */
-int atcommand_useskill(const int fd, struct map_session_data *sd,
- const char *, const char *message)
-{
- struct map_session_data *pl_sd = NULL;
- int skillnum_;
- int skilllv;
- int inf;
- char target[255];
-
- if (!message || !*message)
- return -1;
- if (sscanf(message, "%d %d %s", &skillnum_, &skilllv, target) != 3)
- {
- clif_displaymessage(fd,
- "Usage: @useskill <skillnum> <skillv> <target>");
- return -1;
- }
- if ((pl_sd = map_nick2sd(target)) == NULL)
- {
- return -1;
- }
-
- SkillID skillnum = SkillID(skillnum_);
- inf = skill_get_inf(skillnum);
-
- if ((inf == 2) || (inf == 1))
- skill_use_pos(sd, pl_sd->bl.x, pl_sd->bl.y, skillnum, skilllv);
- else
- skill_use_id(sd, pl_sd->bl.id, skillnum, skilllv);
-
- return 0;
-}
-
-/*==========================================
* It is made to rain.
*------------------------------------------
*/
diff --git a/src/map/battle.cpp b/src/map/battle.cpp
index 93f6fe6..39aa62d 100644
--- a/src/map/battle.cpp
+++ b/src/map/battle.cpp
@@ -24,21 +24,6 @@ int attr_fix_table[4][10][10];
struct Battle_Config battle_config;
/*==========================================
- * 二点間の距離を返す
- * 戻りは整数で0以上
- *------------------------------------------
- */
-static
-int distance(int x0, int y0, int x1, int y1)
-{
- int dx, dy;
-
- dx = abs(x0 - x1);
- dy = abs(y0 - y1);
- return dx > dy ? dx : dy;
-}
-
-/*==========================================
* 自分をロックしている対象の数を返す(汎用)
* 戻りは整数で0以上
*------------------------------------------
@@ -1703,8 +1688,7 @@ int battle_calc_damage(struct block_list *src, struct block_list *bl,
else
damage = -sc->val2;
}
- if ((--sc->val3) <= 0 || (sc->val2 <= 0)
- || skill_num == AL_HOLYLIGHT)
+ if ((--sc->val3) <= 0 || (sc->val2 <= 0))
skill_status_change_end(bl, SC_KYRIE, -1);
}
@@ -1777,169 +1761,11 @@ int battle_calc_damage(struct block_list *src, struct block_list *bl,
return damage;
}
-/*==========================================
- * 修練ダメージ
- *------------------------------------------
- */
-static
-int battle_addmastery(struct map_session_data *sd, struct block_list *target,
- int dmg, int type)
-{
- int damage, skill;
- int race = battle_get_race(target);
- int weapon;
- damage = 0;
-
- nullpo_ret(sd);
-
- // デーモンベイン(+3 〜 +30) vs 不死 or 悪魔 (死人は含めない?)
- if ((skill = pc_checkskill(sd, AL_DEMONBANE)) > 0
- && (battle_check_undead(race, battle_get_elem_type(target))
- || race == 6))
- damage += (skill * 3);
-
- // ビーストベイン(+4 〜 +40) vs 動物 or 昆虫
- if ((skill = pc_checkskill(sd, HT_BEASTBANE)) > 0
- && (race == 2 || race == 4))
- damage += (skill * 4);
-
- if (type == 0)
- weapon = sd->weapontype1;
- else
- weapon = sd->weapontype2;
- switch (weapon)
- {
- case 0x01: // 短剣 (Updated By AppleGirl)
- case 0x02: // 1HS
- {
- // 剣修練(+4 〜 +40) 片手剣 短剣含む
- if ((skill = pc_checkskill(sd, SM_SWORD)) > 0)
- {
- damage += (skill * 4);
- }
- break;
- }
- case 0x03: // 2HS
- {
- // 両手剣修練(+4 〜 +40) 両手剣
- if ((skill = pc_checkskill(sd, SM_TWOHAND)) > 0)
- {
- damage += (skill * 4);
- }
- break;
- }
- case 0x04: // 1HL
- {
- // 槍修練(+4 〜 +40,+5 〜 +50) 槍
- if ((skill = pc_checkskill(sd, KN_SPEARMASTERY)) > 0)
- {
- if (!pc_isriding(sd))
- damage += (skill * 4); // ペコに乗ってない
- else
- damage += (skill * 5); // ペコに乗ってる
- }
- break;
- }
- case 0x05: // 2HL
- {
- // 槍修練(+4 〜 +40,+5 〜 +50) 槍
- if ((skill = pc_checkskill(sd, KN_SPEARMASTERY)) > 0)
- {
- if (!pc_isriding(sd))
- damage += (skill * 4); // ペコに乗ってない
- else
- damage += (skill * 5); // ペコに乗ってる
- }
- break;
- }
- case 0x06: // 片手斧
- {
- if ((skill = pc_checkskill(sd, AM_AXEMASTERY)) > 0)
- {
- damage += (skill * 3);
- }
- break;
- }
- case 0x07: // Axe by Tato
- {
- if ((skill = pc_checkskill(sd, AM_AXEMASTERY)) > 0)
- {
- damage += (skill * 3);
- }
- break;
- }
- case 0x08: // メイス
- {
- // メイス修練(+3 〜 +30) メイス
- if ((skill = pc_checkskill(sd, PR_MACEMASTERY)) > 0)
- {
- damage += (skill * 3);
- }
- break;
- }
- case 0x09: // なし?
- break;
- case 0x0a: // 杖
- break;
- case 0x0b: // 弓
- break;
- case 0x00: // 素手
- case 0x0c: // Knuckles
- {
- // 鉄拳(+3 〜 +30) 素手,ナックル
- if ((skill = pc_checkskill(sd, MO_IRONHAND)) > 0)
- {
- damage += (skill * 3);
- }
- break;
- }
- case 0x0d: // Musical Instrument
- {
- // 楽器の練習(+3 〜 +30) 楽器
- if ((skill = pc_checkskill(sd, BA_MUSICALLESSON)) > 0)
- {
- damage += (skill * 3);
- }
- break;
- }
- case 0x0e: // Dance Mastery
- {
- // Dance Lesson Skill Effect(+3 damage for every lvl = +30) 鞭
- if ((skill = pc_checkskill(sd, DC_DANCINGLESSON)) > 0)
- {
- damage += (skill * 3);
- }
- break;
- }
- case 0x0f: // Book
- {
- // Advance Book Skill Effect(+3 damage for every lvl = +30) {
- if ((skill = pc_checkskill(sd, SA_ADVANCEDBOOK)) > 0)
- {
- damage += (skill * 3);
- }
- break;
- }
- case 0x10: // Katars
- {
- // カタール修練(+3 〜 +30) カタール
- if ((skill = pc_checkskill(sd, AS_KATAR)) > 0)
- {
- //ソニックブロー時は別処理(1撃に付き1/8適応)
- damage += (skill * 3);
- }
- break;
- }
- }
- damage = dmg + damage;
- return (damage);
-}
-
static
struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
struct block_list *target,
SkillID skill_num,
- int skill_lv, int wflag)
+ int skill_lv, int)
{
struct map_session_data *tsd = NULL;
struct mob_data *md = (struct mob_data *) src, *tmd = NULL;
@@ -1952,7 +1778,7 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
int damage, damage2 = 0, type, div_, blewcount =
skill_get_blewcount(skill_num, skill_lv);
BF flag;
- int skill, ac_flag = 0;
+ int ac_flag = 0;
ATK dmg_lv = ATK::ZERO;
int t_mode = 0, t_size = 1, s_race = 0, s_ele = 0;
eptr<struct status_change, StatusChange> sc_data, t_sc_data;
@@ -1978,39 +1804,6 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
t_mode = battle_get_mode(target);
t_sc_data = battle_get_sc_data(target);
- if ((skill_num == SkillID::ZERO
- || (target->type == BL_PC && battle_config.pc_auto_counter_type & 2)
- || (target->type == BL_MOB
- && battle_config.monster_auto_counter_type & 2))
- && skill_lv >= 0)
- {
- if (skill_num != CR_GRANDCROSS && t_sc_data
- && t_sc_data[SC_AUTOCOUNTER].timer != -1)
- {
- int dir = map_calc_dir(src, target->x, target->y), t_dir =
- battle_get_dir(target);
- int dist = distance(src->x, src->y, target->x, target->y);
- if (dist <= 0 || map_check_dir(dir, t_dir))
- {
- memset(&wd, 0, sizeof(wd));
- t_sc_data[SC_AUTOCOUNTER].val3 = 0;
- t_sc_data[SC_AUTOCOUNTER].val4 = 1;
- if (sc_data && sc_data[SC_AUTOCOUNTER].timer == -1)
- {
- int range = battle_get_range(target);
- if ((target->type == BL_PC
- && ((struct map_session_data *) target)->
- status.weapon != 11 && dist <= range + 1)
- || (target->type == BL_MOB && range <= 3
- && dist <= range + 1))
- t_sc_data[SC_AUTOCOUNTER].val3 = src->id;
- }
- return wd;
- }
- else
- ac_flag = 1;
- }
- }
flag = BF_SHORT | BF_WEAPON | BF_NORMAL; // 攻撃の種類の設定
// 回避率計算、回避判定は後で
@@ -2049,12 +1842,6 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
damage = battle_get_baseatk(src);
else
damage = 0;
- if (skill_num == HW_MAGICCRASHER)
- { /* マジッククラッシャーはMATKで殴る */
- atkmin = battle_get_matk1(src);
- atkmax = battle_get_matk2(src);
- }
- else
{
atkmin = battle_get_atk(src);
atkmax = battle_get_atk2(src);
@@ -2084,18 +1871,10 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
if (ac_flag)
cri = 1000;
- if (skill_num == KN_AUTOCOUNTER)
- {
- if (!(battle_config.monster_auto_counter_type & 1))
- cri = 1000;
- else
- cri <<= 1;
- }
-
if (tsd && tsd->critical_def)
cri = cri * (100 - tsd->critical_def) / 100;
- if ((skill_num == SkillID::ZERO || skill_num == KN_AUTOCOUNTER)
+ if ((skill_num == SkillID::ZERO)
&& skill_lv >= 0 && battle_config.enemy_critical
&& (MRAND(1000)) < cri)
// 判定(スキルの場合は無視)
@@ -2138,82 +1917,6 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
flag = (flag & ~BF_SKILLMASK) | BF_SKILL;
switch (skill_num)
{
- case SM_BASH: // バッシュ
- damage = damage * (100 + 30 * skill_lv) / 100;
- hitrate = (hitrate * (100 + 5 * skill_lv)) / 100;
- break;
- case SM_MAGNUM: // マグナムブレイク
- damage =
- damage * (5 * skill_lv + (wflag) ? 65 : 115) / 100;
- break;
- case MC_MAMMONITE: // メマーナイト
- damage = damage * (100 + 50 * skill_lv) / 100;
- break;
- case AC_DOUBLE: // ダブルストレイフィング
- damage = damage * (180 + 20 * skill_lv) / 100;
- div_ = 2;
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- break;
- case AC_SHOWER: // アローシャワー
- damage = damage * (75 + 5 * skill_lv) / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- break;
- case AC_CHARGEARROW: // チャージアロー
- damage = damage * 150 / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- break;
- case KN_PIERCE: // ピアース
- damage = damage * (100 + 10 * skill_lv) / 100;
- hitrate = hitrate * (100 + 5 * skill_lv) / 100;
- div_ = t_size + 1;
- damage *= div_;
- break;
- case KN_SPEARSTAB: // スピアスタブ
- damage = damage * (100 + 15 * skill_lv) / 100;
- break;
- case KN_SPEARBOOMERANG: // スピアブーメラン
- damage = damage * (100 + 50 * skill_lv) / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- break;
- case KN_BRANDISHSPEAR: // ブランディッシュスピア
- damage = damage * (100 + 20 * skill_lv) / 100;
- if (skill_lv > 3 && wflag == 1)
- damage2 += damage / 2;
- if (skill_lv > 6 && wflag == 1)
- damage2 += damage / 4;
- if (skill_lv > 9 && wflag == 1)
- damage2 += damage / 8;
- if (skill_lv > 6 && wflag == 2)
- damage2 += damage / 2;
- if (skill_lv > 9 && wflag == 2)
- damage2 += damage / 4;
- if (skill_lv > 9 && wflag == 3)
- damage2 += damage / 2;
- damage += damage2;
- blewcount = 0;
- break;
- case KN_BOWLINGBASH: // ボウリングバッシュ
- damage = damage * (100 + 50 * skill_lv) / 100;
- blewcount = 0;
- break;
- case KN_AUTOCOUNTER:
- if (battle_config.monster_auto_counter_type & 1)
- hitrate += 20;
- else
- hitrate = 1000000;
- flag = (flag & ~BF_SKILLMASK) | BF_NORMAL;
- break;
- case AS_SONICBLOW: // ソニックブロウ
- damage = damage * (300 + 50 * skill_lv) / 100;
- div_ = 8;
- break;
- case TF_SPRINKLESAND: // 砂まき
- damage = damage * 125 / 100;
- break;
- case MC_CARTREVOLUTION: // カートレボリューション
- damage = (damage * 150) / 100;
- break;
- // 以下MOB
case NPC_COMBOATTACK: // 多段攻撃
div_ = skill_get_num(skill_num, skill_lv);
damage *= div_;
@@ -2241,111 +1944,6 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
case NPC_PIERCINGATT:
flag = (flag & ~BF_RANGEMASK) | BF_SHORT;
break;
- case RG_BACKSTAP: // バックスタブ
- damage = damage * (300 + 40 * skill_lv) / 100;
- hitrate = 1000000;
- break;
- case RG_RAID: // サプライズアタック
- damage = damage * (100 + 40 * skill_lv) / 100;
- break;
- case RG_INTIMIDATE: // インティミデイト
- damage = damage * (100 + 30 * skill_lv) / 100;
- break;
- case CR_SHIELDCHARGE: // シールドチャージ
- damage = damage * (100 + 20 * skill_lv) / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_SHORT;
- s_ele = 0;
- break;
- case CR_SHIELDBOOMERANG: // シールドブーメラン
- damage = damage * (100 + 30 * skill_lv) / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- s_ele = 0;
- break;
- case CR_HOLYCROSS: // ホーリークロス
- damage = damage * (100 + 35 * skill_lv) / 100;
- div_ = 2;
- break;
- case CR_GRANDCROSS:
- hitrate = 1000000;
- break;
- case AM_DEMONSTRATION: // デモンストレーション
- damage = damage * (100 + 20 * skill_lv) / 100;
- damage2 = damage2 * (100 + 20 * skill_lv) / 100;
- break;
- case AM_ACIDTERROR: // アシッドテラー
- damage = damage * (100 + 40 * skill_lv) / 100;
- damage2 = damage2 * (100 + 40 * skill_lv) / 100;
- break;
- case MO_FINGEROFFENSIVE: //指弾
- damage = damage * (100 + 50 * skill_lv) / 100;
- div_ = 1;
- break;
- case MO_INVESTIGATE: // 発 勁
- if (def1 < 1000000)
- damage =
- damage * (100 + 75 * skill_lv) / 100 * (def1 +
- def2) /
- 100;
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_EXTREMITYFIST: // 阿修羅覇鳳拳
- damage = damage * 8 + 250 + (skill_lv * 150);
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_CHAINCOMBO: // 連打掌
- damage = damage * (150 + 50 * skill_lv) / 100;
- div_ = 4;
- break;
- case BA_MUSICALSTRIKE: // ミュージカルストライク
- damage = damage * (100 + 50 * skill_lv) / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- break;
- case DC_THROWARROW: // 矢撃ち
- damage = damage * (100 + 50 * skill_lv) / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- break;
- case MO_COMBOFINISH: // 猛龍拳
- damage = damage * (240 + 60 * skill_lv) / 100;
- break;
- case CH_TIGERFIST: // 伏虎拳
- damage = damage * (100 + 20 * skill_lv) / 100;
- break;
- case CH_CHAINCRUSH: // 連柱崩撃
- damage = damage * (100 + 20 * skill_lv) / 100;
- div_ = skill_get_num(skill_num, skill_lv);
- break;
- case CH_PALMSTRIKE: // 猛虎硬派山
- damage = damage * (50 + 100 * skill_lv) / 100;
- break;
- case LK_SPIRALPIERCE: /* スパイラルピアース */
- damage = damage * (100 + 50 * skill_lv) / 100; //増加量が分からないので適当に
- div_ = 5;
- if (tsd)
- tsd->canmove_tick = gettick() + 1000;
- else if (tmd)
- tmd->canmove_tick = gettick() + 1000;
- break;
- case LK_HEADCRUSH: /* ヘッドクラッシュ */
- damage = damage * (100 + 20 * skill_lv) / 100;
- break;
- case LK_JOINTBEAT: /* ジョイントビート */
- damage = damage * (50 + 10 * skill_lv) / 100;
- break;
- case ASC_METEORASSAULT: /* メテオアサルト */
- damage = damage * (40 + 40 * skill_lv) / 100;
- break;
- case SN_SHARPSHOOTING: /* シャープシューティング */
- damage += damage * (30 * skill_lv) / 100;
- break;
- case CG_ARROWVULCAN: /* アローバルカン */
- damage = damage * (160 + 40 * skill_lv) / 100;
- div_ = 9;
- break;
- case AS_SPLASHER: /* ベナムスプラッシャー */
- damage = damage * (200 + 20 * skill_lv) / 100;
- break;
}
}
@@ -2353,8 +1951,7 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
{
// 対 象の防御力によるダメージの減少
// ディバインプロテクション(ここでいいのかな?)
- if (skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST
- && skill_num != KN_AUTOCOUNTER && def1 < 1000000)
+ if (def1 < 1000000)
{ //DEF, VIT無視
int t_def;
target_count =
@@ -2412,10 +2009,6 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
}
}
t_def = def2 * 8 / 10;
- if (battle_check_undead(s_race, battle_get_elem_type(src))
- || s_race == 6)
- if (tsd && (skill = pc_checkskill(tsd, AL_DP)) > 0)
- t_def += skill * 3;
vitbonusmax = (t_vit / 20) * (t_vit / 20) - 1;
if (battle_config.monster_defense_type)
@@ -2509,20 +2102,6 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
if (sc_data && sc_data[SC_AURABLADE].timer != -1) /* オーラブレード 必中 */
damage += sc_data[SC_AURABLADE].val1 * 10;
- if (skill_num == PA_PRESSURE) /* プレッシャー 必中? */
- damage = 700 + 100 * skill_lv;
-
- // インベナム修正
- if (skill_num == TF_POISON)
- {
- damage =
- battle_attr_fix(damage + 15 * skill_lv, s_ele,
- battle_get_element(target));
- }
- if (skill_num == MC_CARTREVOLUTION)
- {
- damage = battle_attr_fix(damage, 0, battle_get_element(target));
- }
// 完全回避の判定
if (skill_num == SkillID::ZERO && skill_lv >= 0 && tsd != NULL
@@ -2551,18 +2130,14 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src,
if (tsd && tsd->special_state.no_weapon_damage)
damage = 0;
- if (skill_num != CR_GRANDCROSS)
- damage =
- battle_calc_damage(src, target, damage, div_, skill_num,
- skill_lv, flag);
+ damage = battle_calc_damage(src, target, damage, div_,
+ skill_num, skill_lv, flag);
wd.damage = damage;
wd.damage2 = 0;
wd.type = type;
wd.div_ = div_;
wd.amotion = battle_get_amotion(src);
- if (skill_num == KN_AUTOCOUNTER)
- wd.amotion >>= 1;
wd.dmotion = battle_get_dmotion(target);
wd.blewcount = blewcount;
wd.flag = flag;
@@ -2594,7 +2169,7 @@ static
struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
struct block_list *target,
SkillID skill_num,
- int skill_lv, int wflag)
+ int skill_lv, int)
{
struct map_session_data *sd = (struct map_session_data *) src, *tsd =
NULL;
@@ -2605,7 +2180,7 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
int def2 = battle_get_def2(target);
int t_vit = battle_get_vit(target);
struct Damage wd;
- int damage, damage2, damage4 = 0, type, div_, blewcount =
+ int damage, damage2, type, div_, blewcount =
skill_get_blewcount(skill_num, skill_lv);
BF flag;
int skill;
@@ -2614,7 +2189,8 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
eptr<struct status_change, StatusChange> sc_data, t_sc_data;
int atkmax_ = 0, atkmin_ = 0, s_ele_; //二刀流用
int watk, watk_, cardfix, t_ele;
- int da = 0, t_class, ac_flag = 0;
+ bool da = false;
+ int t_class, ac_flag = 0;
int idef_flag = 0, idef_flag_ = 0;
int target_distance;
@@ -2632,8 +2208,7 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
s_ele_ = battle_get_attack_element2(src); //左手属性
sc_data = battle_get_sc_data(src); //ステータス異常
- if (skill_num != CR_GRANDCROSS) //グランドクロスでないなら
- sd->state.attack_type = BF_WEAPON; //攻撃タイプは武器攻撃
+ sd->state.attack_type = BF_WEAPON; //攻撃タイプは武器攻撃
// ターゲット
if (target->type == BL_PC) //対象がPCなら
@@ -2646,39 +2221,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
t_mode = battle_get_mode(target); //対象のMode
t_sc_data = battle_get_sc_data(target); //対象のステータス異常
-//オートカウンター処理ここから
- if ((skill_num == SkillID::ZERO
- || (target->type == BL_PC && battle_config.pc_auto_counter_type & 2)
- || (target->type == BL_MOB
- && battle_config.monster_auto_counter_type & 2))
- && skill_lv >= 0)
- {
- if (skill_num != CR_GRANDCROSS && t_sc_data
- && t_sc_data[SC_AUTOCOUNTER].timer != -1)
- { //グランドクロスでなく、対象がオートカウンター状態の場合
- int dir = map_calc_dir(src, target->x, target->y), t_dir =
- battle_get_dir(target);
- int dist = distance(src->x, src->y, target->x, target->y);
- if (dist <= 0 || map_check_dir(dir, t_dir))
- { //対象との距離が0以下、または対象の正面?
- memset(&wd, 0, sizeof(wd));
- t_sc_data[SC_AUTOCOUNTER].val3 = 0;
- t_sc_data[SC_AUTOCOUNTER].val4 = 1;
- if (sc_data && sc_data[SC_AUTOCOUNTER].timer == -1)
- { //自分がオートカウンター状態
- int range = battle_get_range(target);
- if ((target->type == BL_PC && ((struct map_session_data *) target)->status.weapon != 11 && dist <= range + 1) || //対象がPCで武器が弓矢でなく射程内
- (target->type == BL_MOB && range <= 3 && dist <= range + 1)) //または対象がMobで射程が3以下で射程内
- t_sc_data[SC_AUTOCOUNTER].val3 = src->id;
- }
- return wd; //ダメージ構造体を返して終了
- }
- else
- ac_flag = 1;
- }
- }
-//オートカウンター処理ここまで
-
flag = BF_SHORT | BF_WEAPON | BF_NORMAL; // 攻撃の種類の設定
// 回避率計算、回避判定は後で
@@ -2726,11 +2268,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
type = 0; // normal
div_ = 1; // single attack
- if (skill_num == HW_MAGICCRASHER)
- { /* マジッククラッシャーはMATKで殴る */
- damage = damage2 = battle_get_matk1(src); //damega,damega2初登場、base_atkの取得
- }
- else
{
damage = damage2 = battle_get_baseatk(&sd->bl); //damega,damega2初登場、base_atkの取得
}
@@ -2770,10 +2307,7 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
// サイズ修正
// ペコ騎乗していて、槍で攻撃した場合は中型のサイズ修正を100にする
// ウェポンパーフェクション,ドレイクC
- if (((sd->special_state.no_sizefix)
- || (pc_isriding(sd)
- && (sd->status.weapon == 4 || sd->status.weapon == 5)
- && t_size == 1) || skill_num == MO_EXTREMITYFIST))
+ if (sd->special_state.no_sizefix)
{ //ペコ騎乗していて、槍で中型を攻撃
atkmax = watk;
atkmax_ = watk_;
@@ -2803,24 +2337,8 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
atkmin_ = atkmax_;
}
- //ダブルアタック判定
- if (sd->weapontype1 == 0x01)
- {
- if (skill_num == SkillID::ZERO && skill_lv >= 0
- && (skill = pc_checkskill(sd, TF_DOUBLE)) > 0)
- da = (MRAND(100) < (skill * 5)) ? 1 : 0;
- }
-
- //三段掌
- if (skill_num == SkillID::ZERO && skill_lv >= 0
- && (skill = pc_checkskill(sd, MO_TRIPLEATTACK)) > 0
- && sd->status.weapon <= 16 && !sd->state.arrow_atk)
- {
- da = (MRAND(100) < (30 - skill)) ? 2 : 0;
- }
-
- if (sd->double_rate > 0 && da == 0 && skill_num == SkillID::ZERO && skill_lv >= 0)
- da = (MRAND(100) < sd->double_rate) ? 1 : 0;
+ if (sd->double_rate > 0 && skill_num == SkillID::ZERO && skill_lv >= 0)
+ da = bool(MRAND(100) < sd->double_rate);
// 過剰精錬ボーナス
if (sd->overrefine > 0)
@@ -2828,7 +2346,7 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
if (sd->overrefine_ > 0)
damage2 += MPRAND(1, sd->overrefine_);
- if (da == 0)
+ if (!da)
{ //ダブルアタックが発動していない
// クリティカル計算
cri = battle_get_critical(src);
@@ -2843,23 +2361,12 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
cri <<= 1;
if (ac_flag)
cri = 1000;
-
- if (skill_num == KN_AUTOCOUNTER)
- {
- if (!(battle_config.pc_auto_counter_type & 1))
- cri = 1000;
- else
- cri <<= 1;
- }
-
- if (skill_num == SN_SHARPSHOOTING && MRAND(100) < 50)
- cri = 1000;
}
if (tsd && tsd->critical_def)
cri = cri * (100 - tsd->critical_def) / 100;
- if (da == 0 && (skill_num == SkillID::ZERO || skill_num == KN_AUTOCOUNTER || skill_num == SN_SHARPSHOOTING) && skill_lv >= 0 && //ダブルアタックが発動していない
+ if (!da && skill_num == SkillID::ZERO && skill_lv >= 0 && //ダブルアタックが発動していない
(MRAND(1000)) < cri) // 判定(スキルの場合は無視)
{
damage += atkmax;
@@ -2872,37 +2379,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
if (sd->state.arrow_atk)
damage += sd->arrow_atk;
type = 0x0a;
-
-/* if (def1 < 1000000) {
- if (sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if (sd->def_ratio_atk_ele_ & (1<<t_ele) || sd->def_ratio_atk_race_ & (1<<t_race)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- if (t_mode & 0x20) {
- if (!idef_flag && sd->def_ratio_atk_race & (1<<10)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if (!idef_flag_ && sd->def_ratio_atk_race_ & (1<<10)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- else {
- if (!idef_flag && sd->def_ratio_atk_race & (1<<11)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if (!idef_flag_ && sd->def_ratio_atk_race_ & (1<<11)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- }*/
}
else
{
@@ -2929,7 +2405,7 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
hitrate += sd->arrow_hit;
}
- if (skill_num != MO_INVESTIGATE && def1 < 1000000)
+ if (def1 < 1000000)
{
if (sd->def_ratio_atk_ele & (1 << t_ele)
|| sd->def_ratio_atk_race & (1 << t_race))
@@ -3006,167 +2482,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
flag = (flag & ~BF_SKILLMASK) | BF_SKILL;
switch (skill_num)
{
- case SM_BASH: // バッシュ
- damage = damage * (100 + 30 * skill_lv) / 100;
- damage2 = damage2 * (100 + 30 * skill_lv) / 100;
- hitrate = (hitrate * (100 + 5 * skill_lv)) / 100;
- break;
- case SM_MAGNUM: // マグナムブレイク
- damage =
- damage * (5 * skill_lv + (wflag) ? 65 : 115) / 100;
- damage2 =
- damage2 * (5 * skill_lv + (wflag) ? 65 : 115) / 100;
- break;
- case MC_MAMMONITE: // メマーナイト
- damage = damage * (100 + 50 * skill_lv) / 100;
- damage2 = damage2 * (100 + 50 * skill_lv) / 100;
- break;
- case AC_DOUBLE: // ダブルストレイフィング
- if (!sd->state.arrow_atk && sd->arrow_atk > 0)
- {
- int arr = MRAND((sd->arrow_atk + 1));
- damage += arr;
- damage2 += arr;
- }
- damage = damage * (180 + 20 * skill_lv) / 100;
- damage2 = damage2 * (180 + 20 * skill_lv) / 100;
- div_ = 2;
- if (sd->arrow_ele > 0)
- {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case AC_SHOWER: // アローシャワー
- if (!sd->state.arrow_atk && sd->arrow_atk > 0)
- {
- int arr = MRAND((sd->arrow_atk + 1));
- damage += arr;
- damage2 += arr;
- }
- damage = damage * (75 + 5 * skill_lv) / 100;
- damage2 = damage2 * (75 + 5 * skill_lv) / 100;
- if (sd->arrow_ele > 0)
- {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case AC_CHARGEARROW: // チャージアロー
- if (!sd->state.arrow_atk && sd->arrow_atk > 0)
- {
- int arr = MRAND((sd->arrow_atk + 1));
- damage += arr;
- damage2 += arr;
- }
- damage = damage * 150 / 100;
- damage2 = damage2 * 150 / 100;
- if (sd->arrow_ele > 0)
- {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case KN_PIERCE: // ピアース
- damage = damage * (100 + 10 * skill_lv) / 100;
- damage2 = damage2 * (100 + 10 * skill_lv) / 100;
- hitrate = hitrate * (100 + 5 * skill_lv) / 100;
- div_ = t_size + 1;
- damage *= div_;
- damage2 *= div_;
- break;
- case KN_SPEARSTAB: // スピアスタブ
- damage = damage * (100 + 15 * skill_lv) / 100;
- damage2 = damage2 * (100 + 15 * skill_lv) / 100;
- break;
- case KN_SPEARBOOMERANG: // スピアブーメラン
- damage = damage * (100 + 50 * skill_lv) / 100;
- damage2 = damage2 * (100 + 50 * skill_lv) / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- break;
- case KN_BRANDISHSPEAR: // ブランディッシュスピア
- damage = damage * (100 + 20 * skill_lv) / 100;
- damage2 = damage2 * (100 + 20 * skill_lv) / 100;
- {
- int damage3 = 0;
- if (skill_lv > 3 && wflag == 1)
- damage3 += damage / 2;
- if (skill_lv > 6 && wflag == 1)
- damage3 += damage / 4;
- if (skill_lv > 9 && wflag == 1)
- damage3 += damage / 8;
- if (skill_lv > 6 && wflag == 2)
- damage3 += damage / 2;
- if (skill_lv > 9 && wflag == 2)
- damage3 += damage / 4;
- if (skill_lv > 9 && wflag == 3)
- damage3 += damage / 2;
- damage += damage3;
- }
- if (skill_lv > 3 && wflag == 1)
- damage4 += damage2 / 2;
- if (skill_lv > 6 && wflag == 1)
- damage4 += damage2 / 4;
- if (skill_lv > 9 && wflag == 1)
- damage4 += damage2 / 8;
- if (skill_lv > 6 && wflag == 2)
- damage4 += damage2 / 2;
- if (skill_lv > 9 && wflag == 2)
- damage4 += damage2 / 4;
- if (skill_lv > 9 && wflag == 3)
- damage4 += damage2 / 2;
- damage2 += damage4;
- blewcount = 0;
- break;
- case KN_BOWLINGBASH: // ボウリングバッシュ
- damage = damage * (100 + 50 * skill_lv) / 100;
- damage2 = damage2 * (100 + 50 * skill_lv) / 100;
- blewcount = 0;
- break;
- case KN_AUTOCOUNTER:
- if (battle_config.pc_auto_counter_type & 1)
- hitrate += 20;
- else
- hitrate = 1000000;
- flag = (flag & ~BF_SKILLMASK) | BF_NORMAL;
- break;
- case AS_SONICBLOW: // ソニックブロウ
- hitrate += 30; // hitrate +30, thanks to midas
- damage = damage * (300 + 50 * skill_lv) / 100;
- damage2 = damage2 * (300 + 50 * skill_lv) / 100;
- div_ = 8;
- break;
- case TF_SPRINKLESAND: // 砂まき
- damage = damage * 125 / 100;
- damage2 = damage2 * 125 / 100;
- break;
- case MC_CARTREVOLUTION: // カートレボリューション
- if (sd->cart_max_weight > 0 && sd->cart_weight > 0)
- {
- damage =
- (damage *
- (150 + pc_checkskill(sd, BS_WEAPONRESEARCH) +
- (sd->cart_weight * 100 /
- sd->cart_max_weight))) / 100;
- damage2 =
- (damage2 *
- (150 + pc_checkskill(sd, BS_WEAPONRESEARCH) +
- (sd->cart_weight * 100 /
- sd->cart_max_weight))) / 100;
- }
- else
- {
- damage = (damage * 150) / 100;
- damage2 = (damage2 * 150) / 100;
- }
- break;
- // 以下MOB
case NPC_COMBOATTACK: // 多段攻撃
div_ = skill_get_num(skill_num, skill_lv);
damage *= div_;
@@ -3197,287 +2512,14 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
case NPC_PIERCINGATT:
flag = (flag & ~BF_RANGEMASK) | BF_SHORT;
break;
- case RG_BACKSTAP: // バックスタブ
- if (battle_config.backstab_bow_penalty == 1
- && sd->status.weapon == 11)
- {
- damage = (damage * (300 + 40 * skill_lv) / 100) / 2;
- damage2 = (damage2 * (300 + 40 * skill_lv) / 100) / 2;
- }
- else
- {
- damage = damage * (300 + 40 * skill_lv) / 100;
- damage2 = damage2 * (300 + 40 * skill_lv) / 100;
- }
- hitrate = 1000000;
- break;
- case RG_RAID: // サプライズアタック
- damage = damage * (100 + 40 * skill_lv) / 100;
- damage2 = damage2 * (100 + 40 * skill_lv) / 100;
- break;
- case RG_INTIMIDATE: // インティミデイト
- damage = damage * (100 + 30 * skill_lv) / 100;
- damage2 = damage2 * (100 + 30 * skill_lv) / 100;
- break;
- case CR_SHIELDCHARGE: // シールドチャージ
- damage = damage * (100 + 20 * skill_lv) / 100;
- damage2 = damage2 * (100 + 20 * skill_lv) / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_SHORT;
- s_ele = 0;
- break;
- case CR_SHIELDBOOMERANG: // シールドブーメラン
- damage = damage * (100 + 30 * skill_lv) / 100;
- damage2 = damage2 * (100 + 30 * skill_lv) / 100;
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- s_ele = 0;
- break;
- case CR_HOLYCROSS: // ホーリークロス
- damage = damage * (100 + 35 * skill_lv) / 100;
- damage2 = damage2 * (100 + 35 * skill_lv) / 100;
- div_ = 2;
- break;
- case CR_GRANDCROSS:
- hitrate = 1000000;
- break;
- case AM_DEMONSTRATION: // デモンストレーション
- damage = damage * (100 + 20 * skill_lv) / 100;
- damage2 = damage2 * (100 + 20 * skill_lv) / 100;
- break;
- case AM_ACIDTERROR: // アシッドテラー
- damage = damage * (100 + 40 * skill_lv) / 100;
- damage2 = damage2 * (100 + 40 * skill_lv) / 100;
- break;
- case MO_FINGEROFFENSIVE: //指弾
- if (battle_config.finger_offensive_type == 0)
- {
- damage =
- damage * (100 +
- 50 * skill_lv) / 100 *
- sd->spiritball_old;
- damage2 =
- damage2 * (100 +
- 50 * skill_lv) / 100 *
- sd->spiritball_old;
- div_ = sd->spiritball_old;
- }
- else
- {
- damage = damage * (100 + 50 * skill_lv) / 100;
- damage2 = damage2 * (100 + 50 * skill_lv) / 100;
- div_ = 1;
- }
- break;
- case MO_INVESTIGATE: // 発 勁
- if (def1 < 1000000)
- {
- damage =
- damage * (100 + 75 * skill_lv) / 100 * (def1 +
- def2) /
- 100;
- damage2 =
- damage2 * (100 + 75 * skill_lv) / 100 * (def1 +
- def2) /
- 100;
- }
- hitrate = 1000000;
- s_ele = 0;
- s_ele_ = 0;
- break;
- case MO_EXTREMITYFIST: // 阿修羅覇鳳拳
- damage =
- damage * (8 + ((sd->status.sp) / 10)) + 250 +
- (skill_lv * 150);
- damage2 =
- damage2 * (8 + ((sd->status.sp) / 10)) + 250 +
- (skill_lv * 150);
- sd->status.sp = 0;
- clif_updatestatus(sd, SP_SP);
- hitrate = 1000000;
- s_ele = 0;
- s_ele_ = 0;
- break;
- case MO_CHAINCOMBO: // 連打掌
- damage = damage * (150 + 50 * skill_lv) / 100;
- damage2 = damage2 * (150 + 50 * skill_lv) / 100;
- div_ = 4;
- break;
- case MO_COMBOFINISH: // 猛龍拳
- damage = damage * (240 + 60 * skill_lv) / 100;
- damage2 = damage2 * (240 + 60 * skill_lv) / 100;
- break;
- case BA_MUSICALSTRIKE: // ミュージカルストライク
- if (!sd->state.arrow_atk && sd->arrow_atk > 0)
- {
- int arr = MRAND((sd->arrow_atk + 1));
- damage += arr;
- damage2 += arr;
- }
- damage = damage * (100 + 50 * skill_lv) / 100;
- damage2 = damage2 * (100 + 50 * skill_lv) / 100;
- if (sd->arrow_ele > 0)
- {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case DC_THROWARROW: // 矢撃ち
- if (!sd->state.arrow_atk && sd->arrow_atk > 0)
- {
- int arr = MRAND((sd->arrow_atk + 1));
- damage += arr;
- damage2 += arr;
- }
- damage = damage * (100 + 50 * skill_lv) / 100;
- damage2 = damage2 * (100 + 50 * skill_lv) / 100;
- if (sd->arrow_ele > 0)
- {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case CH_TIGERFIST: // 伏虎拳
- damage = damage * (100 + 20 * skill_lv) / 100;
- damage2 = damage2 * (100 + 20 * skill_lv) / 100;
- break;
- case CH_CHAINCRUSH: // 連柱崩撃
- damage = damage * (100 + 20 * skill_lv) / 100;
- damage2 = damage2 * (100 + 20 * skill_lv) / 100;
- div_ = skill_get_num(skill_num, skill_lv);
- break;
- case CH_PALMSTRIKE: // 猛虎硬派山
- damage = damage * (50 + 100 * skill_lv) / 100;
- damage2 = damage2 * (50 + 100 * skill_lv) / 100;
- break;
- case LK_SPIRALPIERCE: /* スパイラルピアース */
- damage = damage * (100 + 50 * skill_lv) / 100; //増加量が分からないので適当に
- damage2 = damage2 * (100 + 50 * skill_lv) / 100; //増加量が分からないので適当に
- div_ = 5;
- if (tsd)
- tsd->canmove_tick = gettick() + 1000;
- else if (tmd)
- tmd->canmove_tick = gettick() + 1000;
- break;
- case LK_HEADCRUSH: /* ヘッドクラッシュ */
- damage = damage * (100 + 20 * skill_lv) / 100;
- damage2 = damage2 * (100 + 20 * skill_lv) / 100;
- break;
- case LK_JOINTBEAT: /* ジョイントビート */
- damage = damage * (50 + 10 * skill_lv) / 100;
- damage2 = damage2 * (50 + 10 * skill_lv) / 100;
- break;
- case ASC_METEORASSAULT: /* メテオアサルト */
- damage = damage * (40 + 40 * skill_lv) / 100;
- damage2 = damage2 * (40 + 40 * skill_lv) / 100;
- break;
- case SN_SHARPSHOOTING: /* シャープシューティング */
- damage += damage * (30 * skill_lv) / 100;
- damage2 += damage2 * (30 * skill_lv) / 100;
- break;
- case CG_ARROWVULCAN: /* アローバルカン */
- damage = damage * (160 + 40 * skill_lv) / 100;
- damage2 = damage2 * (160 + 40 * skill_lv) / 100;
- div_ = 9;
- break;
- case AS_SPLASHER: /* ベナムスプラッシャー */
- damage =
- damage * (200 + 20 * skill_lv +
- 20 * pc_checkskill(sd,
- AS_POISONREACT)) / 100;
- damage2 =
- damage2 * (200 + 20 * skill_lv +
- 20 * pc_checkskill(sd,
- AS_POISONREACT)) / 100;
- break;
- case PA_SACRIFICE:
- if (sd)
- {
- int mhp, damage3;
- mhp = battle_get_max_hp(src);
- damage3 = mhp * ((skill_lv / 2) + (50 / 100)) / 100;
- damage =
- (((skill_lv * 15) + 90) / 100) * damage3 / 100;
- damage2 =
- (((skill_lv * 15) + 90) / 100) * damage3 / 100;
- }
- break;
- case ASC_BREAKER: // -- moonsoul (special damage for ASC_BREAKER skill)
- if (sd)
- {
- int damage3;
- int mdef1 = battle_get_mdef(target);
- int mdef2 = battle_get_mdef2(target);
- int imdef_flag = 0;
-
- damage =
- ((damage * 5) +
- (skill_lv * battle_get_int(src) * 5) +
- MRAND(500) + 500) / 2;
- damage2 =
- ((damage2 * 5) +
- (skill_lv * battle_get_int(src) * 5) +
- MRAND(500) + 500) / 2;
- damage3 = damage;
- hitrate = 1000000;
-
- if (sd->ignore_mdef_ele & (1 << t_ele)
- || sd->ignore_mdef_race & (1 << t_race))
- imdef_flag = 1;
- if (t_mode & 0x20)
- {
- if (sd->ignore_mdef_race & (1 << 10))
- imdef_flag = 1;
- }
- else
- {
- if (sd->ignore_mdef_race & (1 << 11))
- imdef_flag = 1;
- }
- if (!imdef_flag)
- {
- if (battle_config.magic_defense_type)
- {
- damage3 =
- damage3 -
- (mdef1 *
- battle_config.magic_defense_type) -
- mdef2;
- }
- else
- {
- damage3 =
- (damage3 * (100 - mdef1)) / 100 - mdef2;
- }
- }
-
- if (damage3 < 1)
- damage3 = 1;
-
- damage3 =
- battle_attr_fix(damage2, s_ele_,
- battle_get_element(target));
- }
- break;
}
}
- if (da == 2)
- { //三段掌が発動しているか
- type = 0x08;
- div_ = 255; //三段掌用に…
- damage =
- damage * (100 +
- 20 * pc_checkskill(sd, MO_TRIPLEATTACK)) / 100;
- }
if (skill_num != NPC_CRITICALSLASH)
{
// 対 象の防御力によるダメージの減少
// ディバインプロテクション(ここでいいのかな?)
- if (skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST
- && skill_num != KN_AUTOCOUNTER && def1 < 1000000)
+ if (def1 < 1000000)
{ //DEF, VIT無視
int t_def;
target_count =
@@ -3599,43 +2641,10 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
}
}
// 精錬ダメージの追加
- if (skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST)
{ //DEF, VIT無視
damage += battle_get_atk2(src);
damage2 += battle_get_atk_2(src);
}
- if (skill_num == CR_SHIELDBOOMERANG)
- {
- if (sd->equip_index[EQUIP::SHIELD] >= 0)
- {
- int index = sd->equip_index[EQUIP::SHIELD];
- if (sd->inventory_data[index]
- && sd->inventory_data[index]->type == ItemType::ARMOR)
- {
- damage += sd->inventory_data[index]->weight / 10;
- damage +=
- sd->status.inventory[index].refine * pc_getrefinebonus(0,
- 1);
- }
- }
- }
- if (skill_num == LK_SPIRALPIERCE)
- { /* スパイラルピアース */
- if (sd->equip_index[EQUIP::WEAPON] >= 0)
- { //重量で追加ダメージらしいのでシールドブーメランを参考に追加
- int index = sd->equip_index[EQUIP::WEAPON];
- if (sd->inventory_data[index]
- && sd->inventory_data[index]->type == ItemType::WEAPON)
- {
- damage +=
- (int)(sd->inventory_data[index]->weight *
- (0.8 * skill_lv * 4 / 10));
- damage +=
- sd->status.inventory[index].refine * pc_getrefinebonus(0,
- 1);
- }
- }
- }
// 0未満だった場合1に補正
if (damage < 1)
@@ -3645,11 +2654,7 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
// スキル修正2(修練系)
// 修練ダメージ(右手のみ) ソニックブロー時は別処理(1撃に付き1/8適応)
- if (skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST
- && skill_num != CR_GRANDCROSS)
{ //修練ダメージ無視
- damage = battle_addmastery(sd, target, damage, 0);
- damage2 = battle_addmastery(sd, target, damage2, 1);
}
if (sd->perfect_hit > 0)
@@ -3674,20 +2679,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
{
dmg_lv = ATK_DEF;
}
- // スキル修正3(武器研究)
- if ((skill = pc_checkskill(sd, BS_WEAPONRESEARCH)) > 0)
- {
- damage += skill * 2;
- damage2 += skill * 2;
- }
- //Advanced Katar Research by zanetheinsane
- if (sd->weapontype1 == 0x10 || sd->weapontype2 == 0x10)
- {
- if ((skill = pc_checkskill(sd, ASC_KATAR)) > 0)
- {
- damage += (damage * ((skill * 2) + 10)) / 100;
- }
- }
//スキルによるダメージ補正ここまで
@@ -3748,8 +2739,7 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
break;
}
}
- if (skill_num != CR_GRANDCROSS || !battle_config.gx_cardfix)
- damage = damage * cardfix / 100; //カード補正によるダメージ増加
+ damage = damage * cardfix / 100; //カード補正によるダメージ増加
//カードによるダメージ増加処理ここまで
//カードによるダメージ追加処理(左手)ここから
@@ -3773,15 +2763,9 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
break;
}
}
- if (skill_num != CR_GRANDCROSS)
- damage2 = damage2 * cardfix / 100; //カード補正による左手ダメージ増加
+ damage2 = damage2 * cardfix / 100; //カード補正による左手ダメージ増加
//カードによるダメージ増加処理(左手)ここまで
-// -- moonsoul (cardfix for magic damage portion of ASC_BREAKER)
- int damage3 = 0;
- if (skill_num == ASC_BREAKER)
- damage3 = damage3 * cardfix / 100;
-
//カードによるダメージ減衰処理ここから
if (tsd)
{ //対象がPCの場合
@@ -3858,11 +2842,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
damage += sc_data[SC_AURABLADE].val1 * 10;
damage2 += sc_data[SC_AURABLADE].val1 * 10;
}
- if (skill_num == PA_PRESSURE)
- { /* プレッシャー 必中? */
- damage = 700 + 100 * skill_lv;
- damage2 = 700 + 100 * skill_lv;
- }
// >二刀流の左右ダメージ計算誰かやってくれぇぇぇぇえええ!
// >map_session_data に左手ダメージ(atk,atk2)追加して
@@ -3881,13 +2860,13 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
{ // 二刀流か?
int dmg = damage, dmg2 = damage2;
// 右手修練(60% 〜 100%) 右手全般
- skill = pc_checkskill(sd, AS_RIGHT);
- damage = damage * (50 + (skill * 10)) / 100;
+ skill = 0;
+ damage = damage * 50 / 100;
if (dmg > 0 && damage < 1)
damage = 1;
// 左手修練(40% 〜 80%) 左手全般
- skill = pc_checkskill(sd, AS_LEFT);
- damage2 = damage2 * (30 + (skill * 10)) / 100;
+ skill = 0;
+ damage2 = damage2 * 30 / 100;
if (dmg2 > 0 && damage2 < 1)
damage2 = 1;
}
@@ -3895,7 +2874,7 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
damage2 = 0;
// 右手,短剣のみ
- if (da == 1)
+ if (da)
{ //ダブルアタックが発動しているか
div_ = 2;
damage += damage;
@@ -3905,24 +2884,11 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
if (sd->status.weapon == 16)
{
// カタール追撃ダメージ
- skill = pc_checkskill(sd, TF_DOUBLE);
- damage2 = damage * (1 + (skill * 2)) / 100;
+ damage2 = damage * 1 / 100;
if (damage > 0 && damage2 < 1)
damage2 = 1;
}
- // インベナム修正
- if (skill_num == TF_POISON)
- {
- damage =
- battle_attr_fix(damage + 15 * skill_lv, s_ele,
- battle_get_element(target));
- }
- if (skill_num == MC_CARTREVOLUTION)
- {
- damage = battle_attr_fix(damage, 0, battle_get_element(target));
- }
-
// 完全回避の判定
if (skill_num == SkillID::ZERO && skill_lv >= 0 && tsd != NULL && div_ < 255
&& MRAND(1000) < battle_get_flee2(target))
@@ -3954,11 +2920,10 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
}
//bNoWeaponDamage(設定アイテム無し?)でグランドクロスじゃない場合はダメージが0
- if (tsd && tsd->special_state.no_weapon_damage
- && skill_num != CR_GRANDCROSS)
+ if (tsd && tsd->special_state.no_weapon_damage)
damage = damage2 = 0;
- if (skill_num != CR_GRANDCROSS && (damage > 0 || damage2 > 0))
+ if (damage > 0 || damage2 > 0)
{
if (damage2 < 1) // ダメージ最終修正
damage =
@@ -3995,20 +2960,11 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
}
/* End addition */
-// -- moonsoul (final combination of phys, mag damage for ASC_BREAKER)
- if (skill_num == ASC_BREAKER)
- {
- damage += damage3;
- damage2 += damage3;
- }
-
wd.damage = damage;
wd.damage2 = damage2;
wd.type = type;
wd.div_ = div_;
wd.amotion = battle_get_amotion(src);
- if (skill_num == KN_AUTOCOUNTER)
- wd.amotion >>= 1;
wd.dmotion = battle_get_dmotion(target);
wd.blewcount = blewcount;
wd.flag = flag;
@@ -4104,7 +3060,7 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,
static
struct Damage battle_calc_magic_attack(struct block_list *bl,
struct block_list *target,
- SkillID skill_num, int skill_lv, int flag)
+ SkillID skill_num, int skill_lv, int)
{
int mdef1 = battle_get_mdef(target);
int mdef2 = battle_get_mdef2(target);
@@ -4152,130 +3108,9 @@ struct Damage battle_calc_magic_attack(struct block_list *bl,
{ // 基本ダメージ計算(スキルごとに処理)
// ヒールor聖体
case AL_HEAL:
- case PR_BENEDICTIO:
damage = skill_calc_heal(bl, skill_lv) / 2;
normalmagic_flag = 0;
break;
- case PR_ASPERSIO: /* アスペルシオ */
- damage = 40; //固定ダメージ
- normalmagic_flag = 0;
- break;
- case PR_SANCTUARY: // サンクチュアリ
- damage = (skill_lv > 6) ? 388 : skill_lv * 50;
- normalmagic_flag = 0;
- blewcount |= 0x10000;
- break;
- case ALL_RESURRECTION:
- case PR_TURNUNDEAD: // 攻撃リザレクションとターンアンデッド
- if (target->type != BL_PC
- && battle_check_undead(t_race, t_ele))
- {
- int hp, mhp, thres;
- hp = battle_get_hp(target);
- mhp = battle_get_max_hp(target);
- thres = (skill_lv * 20) + battle_get_luk(bl) +
- battle_get_int(bl) + battle_get_lv(bl) +
- ((200 - hp * 200 / mhp));
- if (thres > 700)
- thres = 700;
-// if(battle_config.battle_log)
-// PRINTF("ターンアンデッド! 確率%d ‰(千分率)\n", thres);
- if (MRAND(1000) < thres && !(t_mode & 0x20)) // 成功
- damage = hp;
- else // 失敗
- damage =
- battle_get_lv(bl) + battle_get_int(bl) +
- skill_lv * 10;
- }
- normalmagic_flag = 0;
- break;
-
- case MG_NAPALMBEAT: // ナパームビート(分散計算込み)
- MATK_FIX(70 + skill_lv * 10, 100);
- if (flag > 0)
- {
- MATK_FIX(1, flag);
- }
- else
- {
- if (battle_config.error_log)
- PRINTF("battle_calc_magic_attack(): napam enemy count=0 !\n");
- }
- break;
- case MG_FIREBALL: // ファイヤーボール
- {
- const int drate[] = { 100, 90, 70 };
- if (flag > 2)
- matk1 = matk2 = 0;
- else
- MATK_FIX((95 + skill_lv * 5) * drate[flag], 10000);
- }
- break;
- case MG_FIREWALL: // ファイヤーウォール
-/*
- if ((t_ele!=3 && !battle_check_undead(t_race,t_ele)) || target->type==BL_PC ) //PCは火属性でも飛ぶ?そもそもダメージ受ける?
- blewcount |= 0x10000;
- else
- blewcount = 0;
-*/
- if ((t_ele == 3 || battle_check_undead(t_race, t_ele))
- && target->type != BL_PC)
- blewcount = 0;
- else
- blewcount |= 0x10000;
- MATK_FIX(1, 2);
- break;
- case MG_THUNDERSTORM: // サンダーストーム
- MATK_FIX(80, 100);
- break;
- case MG_FROSTDIVER: // フロストダイバ
- MATK_FIX(100 + skill_lv * 10, 100);
- break;
- case WZ_FROSTNOVA: // フロストダイバ
- MATK_FIX(((100 + skill_lv * 10) * (2 / 3)), 100);
- break;
- case WZ_FIREPILLAR: // ファイヤーピラー
- if (mdef1 < 1000000)
- mdef1 = mdef2 = 0; // MDEF無視
- MATK_FIX(1, 5);
- matk1 += 50;
- matk2 += 50;
- break;
- case WZ_SIGHTRASHER:
- MATK_FIX(100 + skill_lv * 20, 100);
- break;
- case WZ_METEOR:
- case WZ_JUPITEL: // ユピテルサンダー
- break;
- case WZ_VERMILION: // ロードオブバーミリオン
- MATK_FIX(skill_lv * 20 + 80, 100);
- break;
- case WZ_WATERBALL: // ウォーターボール
- matk1 += skill_lv * 30;
- matk2 += skill_lv * 30;
- break;
- case WZ_STORMGUST: // ストームガスト
- MATK_FIX(skill_lv * 40 + 100, 100);
- blewcount |= 0x10000;
- break;
- case AL_HOLYLIGHT: // ホーリーライト
- MATK_FIX(125, 100);
- break;
- case AL_RUWACH:
- MATK_FIX(145, 100);
- break;
- case HW_NAPALMVULCAN: // ナパームビート(分散計算込み)
- MATK_FIX(70 + skill_lv * 10, 100);
- if (flag > 0)
- {
- MATK_FIX(1, flag);
- }
- else
- {
- if (battle_config.error_log)
- PRINTF("battle_calc_magic_attack(): napalmvulcan enemy count=0 !\n");
- }
- break;
}
}
@@ -4369,21 +3204,9 @@ struct Damage battle_calc_magic_attack(struct block_list *bl,
damage = battle_attr_fix(damage, ele, battle_get_element(target)); // 属 性修正
- if (skill_num == CR_GRANDCROSS)
- { // グランドクロス
- struct Damage wd;
- wd = battle_calc_weapon_attack(bl, target, skill_num, skill_lv,
- flag);
- damage = (damage + wd.damage) * (100 + 40 * skill_lv) / 100;
- if (battle_config.gx_dupele)
- damage = battle_attr_fix(damage, ele, battle_get_element(target)); //属性2回かかる
- if (bl == target)
- damage = damage / 2; //反動は半分
- }
-
div_ = skill_get_num(skill_num, skill_lv);
- if (div_ > 1 && skill_num != WZ_VERMILION)
+ if (div_ > 1)
damage *= div_;
// if(mdef1 >= 1000000 && damage > 0)
@@ -4434,12 +3257,9 @@ struct Damage battle_calc_magic_attack(struct block_list *bl,
static
struct Damage battle_calc_misc_attack(struct block_list *bl,
struct block_list *target,
- SkillID skill_num, int skill_lv, int flag)
+ SkillID skill_num, int skill_lv, int)
{
- int int_ = battle_get_int(bl);
-// int luk=battle_get_luk(bl);
- int dex = battle_get_dex(bl);
- int skill, ele, race, cardfix;
+ int ele, race, cardfix;
struct map_session_data *sd = NULL, *tsd = NULL;
int damage = 0, div_ = 1, blewcount =
skill_get_blewcount(skill_num, skill_lv);
@@ -4467,37 +3287,6 @@ struct Damage battle_calc_misc_attack(struct block_list *bl,
switch (skill_num)
{
-
- case HT_LANDMINE: // ランドマイン
- damage = skill_lv * (dex + 75) * (100 + int_) / 100;
- break;
-
- case HT_BLASTMINE: // ブラストマイン
- damage = skill_lv * (dex / 2 + 50) * (100 + int_) / 100;
- break;
-
- case HT_CLAYMORETRAP: // クレイモアートラップ
- damage = skill_lv * (dex / 2 + 75) * (100 + int_) / 100;
- break;
-
- case HT_BLITZBEAT: // ブリッツビート
- if (sd == NULL || (skill = pc_checkskill(sd, HT_STEELCROW)) <= 0)
- skill = 0;
- damage = (dex / 10 + int_ / 2 + skill * 3 + 40) * 2;
- if (flag > 1)
- damage /= flag;
- break;
-
- case TF_THROWSTONE: // 石投げ
- damage = 30;
- damagefix = 0;
- break;
-
- case BA_DISSONANCE: // 不協和音
- damage =
- (skill_lv) * 20 + pc_checkskill(sd, BA_MUSICALLESSON) * 3;
- break;
-
case NPC_SELFDESTRUCTION: // 自爆
damage = battle_get_hp(bl) - (bl == target ? 1 : 0);
damagefix = 0;
@@ -4529,12 +3318,6 @@ struct Damage battle_calc_misc_attack(struct block_list *bl,
}
}
break;
- case SN_FALCONASSAULT: /* ファルコンアサルト */
- skill = pc_checkskill(sd, HT_BLITZBEAT);
- damage =
- (100 + 50 * skill_lv +
- (dex / 10 + int_ / 2 + skill * 3 + 40) * 2);
- break;
}
ele = skill_get_pl(skill_num);
@@ -4624,7 +3407,6 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target,
unsigned int tick, BCT flag)
{
struct map_session_data *sd = NULL;
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(src);
eptr<struct status_change, StatusChange> t_sc_data = battle_get_sc_data(target);
int race = 7, ele = 0;
int damage, rdamage = 0;
@@ -4650,11 +3432,6 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target,
battle_stopattack(src);
return ATK::ZERO;
}
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- {
- battle_stopattack(src);
- return ATK::ZERO;
- }
race = battle_get_race(target);
ele = battle_get_elem_type(target);
@@ -4675,20 +3452,7 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target,
return ATK::ZERO;
}
}
- if (flag & BCT_mid_x80)
- {
- if (sd && battle_config.pc_attack_direction_change)
- sd->dir = sd->head_dir =
- map_calc_dir(src, target->x, target->y);
- else if (src->type == BL_MOB
- && battle_config.monster_attack_direction_change)
- ((struct mob_data *) src)->dir =
- map_calc_dir(src, target->x, target->y);
- wd = battle_calc_weapon_attack(src, target, KN_AUTOCOUNTER,
- flag.lo, 0);
- }
- else
- wd = battle_calc_weapon_attack(src, target, SkillID::ZERO, 0, 0);
+ wd = battle_calc_weapon_attack(src, target, SkillID::ZERO, 0, 0);
// significantly increase injuries for hasted characters
if (wd.damage > 0 && (t_sc_data[SC_HASTE].timer != -1))
@@ -4752,25 +3516,6 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target,
clif_damage(src, src, tick, wd.amotion, 0, rdamage, 1, 4, 0);
}
- if (wd.div_ == 255 && sd)
- { //三段掌
- int delay =
- 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
- int skilllv;
- if (wd.damage + wd.damage2 < battle_get_hp(target))
- {
- if ((skilllv = pc_checkskill(sd, MO_CHAINCOMBO)) > 0)
- delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整
-
- skill_status_change_start(src, SC_COMBO,
- uint16_t(MO_TRIPLEATTACK), skilllv, 0, 0, delay, 0);
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_skill_damage(src, target, tick, wd.amotion, wd.dmotion,
- wd.damage, 3, MO_TRIPLEATTACK,
- pc_checkskill(sd, MO_TRIPLEATTACK), -1);
- }
- else
{
clif_damage(src, target, tick, wd.amotion, wd.dmotion,
wd.damage, wd.div_, wd.type, wd.damage2);
@@ -4852,93 +3597,6 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target,
}
}
}
- if (sc_data && sc_data[SC_AUTOSPELL].timer != -1
- && MRAND(100) < sc_data[SC_AUTOSPELL].val4)
- {
- int skilllv = sc_data[SC_AUTOSPELL].val3, i, f = 0;
- i = MRAND(100);
- if (i >= 50)
- skilllv -= 2;
- else if (i >= 15)
- skilllv--;
- if (skilllv < 1)
- skilllv = 1;
- if (sd)
- {
- int sp = skill_get_sp(SkillID(sc_data[SC_AUTOSPELL].val2),
- skilllv) * 2 / 3;
- if (sd->status.sp >= sp)
- {
- // obviously not what was intended
- // but this is going away soon anyway
- i = skill_get_inf(SkillID(sc_data[SC_AUTOSPELL].val2)) == 2;
- if (i || i == 32)
- f = skill_castend_pos2(src, target->x, target->y,
- SkillID(sc_data[SC_AUTOSPELL].val2),
- skilllv, tick, flag);
- else
- {
- switch (skill_get_nk(SkillID(sc_data[SC_AUTOSPELL].val2)))
- {
- case 0:
- case 2:
- f = skill_castend_damage_id(src, target,
- SkillID(sc_data[SC_AUTOSPELL].val2),
- skilllv, tick, flag);
- break;
- case 1: /* 支援系 */
- if ((SkillID(sc_data[SC_AUTOSPELL].val2) == AL_HEAL
- || (SkillID(sc_data[SC_AUTOSPELL].val2) == ALL_RESURRECTION
- && target->type != BL_PC))
- && battle_check_undead(race, ele))
- f = skill_castend_damage_id(src, target,
- SkillID(sc_data[SC_AUTOSPELL].val2),
- skilllv, tick, flag);
- else
- f = skill_castend_nodamage_id(src, target,
- SkillID(sc_data[SC_AUTOSPELL].val2),
- skilllv, tick, flag);
- break;
- }
- }
- if (!f)
- pc_heal(sd, 0, -sp);
- }
- }
- else
- {
- i = skill_get_inf(SkillID(sc_data[SC_AUTOSPELL].val2)) == 2;
- if (i || i == 32)
- skill_castend_pos2(src, target->x, target->y,
- SkillID(sc_data[SC_AUTOSPELL].val2),
- skilllv, tick, flag);
- else
- {
- switch (skill_get_nk(SkillID(sc_data[SC_AUTOSPELL].val2)))
- {
- case 0:
- case 2:
- skill_castend_damage_id(src, target,
- SkillID(sc_data[SC_AUTOSPELL].val2),
- skilllv, tick, flag);
- break;
- case 1: /* 支援系 */
- if ((SkillID(sc_data[SC_AUTOSPELL].val2) == AL_HEAL
- || (SkillID(sc_data[SC_AUTOSPELL].val2) == ALL_RESURRECTION
- && target->type != BL_PC))
- && battle_check_undead(race, ele))
- skill_castend_damage_id(src, target,
- SkillID(sc_data[SC_AUTOSPELL].val2),
- skilllv, tick, flag);
- else
- skill_castend_nodamage_id(src, target,
- SkillID(sc_data[SC_AUTOSPELL].val2),
- skilllv, tick, flag);
- break;
- }
- }
- }
- }
if (sd)
{
if (sd->autospell_id != SkillID::ZERO
@@ -4959,9 +3617,7 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target,
{
if ((i = skill_get_inf(sd->autospell_id) == 2)
|| i == 32)
- f = skill_castend_pos2(src, target->x, target->y,
- sd->autospell_id, skilllv,
- tick, flag);
+ f = 0;
else
{
switch (skill_get_nk(sd->autospell_id))
@@ -4974,9 +3630,7 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target,
flag);
break;
case 1: /* 支援系 */
- if ((sd->autospell_id == AL_HEAL
- || (sd->autospell_id == ALL_RESURRECTION
- && target->type != BL_PC))
+ if (sd->autospell_id == AL_HEAL
&& battle_check_undead(race, ele))
f = skill_castend_damage_id(src, target,
sd->autospell_id,
@@ -5028,26 +3682,6 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target,
if (rdamage > 0)
battle_damage(target, src, rdamage, 0);
- if (t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1
- && t_sc_data[SC_AUTOCOUNTER].val4 > 0)
- {
- if (t_sc_data[SC_AUTOCOUNTER].val3 == src->id)
- battle_weapon_attack(target, src, tick,
- BCT_mid_x80 |
- t_sc_data[SC_AUTOCOUNTER].val1_bct());
- skill_status_change_end(target, SC_AUTOCOUNTER, -1);
- }
- if (t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1)
- {
- int lv = t_sc_data[SC_BLADESTOP_WAIT].val1;
- skill_status_change_end(target, SC_BLADESTOP_WAIT, -1);
- skill_status_change_start(src, SC_BLADESTOP, lv, 1, (int) src,
- (int) target,
- skill_get_time2(MO_BLADESTOP, lv), 0);
- skill_status_change_start(target, SC_BLADESTOP, lv, 2,
- (int) target, (int) src,
- skill_get_time2(MO_BLADESTOP, lv), 0);
- }
if (t_sc_data && t_sc_data[SC_SPLASHER].timer != -1) //殴ったので対象のベナムスプラッシャー状態を解除
skill_status_change_end(target, SC_SPLASHER, -1);
diff --git a/src/map/clif.cpp b/src/map/clif.cpp
index 974fd4f..af681d4 100644
--- a/src/map/clif.cpp
+++ b/src/map/clif.cpp
@@ -1093,15 +1093,6 @@ int clif_spawnpc(struct map_session_data *sd)
WBUFW(buf, 51) = 0;
clif_send(buf, packet_len_table[0x1d9], &sd->bl, AREA_WOS);
- if (sd->status.pc_class == 13 || sd->status.pc_class == 21
- || sd->status.pc_class == 4014 || sd->status.pc_class == 4022)
- pc_setoption(sd, sd->status.option | Option::RIDING); // [Valaris]
-
- if ((pc_isriding(sd) && pc_checkskill(sd, KN_RIDING) > 0)
- && (sd->status.pc_class == 7 || sd->status.pc_class == 14
- || sd->status.pc_class == 4008 || sd->status.pc_class == 4015))
- pc_setriding(sd); // update peco riders for people upgrading athena [Valaris]
-
if (map[sd->bl.m].flag.snow)
clif_specialeffect(&sd->bl, 162, 1);
if (map[sd->bl.m].flag.fog)
@@ -1417,10 +1408,8 @@ int clif_buylist(struct map_session_data *sd, struct npc_data *nd)
{
id = itemdb_search(nd->u.shop_item[i].nameid);
val = nd->u.shop_item[i].value;
- WFIFOL(fd, 4 + i * 11) = val;
- if (!id->flag.value_notdc)
- val = pc_modifybuyvalue(sd, val);
- WFIFOL(fd, 8 + i * 11) = val;
+ WFIFOL(fd, 4 + i * 11) = val; // base price
+ WFIFOL(fd, 8 + i * 11) = val; // actual price
WFIFOB(fd, 12 + i * 11) = uint8_t(id->type);
if (id->view_id > 0)
WFIFOW(fd, 13 + i * 11) = id->view_id;
@@ -1453,10 +1442,8 @@ int clif_selllist(struct map_session_data *sd)
if (val < 0)
continue;
WFIFOW(fd, 4 + c * 10) = i + 2;
- WFIFOL(fd, 6 + c * 10) = val;
- if (!sd->inventory_data[i]->flag.value_notoc)
- val = pc_modifysellvalue(sd, val);
- WFIFOL(fd, 10 + c * 10) = val;
+ WFIFOL(fd, 6 + c * 10) = val; // base price
+ WFIFOL(fd, 10 + c * 10) = val; // actual price
c++;
}
}
@@ -2445,9 +2432,6 @@ int clif_changeoption(struct block_list *bl)
{
uint8_t buf[32];
eptr<struct status_change, StatusChange> sc_data;
- static const Option omask[] = { Option::FALCON, Option::RIDING };
- static const StatusChange scnum[] = { SC_FALCON, SC_RIDING };
- int i;
nullpo_ret(bl);
@@ -2475,20 +2459,6 @@ int clif_changeoption(struct block_list *bl)
else
clif_send(buf, packet_len_table[0x119], bl, AREA);
- // アイコンの表示
- for (i = 0; i < sizeof(omask) / sizeof(omask[0]); i++)
- {
- if (bool(option & omask[i]))
- {
- if (sc_data[scnum[i]].timer == -1)
- skill_status_change_start(bl, scnum[i], 0, 0, 0, 0, 0, 0);
- }
- else
- {
- skill_status_change_end(bl, scnum[i], -1);
- }
- }
-
return 0;
}
@@ -4094,16 +4064,6 @@ void clif_parse_LoadEndAck(int, struct map_session_data *sd)
clif_changelook(&sd->bl, LOOK_CLOTHES_COLOR,
sd->status.clothes_color);
- if (sd->status.hp < sd->status.max_hp >> 2
- && pc_checkskill(sd, SM_AUTOBERSERK) > 0
- && (sd->sc_data[SC_PROVOKE].timer == -1
- || sd->sc_data[SC_PROVOKE].val2 == 0))
- // オートバーサーク発動
- skill_status_change_start(&sd->bl, SC_PROVOKE, 10, 1, 0, 0, 0, 0);
-
-// if(time(&timer) < ((weddingtime=pc_readglobalreg(sd,"PC_WEDDING_TIME")) + 3600))
-// skill_status_change_start(&sd->bl,SC_WEDDING,0,weddingtime,0,0,36000,0);
-
if (battle_config.muting_players && sd->status.manner < 0)
skill_status_change_start(&sd->bl, SC_NOCHAT, 0, 0, 0, 0, 0, 0);
@@ -4172,7 +4132,7 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd)
if (sd->npc_id != 0 || sd->state.storage_open)
return;
- if (sd->skilltimer != -1 && pc_checkskill(sd, SA_FREECAST) <= 0) // フリーキャスト
+ if (sd->skilltimer != -1)
return;
if (sd->chatID)
@@ -4184,13 +4144,11 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd)
// ステータス異常やハイディング中(トンネルドライブ無)で動けない
if ((bool(sd->opt1) && sd->opt1 != (Opt1::_stone6)) ||
sd->sc_data[SC_ANKLE].timer != -1 || //アンクルスネア
- sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //オートカウンター
sd->sc_data[SC_TRICKDEAD].timer != -1 || //死んだふり
- sd->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り
sd->sc_data[SC_SPIDERWEB].timer != -1 || //スパイダーウェッブ
(sd->sc_data[SC_DANCING].timer != -1 && sd->sc_data[SC_DANCING].val4)) //合奏スキル演奏中は動けない
return;
- if (bool(sd->status.option & Option::HIDE2) && pc_checkskill(sd, RG_TUNNELDRIVE) <= 0)
+ if (bool(sd->status.option & Option::HIDE2))
return;
if (sd->invincible_timer != -1)
@@ -4521,9 +4479,7 @@ void clif_parse_ActionRequest(int fd, struct map_session_data *sd)
|| bool(sd->opt1)
|| bool(sd->status.option & Option::HIDE2)
|| sd->state.storage_open
- || ((sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //オートカウンター
- sd->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り
- sd->sc_data[SC_DANCING].timer != -1)))
+ || sd->sc_data[SC_DANCING].timer != -1)
return;
tick = gettick();
@@ -4541,8 +4497,7 @@ void clif_parse_ActionRequest(int fd, struct map_session_data *sd)
if (sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22
|| bool(sd->status.option & Option::HIDE))
return;
- if (!battle_config.sdelay_attack_enable
- && pc_checkskill(sd, SA_FREECAST) <= 0)
+ if (!battle_config.sdelay_attack_enable)
{
if (DIFF_TICK(tick, sd->canact_tick) < 0)
{
@@ -4735,7 +4690,6 @@ void clif_parse_TakeItem(int fd, struct map_session_data *sd)
|| sd->opt1 != Opt1::ZERO
|| (
(sd->sc_data[SC_TRICKDEAD].timer != -1 || //死んだふり
- sd->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り
sd->sc_data[SC_BERSERK].timer != -1 || //バーサーク
sd->sc_data[SC_NOCHAT].timer != -1))) //会話禁止
return;
@@ -4776,9 +4730,7 @@ void clif_parse_DropItem(int fd, struct map_session_data *sd)
}
if (sd->npc_id != 0
|| sd->opt1 != Opt1::ZERO
- || ((sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //オートカウンター
- sd->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り
- sd->sc_data[SC_BERSERK].timer != -1))) //バーサーク
+ || sd->sc_data[SC_BERSERK].timer != -1) //バーサーク
{
clif_displaymessage(sd->fd, "Can't drop items right now.");
return;
@@ -4808,7 +4760,6 @@ void clif_parse_UseItem(int fd, struct map_session_data *sd)
|| sd->opt1 != Opt1::ZERO
|| (
(sd->sc_data[SC_TRICKDEAD].timer != -1 || //死んだふり
- sd->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り
sd->sc_data[SC_BERSERK].timer != -1 || //バーサーク
sd->sc_data[SC_NOCHAT].timer != -1))) //会話禁止
return;
@@ -4838,8 +4789,7 @@ void clif_parse_EquipItem(int fd, struct map_session_data *sd)
index = RFIFOW(fd, 2) - 2;
if (sd->npc_id != 0)
return;
- if ((sd->sc_data[SC_BLADESTOP].timer != -1
- || sd->sc_data[SC_BERSERK].timer != -1))
+ if (sd->sc_data[SC_BERSERK].timer != -1)
return;
if (sd->status.inventory[index].identify != 1)
@@ -4884,8 +4834,7 @@ void clif_parse_UnequipItem(int fd, struct map_session_data *sd)
skill_status_change_end(&sd->bl, SC_BROKNWEAPON, -1);
if (sd->status.inventory[index].broken == 1 && sd->sc_data[SC_BROKNARMOR].timer != -1)
skill_status_change_end(&sd->bl, SC_BROKNARMOR, -1);
- if ((sd->sc_data[SC_BLADESTOP].timer != -1
- || sd->sc_data[SC_BERSERK].timer != -1))
+ if (sd->sc_data[SC_BERSERK].timer != -1)
return;
if (sd->npc_id != 0
@@ -5073,8 +5022,6 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
nullpo_retv(sd);
- if (map[sd->bl.m].flag.noskill)
- return;
if (sd->chatID || sd->npc_id != 0 || sd->state.storage_open)
return;
@@ -5084,8 +5031,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
if (sd->skilltimer != -1)
{
- if (skillnum != SA_CASTCANCEL)
- return;
+ return;
}
else if (DIFF_TICK(tick, sd->canact_tick) < 0)
{
@@ -5093,10 +5039,11 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
return;
}
- if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) ||
- sd->sc_data[SC_BERSERK].timer != -1
+ if (sd->sc_data[SC_TRICKDEAD].timer != -1
+ || sd->sc_data[SC_BERSERK].timer != -1
|| sd->sc_data[SC_NOCHAT].timer != -1
- || sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22)
+ || sd->sc_data[SC_WEDDING].timer != -1
+ || sd->view_class == 22)
return;
if (sd->invincible_timer != -1)
pc_delinvincibletimer(sd);
@@ -5110,25 +5057,6 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
{
sd->skillitem = SkillID::NEGATIVE;
sd->skillitemlv = -1;
- if (skillnum == MO_EXTREMITYFIST)
- {
- if ((sd->sc_data[SC_COMBO].timer == -1
- || (sd->sc_data[SC_COMBO].val1_sk() != MO_COMBOFINISH
- && sd->sc_data[SC_COMBO].val1_sk() != CH_CHAINCRUSH)))
- {
- if (!sd->state.skill_flag)
- {
- sd->state.skill_flag = 1;
- clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1);
- return;
- }
- else if (sd->bl.id == target_id)
- {
- clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1);
- return;
- }
- }
- }
if ((lv = pc_checkskill(sd, skillnum)) > 0)
{
if (skilllv > lv)
@@ -5153,8 +5081,6 @@ void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd)
nullpo_retv(sd);
- if (map[sd->bl.m].flag.noskill)
- return;
if (sd->npc_id != 0 || sd->state.storage_open)
return;
if (sd->chatID)
@@ -5221,8 +5147,6 @@ void clif_parse_UseSkillMap(int fd, struct map_session_data *sd)
{
nullpo_retv(sd);
- if (map[sd->bl.m].flag.noskill)
- return;
if (sd->chatID)
return;
diff --git a/src/map/map.hpp b/src/map/map.hpp
index 8f534f5..4bd0b4f 100644
--- a/src/map/map.hpp
+++ b/src/map/map.hpp
@@ -582,7 +582,6 @@ struct map_data
unsigned pvp_nocalcrank:1;
unsigned nozenypenalty:1;
unsigned notrade:1;
- unsigned noskill:1;
unsigned nowarp:1;
unsigned nowarpto:1;
unsigned nopvp:1; // [Valaris]
diff --git a/src/map/map.t.hpp b/src/map/map.t.hpp
index b511806..12e7cc0 100644
--- a/src/map/map.t.hpp
+++ b/src/map/map.t.hpp
@@ -16,22 +16,14 @@ enum class Option : uint16_t
// apparently some weaker non-GM hide
HIDE2 = 0x0002,
CLOAK = 0x0004,
- CART1 = 0x0008,
- FALCON = 0x0010,
- RIDING = 0x0020,
// [Fate] This is the GM `@hide' flag
HIDE = 0x0040,
- CART2 = 0x0080,
- CART3 = 0x0100,
- CART4 = 0x0200,
- CART5 = 0x0400,
ORC_HEAD = 0x0800,
// [Fate] Complete invisibility to other clients
INVISIBILITY = 0x1000,
_wedding = 0x1000,
// [Fate] Auto-logging of nearby comments
SCRIBE = 0x2000,
- _ruwach = 0x2000,
CHASEWALK = 0x4000,
sign = 0x8000,
@@ -39,8 +31,7 @@ enum class Option : uint16_t
// ?
REAL_ANY_HIDE = HIDE | CLOAK | HIDE2,
OLD_ANY_HIDE = CHASEWALK | CLOAK | HIDE2,
- CART_MASK = CART1 | CART2 | CART3 | CART4 | CART5,
- MASK = sign | CHASEWALK | _wedding | CART_MASK | RIDING | FALCON,
+ MASK = sign | CHASEWALK | _wedding,
};
enum class Opt1 : uint16_t
{
@@ -72,7 +63,6 @@ enum class Opt3 : uint16_t
_energycoat = 0x0004,
_explosionspirits = 0x0008,
_steelbody = 0x0010,
- _bladestop = 0x0020,
_berserk = 0x0080,
_marionette = 0x0400,
diff --git a/src/map/mob.cpp b/src/map/mob.cpp
index 06026de..e528fd7 100644
--- a/src/map/mob.cpp
+++ b/src/map/mob.cpp
@@ -620,8 +620,6 @@ int mob_can_move(struct mob_data *md)
return 0;
// アンクル中で動けないとか
if (md->sc_data[SC_ANKLE].timer != -1 || //アンクルスネア
- md->sc_data[SC_AUTOCOUNTER].timer != -1 || //オートカウンター
- md->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り
md->sc_data[SC_SPIDERWEB].timer != -1 //スパイダーウェッブ
)
return 0;
@@ -775,12 +773,6 @@ int mob_check_attack(struct mob_data *md)
|| bool(md->option & Option::HIDE2))
return 0;
- if (md->sc_data[SC_AUTOCOUNTER].timer != -1)
- return 0;
-
- if (md->sc_data[SC_BLADESTOP].timer != -1)
- return 0;
-
if ((tbl = map_id2bl(md->target_id)) == NULL)
{
md->target_id = 0;
@@ -1903,8 +1895,7 @@ void mob_ai_sub_hard(struct block_list *bl, unsigned int tick)
// Abnormalities
if ((bool(md->opt1) && md->opt1 != Opt1::_stone6)
- || md->state.state == MS_DELAY
- || md->sc_data[SC_BLADESTOP].timer != -1)
+ || md->state.state == MS_DELAY)
return;
if (!(mode & 0x80) && md->target_id > 0)
@@ -2505,7 +2496,6 @@ int mob_damage(struct block_list *src, struct mob_data *md, int damage,
double tdmg, temp;
struct item item;
PickupFail ret;
- int skill, sp;
nullpo_ret(md); //srcはNULLで呼ばれる場合もあるので、他でチェック
@@ -2682,15 +2672,6 @@ int mob_damage(struct block_list *src, struct mob_data *md, int damage,
if (src && src->type == BL_MOB)
mob_unlocktarget((struct mob_data *) src, tick);
- /* ソウルドレイン */
- if (sd && (skill = pc_checkskill(sd, HW_SOULDRAIN)) > 0)
- {
- sp = (battle_get_lv(&md->bl)) * (65 + 15 * skill) / 100;
- if (sd->status.sp + sp > sd->status.max_sp)
- sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp += sp;
- }
-
// map外に消えた人は計算から除くので
// overkill分は無いけどsumはmax_hpとは違う
@@ -3410,10 +3391,6 @@ void mobskill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_
|| md->sc_data[SC_ROKISWEIL].timer != -1
|| md->sc_data[SC_STEELBODY].timer != -1)
return;
- if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター
- return;
- if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り
- return;
if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク
return;
@@ -3428,23 +3405,6 @@ void mobskill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_
if (md->bl.m != bl->m)
return;
- if (md->skillid == PR_LEXAETERNA)
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
- if (sc_data
- && (sc_data[SC_FREEZE].timer != -1
- || (sc_data[SC_STONE].timer != -1
- && sc_data[SC_STONE].val2 == 0)))
- return;
- }
- else if (md->skillid == RG_BACKSTAP)
- {
- int dir = map_calc_dir(&md->bl, bl->x, bl->y), t_dir =
- battle_get_dir(bl);
- int dist = distance(md->bl.x, md->bl.y, bl->x, bl->y);
- if (bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir, t_dir)))
- return;
- }
if (((skill_get_inf(md->skillid) & 1) || (skill_get_inf2(md->skillid) & 4)) && // 彼我敵対関係チェック
battle_check_target(&md->bl, bl, BCT_ENEMY) <= 0)
return;
@@ -3472,8 +3432,7 @@ void mobskill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_
break;
case 1: // 支援系
if (!mob_db[md->mob_class].skill[md->skillidx].val[0] &&
- (md->skillid == AL_HEAL
- || (md->skillid == ALL_RESURRECTION && bl->type != BL_PC))
+ (md->skillid == AL_HEAL)
&& battle_check_undead(battle_get_race(bl),
battle_get_elem_type(bl)))
skill_castend_damage_id(&md->bl, bl, md->skillid,
@@ -3514,71 +3473,16 @@ void mobskill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data
|| md->sc_data[SC_ROKISWEIL].timer != -1
|| md->sc_data[SC_STEELBODY].timer != -1)
return;
- if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター
- return;
- if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り
- return;
if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク
return;
if (battle_config.monster_skill_reiteration == 0)
{
range = -1;
- switch (md->skillid)
- {
- case MG_SAFETYWALL:
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case PF_SPIDERWEB: /* スパイダーウェッブ */
- range = 0;
- break;
- case AL_PNEUMA:
- case AL_WARP:
- range = 1;
- break;
- }
- if (range >= 0)
- {
- if (skill_check_unit_range(md->bl.m, md->skillx, md->skilly, range, md->skillid) > 0)
- return;
- }
}
if (battle_config.monster_skill_nofootset == 1)
{
range = -1;
- switch (md->skillid)
- {
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case AM_DEMONSTRATION:
- case PF_SPIDERWEB: /* スパイダーウェッブ */
- range = 1;
- break;
- case AL_WARP:
- range = 0;
- break;
- }
- if (range >= 0)
- {
- if (skill_check_unit_range2(md->bl.m, md->skillx, md->skilly, range) > 0)
- return;
- }
}
if (battle_config.monster_land_skill_limit == 1)
@@ -3610,11 +3514,6 @@ void mobskill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data
PRINTF("MOB skill castend skill=%d, mob_class = %d\n",
md->skillid, md->mob_class);
mob_stop_walking(md, 0);
-
- skill_castend_pos2(&md->bl, md->skillx, md->skilly, md->skillid,
- md->skilllv, tick, BCT_ZERO);
-
- return;
}
/*==========================================
@@ -3646,19 +3545,10 @@ int mobskill_use_id(struct mob_data *md, struct block_list *target,
|| md->sc_data[SC_ROKISWEIL].timer != -1
|| md->sc_data[SC_STEELBODY].timer != -1)
return 0;
- if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター
- return 0;
- if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り
- return 0;
if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク
return 0;
- if (bool(md->option & Option::CLOAK)
- && skill_id == TF_HIDING)
- return 0;
- if (bool(md->option & Option::HIDE2)
- && skill_id != TF_HIDING && skill_id != AS_GRIMTOOTH
- && skill_id != RG_BACKSTAP && skill_id != RG_RAID)
+ if (bool(md->option & Option::HIDE2))
return 0;
if (skill_get_inf2(skill_id) & 0x200 && md->bl.id == target->id)
@@ -3678,20 +3568,6 @@ int mobskill_use_id(struct mob_data *md, struct block_list *target,
md->state.skillcastcancel = ms->cancel;
md->skilldelay[skill_idx] = gettick();
- switch (skill_id)
- { /* 何か特殊な処理が必要 */
- case ALL_RESURRECTION: /* リザレクション */
- if (target->type != BL_PC
- && battle_check_undead(battle_get_race(target),
- battle_get_elem_type(target)))
- { /* 敵がアンデッドなら */
- casttime =
- skill_castfix(&md->bl,
- skill_get_cast(PR_TURNUNDEAD, skill_lv));
- }
- break;
- }
-
if (battle_config.mob_skill_log == 1)
PRINTF("MOB skill use target_id=%d skill=%d lv=%d cast=%d, mob_class = %d\n",
target->id, skill_id, skill_lv,
@@ -3708,7 +3584,7 @@ int mobskill_use_id(struct mob_data *md, struct block_list *target,
md->skillidx = skill_idx;
if (!(battle_config.monster_cloak_check_type & 2)
- && md->sc_data[SC_CLOAKING].timer != -1 && md->skillid != AS_CLOAKING)
+ && md->sc_data[SC_CLOAKING].timer != -1)
skill_status_change_end(&md->bl, SC_CLOAKING, -1);
if (casttime > 0)
@@ -3753,10 +3629,6 @@ int mobskill_use_pos(struct mob_data *md,
|| md->sc_data[SC_ROKISWEIL].timer != -1
|| md->sc_data[SC_STEELBODY].timer != -1)
return 0;
- if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター
- return 0;
- if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り
- return 0;
if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク
return 0;
diff --git a/src/map/npc.cpp b/src/map/npc.cpp
index df75216..900a077 100644
--- a/src/map/npc.cpp
+++ b/src/map/npc.cpp
@@ -855,7 +855,7 @@ int npc_buylist(struct map_session_data *sd, int n,
{
struct npc_data *nd;
double z;
- int i, j, w, skill, itemamount = 0, new_stacks = 0;
+ int i, j, w, itemamount = 0, new_stacks = 0;
nullpo_retr(3, sd);
nullpo_retr(3, item_list);
@@ -877,12 +877,7 @@ int npc_buylist(struct map_session_data *sd, int n,
if (nd->u.shop_item[j].nameid == 0)
return 3;
- if (itemdb_value_notdc(nd->u.shop_item[j].nameid))
- z += (double) nd->u.shop_item[j].value * item_list[i * 2];
- else
- z += (double) pc_modifybuyvalue(sd,
- nd->u.shop_item[j].value) *
- item_list[i * 2];
+ z += (double) nd->u.shop_item[j].value * item_list[i * 2];
itemamount += item_list[i * 2];
switch (pc_checkadditem(sd, item_list[i * 2 + 1], item_list[i * 2]))
@@ -943,24 +938,6 @@ int npc_buylist(struct map_session_data *sd, int n,
}
}
- //商人経験値
-/* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) {
- z = z * pc_checkskill(sd,MC_DISCOUNT) / ((1 + 300 / itemamount) * 4000) * battle_config.shop_exp;
- pc_gainexp(sd,0,z);
- }*/
- if (battle_config.shop_exp > 0 && z > 0
- && (skill = pc_checkskill(sd, MC_DISCOUNT)) > 0)
- {
- if (skill > 0)
- {
- z = (log(z * (double) skill) * (double) battle_config.shop_exp /
- 100.);
- if (z < 1)
- z = 1;
- pc_gainexp(sd, 0, (int) z);
- }
- }
-
return 0;
}
@@ -972,7 +949,7 @@ int npc_selllist(struct map_session_data *sd, int n,
const uint16_t *item_list)
{
double z;
- int i, skill, itemamount = 0;
+ int i, itemamount = 0;
nullpo_retr(1, sd);
nullpo_retr(1, item_list);
@@ -991,12 +968,7 @@ int npc_selllist(struct map_session_data *sd, int n,
return 1;
if (sd->trade_partner != 0)
return 2; // cant sell while trading
- if (itemdb_value_notoc(nameid))
- z += (double) itemdb_value_sell(nameid) * item_list[i * 2 + 1];
- else
- z += (double) pc_modifysellvalue(sd,
- itemdb_value_sell(nameid)) *
- item_list[i * 2 + 1];
+ z += (double) itemdb_value_sell(nameid) * item_list[i * 2 + 1];
itemamount += item_list[i * 2 + 1];
}
@@ -1009,24 +981,6 @@ int npc_selllist(struct map_session_data *sd, int n,
pc_delitem(sd, item_id, item_list[i * 2 + 1], 0);
}
- //商人経験値
-/* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) {
- z = z * pc_checkskill(sd,MC_OVERCHARGE) / ((1 + 500 / itemamount) * 4000) * battle_config.shop_exp ;
- pc_gainexp(sd,0,z);
- }*/
- if (battle_config.shop_exp > 0 && z > 0
- && (skill = pc_checkskill(sd, MC_OVERCHARGE)) > 0)
- {
- if (skill > 0)
- {
- z = (log(z * (double) skill) * (double) battle_config.shop_exp /
- 100.);
- if (z < 1)
- z = 1;
- pc_gainexp(sd, 0, (int) z);
- }
- }
-
return 0;
}
@@ -1926,10 +1880,6 @@ int npc_parse_mapflag(char *w1, char *, char *w3, char *w4)
{
map[m].flag.notrade = 1;
}
- else if (strcasecmp(w3, "noskill") == 0)
- {
- map[m].flag.noskill = 1;
- }
else if (battle_config.pk_mode && strcasecmp(w3, "nopvp") == 0)
{ // nopvp for pk mode [Valaris]
map[m].flag.nopvp = 1;
diff --git a/src/map/pc.cpp b/src/map/pc.cpp
index 68dc50b..6961f47 100644
--- a/src/map/pc.cpp
+++ b/src/map/pc.cpp
@@ -546,8 +546,7 @@ EPOS pc_equippoint(struct map_session_data *sd, int n)
|| sd->inventory_data[n]->look == 2
|| sd->inventory_data[n]->look == 6)
&& (ep == EPOS::WEAPON
- && (pc_checkskill(sd, AS_LEFT) > 0
- || s_class.job == 12)))
+ && (s_class.job == 12)))
{
return EPOS::SHIELD | EPOS::WEAPON;
}
@@ -1146,39 +1145,6 @@ int pc_calc_skilltree(struct map_session_data *sd)
}
}
- /*Comment this out for now, as we manage skills differently
- * for (i=0;i<MAX_SKILL;i++)
- * if (i < TMW_MAGIC || i > TMW_MAGIC_END){ // [Fate] This hack gets TMW magic working and persisted without bothering about the skill tree.
- * if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0;
- * if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardスキルなら、
- * sd->status.skill[i].lv= (sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // 本当のlvに
- * sd->status.skill[i].flag=0; // flagは0にしておく
- * }
- * }
- */
-
- if (battle_config.gm_allskill > 0
- && pc_isGM(sd) >= battle_config.gm_allskill)
- {
- // 全てのスキル
-
- // Restoring oritinal values
- // This one is probably more correct than the copypasta
- for (SkillID i : erange(NV_EMOTE, NPC_PIERCINGATT))
- sd->status.skill[i].id = i;
- for (SkillID i : erange(RG_SNATCHER, SA_MONOCELL))
- sd->status.skill[i].id = i;
- for (SkillID i : erange(BD_ADAPTATION, SkillID(uint16_t(WE_CALLPARTNER) + 1)))
- sd->status.skill[i].id = i;
- if (battle_config.enable_upper_class)
- {
- //confで無効でなければ読み込む
- for (SkillID i : erange(LK_AURABLADE, MAX_SKILL))
- sd->status.skill[i].id = i;
- }
-
- }
- else
{
// 通常の計算
do
@@ -1281,7 +1247,7 @@ int pc_calcstatus(struct map_session_data *sd, int first)
int b_base_atk;
earray<struct skill, SkillID, MAX_SKILL> b_skill;
int bl, index;
- int skill, aspd_rate, wele, wele_, def_ele, refinedef = 0;
+ int aspd_rate, wele, wele_, def_ele, refinedef = 0;
int str, dstr, dex;
struct pc_base_job s_class;
@@ -1711,17 +1677,6 @@ int pc_calcstatus(struct map_session_data *sd, int first)
sd->atkmods_[1] = atkmods[1][sd->weapontype2];
sd->atkmods_[2] = atkmods[2][sd->weapontype2];
-/*
- // jobボーナス分
- for (i=0;i<sd->status.job_level && i<MAX_LEVEL;i++){
- if (job_bonus[s_class.upper][s_class.job][i])
- sd->paramb[job_bonus[s_class.upper][s_class.job][i]-1]++;
- }
-*/
-
- if ((skill = pc_checkskill(sd, MC_INCCARRY)) > 0) // skill can be used with an item now, thanks to orn [Valaris]
- sd->max_weight += skill * 1000;
-
// ステータス変化による基本パラメータ補正
if (sd->sc_count)
{
@@ -1891,28 +1846,13 @@ int pc_calcstatus(struct map_session_data *sd, int first)
//攻撃速度増加
- if ((skill = pc_checkskill(sd, AC_VULTURE)) > 0)
- { // ワシの目
- sd->hit += skill;
- if (sd->status.weapon == 11)
- sd->attackrange += skill;
- }
-
if (sd->attackrange > 2)
- { // [fate] ranged weapon?
+ {
+ // [fate] ranged weapon?
sd->attackrange += min(skill_power(sd, AC_OWL) / 60, 3);
sd->hit += skill_power(sd, AC_OWL) / 10; // 20 for 200
}
- if ((skill = pc_checkskill(sd, BS_WEAPONRESEARCH)) > 0) // 武器研究の命中率増加
- sd->hit += skill * 2;
- if (bool(sd->status.option & Option::HIDE2)
- && (skill = pc_checkskill(sd, RG_TUNNELDRIVE)) > 0) // トンネルドライブ
- sd->speed += (1.2 * DEFAULT_WALK_SPEED - skill * 9);
- if (pc_iscarton(sd) && (skill = pc_checkskill(sd, MC_PUSHCART)) > 0) // カートによる速度低下
- sd->speed += (10 - skill) * (DEFAULT_WALK_SPEED * 0.1);
- else if (pc_isriding(sd)) // ペコペコ乗りによる速度増加
- sd->speed -= (0.25 * DEFAULT_WALK_SPEED);
sd->max_weight += 1000;
if (sd->sc_count)
{
@@ -1927,14 +1867,6 @@ int pc_calcstatus(struct map_session_data *sd, int first)
sd->speed = 2 * DEFAULT_WALK_SPEED;
}
- if ((skill = pc_checkskill(sd, CR_TRUST)) > 0)
- { // フェイス
- sd->status.max_hp += skill * 200;
- sd->subele[6] += skill * 5;
- }
- if ((skill = pc_checkskill(sd, BS_SKINTEMPER)) > 0)
- sd->subele[3] += skill * 4;
-
bl = sd->status.base_level;
sd->status.max_hp += (
@@ -1976,42 +1908,16 @@ int pc_calcstatus(struct map_session_data *sd, int first)
if (sd->sprate != 100)
sd->status.max_sp = sd->status.max_sp * sd->sprate / 100;
- if ((skill = pc_checkskill(sd, HP_MEDITATIO)) > 0) // メディテイティオ
- sd->status.max_sp += sd->status.max_sp * skill / 100;
- if ((skill = pc_checkskill(sd, HW_SOULDRAIN)) > 0) // ソウルドレイン
- sd->status.max_sp += sd->status.max_sp * 2 * skill / 100;
-
if (sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
sd->status.max_sp = battle_config.max_sp;
//自然回復HP
sd->nhealhp = 1 + (sd->paramc[ATTR::VIT] / 5) + (sd->status.max_hp / 200);
- if ((skill = pc_checkskill(sd, SM_RECOVERY)) > 0)
- { // HP回復力向上
- sd->nshealhp = skill * 5 + (sd->status.max_hp * skill / 500);
- if (sd->nshealhp > 0x7fff)
- sd->nshealhp = 0x7fff;
- }
//自然回復SP
sd->nhealsp = 1 + (sd->paramc[ATTR::INT] / 6) + (sd->status.max_sp / 100);
if (sd->paramc[ATTR::INT] >= 120)
sd->nhealsp += ((sd->paramc[ATTR::INT] - 120) >> 1) + 4;
- if ((skill = pc_checkskill(sd, MG_SRECOVERY)) > 0)
- { // SP回復力向上
- sd->nshealsp = skill * 3 + (sd->status.max_sp * skill / 500);
- if (sd->nshealsp > 0x7fff)
- sd->nshealsp = 0x7fff;
- }
- if ((skill = pc_checkskill(sd, MO_SPIRITSRECOVERY)) > 0)
- {
- sd->nsshealhp = skill * 4 + (sd->status.max_hp * skill / 500);
- sd->nsshealsp = skill * 2 + (sd->status.max_sp * skill / 500);
- if (sd->nsshealhp > 0x7fff)
- sd->nsshealhp = 0x7fff;
- if (sd->nsshealsp > 0x7fff)
- sd->nsshealsp = 0x7fff;
- }
if (sd->hprecov_rate != 100)
{
sd->nhealhp = sd->nhealhp * sd->hprecov_rate / 100;
@@ -2024,40 +1930,6 @@ int pc_calcstatus(struct map_session_data *sd, int first)
if (sd->nhealsp < 1)
sd->nhealsp = 1;
}
- if ((skill = pc_checkskill(sd, HP_MEDITATIO)) > 0)
- { // メディテイティオはSPRではなく自然回復にかかる
- sd->nhealsp += 3 * skill * (sd->status.max_sp) / 100;
- if (sd->nhealsp > 0x7fff)
- sd->nhealsp = 0x7fff;
- }
-
- // 種族耐性(これでいいの? ディバインプロテクションと同じ処理がいるかも)
- if ((skill = pc_checkskill(sd, SA_DRAGONOLOGY)) > 0)
- { // ドラゴノロジー
- skill = skill * 4;
- sd->addrace[9] += skill;
- sd->addrace_[9] += skill;
- sd->subrace[9] += skill;
- sd->magic_addrace[9] += skill;
- sd->magic_subrace[9] -= skill;
- }
-
- //Flee上昇
- if ((skill = pc_checkskill(sd, TF_MISS)) > 0)
- { // 回避率増加
- if (sd->status.pc_class == 6 || sd->status.pc_class == 4007
- || sd->status.pc_class == 23)
- {
- sd->flee += skill * 3;
- }
- if (sd->status.pc_class == 12 || sd->status.pc_class == 17
- || sd->status.pc_class == 4013 || sd->status.pc_class == 4018)
- sd->flee += skill * 4;
- if (sd->status.pc_class == 12 || sd->status.pc_class == 4013)
- sd->speed -= sd->speed * (skill * .5) / 100;
- }
- if ((skill = pc_checkskill(sd, MO_DODGE)) > 0) // 見切り
- sd->flee += (skill * 3) >> 1;
// スキルやステータス異常による残りのパラメータ補正
if (sd->sc_count)
@@ -2374,11 +2246,6 @@ int pc_calcstatus(struct map_session_data *sd, int first)
sd->speed = 1;
if (aspd_rate != 100)
sd->aspd = sd->aspd * aspd_rate / 100;
- if (pc_isriding(sd)) // 騎兵修練
- sd->aspd =
- sd->aspd * (100 +
- 10 * (5 -
- pc_checkskill(sd, KN_CAVALIERMASTERY))) / 100;
if (sd->attack_spell_override)
sd->aspd = sd->attack_spell_delay;
@@ -2389,11 +2256,6 @@ int pc_calcstatus(struct map_session_data *sd, int first)
sd->dmotion = 800 - sd->paramc[ATTR::AGI] * 4;
if (sd->dmotion < 400)
sd->dmotion = 400;
- if (sd->skilltimer != -1 && (skill = pc_checkskill(sd, SA_FREECAST)) > 0)
- {
- sd->prev_speed = sd->speed;
- sd->speed = sd->speed * (175 - skill * 5) / 100;
- }
if (sd->status.hp > sd->status.max_hp)
sd->status.hp = sd->status.max_hp;
@@ -2474,17 +2336,6 @@ int pc_calcstatus(struct map_session_data *sd, int first)
if (b_sp != sd->status.sp)
clif_updatestatus(sd, SP_SP);
-/* if (before.cart_num != before.cart_num || before.cart_max_num != before.cart_max_num ||
- before.cart_weight != before.cart_weight || before.cart_max_weight != before.cart_max_weight )
- clif_updatestatus(sd,SP_CARTINFO);*/
-
- if (sd->status.hp < sd->status.max_hp >> 2
- && pc_checkskill(sd, SM_AUTOBERSERK) > 0
- && (sd->sc_data[SC_PROVOKE].timer == -1
- || sd->sc_data[SC_PROVOKE].val2 == 0) && !pc_isdead(sd))
- // オートバーサーク発動
- skill_status_change_start(&sd->bl, SC_PROVOKE, 10, 1, 0, 0, 0, 0);
-
return 0;
}
@@ -2862,12 +2713,6 @@ int pc_bonus(struct map_session_data *sd, SP type, int val)
case SP_DISGUISE: // Disguise script for items [Valaris]
if (sd->state.lr_flag != 2 && sd->disguiseflag == 0)
{
- if (pc_isriding(sd))
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(sd->fd,
- "Cannot wear disguise when riding a Peco.");
- break;
- }
sd->disguise = val;
clif_clearchar(&sd->bl, 9);
pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
@@ -3195,51 +3040,6 @@ int pc_skill(struct map_session_data *sd, SkillID id, int level, int flag)
return 0;
}
-//
-// アイテム物
-//
-
-/*==========================================
- * スキルによる買い値修正
- *------------------------------------------
- */
-int pc_modifybuyvalue(struct map_session_data *sd, int orig_value)
-{
- int skill, val = orig_value, rate1 = 0, rate2 = 0;
- if ((skill = pc_checkskill(sd, MC_DISCOUNT)) > 0) // ディスカウント
- rate1 = 5 + skill * 2 - ((skill == 10) ? 1 : 0);
- if ((skill = pc_checkskill(sd, RG_COMPULSION)) > 0) // コムパルションディスカウント
- rate2 = 5 + skill * 4;
- if (rate1 < rate2)
- rate1 = rate2;
- if (rate1)
- val = (int)((double) orig_value * (double)(100 - rate1) / 100.);
- if (val < 0)
- val = 0;
- if (orig_value > 0 && val < 1)
- val = 1;
-
- return val;
-}
-
-/*==========================================
- * スキルによる売り値修正
- *------------------------------------------
- */
-int pc_modifysellvalue(struct map_session_data *sd, int orig_value)
-{
- int skill, val = orig_value, rate = 0;
- if ((skill = pc_checkskill(sd, MC_OVERCHARGE)) > 0) // オーバーチャージ
- rate = 5 + skill * 2 - ((skill == 10) ? 1 : 0);
- if (rate)
- val = (int)((double) orig_value * (double)(100 + rate) / 100.);
- if (val < 0)
- val = 0;
- if (orig_value > 0 && val < 1)
- val = 1;
-
- return val;
-}
/*==========================================
* アイテムを買った時に、新しいアイテム欄を使うか、
@@ -3759,8 +3559,7 @@ int pc_steal_item(struct map_session_data *sd, struct block_list *bl)
md->sc_data[SC_FREEZE].timer == -1 &&
(!(md->mob_class > 1324 && md->mob_class < 1364))) // prevent stealing from treasure boxes [Valaris]
{
- skill = sd->paramc[ATTR::DEX] - mob_db[md->mob_class].attrs[ATTR::DEX]
- + pc_checkskill(sd, TF_STEAL) + 10;
+ skill = sd->paramc[ATTR::DEX] - mob_db[md->mob_class].attrs[ATTR::DEX] + 10;
if (0 < skill)
{
@@ -3825,10 +3624,9 @@ int pc_steal_coin(struct map_session_data *sd, struct block_list *bl)
&& md->sc_data[SC_STONE].timer == -1
&& md->sc_data[SC_FREEZE].timer == -1)
{
- skill = pc_checkskill(sd, RG_STEALCOIN) * 10;
- rate =
- skill + (sd->status.base_level - mob_db[md->mob_class].lv) * 3 +
- sd->paramc[ATTR::DEX] * 2 + sd->paramc[ATTR::LUK] * 2;
+ skill = 0;
+ rate = (sd->status.base_level - mob_db[md->mob_class].lv) * 3
+ + sd->paramc[ATTR::DEX] * 2 + sd->paramc[ATTR::LUK] * 2;
if (MRAND(1000) < rate)
{
pc_getzeny(sd, mob_db[md->mob_class].lv * 10 + MRAND(100));
@@ -3884,8 +3682,6 @@ int pc_setpos(struct map_session_data *sd, const char *mapname_org, int x, int y
skill_status_change_end(&sd->bl, SC_CLOAKING, -1);
if (bool(sd->status.option & (Option::CHASEWALK | Option::HIDE2)))
skill_status_change_end(&sd->bl, SC_CHASEWALK, -1);
- if (sd->sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end(&sd->bl, SC_BLADESTOP, -1);
if (sd->sc_data[SC_DANCING].timer != -1) // clear dance effect when warping [Valaris]
skill_stop_dancing(&sd->bl, 0);
@@ -4397,38 +4193,32 @@ int pc_checkallowskill(struct map_session_data *sd)
{
nullpo_ret(sd);
- if (!(skill_get_weapontype(KN_TWOHANDQUICKEN) & (1 << sd->status.weapon))
- && sd->sc_data[SC_TWOHANDQUICKEN].timer != -1)
+ if (sd->sc_data[SC_TWOHANDQUICKEN].timer != -1)
{ // 2HQ
skill_status_change_end(&sd->bl, SC_TWOHANDQUICKEN, -1); // 2HQを解除
return -1;
}
- if (!(skill_get_weapontype(LK_AURABLADE) & (1 << sd->status.weapon))
- && sd->sc_data[SC_AURABLADE].timer != -1)
+ if (sd->sc_data[SC_AURABLADE].timer != -1)
{ // オーラブレード
skill_status_change_end(&sd->bl, SC_AURABLADE, -1); // オーラブレードを解除
return -1;
}
- if (!(skill_get_weapontype(LK_PARRYING) & (1 << sd->status.weapon))
- && sd->sc_data[SC_PARRYING].timer != -1)
+ if (sd->sc_data[SC_PARRYING].timer != -1)
{ // パリイング
skill_status_change_end(&sd->bl, SC_PARRYING, -1); // パリイングを解除
return -1;
}
- if (!(skill_get_weapontype(LK_CONCENTRATION) & (1 << sd->status.weapon))
- && sd->sc_data[SC_CONCENTRATION].timer != -1)
+ if (sd->sc_data[SC_CONCENTRATION].timer != -1)
{ // コンセントレーション
skill_status_change_end(&sd->bl, SC_CONCENTRATION, -1); // コンセントレーションを解除
return -1;
}
- if (!(skill_get_weapontype(CR_SPEARQUICKEN) & (1 << sd->status.weapon))
- && sd->sc_data[SC_SPEARSQUICKEN].timer != -1)
+ if (sd->sc_data[SC_SPEARSQUICKEN].timer != -1)
{ // スピアクィッケン
skill_status_change_end(&sd->bl, SC_SPEARSQUICKEN, -1); // スピアクイッケンを解除
return -1;
}
- if (!(skill_get_weapontype(BS_ADRENALINE) & (1 << sd->status.weapon))
- && sd->sc_data[SC_ADRENALINE].timer != -1)
+ if (sd->sc_data[SC_ADRENALINE].timer != -1)
{ // アドレナリンラッシュ
skill_status_change_end(&sd->bl, SC_ADRENALINE, -1); // アドレナリンラッシュを解除
return -1;
@@ -4533,7 +4323,7 @@ void pc_attack_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
struct map_session_data *sd;
struct block_list *bl;
eptr<struct status_change, StatusChange> sc_data;
- int dist, skill, range;
+ int dist, range;
int attack_spell_delay;
sd = map_id2sd(id);
@@ -4567,11 +4357,6 @@ void pc_attack_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
|| bool(sd->status.option & (Option::OLD_ANY_HIDE)))
return;
- if (sd->sc_data[SC_AUTOCOUNTER].timer != -1)
- return;
- if (sd->sc_data[SC_BLADESTOP].timer != -1)
- return;
-
Option *opt = battle_get_option(bl);
if (opt != NULL && bool(*opt & Option::REAL_ANY_HIDE))
return;
@@ -4581,11 +4366,10 @@ void pc_attack_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
&& sc_data[SC_BASILICA].timer != -1))
return;
- if (sd->skilltimer != -1 && pc_checkskill(sd, SA_FREECAST) <= 0)
+ if (sd->skilltimer != -1)
return;
- if (!battle_config.sdelay_attack_enable
- && pc_checkskill(sd, SA_FREECAST) <= 0)
+ if (!battle_config.sdelay_attack_enable)
{
if (DIFF_TICK(tick, sd->canact_tick) < 0)
{
@@ -4636,7 +4420,6 @@ void pc_attack_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
if (sd->walktimer != -1)
pc_stop_walking(sd, 1);
- if (sd->sc_data[SC_COMBO].timer == -1)
{
map_freeblock_lock();
pc_stop_walking(sd, 0);
@@ -4646,19 +4429,7 @@ void pc_attack_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
&& sd->sc_data[SC_CLOAKING].timer != -1)
skill_status_change_end(&sd->bl, SC_CLOAKING, -1);
map_freeblock_unlock();
- if (sd->skilltimer != -1 && (skill = pc_checkskill(sd, SA_FREECAST)) > 0) // フリーキャスト
- sd->attackabletime =
- tick + ((sd->aspd << 1) * (150 - skill * 5) / 100);
- else
- sd->attackabletime = tick + (sd->aspd << 1);
- }
- else if (sd->attackabletime <= tick)
- {
- if (sd->skilltimer != -1 && (skill = pc_checkskill(sd, SA_FREECAST)) > 0) // フリーキャスト
- sd->attackabletime =
- tick + ((sd->aspd << 1) * (150 - skill * 5) / 100);
- else
- sd->attackabletime = tick + (sd->aspd << 1);
+ sd->attackabletime = tick + (sd->aspd << 1);
}
if (sd->attackabletime <= tick)
sd->attackabletime = tick + (battle_config.max_aspd << 1);
@@ -4744,8 +4515,6 @@ int pc_checkbaselevelup(struct map_session_data *sd)
if (sd->status.base_exp >= next && next > 0)
{
- struct pc_base_job s_class = pc_calc_base_job(sd->status.pc_class);
-
// base側レベルアップ処理
sd->status.base_exp -= next;
@@ -4757,30 +4526,6 @@ int pc_checkbaselevelup(struct map_session_data *sd)
pc_calcstatus(sd, 0);
pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
- //スパノビはキリエ、イムポ、マニピ、グロ、サフラLv1がかかる
- if (s_class.job == 23)
- {
- skill_status_change_start(&sd->bl,
- SkillStatusChangeTable[PR_KYRIE], 1, 0,
- 0, 0, skill_get_time(PR_KYRIE, 1), 0);
- skill_status_change_start(&sd->bl,
- SkillStatusChangeTable[PR_IMPOSITIO],
- 1, 0, 0, 0,
- skill_get_time(PR_IMPOSITIO, 1), 0);
- skill_status_change_start(&sd->bl,
- SkillStatusChangeTable[PR_MAGNIFICAT],
- 1, 0, 0, 0,
- skill_get_time(PR_MAGNIFICAT, 1), 0);
- skill_status_change_start(&sd->bl,
- SkillStatusChangeTable[PR_GLORIA], 1,
- 0, 0, 0, skill_get_time(PR_GLORIA, 1),
- 0);
- skill_status_change_start(&sd->bl,
- SkillStatusChangeTable[PR_SUFFRAGIUM],
- 1, 0, 0, 0,
- skill_get_time(PR_SUFFRAGIUM, 1), 0);
- }
-
clif_misceffect(&sd->bl, 0);
//レベルアップしたのでパーティー情報を更新する
//(公平範囲チェック)
@@ -5193,23 +4938,6 @@ int pc_allskillup(struct map_session_data *sd)
for (SkillID i : erange(SkillID(), MAX_SKILL))
sd->status.skill[i].id = SkillID::ZERO;
- if (battle_config.gm_allskill > 0
- && pc_isGM(sd) >= battle_config.gm_allskill)
- {
- // 全てのスキル
-
- // Note: I restored to the original value, not the new ones.
- // However, I left the MAX_SKILL, which was wrong and is fixed.
- for (SkillID i : erange(NV_EMOTE, NPC_PIERCINGATT))
- sd->status.skill[i].lv = skill_get_max(i);
- // Skip NPC_*
- for (SkillID i : erange(RG_SNATCHER, SA_MONOCELL))
- sd->status.skill[i].lv = skill_get_max(i);
- // Not sure why these few are skipped though
- for (SkillID i : erange(BD_ADAPTATION, MAX_SKILL))
- sd->status.skill[i].lv = skill_get_max(i);
- }
- else
{
SkillID id;
for (int i = 0;
@@ -5431,14 +5159,6 @@ int pc_damage(struct block_list *src, struct map_session_data *sd,
// まだ生きているならHP更新
clif_updatestatus(sd, SP_HP);
- if (sd->status.hp < sd->status.max_hp >> 2
- && pc_checkskill(sd, SM_AUTOBERSERK) > 0
- && (sd->sc_data[SC_PROVOKE].timer == -1
- || sd->sc_data[SC_PROVOKE].val2 == 0))
- // オートバーサーク発動
- skill_status_change_start(&sd->bl, SC_PROVOKE, 10, 1, 0, 0, 0,
- 0);
-
sd->canlog_tick = gettick();
if (sd->status.party_id > 0)
@@ -5467,8 +5187,6 @@ int pc_damage(struct block_list *src, struct map_session_data *sd,
skill_castcancel(&sd->bl, 0); // 詠唱の中止
clif_clearchar_area(&sd->bl, 1);
skill_unit_out_all(&sd->bl, gettick(), 1);
- if (sd->sc_data[SC_BLADESTOP].timer != -1) //白刃は事前に解除
- skill_status_change_end(&sd->bl, SC_BLADESTOP, -1);
pc_setglobalreg(sd, "PC_DIE_COUNTER", ++sd->die_counter); //死にカウンター書き込み
skill_status_change_clear(&sd->bl, 0); // ステータス異常を解除する
clif_updatestatus(sd, SP_HP);
@@ -5994,10 +5712,6 @@ int pc_itemheal(struct map_session_data *sd, int hp, int sp)
static
int pc_itemheal_effect(struct map_session_data *sd, int hp, int sp)
{
- int bonus;
-// if(battle_config.battle_log)
-// PRINTF("heal %d %d\n",hp,sp);
-
nullpo_ret(sd);
if (sd->sc_data[SC_GOSPEL].timer != -1) //バーサーク中は回復させないらしい
@@ -6022,24 +5736,13 @@ int pc_itemheal_effect(struct map_session_data *sd, int hp, int sp)
}
if (hp > 0)
{
- bonus =
- (sd->paramc[ATTR::VIT] << 1) + 100 + pc_checkskill(sd, SM_RECOVERY) * 10;
- if (bonus != 100)
- hp = hp * bonus / 100;
- bonus = 100 + pc_checkskill(sd, AM_LEARNINGPOTION) * 5;
- if (bonus != 100)
- hp = hp * bonus / 100;
+ int bonus = (sd->paramc[ATTR::VIT] << 1) + 100;
+ hp = hp * bonus / 100;
}
if (sp > 0)
{
- bonus =
- (sd->paramc[ATTR::INT] << 1) + 100 + pc_checkskill(sd,
- MG_SRECOVERY) * 10;
- if (bonus != 100)
- sp = sp * bonus / 100;
- bonus = 100 + pc_checkskill(sd, AM_LEARNINGPOTION) * 5;
- if (bonus != 100)
- sp = sp * bonus / 100;
+ int bonus = (sd->paramc[ATTR::INT] << 1) + 100;
+ sp = sp * bonus / 100;
}
if (hp + sd->status.hp > sd->status.max_hp)
hp = sd->status.max_hp - sd->status.hp;
@@ -6216,14 +5919,6 @@ int pc_jobchange(struct map_session_data *sd, int job, int upper)
pc_equiplookall(sd);
clif_equiplist(sd);
- if (pc_isriding(sd))
- { // remove peco status if changing into invalid class [Valaris]
- if (!(pc_checkskill(sd, KN_RIDING)))
- pc_setoption(sd, sd->status.option);
- if (pc_checkskill(sd, KN_RIDING) > 0)
- pc_setriding(sd);
- }
-
return 0;
}
@@ -6304,80 +5999,6 @@ int pc_setoption(struct map_session_data *sd, Option type)
}
/*==========================================
- * カート設定
- *------------------------------------------
- */
-int pc_setcart(struct map_session_data *sd, int type)
-{
- Option cart[6] = {Option::ZERO, Option::CART1, Option::CART2,
- Option::CART3, Option::CART4, Option::CART5};
-
- nullpo_ret(sd);
-
- if (pc_checkskill(sd, MC_PUSHCART) > 0)
- { // プッシュカートスキル所持
- if (!pc_iscarton(sd))
- { // カートを付けていない
- pc_setoption(sd, cart[type]);
- clif_status_change(&sd->bl, StatusChange::CART, 0);
- }
- else
- {
- pc_setoption(sd, cart[type]);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * 鷹設定
- *------------------------------------------
- */
-int pc_setfalcon(struct map_session_data *sd)
-{
- if (pc_checkskill(sd, HT_FALCON) > 0)
- { // ファルコンマスタリースキル所持
- pc_setoption(sd, sd->status.option | Option::FALCON);
- }
-
- return 0;
-}
-
-/*==========================================
- * ペコペコ設定
- *------------------------------------------
- */
-int pc_setriding(struct map_session_data *sd)
-{
- if (sd->disguise > 0)
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(sd->fd,
- "Cannot mount a Peco while in disguise.");
- return 0;
- }
-
- if ((pc_checkskill(sd, KN_RIDING) > 0))
- { // ライディングスキル所持
- pc_setoption(sd, sd->status.option | Option::RIDING);
-
- if (sd->status.pc_class == 7)
- sd->status.pc_class = sd->view_class = 13;
-
- if (sd->status.pc_class == 14)
- sd->status.pc_class = sd->view_class = 21;
-
- if (sd->status.pc_class == 4008)
- sd->status.pc_class = sd->view_class = 4014;
-
- if (sd->status.pc_class == 4015)
- sd->status.pc_class = sd->view_class = 4022;
- }
-
- return 0;
-}
-
-/*==========================================
* script用変数の値を読む
*------------------------------------------
*/
@@ -6678,15 +6299,13 @@ int pc_setaccountreg2(struct map_session_data *sd, const char *reg, int val)
* 精錬成功率
*------------------------------------------
*/
-int pc_percentrefinery(struct map_session_data *sd, struct item *item)
+int pc_percentrefinery(struct map_session_data *, struct item *item)
{
int percent;
nullpo_ret(item);
percent = percentrefinery[itemdb_wlv(item->nameid)][(int) item->refine];
- percent += pc_checkskill(sd, BS_WEAPONRESEARCH); // 武器研究スキル所持
-
// 確率の有効範囲チェック
if (percent > 100)
{
@@ -6898,7 +6517,7 @@ int pc_equipitem(struct map_session_data *sd, int n, EPOS)
// 二刀流処理
if ((pos == (EPOS::SHIELD | EPOS::WEAPON)) // 一応、装備要求箇所が二刀流武器かチェックする
&& (id->equip == EPOS::WEAPON) // 単 手武器
- && (pc_checkskill(sd, AS_LEFT) > 0 || sd->status.pc_class == 12)) // 左手修錬有
+ && (sd->status.pc_class == 12)) // 左手修錬有
{
EPOS tpos = EPOS::ZERO;
if (sd->equip_index[EQUIP::SHIELD] >= 0)
@@ -7447,7 +7066,7 @@ static
int pc_natural_heal_hp(struct map_session_data *sd)
{
int bhp;
- int inc_num, bonus, skill, hp_flag;
+ int inc_num, bonus, skill;
nullpo_ret(sd);
@@ -7461,8 +7080,6 @@ int pc_natural_heal_hp(struct map_session_data *sd)
}
bhp = sd->status.hp;
- hp_flag = (pc_checkskill(sd, SM_MOVINGRECOVERY) > 0
- && sd->walktimer != -1);
if (sd->walktimer == -1)
{
@@ -7478,12 +7095,6 @@ int pc_natural_heal_hp(struct map_session_data *sd)
sd->inchealhptick += natural_heal_diff_tick;
}
}
- else if (hp_flag)
- {
- inc_num = pc_hpheal(sd);
- sd->hp_sub += inc_num;
- sd->inchealhptick = 0;
- }
else
{
sd->hp_sub = sd->inchealhptick = 0;
@@ -7493,12 +7104,6 @@ int pc_natural_heal_hp(struct map_session_data *sd)
if (sd->hp_sub >= battle_config.natural_healhp_interval)
{
bonus = sd->nhealhp;
- if (hp_flag)
- {
- bonus >>= 2;
- if (bonus <= 0)
- bonus = 1;
- }
while (sd->hp_sub >= battle_config.natural_healhp_interval)
{
sd->hp_sub -= battle_config.natural_healhp_interval;
@@ -7645,108 +7250,6 @@ int pc_natural_heal_sp(struct map_session_data *sd)
return 0;
}
-static
-int pc_spirit_heal_hp(struct map_session_data *sd, int)
-{
- int bonus_hp, interval = battle_config.natural_heal_skill_interval;
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(&sd->bl);
-
- nullpo_ret(sd);
-
- if (pc_checkoverhp(sd))
- {
- sd->inchealspirithptick = 0;
- return 0;
- }
-
- sd->inchealspirithptick += natural_heal_diff_tick;
-
- if (sd->weight * 100 / sd->max_weight >=
- battle_config.natural_heal_weight_rate
- && sc_data[SC_FLYING_BACKPACK].timer == -1)
- interval += interval;
-
- if (sd->inchealspirithptick >= interval)
- {
- bonus_hp = sd->nsshealhp;
- while (sd->inchealspirithptick >= interval)
- {
- if (pc_issit(sd))
- {
- sd->inchealspirithptick -= interval;
- if (sd->status.hp < sd->status.max_hp)
- {
- if (sd->status.hp + bonus_hp <= sd->status.max_hp)
- sd->status.hp += bonus_hp;
- else
- {
- bonus_hp = sd->status.max_hp - sd->status.hp;
- sd->status.hp = sd->status.max_hp;
- }
- sd->inchealspirithptick = 0;
- }
- }
- else
- {
- sd->inchealspirithptick -= natural_heal_diff_tick;
- break;
- }
- }
- }
-
- return 0;
-}
-
-static
-int pc_spirit_heal_sp(struct map_session_data *sd, int)
-{
- int bonus_sp, interval = battle_config.natural_heal_skill_interval;
-
- nullpo_ret(sd);
-
- if (pc_checkoversp(sd))
- {
- sd->inchealspiritsptick = 0;
- return 0;
- }
-
- sd->inchealspiritsptick += natural_heal_diff_tick;
-
- if (sd->weight * 100 / sd->max_weight >=
- battle_config.natural_heal_weight_rate)
- interval += interval;
-
- if (sd->inchealspiritsptick >= interval)
- {
- bonus_sp = sd->nsshealsp;
- while (sd->inchealspiritsptick >= interval)
- {
- if (pc_issit(sd))
- {
- sd->inchealspiritsptick -= interval;
- if (sd->status.sp < sd->status.max_sp)
- {
- if (sd->status.sp + bonus_sp <= sd->status.max_sp)
- sd->status.sp += bonus_sp;
- else
- {
- bonus_sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp = sd->status.max_sp;
- }
- sd->inchealspiritsptick = 0;
- }
- }
- else
- {
- sd->inchealspiritsptick -= natural_heal_diff_tick;
- break;
- }
- }
- }
-
- return 0;
-}
-
/*==========================================
* HP/SP 自然回復 各クライアント
*------------------------------------------
@@ -7775,8 +7278,6 @@ int pc_quickregenerate_effect(struct quick_regeneration *quick_regen,
static
void pc_natural_heal_sub(struct map_session_data *sd)
{
- int skill;
-
nullpo_retv(sd);
if (sd->heal_xp > 0)
@@ -7835,18 +7336,8 @@ void pc_natural_heal_sub(struct map_session_data *sd)
sd->hp_sub = sd->inchealhptick = 0;
sd->sp_sub = sd->inchealsptick = 0;
}
- if ((skill = pc_checkskill(sd, MO_SPIRITSRECOVERY)) > 0
- && !pc_ishiding(sd) && sd->sc_data[SC_POISON].timer == -1
- && sd->sc_data[SC_BERSERK].timer == -1)
- {
- pc_spirit_heal_hp(sd, skill);
- pc_spirit_heal_sp(sd, skill);
- }
- else
- {
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
- }
+ sd->inchealspirithptick = 0;
+ sd->inchealspiritsptick = 0;
}
/*==========================================
diff --git a/src/map/pc.hpp b/src/map/pc.hpp
index 6f0c4e8..83c3309 100644
--- a/src/map/pc.hpp
+++ b/src/map/pc.hpp
@@ -37,21 +37,6 @@ bool pc_ishiding(struct map_session_data *sd)
return bool(sd->status.option & Option::OLD_ANY_HIDE);
}
inline
-bool pc_iscarton(struct map_session_data *sd)
-{
- return bool(sd->status.option & Option::CART_MASK);
-}
-inline
-bool pc_isfalcon(struct map_session_data *sd)
-{
- return bool(sd->status.option & Option::FALCON);
-}
-inline
-bool pc_isriding(struct map_session_data *sd)
-{
- return bool(sd->status.option & Option::RIDING);
-}
-inline
bool pc_isinvisible(struct map_session_data *sd)
{
return bool(sd->status.option & Option::HIDE);
@@ -119,9 +104,6 @@ int pc_skill(struct map_session_data *, SkillID, int, int);
int pc_steal_item(struct map_session_data *sd, struct block_list *bl);
int pc_steal_coin(struct map_session_data *sd, struct block_list *bl);
-int pc_modifybuyvalue(struct map_session_data *, int);
-int pc_modifysellvalue(struct map_session_data *, int);
-
int pc_attack(struct map_session_data *, int, int);
int pc_stopattack(struct map_session_data *);
@@ -152,9 +134,6 @@ int pc_itemheal(struct map_session_data *sd, int hp, int sp);
int pc_percentheal(struct map_session_data *sd, int, int);
int pc_jobchange(struct map_session_data *, int, int);
int pc_setoption(struct map_session_data *, Option);
-int pc_setcart(struct map_session_data *sd, int type);
-int pc_setfalcon(struct map_session_data *sd);
-int pc_setriding(struct map_session_data *sd);
int pc_changelook(struct map_session_data *, LOOK, int);
int pc_readparam(struct map_session_data *, SP);
diff --git a/src/map/script.cpp b/src/map/script.cpp
index a82cd66..d8c7c51 100644
--- a/src/map/script.cpp
+++ b/src/map/script.cpp
@@ -3372,7 +3372,7 @@ enum
//MF_GVG = 9,
//MF_GVG_NOPARTY = 10,
MF_NOTRADE = 11,
- MF_NOSKILL = 12,
+ //MF_NOSKILL = 12,
MF_NOWARP = 13,
MF_NOPVP = 14,
MF_NOICEWALL = 15,
@@ -3416,9 +3416,6 @@ void builtin_setmapflag(ScriptState *st)
case MF_NOTRADE:
map[m].flag.notrade = 1;
break;
- case MF_NOSKILL:
- map[m].flag.noskill = 1;
- break;
case MF_NOWARP:
map[m].flag.nowarp = 1;
break;
@@ -3481,9 +3478,6 @@ void builtin_removemapflag(ScriptState *st)
case MF_NOZENYPENALTY:
map[m].flag.nozenypenalty = 0;
break;
- case MF_NOSKILL:
- map[m].flag.noskill = 0;
- break;
case MF_NOWARP:
map[m].flag.nowarp = 0;
break;
@@ -3547,9 +3541,6 @@ void builtin_getmapflag(ScriptState *st)
case MF_NOZENYPENALTY:
r = map[m].flag.nozenypenalty;
break;
- case MF_NOSKILL:
- r = map[m].flag.noskill;
- break;
case MF_NOWARP:
r = map[m].flag.nowarp;
break;
diff --git a/src/map/skill.cpp b/src/map/skill.cpp
index 5488738..725bdb8 100644
--- a/src/map/skill.cpp
+++ b/src/map/skill.cpp
@@ -54,7 +54,7 @@ earray<StatusChange, SkillID, MAX_SKILL_DB> SkillStatusChangeTable //=
StatusChange::NEGATIVE1,
StatusChange::NEGATIVE1,
StatusChange::NEGATIVE1,
- SC_RUWACH, /* ルアフ */
+ StatusChange::NEGATIVE1, /* ルアフ */
StatusChange::NEGATIVE1,
StatusChange::NEGATIVE1,
StatusChange::NEGATIVE1,
@@ -95,7 +95,7 @@ earray<StatusChange, SkillID, MAX_SKILL_DB> SkillStatusChangeTable //=
StatusChange::NEGATIVE1,
// 60-
SC_TWOHANDQUICKEN, /* 2HQ */
- SC_AUTOCOUNTER,
+ StatusChange::NEGATIVE1,
StatusChange::NEGATIVE1,
StatusChange::NEGATIVE1,
StatusChange::NEGATIVE1,
@@ -323,7 +323,7 @@ earray<StatusChange, SkillID, MAX_SKILL_DB> SkillStatusChangeTable //=
StatusChange::NEGATIVE1,
StatusChange::NEGATIVE1,
SC_STEELBODY,
- SC_BLADESTOP_WAIT,
+ StatusChange::NEGATIVE1,
// 270-
SC_EXPLOSIONSPIRITS,
SC_EXTREMITYFIST,
@@ -493,218 +493,10 @@ earray<StatusChange, SkillID, MAX_SKILL_DB> SkillStatusChangeTable //=
struct skill_name_db skill_names[] =
{
- {AC_CHARGEARROW, "CHARGEARROW", "Charge_Arrow"},
- {AC_CONCENTRATION, "CONCENTRATION", "Improve_Concentration"},
- {AC_DOUBLE, "DOUBLE", "Double_Strafe"},
- {AC_MAKINGARROW, "MAKINGARROW", "Arrow_Creation"},
{AC_OWL, "OWL", "Owl's_Eye"},
- {AC_SHOWER, "SHOWER", "Arrow_Shower"},
- {AC_VULTURE, "VULTURE", "Vulture's_Eye"},
- {ALL_RESURRECTION, "RESURRECTION", "Resurrection"},
- {AL_ANGELUS, "ANGELUS", "Angelus"},
- {AL_BLESSING, "BLESSING", "Blessing"},
- {AL_CRUCIS, "CRUCIS", "Signum_Crusis"},
- {AL_CURE, "CURE", "Cure"},
- {AL_DECAGI, "DECAGI", "Decrease_AGI"},
- {AL_DEMONBANE, "DEMONBANE", "Demon_Bane"},
- {AL_DP, "DP", "Divine_Protection"},
{AL_HEAL, "HEAL", "Heal"},
- {AL_HOLYLIGHT, "HOLYLIGHT", "Holy_Light"},
- {AL_HOLYWATER, "HOLYWATER", "Aqua_Benedicta"},
- {AL_INCAGI, "INCAGI", "Increase_AGI"},
- {AL_PNEUMA, "PNEUMA", "Pneuma"},
- {AL_RUWACH, "RUWACH", "Ruwach"},
{AL_TELEPORT, "TELEPORT", "Teleport"},
- {AL_WARP, "WARP", "Warp_Portal"},
- {AM_ACIDTERROR, "ACIDTERROR", "Acid_Terror"},
- {AM_AXEMASTERY, "AXEMASTERY", "Axe_Mastery"},
- {AM_BERSERKPITCHER, "BERSERKPITCHER", "Berserk Pitcher"},
- {AM_BIOETHICS, "BIOETHICS", "Bioethics"},
- {AM_BIOTECHNOLOGY, "BIOTECHNOLOGY", "Biotechnology"},
- {AM_CALLHOMUN, "CALLHOMUN", "Call_Homunculus"},
- {AM_CANNIBALIZE, "CANNIBALIZE", "Bio_Cannibalize"},
- {AM_CP_ARMOR, "ARMOR", "Chemical_Protection_Armor"},
- {AM_CP_HELM, "HELM", "Chemical_Protection_Helm"},
- {AM_CP_SHIELD, "SHIELD", "Chemical_Protection_Shield"},
- {AM_CP_WEAPON, "WEAPON", "Chemical_Protection_Weapon"},
- {AM_CREATECREATURE, "CREATECREATURE", "Life_Creation"},
- {AM_CULTIVATION, "CULTIVATION", "Cultivation"},
- {AM_DEMONSTRATION, "DEMONSTRATION", "Demonstration"},
- {AM_DRILLMASTER, "DRILLMASTER", "Drillmaster"},
- {AM_FLAMECONTROL, "FLAMECONTROL", "Flame_Control"},
- {AM_HEALHOMUN, "HEALHOMUN", "Heal_Homunculus"},
- {AM_LEARNINGPOTION, "LEARNINGPOTION", "AM_LEARNINGPOTION"},
- {AM_PHARMACY, "PHARMACY", "Pharmacy"},
- {AM_POTIONPITCHER, "POTIONPITCHER", "Potion_Pitcher"},
- {AM_REST, "REST", "Sabbath"},
- {AM_RESURRECTHOMUN, "RESURRECTHOMUN", "Ressurect_Homunculus"},
- {AM_SPHEREMINE, "SPHEREMINE", "Sphere_Mine"},
- {ASC_BREAKER, "BREAKER", "Breaker"},
- {ASC_CDP, "CDP", "Create_Deadly_Poison"},
- {ASC_EDP, "EDP", "Deadly_Poison_Enchantment"},
- {ASC_HALLUCINATION, "HALLUCINATION", "Hallucination_Walk"},
- {ASC_KATAR, "KATAR", "Advanced_Katar_Mastery"},
- {ASC_METEORASSAULT, "METEORASSAULT", "Meteor_Assault"},
- {AS_CLOAKING, "CLOAKING", "Cloaking"},
- {AS_ENCHANTPOISON, "ENCHANTPOISON", "Enchant_Poison"},
- {AS_GRIMTOOTH, "GRIMTOOTH", "Grimtooth"},
- {AS_KATAR, "KATAR", "Katar_Mastery"},
- {AS_LEFT, "LEFT", "Lefthand_Mastery"},
- {AS_POISONREACT, "POISONREACT", "Poison_React"},
- {AS_RIGHT, "RIGHT", "Righthand_Mastery"},
- {AS_SONICBLOW, "SONICBLOW", "Sonic_Blow"},
- {AS_SPLASHER, "SPLASHER", "Venom_Splasher"},
- {AS_VENOMDUST, "VENOMDUST", "Venom_Dust"},
- {BA_APPLEIDUN, "APPLEIDUN", "Apple_of_Idun"},
- {BA_ASSASSINCROSS, "ASSASSINCROSS", "Assassin_Cross"},
- {BA_DISSONANCE, "DISSONANCE", "Dissonance"},
- {BA_FROSTJOKE, "FROSTJOKE", "Dumb_Joke"},
- {BA_MUSICALLESSON, "MUSICALLESSON", "Musical_Lesson"},
- {BA_MUSICALSTRIKE, "MUSICALSTRIKE", "Musical_Strike"},
- {BA_POEMBRAGI, "POEMBRAGI", "Poem_of_Bragi"},
- {BA_WHISTLE, "WHISTLE", "Whistle"},
- {BD_ADAPTATION, "ADAPTATION", "Adaption"},
- {BD_DRUMBATTLEFIELD, "DRUMBATTLEFIELD", "Drumb_BattleField"},
- {BD_ENCORE, "ENCORE", "Encore"},
- {BD_ETERNALCHAOS, "ETERNALCHAOS", "Eternal_Chaos"},
- {BD_INTOABYSS, "INTOABYSS", "Into_the_Abyss"},
- {BD_LULLABY, "LULLABY", "Lullaby"},
- {BD_RAGNAROK, "RAGNAROK", "Ragnarok"},
- {BD_RICHMANKIM, "RICHMANKIM", "Rich_Mankim"},
- {BD_RINGNIBELUNGEN, "RINGNIBELUNGEN", "Ring_of_Nibelugen"},
- {BD_ROKISWEIL, "ROKISWEIL", "Loki's_Wail"},
- {BD_SIEGFRIED, "SIEGFRIED", "Invulnerable_Siegfried"},
- {BS_ADRENALINE, "ADRENALINE", "Adrenaline_Rush"},
- {BS_ADRENALINE2, "ADRENALINE2", "Adrenaline Rush 2"},
- {BS_AXE, "AXE", "Smith_Axe"},
- {BS_DAGGER, "DAGGER", "Smith_Dagger"},
- {BS_ENCHANTEDSTONE, "ENCHANTEDSTONE", "Enchantedstone_Craft"},
- {BS_FINDINGORE, "FINDINGORE", "Ore_Discovery"},
- {BS_HAMMERFALL, "HAMMERFALL", "Hammer_Fall"},
- {BS_HILTBINDING, "HILTBINDING", "Hilt_Binding"},
- {BS_IRON, "IRON", "Iron_Tempering"},
- {BS_KNUCKLE, "KNUCKLE", "Smith_Knucklebrace"},
- {BS_MACE, "MACE", "Smith_Mace"},
- {BS_MAXIMIZE, "MAXIMIZE", "Power_Maximize"},
- {BS_ORIDEOCON, "ORIDEOCON", "Orideocon_Research"},
- {BS_OVERTHRUST, "OVERTHRUST", "Power-Thrust"},
- {BS_REPAIRWEAPON, "REPAIRWEAPON", "Weapon_Repair"},
- {BS_SKINTEMPER, "SKINTEMPER", "Skin_Tempering"},
- {BS_SPEAR, "SPEAR", "Smith_Spear"},
- {BS_STEEL, "STEEL", "Steel_Tempering"},
- {BS_SWORD, "SWORD", "Smith_Sword"},
- {BS_TWOHANDSWORD, "TWOHANDSWORD", "Smith_Two-handed_Sword"},
- {BS_WEAPONPERFECT, "WEAPONPERFECT", "Weapon_Perfection"},
- {BS_WEAPONRESEARCH, "WEAPONRESEARCH", "Weaponry_Research"},
- {CG_ARROWVULCAN, "ARROWVULCAN", "Vulcan_Arrow"},
- {CG_MARIONETTE, "MARIONETTE", "Marionette_Control"},
- {CG_MOONLIT, "MOONLIT", "Moonlight_Petals"},
- {CH_CHAINCRUSH, "CHAINCRUSH", "Chain_Crush_Combo"},
- {CH_PALMSTRIKE, "PALMSTRIKE", "Palm_Push_Strike"},
- {CH_SOULCOLLECT, "SOULCOLLECT", "Collect_Soul"},
- {CH_TIGERFIST, "TIGERFIST", "Tiger_Knuckle_Fist"},
- {CR_ALCHEMY, "ALCHEMY", "Alchemy"},
- {CR_AUTOGUARD, "AUTOGUARD", "Guard"},
- {CR_DEFENDER, "DEFENDER", "Defender"},
- {CR_DEVOTION, "DEVOTION", "Sacrifice"},
- {CR_GRANDCROSS, "GRANDCROSS", "Grand_Cross"},
- {CR_HOLYCROSS, "HOLYCROSS", "Holy_Cross"},
- {CR_PROVIDENCE, "PROVIDENCE", "Providence"},
- {CR_REFLECTSHIELD, "REFLECTSHIELD", "Shield_Reflect"},
- {CR_SHIELDBOOMERANG, "SHIELDBOOMERANG", "Shield_Boomerang"},
- {CR_SHIELDCHARGE, "SHIELDCHARGE", "Shield_Charge"},
- {CR_SPEARQUICKEN, "SPEARQUICKEN", "Spear_Quicken"},
- {CR_SYNTHESISPOTION, "SYNTHESISPOTION", "Potion_Synthesis"},
- {CR_TRUST, "TRUST", "Faith"},
- {DC_DANCINGLESSON, "DANCINGLESSON", "Dancing_Lesson"},
- {DC_DONTFORGETME, "DONTFORGETME", "Don't_Forget_Me"},
- {DC_FORTUNEKISS, "FORTUNEKISS", "Fortune_Kiss"},
- {DC_HUMMING, "HUMMING", "Humming"},
- {DC_SCREAM, "SCREAM", "Scream"},
- {DC_SERVICEFORYOU, "SERVICEFORYOU", "Prostitute"},
- {DC_THROWARROW, "THROWARROW", "Throw_Arrow"},
- {DC_UGLYDANCE, "UGLYDANCE", "Ugly_Dance"},
- {HP_ASSUMPTIO, "ASSUMPTIO", "Assumptio"},
- {HP_BASILICA, "BASILICA", "Basilica"},
- {HP_MEDITATIO, "MEDITATIO", "Meditation"},
- {HT_ANKLESNARE, "ANKLESNARE", "Ankle_Snare"},
- {HT_BEASTBANE, "BEASTBANE", "Beast_Bane"},
- {HT_BLASTMINE, "BLASTMINE", "Blast_Mine"},
- {HT_BLITZBEAT, "BLITZBEAT", "Blitz_Beat"},
- {HT_CLAYMORETRAP, "CLAYMORETRAP", "Claymore_Trap"},
- {HT_DETECTING, "DETECTING", "Detect"},
- {HT_FALCON, "FALCON", "Falconry_Mastery"},
- {HT_FLASHER, "FLASHER", "Flasher"},
- {HT_FREEZINGTRAP, "FREEZINGTRAP", "Freezing_Trap"},
- {HT_LANDMINE, "LANDMINE", "Land_Mine"},
- {HT_REMOVETRAP, "REMOVETRAP", "Remove_Trap"},
- {HT_SANDMAN, "SANDMAN", "Sandman"},
- {HT_SHOCKWAVE, "SHOCKWAVE", "Shockwave_Trap"},
- {HT_SKIDTRAP, "SKIDTRAP", "Skid_Trap"},
- {HT_SPRINGTRAP, "SPRINGTRAP", "Spring_Trap"},
- {HT_STEELCROW, "STEELCROW", "Steel_Crow"},
- {HT_TALKIEBOX, "TALKIEBOX", "Talkie_Box"},
- {HW_MAGICCRASHER, "MAGICCRASHER", "Magic_Crasher"},
- {HW_MAGICPOWER, "MAGICPOWER", "Magic_Power"},
- {HW_NAPALMVULCAN, "NAPALMVULCAN", "Napalm_Vulcan"},
- {HW_SOULDRAIN, "SOULDRAIN", "Soul_Drain"},
- {KN_AUTOCOUNTER, "AUTOCOUNTER", "Counter_Attack"},
- {KN_BOWLINGBASH, "BOWLINGBASH", "Bowling_Bash"},
- {KN_BRANDISHSPEAR, "BRANDISHSPEAR", "Brandish_Spear"},
- {KN_CAVALIERMASTERY, "CAVALIERMASTERY", "Cavalier_Mastery"},
- {KN_PIERCE, "PIERCE", "Pierce"},
- {KN_RIDING, "RIDING", "Peco_Peco_Ride"},
- {KN_SPEARBOOMERANG, "SPEARBOOMERANG", "Spear_Boomerang"},
- {KN_SPEARMASTERY, "SPEARMASTERY", "Spear_Mastery"},
- {KN_SPEARSTAB, "SPEARSTAB", "Spear_Stab"},
- {KN_TWOHANDQUICKEN, "TWOHANDQUICKEN", "Twohand_Quicken"},
- {LK_AURABLADE, "AURABLADE", "Aura_Blade"},
- {LK_BERSERK, "BERSERK", "Berserk"},
- {LK_CONCENTRATION, "CONCENTRATION", "Concentration"},
- {LK_FURY, "FURY", "LK_FURY"},
- {LK_HEADCRUSH, "HEADCRUSH", "Head_Crusher"},
- {LK_JOINTBEAT, "JOINTBEAT", "Joint_Beat"},
- {LK_PARRYING, "PARRYING", "Parrying"},
- {LK_SPIRALPIERCE, "SPIRALPIERCE", "Spiral_Pierce"},
- {LK_TENSIONRELAX, "TENSIONRELAX", "Tension_Relax"},
- {MC_CARTREVOLUTION, "CARTREVOLUTION", "Cart_Revolution"},
- {MC_CHANGECART, "CHANGECART", "Change_Cart"},
- {MC_DISCOUNT, "DISCOUNT", "Discount"},
- {MC_IDENTIFY, "IDENTIFY", "Item_Appraisal"},
- {MC_INCCARRY, "INCCARRY", "Enlarge_Weight_Limit"},
- {MC_LOUD, "LOUD", "Lord_Exclamation"},
- {MC_MAMMONITE, "MAMMONITE", "Mammonite"},
- {MC_OVERCHARGE, "OVERCHARGE", "Overcharge"},
- {MC_PUSHCART, "PUSHCART", "Pushcart"},
- {MG_COLDBOLT, "COLDBOLT", "Cold_Bolt"},
- {MG_ENERGYCOAT, "ENERGYCOAT", "Energy_Coat"},
- {MG_FIREBALL, "FIREBALL", "Fire_Ball"},
- {MG_FIREBOLT, "FIREBOLT", "Fire_Bolt"},
- {MG_FIREWALL, "FIREWALL", "Fire_Wall"},
- {MG_FROSTDIVER, "FROSTDIVER", "Frost_Diver"},
- {MG_LIGHTNINGBOLT, "LIGHTNINGBOLT", "Lightening_Bolt"},
- {MG_NAPALMBEAT, "NAPALMBEAT", "Napalm_Beat"},
- {MG_SAFETYWALL, "SAFETYWALL", "Safety_Wall"},
- {MG_SIGHT, "SIGHT", "Sight"},
- {MG_SOULSTRIKE, "SOULSTRIKE", "Soul_Strike"},
- {MG_SRECOVERY, "SRECOVERY", "Increase_SP_Recovery"},
- {MG_STONECURSE, "STONECURSE", "Stone_Curse"},
- {MG_THUNDERSTORM, "THUNDERSTORM", "Thunderstorm"},
- {MO_ABSORBSPIRITS, "ABSORBSPIRITS", "Absorb_Spirits"},
- {MO_BLADESTOP, "BLADESTOP", "Blade_Stop"},
- {MO_BODYRELOCATION, "BODYRELOCATION", "Body_Relocation"},
- {MO_CALLSPIRITS, "CALLSPIRITS", "Call_Spirits"},
- {MO_CHAINCOMBO, "CHAINCOMBO", "Chain_Combo"},
- {MO_COMBOFINISH, "COMBOFINISH", "Combo_Finish"},
- {MO_DODGE, "DODGE", "Dodge"},
- {MO_EXPLOSIONSPIRITS, "EXPLOSIONSPIRITS", "Explosion_Spirits"},
- {MO_EXTREMITYFIST, "EXTREMITYFIST", "Extremity_Fist"},
- {MO_FINGEROFFENSIVE, "FINGEROFFENSIVE", "Finger_Offensive"},
- {MO_INVESTIGATE, "INVESTIGATE", "Investigate"},
- {MO_IRONHAND, "IRONHAND", "Iron_Hand"},
- {MO_SPIRITSRECOVERY, "SPIRITSRECOVERY", "Spirit_Recovery"},
- {MO_STEELBODY, "STEELBODY", "Steel_Body"},
- {MO_TRIPLEATTACK, "TRIPLEATTACK", "Triple_Blows"},
+
{NPC_ATTRICHANGE, "ATTRICHANGE", "NPC_ATTRICHANGE"},
{NPC_BARRIER, "BARRIER", "NPC_BARRIER"},
{NPC_BLINDATTACK, "BLINDATTACK", "NPC_BLINDATTACK"},
@@ -758,193 +550,27 @@ struct skill_name_db skill_names[] =
{NPC_TRANSFORMATION, "TRANSFORMATION", "NPC_TRANSFORMATION"},
{NPC_WATERATTACK, "WATERATTACK", "NPC_WATERATTACK"},
{NPC_WINDATTACK, "WINDATTACK", "NPC_WINDATTACK"},
+
{NV_EMOTE, "EMOTE", "Emote_Skill"},
{NV_TRADE, "TRADE", "Trade_Skill"},
{NV_PARTY, "PARTY", "Party_Skill"},
- {NV_FIRSTAID, "FIRSTAID", "First Aid"},
- {NV_TRICKDEAD, "TRICKDEAD", "Play_Dead"},
- {PA_GOSPEL, "GOSPEL", "Gospel"},
- {PA_PRESSURE, "PRESSURE", "Pressure"},
- {PA_SACRIFICE, "SACRIFICE", "Sacrificial_Ritual"},
- {PF_FOGWALL, "FOGWALL", "Wall_of_Fog"},
- {PF_HPCONVERSION, "HPCONVERSION", "Health_Conversion"},
- {PF_MEMORIZE, "MEMORIZE", "Memorize"},
- {PF_MINDBREAKER, "MINDBREAKER", "Mind_Breaker"},
- {PF_SOULBURN, "SOULBURN", "Soul_Burn"},
- {PF_SOULCHANGE, "SOULCHANGE", "Soul_Change"},
- {PF_SPIDERWEB, "SPIDERWEB", "Spider_Web"},
- {PR_ASPERSIO, "ASPERSIO", "Aspersio"},
- {PR_BENEDICTIO, "BENEDICTIO", "B.S_Sacramenti"},
- {PR_GLORIA, "GLORIA", "Gloria"},
- {PR_IMPOSITIO, "IMPOSITIO", "Impositio_Manus"},
- {PR_KYRIE, "KYRIE", "Kyrie_Eleison"},
- {PR_LEXAETERNA, "LEXAETERNA", "Lex_Aeterna"},
- {PR_LEXDIVINA, "LEXDIVINA", "Lex_Divina"},
- {PR_MACEMASTERY, "MACEMASTERY", "Mace_Mastery"},
- {PR_MAGNIFICAT, "MAGNIFICAT", "Magnificat"},
- {PR_MAGNUS, "MAGNUS", "Magnus_Exorcismus"},
- {PR_SANCTUARY, "SANCTUARY", "Santuary"},
- {PR_SLOWPOISON, "SLOWPOISON", "Slow_Poison"},
- {PR_STRECOVERY, "STRECOVERY", "Status_Recovery"},
- {PR_SUFFRAGIUM, "SUFFRAGIUM", "Suffragium"},
- {PR_TURNUNDEAD, "TURNUNDEAD", "Turn_Undead"},
- {RG_BACKSTAP, "BACKSTAP", "Back_Stab"},
- {RG_CLEANER, "CLEANER", "Remover"},
- {RG_COMPULSION, "COMPULSION", "Compulsion_Discount"},
- {RG_FLAGGRAFFITI, "FLAGGRAFFITI", "Flag_Graffity"},
- {RG_GANGSTER, "GANGSTER", "Gangster's_Paradise"},
- {RG_GRAFFITI, "GRAFFITI", "Graffiti"},
- {RG_INTIMIDATE, "INTIMIDATE", "Intimidate"},
- {RG_PLAGIARISM, "PLAGIARISM", "Plagiarism"},
- {RG_RAID, "RAID", "Raid"},
- {RG_SNATCHER, "SNATCHER", "Snatcher"},
- {RG_STEALCOIN, "STEALCOIN", "Steal_Coin"},
- {RG_STRIPARMOR, "STRIPARMOR", "Strip_Armor"},
- {RG_STRIPHELM, "STRIPHELM", "Strip_Helm"},
- {RG_STRIPSHIELD, "STRIPSHIELD", "Strip_Shield"},
- {RG_STRIPWEAPON, "STRIPWEAPON", "Strip_Weapon"},
- {RG_TUNNELDRIVE, "TUNNELDRIVE", "Tunnel_Drive"},
- {SA_ABRACADABRA, "ABRACADABRA", "Hocus-pocus"},
- {SA_ADVANCEDBOOK, "ADVANCEDBOOK", "Advanced_Book"},
- {SA_AUTOSPELL, "AUTOSPELL", "Auto_Cast"},
- {SA_CASTCANCEL, "CASTCANCEL", "Cast_Cancel"},
- {SA_CLASSCHANGE, "CLASSCHANGE", "Class_Change"},
- {SA_COMA, "COMA", "Coma"},
- {SA_DEATH, "DEATH", "Death"},
- {SA_DELUGE, "DELUGE", "Deluge"},
- {SA_DISPELL, "DISPELL", "Dispel"},
- {SA_DRAGONOLOGY, "DRAGONOLOGY", "Dragonology"},
- {SA_FLAMELAUNCHER, "FLAMELAUNCHER", "Flame_Launcher"},
- {SA_FORTUNE, "FORTUNE", "Fortune"},
- {SA_FREECAST, "FREECAST", "Cast_Freedom"},
- {SA_FROSTWEAPON, "FROSTWEAPON", "Frost_Weapon"},
- {SA_FULLRECOVERY, "FULLRECOVERY", "Full_Recovery"},
- {SA_GRAVITY, "GRAVITY", "Gravity"},
- {SA_INSTANTDEATH, "INSTANTDEATH", "Instant_Death"},
- {SA_LANDPROTECTOR, "LANDPROTECTOR", "Land_Protector"},
- {SA_LEVELUP, "LEVELUP", "Level_Up"},
- {SA_LIGHTNINGLOADER, "LIGHTNINGLOADER", "Lightning_Loader"},
- {SA_MAGICROD, "MAGICROD", "Magic_Rod"},
- {SA_MONOCELL, "MONOCELL", "Monocell"},
- {SA_QUESTION, "QUESTION", "Question?"},
- {SA_REVERSEORCISH, "REVERSEORCISH", "Reverse_Orcish"},
- {SA_SEISMICWEAPON, "SEISMICWEAPON", "Seismic_Weapon"},
- {SA_SPELLBREAKER, "SPELLBREAKER", "Break_Spell"},
- {SA_SUMMONMONSTER, "SUMMONMONSTER", "Summon_Monster"},
- {SA_VIOLENTGALE, "VIOLENTGALE", "Violent_Gale"},
- {SA_VOLCANO, "VOLCANO", "Volcano"},
- {SG_DEVIL, "DEVIL", "Devil"},
- {SG_FEEL, "FEEL", "Feel"},
- {SG_FRIEND, "FRIEND", "Friend"},
- {SG_FUSION, "FUSION", "Fusion"},
- {SG_HATE, "HATE", "Hate"},
- {SG_KNOWLEDGE, "KNOWLEDGE", "Knowledge"},
- {SG_MOON_ANGER, "ANGER", "Moon Anger"},
- {SG_MOON_BLESS, "BLESS", "Moon Bless"},
- {SG_MOON_COMFORT, "COMFORT", "Moon Comfort"},
- {SG_MOON_WARM, "WARM", "Moon Warm"},
- {SG_STAR_ANGER, "ANGER", "Star Anger"},
- {SG_STAR_BLESS, "BLESS", "Star Bless"},
- {SG_STAR_COMFORT, "COMFORT", "Star Comfort"},
- {SG_STAR_WARM, "WARM", "Star Warm"},
- {SG_SUN_ANGER, "ANGER", "Sun Anger"},
- {SG_SUN_BLESS, "BLESS", "Sun Bless"},
- {SG_SUN_COMFORT, "COMFORT", "Sun Comfort"},
- {SG_SUN_WARM, "WARM", "Sun Warm"},
- {SL_ALCHEMIST, "ALCHEMIST", "Alchemist"},
- {SL_ASSASIN, "ASSASIN", "Assasin"},
- {SL_BARDDANCER, "BARDDANCER", "Bard Dancer"},
- {SL_BLACKSMITH, "BLACKSMITH", "Black Smith"},
- {SL_CRUSADER, "CRUSADER", "Crusader"},
- {SL_HUNTER, "HUNTER", "Hunter"},
- {SL_KAAHI, "KAAHI", "Kaahi"},
- {SL_KAINA, "KAINA", "Kaina"},
- {SL_KAITE, "KAITE", "Kaite"},
- {SL_KAIZEL, "KAIZEL", "Kaizel"},
- {SL_KAUPE, "KAUPE", "Kaupe"},
- {SL_KNIGHT, "KNIGHT", "Knight"},
- {SL_MONK, "MONK", "Monk"},
- {SL_PRIEST, "PRIEST", "Priest"},
- {SL_ROGUE, "ROGUE", "Rogue"},
- {SL_SAGE, "SAGE", "Sage"},
- {SL_SKA, "SKA", "SKA"},
- {SL_SKE, "SKE", "SKE"},
- {SL_SMA, "SMA", "SMA"},
- {SL_SOULLINKER, "SOULLINKER", "Soul Linker"},
- {SL_STAR, "STAR", "Star"},
- {SL_STIN, "STIN", "Stin"},
- {SL_STUN, "STUN", "Stun"},
- {SL_SUPERNOVICE, "SUPERNOVICE", "Super Novice"},
- {SL_SWOO, "SWOO", "Swoo"},
- {SL_WIZARD, "WIZARD", "Wizard"},
- {SM_AUTOBERSERK, "AUTOBERSERK", "Auto_Berserk"},
- {SM_BASH, "BASH", "Bash"},
- {SM_ENDURE, "ENDURE", "Endure"},
- {SM_FATALBLOW, "FATALBLOW", "Attack_Weak_Point"},
- {SM_MAGNUM, "MAGNUM", "Magnum_Break"},
- {SM_MOVINGRECOVERY, "MOVINGRECOVERY", "Moving_HP_Recovery"},
- {SM_PROVOKE, "PROVOKE", "Provoke"},
- {SM_RECOVERY, "RECOVERY", "Increase_HP_Recovery"},
- {SM_SWORD, "SWORD", "Sword_Mastery"},
- {SM_TWOHAND, "TWOHAND", "Two-Handed_Sword_Mastery"},
- {SN_FALCONASSAULT, "FALCONASSAULT", "Falcon_Assault"},
- {SN_SHARPSHOOTING, "SHARPSHOOTING", "Sharpshooting"},
- {SN_SIGHT, "SIGHT", "True_Sight"},
- {SN_WINDWALK, "WINDWALK", "Wind_Walk"},
- {ST_CHASEWALK, "CHASEWALK", "Chase_Walk"},
- {ST_REJECTSWORD, "REJECTSWORD", "Reject_Sword"},
- {ST_STEALBACKPACK, "STEALBACKPACK", "Steal_Backpack"},
- {TF_BACKSLIDING, "BACKSLIDING", "Back_Sliding"},
- {TF_DETOXIFY, "DETOXIFY", "Detoxify"},
- {TF_DOUBLE, "DOUBLE", "Double_Attack"},
- {TF_HIDING, "HIDING", "Hiding"},
- {TF_MISS, "MISS", "Improve_Dodge"},
- {TF_PICKSTONE, "PICKSTONE", "Take_Stone"},
- {TF_POISON, "POISON", "Envenom"},
- {TF_SPRINKLESAND, "SPRINKLESAND", "Throw_Sand"},
- {TF_STEAL, "STEAL", "Steal"},
- {TF_THROWSTONE, "THROWSTONE", "Throw_Stone"},
- {TK_COUNTER, "COUNTER", "Counter"},
- {TK_DODGE, "DODGE", "Dodge"},
- {TK_DOWNKICK, "DOWNKICK", "Down Kick"},
- {TK_HIGHJUMP, "HIGHJUMP", "High Jump"},
- {TK_HPTIME, "HPTIME", "HP Time"},
- {TK_JUMPKICK, "JUMPKICK", "Jump Kick"},
- {TK_POWER, "POWER", "Power"},
- {TK_READYCOUNTER, "READYCOUNTER", "Ready Counter"},
- {TK_READYDOWN, "READYDOWN", "Ready Down"},
- {TK_READYSTORM, "READYSTORM", "Ready Storm"},
- {TK_READYTURN, "READYTURN", "Ready Turn"},
- {TK_RUN, "RUN", "TK_RUN"},
- {TK_SEVENWIND, "SEVENWIND", "Seven Wind"},
- {TK_SPTIME, "SPTIME", "SP Time"},
- {TK_STORMKICK, "STORMKICK", "Storm Kick"},
- {TK_TURNKICK, "TURNKICK", "Turn Kick"},
- {WE_BABY, "BABY", "Adopt_Baby"},
- {WE_CALLBABY, "CALLBABY", "Call_Baby"},
- {WE_CALLPARENT, "CALLPARENT", "Call_Parent"},
- {WE_CALLPARTNER, "CALLPARTNER", "I Want to See You"},
- {WE_FEMALE, "FEMALE", "I Only Look Up to You"},
- {WE_MALE, "MALE", "I Will Protect You"},
- {WS_CARTBOOST, "CARTBOOST", "Cart_Boost"},
- {WS_CREATECOIN, "CREATECOIN", "Create_Coins"},
- {WS_CREATENUGGET, "CREATENUGGET", "Create_Nuggets"},
- {WS_MELTDOWN, "MELTDOWN", "Meltdown"},
- {WS_SYSTEMCREATE, "SYSTEMCREATE", "Create_System_tower"},
- {WZ_EARTHSPIKE, "EARTHSPIKE", "Earth_Spike"},
- {WZ_ESTIMATION, "ESTIMATION", "Sense"},
- {WZ_FIREIVY, "FIREIVY", "Fire_Ivy"},
- {WZ_FIREPILLAR, "FIREPILLAR", "Fire_Pillar"},
- {WZ_FROSTNOVA, "FROSTNOVA", "Frost_Nova"},
- {WZ_HEAVENDRIVE, "HEAVENDRIVE", "Heaven's_Drive"},
- {WZ_ICEWALL, "ICEWALL", "Ice_Wall"},
- {WZ_JUPITEL, "JUPITEL", "Jupitel_Thunder"},
- {WZ_METEOR, "METEOR", "Meteor_Storm"},
- {WZ_QUAGMIRE, "QUAGMIRE", "Quagmire"},
- {WZ_SIGHTRASHER, "SIGHTRASHER", "Sightrasher"},
- {WZ_STORMGUST, "STORMGUST", "Storm_Gust"},
- {WZ_VERMILION, "VERMILION", "Lord_of_Vermilion"},
- {WZ_WATERBALL, "WATERBALL", "Water_Ball"},
+
+ {TMW_MAGIC, "MAGIC", "General Magic"},
+ {TMW_MAGIC_LIFE, "MAGIC_LIFE", "Life Magic"},
+ {TMW_MAGIC_WAR, "MAGIC_WAR", "War Magic"},
+ {TMW_MAGIC_TRANSMUTE, "MAGIC_TRANSMUTE", "Transmutation Magic"},
+ {TMW_MAGIC_NATURE, "MAGIC_NATURE", "Nature Magic"},
+ {TMW_MAGIC_ETHER, "MAGIC_ETHER", "Astral Magic"},
+ {TMW_MAGIC_DARK, "MAGIC_DARK", "Dark Magic"},
+ {TMW_MAGIC_LIGHT, "MAGIC_LIGHT", "Light Magic"},
+
+ {TMW_BRAWLING, "BRAWLING", "Brawling"},
+ {TMW_LUCKY_COUNTER, "LUCKY_COUNTER", "Lucky Counter"},
+ {TMW_SPEED, "SPEED", "Speed"},
+ {TMW_RESIST_POISON, "RESIST_POISON", "Resist Poison"},
+ {TMW_ASTRAL_SOUL, "ASTRAL_SOUL", "Astral Soul"},
+ {TMW_RAGING, "RAGING", "Raging"},
+
{SkillID::ZERO, nullptr, nullptr}
};
@@ -960,18 +586,10 @@ earray<struct skill_db, SkillID, MAX_SKILL_DB> skill_db;
static
-int skill_addtimerskill(struct block_list *src, unsigned int tick,
- int target, int x, int y, SkillID skill_id, int skill_lv,
- skill_timerskill::sktst type, BCT flag);
-static
int skill_attack(BF attack_type, struct block_list *src,
struct block_list *dsrc, struct block_list *bl,
SkillID skillid, int skilllv, unsigned int tick, BCT flag);
static
-void skill_brandishspear_dir(struct square *tc, int dir, int are);
-static
-void skill_brandishspear_first(struct square *tc, int dir, int x, int y);
-static
int skill_delunitgroup(struct skill_unit_group *group);
static
void skill_devotion_end(struct map_session_data *md,
@@ -1114,14 +732,9 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src,
static
int skill_check_condition(struct map_session_data *sd, int type);
static
-void skill_frostjoke_scream(struct block_list *bl,
- struct block_list *src, SkillID skillnum, int skilllv, unsigned int tick);
-static
void skill_status_change_timer_sub(struct block_list *bl,
struct block_list *src, StatusChange type, unsigned int tick);
static
-void skill_clear_element_field(struct block_list *bl);
-static
void skill_landprotector(struct block_list *bl, SkillID skillid, int *alive);
static
void skill_trap_splash(struct block_list *bl,
@@ -1130,25 +743,6 @@ static
void skill_count_target(struct block_list *bl,
struct block_list *src, int *c);
-// [MouseJstr] - skill ok to cast? and when?
-static
-int skillnotok(SkillID skillid, struct map_session_data *sd)
-{
- if (sd == 0)
- return 0;
- if (pc_isGM(sd) >= 20)
- return 0; // gm's can do anything damn thing they want
- switch (skillid)
- {
- case AL_WARP:
- case AL_TELEPORT:
- case MC_IDENTIFY:
- return 0; // always allowed
- default:
- return (map[sd->bl.m].flag.noskill);
- }
-}
-
static
int distance(int x0, int y0, int x1, int y1)
{
@@ -1159,163 +753,19 @@ int distance(int x0, int y0, int x1, int y1)
return dx > dy ? dx : dy;
}
-/* スキルユニットIDを返す(これもデータベースに入れたいな) */
-static
-int skill_get_unit_id(SkillID id, int flag)
-{
-
- switch (id)
- {
- case MG_SAFETYWALL:
- return 0x7e; /* セイフティウォール */
- case MG_FIREWALL:
- return 0x7f; /* ファイアーウォール */
- case AL_WARP:
- return (flag == 0) ? 0x81 : 0x80; /* ワープポータル */
- case PR_BENEDICTIO:
- return 0x82; /* 聖体降福 */
- case PR_SANCTUARY:
- return 0x83; /* サンクチュアリ */
- case PR_MAGNUS:
- return 0x84; /* マグヌスエクソシズム */
- case AL_PNEUMA:
- return 0x85; /* ニューマ */
- case MG_THUNDERSTORM:
- return 0x86; /* サンダーストーム */
- case WZ_HEAVENDRIVE:
- return 0x86; /* ヘヴンズドライブ */
- case WZ_SIGHTRASHER:
- return 0x86; /* サイトラッシャー */
- case WZ_METEOR:
- return 0x86; /* メテオストーム */
- case WZ_VERMILION:
- return 0x86; /* ロードオブヴァーミリオン */
- case WZ_FROSTNOVA:
- return 0x86; /* フロストノヴァ */
- case WZ_STORMGUST:
- return 0x86; /* ストームガスト(とりあえずLoVと同じで処理) */
- case CR_GRANDCROSS:
- return 0x86; /* グランドクロス */
- case WZ_FIREPILLAR:
- return (flag == 0) ? 0x87 : 0x88; /* ファイアーピラー */
- case HT_TALKIEBOX:
- return 0x99; /* トーキーボックス */
- case WZ_ICEWALL:
- return 0x8d; /* アイスウォール */
- case WZ_QUAGMIRE:
- return 0x8e; /* クァグマイア */
- case HT_BLASTMINE:
- return 0x8f; /* ブラストマイン */
- case HT_SKIDTRAP:
- return 0x90; /* スキッドトラップ */
- case HT_ANKLESNARE:
- return 0x91; /* アンクルスネア */
- case AS_VENOMDUST:
- return 0x92; /* ベノムダスト */
- case HT_LANDMINE:
- return 0x93; /* ランドマイン */
- case HT_SHOCKWAVE:
- return 0x94; /* ショックウェーブトラップ */
- case HT_SANDMAN:
- return 0x95; /* サンドマン */
- case HT_FLASHER:
- return 0x96; /* フラッシャー */
- case HT_FREEZINGTRAP:
- return 0x97; /* フリージングトラップ */
- case HT_CLAYMORETRAP:
- return 0x98; /* クレイモアートラップ */
- case SA_VOLCANO:
- return 0x9a; /* ボルケーノ */
- case SA_DELUGE:
- return 0x9b; /* デリュージ */
- case SA_VIOLENTGALE:
- return 0x9c; /* バイオレントゲイル */
- case SA_LANDPROTECTOR:
- return 0x9d; /* ランドプロテクター */
- case BD_LULLABY:
- return 0x9e; /* 子守歌 */
- case BD_RICHMANKIM:
- return 0x9f; /* ニヨルドの宴 */
- case BD_ETERNALCHAOS:
- return 0xa0; /* 永遠の混沌 */
- case BD_DRUMBATTLEFIELD:
- return 0xa1; /* 戦太鼓の響き */
- case BD_RINGNIBELUNGEN:
- return 0xa2; /* ニーベルングの指輪 */
- case BD_ROKISWEIL:
- return 0xa3; /* ロキの叫び */
- case BD_INTOABYSS:
- return 0xa4; /* 深淵の中に */
- case BD_SIEGFRIED:
- return 0xa5; /* 不死身のジークフリード */
- case BA_DISSONANCE:
- return 0xa6; /* 不協和音 */
- case BA_WHISTLE:
- return 0xa7; /* 口笛 */
- case BA_ASSASSINCROSS:
- return 0xa8; /* 夕陽のアサシンクロス */
- case BA_POEMBRAGI:
- return 0xa9; /* ブラギの詩 */
- case BA_APPLEIDUN:
- return 0xaa; /* イドゥンの林檎 */
- case DC_UGLYDANCE:
- return 0xab; /* 自分勝手なダンス */
- case DC_HUMMING:
- return 0xac; /* ハミング */
- case DC_DONTFORGETME:
- return 0xad; /* 私を忘れないで… */
- case DC_FORTUNEKISS:
- return 0xae; /* 幸運のキス */
- case DC_SERVICEFORYOU:
- return 0xaf; /* サービスフォーユー */
- case RG_GRAFFITI:
- return 0xb0; /* グラフィティ */
- case AM_DEMONSTRATION:
- return 0xb1; /* デモンストレーション */
- case WE_CALLPARTNER:
- return 0xb2; /* あなたに逢いたい */
- case PA_GOSPEL:
- return 0xb3; /* ゴスペル */
- case HP_BASILICA:
- return 0xb4; /* バジリカ */
- case PF_FOGWALL:
- return 0xb6; /* フォグウォール */
- case PF_SPIDERWEB:
- return 0xb7; /* スパイダーウェッブ */
- }
- return 0;
- /*
- * 0x89,0x8a,0x8b 表示無し
- * 0x9a 炎属性の詠唱みたいなエフェクト
- * 0x9b 水属性の詠唱みたいなエフェクト
- * 0x9c 風属性の詠唱みたいなエフェクト
- * 0x9d 白い小さなエフェクト
- * 0xb1 Alchemist Demonstration
- * 0xb2 = Pink Warp Portal
- * 0xb3 = Gospel For Paladin
- * 0xb4 = Basilica
- * 0xb5 = Empty
- * 0xb6 = Fog Wall for Professor
- * 0xb7 = Spider Web for Professor
- * 0xb8 = Empty
- * 0xb9 =
- */
-}
-
/*==========================================
* スキル追加効果
*------------------------------------------
*/
int skill_additional_effect(struct block_list *src, struct block_list *bl,
SkillID skillid, int skilllv, BF attack_type,
- unsigned int tick)
+ unsigned int)
{
struct map_session_data *sd = NULL;
struct map_session_data *dstsd = NULL;
struct mob_data *md = NULL;
- int skill, skill2;
- int rate, luk;
+ int luk;
int sc_def_mdef, sc_def_vit, sc_def_int, sc_def_luk;
int sc_def_mdef2, sc_def_vit2, sc_def_int2, sc_def_luk2;
@@ -1375,188 +825,6 @@ int skill_additional_effect(struct block_list *src, struct block_list *bl,
switch (skillid)
{
- case SkillID::ZERO: /* 通常攻撃 */
- /* 自動鷹 */
- if (sd && pc_isfalcon(sd) && sd->status.weapon == 11
- && (skill = pc_checkskill(sd, HT_BLITZBEAT)) > 0
- && MRAND(1000) <= sd->paramc[ATTR::LUK] * 10 / 3 + 1)
- {
- int lv = (sd->status.job_level + 9) / 10;
- skill_castend_damage_id(src, bl, HT_BLITZBEAT,
- (skill < lv) ? skill : lv, tick,
- BCT_highnib);
- }
- // スナッチャー
- if (sd && sd->status.weapon != 11
- && (skill = pc_checkskill(sd, RG_SNATCHER)) > 0)
- if ((skill * 15 + 55) +
- (skill2 =
- pc_checkskill(sd, TF_STEAL)) * 10 > MRAND(1000))
- {
- if (pc_steal_item(sd, bl))
- {}
- else
- clif_skill_fail(sd, skillid, 0, 0);
- }
- break;
-
- case SM_BASH: /* バッシュ(急所攻撃) */
- if (sd && (skill = pc_checkskill(sd, SM_FATALBLOW)) > 0)
- {
- if (MRAND(100) < 6 * (skilllv - 5) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(SM_FATALBLOW,
- skilllv), 0);
- }
- break;
-
- case TF_POISON: /* インベナム */
- case AS_SPLASHER: /* ベナムスプラッシャー */
- if (MRAND(100) < (2 * skilllv + 10) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_POISON, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- else
- {
- if (sd && skillid == TF_POISON)
- clif_skill_fail(sd, skillid, 0, 0);
- }
- break;
-
- case AS_SONICBLOW: /* ソニックブロー */
- if (MRAND(100) < (2 * skilllv + 10) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case HT_FREEZINGTRAP: /* フリージングトラップ */
- rate = skilllv * 3 + 35;
- if (MRAND(100) < rate * sc_def_mdef / 100)
- skill_status_change_start(bl, SC_FREEZE, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case MG_FROSTDIVER: /* フロストダイバー */
- case WZ_FROSTNOVA: /* フロストノヴァ */
- rate =
- (skilllv * 3 + 35) * sc_def_mdef / 100 -
- (battle_get_int(bl) + battle_get_luk(bl)) / 15;
- rate = rate <= 5 ? 5 : rate;
- if (MRAND(100) < rate)
- skill_status_change_start(bl, SC_FREEZE, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- else if (sd)
- clif_skill_fail(sd, skillid, 0, 0);
- break;
-
- case WZ_STORMGUST: /* ストームガスト */
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
- if (sc_data)
- {
- sc_data[SC_FREEZE].val3++;
- if (sc_data[SC_FREEZE].val3 >= 3)
- skill_status_change_start(bl, SC_FREEZE, skilllv, 0, 0,
- 0, skill_get_time2(skillid,
- skilllv),
- 0);
- }
- }
- break;
-
- case HT_LANDMINE: /* ランドマイン */
- if (MRAND(100) < (5 * skilllv + 30) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case HT_SHOCKWAVE: /* ショックウェーブトラップ */
- if (map[bl->m].flag.pvp && dstsd)
- {
- dstsd->status.sp -=
- dstsd->status.sp * (5 + 15 * skilllv) / 100;
- pc_calcstatus(dstsd, 0);
- }
- break;
- case HT_SANDMAN: /* サンドマン */
- if (MRAND(100) < (5 * skilllv + 30) * sc_def_int / 100)
- skill_status_change_start(bl, SC_SLEEP, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
- case TF_SPRINKLESAND: /* 砂まき */
- if (MRAND(100) < 15 * sc_def_int / 100)
- skill_status_change_start(bl, SC_BLIND, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case TF_THROWSTONE: /* 石投げ */
- if (MRAND(100) < 5 * sc_def_vit / 100)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case CR_HOLYCROSS: /* ホーリークロス */
- if (MRAND(100) < 3 * skilllv * sc_def_int / 100)
- skill_status_change_start(bl, SC_BLIND, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case CR_GRANDCROSS: /* グランドクロス */
- {
- int race = battle_get_race(bl);
- if ((battle_check_undead(race, battle_get_elem_type(bl)) || race == 6) && MRAND(100) < 100000 * sc_def_int / 100) //強制付与だが完全耐性には無効
- skill_status_change_start(bl, SC_BLIND, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- }
- break;
-
- case CR_SHIELDCHARGE: /* シールドチャージ */
- if (MRAND(100) < (15 + skilllv * 5) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case RG_RAID: /* サプライズアタック */
- if (MRAND(100) < (10 + 3 * skilllv) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- if (MRAND(100) < (10 + 3 * skilllv) * sc_def_int / 100)
- skill_status_change_start(bl, SC_BLIND, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
- case BA_FROSTJOKE:
- if (MRAND(100) < (15 + 5 * skilllv) * sc_def_mdef / 100)
- skill_status_change_start(bl, SC_FREEZE, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case DC_SCREAM:
- if (MRAND(100) < (25 + 5 * skilllv) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case BD_LULLABY: /* 子守唄 */
- if (MRAND(100) < 15 * sc_def_int / 100)
- skill_status_change_start(bl, SC_SLEEP, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
/* MOBの追加効果付きスキル */
case NPC_PETRIFYATTACK:
@@ -1617,99 +885,9 @@ int skill_additional_effect(struct block_list *src, struct block_list *bl,
pc_heal(dstsd, 0, -sp);
}
break;
-
-// -- moonsoul (adding status effect chance given to wizard aoe skills meteor and vermillion)
-//
- case WZ_METEOR:
- if (MRAND(100) < sc_def_vit)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
- case WZ_VERMILION:
- if (MRAND(100) < sc_def_int)
- skill_status_change_start(bl, SC_BLIND, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
-// -- moonsoul (stun ability of new champion skill tigerfist)
-//
- case CH_TIGERFIST:
- if (MRAND(100) < (5 + skilllv * 5) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
-
- case LK_SPIRALPIERCE:
- if (MRAND(100) < (15 + skilllv * 5) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
- case ST_REJECTSWORD: /* フリージングトラップ */
- if (MRAND(100) < (10 + skilllv * 5))
- skill_status_change_start(bl, SC_AUTOCOUNTER, skilllv, 0, 0,
- 0, skill_get_time2(skillid,
- skilllv), 0);
- break;
- case PF_FOGWALL: /* ホーリークロス */
- if (MRAND(100) < 3 * skilllv * sc_def_int / 100)
- skill_status_change_start(bl, SC_BLIND, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
- case LK_HEADCRUSH: /* ヘッドクラッシュ */
- { //条件が良く分からないので適当に
- int race = battle_get_race(bl);
- if (!
- (battle_check_undead(race, battle_get_elem_type(bl))
- || race == 6)
- && MRAND(100) < (2 * skilllv + 10) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_HEADCRUSH, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- }
- break;
- case LK_JOINTBEAT: /* ジョイントビート */
- //条件が良く分からないので適当に
- if (MRAND(100) < (2 * skilllv + 10) * sc_def_vit / 100)
- skill_status_change_start(bl, SC_JOINTBEAT, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
- case PF_SPIDERWEB: /* スパイダーウェッブ */
- {
- int sec = skill_get_time2(skillid, skilllv);
- if (map[src->m].flag.pvp) //PvPでは拘束時間半減?
- sec = sec / 2;
- battle_stopwalking(bl, 1);
- skill_status_change_start(bl, SC_SPIDERWEB, skilllv, 0, 0, 0,
- sec, 0);
- }
- break;
- case ASC_METEORASSAULT: /* メテオアサルト */
- if (MRAND(100) < (15 + skilllv * 5) * sc_def_vit / 100) //状態異常は詳細が分からないので適当に
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- if (MRAND(100) < (10 + 3 * skilllv) * sc_def_int / 100)
- skill_status_change_start(bl, SC_BLIND, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- break;
- case MO_EXTREMITYFIST: /* 阿修羅覇凰拳 */
- //阿修羅を使うと5分間自然回復しないようになる
- skill_status_change_start(src, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv), 0);
- break;
}
- if (not (sd
- && skillid != MC_CARTREVOLUTION
- && bool(attack_type & BF_WEAPON)))
+ if (not (sd && bool(attack_type & BF_WEAPON)))
return 0;
earray<int, BadSC, BadSC::COUNT> arr_sc_def_card1 //=
{{
@@ -1735,19 +913,6 @@ int skill_additional_effect(struct block_list *src, struct block_list *bl,
sc_def_int2, // blind
}};
- earray<SkillID, BadSC, BadSC::COUNT> sc2 //=
- {{
- MG_STONECURSE, // stone
- MG_FROSTDIVER, // freeze
- NPC_STUNATTACK, // stan
- NPC_SLEEPATTACK, // sleep
- TF_POISON, // poison
- NPC_CURSEATTACK, // curse
- NPC_SILENCEATTACK, // silence
- SkillID::ZERO, // confusion
- NPC_BLINDATTACK, // blind
- }};
-
for (BadSC bi : erange(BadSC(), BadSC::COUNT))
{
StatusChange si = BadSC_to_SC(bi);
@@ -1764,7 +929,7 @@ int skill_additional_effect(struct block_list *src, struct block_list *bl,
skill_status_change_start(bl, si, 7, 0, 0, 0,
(bi == BadSC::CONFUSION)
? 10000 + 7000
- : skill_get_time2(sc2[bi], 7),
+ : 0,
0);
}
@@ -1779,7 +944,7 @@ int skill_additional_effect(struct block_list *src, struct block_list *bl,
skill_status_change_start(src, si, 7, 0, 0, 0,
(bi == BadSC::CONFUSION)
? 10000 + 7000
- : skill_get_time2(sc2[bi], 7),
+ : 0,
0);
}
}
@@ -1963,8 +1128,6 @@ int skill_attack(BF attack_type, struct block_list *src,
return 0;
if (bl->type == BL_PC && pc_isdead((struct map_session_data *) bl)) //対象がPCですでに死んでいたら何もしない
return 0;
- if (skillnotok(skillid, (struct map_session_data *) bl))
- return 0; // [MouseJstr]
if (sc_data && sc_data[SC_HIDING].timer != -1)
{ //ハイディング状態で
if (skill_get_pl(skillid) != 2) //スキルの属性が地属性でなければ何もしない
@@ -1972,13 +1135,6 @@ int skill_attack(BF attack_type, struct block_list *src,
}
if (sc_data && sc_data[SC_TRICKDEAD].timer != -1) //死んだふり中は何もしない
return 0;
- if (skillid == WZ_STORMGUST)
- { //使用スキルがストームガストで
- if (sc_data && sc_data[SC_FREEZE].timer != -1) //凍結状態なら何もしない
- return 0;
- }
- if (skillid == WZ_FROSTNOVA && dsrc->x == bl->x && dsrc->y == bl->y) //使用スキルがフロストノヴァで、dsrcとblが同じ場所なら何もしない
- return 0;
if (src->type == BL_PC && ((struct map_session_data *) src)->chatID) //術者がPCでチャット中なら何もしない
return 0;
if (dsrc->type == BL_PC && ((struct map_session_data *) dsrc)->chatID) //術者がPCでチャット中なら何もしない
@@ -2001,8 +1157,6 @@ int skill_attack(BF attack_type, struct block_list *src,
{ //対象がPCの場合
int sp = skill_get_sp(skillid, skilllv); //使用されたスキルのSPを吸収
sp = sp * sc_data[SC_MAGICROD].val2 / 100; //吸収率計算
- if (skillid == WZ_WATERBALL && skilllv > 1) //ウォーターボールLv1以上
- sp = sp / ((skilllv | 1) * (skilllv | 1)); //さらに計算?
if (sp > 0x7fff)
sp = 0x7fff; //SP多すぎの場合は理論最大値
else if (sp < 1)
@@ -2015,7 +1169,7 @@ int skill_attack(BF attack_type, struct block_list *src,
}
else //回復SP+現在のSPがMSPより小さい場合は回復SPを加算
((struct map_session_data *) bl)->status.sp += sp;
- ((struct map_session_data *) bl)->canact_tick = tick + skill_delayfix(bl, skill_get_delay(SA_MAGICROD, sc_data[SC_MAGICROD].val1)); //
+ ((struct map_session_data *) bl)->canact_tick = tick + skill_delayfix(bl, 0); //
}
}
//マジックロッド処理ここまで
@@ -2031,99 +1185,6 @@ int skill_attack(BF attack_type, struct block_list *src,
if (damage <= 0 || damage < dmg.div_) //吹き飛ばし判定?※
dmg.blewcount = 0;
- if (skillid == CR_GRANDCROSS)
- { //グランドクロス
- if (battle_config.gx_disptype)
- dsrc = src; // 敵ダメージ白文字表示
- if (src == bl)
- type = 4; // 反動はダメージモーションなし
- }
-
-//使用者がPCの場合の処理ここから
- if (src->type == BL_PC)
- {
- struct map_session_data *sd = (struct map_session_data *) src;
- nullpo_ret(sd);
-//連打掌(MO_CHAINCOMBO)ここから
- if (skillid == MO_CHAINCOMBO)
- {
- int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src); //基本ディレイの計算
- if (damage < battle_get_hp(bl))
- { //ダメージが対象のHPより小さい場合
- if (pc_checkskill(sd, MO_COMBOFINISH) > 0 && sd->spiritball > 0) //猛龍拳(MO_COMBOFINISH)取得&気球保持時は+300ms
- delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整
-
- skill_status_change_start(src, SC_COMBO,
- uint16_t(MO_CHAINCOMBO), skilllv,
- 0, 0, delay, 0); //コンボ状態に
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- }
-//連打掌(MO_CHAINCOMBO)ここまで
-//猛龍拳(MO_COMBOFINISH)ここから
- else if (skillid == MO_COMBOFINISH)
- {
- int delay =
- 700 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
- if (damage < battle_get_hp(bl))
- {
- //阿修羅覇凰拳(MO_EXTREMITYFIST)取得&気球4個保持&爆裂波動(MO_EXPLOSIONSPIRITS)状態時は+300ms
- //伏虎拳(CH_TIGERFIST)取得時も+300ms
- if ((pc_checkskill(sd, MO_EXTREMITYFIST) > 0
- && sd->spiritball >= 4
- && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1)
- || (pc_checkskill(sd, CH_TIGERFIST) > 0
- && sd->spiritball > 0)
- || (pc_checkskill(sd, CH_CHAINCRUSH) > 0
- && sd->spiritball > 1))
- delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整
-
- skill_status_change_start(src, SC_COMBO,
- uint16_t(MO_COMBOFINISH), skilllv,
- 0, 0, delay, 0); //コンボ状態に
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- }
-//猛龍拳(MO_COMBOFINISH)ここまで
-//伏虎拳(CH_TIGERFIST)ここから
- else if (skillid == CH_TIGERFIST)
- {
- int delay =
- 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
- if (damage < battle_get_hp(bl))
- {
- if (pc_checkskill(sd, CH_CHAINCRUSH) > 0) //連柱崩撃(CH_CHAINCRUSH)取得時は+300ms
- delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整
-
- skill_status_change_start(src, SC_COMBO,
- uint16_t(CH_TIGERFIST), skilllv,
- 0, 0, delay, 0); //コンボ状態に
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- }
-//伏虎拳(CH_TIGERFIST)ここまで
-//連柱崩撃(CH_CHAINCRUSH)ここから
- else if (skillid == CH_CHAINCRUSH)
- {
- int delay =
- 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
- if (damage < battle_get_hp(bl))
- {
- //阿修羅覇凰拳(MO_EXTREMITYFIST)取得&気球4個保持&爆裂波動(MO_EXPLOSIONSPIRITS)状態時は+300ms
- if (pc_checkskill(sd, MO_EXTREMITYFIST) > 0
- && sd->spiritball >= 4
- && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1)
- delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整
-
- skill_status_change_start(src,
- SC_COMBO, uint16_t(CH_CHAINCRUSH), skilllv,
- 0, 0, delay, 0); //コンボ状態に
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- }
-//連柱崩撃(CH_CHAINCRUSH)ここまで
- }
-//使用者がPCの場合の処理ここまで
//武器スキル?ここから
//AppleGirl Was Here
if (bool(attack_type & BF_MAGIC)
@@ -2189,15 +1250,6 @@ int skill_attack(BF attack_type, struct block_list *src,
switch (skillid)
{
- case WZ_SIGHTRASHER:
- clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion,
- damage, dmg.div_, skillid,
- (lv != 0) ? lv : skilllv, 5);
- break;
- case AS_SPLASHER:
- clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion,
- damage, dmg.div_, skillid, -1, 5);
- break;
case NPC_SELFDESTRUCTION:
case NPC_SELFDESTRUCTION2:
break;
@@ -2209,10 +1261,7 @@ int skill_attack(BF attack_type, struct block_list *src,
}
if (dmg.blewcount > 0)
{ /* 吹き飛ばし処理とそのパケット */
- if (skillid == WZ_SIGHTRASHER)
- skill_blown(src, bl, dmg.blewcount);
- else
- skill_blown(dsrc, bl, dmg.blewcount);
+ skill_blown(dsrc, bl, dmg.blewcount);
if (bl->type == BL_MOB)
clif_fixmobpos((struct mob_data *) bl);
else
@@ -2221,42 +1270,8 @@ int skill_attack(BF attack_type, struct block_list *src,
map_freeblock_lock();
/* 実際にダメージ処理を行う */
- if (skillid != KN_BOWLINGBASH || flag)
- battle_damage(src, bl, damage, 0);
- if (skillid == RG_INTIMIDATE && damage > 0
- && !(battle_get_mode(bl) & 0x20))
- {
- int s_lv = battle_get_lv(src), t_lv = battle_get_lv(bl);
- int rate = 50 + skilllv * 5;
- rate = rate + (s_lv - t_lv);
- if (MRAND(100) < rate)
- skill_addtimerskill(src, tick + 800, bl->id, 0, 0, skillid,
- skilllv,
- skill_timerskill::sktst::from_n(0),
- flag);
- }
-/*
- if (damage > 0 && dmg.flag&BF_SKILL && bl->type==BL_PC && pc_checkskill((struct map_session_data *)bl,RG_PLAGIARISM)){
- struct map_session_data *tsd = (struct map_session_data *)bl;
- nullpo_ret(tsd);
- if (!tsd->status.skill[skillid].id && !tsd->status.skill[skillid].id
- && !(skillid > NPC_PIERCINGATT && skillid < NPC_SUMMONMONSTER) ){
- //既に盗んでいるスキルがあれば該当スキルを消す
- if (tsd->cloneskill_id && tsd->cloneskill_lv && tsd->status.skill[tsd->cloneskill_id].flag==13){
- tsd->status.skill[tsd->cloneskill_id].id=0;
- tsd->status.skill[tsd->cloneskill_id].lv=0;
- tsd->status.skill[tsd->cloneskill_id].flag=0;
- }
- tsd->cloneskill_id=skillid;
- tsd->cloneskill_lv=skilllv;
- tsd->status.skill[skillid].id=skillid;
- tsd->status.skill[skillid].lv= (pc_checkskill(tsd,RG_PLAGIARISM) > skill_get_max(skillid))?
- skill_get_max(skillid):pc_checkskill(tsd,RG_PLAGIARISM);
- tsd->status.skill[skillid].flag=13;//cloneskill flag
- clif_skillinfoblock(tsd);
- }
- }
-*/
+ battle_damage(src, bl, damage, 0);
+
/* ダメージがあるなら追加効果判定 */
if (bl->prev != NULL)
{
@@ -2319,20 +1334,9 @@ int skill_attack(BF attack_type, struct block_list *src,
pc_heal(sd, hp, sp);
}
- if ((skillid != KN_BOWLINGBASH || flag) && rdamage > 0)
+ if (rdamage > 0)
battle_damage(bl, src, rdamage, 0);
- if (bool(attack_type & BF_WEAPON)
- && sc_data
- && sc_data[SC_AUTOCOUNTER].timer != -1
- && sc_data[SC_AUTOCOUNTER].val4 > 0)
- {
- if (sc_data[SC_AUTOCOUNTER].val3 == dsrc->id)
- battle_weapon_attack(bl, dsrc, tick,
- BCT_mid_x80 | sc_data[SC_AUTOCOUNTER].val1_bct());
- skill_status_change_end(bl, SC_AUTOCOUNTER, -1);
- }
-
map_freeblock_unlock();
return (dmg.damage + dmg.damage2); /* 与ダメを返す */
@@ -2356,85 +1360,9 @@ void skill_area_sub(struct block_list *bl,
func(src, bl, skill_id, skill_lv, tick, flag);
}
-static
-void skill_check_unit_range_sub(struct block_list *bl, int *c, int x, int y, int range, SkillID skillid)
+int skill_check_unit_range(int, int, int, int, SkillID)
{
- struct skill_unit *unit;
- int sx[4], sy[4];
- int t_range, tx[4], ty[4];
- int i, r_flag;
-
- nullpo_retv(bl);
- unit = (struct skill_unit *) bl;
-
- if (bl->prev == NULL || bl->type != BL_SKILL)
- return;
-
- if (!unit->alive)
- return;
-
- if (skillid == MG_SAFETYWALL || skillid == AL_PNEUMA)
- {
- if (unit->group->unit_id != 0x7e && unit->group->unit_id != 0x85)
- return;
- }
- else if (skillid == AL_WARP)
- {
- if ((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99)
- && unit->group->unit_id != 0x92)
- return;
- }
- else if ((skillid >= HT_SKIDTRAP && skillid <= HT_CLAYMORETRAP)
- || skillid == HT_TALKIEBOX)
- {
- if ((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99)
- && unit->group->unit_id != 0x92)
- return;
- }
- else if (skillid == WZ_FIREPILLAR)
- {
- if (unit->group->unit_id != 0x87)
- return;
- }
- else
- return;
- t_range = (unit->range != 0) ? unit->range : unit->group->range;
- tx[0] = tx[3] = unit->bl.x - t_range;
- tx[1] = tx[2] = unit->bl.x + t_range;
- ty[0] = ty[1] = unit->bl.y - t_range;
- ty[2] = ty[3] = unit->bl.y + t_range;
- sx[0] = sx[3] = x - range;
- sx[1] = sx[2] = x + range;
- sy[0] = sy[1] = y - range;
- sy[2] = sy[3] = y + range;
- for (i = r_flag = 0; i < 4; i++)
- {
- if (sx[i] >= tx[0] && sx[i] <= tx[1] && sy[i] >= ty[0]
- && sy[i] <= ty[2])
- {
- r_flag = 1;
- break;
- }
- if (tx[i] >= sx[0] && tx[i] <= sx[1] && ty[i] >= sy[0]
- && ty[i] <= sy[2])
- {
- r_flag = 1;
- break;
- }
- }
- if (r_flag)
- (*c)++;
-}
-
-int skill_check_unit_range(int m, int x, int y, int range, SkillID skillid)
-{
- int c = 0;
-
- map_foreachinarea(std::bind(skill_check_unit_range_sub, ph::_1, &c, x, y, range, skillid),
- m, x - 10, y - 10,
- x + 10, y + 10, BL_SKILL);
-
- return c;
+ return 0;
}
static
@@ -2463,23 +1391,6 @@ int skill_check_unit_range2(int m, int x, int y, int range)
return c;
}
-/*=========================================================================
- * 範囲スキル使用処理小分けここから
- */
-static
-BCT skill_area_temp_counter;
-static
-int skill_area_sub_count(struct block_list *, struct block_list *,
- SkillID, int, unsigned int, BCT)
-{
- if (skill_area_temp_counter.lo == 0xff
- && skill_area_temp_counter.mid == 0xff)
- return 0;
- if (!++skill_area_temp_counter.lo)
- ++skill_area_temp_counter.mid;
- return 0;
-}
-
/*==========================================
*
*------------------------------------------
@@ -2491,7 +1402,6 @@ void skill_timer(timer_id, tick_t tick, custom_id_t id, custom_data_t data)
struct mob_data *md = NULL;
struct block_list *src = map_id2bl(id), *target;
struct skill_timerskill *skl = NULL;
- int range;
nullpo_retv(src);
@@ -2517,201 +1427,27 @@ void skill_timer(timer_id, tick_t tick, custom_id_t id, custom_data_t data)
skl->timer = -1;
if (skl->target_id)
{
- struct block_list tbl;
target = map_id2bl(skl->target_id);
- if (skl->skill_id == RG_INTIMIDATE)
- {
- if (target == NULL)
- {
- target = &tbl; //初期化してないのにアドレス突っ込んでいいのかな?
- target->type = BL_NUL;
- target->m = src->m;
- target->prev = target->next = NULL;
- }
- }
if (target == NULL)
return;
- if (target->prev == NULL && skl->skill_id != RG_INTIMIDATE)
+ if (target->prev == NULL)
return;
if (src->m != target->m)
return;
if (sd && pc_isdead(sd))
return;
if (target->type == BL_PC
- && pc_isdead((struct map_session_data *) target)
- && skl->skill_id != RG_INTIMIDATE)
+ && pc_isdead((struct map_session_data *) target))
return;
switch (skl->skill_id)
{
- case TF_BACKSLIDING:
- break;
- case RG_INTIMIDATE:
- if (sd && !map[src->m].flag.noteleport)
- {
- // always initialized, but clang is not smart enough
- int x = 0, y = 0;
- int i, j, c;
- pc_randomwarp(sd, 3);
- for (i = 0; i < 16; i++)
- {
- j = MRAND(8);
- x = sd->bl.x + dirx[j];
- y = sd->bl.y + diry[j];
- if ((c = map_getcell(sd->bl.m, x, y)) != 1 && c != 5)
- break;
- }
- if (i >= 16)
- {
- x = sd->bl.x;
- y = sd->bl.y;
- }
- if (target->prev != NULL)
- {
- if (target->type == BL_PC
- && !pc_isdead((struct map_session_data *)
- target))
- pc_setpos((struct map_session_data *) target,
- map[sd->bl.m].name, x, y, 3);
- else if (target->type == BL_MOB)
- mob_warp((struct mob_data *) target, -1, x, y,
- 3);
- }
- }
- else if (md && !map[src->m].flag.monster_noteleport)
- {
- // always initialized, but clang isn't smart enough
- int x = 0, y = 0;
- int i, j, c;
- mob_warp(md, -1, -1, -1, 3);
- for (i = 0; i < 16; i++)
- {
- j = MRAND(8);
- x = md->bl.x + dirx[j];
- y = md->bl.y + diry[j];
- if ((c = map_getcell(md->bl.m, x, y)) != 1 && c != 5)
- break;
- }
- if (i >= 16)
- {
- x = md->bl.x;
- y = md->bl.y;
- }
- if (target->prev != NULL)
- {
- if (target->type == BL_PC
- && !pc_isdead((struct map_session_data *)
- target))
- pc_setpos((struct map_session_data *) target,
- map[md->bl.m].name, x, y, 3);
- else if (target->type == BL_MOB)
- mob_warp((struct mob_data *) target, -1, x, y,
- 3);
- }
- }
- break;
-
- case BA_FROSTJOKE: /* 寒いジョーク */
- case DC_SCREAM: /* スクリーム */
- range = 15; //視界全体
- map_foreachinarea(std::bind(skill_frostjoke_scream, ph::_1, src, skl->skill_id, skl->skill_lv, tick),
- src->m, src->x - range, src->y - range,
- src->x + range, src->y + range,
- BL_NUL);
- break;
-
default:
skill_attack(skl->type.bf, src, src, target, skl->skill_id,
skl->skill_lv, tick, skl->flag);
break;
}
}
- else
- {
- if (src->m != skl->map)
- return;
- switch (skl->skill_id)
- {
- case WZ_METEOR:
- if (skl->type.n >= 0)
- {
- skill_unitsetting(src, skl->skill_id, skl->skill_lv,
- skl->type.xy.x, skl->type.xy.y,
- 0);
- }
- else
- skill_unitsetting(src, skl->skill_id, skl->skill_lv,
- skl->x, skl->y, 0);
- break;
- }
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_addtimerskill(struct block_list *src, unsigned int tick,
- int target, int x, int y,
- SkillID skill_id, int skill_lv,
- skill_timerskill::sktst type, BCT flag)
-{
- int i;
-
- nullpo_retr(1, src);
-
- if (src->type == BL_PC)
- {
- struct map_session_data *sd = (struct map_session_data *) src;
- nullpo_retr(1, sd);
- for (i = 0; i < MAX_SKILLTIMERSKILL; i++)
- {
- if (sd->skilltimerskill[i].timer == -1)
- {
- sd->skilltimerskill[i].timer =
- add_timer(tick, skill_timer, src->id, i);
- sd->skilltimerskill[i].src_id = src->id;
- sd->skilltimerskill[i].target_id = target;
- sd->skilltimerskill[i].skill_id = skill_id;
- sd->skilltimerskill[i].skill_lv = skill_lv;
- sd->skilltimerskill[i].map = src->m;
- sd->skilltimerskill[i].x = x;
- sd->skilltimerskill[i].y = y;
- sd->skilltimerskill[i].type = type;
- sd->skilltimerskill[i].flag = flag;
-
- return 0;
- }
- }
- return 1;
- }
- else if (src->type == BL_MOB)
- {
- struct mob_data *md = (struct mob_data *) src;
- nullpo_retr(1, md);
- for (i = 0; i < MAX_MOBSKILLTIMERSKILL; i++)
- {
- if (md->skilltimerskill[i].timer == -1)
- {
- md->skilltimerskill[i].timer =
- add_timer(tick, skill_timer, src->id, i);
- md->skilltimerskill[i].src_id = src->id;
- md->skilltimerskill[i].target_id = target;
- md->skilltimerskill[i].skill_id = skill_id;
- md->skilltimerskill[i].skill_lv = skill_lv;
- md->skilltimerskill[i].map = src->m;
- md->skilltimerskill[i].x = x;
- md->skilltimerskill[i].y = y;
- md->skilltimerskill[i].type = type;
- md->skilltimerskill[i].flag = flag;
-
- return 0;
- }
- }
- return 1;
- }
-
- return 1;
}
/*==========================================
@@ -2782,8 +1518,6 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
if (sd && pc_isdead(sd))
return 1;
- if ((skillid == WZ_SIGHTRASHER || skillid == CR_GRANDCROSS) && src != bl)
- bl = src;
if (bl->prev == NULL)
return 1;
if (bl->type == BL_PC && pc_isdead((struct map_session_data *) bl))
@@ -2791,26 +1525,6 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
map_freeblock_lock();
switch (skillid)
{
- /* 武器攻撃系スキル */
- case SM_BASH: /* バッシュ */
- case MC_MAMMONITE: /* メマーナイト */
- case AC_DOUBLE: /* ダブルストレイフィング */
- case AS_SONICBLOW: /* ソニックブロー */
- case KN_PIERCE: /* ピアース */
- case KN_SPEARBOOMERANG: /* スピアブーメラン */
- case TF_POISON: /* インベナム */
- case TF_SPRINKLESAND: /* 砂まき */
- case AC_CHARGEARROW: /* チャージアロー */
- case KN_SPEARSTAB: /* スピアスタブ */
- case RG_RAID: /* サプライズアタック */
- case RG_INTIMIDATE: /* インティミデイト */
- case BA_MUSICALSTRIKE: /* ミュージカルストライク */
- case DC_THROWARROW: /* 矢撃ち */
- case BA_DISSONANCE: /* 不協和音 */
- case CR_HOLYCROSS: /* ホーリークロス */
- case CR_SHIELDCHARGE:
- case CR_SHIELDBOOMERANG:
-
/* 以下MOB専用 */
/* 単体攻撃、SP減少攻撃、遠距離攻撃、防御無視攻撃、多段攻撃 */
case NPC_PIERCINGATT:
@@ -2839,16 +1553,6 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
case NPC_HOLYATTACK:
case NPC_DARKNESSATTACK:
case NPC_TELEKINESISATTACK:
- case LK_AURABLADE: /* オーラブレード */
- case LK_SPIRALPIERCE: /* スパイラルピアース */
- case LK_HEADCRUSH: /* ヘッドクラッシュ */
- case LK_JOINTBEAT: /* ジョイントビート */
- case PA_PRESSURE: /* プレッシャー */
- case PA_SACRIFICE: /* サクリファイス */
- case SN_SHARPSHOOTING: /* シャープシューティング */
- case CG_ARROWVULCAN: /* アローバルカン */
- case ASC_BREAKER: /* ソウルブレーカー */
- case HW_MAGICCRASHER: /* マジッククラッシャー */
skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
flag);
break;
@@ -2857,170 +1561,7 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
skill_attack(BF_MISC, src, src, bl, skillid, skilllv, tick,
flag);
break;
- case MO_INVESTIGATE: /* 発勁 */
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(src);
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- if (sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end(src, SC_BLADESTOP, -1);
- }
- break;
- case SN_FALCONASSAULT: /* ファルコンアサルト */
- skill_attack(BF_MISC, src, src, bl, skillid, skilllv, tick,
- flag);
- break;
- case KN_BRANDISHSPEAR: /* ブランディッシュスピア */
- {
- struct mob_data *md = (struct mob_data *) bl;
- nullpo_retr(1, md);
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- if (md->hp > 0)
- {
- skill_blown(src, bl, skill_get_blewcount(skillid, skilllv));
- if (bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *) bl);
- else
- clif_fixpos(bl);
- }
- }
- break;
- case RG_BACKSTAP: /* バックスタブ */
- {
- int dir = map_calc_dir(src, bl->x, bl->y), t_dir =
- battle_get_dir(bl);
- int dist = distance(src->x, src->y, bl->x, bl->y);
- if ((dist > 0 && !map_check_dir(dir, t_dir))
- || bl->type == BL_SKILL)
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(src);
- if (sc_data && sc_data[SC_HIDING].timer != -1)
- skill_status_change_end(src, SC_HIDING, -1); // ハイディング解除
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- skill_blown(src, bl, skill_get_blewcount(skillid, skilllv));
- }
- else if (src->type == BL_PC)
- clif_skill_fail(sd, sd->skillid, 0, 0);
- }
- break;
-
- case AM_ACIDTERROR: /* アシッドテラー */
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- if (bl->type == BL_PC
- && MRAND(100) < skill_get_time(skillid, skilllv)
- && battle_config.equipment_breaking)
- pc_breakarmor((struct map_session_data *) bl);
- break;
- case MO_FINGEROFFENSIVE: /* 指弾 */
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(src);
-
- if (!battle_config.finger_offensive_type)
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- else
- {
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- if (sd)
- {
- for (int i = 1; i < sd->spiritball_old; i++)
- skill_addtimerskill(src, tick + i * 200, bl->id, 0,
- 0, skillid, skilllv,
- skill_timerskill::sktst::from_bf(BF_WEAPON),
- flag);
- sd->canmove_tick = tick + (sd->spiritball_old - 1) * 200;
- }
- }
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end(src, SC_BLADESTOP, -1);
- }
- break;
- case MO_CHAINCOMBO: /* 連打掌 */
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(src);
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end(src, SC_BLADESTOP, -1);
- }
- break;
- case MO_COMBOFINISH: /* 猛龍拳 */
- case CH_TIGERFIST: /* 伏虎拳 */
- case CH_CHAINCRUSH: /* 連柱崩撃 */
- case CH_PALMSTRIKE: /* 猛虎硬派山 */
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- break;
- case MO_EXTREMITYFIST: /* 阿修羅覇鳳拳 */
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(src);
-
- if (sd)
- {
- struct walkpath_data wpd;
- int dx, dy;
-
- dx = bl->x - sd->bl.x;
- dy = bl->y - sd->bl.y;
- if (dx > 0)
- dx++;
- else if (dx < 0)
- dx--;
- if (dy > 0)
- dy++;
- else if (dy < 0)
- dy--;
- if (dx == 0 && dy == 0)
- dx++;
- if (path_search(&wpd, src->m, sd->bl.x, sd->bl.y, sd->bl.x + dx,
- sd->bl.y + dy, 1) == -1)
- {
- dx = bl->x - sd->bl.x;
- dy = bl->y - sd->bl.y;
- if (path_search(&wpd, src->m, sd->bl.x, sd->bl.y, sd->bl.x + dx,
- sd->bl.y + dy, 1) == -1)
- {
- clif_skill_fail(sd, sd->skillid, 0, 0);
- break;
- }
- }
- sd->to_x = sd->bl.x + dx;
- sd->to_y = sd->bl.y + dy;
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- clif_walkok(sd);
- clif_movechar(sd);
- if (dx < 0)
- dx = -dx;
- if (dy < 0)
- dy = -dy;
- sd->attackabletime = sd->canmove_tick =
- tick + 100 + sd->speed * ((dx > dy) ? dx : dy);
- if (sd->canact_tick < sd->canmove_tick)
- sd->canact_tick = sd->canmove_tick;
- pc_movepos(sd, sd->to_x, sd->to_y);
- skill_status_change_end(&sd->bl, SC_COMBO, -1);
- }
- else
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- flag);
- skill_status_change_end(src, SC_EXPLOSIONSPIRITS, -1);
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end(src, SC_BLADESTOP, -1);
- }
- break;
- /* 武器系範囲攻撃スキル */
- case AC_SHOWER: /* アローシャワー */
- case SM_MAGNUM: /* マグナムブレイク */
- case AS_GRIMTOOTH: /* グリムトゥース */
- case MC_CARTREVOLUTION: /* カートレヴォリューション */
case NPC_SPLASHATTACK: /* スプラッシュアタック */
- case ASC_METEORASSAULT: /* メテオアサルト */
- case AS_SPLASHER: /* [Valaris] */
{
if (flag & BCT_lo_x01)
{
@@ -3028,13 +1569,6 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
if (bl->id != skill_area_temp_id)
{
BCT dist = BCT_ZERO;
- if (skillid == SM_MAGNUM)
- {
- /* マグナムブレイクなら中心からの距離を計算 */
- int dx = abs(bl->x - skill_area_temp_x);
- int dy = abs(bl->y - skill_area_temp_y);
- dist.lo = ((dx > dy) ? dx : dy);
- }
skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv,
tick, BCT_mid_x05 | dist);
}
@@ -3043,16 +1577,7 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
{
int ar = 1;
int x = bl->x, y = bl->y;
- if (skillid == SM_MAGNUM)
- {
- x = src->x;
- y = src->y;
- }
- else if (skillid == AC_SHOWER || skillid == ASC_METEORASSAULT) /* アローシャワー、メテオアサルト範囲5*5 */
- ar = 2;
- else if (skillid == AS_SPLASHER) /* ベナムスプラッシャー範囲3*3 */
- ar = 1;
- else if (skillid == NPC_SPLASHATTACK) /* スプラッシュアタックは範囲7*7 */
+ if (skillid == NPC_SPLASHATTACK) /* スプラッシュアタックは範囲7*7 */
ar = 3;
skill_area_temp_id = bl->id;
skill_area_temp_x = x;
@@ -3069,229 +1594,12 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
}
break;
- case KN_BOWLINGBASH: /* ボウリングバッシュ */
- if (flag & 1)
- {
- /* 個別にダメージを与える */
- if (bl->id != skill_area_temp_id)
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv,
- tick, BCT_mid_x05);
- }
- else
- {
- int damage;
- map_freeblock_lock();
- damage =
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv,
- tick, BCT_ZERO);
- if (damage > 0)
- {
- int i, c; /* 他人から聞いた動きなので間違ってる可能性大&効率が悪いっす>< */
- c = skill_get_blewcount(skillid, skilllv);
- for (i = 0; i < c; i++)
- {
- skill_blown(src, bl, 1);
- if (bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *) bl);
- else
- clif_fixpos(bl);
- skill_area_temp_counter = BCT_ZERO;
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY, skill_area_sub_count),
- bl->m, bl->x - 1, bl->y - 1,
- bl->x + 1, bl->y + 1, BL_NUL);
- if (skill_area_temp_counter > 1)
- break;
- }
- skill_area_temp_id = bl->id;
- skill_area_temp_x = bl->x;
- skill_area_temp_y = bl->y;
- /* その後ターゲット以外の範囲内の敵全体に処理を行う */
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x01, skill_castend_damage_id),
- bl->m, bl->x - 1, bl->y - 1,
- bl->x + 1, bl->y + 1, BL_NUL);
- battle_damage(src, bl, damage, 1);
- if (rdamage > 0)
- battle_damage(bl, src, rdamage, 0);
- }
- map_freeblock_unlock();
- }
- break;
-
- case ALL_RESURRECTION: /* リザレクション */
- case PR_TURNUNDEAD: /* ターンアンデッド */
- if (bl->type != BL_PC
- && battle_check_undead(battle_get_race(bl),
- battle_get_elem_type(bl)))
- skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- flag);
- else
- {
- map_freeblock_unlock();
- return 1;
- }
- break;
-
- /* 魔法系スキル */
- case MG_SOULSTRIKE: /* ソウルストライク */
- case MG_COLDBOLT: /* コールドボルト */
- case MG_FIREBOLT: /* ファイアーボルト */
- case MG_LIGHTNINGBOLT: /* ライトニングボルト */
- case WZ_EARTHSPIKE: /* アーススパイク */
case AL_HEAL: /* ヒール */
- case AL_HOLYLIGHT: /* ホーリーライト */
- case MG_FROSTDIVER: /* フロストダイバー */
- case WZ_JUPITEL: /* ユピテルサンダー */
case NPC_MAGICALATTACK: /* MOB:魔法打撃攻撃 */
- case PR_ASPERSIO: /* アスペルシオ */
skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick,
flag);
break;
- case WZ_WATERBALL: /* ウォーターボール */
- skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- flag);
- if (skilllv > 1)
- skill_status_change_start(src, SC_WATERBALL, skilllv, bl->id,
- 0, 0, 0, 0);
- break;
-
- case PR_BENEDICTIO: /* 聖体降福 */
- if (battle_get_race(bl) == 1 || battle_get_race(bl) == 6)
- skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- flag);
- break;
-
- /* 魔法系範囲攻撃スキル */
- case MG_NAPALMBEAT: /* ナパームビート */
- case MG_FIREBALL: /* ファイヤーボール */
- if (flag & 1)
- {
- /* 個別にダメージを与える */
- if (bl->id != skill_area_temp_id)
- {
- BCT dist = BCT_ZERO;
- if (skillid == MG_FIREBALL)
- { /* ファイヤーボールなら中心からの距離を計算 */
- int dx = abs(bl->x - skill_area_temp_x);
- int dy = abs(bl->y - skill_area_temp_y);
- dist.lo = ((dx > dy) ? dx : dy);
- }
- skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv,
- tick, dist | BCT_mid_x05);
- }
- }
- else
- {
- int ar = (skillid == MG_NAPALMBEAT) ? 1 : 2;
- skill_area_temp_id = bl->id;
- skill_area_temp_counter = BCT_ZERO;
- if (skillid == MG_NAPALMBEAT)
- {
- /* ナパームでは先に数える */
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY, skill_area_sub_count),
- bl->m, bl->x - 1, bl->y - 1,
- bl->x + 1, bl->y + 1, BL_NUL);
- }
- else
- {
- skill_area_temp_x = bl->x;
- skill_area_temp_y = bl->y;
- }
- BCT counter = BCT_ZERO;
- counter.lo = skill_area_temp_counter;
- counter.mid = skill_area_temp_counter >> 8;
- /* まずターゲットに攻撃を加える */
- skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- counter);
- /* その後ターゲット以外の範囲内の敵全体に処理を行う */
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x01, skill_castend_damage_id),
- bl->m, bl->x - ar, bl->y - ar,
- bl->x + ar, bl->y + ar, BL_NUL);
- }
- break;
-
- case HW_NAPALMVULCAN: // Fixed By SteelViruZ
- if (flag & 1)
- {
- if (bl->id != skill_area_temp_id)
- {
- skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv,
- tick, skill_area_temp_counter/* wtf */);
- }
- }
- else
- {
- int ar = (skillid == HW_NAPALMVULCAN) ? 1 : 2;
- skill_area_temp_id = bl->id;
- skill_area_temp_counter = BCT_ZERO;
- if (skillid == HW_NAPALMVULCAN)
- {
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY, skill_area_sub_count),
- bl->m, bl->x - 1, bl->y - 1,
- bl->x + 1, bl->y + 1, BL_NUL);
- }
- else
- {
- skill_area_temp_x = bl->x;
- skill_area_temp_y = bl->y;
- }
- skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- skill_area_temp_counter);
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x01, skill_castend_damage_id),
- bl->m, bl->x - ar, bl->y - ar,
- bl->x + ar, bl->y + ar, BL_NUL);
- }
- break;
-
- case WZ_FROSTNOVA: /* フロストノヴァ */
- skill_castend_pos2(src, bl->x, bl->y, skillid, skilllv, tick, BCT_ZERO);
- skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- flag);
- break;
-
- case WZ_SIGHTRASHER:
- skill_castend_pos2(src, bl->x, bl->y, skillid, skilllv, tick, BCT_ZERO);
- skill_status_change_end(src, SC_SIGHT, -1);
- break;
-
- /* その他 */
- case HT_BLITZBEAT: /* ブリッツビート */
- if (flag & 1)
- {
- /* 個別にダメージを与える */
- if (bl->id != skill_area_temp_id)
- skill_attack(BF_MISC, src, src, bl, skillid, skilllv,
- tick,
- skill_area_temp_counter | (flag & BCT_highnib));
- }
- else
- {
- skill_area_temp_counter = BCT_ZERO;
- skill_area_temp_id = bl->id;
- if (flag & BCT_highnib)
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY, skill_area_sub_count),
- bl->m, bl->x - 1, bl->y - 1,
- bl->x + 1, bl->y + 1, BL_NUL);
- /* まずターゲットに攻撃を加える */
- skill_attack(BF_MISC, src, src, bl, skillid, skilllv, tick,
- skill_area_temp_counter | (flag & BCT_highnib));
- /* その後ターゲット以外の範囲内の敵全体に処理を行う */
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x01, skill_castend_damage_id),
- bl->m, bl->x - 1, bl->y - 1,
- bl->x + 1, bl->y + 1, BL_NUL);
- }
- break;
-
- case CR_GRANDCROSS: /* グランドクロス */
- /* スキルユニット配置 */
- skill_castend_pos2(src, bl->x, bl->y, skillid, skilllv, tick, BCT_ZERO);
- if (sd)
- sd->canmove_tick = tick + 1000;
- else if (src->type == BL_MOB)
- mob_changestate((struct mob_data *) src, MS_DELAY, 1000);
- break;
-
- case TF_THROWSTONE: /* 石投げ */
case NPC_SMOKING: /* スモーキング */
skill_attack(BF_MISC, src, src, bl, skillid, skilllv, tick, BCT_ZERO);
break;
@@ -3376,19 +1684,13 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
*/
int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl,
SkillID skillid, int skilllv,
- unsigned int tick, BCT flag)
+ unsigned int, BCT)
{
struct map_session_data *sd = NULL;
struct map_session_data *dstsd = NULL;
struct mob_data *md = NULL;
struct mob_data *dstmd = NULL;
- int sc_def_vit, sc_def_mdef, strip_fix, strip_time, strip_per;
- //クラスチェンジ用ボスモンスターID
- int changeclass[] =
- { 1038, 1039, 1046, 1059, 1086, 1087, 1112, 1115, 1157, 1159, 1190,
- 1272, 1312, 1373, 1492
- };
- int poringclass[] = { 1002 };
+ int sc_def_vit, sc_def_mdef, strip_fix;
nullpo_retr(1, src);
nullpo_retr(1, bl);
@@ -3426,12 +1728,10 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl,
return 1;
if (sd && pc_isdead(sd))
return 1;
- if (dstsd && pc_isdead(dstsd) && skillid != ALL_RESURRECTION)
+ if (dstsd && pc_isdead(dstsd))
return 1;
if (battle_get_class(bl) == 1288)
return 1;
- if (skillnotok(skillid, (struct map_session_data *) bl)) // [MouseJstr]
- return 0;
map_freeblock_lock();
switch (skillid)
@@ -3440,7 +1740,6 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl,
{
int heal = skill_calc_heal(src, skilllv);
int heal_get_jobexp;
- int skill;
struct pc_base_job s_class;
if (dstsd && dstsd->special_state.no_magic_damage)
@@ -3448,8 +1747,6 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl,
if (sd)
{
s_class = pc_calc_base_job(sd->status.pc_class);
- if ((skill = pc_checkskill(sd, HP_MEDITATIO)) > 0) // メディテイティオ
- heal += heal * (skill * 2 / 100);
if (sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //自分も対象もPC、対象が自分のパートナー、自分がスパノビ、自分が♀なら
heal = heal * 2; //スパノビの嫁が旦那にヒールすると2倍になる
}
@@ -3470,1349 +1767,11 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl,
}
break;
- case ALL_RESURRECTION: /* リザレクション */
- if (bl->type == BL_PC)
- {
- int per = 0;
- struct map_session_data *tsd = (struct map_session_data *) bl;
- nullpo_retr(1, tsd);
- if ((map[bl->m].flag.pvp) && tsd->pvp_point < 0)
- break; /* PVPで復活不可能状態 */
-
- if (pc_isdead(tsd))
- { /* 死亡判定 */
- switch (skilllv)
- {
- case 1:
- per = 10;
- break;
- case 2:
- per = 30;
- break;
- case 3:
- per = 50;
- break;
- case 4:
- per = 80;
- break;
- }
- tsd->status.hp = tsd->status.max_hp * per / 100;
- if (tsd->status.hp <= 0)
- tsd->status.hp = 1;
- if (tsd->special_state.restart_full_recover)
- { /* オシリスカード */
- tsd->status.hp = tsd->status.max_hp;
- tsd->status.sp = tsd->status.max_sp;
- }
- pc_setstand(tsd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(tsd,
- battle_config.pc_invincible_time);
- clif_updatestatus(tsd, SP_HP);
- clif_resurrection(&tsd->bl, 1);
- if (src != bl && sd && battle_config.resurrection_exp > 0)
- {
- int exp = 0, jexp = 0;
- int lv =
- tsd->status.base_level - sd->status.base_level,
- jlv =
- tsd->status.job_level - sd->status.job_level;
- if (lv > 0)
- {
- exp =
- (int)((double) tsd->status.base_exp *
- (double) lv *
- (double) battle_config.resurrection_exp
- / 1000000.);
- if (exp < 1)
- exp = 1;
- }
- if (jlv > 0)
- {
- jexp =
- (int)((double) tsd->status.job_exp *
- (double) lv *
- (double) battle_config.resurrection_exp
- / 1000000.);
- if (jexp < 1)
- jexp = 1;
- }
- if (exp > 0 || jexp > 0)
- pc_gainexp(sd, exp, jexp);
- }
- }
- }
- break;
-
- case AL_DECAGI: /* 速度減少 */
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (MRAND(100) <
- (50 + skilllv * 3 +
- (battle_get_lv(src) + battle_get_int(src) / 5) -
- sc_def_mdef))
- {
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv),
- 0);
- }
- break;
-
- case AL_CRUCIS:
- if (flag & 1)
- {
- int race = battle_get_race(bl), ele =
- battle_get_elem_type(bl);
- if (battle_check_target(src, bl, BCT_ENEMY)
- && (race == 6 || battle_check_undead(race, ele)))
- {
- int slv = battle_get_lv(src), tlv =
- battle_get_lv(bl), rate;
- rate = 25 + skilllv * 2 + slv - tlv;
- if (MRAND(100) < rate)
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid], skilllv,
- 0, 0, 0, 0, 0);
- }
- }
- else
- {
- int range = 15;
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x01, skill_castend_nodamage_id),
- src->m, src->x - range, src->y - range,
- src->x + range, src->y + range, BL_NUL);
- }
- break;
-
- case PR_LEXDIVINA: /* レックスディビーナ */
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (sc_data && sc_data[SC_DIVINA].timer != -1)
- skill_status_change_end(bl, SC_DIVINA, -1);
- else if (MRAND(100) < sc_def_vit)
- {
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv),
- 0);
- }
- }
- break;
- case SA_ABRACADABRA:
- break;
- case SA_COMA:
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (dstsd)
- {
- dstsd->status.hp = 1;
- dstsd->status.sp = 1;
- clif_updatestatus(dstsd, SP_HP);
- clif_updatestatus(dstsd, SP_SP);
- }
- if (dstmd)
- dstmd->hp = 1;
- break;
- case SA_FULLRECOVERY:
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (dstsd)
- pc_heal(dstsd, dstsd->status.max_hp, dstsd->status.max_sp);
- if (dstmd)
- dstmd->hp = battle_get_max_hp(&dstmd->bl);
- break;
- case SA_SUMMONMONSTER:
- if (sd)
- mob_once_spawn(sd, map[sd->bl.m].name, sd->bl.x, sd->bl.y,
- "--ja--", -1, 1, "");
- break;
- case SA_LEVELUP:
- if (sd && pc_nextbaseexp(sd))
- pc_gainexp(sd, pc_nextbaseexp(sd) * 10 / 100, 0);
- break;
-
- case SA_INSTANTDEATH:
- if (sd)
- pc_damage(NULL, sd, sd->status.max_hp);
- break;
-
- case SA_QUESTION:
- case SA_GRAVITY:
- break;
- case SA_CLASSCHANGE:
- if (dstmd)
- mob_class_change(dstmd, changeclass);
- break;
- case SA_MONOCELL:
- if (dstmd)
- mob_class_change(dstmd, poringclass);
- break;
- case SA_DEATH:
- if (dstsd)
- pc_damage(NULL, dstsd, dstsd->status.max_hp);
- if (dstmd)
- mob_damage(NULL, dstmd, dstmd->hp, 1);
- break;
- case SA_REVERSEORCISH:
- if (dstsd)
- pc_setoption(dstsd, dstsd->status.option | Option::ORC_HEAD);
- break;
- case SA_FORTUNE:
- if (sd)
- pc_getzeny(sd, battle_get_lv(bl) * 100);
- break;
- case AL_INCAGI: /* 速度増加 */
- case AL_BLESSING: /* ブレッシング */
- case PR_SLOWPOISON:
- case PR_IMPOSITIO: /* イムポシティオマヌス */
- case PR_LEXAETERNA: /* レックスエーテルナ */
- case PR_SUFFRAGIUM: /* サフラギウム */
- case PR_BENEDICTIO: /* 聖体降福 */
- case CR_PROVIDENCE: /* プロヴィデンス */
- case CG_MARIONETTE: /* マリオネットコントロール */
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- {
- }
- else
- {
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv),
- 0);
- }
- break;
-
- case SA_FLAMELAUNCHER: // added failure chance and chance to break weapon if turned on [Valaris]
- case SA_FROSTWEAPON:
- case SA_LIGHTNINGLOADER:
- case SA_SEISMICWEAPON:
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- {
- break;
- }
- if (bl->type == BL_PC)
- {
- struct map_session_data *sd2 = (struct map_session_data *) bl;
- if (sd2->status.weapon == 0
- || sd2->sc_data[SC_FLAMELAUNCHER].timer != -1
- || sd2->sc_data[SC_FROSTWEAPON].timer != -1
- || sd2->sc_data[SC_LIGHTNINGLOADER].timer != -1
- || sd2->sc_data[SC_SEISMICWEAPON].timer != -1
- || sd2->sc_data[SC_ENCPOISON].timer != -1)
- {
- clif_skill_fail(sd, skillid, 0, 0);
- break;
- }
- }
- if (MRAND(100) > (75 + skilllv * 1) && (skilllv != 5))
- {
- clif_skill_fail(sd, skillid, 0, 0);
- if (bl->type == BL_PC && battle_config.equipment_breaking)
- {
- struct map_session_data *sd2 =
- (struct map_session_data *) bl;
- if (sd != sd2)
- clif_displaymessage(sd->fd,
- "You broke target's weapon");
- pc_breakweapon(sd2);
- }
- break;
- }
- else
- {
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv),
- 0);
- }
- break;
-
- case PR_ASPERSIO: /* アスペルシオ */
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (bl->type == BL_MOB)
- break;
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- break;
- case PR_KYRIE: /* キリエエレイソン */
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- break;
- case KN_AUTOCOUNTER: /* オートカウンター */
- case KN_TWOHANDQUICKEN: /* ツーハンドクイッケン */
- case CR_SPEARQUICKEN: /* スピアクイッケン */
- case CR_REFLECTSHIELD:
- case AS_POISONREACT: /* ポイズンリアクト */
- case MC_LOUD: /* ラウドボイス */
- case MG_ENERGYCOAT: /* エナジーコート */
- case SM_ENDURE: /* インデュア */
- case MG_SIGHT: /* サイト */
- case AL_RUWACH: /* ルアフ */
- case MO_EXPLOSIONSPIRITS: // 爆裂波動
- case MO_STEELBODY: // 金剛
- case LK_AURABLADE: /* オーラブレード */
- case LK_PARRYING: /* パリイング */
- case LK_CONCENTRATION: /* コンセントレーション */
- case LK_BERSERK: /* バーサーク */
- case HP_ASSUMPTIO: /* */
- case WS_CARTBOOST: /* カートブースト */
- case SN_SIGHT: /* トゥルーサイト */
- case WS_MELTDOWN: /* メルトダウン */
- case ST_REJECTSWORD: /* リジェクトソード */
- case HW_MAGICPOWER: /* 魔法力増幅 */
- case PF_MEMORIZE: /* メモライズ */
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- break;
- case AS_ENCHANTPOISON: // Prevent spamming [Valaris]
- if (bl->type == BL_PC)
- {
- struct map_session_data *sd2 = (struct map_session_data *) bl;
- if (sd2->sc_data[SC_FLAMELAUNCHER].timer != -1
- || sd2->sc_data[SC_FROSTWEAPON].timer != -1
- || sd2->sc_data[SC_LIGHTNINGLOADER].timer != -1
- || sd2->sc_data[SC_SEISMICWEAPON].timer != -1
- || sd2->sc_data[SC_ENCPOISON].timer != -1)
- {
- clif_skill_fail(sd, skillid, 0, 0);
- break;
- }
- }
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- break;
- case LK_TENSIONRELAX: /* テンションリラックス */
- pc_setsit(sd);
- clif_sitting(sd->fd, sd);
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- break;
- case MC_CHANGECART:
- break;
- case AC_CONCENTRATION: /* 集中力向上 */
- {
- int range = 1;
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- map_foreachinarea(std::bind(skill_status_change_timer_sub, ph::_1, src, SkillStatusChangeTable[skillid], tick),
- src->m, src->x - range, src->y - range,
- src->x + range, src->y + range, BL_NUL);
- }
- break;
- case SM_PROVOKE: /* プロボック */
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
-
- /* MVPmobと不死には効かない */
- if ((bl->type == BL_MOB && battle_get_mode(bl) & 0x20) || battle_check_undead(battle_get_race(bl), battle_get_elem_type(bl))) //不死には効かない
- {
- map_freeblock_unlock();
- return 1;
- }
-
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
-
- if (dstmd && dstmd->skilltimer != -1 && dstmd->state.skillcastcancel) // 詠唱妨害
- skill_castcancel(bl, 0);
- if (dstsd && dstsd->skilltimer != -1
- && !dstsd->special_state.no_castcancel
- && dstsd->state.skillcastcancel
- && !dstsd->special_state.no_castcancel2)
- skill_castcancel(bl, 0);
-
- if (sc_data)
- {
- if (sc_data[SC_FREEZE].timer != -1)
- skill_status_change_end(bl, SC_FREEZE, -1);
- if (sc_data[SC_STONE].timer != -1
- && sc_data[SC_STONE].val2 == 0)
- skill_status_change_end(bl, SC_STONE, -1);
- if (sc_data[SC_SLEEP].timer != -1)
- skill_status_change_end(bl, SC_SLEEP, -1);
- }
-
- if (bl->type == BL_MOB)
- {
- int range = skill_get_range(skillid, skilllv);
- if (range < 0)
- range = battle_get_range(src) - (range + 1);
- mob_target((struct mob_data *) bl, src, range);
- }
- }
- break;
-
- case CR_DEVOTION: /* ディボーション */
- if (sd && dstsd)
- {
- //転生や養子の場合の元の職業を算出する
-
- int lv = sd->status.base_level - dstsd->status.base_level;
- lv = (lv < 0) ? -lv : lv;
- if ((dstsd->bl.type != BL_PC) // 相手はPCじゃないとだめ
- || (sd->bl.id == dstsd->bl.id) // 相手が自分はだめ
- || (lv > 10) // レベル差±10まで
- || (!sd->status.party_id) // PTにもギルドにも所属無しはだめ
- || (sd->status.party_id != dstsd->status.party_id) // 同じパーティーか、
- // 同じギルドじゃないとだめ
- || (dstsd->status.pc_class == 14 || dstsd->status.pc_class == 21
- || dstsd->status.pc_class == 4015
- || dstsd->status.pc_class == 4022))
- { // クルセだめ
- clif_skill_fail(sd, skillid, 0, 0);
- map_freeblock_unlock();
- return 1;
- }
- for (int i = 0; i < skilllv; i++)
- {
- if (!sd->dev.val1[i])
- { // 空きがあったら入れる
- sd->dev.val1[i] = bl->id;
- sd->dev.val2[i] = bl->id;
- break;
- }
- else if (i == skilllv - 1)
- { // 空きがなかった
- clif_skill_fail(sd, skillid, 0, 0);
- map_freeblock_unlock();
- return 1;
- }
- }
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- src->id, 1, 0, 0,
- 1000 * (15 + 15 * skilllv), 0);
- }
- else
- clif_skill_fail(sd, skillid, 0, 0);
- break;
- case MO_CALLSPIRITS: // 気功
- if (sd)
- {
- pc_addspiritball(sd, skill_get_time(skillid, skilllv),
- skilllv);
- }
- break;
- case CH_SOULCOLLECT: // 狂気功
- if (sd)
- {
- for (int i = 0; i < 5; i++)
- pc_addspiritball(sd, skill_get_time(skillid, skilllv),
- 5);
- }
- break;
- case MO_BLADESTOP: // 白刃取り
- skill_status_change_start(src, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- break;
- case MO_ABSORBSPIRITS: // 気奪
- {
- int i = 0;
- if (sd && dstsd)
- {
- if (sd == dstsd || map[sd->bl.m].flag.pvp)
- {
- if (dstsd->spiritball > 0)
- {
- i = dstsd->spiritball * 7;
- pc_delspiritball(dstsd, dstsd->spiritball, 0);
- if (i > 0x7FFF)
- i = 0x7FFF;
- if (sd->status.sp + i > sd->status.max_sp)
- i = sd->status.max_sp - sd->status.sp;
- }
- }
- }
- else if (sd && dstmd)
- { //対象がモンスターの場合
- //20%の確率で対象のLv*2のSPを回復する。成功したときはターゲット(σ゚Д゚)σゲッツ!!
- if (MRAND(100) < 20)
- {
- i = 2 * mob_db[dstmd->mob_class].lv;
- mob_target(dstmd, src, 0);
- }
- }
- if (i)
- sd->status.sp += i;
- break;
- }
-
- case AC_MAKINGARROW: /* 矢作成 */
- break;
-
- case AM_PHARMACY: /* ポーション作成 */
- break;
- case WS_CREATECOIN: /* クリエイトコイン */
- break;
- case WS_CREATENUGGET: /* 塊製造 */
- break;
- case BS_HAMMERFALL: /* ハンマーフォール */
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_weapon_damage)
- break;
- if (MRAND(100) < (20 + 10 * skilllv) * sc_def_vit / 100)
- {
- skill_status_change_start(bl, SC_STAN, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- }
- break;
-
- case RG_RAID: /* サプライズアタック */
- {
- int x = bl->x, y = bl->y;
- skill_area_temp_id = bl->id;
- skill_area_temp_x = x;
- skill_area_temp_y = y;
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x01, skill_castend_damage_id),
- bl->m, x - 1, y - 1,
- x + 1, y + 1, BL_NUL);
- }
- skill_status_change_end(src, SC_HIDING, -1); // ハイディング解除
- break;
-
- case KN_BRANDISHSPEAR: /*ブランディッシュスピア */
- {
- int c;
- BCT n = BCT_ZERO;
- n.lo = 4;
- int dir = map_calc_dir(src, bl->x, bl->y);
- struct square tc;
- int x = bl->x, y = bl->y;
- skill_brandishspear_first(&tc, dir, x, y);
- skill_brandishspear_dir(&tc, dir, 4);
- /* 範囲C */
- if (skilllv == 10)
- {
- for (c = 1; c < 4; c++)
- {
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | n, skill_castend_damage_id),
- bl->m, tc.val1[c], tc.val2[c],
- tc.val1[c], tc.val2[c], BL_NUL);
- }
- }
- /* 範囲BA */
- if (skilllv > 6)
- {
- skill_brandishspear_dir(&tc, dir, -1);
- n.lo--;
- }
- else
- {
- skill_brandishspear_dir(&tc, dir, -2);
- n.lo -= 2;
- }
-
- if (skilllv > 3)
- {
- for (c = 0; c < 5; c++)
- {
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | n, skill_castend_damage_id),
- bl->m, tc.val1[c], tc.val2[c],
- tc.val1[c], tc.val2[c], BL_NUL);
- if (skilllv > 6 && n.lo == 3 && c == 4)
- {
- skill_brandishspear_dir(&tc, dir, -1);
- n.lo--;
- c = -1;
- }
- }
- }
- /* 範囲@ */
- for (c = 0; c < 10; c++)
- {
- if (c == 0 || c == 5)
- skill_brandishspear_dir(&tc, dir, -1);
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x01, skill_castend_damage_id),
- bl->m, tc.val1[c % 5], tc.val2[c % 5],
- tc.val1[c % 5], tc.val2[c % 5], BL_NUL);
- }
- }
- break;
-
- /* パーティスキル */
- case AL_ANGELUS: /* エンジェラス */
- case PR_MAGNIFICAT: /* マグニフィカート */
- case PR_GLORIA: /* グロリア */
- case SN_WINDWALK: /* ウインドウォーク */
- if (sd == NULL || sd->status.party_id == 0 || (flag & 1))
- {
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv),
- 0);
- }
- else
- {
- /* パーティ全体への処理 */
- party_foreachsamemap(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_PARTY | BCT_lo_x01, skill_castend_nodamage_id),
- sd, 1);
- }
- break;
- case BS_ADRENALINE: /* アドレナリンラッシュ */
- case BS_WEAPONPERFECT: /* ウェポンパーフェクション */
- case BS_OVERTHRUST: /* オーバートラスト */
- if (sd == NULL || sd->status.party_id == 0 || (flag & 1))
- {
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, (src == bl) ? 1 : 0, 0, 0,
- skill_get_time(skillid, skilllv),
- 0);
- }
- else
- {
- /* パーティ全体への処理 */
- party_foreachsamemap(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_PARTY | BCT_lo_x01, skill_castend_nodamage_id),
- sd, 1);
- }
- break;
-
- /*(付加と解除が必要) */
- case BS_MAXIMIZE: /* マキシマイズパワー */
- case NV_TRICKDEAD: /* 死んだふり */
- case CR_DEFENDER: /* ディフェンダー */
- case CR_AUTOGUARD: /* オートガード */
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
- StatusChange sc = SkillStatusChangeTable[skillid];
- if (tsc_data)
- {
- if (tsc_data[sc].timer == -1)
- /* 付加する */
- skill_status_change_start(bl, sc, skilllv, 0, 0, 0,
- skill_get_time(skillid,
- skilllv), 0);
- else
- /* 解除する */
- skill_status_change_end(bl, sc, -1);
- }
- }
- break;
-
- case TF_HIDING: /* ハイディング */
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
- StatusChange sc = SkillStatusChangeTable[skillid];
- if (tsc_data)
- {
- if (tsc_data[sc].timer == -1)
- /* 付加する */
- skill_status_change_start(bl, sc, skilllv, 0, 0, 0,
- skill_get_time(skillid,
- skilllv), 0);
- else
- /* 解除する */
- skill_status_change_end(bl, sc, -1);
- }
- }
- break;
-
- case AS_CLOAKING: /* クローキング */
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
- StatusChange sc = SkillStatusChangeTable[skillid];
- if (tsc_data)
- {
- if (tsc_data[sc].timer == -1)
- /* 付加する */
- skill_status_change_start(bl, sc, skilllv, 0, 0, 0,
- skill_get_time(skillid,
- skilllv), 0);
- else
- /* 解除する */
- skill_status_change_end(bl, sc, -1);
- }
-
- skill_check_cloaking(bl);
- }
- break;
-
- case ST_CHASEWALK: /* ハイディング */
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
- StatusChange sc = SkillStatusChangeTable[skillid];
- if (tsc_data)
- {
- if (tsc_data[sc].timer == -1)
- /* 付加する */
- skill_status_change_start(bl, sc, skilllv, 0, 0, 0,
- skill_get_time(skillid,
- skilllv), 0);
- else
- /* 解除する */
- skill_status_change_end(bl, sc, -1);
- }
- }
- break;
-
- /* 対地スキル */
- case BD_LULLABY: /* 子守唄 */
- case BD_RICHMANKIM: /* ニヨルドの宴 */
- case BD_ETERNALCHAOS: /* 永遠の混沌 */
- case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */
- case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */
- case BD_ROKISWEIL: /* ロキの叫び */
- case BD_INTOABYSS: /* 深淵の中に */
- case BD_SIEGFRIED: /* 不死身のジークフリード */
- case BA_DISSONANCE: /* 不協和音 */
- case BA_POEMBRAGI: /* ブラギの詩 */
- case BA_WHISTLE: /* 口笛 */
- case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */
- case BA_APPLEIDUN: /* イドゥンの林檎 */
- case DC_UGLYDANCE: /* 自分勝手なダンス */
- case DC_HUMMING: /* ハミング */
- case DC_DONTFORGETME: /* 私を忘れないで… */
- case DC_FORTUNEKISS: /* 幸運のキス */
- case DC_SERVICEFORYOU: /* サービスフォーユー */
- case CG_MOONLIT: /* 月明りの泉に落ちる花びら */
- skill_unitsetting(src, skillid, skilllv, src->x, src->y, 0);
- break;
-
- case HP_BASILICA: /* バジリカ */
- case PA_GOSPEL: /* ゴスペル */
- skill_clear_unitgroup(src);
- skill_unitsetting(src, skillid, skilllv, src->x, src->y, 0);
- break;
-
- case BD_ADAPTATION: /* アドリブ */
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(src);
- if (sc_data && sc_data[SC_DANCING].timer != -1)
- skill_stop_dancing(src, 0);
- }
- break;
-
- case BA_FROSTJOKE: /* 寒いジョーク */
- case DC_SCREAM: /* スクリーム */
- skill_addtimerskill(src, tick + 3000, bl->id, 0, 0, skillid,
- skilllv, skill_timerskill::sktst::from_n(0), flag);
- break;
-
- case TF_STEAL: // スティール
- break;
-
- case RG_STEALCOIN: // スティールコイン
- if (sd)
- {
- if (pc_steal_coin(sd, bl))
- {
- int range = skill_get_range(skillid, skilllv);
- if (range < 0)
- range = battle_get_range(src) - (range + 1);
- mob_target((struct mob_data *) bl, src, range);
- }
- }
- break;
-
- case MG_STONECURSE: /* ストーンカース */
- if (bl->type == BL_MOB && battle_get_mode(bl) & 0x20)
- {
- clif_skill_fail(sd, sd->skillid, 0, 0);
- break;
- }
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (MRAND(100) < skilllv * 4 + 20
- && !battle_check_undead(battle_get_race(bl),
- battle_get_elem_type(bl)))
- skill_status_change_start(bl, SC_STONE, skilllv, 0, 0, 0,
- skill_get_time2(skillid, skilllv),
- 0);
- else if (sd)
- clif_skill_fail(sd, skillid, 0, 0);
- break;
-
- case NV_FIRSTAID: /* 応急手当 */
- battle_heal(NULL, bl, 5, 0, 0);
- break;
-
- case AL_CURE: /* キュアー */
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- skill_status_change_end(bl, SC_SILENCE, -1);
- skill_status_change_end(bl, SC_BLIND, -1);
- skill_status_change_end(bl, SC_CONFUSION, -1);
- if (battle_check_undead(battle_get_race(bl), battle_get_elem_type(bl)))
- { //アンデッドなら暗闇効果
- skill_status_change_start(bl, SC_CONFUSION, 1, 0, 0, 0, 6000,
- 0);
- }
- break;
-
- case TF_DETOXIFY: /* 解毒 */
- skill_status_change_end(bl, SC_POISON, -1);
- break;
-
- case PR_STRECOVERY: /* リカバリー */
- {
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- skill_status_change_end(bl, SC_FREEZE, -1);
- skill_status_change_end(bl, SC_STONE, -1);
- skill_status_change_end(bl, SC_SLEEP, -1);
- skill_status_change_end(bl, SC_STAN, -1);
- if (battle_check_undead(battle_get_race(bl), battle_get_elem_type(bl)))
- { //アンデッドなら暗闇効果
- int blind_time;
- //blind_time=30-battle_get_vit(bl)/10-battle_get_int/15;
- blind_time =
- 30 * (100 -
- (battle_get_int(bl) +
- battle_get_vit(bl)) / 2) / 100;
- if (MRAND(100) <
- (100 -
- (battle_get_int(bl) / 2 + battle_get_vit(bl) / 3 +
- battle_get_luk(bl) / 10)))
- skill_status_change_start(bl, SC_BLIND, 1, 0, 0, 0,
- blind_time, 0);
- }
- if (dstmd)
- {
- dstmd->attacked_id = 0;
- dstmd->target_id = 0;
- dstmd->state.attackable = false;
- dstmd->state.skillstate = MSS_IDLE;
- dstmd->next_walktime = tick + MRAND(3000) + 3000;
- }
- }
- break;
-
- case WZ_ESTIMATION: /* モンスター情報 */
- break;
-
- case MC_IDENTIFY: /* アイテム鑑定 */
- break;
-
- case BS_REPAIRWEAPON: /* 武器修理 */
- break;
-
case AL_TELEPORT: /* テレポート */
if (bl->type == BL_MOB)
mob_warp((struct mob_data *) bl, -1, -1, -1, 3);
break;
- case AL_HOLYWATER: /* アクアベネディクタ */
- if (sd)
- {
- struct item item_tmp;
- memset(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = 523;
- item_tmp.identify = 1;
- if (battle_config.holywater_name_input)
- {
- item_tmp.card[0] = 0xfe;
- item_tmp.card[1] = 0;
- *((unsigned long *) (&item_tmp.card[2])) = sd->char_id; /* キャラID */
- }
- PickupFail eflag = pc_additem(sd, &item_tmp, 1);
- if (eflag != PickupFail::OKAY)
- {
- clif_additem(sd, 0, 0, eflag);
- map_addflooritem(&item_tmp, 1, sd->bl.m, sd->bl.x,
- sd->bl.y, NULL, NULL, NULL, 0);
- }
- }
- break;
- case TF_PICKSTONE:
- if (sd)
- {
- struct item item_tmp;
- struct block_list tbl;
- memset(&item_tmp, 0, sizeof(item_tmp));
- memset(&tbl, 0, sizeof(tbl)); // [MouseJstr]
- item_tmp.nameid = 7049;
- item_tmp.identify = 1;
- tbl.id = 0;
- clif_takeitem(&sd->bl, &tbl);
- PickupFail eflag = pc_additem(sd, &item_tmp, 1);
- if (eflag != PickupFail::OKAY)
- {
- clif_additem(sd, 0, 0, eflag);
- map_addflooritem(&item_tmp, 1, sd->bl.m, sd->bl.x,
- sd->bl.y, NULL, NULL, NULL, 0);
- }
- }
- break;
-
- case RG_STRIPWEAPON: /* ストリップウェポン */
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
-
- if (tsc_data && tsc_data[SC_CP_WEAPON].timer != -1)
- break;
- strip_per = 5 + 2 * skilllv + strip_fix / 5;
- strip_time = skill_get_time(skillid, skilllv) + strip_fix / 2;
- if (MRAND(100) < strip_per)
- {
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0, strip_time, 0);
- if (dstsd)
- {
- for (int i = 0; i < MAX_INVENTORY; i++)
- {
- if (bool(dstsd->status.inventory[i].equip)
- && bool(dstsd->status.inventory[i].equip & EPOS::WEAPON))
- {
- pc_unequipitem(dstsd, i, CalcStatus::NOW);
- break;
- }
- }
- }
- }
- }
- break;
-
- case RG_STRIPSHIELD: /* ストリップシールド */
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
-
- if (tsc_data && tsc_data[SC_CP_SHIELD].timer != -1)
- break;
- strip_per = 5 + 2 * skilllv + strip_fix / 5;
- strip_time = skill_get_time(skillid, skilllv) + strip_fix / 2;
- if (MRAND(100) < strip_per)
- {
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0, strip_time, 0);
- if (dstsd)
- {
- for (int i = 0; i < MAX_INVENTORY; i++)
- {
- if (bool(dstsd->status.inventory[i].equip)
- && bool(dstsd->status.inventory[i].equip & EPOS::SHIELD))
- {
- pc_unequipitem(dstsd, i, CalcStatus::NOW);
- break;
- }
- }
- }
- }
- }
- break;
-
- case RG_STRIPARMOR: /* ストリップアーマー */
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
-
- if (tsc_data && tsc_data[SC_CP_ARMOR].timer != -1)
- break;
- strip_per = 5 + 2 * skilllv + strip_fix / 5;
- strip_time = skill_get_time(skillid, skilllv) + strip_fix / 2;
- if (MRAND(100) < strip_per)
- {
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0, strip_time, 0);
- if (dstsd)
- {
- for (int i = 0; i < MAX_INVENTORY; i++)
- {
- if (bool(dstsd->status.inventory[i].equip)
- && bool(dstsd->status.inventory[i].equip & EPOS::MISC1))
- {
- pc_unequipitem(dstsd, i, CalcStatus::NOW);
- break;
- }
- }
- }
- }
- }
- break;
- case RG_STRIPHELM: /* ストリップヘルム */
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
-
- if (tsc_data && tsc_data[SC_CP_HELM].timer != -1)
- break;
- strip_per = 5 + 2 * skilllv + strip_fix / 5;
- strip_time = skill_get_time(skillid, skilllv) + strip_fix / 2;
- if (MRAND(100) < strip_per)
- {
- skill_status_change_start(bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0, strip_time, 0);
- if (dstsd)
- {
- for (int i = 0; i < MAX_INVENTORY; i++)
- {
- if (bool(dstsd->status.inventory[i].equip)
- && bool(dstsd->status.inventory[i].equip & EPOS::HAT))
- {
- pc_unequipitem(dstsd, i, CalcStatus::NOW);
- break;
- }
- }
- }
- }
- }
- break;
- /* PotionPitcher */
- case AM_POTIONPITCHER: /* ポーションピッチャー */
- {
- int i, x, hp = 0, sp = 0;
- if (sd)
- {
- if (sd == dstsd)
- { // cancel use on oneself
- map_freeblock_unlock();
- return 1;
- }
- x = skilllv % 11 - 1;
- i = pc_search_inventory(sd, skill_db[skillid].itemid[x]);
- if (i < 0 || skill_db[skillid].itemid[x] <= 0)
- {
- clif_skill_fail(sd, skillid, 0, 0);
- map_freeblock_unlock();
- return 1;
- }
- if (sd->inventory_data[i] == NULL
- || sd->status.inventory[i].amount <
- skill_db[skillid].amount[x])
- {
- clif_skill_fail(sd, skillid, 0, 0);
- map_freeblock_unlock();
- return 1;
- }
- sd->state.potionpitcher_flag = 1;
- sd->potion_hp = sd->potion_sp = sd->potion_per_hp =
- sd->potion_per_sp = 0;
- sd->skilltarget = bl->id;
- run_script(sd->inventory_data[i]->use_script, 0, sd->bl.id,
- 0);
- pc_delitem(sd, i, skill_db[skillid].amount[x], 0);
- sd->state.potionpitcher_flag = 0;
- if (sd->potion_per_hp > 0 || sd->potion_per_sp > 0)
- {
- hp = battle_get_max_hp(bl) * sd->potion_per_hp / 100;
- hp = hp * (100 +
- pc_checkskill(sd,
- AM_POTIONPITCHER) * 10 +
- pc_checkskill(sd,
- AM_LEARNINGPOTION) * 5) / 100;
- if (dstsd)
- {
- sp = dstsd->status.max_sp * sd->potion_per_sp / 100;
- sp = sp * (100 +
- pc_checkskill(sd,
- AM_POTIONPITCHER) +
- pc_checkskill(sd,
- AM_LEARNINGPOTION) * 5) /
- 100;
- }
- }
- else
- {
- if (sd->potion_hp > 0)
- {
- hp = sd->potion_hp * (100 +
- pc_checkskill(sd,
- AM_POTIONPITCHER)
- * 10 + pc_checkskill(sd,
- AM_LEARNINGPOTION)
- * 5) / 100;
- hp = hp * (100 + (battle_get_vit(bl) << 1)) / 100;
- if (dstsd)
- hp = hp * (100 +
- pc_checkskill(dstsd,
- SM_RECOVERY) * 10) /
- 100;
- }
- if (sd->potion_sp > 0)
- {
- sp = sd->potion_sp * (100 +
- pc_checkskill(sd,
- AM_POTIONPITCHER)
- + pc_checkskill(sd,
- AM_LEARNINGPOTION)
- * 5) / 100;
- sp = sp * (100 + (battle_get_int(bl) << 1)) / 100;
- if (dstsd)
- sp = sp * (100 +
- pc_checkskill(dstsd,
- MG_SRECOVERY) * 10) /
- 100;
- }
- }
- }
- else
- {
- hp = (1 + MRAND(400)) * (100 + skilllv * 10) / 100;
- hp = hp * (100 + (battle_get_vit(bl) << 1)) / 100;
- if (dstsd)
- hp = hp * (100 +
- pc_checkskill(dstsd, SM_RECOVERY) * 10) / 100;
- }
- battle_heal(src, bl, hp, sp, 0);
- }
- break;
- case AM_CP_WEAPON:
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
- if (tsc_data && tsc_data[SC_STRIPWEAPON].timer != -1)
- skill_status_change_end(bl, SC_STRIPWEAPON, -1);
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- }
- break;
- case AM_CP_SHIELD:
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
- if (tsc_data && tsc_data[SC_STRIPSHIELD].timer != -1)
- skill_status_change_end(bl, SC_STRIPSHIELD, -1);
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- }
- break;
- case AM_CP_ARMOR:
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
- if (tsc_data && tsc_data[SC_STRIPARMOR].timer != -1)
- skill_status_change_end(bl, SC_STRIPARMOR, -1);
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- }
- break;
- case AM_CP_HELM:
- {
- eptr<struct status_change, StatusChange> tsc_data = battle_get_sc_data(bl);
- if (tsc_data && tsc_data[SC_STRIPHELM].timer != -1)
- skill_status_change_end(bl, SC_STRIPHELM, -1);
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- }
- break;
- case SA_DISPELL: /* ディスペル */
- {
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- // up to SC_BLIND, exclusive. WTF?
- for (StatusChange i : erange(StatusChange(0), StatusChange(136)))
- {
- if (i == SC_RIDING || i == SC_FALCON || i == SC_HALLUCINATION
- || i == SC_WEIGHT50 || i == SC_WEIGHT90
- || i == SC_STRIPWEAPON || i == SC_STRIPSHIELD
- || i == SC_STRIPARMOR || i == SC_STRIPHELM
- || i == SC_CP_WEAPON || i == SC_CP_SHIELD
- || i == SC_CP_ARMOR || i == SC_CP_HELM || i == SC_COMBO)
- continue;
- skill_status_change_end(bl, i, -1);
- }
- }
- break;
-
- case TF_BACKSLIDING: /* バックステップ */
- battle_stopwalking(src, 1);
- skill_blown(src, bl,
- skill_get_blewcount(skillid, skilllv) | 0x10000);
- if (src->type == BL_MOB)
- clif_fixmobpos((struct mob_data *) src);
- else if (src->type == BL_PC)
- clif_fixpos(src);
- skill_addtimerskill(src, tick + 200, src->id, 0, 0, skillid,
- skilllv, skill_timerskill::sktst::from_n(0), flag);
- break;
-
- case SA_CASTCANCEL:
- skill_castcancel(src, 1);
- if (sd)
- {
- int sp = skill_get_sp(sd->skillid_old, sd->skilllv_old);
- sp = sp * (90 - (skilllv - 1) * 20) / 100;
- if (sp < 0)
- sp = 0;
- pc_heal(sd, 0, -sp);
- }
- break;
- case SA_SPELLBREAKER: // スペルブレイカー
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
- int sp;
- if (sc_data && sc_data[SC_MAGICROD].timer != -1)
- {
- if (dstsd)
- {
- sp = skill_get_sp(skillid, skilllv);
- sp = sp * sc_data[SC_MAGICROD].val2 / 100;
- if (sp > 0x7fff)
- sp = 0x7fff;
- else if (sp < 1)
- sp = 1;
- if (dstsd->status.sp + sp > dstsd->status.max_sp)
- {
- sp = dstsd->status.max_sp - dstsd->status.sp;
- dstsd->status.sp = dstsd->status.max_sp;
- }
- else
- dstsd->status.sp += sp;
- }
- if (sd)
- {
- sp = sd->status.max_sp / 5;
- if (sp < 1)
- sp = 1;
- pc_heal(sd, 0, -sp);
- }
- }
- else
- {
- SkillID bl_skillid = SkillID::ZERO;
- int bl_skilllv = 0;
- if (bl->type == BL_PC)
- {
- if (dstsd && dstsd->skilltimer != -1)
- {
- bl_skillid = dstsd->skillid;
- bl_skilllv = dstsd->skilllv;
- }
- }
- else if (bl->type == BL_MOB)
- {
- if (dstmd && dstmd->skilltimer != -1)
- {
- bl_skillid = dstmd->skillid;
- bl_skilllv = dstmd->skilllv;
- }
- }
- if (bl_skillid != SkillID::ZERO
- && bl_skillid != SkillID::NEGATIVE
- && skill_db[bl_skillid].skill_type == BF_MAGIC)
- {
- skill_castcancel(bl, 0);
- sp = skill_get_sp(bl_skillid, bl_skilllv);
- if (dstsd)
- pc_heal(dstsd, 0, -sp);
- if (sd)
- {
- sp = sp * (25 * (skilllv - 1)) / 100;
- if (skilllv > 1 && sp < 1)
- sp = 1;
- if (sp > 0x7fff)
- sp = 0x7fff;
- else if (sp < 1)
- sp = 1;
- if (sd->status.sp + sp > sd->status.max_sp)
- {
- sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp = sd->status.max_sp;
- }
- else
- sd->status.sp += sp;
- }
- }
- else if (sd)
- clif_skill_fail(sd, skillid, 0, 0);
- }
- }
- break;
- case SA_MAGICROD:
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
- break;
- case SA_AUTOSPELL: /* オートスペル */
- if (sd)
- {}
- else
- {
- int maxlv = 1;
- SkillID spellid = SkillID::ZERO;
- static const SkillID spellarray[3] =
- {
- MG_COLDBOLT, MG_FIREBOLT, MG_LIGHTNINGBOLT,
- };
- if (skilllv >= 10)
- {
- spellid = MG_FROSTDIVER;
- maxlv = skilllv - 9;
- }
- else if (skilllv >= 8)
- {
- spellid = MG_FIREBALL;
- maxlv = skilllv - 7;
- }
- else if (skilllv >= 5)
- {
- spellid = MG_SOULSTRIKE;
- maxlv = skilllv - 4;
- }
- else if (skilllv >= 2)
- {
- int i = MRAND(3);
- spellid = spellarray[i];
- maxlv = skilllv - 1;
- }
- else if (skilllv > 0)
- {
- spellid = MG_NAPALMBEAT;
- maxlv = 3;
- }
- if (spellid != SkillID::ZERO)
- skill_status_change_start(src, SC_AUTOSPELL, skilllv,
- uint16_t(spellid), maxlv, 0,
- skill_get_time(SA_AUTOSPELL,
- skilllv), 0);
- }
- break;
-
/* ランダム属性変化、水属性変化、地、火、風 */
case NPC_ATTRICHANGE:
case NPC_CHANGEWATER:
@@ -4926,231 +1885,6 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl,
case NPC_DEFENDER:
break;
- case WE_MALE: /* 君だけは護るよ */
- if (sd && dstsd)
- {
- int hp_rate =
- (skilllv <=
- 0) ? 0 : skill_db[skillid].hp_rate[skilllv - 1];
- int gain_hp = sd->status.max_hp * abs(hp_rate) / 100; // 15%
- battle_heal(NULL, bl, gain_hp, 0, 0);
- }
- break;
- case WE_FEMALE: /* あなたの為に犠牲になります */
- if (sd && dstsd)
- {
- int sp_rate =
- (skilllv <=
- 0) ? 0 : skill_db[skillid].sp_rate[skilllv - 1];
- int gain_sp = sd->status.max_sp * abs(sp_rate) / 100; // 15%
- battle_heal(NULL, bl, 0, gain_sp, 0);
- }
- break;
-
- case WE_CALLPARTNER: /* あなたに会いたい */
- if (sd && dstsd)
- {
- if (map[sd->bl.m].flag.nomemo)
- {
- return 0;
- }
- if ((dstsd = pc_get_partner(sd)) == NULL)
- {
- clif_skill_fail(sd, skillid, 0, 0);
- return 0;
- }
- skill_unitsetting(src, skillid, skilllv, sd->bl.x, sd->bl.y,
- 0);
- }
- break;
-
- case PF_HPCONVERSION: /* ライフ置き換え */
- if (sd)
- {
- int conv_hp = 0, conv_sp = 0;
- conv_hp = sd->status.hp / 10; //基本はHPの10%
- sd->status.hp -= conv_hp; //HPを減らす
- conv_sp = conv_hp * 20 * skilllv / 100;
- conv_sp =
- (sd->status.sp + conv_sp >
- sd->status.max_sp) ? sd->status.max_sp -
- sd->status.sp : conv_sp;
- sd->status.sp += conv_sp; //SPを増やす
- pc_heal(sd, -conv_hp, conv_sp);
- }
- break;
- case HT_REMOVETRAP: /* リムーブトラップ */
- {
- struct skill_unit *su = NULL;
- struct item item_tmp;
- if ((bl->type == BL_SKILL) &&
- (su = (struct skill_unit *) bl) &&
- (su->group->src_id == src->id || map[bl->m].flag.pvp)
- && (su->group->unit_id >= 0x8f
- && su->group->unit_id <= 0x99)
- && (su->group->unit_id != 0x92))
- { //罠を取り返す
- if (sd)
- {
- if (battle_config.skill_removetrap_type == 1)
- {
- for (int i = 0; i < 10; i++)
- {
- if (skill_db[su->group->skill_id].itemid[i] >
- 0)
- {
- memset(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid =
- skill_db[su->group->
- skill_id].itemid[i];
- item_tmp.identify = 1;
- PickupFail item_flag;
- if (item_tmp.nameid
- && (item_flag =
- pc_additem(sd, &item_tmp,
- skill_db[su->group->skill_id].amount[i]))
- != PickupFail::OKAY)
- {
- clif_additem(sd, 0, 0, item_flag);
- map_addflooritem(&item_tmp,
- skill_db[su->
- group->skill_id].amount
- [i], sd->bl.m,
- sd->bl.x, sd->bl.y,
- NULL, NULL, NULL,
- 0);
- }
- }
- }
- }
- else
- {
- memset(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = 1065;
- item_tmp.identify = 1;
- PickupFail item_flag;
- if (item_tmp.nameid
- && (item_flag = pc_additem(sd, &item_tmp, 1))
- != PickupFail::OKAY)
- {
- clif_additem(sd, 0, 0, item_flag);
- map_addflooritem(&item_tmp, 1, sd->bl.m,
- sd->bl.x, sd->bl.y, NULL,
- NULL, NULL, 0);
- }
- }
-
- }
- if (su->group->unit_id == 0x91 && su->group->val2)
- {
- struct block_list *target =
- map_id2bl(su->group->val2);
- if (target
- && (target->type == BL_PC
- || target->type == BL_MOB))
- skill_status_change_end(target, SC_ANKLE, -1);
- }
- skill_delunit(su);
- }
- }
- break;
- case HT_SPRINGTRAP: /* スプリングトラップ */
- {
- struct skill_unit *su = NULL;
- if ((bl->type == BL_SKILL) && (su = (struct skill_unit *) bl)
- && (su->group))
- {
- switch (su->group->unit_id)
- {
- case 0x8f: /* ブラストマイン */
- case 0x90: /* スキッドトラップ */
- case 0x93: /* ランドマイン */
- case 0x94: /* ショックウェーブトラップ */
- case 0x95: /* サンドマン */
- case 0x96: /* フラッシャー */
- case 0x97: /* フリージングトラップ */
- case 0x98: /* クレイモアートラップ */
- case 0x99: /* トーキーボックス */
- su->group->unit_id = 0x8c;
- clif_changelook(bl, LOOK_BASE,
- su->group->unit_id);
- su->group->limit =
- DIFF_TICK(tick + 1500, su->group->tick);
- su->limit =
- DIFF_TICK(tick + 1500, su->group->tick);
- }
- }
- }
- break;
- case BD_ENCORE: /* アンコール */
- if (sd)
- skill_use_id(sd, src->id, sd->skillid_dance,
- sd->skilllv_dance);
- break;
- case AS_SPLASHER: /* ベナムスプラッシャー */
- if ((double) battle_get_max_hp(bl) * 2 / 3 < battle_get_hp(bl)) //HPが2/3以上残っていたら失敗
- return 1;
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, uint16_t(skillid), src->id, 0,
- skill_get_time(skillid, skilllv), 0);
- break;
- case PF_MINDBREAKER: /* プロボック */
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
-
- /* MVPmobと不死には効かない */
- if ((bl->type == BL_MOB && battle_get_mode(bl) & 0x20) || battle_check_undead(battle_get_race(bl), battle_get_elem_type(bl))) //不死には効かない
- {
- map_freeblock_unlock();
- return 1;
- }
-
- skill_status_change_start(bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time(skillid, skilllv), 0);
-
- if (dstmd && dstmd->skilltimer != -1 && dstmd->state.skillcastcancel) // 詠唱妨害
- skill_castcancel(bl, 0);
- if (dstsd && dstsd->skilltimer != -1
- && !dstsd->special_state.no_castcancel
- && dstsd->state.skillcastcancel
- && !dstsd->special_state.no_castcancel2)
- skill_castcancel(bl, 0);
-
- if (sc_data)
- {
- if (sc_data[SC_FREEZE].timer != -1)
- skill_status_change_end(bl, SC_FREEZE, -1);
- if (sc_data[SC_STONE].timer != -1
- && sc_data[SC_STONE].val2 == 0)
- skill_status_change_end(bl, SC_STONE, -1);
- if (sc_data[SC_SLEEP].timer != -1)
- skill_status_change_end(bl, SC_SLEEP, -1);
- }
-
- if (bl->type == BL_MOB)
- {
- int range = skill_get_range(skillid, skilllv);
- if (range < 0)
- range = battle_get_range(src) - (range + 1);
- mob_target((struct mob_data *) bl, src, range);
- }
- }
- break;
-
- case RG_CLEANER: //AppleGirl
- {
- struct skill_unit *su = NULL;
- if ((bl->type == BL_SKILL) &&
- (su = (struct skill_unit *) bl) &&
- (su->group->src_id == src->id || map[bl->m].flag.pvp)
- && (su->group->unit_id == 0xb0))
- { //罠を取り返す
- if (sd)
- skill_delunit(su);
- }
- }
- break;
default:
PRINTF("Unknown skill used:%d\n", skillid);
map_freeblock_unlock();
@@ -5177,16 +1911,9 @@ void skill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
if (sd->bl.prev == NULL) //prevが無いのはありなの?
return;
- if (sd->skillid != SA_CASTCANCEL && sd->skilltimer != tid) /* タイマIDの確認 */
+ if (sd->skilltimer != tid) /* タイマIDの確認 */
return;
- if (sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1
- && pc_checkskill(sd, SA_FREECAST) > 0)
- {
- sd->speed = sd->prev_speed;
- clif_updatestatus(sd, SP_SPEED);
- }
- if (sd->skillid != SA_CASTCANCEL)
- sd->skilltimer = -1;
+ sd->skilltimer = -1;
if ((bl = map_id2bl(sd->skilltarget)) == NULL || bl->prev == NULL)
{
@@ -5205,38 +1932,6 @@ void skill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
return;
}
- if (sd->skillid == PR_LEXAETERNA)
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
- if (sc_data
- && (sc_data[SC_FREEZE].timer != -1
- || (sc_data[SC_STONE].timer != -1
- && sc_data[SC_STONE].val2 == 0)))
- {
- clif_skill_fail(sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = SkillID::NEGATIVE;
- sd->skillitemlv = -1;
- return;
- }
- }
- else if (sd->skillid == RG_BACKSTAP)
- {
- int dir = map_calc_dir(&sd->bl, bl->x, bl->y), t_dir =
- battle_get_dir(bl);
- int dist = distance(sd->bl.x, sd->bl.y, bl->x, bl->y);
- if (bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir, t_dir)))
- {
- clif_skill_fail(sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = SkillID::NEGATIVE;
- sd->skillitemlv = -1;
- return;
- }
- }
-
inf2 = skill_get_inf2(sd->skillid);
if (((skill_get_inf(sd->skillid) & 1) || inf2 & 4) && // 彼我敵対関係チェック
battle_check_target(&sd->bl, bl, BCT_ENEMY) <= 0)
@@ -5267,16 +1962,6 @@ void skill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
if (range < 0)
range = battle_get_range(&sd->bl) - (range + 1);
range += battle_config.pc_skill_add_range;
- if ((sd->skillid == MO_EXTREMITYFIST && sd->sc_data[SC_COMBO].timer != -1
- && SkillID(sd->sc_data[SC_COMBO].val1) == MO_COMBOFINISH)
- || (sd->skillid == CH_TIGERFIST && sd->sc_data[SC_COMBO].timer != -1
- && SkillID(sd->sc_data[SC_COMBO].val1) == MO_COMBOFINISH)
- || (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1
- && SkillID(sd->sc_data[SC_COMBO].val1) == MO_COMBOFINISH)
- || (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1
- && SkillID(sd->sc_data[SC_COMBO].val1) == CH_TIGERFIST))
- range +=
- skill_get_blewcount(MO_COMBOFINISH, sd->sc_data[SC_COMBO].val2);
if (battle_config.skill_out_range_consume)
{
// changed to allow casting when target walks out of range [Valaris]
@@ -5325,9 +2010,7 @@ void skill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
tick, BCT_ZERO);
break;
case 1: /* 支援系 */
- if ((sd->skillid == AL_HEAL
- || (sd->skillid == ALL_RESURRECTION && bl->type != BL_PC)
- || sd->skillid == PR_ASPERSIO)
+ if (sd->skillid == AL_HEAL
&& battle_check_undead(battle_get_race(bl),
battle_get_elem_type(bl)))
skill_castend_damage_id(&sd->bl, bl, sd->skillid,
@@ -5340,204 +2023,12 @@ void skill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
}
/*==========================================
- * スキル使用(詠唱完了、場所指定の実際の処理)
- *------------------------------------------
- */
-int skill_castend_pos2(struct block_list *src, int x, int y,
- SkillID skillid, int skilllv, unsigned int tick, BCT flag)
-{
- struct map_session_data *sd = NULL;
- int i, tmpx = 0, tmpy = 0, x1 = 0, y1 = 0;
-
- nullpo_ret(src);
-
- if (src->type == BL_PC)
- {
- nullpo_ret(sd = (struct map_session_data *) src);
- }
-
- if (skillnotok(skillid, sd)) // [MouseJstr]
- return 0;
-
- switch (skillid)
- {
- case PR_BENEDICTIO: /* 聖体降福 */
- skill_area_temp_id = src->id;
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_NOENEMY | BCT_lo_x01, skill_castend_nodamage_id),
- src->m, x - 1, y - 1, x + 1, y + 1, BL_NUL);
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x01, skill_castend_damage_id),
- src->m, x - 1, y - 1,
- x + 1, y + 1, BL_NUL);
- break;
-
- case BS_HAMMERFALL: /* ハンマーフォール */
- skill_area_temp_id = src->id;
- skill_area_temp_x = x;
- skill_area_temp_y = y;
- map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x02, skill_castend_nodamage_id),
- src->m, x - 2, y - 2, x + 2, y + 2, BL_NUL);
- break;
-
- case HT_DETECTING: /* ディテクティング */
- {
- const int range = 7;
- map_foreachinarea(std::bind(skill_status_change_timer_sub, ph::_1, src, SC_SIGHT, tick),
- src->m, src->x - range, src->y - range,
- src->x + range, src->y + range, BL_NUL);
- }
- break;
-
- case MG_SAFETYWALL: /* セイフティウォール */
- case MG_FIREWALL: /* ファイヤーウォール */
- case MG_THUNDERSTORM: /* サンダーストーム */
- case AL_PNEUMA: /* ニューマ */
- case WZ_ICEWALL: /* アイスウォール */
- case WZ_FIREPILLAR: /* ファイアピラー */
- case WZ_SIGHTRASHER:
- case WZ_QUAGMIRE: /* クァグマイア */
- case WZ_VERMILION: /* ロードオブヴァーミリオン */
- case WZ_FROSTNOVA: /* フロストノヴァ */
- case WZ_STORMGUST: /* ストームガスト */
- case WZ_HEAVENDRIVE: /* ヘヴンズドライブ */
- case PR_SANCTUARY: /* サンクチュアリ */
- case PR_MAGNUS: /* マグヌスエクソシズム */
- case CR_GRANDCROSS: /* グランドクロス */
- case HT_SKIDTRAP: /* スキッドトラップ */
- case HT_LANDMINE: /* ランドマイン */
- case HT_ANKLESNARE: /* アンクルスネア */
- case HT_SHOCKWAVE: /* ショックウェーブトラップ */
- case HT_SANDMAN: /* サンドマン */
- case HT_FLASHER: /* フラッシャー */
- case HT_FREEZINGTRAP: /* フリージングトラップ */
- case HT_BLASTMINE: /* ブラストマイン */
- case HT_CLAYMORETRAP: /* クレイモアートラップ */
- case AS_VENOMDUST: /* ベノムダスト */
- case AM_DEMONSTRATION: /* デモンストレーション */
- case PF_SPIDERWEB: /* スパイダーウェッブ */
- case PF_FOGWALL: /* フォグウォール */
- case HT_TALKIEBOX: /* トーキーボックス */
- skill_unitsetting(src, skillid, skilllv, x, y, 0);
- break;
-
- case RG_GRAFFITI: /* Graffiti [Valaris] */
- skill_clear_unitgroup(src);
- skill_unitsetting(src, skillid, skilllv, x, y, 0);
- break;
-
- case SA_VOLCANO: /* ボルケーノ */
- case SA_DELUGE: /* デリュージ */
- case SA_VIOLENTGALE: /* バイオレントゲイル */
- case SA_LANDPROTECTOR: /* ランドプロテクター */
- skill_clear_element_field(src); //既に自分が発動している属性場をクリア
- skill_unitsetting(src, skillid, skilllv, x, y, 0);
- break;
-
- case WZ_METEOR: //メテオストーム
- {
- BCT flag_ = BCT_ZERO;
- for (i = 0; i < 2 + (skilllv >> 1); i++)
- {
- int j = 0, c;
- do
- {
- tmpx = x + (MRAND(7) - 3);
- tmpy = y + (MRAND(7) - 3);
- if (tmpx < 0)
- tmpx = 0;
- else if (tmpx >= map[src->m].xs)
- tmpx = map[src->m].xs - 1;
- if (tmpy < 0)
- tmpy = 0;
- else if (tmpy >= map[src->m].ys)
- tmpy = map[src->m].ys - 1;
- j++;
- }
- while (((c = map_getcell(src->m, tmpx, tmpy)) == 1 || c == 5)
- && j < 100);
- if (j >= 100)
- continue;
- if (flag_ == BCT_ZERO)
- flag_ = BCT_lo_x01;
- if (i > 0)
- skill_addtimerskill(src, tick + i * 1000, 0, tmpx, tmpy,
- skillid, skilllv, skill_timerskill::sktst::from_xy(uint16_t(x1), uint16_t(y1)),
- flag_);
- x1 = tmpx;
- y1 = tmpy;
- }
- skill_addtimerskill(src, tick + i * 1000, 0, tmpx, tmpy, skillid,
- skilllv, skill_timerskill::sktst::from_n(-1), flag_);
- }
- break;
-
- case AL_WARP: /* ワープポータル */
- break;
- case MO_BODYRELOCATION:
- if (sd)
- {
- pc_movepos(sd, x, y);
- }
- else if (src->type == BL_MOB)
- mob_warp((struct mob_data *) src, -1, x, y, 0);
- break;
- case AM_CANNIBALIZE: // バイオプラント
- if (sd)
- {
- int mx, my, id = 0;
- struct mob_data *md;
-
- mx = x; // + (rand()%10 - 5);
- my = y; // + (rand()%10 - 5);
- id = mob_once_spawn(sd, "this", mx, my, "--ja--", 1118, 1,
- "");
- if ((md = (struct mob_data *) map_id2bl(id)) != NULL)
- {
- md->master_id = sd->bl.id;
- md->hp = 2210 + skilllv * 200;
- md->state.special_mob_ai = 1;
- md->deletetimer =
- add_timer(gettick() +
- skill_get_time(skillid, skilllv),
- mob_timer_delete, id, 0);
- }
- }
- break;
- case AM_SPHEREMINE: // スフィアーマイン
- if (sd)
- {
- int mx, my, id = 0;
- struct mob_data *md;
-
- mx = x; // + (rand()%10 - 5);
- my = y; // + (rand()%10 - 5);
- id = mob_once_spawn(sd, "this", mx, my, "--ja--", 1142, 1,
- "");
- if ((md = (struct mob_data *) map_id2bl(id)) != NULL)
- {
- md->master_id = sd->bl.id;
- md->hp = 1000 + skilllv * 200;
- md->state.special_mob_ai = 2;
- md->deletetimer =
- add_timer(gettick() +
- skill_get_time(skillid, skilllv),
- mob_timer_delete, id, 0);
- }
- }
- break;
- }
-
- return 0;
-}
-
-/*==========================================
* スキル使用(詠唱完了、map指定)
*------------------------------------------
*/
int skill_castend_map(struct map_session_data *sd, SkillID skill_num,
const char *mapname)
{
- int x = 0, y = 0;
-
nullpo_ret(sd);
if (sd->bl.prev == NULL || pc_isdead(sd))
return 0;
@@ -5548,7 +2039,6 @@ int skill_castend_map(struct map_session_data *sd, SkillID skill_num,
if (sd->sc_data[SC_DIVINA].timer != -1
|| sd->sc_data[SC_ROKISWEIL].timer != -1
- || sd->sc_data[SC_AUTOCOUNTER].timer != -1
|| sd->sc_data[SC_STEELBODY].timer != -1
|| sd->sc_data[SC_DANCING].timer != -1
|| sd->sc_data[SC_BERSERK].timer != -1)
@@ -5578,59 +2068,6 @@ int skill_castend_map(struct map_session_data *sd, SkillID skill_num,
3);
break;
- case AL_WARP: /* ワープポータル */
- {
- const struct point *p[] = {
- &sd->status.save_point, &sd->status.memo_point[0],
- &sd->status.memo_point[1], &sd->status.memo_point[2],
- };
- struct skill_unit_group *group;
- int i;
- int maxcount = 0;
-
- if ((maxcount = skill_get_maxcount(sd->skillid)) > 0)
- {
- int c;
- for (i = c = 0; i < MAX_SKILLUNITGROUP; i++)
- {
- if (sd->skillunit[i].alive_count > 0
- && sd->skillunit[i].skill_id == sd->skillid)
- c++;
- }
- if (c >= maxcount)
- {
- clif_skill_fail(sd, sd->skillid, 0, 0);
- sd->canact_tick = gettick();
- sd->canmove_tick = gettick();
- sd->skillitem = SkillID::NEGATIVE;
- sd->skillitemlv = -1;
- return 0;
- }
- }
-
- for (i = 0; i < sd->skilllv; i++)
- {
- if (strcmp(mapname, p[i]->map) == 0)
- {
- x = p[i]->x;
- y = p[i]->y;
- break;
- }
- }
- if (x == 0 || y == 0) /* 不正パケット? */
- return 0;
-
- if (!skill_check_condition(sd, 3))
- return 0;
- if ((group =
- skill_unitsetting(&sd->bl, sd->skillid, sd->skilllv,
- sd->skillx, sd->skilly, 0)) == NULL)
- return 0;
- CREATE(group->valstr, char, 24);
- memcpy(group->valstr, map, 24);
- group->val2 = (x << 16) | y;
- }
- break;
}
return 0;
@@ -5642,600 +2079,34 @@ int skill_castend_map(struct map_session_data *sd, SkillID skill_num,
*/
struct skill_unit_group *skill_unitsetting(struct block_list *src,
SkillID skillid, int skilllv,
- int x, int y, int flag)
+ int x, int y, int)
{
struct skill_unit_group *group;
int i, count = 1, limit_ = 10000, val1_ = 0, val2_ = 0;
BCT target = BCT_ENEMY;
int interval = 1000, range_ = 0;
- int dir = 0, aoe_diameter = 0; // -- aoe_diameter (moonsoul) added for sage Area Of Effect skills
nullpo_ret(src);
- switch (skillid)
- { /* 設定 */
-
- case MG_SAFETYWALL: /* セイフティウォール */
- limit_ = skill_get_time(skillid, skilllv);
- val2_ = skilllv + 1;
- interval = -1;
- target = (battle_config.defnotenemy) ? BCT_NOENEMY : BCT_ALL;
- break;
-
- case MG_FIREWALL: /* ファイヤーウォール */
- if (src->x == x && src->y == y)
- dir = 2;
- else
- dir = map_calc_dir(src, x, y);
- if (dir & 1)
- count = 5;
- else
- count = 3;
- limit_ = skill_get_time(skillid, skilllv);
- val2_ = 4 + skilllv;
- interval = 1;
- break;
-
- case AL_PNEUMA: /* ニューマ */
- limit_ = skill_get_time(skillid, skilllv);
- interval = -1;
- target = (battle_config.defnotenemy) ? BCT_NOENEMY : BCT_ALL;
- count = 9;
- break;
-
- case AL_WARP: /* ワープポータル */
- target = BCT_ALL;
- val1_ = skilllv + 6;
- if (flag == 0)
- limit_ = 2000;
- else
- limit_ = skill_get_time(skillid, skilllv);
- break;
-
- case PR_SANCTUARY: /* サンクチュアリ */
- count = 21;
- limit_ = skill_get_time(skillid, skilllv);
- val1_ = skilllv + 3;
- val2_ = (skilllv > 6) ? 777 : skilllv * 100;
- target = BCT_ALL;
- range_ = 1;
- break;
-
- case PR_MAGNUS: /* マグヌスエクソシズム */
- count = 33;
- limit_ = skill_get_time(skillid, skilllv);
- interval = 3000;
- break;
-
- case WZ_FIREPILLAR: /* ファイアーピラー */
- if (flag == 0)
- limit_ = skill_get_time(skillid, skilllv);
- else
- limit_ = 1000;
- interval = 2000;
- val1_ = skilllv + 2;
- range_ = 1;
- break;
-
- case MG_THUNDERSTORM: /* サンダーストーム */
- limit_ = 500;
- range_ = 1;
- break;
-
- case WZ_FROSTNOVA: /* フロストノヴァ */
- limit_ = 500;
- range_ = 5;
- break;
- case WZ_HEAVENDRIVE: /* ヘヴンズドライブ */
- limit_ = 500;
- range_ = 2;
- break;
-
- case WZ_METEOR: /* メテオストーム */
- limit_ = 500;
- range_ = 3;
- break;
-
- case WZ_SIGHTRASHER:
- limit_ = 500;
- count = 41;
- break;
-
- case WZ_VERMILION: /* ロードオブヴァーミリオン */
- limit_ = 4100;
- interval = 1000;
- range_ = 6;
- break;
-
- case WZ_ICEWALL: /* アイスウォール */
- limit_ = skill_get_time(skillid, skilllv);
- count = 5;
- break;
-
- case WZ_STORMGUST: /* ストームガスト */
- limit_ = 4600;
- interval = 450;
- range_ = 5;
- break;
-
- case WZ_QUAGMIRE: /* クァグマイア */
- limit_ = skill_get_time(skillid, skilllv);
- interval = 200;
- count = 25;
- break;
-
- case HT_SKIDTRAP: /* スキッドトラップ */
- case HT_LANDMINE: /* ランドマイン */
- case HT_ANKLESNARE: /* アンクルスネア */
- case HT_SANDMAN: /* サンドマン */
- case PF_SPIDERWEB: /* スパイダーウェッブ */
- case HT_FLASHER: /* フラッシャー */
- case HT_FREEZINGTRAP: /* フリージングトラップ */
- case HT_BLASTMINE: /* ブラストマイン */
- case HT_CLAYMORETRAP: /* クレイモアートラップ */
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 1;
- break;
-
- case HT_TALKIEBOX: /* トーキーボックス */
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 1;
- target = BCT_ALL;
- break;
-
- case HT_SHOCKWAVE: /* ショックウェーブトラップ */
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 1;
- val1_ = skilllv * 15 + 10;
- break;
-
- case AS_VENOMDUST: /* ベノムダスト */
- limit_ = skill_get_time(skillid, skilllv);
- interval = 1000;
- count = 5;
- break;
-
- case CR_GRANDCROSS: /* グランドクロス */
- count = 29;
- limit_ = 1000;
- interval = 300;
- break;
-
- case SA_VOLCANO: /* ボルケーノ */
- case SA_DELUGE: /* デリュージ */
- case SA_VIOLENTGALE: /* バイオレントゲイル */
- limit_ = skill_get_time(skillid, skilllv);
- count = skilllv <= 2 ? 25 : (skilllv <= 4 ? 49 : 81);
- target = BCT_ALL;
- break;
-
- case SA_LANDPROTECTOR: /* グランドクロス */
- limit_ = skill_get_time(skillid, skilllv); // changed to get duration from cast_db (moonsoul)
- val1_ = skilllv * 15 + 10;
- aoe_diameter = skilllv + skilllv % 2 + 5;
- target = BCT_ALL;
- count = aoe_diameter * aoe_diameter; // -- this will not function if changed to ^2 (moonsoul)
- break;
-
- case BD_LULLABY: /* 子守唄 */
- case BD_ETERNALCHAOS: /* エターナルカオス */
- case BD_ROKISWEIL: /* ロキの叫び */
- count = 81;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_ALL;
- break;
- case BD_RICHMANKIM:
- case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */
- case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */
- case BD_INTOABYSS: /* 深淵の中に */
- case BD_SIEGFRIED: /* 不死身のジークフリード */
- count = 81;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_PARTY;
- break;
-
- case BA_WHISTLE: /* 口笛 */
- count = 49;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_NOENEMY;
- if (src->type == BL_PC)
- val1_ =
- (pc_checkskill((struct map_session_data *) src,
- BA_MUSICALLESSON) + 1) >> 1;
- val2_ = ((battle_get_agi(src) / 10) & 0xffff) << 16;
- val2_ |= (battle_get_luk(src) / 10) & 0xffff;
- break;
- case DC_HUMMING: /* ハミング */
- count = 49;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_NOENEMY;
- if (src->type == BL_PC)
- val1_ =
- (pc_checkskill((struct map_session_data *) src,
- DC_DANCINGLESSON) + 1) >> 1;
- val2_ = battle_get_dex(src) / 10;
- break;
-
- case BA_DISSONANCE: /* 不協和音 */
- case DC_UGLYDANCE: /* 自分勝手なダンス */
- count = 49;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_ENEMY;
- break;
-
- case DC_DONTFORGETME: /* 私を忘れないで… */
- count = 49;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_ENEMY;
- if (src->type == BL_PC)
- val1_ =
- (pc_checkskill((struct map_session_data *) src,
- DC_DANCINGLESSON) + 1) >> 1;
- val2_ = ((battle_get_str(src) / 20) & 0xffff) << 16;
- val2_ |= (battle_get_agi(src) / 10) & 0xffff;
- break;
- case BA_POEMBRAGI: /* ブラギの詩 */
- count = 49;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_NOENEMY;
- if (src->type == BL_PC)
- val1_ =
- pc_checkskill((struct map_session_data *) src,
- BA_MUSICALLESSON);
- val2_ = ((battle_get_dex(src) / 10) & 0xffff) << 16;
- val2_ |= (battle_get_int(src) / 5) & 0xffff;
- break;
- case BA_APPLEIDUN: /* イドゥンの林檎 */
- count = 49;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_NOENEMY;
- if (src->type == BL_PC)
- val1_ =
- ((pc_checkskill((struct map_session_data *) src,
- BA_MUSICALLESSON)) & 0xffff) << 16;
- else
- val1_ = 0;
- val1_ |= (battle_get_vit(src)) & 0xffff;
- val2_ = 0; //回復用タイムカウンタ(6秒毎に1増加)
- break;
- case DC_SERVICEFORYOU: /* サービスフォーユー */
- count = 49;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_PARTY;
- if (src->type == BL_PC)
- val1_ =
- (pc_checkskill((struct map_session_data *) src,
- DC_DANCINGLESSON) + 1) >> 1;
- val2_ = battle_get_int(src) / 10;
- break;
- case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */
- count = 49;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_NOENEMY;
- if (src->type == BL_PC)
- val1_ =
- (pc_checkskill((struct map_session_data *) src,
- BA_MUSICALLESSON) + 1) >> 1;
- val2_ = battle_get_agi(src) / 20;
- break;
- case DC_FORTUNEKISS: /* 幸運のキス */
- count = 49;
- limit_ = skill_get_time(skillid, skilllv);
- range_ = 5;
- target = BCT_NOENEMY;
- if (src->type == BL_PC)
- val1_ =
- (pc_checkskill((struct map_session_data *) src,
- DC_DANCINGLESSON) + 1) >> 1;
- val2_ = battle_get_luk(src) / 10;
- break;
- case AM_DEMONSTRATION: /* デモンストレーション */
- limit_ = skill_get_time(skillid, skilllv);
- interval = 1000;
- range_ = 1;
- target = BCT_ENEMY;
- break;
- case WE_CALLPARTNER: /* あなたに逢いたい */
- limit_ = skill_get_time(skillid, skilllv);
- range_ = -1;
- break;
-
- case HP_BASILICA: /* バジリカ */
- limit_ = skill_get_time(skillid, skilllv);
- target = BCT_ALL;
- range_ = 3;
- //Fix to prevent the priest from walking while Basilica is up.
- battle_stopwalking(src, 1);
- skill_status_change_start(src, SC_ANKLE, skilllv, 0, 0, 0, limit_,
- 0);
- break;
- case PA_GOSPEL: /* ゴスペル */
- count = 49;
- target = BCT_PARTY;
- limit_ = skill_get_time(skillid, skilllv);
- break;
- case PF_FOGWALL: /* フォグウォール */
- count = 15;
- limit_ = skill_get_time(skillid, skilllv);
- break;
- case RG_GRAFFITI: /* Graffiti */
- count = 1; // Leave this at 1 [Valaris]
- limit_ = 600000; // Time length [Valaris]
- break;
- };
-
- nullpo_retr(NULL, group =
- skill_initunitgroup(src, count, skillid, skilllv,
- skill_get_unit_id(skillid, flag & 1)));
+ nullpo_retr(NULL, group = skill_initunitgroup(src, count, skillid, skilllv, 0));
group->limit = limit_;
group->val1 = val1_;
group->val2 = val2_;
group->target_flag = target;
group->interval = interval;
group->range = range_;
- if (skillid == HT_TALKIEBOX || skillid == RG_GRAFFITI)
- {
- CREATE(group->valstr, char, 80);
- memcpy(group->valstr, talkie_mes, 80);
- }
for (i = 0; i < count; i++)
{
struct skill_unit *unit;
int ux = x, uy = y, val1 = skilllv, val2 = 0, limit =
group->limit, alive = 1;
int range = group->range;
- switch (skillid)
- { /* 設定 */
- case AL_PNEUMA: /* ニューマ */
- {
- static const int dx[9] = { -1, 0, 1, -1, 0, 1, -1, 0, 1 };
- static const int dy[9] = { -1, -1, -1, 0, 0, 0, 1, 1, 1 };
- ux += dx[i];
- uy += dy[i];
- }
- break;
- case MG_FIREWALL: /* ファイヤーウォール */
- {
- if (dir & 1)
- { /* 斜め配置 */
- static const int dx[][5] = {
- {1, 1, 0, 0, -1}, {-1, -1, 0, 0, 1},
- }, dy[][5] =
- {
- {
- 1, 0, 0, -1, -1},
- {
- 1, 0, 0, -1, -1},};
- ux += dx[(dir >> 1) & 1][i];
- uy += dy[(dir >> 1) & 1][i];
- }
- else
- { /* 上下配置 */
- if (dir % 4 == 0) /* 上下 */
- ux += i - 1;
- else /* 左右 */
- uy += i - 1;
- }
- val2 = group->val2;
- }
- break;
-
- case PR_SANCTUARY: /* サンクチュアリ */
- {
- static const int dx[] = {
- -1, 0, 1, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1,
- 2, -1, 0, 1
- };
- static const int dy[] = {
- -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1,
- 1, 2, 2, 2,
- };
- ux += dx[i];
- uy += dy[i];
- }
- break;
-
- case PR_MAGNUS: /* マグヌスエクソシズム */
- {
- static const int dx[] =
- { -1, 0, 1, -1, 0, 1, -3, -2, -1, 0, 1, 2, 3,
- -3, -2, -1, 0, 1, 2, 3, -3, -2, -1, 0, 1, 2, 3, -1, 0, 1,
- -1, 0, 1,
- };
- static const int dy[] = {
- -3, -3, -3, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1,
- 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3
- };
- ux += dx[i];
- uy += dy[i];
- }
- break;
-
- case WZ_SIGHTRASHER:
- {
- static const int dx[] = {
- -5, 0, 5, -4, 0, 4, -3, 0, 3, -2, 0, 2, -1, 0, 1, -5, -4,
- -3, -2, -1, 0, 1, 2, 3, 4, 5, -1, 0, 1, -2, 0, 2, -3,
- 0, 3, -4, 0, 4, -5, 0, 5
- };
- static const int dy[] = {
- -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1,
- -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2,
- 3, 3, 3, 4, 4, 4, 5, 5, 5
- };
- ux += dx[i];
- uy += dy[i];
- }
- break;
-
- case WZ_ICEWALL: /* アイスウォール */
- {
- if (skilllv <= 1)
- val1 = 500;
- else
- val1 = 200 + 200 * skilllv;
- if (src->x == x && src->y == y)
- dir = 2;
- else
- dir = map_calc_dir(src, x, y);
- ux += (2 - i) * diry[dir];
- uy += (i - 2) * dirx[dir];
- }
- break;
-
- case WZ_QUAGMIRE: /* クァグマイア */
- ux += (i % 5 - 2);
- uy += (i / 5 - 2);
- if (i == 12)
- range = 2;
- else
- range = -1;
-
- break;
-
- case AS_VENOMDUST: /* ベノムダスト */
- {
- static const int dx[] = { -1, 0, 0, 0, 1 };
- static const int dy[] = { 0, -1, 0, 1, 0 };
- ux += dx[i];
- uy += dy[i];
- }
- break;
-
- case CR_GRANDCROSS: /* グランドクロス */
- {
- static const int dx[] = {
- 0, 0, -1, 0, 1, -2, -1, 0, 1, 2, -4, -3, -2, -1, 0, 1, 2,
- 3, 4, -2, -1, 0, 1, 2, -1, 0, 1, 0, 0,
- };
- static const int dy[] = {
- -4, -3, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 4,
- };
- ux += dx[i];
- uy += dy[i];
- }
- break;
- case SA_VOLCANO: /* ボルケーノ */
- case SA_DELUGE: /* デリュージ */
- case SA_VIOLENTGALE: /* バイオレントゲイル */
- {
- int u_range = 0, central = 0;
- if (skilllv <= 2)
- {
- u_range = 2;
- central = 12;
- }
- else if (skilllv <= 4)
- {
- u_range = 3;
- central = 24;
- }
- else if (skilllv >= 5)
- {
- u_range = 4;
- central = 40;
- }
- ux += (i % (u_range * 2 + 1) - u_range);
- uy += (i / (u_range * 2 + 1) - u_range);
-
- if (i == central)
- range = u_range; //中央のユニットの効果範囲は全範囲
- else
- range = -1; //中央以外のユニットは飾り
- }
- break;
- case SA_LANDPROTECTOR: /* ランドプロテクター */
- {
- int u_range = 0;
-
- if (skilllv <= 2)
- u_range = 3;
- else if (skilllv <= 4)
- u_range = 4;
- else if (skilllv >= 5)
- u_range = 5;
-
- ux += (i % (u_range * 2 + 1) - u_range);
- uy += (i / (u_range * 2 + 1) - u_range);
-
- range = 0;
- }
- break;
-
- /* ダンスなど */
- case BD_LULLABY: /* 子守歌 */
- case BD_RICHMANKIM: /* ニヨルドの宴 */
- case BD_ETERNALCHAOS: /* 永遠の混沌 */
- case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */
- case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */
- case BD_ROKISWEIL: /* ロキの叫び */
- case BD_INTOABYSS: /* 深淵の中に */
- case BD_SIEGFRIED: /* 不死身のジークフリード */
- ux += (i % 9 - 4);
- uy += (i / 9 - 4);
- if (i == 40)
- range = 4; /* 中心の場合は範囲を4にオーバーライド */
- else
- range = -1; /* 中心じゃない場合は範囲を-1にオーバーライド */
- break;
- case BA_DISSONANCE: /* 不協和音 */
- case BA_WHISTLE: /* 口笛 */
- case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */
- case BA_POEMBRAGI: /* ブラギの詩 */
- case BA_APPLEIDUN: /* イドゥンの林檎 */
- case DC_UGLYDANCE: /* 自分勝手なダンス */
- case DC_HUMMING: /* ハミング */
- case DC_DONTFORGETME: /* 私を忘れないで… */
- case DC_FORTUNEKISS: /* 幸運のキス */
- case DC_SERVICEFORYOU: /* サービスフォーユー */
- ux += (i % 7 - 3);
- uy += (i / 7 - 3);
- if (i == 40)
- range = 4; /* 中心の場合は範囲を4にオーバーライド */
- else
- range = -1; /* 中心じゃない場合は範囲を-1にオーバーライド */
- break;
- case PA_GOSPEL: /* ゴスペル */
- ux += (i % 7 - 3);
- uy += (i / 7 - 3);
- break;
- case PF_FOGWALL: /* フォグウォール */
- ux += (i % 5 - 2);
- uy += (i / 5 - 1);
- break;
- case RG_GRAFFITI: /* Graffiti [Valaris] */
- ux += (i % 5 - 2);
- uy += (i / 5 - 2);
- break;
- }
//直上スキルの場合設置座標上にランドプロテクターがないかチェック
if (range <= 0)
map_foreachinarea(std::bind(skill_landprotector, ph::_1, skillid, &alive),
src->m, ux, uy,
ux, uy, BL_SKILL);
- if (skillid == WZ_ICEWALL && alive)
- {
- val2 = map_getcell(src->m, ux, uy);
- if (val2 == 5 || val2 == 1)
- alive = 0;
- else
- {
- map_setcell(src->m, ux, uy, 5);
- }
- }
-
if (alive)
{
nullpo_retr(NULL, unit = skill_initunit(group, i, ux, uy));
@@ -6282,9 +2153,6 @@ int skill_unit_onplace(struct skill_unit *src, struct block_list *bl,
nullpo_ret(ts = skill_unitgrouptickset_search(bl, sg->group_id));
diff = DIFF_TICK(tick, ts->tick);
goflag = (diff > sg->interval || diff < 0);
- if (sg->skill_id == CR_GRANDCROSS && !battle_config.gx_allhit) // 重なっていたら3HITしない
- goflag = (diff > sg->interval * map_count_oncell(bl->m, bl->x, bl->y)
- || diff < 0);
//対象がLP上に居る場合は無効
map_foreachinarea(std::bind(skill_landprotector, ph::_1, SkillID::ZERO, &goflag),
@@ -6975,7 +2843,7 @@ static
void skill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
{
struct map_session_data *sd = map_id2sd(id) /*,*target_sd=NULL */ ;
- int range, maxcount;
+ int maxcount;
nullpo_retv(sd);
@@ -6983,11 +2851,6 @@ void skill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
return;
if (sd->skilltimer != tid) /* タイマIDの確認 */
return;
- if (sd->skilltimer != -1 && pc_checkskill(sd, SA_FREECAST) > 0)
- {
- sd->speed = sd->prev_speed;
- clif_updatestatus(sd, SP_SPEED);
- }
sd->skilltimer = -1;
if (pc_isdead(sd))
{
@@ -6998,83 +2861,6 @@ void skill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
return;
}
- if (battle_config.pc_skill_reiteration == 0)
- {
- range = -1;
- switch (sd->skillid)
- {
- case MG_SAFETYWALL:
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case HT_TALKIEBOX:
- case AL_WARP:
- case PF_SPIDERWEB: /* スパイダーウェッブ */
- case RG_GRAFFITI: /* グラフィティ */
- range = 0;
- break;
- case AL_PNEUMA:
- range = 1;
- break;
- }
- if (range >= 0)
- {
- if (skill_check_unit_range(sd->bl.m, sd->skillx, sd->skilly, range, sd->skillid) > 0)
- {
- clif_skill_fail(sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = SkillID::NEGATIVE;
- sd->skillitemlv = -1;
- return;
- }
- }
- }
- if (battle_config.pc_skill_nofootset)
- {
- range = -1;
- switch (sd->skillid)
- {
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case HT_TALKIEBOX:
- case PF_SPIDERWEB: /* スパイダーウェッブ */
- case WZ_ICEWALL:
- range = 1;
- break;
- case AL_WARP:
- range = 0;
- break;
- }
- if (range >= 0)
- {
- if (skill_check_unit_range2(sd->bl.m, sd->skillx, sd->skilly, range) > 0)
- {
- clif_skill_fail(sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = SkillID::NEGATIVE;
- sd->skillitemlv = -1;
- return;
- }
- }
- }
-
if (battle_config.pc_land_skill_limit)
{
maxcount = skill_get_maxcount(sd->skillid);
@@ -7099,7 +2885,7 @@ void skill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
}
}
- range = skill_get_range(sd->skillid, sd->skilllv);
+ int range = skill_get_range(sd->skillid, sd->skilllv);
if (range < 0)
range = battle_get_range(&sd->bl) - (range + 1);
range += battle_config.pc_skill_add_range;
@@ -7140,186 +2926,8 @@ void skill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data_t)
PRINTF("PC %d skill castend skill=%d\n",
sd->bl.id, sd->skillid);
pc_stop_walking(sd, 0);
-
- skill_castend_pos2(&sd->bl, sd->skillx, sd->skilly, sd->skillid,
- sd->skilllv, tick, BCT_ZERO);
-}
-
-/*==========================================
- * 範囲内キャラ存在確認判定処理(foreachinarea)
- *------------------------------------------
- */
-
-static
-void skill_check_condition_char_sub(struct block_list *bl, struct block_list *src, int *c)
-{
- struct map_session_data *sd;
- struct map_session_data *ssd;
- struct pc_base_job s_class;
- struct pc_base_job ss_class;
-
- nullpo_retv(bl);
- sd = (struct map_session_data *) bl;
- nullpo_retv(src);
- nullpo_retv(c);
- ssd = (struct map_session_data *) src;
-
- s_class = pc_calc_base_job(sd->status.pc_class);
- //チェックしない設定ならcにありえない大きな数字を返して終了
- if (!battle_config.player_skill_partner_check)
- { //本当はforeachの前にやりたいけど設定適用箇所をまとめるためにここへ
- (*c) = 99;
- return;
- }
-
- ;
- ss_class = pc_calc_base_job(ssd->status.pc_class);
-
- switch (ssd->skillid)
- {
- case PR_BENEDICTIO: /* 聖体降福 */
- if (sd != ssd
- && (sd->status.pc_class == 4 || sd->status.pc_class == 8
- || sd->status.pc_class == 15 || sd->status.pc_class == 4005
- || sd->status.pc_class == 4009 || sd->status.pc_class == 4016)
- && (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1)
- && sd->status.sp >= 10)
- (*c)++;
- break;
- case BD_LULLABY: /* 子守歌 */
- case BD_RICHMANKIM: /* ニヨルドの宴 */
- case BD_ETERNALCHAOS: /* 永遠の混沌 */
- case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */
- case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */
- case BD_ROKISWEIL: /* ロキの叫び */
- case BD_INTOABYSS: /* 深淵の中に */
- case BD_SIEGFRIED: /* 不死身のジークフリード */
- case BD_RAGNAROK: /* 神々の黄昏 */
- case CG_MOONLIT: /* 月明りの泉に落ちる花びら */
- if (sd != ssd &&
- ((ssd->status.pc_class == 19 && sd->status.pc_class == 20) ||
- (ssd->status.pc_class == 20 && sd->status.pc_class == 19) ||
- (ssd->status.pc_class == 4020 && sd->status.pc_class == 4021) ||
- (ssd->status.pc_class == 4021 && sd->status.pc_class == 4020) ||
- (ssd->status.pc_class == 20 && sd->status.pc_class == 4020) ||
- (ssd->status.pc_class == 19 && sd->status.pc_class == 4021)) &&
- pc_checkskill(sd, ssd->skillid) > 0 &&
- (*c) == 0 &&
- sd->status.party_id == ssd->status.party_id &&
- !pc_issit(sd) && sd->sc_data[SC_DANCING].timer == -1)
- (*c) = pc_checkskill(sd, ssd->skillid);
- break;
- }
- return;
}
-/*==========================================
- * 範囲内キャラ存在確認判定後スキル使用処理(foreachinarea)
- *------------------------------------------
- */
-
-static
-void skill_check_condition_use_sub(struct block_list *bl, struct block_list *src, int *c)
-{
- struct map_session_data *sd;
- struct map_session_data *ssd;
- struct pc_base_job s_class;
- struct pc_base_job ss_class;
- int skilllv;
-
- nullpo_retv(bl);
- sd = (struct map_session_data *) bl;
- nullpo_retv(src);
- nullpo_retv(c);
- ssd = (struct map_session_data *) src;
-
- s_class = pc_calc_base_job(sd->status.pc_class);
-
- //チェックしない設定ならcにありえない大きな数字を返して終了
- if (!battle_config.player_skill_partner_check)
- { //本当はforeachの前にやりたいけど設定適用箇所をまとめるためにここへ
- (*c) = 99;
- return;
- }
-
- ss_class = pc_calc_base_job(ssd->status.pc_class);
- SkillID skillid = ssd->skillid;
- skilllv = ssd->skilllv;
- switch (skillid)
- {
- case PR_BENEDICTIO: /* 聖体降福 */
- if (sd != ssd
- && (sd->status.pc_class == 4 || sd->status.pc_class == 8
- || sd->status.pc_class == 15 || sd->status.pc_class == 4005
- || sd->status.pc_class == 4009 || sd->status.pc_class == 4016)
- && (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1)
- && sd->status.sp >= 10)
- {
- sd->status.sp -= 10;
- pc_calcstatus(sd, 0);
- (*c)++;
- }
- break;
- case BD_LULLABY: /* 子守歌 */
- case BD_RICHMANKIM: /* ニヨルドの宴 */
- case BD_ETERNALCHAOS: /* 永遠の混沌 */
- case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */
- case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */
- case BD_ROKISWEIL: /* ロキの叫び */
- case BD_INTOABYSS: /* 深淵の中に */
- case BD_SIEGFRIED: /* 不死身のジークフリード */
- case BD_RAGNAROK: /* 神々の黄昏 */
- case CG_MOONLIT: /* 月明りの泉に落ちる花びら */
- if (sd != ssd && //本人以外で
- ((ssd->status.pc_class == 19 && sd->status.pc_class == 20) ||
- (ssd->status.pc_class == 20 && sd->status.pc_class == 19) ||
- (ssd->status.pc_class == 4020 && sd->status.pc_class == 4021) ||
- (ssd->status.pc_class == 4021 && sd->status.pc_class == 4020) ||
- (ssd->status.pc_class == 20 && sd->status.pc_class == 4020) ||
- (ssd->status.pc_class == 19 && sd->status.pc_class == 4021)) && //自分がダンサーならバードで
- pc_checkskill(sd, skillid) > 0 && //スキルを持っていて
- (*c) == 0 && //最初の一人で
- sd->status.party_id == ssd->status.party_id && //パーティーが同じで
- !pc_issit(sd) && //座ってない
- sd->sc_data[SC_DANCING].timer == -1 //ダンス中じゃない
- )
- {
- ssd->sc_data[SC_DANCING].val4 = bl->id;
- skill_status_change_start(bl, SC_DANCING, uint16_t(skillid),
- ssd->sc_data[SC_DANCING].val2, 0,
- src->id, skill_get_time(skillid,
- skilllv) +
- 1000, 0);
- sd->skillid_dance = sd->skillid = skillid;
- sd->skilllv_dance = sd->skilllv = skilllv;
- (*c)++;
- }
- break;
- }
-}
-
-/*==========================================
- * 範囲内バイオプラント、スフィアマイン用Mob存在確認判定処理(foreachinarea)
- *------------------------------------------
- */
-
-static
-void skill_check_condition_mob_master_sub(struct block_list *bl, int src_id, int mob_class, int *c)
-{
- struct mob_data *md;
-
- nullpo_retv(bl);
- md = (struct mob_data *) bl;
-
- if (!src_id)
- return;
- if (!mob_class)
- return;
- nullpo_retv(c);
-
- if (md->mob_class == mob_class && md->master_id == src_id)
- (*c)++;
-}
/*==========================================
* スキル使用条件(偽で使用失敗)
@@ -7356,17 +2964,6 @@ int skill_check_condition(struct map_session_data *sd, int type)
return 0;
}
- if (sd->skillid == AC_MAKINGARROW && sd->state.make_arrow_flag == 1)
- {
- sd->skillitem = SkillID::NEGATIVE;
- sd->skillitemlv = -1;
- return 0;
- }
- /*if (sd->skillid == AM_PHARMACY && sd->state.produce_flag == 1) {
- * sd->skillitem = sd->skillitemlv = -1;
- * return 0;
- * } */
-
if (sd->skillitem == sd->skillid)
{ /* アイテムの場合無条件成功 */
if (type & 1)
@@ -7381,10 +2978,8 @@ int skill_check_condition(struct map_session_data *sd, int type)
clif_skill_fail(sd, sd->skillid, 0, 0);
return 0;
}
- if (sd->sc_data[SC_DIVINA].timer != -1 ||
- sd->sc_data[SC_ROKISWEIL].timer != -1 ||
- (sd->sc_data[SC_AUTOCOUNTER].timer != -1
- && sd->skillid != KN_AUTOCOUNTER)
+ if (sd->sc_data[SC_DIVINA].timer != -1
+ || sd->sc_data[SC_ROKISWEIL].timer != -1
|| sd->sc_data[SC_STEELBODY].timer != -1
|| sd->sc_data[SC_BERSERK].timer != -1)
{
@@ -7395,8 +2990,6 @@ int skill_check_condition(struct map_session_data *sd, int type)
lv = sd->skilllv;
hp = skill_get_hp(skill, lv); /* 消費HP */
sp = skill_get_sp(skill, lv); /* 消費SP */
- if ((sd->skillid_old == BD_ENCORE) && skill == sd->skillid_dance)
- sp = sp / 2; //アンコール時はSP消費が半分
hp_rate = (lv <= 0) ? 0 : skill_db[skill].hp_rate[lv - 1];
sp_rate = (lv <= 0) ? 0 : skill_db[skill].sp_rate[lv - 1];
zeny = skill_get_zeny(skill, lv);
@@ -7423,173 +3016,10 @@ int skill_check_condition(struct map_session_data *sd, int type)
switch (skill)
{
- case SA_CASTCANCEL:
- if (sd->skilltimer == -1)
- {
- clif_skill_fail(sd, skill, 0, 0);
- return 0;
- }
- break;
- case BS_MAXIMIZE: /* マキシマイズパワー */
- case NV_TRICKDEAD: /* 死んだふり */
- case TF_HIDING: /* ハイディング */
- case AS_CLOAKING: /* クローキング */
- case CR_AUTOGUARD: /* オートガード */
- case CR_DEFENDER: /* ディフェンダー */
- case ST_CHASEWALK:
- if (sd->sc_data[SkillStatusChangeTable[skill]].timer != -1)
- return 1; /* 解除する場合はSP消費しない */
- break;
case AL_TELEPORT:
- case AL_WARP:
if (map[sd->bl.m].flag.noteleport)
return 0;
break;
- case MO_CALLSPIRITS: /* 気功 */
- if (sd->spiritball >= lv)
- {
- clif_skill_fail(sd, skill, 0, 0);
- return 0;
- }
- break;
- case CH_SOULCOLLECT: /* 狂気功 */
- if (sd->spiritball >= 5)
- {
- clif_skill_fail(sd, skill, 0, 0);
- return 0;
- }
- break;
- case MO_FINGEROFFENSIVE: //指弾
- if (sd->spiritball > 0 && sd->spiritball < spiritball)
- {
- spiritball = sd->spiritball;
- sd->spiritball_old = sd->spiritball;
- }
- else
- sd->spiritball_old = lv;
- break;
- case MO_CHAINCOMBO: //連打掌
- if (sd->sc_data[SC_BLADESTOP].timer == -1)
- {
- if (sd->sc_data[SC_COMBO].timer == -1
- || SkillID(sd->sc_data[SC_COMBO].val1) != MO_TRIPLEATTACK)
- return 0;
- }
- break;
- case MO_COMBOFINISH: //猛龍拳
- if (sd->sc_data[SC_COMBO].timer == -1
- || SkillID(sd->sc_data[SC_COMBO].val1) != MO_CHAINCOMBO)
- return 0;
- break;
- case CH_TIGERFIST: //伏虎拳
- if (sd->sc_data[SC_COMBO].timer == -1
- || SkillID(sd->sc_data[SC_COMBO].val1) != MO_COMBOFINISH)
- return 0;
- break;
- case CH_CHAINCRUSH: //連柱崩撃
- if (sd->sc_data[SC_COMBO].timer == -1)
- return 0;
- if (SkillID(sd->sc_data[SC_COMBO].val1) != MO_COMBOFINISH
- && SkillID(sd->sc_data[SC_COMBO].val1) != CH_TIGERFIST)
- return 0;
- break;
- case MO_EXTREMITYFIST: // 阿修羅覇鳳拳
- if ((sd->sc_data[SC_COMBO].timer != -1
- && (SkillID(sd->sc_data[SC_COMBO].val1) == MO_COMBOFINISH
- || SkillID(sd->sc_data[SC_COMBO].val1) == CH_CHAINCRUSH))
- || sd->sc_data[SC_BLADESTOP].timer != -1)
- spiritball--;
- break;
- case BD_ADAPTATION: /* アドリブ */
- {
- struct skill_unit_group *group = NULL;
- if (sd->sc_data[SC_DANCING].timer == -1
- ||
- ((group =
- (struct skill_unit_group *) sd->sc_data[SC_DANCING].val2)
- &&
- (skill_get_time(SkillID(sd->sc_data[SC_DANCING].val1),
- group->skill_lv) - sd->sc_data[SC_DANCING].val3 * 1000) <=
- skill_get_time2(skill, lv)))
- { //ダンス中で使用後5秒以上のみ?
- clif_skill_fail(sd, skill, 0, 0);
- return 0;
- }
- }
- break;
- case PR_BENEDICTIO: /* 聖体降福 */
- {
- int range = 1;
- int c = 0;
- if (!(type & 1))
- {
- map_foreachinarea(std::bind(skill_check_condition_char_sub, ph::_1, &sd->bl, &c),
- sd->bl.m, sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC);
- if (c < 2)
- {
- clif_skill_fail(sd, skill, 0, 0);
- return 0;
- }
- }
- else
- {
- map_foreachinarea(std::bind(skill_check_condition_use_sub, ph::_1, &sd->bl, &c),
- sd->bl.m, sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC);
- }
- }
- break;
- case WE_CALLPARTNER: /* あなたに逢いたい */
- if (!sd->status.partner_id)
- {
- clif_skill_fail(sd, skill, 0, 0);
- return 0;
- }
- break;
- case AM_CANNIBALIZE: /* バイオプラント */
- case AM_SPHEREMINE: /* スフィアーマイン */
- if (type & 1)
- {
- int c = 0;
- int maxcount = skill_get_maxcount(skill);
- int mob_class = (skill == AM_CANNIBALIZE) ? 1118 : 1142;
- if (battle_config.pc_land_skill_limit && maxcount > 0)
- {
- map_foreachinarea(std::bind(skill_check_condition_mob_master_sub, ph::_1, sd->bl.id, mob_class, &c),
-
- sd->bl.m, 0, 0,
- map[sd->bl.m].xs, map[sd->bl.m].ys, BL_MOB);
- if (c >= maxcount)
- {
- clif_skill_fail(sd, skill, 0, 0);
- return 0;
- }
- }
- }
- break;
- case MG_FIREWALL: /* ファイアーウォール */
- /* 数制限 */
- if (battle_config.pc_land_skill_limit)
- {
- int maxcount = skill_get_maxcount(skill);
- if (maxcount > 0)
- {
- int i, c;
- for (i = c = 0; i < MAX_SKILLUNITGROUP; i++)
- {
- if (sd->skillunit[i].alive_count > 0
- && sd->skillunit[i].skill_id == skill)
- c++;
- }
- if (c >= maxcount)
- {
- clif_skill_fail(sd, skill, 0, 0);
- return 0;
- }
- }
- }
- break;
}
if (!(type & 2))
@@ -7623,7 +3053,6 @@ int skill_check_condition(struct map_session_data *sd, int type)
for (int i = 0; i < 10; i++)
{
- int x = lv % 11 - 1;
index[i] = -1;
if (itemid[i] <= 0)
continue;
@@ -7633,8 +3062,6 @@ int skill_check_condition(struct map_session_data *sd, int type)
if (((itemid[i] >= 715 && itemid[i] <= 717) || itemid[i] == 1065)
&& sd->sc_data[SC_INTOABYSS].timer != -1)
continue;
- if (skill == AM_POTIONPITCHER && i != x)
- continue;
index[i] = pc_search_inventory(sd, itemid[i]);
if (index[i] < 0 || sd->status.inventory[index[i]].amount < amount[i])
@@ -7650,10 +3077,7 @@ int skill_check_condition(struct map_session_data *sd, int type)
if (!(type & 1))
return 1;
- if (skill != AM_POTIONPITCHER)
{
- if (skill == AL_WARP && !(type & 2))
- return 1;
for (int i = 0; i < 10; i++)
{
if (index[i] >= 0)
@@ -7666,14 +3090,6 @@ int skill_check_condition(struct map_session_data *sd, int type)
pc_heal(sd, -sp, -hp); // [Fate] This might suppress some dupe messages
-/* if (sp > 0) { // SP消費 */
-/* sd->status.sp-=sp; */
-/* clif_updatestatus(sd,SP_SP); */
-/* } */
-/* if (hp > 0) { // HP消費 */
-/* sd->status.hp-=hp; */
-/* clif_updatestatus(sd,SP_HP); */
-/* } */
if (zeny > 0) // Zeny消費
pc_payzeny(sd, zeny);
if (spiritball > 0) // 氣球消費
@@ -7794,8 +3210,7 @@ int skill_use_id(struct map_session_data *sd, int target_id,
SkillID skill_num, int skill_lv)
{
unsigned int tick;
- int casttime = 0, delay = 0, skill, range_;
- struct map_session_data *target_sd = NULL;
+ int casttime = 0, delay = 0, range_;
int forcecast = 0;
struct block_list *bl;
eptr<struct status_change, StatusChange> sc_data;
@@ -7812,15 +3227,6 @@ int skill_use_id(struct map_session_data *sd, int target_id,
if (sd->bl.m != bl->m || pc_isdead(sd))
return 0;
- if (skillnotok(skill_num, sd)) // [MouseJstr]
- return 0;
-
- if (sd->skillid == WZ_ICEWALL && map[sd->bl.m].flag.noicewall
- && !map[sd->bl.m].flag.pvp)
- { // noicewall flag [Valaris]
- clif_skill_fail(sd, sd->skillid, 0, 0);
- return 0;
- }
sc_data = sd->sc_data;
/* 沈黙や異常(ただし、グリムなどの判定をする) */
@@ -7831,134 +3237,33 @@ int skill_use_id(struct map_session_data *sd, int target_id,
return 0;
if (sc_data[SC_VOLCANO].timer != -1)
{
- if (skill_num == WZ_ICEWALL)
- return 0;
}
if (sc_data[SC_ROKISWEIL].timer != -1)
{
- if (skill_num == BD_ADAPTATION)
- return 0;
}
- if (sd->sc_data[SC_DIVINA].timer != -1 ||
- sd->sc_data[SC_ROKISWEIL].timer != -1 ||
- (sd->sc_data[SC_AUTOCOUNTER].timer != -1
- && sd->skillid != KN_AUTOCOUNTER)
+ if (sd->sc_data[SC_DIVINA].timer != -1
+ || sd->sc_data[SC_ROKISWEIL].timer != -1
|| sd->sc_data[SC_STEELBODY].timer != -1
|| sd->sc_data[SC_BERSERK].timer != -1)
{
return 0; /* 状態異常や沈黙など */
}
- if (sc_data[SC_BLADESTOP].timer != -1)
- {
- int lv = sc_data[SC_BLADESTOP].val1;
- if (sc_data[SC_BLADESTOP].val2 == 1)
- return 0; //白羽された側なのでダメ
- if (lv == 1)
- return 0;
- if (lv == 2 && skill_num != MO_FINGEROFFENSIVE)
- return 0;
- if (lv == 3 && skill_num != MO_FINGEROFFENSIVE
- && skill_num != MO_INVESTIGATE)
- return 0;
- if (lv == 4 && skill_num != MO_FINGEROFFENSIVE
- && skill_num != MO_INVESTIGATE && skill_num != MO_CHAINCOMBO)
- return 0;
- if (lv == 5 && skill_num != MO_FINGEROFFENSIVE
- && skill_num != MO_INVESTIGATE && skill_num != MO_CHAINCOMBO
- && skill_num != MO_EXTREMITYFIST)
- return 0;
- }
-
- if (bool(sd->status.option & Option::CLOAK)
- && skill_num == TF_HIDING)
- return 0;
- if (bool(sd->status.option & Option::HIDE2)
- && skill_num != TF_HIDING
- && skill_num != AS_GRIMTOOTH
- && skill_num != RG_BACKSTAP
- && skill_num != RG_RAID)
+ if (bool(sd->status.option & Option::HIDE2))
return 0;
/* 演奏/ダンス中 */
if (sc_data && sc_data[SC_DANCING].timer != -1)
{
-// if(battle_config.pc_skill_log)
-// PRINTF("dancing! %d\n",skill_num);
- if (sc_data[SC_DANCING].val4 && skill_num != BD_ADAPTATION) //合奏中はアドリブ以外不可
- return 0;
- if (skill_num != BD_ADAPTATION && skill_num != BA_MUSICALSTRIKE
- && skill_num != DC_THROWARROW)
- {
- return 0;
- }
+ return 0;
}
if (skill_get_inf2(skill_num) & 0x200 && sd->bl.id == target_id)
return 0;
- //直前のスキルが何か覚える必要のあるスキル
- switch (skill_num)
- {
- case SA_CASTCANCEL:
- if (sd->skillid != skill_num)
- { //キャストキャンセル自体は覚えない
- sd->skillid_old = sd->skillid;
- sd->skilllv_old = sd->skilllv;
- break;
- }
- // TODO: determine if this was supposed to fallthrough instead
- break;
- case BD_ENCORE: /* アンコール */
- if (sd->skillid_dance == SkillID::ZERO)
- { //前回使用した踊りがないとだめ
- clif_skill_fail(sd, skill_num, 0, 0);
- return 0;
- }
- else
- {
- sd->skillid_old = skill_num;
- }
- break;
- }
sd->skillid = skill_num;
sd->skilllv = skill_lv;
- switch (skill_num)
- { //事前にレベルが変わったりするスキル
- case BD_LULLABY: /* 子守歌 */
- case BD_RICHMANKIM: /* ニヨルドの宴 */
- case BD_ETERNALCHAOS: /* 永遠の混沌 */
- case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */
- case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */
- case BD_ROKISWEIL: /* ロキの叫び */
- case BD_INTOABYSS: /* 深淵の中に */
- case BD_SIEGFRIED: /* 不死身のジークフリード */
- case BD_RAGNAROK: /* 神々の黄昏 */
- case CG_MOONLIT: /* 月明りの泉に落ちる花びら */
- {
- int range = 1;
- int c = 0;
- map_foreachinarea(std::bind(skill_check_condition_char_sub, ph::_1, &sd->bl, &c),
- sd->bl.m, sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC);
- if (c < 1)
- {
- clif_skill_fail(sd, skill_num, 0, 0);
- return 0;
- }
- else if (c == 99)
- { //相方不要設定だった
- ;
- }
- else
- {
- sd->skilllv = (c + skill_lv) / 2;
- }
- }
- break;
- }
-
if (!skill_check_condition(sd, 0))
return 0;
@@ -7969,114 +3274,12 @@ int skill_use_id(struct map_session_data *sd, int target_id,
if (!battle_check_range(&sd->bl, bl, range_))
return 0;
- if (bl->type == BL_PC)
- {
- target_sd = (struct map_session_data *) bl;
- if (target_sd && skill_num == ALL_RESURRECTION
- && !pc_isdead(target_sd))
- return 0;
- }
- if ((skill_num != MO_CHAINCOMBO &&
- skill_num != MO_COMBOFINISH &&
- skill_num != MO_EXTREMITYFIST &&
- skill_num != CH_TIGERFIST &&
- skill_num != CH_CHAINCRUSH) ||
- (skill_num == MO_EXTREMITYFIST && sd->state.skill_flag))
- pc_stopattack(sd);
+ pc_stopattack(sd);
casttime = skill_castfix(&sd->bl, skill_get_cast(skill_num, skill_lv));
- if (skill_num != SA_MAGICROD)
- delay =
- skill_delayfix(&sd->bl, skill_get_delay(skill_num, skill_lv));
+ delay = skill_delayfix(&sd->bl, skill_get_delay(skill_num, skill_lv));
sd->state.skillcastcancel = skill_db[skill_num].castcancel;
- switch (skill_num)
- { /* 何か特殊な処理が必要 */
-// case AL_HEAL: /* ヒール */
-// if(battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
-// forcecast=1; /* ヒールアタックなら詠唱エフェクト有り */
-// break;
- case ALL_RESURRECTION: /* リザレクション */
- if (bl->type != BL_PC
- && battle_check_undead(battle_get_race(bl),
- battle_get_elem_type(bl)))
- { /* 敵がアンデッドなら */
- forcecast = 1; /* ターンアンデットと同じ詠唱時間 */
- casttime =
- skill_castfix(&sd->bl,
- skill_get_cast(PR_TURNUNDEAD, skill_lv));
- }
- break;
- case MO_FINGEROFFENSIVE: /* 指弾 */
- casttime +=
- casttime *
- ((skill_lv > sd->spiritball) ? sd->spiritball : skill_lv);
- break;
- case MO_CHAINCOMBO: /*連打掌 */
- target_id = sd->attacktarget;
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- {
- struct block_list *tbl;
- if ((tbl = (struct block_list *) sc_data[SC_BLADESTOP].val4) == NULL) //ターゲットがいない?
- return 0;
- target_id = tbl->id;
- }
- break;
- case MO_COMBOFINISH: /*猛龍拳 */
- case CH_TIGERFIST: /* 伏虎拳 */
- case CH_CHAINCRUSH: /* 連柱崩撃 */
- target_id = sd->attacktarget;
- break;
-
-// -- moonsoul (altered to allow proper usage of extremity from new champion combos)
-//
- case MO_EXTREMITYFIST: /*阿修羅覇鳳拳 */
- if (sc_data && sc_data[SC_COMBO].timer != -1
- && (SkillID(sc_data[SC_COMBO].val1) == MO_COMBOFINISH
- || SkillID(sc_data[SC_COMBO].val1) == CH_CHAINCRUSH))
- {
- casttime = 0;
- target_id = sd->attacktarget;
- }
- forcecast = 1;
- break;
- case SA_MAGICROD:
- case SA_SPELLBREAKER:
- forcecast = 1;
- break;
- case WE_MALE:
- case WE_FEMALE:
- {
- struct map_session_data *p_sd = NULL;
- if ((p_sd = pc_get_partner(sd)) == NULL)
- return 0;
- target_id = p_sd->bl.id;
- //rangeをもう1回検査
- range_ = skill_get_range(skill_num, skill_lv);
- if (range_ < 0)
- range_ = battle_get_range(&sd->bl) - (range_ + 1);
- if (!battle_check_range(&sd->bl, &p_sd->bl, range_))
- {
- return 0;
- }
- }
- break;
- case AS_SPLASHER: /* ベナムスプラッシャー */
- {
- eptr<struct status_change, StatusChange> t_sc_data = battle_get_sc_data(bl);
- if (t_sc_data && t_sc_data[SC_POISON].timer == -1)
- {
- clif_skill_fail(sd, skill_num, 0, 10);
- return 0;
- }
- }
- break;
- case PF_MEMORIZE: /* メモライズ */
- casttime = 12000;
- break;
-
- }
-
//メモライズ状態ならキャストタイムが1/3
if (sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0)
{
@@ -8117,31 +3320,21 @@ int skill_use_id(struct map_session_data *sd, int target_id,
sd->canact_tick = tick + casttime + delay;
sd->canmove_tick = tick;
if (!(battle_config.pc_cloak_check_type & 2) && sc_data
- && sc_data[SC_CLOAKING].timer != -1 && sd->skillid != AS_CLOAKING)
+ && sc_data[SC_CLOAKING].timer != -1)
skill_status_change_end(&sd->bl, SC_CLOAKING, -1);
if (casttime > 0)
{
- sd->skilltimer =
- add_timer(tick + casttime, skill_castend_id, sd->bl.id, 0);
- if ((skill = pc_checkskill(sd, SA_FREECAST)) > 0)
- {
- sd->prev_speed = sd->speed;
- sd->speed = sd->speed * (175 - skill * 5) / 100;
- clif_updatestatus(sd, SP_SPEED);
- }
- else
- pc_stop_walking(sd, 0);
+ sd->skilltimer = add_timer(tick + casttime, skill_castend_id, sd->bl.id, 0);
+ pc_stop_walking(sd, 0);
}
else
{
- if (skill_num != SA_CASTCANCEL)
- sd->skilltimer = -1;
+ sd->skilltimer = -1;
skill_castend_id(sd->skilltimer, tick, sd->bl.id, 0);
}
//マジックパワーの効果終了
- if (sc_data && sc_data[SC_MAGICPOWER].timer != -1
- && skill_num != HW_MAGICPOWER)
+ if (sc_data && sc_data[SC_MAGICPOWER].timer != -1)
skill_status_change_end(&sd->bl, SC_MAGICPOWER, -1);
return 0;
@@ -8158,16 +3351,13 @@ int skill_use_pos(struct map_session_data *sd,
struct block_list bl;
eptr<struct status_change, StatusChange> sc_data;
unsigned int tick;
- int casttime = 0, delay = 0, skill, range;
+ int casttime = 0, delay = 0, range;
nullpo_ret(sd);
if (pc_isdead(sd))
return 0;
- if (skillnotok(skill_num, sd)) // [MoueJstr]
- return 0;
-
sc_data = sd->sc_data;
if (bool(sd->opt1))
@@ -8176,7 +3366,6 @@ int skill_use_pos(struct map_session_data *sd,
{
if (sc_data[SC_DIVINA].timer != -1 ||
sc_data[SC_ROKISWEIL].timer != -1 ||
- sc_data[SC_AUTOCOUNTER].timer != -1 ||
sc_data[SC_STEELBODY].timer != -1 ||
sc_data[SC_DANCING].timer != -1 ||
sc_data[SC_BERSERK].timer != -1)
@@ -8238,16 +3427,8 @@ int skill_use_pos(struct map_session_data *sd,
skill_status_change_end(&sd->bl, SC_CLOAKING, -1);
if (casttime > 0)
{
- sd->skilltimer =
- add_timer(tick + casttime, skill_castend_pos, sd->bl.id, 0);
- if ((skill = pc_checkskill(sd, SA_FREECAST)) > 0)
- {
- sd->prev_speed = sd->speed;
- sd->speed = sd->speed * (175 - skill * 5) / 100;
- clif_updatestatus(sd, SP_SPEED);
- }
- else
- pc_stop_walking(sd, 0);
+ sd->skilltimer = add_timer(tick + casttime, skill_castend_pos, sd->bl.id, 0);
+ pc_stop_walking(sd, 0);
}
else
{
@@ -8255,8 +3436,7 @@ int skill_use_pos(struct map_session_data *sd,
skill_castend_pos(sd->skilltimer, tick, sd->bl.id, 0);
}
//マジックパワーの効果終了
- if (sc_data && sc_data[SC_MAGICPOWER].timer != -1
- && skill_num != HW_MAGICPOWER)
+ if (sc_data && sc_data[SC_MAGICPOWER].timer != -1)
skill_status_change_end(&sd->bl, SC_MAGICPOWER, -1);
return 0;
@@ -8281,11 +3461,6 @@ int skill_castcancel(struct block_list *bl, int type)
sd->canmove_tick = tick;
if (sd->skilltimer != -1)
{
- if (pc_checkskill(sd, SA_FREECAST) > 0)
- {
- sd->speed = sd->prev_speed;
- clif_updatestatus(sd, SP_SPEED);
- }
if (!type)
{
if ((inf = skill_get_inf(sd->skillid)) == 2 || inf == 32)
@@ -8324,162 +3499,6 @@ int skill_castcancel(struct block_list *bl, int type)
return 1;
}
-/*=========================================
- * ブランディッシュスピア 初期範囲決定
- *----------------------------------------
- */
-void skill_brandishspear_first(struct square *tc, int dir, int x, int y)
-{
-
- nullpo_retv(tc);
-
- if (dir == 0)
- {
- tc->val1[0] = x - 2;
- tc->val1[1] = x - 1;
- tc->val1[2] = x;
- tc->val1[3] = x + 1;
- tc->val1[4] = x + 2;
- tc->val2[0] =
- tc->val2[1] = tc->val2[2] = tc->val2[3] = tc->val2[4] = y - 1;
- }
- else if (dir == 2)
- {
- tc->val1[0] =
- tc->val1[1] = tc->val1[2] = tc->val1[3] = tc->val1[4] = x + 1;
- tc->val2[0] = y + 2;
- tc->val2[1] = y + 1;
- tc->val2[2] = y;
- tc->val2[3] = y - 1;
- tc->val2[4] = y - 2;
- }
- else if (dir == 4)
- {
- tc->val1[0] = x - 2;
- tc->val1[1] = x - 1;
- tc->val1[2] = x;
- tc->val1[3] = x + 1;
- tc->val1[4] = x + 2;
- tc->val2[0] =
- tc->val2[1] = tc->val2[2] = tc->val2[3] = tc->val2[4] = y + 1;
- }
- else if (dir == 6)
- {
- tc->val1[0] =
- tc->val1[1] = tc->val1[2] = tc->val1[3] = tc->val1[4] = x - 1;
- tc->val2[0] = y + 2;
- tc->val2[1] = y + 1;
- tc->val2[2] = y;
- tc->val2[3] = y - 1;
- tc->val2[4] = y - 2;
- }
- else if (dir == 1)
- {
- tc->val1[0] = x - 1;
- tc->val1[1] = x;
- tc->val1[2] = x + 1;
- tc->val1[3] = x + 2;
- tc->val1[4] = x + 3;
- tc->val2[0] = y - 4;
- tc->val2[1] = y - 3;
- tc->val2[2] = y - 1;
- tc->val2[3] = y;
- tc->val2[4] = y + 1;
- }
- else if (dir == 3)
- {
- tc->val1[0] = x + 3;
- tc->val1[1] = x + 2;
- tc->val1[2] = x + 1;
- tc->val1[3] = x;
- tc->val1[4] = x - 1;
- tc->val2[0] = y - 1;
- tc->val2[1] = y;
- tc->val2[2] = y + 1;
- tc->val2[3] = y + 2;
- tc->val2[4] = y + 3;
- }
- else if (dir == 5)
- {
- tc->val1[0] = x + 1;
- tc->val1[1] = x;
- tc->val1[2] = x - 1;
- tc->val1[3] = x - 2;
- tc->val1[4] = x - 3;
- tc->val2[0] = y + 3;
- tc->val2[1] = y + 2;
- tc->val2[2] = y + 1;
- tc->val2[3] = y;
- tc->val2[4] = y - 1;
- }
- else if (dir == 7)
- {
- tc->val1[0] = x - 3;
- tc->val1[1] = x - 2;
- tc->val1[2] = x - 1;
- tc->val1[3] = x;
- tc->val1[4] = x + 1;
- tc->val2[1] = y;
- tc->val2[0] = y + 1;
- tc->val2[2] = y - 1;
- tc->val2[3] = y - 2;
- tc->val2[4] = y - 3;
- }
-
-}
-
-/*=========================================
- * ブランディッシュスピア 方向判定 範囲拡張
- *-----------------------------------------
- */
-void skill_brandishspear_dir(struct square *tc, int dir, int are)
-{
-
- int c;
-
- nullpo_retv(tc);
-
- for (c = 0; c < 5; c++)
- {
- if (dir == 0)
- {
- tc->val2[c] += are;
- }
- else if (dir == 1)
- {
- tc->val1[c] -= are;
- tc->val2[c] += are;
- }
- else if (dir == 2)
- {
- tc->val1[c] -= are;
- }
- else if (dir == 3)
- {
- tc->val1[c] -= are;
- tc->val2[c] -= are;
- }
- else if (dir == 4)
- {
- tc->val2[c] -= are;
- }
- else if (dir == 5)
- {
- tc->val1[c] += are;
- tc->val2[c] -= are;
- }
- else if (dir == 6)
- {
- tc->val1[c] += are;
- }
- else if (dir == 7)
- {
- tc->val1[c] += are;
- tc->val2[c] += are;
- }
- }
-}
-
/*==========================================
* ディボーション 有効確認
*------------------------------------------
@@ -8533,7 +3552,7 @@ int skill_devotion3(struct block_list *bl, int target)
else
r = distance(bl->x, bl->y, sd->bl.x, sd->bl.y);
- if (pc_checkskill(sd, CR_DEVOTION) + 6 < r)
+ if ( + 6 < r)
{ // 許容範囲を超えてた
for (n = 0; n < 5; n++)
if (md->dev.val1[n] == target)
@@ -8560,170 +3579,17 @@ void skill_devotion_end(struct map_session_data *md,
}
}
-/*==========================================
- * ギャングスターパラダイス判定処理(foreachinarea)
- *------------------------------------------
- */
-
-static
-void skill_gangster_count(struct block_list *bl, int *c)
+int skill_gangsterparadise(struct map_session_data *, int)
{
- struct map_session_data *sd;
-
- nullpo_retv(bl);
- nullpo_retv(c);
-
- sd = (struct map_session_data *) bl;
-
- if (pc_issit(sd) && pc_checkskill(sd, RG_GANGSTER) > 0)
- (*c)++;
-}
-
-static
-void skill_gangster_in(struct block_list *bl)
-{
- struct map_session_data *sd;
-
- nullpo_retv(bl);
-
- sd = (struct map_session_data *) bl;
-
- if (pc_issit(sd) && pc_checkskill(sd, RG_GANGSTER) > 0)
- sd->state.gangsterparadise = 1;
-}
-
-static
-void skill_gangster_out(struct block_list *bl)
-{
- struct map_session_data *sd;
-
- nullpo_retv(bl);
-
- sd = (struct map_session_data *) bl;
-
- if (sd->state.gangsterparadise)
- sd->state.gangsterparadise = 0;
-}
-
-int skill_gangsterparadise(struct map_session_data *sd, int type)
-{
- int range = 1;
- int c = 0;
-
- nullpo_ret(sd);
-
- if (pc_checkskill(sd, RG_GANGSTER) <= 0)
- return 0;
-
- if (type == 1)
- { /* 座った時の処理 */
- map_foreachinarea(std::bind(skill_gangster_count, ph::_1, &c),
- sd->bl.m, sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC);
- if (c > 0)
- { /*ギャングスター成功したら自分にもギャングスター属性付与 */
- map_foreachinarea(skill_gangster_in, sd->bl.m,
- sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC);
- sd->state.gangsterparadise = 1;
- }
- return 0;
- }
- else if (type == 0)
- { /* 立ち上がったときの処理 */
- map_foreachinarea(std::bind(skill_gangster_count, ph::_1, &c),
- sd->bl.m, sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC);
- if (c < 1)
- map_foreachinarea(skill_gangster_out, sd->bl.m,
- sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC);
- sd->state.gangsterparadise = 0;
- return 0;
- }
return 0;
}
/*==========================================
- * 寒いジョーク・スクリーム判定処理(foreachinarea)
- *------------------------------------------
- */
-void skill_frostjoke_scream(struct block_list *bl,
- struct block_list *src, SkillID skillnum, int skilllv, unsigned int tick)
-{
- nullpo_retv(bl);
- nullpo_retv(src);
-
- if (src == bl) //自分には効かない
- return;
-
- if (battle_check_target(src, bl, BCT_ENEMY) > 0)
- skill_additional_effect(src, bl, skillnum, skilllv, BF_MISC, tick);
- else if (battle_check_target(src, bl, BCT_PARTY) > 0)
- {
- if (MRAND(100) < 10) //PTメンバにも低確率でかかる(とりあえず10%)
- skill_additional_effect(src, bl, skillnum, skilllv, BF_MISC,
- tick);
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void skill_clear_element_field(struct block_list *bl)
-{
- struct mob_data *md = NULL;
- struct map_session_data *sd = NULL;
- int i;
-
- nullpo_retv(bl);
-
- if (bl->type == BL_MOB)
- md = (struct mob_data *) bl;
- if (bl->type == BL_PC)
- sd = (struct map_session_data *) bl;
-
- for (i = 0; i < MAX_MOBSKILLUNITGROUP; i++)
- {
- if (sd)
- {
- SkillID skillid = sd->skillunit[i].skill_id;
- if (skillid == SA_DELUGE || skillid == SA_VOLCANO
- || skillid == SA_VIOLENTGALE || skillid == SA_LANDPROTECTOR)
- skill_delunitgroup(&sd->skillunit[i]);
- }
- else if (md)
- {
- SkillID skillid = md->skillunit[i].skill_id;
- if (skillid == SA_DELUGE || skillid == SA_VOLCANO
- || skillid == SA_VIOLENTGALE || skillid == SA_LANDPROTECTOR)
- skill_delunitgroup(&md->skillunit[i]);
- }
- }
-}
-
-/*==========================================
* ランドプロテクターチェック(foreachinarea)
*------------------------------------------
*/
-void skill_landprotector(struct block_list *bl, SkillID skillid, int *alive)
+void skill_landprotector(struct block_list *, SkillID, int *)
{
- struct skill_unit *unit;
-
- nullpo_retv(bl);
-
- unit = (struct skill_unit *) bl;
-
- if (skillid == SA_LANDPROTECTOR)
- {
- skill_delunit(unit);
- }
- else
- {
- if (alive && unit->group->skill_id == SA_LANDPROTECTOR)
- (*alive) = 0;
- }
}
/*==========================================
@@ -8828,7 +3694,7 @@ void skill_trap_splash(struct block_list *bl,
*------------------------------------------
*/
void skill_status_change_timer_sub(struct block_list *bl,
- struct block_list *src, StatusChange type, unsigned int tick)
+ struct block_list *src, StatusChange type, unsigned int)
{
nullpo_retv(bl);
nullpo_retv(src);
@@ -8846,19 +3712,6 @@ void skill_status_change_timer_sub(struct block_list *bl,
skill_status_change_end(bl, SC_CLOAKING, -1);
}
break;
- case SC_RUWACH: /* ルアフ */
- if (bool((*battle_get_option(bl)) & (Option::HIDE2 | Option::CLOAK)))
- {
- skill_status_change_end(bl, SC_HIDING, -1);
- skill_status_change_end(bl, SC_CLOAKING, -1);
- if (battle_check_target(src, bl, BCT_ENEMY) > 0)
- {
- eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
- skill_attack(BF_MAGIC, src, src, bl, AL_RUWACH,
- sc_data[type].val1, tick, BCT_ZERO);
- }
- }
- break;
}
}
@@ -8962,7 +3815,6 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid)
case SC_SPEEDPOTION2:
case SC_APPLEIDUN: /* イドゥンの林檎 */
case SC_RIDING:
- case SC_BLADESTOP_WAIT:
case SC_AURABLADE: /* オーラブレード */
case SC_PARRYING: /* パリイング */
case SC_CONCENTRATION: /* コンセントレーション */
@@ -8993,19 +3845,6 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid)
calc_flag = 1;
}
break;
- case SC_BLADESTOP:
- {
- eptr<struct status_change, StatusChange> t_sc_data =
- battle_get_sc_data((struct block_list *)
- sc_data[type].val4);
- //片方が切れたので相手の白刃状態が切れてないのなら解除
- if (t_sc_data && t_sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end((struct block_list *)
- sc_data[type].val4, SC_BLADESTOP,
- -1);
-
- }
- break;
case SC_DANCING:
{
struct map_session_data *dsd;
@@ -9021,13 +3860,6 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid)
}
calc_flag = 1;
break;
- case SC_GRAFFITI:
- {
- struct skill_unit_group *sg = (struct skill_unit_group *) sc_data[type].val4; //val4がグラフィティのgroup_id
- if (sg)
- skill_delunitgroup(sg);
- }
- break;
case SC_NOCHAT: //チャット禁止状態
break;
case SC_SPLASHER: /* ベナムスプラッシャー */
@@ -9143,10 +3975,6 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid)
*option &= ~Option::_wedding;
opt_flag = 1;
break;
- case SC_RUWACH:
- *option &= ~Option::_ruwach;
- opt_flag = 1;
- break;
//opt3
case SC_TWOHANDQUICKEN: /* 2HQ */
@@ -9166,9 +3994,6 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid)
case SC_STEELBODY: // 金剛
*opt3 &= ~Opt3::_steelbody;
break;
- case SC_BLADESTOP: /* 白刃取り */
- *opt3 &= ~Opt3::_bladestop;
- break;
case SC_BERSERK: /* バーサーク */
*opt3 &= ~Opt3::_berserk;
break;
@@ -9312,23 +4137,6 @@ void skill_status_change_timer(timer_id tid, tick_t tick, custom_id_t id, custom
}
}
break;
- case SC_RUWACH: /* ルアフ */
- {
- const int range = 5;
- map_foreachinarea(std::bind(skill_status_change_timer_sub, ph::_1, bl, type, tick),
- bl->m, bl->x - range, bl->y - range,
- bl->x + range, bl->y + range, BL_NUL);
-
- if ((--sc_data[type].val2) > 0)
- {
- sc_data[type].timer = add_timer( /* タイマー再設定 */
- 250 + tick,
- skill_status_change_timer,
- bl->id, data);
- return;
- }
- }
- break;
case SC_SIGNUMCRUCIS: /* シグナムクルシス */
{
@@ -9356,23 +4164,6 @@ void skill_status_change_timer(timer_id tid, tick_t tick, custom_id_t id, custom
}
break;
- case SC_WATERBALL: /* ウォーターボール */
- {
- struct block_list *target = map_id2bl(sc_data[type].val2);
- if (target == NULL || target->prev == NULL)
- break;
- skill_attack(BF_MAGIC, bl, bl, target, WZ_WATERBALL,
- sc_data[type].val1, tick, BCT_ZERO);
- if ((--sc_data[type].val3) > 0)
- {
- sc_data[type].timer =
- add_timer(150 + tick, skill_status_change_timer, bl->id,
- data);
- return;
- }
- }
- break;
-
case SC_ENDURE: /* インデュア */
if (sd && sd->special_state.infinite_endure)
{
@@ -9552,38 +4343,6 @@ void skill_status_change_timer(timer_id tid, tick_t tick, custom_id_t id, custom
{
if (sd->status.sp > 0 && (--sc_data[type].val3) > 0)
{
- switch (SkillID(sc_data[type].val1))
- {
- case BD_RICHMANKIM: /* ニヨルドの宴 3秒にSP1 */
- case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き 3秒にSP1 */
- case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 3秒にSP1 */
- case BD_SIEGFRIED: /* 不死身のジークフリード 3秒にSP1 */
- case BA_DISSONANCE: /* 不協和音 3秒でSP1 */
- case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス 3秒でSP1 */
- case DC_UGLYDANCE: /* 自分勝手なダンス 3秒でSP1 */
- s = 3;
- break;
- case BD_LULLABY: /* 子守歌 4秒にSP1 */
- case BD_ETERNALCHAOS: /* 永遠の混沌 4秒にSP1 */
- case BD_ROKISWEIL: /* ロキの叫び 4秒にSP1 */
- case DC_FORTUNEKISS: /* 幸運のキス 4秒でSP1 */
- s = 4;
- break;
- case BD_INTOABYSS: /* 深淵の中に 5秒にSP1 */
- case BA_WHISTLE: /* 口笛 5秒でSP1 */
- case DC_HUMMING: /* ハミング 5秒でSP1 */
- case BA_POEMBRAGI: /* ブラギの詩 5秒でSP1 */
- case DC_SERVICEFORYOU: /* サービスフォーユー 5秒でSP1 */
- s = 5;
- break;
- case BA_APPLEIDUN: /* イドゥンの林檎 6秒でSP1 */
- s = 6;
- break;
- case DC_DONTFORGETME: /* 私を忘れないで… 10秒でSP1 */
- case CG_MOONLIT: /* 月明りの泉に落ちる花びら 10秒でSP1? */
- s = 10;
- break;
- }
if (s && ((sc_data[type].val3 % s) == 0))
{
sd->status.sp--;
@@ -9776,9 +4535,7 @@ int skill_status_effect(struct block_list *bl, StatusChange type,
if (bl->type == BL_PC)
{
sd = (struct map_session_data *) bl;
- if (sd && type == SC_ADRENALINE
- && !(skill_get_weapontype(BS_ADRENALINE) &
- (1 << sd->status.weapon)))
+ if (sd && type == SC_ADRENALINE)
return 0;
if (SC_STONE <= type && type <= SC_BLIND)
@@ -9830,15 +4587,17 @@ int skill_status_effect(struct block_list *bl, StatusChange type,
if (sc_data[type].timer != -1)
{ /* すでに同じ異常になっている場合タイマ解除 */
- if (sc_data[type].val1 > val1 && type != SC_COMBO && type != SC_DANCING && type != SC_DEVOTION && type != SC_SPEEDPOTION0 && type != SC_SPEEDPOTION1 && type != SC_SPEEDPOTION2 && type != SC_ATKPOT && type != SC_MATKPOT) // added atk and matk potions [Valaris]
+ if (sc_data[type].val1 > val1
+ && type != SC_DANCING
+ && type != SC_DEVOTION
+ && type != SC_SPEEDPOTION0
+ && type != SC_SPEEDPOTION1
+ && type != SC_SPEEDPOTION2
+ && type != SC_ATKPOT
+ && type != SC_MATKPOT) // added atk and matk potions [Valaris]
return 0;
if (type >= SC_STAN && type <= SC_BLIND)
return 0; /* 継ぎ足しができない状態異常である時は状態異常を行わない */
- if (type == SC_GRAFFITI)
- { //異常中にもう一度状態異常になった時に解除してから再度かかる
- skill_status_change_end(bl, type, -1);
- }
- else
{
(*sc_count)--;
delete_timer(sc_data[type].timer, skill_status_change_timer);
@@ -10018,10 +4777,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type,
case SC_CP_HELM:
break;
- case SC_AUTOSPELL: /* オートスペル */
- val4 = 5 + val1 * 2;
- break;
-
case SC_VOLCANO:
calc_flag = 1;
val3 = val1 * 10;
@@ -10055,13 +4810,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type,
val2 = 20 + val1;
*opt3 |= Opt3::_concentration;
break;
- case SC_COMBO:
- break;
- case SC_BLADESTOP_WAIT: /* 白刃取り(待ち) */
- break;
- case SC_BLADESTOP: /* 白刃取り */
- *opt3 |= Opt3::_bladestop;
- break;
case SC_LULLABY: /* 子守唄 */
val2 = 11;
@@ -10152,9 +4900,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type,
break;
case SC_EXTREMITYFIST: /* 阿修羅覇凰拳 */
break;
- case SC_AUTOCOUNTER:
- val3 = val4 = 0;
- break;
case SC_SPEEDPOTION0: /* 増速ポーション */
*opt2 |= Opt2::_speedpotion0;
@@ -10296,7 +5041,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type,
tick = 5000 * val1;
break;
case SC_SIGHT: /* サイト/ルアフ */
- case SC_RUWACH:
val2 = tick / 250;
tick = 10;
break;
@@ -10311,15 +5055,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type,
case SC_ANKLE:
break;
- /* ウォーターボール */
- case SC_WATERBALL:
- tick = 150;
- if (val1 > 5) //レベルが5以上の場合は25発に制限(1発目はすでに打ってるので-1)
- val3 = 5 * 5 - 1;
- else
- val3 = (val1 | 1) * (val1 | 1) - 1;
- break;
-
/* スキルじゃない/時間に関係しない */
case SC_RIDING:
calc_flag = 1;
@@ -10433,14 +5168,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type,
case SC_MEMORIZE: /* メモライズ */
val2 = 3; //3回詠唱を1/3にする
break;
- case SC_GRAFFITI: /* グラフィティ */
- {
- struct skill_unit_group *sg =
- skill_unitsetting(bl, RG_GRAFFITI, val1, val2, val3, 0);
- if (sg)
- val4 = (int) sg;
- }
- break;
case SC_HASTE:
calc_flag = 1;
break;
@@ -10540,10 +5267,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type,
*option |= Option::SIGHT;
opt_flag = 1;
break;
- case SC_RUWACH:
- *option |= Option::_ruwach;
- opt_flag = 1;
- break;
case SC_WEDDING:
*option |= Option::_wedding;
opt_flag = 1;
@@ -10606,15 +5329,7 @@ int skill_status_change_clear(struct block_list *bl, int type)
for (StatusChange i : erange(StatusChange(), MAX_STATUSCHANGE))
{
if (sc_data[i].timer != -1)
- { /* 異常があるならタイマーを削除する */
-/*
- delete_timer(sc_data[i].timer, skill_status_change_timer);
- sc_data[i].timer = -1;
-
- if (!type && i < SC_SENDMAX)
- clif_status_change(bl, i, 0);
-*/
-
+ {
skill_status_change_end(bl, i, -1);
}
}
@@ -10636,15 +5351,12 @@ int skill_status_change_clear(struct block_list *bl, int type)
/* クローキング検査(周りに移動不可能地帯があるか) */
int skill_check_cloaking(struct block_list *bl)
{
- struct map_session_data *sd = NULL;
static int dx[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
static int dy[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int end = 1, i;
nullpo_ret(bl);
- if (pc_checkskill(sd, AS_CLOAKING) > 2)
- return 0;
if (bl->type == BL_PC && battle_config.pc_cloak_check_type & 1)
return 0;
if (bl->type == BL_MOB && battle_config.monster_cloak_check_type & 1)
@@ -10670,46 +5382,6 @@ int skill_check_cloaking(struct block_list *bl)
*/
/*==========================================
- * 演奏/ダンススキルかどうか判定
- * 引数 スキルID
- * 戻り ダンスじゃない=0 合奏=2 それ以外のダンス=1
- *------------------------------------------
- */
-static
-int skill_is_danceskill(SkillID id)
-{
- switch (id)
- {
- case BD_LULLABY: /* 子守歌 */
- case BD_RICHMANKIM: /* ニヨルドの宴 */
- case BD_ETERNALCHAOS: /* 永遠の混沌 */
- case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */
- case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */
- case BD_ROKISWEIL: /* ロキの叫び */
- case BD_INTOABYSS: /* 深淵の中に */
- case BD_SIEGFRIED: /* 不死身のジークフリード */
- case BD_RAGNAROK: /* 神々の黄昏 */
- case CG_MOONLIT: /* 月明りの泉に落ちる花びら */
- return 2;
- case BA_DISSONANCE: /* 不協和音 */
- case BA_FROSTJOKE: /* 寒いジョーク */
- case BA_WHISTLE: /* 口笛 */
- case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */
- case BA_POEMBRAGI: /* ブラギの詩 */
- case BA_APPLEIDUN: /* イドゥンの林檎 */
- case DC_UGLYDANCE: /* 自分勝手なダンス */
- case DC_SCREAM: /* スクリーム */
- case DC_HUMMING: /* ハミング */
- case DC_DONTFORGETME: /* 私を忘れないで… */
- case DC_FORTUNEKISS: /* 幸運のキス */
- case DC_SERVICEFORYOU: /* サービスフォーユー */
- return 1;
- default:
- return 0;
- }
-}
-
-/*==========================================
* 演奏/ダンスをやめる
* flag 1で合奏中なら相方にユニットを任せる
*
@@ -10909,41 +5581,6 @@ struct skill_unit_group *skill_initunitgroup(struct block_list *src,
group->tick = gettick();
group->valstr = NULL;
- if (skill_is_danceskill(skillid))
- {
- struct map_session_data *sd = NULL;
- if (src->type == BL_PC && (sd = (struct map_session_data *) src))
- {
- sd->skillid_dance = skillid;
- sd->skilllv_dance = skilllv;
- }
- skill_status_change_start(src, SC_DANCING,
- uint16_t(skillid), (int) group, 0, 0,
- skill_get_time(skillid, skilllv) + 1000, 0);
- switch (skillid)
- { //合奏スキルは相方をダンス状態にする
- case BD_LULLABY: /* 子守歌 */
- case BD_RICHMANKIM: /* ニヨルドの宴 */
- case BD_ETERNALCHAOS: /* 永遠の混沌 */
- case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */
- case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */
- case BD_ROKISWEIL: /* ロキの叫び */
- case BD_INTOABYSS: /* 深淵の中に */
- case BD_SIEGFRIED: /* 不死身のジークフリード */
- case BD_RAGNAROK: /* 神々の黄昏 */
- case CG_MOONLIT: /* 月明りの泉に落ちる花びら */
- {
- int range = 1;
- int c = 0;
- if (sd)
- {
- map_foreachinarea(std::bind(skill_check_condition_use_sub, ph::_1, &sd->bl, &c),
- sd->bl.m, sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC);
- }
- }
- }
- }
return group;
}
@@ -10953,20 +5590,12 @@ struct skill_unit_group *skill_initunitgroup(struct block_list *src,
*/
int skill_delunitgroup(struct skill_unit_group *group)
{
- struct block_list *src;
int i;
nullpo_ret(group);
if (group->unit_count <= 0)
return 0;
- src = map_id2bl(group->src_id);
- if (skill_is_danceskill(group->skill_id))
- { //ダンススキルはダンス状態を解除する
- if (src)
- skill_status_change_end(src, SC_DANCING, -1);
- }
-
group->alive_count = 0;
if (group->unit != NULL)
{
diff --git a/src/map/skill.hpp b/src/map/skill.hpp
index 12021ff..e5bae65 100644
--- a/src/map/skill.hpp
+++ b/src/map/skill.hpp
@@ -140,9 +140,6 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl,
int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
SkillID skillid, int skilllv, unsigned int tick,
BCT flag);
-int skill_castend_pos2(struct block_list *src, int x, int y,
- SkillID skillid, int skilllv, unsigned int tick,
- BCT flag);
int skill_update_heal_animation(struct map_session_data *sd); // [Fate] Check whether the healing flag must be updated, do so if needed
diff --git a/src/map/skill.t.hpp b/src/map/skill.t.hpp
index 199114f..0b8b8e1 100644
--- a/src/map/skill.t.hpp
+++ b/src/map/skill.t.hpp
@@ -135,8 +135,7 @@ enum class StatusChange : uint16_t
#define SC_PROVIDENCE StatusChange::SC_PROVIDENCE
SC_DEFENDER = 62,
#define SC_DEFENDER StatusChange::SC_DEFENDER
- SC_AUTOSPELL = 65,
-#define SC_AUTOSPELL StatusChange::SC_AUTOSPELL
+
SC_SPEARSQUICKEN = 68,
#define SC_SPEARSQUICKEN StatusChange::SC_SPEARSQUICKEN
@@ -151,8 +150,6 @@ enum class StatusChange : uint16_t
SC_STEELBODY = 87,
#define SC_STEELBODY StatusChange::SC_STEELBODY
- SC_COMBO = 89,
-#define SC_COMBO StatusChange::SC_COMBO
SC_FLAMELAUNCHER = 90,
#define SC_FLAMELAUNCHER StatusChange::SC_FLAMELAUNCHER
SC_FROSTWEAPON = 91,
@@ -225,8 +222,7 @@ enum class StatusChange : uint16_t
#define SC_SAFETYWALL StatusChange::SC_SAFETYWALL
SC_PNEUMA = 141,
#define SC_PNEUMA StatusChange::SC_PNEUMA
- SC_WATERBALL = 142,
-#define SC_WATERBALL StatusChange::SC_WATERBALL
+
SC_ANKLE = 143,
#define SC_ANKLE StatusChange::SC_ANKLE
SC_DANCING = 144,
@@ -240,24 +236,17 @@ enum class StatusChange : uint16_t
#define SC_MAGICROD StatusChange::SC_MAGICROD
SC_SIGHT = 150,
#define SC_SIGHT StatusChange::SC_SIGHT
- SC_RUWACH = 151,
-#define SC_RUWACH StatusChange::SC_RUWACH
- SC_AUTOCOUNTER = 152,
-#define SC_AUTOCOUNTER StatusChange::SC_AUTOCOUNTER
+
SC_VOLCANO = 153,
#define SC_VOLCANO StatusChange::SC_VOLCANO
SC_DELUGE = 154,
#define SC_DELUGE StatusChange::SC_DELUGE
SC_VIOLENTGALE = 155,
#define SC_VIOLENTGALE StatusChange::SC_VIOLENTGALE
- SC_BLADESTOP_WAIT = 156,
-#define SC_BLADESTOP_WAIT StatusChange::SC_BLADESTOP_WAIT
- SC_BLADESTOP = 157,
-#define SC_BLADESTOP StatusChange::SC_BLADESTOP
+
SC_EXTREMITYFIST = 158,
#define SC_EXTREMITYFIST StatusChange::SC_EXTREMITYFIST
- SC_GRAFFITI = 159,
-#define SC_GRAFFITI StatusChange::SC_GRAFFITI
+
SC_ENSEMBLE = 159,
#define SC_ENSEMBLE StatusChange::SC_ENSEMBLE
@@ -319,7 +308,7 @@ enum class StatusChange : uint16_t
#define SC_WEDDING StatusChange::SC_WEDDING
SC_NOCHAT = 188,
#define SC_NOCHAT StatusChange::SC_NOCHAT
- SC_SPLASHER = 189,
+ SC_SPLASHER = 189, // ?
#define SC_SPLASHER StatusChange::SC_SPLASHER
SC_SELFDESTRUCTION = 190,
#define SC_SELFDESTRUCTION StatusChange::SC_SELFDESTRUCTION
@@ -416,331 +405,18 @@ enum class SkillID : uint16_t
NV_PARTY = 3, //
#define NV_PARTY SkillID::NV_PARTY
- SM_SWORD = 4, //
-#define SM_SWORD SkillID::SM_SWORD
- SM_TWOHAND = 5,
-#define SM_TWOHAND SkillID::SM_TWOHAND
- SM_RECOVERY = 6, //
-#define SM_RECOVERY SkillID::SM_RECOVERY
- SM_BASH = 7,
-#define SM_BASH SkillID::SM_BASH
- SM_PROVOKE = 8,
-#define SM_PROVOKE SkillID::SM_PROVOKE
- SM_MAGNUM = 9,
-#define SM_MAGNUM SkillID::SM_MAGNUM
- SM_ENDURE = 10,
-#define SM_ENDURE SkillID::SM_ENDURE
-
- MG_SRECOVERY = 11, //
-#define MG_SRECOVERY SkillID::MG_SRECOVERY
- MG_SIGHT = 12,
-#define MG_SIGHT SkillID::MG_SIGHT
- MG_NAPALMBEAT = 13,
-#define MG_NAPALMBEAT SkillID::MG_NAPALMBEAT
- MG_SAFETYWALL = 14,
-#define MG_SAFETYWALL SkillID::MG_SAFETYWALL
- MG_SOULSTRIKE = 15,
-#define MG_SOULSTRIKE SkillID::MG_SOULSTRIKE
- MG_COLDBOLT = 16,
-#define MG_COLDBOLT SkillID::MG_COLDBOLT
- MG_FROSTDIVER = 17,
-#define MG_FROSTDIVER SkillID::MG_FROSTDIVER
- MG_STONECURSE = 18,
-#define MG_STONECURSE SkillID::MG_STONECURSE
- MG_FIREBALL = 19,
-#define MG_FIREBALL SkillID::MG_FIREBALL
- MG_FIREWALL = 20,
-#define MG_FIREWALL SkillID::MG_FIREWALL
- MG_FIREBOLT = 21,
-#define MG_FIREBOLT SkillID::MG_FIREBOLT
- MG_LIGHTNINGBOLT = 22,
-#define MG_LIGHTNINGBOLT SkillID::MG_LIGHTNINGBOLT
- MG_THUNDERSTORM = 23,
-#define MG_THUNDERSTORM SkillID::MG_THUNDERSTORM
-
- AL_DP = 24,
-#define AL_DP SkillID::AL_DP
- AL_DEMONBANE = 25,
-#define AL_DEMONBANE SkillID::AL_DEMONBANE
- AL_RUWACH = 26,
-#define AL_RUWACH SkillID::AL_RUWACH
- AL_PNEUMA = 27,
-#define AL_PNEUMA SkillID::AL_PNEUMA
AL_TELEPORT = 28, //
#define AL_TELEPORT SkillID::AL_TELEPORT
- AL_WARP = 29,
-#define AL_WARP SkillID::AL_WARP
AL_HEAL = 30, //
#define AL_HEAL SkillID::AL_HEAL
- AL_INCAGI = 31,
-#define AL_INCAGI SkillID::AL_INCAGI
- AL_DECAGI = 32,
-#define AL_DECAGI SkillID::AL_DECAGI
- AL_HOLYWATER = 33,
-#define AL_HOLYWATER SkillID::AL_HOLYWATER
- AL_CRUCIS = 34,
-#define AL_CRUCIS SkillID::AL_CRUCIS
- AL_ANGELUS = 35,
-#define AL_ANGELUS SkillID::AL_ANGELUS
- AL_BLESSING = 36,
-#define AL_BLESSING SkillID::AL_BLESSING
- AL_CURE = 37,
-#define AL_CURE SkillID::AL_CURE
- MC_INCCARRY = 38, //
-#define MC_INCCARRY SkillID::MC_INCCARRY
- MC_DISCOUNT = 39, //
-#define MC_DISCOUNT SkillID::MC_DISCOUNT
- MC_OVERCHARGE = 40, //
-#define MC_OVERCHARGE SkillID::MC_OVERCHARGE
- MC_PUSHCART = 41,
-#define MC_PUSHCART SkillID::MC_PUSHCART
- MC_IDENTIFY = 42,
-#define MC_IDENTIFY SkillID::MC_IDENTIFY
- MC_VENDING = 43,
-#define MC_VENDING SkillID::MC_VENDING
- MC_MAMMONITE = 44,
-#define MC_MAMMONITE SkillID::MC_MAMMONITE
-
- AC_OWL = 45, //
+ AC_OWL = 45, // Mallard's Eye
#define AC_OWL SkillID::AC_OWL
- AC_VULTURE = 46,
-#define AC_VULTURE SkillID::AC_VULTURE
- AC_CONCENTRATION = 47,
-#define AC_CONCENTRATION SkillID::AC_CONCENTRATION
- AC_DOUBLE = 48,
-#define AC_DOUBLE SkillID::AC_DOUBLE
- AC_SHOWER = 49,
-#define AC_SHOWER SkillID::AC_SHOWER
-
- TF_DOUBLE = 50, //
-#define TF_DOUBLE SkillID::TF_DOUBLE
- TF_MISS = 51, //
-#define TF_MISS SkillID::TF_MISS
- TF_STEAL = 52,
-#define TF_STEAL SkillID::TF_STEAL
- TF_HIDING = 53,
-#define TF_HIDING SkillID::TF_HIDING
- TF_POISON = 54, //
-#define TF_POISON SkillID::TF_POISON
- TF_DETOXIFY = 55,
-#define TF_DETOXIFY SkillID::TF_DETOXIFY
-
- ALL_RESURRECTION = 56,
-#define ALL_RESURRECTION SkillID::ALL_RESURRECTION
-
- KN_SPEARMASTERY = 57,
-#define KN_SPEARMASTERY SkillID::KN_SPEARMASTERY
- KN_PIERCE = 58,
-#define KN_PIERCE SkillID::KN_PIERCE
- KN_BRANDISHSPEAR = 59,
-#define KN_BRANDISHSPEAR SkillID::KN_BRANDISHSPEAR
- KN_SPEARSTAB = 60,
-#define KN_SPEARSTAB SkillID::KN_SPEARSTAB
- KN_SPEARBOOMERANG = 61,
-#define KN_SPEARBOOMERANG SkillID::KN_SPEARBOOMERANG
- KN_TWOHANDQUICKEN = 62,
-#define KN_TWOHANDQUICKEN SkillID::KN_TWOHANDQUICKEN
- KN_AUTOCOUNTER = 63,
-#define KN_AUTOCOUNTER SkillID::KN_AUTOCOUNTER
- KN_BOWLINGBASH = 64,
-#define KN_BOWLINGBASH SkillID::KN_BOWLINGBASH
- KN_RIDING = 65,
-#define KN_RIDING SkillID::KN_RIDING
- KN_CAVALIERMASTERY = 66,
-#define KN_CAVALIERMASTERY SkillID::KN_CAVALIERMASTERY
-
- PR_MACEMASTERY = 67,
-#define PR_MACEMASTERY SkillID::PR_MACEMASTERY
- PR_IMPOSITIO = 68,
-#define PR_IMPOSITIO SkillID::PR_IMPOSITIO
- PR_SUFFRAGIUM = 69,
-#define PR_SUFFRAGIUM SkillID::PR_SUFFRAGIUM
- PR_ASPERSIO = 70,
-#define PR_ASPERSIO SkillID::PR_ASPERSIO
- PR_BENEDICTIO = 71,
-#define PR_BENEDICTIO SkillID::PR_BENEDICTIO
- PR_SANCTUARY = 72,
-#define PR_SANCTUARY SkillID::PR_SANCTUARY
- PR_SLOWPOISON = 73,
-#define PR_SLOWPOISON SkillID::PR_SLOWPOISON
- PR_STRECOVERY = 74,
-#define PR_STRECOVERY SkillID::PR_STRECOVERY
- PR_KYRIE = 75,
-#define PR_KYRIE SkillID::PR_KYRIE
- PR_MAGNIFICAT = 76,
-#define PR_MAGNIFICAT SkillID::PR_MAGNIFICAT
- PR_GLORIA = 77,
-#define PR_GLORIA SkillID::PR_GLORIA
- PR_LEXDIVINA = 78,
-#define PR_LEXDIVINA SkillID::PR_LEXDIVINA
- PR_TURNUNDEAD = 79,
-#define PR_TURNUNDEAD SkillID::PR_TURNUNDEAD
- PR_LEXAETERNA = 80,
-#define PR_LEXAETERNA SkillID::PR_LEXAETERNA
- PR_MAGNUS = 81,
-#define PR_MAGNUS SkillID::PR_MAGNUS
-
- WZ_FIREPILLAR = 82,
-#define WZ_FIREPILLAR SkillID::WZ_FIREPILLAR
- WZ_SIGHTRASHER = 83,
-#define WZ_SIGHTRASHER SkillID::WZ_SIGHTRASHER
- WZ_FIREIVY = 84,
-#define WZ_FIREIVY SkillID::WZ_FIREIVY
- WZ_METEOR = 85,
-#define WZ_METEOR SkillID::WZ_METEOR
- WZ_JUPITEL = 86,
-#define WZ_JUPITEL SkillID::WZ_JUPITEL
- WZ_VERMILION = 87,
-#define WZ_VERMILION SkillID::WZ_VERMILION
- WZ_WATERBALL = 88,
-#define WZ_WATERBALL SkillID::WZ_WATERBALL
- WZ_ICEWALL = 89,
-#define WZ_ICEWALL SkillID::WZ_ICEWALL
- WZ_FROSTNOVA = 90,
-#define WZ_FROSTNOVA SkillID::WZ_FROSTNOVA
- WZ_STORMGUST = 91,
-#define WZ_STORMGUST SkillID::WZ_STORMGUST
- WZ_EARTHSPIKE = 92,
-#define WZ_EARTHSPIKE SkillID::WZ_EARTHSPIKE
- WZ_HEAVENDRIVE = 93,
-#define WZ_HEAVENDRIVE SkillID::WZ_HEAVENDRIVE
- WZ_QUAGMIRE = 94,
-#define WZ_QUAGMIRE SkillID::WZ_QUAGMIRE
- WZ_ESTIMATION = 95,
-#define WZ_ESTIMATION SkillID::WZ_ESTIMATION
-
- BS_IRON = 96,
-#define BS_IRON SkillID::BS_IRON
- BS_STEEL = 97,
-#define BS_STEEL SkillID::BS_STEEL
- BS_ENCHANTEDSTONE = 98,
-#define BS_ENCHANTEDSTONE SkillID::BS_ENCHANTEDSTONE
- BS_ORIDEOCON = 99,
-#define BS_ORIDEOCON SkillID::BS_ORIDEOCON
- BS_DAGGER = 100,
-#define BS_DAGGER SkillID::BS_DAGGER
- BS_SWORD = 101,
-#define BS_SWORD SkillID::BS_SWORD
- BS_TWOHANDSWORD = 102,
-#define BS_TWOHANDSWORD SkillID::BS_TWOHANDSWORD
- BS_AXE = 103,
-#define BS_AXE SkillID::BS_AXE
- BS_MACE = 104,
-#define BS_MACE SkillID::BS_MACE
- BS_KNUCKLE = 105,
-#define BS_KNUCKLE SkillID::BS_KNUCKLE
- BS_SPEAR = 106,
-#define BS_SPEAR SkillID::BS_SPEAR
- BS_HILTBINDING = 107,
-#define BS_HILTBINDING SkillID::BS_HILTBINDING
- BS_FINDINGORE = 108,
-#define BS_FINDINGORE SkillID::BS_FINDINGORE
- BS_WEAPONRESEARCH = 109,
-#define BS_WEAPONRESEARCH SkillID::BS_WEAPONRESEARCH
- BS_REPAIRWEAPON = 110,
-#define BS_REPAIRWEAPON SkillID::BS_REPAIRWEAPON
- BS_SKINTEMPER = 111,
-#define BS_SKINTEMPER SkillID::BS_SKINTEMPER
- BS_HAMMERFALL = 112,
-#define BS_HAMMERFALL SkillID::BS_HAMMERFALL
- BS_ADRENALINE = 113,
-#define BS_ADRENALINE SkillID::BS_ADRENALINE
- BS_WEAPONPERFECT = 114,
-#define BS_WEAPONPERFECT SkillID::BS_WEAPONPERFECT
- BS_OVERTHRUST = 115,
-#define BS_OVERTHRUST SkillID::BS_OVERTHRUST
- BS_MAXIMIZE = 116,
-#define BS_MAXIMIZE SkillID::BS_MAXIMIZE
-
- HT_SKIDTRAP = 117,
-#define HT_SKIDTRAP SkillID::HT_SKIDTRAP
- HT_LANDMINE = 118,
-#define HT_LANDMINE SkillID::HT_LANDMINE
- HT_ANKLESNARE = 119,
-#define HT_ANKLESNARE SkillID::HT_ANKLESNARE
- HT_SHOCKWAVE = 120,
-#define HT_SHOCKWAVE SkillID::HT_SHOCKWAVE
- HT_SANDMAN = 121,
-#define HT_SANDMAN SkillID::HT_SANDMAN
- HT_FLASHER = 122,
-#define HT_FLASHER SkillID::HT_FLASHER
- HT_FREEZINGTRAP = 123,
-#define HT_FREEZINGTRAP SkillID::HT_FREEZINGTRAP
- HT_BLASTMINE = 124,
-#define HT_BLASTMINE SkillID::HT_BLASTMINE
- HT_CLAYMORETRAP = 125,
-#define HT_CLAYMORETRAP SkillID::HT_CLAYMORETRAP
- HT_REMOVETRAP = 126,
-#define HT_REMOVETRAP SkillID::HT_REMOVETRAP
- HT_TALKIEBOX = 127,
-#define HT_TALKIEBOX SkillID::HT_TALKIEBOX
- HT_BEASTBANE = 128,
-#define HT_BEASTBANE SkillID::HT_BEASTBANE
- HT_FALCON = 129,
-#define HT_FALCON SkillID::HT_FALCON
- HT_STEELCROW = 130,
-#define HT_STEELCROW SkillID::HT_STEELCROW
- HT_BLITZBEAT = 131,
-#define HT_BLITZBEAT SkillID::HT_BLITZBEAT
- HT_DETECTING = 132,
-#define HT_DETECTING SkillID::HT_DETECTING
- HT_SPRINGTRAP = 133,
-#define HT_SPRINGTRAP SkillID::HT_SPRINGTRAP
-
- AS_RIGHT = 134,
-#define AS_RIGHT SkillID::AS_RIGHT
- AS_LEFT = 135,
-#define AS_LEFT SkillID::AS_LEFT
- AS_KATAR = 136,
-#define AS_KATAR SkillID::AS_KATAR
- AS_CLOAKING = 137,
-#define AS_CLOAKING SkillID::AS_CLOAKING
- AS_SONICBLOW = 138,
-#define AS_SONICBLOW SkillID::AS_SONICBLOW
- AS_GRIMTOOTH = 139,
-#define AS_GRIMTOOTH SkillID::AS_GRIMTOOTH
- AS_ENCHANTPOISON = 140,
-#define AS_ENCHANTPOISON SkillID::AS_ENCHANTPOISON
- AS_POISONREACT = 141,
-#define AS_POISONREACT SkillID::AS_POISONREACT
- AS_VENOMDUST = 142,
-#define AS_VENOMDUST SkillID::AS_VENOMDUST
- AS_SPLASHER = 143,
-#define AS_SPLASHER SkillID::AS_SPLASHER
NV_FIRSTAID = 144, //
#define NV_FIRSTAID SkillID::NV_FIRSTAID
NV_TRICKDEAD = 145,
#define NV_TRICKDEAD SkillID::NV_TRICKDEAD
- SM_MOVINGRECOVERY = 146, //
-#define SM_MOVINGRECOVERY SkillID::SM_MOVINGRECOVERY
- SM_FATALBLOW = 147,
-#define SM_FATALBLOW SkillID::SM_FATALBLOW
- SM_AUTOBERSERK = 148, //
-#define SM_AUTOBERSERK SkillID::SM_AUTOBERSERK
- AC_MAKINGARROW = 149,
-#define AC_MAKINGARROW SkillID::AC_MAKINGARROW
- AC_CHARGEARROW = 150,
-#define AC_CHARGEARROW SkillID::AC_CHARGEARROW
- TF_SPRINKLESAND = 151,
-#define TF_SPRINKLESAND SkillID::TF_SPRINKLESAND
- TF_BACKSLIDING = 152, //
-#define TF_BACKSLIDING SkillID::TF_BACKSLIDING
- TF_PICKSTONE = 153,
-#define TF_PICKSTONE SkillID::TF_PICKSTONE
- TF_THROWSTONE = 154,
-#define TF_THROWSTONE SkillID::TF_THROWSTONE
- MC_CARTREVOLUTION = 155,
-#define MC_CARTREVOLUTION SkillID::MC_CARTREVOLUTION
- MC_CHANGECART = 156,
-#define MC_CHANGECART SkillID::MC_CHANGECART
- MC_LOUD = 157,
-#define MC_LOUD SkillID::MC_LOUD
- AL_HOLYLIGHT = 158,
-#define AL_HOLYLIGHT SkillID::AL_HOLYLIGHT
- MG_ENERGYCOAT = 159,
-#define MG_ENERGYCOAT SkillID::MG_ENERGYCOAT
NPC_PIERCINGATT = 160,
#define NPC_PIERCINGATT SkillID::NPC_PIERCINGATT
@@ -800,7 +476,7 @@ enum class SkillID : uint16_t
#define NPC_GROUNDATTACK SkillID::NPC_GROUNDATTACK
NPC_FIREATTACK = 188,
#define NPC_FIREATTACK SkillID::NPC_FIREATTACK
- NPC_WINDATTACK = 189,
+ NPC_WINDATTACK = 189, // ?
#define NPC_WINDATTACK SkillID::NPC_WINDATTACK
NPC_POISONATTACK = 190, //
@@ -848,266 +524,9 @@ enum class SkillID : uint16_t
NPC_SUMMONMONSTER = 211,
#define NPC_SUMMONMONSTER SkillID::NPC_SUMMONMONSTER
- RG_SNATCHER = 212,
-#define RG_SNATCHER SkillID::RG_SNATCHER
- RG_STEALCOIN = 213,
-#define RG_STEALCOIN SkillID::RG_STEALCOIN
- RG_BACKSTAP = 214,
-#define RG_BACKSTAP SkillID::RG_BACKSTAP
- RG_TUNNELDRIVE = 215,
-#define RG_TUNNELDRIVE SkillID::RG_TUNNELDRIVE
- RG_RAID = 216,
-#define RG_RAID SkillID::RG_RAID
- RG_STRIPWEAPON = 217,
-#define RG_STRIPWEAPON SkillID::RG_STRIPWEAPON
- RG_STRIPSHIELD = 218,
-#define RG_STRIPSHIELD SkillID::RG_STRIPSHIELD
- RG_STRIPARMOR = 219,
-#define RG_STRIPARMOR SkillID::RG_STRIPARMOR
- RG_STRIPHELM = 220,
-#define RG_STRIPHELM SkillID::RG_STRIPHELM
- RG_INTIMIDATE = 221,
-#define RG_INTIMIDATE SkillID::RG_INTIMIDATE
- RG_GRAFFITI = 222,
-#define RG_GRAFFITI SkillID::RG_GRAFFITI
- RG_FLAGGRAFFITI = 223,
-#define RG_FLAGGRAFFITI SkillID::RG_FLAGGRAFFITI
- RG_CLEANER = 224,
-#define RG_CLEANER SkillID::RG_CLEANER
- RG_GANGSTER = 225,
-#define RG_GANGSTER SkillID::RG_GANGSTER
- RG_COMPULSION = 226,
-#define RG_COMPULSION SkillID::RG_COMPULSION
- RG_PLAGIARISM = 227,
-#define RG_PLAGIARISM SkillID::RG_PLAGIARISM
-
- AM_AXEMASTERY = 228,
-#define AM_AXEMASTERY SkillID::AM_AXEMASTERY
- AM_LEARNINGPOTION = 229,
-#define AM_LEARNINGPOTION SkillID::AM_LEARNINGPOTION
- AM_PHARMACY = 230,
-#define AM_PHARMACY SkillID::AM_PHARMACY
- AM_DEMONSTRATION = 231,
-#define AM_DEMONSTRATION SkillID::AM_DEMONSTRATION
- AM_ACIDTERROR = 232,
-#define AM_ACIDTERROR SkillID::AM_ACIDTERROR
- AM_POTIONPITCHER = 233,
-#define AM_POTIONPITCHER SkillID::AM_POTIONPITCHER
- AM_CANNIBALIZE = 234,
-#define AM_CANNIBALIZE SkillID::AM_CANNIBALIZE
- AM_SPHEREMINE = 235,
-#define AM_SPHEREMINE SkillID::AM_SPHEREMINE
- AM_CP_WEAPON = 236,
-#define AM_CP_WEAPON SkillID::AM_CP_WEAPON
- AM_CP_SHIELD = 237,
-#define AM_CP_SHIELD SkillID::AM_CP_SHIELD
- AM_CP_ARMOR = 238,
-#define AM_CP_ARMOR SkillID::AM_CP_ARMOR
- AM_CP_HELM = 239,
-#define AM_CP_HELM SkillID::AM_CP_HELM
- AM_BIOETHICS = 240,
-#define AM_BIOETHICS SkillID::AM_BIOETHICS
- AM_BIOTECHNOLOGY = 241,
-#define AM_BIOTECHNOLOGY SkillID::AM_BIOTECHNOLOGY
- AM_CREATECREATURE = 242,
-#define AM_CREATECREATURE SkillID::AM_CREATECREATURE
- AM_CULTIVATION = 243,
-#define AM_CULTIVATION SkillID::AM_CULTIVATION
- AM_FLAMECONTROL = 244,
-#define AM_FLAMECONTROL SkillID::AM_FLAMECONTROL
- AM_CALLHOMUN = 245,
-#define AM_CALLHOMUN SkillID::AM_CALLHOMUN
- AM_REST = 246,
-#define AM_REST SkillID::AM_REST
- AM_DRILLMASTER = 247,
-#define AM_DRILLMASTER SkillID::AM_DRILLMASTER
- AM_HEALHOMUN = 248,
-#define AM_HEALHOMUN SkillID::AM_HEALHOMUN
- AM_RESURRECTHOMUN = 249,
-#define AM_RESURRECTHOMUN SkillID::AM_RESURRECTHOMUN
-
- CR_TRUST = 250,
-#define CR_TRUST SkillID::CR_TRUST
- CR_AUTOGUARD = 251,
-#define CR_AUTOGUARD SkillID::CR_AUTOGUARD
- CR_SHIELDCHARGE = 252,
-#define CR_SHIELDCHARGE SkillID::CR_SHIELDCHARGE
- CR_SHIELDBOOMERANG = 253,
-#define CR_SHIELDBOOMERANG SkillID::CR_SHIELDBOOMERANG
- CR_REFLECTSHIELD = 254,
-#define CR_REFLECTSHIELD SkillID::CR_REFLECTSHIELD
- CR_HOLYCROSS = 255,
-#define CR_HOLYCROSS SkillID::CR_HOLYCROSS
- CR_GRANDCROSS = 256,
-#define CR_GRANDCROSS SkillID::CR_GRANDCROSS
- CR_DEVOTION = 257,
-#define CR_DEVOTION SkillID::CR_DEVOTION
- CR_PROVIDENCE = 258,
-#define CR_PROVIDENCE SkillID::CR_PROVIDENCE
- CR_DEFENDER = 259,
-#define CR_DEFENDER SkillID::CR_DEFENDER
- CR_SPEARQUICKEN = 260,
-#define CR_SPEARQUICKEN SkillID::CR_SPEARQUICKEN
-
- MO_IRONHAND = 261,
-#define MO_IRONHAND SkillID::MO_IRONHAND
- MO_SPIRITSRECOVERY = 262,
-#define MO_SPIRITSRECOVERY SkillID::MO_SPIRITSRECOVERY
- MO_CALLSPIRITS = 263,
-#define MO_CALLSPIRITS SkillID::MO_CALLSPIRITS
- MO_ABSORBSPIRITS = 264,
-#define MO_ABSORBSPIRITS SkillID::MO_ABSORBSPIRITS
- MO_TRIPLEATTACK = 265,
-#define MO_TRIPLEATTACK SkillID::MO_TRIPLEATTACK
- MO_BODYRELOCATION = 266,
-#define MO_BODYRELOCATION SkillID::MO_BODYRELOCATION
- MO_DODGE = 267,
-#define MO_DODGE SkillID::MO_DODGE
- MO_INVESTIGATE = 268,
-#define MO_INVESTIGATE SkillID::MO_INVESTIGATE
- MO_FINGEROFFENSIVE = 269,
-#define MO_FINGEROFFENSIVE SkillID::MO_FINGEROFFENSIVE
- MO_STEELBODY = 270,
-#define MO_STEELBODY SkillID::MO_STEELBODY
- MO_BLADESTOP = 271,
-#define MO_BLADESTOP SkillID::MO_BLADESTOP
- MO_EXPLOSIONSPIRITS = 272,
-#define MO_EXPLOSIONSPIRITS SkillID::MO_EXPLOSIONSPIRITS
- MO_EXTREMITYFIST = 273,
-#define MO_EXTREMITYFIST SkillID::MO_EXTREMITYFIST
- MO_CHAINCOMBO = 274,
-#define MO_CHAINCOMBO SkillID::MO_CHAINCOMBO
- MO_COMBOFINISH = 275,
-#define MO_COMBOFINISH SkillID::MO_COMBOFINISH
-
- SA_ADVANCEDBOOK = 276,
-#define SA_ADVANCEDBOOK SkillID::SA_ADVANCEDBOOK
- SA_CASTCANCEL = 277,
-#define SA_CASTCANCEL SkillID::SA_CASTCANCEL
- SA_MAGICROD = 278,
-#define SA_MAGICROD SkillID::SA_MAGICROD
- SA_SPELLBREAKER = 279,
-#define SA_SPELLBREAKER SkillID::SA_SPELLBREAKER
- SA_FREECAST = 280,
-#define SA_FREECAST SkillID::SA_FREECAST
- SA_AUTOSPELL = 281,
-#define SA_AUTOSPELL SkillID::SA_AUTOSPELL
- SA_FLAMELAUNCHER = 282,
-#define SA_FLAMELAUNCHER SkillID::SA_FLAMELAUNCHER
- SA_FROSTWEAPON = 283,
-#define SA_FROSTWEAPON SkillID::SA_FROSTWEAPON
- SA_LIGHTNINGLOADER = 284,
-#define SA_LIGHTNINGLOADER SkillID::SA_LIGHTNINGLOADER
- SA_SEISMICWEAPON = 285,
-#define SA_SEISMICWEAPON SkillID::SA_SEISMICWEAPON
- SA_DRAGONOLOGY = 286,
-#define SA_DRAGONOLOGY SkillID::SA_DRAGONOLOGY
- SA_VOLCANO = 287,
-#define SA_VOLCANO SkillID::SA_VOLCANO
- SA_DELUGE = 288,
-#define SA_DELUGE SkillID::SA_DELUGE
- SA_VIOLENTGALE = 289,
-#define SA_VIOLENTGALE SkillID::SA_VIOLENTGALE
- SA_LANDPROTECTOR = 290,
-#define SA_LANDPROTECTOR SkillID::SA_LANDPROTECTOR
- SA_DISPELL = 291,
-#define SA_DISPELL SkillID::SA_DISPELL
- SA_ABRACADABRA = 292,
-#define SA_ABRACADABRA SkillID::SA_ABRACADABRA
- SA_MONOCELL = 293,
-#define SA_MONOCELL SkillID::SA_MONOCELL
- SA_CLASSCHANGE = 294,
-#define SA_CLASSCHANGE SkillID::SA_CLASSCHANGE
- SA_SUMMONMONSTER = 295,
-#define SA_SUMMONMONSTER SkillID::SA_SUMMONMONSTER
- SA_REVERSEORCISH = 296,
-#define SA_REVERSEORCISH SkillID::SA_REVERSEORCISH
- SA_DEATH = 297,
-#define SA_DEATH SkillID::SA_DEATH
- SA_FORTUNE = 298,
-#define SA_FORTUNE SkillID::SA_FORTUNE
- SA_TAMINGMONSTER = 299,
-#define SA_TAMINGMONSTER SkillID::SA_TAMINGMONSTER
- SA_QUESTION = 300,
-#define SA_QUESTION SkillID::SA_QUESTION
- SA_GRAVITY = 301,
-#define SA_GRAVITY SkillID::SA_GRAVITY
- SA_LEVELUP = 302,
-#define SA_LEVELUP SkillID::SA_LEVELUP
- SA_INSTANTDEATH = 303,
-#define SA_INSTANTDEATH SkillID::SA_INSTANTDEATH
- SA_FULLRECOVERY = 304,
-#define SA_FULLRECOVERY SkillID::SA_FULLRECOVERY
- SA_COMA = 305,
-#define SA_COMA SkillID::SA_COMA
-
- BD_ADAPTATION = 306,
-#define BD_ADAPTATION SkillID::BD_ADAPTATION
- BD_ENCORE = 307,
-#define BD_ENCORE SkillID::BD_ENCORE
- BD_LULLABY = 308,
-#define BD_LULLABY SkillID::BD_LULLABY
- BD_RICHMANKIM = 309,
-#define BD_RICHMANKIM SkillID::BD_RICHMANKIM
- BD_ETERNALCHAOS = 310,
-#define BD_ETERNALCHAOS SkillID::BD_ETERNALCHAOS
- BD_DRUMBATTLEFIELD = 311,
-#define BD_DRUMBATTLEFIELD SkillID::BD_DRUMBATTLEFIELD
- BD_RINGNIBELUNGEN = 312,
-#define BD_RINGNIBELUNGEN SkillID::BD_RINGNIBELUNGEN
- BD_ROKISWEIL = 313,
-#define BD_ROKISWEIL SkillID::BD_ROKISWEIL
- BD_INTOABYSS = 314,
-#define BD_INTOABYSS SkillID::BD_INTOABYSS
- BD_SIEGFRIED = 315,
-#define BD_SIEGFRIED SkillID::BD_SIEGFRIED
- BD_RAGNAROK = 316,
-#define BD_RAGNAROK SkillID::BD_RAGNAROK
-
- BA_MUSICALLESSON = 317,
-#define BA_MUSICALLESSON SkillID::BA_MUSICALLESSON
- BA_MUSICALSTRIKE = 318,
-#define BA_MUSICALSTRIKE SkillID::BA_MUSICALSTRIKE
- BA_DISSONANCE = 319,
-#define BA_DISSONANCE SkillID::BA_DISSONANCE
- BA_FROSTJOKE = 320,
-#define BA_FROSTJOKE SkillID::BA_FROSTJOKE
- BA_WHISTLE = 321,
-#define BA_WHISTLE SkillID::BA_WHISTLE
- BA_ASSASSINCROSS = 322,
-#define BA_ASSASSINCROSS SkillID::BA_ASSASSINCROSS
- BA_POEMBRAGI = 323,
-#define BA_POEMBRAGI SkillID::BA_POEMBRAGI
- BA_APPLEIDUN = 324,
-#define BA_APPLEIDUN SkillID::BA_APPLEIDUN
-
- DC_DANCINGLESSON = 325,
-#define DC_DANCINGLESSON SkillID::DC_DANCINGLESSON
- DC_THROWARROW = 326,
-#define DC_THROWARROW SkillID::DC_THROWARROW
- DC_UGLYDANCE = 327,
-#define DC_UGLYDANCE SkillID::DC_UGLYDANCE
- DC_SCREAM = 328,
-#define DC_SCREAM SkillID::DC_SCREAM
- DC_HUMMING = 329,
-#define DC_HUMMING SkillID::DC_HUMMING
- DC_DONTFORGETME = 330,
-#define DC_DONTFORGETME SkillID::DC_DONTFORGETME
- DC_FORTUNEKISS = 331,
-#define DC_FORTUNEKISS SkillID::DC_FORTUNEKISS
- DC_SERVICEFORYOU = 332,
-#define DC_SERVICEFORYOU SkillID::DC_SERVICEFORYOU
-
NPC_SELFDESTRUCTION2 = 333,
#define NPC_SELFDESTRUCTION2 SkillID::NPC_SELFDESTRUCTION2
- WE_MALE = 334,
-#define WE_MALE SkillID::WE_MALE
- WE_FEMALE = 335,
-#define WE_FEMALE SkillID::WE_FEMALE
- WE_CALLPARTNER = 336,
-#define WE_CALLPARTNER SkillID::WE_CALLPARTNER
-
NPC_DARKCROSS = 338,
#define NPC_DARKCROSS SkillID::NPC_DARKCROSS
@@ -1146,243 +565,6 @@ enum class SkillID : uint16_t
TMW_RAGING = 355, //
#define TMW_RAGING SkillID::TMW_RAGING
- LK_AURABLADE = 356,
-#define LK_AURABLADE SkillID::LK_AURABLADE
- LK_PARRYING = 357,
-#define LK_PARRYING SkillID::LK_PARRYING
- LK_CONCENTRATION = 358,
-#define LK_CONCENTRATION SkillID::LK_CONCENTRATION
- LK_TENSIONRELAX = 359,
-#define LK_TENSIONRELAX SkillID::LK_TENSIONRELAX
- LK_BERSERK = 360,
-#define LK_BERSERK SkillID::LK_BERSERK
- LK_FURY = 361,
-#define LK_FURY SkillID::LK_FURY
- HP_ASSUMPTIO = 362,
-#define HP_ASSUMPTIO SkillID::HP_ASSUMPTIO
- HP_BASILICA = 363,
-#define HP_BASILICA SkillID::HP_BASILICA
- HP_MEDITATIO = 364,
-#define HP_MEDITATIO SkillID::HP_MEDITATIO
- HW_SOULDRAIN = 365,
-#define HW_SOULDRAIN SkillID::HW_SOULDRAIN
- HW_MAGICCRASHER = 366,
-#define HW_MAGICCRASHER SkillID::HW_MAGICCRASHER
- HW_MAGICPOWER = 367,
-#define HW_MAGICPOWER SkillID::HW_MAGICPOWER
- PA_PRESSURE = 368,
-#define PA_PRESSURE SkillID::PA_PRESSURE
- PA_SACRIFICE = 369,
-#define PA_SACRIFICE SkillID::PA_SACRIFICE
- PA_GOSPEL = 370,
-#define PA_GOSPEL SkillID::PA_GOSPEL
- CH_PALMSTRIKE = 371,
-#define CH_PALMSTRIKE SkillID::CH_PALMSTRIKE
- CH_TIGERFIST = 372,
-#define CH_TIGERFIST SkillID::CH_TIGERFIST
- CH_CHAINCRUSH = 373,
-#define CH_CHAINCRUSH SkillID::CH_CHAINCRUSH
- PF_HPCONVERSION = 374,
-#define PF_HPCONVERSION SkillID::PF_HPCONVERSION
- PF_SOULCHANGE = 375,
-#define PF_SOULCHANGE SkillID::PF_SOULCHANGE
- PF_SOULBURN = 376,
-#define PF_SOULBURN SkillID::PF_SOULBURN
- ASC_KATAR = 377,
-#define ASC_KATAR SkillID::ASC_KATAR
- ASC_HALLUCINATION = 378,
-#define ASC_HALLUCINATION SkillID::ASC_HALLUCINATION
- ASC_EDP = 379,
-#define ASC_EDP SkillID::ASC_EDP
- ASC_BREAKER = 380,
-#define ASC_BREAKER SkillID::ASC_BREAKER
- SN_SIGHT = 381,
-#define SN_SIGHT SkillID::SN_SIGHT
- SN_FALCONASSAULT = 382,
-#define SN_FALCONASSAULT SkillID::SN_FALCONASSAULT
- SN_SHARPSHOOTING = 383,
-#define SN_SHARPSHOOTING SkillID::SN_SHARPSHOOTING
- SN_WINDWALK = 384,
-#define SN_WINDWALK SkillID::SN_WINDWALK
- WS_MELTDOWN = 385,
-#define WS_MELTDOWN SkillID::WS_MELTDOWN
- WS_CREATECOIN = 386,
-#define WS_CREATECOIN SkillID::WS_CREATECOIN
- WS_CREATENUGGET = 387,
-#define WS_CREATENUGGET SkillID::WS_CREATENUGGET
- WS_CARTBOOST = 388,
-#define WS_CARTBOOST SkillID::WS_CARTBOOST
- WS_SYSTEMCREATE = 389,
-#define WS_SYSTEMCREATE SkillID::WS_SYSTEMCREATE
- ST_CHASEWALK = 390,
-#define ST_CHASEWALK SkillID::ST_CHASEWALK
- ST_REJECTSWORD = 391,
-#define ST_REJECTSWORD SkillID::ST_REJECTSWORD
- ST_STEALBACKPACK = 392,
-#define ST_STEALBACKPACK SkillID::ST_STEALBACKPACK
- CR_ALCHEMY = 393,
-#define CR_ALCHEMY SkillID::CR_ALCHEMY
- CR_SYNTHESISPOTION = 394,
-#define CR_SYNTHESISPOTION SkillID::CR_SYNTHESISPOTION
- CG_ARROWVULCAN = 395,
-#define CG_ARROWVULCAN SkillID::CG_ARROWVULCAN
- CG_MOONLIT = 396,
-#define CG_MOONLIT SkillID::CG_MOONLIT
- CG_MARIONETTE = 397,
-#define CG_MARIONETTE SkillID::CG_MARIONETTE
- LK_SPIRALPIERCE = 398,
-#define LK_SPIRALPIERCE SkillID::LK_SPIRALPIERCE
- LK_HEADCRUSH = 399,
-#define LK_HEADCRUSH SkillID::LK_HEADCRUSH
- LK_JOINTBEAT = 400,
-#define LK_JOINTBEAT SkillID::LK_JOINTBEAT
- HW_NAPALMVULCAN = 401,
-#define HW_NAPALMVULCAN SkillID::HW_NAPALMVULCAN
- CH_SOULCOLLECT = 402,
-#define CH_SOULCOLLECT SkillID::CH_SOULCOLLECT
- PF_MINDBREAKER = 403,
-#define PF_MINDBREAKER SkillID::PF_MINDBREAKER
- PF_MEMORIZE = 404,
-#define PF_MEMORIZE SkillID::PF_MEMORIZE
- PF_FOGWALL = 405,
-#define PF_FOGWALL SkillID::PF_FOGWALL
- PF_SPIDERWEB = 406,
-#define PF_SPIDERWEB SkillID::PF_SPIDERWEB
- ASC_METEORASSAULT = 407,
-#define ASC_METEORASSAULT SkillID::ASC_METEORASSAULT
- ASC_CDP = 408,
-#define ASC_CDP SkillID::ASC_CDP
- WE_BABY = 409,
-#define WE_BABY SkillID::WE_BABY
- WE_CALLPARENT = 410,
-#define WE_CALLPARENT SkillID::WE_CALLPARENT
- WE_CALLBABY = 411,
-#define WE_CALLBABY SkillID::WE_CALLBABY
- TK_RUN = 412,
-#define TK_RUN SkillID::TK_RUN
- TK_READYSTORM = 413,
-#define TK_READYSTORM SkillID::TK_READYSTORM
- TK_STORMKICK = 414,
-#define TK_STORMKICK SkillID::TK_STORMKICK
- TK_READYDOWN = 415,
-#define TK_READYDOWN SkillID::TK_READYDOWN
- TK_DOWNKICK = 416,
-#define TK_DOWNKICK SkillID::TK_DOWNKICK
- TK_READYTURN = 417,
-#define TK_READYTURN SkillID::TK_READYTURN
- TK_TURNKICK = 418,
-#define TK_TURNKICK SkillID::TK_TURNKICK
- TK_READYCOUNTER = 419,
-#define TK_READYCOUNTER SkillID::TK_READYCOUNTER
- TK_COUNTER = 420,
-#define TK_COUNTER SkillID::TK_COUNTER
- TK_DODGE = 421,
-#define TK_DODGE SkillID::TK_DODGE
- TK_JUMPKICK = 422,
-#define TK_JUMPKICK SkillID::TK_JUMPKICK
- TK_HPTIME = 423,
-#define TK_HPTIME SkillID::TK_HPTIME
- TK_SPTIME = 424,
-#define TK_SPTIME SkillID::TK_SPTIME
- TK_POWER = 425,
-#define TK_POWER SkillID::TK_POWER
- TK_SEVENWIND = 426,
-#define TK_SEVENWIND SkillID::TK_SEVENWIND
- TK_HIGHJUMP = 427,
-#define TK_HIGHJUMP SkillID::TK_HIGHJUMP
- SG_FEEL = 428,
-#define SG_FEEL SkillID::SG_FEEL
- SG_SUN_WARM = 429,
-#define SG_SUN_WARM SkillID::SG_SUN_WARM
- SG_MOON_WARM = 430,
-#define SG_MOON_WARM SkillID::SG_MOON_WARM
- SG_STAR_WARM = 431,
-#define SG_STAR_WARM SkillID::SG_STAR_WARM
- SG_SUN_COMFORT = 432,
-#define SG_SUN_COMFORT SkillID::SG_SUN_COMFORT
- SG_MOON_COMFORT = 433,
-#define SG_MOON_COMFORT SkillID::SG_MOON_COMFORT
- SG_STAR_COMFORT = 434,
-#define SG_STAR_COMFORT SkillID::SG_STAR_COMFORT
- SG_HATE = 435,
-#define SG_HATE SkillID::SG_HATE
- SG_SUN_ANGER = 436,
-#define SG_SUN_ANGER SkillID::SG_SUN_ANGER
- SG_MOON_ANGER = 437,
-#define SG_MOON_ANGER SkillID::SG_MOON_ANGER
- SG_STAR_ANGER = 438,
-#define SG_STAR_ANGER SkillID::SG_STAR_ANGER
- SG_SUN_BLESS = 439,
-#define SG_SUN_BLESS SkillID::SG_SUN_BLESS
- SG_MOON_BLESS = 440,
-#define SG_MOON_BLESS SkillID::SG_MOON_BLESS
- SG_STAR_BLESS = 441,
-#define SG_STAR_BLESS SkillID::SG_STAR_BLESS
- SG_DEVIL = 442,
-#define SG_DEVIL SkillID::SG_DEVIL
- SG_FRIEND = 443,
-#define SG_FRIEND SkillID::SG_FRIEND
- SG_KNOWLEDGE = 444,
-#define SG_KNOWLEDGE SkillID::SG_KNOWLEDGE
- SG_FUSION = 445,
-#define SG_FUSION SkillID::SG_FUSION
- SL_ALCHEMIST = 446,
-#define SL_ALCHEMIST SkillID::SL_ALCHEMIST
- AM_BERSERKPITCHER = 447,
-#define AM_BERSERKPITCHER SkillID::AM_BERSERKPITCHER
- SL_MONK = 448,
-#define SL_MONK SkillID::SL_MONK
- SL_STAR = 449,
-#define SL_STAR SkillID::SL_STAR
- SL_SAGE = 450,
-#define SL_SAGE SkillID::SL_SAGE
- SL_CRUSADER = 451,
-#define SL_CRUSADER SkillID::SL_CRUSADER
- SL_SUPERNOVICE = 452,
-#define SL_SUPERNOVICE SkillID::SL_SUPERNOVICE
- SL_KNIGHT = 453,
-#define SL_KNIGHT SkillID::SL_KNIGHT
- SL_WIZARD = 454,
-#define SL_WIZARD SkillID::SL_WIZARD
- SL_PRIEST = 455,
-#define SL_PRIEST SkillID::SL_PRIEST
- SL_BARDDANCER = 456,
-#define SL_BARDDANCER SkillID::SL_BARDDANCER
- SL_ROGUE = 457,
-#define SL_ROGUE SkillID::SL_ROGUE
- SL_ASSASIN = 458,
-#define SL_ASSASIN SkillID::SL_ASSASIN
- SL_BLACKSMITH = 459,
-#define SL_BLACKSMITH SkillID::SL_BLACKSMITH
- BS_ADRENALINE2 = 460,
-#define BS_ADRENALINE2 SkillID::BS_ADRENALINE2
- SL_HUNTER = 461,
-#define SL_HUNTER SkillID::SL_HUNTER
- SL_SOULLINKER = 462,
-#define SL_SOULLINKER SkillID::SL_SOULLINKER
- SL_KAIZEL = 463,
-#define SL_KAIZEL SkillID::SL_KAIZEL
- SL_KAAHI = 464,
-#define SL_KAAHI SkillID::SL_KAAHI
- SL_KAUPE = 465,
-#define SL_KAUPE SkillID::SL_KAUPE
- SL_KAITE = 466,
-#define SL_KAITE SkillID::SL_KAITE
- SL_KAINA = 467,
-#define SL_KAINA SkillID::SL_KAINA
- SL_STIN = 468,
-#define SL_STIN SkillID::SL_STIN
- SL_STUN = 469,
-#define SL_STUN SkillID::SL_STUN
- SL_SMA = 470,
-#define SL_SMA SkillID::SL_SMA
- SL_SWOO = 471,
-#define SL_SWOO SkillID::SL_SWOO
- SL_SKE = 472,
-#define SL_SKE SkillID::SL_SKE
- SL_SKA = 473,
-#define SL_SKA SkillID::SL_SKA
-
// Note: this value is also hard-coded in common/mmo.hpp
MAX_SKILL_DB = 474, // not 450
#define MAX_SKILL_DB SkillID::MAX_SKILL_DB