From f909528c7e64ac7180d9a544f12912efd0867a67 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Wed, 9 Jan 2013 15:21:53 -0800 Subject: Remove all non-NPC skills --- src/map/atcommand.cpp | 551 ----- src/map/battle.cpp | 1438 +----------- src/map/clif.cpp | 108 +- src/map/map.hpp | 1 - src/map/map.t.hpp | 12 +- src/map/mob.cpp | 136 +- src/map/npc.cpp | 58 +- src/map/pc.cpp | 563 +---- src/map/pc.hpp | 21 - src/map/script.cpp | 11 +- src/map/skill.cpp | 5797 ++----------------------------------------------- src/map/skill.hpp | 3 - src/map/skill.t.hpp | 834 +------ 13 files changed, 310 insertions(+), 9223 deletions(-) (limited to 'src') 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); @@ -2639,86 +2593,6 @@ int atcommand_produce(const int fd, struct map_session_data *sd, return 0; } -/*========================================== - * 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 ).", - 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."); @@ -5186,130 +5036,6 @@ int atcommand_mapinfo(const int fd, struct map_session_data *sd, return 0; } -/*========================================== - * - *------------------------------------------ - */ -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 )."); - 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 *------------------------------------------ @@ -5729,72 +5455,6 @@ int atcommand_unjail(const int fd, struct map_session_data *sd, return 0; } -/*========================================== - * @disguise 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 )."); - 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] *------------------------------------------ @@ -6080,125 +5740,6 @@ int atcommand_exall(const int fd, struct map_session_data *sd, return 0; } -/*========================================== - * @chardisguise 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 )."); - 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 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 )."); - 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 by [Yor] *------------------------------------------ @@ -6764,32 +6305,6 @@ int atcommand_charkillable(const int fd, struct map_session_data *, return 0; } -/*========================================== - * @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 * @@ -7028,72 +6543,6 @@ int atcommand_charstoreall(const int fd, struct map_session_data *sd, return 0; } -/*========================================== - * @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 "); - 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 @@ -23,21 +23,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 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 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<def_ratio_atk_race & (1<def_ratio_atk_ele_ & (1<def_ratio_atk_race_ & (1<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 sc_data = battle_get_sc_data(src); eptr 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 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 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 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 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;istatus.job_level && iparamb[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 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; } @@ -6303,80 +5998,6 @@ int pc_setoption(struct map_session_data *sd, Option type) return 0; } -/*========================================== - * カート設定 - *------------------------------------------ - */ -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 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 SkillStatusChangeTable //= StatusChange::NEGATIVE1, StatusChange::NEGATIVE1, StatusChange::NEGATIVE1, - SC_RUWACH, /* ルアフ */ + StatusChange::NEGATIVE1, /* ルアフ */ StatusChange::NEGATIVE1, StatusChange::NEGATIVE1, StatusChange::NEGATIVE1, @@ -95,7 +95,7 @@ earray SkillStatusChangeTable //= StatusChange::NEGATIVE1, // 60- SC_TWOHANDQUICKEN, /* 2HQ */ - SC_AUTOCOUNTER, + StatusChange::NEGATIVE1, StatusChange::NEGATIVE1, StatusChange::NEGATIVE1, StatusChange::NEGATIVE1, @@ -323,7 +323,7 @@ earray SkillStatusChangeTable //= StatusChange::NEGATIVE1, StatusChange::NEGATIVE1, SC_STEELBODY, - SC_BLADESTOP_WAIT, + StatusChange::NEGATIVE1, // 270- SC_EXPLOSIONSPIRITS, SC_EXTREMITYFIST, @@ -493,218 +493,10 @@ earray 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} }; @@ -959,19 +585,11 @@ int rdamage; earray 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 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 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 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,103 +1360,27 @@ 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; + return 0; +} +static +void skill_check_unit_range2_sub(struct block_list *bl, int *c) +{ nullpo_retv(bl); - unit = (struct skill_unit *) bl; + nullpo_retv(c); - if (bl->prev == NULL || bl->type != BL_SKILL) + if (bl->prev == NULL || (bl->type != BL_PC && bl->type != BL_MOB)) return; - if (!unit->alive) + if (bl->type == BL_PC && pc_isdead((struct map_session_data *) bl)) 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)++; + (*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; -} - -static -void skill_check_unit_range2_sub(struct block_list *bl, int *c) -{ - nullpo_retv(bl); - nullpo_retv(c); - - if (bl->prev == NULL || (bl->type != BL_PC && bl->type != BL_MOB)) - return; - - if (bl->type == BL_PC && pc_isdead((struct map_session_data *) bl)) - return; - - (*c)++; -} - -int skill_check_unit_range2(int m, int x, int y, int range) +int skill_check_unit_range2(int m, int x, int y, int range) { int c = 0; @@ -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 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 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 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 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 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,280 +1594,63 @@ 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); + case NPC_SMOKING: /* スモーキング */ + skill_attack(BF_MISC, src, src, bl, skillid, skilllv, tick, BCT_ZERO); break; - /* 魔法系範囲攻撃スキル */ - case MG_NAPALMBEAT: /* ナパームビート */ - case MG_FIREBALL: /* ファイヤーボール */ + case NPC_SELFDESTRUCTION: /* 自爆 */ + case NPC_SELFDESTRUCTION2: /* 自爆2 */ if (flag & 1) { /* 個別にダメージを与える */ - if (bl->id != skill_area_temp_id) + if (src->type == BL_MOB) { - 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); + struct mob_data *mb = (struct mob_data *) src; + nullpo_retr(1, mb); + mb->hp = skill_area_temp_hp; + if (bl->id != skill_area_temp_id) + skill_attack(BF_MISC, src, src, bl, + NPC_SELFDESTRUCTION, skilllv, tick, + flag); + mb->hp = 1; } } 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 + struct mob_data *md; + if ((md = (struct mob_data *) src)) { - skill_area_temp_x = bl->x; - skill_area_temp_y = bl->y; + skill_area_temp_id = bl->id; + skill_area_temp_hp = battle_get_hp(src); + 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 - 5, bl->y - 5, + bl->x + 5, bl->y + 5, BL_NUL); + battle_damage(src, src, md->hp, 0); } - 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; - - case NPC_SELFDESTRUCTION: /* 自爆 */ - case NPC_SELFDESTRUCTION2: /* 自爆2 */ - if (flag & 1) - { - /* 個別にダメージを与える */ - if (src->type == BL_MOB) - { - struct mob_data *mb = (struct mob_data *) src; - nullpo_retr(1, mb); - mb->hp = skill_area_temp_hp; - if (bl->id != skill_area_temp_id) - skill_attack(BF_MISC, src, src, bl, - NPC_SELFDESTRUCTION, skilllv, tick, - flag); - mb->hp = 1; - } - } - else - { - struct mob_data *md; - if ((md = (struct mob_data *) src)) - { - skill_area_temp_id = bl->id; - skill_area_temp_hp = battle_get_hp(src); - 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 - 5, bl->y - 5, - bl->x + 5, bl->y + 5, BL_NUL); - battle_damage(src, src, md->hp, 0); - } - } - break; - - /* HP吸収/HP吸収魔法 */ - case NPC_BLOODDRAIN: - case NPC_ENERGYDRAIN: - { - int heal; - heal = - skill_attack((skillid == - NPC_BLOODDRAIN) ? BF_WEAPON : BF_MAGIC, src, - src, bl, skillid, skilllv, tick, flag); - if (heal > 0) - battle_heal(NULL, src, heal, 0, 0); - } - break; - case SkillID::ZERO: - if (sd) + /* HP吸収/HP吸収魔法 */ + case NPC_BLOODDRAIN: + case NPC_ENERGYDRAIN: + { + int heal; + heal = + skill_attack((skillid == + NPC_BLOODDRAIN) ? BF_WEAPON : BF_MAGIC, src, + src, bl, skillid, skilllv, tick, flag); + if (heal > 0) + battle_heal(NULL, src, heal, 0, 0); + } + break; + case SkillID::ZERO: + if (sd) { if (flag & 3) { @@ -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,1451 +1767,113 @@ 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で復活不可能状態 */ + case AL_TELEPORT: /* テレポート */ + if (bl->type == BL_MOB) + mob_warp((struct mob_data *) bl, -1, -1, -1, 3); + break; - 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); - } - } + /* ランダム属性変化、水属性変化、地、火、風 */ + case NPC_ATTRICHANGE: + case NPC_CHANGEWATER: + case NPC_CHANGEGROUND: + case NPC_CHANGEFIRE: + case NPC_CHANGEWIND: + /* 毒、聖、念、闇 */ + case NPC_CHANGEPOISON: + case NPC_CHANGEHOLY: + case NPC_CHANGEDARKNESS: + case NPC_CHANGETELEKINESIS: + if (md) + { + md->def_ele = skill_get_pl(skillid); + if (md->def_ele == 0) /* ランダム変化、ただし、 */ + md->def_ele = MRAND(10); /* 不死属性は除く */ + md->def_ele += (1 + MRAND(4)) * 20; /* 属性レベルはランダム */ } break; - case AL_DECAGI: /* 速度減少 */ + case NPC_HALLUCINATION: 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); - } + 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); - } + case NPC_KEEPING: + case NPC_BARRIER: + { + int skill_time = skill_get_time(skillid, skilllv); + skill_status_change_start(bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, skill_time, 0); + mob_changestate((struct mob_data *) src, MS_DELAY, skill_time); + } break; - case PR_LEXDIVINA: /* レックスディビーナ */ + case NPC_DARKBLESSING: { - eptr sc_data = battle_get_sc_data(bl); + int sc_def = 100 - battle_get_mdef(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) + if (battle_get_elem_type(bl) == 7 || battle_get_race(bl) == 6) + break; + if (MRAND(100) < sc_def * (50 + skilllv * 5) / 100) { - skill_status_change_start(bl, - SkillStatusChangeTable[skillid], - skilllv, 0, 0, 0, - skill_get_time(skillid, skilllv), - 0); + if (dstsd) + { + int hp = battle_get_hp(bl) - 1; + pc_heal(dstsd, -hp, 0); + } + else if (dstmd) + dstmd->hp = 1; } } 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; + + case NPC_SELFDESTRUCTION: /* 自爆 */ + case NPC_SELFDESTRUCTION2: /* 自爆2 */ + skill_status_change_start(bl, SkillStatusChangeTable[skillid], + skilllv, uint16_t(skillid), 0, 0, + skill_get_time(skillid, skilllv), 0); break; - case SA_FULLRECOVERY: + case NPC_LICK: if (bl->type == BL_PC && ((struct map_session_data *) bl)-> - special_state.no_magic_damage) + special_state.no_weapon_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); + pc_heal(dstsd, 0, -100); + if (MRAND(100) < (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 SA_INSTANTDEATH: - if (sd) - pc_damage(NULL, sd, sd->status.max_hp); + case NPC_SUICIDE: /* 自決 */ + if (src && bl && md) + mob_damage(NULL, md, md->hp, 0); 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 + case NPC_SUMMONSLAVE: /* 手下召喚 */ + case NPC_SUMMONMONSTER: /* MOB召喚 */ + if (md && !md->master_id) { - skill_status_change_start(bl, - SkillStatusChangeTable[skillid], - skilllv, 0, 0, 0, - skill_get_time(skillid, skilllv), - 0); + mob_summonslave(md, + mob_db[md->mob_class].skill[md->skillidx].val, + skilllv, + (skillid == NPC_SUMMONSLAVE) ? 1 : 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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: - case NPC_CHANGEGROUND: - case NPC_CHANGEFIRE: - case NPC_CHANGEWIND: - /* 毒、聖、念、闇 */ - case NPC_CHANGEPOISON: - case NPC_CHANGEHOLY: - case NPC_CHANGEDARKNESS: - case NPC_CHANGETELEKINESIS: - if (md) - { - md->def_ele = skill_get_pl(skillid); - if (md->def_ele == 0) /* ランダム変化、ただし、 */ - md->def_ele = MRAND(10); /* 不死属性は除く */ - md->def_ele += (1 + MRAND(4)) * 20; /* 属性レベルはランダム */ - } - break; - - case NPC_HALLUCINATION: - 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 NPC_KEEPING: - case NPC_BARRIER: - { - int skill_time = skill_get_time(skillid, skilllv); - skill_status_change_start(bl, SkillStatusChangeTable[skillid], - skilllv, 0, 0, 0, skill_time, 0); - mob_changestate((struct mob_data *) src, MS_DELAY, skill_time); - } - break; - - case NPC_DARKBLESSING: - { - int sc_def = 100 - battle_get_mdef(bl); - if (bl->type == BL_PC - && ((struct map_session_data *) bl)-> - special_state.no_magic_damage) - break; - if (battle_get_elem_type(bl) == 7 || battle_get_race(bl) == 6) - break; - if (MRAND(100) < sc_def * (50 + skilllv * 5) / 100) - { - if (dstsd) - { - int hp = battle_get_hp(bl) - 1; - pc_heal(dstsd, -hp, 0); - } - else if (dstmd) - dstmd->hp = 1; - } - } - break; - - case NPC_SELFDESTRUCTION: /* 自爆 */ - case NPC_SELFDESTRUCTION2: /* 自爆2 */ - skill_status_change_start(bl, SkillStatusChangeTable[skillid], - skilllv, uint16_t(skillid), 0, 0, - skill_get_time(skillid, skilllv), 0); - break; - case NPC_LICK: - if (bl->type == BL_PC - && ((struct map_session_data *) bl)-> - special_state.no_weapon_damage) - break; - if (dstsd) - pc_heal(dstsd, 0, -100); - if (MRAND(100) < (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 NPC_SUICIDE: /* 自決 */ - if (src && bl && md) - mob_damage(NULL, md, md->hp, 0); - break; - - case NPC_SUMMONSLAVE: /* 手下召喚 */ - case NPC_SUMMONMONSTER: /* MOB召喚 */ - if (md && !md->master_id) - { - mob_summonslave(md, - mob_db[md->mob_class].skill[md->skillidx].val, - skilllv, - (skillid == NPC_SUMMONSLAVE) ? 1 : 0); - } - break; - - case NPC_TRANSFORMATION: - case NPC_METAMORPHOSIS: - if (md) - mob_class_change(md, - mob_db[md->mob_class].skill[md->skillidx].val); + case NPC_TRANSFORMATION: + case NPC_METAMORPHOSIS: + if (md) + mob_class_change(md, + mob_db[md->mob_class].skill[md->skillidx].val); break; case NPC_EMOTION: /* エモーション */ @@ -4923,234 +1882,9 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, mob_db[md->mob_class].skill[md->skillidx].val[0]); break; - 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 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); - } - } + case NPC_DEFENDER: 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 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, @@ -5339,196 +2022,6 @@ 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指定) *------------------------------------------ @@ -5536,8 +2029,6 @@ int skill_castend_pos2(struct block_list *src, int x, int y, 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,96 +2851,14 @@ 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)) - { - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - 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) + if (pc_isdead(sd)) { - 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; - } - } + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = SkillID::NEGATIVE; + sd->skillitemlv = -1; + return; } if (battle_config.pc_land_skill_limit) @@ -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 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,251 +3237,48 @@ 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; /* 射程と障害物チェック */ - 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, 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); - - 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)); - 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 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; + 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, bl, range_)) + return 0; - } + pc_stopattack(sd); + + casttime = skill_castfix(&sd->bl, skill_get_cast(skill_num, skill_lv)); + delay = skill_delayfix(&sd->bl, skill_get_delay(skill_num, skill_lv)); + sd->state.skillcastcancel = skill_db[skill_num].castcancel; //メモライズ状態ならキャストタイムが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 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) -{ - 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 skill_gangsterparadise(struct map_session_data *, int) { - 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 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: /* コンセントレーション */ @@ -8991,19 +3843,6 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid) sc_data[type].val1 = sc_data[type].val2 = 0; skill_devotion(md, bl->id); calc_flag = 1; - } - break; - case SC_BLADESTOP: - { - eptr 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: @@ -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) @@ -10669,46 +5381,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 -- cgit v1.2.3-60-g2f50