summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
Diffstat (limited to 'src/map')
-rw-r--r--src/map/atcommand.cpp6897
-rw-r--r--src/map/atcommand.hpp225
-rw-r--r--src/map/battle.cpp5401
-rw-r--r--src/map/battle.hpp540
-rw-r--r--src/map/battle.t.hpp223
-rw-r--r--src/map/chat.cpp308
-rw-r--r--src/map/chat.hpp27
-rw-r--r--src/map/chrif.cpp899
-rw-r--r--src/map/chrif.hpp52
-rw-r--r--src/map/clif.cpp9899
-rw-r--r--src/map/clif.hpp412
-rw-r--r--src/map/clif.t.hpp21
-rw-r--r--src/map/grfio.cpp72
-rw-r--r--src/map/grfio.hpp15
-rw-r--r--src/map/guild.cpp1922
-rw-r--r--src/map/guild.hpp95
-rw-r--r--src/map/intif.cpp1106
-rw-r--r--src/map/intif.hpp81
-rw-r--r--src/map/itemdb.cpp611
-rw-r--r--src/map/itemdb.hpp132
-rw-r--r--src/map/magic-expr-eval.hpp32
-rw-r--r--src/map/magic-expr.cpp1310
-rw-r--r--src/map/magic-expr.hpp57
-rw-r--r--src/map/magic-interpreter-aux.hpp16
-rw-r--r--src/map/magic-interpreter-base.cpp347
-rw-r--r--src/map/magic-interpreter-lexer.lpp179
-rw-r--r--src/map/magic-interpreter-parser.ypp708
-rw-r--r--src/map/magic-interpreter.hpp277
-rw-r--r--src/map/magic-interpreter.t.hpp159
-rw-r--r--src/map/magic-stmt.cpp1207
-rw-r--r--src/map/magic.cpp80
-rw-r--r--src/map/magic.hpp32
-rw-r--r--src/map/map.cpp1629
-rw-r--r--src/map/map.hpp786
-rw-r--r--src/map/map.t.hpp560
-rw-r--r--src/map/mob.cpp4103
-rw-r--r--src/map/mob.hpp214
-rw-r--r--src/map/mob.t.hpp41
-rw-r--r--src/map/npc.cpp1625
-rw-r--r--src/map/npc.hpp91
-rw-r--r--src/map/party.cpp414
-rw-r--r--src/map/party.hpp84
-rw-r--r--src/map/path.cpp305
-rw-r--r--src/map/pc.cpp7280
-rw-r--r--src/map/pc.hpp356
-rw-r--r--src/map/pc.t.hpp44
-rw-r--r--src/map/script.cpp6627
-rw-r--r--src/map/script.hpp77
-rw-r--r--src/map/skill-pools.cpp121
-rw-r--r--src/map/skill.cpp12155
-rw-r--r--src/map/skill.hpp936
-rw-r--r--src/map/skill.t.hpp116
-rw-r--r--src/map/storage.cpp627
-rw-r--r--src/map/storage.hpp61
-rw-r--r--src/map/tmw.cpp125
-rw-r--r--src/map/tmw.hpp15
-rw-r--r--src/map/trade.cpp229
-rw-r--r--src/map/trade.hpp16
58 files changed, 19275 insertions, 52704 deletions
diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp
index bca530e..5fffaa3 100644
--- a/src/map/atcommand.cpp
+++ b/src/map/atcommand.cpp
@@ -1,601 +1,379 @@
-// $Id: atcommand.c 148 2004-09-30 14:05:37Z MouseJstr $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <math.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <time.h>
-#include <unistd.h>
-
-#include <array>
+#include "atcommand.hpp"
+
+#include <cmath>
+#include <cstring>
+#include <ctime>
+#include "../common/core.hpp"
+#include "../common/cxxstdio.hpp"
+#include "../common/mmo.hpp"
+#include "../common/random.hpp"
+#include "../common/nullpo.hpp"
#include "../common/socket.hpp"
#include "../common/timer.hpp"
-#include "../common/nullpo.hpp"
-#include "../common/mt_rand.hpp"
+#include "../common/utils2.hpp"
-#include "atcommand.hpp"
#include "battle.hpp"
-#include "clif.hpp"
#include "chrif.hpp"
-#include "guild.hpp"
+#include "clif.hpp"
#include "intif.hpp"
#include "itemdb.hpp"
#include "map.hpp"
#include "mob.hpp"
#include "npc.hpp"
-#include "pc.hpp"
#include "party.hpp"
+#include "pc.hpp"
#include "script.hpp"
#include "skill.hpp"
-#include "trade.hpp"
-
-#include "../common/core.hpp"
+#include "storage.hpp"
#include "tmw.hpp"
+#include "trade.hpp"
-#define STATE_BLIND 0x10
-
-static char command_symbol = '@'; // first char of the commands (by [Yor])
-
-#define ATCOMMAND_FUNC(x) int atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
-ATCOMMAND_FUNC (setup);
-ATCOMMAND_FUNC (broadcast);
-ATCOMMAND_FUNC (localbroadcast);
-ATCOMMAND_FUNC (charwarp);
-//ATCOMMAND_FUNC (warp);
-ATCOMMAND_FUNC (where);
-//ATCOMMAND_FUNC (goto);
-ATCOMMAND_FUNC (jump);
-ATCOMMAND_FUNC (who);
-ATCOMMAND_FUNC (whogroup);
-ATCOMMAND_FUNC (whomap);
-ATCOMMAND_FUNC (whomapgroup);
-ATCOMMAND_FUNC (whogm); // by Yor
-ATCOMMAND_FUNC (save);
-ATCOMMAND_FUNC (load);
-ATCOMMAND_FUNC (speed);
-ATCOMMAND_FUNC (storage);
-ATCOMMAND_FUNC (guildstorage);
-ATCOMMAND_FUNC (option);
-ATCOMMAND_FUNC (hide);
-ATCOMMAND_FUNC (die);
-ATCOMMAND_FUNC (kill);
-ATCOMMAND_FUNC (alive);
-ATCOMMAND_FUNC (kami);
-ATCOMMAND_FUNC (heal);
-//ATCOMMAND_FUNC (item);
-ATCOMMAND_FUNC (itemreset);
-ATCOMMAND_FUNC (itemcheck);
-ATCOMMAND_FUNC (baselevelup);
-ATCOMMAND_FUNC (joblevelup);
-ATCOMMAND_FUNC (help);
-ATCOMMAND_FUNC (gm);
-ATCOMMAND_FUNC (pvpoff);
-ATCOMMAND_FUNC (pvpon);
-ATCOMMAND_FUNC (gvgoff);
-ATCOMMAND_FUNC (gvgon);
-ATCOMMAND_FUNC (model);
-ATCOMMAND_FUNC (go);
-//ATCOMMAND_FUNC (spawn);
-ATCOMMAND_FUNC (killmonster);
-ATCOMMAND_FUNC (killmonster2);
-ATCOMMAND_FUNC (refine);
-ATCOMMAND_FUNC (produce);
-ATCOMMAND_FUNC (memo);
-ATCOMMAND_FUNC (gat);
-ATCOMMAND_FUNC (packet);
-ATCOMMAND_FUNC (statuspoint);
-ATCOMMAND_FUNC (skillpoint);
-ATCOMMAND_FUNC (zeny);
-ATCOMMAND_FUNC (param);
-ATCOMMAND_FUNC (guildlevelup);
-//ATCOMMAND_FUNC (recall);
-ATCOMMAND_FUNC (recallall);
-ATCOMMAND_FUNC (revive);
-ATCOMMAND_FUNC (character_stats);
-ATCOMMAND_FUNC (character_stats_all);
-ATCOMMAND_FUNC (character_option);
-ATCOMMAND_FUNC (character_save);
-ATCOMMAND_FUNC (night);
-ATCOMMAND_FUNC (day);
-ATCOMMAND_FUNC (doom);
-ATCOMMAND_FUNC (doommap);
-ATCOMMAND_FUNC (raise);
-ATCOMMAND_FUNC (raisemap);
-ATCOMMAND_FUNC (character_baselevel);
-ATCOMMAND_FUNC (character_joblevel);
-ATCOMMAND_FUNC (kick);
-ATCOMMAND_FUNC (kickall);
-ATCOMMAND_FUNC (allskills);
-ATCOMMAND_FUNC (questskill);
-ATCOMMAND_FUNC (charquestskill);
-ATCOMMAND_FUNC (lostskill);
-ATCOMMAND_FUNC (charlostskill);
-ATCOMMAND_FUNC (party);
-ATCOMMAND_FUNC (guild);
-ATCOMMAND_FUNC (charskreset);
-ATCOMMAND_FUNC (charstreset);
-ATCOMMAND_FUNC (charreset);
-ATCOMMAND_FUNC (charstpoint);
-ATCOMMAND_FUNC (charmodel);
-ATCOMMAND_FUNC (charskpoint);
-ATCOMMAND_FUNC (charzeny);
-ATCOMMAND_FUNC (agitstart);
-ATCOMMAND_FUNC (agitend);
-ATCOMMAND_FUNC (reloaditemdb);
-ATCOMMAND_FUNC (reloadmobdb);
-ATCOMMAND_FUNC (reloadskilldb);
-ATCOMMAND_FUNC (reloadscript);
-ATCOMMAND_FUNC (reloadgmdb); // by Yor
-ATCOMMAND_FUNC (mapexit);
-ATCOMMAND_FUNC (idsearch);
-ATCOMMAND_FUNC (mapinfo);
-ATCOMMAND_FUNC (dye); //** by fritz
-ATCOMMAND_FUNC (hair_style); //** by fritz
-ATCOMMAND_FUNC (hair_color); //** by fritz
-ATCOMMAND_FUNC (all_stats); //** by fritz
-ATCOMMAND_FUNC (char_change_sex); // by Yor
-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 (guildspy); // [Syrus22]
-ATCOMMAND_FUNC (partyspy); // [Syrus22]
-ATCOMMAND_FUNC (guildrecall); // by Yor
-ATCOMMAND_FUNC (partyrecall); // by Yor
-ATCOMMAND_FUNC (enablenpc);
-ATCOMMAND_FUNC (disablenpc);
-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 (follow); // 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
-ATCOMMAND_FUNC (charkillable); // by MouseJstr
-ATCOMMAND_FUNC (chareffect); // by MouseJstr
-ATCOMMAND_FUNC (chardye); // by MouseJstr
-ATCOMMAND_FUNC (charhairstyle); // by MouseJstr
-ATCOMMAND_FUNC (charhaircolor); // by MouseJstr
-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);
-ATCOMMAND_FUNC (sakura);
-ATCOMMAND_FUNC (fog);
-ATCOMMAND_FUNC (leaves);
-ATCOMMAND_FUNC (adjgmlvl); // by MouseJstr
-ATCOMMAND_FUNC (adjcmdlvl); // by MouseJstr
-ATCOMMAND_FUNC (trade); // by MouseJstr
-ATCOMMAND_FUNC (unmute); // [Valaris]
-ATCOMMAND_FUNC (char_wipe); // [Fate]
-ATCOMMAND_FUNC (set_magic); // [Fate]
-ATCOMMAND_FUNC (magic_info); // [Fate]
-ATCOMMAND_FUNC (log); // [Fate]
-ATCOMMAND_FUNC (tee); // [Fate]
-ATCOMMAND_FUNC (invisible); // [Fate]
-ATCOMMAND_FUNC (visible); // [Fate]
-ATCOMMAND_FUNC (list_nearby); // [Fate]
-ATCOMMAND_FUNC (iterate_forward_over_players); // [Fate]
-ATCOMMAND_FUNC (iterate_backwards_over_players); // [Fate]
-ATCOMMAND_FUNC (skillpool_info); // [Fate]
-ATCOMMAND_FUNC (skillpool_focus); // [Fate]
-ATCOMMAND_FUNC (skillpool_unfocus); // [Fate]
-ATCOMMAND_FUNC (skill_learn); // [Fate]
-ATCOMMAND_FUNC (wgm);
-ATCOMMAND_FUNC (ipcheck);
-ATCOMMAND_FUNC (doomspot);
+#include "../poison.hpp"
+
+#define ATCOMMAND_FUNC(x) static \
+int atcommand_##x(const int fd, struct map_session_data* sd, const char* command, const char* message)
+ATCOMMAND_FUNC(setup);
+ATCOMMAND_FUNC(broadcast);
+ATCOMMAND_FUNC(localbroadcast);
+ATCOMMAND_FUNC(charwarp);
+ATCOMMAND_FUNC(warp);
+ATCOMMAND_FUNC(where);
+ATCOMMAND_FUNC(goto);
+ATCOMMAND_FUNC(jump);
+ATCOMMAND_FUNC(who);
+ATCOMMAND_FUNC(whogroup);
+ATCOMMAND_FUNC(whomap);
+ATCOMMAND_FUNC(whomapgroup);
+ATCOMMAND_FUNC(whogm); // by Yor
+ATCOMMAND_FUNC(save);
+ATCOMMAND_FUNC(load);
+ATCOMMAND_FUNC(speed);
+ATCOMMAND_FUNC(storage);
+ATCOMMAND_FUNC(option);
+ATCOMMAND_FUNC(hide);
+ATCOMMAND_FUNC(die);
+ATCOMMAND_FUNC(kill);
+ATCOMMAND_FUNC(alive);
+ATCOMMAND_FUNC(kami);
+ATCOMMAND_FUNC(heal);
+ATCOMMAND_FUNC(item);
+ATCOMMAND_FUNC(itemreset);
+ATCOMMAND_FUNC(itemcheck);
+ATCOMMAND_FUNC(baselevelup);
+ATCOMMAND_FUNC(joblevelup);
+ATCOMMAND_FUNC(help);
+ATCOMMAND_FUNC(gm);
+ATCOMMAND_FUNC(pvpoff);
+ATCOMMAND_FUNC(pvpon);
+ATCOMMAND_FUNC(model);
+ATCOMMAND_FUNC(spawn);
+ATCOMMAND_FUNC(killmonster);
+ATCOMMAND_FUNC(killmonster2);
+ATCOMMAND_FUNC(gat);
+ATCOMMAND_FUNC(packet);
+ATCOMMAND_FUNC(statuspoint);
+ATCOMMAND_FUNC(skillpoint);
+ATCOMMAND_FUNC(zeny);
+template<ATTR attr>
+ATCOMMAND_FUNC(param);
+ATCOMMAND_FUNC(recall);
+ATCOMMAND_FUNC(recallall);
+ATCOMMAND_FUNC(revive);
+ATCOMMAND_FUNC(character_stats);
+ATCOMMAND_FUNC(character_stats_all);
+ATCOMMAND_FUNC(character_option);
+ATCOMMAND_FUNC(character_save);
+ATCOMMAND_FUNC(doom);
+ATCOMMAND_FUNC(doommap);
+ATCOMMAND_FUNC(raise);
+ATCOMMAND_FUNC(raisemap);
+ATCOMMAND_FUNC(character_baselevel);
+ATCOMMAND_FUNC(character_joblevel);
+ATCOMMAND_FUNC(kick);
+ATCOMMAND_FUNC(kickall);
+ATCOMMAND_FUNC(questskill);
+ATCOMMAND_FUNC(charquestskill);
+ATCOMMAND_FUNC(lostskill);
+ATCOMMAND_FUNC(charlostskill);
+ATCOMMAND_FUNC(party);
+ATCOMMAND_FUNC(charskreset);
+ATCOMMAND_FUNC(charstreset);
+ATCOMMAND_FUNC(charreset);
+ATCOMMAND_FUNC(charstpoint);
+ATCOMMAND_FUNC(charmodel);
+ATCOMMAND_FUNC(charskpoint);
+ATCOMMAND_FUNC(charzeny);
+ATCOMMAND_FUNC(reloaditemdb);
+ATCOMMAND_FUNC(reloadmobdb);
+ATCOMMAND_FUNC(reloadskilldb);
+ATCOMMAND_FUNC(reloadscript);
+ATCOMMAND_FUNC(reloadgmdb); // by Yor
+ATCOMMAND_FUNC(mapexit);
+ATCOMMAND_FUNC(idsearch);
+ATCOMMAND_FUNC(mapinfo);
+ATCOMMAND_FUNC(dye); //** by fritz
+ATCOMMAND_FUNC(hair_style); //** by fritz
+ATCOMMAND_FUNC(hair_color); //** by fritz
+ATCOMMAND_FUNC(all_stats); //** by fritz
+ATCOMMAND_FUNC(char_change_sex); // by Yor
+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(partyspy); // [Syrus22]
+ATCOMMAND_FUNC(partyrecall); // by Yor
+ATCOMMAND_FUNC(enablenpc);
+ATCOMMAND_FUNC(disablenpc);
+ATCOMMAND_FUNC(servertime); // by Yor
+ATCOMMAND_FUNC(chardelitem); // by Yor
+ATCOMMAND_FUNC(ignorelist); // by Yor
+ATCOMMAND_FUNC(charignorelist); // by Yor
+ATCOMMAND_FUNC(inall); // by Yor
+ATCOMMAND_FUNC(exall); // by Yor
+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(killer); // by MouseJstr
+ATCOMMAND_FUNC(npcmove); // by MouseJstr
+ATCOMMAND_FUNC(killable); // by MouseJstr
+ATCOMMAND_FUNC(charkillable); // by MouseJstr
+ATCOMMAND_FUNC(chareffect); // by MouseJstr
+ATCOMMAND_FUNC(dropall); // by MouseJstr
+ATCOMMAND_FUNC(chardropall); // by MouseJstr
+ATCOMMAND_FUNC(storeall); // by MouseJstr
+ATCOMMAND_FUNC(charstoreall); // by MouseJstr
+ATCOMMAND_FUNC(summon);
+ATCOMMAND_FUNC(rain);
+ATCOMMAND_FUNC(snow);
+ATCOMMAND_FUNC(sakura);
+ATCOMMAND_FUNC(fog);
+ATCOMMAND_FUNC(leaves);
+ATCOMMAND_FUNC(adjgmlvl); // by MouseJstr
+ATCOMMAND_FUNC(adjcmdlvl); // by MouseJstr
+ATCOMMAND_FUNC(trade); // by MouseJstr
+ATCOMMAND_FUNC(char_wipe); // [Fate]
+ATCOMMAND_FUNC(set_magic); // [Fate]
+ATCOMMAND_FUNC(magic_info); // [Fate]
+ATCOMMAND_FUNC(log); // [Fate]
+ATCOMMAND_FUNC(tee); // [Fate]
+ATCOMMAND_FUNC(invisible); // [Fate]
+ATCOMMAND_FUNC(visible); // [Fate]
+ATCOMMAND_FUNC(list_nearby); // [Fate]
+ATCOMMAND_FUNC(iterate_forward_over_players); // [Fate]
+ATCOMMAND_FUNC(iterate_backwards_over_players); // [Fate]
+ATCOMMAND_FUNC(skillpool_info); // [Fate]
+ATCOMMAND_FUNC(skillpool_focus); // [Fate]
+ATCOMMAND_FUNC(skillpool_unfocus); // [Fate]
+ATCOMMAND_FUNC(skill_learn); // [Fate]
+ATCOMMAND_FUNC(wgm);
+ATCOMMAND_FUNC(ipcheck);
+ATCOMMAND_FUNC(doomspot);
/*==========================================
*AtCommandInfo atcommand_info[]構造体の定義
*------------------------------------------
*/
+struct AtCommandInfo
+{
+ const char *command;
+ int level;
+ int(*proc)(const int, struct map_session_data *,
+ const char *command, const char *message);
+};
+
// First char of commands is configured in atcommand_athena.conf. Leave @ in this list for default value.
// to set default level, read atcommand_athena.conf first please.
-static AtCommandInfo atcommand_info[] = {
- {AtCommand_Setup, "@setup", 40, atcommand_setup},
- {AtCommand_CharWarp, "@charwarp", 60, atcommand_charwarp},
- {AtCommand_Warp, "@warp", 40, atcommand_warp},
- {AtCommand_Where, "@where", 1, atcommand_where},
- {AtCommand_Goto, "@goto", 20, atcommand_goto},
- {AtCommand_Jump, "@jump", 40, atcommand_jump},
- {AtCommand_Who, "@who", 20, atcommand_who},
- {AtCommand_WhoGroup, "@whogroup", 20, atcommand_whogroup},
- {AtCommand_WhoMap, "@whomap", 20, atcommand_whomap},
- {AtCommand_WhoMapGroup, "@whomapgroup", 20, atcommand_whomapgroup},
- {AtCommand_WhoGM, "@whogm", 20, atcommand_whogm}, // by Yor
- {AtCommand_Save, "@save", 40, atcommand_save},
- {AtCommand_Load, "@return", 40, atcommand_load},
- {AtCommand_Load, "@load", 40, atcommand_load},
- {AtCommand_Speed, "@speed", 40, atcommand_speed},
- {AtCommand_Storage, "@storage", 1, atcommand_storage},
- {AtCommand_GuildStorage, "@gstorage", 50, atcommand_guildstorage},
- {AtCommand_Option, "@option", 40, atcommand_option},
- {AtCommand_Hide, "@hide", 40, atcommand_hide}, // + /hide
- {AtCommand_Die, "@die", 1, atcommand_die},
- {AtCommand_Kill, "@kill", 60, atcommand_kill},
- {AtCommand_Alive, "@alive", 60, atcommand_alive},
- {AtCommand_Kami, "@kami", 40, atcommand_kami},
- {AtCommand_Heal, "@heal", 40, atcommand_heal},
- {AtCommand_Item, "@item", 60, atcommand_item},
- {AtCommand_ItemReset, "@itemreset", 40, atcommand_itemreset},
- {AtCommand_ItemCheck, "@itemcheck", 60, atcommand_itemcheck},
- {AtCommand_BaseLevelUp, "@blvl", 60, atcommand_baselevelup},
- {AtCommand_JobLevelUp, "@jlvl", 60, atcommand_joblevelup},
- {AtCommand_Help, "@help", 20, atcommand_help},
- {AtCommand_GM, "@gm", 100, atcommand_gm},
- {AtCommand_PvPOff, "@pvpoff", 40, atcommand_pvpoff},
- {AtCommand_PvPOn, "@pvpon", 40, atcommand_pvpon},
- {AtCommand_GvGOff, "@gvgoff", 40, atcommand_gvgoff},
- {AtCommand_GvGOff, "@gpvpoff", 40, atcommand_gvgoff},
- {AtCommand_GvGOn, "@gvgon", 40, atcommand_gvgon},
- {AtCommand_GvGOn, "@gpvpon", 40, atcommand_gvgon},
- {AtCommand_Model, "@model", 20, atcommand_model},
- {AtCommand_Go, "@go", 10, atcommand_go},
- {AtCommand_Spawn, "@spawn", 50, atcommand_spawn},
- {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},
- {AtCommand_SkillPoint, "@skpoint", 60, atcommand_skillpoint},
- {AtCommand_Zeny, "@zeny", 60, atcommand_zeny},
- {AtCommand_Strength, "@str", 60, atcommand_param},
- {AtCommand_Agility, "@agi", 60, atcommand_param},
- {AtCommand_Vitality, "@vit", 60, atcommand_param},
- {AtCommand_Intelligence, "@int", 60, atcommand_param},
- {AtCommand_Dexterity, "@dex", 60, atcommand_param},
- {AtCommand_Luck, "@luk", 60, atcommand_param},
- {AtCommand_GuildLevelUp, "@guildlvl", 60, atcommand_guildlevelup},
- {AtCommand_Recall, "@recall", 60, atcommand_recall}, // + /recall
- {AtCommand_Revive, "@revive", 60, atcommand_revive},
- {AtCommand_CharacterStats, "@charstats", 40, atcommand_character_stats},
- {AtCommand_CharacterStatsAll, "@charstatsall", 40,
- atcommand_character_stats_all},
- {AtCommand_CharacterOption, "@charoption", 60,
- atcommand_character_option},
- {AtCommand_CharacterSave, "@charsave", 60, atcommand_character_save},
- {AtCommand_Night, "@night", 80, atcommand_night},
- {AtCommand_Day, "@day", 80, atcommand_day},
- {AtCommand_Doom, "@doom", 80, atcommand_doom},
- {AtCommand_DoomMap, "@doommap", 80, atcommand_doommap},
- {AtCommand_Raise, "@raise", 80, atcommand_raise},
- {AtCommand_RaiseMap, "@raisemap", 80, atcommand_raisemap},
- {AtCommand_CharacterBaseLevel, "@charbaselvl", 60,
- atcommand_character_baselevel},
- {AtCommand_CharacterJobLevel, "@charjlvl", 60,
- atcommand_character_joblevel},
- {AtCommand_Kick, "@kick", 20, atcommand_kick}, // + right click menu for GM "(name) force to quit"
- {AtCommand_KickAll, "@kickall", 99, atcommand_kickall},
- {AtCommand_AllSkills, "@allskills", 60, atcommand_allskills},
- {AtCommand_QuestSkill, "@questskill", 40, atcommand_questskill},
- {AtCommand_CharQuestSkill, "@charquestskill", 60,
- atcommand_charquestskill},
- {AtCommand_LostSkill, "@lostskill", 40, atcommand_lostskill},
- {AtCommand_CharLostSkill, "@charlostskill", 60, atcommand_charlostskill},
- {AtCommand_Party, "@party", 1, atcommand_party},
- {AtCommand_Guild, "@guild", 50, atcommand_guild},
- {AtCommand_AgitStart, "@agitstart", 60, atcommand_agitstart},
- {AtCommand_AgitEnd, "@agitend", 60, atcommand_agitend},
- {AtCommand_MapExit, "@mapexit", 99, atcommand_mapexit},
- {AtCommand_IDSearch, "@idsearch", 60, atcommand_idsearch},
- {AtCommand_MapMove, "@mapmove", 40, atcommand_warp}, // /mm command
- {AtCommand_Broadcast, "@broadcast", 40, atcommand_broadcast}, // /b and /nb command
- {AtCommand_LocalBroadcast, "@localbroadcast", 40, atcommand_localbroadcast}, // /lb and /nlb command
- {AtCommand_RecallAll, "@recallall", 80, atcommand_recallall},
- {AtCommand_CharSkReset, "@charskreset", 60, atcommand_charskreset},
- {AtCommand_CharStReset, "@charstreset", 60, atcommand_charstreset},
- {AtCommand_ReloadItemDB, "@reloaditemdb", 99, atcommand_reloaditemdb}, // admin command
- {AtCommand_ReloadMobDB, "@reloadmobdb", 99, atcommand_reloadmobdb}, // admin command
- {AtCommand_ReloadSkillDB, "@reloadskilldb", 99, atcommand_reloadskilldb}, // admin command
- {AtCommand_ReloadScript, "@reloadscript", 99, atcommand_reloadscript}, // admin command
- {AtCommand_ReloadGMDB, "@reloadgmdb", 99, atcommand_reloadgmdb}, // admin command
- {AtCommand_CharReset, "@charreset", 60, atcommand_charreset},
- {AtCommand_CharModel, "@charmodel", 50, atcommand_charmodel},
- {AtCommand_CharSKPoint, "@charskpoint", 60, atcommand_charskpoint},
- {AtCommand_CharSTPoint, "@charstpoint", 60, atcommand_charstpoint},
- {AtCommand_CharZeny, "@charzeny", 60, atcommand_charzeny},
- {AtCommand_MapInfo, "@mapinfo", 99, atcommand_mapinfo},
- {AtCommand_Dye, "@dye", 40, atcommand_dye}, // by fritz
- {AtCommand_Dye, "@ccolor", 40, atcommand_dye}, // by fritz
- {AtCommand_HairStyle, "@hairstyle", 40, atcommand_hair_style}, // by fritz
- {AtCommand_HairColor, "@haircolor", 40, atcommand_hair_color}, // by fritz
- {AtCommand_AllStats, "@allstats", 60, atcommand_all_stats}, // by fritz
- {AtCommand_CharChangeSex, "@charchangesex", 60, atcommand_char_change_sex}, // by Yor
- {AtCommand_CharBlock, "@block", 60, atcommand_char_block}, // by Yor
- {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_GuildSpy, "@guildspy", 60, atcommand_guildspy}, // [Syrus22]
- {AtCommand_PartySpy, "@partyspy", 60, atcommand_partyspy}, // [Syrus22]
- {AtCommand_GuildRecall, "@guildrecall", 60, atcommand_guildrecall}, // by Yor
- {AtCommand_PartyRecall, "@partyrecall", 60, atcommand_partyrecall}, // by Yor
- {AtCommand_Enablenpc, "@enablenpc", 80, atcommand_enablenpc}, // []
- {AtCommand_Disablenpc, "@disablenpc", 80, atcommand_disablenpc}, // []
- {AtCommand_ServerTime, "@servertime", 0, atcommand_servertime}, // by Yor
- {AtCommand_CharDelItem, "@chardelitem", 60, atcommand_chardelitem}, // by Yor
- {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_Follow, "@follow", 10, atcommand_follow}, // by MouseJstr
- {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
- {AtCommand_CharKillable, "@charkillable", 40, atcommand_charkillable}, // by MouseJstr
- {AtCommand_Chareffect, "@chareffect", 40, atcommand_chareffect}, // MouseJstr
- //{ AtCommand_Chardye, "@chardye", 40, atcommand_chardye }, // MouseJstr
- //{ AtCommand_Charhairstyle, "@charhairstyle", 40, atcommand_charhairstyle }, // MouseJstr
- //{ AtCommand_Charhaircolor, "@charhaircolor", 40, atcommand_charhaircolor }, // MouseJstr
- {AtCommand_Dropall, "@dropall", 40, atcommand_dropall}, // MouseJstr
- {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},
- {AtCommand_Fog, "@fog", 99, atcommand_fog},
- {AtCommand_Leaves, "@leaves", 99, atcommand_leaves},
- //{ AtCommand_Shuffle, "@shuffle", 99, atcommand_shuffle },
- //{ AtCommand_Maintenance, "@maintenance", 99, atcommand_maintenance },
- //{ AtCommand_Misceffect, "@misceffect", 60, atcommand_misceffect },
- {AtCommand_Summon, "@summon", 60, atcommand_summon},
- {AtCommand_AdjGmLvl, "@adjgmlvl", 99, atcommand_adjgmlvl},
- {AtCommand_AdjCmdLvl, "@adjcmdlvl", 99, atcommand_adjcmdlvl},
- {AtCommand_Trade, "@trade", 60, atcommand_trade},
- {AtCommand_UnMute, "@unmute", 60, atcommand_unmute}, // [Valaris]
- {AtCommand_UnMute, "@charwipe", 60, atcommand_char_wipe}, // [Fate]
- {AtCommand_SetMagic, "@setmagic", 99, atcommand_set_magic}, // [Fate]
- {AtCommand_MagicInfo, "@magicinfo", 60, atcommand_magic_info}, // [Fate]
- {AtCommand_Log, "@log", 60, atcommand_log}, // [Fate]
- {AtCommand_Log, "@l", 60, atcommand_log}, // [Fate]
- {AtCommand_Tee, "@tee", 60, atcommand_tee}, // [Fate]
- {AtCommand_Tee, "@t", 60, atcommand_tee}, // [Fate]
- {AtCommand_Invisible, "@invisible", 60, atcommand_invisible}, // [Fate]
- {AtCommand_Visible, "@visible", 60, atcommand_visible}, // [Fate]
- {AtCommand_IterateForward, "@hugo", 60, atcommand_iterate_forward_over_players}, // [Fate]
- {AtCommand_IterateBackward, "@linus", 60, atcommand_iterate_backwards_over_players}, // [Fate]
- {AtCommand_IterateBackward, "@sp-info", 40, atcommand_skillpool_info}, // [Fate]
- {AtCommand_IterateBackward, "@sp-focus", 80, atcommand_skillpool_focus}, // [Fate]
- {AtCommand_IterateBackward, "@sp-unfocus", 80, atcommand_skillpool_unfocus}, // [Fate]
- {AtCommand_IterateBackward, "@skill-learn", 80, atcommand_skill_learn}, // [Fate]
- {AtCommand_Wgm, "@wgm", 0, atcommand_wgm},
- {AtCommand_IpCheck, "@ipcheck", 60, atcommand_ipcheck},
- {AtCommand_DoomSpot, "@doomspot", 60, atcommand_doomspot},
+static
+AtCommandInfo atcommand_info[] = {
+ {"@setup", 40, atcommand_setup},
+ {"@charwarp", 60, atcommand_charwarp},
+ {"@warp", 40, atcommand_warp},
+ {"@where", 1, atcommand_where},
+ {"@goto", 20, atcommand_goto},
+ {"@jump", 40, atcommand_jump},
+ {"@who", 20, atcommand_who},
+ {"@whogroup", 20, atcommand_whogroup},
+ {"@whomap", 20, atcommand_whomap},
+ {"@whomapgroup", 20, atcommand_whomapgroup},
+ {"@whogm", 20, atcommand_whogm}, // by Yor
+ {"@save", 40, atcommand_save},
+ {"@return", 40, atcommand_load},
+ {"@load", 40, atcommand_load},
+ {"@speed", 40, atcommand_speed},
+ {"@storage", 1, atcommand_storage},
+ {"@option", 40, atcommand_option},
+ {"@hide", 40, atcommand_hide}, // + /hide
+ {"@die", 1, atcommand_die},
+ {"@kill", 60, atcommand_kill},
+ {"@alive", 60, atcommand_alive},
+ {"@kami", 40, atcommand_kami},
+ {"@heal", 40, atcommand_heal},
+ {"@item", 60, atcommand_item},
+ {"@itemreset", 40, atcommand_itemreset},
+ {"@itemcheck", 60, atcommand_itemcheck},
+ {"@blvl", 60, atcommand_baselevelup},
+ {"@jlvl", 60, atcommand_joblevelup},
+ {"@help", 20, atcommand_help},
+ {"@gm", 100, atcommand_gm},
+ {"@pvpoff", 40, atcommand_pvpoff},
+ {"@pvpon", 40, atcommand_pvpon},
+ {"@model", 20, atcommand_model},
+ {"@spawn", 50, atcommand_spawn},
+ {"@killmonster", 60, atcommand_killmonster},
+ {"@killmonster2", 40, atcommand_killmonster2},
+ {"@gat", 99, atcommand_gat}, // debug function
+ {"@packet", 99, atcommand_packet}, // debug function
+ {"@stpoint", 60, atcommand_statuspoint},
+ {"@skpoint", 60, atcommand_skillpoint},
+ {"@zeny", 60, atcommand_zeny},
+ {"@str", 60, atcommand_param<ATTR::STR>},
+ {"@agi", 60, atcommand_param<ATTR::AGI>},
+ {"@vit", 60, atcommand_param<ATTR::VIT>},
+ {"@int", 60, atcommand_param<ATTR::INT>},
+ {"@dex", 60, atcommand_param<ATTR::DEX>},
+ {"@luk", 60, atcommand_param<ATTR::LUK>},
+ {"@recall", 60, atcommand_recall}, // + /recall
+ {"@revive", 60, atcommand_revive},
+ {"@charstats", 40, atcommand_character_stats},
+ {"@charstatsall", 40, atcommand_character_stats_all},
+ {"@charoption", 60, atcommand_character_option},
+ {"@charsave", 60, atcommand_character_save},
+ {"@doom", 80, atcommand_doom},
+ {"@doommap", 80, atcommand_doommap},
+ {"@raise", 80, atcommand_raise},
+ {"@raisemap", 80, atcommand_raisemap},
+ {"@charbaselvl", 60, atcommand_character_baselevel},
+ {"@charjlvl", 60, atcommand_character_joblevel},
+ {"@kick", 20, atcommand_kick}, // + right click menu for GM "(name) force to quit"
+ {"@kickall", 99, atcommand_kickall},
+ {"@questskill", 40, atcommand_questskill},
+ {"@charquestskill", 60, atcommand_charquestskill},
+ {"@lostskill", 40, atcommand_lostskill},
+ {"@charlostskill", 60, atcommand_charlostskill},
+ {"@party", 1, atcommand_party},
+ {"@mapexit", 99, atcommand_mapexit},
+ {"@idsearch", 60, atcommand_idsearch},
+ {"@mapmove", 40, atcommand_warp}, // /mm command
+ {"@broadcast", 40, atcommand_broadcast}, // /b and /nb command
+ {"@localbroadcast", 40, atcommand_localbroadcast}, // /lb and /nlb command
+ {"@recallall", 80, atcommand_recallall},
+ {"@charskreset", 60, atcommand_charskreset},
+ {"@charstreset", 60, atcommand_charstreset},
+ {"@reloaditemdb", 99, atcommand_reloaditemdb}, // admin command
+ {"@reloadmobdb", 99, atcommand_reloadmobdb}, // admin command
+ {"@reloadskilldb", 99, atcommand_reloadskilldb}, // admin command
+ {"@reloadscript", 99, atcommand_reloadscript}, // admin command
+ {"@reloadgmdb", 99, atcommand_reloadgmdb}, // admin command
+ {"@charreset", 60, atcommand_charreset},
+ {"@charmodel", 50, atcommand_charmodel},
+ {"@charskpoint", 60, atcommand_charskpoint},
+ {"@charstpoint", 60, atcommand_charstpoint},
+ {"@charzeny", 60, atcommand_charzeny},
+ {"@mapinfo", 99, atcommand_mapinfo},
+ {"@dye", 40, atcommand_dye}, // by fritz
+ {"@ccolor", 40, atcommand_dye}, // by fritz
+ {"@hairstyle", 40, atcommand_hair_style}, // by fritz
+ {"@haircolor", 40, atcommand_hair_color}, // by fritz
+ {"@allstats", 60, atcommand_all_stats}, // by fritz
+ {"@charchangesex", 60, atcommand_char_change_sex}, // by Yor
+ {"@block", 60, atcommand_char_block}, // by Yor
+ {"@unblock", 60, atcommand_char_unblock}, // by Yor
+ {"@ban", 60, atcommand_char_ban}, // by Yor
+ {"@unban", 60, atcommand_char_unban}, // by Yor
+ {"@partyspy", 60, atcommand_partyspy}, // [Syrus22]
+ {"@partyrecall", 60, atcommand_partyrecall}, // by Yor
+ {"@enablenpc", 80, atcommand_enablenpc}, // []
+ {"@disablenpc", 80, atcommand_disablenpc}, // []
+ {"@servertime", 0, atcommand_servertime}, // by Yor
+ {"@chardelitem", 60, atcommand_chardelitem}, // by Yor
+ {"@listnearby", 40, atcommand_list_nearby}, // by Yor
+ {"@ignorelist", 0, atcommand_ignorelist}, // by Yor
+ {"@charignorelist", 20, atcommand_charignorelist}, // by Yor
+ {"@inall", 20, atcommand_inall}, // by Yor
+ {"@exall", 20, atcommand_exall}, // by Yor
+ {"@email", 0, atcommand_email}, // by Yor
+ {"@effect", 40, atcommand_effect}, // by Apple
+ {"@charitemlist", 40, atcommand_character_item_list}, // by Yor
+ {"@charstoragelist", 40, atcommand_character_storage_list}, // by Yor
+ {"@charcartlist", 40, atcommand_character_cart_list}, // by Yor
+ {"@addwarp", 20, atcommand_addwarp}, // by MouseJstr
+ {"@killer", 60, atcommand_killer}, // by MouseJstr
+ {"@npcmove", 20, atcommand_npcmove}, // by MouseJstr
+ {"@killable", 40, atcommand_killable}, // by MouseJstr
+ {"@charkillable", 40, atcommand_charkillable}, // by MouseJstr
+ {"@chareffect", 40, atcommand_chareffect}, // MouseJstr
+ {"@dropall", 40, atcommand_dropall}, // MouseJstr
+ {"@chardropall", 40, atcommand_chardropall}, // MouseJstr
+ {"@storeall", 40, atcommand_storeall}, // MouseJstr
+ {"@charstoreall", 40, atcommand_charstoreall}, // MouseJstr
+ {"@rain", 99, atcommand_rain},
+ {"@snow", 99, atcommand_snow},
+ {"@sakura", 99, atcommand_sakura},
+ {"@fog", 99, atcommand_fog},
+ {"@leaves", 99, atcommand_leaves},
+ {"@summon", 60, atcommand_summon},
+ {"@adjgmlvl", 99, atcommand_adjgmlvl},
+ {"@adjcmdlvl", 99, atcommand_adjcmdlvl},
+ {"@trade", 60, atcommand_trade},
+ {"@charwipe", 60, atcommand_char_wipe}, // [Fate]
+ {"@setmagic", 99, atcommand_set_magic}, // [Fate]
+ {"@magicinfo", 60, atcommand_magic_info}, // [Fate]
+ {"@log", 60, atcommand_log}, // [Fate]
+ {"@l", 60, atcommand_log}, // [Fate]
+ {"@tee", 60, atcommand_tee}, // [Fate]
+ {"@t", 60, atcommand_tee}, // [Fate]
+ {"@invisible", 60, atcommand_invisible}, // [Fate]
+ {"@visible", 60, atcommand_visible}, // [Fate]
+ {"@hugo", 60, atcommand_iterate_forward_over_players}, // [Fate]
+ {"@linus", 60, atcommand_iterate_backwards_over_players}, // [Fate]
+ {"@sp-info", 40, atcommand_skillpool_info}, // [Fate]
+ {"@sp-focus", 80, atcommand_skillpool_focus}, // [Fate]
+ {"@sp-unfocus", 80, atcommand_skillpool_unfocus}, // [Fate]
+ {"@skill-learn", 80, atcommand_skill_learn}, // [Fate]
+ {"@wgm", 0, atcommand_wgm},
+ {"@ipcheck", 60, atcommand_ipcheck},
+ {"@doomspot", 60, atcommand_doomspot},
// add new commands before this line
- {AtCommand_Unknown, NULL, 1, NULL}
+ {NULL, 1, NULL}
};
-/*====================================================
- * This function return the name of the job (by [Yor])
- *----------------------------------------------------
- */
-static
-const char *job_name (int pc_class)
-{
- switch (pc_class)
- {
- case 0:
- return "Novice";
- case 1:
- return "Swordsman";
- case 2:
- return "Mage";
- case 3:
- return "Archer";
- case 4:
- return "Acolyte";
- case 5:
- return "Merchant";
- case 6:
- return "Thief";
- case 7:
- return "Knight";
- case 8:
- return "Priest";
- case 9:
- return "Wizard";
- case 10:
- return "Blacksmith";
- case 11:
- return "Hunter";
- case 12:
- return "Assassin";
- case 13:
- return "Knight 2";
- case 14:
- return "Crusader";
- case 15:
- return "Monk";
- case 16:
- return "Sage";
- case 17:
- return "Rogue";
- case 18:
- return "Alchemist";
- case 19:
- return "Bard";
- case 20:
- return "Dancer";
- case 21:
- return "Crusader 2";
- case 22:
- return "Wedding";
- case 23:
- return "Super Novice";
- case 4001:
- return "Novice High";
- case 4002:
- return "Swordsman High";
- case 4003:
- return "Mage High";
- case 4004:
- return "Archer High";
- case 4005:
- return "Acolyte High";
- case 4006:
- return "Merchant High";
- case 4007:
- return "Thief High";
- case 4008:
- return "Lord Knight";
- case 4009:
- return "High Priest";
- case 4010:
- return "High Wizard";
- case 4011:
- return "Whitesmith";
- case 4012:
- return "Sniper";
- case 4013:
- return "Assassin Cross";
- case 4014:
- return "Peko Knight";
- case 4015:
- return "Paladin";
- case 4016:
- return "Champion";
- case 4017:
- return "Professor";
- case 4018:
- return "Stalker";
- case 4019:
- return "Creator";
- case 4020:
- return "Clown";
- case 4021:
- return "Gypsy";
- case 4022:
- return "Peko Paladin";
- case 4023:
- return "Baby Novice";
- case 4024:
- return "Baby Swordsman";
- case 4025:
- return "Baby Mage";
- case 4026:
- return "Baby Archer";
- case 4027:
- return "Baby Acolyte";
- case 4028:
- return "Baby Merchant";
- case 4029:
- return "Baby Thief";
- case 4030:
- return "Baby Knight";
- case 4031:
- return "Baby Priest";
- case 4032:
- return "Baby Wizard";
- case 4033:
- return "Baby Blacksmith";
- case 4034:
- return "Baby Hunter";
- case 4035:
- return "Baby Assassin";
- case 4036:
- return "Baby Peco Knight";
- case 4037:
- return "Baby Crusader";
- case 4038:
- return "Baby Monk";
- case 4039:
- return "Baby Sage";
- case 4040:
- return "Baby Rogue";
- case 4041:
- return "Baby Alchemist";
- case 4042:
- return "Baby Bard";
- case 4043:
- return "Baby Dancer";
- case 4044:
- return "Baby Peco Crusader";
- case 4045:
- return "Super Baby";
- }
- return "Unknown Job";
-}
-
/*==========================================
* get_atcommand_level @コマンドの必要レベルを取得
*------------------------------------------
*/
-int get_atcommand_level (const AtCommandType type)
+static
+int get_atcommand_level(const AtCommandInfo *type)
{
- int i;
-
- for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
- if (atcommand_info[i].type == type)
- return atcommand_info[i].level;
+ if (type)
+ return type->level;
return 100; // 100: command can not be used
}
+static
+FILE *get_gm_log();
+
/*========================================
* At-command logging
*/
-void log_atcommand (struct map_session_data *sd, const char *fmt, ...)
+void log_atcommand(struct map_session_data *sd, const_string cmd)
{
- char message[512];
- va_list ap;
-
- va_start (ap, fmt);
- vsnprintf (message, 511, fmt, ap);
- va_end (ap);
-
- gm_log ("%s(%d,%d) %s(%d) : %s", map[sd->bl.m].name, sd->bl.x,
- sd->bl.y, sd->status.name, sd->status.account_id, message);
+ FILE *fp = get_gm_log();
+ if (!fp)
+ return;
+ timestamp_seconds_buffer tmpstr;
+ stamp_time(tmpstr);
+ fprintf(fp, "[%s] %s(%d,%d) %s(%d) : ",
+ tmpstr,
+ map[sd->bl.m].name, sd->bl.x, sd->bl.y,
+ sd->status.name, sd->status.account_id);
+ fwrite(cmd.data(), 1, cmd.size(), fp);
}
char *gm_logfile_name = NULL;
@@ -603,202 +381,157 @@ char *gm_logfile_name = NULL;
* Log a timestamped line to GM log file
*------------------------------------------
*/
-void gm_log (const char *fmt, ...)
+FILE *get_gm_log()
{
- static int last_logfile_nr = 0;
- static FILE *gm_logfile = NULL;
- time_t time_v;
- struct tm ctime;
- int month, year, logfile_nr;
- char message[512];
- va_list ap;
-
if (!gm_logfile_name)
- return;
+ return NULL;
- va_start (ap, fmt);
- vsnprintf (message, 511, fmt, ap);
- va_end (ap);
+ struct tm ctime = TimeT::now();
- time (&time_v);
- gmtime_r (&time_v, &ctime);
+ int year = ctime.tm_year + 1900;
+ int month = ctime.tm_mon + 1;
+ int logfile_nr = (year * 12) + month;
- year = ctime.tm_year + 1900;
- month = ctime.tm_mon + 1;
- logfile_nr = (year * 12) + month;
+ static FILE *gm_logfile = NULL;
+ static int last_logfile_nr = 0;
+ if (logfile_nr == last_logfile_nr)
+ return gm_logfile;
+ last_logfile_nr = logfile_nr;
- if (logfile_nr != last_logfile_nr)
- {
- char *fullname = (char *)malloc (strlen (gm_logfile_name) + 10);
- sprintf (fullname, "%s.%04d-%02d", gm_logfile_name, year, month);
+ std::string fullname = STRPRINTF("%s.%04d-%02d",
+ gm_logfile_name, year, month);
- if (gm_logfile)
- fclose_ (gm_logfile);
+ if (gm_logfile)
+ fclose_(gm_logfile);
- gm_logfile = fopen_ (fullname, "a");
- free (fullname);
+ gm_logfile = fopen_(fullname.c_str(), "a");
- if (!gm_logfile)
- {
- perror ("GM log file");
- gm_logfile_name = NULL;
- }
- last_logfile_nr = logfile_nr;
+ if (!gm_logfile)
+ {
+ perror("GM log file");
+ gm_logfile_name = NULL;
}
-
- fprintf (gm_logfile, "[%04d-%02d-%02d %02d:%02d:%02d] %s\n",
- year, month, ctime.tm_mday, ctime.tm_hour,
- ctime.tm_min, ctime.tm_sec, message);
-
- fflush (gm_logfile);
+ return gm_logfile;
}
+static
+AtCommandInfo *atcommand(const int level, const char *message);
/*==========================================
*is_atcommand @コマンドに存在するかどうか確認する
*------------------------------------------
*/
-AtCommandType
-is_atcommand (const int fd, struct map_session_data *sd, const char *message,
- int gmlvl)
+bool is_atcommand(const int fd, struct map_session_data *sd,
+ const char *message, int gmlvl)
{
- AtCommandInfo info;
- AtCommandType type;
+ nullpo_retr(false, sd);
- nullpo_retr (AtCommand_None, sd);
+ if (!message || message[0] != '@')
+ return false;
- if (!message || !*message)
- return AtCommand_None;
+ AtCommandInfo *info = atcommand(gmlvl > 0 ? gmlvl : pc_isGM(sd), message);
- memset (&info, 0, sizeof (info));
+ if (!info)
+ {
+ std::string output = STRPRINTF("GM command not found: %s",
+ message);
+ clif_displaymessage(fd, output);
+ return true; // don't show in chat
+ }
- type = atcommand (gmlvl > 0 ? gmlvl : pc_isGM (sd), message, &info);
- if (type != AtCommand_None)
{
char command[100];
- char output[200];
const char *str = message;
const char *p = message;
- memset (command, '\0', sizeof (command));
- memset (output, '\0', sizeof (output));
- while (*p && !isspace (*p))
+ memset(command, '\0', sizeof(command));
+ while (*p && !isspace(*p))
p++;
- if (p - str >= sizeof (command)) // too long
- return AtCommand_Unknown;
- strncpy (command, str, p - str);
- while (isspace (*p))
+ if (p - str >= sizeof(command)) // too long
+ return true;
+ strncpy(command, str, p - str);
+ while (isspace(*p))
p++;
- if (type == AtCommand_Unknown || info.proc == NULL)
{
- sprintf (output, "%s is Unknown Command.", command);
- clif_displaymessage (fd, output);
- }
- else
- {
- if (info.proc (fd, sd, command, p) != 0)
+ if (info->proc(fd, sd, command, p) != 0)
{
// Command can not be executed
- sprintf (output, "%s failed.", command);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("%s failed.", command);
+ clif_displaymessage(fd, output);
}
else
{
- if (get_atcommand_level (type) != 0) // Don't log level 0 commands
- log_atcommand (sd, "%s %s", command, p);
+ if (get_atcommand_level(info) != 0) // Don't log level 0 commands
+ log_atcommand(sd, message);
}
}
- return info.type;
+ return true;
}
-
- return AtCommand_None;
}
/*==========================================
*
*------------------------------------------
*/
-AtCommandType atcommand (const int level, const char *message,
- struct AtCommandInfo * info)
+AtCommandInfo *atcommand(const int level, const char *message)
{
- char *p = (char *) message; // it's 'char' and not 'const char' to have possibility to modify the first character if necessary
+ const char *p = message;
- if (!info)
- return AtCommand_None;
if (battle_config.atc_gmonly != 0 && !level) // level = pc_isGM(sd)
- return AtCommand_None;
+ return nullptr;
if (!p || !*p)
{
- fprintf (stderr, "at command message is empty\n");
- return AtCommand_None;
+ FPRINTF(stderr, "at command message is empty\n");
+ return nullptr;
}
- if (*p == command_symbol)
+ if (*p == '@')
{ // check first char.
char command[101];
- int i = 0;
- memset (info, 0, sizeof (AtCommandInfo));
- sscanf (p, "%100s", command);
- command[sizeof (command) - 1] = '\0';
+ int i = 0;
+ sscanf(p, "%100s", command);
+ command[sizeof(command) - 1] = '\0';
- while (atcommand_info[i].type != AtCommand_Unknown)
+ while (atcommand_info[i].command)
{
- if (strcasecmp (command + 1, atcommand_info[i].command + 1) == 0
+ if (strcasecmp(command, atcommand_info[i].command) == 0
&& level >= atcommand_info[i].level)
{
- p[0] = atcommand_info[i].command[0]; // set correct first symbol for after.
- break;
+ return &atcommand_info[i];
}
i++;
}
-
- if (atcommand_info[i].type == AtCommand_Unknown)
- {
- // doesn't return Unknown if player is normal player (display the text, not display: unknown command)
- if (level == 0)
- return AtCommand_None;
- else
- return AtCommand_Unknown;
- }
- memcpy (info, &atcommand_info[i], sizeof atcommand_info[i]);
- }
- else
- {
- return AtCommand_None;
}
-
- return info->type;
+ return nullptr;
}
/*==========================================
*
*------------------------------------------
*/
-static int atkillmonster_sub (struct block_list *bl, va_list ap)
+static
+void atkillmonster_sub(struct block_list *bl, int flag)
{
- int flag = va_arg (ap, int);
-
- nullpo_retr (0, bl);
+ nullpo_retv(bl);
if (flag)
- mob_damage (NULL, (struct mob_data *) bl,
+ mob_damage(NULL, (struct mob_data *) bl,
((struct mob_data *) bl)->hp, 2);
else
- mob_delete ((struct mob_data *) bl);
-
- return 0;
+ mob_delete((struct mob_data *) bl);
}
/*==========================================
*
*------------------------------------------
*/
-static AtCommandInfo *get_atcommandinfo_byname (const char *name)
+static
+AtCommandInfo *get_atcommandinfo_byname(const char *name)
{
- int i;
+ int i;
- for (i = 0; atcommand_info[i].type != AtCommand_Unknown; i++)
- if (strcasecmp (atcommand_info[i].command + 1, name) == 0)
+ for (i = 0; atcommand_info[i].command; i++)
+ if (strcasecmp(atcommand_info[i].command + 1, name) == 0)
return &atcommand_info[i];
return NULL;
@@ -808,42 +541,39 @@ static AtCommandInfo *get_atcommandinfo_byname (const char *name)
*
*------------------------------------------
*/
-int atcommand_config_read (const char *cfgName)
+int atcommand_config_read(const char *cfgName)
{
char line[1024], w1[1024], w2[1024];
AtCommandInfo *p;
FILE *fp;
- if ((fp = fopen_ (cfgName, "r")) == NULL)
+ if ((fp = fopen_(cfgName, "r")) == NULL)
{
- printf ("At commands configuration file not found: %s\n", cfgName);
+ PRINTF("At commands configuration file not found: %s\n", cfgName);
return 1;
}
- while (fgets (line, sizeof (line) - 1, fp))
+ while (fgets(line, sizeof(line) - 1, fp))
{
if (line[0] == '/' && line[1] == '/')
continue;
- if (sscanf (line, "%1023[^:]:%1023s", w1, w2) != 2)
+ if (sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2)
continue;
- p = get_atcommandinfo_byname (w1);
+ p = get_atcommandinfo_byname(w1);
if (p != NULL)
{
- p->level = atoi (w2);
+ p->level = atoi(w2);
if (p->level > 100)
p->level = 100;
else if (p->level < 0)
p->level = 0;
}
- if (strcasecmp (w1, "import") == 0)
- atcommand_config_read (w2);
- else if (strcasecmp (w1, "command_symbol") == 0 && w2[0] > 31 && w2[0] != '/' && // symbol of standard ragnarok GM commands
- w2[0] != '%') // symbol of party chat speaking
- command_symbol = w2[0];
+ if (strcasecmp(w1, "import") == 0)
+ atcommand_config_read(w2);
}
- fclose_ (fp);
+ fclose_(fp);
return 0;
}
@@ -858,43 +588,43 @@ int atcommand_config_read (const char *cfgName)
* TAW Specific
*------------------------------------------
*/
-int atcommand_setup (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_setup(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char buf[256];
char character[100];
- int level = 1;
+ int level = 1;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &level, character) < 2)
+ || sscanf(message, "%d %99[^\n]", &level, character) < 2)
{
- clif_displaymessage (fd, "Usage: @setup <level> <char name>");
+ clif_displaymessage(fd, "Usage: @setup <level> <char name>");
return -1;
}
level--;
- snprintf (buf, 255, "-255 %s", character);
- atcommand_character_baselevel (fd, sd, "@charbaselvl", buf);
+ std::string buf;
+ buf = STRPRINTF("-255 %s", character);
+ atcommand_character_baselevel(fd, sd, "@charbaselvl", buf.c_str());
- snprintf (buf, 255, "%d %s", level, character);
- atcommand_character_baselevel (fd, sd, "@charbaselvl", buf);
+ buf = STRPRINTF("%d %s", level, character);
+ atcommand_character_baselevel(fd, sd, "@charbaselvl", buf.c_str());
// Emote skill
- snprintf (buf, 255, "1 1 %s", character);
- atcommand_skill_learn(fd, sd, "@skill-learn", buf);
+ buf = STRPRINTF("1 1 %s", character);
+ atcommand_skill_learn(fd, sd, "@skill-learn", buf.c_str());
// Trade skill
- snprintf (buf, 255, "2 1 %s", character);
- atcommand_skill_learn(fd, sd, "@skill-learn", buf);
+ buf = STRPRINTF("2 1 %s", character);
+ atcommand_skill_learn(fd, sd, "@skill-learn", buf.c_str());
// Party skill
- snprintf (buf, 255, "2 2 %s", character);
- atcommand_skill_learn(fd, sd, "@skill-learn", buf);
+ STRPRINTF("2 2 %s", character);
+ atcommand_skill_learn(fd, sd, "@skill-learn", buf.c_str());
- snprintf (buf, 255, "018-1.gat 24 98 %s", character);
- atcommand_charwarp (fd, sd, "@charwarp", buf);
+ STRPRINTF("018-1.gat 24 98 %s", character);
+ atcommand_charwarp(fd, sd, "@charwarp", buf.c_str());
return (0);
@@ -904,81 +634,81 @@ int atcommand_setup (const int fd, struct map_session_data *sd,
* @rura+
*------------------------------------------
*/
-int atcommand_charwarp (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charwarp(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char map_name[100];
char character[100];
- int x = 0, y = 0;
+ int x = 0, y = 0;
struct map_session_data *pl_sd;
- int m;
+ int m;
- memset (map_name, '\0', sizeof (map_name));
- memset (character, '\0', sizeof (character));
+ memset(map_name, '\0', sizeof(map_name));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%99s %d %d %99[^\n]", map_name, &x, &y,
+ || sscanf(message, "%99s %d %d %99[^\n]", map_name, &x, &y,
character) < 4)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Usage: @charwarp/@rura+ <mapname> <x> <y> <char name>");
return -1;
}
if (x <= 0)
- x = MRAND (399) + 1;
+ x = random_::in(1, 399);
if (y <= 0)
- y = MRAND (399) + 1;
- if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat)
- strcat (map_name, ".gat");
+ y = random_::in(1, 399);
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can rura+ only lower or same GM level
if (x > 0 && x < 800 && y > 0 && y < 800)
{
- m = map_mapname2mapid (map_name);
+ m = map_mapname2mapid(map_name);
if (m >= 0 && map[m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp someone to this map.");
return -1;
}
if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp this player from its actual map.");
return -1;
}
- if (pc_setpos (pl_sd, map_name, x, y, 3) == 0)
+ if (pc_setpos(pl_sd, map_name, x, y, BeingRemoveWhy::WARPED) == 0)
{
- clif_displaymessage (pl_sd->fd, "Warped.");
- clif_displaymessage (fd, "Player warped (message sends to player too).");
+ clif_displaymessage(pl_sd->fd, "Warped.");
+ clif_displaymessage(fd, "Player warped (message sends to player too).");
}
else
{
- clif_displaymessage (fd, "Map not found.");
+ clif_displaymessage(fd, "Map not found.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Coordinates out of range.");
+ clif_displaymessage(fd, "Coordinates out of range.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -989,59 +719,59 @@ int atcommand_charwarp (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_warp (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_warp(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char map_name[100];
- int x = 0, y = 0;
- int m;
+ int x = 0, y = 0;
+ int m;
- memset (map_name, '\0', sizeof (map_name));
+ memset(map_name, '\0', sizeof(map_name));
if (!message || !*message
- || sscanf (message, "%99s %d %d", map_name, &x, &y) < 1)
+ || sscanf(message, "%99s %d %d", map_name, &x, &y) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a map (usage: @warp <mapname> <x> <y>).");
return -1;
}
if (x <= 0)
- x = MRAND (399) + 1;
+ x = random_::in(1, 399);
if (y <= 0)
- y = MRAND (399) + 1;
+ y = random_::in(1, 399);
- if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat)
- strcat (map_name, ".gat");
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
if (x > 0 && x < 800 && y > 0 && y < 800)
{
- m = map_mapname2mapid (map_name);
+ m = map_mapname2mapid(map_name);
if (m >= 0 && map[m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you to this map.");
return -1;
}
if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you from your actual map.");
return -1;
}
- if (pc_setpos (sd, map_name, x, y, 3) == 0)
- clif_displaymessage (fd, "Warped.");
+ if (pc_setpos(sd, map_name, x, y, BeingRemoveWhy::WARPED) == 0)
+ clif_displaymessage(fd, "Warped.");
else
{
- clif_displaymessage (fd, "Map not found.");
+ clif_displaymessage(fd, "Map not found.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Coordinates out of range.");
+ clif_displaymessage(fd, "Coordinates out of range.");
return -1;
}
@@ -1052,31 +782,30 @@ int atcommand_warp (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_where (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_where(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- char output[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (sscanf (message, "%99[^\n]", character) < 1)
- strcpy (character, sd->status.name);
+ if (sscanf(message, "%99[^\n]", character) < 1)
+ strcpy(character, sd->status.name);
- if ((pl_sd = map_nick2sd (character)) != NULL &&
+ if ((pl_sd = map_nick2sd(character)) != NULL &&
!((battle_config.hide_GM_session
- || (pl_sd->status.option & OPTION_HIDE))
- && (pc_isGM (pl_sd) > pc_isGM (sd))))
+ || bool(pl_sd->status.option & Option::HIDE))
+ && (pc_isGM(pl_sd) > pc_isGM(sd))))
{ // you can look only lower or same level
- sprintf (output, "%s: %s (%d,%d)", pl_sd->status.name, pl_sd->mapname,
- pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("%s: %s (%d,%d)",
+ pl_sd->status.name,
+ pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -1087,46 +816,44 @@ int atcommand_where (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_goto (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_goto(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- char output[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @jumpto/@warpto/@goto <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you to the map of this player.");
return -1;
}
if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you from your actual map.");
return -1;
}
- pc_setpos (sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- sprintf (output, "Jump to %s", character);
- clif_displaymessage (fd, output);
+ pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, BeingRemoveWhy::WARPED);
+ std::string output = STRPRINTF("Jump to %s", character);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -1137,43 +864,39 @@ int atcommand_goto (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_jump (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_jump(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char output[200];
- int x = 0, y = 0;
-
- memset (output, '\0', sizeof (output));
-
- sscanf (message, "%d %d", &x, &y);
+ int x = 0, y = 0;
+ sscanf(message, "%d %d", &x, &y);
if (x <= 0)
- x = MRAND (399) + 1;
+ x = random_::in(1, 399);
if (y <= 0)
- y = MRAND (399) + 1;
+ y = random_::in(1, 399);
if (x > 0 && x < 800 && y > 0 && y < 800)
{
if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you to your actual map.");
return -1;
}
if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you from your actual map.");
return -1;
}
- pc_setpos (sd, sd->mapname, x, y, 3);
- sprintf (output, "Jump to %d %d", x, y);
- clif_displaymessage (fd, output);
+ pc_setpos(sd, sd->mapname, x, y, BeingRemoveWhy::WARPED);
+ std::string output = STRPRINTF("Jump to %d %d", x, y);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Coordinates out of range.");
+ clif_displaymessage(fd, "Coordinates out of range.");
return -1;
}
@@ -1184,53 +907,54 @@ int atcommand_jump (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_who (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_who(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char output[200];
struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
+ int i, j, count;
+ int pl_GM_level, GM_level;
char match_text[100];
char player_name[24];
- memset (output, '\0', sizeof (output));
- memset (match_text, '\0', sizeof (match_text));
- memset (player_name, '\0', sizeof (player_name));
+ memset(match_text, '\0', sizeof(match_text));
+ memset(player_name, '\0', sizeof(player_name));
- if (sscanf (message, "%99[^\n]", match_text) < 1)
- strcpy (match_text, "");
+ if (sscanf(message, "%99[^\n]", match_text) < 1)
+ strcpy(match_text, "");
for (j = 0; match_text[j]; j++)
- match_text[j] = tolower (match_text[j]);
+ match_text[j] = tolower(match_text[j]);
count = 0;
- GM_level = pc_isGM (sd);
+ GM_level = pc_isGM(sd);
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
- pl_GM_level = pc_isGM (pl_sd);
+ pl_GM_level = pc_isGM(pl_sd);
if (!
((battle_config.hide_GM_session
- || (pl_sd->status.option & OPTION_HIDE))
+ || bool(pl_sd->status.option & Option::HIDE))
&& (pl_GM_level > GM_level)))
{ // you can look only lower or same level
- memcpy (player_name, pl_sd->status.name, 24);
+ memcpy(player_name, pl_sd->status.name, 24);
for (j = 0; player_name[j]; j++)
- player_name[j] = tolower (player_name[j]);
- if (strstr (player_name, match_text) != NULL)
- { // search with no case sensitive
+ player_name[j] = tolower(player_name[j]);
+ if (strstr(player_name, match_text) != NULL)
+ {
+ // search with no case sensitive
+ std::string output;
if (pl_GM_level > 0)
- sprintf (output,
- "Name: %s (GM:%d) | Location: %s %d %d",
- pl_sd->status.name, pl_GM_level,
- pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ output = STRPRINTF(
+ "Name: %s (GM:%d) | Location: %s %d %d",
+ pl_sd->status.name, pl_GM_level,
+ pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
else
- sprintf (output, "Name: %s | Location: %s %d %d",
- pl_sd->status.name, pl_sd->mapname,
- pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage (fd, output);
+ output = STRPRINTF(
+ "Name: %s | Location: %s %d %d",
+ pl_sd->status.name, pl_sd->mapname,
+ pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
count++;
}
}
@@ -1238,13 +962,13 @@ int atcommand_who (const int fd, struct map_session_data *sd,
}
if (count == 0)
- clif_displaymessage (fd, "No player found.");
+ clif_displaymessage(fd, "No player found.");
else if (count == 1)
- clif_displaymessage (fd, "1 player found.");
+ clif_displaymessage(fd, "1 player found.");
else
{
- sprintf (output, "%d players found.", count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("%d players found.", count);
+ clif_displaymessage(fd, output);
}
return 0;
@@ -1254,69 +978,50 @@ int atcommand_who (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_whogroup (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_whogroup(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char temp0[100];
- char temp1[100];
- char output[200];
struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
+ int i, j, count;
+ int pl_GM_level, GM_level;
char match_text[100];
char player_name[24];
- struct guild *g;
struct party *p;
- memset (temp0, '\0', sizeof (temp0));
- memset (temp1, '\0', sizeof (temp1));
- memset (output, '\0', sizeof (output));
- memset (match_text, '\0', sizeof (match_text));
- memset (player_name, '\0', sizeof (player_name));
+ memset(match_text, '\0', sizeof(match_text));
+ memset(player_name, '\0', sizeof(player_name));
- if (sscanf (message, "%99[^\n]", match_text) < 1)
- strcpy (match_text, "");
+ if (sscanf(message, "%99[^\n]", match_text) < 1)
+ strcpy(match_text, "");
for (j = 0; match_text[j]; j++)
- match_text[j] = tolower (match_text[j]);
+ match_text[j] = tolower(match_text[j]);
count = 0;
- GM_level = pc_isGM (sd);
+ GM_level = pc_isGM(sd);
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
- pl_GM_level = pc_isGM (pl_sd);
+ pl_GM_level = pc_isGM(pl_sd);
if (!
((battle_config.hide_GM_session
- || (pl_sd->status.option & OPTION_HIDE))
+ || bool(pl_sd->status.option & Option::HIDE))
&& (pl_GM_level > GM_level)))
{ // you can look only lower or same level
- memcpy (player_name, pl_sd->status.name, 24);
+ memcpy(player_name, pl_sd->status.name, 24);
for (j = 0; player_name[j]; j++)
- player_name[j] = tolower (player_name[j]);
- if (strstr (player_name, match_text) != NULL)
+ player_name[j] = tolower(player_name[j]);
+ if (strstr(player_name, match_text) != NULL)
{ // search with no case sensitive
- g = guild_search (pl_sd->status.guild_id);
- if (g == NULL)
- sprintf (temp1, "None");
- else
- sprintf (temp1, "%s", g->name);
- p = party_search (pl_sd->status.party_id);
- if (p == NULL)
- sprintf (temp0, "None");
- else
- sprintf (temp0, "%s", p->name);
+ p = party_search(pl_sd->status.party_id);
+ const char *temp0 = p ? p->name : "None";
+ std::string output;
if (pl_GM_level > 0)
- sprintf (output,
- "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'",
- pl_sd->status.name, pl_GM_level, temp0,
- temp1);
- else
- sprintf (output,
- "Name: %s | Party: '%s' | Guild: '%s'",
- pl_sd->status.name, temp0, temp1);
- clif_displaymessage (fd, output);
+ output = STRPRINTF(
+ "Name: %s (GM:%d) | Party: '%s'",
+ pl_sd->status.name, pl_GM_level, temp0);
+ clif_displaymessage(fd, output);
count++;
}
}
@@ -1324,13 +1029,13 @@ int atcommand_whogroup (const int fd, struct map_session_data *sd,
}
if (count == 0)
- clif_displaymessage (fd, "No player found.");
+ clif_displaymessage(fd, "No player found.");
else if (count == 1)
- clif_displaymessage (fd, "1 player found.");
+ clif_displaymessage(fd, "1 player found.");
else
{
- sprintf (output, "%d players found.", count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("%d players found.", count);
+ clif_displaymessage(fd, output);
}
return 0;
@@ -1340,70 +1045,64 @@ int atcommand_whogroup (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_whomap (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_whomap(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char output[200];
struct map_session_data *pl_sd;
- int i, count;
- int pl_GM_level, GM_level;
- int map_id;
+ int i, count;
+ int pl_GM_level, GM_level;
+ int map_id;
char map_name[100];
- memset (output, '\0', sizeof (output));
- memset (map_name, '\0', sizeof (map_name));
+ memset(map_name, '\0', sizeof(map_name));
if (!message || !*message)
map_id = sd->bl.m;
else
{
- sscanf (message, "%99s", map_name);
- if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat)
- strcat (map_name, ".gat");
- if ((map_id = map_mapname2mapid (map_name)) < 0)
+ sscanf(message, "%99s", map_name);
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+ if ((map_id = map_mapname2mapid(map_name)) < 0)
map_id = sd->bl.m;
}
count = 0;
- GM_level = pc_isGM (sd);
+ GM_level = pc_isGM(sd);
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
- pl_GM_level = pc_isGM (pl_sd);
+ pl_GM_level = pc_isGM(pl_sd);
if (!
((battle_config.hide_GM_session
- || (pl_sd->status.option & OPTION_HIDE))
+ || bool(pl_sd->status.option & Option::HIDE))
&& (pl_GM_level > GM_level)))
{ // you can look only lower or same level
if (pl_sd->bl.m == map_id)
{
+ std::string output;
if (pl_GM_level > 0)
- sprintf (output,
- "Name: %s (GM:%d) | Location: %s %d %d",
- pl_sd->status.name, pl_GM_level,
- pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ output = STRPRINTF(
+ "Name: %s (GM:%d) | Location: %s %d %d",
+ pl_sd->status.name, pl_GM_level,
+ pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
else
- sprintf (output, "Name: %s | Location: %s %d %d",
- pl_sd->status.name, pl_sd->mapname,
- pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage (fd, output);
+ output = STRPRINTF(
+ "Name: %s | Location: %s %d %d",
+ pl_sd->status.name, pl_sd->mapname,
+ pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
count++;
}
}
}
}
- if (count == 0)
- sprintf (output, "No player found in map '%s'.", map[map_id].name);
- else if (count == 1)
- sprintf (output, "1 player found in map '%s'.", map[map_id].name);
- else
- {
- sprintf (output, "%d players found in map '%s'.", count, map[map_id].name);
- }
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("%d players found in map '%s'.",
+ count, map[map_id].name);
+ clif_displaymessage(fd, output);
return 0;
}
@@ -1412,86 +1111,71 @@ int atcommand_whomap (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_whomapgroup (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_whomapgroup(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char temp0[100];
- char temp1[100];
- char output[200];
struct map_session_data *pl_sd;
- int i, count;
- int pl_GM_level, GM_level;
- int map_id = 0;
+ int i, count;
+ int pl_GM_level, GM_level;
+ int map_id = 0;
char map_name[100];
- struct guild *g;
struct party *p;
- memset (temp0, '\0', sizeof (temp0));
- memset (temp1, '\0', sizeof (temp1));
- memset (output, '\0', sizeof (output));
- memset (map_name, '\0', sizeof (map_name));
+ memset(map_name, '\0', sizeof(map_name));
if (!message || !*message)
map_id = sd->bl.m;
else
{
- sscanf (message, "%99s", map_name);
- if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat)
- strcat (map_name, ".gat");
- if ((map_id = map_mapname2mapid (map_name)) < 0)
+ sscanf(message, "%99s", map_name);
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+ if ((map_id = map_mapname2mapid(map_name)) < 0)
map_id = sd->bl.m;
}
count = 0;
- GM_level = pc_isGM (sd);
+ GM_level = pc_isGM(sd);
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
- pl_GM_level = pc_isGM (pl_sd);
+ pl_GM_level = pc_isGM(pl_sd);
if (!
((battle_config.hide_GM_session
- || (pl_sd->status.option & OPTION_HIDE))
+ || bool(pl_sd->status.option & Option::HIDE))
&& (pl_GM_level > GM_level)))
- { // you can look only lower or same level
+ {
+ // you can look only lower or same level
if (pl_sd->bl.m == map_id)
{
- g = guild_search (pl_sd->status.guild_id);
- if (g == NULL)
- sprintf (temp1, "None");
- else
- sprintf (temp1, "%s", g->name);
- p = party_search (pl_sd->status.party_id);
- if (p == NULL)
- sprintf (temp0, "None");
- else
- sprintf (temp0, "%s", p->name);
+ p = party_search(pl_sd->status.party_id);
+ const char *temp0 = p ? p->name : "None";
+ std::string output;
if (pl_GM_level > 0)
- sprintf (output,
- "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'",
- pl_sd->status.name, pl_GM_level, temp0,
- temp1);
+ output = STRPRINTF("Name: %s (GM:%d) | Party: '%s'",
+ pl_sd->status.name, pl_GM_level, temp0);
else
- sprintf (output,
- "Name: %s | Party: '%s' | Guild: '%s'",
- pl_sd->status.name, temp0, temp1);
- clif_displaymessage (fd, output);
+ output = STRPRINTF("Name: %s | Party: '%s'",
+ pl_sd->status.name, temp0);
+ clif_displaymessage(fd, output);
count++;
}
}
}
}
+ std::string output;
if (count == 0)
- sprintf (output, "No player found in map '%s'.", map[map_id].name);
+ output = STRPRINTF("No player found in map '%s'.", map[map_id].name);
else if (count == 1)
- sprintf (output, "1 player found in map '%s'.", map[map_id].name);
+ output = STRPRINTF("1 player found in map '%s'.", map[map_id].name);
else
{
- sprintf (output, "%d players found in map '%s'.", count, map[map_id].name);
+ output = STRPRINTF("%d players found in map '%s'.", count, map[map_id].name);
}
- clif_displaymessage (fd, output);
+ clif_displaymessage(fd, output);
return 0;
}
@@ -1500,75 +1184,64 @@ int atcommand_whomapgroup (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_whogm (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_whogm(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char temp0[100];
- char temp1[100];
- char output[200];
struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
+ int i, j, count;
+ int pl_GM_level, GM_level;
char match_text[100];
char player_name[24];
- struct guild *g;
struct party *p;
- memset (temp0, '\0', sizeof (temp0));
- memset (temp1, '\0', sizeof (temp1));
- memset (output, '\0', sizeof (output));
- memset (match_text, '\0', sizeof (match_text));
- memset (player_name, '\0', sizeof (player_name));
+ memset(match_text, '\0', sizeof(match_text));
+ memset(player_name, '\0', sizeof(player_name));
- if (sscanf (message, "%99[^\n]", match_text) < 1)
- strcpy (match_text, "");
+ if (sscanf(message, "%99[^\n]", match_text) < 1)
+ strcpy(match_text, "");
for (j = 0; match_text[j]; j++)
- match_text[j] = tolower (match_text[j]);
+ match_text[j] = tolower(match_text[j]);
count = 0;
- GM_level = pc_isGM (sd);
+ GM_level = pc_isGM(sd);
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
- pl_GM_level = pc_isGM (pl_sd);
+ pl_GM_level = pc_isGM(pl_sd);
if (pl_GM_level > 0)
{
if (!
((battle_config.hide_GM_session
- || (pl_sd->status.option & OPTION_HIDE))
+ || bool(pl_sd->status.option & Option::HIDE))
&& (pl_GM_level > GM_level)))
- { // you can look only lower or same level
- memcpy (player_name, pl_sd->status.name, 24);
+ {
+ // you can look only lower or same level
+ memcpy(player_name, pl_sd->status.name, 24);
for (j = 0; player_name[j]; j++)
- player_name[j] = tolower (player_name[j]);
- if (strstr (player_name, match_text) != NULL)
- { // search with no case sensitive
- sprintf (output,
- "Name: %s (GM:%d) | Location: %s %d %d",
- pl_sd->status.name, pl_GM_level,
- pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage (fd, output);
- sprintf (output,
- " BLvl: %d | Job: %s (Lvl: %d)",
- pl_sd->status.base_level,
- job_name (pl_sd->status.pc_class),
- pl_sd->status.job_level);
- clif_displaymessage (fd, output);
- g = guild_search (pl_sd->status.guild_id);
- if (g == NULL)
- sprintf (temp1, "None");
- else
- sprintf (temp1, "%s", g->name);
- p = party_search (pl_sd->status.party_id);
- if (p == NULL)
- sprintf (temp0, "None");
- else
- sprintf (temp0, "%s", p->name);
- sprintf (output, " Party: '%s' | Guild: '%s'",
- temp0, temp1);
- clif_displaymessage (fd, output);
+ player_name[j] = tolower(player_name[j]);
+ if (strstr(player_name, match_text) != NULL)
+ {
+ // search with no case sensitive
+ std::string output;
+ output = STRPRINTF(
+ "Name: %s (GM:%d) | Location: %s %d %d",
+ pl_sd->status.name, pl_GM_level,
+ pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF(
+ " BLvl: %d | Job: %s (Lvl: %d)",
+ pl_sd->status.base_level,
+ "Novice/Human",
+ pl_sd->status.job_level);
+ clif_displaymessage(fd, output);
+ p = party_search(pl_sd->status.party_id);
+ const char *temp0 = p ? p->name : "None";
+ output = STRPRINTF(
+ " Party: '%s'",
+ temp0);
+ clif_displaymessage(fd, output);
count++;
}
}
@@ -1577,13 +1250,13 @@ int atcommand_whogm (const int fd, struct map_session_data *sd,
}
if (count == 0)
- clif_displaymessage (fd, "No GM found.");
+ clif_displaymessage(fd, "No GM found.");
else if (count == 1)
- clif_displaymessage (fd, "1 GM found.");
+ clif_displaymessage(fd, "1 GM found.");
else
{
- sprintf (output, "%d GMs found.", count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("%d GMs found.", count);
+ clif_displaymessage(fd, output);
}
return 0;
@@ -1593,15 +1266,15 @@ int atcommand_whogm (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_save (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_save(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
- pc_setsavepoint (sd, sd->mapname, sd->bl.x, sd->bl.y);
- pc_makesavestatus (sd);
- chrif_save (sd);
- clif_displaymessage (fd, "Character data respawn point saved.");
+ pc_setsavepoint(sd, sd->mapname, sd->bl.x, sd->bl.y);
+ pc_makesavestatus(sd);
+ chrif_save(sd);
+ clif_displaymessage(fd, "Character data respawn point saved.");
return 0;
}
@@ -1610,30 +1283,30 @@ int atcommand_save (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_load (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_load(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
- int m;
+ int m;
- m = map_mapname2mapid (sd->status.save_point.map);
+ m = map_mapname2mapid(sd->status.save_point.map);
if (m >= 0 && map[m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you to your save map.");
return -1;
}
if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you from your actual map.");
return -1;
}
- pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x,
- sd->status.save_point.y, 0);
- clif_displaymessage (fd, "Warping to respawn point.");
+ pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x,
+ sd->status.save_point.y, BeingRemoveWhy::GONE);
+ clif_displaymessage(fd, "Warping to respawn point.");
return 0;
}
@@ -1642,38 +1315,35 @@ int atcommand_load (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_speed (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_speed(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char output[200];
- int speed;
-
- memset (output, '\0', sizeof (output));
-
if (!message || !*message)
{
- sprintf (output,
- "Please, enter a speed value (usage: @speed <%d-%d>).",
- MIN_WALK_SPEED, MAX_WALK_SPEED);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "Please, enter a speed value (usage: @speed <%d-%d>).",
+ static_cast<uint32_t>(MIN_WALK_SPEED.count()),
+ static_cast<uint32_t>(MAX_WALK_SPEED.count()));
+ clif_displaymessage(fd, output);
return -1;
}
- speed = atoi (message);
+ interval_t speed = static_cast<interval_t>(atoi(message));
if (speed >= MIN_WALK_SPEED && speed <= MAX_WALK_SPEED)
{
sd->speed = speed;
//sd->walktimer = x;
//この文を追加 by れ
- clif_updatestatus (sd, SP_SPEED);
- clif_displaymessage (fd, "Speed changed.");
+ clif_updatestatus(sd, SP::SPEED);
+ clif_displaymessage(fd, "Speed changed.");
}
else
{
- sprintf (output,
- "Please, enter a valid speed value (usage: @speed <%d-%d>).",
- MIN_WALK_SPEED, MAX_WALK_SPEED);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "Please, enter a valid speed value (usage: @speed <%d-%d>).",
+ static_cast<uint32_t>(MIN_WALK_SPEED.count()),
+ static_cast<uint32_t>(MAX_WALK_SPEED.count()));
+ clif_displaymessage(fd, output);
return -1;
}
@@ -1684,26 +1354,26 @@ int atcommand_speed (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_storage (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_storage(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
struct storage *stor; //changes from Freya/Yor
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
- if (sd->state.storage_flag)
+ if (sd->state.storage_open)
{
- clif_displaymessage (fd, "msg_table[250]");
+ clif_displaymessage(fd, "msg_table[250]");
return -1;
}
- if ((stor = account2storage2 (sd->status.account_id)) != NULL
+ if ((stor = account2storage2(sd->status.account_id)) != NULL
&& stor->storage_status == 1)
{
- clif_displaymessage (fd, "msg_table[250]");
+ clif_displaymessage(fd, "msg_table[250]");
return -1;
}
- storage_storageopen (sd);
+ storage_storageopen(sd);
return 0;
}
@@ -1712,107 +1382,32 @@ int atcommand_storage (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_guildstorage (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_option(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- struct storage *stor; //changes from Freya/Yor
- nullpo_retr (-1, sd);
-
- if (sd->status.guild_id > 0)
- {
- if (sd->state.storage_flag)
- {
- clif_displaymessage (fd, "msg_table[251]");
- return -1;
- }
- if ((stor = account2storage2 (sd->status.account_id)) != NULL
- && stor->storage_status == 1)
- {
- clif_displaymessage (fd, "msg_table[251]");
- return -1;
- }
- storage_guild_storageopen (sd);
- }
- else
- {
- clif_displaymessage (fd, "msg_table[252]");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_option (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- int param1 = 0, param2 = 0, param3 = 0;
- nullpo_retr (-1, sd);
+ int param1_ = 0, param2_ = 0, param3_ = 0;
+ nullpo_retr(-1, sd);
if (!message || !*message
- || sscanf (message, "%d %d %d", &param1, &param2, &param3) < 1
- || param1 < 0 || param2 < 0 || param3 < 0)
+ || sscanf(message, "%d %d %d", &param1_, &param2_, &param3_) < 1
+ || param1_ < 0 || param2_ < 0 || param3_ < 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter at least a option (usage: @option <param1:0+> <param2:0+> <param3:0+>).");
return -1;
}
+ Opt1 param1 = Opt1(param1_);
+ Opt2 param2 = Opt2(param2_);
+ Option param3 = Option(param3_);
+
sd->opt1 = param1;
sd->opt2 = param2;
- if (!(sd->status.option & CART_MASK) && param3 & CART_MASK)
- {
- clif_cart_itemlist (sd);
- clif_cart_equiplist (sd);
- clif_updatestatus (sd, SP_CARTINFO);
- }
sd->status.option = param3;
- // fix pecopeco display
- 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;
- 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;
- }
- }
- 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 &= ~0x0020;
- }
- 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 &= ~0x0020;
- }
- }
- }
- clif_changeoption (&sd->bl);
- pc_calcstatus (sd, 0);
- clif_displaymessage (fd, "Options changed.");
+ clif_changeoption(&sd->bl);
+ pc_calcstatus(sd, 0);
+ clif_displaymessage(fd, "Options changed.");
return 0;
}
@@ -1821,20 +1416,20 @@ int atcommand_option (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_hide (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_hide(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
- if (sd->status.option & OPTION_HIDE)
+ if (bool(sd->status.option & Option::HIDE))
{
- sd->status.option &= ~OPTION_HIDE;
- clif_displaymessage (fd, "Invisible: Off."); // Invisible: Off
+ sd->status.option &= ~Option::HIDE;
+ clif_displaymessage(fd, "Invisible: Off."); // Invisible: Off
}
else
{
- sd->status.option |= OPTION_HIDE;
- clif_displaymessage (fd, "Invisible: On."); // Invisible: On
+ sd->status.option |= Option::HIDE;
+ clif_displaymessage(fd, "Invisible: On."); // Invisible: On
}
- clif_changeoption (&sd->bl);
+ clif_changeoption(&sd->bl);
return 0;
}
@@ -1843,11 +1438,11 @@ int atcommand_hide (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_die (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_die(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
- pc_damage (NULL, sd, sd->status.hp + 1);
- clif_displaymessage (fd, "A pity! You've died.");
+ pc_damage(NULL, sd, sd->status.hp + 1);
+ clif_displaymessage(fd, "A pity! You've died.");
return 0;
}
@@ -1856,37 +1451,37 @@ int atcommand_die (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_kill (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_kill(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));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @kill <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can kill only lower or same level
- pc_damage (NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage (fd, "Character killed.");
+ pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
+ clif_displaymessage(fd, "Character killed.");
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -1897,18 +1492,18 @@ int atcommand_kill (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_alive (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_alive(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
sd->status.hp = sd->status.max_hp;
sd->status.sp = sd->status.max_sp;
- pc_setstand (sd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer (sd, battle_config.pc_invincible_time);
- clif_updatestatus (sd, SP_HP);
- clif_updatestatus (sd, SP_SP);
- clif_resurrection (&sd->bl, 1);
- clif_displaymessage (fd, "You've been revived! It's a miracle!");
+ pc_setstand(sd);
+ if (static_cast<interval_t>(battle_config.pc_invincible_time) > interval_t::zero())
+ pc_setinvincibletimer(sd, static_cast<interval_t>(battle_config.pc_invincible_time));
+ clif_updatestatus(sd, SP::HP);
+ clif_updatestatus(sd, SP::SP);
+ clif_resurrection(&sd->bl, 1);
+ clif_displaymessage(fd, "You've been revived! It's a miracle!");
return 0;
}
@@ -1917,22 +1512,17 @@ int atcommand_alive (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_kami (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_kami(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
- char output[200];
-
- memset (output, '\0', sizeof (output));
-
if (!message || !*message)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a message (usage: @kami <message>).");
return -1;
}
- sscanf (message, "%199[^\n]", output);
- intif_GMmessage (output, strlen (output) + 1, 0);
+ intif_GMmessage(message, 0);
return 0;
}
@@ -1941,12 +1531,12 @@ int atcommand_kami (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_heal (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_heal(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int hp = 0, sp = 0; // [Valaris] thanks to fov
+ int hp = 0, sp = 0; // [Valaris] thanks to fov
- sscanf (message, "%d %d", &hp, &sp);
+ sscanf(message, "%d %d", &hp, &sp);
if (hp == 0 && sp == 0)
{
@@ -1965,24 +1555,20 @@ int atcommand_heal (const int fd, struct map_session_data *sd,
sp = 1 - sd->status.sp;
}
- if (hp > 0) // display like heal
- clif_heal (fd, SP_HP, hp);
- else if (hp < 0) // display like damage
- clif_damage (&sd->bl, &sd->bl, gettick (), 0, 0, -hp, 0, 4, 0);
- if (sp > 0) // no display when we lost SP
- clif_heal (fd, SP_SP, sp);
+ if (hp < 0) // display like damage
+ clif_damage(&sd->bl, &sd->bl, gettick(), interval_t::zero(), interval_t::zero(), -hp, 0, DamageType::RETURNED, 0);
if (hp != 0 || sp != 0)
{
- pc_heal (sd, hp, sp);
+ pc_heal(sd, hp, sp);
if (hp >= 0 && sp >= 0)
- clif_displaymessage (fd, "HP, SP recovered.");
+ clif_displaymessage(fd, "HP, SP recovered.");
else
- clif_displaymessage (fd, "HP or/and SP modified.");
+ clif_displaymessage(fd, "HP or/and SP modified.");
}
else
{
- clif_displaymessage (fd, "HP and SP are already with the good value.");
+ clif_displaymessage(fd, "HP and SP are already with the good value.");
return -1;
}
@@ -1993,21 +1579,21 @@ int atcommand_heal (const int fd, struct map_session_data *sd,
* @item command (usage: @item <name/id_of_item> <quantity>)
*------------------------------------------
*/
-int atcommand_item (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_item(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char item_name[100];
- int number = 0, item_id, flag;
+ int number = 0, item_id;
struct item item_tmp;
struct item_data *item_data;
- int get_count, i;
+ int get_count, i;
- memset (item_name, '\0', sizeof (item_name));
+ memset(item_name, '\0', sizeof(item_name));
if (!message || !*message
- || sscanf (message, "%99s %d", item_name, &number) < 1)
+ || sscanf(message, "%99s %d", item_name, &number) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter an item name/id (usage: @item <item name or ID> [quantity]).");
return -1;
}
@@ -2016,33 +1602,35 @@ int atcommand_item (const int fd, struct map_session_data *sd,
number = 1;
item_id = 0;
- if ((item_data = itemdb_searchname (item_name)) != NULL ||
- (item_data = itemdb_exists (atoi (item_name))) != NULL)
+ if ((item_data = itemdb_searchname(item_name)) != NULL ||
+ (item_data = itemdb_exists(atoi(item_name))) != NULL)
item_id = item_data->nameid;
if (item_id >= 500)
{
get_count = number;
- if (item_data->type == 4 || item_data->type == 5 ||
- item_data->type == 7 || item_data->type == 8)
+ if (item_data->type == ItemType::WEAPON
+ || item_data->type == ItemType::ARMOR
+ || item_data->type == ItemType::_7
+ || item_data->type == ItemType::_8)
{
get_count = 1;
}
for (i = 0; i < number; i += get_count)
{
- memset (&item_tmp, 0, sizeof (item_tmp));
+ memset(&item_tmp, 0, sizeof(item_tmp));
item_tmp.nameid = item_id;
item_tmp.identify = 1;
- if ((flag =
- pc_additem ((struct map_session_data *) sd, &item_tmp,
- get_count)))
- clif_additem ((struct map_session_data *) sd, 0, 0, flag);
+ PickupFail flag;
+ if ((flag = pc_additem(sd, &item_tmp, get_count))
+ != PickupFail::OKAY)
+ clif_additem(sd, 0, 0, flag);
}
- clif_displaymessage (fd, "Item created.");
+ clif_displaymessage(fd, "Item created.");
}
else
{
- clif_displaymessage (fd, "Invalid item ID or name.");
+ clif_displaymessage(fd, "Invalid item ID or name.");
return -1;
}
@@ -2053,18 +1641,18 @@ int atcommand_item (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_itemreset (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_itemreset(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
- int i;
+ int i;
for (i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].amount
- && sd->status.inventory[i].equip == 0)
- pc_delitem (sd, i, sd->status.inventory[i].amount, 0);
+ && sd->status.inventory[i].equip == EPOS::ZERO)
+ pc_delitem(sd, i, sd->status.inventory[i].amount, 0);
}
- clif_displaymessage (fd, "All of your items have been removed.");
+ clif_displaymessage(fd, "All of your items have been removed.");
return 0;
}
@@ -2073,10 +1661,10 @@ int atcommand_itemreset (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_itemcheck (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_itemcheck(const int, struct map_session_data *sd,
+ const char *, const char *)
{
- pc_checkitem (sd);
+ pc_checkitem(sd);
return 0;
}
@@ -2085,14 +1673,14 @@ int atcommand_itemcheck (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_baselevelup (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_baselevelup(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int level, i;
+ int level, i;
- if (!message || !*message || (level = atoi (message)) == 0)
+ if (!message || !*message || (level = atoi(message)) == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a level adjustement (usage: @blvl <number of levels>).");
return -1;
}
@@ -2101,7 +1689,7 @@ int atcommand_baselevelup (const int fd, struct map_session_data *sd,
{
if (sd->status.base_level == battle_config.maximum_level)
{ // check for max level by Valaris
- clif_displaymessage (fd, "Base level can't go any higher.");
+ clif_displaymessage(fd, "Base level can't go any higher.");
return -1;
} // End Addition
if (level > battle_config.maximum_level || level > (battle_config.maximum_level - sd->status.base_level)) // fix positiv overflow
@@ -2109,19 +1697,19 @@ int atcommand_baselevelup (const int fd, struct map_session_data *sd,
for (i = 1; i <= level; i++)
sd->status.status_point += (sd->status.base_level + i + 14) / 4;
sd->status.base_level += level;
- clif_updatestatus (sd, SP_BASELEVEL);
- clif_updatestatus (sd, SP_NEXTBASEEXP);
- clif_updatestatus (sd, SP_STATUSPOINT);
- pc_calcstatus (sd, 0);
- pc_heal (sd, sd->status.max_hp, sd->status.max_sp);
- clif_misceffect (&sd->bl, 0);
- clif_displaymessage (fd, "Base level raised.");
+ clif_updatestatus(sd, SP::BASELEVEL);
+ clif_updatestatus(sd, SP::NEXTBASEEXP);
+ clif_updatestatus(sd, SP::STATUSPOINT);
+ pc_calcstatus(sd, 0);
+ pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
+ clif_misceffect(&sd->bl, 0);
+ clif_displaymessage(fd, "Base level raised.");
}
else
{
if (sd->status.base_level == 1)
{
- clif_displaymessage (fd, "Base level can't go any lower.");
+ clif_displaymessage(fd, "Base level can't go any lower.");
return -1;
}
if (level < -battle_config.maximum_level || level < (1 - sd->status.base_level)) // fix negativ overflow
@@ -2133,13 +1721,13 @@ int atcommand_baselevelup (const int fd, struct map_session_data *sd,
(sd->status.base_level + i + 14) / 4;
if (sd->status.status_point < 0)
sd->status.status_point = 0;
- clif_updatestatus (sd, SP_STATUSPOINT);
+ clif_updatestatus(sd, SP::STATUSPOINT);
} // to add: remove status points from stats
sd->status.base_level += level;
- clif_updatestatus (sd, SP_BASELEVEL);
- clif_updatestatus (sd, SP_NEXTBASEEXP);
- pc_calcstatus (sd, 0);
- clif_displaymessage (fd, "Base level lowered.");
+ clif_updatestatus(sd, SP::BASELEVEL);
+ clif_updatestatus(sd, SP::NEXTBASEEXP);
+ pc_calcstatus(sd, 0);
+ clif_displaymessage(fd, "Base level lowered.");
}
return 0;
@@ -2149,63 +1737,61 @@ int atcommand_baselevelup (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_joblevelup (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+// TODO: merge this with pc_setparam(SP::JOBLEVEL)
+// then fix the funny 50 and/or 10 limitation.
+int atcommand_joblevelup(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int up_level = 50, level;
+ int up_level = 50, level;
- if (!message || !*message || (level = atoi (message)) == 0)
+ if (!message || !*message || (level = atoi(message)) == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a level adjustement (usage: @jlvl <number of levels>).");
return -1;
}
- if (sd->status.pc_class == 0 || sd->status.pc_class == 4001)
- up_level -= 40;
- else if ((sd->status.pc_class > 4007 && sd->status.pc_class < 4024)
- || sd->status.pc_class == 23)
- up_level += 20;
+ up_level -= 40;
if (level > 0)
{
if (sd->status.job_level == up_level)
{
- clif_displaymessage (fd, "Job level can't go any higher.");
+ clif_displaymessage(fd, "Job level can't go any higher.");
return -1;
}
if (level > up_level || level > (up_level - sd->status.job_level)) // fix positiv overflow
level = up_level - sd->status.job_level;
sd->status.job_level += level;
- clif_updatestatus (sd, SP_JOBLEVEL);
- clif_updatestatus (sd, SP_NEXTJOBEXP);
+ clif_updatestatus(sd, SP::JOBLEVEL);
+ clif_updatestatus(sd, SP::NEXTJOBEXP);
sd->status.skill_point += level;
- clif_updatestatus (sd, SP_SKILLPOINT);
- pc_calcstatus (sd, 0);
- clif_misceffect (&sd->bl, 1);
- clif_displaymessage (fd, "Job level raised.");
+ clif_updatestatus(sd, SP::SKILLPOINT);
+ pc_calcstatus(sd, 0);
+ clif_misceffect(&sd->bl, 1);
+ clif_displaymessage(fd, "Job level raised.");
}
else
{
if (sd->status.job_level == 1)
{
- clif_displaymessage (fd, "Job level can't go any lower.");
+ clif_displaymessage(fd, "Job level can't go any lower.");
return -1;
}
if (level < -up_level || level < (1 - sd->status.job_level)) // fix negativ overflow
level = 1 - sd->status.job_level;
sd->status.job_level += level;
- clif_updatestatus (sd, SP_JOBLEVEL);
- clif_updatestatus (sd, SP_NEXTJOBEXP);
+ clif_updatestatus(sd, SP::JOBLEVEL);
+ clif_updatestatus(sd, SP::NEXTJOBEXP);
if (sd->status.skill_point > 0)
{
sd->status.skill_point += level;
if (sd->status.skill_point < 0)
sd->status.skill_point = 0;
- clif_updatestatus (sd, SP_SKILLPOINT);
+ clif_updatestatus(sd, SP::SKILLPOINT);
} // to add: remove status points from skills
- pc_calcstatus (sd, 0);
- clif_displaymessage (fd, "Job level lowered.");
+ pc_calcstatus(sd, 0);
+ clif_displaymessage(fd, "Job level lowered.");
}
return 0;
@@ -2215,20 +1801,20 @@ int atcommand_joblevelup (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_help (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_help(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
char buf[2048], w1[2048], w2[2048];
- int i, gm_level;
+ int i, gm_level;
FILE *fp;
- memset (buf, '\0', sizeof (buf));
+ memset(buf, '\0', sizeof(buf));
- if ((fp = fopen_ (help_txt, "r")) != NULL)
+ if ((fp = fopen_(help_txt, "r")) != NULL)
{
- clif_displaymessage (fd, "Help commands:");
- gm_level = pc_isGM (sd);
- while (fgets (buf, sizeof (buf) - 1, fp) != NULL)
+ clif_displaymessage(fd, "Help commands:");
+ gm_level = pc_isGM(sd);
+ while (fgets(buf, sizeof(buf) - 1, fp) != NULL)
{
if (buf[0] == '/' && buf[1] == '/')
continue;
@@ -2240,16 +1826,16 @@ int atcommand_help (const int fd, struct map_session_data *sd,
break;
}
}
- if (sscanf (buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
- clif_displaymessage (fd, buf);
- else if (gm_level >= atoi (w1))
- clif_displaymessage (fd, w2);
+ if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
+ clif_displaymessage(fd, buf);
+ else if (gm_level >= atoi(w1))
+ clif_displaymessage(fd, w2);
}
- fclose_ (fp);
+ fclose_(fp);
}
else
{
- clif_displaymessage (fd, "File help.txt not found.");
+ clif_displaymessage(fd, "File help.txt not found.");
return -1;
}
@@ -2260,28 +1846,28 @@ int atcommand_help (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_gm (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_gm(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char password[100];
- memset (password, '\0', sizeof (password));
+ memset(password, '\0', sizeof(password));
- if (!message || !*message || sscanf (message, "%99[^\n]", password) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", password) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a password (usage: @gm <password>).");
return -1;
}
- if (pc_isGM (sd))
+ if (pc_isGM(sd))
{ // a GM can not use this function. only a normal player (become gm is not for gm!)
- clif_displaymessage (fd, "You already have some GM powers.");
+ clif_displaymessage(fd, "You already have some GM powers.");
return -1;
}
else
- chrif_changegm (sd->status.account_id, password,
- strlen (password) + 1);
+ chrif_changegm(sd->status.account_id, password,
+ strlen(password) + 1);
return 0;
}
@@ -2290,22 +1876,21 @@ int atcommand_gm (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_pvpoff (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_pvpoff(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
struct map_session_data *pl_sd;
- int i;
+ int i;
if (battle_config.pk_mode)
{ //disable command if server is in PK mode [Valaris]
- clif_displaymessage (fd, "This option cannot be used in PK Mode.");
+ clif_displaymessage(fd, "This option cannot be used in PK Mode.");
return -1;
}
if (map[sd->bl.m].flag.pvp)
{
map[sd->bl.m].flag.pvp = 0;
- clif_send0199 (sd->bl.m, 0);
for (i = 0; i < fd_max; i++)
{ //人数分ループ
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
@@ -2313,21 +1898,15 @@ int atcommand_pvpoff (const int fd, struct map_session_data *sd,
{
if (sd->bl.m == pl_sd->bl.m)
{
- clif_pvpset (pl_sd, 0, 0, 2);
- if (pl_sd->pvp_timer != -1)
- {
- delete_timer (pl_sd->pvp_timer,
- pc_calc_pvprank_timer);
- pl_sd->pvp_timer = -1;
- }
+ pl_sd->pvp_timer.cancel();
}
}
}
- clif_displaymessage (fd, "PvP: Off.");
+ clif_displaymessage(fd, "PvP: Off.");
}
else
{
- clif_displaymessage (fd, "PvP is already Off.");
+ clif_displaymessage(fd, "PvP is already Off.");
return -1;
}
@@ -2338,87 +1917,41 @@ int atcommand_pvpoff (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_pvpon (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_pvpon(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
struct map_session_data *pl_sd;
- int i;
+ int i;
if (battle_config.pk_mode)
{ //disable command if server is in PK mode [Valaris]
- clif_displaymessage (fd, "This option cannot be used in PK Mode.");
+ clif_displaymessage(fd, "This option cannot be used in PK Mode.");
return -1;
}
if (!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.nopvp)
{
map[sd->bl.m].flag.pvp = 1;
- clif_send0199 (sd->bl.m, 1);
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
- if (sd->bl.m == pl_sd->bl.m && pl_sd->pvp_timer == -1)
+ if (sd->bl.m == pl_sd->bl.m && !pl_sd->pvp_timer)
{
- pl_sd->pvp_timer = add_timer (gettick () + 200,
- pc_calc_pvprank_timer,
- pl_sd->bl.id, 0);
+ pl_sd->pvp_timer = Timer(gettick() + std::chrono::milliseconds(200),
+ std::bind(pc_calc_pvprank_timer, ph::_1, ph::_2, pl_sd->bl.id));
pl_sd->pvp_rank = 0;
pl_sd->pvp_lastusers = 0;
pl_sd->pvp_point = 5;
}
}
}
- clif_displaymessage (fd, "PvP: On.");
- }
- else
- {
- clif_displaymessage (fd, "PvP is already On.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gvgoff (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- if (map[sd->bl.m].flag.gvg)
- {
- map[sd->bl.m].flag.gvg = 0;
- clif_send0199 (sd->bl.m, 0);
- clif_displaymessage (fd, "GvG: Off.");
- }
- else
- {
- clif_displaymessage (fd, "GvG is already Off.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gvgon (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- if (!map[sd->bl.m].flag.gvg)
- {
- map[sd->bl.m].flag.gvg = 1;
- clif_send0199 (sd->bl.m, 3);
- clif_displaymessage (fd, "GvG: On.");
+ clif_displaymessage(fd, "PvP: On.");
}
else
{
- clif_displaymessage (fd, "GvG is already On.");
+ clif_displaymessage(fd, "PvP is already On.");
return -1;
}
@@ -2429,23 +1962,21 @@ int atcommand_gvgon (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_model (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_model(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int hair_style = 0, hair_color = 0, cloth_color = 0;
- char output[200];
-
- memset (output, '\0', sizeof (output));
+ int hair_style = 0, hair_color = 0, cloth_color = 0;
if (!message || !*message
- || sscanf (message, "%d %d %d", &hair_style, &hair_color,
+ || sscanf(message, "%d %d %d", &hair_style, &hair_color,
&cloth_color) < 1)
{
- sprintf (output,
- "Please, enter at least a value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).",
- MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR,
- MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "Please, enter at least a value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).",
+ MIN_HAIR_STYLE, MAX_HAIR_STYLE,
+ MIN_HAIR_COLOR, MAX_HAIR_COLOR,
+ MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
+ clif_displaymessage(fd, output);
return -1;
}
@@ -2453,25 +1984,16 @@ int atcommand_model (const int fd, struct map_session_data *sd,
hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR &&
cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR)
{
- //服の色変更
- if (cloth_color != 0 && sd->status.sex == 1
- && (sd->status.pc_class == 12 || sd->status.pc_class == 17))
- {
- //服の色未実装職の判定
- clif_displaymessage (fd, "You can't use this command with this class.");
- return -1;
- }
- else
{
- pc_changelook (sd, LOOK_HAIR, hair_style);
- pc_changelook (sd, LOOK_HAIR_COLOR, hair_color);
- pc_changelook (sd, LOOK_CLOTHES_COLOR, cloth_color);
- clif_displaymessage (fd, "Appearence changed.");
+ pc_changelook(sd, LOOK::HAIR, hair_style);
+ pc_changelook(sd, LOOK::HAIR_COLOR, hair_color);
+ pc_changelook(sd, LOOK::CLOTHES_COLOR, cloth_color);
+ clif_displaymessage(fd, "Appearence changed.");
}
}
else
{
- clif_displaymessage (fd, "An invalid number was specified.");
+ clif_displaymessage(fd, "An invalid number was specified.");
return -1;
}
@@ -2482,40 +2004,30 @@ int atcommand_model (const int fd, struct map_session_data *sd,
* @dye && @ccolor
*------------------------------------------
*/
-int atcommand_dye (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_dye(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int cloth_color = 0;
- char output[200];
-
- memset (output, '\0', sizeof (output));
+ int cloth_color = 0;
- if (!message || !*message || sscanf (message, "%d", &cloth_color) < 1)
+ if (!message || !*message || sscanf(message, "%d", &cloth_color) < 1)
{
- sprintf (output,
- "Please, enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).",
- MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "Please, enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).",
+ MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
+ clif_displaymessage(fd, output);
return -1;
}
if (cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR)
{
- if (cloth_color != 0 && sd->status.sex == 1
- && (sd->status.pc_class == 12 || sd->status.pc_class == 17))
{
- clif_displaymessage (fd, "You can't use this command with this class.");
- return -1;
- }
- else
- {
- pc_changelook (sd, LOOK_CLOTHES_COLOR, cloth_color);
- clif_displaymessage (fd, "Appearence changed.");
+ pc_changelook(sd, LOOK::CLOTHES_COLOR, cloth_color);
+ clif_displaymessage(fd, "Appearence changed.");
}
}
else
{
- clif_displaymessage (fd, "An invalid number was specified.");
+ clif_displaymessage(fd, "An invalid number was specified.");
return -1;
}
@@ -2523,54 +2035,33 @@ int atcommand_dye (const int fd, struct map_session_data *sd,
}
/*==========================================
- * @chardye by [MouseJstr]
- *------------------------------------------
- */
-int
-atcommand_chardye (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- return 0;
-}
-
-/*==========================================
* @hairstyle && @hstyle
*------------------------------------------
*/
-int atcommand_hair_style (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_hair_style(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int hair_style = 0;
- char output[200];
+ int hair_style = 0;
- memset (output, '\0', sizeof (output));
-
- if (!message || !*message || sscanf (message, "%d", &hair_style) < 1)
+ if (!message || !*message || sscanf(message, "%d", &hair_style) < 1)
{
- sprintf (output,
- "Please, enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).",
- MIN_HAIR_STYLE, MAX_HAIR_STYLE);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "Please, enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).",
+ MIN_HAIR_STYLE, MAX_HAIR_STYLE);
+ clif_displaymessage(fd, output);
return -1;
}
if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE)
{
- if (hair_style != 0 && sd->status.sex == 1
- && (sd->status.pc_class == 12 || sd->status.pc_class == 17))
- {
- clif_displaymessage (fd, "You can't use this command with this class.");
- return -1;
- }
- else
{
- pc_changelook (sd, LOOK_HAIR, hair_style);
- clif_displaymessage (fd, "Appearence changed.");
+ pc_changelook(sd, LOOK::HAIR, hair_style);
+ clif_displaymessage(fd, "Appearence changed.");
}
}
else
{
- clif_displaymessage (fd, "An invalid number was specified.");
+ clif_displaymessage(fd, "An invalid number was specified.");
return -1;
}
@@ -2578,315 +2069,35 @@ int atcommand_hair_style (const int fd, struct map_session_data *sd,
}
/*==========================================
- * @charhairstyle by [MouseJstr]
- *------------------------------------------
- */
-int
-atcommand_charhairstyle (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- return 0;
-}
-
-/*==========================================
* @haircolor && @hcolor
*------------------------------------------
*/
-int atcommand_hair_color (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_hair_color(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int hair_color = 0;
- char output[200];
-
- memset (output, '\0', sizeof (output));
+ int hair_color = 0;
- if (!message || !*message || sscanf (message, "%d", &hair_color) < 1)
+ if (!message || !*message || sscanf(message, "%d", &hair_color) < 1)
{
- sprintf (output,
- "Please, enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).",
- MIN_HAIR_COLOR, MAX_HAIR_COLOR);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "Please, enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).",
+ MIN_HAIR_COLOR, MAX_HAIR_COLOR);
+ clif_displaymessage(fd, output);
return -1;
}
if (hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR)
{
- if (hair_color != 0 && sd->status.sex == 1
- && (sd->status.pc_class == 12 || sd->status.pc_class == 17))
{
- clif_displaymessage (fd, "You can't use this command with this class.");
- return -1;
- }
- else
- {
- pc_changelook (sd, LOOK_HAIR_COLOR, hair_color);
- clif_displaymessage (fd, "Appearence changed.");
+ pc_changelook(sd, LOOK::HAIR_COLOR, hair_color);
+ clif_displaymessage(fd, "Appearence changed.");
}
}
else
{
- clif_displaymessage (fd, "An invalid number was specified.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @charhaircolor by [MouseJstr]
- *------------------------------------------
- */
-int
-atcommand_charhaircolor (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- return 0;
-}
-
-/*==========================================
- * @go [city_number/city_name]: improved by [yor] to add city names and help
- *------------------------------------------
- */
-int atcommand_go (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- int i;
- int town;
- char map_name[100];
- char output[200];
- int m;
-
- struct
- {
- char map[16];
- int x, y;
- } data[] =
- {
- {
- "prontera.gat", 156, 191}, // 0=Prontera
- {
- "morocc.gat", 156, 93}, // 1=Morroc
- {
- "geffen.gat", 119, 59}, // 2=Geffen
- {
- "payon.gat", 162, 233}, // 3=Payon
- {
- "alberta.gat", 192, 147}, // 4=Alberta
- {
- "izlude.gat", 128, 114}, // 5=Izlude
- {
- "aldebaran.gat", 140, 131}, // 6=Al de Baran
- {
- "xmas.gat", 147, 134}, // 7=Lutie
- {
- "comodo.gat", 209, 143}, // 8=Comodo
- {
- "yuno.gat", 157, 51}, // 9=Yuno
- {
- "amatsu.gat", 198, 84}, // 10=Amatsu
- {
- "gonryun.gat", 160, 120}, // 11=Gon Ryun
- {
- "umbala.gat", 89, 157}, // 12=Umbala
- {
- "niflheim.gat", 21, 153}, // 13=Niflheim
- {
- "louyang.gat", 217, 40}, // 14=Lou Yang
- {
- "new_1-1.gat", 53, 111}, // 15=Start point
- {
- "sec_pri.gat", 23, 61}, // 16=Prison
- };
-
- memset (map_name, '\0', sizeof (map_name));
- memset (output, '\0', sizeof (output));
-
- // get the number
- town = atoi (message);
-
- // if no value, display all value
- if (!message || !*message || sscanf (message, "%99s", map_name) < 1
- || town < -3 || town >= (int) (sizeof (data) / sizeof (data[0])))
- {
- clif_displaymessage (fd, "Invalid location number or name.");
- clif_displaymessage (fd, "Please, use one of this number/name:");
- clif_displaymessage (fd,
- "-3=(Memo point 2) 4=Alberta 11=Gon Ryun");
- clif_displaymessage (fd,
- "-2=(Memo point 1) 5=Izlude 12=Umbala");
- clif_displaymessage (fd,
- "-1=(Memo point 0) 6=Al de Baran 13=Niflheim");
- clif_displaymessage (fd,
- " 0=Prontera 7=Lutie 14=Lou Yang");
- clif_displaymessage (fd,
- " 1=Morroc 8=Comodo 15=Start point");
- clif_displaymessage (fd,
- " 2=Geffen 9=Yuno 16=Prison");
- clif_displaymessage (fd, " 3=Payon 10=Amatsu");
+ clif_displaymessage(fd, "An invalid number was specified.");
return -1;
}
- else
- {
- // get possible name of the city and add .gat if not in the name
- map_name[sizeof (map_name) - 1] = '\0';
- for (i = 0; map_name[i]; i++)
- map_name[i] = tolower (map_name[i]);
- if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat)
- strcat (map_name, ".gat");
- // try to see if it's a name, and not a number (try a lot of possibilities, write errors and abbreviations too)
- if (strncmp (map_name, "prontera.gat", 3) == 0)
- { // 3 first characters
- town = 0;
- }
- else if (strncmp (map_name, "morocc.gat", 3) == 0)
- { // 3 first characters
- town = 1;
- }
- else if (strncmp (map_name, "geffen.gat", 3) == 0)
- { // 3 first characters
- town = 2;
- }
- else if (strncmp (map_name, "payon.gat", 3) == 0 || // 3 first characters
- strncmp (map_name, "paion.gat", 3) == 0)
- { // writing error (3 first characters)
- town = 3;
- }
- else if (strncmp (map_name, "alberta.gat", 3) == 0)
- { // 3 first characters
- town = 4;
- }
- else if (strncmp (map_name, "izlude.gat", 3) == 0 || // 3 first characters
- strncmp (map_name, "islude.gat", 3) == 0)
- { // writing error (3 first characters)
- town = 5;
- }
- else if (strncmp (map_name, "aldebaran.gat", 3) == 0 || // 3 first characters
- strcmp (map_name, "al.gat") == 0)
- { // al (de baran)
- town = 6;
- }
- else if (strncmp (map_name, "lutie.gat", 3) == 0 || // name of the city, not name of the map (3 first characters)
- strcmp (map_name, "christmas.gat") == 0 || // name of the symbol
- strncmp (map_name, "xmas.gat", 3) == 0 || // 3 first characters
- strncmp (map_name, "x-mas.gat", 3) == 0)
- { // writing error (3 first characters)
- town = 7;
- }
- else if (strncmp (map_name, "comodo.gat", 3) == 0)
- { // 3 first characters
- town = 8;
- }
- else if (strncmp (map_name, "yuno.gat", 3) == 0)
- { // 3 first characters
- town = 9;
- }
- else if (strncmp (map_name, "amatsu.gat", 3) == 0 || // 3 first characters
- strncmp (map_name, "ammatsu.gat", 3) == 0)
- { // writing error (3 first characters)
- town = 10;
- }
- else if (strncmp (map_name, "gonryun.gat", 3) == 0)
- { // 3 first characters
- town = 11;
- }
- else if (strncmp (map_name, "umbala.gat", 3) == 0)
- { // 3 first characters
- town = 12;
- }
- else if (strncmp (map_name, "niflheim.gat", 3) == 0)
- { // 3 first characters
- town = 13;
- }
- else if (strncmp (map_name, "louyang.gat", 3) == 0)
- { // 3 first characters
- town = 14;
- }
- else if (strncmp (map_name, "new_1-1.gat", 3) == 0 || // 3 first characters (or "newbies")
- strncmp (map_name, "startpoint.gat", 3) == 0 || // name of the position (3 first characters)
- strncmp (map_name, "begining.gat", 3) == 0)
- { // name of the position (3 first characters)
- town = 15;
- }
- else if (strncmp (map_name, "sec_pri.gat", 3) == 0 || // 3 first characters
- strncmp (map_name, "prison.gat", 3) == 0 || // name of the position (3 first characters)
- strncmp (map_name, "jails.gat", 3) == 0)
- { // name of the position
- town = 16;
- }
-
- if (town >= -3 && town <= -1)
- {
- if (sd->status.memo_point[-town - 1].map[0])
- {
- m = map_mapname2mapid (sd->status.memo_point[-town - 1].map);
- if (m >= 0 && map[m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
- {
- clif_displaymessage (fd,
- "You are not authorised to warp you to this memo map.");
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
- {
- clif_displaymessage (fd,
- "You are not authorised to warp you from your actual map.");
- return -1;
- }
- if (pc_setpos
- (sd, sd->status.memo_point[-town - 1].map,
- sd->status.memo_point[-town - 1].x,
- sd->status.memo_point[-town - 1].y, 3) == 0)
- {
- clif_displaymessage (fd, "Warped.");
- }
- else
- {
- clif_displaymessage (fd, "Map not found.");
- return -1;
- }
- }
- else
- {
- sprintf (output, "Your memo point #%d doesn't exist.", -town - 1);
- clif_displaymessage (fd, output);
- return -1;
- }
- }
- else if (town >= 0 && town < (int) (sizeof (data) / sizeof (data[0])))
- {
- m = map_mapname2mapid (data[town].map);
- if (m >= 0 && map[m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
- {
- clif_displaymessage (fd,
- "You are not authorised to warp you to this destination map.");
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
- {
- clif_displaymessage (fd,
- "You are not authorised to warp you from your actual map.");
- return -1;
- }
- if (pc_setpos (sd, data[town].map, data[town].x, data[town].y, 3)
- == 0)
- {
- clif_displaymessage (fd, "Warped.");
- }
- else
- {
- clif_displaymessage (fd, "Map not found.");
- return -1;
- }
- }
- else
- { // if you arrive here, you have an error in town variable when reading of names
- clif_displaymessage (fd, "Invalid location number or name.");
- return -1;
- }
- }
return 0;
}
@@ -2895,41 +2106,39 @@ int atcommand_go (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_spawn (const int fd, struct map_session_data *sd,
+int atcommand_spawn(const int fd, struct map_session_data *sd,
const char *command, const char *message)
{
char monster[100];
- char output[200];
- int mob_id;
- int number = 0;
- int x = 0, y = 0;
- int count;
- int i, j, k;
- int mx, my, range;
+ int mob_id;
+ int number = 0;
+ int x = 0, y = 0;
+ int count;
+ int i, j, k;
+ int mx, my, range;
- memset (monster, '\0', sizeof (monster));
- memset (output, '\0', sizeof (output));
+ memset(monster, '\0', sizeof(monster));
if (!message || !*message
- || sscanf (message, "%99s %d %d %d", monster, &number, &x, &y) < 1)
+ || sscanf(message, "%99s %d %d %d", monster, &number, &x, &y) < 1)
{
- clif_displaymessage (fd, "Give a monster name/id please.");
+ clif_displaymessage(fd, "Give a monster name/id please.");
return -1;
}
// If monster identifier/name argument is a name
- if ((mob_id = mobdb_searchname (monster)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = mobdb_checkid (atoi (monster));
+ if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
+ mob_id = mobdb_checkid(atoi(monster));
if (mob_id == 0)
{
- clif_displaymessage (fd, "Invalid monster ID or name.");
+ clif_displaymessage(fd, "Invalid monster ID or name.");
return -1;
}
if (mob_id == 1288)
{
- clif_displaymessage (fd, "Cannot spawn emperium.");
+ clif_displaymessage(fd, "Cannot spawn emperium.");
return -1;
}
@@ -2942,43 +2151,44 @@ int atcommand_spawn (const int fd, struct map_session_data *sd,
number = battle_config.atc_spawn_quantity_limit;
if (battle_config.etc_log)
- printf ("%s monster='%s' id=%d count=%d (%d,%d)\n", command, monster,
+ PRINTF("%s monster='%s' id=%d count=%d (%d,%d)\n", command, monster,
mob_id, number, x, y);
count = 0;
- range = sqrt (number) / 2;
+ range = sqrt(number) / 2;
range = range * 2 + 5; // calculation of an odd number (+ 4 area around)
for (i = 0; i < number; i++)
{
j = 0;
k = 0;
while (j++ < 8 && k == 0)
- { // try 8 times to spawn the monster (needed for close area)
+ {
+ // try 8 times to spawn the monster (needed for close area)
if (x <= 0)
- mx = sd->bl.x + (MRAND (range) - (range / 2));
+ mx = sd->bl.x + random_::in(-range / 2, range / 2 );
else
mx = x;
if (y <= 0)
- my = sd->bl.y + (MRAND (range) - (range / 2));
+ my = sd->bl.y + random_::in(-range / 2, range / 2);
else
my = y;
- k = mob_once_spawn ((struct map_session_data *) sd, "this", mx,
- my, "", mob_id, 1, "");
+ k = mob_once_spawn(sd, "this", mx, my, "", mob_id, 1, "");
}
count += (k != 0) ? 1 : 0;
}
if (count != 0)
if (number == count)
- clif_displaymessage (fd, "All monster summoned!");
+ clif_displaymessage(fd, "All monster summoned!");
else
{
- sprintf (output, "%d monster(s) summoned!", count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("%d monster(s) summoned!",
+ count);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Invalid monster ID or name.");
+ clif_displaymessage(fd, "Invalid monster ID or name.");
return -1;
}
@@ -2990,28 +2200,28 @@ int atcommand_spawn (const int fd, struct map_session_data *sd,
*------------------------------------------
*/
static
-void atcommand_killmonster_sub (const int fd, struct map_session_data *sd,
+void atcommand_killmonster_sub(const int fd, struct map_session_data *sd,
const char *message, const int drop)
{
- int map_id;
+ int map_id;
char map_name[100];
- memset (map_name, '\0', sizeof (map_name));
+ memset(map_name, '\0', sizeof(map_name));
- if (!message || !*message || sscanf (message, "%99s", map_name) < 1)
+ if (!message || !*message || sscanf(message, "%99s", map_name) < 1)
map_id = sd->bl.m;
else
{
- if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat)
- strcat (map_name, ".gat");
- if ((map_id = map_mapname2mapid (map_name)) < 0)
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+ if ((map_id = map_mapname2mapid(map_name)) < 0)
map_id = sd->bl.m;
}
- map_foreachinarea (atkillmonster_sub, map_id, 0, 0, map[map_id].xs,
- map[map_id].ys, BL_MOB, drop);
+ map_foreachinarea(std::bind(atkillmonster_sub, ph::_1, drop), map_id, 0, 0, map[map_id].xs,
+ map[map_id].ys, BL::MOB);
- clif_displaymessage (fd, "All monsters killed!");
+ clif_displaymessage(fd, "All monsters killed!");
return;
}
@@ -3020,40 +2230,10 @@ void atcommand_killmonster_sub (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_killmonster (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- atcommand_killmonster_sub (fd, sd, message, 1);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int atlist_nearby_sub (struct block_list *bl, va_list ap)
-{
- char buf[32];
- int fd = va_arg (ap, int);
- nullpo_retr (0, bl);
-
- sprintf (buf, " - \"%s\"", ((struct map_session_data *) bl)->status.name);
- clif_displaymessage (fd, buf);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_list_nearby (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_killmonster(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- clif_displaymessage (fd, "Nearby players:");
- map_foreachinarea (atlist_nearby_sub, sd->bl.m, sd->bl.x - 1,
- sd->bl.y - 1, sd->bl.x + 1, sd->bl.x + 1, BL_PC, fd);
+ atcommand_killmonster_sub(fd, sd, message, 1);
return 0;
}
@@ -3062,157 +2242,39 @@ int atcommand_list_nearby (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_killmonster2 (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+static
+void atlist_nearby_sub(struct block_list *bl, int fd)
{
- atcommand_killmonster_sub (fd, sd, message, 0);
+ nullpo_retv(bl);
- return 0;
+ std::string buf = STRPRINTF(" - \"%s\"",
+ ((struct map_session_data *) bl)->status.name);
+ clif_displaymessage(fd, buf);
}
/*==========================================
*
*------------------------------------------
*/
-int atcommand_produce (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_list_nearby(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
- char item_name[100];
- int item_id, attribute = 0, star = 0;
- int flag = 0;
- struct item_data *item_data;
- struct item tmp_item;
- char output[200];
-
- memset (output, '\0', sizeof (output));
- memset (item_name, '\0', sizeof (item_name));
-
- if (!message || !*message
- || sscanf (message, "%99s %d %d", item_name, &attribute, &star) < 1)
- {
- clif_displaymessage (fd,
- "Please, enter at least an item name/id (usage: @produce <equip name or equip ID> <element> <# of very's>).");
- return -1;
- }
-
- item_id = 0;
- if ((item_data = itemdb_searchname (item_name)) != NULL ||
- (item_data = itemdb_exists (atoi (item_name))) != NULL)
- item_id = item_data->nameid;
-
- if (itemdb_exists (item_id) &&
- (item_id <= 500 || item_id > 1099) &&
- (item_id < 4001 || item_id > 4148) &&
- (item_id < 7001 || item_id > 10019) && itemdb_isequip (item_id))
- {
- if (attribute < MIN_ATTRIBUTE || attribute > MAX_ATTRIBUTE)
- attribute = ATTRIBUTE_NORMAL;
- if (star < MIN_STAR || star > MAX_STAR)
- star = 0;
- memset (&tmp_item, 0, sizeof tmp_item);
- tmp_item.nameid = item_id;
- tmp_item.amount = 1;
- tmp_item.identify = 1;
- tmp_item.card[0] = 0x00ff;
- tmp_item.card[1] = ((star * 5) << 8) + attribute;
- *((unsigned long *) (&tmp_item.card[2])) = sd->char_id;
- clif_produceeffect (sd, 0, item_id); // 製造エフェクトパケット
- clif_misceffect (&sd->bl, 3); // 他人にも成功を通知
- if ((flag = pc_additem (sd, &tmp_item, 1)))
- clif_additem (sd, 0, 0, flag);
- }
- else
- {
- if (battle_config.error_log)
- printf ("@produce NOT WEAPON [%d]\n", item_id);
- if (item_id != 0 && itemdb_exists (item_id))
- sprintf (output, "This item (%d: '%s') is not an equipment.", item_id, item_data->name);
- else
- sprintf (output, "%s", "This item is not an equipment.");
- clif_displaymessage (fd, output);
- return -1;
- }
+ clif_displaymessage(fd, "Nearby players:");
+ map_foreachinarea(std::bind(atlist_nearby_sub, ph::_1, fd),
+ sd->bl.m, sd->bl.x - 1, sd->bl.y - 1,
+ sd->bl.x + 1, sd->bl.x + 1, BL::PC);
return 0;
}
/*==========================================
- * Sub-function to display actual memo points
- *------------------------------------------
- */
-static
-void atcommand_memo_sub (struct map_session_data *sd)
-{
- int i;
- char output[200];
-
- memset (output, '\0', sizeof (output));
-
- clif_displaymessage (sd->fd,
- "Your actual memo positions are (except respawn point):");
- for (i = MIN_PORTAL_MEMO; i <= MAX_PORTAL_MEMO; i++)
- {
- if (sd->status.memo_point[i].map[0])
- sprintf (output, "%d - %s (%d,%d)", i,
- sd->status.memo_point[i].map, sd->status.memo_point[i].x,
- sd->status.memo_point[i].y);
- else
- sprintf (output, "%d - void", i);
- clif_displaymessage (sd->fd, output);
- }
-
- return;
-}
-
-/*==========================================
*
*------------------------------------------
*/
-int atcommand_memo (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_killmonster2(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int position = 0;
- char output[200];
-
- memset (output, '\0', sizeof (output));
-
- 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])
- {
- sprintf (output, "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;
- clif_skill_memo (sd, 0);
- 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
- {
- sprintf (output,
- "Please, enter a valid position (usage: @memo <memo_position:%d-%d>).",
- MIN_PORTAL_MEMO, MAX_PORTAL_MEMO);
- clif_displaymessage (fd, output);
- atcommand_memo_sub (sd);
- return -1;
- }
- }
+ atcommand_killmonster_sub(fd, sd, message, 0);
return 0;
}
@@ -3221,24 +2283,22 @@ int atcommand_memo (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_gat (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_gat(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
- char output[200];
- int y;
-
- memset (output, '\0', sizeof (output));
+ int y;
for (y = 2; y >= -2; y--)
{
- sprintf (output, "%s (x= %d, y= %d) %02X %02X %02X %02X %02X",
- map[sd->bl.m].name, sd->bl.x - 2, sd->bl.y + y,
- map_getcell (sd->bl.m, sd->bl.x - 2, sd->bl.y + y),
- map_getcell (sd->bl.m, sd->bl.x - 1, sd->bl.y + y),
- map_getcell (sd->bl.m, sd->bl.x, sd->bl.y + y),
- map_getcell (sd->bl.m, sd->bl.x + 1, sd->bl.y + y),
- map_getcell (sd->bl.m, sd->bl.x + 2, sd->bl.y + y));
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "%s (x= %d, y= %d) %02X %02X %02X %02X %02X",
+ map[sd->bl.m].name, sd->bl.x - 2, sd->bl.y + y,
+ map_getcell(sd->bl.m, sd->bl.x - 2, sd->bl.y + y),
+ map_getcell(sd->bl.m, sd->bl.x - 1, sd->bl.y + y),
+ map_getcell(sd->bl.m, sd->bl.x, sd->bl.y + y),
+ map_getcell(sd->bl.m, sd->bl.x + 1, sd->bl.y + y),
+ map_getcell(sd->bl.m, sd->bl.x + 2, sd->bl.y + y));
+ clif_displaymessage(fd, output);
}
return 0;
@@ -3248,19 +2308,19 @@ int atcommand_gat (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_packet (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_packet(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int x = 0, y = 0;
+ int type = 0, flag = 0;
- if (!message || !*message || sscanf (message, "%d %d", &x, &y) < 2)
+ if (!message || !*message || sscanf(message, "%d %d", &type, &flag) < 2)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a status type/flag (usage: @packet <status type> <flag>).");
return -1;
}
- clif_status_change (&sd->bl, x, y);
+ clif_status_change(&sd->bl, StatusChange(type), flag);
return 0;
}
@@ -3269,14 +2329,14 @@ int atcommand_packet (const int fd, struct map_session_data *sd,
* @stpoint (Rewritten by [Yor])
*------------------------------------------
*/
-int atcommand_statuspoint (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_statuspoint(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int point, new_status_point;
+ int point, new_status_point;
- if (!message || !*message || (point = atoi (message)) == 0)
+ if (!message || !*message || (point = atoi(message)) == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a number (usage: @stpoint <number of points>).");
return -1;
}
@@ -3290,15 +2350,15 @@ int atcommand_statuspoint (const int fd, struct map_session_data *sd,
if (new_status_point != (int) sd->status.status_point)
{
sd->status.status_point = (short) new_status_point;
- clif_updatestatus (sd, SP_STATUSPOINT);
- clif_displaymessage (fd, "Number of status points changed!");
+ clif_updatestatus(sd, SP::STATUSPOINT);
+ clif_displaymessage(fd, "Number of status points changed!");
}
else
{
if (point < 0)
- clif_displaymessage (fd, "Impossible to decrease the number/value.");
+ clif_displaymessage(fd, "Impossible to decrease the number/value.");
else
- clif_displaymessage (fd, "Impossible to increase the number/value.");
+ clif_displaymessage(fd, "Impossible to increase the number/value.");
return -1;
}
@@ -3309,14 +2369,14 @@ int atcommand_statuspoint (const int fd, struct map_session_data *sd,
* @skpoint (Rewritten by [Yor])
*------------------------------------------
*/
-int atcommand_skillpoint (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_skillpoint(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int point, new_skill_point;
+ int point, new_skill_point;
- if (!message || !*message || (point = atoi (message)) == 0)
+ if (!message || !*message || (point = atoi(message)) == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a number (usage: @skpoint <number of points>).");
return -1;
}
@@ -3330,15 +2390,15 @@ int atcommand_skillpoint (const int fd, struct map_session_data *sd,
if (new_skill_point != (int) sd->status.skill_point)
{
sd->status.skill_point = (short) new_skill_point;
- clif_updatestatus (sd, SP_SKILLPOINT);
- clif_displaymessage (fd, "Number of skill points changed!");
+ clif_updatestatus(sd, SP::SKILLPOINT);
+ clif_displaymessage(fd, "Number of skill points changed!");
}
else
{
if (point < 0)
- clif_displaymessage (fd, "Impossible to decrease the number/value.");
+ clif_displaymessage(fd, "Impossible to decrease the number/value.");
else
- clif_displaymessage (fd, "Impossible to increase the number/value.");
+ clif_displaymessage(fd, "Impossible to increase the number/value.");
return -1;
}
@@ -3349,14 +2409,14 @@ int atcommand_skillpoint (const int fd, struct map_session_data *sd,
* @zeny (Rewritten by [Yor])
*------------------------------------------
*/
-int atcommand_zeny (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_zeny(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int zeny, new_zeny;
+ int zeny, new_zeny;
- if (!message || !*message || (zeny = atoi (message)) == 0)
+ if (!message || !*message || (zeny = atoi(message)) == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter an amount (usage: @zeny <amount>).");
return -1;
}
@@ -3370,15 +2430,15 @@ int atcommand_zeny (const int fd, struct map_session_data *sd,
if (new_zeny != sd->status.zeny)
{
sd->status.zeny = new_zeny;
- clif_updatestatus (sd, SP_ZENY);
- clif_displaymessage (fd, "Number of zenys changed!");
+ clif_updatestatus(sd, SP::ZENY);
+ clif_displaymessage(fd, "Number of zenys changed!");
}
else
{
if (zeny < 0)
- clif_displaymessage (fd, "Impossible to decrease the number/value.");
+ clif_displaymessage(fd, "Impossible to decrease the number/value.");
else
- clif_displaymessage (fd, "Impossible to increase the number/value.");
+ clif_displaymessage(fd, "Impossible to increase the number/value.");
return -1;
}
@@ -3389,66 +2449,43 @@ int atcommand_zeny (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_param (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+template<ATTR attr>
+int atcommand_param(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int i, index, value = 0, new_value;
- const char *param[] =
- { "@str", "@agi", "@vit", "@int", "@dex", "@luk", NULL };
- short *status[] = {
- &sd->status.str, &sd->status.agi, &sd->status.vit,
- &sd->status.int_, &sd->status.dex, &sd->status.luk
- };
- char output[200];
+ int value = 0, new_value;
- memset (output, '\0', sizeof (output));
-
- if (!message || !*message || sscanf (message, "%d", &value) < 1
+ if (!message || !*message || sscanf(message, "%d", &value) < 1
|| value == 0)
{
- sprintf (output,
- "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
- clif_displaymessage (fd, output);
- return -1;
- }
- index = -1;
- for (i = 0; param[i] != NULL; i++)
- {
- if (strcasecmp (command, param[i]) == 0)
- {
- index = i;
- break;
- }
- }
- if (index < 0 || index > MAX_STATUS_TYPE)
- { // normaly impossible...
- sprintf (output,
- "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
- clif_displaymessage (fd, output);
+ // there was a clang bug here
+ // fortunately, STRPRINTF was not actually needed
+ clif_displaymessage(fd,
+ "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
return -1;
}
- new_value = (int) *status[index] + value;
+ new_value = (int) sd->status.attrs[attr] + value;
if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow
new_value = battle_config.max_parameter;
else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow
new_value = 1;
- if (new_value != (int) *status[index])
+ if (new_value != sd->status.attrs[attr])
{
- *status[index] = new_value;
- clif_updatestatus (sd, SP_STR + index);
- clif_updatestatus (sd, SP_USTR + index);
- pc_calcstatus (sd, 0);
- clif_displaymessage (fd, "Stat changed.");
+ sd->status.attrs[attr] = new_value;
+ clif_updatestatus(sd, attr_to_sp(attr));
+ clif_updatestatus(sd, attr_to_usp(attr));
+ pc_calcstatus(sd, 0);
+ clif_displaymessage(fd, "Stat changed.");
}
else
{
if (value < 0)
- clif_displaymessage (fd, "Impossible to decrease the number/value.");
+ clif_displaymessage(fd, "Impossible to decrease the number/value.");
else
- clif_displaymessage (fd, "Impossible to increase the number/value.");
+ clif_displaymessage(fd, "Impossible to increase the number/value.");
return -1;
}
@@ -3460,100 +2497,42 @@ int atcommand_param (const int fd, struct map_session_data *sd,
*------------------------------------------
*/
//** Stat all by fritz (rewritten by [Yor])
-int atcommand_all_stats (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_all_stats(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int index, count, value = 0, new_value;
- short *status[] = {
- &sd->status.str, &sd->status.agi, &sd->status.vit,
- &sd->status.int_, &sd->status.dex, &sd->status.luk
- };
+ int count, value = 0, new_value;
- if (!message || !*message || sscanf (message, "%d", &value) < 1
+ if (!message || !*message || sscanf(message, "%d", &value) < 1
|| value == 0)
value = battle_config.max_parameter;
count = 0;
- for (index = 0; index < (int) (sizeof (status) / sizeof (status[0]));
- index++)
+ for (ATTR attr : ATTRs)
{
-
- new_value = (int) *status[index] + value;
+ new_value = sd->status.attrs[attr] + value;
if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow
new_value = battle_config.max_parameter;
else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow
new_value = 1;
- if (new_value != (int) *status[index])
+ if (new_value != sd->status.attrs[attr])
{
- *status[index] = new_value;
- clif_updatestatus (sd, SP_STR + index);
- clif_updatestatus (sd, SP_USTR + index);
- pc_calcstatus (sd, 0);
+ sd->status.attrs[attr] = new_value;
+ clif_updatestatus(sd, attr_to_sp(attr));
+ clif_updatestatus(sd, attr_to_usp(attr));
+ pc_calcstatus(sd, 0);
count++;
}
}
if (count > 0) // if at least 1 stat modified
- clif_displaymessage (fd, "All stats changed!");
+ clif_displaymessage(fd, "All stats changed!");
else
{
if (value < 0)
- clif_displaymessage (fd, "Impossible to decrease a stat.");
+ clif_displaymessage(fd, "Impossible to decrease a stat.");
else
- clif_displaymessage (fd, "Impossible to increase a stat.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_guildlevelup (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- int level = 0;
- short added_level;
- struct guild *guild_info;
-
- if (!message || !*message || sscanf (message, "%d", &level) < 1
- || level == 0)
- {
- clif_displaymessage (fd,
- "Please, enter a valid level (usage: @guildlvl <# of levels>).");
- return -1;
- }
-
- if (sd->status.guild_id <= 0
- || (guild_info = guild_search (sd->status.guild_id)) == NULL)
- {
- clif_displaymessage (fd, "You're not in a guild.");
- return -1;
- }
- if (strcmp (sd->status.name, guild_info->master) != 0)
- {
- clif_displaymessage (fd, "You're not the master of your guild.");
- return -1;
- }
-
- added_level = (short) level;
- if (level > 0 && (level > MAX_GUILDLEVEL || added_level > ((short) MAX_GUILDLEVEL - guild_info->guild_lv))) // fix positiv overflow
- added_level = (short) MAX_GUILDLEVEL - guild_info->guild_lv;
- else if (level < 0 && (level < -MAX_GUILDLEVEL || added_level < (1 - guild_info->guild_lv))) // fix negativ overflow
- added_level = 1 - guild_info->guild_lv;
-
- if (added_level != 0)
- {
- intif_guild_change_basicinfo (guild_info->guild_id, GBI_GUILDLV,
- &added_level, 2);
- clif_displaymessage (fd, "Guild level changed.");
- }
- else
- {
- clif_displaymessage (fd, "Guild level change failed.");
+ clif_displaymessage(fd, "Impossible to increase a stat.");
return -1;
}
@@ -3564,54 +2543,52 @@ int atcommand_guildlevelup (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_recall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_recall(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- char output[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @recall <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can recall only lower or same level
if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp somenone to your actual map.");
return -1;
}
if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp this player from its actual map.");
return -1;
}
- pc_setpos (pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- sprintf (output, "%s recalled!", character);
- clif_displaymessage (fd, output);
+ pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, BeingRemoveWhy::QUIT);
+ std::string output = STRPRINTF("%s recalled!", character);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -3622,35 +2599,35 @@ int atcommand_recall (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_revive (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_revive(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));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @revive <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
pl_sd->status.hp = pl_sd->status.max_hp;
- pc_setstand (pl_sd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer (sd, battle_config.pc_invincible_time);
- clif_updatestatus (pl_sd, SP_HP);
- clif_updatestatus (pl_sd, SP_SP);
- clif_resurrection (&pl_sd->bl, 1);
- clif_displaymessage (fd, "Character revived.");
+ pc_setstand(pl_sd);
+ if (static_cast<interval_t>(battle_config.pc_invincible_time) > interval_t::zero())
+ pc_setinvincibletimer(sd, static_cast<interval_t>(battle_config.pc_invincible_time));
+ clif_updatestatus(pl_sd, SP::HP);
+ clif_updatestatus(pl_sd, SP::SP);
+ clif_resurrection(&pl_sd->bl, 1);
+ clif_displaymessage(fd, "Character revived.");
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -3661,76 +2638,56 @@ int atcommand_revive (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_character_stats (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_character_stats(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
- char job_jobname[100];
- char output[200];
struct map_session_data *pl_sd;
- int i;
- memset (character, '\0', sizeof (character));
- memset (job_jobname, '\0', sizeof (job_jobname));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charstats <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
- {
- struct
- {
- const char *format;
- int value;
- } output_table[] =
- {
- {
- "Base Level - %d", pl_sd->status.base_level},
- {
- job_jobname, pl_sd->status.job_level},
- {
- "Hp - %d", pl_sd->status.hp},
- {
- "MaxHp - %d", pl_sd->status.max_hp},
- {
- "Sp - %d", pl_sd->status.sp},
- {
- "MaxSp - %d", pl_sd->status.max_sp},
- {
- "Str - %3d", pl_sd->status.str},
- {
- "Agi - %3d", pl_sd->status.agi},
- {
- "Vit - %3d", pl_sd->status.vit},
- {
- "Int - %3d", pl_sd->status.int_},
- {
- "Dex - %3d", pl_sd->status.dex},
- {
- "Luk - %3d", pl_sd->status.luk},
- {
- "Zeny - %d", pl_sd->status.zeny},
- {
- NULL, 0}
- };
- sprintf (job_jobname, "Job - %s %s", job_name (pl_sd->status.pc_class),
- "(level %d)");
- sprintf (output, "'%s' stats:", pl_sd->status.name);
- clif_displaymessage (fd, output);
- for (i = 0; output_table[i].format != NULL; i++)
- {
- sprintf (output, output_table[i].format, output_table[i].value);
- clif_displaymessage (fd, output);
- }
+ if ((pl_sd = map_nick2sd(character)) != NULL)
+ {
+ std::string output;
+ output = STRPRINTF("'%s' stats:", pl_sd->status.name);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Base Level - %d", pl_sd->status.base_level),
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Job - Novice/Human (level %d)", pl_sd->status.job_level);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Hp - %d", pl_sd->status.hp);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("MaxHp - %d", pl_sd->status.max_hp);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Sp - %d", pl_sd->status.sp);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("MaxSp - %d", pl_sd->status.max_sp);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Str - %3d", pl_sd->status.attrs[ATTR::STR]);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Agi - %3d", pl_sd->status.attrs[ATTR::AGI]);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Vit - %3d", pl_sd->status.attrs[ATTR::VIT]);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Int - %3d", pl_sd->status.attrs[ATTR::INT]);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Dex - %3d", pl_sd->status.attrs[ATTR::DEX]);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Luk - %3d", pl_sd->status.attrs[ATTR::LUK]);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Zeny - %d", pl_sd->status.zeny);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -3742,55 +2699,56 @@ int atcommand_character_stats (const int fd, struct map_session_data *sd,
*------------------------------------------
*/
//** Character Stats All by fritz
-int atcommand_character_stats_all (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_character_stats_all(const int fd, struct map_session_data *,
+ const char *, const char *)
{
- char output[1024], gmlevel[1024];
- int i;
- int count;
+ int i;
+ int count;
struct map_session_data *pl_sd;
- memset (output, '\0', sizeof (output));
- memset (gmlevel, '\0', sizeof (gmlevel));
-
count = 0;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
-
- if (pc_isGM (pl_sd) > 0)
- sprintf (gmlevel, "| GM Lvl: %d", pc_isGM (pl_sd));
+ std::string gmlevel;
+ if (pc_isGM(pl_sd) > 0)
+ gmlevel = STRPRINTF("| GM Lvl: %d", pc_isGM(pl_sd));
else
- sprintf (gmlevel, " ");
-
- sprintf (output,
- "Name: %s | BLvl: %d | Job: %s (Lvl: %d) | HP: %d/%d | SP: %d/%d",
- pl_sd->status.name, pl_sd->status.base_level,
- job_name (pl_sd->status.pc_class), pl_sd->status.job_level,
- pl_sd->status.hp, pl_sd->status.max_hp, pl_sd->status.sp,
- pl_sd->status.max_sp);
- clif_displaymessage (fd, output);
- sprintf (output,
- "STR: %d | AGI: %d | VIT: %d | INT: %d | DEX: %d | LUK: %d | Zeny: %d %s",
- pl_sd->status.str, pl_sd->status.agi, pl_sd->status.vit,
- pl_sd->status.int_, pl_sd->status.dex, pl_sd->status.luk,
- pl_sd->status.zeny, gmlevel);
- clif_displaymessage (fd, output);
- clif_displaymessage (fd, "--------");
+ gmlevel = " ";
+
+ std::string output;
+ output = STRPRINTF(
+ "Name: %s | BLvl: %d | Job: Novice/Human (Lvl: %d) | HP: %d/%d | SP: %d/%d",
+ pl_sd->status.name, pl_sd->status.base_level,
+ pl_sd->status.job_level,
+ pl_sd->status.hp, pl_sd->status.max_hp,
+ pl_sd->status.sp, pl_sd->status.max_sp);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("STR: %d | AGI: %d | VIT: %d | INT: %d | DEX: %d | LUK: %d | Zeny: %d %s",
+ pl_sd->status.attrs[ATTR::STR],
+ pl_sd->status.attrs[ATTR::AGI],
+ pl_sd->status.attrs[ATTR::VIT],
+ pl_sd->status.attrs[ATTR::INT],
+ pl_sd->status.attrs[ATTR::DEX],
+ pl_sd->status.attrs[ATTR::LUK],
+ pl_sd->status.zeny,
+ gmlevel);
+ clif_displaymessage(fd, output);
+ clif_displaymessage(fd, "--------");
count++;
}
}
if (count == 0)
- clif_displaymessage (fd, "No player found.");
+ clif_displaymessage(fd, "No player found.");
else if (count == 1)
- clif_displaymessage (fd, "1 player found.");
+ clif_displaymessage(fd, "1 player found.");
else
{
- sprintf (output, "%d players found.", count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("%d players found.", count);
+ clif_displaymessage(fd, output);
}
return 0;
@@ -3800,83 +2758,50 @@ int atcommand_character_stats_all (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_character_option (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_character_option(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- int opt1 = 0, opt2 = 0, opt3 = 0;
+ int opt1_ = 0, opt2_ = 0, opt3_ = 0;
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %d %d %99[^\n]", &opt1, &opt2, &opt3,
- character) < 4 || opt1 < 0 || opt2 < 0 || opt3 < 0)
+ || sscanf(message, "%d %d %d %99[^\n]", &opt1_, &opt2_, &opt3_,
+ character) < 4 || opt1_ < 0 || opt2_ < 0 || opt3_ < 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter valid options and a player name (usage: @charoption <param1> <param2> <param3> <charname>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ Opt1 opt1 = Opt1(opt1_);
+ Opt2 opt2 = Opt2(opt2_);
+ Option opt3 = Option(opt3_);
+
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
- { // you can change option only to lower or same level
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
+ {
+ // you can change option only to lower or same level
pl_sd->opt1 = opt1;
pl_sd->opt2 = opt2;
pl_sd->status.option = opt3;
- // fix pecopeco display
- 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;
- 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;
- }
- }
- 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 &= ~0x0020;
- }
- 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 &= ~0x0020;
- }
- }
- }
- clif_changeoption (&pl_sd->bl);
- pc_calcstatus (pl_sd, 0);
- clif_displaymessage (fd, "Character's options changed.");
+
+ clif_changeoption(&pl_sd->bl);
+ pc_calcstatus(pl_sd, 0);
+ clif_displaymessage(fd, "Character's options changed.");
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -3887,35 +2812,35 @@ int atcommand_character_option (const int fd, struct map_session_data *sd,
* charchangesex command (usage: charchangesex <player_name>)
*------------------------------------------
*/
-int atcommand_char_change_sex (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_char_change_sex(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charchangesex <name>).");
return -1;
}
// check player name
- if (strlen (character) < 4)
+ if (strlen(character) < 4)
{
- clif_displaymessage (fd, "Sorry, but a player name have at least 4 characters.");
+ clif_displaymessage(fd, "Sorry, but a player name have at least 4 characters.");
return -1;
}
- else if (strlen (character) > 23)
+ else if (strlen(character) > 23)
{
- clif_displaymessage (fd, "Sorry, but a player name have 23 characters maximum.");
+ clif_displaymessage(fd, "Sorry, but a player name have 23 characters maximum.");
return -1;
}
else
{
- chrif_char_ask_name (sd->status.account_id, character, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
- clif_displaymessage (fd, "Character name sends to char-server to ask it.");
+ chrif_char_ask_name(sd->status.account_id, character, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
+ clif_displaymessage(fd, "Character name sends to char-server to ask it.");
}
return 0;
@@ -3926,35 +2851,35 @@ int atcommand_char_change_sex (const int fd, struct map_session_data *sd,
* This command do a definitiv ban on a player
*------------------------------------------
*/
-int atcommand_char_block (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_char_block(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @block <name>).");
return -1;
}
// check player name
- if (strlen (character) < 4)
+ if (strlen(character) < 4)
{
- clif_displaymessage (fd, "Sorry, but a player name have at least 4 characters.");
+ clif_displaymessage(fd, "Sorry, but a player name have at least 4 characters.");
return -1;
}
- else if (strlen (character) > 23)
+ else if (strlen(character) > 23)
{
- clif_displaymessage (fd, "Sorry, but a player name have 23 characters maximum.");
+ clif_displaymessage(fd, "Sorry, but a player name have 23 characters maximum.");
return -1;
}
else
{
- chrif_char_ask_name (sd->status.account_id, character, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
- clif_displaymessage (fd, "Character name sends to char-server to ask it.");
+ chrif_char_ask_name(sd->status.account_id, character, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
+ clif_displaymessage(fd, "Character name sends to char-server to ask it.");
}
return 0;
@@ -3976,32 +2901,32 @@ int atcommand_char_block (const int fd, struct map_session_data *sd,
* this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
*------------------------------------------
*/
-int atcommand_char_ban (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_char_ban(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char modif[100], character[100];
char *modif_p;
- int year, month, day, hour, minute, second, value;
+ int year, month, day, hour, minute, second, value;
- memset (modif, '\0', sizeof (modif));
- memset (character, '\0', sizeof (character));
+ memset(modif, '\0', sizeof(modif));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%s %99[^\n]", modif, character) < 2)
+ || sscanf(message, "%s %99[^\n]", modif, character) < 2)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter ban time and a player name (usage: @charban/@ban/@banish/@charbanish <time> <name>).");
return -1;
}
- modif[sizeof (modif) - 1] = '\0';
- character[sizeof (character) - 1] = '\0';
+ modif[sizeof(modif) - 1] = '\0';
+ character[sizeof(character) - 1] = '\0';
modif_p = modif;
year = month = day = hour = minute = second = 0;
while (modif_p[0] != '\0')
{
- value = atoi (modif_p);
+ value = atoi(modif_p);
if (value == 0)
modif_p++;
else
@@ -4049,25 +2974,25 @@ int atcommand_char_ban (const int fd, struct map_session_data *sd,
if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0
&& second == 0)
{
- clif_displaymessage (fd, "Invalid time for ban command.");
+ clif_displaymessage(fd, "Invalid time for ban command.");
return -1;
}
// check player name
- if (strlen (character) < 4)
+ if (strlen(character) < 4)
{
- clif_displaymessage (fd, "Sorry, but a player name have at least 4 characters.");
+ clif_displaymessage(fd, "Sorry, but a player name have at least 4 characters.");
return -1;
}
- else if (strlen (character) > 23)
+ else if (strlen(character) > 23)
{
- clif_displaymessage (fd, "Sorry, but a player name have 23 characters maximum.");
+ clif_displaymessage(fd, "Sorry, but a player name have 23 characters maximum.");
return -1;
}
else
{
- chrif_char_ask_name (sd->status.account_id, character, 2, year, month, day, hour, minute, second); // type: 2 - ban
- clif_displaymessage (fd, "Character name sends to char-server to ask it.");
+ chrif_char_ask_name(sd->status.account_id, character, 2, year, month, day, hour, minute, second); // type: 2 - ban
+ clif_displaymessage(fd, "Character name sends to char-server to ask it.");
}
return 0;
@@ -4077,36 +3002,36 @@ int atcommand_char_ban (const int fd, struct map_session_data *sd,
* charunblock command (usage: charunblock <player_name>)
*------------------------------------------
*/
-int atcommand_char_unblock (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_char_unblock(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charunblock <player_name>).");
return -1;
}
// check player name
- if (strlen (character) < 4)
+ if (strlen(character) < 4)
{
- clif_displaymessage (fd, "Sorry, but a player name have at least 4 characters.");
+ clif_displaymessage(fd, "Sorry, but a player name have at least 4 characters.");
return -1;
}
- else if (strlen (character) > 23)
+ else if (strlen(character) > 23)
{
- clif_displaymessage (fd, "Sorry, but a player name have 23 characters maximum.");
+ clif_displaymessage(fd, "Sorry, but a player name have 23 characters maximum.");
return -1;
}
else
{
// send answer to login server via char-server
- chrif_char_ask_name (sd->status.account_id, character, 3, 0, 0, 0, 0, 0, 0); // type: 3 - unblock
- clif_displaymessage (fd, "Character name sends to char-server to ask it.");
+ chrif_char_ask_name(sd->status.account_id, character, 3, 0, 0, 0, 0, 0, 0); // type: 3 - unblock
+ clif_displaymessage(fd, "Character name sends to char-server to ask it.");
}
return 0;
@@ -4116,36 +3041,36 @@ int atcommand_char_unblock (const int fd, struct map_session_data *sd,
* charunban command (usage: charunban <player_name>)
*------------------------------------------
*/
-int atcommand_char_unban (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_char_unban(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charunban <player_name>).");
return -1;
}
// check player name
- if (strlen (character) < 4)
+ if (strlen(character) < 4)
{
- clif_displaymessage (fd, "Sorry, but a player name have at least 4 characters.");
+ clif_displaymessage(fd, "Sorry, but a player name have at least 4 characters.");
return -1;
}
- else if (strlen (character) > 23)
+ else if (strlen(character) > 23)
{
- clif_displaymessage (fd, "Sorry, but a player name have 23 characters maximum.");
+ clif_displaymessage(fd, "Sorry, but a player name have 23 characters maximum.");
return -1;
}
else
{
// send answer to login server via char-server
- chrif_char_ask_name (sd->status.account_id, character, 4, 0, 0, 0, 0, 0, 0); // type: 4 - unban
- clif_displaymessage (fd, "Character name sends to char-server to ask it.");
+ chrif_char_ask_name(sd->status.account_id, character, 4, 0, 0, 0, 0, 0, 0); // type: 4 - unban
+ clif_displaymessage(fd, "Character name sends to char-server to ask it.");
}
return 0;
@@ -4155,128 +3080,62 @@ int atcommand_char_unban (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_character_save (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_character_save(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char map_name[100];
char character[100];
struct map_session_data *pl_sd;
- int x = 0, y = 0;
- int m;
+ int x = 0, y = 0;
+ int m;
- memset (map_name, '\0', sizeof (map_name));
- memset (character, '\0', sizeof (character));
+ memset(map_name, '\0', sizeof(map_name));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%99s %d %d %99[^\n]", map_name, &x, &y,
+ || sscanf(message, "%99s %d %d %99[^\n]", map_name, &x, &y,
character) < 4 || x < 0 || y < 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a valid save point and a player name (usage: @charsave <map> <x> <y> <charname>).");
return -1;
}
- if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat)
- strcat (map_name, ".gat");
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can change save point only to lower or same gm level
- m = map_mapname2mapid (map_name);
+ m = map_mapname2mapid(map_name);
if (m < 0)
{
- clif_displaymessage (fd, "Map not found.");
+ clif_displaymessage(fd, "Map not found.");
return -1;
}
else
{
if (m >= 0 && map[m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to set this map as a save map.");
return -1;
}
- pc_setsavepoint (pl_sd, map_name, x, y);
- clif_displaymessage (fd, "Character's respawn point changed.");
+ pc_setsavepoint(pl_sd, map_name, x, y);
+ clif_displaymessage(fd, "Character's respawn point changed.");
}
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_night (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- if (night_flag != 1)
- {
- night_flag = 1; // 0=day, 1=night [Yor]
- for (i = 0; i < fd_max; i++)
- {
- if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
- && pl_sd->state.auth)
- {
- pl_sd->opt2 |= STATE_BLIND;
- clif_changeoption (&pl_sd->bl);
- clif_displaymessage (pl_sd->fd, "Night has fallen.");
- }
- }
- }
- else
- {
- clif_displaymessage (fd, "Sorry, it's already the night. Impossible to execute the command.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_day (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- if (night_flag != 0)
- {
- night_flag = 0; // 0=day, 1=night [Yor]
- for (i = 0; i < fd_max; i++)
- {
- if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
- && pl_sd->state.auth)
- {
- pl_sd->opt2 &= ~STATE_BLIND;
- clif_changeoption (&pl_sd->bl);
- clif_displaymessage (pl_sd->fd, "Day has arrived.");
- }
- }
- }
- else
- {
- clif_displaymessage (fd, "Sorry, it's already the day. Impossible to execute the command.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -4287,23 +3146,23 @@ int atcommand_day (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_doom (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_doom(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
struct map_session_data *pl_sd;
- int i;
+ int i;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth && i != fd
- && pc_isGM (sd) >= pc_isGM (pl_sd))
+ && pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can doom only lower or same gm level
- pc_damage (NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage (pl_sd->fd, "The holy messenger has given judgement.");
+ pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
+ clif_displaymessage(pl_sd->fd, "The holy messenger has given judgement.");
}
}
- clif_displaymessage (fd, "Judgement was made.");
+ clif_displaymessage(fd, "Judgement was made.");
return 0;
}
@@ -4312,23 +3171,23 @@ int atcommand_doom (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_doommap (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_doommap(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
struct map_session_data *pl_sd;
- int i;
+ int i;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth && i != fd && sd->bl.m == pl_sd->bl.m
- && pc_isGM (sd) >= pc_isGM (pl_sd))
+ && pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can doom only lower or same gm level
- pc_damage (NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage (pl_sd->fd, "The holy messenger has given judgement.");
+ pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
+ clif_displaymessage(pl_sd->fd, "The holy messenger has given judgement.");
}
}
- clif_displaymessage (fd, "Judgement was made.");
+ clif_displaymessage(fd, "Judgement was made.");
return 0;
}
@@ -4337,17 +3196,18 @@ int atcommand_doommap (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-static void atcommand_raise_sub (struct map_session_data *sd)
+static
+void atcommand_raise_sub(struct map_session_data *sd)
{
- if (sd && sd->state.auth && pc_isdead (sd))
+ if (sd && sd->state.auth && pc_isdead(sd))
{
sd->status.hp = sd->status.max_hp;
sd->status.sp = sd->status.max_sp;
- pc_setstand (sd);
- clif_updatestatus (sd, SP_HP);
- clif_updatestatus (sd, SP_SP);
- clif_resurrection (&sd->bl, 1);
- clif_displaymessage (sd->fd, "Mercy has been shown.");
+ pc_setstand(sd);
+ clif_updatestatus(sd, SP::HP);
+ clif_updatestatus(sd, SP::SP);
+ clif_resurrection(&sd->bl, 1);
+ clif_displaymessage(sd->fd, "Mercy has been shown.");
}
}
@@ -4355,17 +3215,17 @@ static void atcommand_raise_sub (struct map_session_data *sd)
*
*------------------------------------------
*/
-int atcommand_raise (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_raise(const int fd, struct map_session_data *,
+ const char *, const char *)
{
- int i;
+ int i;
for (i = 0; i < fd_max; i++)
{
if (session[i])
- atcommand_raise_sub ((struct map_session_data *)session[i]->session_data);
+ atcommand_raise_sub((struct map_session_data *)session[i]->session_data);
}
- clif_displaymessage (fd, "Mercy has been granted.");
+ clif_displaymessage(fd, "Mercy has been granted.");
return 0;
}
@@ -4374,19 +3234,19 @@ int atcommand_raise (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_raisemap (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_raisemap(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
struct map_session_data *pl_sd;
- int i;
+ int i;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth && sd->bl.m == pl_sd->bl.m)
- atcommand_raise_sub (pl_sd);
+ atcommand_raise_sub(pl_sd);
}
- clif_displaymessage (fd, "Mercy has been granted.");
+ clif_displaymessage(fd, "Mercy has been granted.");
return 0;
}
@@ -4395,34 +3255,34 @@ int atcommand_raisemap (const int fd, struct map_session_data *sd,
* atcommand_character_baselevel @charbaselvlで対象キャラのレベルを上げる
*------------------------------------------
*/
-int atcommand_character_baselevel (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_character_baselevel(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
char character[100];
- int level = 0, i;
+ int level = 0, i;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &level, character) < 2
+ || sscanf(message, "%d %99[^\n]", &level, character) < 2
|| level == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a level adjustement and a player name (usage: @charblvl <#> <nickname>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can change base level only lower or same gm level
if (level > 0)
{
if (pl_sd->status.base_level == battle_config.maximum_level)
{ // check for max level by Valaris
- clif_displaymessage (fd, "Character's base level can't go any higher.");
+ clif_displaymessage(fd, "Character's base level can't go any higher.");
return 0;
} // End Addition
if (level > battle_config.maximum_level || level > (battle_config.maximum_level - pl_sd->status.base_level)) // fix positiv overflow
@@ -4433,19 +3293,19 @@ int atcommand_character_baselevel (const int fd, struct map_session_data *sd,
pl_sd->status.status_point +=
(pl_sd->status.base_level + i + 14) / 4;
pl_sd->status.base_level += level;
- clif_updatestatus (pl_sd, SP_BASELEVEL);
- clif_updatestatus (pl_sd, SP_NEXTBASEEXP);
- clif_updatestatus (pl_sd, SP_STATUSPOINT);
- pc_calcstatus (pl_sd, 0);
- pc_heal (pl_sd, pl_sd->status.max_hp, pl_sd->status.max_sp);
- clif_misceffect (&pl_sd->bl, 0);
- clif_displaymessage (fd, "Character's base level raised.");
+ clif_updatestatus(pl_sd, SP::BASELEVEL);
+ clif_updatestatus(pl_sd, SP::NEXTBASEEXP);
+ clif_updatestatus(pl_sd, SP::STATUSPOINT);
+ pc_calcstatus(pl_sd, 0);
+ pc_heal(pl_sd, pl_sd->status.max_hp, pl_sd->status.max_sp);
+ clif_misceffect(&pl_sd->bl, 0);
+ clif_displaymessage(fd, "Character's base level raised.");
}
else
{
if (pl_sd->status.base_level == 1)
{
- clif_displaymessage (fd, "Character's base level can't go any lower.");
+ clif_displaymessage(fd, "Character's base level can't go any lower.");
return -1;
}
if (level < -battle_config.maximum_level || level < (1 - pl_sd->status.base_level)) // fix negativ overflow
@@ -4457,28 +3317,28 @@ int atcommand_character_baselevel (const int fd, struct map_session_data *sd,
(pl_sd->status.base_level + i + 14) / 4;
if (pl_sd->status.status_point < 0)
pl_sd->status.status_point = 0;
- clif_updatestatus (pl_sd, SP_STATUSPOINT);
+ clif_updatestatus(pl_sd, SP::STATUSPOINT);
} // to add: remove status points from stats
pl_sd->status.base_level += level;
pl_sd->status.base_exp = 0;
- clif_updatestatus (pl_sd, SP_BASELEVEL);
- clif_updatestatus (pl_sd, SP_NEXTBASEEXP);
- clif_updatestatus (pl_sd, SP_BASEEXP);
- pc_calcstatus (pl_sd, 0);
- clif_displaymessage (fd, "Character's base level lowered.");
+ clif_updatestatus(pl_sd, SP::BASELEVEL);
+ clif_updatestatus(pl_sd, SP::NEXTBASEEXP);
+ clif_updatestatus(pl_sd, SP::BASEEXP);
+ pc_calcstatus(pl_sd, 0);
+ clif_displaymessage(fd, "Character's base level lowered.");
}
- // Reset their stat points to prevent extra points from stacking
- atcommand_charstreset(fd, sd,"@charstreset", character);
+ // Reset their stat points to prevent extra points from stacking
+ atcommand_charstreset(fd, sd,"@charstreset", character);
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -4489,86 +3349,81 @@ int atcommand_character_baselevel (const int fd, struct map_session_data *sd,
* atcommand_character_joblevel @charjoblvlで対象キャラのJobレベルを上げる
*------------------------------------------
*/
-int atcommand_character_joblevel (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_character_joblevel(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
char character[100];
- int max_level = 50, level = 0;
- //転生や養子の場合の元の職業を算出する
- struct pc_base_job pl_s_class;
+ int max_level = 50, level = 0;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &level, character) < 2
+ || sscanf(message, "%d %99[^\n]", &level, character) < 2
|| level == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a level adjustement and a player name (usage: @charjlvl <#> <nickname>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- pl_s_class = pc_calc_base_job (pl_sd->status.pc_class);
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
- { // you can change job level only lower or same gm level
- if (pl_s_class.job == 0)
- max_level -= 40;
- if ((pl_s_class.job == 23) || (pl_s_class.upper == 1 && pl_s_class.type == 2)) //スパノビと転生職はJobレベルの最高が70
- max_level += 20;
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
+ {
+ // you can change job level only lower or same gm level
+ max_level -= 40;
if (level > 0)
{
if (pl_sd->status.job_level == max_level)
{
- clif_displaymessage (fd, "Character's job level can't go any higher.");
+ clif_displaymessage(fd, "Character's job level can't go any higher.");
return -1;
}
if (pl_sd->status.job_level + level > max_level)
level = max_level - pl_sd->status.job_level;
pl_sd->status.job_level += level;
- clif_updatestatus (pl_sd, SP_JOBLEVEL);
- clif_updatestatus (pl_sd, SP_NEXTJOBEXP);
+ clif_updatestatus(pl_sd, SP::JOBLEVEL);
+ clif_updatestatus(pl_sd, SP::NEXTJOBEXP);
pl_sd->status.skill_point += level;
- clif_updatestatus (pl_sd, SP_SKILLPOINT);
- pc_calcstatus (pl_sd, 0);
- clif_misceffect (&pl_sd->bl, 1);
- clif_displaymessage (fd, "character's job level raised.");
+ clif_updatestatus(pl_sd, SP::SKILLPOINT);
+ pc_calcstatus(pl_sd, 0);
+ clif_misceffect(&pl_sd->bl, 1);
+ clif_displaymessage(fd, "character's job level raised.");
}
else
{
if (pl_sd->status.job_level == 1)
{
- clif_displaymessage (fd, "Character's job level can't go any lower.");
+ clif_displaymessage(fd, "Character's job level can't go any lower.");
return -1;
}
if (pl_sd->status.job_level + level < 1)
level = 1 - pl_sd->status.job_level;
pl_sd->status.job_level += level;
- clif_updatestatus (pl_sd, SP_JOBLEVEL);
- clif_updatestatus (pl_sd, SP_NEXTJOBEXP);
+ clif_updatestatus(pl_sd, SP::JOBLEVEL);
+ clif_updatestatus(pl_sd, SP::NEXTJOBEXP);
if (pl_sd->status.skill_point > 0)
{
pl_sd->status.skill_point += level;
if (pl_sd->status.skill_point < 0)
pl_sd->status.skill_point = 0;
- clif_updatestatus (pl_sd, SP_SKILLPOINT);
+ clif_updatestatus(pl_sd, SP::SKILLPOINT);
} // to add: remove status points from skills
- pc_calcstatus (pl_sd, 0);
- clif_displaymessage (fd, "Character's job level lowered.");
+ pc_calcstatus(pl_sd, 0);
+ clif_displaymessage(fd, "Character's job level lowered.");
}
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -4579,34 +3434,34 @@ int atcommand_character_joblevel (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_kick (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_kick(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
char character[100];
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @kick <charname>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd)) // you can kick only lower or same gm level
- clif_GM_kick (sd, pl_sd, 1);
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) // you can kick only lower or same gm level
+ clif_GM_kick(sd, pl_sd, 1);
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -4617,23 +3472,23 @@ int atcommand_kick (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_kickall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_kickall(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
struct map_session_data *pl_sd;
- int i;
+ int i;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
- && pl_sd->state.auth && pc_isGM (sd) >= pc_isGM (pl_sd))
+ && pl_sd->state.auth && pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can kick only lower or same gm level
if (sd->status.account_id != pl_sd->status.account_id)
- clif_GM_kick (sd, pl_sd, 0);
+ clif_GM_kick(sd, pl_sd, 0);
}
}
- clif_displaymessage (fd, "All players have been kicked!");
+ clif_displaymessage(fd, "All players have been kicked!");
return 0;
}
@@ -4642,57 +3497,44 @@ int atcommand_kickall (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_allskills (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_questskill(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- pc_allskillup (sd); // all skills
- sd->status.skill_point = 0; // 0 skill points
- clif_updatestatus (sd, SP_SKILLPOINT); // update
- clif_displaymessage (fd, "You have received all skills.");
+ int skill_id_;
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_questskill (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- int skill_id;
-
- if (!message || !*message || (skill_id = atoi (message)) < 0)
+ if (!message || !*message || (skill_id_ = atoi(message)) < 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a quest skill number (usage: @questskill <#:0+>).");
return -1;
}
- if (skill_id >= 0 && skill_id < MAX_SKILL_DB)
+ SkillID skill_id = SkillID(skill_id_);
+
+ if (/*skill_id >= SkillID() &&*/ skill_id < SkillID::MAX_SKILL_DB)
{
- if (skill_get_inf2 (skill_id) & 0x01)
+ if (skill_get_inf2(skill_id) & 0x01)
{
- if (pc_checkskill (sd, skill_id) == 0)
+ if (pc_checkskill(sd, skill_id) == 0)
{
- pc_skill (sd, skill_id, 1, 0);
- clif_displaymessage (fd, "You have learned the skill.");
+ pc_skill(sd, skill_id, 1, 0);
+ clif_displaymessage(fd, "You have learned the skill.");
}
else
{
- clif_displaymessage (fd, "You already have this quest skill.");
+ clif_displaymessage(fd, "You already have this quest skill.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "This skill number doesn't exist or isn't a quest skill.");
+ clif_displaymessage(fd, "This skill number doesn't exist or isn't a quest skill.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "This skill number doesn't exist.");
+ clif_displaymessage(fd, "This skill number doesn't exist.");
return -1;
}
@@ -4703,56 +3545,58 @@ int atcommand_questskill (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_charquestskill (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charquestskill(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
struct map_session_data *pl_sd;
- int skill_id = 0;
+ int skill_id_ = 0;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &skill_id, character) < 2
- || skill_id < 0)
+ || sscanf(message, "%d %99[^\n]", &skill_id_, character) < 2
+ || skill_id_ < 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a quest skill number and a player name (usage: @charquestskill <#:0+> <char_name>).");
return -1;
}
- if (skill_id >= 0 && skill_id < MAX_SKILL_DB)
+ SkillID skill_id = SkillID(skill_id_);
+
+ if (/*skill_id >= SkillID() &&*/ skill_id < SkillID::MAX_SKILL_DB)
{
- if (skill_get_inf2 (skill_id) & 0x01)
+ if (skill_get_inf2(skill_id) & 0x01)
{
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_checkskill (pl_sd, skill_id) == 0)
+ if (pc_checkskill(pl_sd, skill_id) == 0)
{
- pc_skill (pl_sd, skill_id, 1, 0);
- clif_displaymessage (fd, "This player has learned the skill.");
+ pc_skill(pl_sd, skill_id, 1, 0);
+ clif_displaymessage(fd, "This player has learned the skill.");
}
else
{
- clif_displaymessage (fd, "This player already has this quest skill.");
+ clif_displaymessage(fd, "This player already has this quest skill.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "This skill number doesn't exist or isn't a quest skill.");
+ clif_displaymessage(fd, "This skill number doesn't exist or isn't a quest skill.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "This skill number doesn't exist.");
+ clif_displaymessage(fd, "This skill number doesn't exist.");
return -1;
}
@@ -4763,44 +3607,46 @@ int atcommand_charquestskill (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_lostskill (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_lostskill(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int skill_id;
+ int skill_id_;
- if (!message || !*message || (skill_id = atoi (message)) < 0)
+ if (!message || !*message || (skill_id_ = atoi(message)) < 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a quest skill number (usage: @lostskill <#:0+>).");
return -1;
}
- if (skill_id >= 0 && skill_id < MAX_SKILL)
+ SkillID skill_id = SkillID(skill_id_);
+
+ if (/*skill_id >= SkillID() &&*/ skill_id < MAX_SKILL)
{
- if (skill_get_inf2 (skill_id) & 0x01)
+ if (skill_get_inf2(skill_id) & 0x01)
{
- if (pc_checkskill (sd, skill_id) > 0)
+ if (pc_checkskill(sd, skill_id) > 0)
{
sd->status.skill[skill_id].lv = 0;
- sd->status.skill[skill_id].flags = 0;
- clif_skillinfoblock (sd);
- clif_displaymessage (fd, "You have forgotten the skill.");
+ sd->status.skill[skill_id].flags = SkillFlags::ZERO;
+ clif_skillinfoblock(sd);
+ clif_displaymessage(fd, "You have forgotten the skill.");
}
else
{
- clif_displaymessage (fd, "You don't have this quest skill.");
+ clif_displaymessage(fd, "You don't have this quest skill.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "This skill number doesn't exist or isn't a quest skill.");
+ clif_displaymessage(fd, "This skill number doesn't exist or isn't a quest skill.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "This skill number doesn't exist.");
+ clif_displaymessage(fd, "This skill number doesn't exist.");
return -1;
}
@@ -4811,58 +3657,60 @@ int atcommand_lostskill (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_charlostskill (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charlostskill(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
struct map_session_data *pl_sd;
- int skill_id = 0;
+ int skill_id_ = 0;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &skill_id, character) < 2
- || skill_id < 0)
+ || sscanf(message, "%d %99[^\n]", &skill_id_, character) < 2
+ || skill_id_ < 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a quest skill number and a player name (usage: @charlostskill <#:0+> <char_name>).");
return -1;
}
- if (skill_id >= 0 && skill_id < MAX_SKILL)
+ SkillID skill_id = SkillID(skill_id_);
+
+ if (/*skill_id >= SkillID() &&*/ skill_id < MAX_SKILL)
{
- if (skill_get_inf2 (skill_id) & 0x01)
+ if (skill_get_inf2(skill_id) & 0x01)
{
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_checkskill (pl_sd, skill_id) > 0)
+ if (pc_checkskill(pl_sd, skill_id) > 0)
{
pl_sd->status.skill[skill_id].lv = 0;
- pl_sd->status.skill[skill_id].flags = 0;
- clif_skillinfoblock (pl_sd);
- clif_displaymessage (fd, "This player has forgotten the skill.");
+ pl_sd->status.skill[skill_id].flags = SkillFlags::ZERO;
+ clif_skillinfoblock(pl_sd);
+ clif_displaymessage(fd, "This player has forgotten the skill.");
}
else
{
- clif_displaymessage (fd, "This player doesn't have this quest skill.");
+ clif_displaymessage(fd, "This player doesn't have this quest skill.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "This skill number doesn't exist or isn't a quest skill.");
+ clif_displaymessage(fd, "This skill number doesn't exist or isn't a quest skill.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "This skill number doesn't exist.");
+ clif_displaymessage(fd, "This skill number doesn't exist.");
return -1;
}
@@ -4873,88 +3721,21 @@ int atcommand_charlostskill (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_party (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_party(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char party[100];
- memset (party, '\0', sizeof (party));
+ memset(party, '\0', sizeof(party));
- if (!message || !*message || sscanf (message, "%99[^\n]", party) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", party) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a party name (usage: @party <party_name>).");
return -1;
}
- party_create (sd, party);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_guild (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- char guild[100];
- int prev;
-
- memset (guild, '\0', sizeof (guild));
-
- if (!message || !*message || sscanf (message, "%99[^\n]", guild) < 1)
- {
- clif_displaymessage (fd,
- "Please, enter a guild name (usage: @guild <guild_name>).");
- return -1;
- }
-
- prev = battle_config.guild_emperium_check;
- battle_config.guild_emperium_check = 0;
- guild_create (sd, guild);
- battle_config.guild_emperium_check = prev;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_agitstart (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- if (agit_flag == 1)
- {
- clif_displaymessage (fd, "Already it has started siege warfare.");
- return -1;
- }
-
- agit_flag = 1;
- guild_agit_start ();
- clif_displaymessage (fd, "Guild siege warfare start!");
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_agitend (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- if (agit_flag == 0)
- {
- clif_displaymessage (fd, "Siege warfare hasn't started yet.");
- return -1;
- }
-
- agit_flag = 0;
- guild_agit_end ();
- clif_displaymessage (fd, "Guild siege warfare end!");
+ party_create(sd, party);
return 0;
}
@@ -4963,11 +3744,11 @@ int atcommand_agitend (const int fd, struct map_session_data *sd,
* @mapexitでマップサーバーを終了させる
*------------------------------------------
*/
-int atcommand_mapexit (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_mapexit(const int, struct map_session_data *sd,
+ const char *, const char *)
{
struct map_session_data *pl_sd;
- int i;
+ int i;
for (i = 0; i < fd_max; i++)
{
@@ -4975,10 +3756,10 @@ int atcommand_mapexit (const int fd, struct map_session_data *sd,
&& pl_sd->state.auth)
{
if (sd->status.account_id != pl_sd->status.account_id)
- clif_GM_kick (sd, pl_sd, 0);
+ clif_GM_kick(sd, pl_sd, 0);
}
}
- clif_GM_kick (sd, sd, 0);
+ clif_GM_kick(sd, sd, 0);
runflag = 0;
@@ -4989,39 +3770,37 @@ int atcommand_mapexit (const int fd, struct map_session_data *sd,
* idsearch <part_of_name>: revrited by [Yor]
*------------------------------------------
*/
-int atcommand_idsearch (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_idsearch(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char item_name[100];
- char output[200];
- int i, match;
+ int i, match;
struct item_data *item;
- memset (item_name, '\0', sizeof (item_name));
- memset (output, '\0', sizeof (output));
+ memset(item_name, '\0', sizeof(item_name));
- if (!message || !*message || sscanf (message, "%99s", item_name) < 0)
+ if (!message || !*message || sscanf(message, "%99s", item_name) < 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a part of item name (usage: @idsearch <part_of_item_name>).");
return -1;
}
- sprintf (output, "The reference result of '%s' (name: id):", item_name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("The reference result of '%s' (name: id):", item_name);
+ clif_displaymessage(fd, output);
match = 0;
for (i = 0; i < 20000; i++)
{
- if ((item = itemdb_exists (i)) != NULL
- && strstr (item->jname, item_name) != NULL)
+ if ((item = itemdb_exists(i)) != NULL
+ && strstr(item->jname, item_name) != NULL)
{
match++;
- sprintf (output, "%s: %d", item->jname, item->nameid);
- clif_displaymessage (fd, output);
+ output = STRPRINTF("%s: %d", item->jname, item->nameid);
+ clif_displaymessage(fd, output);
}
}
- sprintf (output, "It is %d affair above.", match);
- clif_displaymessage (fd, output);
+ output = STRPRINTF("It is %d affair above.", match);
+ clif_displaymessage(fd, output);
return 0;
}
@@ -5030,40 +3809,39 @@ int atcommand_idsearch (const int fd, struct map_session_data *sd,
* Character Skill Reset
*------------------------------------------
*/
-int atcommand_charskreset (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charskreset(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- char output[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charskreset <charname>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can reset skill points only lower or same gm level
- pc_resetskill (pl_sd);
- sprintf (output, "'%s' skill points reseted!", character);
- clif_displaymessage (fd, output);
+ pc_resetskill(pl_sd);
+ std::string output = STRPRINTF(
+ "'%s' skill points reseted!", character);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -5074,40 +3852,40 @@ int atcommand_charskreset (const int fd, struct map_session_data *sd,
* Character Stat Reset
*------------------------------------------
*/
-int atcommand_charstreset (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charstreset(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- char output[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charstreset <charname>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can reset stats points only lower or same gm level
- pc_resetstate (pl_sd);
- sprintf (output, "'%s' stats points reseted!", character);
- clif_displaymessage (fd, output);
+ pc_resetstate(pl_sd);
+ std::string output = STRPRINTF(
+ "'%s' stats points reseted!",
+ character);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -5118,43 +3896,42 @@ int atcommand_charstreset (const int fd, struct map_session_data *sd,
* Character Reset
*------------------------------------------
*/
-int atcommand_charreset (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charreset(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- char output[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charreset <charname>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can reset a character only for lower or same GM level
- pc_resetstate (pl_sd);
- pc_resetskill (pl_sd);
- pc_setglobalreg (pl_sd, "MAGIC_FLAGS", 0); // [Fate] Reset magic quest variables
- pc_setglobalreg (pl_sd, "MAGIC_EXP", 0); // [Fate] Reset magic experience
- sprintf (output, "'%s' skill and stats points reseted!", character);
- clif_displaymessage (fd, output);
+ pc_resetstate(pl_sd);
+ pc_resetskill(pl_sd);
+ pc_setglobalreg(pl_sd, "MAGIC_FLAGS", 0); // [Fate] Reset magic quest variables
+ pc_setglobalreg(pl_sd, "MAGIC_EXP", 0); // [Fate] Reset magic experience
+ std::string output = STRPRINTF(
+ "'%s' skill and stats points reseted!", character);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -5165,55 +3942,53 @@ int atcommand_charreset (const int fd, struct map_session_data *sd,
* Character Wipe
*------------------------------------------
*/
-int atcommand_char_wipe (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_char_wipe(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- char output[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charwipe <charname>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can reset a character only for lower or same GM level
- int i;
+ int i;
// Reset base level
pl_sd->status.base_level = 1;
pl_sd->status.base_exp = 0;
- clif_updatestatus (pl_sd, SP_BASELEVEL);
- clif_updatestatus (pl_sd, SP_NEXTBASEEXP);
- clif_updatestatus (pl_sd, SP_BASEEXP);
+ clif_updatestatus(pl_sd, SP::BASELEVEL);
+ clif_updatestatus(pl_sd, SP::NEXTBASEEXP);
+ clif_updatestatus(pl_sd, SP::BASEEXP);
// Reset job level
pl_sd->status.job_level = 1;
pl_sd->status.job_exp = 0;
- clif_updatestatus (pl_sd, SP_JOBLEVEL);
- clif_updatestatus (pl_sd, SP_NEXTJOBEXP);
- clif_updatestatus (pl_sd, SP_JOBEXP);
+ clif_updatestatus(pl_sd, SP::JOBLEVEL);
+ clif_updatestatus(pl_sd, SP::NEXTJOBEXP);
+ clif_updatestatus(pl_sd, SP::JOBEXP);
// Zeny to 50
pl_sd->status.zeny = 50;
- clif_updatestatus (pl_sd, SP_ZENY);
+ clif_updatestatus(pl_sd, SP::ZENY);
// Clear inventory
for (i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].amount)
{
- if (sd->status.inventory[i].equip)
- pc_unequipitem (pl_sd, i, 0);
- pc_delitem (pl_sd, i, sd->status.inventory[i].amount, 0);
+ if (bool(sd->status.inventory[i].equip))
+ pc_unequipitem(pl_sd, i, CalcStatus::NOW);
+ pc_delitem(pl_sd, i, sd->status.inventory[i].amount, 0);
}
}
@@ -5222,29 +3997,29 @@ int atcommand_char_wipe (const int fd, struct map_session_data *sd,
item.nameid = 1201; // knife
item.identify = 1;
item.broken = 0;
- pc_additem (pl_sd, &item, 1);
+ pc_additem(pl_sd, &item, 1);
item.nameid = 1202; // shirt
- pc_additem (pl_sd, &item, 1);
+ pc_additem(pl_sd, &item, 1);
// Reset stats and skills
- pc_calcstatus (pl_sd, 0);
- pc_resetstate (pl_sd);
- pc_resetskill (pl_sd);
- pc_setglobalreg (pl_sd, "MAGIC_FLAGS", 0); // [Fate] Reset magic quest variables
- pc_setglobalreg (pl_sd, "MAGIC_EXP", 0); // [Fate] Reset magic experience
-
- sprintf (output, "%s: wiped.", character);
- clif_displaymessage (fd, output);
+ pc_calcstatus(pl_sd, 0);
+ pc_resetstate(pl_sd);
+ pc_resetskill(pl_sd);
+ pc_setglobalreg(pl_sd, "MAGIC_FLAGS", 0); // [Fate] Reset magic quest variables
+ pc_setglobalreg(pl_sd, "MAGIC_EXP", 0); // [Fate] Reset magic experience
+
+ std::string output = STRPRINTF("%s: wiped.", character);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -5255,61 +4030,51 @@ int atcommand_char_wipe (const int fd, struct map_session_data *sd,
* Character Model by chbrules
*------------------------------------------
*/
-int atcommand_charmodel (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charmodel(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
- int hair_style = 0, hair_color = 0, cloth_color = 0;
+ int hair_style = 0, hair_color = 0, cloth_color = 0;
struct map_session_data *pl_sd;
char character[100];
- char output[200];
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %d %d %99[^\n]", &hair_style, &hair_color,
+ || sscanf(message, "%d %d %d %99[^\n]", &hair_style, &hair_color,
&cloth_color, character) < 4 || hair_style < 0
|| hair_color < 0 || cloth_color < 0)
{
- sprintf (output,
- "Please, enter a valid model and a player name (usage: @charmodel <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d> <name>).",
- MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR,
- MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "Please, enter a valid model and a player name (usage: @charmodel <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d> <name>).",
+ MIN_HAIR_STYLE, MAX_HAIR_STYLE,
+ MIN_HAIR_COLOR, MAX_HAIR_COLOR,
+ MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
+ clif_displaymessage(fd, output);
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE &&
hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR &&
cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR)
{
-
- if (cloth_color != 0 &&
- pl_sd->status.sex == 1 &&
- (pl_sd->status.pc_class == 12 || pl_sd->status.pc_class == 17))
- {
- clif_displaymessage (fd, "You can't use this command with this class.");
- return -1;
- }
- else
{
- pc_changelook (pl_sd, LOOK_HAIR, hair_style);
- pc_changelook (pl_sd, LOOK_HAIR_COLOR, hair_color);
- pc_changelook (pl_sd, LOOK_CLOTHES_COLOR, cloth_color);
- clif_displaymessage (fd, "Appearence changed.");
+ pc_changelook(pl_sd, LOOK::HAIR, hair_style);
+ pc_changelook(pl_sd, LOOK::HAIR_COLOR, hair_color);
+ pc_changelook(pl_sd, LOOK::CLOTHES_COLOR, cloth_color);
+ clif_displaymessage(fd, "Appearence changed.");
}
}
else
{
- clif_displaymessage (fd, "An invalid number was specified.");
+ clif_displaymessage(fd, "An invalid number was specified.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -5320,26 +4085,26 @@ int atcommand_charmodel (const int fd, struct map_session_data *sd,
* Character Skill Point (Rewritten by [Yor])
*------------------------------------------
*/
-int atcommand_charskpoint (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charskpoint(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
char character[100];
- int new_skill_point;
- int point = 0;
+ int new_skill_point;
+ int point = 0;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &point, character) < 2
+ || sscanf(message, "%d %99[^\n]", &point, character) < 2
|| point == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a number and a player name (usage: @charskpoint <amount> <name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
new_skill_point = (int) pl_sd->status.skill_point + point;
if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow
@@ -5349,21 +4114,21 @@ int atcommand_charskpoint (const int fd, struct map_session_data *sd,
if (new_skill_point != (int) pl_sd->status.skill_point)
{
pl_sd->status.skill_point = new_skill_point;
- clif_updatestatus (pl_sd, SP_SKILLPOINT);
- clif_displaymessage (fd, "Character's number of skill points changed!");
+ clif_updatestatus(pl_sd, SP::SKILLPOINT);
+ clif_displaymessage(fd, "Character's number of skill points changed!");
}
else
{
if (point < 0)
- clif_displaymessage (fd, "Impossible to decrease the number/value.");
+ clif_displaymessage(fd, "Impossible to decrease the number/value.");
else
- clif_displaymessage (fd, "Impossible to increase the number/value.");
+ clif_displaymessage(fd, "Impossible to increase the number/value.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -5374,26 +4139,26 @@ int atcommand_charskpoint (const int fd, struct map_session_data *sd,
* Character Status Point (rewritten by [Yor])
*------------------------------------------
*/
-int atcommand_charstpoint (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charstpoint(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
char character[100];
- int new_status_point;
- int point = 0;
+ int new_status_point;
+ int point = 0;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &point, character) < 2
+ || sscanf(message, "%d %99[^\n]", &point, character) < 2
|| point == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a number and a player name (usage: @charstpoint <amount> <name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
new_status_point = (int) pl_sd->status.status_point + point;
if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow
@@ -5403,21 +4168,21 @@ int atcommand_charstpoint (const int fd, struct map_session_data *sd,
if (new_status_point != (int) pl_sd->status.status_point)
{
pl_sd->status.status_point = new_status_point;
- clif_updatestatus (pl_sd, SP_STATUSPOINT);
- clif_displaymessage (fd, "Character's number of status points changed!");
+ clif_updatestatus(pl_sd, SP::STATUSPOINT);
+ clif_displaymessage(fd, "Character's number of status points changed!");
}
else
{
if (point < 0)
- clif_displaymessage (fd, "Impossible to decrease the number/value.");
+ clif_displaymessage(fd, "Impossible to decrease the number/value.");
else
- clif_displaymessage (fd, "Impossible to increase the number/value.");
+ clif_displaymessage(fd, "Impossible to increase the number/value.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -5428,24 +4193,24 @@ int atcommand_charstpoint (const int fd, struct map_session_data *sd,
* Character Zeny Point (Rewritten by [Yor])
*------------------------------------------
*/
-int atcommand_charzeny (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charzeny(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
char character[100];
- int zeny = 0, new_zeny;
+ int zeny = 0, new_zeny;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &zeny, character) < 2 || zeny == 0)
+ || sscanf(message, "%d %99[^\n]", &zeny, character) < 2 || zeny == 0)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a number and a player name (usage: @charzeny <zeny> <name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
new_zeny = pl_sd->status.zeny + zeny;
if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow
@@ -5455,21 +4220,21 @@ int atcommand_charzeny (const int fd, struct map_session_data *sd,
if (new_zeny != pl_sd->status.zeny)
{
pl_sd->status.zeny = new_zeny;
- clif_updatestatus (pl_sd, SP_ZENY);
- clif_displaymessage (fd, "Character's number of zenys changed!");
+ clif_updatestatus(pl_sd, SP::ZENY);
+ clif_displaymessage(fd, "Character's number of zenys changed!");
}
else
{
if (zeny < 0)
- clif_displaymessage (fd, "Impossible to decrease the number/value.");
+ clif_displaymessage(fd, "Impossible to decrease the number/value.");
else
- clif_displaymessage (fd, "Impossible to increase the number/value.");
+ clif_displaymessage(fd, "Impossible to increase the number/value.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -5480,20 +4245,17 @@ int atcommand_charzeny (const int fd, struct map_session_data *sd,
* Recall All Characters Online To Your Location
*------------------------------------------
*/
-int atcommand_recallall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_recallall(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
struct map_session_data *pl_sd;
- int i;
- int count;
- char output[200];
-
- memset (output, '\0', sizeof (output));
+ int i;
+ int count;
if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp somenone to your actual map.");
return -1;
}
@@ -5504,92 +4266,23 @@ int atcommand_recallall (const int fd, struct map_session_data *sd,
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth
&& sd->status.account_id != pl_sd->status.account_id
- && pc_isGM (sd) >= pc_isGM (pl_sd))
+ && pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can recall only lower or same level
if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
count++;
else
- pc_setpos (pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
+ pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, BeingRemoveWhy::QUIT);
}
}
- clif_displaymessage (fd, "All characters recalled!");
+ clif_displaymessage(fd, "All characters recalled!");
if (count)
{
- sprintf (output,
- "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.",
- count);
- clif_displaymessage (fd, output);
- }
-
- return 0;
-}
-
-/*==========================================
- * Recall online characters of a guild to your location
- *------------------------------------------
- */
-int atcommand_guildrecall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- struct map_session_data *pl_sd;
- int i;
- char guild_name[100];
- char output[200];
- struct guild *g;
- int count;
-
- memset (guild_name, '\0', sizeof (guild_name));
- memset (output, '\0', sizeof (output));
-
- if (!message || !*message || sscanf (message, "%99[^\n]", guild_name) < 1)
- {
- clif_displaymessage (fd,
- "Please, enter a guild name/id (usage: @guildrecall <guild_name/id>).");
- return -1;
- }
-
- 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 warp somenone to your actual map.");
- return -1;
- }
-
- if ((g = guild_searchname (guild_name)) != NULL || // name first to avoid error when name begin with a number
- (g = guild_search (atoi (message))) != NULL)
- {
- count = 0;
- for (i = 0; i < fd_max; i++)
- {
- if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
- && pl_sd->state.auth
- && sd->status.account_id != pl_sd->status.account_id
- && pl_sd->status.guild_id == g->guild_id)
- {
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
- count++;
- else
- pc_setpos (pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- }
- }
- sprintf (output, "All online characters of the %s guild are near you.", g->name);
- clif_displaymessage (fd, output);
- if (count)
- {
- sprintf (output,
- "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.",
- count);
- clif_displaymessage (fd, output);
- }
- }
- else
- {
- clif_displaymessage (fd, "Incorrect name/ID, or no one from the guild is online.");
- return -1;
+ std::string output = STRPRINTF(
+ "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.",
+ count);
+ clif_displaymessage(fd, output);
}
return 0;
@@ -5599,36 +4292,34 @@ int atcommand_guildrecall (const int fd, struct map_session_data *sd,
* Recall online characters of a party to your location
*------------------------------------------
*/
-int atcommand_partyrecall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_partyrecall(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int i;
+ int i;
struct map_session_data *pl_sd;
char party_name[100];
- char output[200];
struct party *p;
- int count;
+ int count;
- memset (party_name, '\0', sizeof (party_name));
- memset (output, '\0', sizeof (output));
+ memset(party_name, '\0', sizeof(party_name));
- if (!message || !*message || sscanf (message, "%99[^\n]", party_name) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a party name/id (usage: @partyrecall <party_name/id>).");
return -1;
}
if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp somenone to your actual map.");
return -1;
}
- if ((p = party_searchname (party_name)) != NULL || // name first to avoid error when name begin with a number
- (p = party_search (atoi (message))) != NULL)
+ if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number
+ (p = party_search(atoi(message))) != NULL)
{
count = 0;
for (i = 0; i < fd_max; i++)
@@ -5639,25 +4330,25 @@ int atcommand_partyrecall (const int fd, struct map_session_data *sd,
&& pl_sd->status.party_id == p->party_id)
{
if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
count++;
else
- pc_setpos (pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
+ pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, BeingRemoveWhy::QUIT);
}
}
- sprintf (output, "All online characters of the %s party are near you.", p->name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("All online characters of the %s party are near you.", p->name);
+ clif_displaymessage(fd, output);
if (count)
{
- sprintf (output,
- "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.",
- count);
- clif_displaymessage (fd, output);
+ output = STRPRINTF(
+ "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.",
+ count);
+ clif_displaymessage(fd, output);
}
}
else
{
- clif_displaymessage (fd, "Incorrect name or ID, or no one from the party is online.");
+ clif_displaymessage(fd, "Incorrect name or ID, or no one from the party is online.");
return -1;
}
@@ -5668,11 +4359,11 @@ int atcommand_partyrecall (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_reloaditemdb (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_reloaditemdb(const int fd, struct map_session_data *,
+ const char *, const char *)
{
- itemdb_reload ();
- clif_displaymessage (fd, "Item database reloaded.");
+ itemdb_reload();
+ clif_displaymessage(fd, "Item database reloaded.");
return 0;
}
@@ -5681,11 +4372,11 @@ int atcommand_reloaditemdb (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_reloadmobdb (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_reloadmobdb(const int fd, struct map_session_data *,
+ const char *, const char *)
{
- mob_reload ();
- clif_displaymessage (fd, "Monster database reloaded.");
+ mob_reload();
+ clif_displaymessage(fd, "Monster database reloaded.");
return 0;
}
@@ -5694,11 +4385,11 @@ int atcommand_reloadmobdb (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_reloadskilldb (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_reloadskilldb(const int fd, struct map_session_data *,
+ const char *, const char *)
{
- skill_reload ();
- clif_displaymessage (fd, "Skill database reloaded.");
+ skill_reload();
+ clif_displaymessage(fd, "Skill database reloaded.");
return 0;
}
@@ -5707,15 +4398,15 @@ int atcommand_reloadskilldb (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_reloadscript (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_reloadscript(const int fd, struct map_session_data *,
+ const char *, const char *)
{
- do_init_npc ();
- do_init_script ();
+ do_init_npc();
+ do_init_script();
- npc_event_do_oninit ();
+ npc_event_do_oninit();
- clif_displaymessage (fd, "Scripts reloaded.");
+ clif_displaymessage(fd, "Scripts reloaded.");
return 0;
}
@@ -5724,13 +4415,12 @@ int atcommand_reloadscript (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_reloadgmdb ( // by [Yor]
- const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_reloadgmdb(const int fd, struct map_session_data *,
+ const char *, const char *)
{
- chrif_reloadGMdb ();
+ chrif_reloadGMdb();
- clif_displaymessage (fd, "Login-server asked to reload GM accounts and their level.");
+ clif_displaymessage(fd, "Login-server asked to reload GM accounts and their level.");
return 0;
}
@@ -5744,93 +4434,86 @@ int atcommand_reloadgmdb ( // by [Yor]
* 3 = Shows the shops/chats in that map (not implemented)
*------------------------------------------
*/
-int atcommand_mapinfo (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_mapinfo(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
struct npc_data *nd = NULL;
struct chat_data *cd = NULL;
- char output[200], map_name[100];
- char direction[12];
- int m_id, i, chat_num, list = 0;
+ char map_name[100];
+ const char *direction = NULL;
+ int m_id, i, chat_num, list = 0;
- memset (output, '\0', sizeof (output));
- memset (map_name, '\0', sizeof (map_name));
- memset (direction, '\0', sizeof (direction));
+ memset(map_name, '\0', sizeof(map_name));
- sscanf (message, "%d %99[^\n]", &list, map_name);
+ sscanf(message, "%d %99[^\n]", &list, map_name);
if (list < 0 || list > 3)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter at least a valid list number (usage: @mapinfo <0-3> [map]).");
return -1;
}
if (map_name[0] == '\0')
- strcpy (map_name, sd->mapname);
- if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat)
- strcat (map_name, ".gat");
+ strcpy(map_name, sd->mapname);
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
- if ((m_id = map_mapname2mapid (map_name)) < 0)
+ if ((m_id = map_mapname2mapid(map_name)) < 0)
{
- clif_displaymessage (fd, "Map not found.");
+ clif_displaymessage(fd, "Map not found.");
return -1;
}
- clif_displaymessage (fd, "------ Map Info ------");
- sprintf (output, "Map Name: %s", map_name);
- clif_displaymessage (fd, output);
- sprintf (output, "Players In Map: %d", map[m_id].users);
- clif_displaymessage (fd, output);
- sprintf (output, "NPCs In Map: %d", map[m_id].npc_num);
- clif_displaymessage (fd, output);
+ clif_displaymessage(fd, "------ Map Info ------");
+ std::string output = STRPRINTF("Map Name: %s", map_name);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("Players In Map: %d", map[m_id].users);
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("NPCs In Map: %d", map[m_id].npc_num);
+ clif_displaymessage(fd, output);
chat_num = 0;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth
- && (cd = (struct chat_data *) map_id2bl (pl_sd->chatID)))
+ && (cd = (struct chat_data *) map_id2bl(pl_sd->chatID)))
{
chat_num++;
}
}
- sprintf (output, "Chats In Map: %d", chat_num);
- clif_displaymessage (fd, output);
- clif_displaymessage (fd, "------ Map Flags ------");
- sprintf (output, "Player vs Player: %s | No Guild: %s | No Party: %s",
+ output = STRPRINTF("Chats In Map: %d", chat_num);
+ clif_displaymessage(fd, output);
+ clif_displaymessage(fd, "------ Map Flags ------");
+ output = STRPRINTF("Player vs Player: %s | No Party: %s",
(map[m_id].flag.pvp) ? "True" : "False",
- (map[m_id].flag.pvp_noguild) ? "True" : "False",
(map[m_id].flag.pvp_noparty) ? "True" : "False");
- clif_displaymessage (fd, output);
- sprintf (output, "Guild vs Guild: %s | No Party: %s",
- (map[m_id].flag.gvg) ? "True" : "False",
- (map[m_id].flag.gvg_noparty) ? "True" : "False");
- clif_displaymessage (fd, output);
- sprintf (output, "No Dead Branch: %s",
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("No Dead Branch: %s",
(map[m_id].flag.nobranch) ? "True" : "False");
- clif_displaymessage (fd, output);
- sprintf (output, "No Memo: %s",
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("No Memo: %s",
(map[m_id].flag.nomemo) ? "True" : "False");
- clif_displaymessage (fd, output);
- sprintf (output, "No Penalty: %s",
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("No Penalty: %s",
(map[m_id].flag.nopenalty) ? "True" : "False");
- clif_displaymessage (fd, output);
- sprintf (output, "No Return: %s",
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("No Return: %s",
(map[m_id].flag.noreturn) ? "True" : "False");
- clif_displaymessage (fd, output);
- sprintf (output, "No Save: %s",
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("No Save: %s",
(map[m_id].flag.nosave) ? "True" : "False");
- clif_displaymessage (fd, output);
- sprintf (output, "No Teleport: %s",
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("No Teleport: %s",
(map[m_id].flag.noteleport) ? "True" : "False");
- clif_displaymessage (fd, output);
- sprintf (output, "No Monster Teleport: %s",
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("No Monster Teleport: %s",
(map[m_id].flag.monster_noteleport) ? "True" : "False");
- clif_displaymessage (fd, output);
- sprintf (output, "No Zeny Penalty: %s",
+ clif_displaymessage(fd, output);
+ output = STRPRINTF("No Zeny Penalty: %s",
(map[m_id].flag.nozenypenalty) ? "True" : "False");
- clif_displaymessage (fd, output);
+ clif_displaymessage(fd, output);
switch (list)
{
@@ -5838,217 +4521,94 @@ int atcommand_mapinfo (const int fd, struct map_session_data *sd,
// Do nothing. It's list 0, no additional display.
break;
case 1:
- clif_displaymessage (fd, "----- Players in Map -----");
+ clif_displaymessage(fd, "----- Players in Map -----");
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth
- && strcmp (pl_sd->mapname, map_name) == 0)
+ && strcmp(pl_sd->mapname, map_name) == 0)
{
- sprintf (output,
+ output = STRPRINTF(
"Player '%s' (session #%d) | Location: %d,%d",
pl_sd->status.name, i, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage (fd, output);
+ clif_displaymessage(fd, output);
}
}
break;
case 2:
- clif_displaymessage (fd, "----- NPCs in Map -----");
+ clif_displaymessage(fd, "----- NPCs in Map -----");
for (i = 0; i < map[m_id].npc_num;)
{
nd = map[m_id].npc[i];
switch (nd->dir)
{
- case 0:
- strcpy (direction, "North");
+ case DIR::S:
+ direction = "North";
break;
- case 1:
- strcpy (direction, "North West");
+ case DIR::SW:
+ direction = "North West";
break;
- case 2:
- strcpy (direction, "West");
+ case DIR::W:
+ direction = "West";
break;
- case 3:
- strcpy (direction, "South West");
+ case DIR::NW:
+ direction = "South West";
break;
- case 4:
- strcpy (direction, "South");
+ case DIR::N:
+ direction = "South";
break;
- case 5:
- strcpy (direction, "South East");
+ case DIR::NE:
+ direction = "South East";
break;
- case 6:
- strcpy (direction, "East");
+ case DIR::E:
+ direction = "East";
break;
- case 7:
- strcpy (direction, "North East");
+ case DIR::SE:
+ direction = "North East";
break;
+#if 0
case 9:
- strcpy (direction, "North");
+ direction = "North";
break;
+#endif
default:
- strcpy (direction, "Unknown");
+ direction = "Unknown";
break;
}
- sprintf (output,
+ output = STRPRINTF(
"NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d",
++i, nd->name, direction, nd->npc_class, nd->bl.x,
nd->bl.y);
- clif_displaymessage (fd, output);
+ clif_displaymessage(fd, output);
}
break;
case 3:
- clif_displaymessage (fd, "----- Chats in Map -----");
+ clif_displaymessage(fd, "----- Chats in Map -----");
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth
- && (cd = (struct chat_data *) map_id2bl (pl_sd->chatID))
- && strcmp (pl_sd->mapname, map_name) == 0
+ && (cd = (struct chat_data *) map_id2bl(pl_sd->chatID))
+ && strcmp(pl_sd->mapname, map_name) == 0
&& cd->usersd[0] == pl_sd)
{
- sprintf (output,
+ output = STRPRINTF(
"Chat %d: %s | Player: %s | Location: %d %d", i,
cd->title, pl_sd->status.name, cd->bl.x,
cd->bl.y);
- clif_displaymessage (fd, output);
- sprintf (output,
+ clif_displaymessage(fd, output);
+ output = STRPRINTF(
" Users: %d/%d | Password: %s | Public: %s",
cd->users, cd->limit, cd->pass,
(cd->pub) ? "Yes" : "No");
- clif_displaymessage (fd, output);
+ clif_displaymessage(fd, output);
}
}
break;
default: // normally impossible to arrive here
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter at least a valid list number (usage: @mapinfo <0-3> [map]).");
return -1;
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_mount_peco (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- 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 | 0x0020);
- 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 & ~0x0020);
- clif_displaymessage (fd, "Unmounted Peco.");
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_char_mount_peco (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset (character, '\0', sizeof (character));
-
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
- {
- clif_displaymessage (fd,
- "Please, enter a player name (usage: @charmountpeco <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd (character)) != NULL)
- {
- if (pl_sd->disguise > 0)
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage (fd, "This player cannot mount a Peco while in disguise.");
- return -1;
- }
-
- if (!pc_isriding (pl_sd))
- { // if actually no peco
- if (pl_sd->status.pc_class == 7 || pl_sd->status.pc_class == 14
- || pl_sd->status.pc_class == 4008 || pl_sd->status.pc_class == 4015)
- {
- if (pl_sd->status.pc_class == 7)
- pl_sd->status.pc_class = pl_sd->view_class = 13;
- else if (pl_sd->status.pc_class == 14)
- pl_sd->status.pc_class = pl_sd->view_class = 21;
- else if (pl_sd->status.pc_class == 4008)
- pl_sd->status.pc_class = pl_sd->view_class = 4014;
- else if (pl_sd->status.pc_class == 4015)
- pl_sd->status.pc_class = pl_sd->view_class = 4022;
- pc_setoption (pl_sd, pl_sd->status.option | 0x0020);
- 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 & ~0x0020);
- clif_displaymessage (fd, "Now, this player has not more peco.");
- }
- }
- else
- {
- clif_displaymessage (fd, "Character not found.");
- return -1;
}
return 0;
@@ -6058,88 +4618,40 @@ int atcommand_char_mount_peco (const int fd, struct map_session_data *sd,
*Spy Commands by Syrus22
*------------------------------------------
*/
-int atcommand_guildspy (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- char guild_name[100];
- char output[200];
- struct guild *g;
-
- memset (guild_name, '\0', sizeof (guild_name));
- memset (output, '\0', sizeof (output));
-
- if (!message || !*message || sscanf (message, "%99[^\n]", guild_name) < 1)
- {
- clif_displaymessage (fd,
- "Please, enter a guild name/id (usage: @guildspy <guild_name/id>).");
- return -1;
- }
-
- if ((g = guild_searchname (guild_name)) != NULL || // name first to avoid error when name begin with a number
- (g = guild_search (atoi (message))) != NULL)
- {
- if (sd->guildspy == g->guild_id)
- {
- sd->guildspy = 0;
- sprintf (output, "No longer spying on the %s guild.", g->name);
- clif_displaymessage (fd, output);
- }
- else
- {
- sd->guildspy = g->guild_id;
- sprintf (output, "Spying on the %s guild.", g->name);
- clif_displaymessage (fd, output);
- }
- }
- else
- {
- clif_displaymessage (fd, "Incorrect name/ID, or no one from the guild is online.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_partyspy (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_partyspy(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char party_name[100];
- char output[200];
struct party *p;
- memset (party_name, '\0', sizeof (party_name));
- memset (output, '\0', sizeof (output));
+ memset(party_name, '\0', sizeof(party_name));
- if (!message || !*message || sscanf (message, "%99[^\n]", party_name) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a party name/id (usage: @partyspy <party_name/id>).");
return -1;
}
- if ((p = party_searchname (party_name)) != NULL || // name first to avoid error when name begin with a number
- (p = party_search (atoi (message))) != NULL)
+ if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number
+ (p = party_search(atoi(message))) != NULL)
{
if (sd->partyspy == p->party_id)
{
sd->partyspy = 0;
- sprintf (output, "No longer spying on the %s party.", p->name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("No longer spying on the %s party.", p->name);
+ clif_displaymessage(fd, output);
}
else
{
sd->partyspy = p->party_id;
- sprintf (output, "Spying on the %s party.", p->name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("Spying on the %s party.", p->name);
+ clif_displaymessage(fd, output);
}
}
else
{
- clif_displaymessage (fd, "Incorrect name or ID, or no one from the party is online.");
+ clif_displaymessage(fd, "Incorrect name or ID, or no one from the party is online.");
return -1;
}
@@ -6150,28 +4662,28 @@ int atcommand_partyspy (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_enablenpc (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_enablenpc(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char NPCname[100];
- memset (NPCname, '\0', sizeof (NPCname));
+ memset(NPCname, '\0', sizeof(NPCname));
- if (!message || !*message || sscanf (message, "%99[^\n]", NPCname) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a NPC name (usage: @npcon <NPC_name>).");
return -1;
}
- if (npc_name2id (NPCname) != NULL)
+ if (npc_name2id(NPCname) != NULL)
{
- npc_enable (NPCname, 1);
- clif_displaymessage (fd, "Npc Enabled.");
+ npc_enable(NPCname, 1);
+ clif_displaymessage(fd, "Npc Enabled.");
}
else
{
- clif_displaymessage (fd, "This NPC doesn't exist.");
+ clif_displaymessage(fd, "This NPC doesn't exist.");
return -1;
}
@@ -6182,28 +4694,28 @@ int atcommand_enablenpc (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_disablenpc (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_disablenpc(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char NPCname[100];
- memset (NPCname, '\0', sizeof (NPCname));
+ memset(NPCname, '\0', sizeof(NPCname));
- if (!message || !*message || sscanf (message, "%99[^\n]", NPCname) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a NPC name (usage: @npcoff <NPC_name>).");
return -1;
}
- if (npc_name2id (NPCname) != NULL)
+ if (npc_name2id(NPCname) != NULL)
{
- npc_enable (NPCname, 0);
- clif_displaymessage (fd, "Npc Disabled.");
+ npc_enable(NPCname, 0);
+ clif_displaymessage(fd, "Npc Disabled.");
}
else
{
- clif_displaymessage (fd, "This NPC doesn't exist.");
+ clif_displaymessage(fd, "This NPC doesn't exist.");
return -1;
}
@@ -6211,128 +4723,21 @@ int atcommand_disablenpc (const int fd, struct map_session_data *sd,
}
/*==========================================
- * time in txt for time command (by [Yor])
- *------------------------------------------
- */
-static
-const char *txt_time (unsigned int duration)
-{
- int days, hours, minutes, seconds;
- char temp[256];
- static char temp1[256];
-
- memset (temp, '\0', sizeof (temp));
- memset (temp1, '\0', sizeof (temp1));
-
- if (duration < 0)
- duration = 0;
-
- days = duration / (60 * 60 * 24);
- duration = duration - (60 * 60 * 24 * days);
- hours = duration / (60 * 60);
- duration = duration - (60 * 60 * hours);
- minutes = duration / 60;
- seconds = duration - (60 * minutes);
-
- if (days < 2)
- sprintf (temp, "%d day", days);
- else
- sprintf (temp, "%d days", days);
- if (hours < 2)
- sprintf (temp1, "%s %d hour", temp, hours);
- else
- sprintf (temp1, "%s %d hours", temp, hours);
- if (minutes < 2)
- sprintf (temp, "%s %d minute", temp1, minutes);
- else
- sprintf (temp, "%s %d minutes", temp1, minutes);
- if (seconds < 2)
- sprintf (temp1, "%s and %d second", temp, seconds);
- else
- sprintf (temp1, "%s and %d seconds", temp, seconds);
-
- return temp1;
-}
-
-/*==========================================
* @time/@date/@server_date/@serverdate/@server_time/@servertime: Display the date/time of the server (by [Yor]
* Calculation management of GM modification (@day/@night GM commands) is done
*------------------------------------------
*/
-int atcommand_servertime (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_servertime(const int fd, struct map_session_data *,
+ const char *, const char *)
{
- struct TimerData *timer_data;
- struct TimerData *timer_data2;
- time_t time_server; // variable for number of seconds (used with time() function)
- struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ...
- char temp[256];
-
- memset (temp, '\0', sizeof (temp));
+ timestamp_seconds_buffer tsbuf;
+ stamp_time(tsbuf);
+ std::string temp = STRPRINTF("Server time: %s", tsbuf);
+ clif_displaymessage(fd, temp);
- time (&time_server); // get time in seconds since 1/1/1970
- datetime = gmtime (&time_server); // convert seconds in structure
- // like sprintf, but only for date/time (Sunday, November 02 2003 15:12:52)
- strftime (temp, sizeof (temp) - 1, "Server time (normal time): %A, %B %d %Y %X.", datetime);
- clif_displaymessage (fd, temp);
-
- if (battle_config.night_duration == 0 && battle_config.day_duration == 0)
{
- if (night_flag == 0)
- clif_displaymessage (fd, "Game time: The game is in permanent daylight.");
- else
- clif_displaymessage (fd, "Game time: The game is in permanent night.");
- }
- else if (battle_config.night_duration == 0)
- if (night_flag == 1)
- { // we start with night
- timer_data = get_timer (day_timer_tid);
- sprintf (temp, "Game time: The game is actualy in night for %s.", txt_time ((timer_data->tick - gettick ()) / 1000));
- clif_displaymessage (fd, temp);
- clif_displaymessage (fd, "Game time: After, the game will be in permanent daylight.");
- }
- else
- clif_displaymessage (fd, "Game time: The game is in permanent daylight.");
- else if (battle_config.day_duration == 0)
- if (night_flag == 0)
- { // we start with day
- timer_data = get_timer (night_timer_tid);
- sprintf (temp, "Game time: The game is actualy in daylight for %s.", txt_time ((timer_data->tick - gettick ()) / 1000));
- clif_displaymessage (fd, temp);
- clif_displaymessage (fd, "Game time: After, the game will be in permanent night.");
- }
- else
- clif_displaymessage (fd, "Game time: The game is in permanent night.");
- else
- {
- if (night_flag == 0)
- {
- timer_data = get_timer (night_timer_tid);
- timer_data2 = get_timer (day_timer_tid);
- sprintf (temp, "Game time: The game is actualy in daylight for %s.", txt_time ((timer_data->tick - gettick ()) / 1000));
- clif_displaymessage (fd, temp);
- if (timer_data->tick > timer_data2->tick)
- sprintf (temp, "Game time: After, the game will be in night for %s.", txt_time ((timer_data->interval - abs (timer_data->tick - timer_data2->tick)) / 1000));
- else
- sprintf (temp, "Game time: After, the game will be in night for %s.", txt_time (abs (timer_data->tick - timer_data2->tick) / 1000));
- clif_displaymessage (fd, temp);
- sprintf (temp, "Game time: A day cycle has a normal duration of %s.", txt_time (timer_data->interval / 1000));
- clif_displaymessage (fd, temp);
- }
- else
- {
- timer_data = get_timer (day_timer_tid);
- timer_data2 = get_timer (night_timer_tid);
- sprintf (temp, "Game time: The game is actualy in night for %s.", txt_time ((timer_data->tick - gettick ()) / 1000));
- clif_displaymessage (fd, temp);
- if (timer_data->tick > timer_data2->tick)
- sprintf (temp, "Game time: After, the game will be in daylight for %s.", txt_time ((timer_data->interval - abs (timer_data->tick - timer_data2->tick)) / 1000));
- else
- sprintf (temp, "Game time: After, the game will be in daylight for %s.", txt_time (abs (timer_data->tick - timer_data2->tick) / 1000));
- clif_displaymessage (fd, temp);
- sprintf (temp, "Game time: A day cycle has a normal duration of %s.", txt_time (timer_data->interval / 1000));
- clif_displaymessage (fd, temp);
- }
+ if (0 == 0)
+ clif_displaymessage(fd, "Game time: The game is in permanent daylight.");
}
return 0;
@@ -6345,264 +4750,80 @@ int atcommand_servertime (const int fd, struct map_session_data *sd,
* Inspired from a old command created by RoVeRT
*------------------------------------------
*/
-int atcommand_chardelitem (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_chardelitem(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
char character[100];
char item_name[100];
- int i, number = 0, item_id, item_position, count;
- char output[200];
+ int i, number = 0, item_id, item_position, count;
struct item_data *item_data;
- memset (character, '\0', sizeof (character));
- memset (item_name, '\0', sizeof (item_name));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
+ memset(item_name, '\0', sizeof(item_name));
if (!message || !*message
- || sscanf (message, "%s %d %99[^\n]", item_name, &number,
+ || sscanf(message, "%s %d %99[^\n]", item_name, &number,
character) < 3 || number < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter an item name/id, a quantity and a player name (usage: @chardelitem <item_name_or_ID> <quantity> <player>).");
return -1;
}
item_id = 0;
- if ((item_data = itemdb_searchname (item_name)) != NULL ||
- (item_data = itemdb_exists (atoi (item_name))) != NULL)
+ if ((item_data = itemdb_searchname(item_name)) != NULL ||
+ (item_data = itemdb_exists(atoi(item_name))) != NULL)
item_id = item_data->nameid;
if (item_id > 500)
{
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can kill only lower or same level
- item_position = pc_search_inventory (pl_sd, item_id);
+ item_position = pc_search_inventory(pl_sd, item_id);
if (item_position >= 0)
{
count = 0;
for (i = 0; i < number && item_position >= 0; i++)
{
- pc_delitem (pl_sd, item_position, 1, 0);
+ pc_delitem(pl_sd, item_position, 1, 0);
count++;
- item_position = pc_search_inventory (pl_sd, item_id); // for next loop
+ item_position = pc_search_inventory(pl_sd, item_id); // for next loop
}
- sprintf (output, "%d item(s) removed by a GM.", count);
- clif_displaymessage (pl_sd->fd, output);
+ std::string output = STRPRINTF(
+ "%d item(s) removed by a GM.",
+ count);
+ clif_displaymessage(pl_sd->fd, output);
+
if (number == count)
- sprintf (output, "%d item(s) removed from the player.", count);
+ output = STRPRINTF("%d item(s) removed from the player.", count);
else
- sprintf (output, "%d item(s) removed. Player had only %d on %d items.", count, count, number);
- clif_displaymessage (fd, output);
+ output = STRPRINTF("%d item(s) removed. Player had only %d on %d items.", count, count, number);
+ clif_displaymessage(fd, output);
}
else
{
- clif_displaymessage (fd, "Character does not have the item.");
+ clif_displaymessage(fd, "Character does not have the item.");
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;
- }
- }
- else
- {
- clif_displaymessage (fd, "Invalid item ID or name.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @jail <char_name> by [Yor]
- * Special warp! No check with nowarp and nowarpto flag
- *------------------------------------------
- */
-int atcommand_jail (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- char character[100];
- struct map_session_data *pl_sd;
- int x, y;
-
- memset (character, '\0', sizeof (character));
-
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
- {
- clif_displaymessage (fd,
- "Please, enter a player name (usage: @jail <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd (character)) != NULL)
- {
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
- { // you can jail only lower or same GM
- switch (MRAND (2))
- {
- case 0:
- x = 24;
- y = 75;
- break;
- default:
- x = 49;
- y = 75;
- break;
- }
- if (pc_setpos (pl_sd, "sec_pri.gat", x, y, 3) == 0)
- {
- pc_setsavepoint (pl_sd, "sec_pri.gat", x, y); // Save Char Respawn Point in the jail room [Lupus]
- clif_displaymessage (pl_sd->fd, "GM has send you in jails.");
- clif_displaymessage (fd, "Player warped in jails.");
- }
- else
- {
- clif_displaymessage (fd, "Map not 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;
-}
-
-/*==========================================
- * @unjail/@discharge <char_name> by [Yor]
- * Special warp! No check with nowarp and nowarpto flag
- *------------------------------------------
- */
-int atcommand_unjail (const int fd, struct map_session_data *sd,
- const char *command, 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: @unjail/@discharge <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd (character)) != NULL)
- {
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
- { // you can jail only lower or same GM
- if (pl_sd->bl.m != map_mapname2mapid ("sec_pri.gat"))
- {
- clif_displaymessage (fd, "This player is not in jails.");
- return -1;
- }
- else if (pc_setpos (pl_sd, "prontera.gat", 156, 191, 3) == 0)
- {
- pc_setsavepoint (pl_sd, "prontera.gat", 156, 191); // Save char respawn point in Prontera
- clif_displaymessage (pl_sd->fd, "GM has discharge you.");
- clif_displaymessage (fd, "Player warped to Prontera.");
- }
- else
- {
- clif_displaymessage (fd, "Map not found.");
+ clif_displaymessage(fd, "Your GM level don't authorise you to do this action on this player.");
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;
-}
-
-/*==========================================
- * @disguise <mob_id> by [Valaris] (simplified by [Yor])
- *------------------------------------------
- */
-int atcommand_disguise (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- int mob_id;
-
- if (!message || !*message)
- {
- clif_displaymessage (fd,
- "Please, enter a Monster/NPC name/id (usage: @disguise <monster_name_or_monster_ID>).");
- return -1;
- }
-
- if ((mob_id = mobdb_searchname (message)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi (message);
-
- if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
- (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
- (mob_id >= 813 && mob_id <= 834) || // NPC
- (mob_id > 1000 && mob_id < 1521))
- { // monsters
- if (pc_isriding (sd))
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage (fd, "Cannot wear disguise while riding a Peco.");
+ clif_displaymessage(fd, "Character not found.");
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 *command, const char *message)
-{
- 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.");
+ clif_displaymessage(fd, "Invalid item ID or name.");
return -1;
}
@@ -6613,22 +4834,18 @@ int atcommand_undisguise (const int fd, struct map_session_data *sd,
* @broadcast by [Valaris]
*------------------------------------------
*/
-int atcommand_broadcast (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_broadcast(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char output[200];
-
- memset (output, '\0', sizeof (output));
-
if (!message || !*message)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a message (usage: @broadcast <message>).");
return -1;
}
- snprintf (output, 199, "%s : %s", sd->status.name, message);
- intif_GMmessage (output, strlen (output) + 1, 0);
+ std::string output = STRPRINTF("%s : %s", sd->status.name, message);
+ intif_GMmessage(output, 0);
return 0;
}
@@ -6637,23 +4854,19 @@ int atcommand_broadcast (const int fd, struct map_session_data *sd,
* @localbroadcast by [Valaris]
*------------------------------------------
*/
-int atcommand_localbroadcast (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_localbroadcast(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char output[200];
-
- memset (output, '\0', sizeof (output));
-
if (!message || !*message)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a message (usage: @localbroadcast <message>).");
return -1;
}
- snprintf (output, 199, "%s : %s", sd->status.name, message);
+ std::string output = STRPRINTF("%s : %s", sd->status.name, message);
- clif_GMmessage (&sd->bl, output, strlen (output) + 1, 1); // 1: ALL_SAMEMAP
+ clif_GMmessage(&sd->bl, output, 1); // 1: ALL_SAMEMAP
return 0;
}
@@ -6662,41 +4875,42 @@ int atcommand_localbroadcast (const int fd, struct map_session_data *sd,
* @ignorelist by [Yor]
*------------------------------------------
*/
-int atcommand_ignorelist (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_ignorelist(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
- char output[200];
- int count;
- int i;
-
- memset (output, '\0', sizeof (output));
+ int count;
+ int i;
count = 0;
- for (i = 0; i < (int) (sizeof (sd->ignore) / sizeof (sd->ignore[0])); i++)
+ for (i = 0; i < (int)(sizeof(sd->ignore) / sizeof(sd->ignore[0])); i++)
if (sd->ignore[i].name[0])
count++;
if (sd->ignoreAll == 0)
if (count == 0)
- clif_displaymessage (fd, "You accept any wisp (no wisper is refused).");
+ clif_displaymessage(fd, "You accept any wisp (no wisper is refused).");
else
{
- sprintf (output, "You accept any wisp, except thoses from %d player(s):", count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "You accept any wisp, except thoses from %d player (s):",
+ count);
+ clif_displaymessage(fd, output);
}
else if (count == 0)
- clif_displaymessage (fd, "You refuse all wisps (no specifical wisper is refused).");
+ clif_displaymessage(fd, "You refuse all wisps (no specifical wisper is refused).");
else
{
- sprintf (output, "You refuse all wisps, AND refuse wisps from %d player(s):", count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "You refuse all wisps, AND refuse wisps from %d player (s):",
+ count);
+ clif_displaymessage(fd, output);
}
if (count > 0)
- for (i = 0; i < (int) (sizeof (sd->ignore) / sizeof (sd->ignore[0]));
+ for (i = 0; i < (int)(sizeof(sd->ignore) / sizeof(sd->ignore[0]));
i++)
if (sd->ignore[i].name[0])
- clif_displaymessage (fd, sd->ignore[i].name);
+ clif_displaymessage(fd, sd->ignore[i].name);
return 0;
}
@@ -6705,30 +4919,28 @@ int atcommand_ignorelist (const int fd, struct map_session_data *sd,
* @charignorelist <player_name> by [Yor]
*------------------------------------------
*/
-int atcommand_charignorelist (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charignorelist(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
struct map_session_data *pl_sd;
- char output[200];
- int count;
- int i;
+ int count;
+ int i;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
- "Please, enter a player name (usage: @charignorelist <char name>).");
+ clif_displaymessage(fd,
+ "Please, enter a player name (usage: @charignorelist <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
count = 0;
for (i = 0;
- i < (int) (sizeof (pl_sd->ignore) / sizeof (pl_sd->ignore[0]));
+ i < (int)(sizeof(pl_sd->ignore) / sizeof(pl_sd->ignore[0]));
i++)
if (pl_sd->ignore[i].name[0])
count++;
@@ -6736,37 +4948,45 @@ int atcommand_charignorelist (const int fd, struct map_session_data *sd,
if (pl_sd->ignoreAll == 0)
if (count == 0)
{
- sprintf (output, "'%s' accept any wisp (no wisper is refused).", pl_sd->status.name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "'%s' accept any wisp (no wisper is refused).",
+ pl_sd->status.name);
+ clif_displaymessage(fd, output);
}
else
{
- sprintf (output, "'%s' accept any wisp, except thoses from %d player(s):", pl_sd->status.name, count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "'%s' accept any wisp, except thoses from %d player(s):",
+ pl_sd->status.name, count);
+ clif_displaymessage(fd, output);
}
else if (count == 0)
{
- sprintf (output, "'%s' refuse all wisps (no specifical wisper is refused).", pl_sd->status.name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "'%s' refuse all wisps (no specifical wisper is refused).",
+ pl_sd->status.name);
+ clif_displaymessage(fd, output);
}
else
{
- sprintf (output, "'%s' refuse all wisps, AND refuse wisps from %d player(s):", pl_sd->status.name, count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "'%s' refuse all wisps, AND refuse wisps from %d player(s):",
+ pl_sd->status.name, count);
+ clif_displaymessage(fd, output);
}
if (count > 0)
for (i = 0;
i <
- (int) (sizeof (pl_sd->ignore) / sizeof (pl_sd->ignore[0]));
+ (int)(sizeof(pl_sd->ignore) / sizeof(pl_sd->ignore[0]));
i++)
if (pl_sd->ignore[i].name[0])
- clif_displaymessage (fd, pl_sd->ignore[i].name);
+ clif_displaymessage(fd, pl_sd->ignore[i].name);
}
else
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -6777,55 +4997,57 @@ int atcommand_charignorelist (const int fd, struct map_session_data *sd,
* @inall <player_name> by [Yor]
*------------------------------------------
*/
-int atcommand_inall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_inall(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- char output[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @inall <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can change wisp option only to lower or same level
if (pl_sd->ignoreAll == 0)
{
- sprintf (output, "'%s' already accepts all wispers.", pl_sd->status.name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "'%s' already accepts all wispers.",
+ pl_sd->status.name);
+ clif_displaymessage(fd, output);
return -1;
}
else
{
pl_sd->ignoreAll = 0;
- sprintf (output, "'%s' now accepts all wispers.", pl_sd->status.name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "'%s' now accepts all wispers.",
+ pl_sd->status.name);
+ clif_displaymessage(fd, output);
// message to player
- clif_displaymessage (pl_sd->fd, "A GM has authorised all wispers for you.");
- WFIFOW (pl_sd->fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB (pl_sd->fd, 2) = 1;
- WFIFOB (pl_sd->fd, 3) = 0; // success
- WFIFOSET (pl_sd->fd, 4); // packet_len_table[0x0d2]
+ clif_displaymessage(pl_sd->fd, "A GM has authorised all wispers for you.");
+ WFIFOW(pl_sd->fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
+ WFIFOB(pl_sd->fd, 2) = 1;
+ WFIFOB(pl_sd->fd, 3) = 0; // success
+ WFIFOSET(pl_sd->fd, 4); // packet_len_table[0x0d2]
}
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -6836,174 +5058,57 @@ int atcommand_inall (const int fd, struct map_session_data *sd,
* @exall <player_name> by [Yor]
*------------------------------------------
*/
-int atcommand_exall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_exall(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- char output[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @exall <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can change wisp option only to lower or same level
if (pl_sd->ignoreAll == 1)
{
- sprintf (output, "'%s' already blocks all wispers.", pl_sd->status.name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "'%s' already blocks all wispers.",
+ pl_sd->status.name);
+ clif_displaymessage(fd, output);
return -1;
}
else
{
pl_sd->ignoreAll = 1;
- sprintf (output, "'%s' blocks now all wispers.", pl_sd->status.name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "'%s' blocks now all wispers.",
+ pl_sd->status.name);
+ clif_displaymessage(fd, output);
// message to player
- clif_displaymessage (pl_sd->fd, "A GM has blocked all wispers for you.");
- WFIFOW (pl_sd->fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB (pl_sd->fd, 2) = 0;
- WFIFOB (pl_sd->fd, 3) = 0; // success
- WFIFOSET (pl_sd->fd, 4); // packet_len_table[0x0d2]
- }
- }
- 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;
-}
-
-/*==========================================
- * @chardisguise <mob_id> <character> by Kalaspuff (based off Valaris' and Yor's work)
- *------------------------------------------
- */
-int atcommand_chardisguise (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- int mob_id;
- char character[100];
- char mob_name[100];
- struct map_session_data *pl_sd;
-
- memset (character, '\0', sizeof (character));
- memset (mob_name, '\0', sizeof (mob_name));
-
- if (!message || !*message
- || sscanf (message, "%s %99[^\n]", mob_name, character) < 2)
- {
- clif_displaymessage (fd,
- "Please, enter a Monster/NPC name/id and a player name (usage: @chardisguise <monster_name_or_monster_ID> <char name>).");
- return -1;
- }
-
- if ((mob_id = mobdb_searchname (mob_name)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi (mob_name);
-
- if ((pl_sd = map_nick2sd (character)) != NULL)
- {
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
- { // you can disguise only lower or same level
- if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
- (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
- (mob_id >= 813 && mob_id <= 834) || // NPC
- (mob_id > 1000 && mob_id < 1521))
- { // monsters
- if (pc_isriding (pl_sd))
- { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage (fd, "Character cannot wear disguise while riding a Peco.");
- return -1;
- }
- pl_sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
- pl_sd->disguise = mob_id;
- pc_setpos (pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y,
- 3);
- clif_displaymessage (fd, "Character's disguise applied.");
- }
- else
- {
- clif_displaymessage (fd, "Monster/NPC name/id hasn't been found.");
- return -1;
- }
- }
- else
- {
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
- return -1;
- }
- }
- else
- {
- clif_displaymessage (fd, "Character not found.");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @charundisguise <character> by Kalaspuff (based off Yor's work)
- *------------------------------------------
- */
-int atcommand_charundisguise (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset (character, '\0', sizeof (character));
-
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
- {
- clif_displaymessage (fd,
- "Please, enter a player name (usage: @charundisguise <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd (character)) != NULL)
- {
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
- { // you can undisguise only lower or same level
- if (pl_sd->disguise)
- {
- clif_clearchar (&pl_sd->bl, 9);
- pl_sd->disguise = 0;
- pc_setpos (pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y,
- 3);
- clif_displaymessage (fd, "Character's undisguise applied.");
- }
- else
- {
- clif_displaymessage (fd, "Character is not disguised.");
- return -1;
+ clif_displaymessage(pl_sd->fd, "A GM has blocked all wispers for you.");
+ WFIFOW(pl_sd->fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
+ WFIFOB(pl_sd->fd, 2) = 0;
+ WFIFOB(pl_sd->fd, 3) = 0; // success
+ WFIFOSET(pl_sd->fd, 4); // packet_len_table[0x0d2]
}
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -7014,47 +5119,47 @@ int atcommand_charundisguise (const int fd, struct map_session_data *sd,
* @email <actual@email> <new@email> by [Yor]
*------------------------------------------
*/
-int atcommand_email (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_email(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
char actual_email[100];
char new_email[100];
- memset (actual_email, '\0', sizeof (actual_email));
- memset (new_email, '\0', sizeof (new_email));
+ memset(actual_email, '\0', sizeof(actual_email));
+ memset(new_email, '\0', sizeof(new_email));
if (!message || !*message
- || sscanf (message, "%99s %99s", actual_email, new_email) < 2)
+ || sscanf(message, "%99s %99s", actual_email, new_email) < 2)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please enter 2 emails (usage: @email <actual@email> <new@email>).");
return -1;
}
- if (e_mail_check (actual_email) == 0)
+ if (e_mail_check(actual_email) == 0)
{
- clif_displaymessage (fd, "Invalid actual email. If you have default e-mail, type a@a.com."); // Invalid actual email. If you have default e-mail, give a@a.com.
+ clif_displaymessage(fd, "Invalid actual email. If you have default e-mail, type a@a.com."); // Invalid actual email. If you have default e-mail, give a@a.com.
return -1;
}
- else if (e_mail_check (new_email) == 0)
+ else if (e_mail_check(new_email) == 0)
{
- clif_displaymessage (fd, "Invalid new email. Please enter a real e-mail.");
+ clif_displaymessage(fd, "Invalid new email. Please enter a real e-mail.");
return -1;
}
- else if (strcasecmp (new_email, "a@a.com") == 0)
+ else if (strcasecmp(new_email, "a@a.com") == 0)
{
- clif_displaymessage (fd, "New email must be a real e-mail.");
+ clif_displaymessage(fd, "New email must be a real e-mail.");
return -1;
}
- else if (strcasecmp (actual_email, new_email) == 0)
+ else if (strcasecmp(actual_email, new_email) == 0)
{
- clif_displaymessage (fd, "New email must be different of the actual e-mail.");
+ clif_displaymessage(fd, "New email must be different of the actual e-mail.");
return -1;
}
else
{
- chrif_changeemail (sd->status.account_id, actual_email, new_email);
- clif_displaymessage (fd, "Information sended to login-server via char-server.");
+ chrif_changeemail(sd->status.account_id, actual_email, new_email);
+ clif_displaymessage(fd, "Information sended to login-server via char-server.");
}
return 0;
@@ -7064,22 +5169,22 @@ int atcommand_email (const int fd, struct map_session_data *sd,
*@effect
*------------------------------------------
*/
-int atcommand_effect (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_effect(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
- int type = 0, flag = 0, i;
+ int type = 0, flag = 0, i;
- if (!message || !*message || sscanf (message, "%d %d", &type, &flag) < 2)
+ if (!message || !*message || sscanf(message, "%d %d", &type, &flag) < 2)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter at least a option (usage: @effect <type+>).");
return -1;
}
if (flag <= 0)
{
- clif_specialeffect (&sd->bl, type, flag);
- clif_displaymessage (fd, "Your Effect Has Changed."); // Your effect has changed.
+ clif_specialeffect(&sd->bl, type, flag);
+ clif_displaymessage(fd, "Your Effect Has Changed."); // Your effect has changed.
}
else
{
@@ -7088,8 +5193,8 @@ int atcommand_effect (const int fd, struct map_session_data *sd,
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
- clif_specialeffect (&pl_sd->bl, type, flag);
- clif_displaymessage (pl_sd->fd, "Your Effect Has Changed."); // Your effect has changed.
+ clif_specialeffect(&pl_sd->bl, type, flag);
+ clif_displaymessage(pl_sd->fd, "Your Effect Has Changed."); // Your effect has changed.
}
}
}
@@ -7101,30 +5206,27 @@ int atcommand_effect (const int fd, struct map_session_data *sd,
* @charitemlist <character>: Displays the list of a player's items.
*------------------------------------------
*/
-int
-atcommand_character_item_list (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_character_item_list(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
struct item_data *item_data, *item_temp;
- int i, j, equip, count, counter, counter2;
- char character[100], output[200], equipstr[100], outputtmp[200];
+ int i, j, count, counter, counter2;
+ char character[100], equipstr[100];
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
- memset (equipstr, '\0', sizeof (equipstr));
- memset (outputtmp, '\0', sizeof (outputtmp));
+ memset(character, '\0', sizeof(character));
+ memset(equipstr, '\0', sizeof(equipstr));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charitemlist <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can look items only lower or same level
counter = 0;
count = 0;
@@ -7132,55 +5234,59 @@ atcommand_character_item_list (const int fd, struct map_session_data *sd,
{
if (pl_sd->status.inventory[i].nameid > 0
&& (item_data =
- itemdb_search (pl_sd->status.inventory[i].nameid)) !=
+ itemdb_search(pl_sd->status.inventory[i].nameid)) !=
NULL)
{
counter = counter + pl_sd->status.inventory[i].amount;
count++;
if (count == 1)
{
- sprintf (output, "------ Items list of '%s' ------",
- pl_sd->status.name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "------ Items list of '%s' ------",
+ pl_sd->status.name);
+ clif_displaymessage(fd, output);
}
- if ((equip = pl_sd->status.inventory[i].equip))
+ EPOS equip;
+ if (bool(equip = pl_sd->status.inventory[i].equip))
{
- strcpy (equipstr, "| equiped: ");
- if (equip & 4)
- strcat (equipstr, "robe/gargment, ");
- if (equip & 8)
- strcat (equipstr, "left accessory, ");
- if (equip & 16)
- strcat (equipstr, "body/armor, ");
- if ((equip & 34) == 2)
- strcat (equipstr, "right hand, ");
- if ((equip & 34) == 32)
- strcat (equipstr, "left hand, ");
- if ((equip & 34) == 34)
- strcat (equipstr, "both hands, ");
- if (equip & 64)
- strcat (equipstr, "feet, ");
- if (equip & 128)
- strcat (equipstr, "right accessory, ");
- if ((equip & 769) == 1)
- strcat (equipstr, "lower head, ");
- if ((equip & 769) == 256)
- strcat (equipstr, "top head, ");
- if ((equip & 769) == 257)
- strcat (equipstr, "lower/top head, ");
- if ((equip & 769) == 512)
- strcat (equipstr, "mid head, ");
- if ((equip & 769) == 512)
- strcat (equipstr, "lower/mid head, ");
- if ((equip & 769) == 769)
- strcat (equipstr, "lower/mid/top head, ");
+ strcpy(equipstr, "| equiped: ");
+ if (bool(equip & EPOS::GLOVES))
+ strcat(equipstr, "robe/gargment, ");
+ if (bool(equip & EPOS::CAPE))
+ strcat(equipstr, "left accessory, ");
+ if (bool(equip & EPOS::MISC1))
+ strcat(equipstr, "body/armor, ");
+ if ((equip & (EPOS::WEAPON | EPOS::SHIELD)) == EPOS::WEAPON)
+ strcat(equipstr, "right hand, ");
+ if ((equip & (EPOS::WEAPON | EPOS::SHIELD)) == EPOS::SHIELD)
+ strcat(equipstr, "left hand, ");
+ if ((equip & (EPOS::WEAPON | EPOS::SHIELD)) == (EPOS::WEAPON | EPOS::SHIELD))
+ strcat(equipstr, "both hands, ");
+ if (bool(equip & EPOS::SHOES))
+ strcat(equipstr, "feet, ");
+ if (bool(equip & EPOS::MISC2))
+ strcat(equipstr, "right accessory, ");
+ if ((equip & (EPOS::TORSO | EPOS::HAT | EPOS::LEGS)) == EPOS::LEGS)
+ strcat(equipstr, "lower head, ");
+ if ((equip & (EPOS::TORSO | EPOS::HAT | EPOS::LEGS)) == EPOS::HAT)
+ strcat(equipstr, "top head, ");
+ if ((equip & (EPOS::TORSO | EPOS::HAT | EPOS::LEGS)) == (EPOS::HAT | EPOS::LEGS))
+ strcat(equipstr, "lower/top head, ");
+ if ((equip & (EPOS::TORSO | EPOS::HAT | EPOS::LEGS)) == EPOS::TORSO)
+ strcat(equipstr, "mid head, ");
+ if ((equip & (EPOS::TORSO | EPOS::HAT | EPOS::LEGS)) == (EPOS::TORSO | EPOS::LEGS))
+ strcat(equipstr, "lower/mid head, ");
+ if ((equip & (EPOS::TORSO | EPOS::HAT | EPOS::LEGS)) == (EPOS::TORSO | EPOS::HAT | EPOS::LEGS))
+ strcat(equipstr, "lower/mid/top head, ");
// remove final ', '
- equipstr[strlen (equipstr) - 2] = '\0';
+ equipstr[strlen(equipstr) - 2] = '\0';
}
else
- memset (equipstr, '\0', sizeof (equipstr));
+ memset(equipstr, '\0', sizeof(equipstr));
+
+ std::string output;
if (sd->status.inventory[i].refine)
- sprintf (output, "%d %s %+d (%s %+d, id: %d) %s",
+ output = STRPRINTF("%d %s %+d (%s %+d, id: %d) %s",
pl_sd->status.inventory[i].amount,
item_data->name,
pl_sd->status.inventory[i].refine,
@@ -7188,61 +5294,70 @@ atcommand_character_item_list (const int fd, struct map_session_data *sd,
pl_sd->status.inventory[i].refine,
pl_sd->status.inventory[i].nameid, equipstr);
else
- sprintf (output, "%d %s (%s, id: %d) %s",
+ output = STRPRINTF("%d %s (%s, id: %d) %s",
pl_sd->status.inventory[i].amount,
item_data->name, item_data->jname,
pl_sd->status.inventory[i].nameid, equipstr);
- clif_displaymessage (fd, output);
- memset (output, '\0', sizeof (output));
+ clif_displaymessage(fd, output);
+
+ output.clear();
counter2 = 0;
for (j = 0; j < item_data->slot; j++)
{
if (pl_sd->status.inventory[i].card[j])
{
if ((item_temp =
- itemdb_search (pl_sd->status.
+ itemdb_search(pl_sd->status.
inventory[i].card[j])) !=
NULL)
{
- if (output[0] == '\0')
- sprintf (outputtmp,
- " -> (card(s): #%d %s (%s), ",
- ++counter2, item_temp->name,
- item_temp->jname);
+ if (output.empty())
+ output = STRPRINTF(
+ " -> (card(s): #%d %s (%s), ",
+ ++counter2,
+ item_temp->name,
+ item_temp->jname);
else
- sprintf (outputtmp, "#%d %s (%s), ",
- ++counter2, item_temp->name,
- item_temp->jname);
- strcat (output, outputtmp);
+ output += STRPRINTF(
+ "#%d %s (%s), ",
+ ++counter2,
+ item_temp->name,
+ item_temp->jname);
}
}
}
- if (output[0] != '\0')
+ if (!output.empty())
{
- output[strlen (output) - 2] = ')';
- output[strlen (output) - 1] = '\0';
- clif_displaymessage (fd, output);
+ // replace trailing ", "
+#ifdef WORKAROUND_GCC46_LIBRARY
+ output.resize(output.size() - 1);
+#else
+ output.pop_back();
+#endif
+ output.back() = ')';
+ clif_displaymessage(fd, output);
}
}
}
if (count == 0)
- clif_displaymessage (fd, "No item found on this player.");
+ clif_displaymessage(fd, "No item found on this player.");
else
{
- sprintf (output, "%d item(s) found in %d kind(s) of items.",
- counter, count);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "%d item(s) found in %d kind(s) of items.",
+ counter, count);
+ clif_displaymessage(fd, output);
}
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -7253,32 +5368,29 @@ atcommand_character_item_list (const int fd, struct map_session_data *sd,
* @charstoragelist <character>: Displays the items list of a player's storage.
*------------------------------------------
*/
-int
-atcommand_character_storage_list (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_character_storage_list(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
struct storage *stor;
struct map_session_data *pl_sd;
struct item_data *item_data, *item_temp;
- int i, j, count, counter, counter2;
- char character[100], output[200], outputtmp[200];
+ int i, j, count, counter, counter2;
+ char character[100];
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
- memset (outputtmp, '\0', sizeof (outputtmp));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charitemlist <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can look items only lower or same level
- if ((stor = account2storage2 (pl_sd->status.account_id)) != NULL)
+ if ((stor = account2storage2(pl_sd->status.account_id)) != NULL)
{
counter = 0;
count = 0;
@@ -7286,19 +5398,20 @@ atcommand_character_storage_list (const int fd, struct map_session_data *sd,
{
if (stor->storage_[i].nameid > 0
&& (item_data =
- itemdb_search (stor->storage_[i].nameid)) != NULL)
+ itemdb_search(stor->storage_[i].nameid)) != NULL)
{
counter = counter + stor->storage_[i].amount;
count++;
if (count == 1)
{
- sprintf (output,
+ std::string output = STRPRINTF(
"------ Storage items list of '%s' ------",
pl_sd->status.name);
- clif_displaymessage (fd, output);
+ clif_displaymessage(fd, output);
}
+ std::string output;
if (stor->storage_[i].refine)
- sprintf (output, "%d %s %+d (%s %+d, id: %d)",
+ output = STRPRINTF("%d %s %+d (%s %+d, id: %d)",
stor->storage_[i].amount,
item_data->name,
stor->storage_[i].refine,
@@ -7306,69 +5419,77 @@ atcommand_character_storage_list (const int fd, struct map_session_data *sd,
stor->storage_[i].refine,
stor->storage_[i].nameid);
else
- sprintf (output, "%d %s (%s, id: %d)",
+ output = STRPRINTF("%d %s (%s, id: %d)",
stor->storage_[i].amount,
item_data->name, item_data->jname,
stor->storage_[i].nameid);
- clif_displaymessage (fd, output);
- memset (output, '\0', sizeof (output));
+ clif_displaymessage(fd, output);
+
+ output.clear();
counter2 = 0;
for (j = 0; j < item_data->slot; j++)
{
if (stor->storage_[i].card[j])
{
if ((item_temp =
- itemdb_search (stor->
+ itemdb_search(stor->
storage_[i].card[j])) !=
NULL)
{
- if (output[0] == '\0')
- sprintf (outputtmp,
- " -> (card(s): #%d %s (%s), ",
- ++counter2, item_temp->name,
- item_temp->jname);
+ if (output.empty())
+ output = STRPRINTF(
+ " -> (card(s): #%d %s (%s), ",
+ ++counter2,
+ item_temp->name,
+ item_temp->jname);
else
- sprintf (outputtmp, "#%d %s (%s), ",
- ++counter2, item_temp->name,
- item_temp->jname);
- strcat (output, outputtmp);
+ output += STRPRINTF(
+ "#%d %s (%s), ",
+ ++counter2,
+ item_temp->name,
+ item_temp->jname);
}
}
}
- if (output[0] != '\0')
+ if (!output.empty())
{
- output[strlen (output) - 2] = ')';
- output[strlen (output) - 1] = '\0';
- clif_displaymessage (fd, output);
+ // replace last ", "
+#ifdef WORKAROUND_GCC46_LIBRARY
+ output.resize(output.size() - 1);
+#else
+ output.pop_back();
+#endif
+ output.back() = ')';
+ clif_displaymessage(fd, output);
}
}
}
if (count == 0)
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"No item found in the storage of this player.");
else
{
- sprintf (output,
+ std::string output = STRPRINTF(
"%d item(s) found in %d kind(s) of items.",
counter, count);
- clif_displaymessage (fd, output);
+ clif_displaymessage(fd, output);
}
}
else
{
- clif_displaymessage (fd, "This player has no storage.");
+ clif_displaymessage(fd, "This player has no storage.");
return -1;
}
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -7379,29 +5500,26 @@ atcommand_character_storage_list (const int fd, struct map_session_data *sd,
* @charcartlist <character>: Displays the items list of a player's cart.
*------------------------------------------
*/
-int
-atcommand_character_cart_list (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_character_cart_list(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
struct item_data *item_data, *item_temp;
- int i, j, count, counter, counter2;
- char character[100], output[200], outputtmp[200];
+ int i, j, count, counter, counter2;
+ char character[100];
- memset (character, '\0', sizeof (character));
- memset (output, '\0', sizeof (output));
- memset (outputtmp, '\0', sizeof (outputtmp));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Please, enter a player name (usage: @charitemlist <char name>).");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (pc_isGM (sd) >= pc_isGM (pl_sd))
+ if (pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can look items only lower or same level
counter = 0;
count = 0;
@@ -7409,81 +5527,91 @@ atcommand_character_cart_list (const int fd, struct map_session_data *sd,
{
if (pl_sd->status.cart[i].nameid > 0
&& (item_data =
- itemdb_search (pl_sd->status.cart[i].nameid)) != NULL)
+ itemdb_search(pl_sd->status.cart[i].nameid)) != NULL)
{
counter = counter + pl_sd->status.cart[i].amount;
count++;
if (count == 1)
{
- sprintf (output,
- "------ Cart items list of '%s' ------",
- pl_sd->status.name);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "------ Cart items list of '%s' ------",
+ pl_sd->status.name);
+ clif_displaymessage(fd, output);
}
+
+ std::string output;
if (pl_sd->status.cart[i].refine)
- sprintf (output, "%d %s %+d (%s %+d, id: %d)",
- pl_sd->status.cart[i].amount,
- item_data->name,
- pl_sd->status.cart[i].refine,
- item_data->jname,
- pl_sd->status.cart[i].refine,
- pl_sd->status.cart[i].nameid);
+ output = STRPRINTF("%d %s %+d (%s %+d, id: %d)",
+ pl_sd->status.cart[i].amount,
+ item_data->name,
+ pl_sd->status.cart[i].refine,
+ item_data->jname,
+ pl_sd->status.cart[i].refine,
+ pl_sd->status.cart[i].nameid);
else
- sprintf (output, "%d %s (%s, id: %d)",
- pl_sd->status.cart[i].amount,
- item_data->name, item_data->jname,
- pl_sd->status.cart[i].nameid);
- clif_displaymessage (fd, output);
- memset (output, '\0', sizeof (output));
+
+ output = STRPRINTF("%d %s (%s, id: %d)",
+ pl_sd->status.cart[i].amount,
+ item_data->name, item_data->jname,
+ pl_sd->status.cart[i].nameid);
+ clif_displaymessage(fd, output);
+
+ output.clear();
counter2 = 0;
for (j = 0; j < item_data->slot; j++)
{
if (pl_sd->status.cart[i].card[j])
{
if ((item_temp =
- itemdb_search (pl_sd->status.
+ itemdb_search(pl_sd->status.
cart[i].card[j])) != NULL)
{
- if (output[0] == '\0')
- sprintf (outputtmp,
- " -> (card(s): #%d %s (%s), ",
- ++counter2, item_temp->name,
- item_temp->jname);
+ if (output.empty())
+ output = STRPRINTF(
+ " -> (card(s): #%d %s (%s), ",
+ ++counter2,
+ item_temp->name,
+ item_temp->jname);
else
- sprintf (outputtmp, "#%d %s (%s), ",
- ++counter2, item_temp->name,
- item_temp->jname);
- strcat (output, outputtmp);
+ output += STRPRINTF(
+ "#%d %s (%s), ",
+ ++counter2,
+ item_temp->name,
+ item_temp->jname);
}
}
}
- if (output[0] != '\0')
+ if (!output.empty())
{
- output[strlen (output) - 2] = ')';
- output[strlen (output) - 1] = '\0';
- clif_displaymessage (fd, output);
+#ifdef WORKAROUND_GCC46_LIBRARY
+ output.resize(output.size() - 1);
+#else
+ output.pop_back();
+#endif
+ output.back() = '0';
+ clif_displaymessage(fd, output);
}
}
}
if (count == 0)
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"No item found in the cart of this player.");
else
{
- sprintf (output, "%d item(s) found in %d kind(s) of items.",
+ std::string output = STRPRINTF("%d item(s) found in %d kind(s) of items.",
counter, count);
- clif_displaymessage (fd, output);
+ clif_displaymessage(fd, output);
}
}
else
{
- clif_displaymessage (fd, "Your GM level don't authorise you to do this action on this player.");
+ 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.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
@@ -7495,16 +5623,15 @@ atcommand_character_cart_list (const int fd, struct map_session_data *sd,
* enable killing players even when not in pvp
*------------------------------------------
*/
-int
-atcommand_killer (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_killer(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
sd->special_state.killer = !sd->special_state.killer;
if (sd->special_state.killer)
- clif_displaymessage (fd, "You be a killa...");
+ clif_displaymessage(fd, "You be a killa...");
else
- clif_displaymessage (fd, "You gonna be own3d...");
+ clif_displaymessage(fd, "You gonna be own3d...");
return 0;
}
@@ -7514,16 +5641,15 @@ atcommand_killer (const int fd, struct map_session_data *sd,
* enable other people killing you
*------------------------------------------
*/
-int
-atcommand_killable (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_killable(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
sd->special_state.killable = !sd->special_state.killable;
if (sd->special_state.killable)
- clif_displaymessage (fd, "You gonna be own3d...");
+ clif_displaymessage(fd, "You gonna be own3d...");
else
- clif_displaymessage (fd, "You be a killa...");
+ clif_displaymessage(fd, "You be a killa...");
return 0;
}
@@ -7533,53 +5659,24 @@ atcommand_killable (const int fd, struct map_session_data *sd,
* enable another player to be killed
*------------------------------------------
*/
-int
-atcommand_charkillable (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charkillable(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
struct map_session_data *pl_sd = NULL;
if (!message || !*message)
return -1;
- if ((pl_sd = map_nick2sd ((char *) message)) == NULL)
+ if ((pl_sd = map_nick2sd(message)) == NULL)
return -1;
pl_sd->special_state.killable = !pl_sd->special_state.killable;
if (pl_sd->special_state.killable)
- clif_displaymessage (fd, "The player is now killable");
+ clif_displaymessage(fd, "The player is now killable");
else
- clif_displaymessage (fd, "The player is no longer killable");
-
- return 0;
-}
-
-/*==========================================
- * @skillon by MouseJstr
- * turn skills on for the map
- *------------------------------------------
- */
-int
-atcommand_skillon (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- map[sd->bl.m].flag.noskill = 0;
- clif_displaymessage (fd, "Map skills are on.");
- return 0;
-}
+ clif_displaymessage(fd, "The player is no longer killable");
-/*==========================================
- * @skilloff by MouseJstr
- * Turn skills off on the map
- *------------------------------------------
- */
-int
-atcommand_skilloff (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- map[sd->bl.m].flag.noskill = 1;
- clif_displaymessage (fd, "Map skills are off.");
return 0;
}
@@ -7589,12 +5686,11 @@ atcommand_skilloff (const int fd, struct map_session_data *sd,
* move a npc
*------------------------------------------
*/
-int
-atcommand_npcmove (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_npcmove(const int, struct map_session_data *sd,
+ const char *, const char *message)
{
char character[100];
- int x = 0, y = 0;
+ int x = 0, y = 0;
struct npc_data *nd = 0;
if (sd == NULL)
@@ -7603,19 +5699,19 @@ atcommand_npcmove (const int fd, struct map_session_data *sd,
if (!message || !*message)
return -1;
- memset (character, '\0', sizeof character);
+ memset(character, '\0', sizeof character);
- if (sscanf (message, "%d %d %99[^\n]", &x, &y, character) < 3)
+ if (sscanf(message, "%d %d %99[^\n]", &x, &y, character) < 3)
return -1;
- nd = npc_name2id (character);
+ nd = npc_name2id(character);
if (nd == NULL)
return -1;
- npc_enable (character, 0);
+ npc_enable(character, 0);
nd->bl.x = x;
nd->bl.y = y;
- npc_enable (character, 1);
+ npc_enable(character, 1);
return 0;
}
@@ -7626,90 +5722,55 @@ atcommand_npcmove (const int fd, struct map_session_data *sd,
* Create a new static warp point.
*------------------------------------------
*/
-int
-atcommand_addwarp (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_addwarp(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- char w1[64], w3[64], w4[64];
- char map[30], output[200];
- int x, y, ret;
+ char mapname[30];
+ int x, y, ret;
if (!message || !*message)
return -1;
- if (sscanf (message, "%99s %d %d[^\n]", map, &x, &y) < 3)
+ if (sscanf(message, "%29s %d %d[^\n]", mapname, &x, &y) < 3)
return -1;
- sprintf (w1, "%s,%d,%d", sd->mapname, sd->bl.x, sd->bl.y);
- sprintf (w3, "%s%d%d%d%d", map, sd->bl.x, sd->bl.y, x, y);
- sprintf (w4, "1,1,%s.gat,%d,%d", map, x, y);
+ std::string w1 = STRPRINTF("%s,%d,%d", sd->mapname, sd->bl.x, sd->bl.y);
+ std::string w3 = STRPRINTF("%s%d%d%d%d", mapname, sd->bl.x, sd->bl.y, x, y);
+ std::string w4 = STRPRINTF("1,1,%s.gat,%d,%d", mapname, x, y);
- ret = npc_parse_warp (w1, "warp", w3, w4);
+ ret = npc_parse_warp(w1.c_str(), "warp", w3.c_str(), w4.c_str());
- sprintf (output, "New warp NPC => %s", w3);
-
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF("New warp NPC => %s", w3);
+ clif_displaymessage(fd, output);
return ret;
}
/*==========================================
- * @follow by [MouseJstr]
- *
- * Follow a player .. staying no more then 5 spaces away
- *------------------------------------------
- */
-int
-atcommand_follow (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
-#if 0
- struct map_session_data *pl_sd = NULL;
-
- if (!message || !*message)
- return -1;
- if ((pl_sd = map_nick2sd ((char *) message)) != NULL)
- pc_follow (sd, pl_sd->bl.id);
- else
- return 1;
-#endif
-
- /*
- * Command disabled - it's incompatible with the TMW
- * client.
- */
- clif_displaymessage (fd, "@follow command not available");
-
- return 0;
-
-}
-
-/*==========================================
* @chareffect by [MouseJstr]
*
* Create a effect localized on another character
*------------------------------------------
*/
-int
-atcommand_chareffect (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_chareffect(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
struct map_session_data *pl_sd = NULL;
char target[255];
- int type = 0;
+ int type = 0;
if (!message || !*message
- || sscanf (message, "%d %s", &type, target) != 2)
+ || sscanf(message, "%d %s", &type, target) != 2)
{
- clif_displaymessage (fd, "usage: @chareffect <type+> <target>.");
+ clif_displaymessage(fd, "usage: @chareffect <type+> <target>.");
return -1;
}
- if ((pl_sd = map_nick2sd ((char *) target)) == NULL)
+ if ((pl_sd = map_nick2sd(target)) == NULL)
return -1;
- clif_specialeffect (&pl_sd->bl, type, 0);
- clif_displaymessage (fd, "Your Effect Has Changed."); // Your effect has changed.
+ clif_specialeffect(&pl_sd->bl, type, 0);
+ clif_displaymessage(fd, "Your Effect Has Changed."); // Your effect has changed.
return 0;
}
@@ -7720,18 +5781,17 @@ atcommand_chareffect (const int fd, struct map_session_data *sd,
* Drop all your possession on the ground
*------------------------------------------
*/
-int
-atcommand_dropall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_dropall(const int, struct map_session_data *sd,
+ const char *, const char *)
{
- int i;
+ int i;
for (i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].amount)
{
- if (sd->status.inventory[i].equip != 0)
- pc_unequipitem (sd, i, 0);
- pc_dropitem (sd, i, sd->status.inventory[i].amount);
+ if (bool(sd->status.inventory[i].equip))
+ pc_unequipitem(sd, i, CalcStatus::NOW);
+ pc_dropitem(sd, i, sd->status.inventory[i].amount);
}
}
return 0;
@@ -7744,29 +5804,28 @@ atcommand_dropall (const int fd, struct map_session_data *sd,
* done in response to them being disrespectful of a GM
*------------------------------------------
*/
-int
-atcommand_chardropall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_chardropall(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
- int i;
+ int i;
struct map_session_data *pl_sd = NULL;
if (!message || !*message)
return -1;
- if ((pl_sd = map_nick2sd ((char *) message)) == NULL)
+ if ((pl_sd = map_nick2sd(message)) == NULL)
return -1;
for (i = 0; i < MAX_INVENTORY; i++)
{
if (pl_sd->status.inventory[i].amount)
{
- if (pl_sd->status.inventory[i].equip != 0)
- pc_unequipitem (pl_sd, i, 0);
- pc_dropitem (pl_sd, i, pl_sd->status.inventory[i].amount);
+ if (bool(pl_sd->status.inventory[i].equip))
+ pc_unequipitem(pl_sd, i, CalcStatus::NOW);
+ pc_dropitem(pl_sd, i, pl_sd->status.inventory[i].amount);
}
}
- clif_displaymessage (pl_sd->fd, "Ever play 52 card pickup?");
- clif_displaymessage (fd, "It is done");
+ clif_displaymessage(pl_sd->fd, "Ever play 52 card pickup?");
+ clif_displaymessage(fd, "It is done");
//clif_displaymessage(fd, "It is offical.. your a jerk");
return 0;
@@ -7779,22 +5838,21 @@ atcommand_chardropall (const int fd, struct map_session_data *sd,
* debugging easie
*------------------------------------------
*/
-int
-atcommand_storeall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_storeall(const int fd, struct map_session_data *sd,
+ const char *, const char *)
{
- int i;
- nullpo_retr (-1, sd);
+ int i;
+ nullpo_retr(-1, sd);
- if (sd->state.storage_flag != 1)
+ if (!sd->state.storage_open)
{ //Open storage.
- switch (storage_storageopen (sd))
+ switch (storage_storageopen(sd))
{
case 2: //Try again
- clif_displaymessage (fd, "run this command again..");
+ clif_displaymessage(fd, "run this command again..");
return 0;
case 1: //Failure
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You can't open the storage currently.");
return 1;
}
@@ -7803,14 +5861,14 @@ atcommand_storeall (const int fd, struct map_session_data *sd,
{
if (sd->status.inventory[i].amount)
{
- if (sd->status.inventory[i].equip != 0)
- pc_unequipitem (sd, i, 0);
- storage_storageadd (sd, i, sd->status.inventory[i].amount);
+ if (bool(sd->status.inventory[i].equip))
+ pc_unequipitem(sd, i, CalcStatus::NOW);
+ storage_storageadd(sd, i, sd->status.inventory[i].amount);
}
}
- storage_storageclose (sd);
+ storage_storageclose(sd);
- clif_displaymessage (fd, "It is done");
+ clif_displaymessage(fd, "It is done");
return 0;
}
@@ -7820,111 +5878,42 @@ atcommand_storeall (const int fd, struct map_session_data *sd,
* A way to screw with players who piss you off
*------------------------------------------
*/
-int
-atcommand_charstoreall (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_charstoreall(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
- int i;
+ int i;
struct map_session_data *pl_sd = NULL;
if (!message || !*message)
return -1;
- if ((pl_sd = map_nick2sd ((char *) message)) == NULL)
+ if ((pl_sd = map_nick2sd(message)) == NULL)
return -1;
- if (storage_storageopen (pl_sd) == 1)
+ if (storage_storageopen(pl_sd) == 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Had to open the characters storage window...");
- clif_displaymessage (fd, "run this command again..");
+ clif_displaymessage(fd, "run this command again..");
return 0;
}
for (i = 0; i < MAX_INVENTORY; i++)
{
if (pl_sd->status.inventory[i].amount)
{
- if (pl_sd->status.inventory[i].equip != 0)
- pc_unequipitem (pl_sd, i, 0);
- storage_storageadd (pl_sd, i, sd->status.inventory[i].amount);
+ if (bool(pl_sd->status.inventory[i].equip))
+ pc_unequipitem(pl_sd, i, CalcStatus::NOW);
+ storage_storageadd(pl_sd, i, sd->status.inventory[i].amount);
}
}
- storage_storageclose (pl_sd);
+ storage_storageclose(pl_sd);
- clif_displaymessage (pl_sd->fd,
+ clif_displaymessage(pl_sd->fd,
"Everything you own has been put away for safe keeping.");
- clif_displaymessage (pl_sd->fd,
+ clif_displaymessage(pl_sd->fd,
"go to the nearest kafka to retrieve it..");
- clif_displaymessage (pl_sd->fd, " -- the management");
-
- clif_displaymessage (fd, "It is done");
-
- return 0;
-}
-
-/*==========================================
- * @skillid by [MouseJstr]
- *
- * lookup a skill by name
- *------------------------------------------
- */
-int
-atcommand_skillid (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- int skillen = 0, idx = 0;
- if (!message || !*message)
- return -1;
- skillen = strlen (message);
- while (skill_names[idx].id != 0)
- {
- if ((strncasecmp (skill_names[idx].name, message, skillen) == 0) ||
- (strncasecmp (skill_names[idx].desc, message, skillen) == 0))
- {
- char output[255];
- sprintf (output, "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 *command, const char *message)
-{
- struct map_session_data *pl_sd = NULL;
- int skillnum;
- int skilllv;
- int inf;
- char target[255];
+ clif_displaymessage(pl_sd->fd, " -- the management");
- if (!message || !*message)
- return -1;
- if (sscanf (message, "%d %d %s", &skillnum, &skilllv, target) != 3)
- {
- clif_displaymessage (fd,
- "Usage: @useskill <skillnum> <skillv> <target>");
- return -1;
- }
- if ((pl_sd = map_nick2sd (target)) == NULL)
- {
- return -1;
- }
-
- 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);
+ clif_displaymessage(fd, "It is done");
return 0;
}
@@ -7933,18 +5922,17 @@ atcommand_useskill (const int fd, struct map_session_data *sd,
* It is made to rain.
*------------------------------------------
*/
-int
-atcommand_rain (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_rain(const int, struct map_session_data *sd,
+ const char *, const char *)
{
- int effno = 0;
+ int effno = 0;
effno = 161;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
if (effno < 0 || map[sd->bl.m].flag.rain)
return -1;
map[sd->bl.m].flag.rain = 1;
- clif_specialeffect (&sd->bl, effno, 2);
+ clif_specialeffect(&sd->bl, effno, 2);
return 0;
}
@@ -7952,18 +5940,17 @@ atcommand_rain (const int fd, struct map_session_data *sd,
* It is made to snow.
*------------------------------------------
*/
-int
-atcommand_snow (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_snow(const int, struct map_session_data *sd,
+ const char *, const char *)
{
- int effno = 0;
+ int effno = 0;
effno = 162;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
if (effno < 0 || map[sd->bl.m].flag.snow)
return -1;
map[sd->bl.m].flag.snow = 1;
- clif_specialeffect (&sd->bl, effno, 2);
+ clif_specialeffect(&sd->bl, effno, 2);
return 0;
}
@@ -7971,18 +5958,17 @@ atcommand_snow (const int fd, struct map_session_data *sd,
* Cherry tree snowstorm is made to fall. (Sakura)
*------------------------------------------
*/
-int
-atcommand_sakura (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_sakura(const int, struct map_session_data *sd,
+ const char *, const char *)
{
- int effno = 0;
+ int effno = 0;
effno = 163;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
if (effno < 0 || map[sd->bl.m].flag.sakura)
return -1;
map[sd->bl.m].flag.sakura = 1;
- clif_specialeffect (&sd->bl, effno, 2);
+ clif_specialeffect(&sd->bl, effno, 2);
return 0;
}
@@ -7990,18 +5976,17 @@ atcommand_sakura (const int fd, struct map_session_data *sd,
* Fog hangs over.
*------------------------------------------
*/
-int
-atcommand_fog (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_fog(const int, struct map_session_data *sd,
+ const char *, const char *)
{
- int effno = 0;
+ int effno = 0;
effno = 233;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
if (effno < 0 || map[sd->bl.m].flag.fog)
return -1;
map[sd->bl.m].flag.fog = 1;
- clif_specialeffect (&sd->bl, effno, 2);
+ clif_specialeffect(&sd->bl, effno, 2);
return 0;
}
@@ -8010,18 +5995,17 @@ atcommand_fog (const int fd, struct map_session_data *sd,
* Fallen leaves fall.
*------------------------------------------
*/
-int
-atcommand_leaves (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_leaves(const int, struct map_session_data *sd,
+ const char *, const char *)
{
- int effno = 0;
+ int effno = 0;
effno = 333;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
if (effno < 0 || map[sd->bl.m].flag.leaves)
return -1;
map[sd->bl.m].flag.leaves = 1;
- clif_specialeffect (&sd->bl, effno, 2);
+ clif_specialeffect(&sd->bl, effno, 2);
return 0;
}
@@ -8029,42 +6013,43 @@ atcommand_leaves (const int fd, struct map_session_data *sd,
*
*------------------------------------------
*/
-int atcommand_summon (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_summon(const int, struct map_session_data *sd,
+ const char *, const char *message)
{
char name[100];
- int mob_id = 0;
- int x = 0;
- int y = 0;
- int id = 0;
+ int mob_id = 0;
+ int x = 0;
+ int y = 0;
+ int id = 0;
struct mob_data *md;
- unsigned int tick = gettick ();
+ tick_t tick = gettick();
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
if (!message || !*message)
return -1;
- if (sscanf (message, "%99[^\n]", name) < 1)
+ if (sscanf(message, "%99[^\n]", name) < 1)
return -1;
- if ((mob_id = atoi (name)) == 0)
- mob_id = mobdb_searchname (name);
+ if ((mob_id = atoi(name)) == 0)
+ mob_id = mobdb_searchname(name);
if (mob_id == 0)
return -1;
- x = sd->bl.x + (MRAND (10) - 5);
- y = sd->bl.y + (MRAND (10) - 5);
+ x = sd->bl.x + random_::in(-5, 4);
+ y = sd->bl.y + random_::in(-5, 4);
- id = mob_once_spawn (sd, "this", x, y, "--ja--", mob_id, 1, "");
- if ((md = (struct mob_data *) map_id2bl (id)))
+ id = mob_once_spawn(sd, "this", x, y, "--ja--", mob_id, 1, "");
+ if ((md = (struct mob_data *) map_id2bl(id)))
{
md->master_id = sd->bl.id;
md->state.special_mob_ai = 1;
- md->mode = mob_db[md->mob_class].mode | 0x04;
- md->deletetimer = add_timer (tick + 60000, mob_timer_delete, id, 0);
- clif_misceffect (&md->bl, 344);
+ md->mode = mob_db[md->mob_class].mode | MobMode::AGGRESSIVE;
+ md->deletetimer = Timer(tick + std::chrono::minutes(1),
+ std::bind(mob_timer_delete, ph::_1, ph::_2,
+ id));
+ clif_misceffect(&md->bl, 344);
}
- clif_skill_poseffect (&sd->bl, AM_CALLHOMUN, 1, x, y, tick);
return 0;
}
@@ -8078,28 +6063,27 @@ int atcommand_summon (const int fd, struct map_session_data *sd,
* for short periods of time
*------------------------------------------
*/
-int
-atcommand_adjcmdlvl (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_adjcmdlvl(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
- int i, newlev;
+ int i, newlev;
char cmd[100];
- if (!message || !*message || sscanf (message, "%d %s", &newlev, cmd) != 2)
+ if (!message || !*message || sscanf(message, "%d %s", &newlev, cmd) != 2)
{
- clif_displaymessage (fd, "usage: @adjcmdlvl <lvl> <command>.");
+ clif_displaymessage(fd, "usage: @adjcmdlvl <lvl> <command>.");
return -1;
}
- for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
- if (strcasecmp (cmd, atcommand_info[i].command + 1) == 0)
+ for (i = 0; atcommand_info[i].command; i++)
+ if (strcasecmp(cmd, atcommand_info[i].command + 1) == 0)
{
atcommand_info[i].level = newlev;
- clif_displaymessage (fd, "@command level changed.");
+ clif_displaymessage(fd, "@command level changed.");
return 0;
}
- clif_displaymessage (fd, "@command not found.");
+ clif_displaymessage(fd, "@command not found.");
return -1;
}
@@ -8112,25 +6096,24 @@ atcommand_adjcmdlvl (const int fd, struct map_session_data *sd,
* for short periods of time
*------------------------------------------
*/
-int
-atcommand_adjgmlvl (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_adjgmlvl(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
- int newlev;
+ int newlev;
char user[100];
struct map_session_data *pl_sd;
if (!message || !*message
- || sscanf (message, "%d %s", &newlev, user) != 2)
+ || sscanf(message, "%d %s", &newlev, user) != 2)
{
- clif_displaymessage (fd, "usage: @adjgmlvl <lvl> <user>.");
+ clif_displaymessage(fd, "usage: @adjgmlvl <lvl> <user>.");
return -1;
}
- if ((pl_sd = map_nick2sd ((char *) user)) == NULL)
+ if ((pl_sd = map_nick2sd(user)) == NULL)
return -1;
- pc_set_gm_level (pl_sd->status.account_id, newlev);
+ pc_set_gm_level(pl_sd->status.account_id, newlev);
return 0;
}
@@ -8144,442 +6127,432 @@ atcommand_adjgmlvl (const int fd, struct map_session_data *sd,
* gonna scream!
*------------------------------------------
*/
-int
-atcommand_trade (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_trade(const int, struct map_session_data *sd,
+ const char *, const char *message)
{
struct map_session_data *pl_sd = NULL;
if (!message || !*message)
return -1;
- if ((pl_sd = map_nick2sd ((char *) message)) != NULL)
+ if ((pl_sd = map_nick2sd(message)) != NULL)
{
- trade_traderequest (sd, pl_sd->bl.id);
+ trade_traderequest(sd, pl_sd->bl.id);
return 0;
}
return -1;
}
-/*===========================
- * @unmute [Valaris]
- *===========================
-*/
-int atcommand_unmute (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- struct map_session_data *pl_sd = NULL;
- if (!message || !*message)
- return -1;
-
- if ((pl_sd = map_nick2sd ((char *) message)) != NULL)
- {
- if (pl_sd->sc_data[SC_NOCHAT].timer != -1)
- {
- skill_status_change_end (&pl_sd->bl, SC_NOCHAT, -1);
- clif_displaymessage (sd->fd, "Player unmuted");
- }
- else
- clif_displaymessage (sd->fd, "Player is not muted");
- }
+/* Magic atcommands by Fate */
- return 0;
-}
+static
+SkillID magic_skills[] =
+{
+ SkillID::TMW_MAGIC,
+ SkillID::TMW_MAGIC_LIFE,
+ SkillID::TMW_MAGIC_WAR,
+ SkillID::TMW_MAGIC_TRANSMUTE,
+ SkillID::TMW_MAGIC_NATURE,
+ SkillID::TMW_MAGIC_ETHER,
+};
-/* Magic atcommands by Fate */
+constexpr
+size_t magic_skills_nr = sizeof(magic_skills) / sizeof(magic_skills[0]);
-static int magic_base = TMW_MAGIC;
-#define magic_skills_nr 6
-static const char *magic_skill_names[magic_skills_nr] =
- { "magic", "life", "war", "transmute", "nature", "astral" };
+static
+const char *magic_skill_names[magic_skills_nr] =
+{
+ "magic",
+ "life",
+ "war",
+ "transmute",
+ "nature",
+ "astral"
+};
-int
-atcommand_magic_info (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_magic_info(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
- char buf[200];
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd, "Usage: @magicinfo <char_name>");
+ clif_displaymessage(fd, "Usage: @magicinfo <char_name>");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- int i;
-
- sprintf (buf, "`%s' has the following magic skills:", character);
- clif_displaymessage (fd, buf);
+ std::string buf = STRPRINTF(
+ "`%s' has the following magic skills:",
+ character);
+ clif_displaymessage(fd, buf);
- for (i = 0; i < magic_skills_nr; i++)
+ for (size_t i = 0; i < magic_skills_nr; i++)
{
- sprintf (buf, "%d in %s", pl_sd->status.skill[i + magic_base].lv,
- magic_skill_names[i]);
- if (pl_sd->status.skill[i + magic_base].id == i + magic_base)
- clif_displaymessage (fd, buf);
+ SkillID sk = magic_skills[i];
+ buf = STRPRINTF(
+ "%d in %s",
+ pl_sd->status.skill[sk].lv,
+ magic_skill_names[i]);
+ if (pl_sd->status.skill[sk].lv)
+ clif_displaymessage(fd, buf);
}
return 0;
}
else
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
-static void set_skill (struct map_session_data *sd, int i, int level)
+static
+void set_skill(struct map_session_data *sd, SkillID i, int level)
{
- sd->status.skill[i].id = level ? i : 0;
sd->status.skill[i].lv = level;
}
-int
-atcommand_set_magic (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_set_magic(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
char magic_type[20];
- int skill_index = -1; // 0: all
- int value;
+ int value;
struct map_session_data *pl_sd;
- memset (character, '\0', sizeof (character));
+ memset(character, '\0', sizeof(character));
if (!message || !*message
- || sscanf (message, "%19s %i %99[^\n]", magic_type, &value,
+ || sscanf(message, "%19s %i %99[^\n]", magic_type, &value,
character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Usage: @setmagic <school> <value> <char-name>, where <school> is either `magic', one of the school names, or `all'.");
return -1;
}
- if (!strcasecmp ("all", magic_type))
- skill_index = 0;
+ SkillID skill_index = SkillID::NEGATIVE;
+ if (!strcasecmp("all", magic_type))
+ skill_index = SkillID::ZERO;
else
{
- int i;
- for (i = 0; i < magic_skills_nr; i++)
+ for (size_t i = 0; i < magic_skills_nr; i++)
{
- if (!strcasecmp (magic_skill_names[i], magic_type))
+ if (!strcasecmp(magic_skill_names[i], magic_type))
{
- skill_index = i + magic_base;
+ skill_index = magic_skills[i];
break;
}
}
}
- if (skill_index == -1)
+ if (skill_index == SkillID::NEGATIVE)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Incorrect school of magic. Use `magic', `nature', `life', `war', `transmute', `ether', or `all'.");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- int i;
- if (skill_index == 0)
- for (i = 0; i < magic_skills_nr; i++)
- set_skill (pl_sd, i + magic_base, value);
+ if (skill_index == SkillID::ZERO)
+ for (SkillID sk : magic_skills)
+ set_skill(pl_sd, sk, value);
else
- set_skill (pl_sd, skill_index, value);
+ set_skill(pl_sd, skill_index, value);
- clif_skillinfoblock (pl_sd);
+ clif_skillinfoblock(pl_sd);
return 0;
}
else
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
-int
-atcommand_log (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_log(const int, struct map_session_data *,
+ const char *, const char *)
{
- return 0; // only used for (implicit) logging
+ return 0;
+ // only used for (implicit) logging
}
-int
-atcommand_tee (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_tee(const int, struct map_session_data *sd,
+ const char *, const char *message)
{
- char *data = (char *)malloc (strlen (message) + 28);
- strcpy (data, sd->status.name);
- strcat (data, " : ");
- strcat (data, message);
- clif_message (&sd->bl, data);
+ char data[strlen(message) + 28];
+ strcpy(data, sd->status.name);
+ strcat(data, " : ");
+ strcat(data, message);
+ clif_message(&sd->bl, data);
return 0;
}
-int
-atcommand_invisible (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_invisible(const int, struct map_session_data *sd,
+ const char *, const char *)
{
- pc_invisibility (sd, 1);
+ pc_invisibility(sd, 1);
return 0;
}
-int
-atcommand_visible (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_visible(const int, struct map_session_data *sd,
+ const char *, const char *)
{
- pc_invisibility (sd, 0);
+ pc_invisibility(sd, 0);
return 0;
}
static
-int atcommand_jump_iterate (const int fd, struct map_session_data *sd,
- const char *command, const char *message,
- struct map_session_data *(*get_start) (void),
- struct map_session_data *(*get_next) (struct
- map_session_data
- * current))
-{
- char output[200];
+int atcommand_jump_iterate(const int fd, struct map_session_data *sd,
+ const char *, const char *,
+ struct map_session_data *(*get_start)(void),
+ struct map_session_data *(*get_next)(struct map_session_data*))
+{
struct map_session_data *pl_sd;
- memset (output, '\0', sizeof (output));
-
- pl_sd = (struct map_session_data *) map_id2bl (sd->followtarget);
+ pl_sd = (struct map_session_data *) map_id2bl(sd->followtarget);
if (pl_sd)
- pl_sd = get_next (pl_sd);
+ pl_sd = get_next(pl_sd);
if (!pl_sd)
- pl_sd = get_start ();
+ pl_sd = get_start();
if (pl_sd == sd)
{
- pl_sd = get_next (pl_sd);
+ pl_sd = get_next(pl_sd);
if (!pl_sd)
- pl_sd = get_start ();
+ pl_sd = get_start();
}
if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you to the map of this player.");
return -1;
}
if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp
- && battle_config.any_warp_GM_min_level > pc_isGM (sd))
+ && battle_config.any_warp_GM_min_level > pc_isGM(sd))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"You are not authorised to warp you from your actual map.");
return -1;
}
- pc_setpos (sd, map[pl_sd->bl.m].name, pl_sd->bl.x, pl_sd->bl.y, 3);
- sprintf (output, "Jump to %s", pl_sd->status.name);
- clif_displaymessage (fd, output);
+ pc_setpos(sd, map[pl_sd->bl.m].name, pl_sd->bl.x, pl_sd->bl.y, BeingRemoveWhy::WARPED);
+ std::string output = STRPRINTF("Jump to %s", pl_sd->status.name);
+ clif_displaymessage(fd, output);
sd->followtarget = pl_sd->bl.id;
return 0;
}
-int
-atcommand_iterate_forward_over_players (const int fd,
+int atcommand_iterate_forward_over_players(const int fd,
struct map_session_data *sd,
const char *command,
const char *message)
{
- return atcommand_jump_iterate (fd, sd, command, message,
+ return atcommand_jump_iterate(fd, sd, command, message,
map_get_first_session,
map_get_next_session);
}
-int
-atcommand_iterate_backwards_over_players (const int fd,
+int atcommand_iterate_backwards_over_players(const int fd,
struct map_session_data *sd,
const char *command,
const char *message)
{
- return atcommand_jump_iterate (fd, sd, command, message,
+ return atcommand_jump_iterate(fd, sd, command, message,
map_get_last_session,
map_get_prev_session);
}
-int atcommand_wgm (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_wgm(const int fd, struct map_session_data *sd,
+ const char *, const char *message)
{
if (tmw_CheckChatSpam(sd, message))
return 0;
- tmw_GmHackMsg ("%s: %s", sd->status.name, message);
- if (!pc_isGM (sd))
- clif_displaymessage (fd, "Message sent.");
+
+ tmw_GmHackMsg(static_cast<const std::string&>(STRPRINTF("[GM] %s: %s", sd->status.name, message)));
+ if (!pc_isGM(sd))
+ clif_displaymessage(fd, "Message sent.");
return 0;
}
-int atcommand_skillpool_info (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_skillpool_info(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
struct map_session_data *pl_sd;
- if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1)
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1)
{
- clif_displaymessage (fd, "Usage: @sp-info <char_name>");
+ clif_displaymessage(fd, "Usage: @sp-info <char_name>");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- char buf[200];
- int pool_skills[MAX_SKILL_POOL];
- int pool_skills_nr = skill_pool (pl_sd, pool_skills);
- int i;
+ SkillID pool_skills[MAX_SKILL_POOL];
+ int pool_skills_nr = skill_pool(pl_sd, pool_skills);
+ int i;
- sprintf (buf, "Active skills %d out of %d for %s:", pool_skills_nr,
- skill_pool_max (pl_sd), character);
- clif_displaymessage (fd, buf);
+ std::string buf = STRPRINTF(
+ "Active skills %d out of %d for %s:",
+ pool_skills_nr, skill_pool_max(pl_sd), character);
+ clif_displaymessage(fd, buf);
for (i = 0; i < pool_skills_nr; ++i)
{
- sprintf (buf, " - %s [%d]: power %d", skill_name (pool_skills[i]),
- pool_skills[i], skill_power (pl_sd, pool_skills[i]));
- clif_displaymessage (fd, buf);
+ buf = STRPRINTF(" - %s [%d]: power %d",
+ skill_name(pool_skills[i]),
+ pool_skills[i],
+ skill_power(pl_sd, pool_skills[i]));
+ clif_displaymessage(fd, buf);
}
- sprintf (buf, "Learned skills out of %d for %s:",
- skill_pool_skills_size, character);
- clif_displaymessage (fd, buf);
+ buf = STRPRINTF("Learned skills out of %d for %s:",
+ skill_pool_skills_size, character);
+ clif_displaymessage(fd, buf);
for (i = 0; i < skill_pool_skills_size; ++i)
{
- const char *name = skill_name (skill_pool_skills[i]);
- int lvl = pl_sd->status.skill[skill_pool_skills[i]].lv;
+ const char *name = skill_name(skill_pool_skills[i]);
+ int lvl = pl_sd->status.skill[skill_pool_skills[i]].lv;
if (lvl)
{
- sprintf (buf, " - %s [%d]: lvl %d", name,
- skill_pool_skills[i], lvl);
- clif_displaymessage (fd, buf);
+ buf = STRPRINTF(" - %s [%d]: lvl %d",
+ name, skill_pool_skills[i], lvl);
+ clif_displaymessage(fd, buf);
}
}
}
else
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return 0;
}
-int atcommand_skillpool_focus (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_skillpool_focus(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
- int skill;
+ int skill_;
struct map_session_data *pl_sd;
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &skill, character) < 1)
+ || sscanf(message, "%d %99[^\n]", &skill_, character) < 1)
{
- clif_displaymessage (fd, "Usage: @sp-focus <skill-nr> <char_name>");
+ clif_displaymessage(fd, "Usage: @sp-focus <skill-nr> <char_name>");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ SkillID skill = SkillID(skill_);
+
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (skill_pool_activate (pl_sd, skill))
- clif_displaymessage (fd, "Activation failed.");
+ if (skill_pool_activate(pl_sd, skill))
+ clif_displaymessage(fd, "Activation failed.");
else
- clif_displaymessage (fd, "Activation successful.");
+ clif_displaymessage(fd, "Activation successful.");
}
else
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return 0;
}
-int atcommand_skillpool_unfocus (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_skillpool_unfocus(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
- int skill;
+ int skill_;
struct map_session_data *pl_sd;
if (!message || !*message
- || sscanf (message, "%d %99[^\n]", &skill, character) < 1)
+ || sscanf(message, "%d %99[^\n]", &skill_, character) < 1)
{
- clif_displaymessage (fd, "Usage: @sp-unfocus <skill-nr> <char_name>");
+ clif_displaymessage(fd, "Usage: @sp-unfocus <skill-nr> <char_name>");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ SkillID skill = SkillID(skill_);
+
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- if (skill_pool_deactivate (pl_sd, skill))
- clif_displaymessage (fd, "Deactivation failed.");
+ if (skill_pool_deactivate(pl_sd, skill))
+ clif_displaymessage(fd, "Deactivation failed.");
else
- clif_displaymessage (fd, "Deactivation successful.");
+ clif_displaymessage(fd, "Deactivation successful.");
}
else
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return 0;
}
-int atcommand_skill_learn (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_skill_learn(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
char character[100];
- int skill, level;
+ int skill_, level;
struct map_session_data *pl_sd;
if (!message || !*message
- || sscanf (message, "%d %d %99[^\n]", &skill, &level, character) < 1)
+ || sscanf(message, "%d %d %99[^\n]", &skill_, &level, character) < 1)
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Usage: @skill-learn <skill-nr> <level> <char_name>");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) != NULL)
+ SkillID skill = SkillID(skill_);
+
+ if ((pl_sd = map_nick2sd(character)) != NULL)
{
- set_skill (pl_sd, skill, level);
- clif_skillinfoblock (pl_sd);
+ set_skill(pl_sd, skill, level);
+ clif_skillinfoblock(pl_sd);
}
else
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return 0;
}
-int atcommand_ipcheck (const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+int atcommand_ipcheck(const int fd, struct map_session_data *,
+ const char *, const char *message)
{
struct map_session_data *pl_sd;
struct sockaddr_in sai;
- char output[200];
char character[25];
int i;
- socklen_t sa_len = sizeof (struct sockaddr);
+ socklen_t sa_len = sizeof(struct sockaddr);
unsigned long ip;
memset(character, '\0', sizeof(character));
- if (sscanf (message, "%24[^\n]", character) < 1)
+ if (sscanf(message, "%24[^\n]", character) < 1)
{
- clif_displaymessage (fd, "Usage: @ipcheck <char name>");
+ clif_displaymessage(fd, "Usage: @ipcheck <char name>");
return -1;
}
- if ((pl_sd = map_nick2sd (character)) == NULL)
+ if ((pl_sd = map_nick2sd(character)) == NULL)
{
- clif_displaymessage (fd, "Character not found.");
+ clif_displaymessage(fd, "Character not found.");
return -1;
}
- if (getpeername (pl_sd->fd, (struct sockaddr *)&sai, &sa_len))
+ if (getpeername(pl_sd->fd, (struct sockaddr *)&sai, &sa_len))
{
- clif_displaymessage (fd,
+ clif_displaymessage(fd,
"Guru Meditation Error: getpeername() failed");
return -1;
}
@@ -8594,43 +6567,43 @@ int atcommand_ipcheck (const int fd, struct map_session_data *sd,
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
- if (getpeername (pl_sd->fd, (struct sockaddr *)&sai, &sa_len))
+ if (getpeername(pl_sd->fd, (struct sockaddr *)&sai, &sa_len))
continue;
// Is checking GM levels really needed here?
if (ip == sai.sin_addr.s_addr)
{
- snprintf (output, sizeof(output),
- "Name: %s | Location: %s %d %d",
- pl_sd->status.name, pl_sd->mapname,
- pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage (fd, output);
+ std::string output = STRPRINTF(
+ "Name: %s | Location: %s %d %d",
+ pl_sd->status.name, pl_sd->mapname,
+ pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
}
}
}
- clif_displaymessage (fd, "End of list");
+ clif_displaymessage(fd, "End of list");
return 0;
}
int atcommand_doomspot(const int fd, struct map_session_data *sd,
- const char *command, const char *message)
+ const char *, const char *)
{
struct map_session_data *pl_sd;
- int i;
+ int i;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth && i != fd && sd->bl.m == pl_sd->bl.m
&& sd->bl.x == pl_sd->bl.x && sd->bl.y == pl_sd->bl.y
- && pc_isGM (sd) >= pc_isGM (pl_sd))
+ && pc_isGM(sd) >= pc_isGM(pl_sd))
{ // you can doom only lower or same gm level
- pc_damage (NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage (pl_sd->fd, "The holy messenger has given judgement.");
+ pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
+ clif_displaymessage(pl_sd->fd, "The holy messenger has given judgement.");
}
}
- clif_displaymessage (fd, "Judgement was made.");
+ clif_displaymessage(fd, "Judgement was made.");
return 0;
}
diff --git a/src/map/atcommand.hpp b/src/map/atcommand.hpp
index d35cb4f..a226b76 100644
--- a/src/map/atcommand.hpp
+++ b/src/map/atcommand.hpp
@@ -1,225 +1,16 @@
-// $Id: atcommand.h 148 2004-09-30 14:05:37Z MouseJstr $
#ifndef ATCOMMAND_HPP
#define ATCOMMAND_HPP
-#include "map.hpp"
+#include "../common/const_array.hpp"
-enum AtCommandType
-{
- AtCommand_None = -1,
- AtCommand_Broadcast = 0,
- AtCommand_Setup,
- AtCommand_LocalBroadcast,
- AtCommand_MapMove,
- AtCommand_ResetState,
- AtCommand_CharWarp,
- AtCommand_Warp,
- AtCommand_Where,
- AtCommand_Goto,
- AtCommand_Jump,
- AtCommand_Who,
- AtCommand_WhoGroup,
- AtCommand_WhoMap,
- AtCommand_WhoMapGroup,
- AtCommand_WhoGM,
- AtCommand_Save,
- AtCommand_Load,
- AtCommand_Speed,
- AtCommand_Storage,
- AtCommand_GuildStorage,
- AtCommand_Option,
- AtCommand_Hide,
- AtCommand_Die,
- AtCommand_Kill,
- AtCommand_Alive,
- AtCommand_Kami,
- AtCommand_KamiB,
- AtCommand_Heal,
- AtCommand_Item,
- AtCommand_ItemReset,
- AtCommand_ItemCheck,
- AtCommand_BaseLevelUp,
- AtCommand_JobLevelUp,
- AtCommand_Help,
- AtCommand_GM,
- AtCommand_PvPOff,
- AtCommand_PvPOn,
- AtCommand_GvGOff,
- AtCommand_GvGOn,
- AtCommand_Model,
- AtCommand_Go,
- AtCommand_Spawn,
- AtCommand_Monster,
- AtCommand_KillMonster,
- AtCommand_KillMonster2,
- AtCommand_Produce,
- AtCommand_Memo,
- AtCommand_GAT,
- AtCommand_Packet,
- AtCommand_StatusPoint,
- AtCommand_SkillPoint,
- AtCommand_Zeny,
- AtCommand_Param,
- AtCommand_Strength,
- AtCommand_Agility,
- AtCommand_Vitality,
- AtCommand_Intelligence,
- AtCommand_Dexterity,
- AtCommand_Luck,
- AtCommand_GuildLevelUp,
- AtCommand_Recall,
- AtCommand_Revive,
- AtCommand_CharacterStats,
- AtCommand_CharacterStatsAll,
- AtCommand_CharacterOption,
- AtCommand_CharacterSave,
- AtCommand_CharacterLoad,
- AtCommand_Night,
- AtCommand_Day,
- AtCommand_Doom,
- AtCommand_DoomMap,
- AtCommand_Raise,
- AtCommand_RaiseMap,
- AtCommand_CharacterBaseLevel,
- AtCommand_CharacterJobLevel,
- AtCommand_Kick,
- AtCommand_KickAll,
- AtCommand_AllSkills,
- AtCommand_QuestSkill,
- AtCommand_CharQuestSkill,
- AtCommand_LostSkill,
- AtCommand_CharLostSkill,
- AtCommand_Party,
- AtCommand_Guild,
- AtCommand_AgitStart,
- AtCommand_AgitEnd,
- AtCommand_MapExit,
- AtCommand_IDSearch,
- AtCommand_CharSkReset,
- AtCommand_CharStReset,
- AtCommand_CharReset,
- //by chbrules
- AtCommand_CharModel,
- AtCommand_CharSKPoint,
- AtCommand_CharSTPoint,
- AtCommand_CharZeny,
- AtCommand_RecallAll,
- AtCommand_ReloadItemDB,
- AtCommand_ReloadMobDB,
- AtCommand_ReloadSkillDB,
- AtCommand_ReloadScript,
- AtCommand_ReloadGMDB,
- AtCommand_MapInfo,
- AtCommand_Dye,
- AtCommand_HairStyle,
- AtCommand_HairColor,
- AtCommand_AllStats,
- AtCommand_CharChangeSex, // by Yor
- AtCommand_CharBlock, // by Yor
- AtCommand_CharBan, // by Yor
- AtCommand_CharUnBlock, // by Yor
- AtCommand_CharUnBan, // by Yor
- AtCommand_MountPeco, // by Valaris
- AtCommand_CharMountPeco, // by Yor
- AtCommand_GuildSpy, // [Syrus22]
- AtCommand_PartySpy, // [Syrus22]
- AtCommand_GuildRecall, // by Yor
- AtCommand_PartyRecall, // by Yor
- AtCommand_Enablenpc,
- AtCommand_Disablenpc,
- AtCommand_ServerTime, // by Yor
- AtCommand_CharDelItem, // by Yor
- AtCommand_Jail, // by Yor
- AtCommand_UnJail, // by Yor
- AtCommand_Disguise, // [Valaris]
- AtCommand_UnDisguise, // by Yor
- AtCommand_IgnoreList, // by Yor
- AtCommand_CharIgnoreList, // by Yor
- AtCommand_InAll, // by Yor
- AtCommand_ExAll, // by Yor
- AtCommand_CharDisguise, // Kalaspuff
- AtCommand_CharUnDisguise, // Kalaspuff
- AtCommand_EMail, // by Yor
- AtCommand_Hatch,
- AtCommand_Effect, // by Apple
- AtCommand_Char_Item_List, // by Yor
- AtCommand_Char_Storage_List, // by Yor
- AtCommand_Char_Cart_List, // by Yor
- AtCommand_AddWarp, // by MouseJstr
- AtCommand_Follow, // by MouseJstr
- AtCommand_SkillOn, // by MouseJstr
- AtCommand_SkillOff, // by MouseJstr
- AtCommand_Killer, // by MouseJstr
- AtCommand_NpcMove, // by MouseJstr
- AtCommand_Killable, // by MouseJstr
- AtCommand_CharKillable, // by MouseJstr
- AtCommand_Chareffect, // by MouseJstr
- AtCommand_Chardye, // by MouseJstr
- AtCommand_Charhairstyle, // by MouseJstr
- AtCommand_Charhaircolor, // by MouseJstr
- AtCommand_Dropall, // by MouseJstr
- AtCommand_Chardropall, // by MouseJstr
- AtCommand_Storeall, // by MouseJstr
- AtCommand_Charstoreall, // by MouseJstr
- AtCommand_Skillid, // by MouseJstr
- AtCommand_Useskill, // by MouseJstr
- AtCommand_Summon,
- AtCommand_Rain,
- AtCommand_Snow,
- AtCommand_Sakura,
- AtCommand_Fog,
- AtCommand_Leaves,
- AtCommand_AdjGmLvl,
- AtCommand_AdjCmdLvl,
- AtCommand_Trade,
- AtCommand_UnMute,
- AtCommand_CharWipe,
- AtCommand_SetMagic,
- AtCommand_MagicInfo,
- AtCommand_Log,
- AtCommand_Tee,
- AtCommand_Invisible,
- AtCommand_Visible,
- AtCommand_IterateForward,
- AtCommand_IterateBackward,
- AtCommand_Wgm,
- AtCommand_IpCheck,
- AtCommand_ListNearby, // [fate]
- AtCommand_DoomSpot,
- // end
- AtCommand_Unknown,
- AtCommand_MAX
-};
+bool is_atcommand(const int fd, struct map_session_data *sd,
+ const char *message, int gmlvl);
-typedef enum AtCommandType AtCommandType;
+int atcommand_config_read(const char *cfgName);
-typedef struct AtCommandInfo
-{
- AtCommandType type;
- const char *command;
- int level;
- int (*proc) (const int, struct map_session_data *,
- const char *command, const char *message);
-} AtCommandInfo;
+void log_atcommand(struct map_session_data *sd, const_string cmd);
-AtCommandType is_atcommand (const int fd, struct map_session_data *sd,
- const char *message, int gmlvl);
+// only used by map.cpp
+extern char *gm_logfile_name;
-AtCommandType atcommand (const int level, const char *message,
- AtCommandInfo * info);
-int get_atcommand_level (const AtCommandType type);
-
-int atcommand_item (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Valaris]
-int atcommand_warp (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Yor]
-int atcommand_spawn (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Valaris]
-int atcommand_goto (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Yor]
-int atcommand_recall (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Yor]
-
-int atcommand_config_read (const char *cfgName);
-
-__attribute__((format(printf, 2, 3)))
-void log_atcommand (struct map_session_data *sd, const char *fmt, ...);
-__attribute__((format(printf, 1, 2)))
-void gm_log (const char *fmt, ...);
-
-#endif
+#endif // ATCOMMAND_HPP
diff --git a/src/map/battle.cpp b/src/map/battle.cpp
index a636af4..97edeb3 100644
--- a/src/map/battle.cpp
+++ b/src/map/battle.cpp
@@ -1,60 +1,39 @@
-// $Id: battle.c,v 1.10 2004/09/29 21:08:17 Akitasha Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
#include "battle.hpp"
-#include "../common/timer.hpp"
+#include <cstring>
+
+#include <fstream>
+
+#include "../common/cxxstdio.hpp"
+#include "../common/random.hpp"
#include "../common/nullpo.hpp"
#include "clif.hpp"
-#include "guild.hpp"
#include "itemdb.hpp"
#include "map.hpp"
#include "mob.hpp"
#include "pc.hpp"
#include "skill.hpp"
-#include "../common/socket.hpp"
-#include "../common/mt_rand.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
-
-int attr_fix_table[4][10][10];
+#include "../poison.hpp"
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以上
*------------------------------------------
*/
-int battle_counttargeted (struct block_list *bl, struct block_list *src,
- int target_lv)
+static
+int battle_counttargeted(struct block_list *bl, struct block_list *src,
+ ATK target_lv)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_PC)
- return pc_counttargeted ((struct map_session_data *) bl, src,
+ nullpo_ret(bl);
+ if (bl->type == BL::PC)
+ return pc_counttargeted((struct map_session_data *) bl, src,
target_lv);
- else if (bl->type == BL_MOB)
- return mob_counttargeted ((struct mob_data *) bl, src, target_lv);
+ else if (bl->type == BL::MOB)
+ return mob_counttargeted((struct mob_data *) bl, src, target_lv);
return 0;
}
@@ -63,13 +42,13 @@ int battle_counttargeted (struct block_list *bl, struct block_list *src,
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_class (struct block_list *bl)
+int battle_get_class(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
return ((struct mob_data *) bl)->mob_class;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- return ((struct map_session_data *) bl)->status.pc_class;
+ else if (bl->type == BL::PC)
+ return 0;
else
return 0;
}
@@ -79,15 +58,15 @@ int battle_get_class (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_dir (struct block_list *bl)
+DIR battle_get_dir(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_retr(DIR::S, bl);
+ if (bl->type == BL::MOB)
return ((struct mob_data *) bl)->dir;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->dir;
else
- return 0;
+ return DIR::S;
}
/*==========================================
@@ -95,12 +74,12 @@ int battle_get_dir (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_lv (struct block_list *bl)
+int battle_get_lv(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- return ((struct mob_data *) bl)->stats[MOB_LV];
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
+ return ((struct mob_data *) bl)->stats[mob_stat::LV];
+ else if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->status.base_level;
else
return 0;
@@ -111,12 +90,12 @@ int battle_get_lv (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_range (struct block_list *bl)
+int battle_get_range(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
return mob_db[((struct mob_data *) bl)->mob_class].range;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->attackrange;
else
return 0;
@@ -127,12 +106,12 @@ int battle_get_range (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_hp (struct block_list *bl)
+int battle_get_hp(struct block_list *bl)
{
- nullpo_retr (1, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_retr(1, bl);
+ if (bl->type == BL::MOB)
return ((struct mob_data *) bl)->hp;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->status.hp;
else
return 1;
@@ -143,42 +122,26 @@ int battle_get_hp (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_max_hp (struct block_list *bl)
+int battle_get_max_hp(struct block_list *bl)
{
- nullpo_retr (1, bl);
- if (bl->type == BL_PC && ((struct map_session_data *) bl))
+ nullpo_retr(1, bl);
+ if (bl->type == BL::PC && ((struct map_session_data *) bl))
return ((struct map_session_data *) bl)->status.max_hp;
else
{
- struct status_change *sc_data = battle_get_sc_data (bl);
- int max_hp = 1;
- if (bl->type == BL_MOB && ((struct mob_data *) bl))
+ int max_hp = 1;
+ if (bl->type == BL::MOB && ((struct mob_data *) bl))
{
- max_hp = ((struct mob_data *) bl)->stats[MOB_MAX_HP];
- if (mob_db[((struct mob_data *) bl)->mob_class].mexp > 0)
- {
- if (battle_config.mvp_hp_rate != 100)
- max_hp = (max_hp * battle_config.mvp_hp_rate) / 100;
- }
- else
+ max_hp = ((struct mob_data *) bl)->stats[mob_stat::MAX_HP];
{
if (battle_config.monster_hp_rate != 100)
max_hp = (max_hp * battle_config.monster_hp_rate) / 100;
}
}
- if (sc_data)
- {
- if (sc_data[SC_APPLEIDUN].timer != -1)
- max_hp +=
- ((5 + sc_data[SC_APPLEIDUN].val1 * 2 +
- ((sc_data[SC_APPLEIDUN].val2 + 1) >> 1) +
- sc_data[SC_APPLEIDUN].val3 / 10) * max_hp) / 100;
- }
if (max_hp < 1)
max_hp = 1;
return max_hp;
}
- return 1;
}
/*==========================================
@@ -186,35 +149,18 @@ int battle_get_max_hp (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_str (struct block_list *bl)
+int battle_get_str(struct block_list *bl)
{
- int str = 0;
- struct status_change *sc_data;
+ int str = 0;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_MOB && ((struct mob_data *) bl))
- str = ((struct mob_data *) bl)->stats[MOB_STR];
- else if (bl->type == BL_PC && ((struct map_session_data *) bl))
- return ((struct map_session_data *) bl)->paramc[0];
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::MOB && ((struct mob_data *) bl))
+ str = ((struct mob_data *) bl)->stats[mob_stat::STR];
+ else if (bl->type == BL::PC && ((struct map_session_data *) bl))
+ return ((struct map_session_data *) bl)->paramc[ATTR::STR];
- if (sc_data)
- {
- if (sc_data[SC_LOUD].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1
- && bl->type != BL_PC)
- str += 4;
- if (sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC)
- { // ブレッシング
- int race = battle_get_race (bl);
- if (battle_check_undead (race, battle_get_elem_type (bl))
- || race == 6)
- str >>= 1; // 悪 魔/不死
- else
- str += sc_data[SC_BLESSING].val1; // その他
- }
- if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト
- str += 5;
- }
if (str < 0)
str = 0;
return str;
@@ -226,35 +172,18 @@ int battle_get_str (struct block_list *bl)
*------------------------------------------
*/
-int battle_get_agi (struct block_list *bl)
+int battle_get_agi(struct block_list *bl)
{
- int agi = 0;
- struct status_change *sc_data;
-
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- agi = ((struct mob_data *) bl)->stats[MOB_AGI];
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- agi = ((struct map_session_data *) bl)->paramc[1];
-
- if (sc_data)
- {
- if (sc_data[SC_INCREASEAGI].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1 && bl->type != BL_PC) // 速度増加(PCはpc.cで)
- agi += 2 + sc_data[SC_INCREASEAGI].val1;
-
- if (sc_data[SC_CONCENTRATE].timer != -1
- && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
- agi += agi * (2 + sc_data[SC_CONCENTRATE].val1) / 100;
+ int agi = 0;
+ eptr<struct status_change, StatusChange> sc_data;
- if (sc_data[SC_DECREASEAGI].timer != -1) // 速度減少
- agi -= 2 + sc_data[SC_DECREASEAGI].val1;
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::MOB)
+ agi = ((struct mob_data *) bl)->stats[mob_stat::AGI];
+ else if (bl->type == BL::PC)
+ agi = ((struct map_session_data *) bl)->paramc[ATTR::AGI];
- if (sc_data[SC_QUAGMIRE].timer != -1) // クァグマイア
- agi >>= 1;
- if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト
- agi += 5;
- }
if (agi < 0)
agi = 0;
return agi;
@@ -265,24 +194,17 @@ int battle_get_agi (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_vit (struct block_list *bl)
+int battle_get_vit(struct block_list *bl)
{
- int vit = 0;
- struct status_change *sc_data;
-
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- vit = ((struct mob_data *) bl)->stats[MOB_VIT];
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- vit = ((struct map_session_data *) bl)->paramc[2];
- if (sc_data)
- {
- if (sc_data[SC_STRIPARMOR].timer != -1 && bl->type != BL_PC)
- vit = vit * 60 / 100;
- if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト
- vit += 5;
- }
+ int vit = 0;
+ eptr<struct status_change, StatusChange> sc_data;
+
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::MOB)
+ vit = ((struct mob_data *) bl)->stats[mob_stat::VIT];
+ else if (bl->type == BL::PC)
+ vit = ((struct map_session_data *) bl)->paramc[ATTR::VIT];
if (vit < 0)
vit = 0;
@@ -294,34 +216,18 @@ int battle_get_vit (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_int (struct block_list *bl)
+int battle_get_int(struct block_list *bl)
{
- int int_ = 0;
- struct status_change *sc_data;
+ int int_ = 0;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- int_ = ((struct mob_data *) bl)->stats[MOB_INT];
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- int_ = ((struct map_session_data *) bl)->paramc[3];
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::MOB)
+ int_ = ((struct mob_data *) bl)->stats[mob_stat::INT];
+ else if (bl->type == BL::PC)
+ int_ = ((struct map_session_data *) bl)->paramc[ATTR::INT];
- if (sc_data)
- {
- if (sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC)
- { // ブレッシング
- int race = battle_get_race (bl);
- if (battle_check_undead (race, battle_get_elem_type (bl))
- || race == 6)
- int_ >>= 1; // 悪 魔/不死
- else
- int_ += sc_data[SC_BLESSING].val1; // その他
- }
- if (sc_data[SC_STRIPHELM].timer != -1 && bl->type != BL_PC)
- int_ = int_ * 60 / 100;
- if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト
- int_ += 5;
- }
if (int_ < 0)
int_ = 0;
return int_;
@@ -332,39 +238,18 @@ int battle_get_int (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_dex (struct block_list *bl)
+int battle_get_dex(struct block_list *bl)
{
- int dex = 0;
- struct status_change *sc_data;
+ int dex = 0;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- dex = ((struct mob_data *) bl)->stats[MOB_DEX];
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- dex = ((struct map_session_data *) bl)->paramc[4];
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::MOB)
+ dex = ((struct mob_data *) bl)->stats[mob_stat::DEX];
+ else if (bl->type == BL::PC)
+ dex = ((struct map_session_data *) bl)->paramc[ATTR::DEX];
- if (sc_data)
- {
- if (sc_data[SC_CONCENTRATE].timer != -1
- && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
- dex += dex * (2 + sc_data[SC_CONCENTRATE].val1) / 100;
-
- if (sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC)
- { // ブレッシング
- int race = battle_get_race (bl);
- if (battle_check_undead (race, battle_get_elem_type (bl))
- || race == 6)
- dex >>= 1; // 悪 魔/不死
- else
- dex += sc_data[SC_BLESSING].val1; // その他
- }
-
- if (sc_data[SC_QUAGMIRE].timer != -1) // クァグマイア
- dex >>= 1;
- if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト
- dex += 5;
- }
if (dex < 0)
dex = 0;
return dex;
@@ -375,27 +260,18 @@ int battle_get_dex (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_luk (struct block_list *bl)
+int battle_get_luk(struct block_list *bl)
{
- int luk = 0;
- struct status_change *sc_data;
+ int luk = 0;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- luk = ((struct mob_data *) bl)->stats[MOB_LUK];
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- luk = ((struct map_session_data *) bl)->paramc[5];
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::MOB)
+ luk = ((struct mob_data *) bl)->stats[mob_stat::LUK];
+ else if (bl->type == BL::PC)
+ luk = ((struct map_session_data *) bl)->paramc[ATTR::LUK];
- if (sc_data)
- {
- if (sc_data[SC_GLORIA].timer != -1 && bl->type != BL_PC) // グロリア(PCはpc.cで)
- luk += 30;
- if (sc_data[SC_CURSE].timer != -1) // 呪い
- luk = 0;
- if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト
- luk += 5;
- }
if (luk < 0)
luk = 0;
return luk;
@@ -406,34 +282,24 @@ int battle_get_luk (struct block_list *bl)
* 戻りは整数で1以上
*------------------------------------------
*/
-int battle_get_flee (struct block_list *bl)
+static
+int battle_get_flee(struct block_list *bl)
{
- int flee = 1;
- struct status_change *sc_data;
+ int flee = 1;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (1, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_retr(1, bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::PC)
flee = ((struct map_session_data *) bl)->flee;
else
- flee = battle_get_agi (bl) + battle_get_lv (bl);
+ flee = battle_get_agi(bl) + battle_get_lv(bl);
if (sc_data)
{
- if (sc_data[SC_WHISTLE].timer != -1 && bl->type != BL_PC)
- flee +=
- flee * (sc_data[SC_WHISTLE].val1 + sc_data[SC_WHISTLE].val2 +
- (sc_data[SC_WHISTLE].val3 >> 16)) / 100;
- if (sc_data[SC_BLIND].timer != -1 && bl->type != BL_PC)
- flee -= flee * 25 / 100;
- if (sc_data[SC_WINDWALK].timer != -1 && bl->type != BL_PC) // ウィンドウォーク
- flee += flee * (sc_data[SC_WINDWALK].val2) / 100;
- if (sc_data[SC_SPIDERWEB].timer != -1 && bl->type != BL_PC) //スパイダーウェブ
- flee -= flee * 50 / 100;
-
- if (battle_is_unarmed (bl))
- flee += (skill_power_bl (bl, TMW_BRAWLING) >> 3); // +25 for 200
- flee += skill_power_bl (bl, TMW_SPEED) >> 3;
+ if (battle_is_unarmed(bl))
+ flee += (skill_power_bl(bl, SkillID::TMW_BRAWLING) >> 3); // +25 for 200
+ flee += skill_power_bl(bl, SkillID::TMW_SPEED) >> 3;
}
if (flee < 1)
flee = 1;
@@ -445,34 +311,23 @@ int battle_get_flee (struct block_list *bl)
* 戻りは整数で1以上
*------------------------------------------
*/
-int battle_get_hit (struct block_list *bl)
+static
+int battle_get_hit(struct block_list *bl)
{
- int hit = 1;
- struct status_change *sc_data;
+ int hit = 1;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (1, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_retr(1, bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::PC)
hit = ((struct map_session_data *) bl)->hit;
else
- hit = battle_get_dex (bl) + battle_get_lv (bl);
+ hit = battle_get_dex(bl) + battle_get_lv(bl);
if (sc_data)
{
- if (sc_data[SC_HUMMING].timer != -1 && bl->type != BL_PC) //
- hit +=
- hit * (sc_data[SC_HUMMING].val1 * 2 +
- sc_data[SC_HUMMING].val2 +
- sc_data[SC_HUMMING].val3) / 100;
- if (sc_data[SC_BLIND].timer != -1 && bl->type != BL_PC) // 呪い
- hit -= hit * 25 / 100;
- if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト
- hit += 3 * (sc_data[SC_TRUESIGHT].val1);
- if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) //コンセントレーション
- hit += (hit * (10 * (sc_data[SC_CONCENTRATION].val1))) / 100;
-
- if (battle_is_unarmed (bl))
- hit += (skill_power_bl (bl, TMW_BRAWLING) >> 4); // +12 for 200
+ if (battle_is_unarmed(bl))
+ hit += (skill_power_bl(bl, SkillID::TMW_BRAWLING) >> 4); // +12 for 200
}
if (hit < 1)
hit = 1;
@@ -484,32 +339,28 @@ int battle_get_hit (struct block_list *bl)
* 戻りは整数で1以上
*------------------------------------------
*/
-int battle_get_flee2 (struct block_list *bl)
+static
+int battle_get_flee2(struct block_list *bl)
{
- int flee2 = 1;
- struct status_change *sc_data;
+ int flee2 = 1;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (1, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_retr(1, bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::PC)
{
- flee2 = battle_get_luk (bl) + 10;
+ flee2 = battle_get_luk(bl) + 10;
flee2 +=
((struct map_session_data *) bl)->flee2 -
- (((struct map_session_data *) bl)->paramc[5] + 10);
+ (((struct map_session_data *) bl)->paramc[ATTR::LUK] + 10);
}
else
- flee2 = battle_get_luk (bl) + 1;
+ flee2 = battle_get_luk(bl) + 1;
- if (sc_data)
{
- if (sc_data[SC_WHISTLE].timer != -1 && bl->type != BL_PC)
- flee2 += (sc_data[SC_WHISTLE].val1 + sc_data[SC_WHISTLE].val2
- + (sc_data[SC_WHISTLE].val3 & 0xffff)) * 10;
-
- if (battle_is_unarmed (bl))
- flee2 += (skill_power_bl (bl, TMW_BRAWLING) >> 3); // +25 for 200
- flee2 += skill_power_bl (bl, TMW_SPEED) >> 3;
+ if (battle_is_unarmed(bl))
+ flee2 += (skill_power_bl(bl, SkillID::TMW_BRAWLING) >> 3); // +25 for 200
+ flee2 += skill_power_bl(bl, SkillID::TMW_SPEED) >> 3;
}
if (flee2 < 1)
flee2 = 1;
@@ -522,34 +373,23 @@ int battle_get_flee2 (struct block_list *bl)
*------------------------------------------
*/
static
-int battle_get_critical (struct block_list *bl)
+int battle_get_critical(struct block_list *bl)
{
- int critical = 1;
- struct status_change *sc_data;
+ int critical = 1;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (1, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_retr(1, bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::PC)
{
- critical = battle_get_luk (bl) * 2 + 10;
+ critical = battle_get_luk(bl) * 2 + 10;
critical +=
((struct map_session_data *) bl)->critical -
- ((((struct map_session_data *) bl)->paramc[5] * 3) + 10);
+ ((((struct map_session_data *) bl)->paramc[ATTR::LUK] * 3) + 10);
}
else
- critical = battle_get_luk (bl) * 3 + 1;
+ critical = battle_get_luk(bl) * 3 + 1;
- if (sc_data)
- {
- if (sc_data[SC_FORTUNE].timer != -1 && bl->type != BL_PC)
- critical +=
- (10 + sc_data[SC_FORTUNE].val1 + sc_data[SC_FORTUNE].val2 +
- sc_data[SC_FORTUNE].val3) * 10;
- if (sc_data[SC_EXPLOSIONSPIRITS].timer != -1 && bl->type != BL_PC)
- critical += sc_data[SC_EXPLOSIONSPIRITS].val2;
- if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) //トゥルーサイト
- critical += critical * sc_data[SC_TRUESIGHT].val1 / 100;
- }
if (critical < 1)
critical = 1;
return critical;
@@ -560,31 +400,23 @@ int battle_get_critical (struct block_list *bl)
* 戻りは整数で1以上
*------------------------------------------
*/
-int battle_get_baseatk (struct block_list *bl)
+static
+int battle_get_baseatk(struct block_list *bl)
{
- struct status_change *sc_data;
- int batk = 1;
+ eptr<struct status_change, StatusChange> sc_data;
+ int batk = 1;
- nullpo_retr (1, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_retr(1, bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::PC)
batk = ((struct map_session_data *) bl)->base_atk; //設定されているbase_atk
else
{ //それ以外なら
- int str, dstr;
- str = battle_get_str (bl); //STR
+ int str, dstr;
+ str = battle_get_str(bl); //STR
dstr = str / 10;
batk = dstr * dstr + str; //base_atkを計算する
}
- if (sc_data)
- { //状態異常あり
- if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC) //PCでプロボック(SM_PROVOKE)状態
- batk = batk * (100 + 2 * sc_data[SC_PROVOKE].val1) / 100; //base_atk増加
- if (sc_data[SC_CURSE].timer != -1) //呪われていたら
- batk -= batk * 25 / 100; //base_atkが25%減少
- if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) //コンセントレーション
- batk += batk * (5 * sc_data[SC_CONCENTRATION].val1) / 100;
- }
if (batk < 1)
batk = 1; //base_atkは最低でも1
return batk;
@@ -595,27 +427,19 @@ int battle_get_baseatk (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_atk (struct block_list *bl)
+static
+int battle_get_atk(struct block_list *bl)
{
- struct status_change *sc_data;
- int atk = 0;
+ eptr<struct status_change, StatusChange> sc_data;
+ int atk = 0;
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::PC)
atk = ((struct map_session_data *) bl)->watk;
- else if (bl->type == BL_MOB && (struct mob_data *) bl)
- atk = ((struct mob_data *) bl)->stats[MOB_ATK1];
+ else if (bl->type == BL::MOB)
+ atk = ((struct mob_data *) bl)->stats[mob_stat::ATK1];
- if (sc_data)
- {
- if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC)
- atk = atk * (100 + 2 * sc_data[SC_PROVOKE].val1) / 100;
- if (sc_data[SC_CURSE].timer != -1)
- atk -= atk * 25 / 100;
- if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) //コンセントレーション
- atk += atk * (5 * sc_data[SC_CONCENTRATION].val1) / 100;
- }
if (atk < 0)
atk = 0;
return atk;
@@ -627,17 +451,11 @@ int battle_get_atk (struct block_list *bl)
*------------------------------------------
*/
static
-int battle_get_atk_ (struct block_list *bl)
+int battle_get_atk_(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
- {
- int atk = ((struct map_session_data *) bl)->watk_;
-
- if (((struct map_session_data *) bl)->sc_data[SC_CURSE].timer != -1)
- atk -= atk * 25 / 100;
- return atk;
- }
+ nullpo_ret(bl);
+ if (bl->type == BL::PC)
+ return ((struct map_session_data *) bl)->watk_;
else
return 0;
}
@@ -647,41 +465,22 @@ int battle_get_atk_ (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_atk2 (struct block_list *bl)
+static
+int battle_get_atk2(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_ret(bl);
+ if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->watk2;
else
{
- struct status_change *sc_data = battle_get_sc_data (bl);
- int atk2 = 0;
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- atk2 = ((struct mob_data *) bl)->stats[MOB_ATK2];
- if (sc_data)
- {
- if (sc_data[SC_IMPOSITIO].timer != -1)
- atk2 += sc_data[SC_IMPOSITIO].val1 * 5;
- if (sc_data[SC_PROVOKE].timer != -1)
- atk2 = atk2 * (100 + 2 * sc_data[SC_PROVOKE].val1) / 100;
- if (sc_data[SC_CURSE].timer != -1)
- atk2 -= atk2 * 25 / 100;
- if (sc_data[SC_DRUMBATTLE].timer != -1)
- atk2 += sc_data[SC_DRUMBATTLE].val2;
- if (sc_data[SC_NIBELUNGEN].timer != -1
- && (battle_get_element (bl) / 10) >= 8)
- atk2 += sc_data[SC_NIBELUNGEN].val2;
- if (sc_data[SC_STRIPWEAPON].timer != -1)
- atk2 = atk2 * 90 / 100;
- if (sc_data[SC_CONCENTRATION].timer != -1) //コンセントレーション
- atk2 += atk2 * (5 * sc_data[SC_CONCENTRATION].val1) / 100;
- }
+ int atk2 = 0;
+ if (bl->type == BL::MOB)
+ atk2 = ((struct mob_data *) bl)->stats[mob_stat::ATK2];
if (atk2 < 0)
atk2 = 0;
return atk2;
}
- return 0;
}
/*==========================================
@@ -690,10 +489,10 @@ int battle_get_atk2 (struct block_list *bl)
*------------------------------------------
*/
static
-int battle_get_atk_2 (struct block_list *bl)
+int battle_get_atk_2(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_PC)
+ nullpo_ret(bl);
+ if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->watk_2;
else
return 0;
@@ -705,22 +504,19 @@ int battle_get_atk_2 (struct block_list *bl)
*------------------------------------------
*/
static
-int battle_get_matk1 (struct block_list *bl)
+int battle_get_matk1(struct block_list *bl)
{
- struct status_change *sc_data;
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_MOB)
+ eptr<struct status_change, StatusChange> sc_data;
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::MOB)
{
- int matk, int_ = battle_get_int (bl);
+ int matk, int_ = battle_get_int(bl);
matk = int_ + (int_ / 5) * (int_ / 5);
- if (sc_data)
- if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC)
- matk = matk * (100 + 2 * sc_data[SC_MINDBREAKER].val1) / 100;
return matk;
}
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->matk1;
else
return 0;
@@ -732,21 +528,17 @@ int battle_get_matk1 (struct block_list *bl)
*------------------------------------------
*/
static
-int battle_get_matk2 (struct block_list *bl)
+int battle_get_matk2(struct block_list *bl)
{
- struct status_change *sc_data = battle_get_sc_data (bl);
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB)
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
{
- int matk, int_ = battle_get_int (bl);
+ int matk, int_ = battle_get_int(bl);
matk = int_ + (int_ / 7) * (int_ / 7);
- if (sc_data)
- if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC)
- matk = matk * (100 + 2 * sc_data[SC_MINDBREAKER].val1) / 100;
return matk;
}
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->matk2;
else
return 0;
@@ -757,67 +549,30 @@ int battle_get_matk2 (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_def (struct block_list *bl)
+int battle_get_def(struct block_list *bl)
{
- struct status_change *sc_data;
- int def = 0, skilltimer = -1, skillid = 0;
+ eptr<struct status_change, StatusChange> sc_data;
+ int def = 0;
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::PC)
{
def = ((struct map_session_data *) bl)->def;
- skilltimer = ((struct map_session_data *) bl)->skilltimer;
- skillid = ((struct map_session_data *) bl)->skillid;
}
- else if (bl->type == BL_MOB && (struct mob_data *) bl)
+ else if (bl->type == BL::MOB)
{
- def = ((struct mob_data *) bl)->stats[MOB_DEF];
- skilltimer = ((struct mob_data *) bl)->skilltimer;
- skillid = ((struct mob_data *) bl)->skillid;
+ def = ((struct mob_data *) bl)->stats[mob_stat::DEF];
}
if (def < 1000000)
{
if (sc_data)
{
- //キーピング時はDEF100
- if (sc_data[SC_KEEPING].timer != -1)
- def = 100;
- //プロボック時は減算
- if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC)
- def = (def * (100 - 6 * sc_data[SC_PROVOKE].val1) + 50) / 100;
- //戦太鼓の響き時は加算
- if (sc_data[SC_DRUMBATTLE].timer != -1 && bl->type != BL_PC)
- def += sc_data[SC_DRUMBATTLE].val3;
//毒にかかっている時は減算
- if (sc_data[SC_POISON].timer != -1 && bl->type != BL_PC)
+ if (sc_data[StatusChange::SC_POISON].timer
+ && bl->type != BL::PC)
def = def * 75 / 100;
- //ストリップシールド時は減算
- if (sc_data[SC_STRIPSHIELD].timer != -1 && bl->type != BL_PC)
- def = def * 85 / 100;
- //シグナムクルシス時は減算
- if (sc_data[SC_SIGNUMCRUCIS].timer != -1 && bl->type != BL_PC)
- def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2) / 100;
- //永遠の混沌時はDEF0になる
- if (sc_data[SC_ETERNALCHAOS].timer != -1 && bl->type != BL_PC)
- def = 0;
- //凍結、石化時は右シフト
- if (sc_data[SC_FREEZE].timer != -1
- || (sc_data[SC_STONE].timer != -1
- && sc_data[SC_STONE].val2 == 0))
- def >>= 1;
- //コンセントレーション時は減算
- if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC)
- def =
- (def * (100 - 5 * sc_data[SC_CONCENTRATION].val1)) / 100;
- }
- //詠唱中は詠唱時減算率に基づいて減算
- if (skilltimer != -1)
- {
- int def_rate = skill_get_castdef (skillid);
- if (def_rate != 0)
- def = (def * (100 - def_rate)) / 100;
}
}
if (def < 0)
@@ -830,38 +585,29 @@ int battle_get_def (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_mdef (struct block_list *bl)
+int battle_get_mdef(struct block_list *bl)
{
- struct status_change *sc_data;
- int mdef = 0;
+ eptr<struct status_change, StatusChange> sc_data;
+ int mdef = 0;
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::PC)
mdef = ((struct map_session_data *) bl)->mdef;
- else if (bl->type == BL_MOB && (struct mob_data *) bl)
- mdef = ((struct mob_data *) bl)->stats[MOB_MDEF];
+ else if (bl->type == BL::MOB)
+ mdef = ((struct mob_data *) bl)->stats[mob_stat::MDEF];
if (mdef < 1000000)
{
if (sc_data)
{
//バリアー状態時はMDEF100
- if (mdef < 90 && sc_data[SC_MBARRIER].timer != -1)
+ if (mdef < 90 && sc_data[StatusChange::SC_MBARRIER].timer)
{
- mdef += sc_data[SC_MBARRIER].val1;
+ mdef += sc_data[StatusChange::SC_MBARRIER].val1;
if (mdef > 90)
mdef = 90;
}
- if (sc_data[SC_BARRIER].timer != -1)
- mdef = 100;
- //凍結、石化時は1.25倍
- if (sc_data[SC_FREEZE].timer != -1
- || (sc_data[SC_STONE].timer != -1
- && sc_data[SC_STONE].val2 == 0))
- mdef = mdef * 125 / 100;
- if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC)
- mdef -= (mdef * 6 * sc_data[SC_MINDBREAKER].val1) / 100;
}
}
if (mdef < 0)
@@ -874,29 +620,23 @@ int battle_get_mdef (struct block_list *bl)
* 戻りは整数で1以上
*------------------------------------------
*/
-int battle_get_def2 (struct block_list *bl)
+int battle_get_def2(struct block_list *bl)
{
- struct status_change *sc_data;
- int def2 = 1;
+ eptr<struct status_change, StatusChange> sc_data;
+ int def2 = 1;
- nullpo_retr (1, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_PC)
+ nullpo_retr(1, bl);
+ sc_data = battle_get_sc_data(bl);
+ if (bl->type == BL::PC)
def2 = ((struct map_session_data *) bl)->def2;
- else if (bl->type == BL_MOB)
- def2 = ((struct mob_data *) bl)->stats[MOB_VIT];
+ else if (bl->type == BL::MOB)
+ def2 = ((struct mob_data *) bl)->stats[mob_stat::VIT];
if (sc_data)
{
- if (sc_data[SC_ANGELUS].timer != -1 && bl->type != BL_PC)
- def2 = def2 * (110 + 5 * sc_data[SC_ANGELUS].val1) / 100;
- if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC)
- def2 = (def2 * (100 - 6 * sc_data[SC_PROVOKE].val1) + 50) / 100;
- if (sc_data[SC_POISON].timer != -1 && bl->type != BL_PC)
+ if (sc_data[StatusChange::SC_POISON].timer
+ && bl->type != BL::PC)
def2 = def2 * 75 / 100;
- //コンセントレーション時は減算
- if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC)
- def2 = def2 * (100 - 5 * sc_data[SC_CONCENTRATION].val1) / 100;
}
if (def2 < 1)
def2 = 1;
@@ -908,25 +648,20 @@ int battle_get_def2 (struct block_list *bl)
* 戻りは整数で0以上
*------------------------------------------
*/
-int battle_get_mdef2 (struct block_list *bl)
+int battle_get_mdef2(struct block_list *bl)
{
- int mdef2 = 0;
- struct status_change *sc_data = battle_get_sc_data (bl);
+ int mdef2 = 0;
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB)
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
mdef2 =
- ((struct mob_data *) bl)->stats[MOB_INT] +
- (((struct mob_data *) bl)->stats[MOB_VIT] >> 1);
- else if (bl->type == BL_PC)
+ ((struct mob_data *) bl)->stats[mob_stat::INT] +
+ (((struct mob_data *) bl)->stats[mob_stat::VIT] >> 1);
+ else if (bl->type == BL::PC)
mdef2 =
((struct map_session_data *) bl)->mdef2 +
- (((struct map_session_data *) bl)->paramc[2] >> 1);
- if (sc_data)
- {
- if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC)
- mdef2 -= (mdef2 * 6 * sc_data[SC_MINDBREAKER].val1) / 100;
- }
+ (((struct map_session_data *) bl)->paramc[ATTR::VIT] >> 1);
+
if (mdef2 < 0)
mdef2 = 0;
return mdef2;
@@ -938,58 +673,19 @@ int battle_get_mdef2 (struct block_list *bl)
* Speedは小さいほうが移動速度が速い
*------------------------------------------
*/
-int battle_get_speed (struct block_list *bl)
+interval_t battle_get_speed(struct block_list *bl)
{
- nullpo_retr (1000, bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_retr(std::chrono::seconds(1), bl);
+ if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->speed;
else
{
- struct status_change *sc_data = battle_get_sc_data (bl);
- int speed = 1000;
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- speed = ((struct mob_data *) bl)->stats[MOB_SPEED];
+ interval_t speed = std::chrono::seconds(1);
+ if (bl->type == BL::MOB)
+ speed = static_cast<interval_t>(((struct mob_data *) bl)->stats[mob_stat::SPEED]);
- if (sc_data)
- {
- //速度増加時は25%減算
- if (sc_data[SC_INCREASEAGI].timer != -1
- && sc_data[SC_DONTFORGETME].timer == -1)
- speed -= speed * 25 / 100;
- //速度減少時は25%加算
- if (sc_data[SC_DECREASEAGI].timer != -1)
- speed = speed * 125 / 100;
- //クァグマイア時は50%加算
- if (sc_data[SC_QUAGMIRE].timer != -1)
- speed = speed * 3 / 2;
- //私を忘れないで…時は加算
- if (sc_data[SC_DONTFORGETME].timer != -1)
- speed =
- speed * (100 + sc_data[SC_DONTFORGETME].val1 * 2 +
- sc_data[SC_DONTFORGETME].val2 +
- (sc_data[SC_DONTFORGETME].val3 & 0xffff)) / 100;
- //金剛時は25%加算
- if (sc_data[SC_STEELBODY].timer != -1)
- speed = speed * 125 / 100;
- //ディフェンダー時は加算
- if (sc_data[SC_DEFENDER].timer != -1)
- speed = (speed * (155 - sc_data[SC_DEFENDER].val1 * 5)) / 100;
- //踊り状態は4倍遅い
- if (sc_data[SC_DANCING].timer != -1)
- speed *= 4;
- //呪い時は450加算
- if (sc_data[SC_CURSE].timer != -1)
- speed = speed + 450;
- //ウィンドウォーク時はLv*2%減算
- if (sc_data[SC_WINDWALK].timer != -1)
- speed -= (speed * (sc_data[SC_WINDWALK].val1 * 2)) / 100;
- }
- if (speed < 1)
- speed = 1;
- return speed;
+ return std::max(speed, std::chrono::milliseconds(1));
}
-
- return 1000;
}
/*==========================================
@@ -997,423 +693,213 @@ int battle_get_speed (struct block_list *bl)
* aDelayは小さいほうが攻撃速度が速い
*------------------------------------------
*/
-int battle_get_adelay (struct block_list *bl)
+// TODO figure out what all the doubling is about
+interval_t battle_get_adelay(struct block_list *bl)
{
- nullpo_retr (4000, bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
- return (((struct map_session_data *) bl)->aspd << 1);
+ nullpo_retr(std::chrono::seconds(4), bl);
+ if (bl->type == BL::PC)
+ return ((struct map_session_data *) bl)->aspd * 2;
else
{
- struct status_change *sc_data = battle_get_sc_data (bl);
- int adelay = 4000, aspd_rate = 100, i;
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- adelay = ((struct mob_data *) bl)->stats[MOB_ADELAY];
+ eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
+ interval_t adelay = std::chrono::seconds(4);
+ int aspd_rate = 100;
+ if (bl->type == BL::MOB)
+ adelay = static_cast<interval_t>(((struct mob_data *) bl)->stats[mob_stat::ADELAY]);
if (sc_data)
{
- //ツーハンドクイッケン使用時でクァグマイアでも私を忘れないで…でもない時は3割減算
- if (sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
- aspd_rate -= 30;
- //アドレナリンラッシュ使用時でツーハンドクイッケンでもクァグマイアでも私を忘れないで…でもない時は
- if (sc_data[SC_ADRENALINE].timer != -1
- && sc_data[SC_TWOHANDQUICKEN].timer == -1
- && sc_data[SC_QUAGMIRE].timer == -1
- && sc_data[SC_DONTFORGETME].timer == -1)
- { // アドレナリンラッシュ
- //使用者とパーティメンバーで格差が出る設定でなければ3割減算
- if (sc_data[SC_ADRENALINE].val2
- || !battle_config.party_skill_penaly)
- aspd_rate -= 30;
- //そうでなければ2.5割減算
- else
- aspd_rate -= 25;
- }
- //スピアクィッケン時は減算
- if (sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン
- aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
- //夕日のアサシンクロス時は減算
- if (sc_data[SC_ASSNCROS].timer != -1 && // 夕陽のアサシンクロス
- sc_data[SC_TWOHANDQUICKEN].timer == -1
- && sc_data[SC_ADRENALINE].timer == -1
- && sc_data[SC_SPEARSQUICKEN].timer == -1
- && sc_data[SC_DONTFORGETME].timer == -1)
- aspd_rate -=
- 5 + sc_data[SC_ASSNCROS].val1 +
- sc_data[SC_ASSNCROS].val2 + sc_data[SC_ASSNCROS].val3;
- //私を忘れないで…時は加算
- if (sc_data[SC_DONTFORGETME].timer != -1) // 私を忘れないで
- aspd_rate +=
- sc_data[SC_DONTFORGETME].val1 * 3 +
- sc_data[SC_DONTFORGETME].val2 +
- (sc_data[SC_DONTFORGETME].val3 >> 16);
- //金剛時25%加算
- if (sc_data[SC_STEELBODY].timer != -1) // 金剛
- aspd_rate += 25;
- //増速ポーション使用時は減算
- if (sc_data[i = SC_SPEEDPOTION2].timer != -1
- || sc_data[i = SC_SPEEDPOTION1].timer != -1
- || sc_data[i = SC_SPEEDPOTION0].timer != -1)
- aspd_rate -= sc_data[i].val1;
+ if (sc_data[StatusChange::SC_SPEEDPOTION0].timer)
+ aspd_rate -= sc_data[StatusChange::SC_SPEEDPOTION0].val1;
// Fate's `haste' spell works the same as the above
- if (sc_data[SC_HASTE].timer != -1)
- aspd_rate -= sc_data[SC_HASTE].val1;
- //ディフェンダー時は加算
- if (sc_data[SC_DEFENDER].timer != -1)
- adelay += (1100 - sc_data[SC_DEFENDER].val1 * 100);
+ if (sc_data[StatusChange::SC_HASTE].timer)
+ aspd_rate -= sc_data[StatusChange::SC_HASTE].val1;
}
if (aspd_rate != 100)
adelay = adelay * aspd_rate / 100;
- if (adelay < battle_config.monster_max_aspd << 1)
- adelay = battle_config.monster_max_aspd << 1;
- return adelay;
+ return std::max(adelay, static_cast<interval_t>(battle_config.monster_max_aspd) * 2);
}
- return 4000;
}
-int battle_get_amotion (struct block_list *bl)
+interval_t battle_get_amotion(struct block_list *bl)
{
- nullpo_retr (2000, bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_retr(std::chrono::seconds(2), bl);
+ if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->amotion;
else
{
- struct status_change *sc_data = battle_get_sc_data (bl);
- int amotion = 2000, aspd_rate = 100, i;
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- amotion = mob_db[((struct mob_data *) bl)->mob_class].amotion;
+ eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl);
+ interval_t amotion = std::chrono::seconds(2);
+ int aspd_rate = 100;
+ if (bl->type == BL::MOB)
+ amotion = static_cast<interval_t>(mob_db[((struct mob_data *) bl)->mob_class].amotion);
if (sc_data)
{
- if (sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
- aspd_rate -= 30;
- if (sc_data[SC_ADRENALINE].timer != -1
- && sc_data[SC_TWOHANDQUICKEN].timer == -1
- && sc_data[SC_QUAGMIRE].timer == -1
- && sc_data[SC_DONTFORGETME].timer == -1)
- { // アドレナリンラッシュ
- if (sc_data[SC_ADRENALINE].val2
- || !battle_config.party_skill_penaly)
- aspd_rate -= 30;
- else
- aspd_rate -= 25;
- }
- if (sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン
- aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
- if (sc_data[SC_ASSNCROS].timer != -1 && // 夕陽のアサシンクロス
- sc_data[SC_TWOHANDQUICKEN].timer == -1
- && sc_data[SC_ADRENALINE].timer == -1
- && sc_data[SC_SPEARSQUICKEN].timer == -1
- && sc_data[SC_DONTFORGETME].timer == -1)
- aspd_rate -=
- 5 + sc_data[SC_ASSNCROS].val1 +
- sc_data[SC_ASSNCROS].val2 + sc_data[SC_ASSNCROS].val3;
- if (sc_data[SC_DONTFORGETME].timer != -1) // 私を忘れないで
- aspd_rate +=
- sc_data[SC_DONTFORGETME].val1 * 3 +
- sc_data[SC_DONTFORGETME].val2 +
- (sc_data[SC_DONTFORGETME].val3 >> 16);
- if (sc_data[SC_STEELBODY].timer != -1) // 金剛
- aspd_rate += 25;
- if (sc_data[i = SC_SPEEDPOTION2].timer != -1
- || sc_data[i = SC_SPEEDPOTION1].timer != -1
- || sc_data[i = SC_SPEEDPOTION0].timer != -1)
- aspd_rate -= sc_data[i].val1;
- if (sc_data[SC_HASTE].timer != -1)
- aspd_rate -= sc_data[SC_HASTE].val1;
- if (sc_data[SC_DEFENDER].timer != -1)
- amotion += (550 - sc_data[SC_DEFENDER].val1 * 50);
+ if (sc_data[StatusChange::SC_SPEEDPOTION0].timer)
+ aspd_rate -= sc_data[StatusChange::SC_SPEEDPOTION0].val1;
+ if (sc_data[StatusChange::SC_HASTE].timer)
+ aspd_rate -= sc_data[StatusChange::SC_HASTE].val1;
}
if (aspd_rate != 100)
amotion = amotion * aspd_rate / 100;
- if (amotion < battle_config.monster_max_aspd)
- amotion = battle_config.monster_max_aspd;
- return amotion;
+ return std::max(amotion, static_cast<interval_t>(battle_config.monster_max_aspd));
}
- return 2000;
}
-int battle_get_dmotion (struct block_list *bl)
+interval_t battle_get_dmotion(struct block_list *bl)
{
- int ret;
- struct status_change *sc_data;
-
- nullpo_retr (0, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_retr(interval_t::zero(), bl);
+ if (bl->type == BL::MOB)
{
- ret = mob_db[((struct mob_data *) bl)->mob_class].dmotion;
- if (battle_config.monster_damage_delay_rate != 100)
- ret = ret * battle_config.monster_damage_delay_rate / 400;
+ return static_cast<interval_t>(mob_db[((struct mob_data *) bl)->mob_class].dmotion);
}
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
{
- ret = ((struct map_session_data *) bl)->dmotion;
- if (battle_config.pc_damage_delay_rate != 100)
- ret = ret * battle_config.pc_damage_delay_rate / 400;
+ return ((struct map_session_data *) bl)->dmotion;
}
else
- return 2000;
-
- if ((sc_data && sc_data[SC_ENDURE].timer != -1) ||
- (bl->type == BL_PC
- && ((struct map_session_data *) bl)->special_state.infinite_endure))
- ret = 0;
-
- return ret;
+ return std::chrono::seconds(2);
}
-int battle_get_element (struct block_list *bl)
+LevelElement battle_get_element(struct block_list *bl)
{
- int ret = 20;
- struct status_change *sc_data;
+ LevelElement ret = {2, Element::neutral};
- nullpo_retr (ret, bl);
- sc_data = battle_get_sc_data (bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl) // 10の位=Lv*2、1の位=属性
+ nullpo_retr(ret, bl);
+ if (bl->type == BL::MOB) // 10の位=Lv*2、1の位=属性
ret = ((struct mob_data *) bl)->def_ele;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- ret = 20 + ((struct map_session_data *) bl)->def_ele; // 防御属性Lv1
-
- if (sc_data)
- {
- if (sc_data[SC_BENEDICTIO].timer != -1) // 聖体降福
- ret = 26;
- if (sc_data[SC_FREEZE].timer != -1) // 凍結
- ret = 21;
- if (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0)
- ret = 22;
- }
-
- return ret;
-}
-
-int battle_get_attack_element (struct block_list *bl)
-{
- int ret = 0;
- struct status_change *sc_data = battle_get_sc_data (bl);
-
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- ret = 0;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- ret = ((struct map_session_data *) bl)->atk_ele;
-
- if (sc_data)
- {
- if (sc_data[SC_FROSTWEAPON].timer != -1) // フロストウェポン
- ret = 1;
- if (sc_data[SC_SEISMICWEAPON].timer != -1) // サイズミックウェポン
- ret = 2;
- if (sc_data[SC_FLAMELAUNCHER].timer != -1) // フレームランチャー
- ret = 3;
- if (sc_data[SC_LIGHTNINGLOADER].timer != -1) // ライトニングローダー
- ret = 4;
- if (sc_data[SC_ENCPOISON].timer != -1) // エンチャントポイズン
- ret = 5;
- if (sc_data[SC_ASPERSIO].timer != -1) // アスペルシオ
- ret = 6;
- }
return ret;
}
-int battle_get_attack_element2 (struct block_list *bl)
-{
- nullpo_retr (0, bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
- {
- int ret = ((struct map_session_data *) bl)->atk_ele_;
- struct status_change *sc_data =
- ((struct map_session_data *) bl)->sc_data;
-
- if (sc_data)
- {
- if (sc_data[SC_FROSTWEAPON].timer != -1) // フロストウェポン
- ret = 1;
- if (sc_data[SC_SEISMICWEAPON].timer != -1) // サイズミックウェポン
- ret = 2;
- if (sc_data[SC_FLAMELAUNCHER].timer != -1) // フレームランチャー
- ret = 3;
- if (sc_data[SC_LIGHTNINGLOADER].timer != -1) // ライトニングローダー
- ret = 4;
- if (sc_data[SC_ENCPOISON].timer != -1) // エンチャントポイズン
- ret = 5;
- if (sc_data[SC_ASPERSIO].timer != -1) // アスペルシオ
- ret = 6;
- }
- return ret;
- }
- return 0;
-}
-
-int battle_get_party_id (struct block_list *bl)
+int battle_get_party_id(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
+ nullpo_ret(bl);
+ if (bl->type == BL::PC)
return ((struct map_session_data *) bl)->status.party_id;
- else if (bl->type == BL_MOB && (struct mob_data *) bl)
+ else if (bl->type == BL::MOB)
{
struct mob_data *md = (struct mob_data *) bl;
if (md->master_id > 0)
return -md->master_id;
return -md->bl.id;
}
- else if (bl->type == BL_SKILL && (struct skill_unit *) bl)
- return ((struct skill_unit *) bl)->group->party_id;
- else
- return 0;
-}
-
-int battle_get_guild_id (struct block_list *bl)
-{
- nullpo_retr (0, bl);
- if (bl->type == BL_PC && (struct map_session_data *) bl)
- return ((struct map_session_data *) bl)->status.guild_id;
- else if (bl->type == BL_MOB && (struct mob_data *) bl)
- return ((struct mob_data *) bl)->mob_class;
- else if (bl->type == BL_SKILL && (struct skill_unit *) bl)
- return ((struct skill_unit *) bl)->group->guild_id;
- else
- return 0;
+ return 0;
}
-int battle_get_race (struct block_list *bl)
+Race battle_get_race(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_retr(Race::formless, bl);
+ if (bl->type == BL::MOB)
return mob_db[((struct mob_data *) bl)->mob_class].race;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- return 7;
- else
- return 0;
-}
-
-int battle_get_size (struct block_list *bl)
-{
- nullpo_retr (1, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- return mob_db[((struct mob_data *) bl)->mob_class].size;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- return 1;
+ else if (bl->type == BL::PC)
+ return Race::demihuman;
else
- return 1;
+ return Race::formless;
}
-int battle_get_mode (struct block_list *bl)
+MobMode battle_get_mode(struct block_list *bl)
{
- nullpo_retr (0x01, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_retr(MobMode::CAN_MOVE, bl);
+ if (bl->type == BL::MOB)
return mob_db[((struct mob_data *) bl)->mob_class].mode;
- else
- return 0x01; // とりあえず動くということで1
+ // とりあえず動くということで1
+ return MobMode::CAN_MOVE;
}
-int battle_get_mexp (struct block_list *bl)
-{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- {
- const struct mob_data *mob = (struct mob_data *) bl;
- const int retval =
- (mob_db[mob->mob_class].mexp *
- (int) (mob->stats[MOB_XP_BONUS])) >> MOB_XP_BONUS_SHIFT;
- fprintf (stderr, "Modifier of %x: -> %d\n", mob->stats[MOB_XP_BONUS],
- retval);
- return retval;
- }
- else
- return 0;
-}
-
-int battle_get_stat (int stat_id /* SP_VIT or similar */ ,
- struct block_list *bl)
+int battle_get_stat(SP stat_id, struct block_list *bl)
{
switch (stat_id)
{
- case SP_STR:
- return battle_get_str (bl);
- case SP_AGI:
- return battle_get_agi (bl);
- case SP_DEX:
- return battle_get_dex (bl);
- case SP_VIT:
- return battle_get_vit (bl);
- case SP_INT:
- return battle_get_int (bl);
- case SP_LUK:
- return battle_get_luk (bl);
+ case SP::STR:
+ return battle_get_str(bl);
+ case SP::AGI:
+ return battle_get_agi(bl);
+ case SP::DEX:
+ return battle_get_dex(bl);
+ case SP::VIT:
+ return battle_get_vit(bl);
+ case SP::INT:
+ return battle_get_int(bl);
+ case SP::LUK:
+ return battle_get_luk(bl);
default:
return 0;
}
}
// StatusChange系の所得
-struct status_change *battle_get_sc_data (struct block_list *bl)
+eptr<struct status_change, StatusChange> battle_get_sc_data(struct block_list *bl)
{
- nullpo_retr (NULL, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
- return ((struct mob_data *) bl)->sc_data;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
- return ((struct map_session_data *) bl)->sc_data;
- return NULL;
+ nullpo_retr(nullptr, bl);
+
+ switch (bl->type)
+ {
+ case BL::MOB:
+ return ((struct mob_data *)(bl))->sc_data;
+ case BL::PC:
+ return ((struct map_session_data *)(bl))->sc_data;
+ }
+ return nullptr;
}
-short *battle_get_sc_count (struct block_list *bl)
+short *battle_get_sc_count(struct block_list *bl)
{
- nullpo_retr (NULL, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_retr(NULL, bl);
+ if (bl->type == BL::MOB)
return &((struct mob_data *) bl)->sc_count;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return &((struct map_session_data *) bl)->sc_count;
return NULL;
}
-short *battle_get_opt1 (struct block_list *bl)
+Opt1 *battle_get_opt1(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
return &((struct mob_data *) bl)->opt1;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return &((struct map_session_data *) bl)->opt1;
- else if (bl->type == BL_NPC && (struct npc_data *) bl)
+ else if (bl->type == BL::NPC && (struct npc_data *) bl)
return &((struct npc_data *) bl)->opt1;
return 0;
}
-short *battle_get_opt2 (struct block_list *bl)
+Opt2 *battle_get_opt2(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
return &((struct mob_data *) bl)->opt2;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return &((struct map_session_data *) bl)->opt2;
- else if (bl->type == BL_NPC && (struct npc_data *) bl)
+ else if (bl->type == BL::NPC && (struct npc_data *) bl)
return &((struct npc_data *) bl)->opt2;
return 0;
}
-short *battle_get_opt3 (struct block_list *bl)
+Opt3 *battle_get_opt3(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
return &((struct mob_data *) bl)->opt3;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return &((struct map_session_data *) bl)->opt3;
- else if (bl->type == BL_NPC && (struct npc_data *) bl)
+ else if (bl->type == BL::NPC && (struct npc_data *) bl)
return &((struct npc_data *) bl)->opt3;
return 0;
}
-short *battle_get_option (struct block_list *bl)
+Option *battle_get_option(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB && (struct mob_data *) bl)
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
return &((struct mob_data *) bl)->option;
- else if (bl->type == BL_PC && (struct map_session_data *) bl)
+ else if (bl->type == BL::PC)
return &((struct map_session_data *) bl)->status.option;
- else if (bl->type == BL_NPC && (struct npc_data *) bl)
+ else if (bl->type == BL::NPC && (struct npc_data *) bl)
return &((struct npc_data *) bl)->option;
return 0;
}
@@ -1424,45 +910,15 @@ short *battle_get_option (struct block_list *bl)
struct battle_delay_damage_
{
struct block_list *src, *target;
- int damage;
- int flag;
+ int damage;
+ int flag;
};
-static
-void battle_delay_damage_sub (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{
- struct battle_delay_damage_ *dat = (struct battle_delay_damage_ *) data;
- if (dat && map_id2bl (id) == dat->src && dat->target->prev != NULL)
- battle_damage (dat->src, dat->target, dat->damage, dat->flag);
- free (dat);
-}
-
-int battle_delay_damage (unsigned int tick, struct block_list *src,
- struct block_list *target, int damage, int flag)
-{
- struct battle_delay_damage_ *dat;
- CREATE (dat, struct battle_delay_damage_, 1);
-
- nullpo_retr (0, src);
- nullpo_retr (0, target);
-
- dat->src = src;
- dat->target = target;
- dat->damage = damage;
- dat->flag = flag;
- add_timer (tick, battle_delay_damage_sub, src->id, (int) dat);
- return 0;
-}
// 実際にHPを操作
-int battle_damage (struct block_list *bl, struct block_list *target,
+int battle_damage(struct block_list *bl, struct block_list *target,
int damage, int flag)
{
- struct map_session_data *sd = NULL;
- struct status_change *sc_data = battle_get_sc_data (target);
- short *sc_count;
- int i;
-
- nullpo_retr (0, target); //blはNULLで呼ばれることがあるので他でチェック
+ nullpo_ret(target); //blはNULLで呼ばれることがあるので他でチェック
if (damage == 0)
return 0;
@@ -1474,371 +930,90 @@ int battle_damage (struct block_list *bl, struct block_list *target,
{
if (bl->prev == NULL)
return 0;
-
- if (bl->type == BL_PC)
- sd = (struct map_session_data *) bl;
}
if (damage < 0)
- return battle_heal (bl, target, -damage, 0, flag);
-
- if (!flag && (sc_count = battle_get_sc_count (target)) != NULL
- && *sc_count > 0)
- {
- // 凍結、石化、睡眠を消去
- if (sc_data[SC_FREEZE].timer != -1)
- skill_status_change_end (target, SC_FREEZE, -1);
- if (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0)
- skill_status_change_end (target, SC_STONE, -1);
- if (sc_data[SC_SLEEP].timer != -1)
- skill_status_change_end (target, SC_SLEEP, -1);
- }
+ return battle_heal(bl, target, -damage, 0, flag);
- if (target->type == BL_MOB)
+ if (target->type == BL::MOB)
{ // MOB
struct mob_data *md = (struct mob_data *) target;
- if (md && md->skilltimer != -1 && md->state.skillcastcancel) // 詠唱妨害
- skill_castcancel (target, 0);
- return mob_damage (bl, md, damage, 0);
+ if (md && md->skilltimer && md->state.skillcastcancel) // 詠唱妨害
+ skill_castcancel(target, 0);
+ return mob_damage(bl, md, damage, 0);
}
- else if (target->type == BL_PC)
+ else if (target->type == BL::PC)
{ // PC
struct map_session_data *tsd = (struct map_session_data *) target;
- if (tsd && tsd->sc_data && tsd->sc_data[SC_DEVOTION].val1)
- { // ディボーションをかけられている
- struct map_session_data *md =
- map_id2sd (tsd->sc_data[SC_DEVOTION].val1);
- if (md && skill_devotion3 (&md->bl, target->id))
- {
- skill_devotion (md, target->id);
- }
- else if (md && bl)
- for (i = 0; i < 5; i++)
- if (md->dev.val1[i] == target->id)
- {
- clif_damage (bl, &md->bl, gettick (), 0, 0,
- damage, 0, 0, 0);
- pc_damage (&md->bl, md, damage);
-
- return 0;
- }
- }
-
- if (tsd && tsd->skilltimer != -1)
- { // 詠唱妨害
- // フェンカードや妨害されないスキルかの検査
- if ((!tsd->special_state.no_castcancel || map[bl->m].flag.gvg)
- && tsd->state.skillcastcancel
- && !tsd->special_state.no_castcancel2)
- skill_castcancel (target, 0);
- }
-
- return pc_damage (bl, tsd, damage);
+ return pc_damage(bl, tsd, damage);
}
- else if (target->type == BL_SKILL)
- return skill_unit_ondamaged ((struct skill_unit *) target, bl, damage,
- gettick ());
return 0;
}
-int battle_heal (struct block_list *bl, struct block_list *target, int hp,
+int battle_heal(struct block_list *bl, struct block_list *target, int hp,
int sp, int flag)
{
- nullpo_retr (0, target); //blはNULLで呼ばれることがあるので他でチェック
+ nullpo_ret(target); //blはNULLで呼ばれることがあるので他でチェック
- if (target->type == BL_PC
- && pc_isdead ((struct map_session_data *) target))
+ if (target->type == BL::PC
+ && pc_isdead((struct map_session_data *) target))
return 0;
if (hp == 0 && sp == 0)
return 0;
if (hp < 0)
- return battle_damage (bl, target, -hp, flag);
+ return battle_damage(bl, target, -hp, flag);
- if (target->type == BL_MOB)
- return mob_heal ((struct mob_data *) target, hp);
- else if (target->type == BL_PC)
- return pc_heal ((struct map_session_data *) target, hp, sp);
+ if (target->type == BL::MOB)
+ return mob_heal((struct mob_data *) target, hp);
+ else if (target->type == BL::PC)
+ return pc_heal((struct map_session_data *) target, hp, sp);
return 0;
}
// 攻撃停止
-int battle_stopattack (struct block_list *bl)
+int battle_stopattack(struct block_list *bl)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB)
- return mob_stopattack ((struct mob_data *) bl);
- else if (bl->type == BL_PC)
- return pc_stopattack ((struct map_session_data *) bl);
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
+ return mob_stopattack((struct mob_data *) bl);
+ else if (bl->type == BL::PC)
+ return pc_stopattack((struct map_session_data *) bl);
return 0;
}
// 移動停止
-int battle_stopwalking (struct block_list *bl, int type)
+int battle_stopwalking(struct block_list *bl, int type)
{
- nullpo_retr (0, bl);
- if (bl->type == BL_MOB)
- return mob_stop_walking ((struct mob_data *) bl, type);
- else if (bl->type == BL_PC)
- return pc_stop_walking ((struct map_session_data *) bl, type);
+ nullpo_ret(bl);
+ if (bl->type == BL::MOB)
+ return mob_stop_walking((struct mob_data *) bl, type);
+ else if (bl->type == BL::PC)
+ return pc_stop_walking((struct map_session_data *) bl, type);
return 0;
}
/*==========================================
- * ダメージの属性修正
- *------------------------------------------
- */
-int battle_attr_fix (int damage, int atk_elem, int def_elem)
-{
- int def_type = def_elem % 10, def_lv = def_elem / 10 / 2;
-
- if (atk_elem < 0 || atk_elem > 9 || def_type < 0 || def_type > 9 ||
- def_lv < 1 || def_lv > 4)
- { // 属 性値がおかしいのでとりあえずそのまま返す
- if (battle_config.error_log)
- printf
- ("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n",
- atk_elem, def_type, def_lv);
- return damage;
- }
-
- return damage * attr_fix_table[def_lv - 1][atk_elem][def_type] / 100;
-}
-
-/*==========================================
* ダメージ最終計算
*------------------------------------------
*/
-int battle_calc_damage (struct block_list *src, struct block_list *bl,
- int damage, int div_, int skill_num, int skill_lv,
- int flag)
+static
+int battle_calc_damage(struct block_list *, struct block_list *bl,
+ int damage, int div_,
+ SkillID, int, BF flag)
{
- struct map_session_data *sd = NULL;
struct mob_data *md = NULL;
- struct status_change *sc_data, *sc;
- short *sc_count;
- int class_;
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- class_ = battle_get_class (bl);
- if (bl->type == BL_MOB)
+ if (bl->type == BL::MOB)
md = (struct mob_data *) bl;
- else
- sd = (struct map_session_data *) bl;
- sc_data = battle_get_sc_data (bl);
- sc_count = battle_get_sc_count (bl);
-
- if (sc_count != NULL && *sc_count > 0)
- {
-
- if (sc_data[SC_SAFETYWALL].timer != -1 && damage > 0
- && flag & BF_WEAPON && flag & BF_SHORT
- && skill_num != NPC_GUIDEDATTACK)
- {
- // セーフティウォール
- struct skill_unit *unit =
- (struct skill_unit *) sc_data[SC_SAFETYWALL].val2;
- if (unit && unit->alive && (--unit->group->val2) <= 0)
- skill_delunit (unit);
- skill_unit_move (bl, gettick (), 1); // 重ね掛けチェック
- damage = 0;
- }
- if (sc_data[SC_PNEUMA].timer != -1 && damage > 0 && flag & BF_WEAPON
- && flag & BF_LONG && skill_num != NPC_GUIDEDATTACK)
- {
- // ニューマ
- damage = 0;
- }
-
- if (sc_data[SC_ROKISWEIL].timer != -1 && damage > 0 &&
- flag & BF_MAGIC)
- {
- // ニューマ
- damage = 0;
- }
-
- if (sc_data[SC_AETERNA].timer != -1 && damage > 0)
- { // レックスエーテルナ
- damage <<= 1;
- skill_status_change_end (bl, SC_AETERNA, -1);
- }
-
- //属性場のダメージ増加
- if (sc_data[SC_VOLCANO].timer != -1)
- { // ボルケーノ
- if (flag & BF_SKILL && skill_get_pl (skill_num) == 3)
- damage += damage * sc_data[SC_VOLCANO].val4 / 100;
- else if (!(flag & BF_SKILL) && (battle_get_attack_element (bl) == 3))
- damage += damage * sc_data[SC_VOLCANO].val4 / 100;
- }
-
- if (sc_data[SC_VIOLENTGALE].timer != -1)
- { // バイオレントゲイル
- if (flag & BF_SKILL && skill_get_pl (skill_num) == 4)
- damage += damage * sc_data[SC_VIOLENTGALE].val4 / 100;
- else if (!(flag & BF_SKILL) && (battle_get_attack_element (bl) == 4))
- damage += damage * sc_data[SC_VIOLENTGALE].val4 / 100;
- }
-
- if (sc_data[SC_DELUGE].timer != -1)
- { // デリュージ
- if (flag & BF_SKILL && skill_get_pl (skill_num) == 1)
- damage += damage * sc_data[SC_DELUGE].val4 / 100;
- else if (!(flag & BF_SKILL) && (battle_get_attack_element (bl) == 1))
- damage += damage * sc_data[SC_DELUGE].val4 / 100;
- }
-
- if (sc_data[SC_ENERGYCOAT].timer != -1 && damage > 0
- && flag & BF_WEAPON)
- { // エナジーコート
- if (sd)
- {
- if (sd->status.sp > 0)
- {
- int per = sd->status.sp * 5 / (sd->status.max_sp + 1);
- sd->status.sp -= sd->status.sp * (per * 5 + 10) / 1000;
- if (sd->status.sp < 0)
- sd->status.sp = 0;
- damage -= damage * ((per + 1) * 6) / 100;
- clif_updatestatus (sd, SP_SP);
- }
- if (sd->status.sp <= 0)
- skill_status_change_end (bl, SC_ENERGYCOAT, -1);
- }
- else
- damage -= damage * (sc_data[SC_ENERGYCOAT].val1 * 6) / 100;
- }
-
- if (sc_data[SC_KYRIE].timer != -1 && damage > 0)
- { // キリエエレイソン
- sc = &sc_data[SC_KYRIE];
- sc->val2 -= damage;
- if (flag & BF_WEAPON)
- {
- if (sc->val2 >= 0)
- damage = 0;
- else
- damage = -sc->val2;
- }
- if ((--sc->val3) <= 0 || (sc->val2 <= 0)
- || skill_num == AL_HOLYLIGHT)
- skill_status_change_end (bl, SC_KYRIE, -1);
- }
-
- if (sc_data[SC_BASILICA].timer != -1 && damage > 0)
- {
- // ニューマ
- damage = 0;
- }
- if (sc_data[SC_LANDPROTECTOR].timer != -1 && damage > 0
- && flag & BF_MAGIC)
- {
- // ニューマ
- damage = 0;
- }
-
- if (sc_data[SC_AUTOGUARD].timer != -1 && damage > 0
- && flag & BF_WEAPON)
- {
- if (MRAND (100) < sc_data[SC_AUTOGUARD].val2)
- {
- damage = 0;
- clif_skill_nodamage (bl, bl, CR_AUTOGUARD,
- sc_data[SC_AUTOGUARD].val1, 1);
- if (sd)
- sd->canmove_tick = gettick () + 300;
- else if (md)
- md->canmove_tick = gettick () + 300;
- }
- }
-// -- moonsoul (chance to block attacks with new Lord Knight skill parrying)
-//
- if (sc_data[SC_PARRYING].timer != -1 && damage > 0
- && flag & BF_WEAPON)
- {
- if (MRAND (100) < sc_data[SC_PARRYING].val2)
- {
- damage = 0;
- clif_skill_nodamage (bl, bl, LK_PARRYING,
- sc_data[SC_PARRYING].val1, 1);
- }
- }
- // リジェクトソード
- if (sc_data[SC_REJECTSWORD].timer != -1 && damage > 0
- && flag & BF_WEAPON
- &&
- ((src->type == BL_PC
- && ((struct map_session_data *) src)->status.weapon == (1 || 2
- || 3))
- || src->type == BL_MOB))
- {
- if (MRAND (100) < (10 + 5 * sc_data[SC_REJECTSWORD].val1))
- { //反射確率は10+5*Lv
- damage = damage * 50 / 100;
- battle_damage (bl, src, damage, 0);
- //ダメージを与えたのは良いんだが、ここからどうして表示するんだかわかんねぇ
- //エフェクトもこれでいいのかわかんねぇ
- clif_skill_nodamage (bl, bl, ST_REJECTSWORD,
- sc_data[SC_REJECTSWORD].val1, 1);
- if ((--sc_data[SC_REJECTSWORD].val2) <= 0)
- skill_status_change_end (bl, SC_REJECTSWORD, -1);
- }
- }
- }
-
- if (class_ == 1288 || class_ == 1287 || class_ == 1286 || class_ == 1285)
- {
-// if(class == 1288) {
- if (class_ == 1288 && flag & BF_SKILL)
- damage = 0;
- if (src->type == BL_PC)
- {
- struct guild *g =
- guild_search (((struct map_session_data *) src)->
- status.guild_id);
- struct guild_castle *gc = guild_mapname2gc (map[bl->m].name);
- if (!((struct map_session_data *) src)->status.guild_id)
- damage = 0;
- if (gc && agit_flag == 0 && class_ != 1288) // guardians cannot be damaged during non-woe [Valaris]
- damage = 0; // end woe check [Valaris]
- if (g == NULL)
- damage = 0; //ギルド未加入ならダメージ無し
- else if ((gc != NULL) && guild_isallied (g, gc))
- damage = 0; //自占領ギルドのエンペならダメージ無し
- else if (g && guild_checkskill (g, GD_APPROVAL) <= 0)
- damage = 0; //正規ギルド承認がないとダメージ無し
- else if (battle_config.guild_max_castles != 0
- && guild_checkcastles (g) >=
- battle_config.guild_max_castles)
- damage = 0; // [MouseJstr]
- }
- else
- damage = 0;
- }
-
- if (map[bl->m].flag.gvg && damage > 0)
- { //GvG
- if (flag & BF_WEAPON)
- {
- if (flag & BF_SHORT)
- damage = damage * battle_config.gvg_short_damage_rate / 100;
- if (flag & BF_LONG)
- damage = damage * battle_config.gvg_long_damage_rate / 100;
- }
- if (flag & BF_MAGIC)
- damage = damage * battle_config.gvg_magic_damage_rate / 100;
- if (flag & BF_MISC)
- damage = damage * battle_config.gvg_misc_damage_rate / 100;
- if (damage < 1)
- damage = 1;
- }
-
- if (battle_config.skill_min_damage || flag & BF_MISC)
+ if (battle_config.skill_min_damage
+ || bool(flag & BF::MISC))
{
if (div_ < 255)
{
@@ -1850,258 +1025,56 @@ int battle_calc_damage (struct block_list *src, struct block_list *bl,
}
if (md != NULL && md->hp > 0 && damage > 0) // 反撃などのMOBスキル判定
- mobskill_event (md, flag);
+ mobskill_event(md, flag);
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_retr (0, 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 Damage battle_calc_mob_weapon_attack(struct block_list *src,
struct block_list *target,
- int skill_num,
- int skill_lv, int wflag)
+ SkillID skill_num,
+ int skill_lv, int)
{
struct map_session_data *tsd = NULL;
struct mob_data *md = (struct mob_data *) src, *tmd = NULL;
- int hitrate, flee, cri = 0, atkmin, atkmax;
- int luk, target_count = 1;
- int def1 = battle_get_def (target);
- int def2 = battle_get_def2 (target);
- int t_vit = battle_get_vit (target);
- struct Damage wd;
- int damage, damage2 = 0, type, div_, blewcount =
- skill_get_blewcount (skill_num, skill_lv);
- int flag, skill, ac_flag = 0, dmg_lv = 0;
- int t_mode = 0, t_race = 0, t_size = 1, s_race = 0, s_ele = 0;
- struct status_change *sc_data, *t_sc_data;
- short *sc_count;
- short *option, *opt1, *opt2;
-
- //return前の処理があるので情報出力部のみ変更
- if (src == NULL || target == NULL || md == NULL)
- {
- nullpo_info (NLP_MARK);
- memset (&wd, 0, sizeof (wd));
- return wd;
- }
-
- s_race = battle_get_race (src);
- s_ele = battle_get_attack_element (src);
- sc_data = battle_get_sc_data (src);
- sc_count = battle_get_sc_count (src);
- option = battle_get_option (src);
- opt1 = battle_get_opt1 (src);
- opt2 = battle_get_opt2 (src);
+ int hitrate, flee, cri = 0, atkmin, atkmax;
+ int target_count = 1;
+ int def1 = battle_get_def(target);
+ int def2 = battle_get_def2(target);
+ int t_vit = battle_get_vit(target);
+ struct Damage wd {};
+ int damage, damage2 = 0;
+ DamageType type;
+ int div_;
+ BF flag;
+ int ac_flag = 0;
+ ATK dmg_lv = ATK::ZERO;
+ eptr<struct status_change, StatusChange> sc_data, t_sc_data;
+
+ nullpo_retr(wd, src);
+ nullpo_retr(wd, target);
+ nullpo_retr(wd, md);
+
+ sc_data = battle_get_sc_data(src);
// ターゲット
- if (target->type == BL_PC)
+ if (target->type == BL::PC)
tsd = (struct map_session_data *) target;
- else if (target->type == BL_MOB)
+ else if (target->type == BL::MOB)
tmd = (struct mob_data *) target;
- t_race = battle_get_race (target);
- t_size = battle_get_size (target);
- t_mode = battle_get_mode (target);
- t_sc_data = battle_get_sc_data (target);
-
- if ((skill_num == 0
- || (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; // 攻撃の種類の設定
+ MobMode t_mode = battle_get_mode(target);
+ t_sc_data = battle_get_sc_data(target);
+
+ flag = BF::SHORT | BF::WEAPON | BF::NORMAL; // 攻撃の種類の設定
// 回避率計算、回避判定は後で
- flee = battle_get_flee (target);
+ flee = battle_get_flee(target);
if (battle_config.agi_penaly_type > 0
|| battle_config.vit_penaly_type > 0)
target_count +=
- battle_counttargeted (target, src,
- battle_config.agi_penaly_count_lv);
+ battle_counttargeted(target, src,
+ ATK(battle_config.agi_penaly_count_lv)); // FIXME
if (battle_config.agi_penaly_type > 0)
{
if (target_count >= battle_config.agi_penaly_count)
@@ -2122,325 +1095,72 @@ static struct Damage battle_calc_mob_weapon_attack (struct block_list *src,
flee = 1;
}
}
- hitrate = battle_get_hit (src) - flee + 80;
+ hitrate = battle_get_hit(src) - flee + 80;
- type = 0; // normal
+ type = DamageType::NORMAL;
div_ = 1; // single attack
- luk = battle_get_luk (src);
-
if (battle_config.enemy_str)
- damage = battle_get_baseatk (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);
+ atkmin = battle_get_atk(src);
+ atkmax = battle_get_atk2(src);
}
if (mob_db[md->mob_class].range > 3)
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
+ flag = (flag & ~BF::RANGEMASK) | BF::LONG;
if (atkmin > atkmax)
atkmin = atkmax;
- if (sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer != -1)
- { // マキシマイズパワー
- atkmin = atkmax;
- }
-
- cri = battle_get_critical (src);
- cri -= battle_get_luk (target) * 3;
+ cri = battle_get_critical(src);
+ cri -= battle_get_luk(target) * 3;
if (battle_config.enemy_critical_rate != 100)
{
cri = cri * battle_config.enemy_critical_rate / 100;
if (cri < 1)
cri = 1;
}
- if (t_sc_data != NULL && t_sc_data[SC_SLEEP].timer != -1) // 睡眠中はクリティカルが倍に
- cri <<= 1;
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 == 0 || skill_num == KN_AUTOCOUNTER) && skill_lv >= 0 && battle_config.enemy_critical && (MRAND (1000)) < cri) // 判定(スキルの場合は無視)
+ if ((skill_num == SkillID::ZERO)
+ && skill_lv >= 0 && battle_config.enemy_critical
+ && random_::chance({cri, 1000}))
+ // 判定(スキルの場合は無視)
// 敵の判定
{
damage += atkmax;
- type = 0x0a;
+ type = DamageType::CRITICAL;
}
else
{
- int vitbonusmax;
+ int vitbonusmax;
if (atkmax > atkmin)
- damage += atkmin + MRAND ((atkmax - atkmin + 1));
+ damage += random_::in(atkmin, atkmax);
else
damage += atkmin;
- // スキル修正1(攻撃力倍化系)
- // オーバートラスト(+5% 〜 +25%),他攻撃系スキルの場合ここで補正
- // バッシュ,マグナムブレイク,
- // ボーリングバッシュ,スピアブーメラン,ブランディッシュスピア,スピアスタッブ,
- // メマーナイト,カートレボリューション
- // ダブルストレイフィング,アローシャワー,チャージアロー,
- // ソニックブロー
- if (sc_data)
- { //状態異常中のダメージ追加
- if (sc_data[SC_OVERTHRUST].timer != -1) // オーバートラスト
- damage += damage * (5 * sc_data[SC_OVERTHRUST].val1) / 100;
- if (sc_data[SC_TRUESIGHT].timer != -1) // トゥルーサイト
- damage += damage * (2 * sc_data[SC_TRUESIGHT].val1) / 100;
- if (sc_data[SC_BERSERK].timer != -1) // バーサーク
- damage += damage * 50 / 100;
- }
- if (skill_num > 0)
+ if (skill_num != SkillID::ZERO && skill_num != SkillID::NEGATIVE)
{
- int i;
- if ((i = skill_get_pl (skill_num)) > 0)
- s_ele = i;
-
- 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_;
- break;
- case NPC_RANDOMATTACK: // ランダムATK攻撃
- damage = damage * (MPRAND (50, 150)) / 100;
- break;
- // 属性攻撃(適当)
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_TELEKINESISATTACK:
- damage = damage * (100 + 25 * (skill_lv - 1)) / 100;
- break;
- case NPC_GUIDEDATTACK:
- hitrate = 1000000;
- break;
- case NPC_RANGEATTACK:
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- break;
- 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;
- }
+ flag = (flag & ~BF::SKILLMASK) | BF::SKILL;
}
- 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;
+ int t_def;
target_count =
- 1 + battle_counttargeted (target, src,
- battle_config.vit_penaly_count_lv);
+ 1 + battle_counttargeted(target, src,
+ ATK(battle_config.vit_penaly_count_lv)); // FIXME
if (battle_config.vit_penaly_type > 0)
{
if (target_count >= battle_config.vit_penaly_count)
@@ -2493,24 +1213,13 @@ static 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)
- {
- damage =
- damage - (def1 * battle_config.monster_defense_type) -
- t_def -
- ((vitbonusmax < 1) ? 0 : MRAND ((vitbonusmax + 1)));
- }
- else
{
- damage =
- damage * (100 - def1) / 100 - t_def -
- ((vitbonusmax < 1) ? 0 : MRAND ((vitbonusmax + 1)));
+ damage = damage * (100 - def1) / 100;
+ damage -= t_def;
+ if (vitbonusmax > 0)
+ damage -= random_::in(0, vitbonusmax);
}
}
}
@@ -2523,143 +1232,68 @@ static struct Damage battle_calc_mob_weapon_attack (struct block_list *src,
// 回避修正
if (hitrate < 1000000)
hitrate = ((hitrate > 95) ? 95 : ((hitrate < 5) ? 5 : hitrate));
- if (hitrate < 1000000 && // 必中攻撃
- (t_sc_data != NULL && (t_sc_data[SC_SLEEP].timer != -1 || // 睡眠は必中
- t_sc_data[SC_STAN].timer != -1 || // スタンは必中
- t_sc_data[SC_FREEZE].timer != -1 || (t_sc_data[SC_STONE].timer != -1 && t_sc_data[SC_STONE].val2 == 0)))) // 凍結は必中
- hitrate = 1000000;
- if (type == 0 && MRAND (100) >= hitrate)
+
+ if (type == DamageType::NORMAL && !random_::chance({hitrate, 100}))
{
damage = damage2 = 0;
- dmg_lv = ATK_FLEE;
+ dmg_lv = ATK::FLEE;
}
else
{
- dmg_lv = ATK_DEF;
- }
-
- if (tsd)
- {
- int cardfix = 100, i;
- cardfix = cardfix * (100 - tsd->subele[s_ele]) / 100; // 属 性によるダメージ耐性
- cardfix = cardfix * (100 - tsd->subrace[s_race]) / 100; // 種族によるダメージ耐性
- if (mob_db[md->mob_class].mode & 0x20)
- cardfix = cardfix * (100 - tsd->subrace[10]) / 100;
- else
- cardfix = cardfix * (100 - tsd->subrace[11]) / 100;
- for (i = 0; i < tsd->add_def_class_count; i++)
- {
- if (tsd->add_def_classid[i] == md->mob_class)
- {
- cardfix = cardfix * (100 - tsd->add_def_classrate[i]) / 100;
- break;
- }
- }
- if (flag & BF_LONG)
- cardfix = cardfix * (100 - tsd->long_attack_def_rate) / 100;
- if (flag & BF_SHORT)
- cardfix = cardfix * (100 - tsd->near_attack_def_rate) / 100;
- damage = damage * cardfix / 100;
- }
- if (t_sc_data)
- {
- int cardfix = 100;
- if (t_sc_data[SC_DEFENDER].timer != -1 && flag & BF_LONG)
- cardfix = cardfix * (100 - t_sc_data[SC_DEFENDER].val2) / 100;
- if (cardfix != 100)
- damage = damage * cardfix / 100;
- }
- if (t_sc_data && t_sc_data[SC_ASSUMPTIO].timer != -1)
- { //アシャンプティオ
- if (!map[target->m].flag.pvp)
- damage = damage / 3;
- else
- damage = damage / 2;
+ dmg_lv = ATK::DEF;
}
if (damage < 0)
damage = 0;
- // 属 性の適用
- if (!((battle_config.mob_ghostring_fix == 1) && (battle_get_element (target) == 8) && (target->type == BL_PC))) // [MouseJstr]
- if (skill_num != 0 || s_ele != 0
- || !battle_config.mob_attack_attr_none)
- damage =
- battle_attr_fix (damage, s_ele, battle_get_element (target));
-
- 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 == 0 && skill_lv >= 0 && tsd != NULL
- && MRAND (1000) < battle_get_flee2 (target))
+ if (skill_num == SkillID::ZERO && skill_lv >= 0 && tsd != NULL
+ && random_::chance({battle_get_flee2(target), 1000}))
{
damage = 0;
- type = 0x0b;
- dmg_lv = ATK_LUCKY;
+ type = DamageType::FLEE2;
+ dmg_lv = ATK::LUCKY;
}
if (battle_config.enemy_perfect_flee)
{
- if (skill_num == 0 && skill_lv >= 0 && tmd != NULL
- && MRAND (1000) < battle_get_flee2 (target))
+ if (skill_num == SkillID::ZERO && skill_lv >= 0 && tmd != NULL
+ && random_::chance({battle_get_flee2(target), 1000}))
{
damage = 0;
- type = 0x0b;
- dmg_lv = ATK_LUCKY;
+ type = DamageType::FLEE2;
+ dmg_lv = ATK::LUCKY;
}
}
// if(def1 >= 1000000 && damage > 0)
- if (t_mode & 0x40 && damage > 0)
+ if (bool(t_mode & MobMode::PLANT) && damage > 0)
damage = 1;
- 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.amotion = battle_get_amotion(src);
+ wd.dmotion = battle_get_dmotion(target);
wd.flag = flag;
wd.dmg_lv = dmg_lv;
return wd;
}
-int battle_is_unarmed (struct block_list *bl)
+int battle_is_unarmed(struct block_list *bl)
{
if (!bl)
return 0;
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
{
struct map_session_data *sd = (struct map_session_data *) bl;
- return (sd->equip_index[EQUIP_SHIELD] == -1
- && sd->equip_index[EQUIP_WEAPON] == -1);
+ return (sd->equip_index[EQUIP::SHIELD] == -1
+ && sd->equip_index[EQUIP::WEAPON] == -1);
}
else
return 0;
@@ -2670,104 +1304,57 @@ int battle_is_unarmed (struct block_list *bl)
* PCの武器による攻撃
*-------------------------------------------------------------------------
*/
-static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
+static
+struct Damage battle_calc_pc_weapon_attack(struct block_list *src,
struct block_list *target,
- int skill_num,
- int skill_lv, int wflag)
+ SkillID skill_num,
+ int skill_lv, int)
{
struct map_session_data *sd = (struct map_session_data *) src, *tsd =
NULL;
struct mob_data *tmd = NULL;
- int hitrate, flee, cri = 0, atkmin, atkmax;
- int dex, luk, target_count = 1;
- int def1 = battle_get_def (target);
- int def2 = battle_get_def2 (target);
- int t_vit = battle_get_vit (target);
- struct Damage wd;
- int damage, damage2, damage3 = 0, damage4 = 0, type, div_, blewcount =
- skill_get_blewcount (skill_num, skill_lv);
- int flag, skill, dmg_lv = 0;
- int t_mode = 0, t_race = 0, t_size = 1, s_race = 7, s_ele = 0;
- struct status_change *sc_data, *t_sc_data;
- short *sc_count;
- short *option, *opt1, *opt2;
- int atkmax_ = 0, atkmin_ = 0, s_ele_; //二刀流用
- int watk, watk_, cardfix, t_ele;
- int da = 0, i, t_class, ac_flag = 0;
- int idef_flag = 0, idef_flag_ = 0;
- int target_distance;
-
- //return前の処理があるので情報出力部のみ変更
- if (src == NULL || target == NULL || sd == NULL)
- {
- nullpo_info (NLP_MARK);
- memset (&wd, 0, sizeof (wd));
- return wd;
- }
+ int hitrate, flee, cri = 0, atkmin, atkmax;
+ int dex, target_count = 1;
+ int def1 = battle_get_def(target);
+ int def2 = battle_get_def2(target);
+ int t_vit = battle_get_vit(target);
+ struct Damage wd {};
+ int damage, damage2;
+ DamageType type;
+ int div_;
+ BF flag;
+ ATK dmg_lv = ATK::ZERO;
+ eptr<struct status_change, StatusChange> sc_data, t_sc_data;
+ int atkmax_ = 0, atkmin_ = 0; //二刀流用
+ int watk, watk_;
+ bool da = false;
+ int ac_flag = 0;
+ int target_distance;
+
+ nullpo_retr(wd, src);
+ nullpo_retr(wd, target);
+ nullpo_retr(wd, sd);
// アタッカー
- s_race = battle_get_race (src); //種族
- s_ele = battle_get_attack_element (src); //属性
- s_ele_ = battle_get_attack_element2 (src); //左手属性
- sc_data = battle_get_sc_data (src); //ステータス異常
- sc_count = battle_get_sc_count (src); //ステータス異常の数
- option = battle_get_option (src); //鷹とかペコとかカートとか
- opt1 = battle_get_opt1 (src); //石化、凍結、スタン、睡眠、暗闇
- opt2 = battle_get_opt2 (src); //毒、呪い、沈黙、暗闇?
-
- if (skill_num != CR_GRANDCROSS) //グランドクロスでないなら
- sd->state.attack_type = BF_WEAPON; //攻撃タイプは武器攻撃
+ sc_data = battle_get_sc_data(src); //ステータス異常
+
+ sd->state.attack_type = BF::WEAPON; //攻撃タイプは武器攻撃
// ターゲット
- if (target->type == BL_PC) //対象がPCなら
+ if (target->type == BL::PC) //対象がPCなら
tsd = (struct map_session_data *) target; //tsdに代入(tmdはNULL)
- else if (target->type == BL_MOB) //対象がMobなら
+ else if (target->type == BL::MOB) //対象がMobなら
tmd = (struct mob_data *) target; //tmdに代入(tsdはNULL)
- t_race = battle_get_race (target); //対象の種族
- t_ele = battle_get_elem_type (target); //対象の属性
- t_size = battle_get_size (target); //対象のサイズ
- t_mode = battle_get_mode (target); //対象のMode
- t_sc_data = battle_get_sc_data (target); //対象のステータス異常
-
-//オートカウンター処理ここから
- if ((skill_num == 0
- || (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;
- }
- }
-//オートカウンター処理ここまで
+ MobMode t_mode = battle_get_mode(target); //対象のMode
+ t_sc_data = battle_get_sc_data(target); //対象のステータス異常
- flag = BF_SHORT | BF_WEAPON | BF_NORMAL; // 攻撃の種類の設定
+ flag = BF::SHORT | BF::WEAPON | BF::NORMAL; // 攻撃の種類の設定
// 回避率計算、回避判定は後で
- flee = battle_get_flee (target);
+ flee = battle_get_flee(target);
if (battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0) //AGI、VITペナルティ設定が有効
- target_count += battle_counttargeted (target, src, battle_config.agi_penaly_count_lv); //対象の数を算出
+ target_count += battle_counttargeted(target, src,
+ ATK(battle_config.agi_penaly_count_lv)); //対象の数を算出
if (battle_config.agi_penaly_type > 0)
{
if (target_count >= battle_config.agi_penaly_count)
@@ -2788,34 +1375,28 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
flee = 1; //回避率は最低でも1
}
}
- hitrate = battle_get_hit (src) - flee + 80; //命中率計算
+ hitrate = battle_get_hit(src) - flee + 80; //命中率計算
{ // [fate] Reduce hit chance by distance
- int dx = abs (src->x - target->x);
- int dy = abs (src->y - target->y);
- int malus_dist;
+ int dx = abs(src->x - target->x);
+ int dy = abs(src->y - target->y);
+ int malus_dist;
- target_distance = MAX (dx, dy);
+ target_distance = max(dx, dy);
malus_dist =
- MAX (0, target_distance - (skill_power (sd, AC_OWL) / 75));
+ max(0, target_distance - (skill_power(sd, SkillID::AC_OWL) / 75));
hitrate -= (malus_dist * (malus_dist + 1));
}
- dex = battle_get_dex (src); //DEX
- luk = battle_get_luk (src); //LUK
- watk = battle_get_atk (src); //ATK
- watk_ = battle_get_atk_ (src); //ATK左手
+ dex = battle_get_dex(src); //DEX
+ watk = battle_get_atk(src); //ATK
+ watk_ = battle_get_atk_(src); //ATK左手
- type = 0; // normal
+ type = DamageType::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の取得
+ damage = damage2 = battle_get_baseatk(&sd->bl); //damega,damega2初登場、base_atkの取得
}
if (sd->attackrange > 2)
{ // [fate] ranged weapon?
@@ -2832,45 +1413,23 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
atkmin = atkmin_ = dex; //最低ATKはDEXで初期化?
sd->state.arrow_atk = 0; //arrow_atk初期化
- if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]])
+ if (sd->equip_index[EQUIP::WEAPON] >= 0 && sd->inventory_data[sd->equip_index[EQUIP::WEAPON]])
atkmin =
atkmin * (80 +
- sd->inventory_data[sd->equip_index[9]]->wlv * 20) / 100;
- if (sd->equip_index[8] >= 0 && sd->inventory_data[sd->equip_index[8]])
+ sd->inventory_data[sd->equip_index[EQUIP::WEAPON]]->wlv * 20) / 100;
+ if (sd->equip_index[EQUIP::SHIELD] >= 0 && sd->inventory_data[sd->equip_index[EQUIP::SHIELD]])
atkmin_ =
atkmin_ * (80 +
- sd->inventory_data[sd->equip_index[8]]->wlv * 20) /
+ sd->inventory_data[sd->equip_index[EQUIP::SHIELD]]->wlv * 20) /
100;
- if (sd->status.weapon == 11)
+ if (sd->status.weapon == ItemLook::BOW)
{ //武器が弓矢の場合
atkmin = watk * ((atkmin < watk) ? atkmin : watk) / 100; //弓用最低ATK計算
- flag = (flag & ~BF_RANGEMASK) | BF_LONG; //遠距離攻撃フラグを有効
- if (sd->arrow_ele > 0) //属性矢なら属性を矢の属性に変更
- s_ele = sd->arrow_ele;
+ flag = (flag & ~BF::RANGEMASK) | BF::LONG; //遠距離攻撃フラグを有効
sd->state.arrow_atk = 1; //arrow_atk有効化
}
- // サイズ修正
- // ペコ騎乗していて、槍で攻撃した場合は中型のサイズ修正を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))
- { //ペコ騎乗していて、槍で中型を攻撃
- atkmax = watk;
- atkmax_ = watk_;
- }
- else
{
- atkmax = (watk * sd->atkmods[t_size]) / 100;
- atkmin = (atkmin * sd->atkmods[t_size]) / 100;
- atkmax_ = (watk_ * sd->atkmods_[t_size]) / 100;
- atkmin_ = (atkmin_ * sd->atkmods[t_size]) / 100;
- }
- if ((sc_data != NULL && sc_data[SC_WEAPONPERFECTION].timer != -1)
- || (sd->special_state.no_sizefix))
- { // ウェポンパーフェクション || ドレイクカード
atkmax = watk;
atkmax_ = watk_;
}
@@ -2880,70 +1439,37 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
if (atkmin_ > atkmax_)
atkmin_ = atkmax_;
- if (sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer != -1)
- { // マキシマイズパワー
- atkmin = atkmax;
- atkmin_ = atkmax_;
- }
-
- //ダブルアタック判定
- if (sd->weapontype1 == 0x01)
- {
- if (skill_num == 0 && skill_lv >= 0
- && (skill = pc_checkskill (sd, TF_DOUBLE)) > 0)
- da = (MRAND (100) < (skill * 5)) ? 1 : 0;
- }
-
- //三段掌
- if (skill_num == 0 && 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 == 0 && skill_lv >= 0)
- da = (MRAND (100) < sd->double_rate) ? 1 : 0;
+ if (sd->double_rate > 0 && skill_num == SkillID::ZERO && skill_lv >= 0)
+ da = random_::chance({sd->double_rate, 100});
// 過剰精錬ボーナス
if (sd->overrefine > 0)
- damage += MPRAND (1, sd->overrefine);
+ damage += random_::in(1, sd->overrefine);
if (sd->overrefine_ > 0)
- damage2 += MPRAND (1, sd->overrefine_);
+ damage2 += random_::in(1, sd->overrefine_);
- if (da == 0)
+ if (!da)
{ //ダブルアタックが発動していない
// クリティカル計算
- cri = battle_get_critical (src);
+ cri = battle_get_critical(src);
if (sd->state.arrow_atk)
cri += sd->arrow_cri;
- if (sd->status.weapon == 16)
+ if (sd->status.weapon == ItemLook::_16)
// カタールの場合、クリティカルを倍に
cri <<= 1;
- cri -= battle_get_luk (target) * 3;
- if (t_sc_data != NULL && t_sc_data[SC_SLEEP].timer != -1) // 睡眠中はクリティカルが倍に
- cri <<= 1;
+ cri -= battle_get_luk(target) * 3;
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 == 0 || skill_num == KN_AUTOCOUNTER || skill_num == SN_SHARPSHOOTING) && skill_lv >= 0 && //ダブルアタックが発動していない
- (MRAND (1000)) < cri) // 判定(スキルの場合は無視)
+ //ダブルアタックが発動していない
+ // 判定(スキルの場合は無視)
+ if (!da && skill_num == SkillID::ZERO && skill_lv >= 0
+ && random_::chance({cri, 1000}))
{
damage += atkmax;
damage2 += atkmax_;
@@ -2954,49 +1480,18 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
}
if (sd->state.arrow_atk)
damage += sd->arrow_atk;
- type = 0x0a;
-
-/* if(def1 < 1000000) {
- if(sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(sd->def_ratio_atk_ele_ & (1<<t_ele) || sd->def_ratio_atk_race_ & (1<<t_race)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- if(t_mode & 0x20) {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<10)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<10)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- else {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<11)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<11)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- }*/
+ type = DamageType::CRITICAL;
}
else
{
- int vitbonusmax;
+ int vitbonusmax;
if (atkmax > atkmin)
- damage += atkmin + MRAND ((atkmax - atkmin + 1));
+ damage += random_::in(atkmin, atkmax);
else
damage += atkmin;
if (atkmax_ > atkmin_)
- damage2 += atkmin_ + MRAND ((atkmax_ - atkmin_ + 1));
+ damage2 += random_::in(atkmin_, atkmax_);
else
damage2 += atkmin_;
if (sd->atk_rate != 100)
@@ -3008,562 +1503,24 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
if (sd->state.arrow_atk)
{
if (sd->arrow_atk > 0)
- damage += MRAND ((sd->arrow_atk + 1));
+ damage += random_::in(0, sd->arrow_atk);
hitrate += sd->arrow_hit;
}
- if (skill_num != MO_INVESTIGATE && def1 < 1000000)
- {
- if (sd->def_ratio_atk_ele & (1 << t_ele)
- || sd->def_ratio_atk_race & (1 << t_race))
- {
- damage = (damage * (def1 + def2)) / 100;
- idef_flag = 1;
- }
- if (sd->def_ratio_atk_ele_ & (1 << t_ele)
- || sd->def_ratio_atk_race_ & (1 << t_race))
- {
- damage2 = (damage2 * (def1 + def2)) / 100;
- idef_flag_ = 1;
- }
- if (t_mode & 0x20)
- {
- if (!idef_flag && sd->def_ratio_atk_race & (1 << 10))
- {
- damage = (damage * (def1 + def2)) / 100;
- idef_flag = 1;
- }
- if (!idef_flag_ && sd->def_ratio_atk_race_ & (1 << 10))
- {
- damage2 = (damage2 * (def1 + def2)) / 100;
- idef_flag_ = 1;
- }
- }
- else
- {
- if (!idef_flag && sd->def_ratio_atk_race & (1 << 11))
- {
- damage = (damage * (def1 + def2)) / 100;
- idef_flag = 1;
- }
- if (!idef_flag_ && sd->def_ratio_atk_race_ & (1 << 11))
- {
- damage2 = (damage2 * (def1 + def2)) / 100;
- idef_flag_ = 1;
- }
- }
- }
-
- // スキル修正1(攻撃力倍化系)
- // オーバートラスト(+5% 〜 +25%),他攻撃系スキルの場合ここで補正
- // バッシュ,マグナムブレイク,
- // ボーリングバッシュ,スピアブーメラン,ブランディッシュスピア,スピアスタッブ,
- // メマーナイト,カートレボリューション
- // ダブルストレイフィング,アローシャワー,チャージアロー,
- // ソニックブロー
- if (sc_data)
- { //状態異常中のダメージ追加
- if (sc_data[SC_OVERTHRUST].timer != -1)
- { // オーバートラスト
- damage += damage * (5 * sc_data[SC_OVERTHRUST].val1) / 100;
- damage2 += damage2 * (5 * sc_data[SC_OVERTHRUST].val1) / 100;
- }
- if (sc_data[SC_TRUESIGHT].timer != -1)
- { // トゥルーサイト
- damage += damage * (2 * sc_data[SC_TRUESIGHT].val1) / 100;
- damage2 += damage2 * (2 * sc_data[SC_TRUESIGHT].val1) / 100;
- }
- if (sc_data[SC_BERSERK].timer != -1)
- { // バーサーク
- damage += damage * 50 / 100;
- damage2 += damage2 * 50 / 100;
- }
- }
-
- if (skill_num > 0)
+ if (skill_num != SkillID::ZERO && skill_num != SkillID::NEGATIVE)
{
- int i;
- if ((i = skill_get_pl (skill_num)) > 0)
- s_ele = s_ele_ = i;
-
- 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;
- 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_;
- damage2 *= div_;
- break;
- case NPC_RANDOMATTACK: // ランダムATK攻撃
- damage = damage * (MPRAND (50, 150)) / 100;
- damage2 = damage2 * (MPRAND (50, 150)) / 100;
- break;
- // 属性攻撃(適当)
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_TELEKINESISATTACK:
- damage = damage * (100 + 25 * skill_lv) / 100;
- damage2 = damage2 * (100 + 25 * skill_lv) / 100;
- break;
- case NPC_GUIDEDATTACK:
- hitrate = 1000000;
- break;
- case NPC_RANGEATTACK:
- flag = (flag & ~BF_RANGEMASK) | BF_LONG;
- break;
- 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 hp, mhp, damage3;
- hp = battle_get_hp (src);
- 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;
+ flag = (flag & ~BF::SKILLMASK) | BF::SKILL;
}
- 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;
+ int t_def;
target_count =
- 1 + battle_counttargeted (target, src,
- battle_config.vit_penaly_count_lv);
+ 1 + battle_counttargeted(target, src,
+ ATK(battle_config.vit_penaly_count_lv)); // FIXME
if (battle_config.vit_penaly_type > 0)
{
if (target_count >= battle_config.vit_penaly_count)
@@ -3617,105 +1574,30 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
}
t_def = def2 * 8 / 10;
vitbonusmax = (t_vit / 20) * (t_vit / 20) - 1;
- if (sd->ignore_def_ele & (1 << t_ele)
- || sd->ignore_def_race & (1 << t_race))
- idef_flag = 1;
- if (sd->ignore_def_ele_ & (1 << t_ele)
- || sd->ignore_def_race_ & (1 << t_race))
- idef_flag_ = 1;
- if (t_mode & 0x20)
- {
- if (sd->ignore_def_race & (1 << 10))
- idef_flag = 1;
- if (sd->ignore_def_race_ & (1 << 10))
- idef_flag_ = 1;
- }
- else
- {
- if (sd->ignore_def_race & (1 << 11))
- idef_flag = 1;
- if (sd->ignore_def_race_ & (1 << 11))
- idef_flag_ = 1;
- }
- if (!idef_flag)
{
- if (battle_config.player_defense_type)
- {
- damage =
- damage -
- (def1 * battle_config.player_defense_type) -
- t_def -
- ((vitbonusmax <
- 1) ? 0 : MRAND ((vitbonusmax + 1)));
- }
- else
{
- damage =
- damage * (100 - def1) / 100 - t_def -
- ((vitbonusmax <
- 1) ? 0 : MRAND ((vitbonusmax + 1)));
+ damage = damage * (100 - def1) / 100;
+ damage -= t_def;
+ if (vitbonusmax > 0)
+ damage -= random_::in(0, vitbonusmax);
}
}
- if (!idef_flag_)
{
- if (battle_config.player_defense_type)
{
- damage2 =
- damage2 -
- (def1 * battle_config.player_defense_type) -
- t_def -
- ((vitbonusmax <
- 1) ? 0 : MRAND ((vitbonusmax + 1)));
- }
- else
- {
- damage2 =
- damage2 * (100 - def1) / 100 - t_def -
- ((vitbonusmax <
- 1) ? 0 : MRAND ((vitbonusmax + 1)));
+ damage2 = damage2 * (100 - def1) / 100;
+ damage2 -= t_def;
+ if (vitbonusmax > 0)
+ damage2 -= random_::in(0, vitbonusmax);
}
}
}
}
}
// 精錬ダメージの追加
- 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[8] >= 0)
- {
- int index = sd->equip_index[8];
- if (sd->inventory_data[index]
- && sd->inventory_data[index]->type == 5)
- {
- 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[9] >= 0)
- { //重量で追加ダメージらしいのでシールドブーメランを参考に追加
- int index = sd->equip_index[9];
- if (sd->inventory_data[index]
- && sd->inventory_data[index]->type == 4)
- {
- damage +=
- (int) (double) (sd->inventory_data[index]->weight *
- (0.8 * skill_lv * 4 / 10));
- damage +=
- sd->status.inventory[index].refine * pc_getrefinebonus (0,
- 1);
- }
- }
+ damage += battle_get_atk2(src);
+ damage2 += battle_get_atk_2(src);
}
// 0未満だった場合1に補正
@@ -3726,222 +1608,35 @@ static 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)
{
- if (MRAND (100) < sd->perfect_hit)
+ if (random_::chance({sd->perfect_hit, 100}))
hitrate = 1000000;
}
// 回避修正
hitrate = (hitrate < 5) ? 5 : hitrate;
- if (hitrate < 1000000 && // 必中攻撃
- (t_sc_data != NULL && (t_sc_data[SC_SLEEP].timer != -1 || // 睡眠は必中
- t_sc_data[SC_STAN].timer != -1 || // スタンは必中
- t_sc_data[SC_FREEZE].timer != -1 || (t_sc_data[SC_STONE].timer != -1 && t_sc_data[SC_STONE].val2 == 0)))) // 凍結は必中
- hitrate = 1000000;
- if (type == 0 && MRAND (100) >= hitrate)
+ if (type == DamageType::NORMAL && !random_::chance({hitrate, 100}))
{
damage = damage2 = 0;
- dmg_lv = ATK_FLEE;
- }
- else
- {
- 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;
- }
- }
-
-//スキルによるダメージ補正ここまで
-
-//カードによるダメージ追加処理ここから
- cardfix = 100;
- if (!sd->state.arrow_atk)
- { //弓矢以外
- if (!battle_config.left_cardfix_to_right)
- { //左手カード補正設定無し
- cardfix = cardfix * (100 + sd->addrace[t_race]) / 100; // 種族によるダメージ修正
- cardfix = cardfix * (100 + sd->addele[t_ele]) / 100; // 属性によるダメージ修正
- cardfix = cardfix * (100 + sd->addsize[t_size]) / 100; // サイズによるダメージ修正
- }
- else
- {
- cardfix = cardfix * (100 + sd->addrace[t_race] + sd->addrace_[t_race]) / 100; // 種族によるダメージ修正(左手による追加あり)
- cardfix = cardfix * (100 + sd->addele[t_ele] + sd->addele_[t_ele]) / 100; // 属性によるダメージ修正(左手による追加あり)
- cardfix = cardfix * (100 + sd->addsize[t_size] + sd->addsize_[t_size]) / 100; // サイズによるダメージ修正(左手による追加あり)
- }
+ dmg_lv = ATK::FLEE;
}
else
- { //弓矢
- cardfix = cardfix * (100 + sd->addrace[t_race] + sd->arrow_addrace[t_race]) / 100; // 種族によるダメージ修正(弓矢による追加あり)
- cardfix = cardfix * (100 + sd->addele[t_ele] + sd->arrow_addele[t_ele]) / 100; // 属性によるダメージ修正(弓矢による追加あり)
- cardfix = cardfix * (100 + sd->addsize[t_size] + sd->arrow_addsize[t_size]) / 100; // サイズによるダメージ修正(弓矢による追加あり)
- }
- if (t_mode & 0x20)
- { //ボス
- if (!sd->state.arrow_atk)
- { //弓矢攻撃以外なら
- if (!battle_config.left_cardfix_to_right) //左手カード補正設定無し
- cardfix = cardfix * (100 + sd->addrace[10]) / 100; //ボスモンスターに追加ダメージ
- else //左手カード補正設定あり
- cardfix = cardfix * (100 + sd->addrace[10] + sd->addrace_[10]) / 100; //ボスモンスターに追加ダメージ(左手による追加あり)
- }
- else //弓矢攻撃
- cardfix = cardfix * (100 + sd->addrace[10] + sd->arrow_addrace[10]) / 100; //ボスモンスターに追加ダメージ(弓矢による追加あり)
- }
- else
- { //ボスじゃない
- if (!sd->state.arrow_atk)
- { //弓矢攻撃以外
- if (!battle_config.left_cardfix_to_right) //左手カード補正設定無し
- cardfix = cardfix * (100 + sd->addrace[11]) / 100; //ボス以外モンスターに追加ダメージ
- else //左手カード補正設定あり
- cardfix = cardfix * (100 + sd->addrace[11] + sd->addrace_[11]) / 100; //ボス以外モンスターに追加ダメージ(左手による追加あり)
- }
- else
- cardfix = cardfix * (100 + sd->addrace[11] + sd->arrow_addrace[11]) / 100; //ボス以外モンスターに追加ダメージ(弓矢による追加あり)
- }
- //特定Class用補正処理(少女の日記→ボンゴン用?)
- t_class = battle_get_class (target);
- for (i = 0; i < sd->add_damage_class_count; i++)
{
- if (sd->add_damage_classid[i] == t_class)
- {
- cardfix = cardfix * (100 + sd->add_damage_classrate[i]) / 100;
- break;
- }
+ dmg_lv = ATK::DEF;
}
- if (skill_num != CR_GRANDCROSS || !battle_config.gx_cardfix)
- damage = damage * cardfix / 100; //カード補正によるダメージ増加
-//カードによるダメージ増加処理ここまで
-
-//カードによるダメージ追加処理(左手)ここから
- cardfix = 100;
- if (!battle_config.left_cardfix_to_right)
- { //左手カード補正設定無し
- cardfix = cardfix * (100 + sd->addrace_[t_race]) / 100; // 種族によるダメージ修正左手
- cardfix = cardfix * (100 + sd->addele_[t_ele]) / 100; // 属 性によるダメージ修正左手
- cardfix = cardfix * (100 + sd->addsize_[t_size]) / 100; // サイズによるダメージ修正左手
- if (t_mode & 0x20) //ボス
- cardfix = cardfix * (100 + sd->addrace_[10]) / 100; //ボスモンスターに追加ダメージ左手
- else
- cardfix = cardfix * (100 + sd->addrace_[11]) / 100; //ボス以外モンスターに追加ダメージ左手
- }
- //特定Class用補正処理左手(少女の日記→ボンゴン用?)
- for (i = 0; i < sd->add_damage_class_count_; i++)
- {
- if (sd->add_damage_classid_[i] == t_class)
- {
- cardfix = cardfix * (100 + sd->add_damage_classrate_[i]) / 100;
- break;
- }
- }
- if (skill_num != CR_GRANDCROSS)
- damage2 = damage2 * cardfix / 100; //カード補正による左手ダメージ増加
-//カードによるダメージ増加処理(左手)ここまで
-
-// -- moonsoul (cardfix for magic damage portion of ASC_BREAKER)
- if (skill_num == ASC_BREAKER)
- damage3 = damage3 * cardfix / 100;
-
-//カードによるダメージ減衰処理ここから
- if (tsd)
- { //対象がPCの場合
- cardfix = 100;
- cardfix = cardfix * (100 - tsd->subrace[s_race]) / 100; // 種族によるダメージ耐性
- cardfix = cardfix * (100 - tsd->subele[s_ele]) / 100; // 属性によるダメージ耐性
- if (battle_get_mode (src) & 0x20)
- cardfix = cardfix * (100 - tsd->subrace[10]) / 100; //ボスからの攻撃はダメージ減少
- else
- cardfix = cardfix * (100 - tsd->subrace[11]) / 100; //ボス以外からの攻撃はダメージ減少
- //特定Class用補正処理左手(少女の日記→ボンゴン用?)
- for (i = 0; i < tsd->add_def_class_count; i++)
- {
- if (tsd->add_def_classid[i] == sd->status.pc_class)
- {
- cardfix = cardfix * (100 - tsd->add_def_classrate[i]) / 100;
- break;
- }
- }
- if (flag & BF_LONG)
- cardfix = cardfix * (100 - tsd->long_attack_def_rate) / 100; //遠距離攻撃はダメージ減少(ホルンCとか)
- if (flag & BF_SHORT)
- cardfix = cardfix * (100 - tsd->near_attack_def_rate) / 100; //近距離攻撃はダメージ減少(該当無し?)
- damage = damage * cardfix / 100; //カード補正によるダメージ減少
- damage2 = damage2 * cardfix / 100; //カード補正による左手ダメージ減少
- }
-//カードによるダメージ減衰処理ここまで
-
-//対象にステータス異常がある場合のダメージ減算処理ここから
- if (t_sc_data)
- {
- cardfix = 100;
- if (t_sc_data[SC_DEFENDER].timer != -1 && flag & BF_LONG) //ディフェンダー状態で遠距離攻撃
- cardfix = cardfix * (100 - t_sc_data[SC_DEFENDER].val2) / 100; //ディフェンダーによる減衰
- if (cardfix != 100)
- {
- damage = damage * cardfix / 100; //ディフェンダー補正によるダメージ減少
- damage2 = damage2 * cardfix / 100; //ディフェンダー補正による左手ダメージ減少
- }
- if (t_sc_data[SC_ASSUMPTIO].timer != -1)
- { //アスムプティオ
- if (!map[target->m].flag.pvp)
- {
- damage = damage / 3;
- damage2 = damage2 / 3;
- }
- else
- {
- damage = damage / 2;
- damage2 = damage2 / 2;
- }
- }
- }
-//対象にステータス異常がある場合のダメージ減算処理ここまで
if (damage < 0)
damage = 0;
if (damage2 < 0)
damage2 = 0;
- // 属 性の適用
- damage = battle_attr_fix (damage, s_ele, battle_get_element (target));
- damage2 = battle_attr_fix (damage2, s_ele_, battle_get_element (target));
-
// 星のかけら、気球の適用
damage += sd->star;
damage2 += sd->star_;
- damage += sd->spiritball * 3;
- damage2 += sd->spiritball * 3;
-
- if (sc_data && sc_data[SC_AURABLADE].timer != -1)
- { /* オーラブレード 必中 */
- 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)追加して
@@ -3950,23 +1645,22 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
// pc_calcstatus()でデータを入力しています
//左手のみ武器装備
- if (sd->weapontype1 == 0 && sd->weapontype2 > 0)
+ if (sd->weapontype1 == ItemLook::NONE
+ && sd->weapontype2 != ItemLook::NONE)
{
damage = damage2;
damage2 = 0;
}
// 右手、左手修練の適用
- if (sd->status.weapon > 16)
+ if (sd->status.weapon >= ItemLook::SINGLE_HANDED_COUNT)
{ // 二刀流か?
- int dmg = damage, dmg2 = damage2;
+ int dmg = damage, dmg2 = damage2;
// 右手修練(60% 〜 100%) 右手全般
- skill = pc_checkskill (sd, AS_RIGHT);
- damage = damage * (50 + (skill * 10)) / 100;
+ 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;
+ damage2 = damage2 * 30 / 100;
if (dmg2 > 0 && damage2 < 1)
damage2 = 1;
}
@@ -3974,57 +1668,44 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
damage2 = 0;
// 右手,短剣のみ
- if (da == 1)
+ if (da)
{ //ダブルアタックが発動しているか
div_ = 2;
damage += damage;
- type = 0x08;
+ type = DamageType::DOUBLED;
}
- if (sd->status.weapon == 16)
+ if (sd->status.weapon == ItemLook::_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 == 0 && skill_lv >= 0 && tsd != NULL && div_ < 255
- && MRAND (1000) < battle_get_flee2 (target))
+ if (skill_num == SkillID::ZERO && skill_lv >= 0 && tsd != NULL && div_ < 255
+ && random_::chance({battle_get_flee2(target), 1000}))
{
damage = damage2 = 0;
- type = 0x0b;
- dmg_lv = ATK_LUCKY;
+ type = DamageType::FLEE2;
+ dmg_lv = ATK::LUCKY;
}
// 対象が完全回避をする設定がONなら
if (battle_config.enemy_perfect_flee)
{
- if (skill_num == 0 && skill_lv >= 0 && tmd != NULL && div_ < 255
- && MRAND (1000) < battle_get_flee2 (target))
+ if (skill_num == SkillID::ZERO && skill_lv >= 0 && tmd != NULL && div_ < 255
+ && random_::chance({battle_get_flee2(target), 1000}))
{
damage = damage2 = 0;
- type = 0x0b;
- dmg_lv = ATK_LUCKY;
+ type = DamageType::FLEE2;
+ dmg_lv = ATK::LUCKY;
}
}
//MobのModeに頑強フラグが立っているときの処理
- if (t_mode & 0x40)
+ if (bool(t_mode & MobMode::PLANT))
{
if (damage > 0)
damage = 1;
@@ -4032,26 +1713,21 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
damage2 = 1;
}
- //bNoWeaponDamage(設定アイテム無し?)でグランドクロスじゃない場合はダメージが0
- if (tsd && tsd->special_state.no_weapon_damage
- && skill_num != CR_GRANDCROSS)
- damage = damage2 = 0;
-
- if (skill_num != CR_GRANDCROSS && (damage > 0 || damage2 > 0))
+ if (damage > 0 || damage2 > 0)
{
if (damage2 < 1) // ダメージ最終修正
damage =
- battle_calc_damage (src, target, damage, div_, skill_num,
+ battle_calc_damage(src, target, damage, div_, skill_num,
skill_lv, flag);
else if (damage < 1) // 右手がミス?
damage2 =
- battle_calc_damage (src, target, damage2, div_, skill_num,
+ battle_calc_damage(src, target, damage2, div_, skill_num,
skill_lv, flag);
else
{ // 両 手/カタールの場合はちょっと計算ややこしい
- int d1 = damage + damage2, d2 = damage2;
+ int d1 = damage + damage2, d2 = damage2;
damage =
- battle_calc_damage (src, target, damage + damage2, div_,
+ battle_calc_damage(src, target, damage + damage2, div_,
skill_num, skill_lv, flag);
damage2 = (d2 * 100 / d1) * damage / 100;
if (damage > 1 && damage2 < 1)
@@ -4060,36 +1736,12 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
}
}
- /* For executioner card [Valaris] */
- if (src->type == BL_PC && sd->random_attack_increase_add > 0
- && sd->random_attack_increase_per > 0 && skill_num == 0)
- {
- if (MRAND (100) < sd->random_attack_increase_per)
- {
- if (damage > 0)
- damage *= sd->random_attack_increase_add / 100;
- if (damage2 > 0)
- damage2 *= sd->random_attack_increase_add / 100;
- }
- }
- /* 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.amotion = battle_get_amotion(src);
+ wd.dmotion = battle_get_dmotion(target);
wd.flag = flag;
wd.dmg_lv = dmg_lv;
@@ -4100,77 +1752,21 @@ static struct Damage battle_calc_pc_weapon_attack (struct block_list *src,
* 武器ダメージ計算
*------------------------------------------
*/
-struct Damage battle_calc_weapon_attack (struct block_list *src,
+static
+struct Damage battle_calc_weapon_attack(struct block_list *src,
struct block_list *target,
- int skill_num, int skill_lv,
+ SkillID skill_num, int skill_lv,
int wflag)
{
- struct Damage wd;
+ struct Damage wd {};
- //return前の処理があるので情報出力部のみ変更
- if (src == NULL || target == NULL)
- {
- nullpo_info (NLP_MARK);
- memset (&wd, 0, sizeof (wd));
- return wd;
- }
+ nullpo_retr(wd, src);
+ nullpo_retr(wd, target);
- else if (src->type == BL_PC)
- wd = battle_calc_pc_weapon_attack (src, target, skill_num, skill_lv, wflag); // weapon breaking [Valaris]
- else if (src->type == BL_MOB)
- wd = battle_calc_mob_weapon_attack (src, target, skill_num, skill_lv,
- wflag);
- else
- memset (&wd, 0, sizeof (wd));
-
- if (battle_config.equipment_breaking && src->type == BL_PC
- && (wd.damage > 0 || wd.damage2 > 0))
- {
- struct map_session_data *sd = (struct map_session_data *) src;
- if (sd->status.weapon && sd->status.weapon != 11)
- {
- int breakrate = 1;
- if (target->type == BL_PC && sd->sc_data[SC_MELTDOWN].timer != -1)
- {
- breakrate += 100 * sd->sc_data[SC_MELTDOWN].val1;
- if (MRAND (10000) <
- breakrate * battle_config.equipment_break_rate / 100
- || breakrate >= 10000)
- pc_breakweapon ((struct map_session_data *) target);
- }
- if (sd->sc_data[SC_OVERTHRUST].timer != -1)
- breakrate += 20 * sd->sc_data[SC_OVERTHRUST].val1;
- if (wd.type == 0x0a)
- breakrate *= 2;
- if (MRAND (10000) <
- breakrate * battle_config.equipment_break_rate / 100
- || breakrate >= 10000)
- {
- pc_breakweapon (sd);
- memset (&wd, 0, sizeof (wd));
- }
- }
- }
-
- if (battle_config.equipment_breaking && target->type == BL_PC
- && (wd.damage > 0 || wd.damage2 > 0))
- {
- int breakrate = 1;
- if (src->type == BL_PC
- && ((struct map_session_data *) src)->
- sc_data[SC_MELTDOWN].timer != -1)
- breakrate +=
- 70 *
- ((struct map_session_data *) src)->sc_data[SC_MELTDOWN].val1;
- if (wd.type == 0x0a)
- breakrate *= 2;
- if (MRAND (10000) <
- breakrate * battle_config.equipment_break_rate / 100
- || breakrate >= 10000)
- {
- pc_breakarmor ((struct map_session_data *) target);
- }
- }
+ if (src->type == BL::PC)
+ wd = battle_calc_pc_weapon_attack(src, target, skill_num, skill_lv, wflag); // weapon breaking [Valaris]
+ else if (src->type == BL::MOB)
+ wd = battle_calc_mob_weapon_attack(src, target, skill_num, skill_lv, wflag);
return wd;
}
@@ -4179,223 +1775,50 @@ struct Damage battle_calc_weapon_attack (struct block_list *src,
* 魔法ダメージ計算
*------------------------------------------
*/
-struct Damage battle_calc_magic_attack (struct block_list *bl,
+static
+struct Damage battle_calc_magic_attack(struct block_list *bl,
struct block_list *target,
- int 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);
- int matk1, matk2, damage = 0, div_ = 1, blewcount =
- skill_get_blewcount (skill_num, skill_lv), rdamage = 0;
- struct Damage md;
- int aflag;
- int normalmagic_flag = 1;
- int ele = 0, race = 7, t_ele = 0, t_race = 7, t_mode =
- 0, cardfix, t_class, i;
- struct map_session_data *sd = NULL, *tsd = NULL;
- struct mob_data *tmd = NULL;
-
- //return前の処理があるので情報出力部のみ変更
- if (bl == NULL || target == NULL)
- {
- nullpo_info (NLP_MARK);
- memset (&md, 0, sizeof (md));
- return md;
- }
+ int mdef1 = battle_get_mdef(target);
+ int mdef2 = battle_get_mdef2(target);
+ int matk1, matk2, damage = 0, div_ = 1;
+ struct Damage md {};
+ int normalmagic_flag = 1;
+ struct map_session_data *sd = NULL;
- matk1 = battle_get_matk1 (bl);
- matk2 = battle_get_matk2 (bl);
- ele = skill_get_pl (skill_num);
- race = battle_get_race (bl);
- t_ele = battle_get_elem_type (target);
- t_race = battle_get_race (target);
- t_mode = battle_get_mode (target);
+ nullpo_retr(md, bl);
+ nullpo_retr(md, target);
-#define MATK_FIX( a,b ) { matk1=matk1*(a)/(b); matk2=matk2*(a)/(b); }
+ matk1 = battle_get_matk1(bl);
+ matk2 = battle_get_matk2(bl);
+ MobMode t_mode = battle_get_mode(target);
- if (bl->type == BL_PC && (sd = (struct map_session_data *) bl))
+ if (bl->type == BL::PC && (sd = (struct map_session_data *) bl))
{
- sd->state.attack_type = BF_MAGIC;
+ sd->state.attack_type = BF::MAGIC;
if (sd->matk_rate != 100)
- MATK_FIX (sd->matk_rate, 100);
+ {
+ matk1 = matk1 * sd->matk_rate / 100;
+ matk2 = matk2 * sd->matk_rate / 100;
+ }
sd->state.arrow_atk = 0;
}
- if (target->type == BL_PC)
- tsd = (struct map_session_data *) target;
- else if (target->type == BL_MOB)
- tmd = (struct mob_data *) target;
-
- aflag = BF_MAGIC | BF_LONG | BF_SKILL;
-
- if (skill_num > 0)
- {
- switch (skill_num)
- { // 基本ダメージ計算(スキルごとに処理)
- // ヒール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;
- }
- }
+ BF aflag = BF::MAGIC | BF::LONG | BF::SKILL;
if (normalmagic_flag)
- { // 一般魔法ダメージ計算
- int imdef_flag = 0;
+ {
+ // 一般魔法ダメージ計算
if (matk1 > matk2)
- damage = matk2 + MRAND ((matk1 - matk2 + 1));
+ damage = random_::in(matk2, matk1);
else
damage = matk2;
- if (sd)
- {
- 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)
- {
- damage =
- damage - (mdef1 * battle_config.magic_defense_type) -
- mdef2;
- }
- else
{
- damage = (damage * (100 - mdef1)) / 100 - mdef2;
+ damage = (damage * (100 - mdef1)) / 100;
+ damage -= mdef2;
}
}
@@ -4403,108 +1826,26 @@ struct Damage battle_calc_magic_attack (struct block_list *bl,
damage = 1;
}
- if (sd)
- {
- cardfix = 100;
- cardfix = cardfix * (100 + sd->magic_addrace[t_race]) / 100;
- cardfix = cardfix * (100 + sd->magic_addele[t_ele]) / 100;
- if (t_mode & 0x20)
- cardfix = cardfix * (100 + sd->magic_addrace[10]) / 100;
- else
- cardfix = cardfix * (100 + sd->magic_addrace[11]) / 100;
- t_class = battle_get_class (target);
- for (i = 0; i < sd->add_magic_damage_class_count; i++)
- {
- if (sd->add_magic_damage_classid[i] == t_class)
- {
- cardfix =
- cardfix * (100 + sd->add_magic_damage_classrate[i]) / 100;
- break;
- }
- }
- damage = damage * cardfix / 100;
- }
-
- if (tsd)
- {
- int s_class = battle_get_class (bl);
- cardfix = 100;
- cardfix = cardfix * (100 - tsd->subele[ele]) / 100; // 属 性によるダメージ耐性
- cardfix = cardfix * (100 - tsd->subrace[race]) / 100; // 種族によるダメージ耐性
- cardfix = cardfix * (100 - tsd->magic_subrace[race]) / 100;
- if (battle_get_mode (bl) & 0x20)
- cardfix = cardfix * (100 - tsd->magic_subrace[10]) / 100;
- else
- cardfix = cardfix * (100 - tsd->magic_subrace[11]) / 100;
- for (i = 0; i < tsd->add_mdef_class_count; i++)
- {
- if (tsd->add_mdef_classid[i] == s_class)
- {
- cardfix = cardfix * (100 - tsd->add_mdef_classrate[i]) / 100;
- break;
- }
- }
- cardfix = cardfix * (100 - tsd->magic_def_rate) / 100;
- damage = damage * cardfix / 100;
- }
if (damage < 0)
damage = 0;
- 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);
+ 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)
- if (t_mode & 0x40 && damage > 0)
+ if (bool(t_mode & MobMode::PLANT) && damage > 0)
damage = 1;
- if (tsd && tsd->special_state.no_magic_damage)
- {
- if (battle_config.gtb_pvp_only != 0)
- { // [MouseJstr]
- if ((map[target->m].flag.pvp || map[target->m].flag.gvg)
- && target->type == BL_PC)
- damage = (damage * (100 - battle_config.gtb_pvp_only)) / 100;
- }
- else
- damage = 0; // 黄 金蟲カード(魔法ダメージ0)
- }
-
- damage = battle_calc_damage (bl, target, damage, div_, skill_num, skill_lv, aflag); // 最終修正
-
- /* magic_damage_return by [AppleGirl] and [Valaris] */
- if (target->type == BL_PC && tsd && tsd->magic_damage_return > 0)
- {
- rdamage += damage * tsd->magic_damage_return / 100;
- if (rdamage < 1)
- rdamage = 1;
- clif_damage (target, bl, gettick (), 0, 0, rdamage, 0, 0, 0);
- battle_damage (target, bl, rdamage, 0);
- }
- /* end magic_damage_return */
+ damage = battle_calc_damage(bl, target, damage, div_, skill_num, skill_lv, aflag); // 最終修正
md.damage = damage;
md.div_ = div_;
- md.amotion = battle_get_amotion (bl);
- md.dmotion = battle_get_dmotion (target);
+ md.amotion = battle_get_amotion(bl);
+ md.dmotion = battle_get_dmotion(target);
md.damage2 = 0;
- md.type = 0;
- md.blewcount = blewcount;
+ md.type = DamageType::NORMAL;
md.flag = aflag;
return md;
@@ -4514,153 +1855,61 @@ struct Damage battle_calc_magic_attack (struct block_list *bl,
* その他ダメージ計算
*------------------------------------------
*/
-struct Damage battle_calc_misc_attack (struct block_list *bl,
+static
+struct Damage battle_calc_misc_attack(struct block_list *bl,
struct block_list *target,
- int 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;
- struct map_session_data *sd = NULL, *tsd = NULL;
- int damage = 0, div_ = 1, blewcount =
- skill_get_blewcount (skill_num, skill_lv);
- struct Damage md;
- int damagefix = 1;
-
- int aflag = BF_MISC | BF_LONG | BF_SKILL;
-
- //return前の処理があるので情報出力部のみ変更
- if (bl == NULL || target == NULL)
- {
- nullpo_info (NLP_MARK);
- memset (&md, 0, sizeof (md));
- return md;
- }
+ struct map_session_data *sd = NULL;
+ int damage = 0, div_ = 1;
+ struct Damage md {};
+ int damagefix = 1;
+
+ BF aflag = BF::MISC | BF::LONG | BF::SKILL;
+
+ nullpo_retr(md, bl);
+ nullpo_retr(md, target);
- if (bl->type == BL_PC && (sd = (struct map_session_data *) bl))
+ if (bl->type == BL::PC && (sd = (struct map_session_data *) bl))
{
- sd->state.attack_type = BF_MISC;
+ sd->state.attack_type = BF::MISC;
sd->state.arrow_atk = 0;
}
- if (target->type == BL_PC)
- tsd = (struct map_session_data *) target;
-
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;
- break;
-
- case NPC_SMOKING: // タバコを吸う
- damage = 3;
+ case SkillID::NPC_SELFDESTRUCTION: // 自爆
+ damage = battle_get_hp(bl) - (bl == target ? 1 : 0);
damagefix = 0;
break;
-
- case NPC_DARKBREATH:
- {
- struct status_change *sc_data = battle_get_sc_data (target);
- int hitrate =
- battle_get_hit (bl) - battle_get_flee (target) + 80;
- hitrate = ((hitrate > 95) ? 95 : ((hitrate < 5) ? 5 : hitrate));
- if (sc_data
- && (sc_data[SC_SLEEP].timer != -1
- || sc_data[SC_STAN].timer != -1
- || sc_data[SC_FREEZE].timer != -1
- || (sc_data[SC_STONE].timer != -1
- && sc_data[SC_STONE].val2 == 0)))
- hitrate = 1000000;
- if (MRAND (100) < hitrate)
- {
- damage = 500 + (skill_lv - 1) * 1000 + MRAND (1000);
- if (damage > 9999)
- damage = 9999;
- }
- }
- 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);
- race = battle_get_race (bl);
-
if (damagefix)
{
- if (damage < 1 && skill_num != NPC_DARKBREATH)
+ if (damage < 1)
damage = 1;
-
- if (tsd)
- {
- cardfix = 100;
- cardfix = cardfix * (100 - tsd->subele[ele]) / 100; // 属性によるダメージ耐性
- cardfix = cardfix * (100 - tsd->subrace[race]) / 100; // 種族によるダメージ耐性
- cardfix = cardfix * (100 - tsd->misc_def_rate) / 100;
- damage = damage * cardfix / 100;
- }
- if (damage < 0)
- damage = 0;
- damage = battle_attr_fix (damage, ele, battle_get_element (target)); // 属性修正
}
- div_ = skill_get_num (skill_num, skill_lv);
+ div_ = skill_get_num(skill_num, skill_lv);
if (div_ > 1)
damage *= div_;
if (damage > 0
&& (damage < div_
- || (battle_get_def (target) >= 1000000
- && battle_get_mdef (target) >= 1000000)))
+ || (battle_get_def(target) >= 1000000
+ && battle_get_mdef(target) >= 1000000)))
{
damage = div_;
}
- damage = battle_calc_damage (bl, target, damage, div_, skill_num, skill_lv, aflag); // 最終修正
+ damage = battle_calc_damage(bl, target, damage, div_, skill_num, skill_lv, aflag); // 最終修正
md.damage = damage;
md.div_ = div_;
- md.amotion = battle_get_amotion (bl);
- md.dmotion = battle_get_dmotion (target);
+ md.amotion = battle_get_amotion(bl);
+ md.dmotion = battle_get_dmotion(target);
md.damage2 = 0;
- md.type = 0;
- md.blewcount = blewcount;
+ md.type = DamageType::NORMAL;
md.flag = aflag;
return md;
@@ -4670,28 +1919,28 @@ struct Damage battle_calc_misc_attack (struct block_list *bl,
* ダメージ計算一括処理用
*------------------------------------------
*/
-struct Damage battle_calc_attack (int attack_type,
+struct Damage battle_calc_attack(BF attack_type,
struct block_list *bl,
- struct block_list *target, int skill_num,
+ struct block_list *target, SkillID skill_num,
int skill_lv, int flag)
{
struct Damage d;
- memset (&d, 0, sizeof (d));
+ memset(&d, 0, sizeof(d));
switch (attack_type)
{
- case BF_WEAPON:
- return battle_calc_weapon_attack (bl, target, skill_num, skill_lv,
+ case BF::WEAPON:
+ return battle_calc_weapon_attack(bl, target, skill_num, skill_lv,
flag);
- case BF_MAGIC:
- return battle_calc_magic_attack (bl, target, skill_num, skill_lv,
+ case BF::MAGIC:
+ return battle_calc_magic_attack(bl, target, skill_num, skill_lv,
flag);
- case BF_MISC:
- return battle_calc_misc_attack (bl, target, skill_num, skill_lv,
+ case BF::MISC:
+ return battle_calc_misc_attack(bl, target, skill_num, skill_lv,
flag);
default:
if (battle_config.error_log)
- printf ("battle_calc_attack: unknwon attack type ! %d\n",
+ PRINTF("battle_calc_attack: unknwon attack type ! %d\n",
attack_type);
break;
}
@@ -4702,550 +1951,220 @@ struct Damage battle_calc_attack (int attack_type,
* 通常攻撃処理まとめ
*------------------------------------------
*/
-int battle_weapon_attack (struct block_list *src, struct block_list *target,
- unsigned int tick, int flag)
+ATK battle_weapon_attack(struct block_list *src, struct block_list *target,
+ tick_t tick)
{
struct map_session_data *sd = NULL;
- struct status_change *sc_data = battle_get_sc_data (src), *t_sc_data =
- battle_get_sc_data (target);
- short *opt1;
- int race = 7, ele = 0;
- int damage, rdamage = 0;
+ eptr<struct status_change, StatusChange> t_sc_data = battle_get_sc_data(target);
struct Damage wd;
- nullpo_retr (0, src);
- nullpo_retr (0, target);
+ nullpo_retr(ATK::ZERO, src);
+ nullpo_retr(ATK::ZERO, target);
- if (src->type == BL_PC)
+ if (src->type == BL::PC)
sd = (struct map_session_data *) src;
if (src->prev == NULL || target->prev == NULL)
- return 0;
- if (src->type == BL_PC && pc_isdead (sd))
- return 0;
- if (target->type == BL_PC
- && pc_isdead ((struct map_session_data *) target))
- return 0;
+ return ATK::ZERO;
+ if (src->type == BL::PC && pc_isdead(sd))
+ return ATK::ZERO;
+ if (target->type == BL::PC
+ && pc_isdead((struct map_session_data *) target))
+ return ATK::ZERO;
- opt1 = battle_get_opt1 (src);
- if (opt1 && *opt1 > 0)
+ Opt1 *opt1 = battle_get_opt1(src);
+ if (opt1 != NULL && bool(*opt1))
{
- battle_stopattack (src);
- return 0;
- }
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- {
- battle_stopattack (src);
- return 0;
+ battle_stopattack(src);
+ return ATK::ZERO;
}
- race = battle_get_race (target);
- ele = battle_get_elem_type (target);
- if (battle_check_target (src, target, BCT_ENEMY) > 0 &&
- battle_check_range (src, target, 0))
+ if (battle_check_target(src, target, BCT_ENEMY) > 0 &&
+ battle_check_range(src, target, 0))
{
// 攻撃対象となりうるので攻撃
- if (sd && sd->status.weapon == 11)
+ if (sd && sd->status.weapon == ItemLook::BOW)
{
- if (sd->equip_index[10] >= 0)
+ if (sd->equip_index[EQUIP::ARROW] >= 0)
{
if (battle_config.arrow_decrement)
- pc_delitem (sd, sd->equip_index[10], 1, 0);
+ pc_delitem(sd, sd->equip_index[EQUIP::ARROW], 1, 0);
}
else
{
- clif_arrow_fail (sd, 0);
- return 0;
+ clif_arrow_fail(sd, 0);
+ return ATK::ZERO;
}
}
- if (flag & 0x8000)
- {
- 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 & 0xff, 0);
- }
- else
- wd = battle_calc_weapon_attack (src, target, 0, 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))
+ if (wd.damage > 0 && t_sc_data[StatusChange::SC_HASTE].timer)
{
- wd.damage = (wd.damage * (16 + t_sc_data[SC_HASTE].val1)) >> 4;
+ wd.damage = (wd.damage * (16 + t_sc_data[StatusChange::SC_HASTE].val1)) >> 4;
}
if (wd.damage > 0
- && t_sc_data[SC_PHYS_SHIELD].timer != -1 && target->type == BL_PC)
+ && t_sc_data[StatusChange::SC_PHYS_SHIELD].timer
+ && target->type == BL::PC)
{
- int reduction = t_sc_data[SC_PHYS_SHIELD].val1;
+ int reduction = t_sc_data[StatusChange::SC_PHYS_SHIELD].val1;
if (reduction > wd.damage)
reduction = wd.damage;
wd.damage -= reduction;
- MAP_LOG_PC (((struct map_session_data *) target),
+ MAP_LOG_PC(((struct map_session_data *) target),
"MAGIC-ABSORB-DMG %d", reduction);
}
- if ((damage = wd.damage + wd.damage2) > 0 && src != target)
- {
- if (wd.flag & BF_SHORT)
- {
- if (target->type == BL_PC)
- {
- struct map_session_data *tsd =
- (struct map_session_data *) target;
- if (tsd && tsd->short_weapon_damage_return > 0)
- {
- rdamage +=
- damage * tsd->short_weapon_damage_return / 100;
- if (rdamage < 1)
- rdamage = 1;
- }
- }
- if (t_sc_data && t_sc_data[SC_REFLECTSHIELD].timer != -1)
- {
- rdamage +=
- damage * t_sc_data[SC_REFLECTSHIELD].val2 / 100;
- if (rdamage < 1)
- rdamage = 1;
- }
- }
- else if (wd.flag & BF_LONG)
- {
- if (target->type == BL_PC)
- {
- struct map_session_data *tsd =
- (struct map_session_data *) target;
- if (tsd && tsd->long_weapon_damage_return > 0)
- {
- rdamage +=
- damage * tsd->long_weapon_damage_return / 100;
- if (rdamage < 1)
- rdamage = 1;
- }
- }
- }
-
- if (rdamage > 0)
- 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, MO_TRIPLEATTACK,
- skilllv, 0, 0, delay, 0);
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay (src, 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,
+ clif_damage(src, target, tick, wd.amotion, wd.dmotion,
wd.damage, wd.div_, wd.type, wd.damage2);
- //二刀流左手とカタール追撃のミス表示(無理やり〜)
- if (sd && sd->status.weapon >= 16 && wd.damage2 == 0)
- clif_damage (src, target, tick + 10, wd.amotion, wd.dmotion,
- 0, 1, 0, 0);
+ if (sd
+ && (sd->status.weapon == ItemLook::_16
+ || sd->status.weapon >= ItemLook::SINGLE_HANDED_COUNT)
+ && wd.damage2 == 0)
+ clif_damage(src, target, tick + std::chrono::milliseconds(10),
+ wd.amotion, wd.dmotion, 0, 1, DamageType::NORMAL, 0);
}
- if (sd && sd->splash_range > 0 && (wd.damage > 0 || wd.damage2 > 0))
- skill_castend_damage_id (src, target, 0, -1, tick, 0);
- map_freeblock_lock ();
- if (src->type == BL_PC)
+ map_freeblock_lock();
+
+ if (src->type == BL::PC)
{
- int weapon_index = sd->equip_index[9];
- int weapon = 0;
+ int weapon_index = sd->equip_index[EQUIP::WEAPON];
+ int weapon = 0;
if (sd->inventory_data[weapon_index]
- && sd->status.inventory[weapon_index].equip & 0x2)
+ && bool(sd->status.inventory[weapon_index].equip & EPOS::WEAPON))
weapon = sd->inventory_data[weapon_index]->nameid;
- MAP_LOG ("PC%d %d:%d,%d WPNDMG %s%d %d FOR %d WPN %d",
+ MAP_LOG("PC%d %d:%d,%d WPNDMG %s%d %d FOR %d WPN %d",
sd->status.char_id, src->m, src->x, src->y,
- (target->type == BL_PC) ? "PC" : "MOB",
+ (target->type == BL::PC) ? "PC" : "MOB",
(target->type ==
- BL_PC) ? ((struct map_session_data *) target)->
+ BL::PC) ? ((struct map_session_data *) target)->
status.char_id : target->id,
- (target->type ==
- BL_PC) ? 0 : ((struct mob_data *) target)->mob_class,
+ battle_get_class(target),
wd.damage + wd.damage2, weapon);
}
- if (target->type == BL_PC)
+ if (target->type == BL::PC)
{
struct map_session_data *sd2 = (struct map_session_data *) target;
- MAP_LOG ("PC%d %d:%d,%d WPNINJURY %s%d %d FOR %d",
+ MAP_LOG("PC%d %d:%d,%d WPNINJURY %s%d %d FOR %d",
sd2->status.char_id, target->m, target->x, target->y,
- (src->type == BL_PC) ? "PC" : "MOB",
- (src->type ==
- BL_PC) ? ((struct map_session_data *) src)->
- status.char_id : src->id,
- (src->type ==
- BL_PC) ? 0 : ((struct mob_data *) src)->mob_class,
+ (src->type == BL::PC) ? "PC" : "MOB",
+ (src->type == BL::PC)
+ ? ((struct map_session_data *) src)->status.char_id
+ : src->id,
+ battle_get_class(src),
wd.damage + wd.damage2);
}
- battle_damage (src, target, (wd.damage + wd.damage2), 0);
+ battle_damage(src, target, (wd.damage + wd.damage2), 0);
if (target->prev != NULL &&
- (target->type != BL_PC
- || (target->type == BL_PC
- && !pc_isdead ((struct map_session_data *) target))))
+ (target->type != BL::PC
+ || (target->type == BL::PC
+ && !pc_isdead((struct map_session_data *) target))))
{
if (wd.damage > 0 || wd.damage2 > 0)
{
- skill_additional_effect (src, target, 0, 0, BF_WEAPON, tick);
- if (sd)
- {
- if (sd->weapon_coma_ele[ele] > 0
- && MRAND (10000) < sd->weapon_coma_ele[ele])
- battle_damage (src, target,
- battle_get_max_hp (target), 1);
- if (sd->weapon_coma_race[race] > 0
- && MRAND (10000) < sd->weapon_coma_race[race])
- battle_damage (src, target,
- battle_get_max_hp (target), 1);
- if (battle_get_mode (target) & 0x20)
- {
- if (sd->weapon_coma_race[10] > 0
- && MRAND (10000) < sd->weapon_coma_race[10])
- battle_damage (src, target,
- battle_get_max_hp (target), 1);
- }
- else
- {
- if (sd->weapon_coma_race[11] > 0
- && MRAND (10000) < sd->weapon_coma_race[11])
- battle_damage (src, target,
- battle_get_max_hp (target), 1);
- }
- }
- }
- }
- 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 (sc_data[SC_AUTOSPELL].val2,
- skilllv) * 2 / 3;
- if (sd->status.sp >= sp)
- {
- if ((i = skill_get_inf (sc_data[SC_AUTOSPELL].val2) == 2)
- || i == 32)
- f = skill_castend_pos2 (src, target->x, target->y,
- sc_data[SC_AUTOSPELL].val2,
- skilllv, tick, flag);
- else
- {
- switch (skill_get_nk (sc_data[SC_AUTOSPELL].val2))
- {
- case 0:
- case 2:
- f = skill_castend_damage_id (src, target,
- sc_data
- [SC_AUTOSPELL].val2,
- skilllv, tick,
- flag);
- break;
- case 1: /* 支援系 */
- if ((sc_data[SC_AUTOSPELL].val2 == AL_HEAL
- || (sc_data[SC_AUTOSPELL].val2 ==
- ALL_RESURRECTION
- && target->type != BL_PC))
- && battle_check_undead (race, ele))
- f = skill_castend_damage_id (src, target,
- sc_data
- [SC_AUTOSPELL].val2,
- skilllv,
- tick, flag);
- else
- f = skill_castend_nodamage_id (src,
- target,
- sc_data
- [SC_AUTOSPELL].val2,
- skilllv,
- tick,
- flag);
- break;
- }
- }
- if (!f)
- pc_heal (sd, 0, -sp);
- }
- }
- else
- {
- if ((i = skill_get_inf (sc_data[SC_AUTOSPELL].val2) == 2)
- || i == 32)
- skill_castend_pos2 (src, target->x, target->y,
- sc_data[SC_AUTOSPELL].val2, skilllv,
- tick, flag);
- else
- {
- switch (skill_get_nk (sc_data[SC_AUTOSPELL].val2))
- {
- case 0:
- case 2:
- skill_castend_damage_id (src, target,
- sc_data
- [SC_AUTOSPELL].val2,
- skilllv, tick, flag);
- break;
- case 1: /* 支援系 */
- if ((sc_data[SC_AUTOSPELL].val2 == AL_HEAL
- || (sc_data[SC_AUTOSPELL].val2 ==
- ALL_RESURRECTION
- && target->type != BL_PC))
- && battle_check_undead (race, ele))
- skill_castend_damage_id (src, target,
- sc_data
- [SC_AUTOSPELL].val2,
- skilllv, tick, flag);
- else
- skill_castend_nodamage_id (src, target,
- sc_data
- [SC_AUTOSPELL].val2,
- skilllv, tick,
- flag);
- break;
- }
- }
+ skill_additional_effect(src, target, SkillID::ZERO, 0);
}
}
if (sd)
{
- if (sd->autospell_id > 0 && sd->autospell_lv > 0
- && MRAND (100) < sd->autospell_rate)
- {
- int skilllv = sd->autospell_lv, i, f = 0, sp;
- i = MRAND (100);
- if (i >= 50)
- skilllv -= 2;
- else if (i >= 15)
- skilllv--;
- if (skilllv < 1)
- skilllv = 1;
- sp = skill_get_sp (sd->autospell_id, skilllv) * 2 / 3;
- if (sd->status.sp >= sp)
- {
- 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);
- else
- {
- switch (skill_get_nk (sd->autospell_id))
- {
- case 0:
- case 2:
- f = skill_castend_damage_id (src, target,
- sd->autospell_id,
- skilllv, tick,
- flag);
- break;
- case 1: /* 支援系 */
- if ((sd->autospell_id == AL_HEAL
- || (sd->autospell_id == ALL_RESURRECTION
- && target->type != BL_PC))
- && battle_check_undead (race, ele))
- f = skill_castend_damage_id (src, target,
- sd->autospell_id,
- skilllv,
- tick, flag);
- else
- f = skill_castend_nodamage_id (src,
- target,
- sd->autospell_id,
- skilllv,
- tick,
- flag);
- break;
- }
- }
- if (!f)
- pc_heal (sd, 0, -sp);
- }
- }
- if (wd.flag & BF_WEAPON && src != target
+ if (bool(wd.flag & BF::WEAPON)
+ && src != target
&& (wd.damage > 0 || wd.damage2 > 0))
{
- int hp = 0, sp = 0;
+ int hp = 0, sp = 0;
if (sd->hp_drain_rate && wd.damage > 0
- && MRAND (100) < sd->hp_drain_rate)
+ && random_::chance({sd->hp_drain_rate, 100}))
{
hp += (wd.damage * sd->hp_drain_per) / 100;
}
if (sd->hp_drain_rate_ && wd.damage2 > 0
- && MRAND (100) < sd->hp_drain_rate_)
+ && random_::chance({sd->hp_drain_rate_, 100}))
{
hp += (wd.damage2 * sd->hp_drain_per_) / 100;
}
if (sd->sp_drain_rate && wd.damage > 0
- && MRAND (100) < sd->sp_drain_rate)
+ && random_::chance({sd->sp_drain_rate, 100}))
{
sp += (wd.damage * sd->sp_drain_per) / 100;
}
if (sd->sp_drain_rate_ && wd.damage2 > 0
- && MRAND (100) < sd->sp_drain_rate_)
+ && random_::chance({sd->sp_drain_rate_, 100}))
{
sp += (wd.damage2 * sd->sp_drain_per_) / 100;
}
if (hp || sp)
- pc_heal (sd, hp, sp);
+ pc_heal(sd, hp, sp);
}
}
- 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,
- 0x8000 |
- t_sc_data[SC_AUTOCOUNTER].val1);
- 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);
-
- map_freeblock_unlock ();
+ map_freeblock_unlock();
}
return wd.dmg_lv;
}
-int battle_check_undead (int race, int element)
+bool battle_check_undead(Race race, Element element)
{
if (battle_config.undead_detect_type == 0)
{
- if (element == 9)
- return 1;
+ return element == Element::undead;
}
else if (battle_config.undead_detect_type == 1)
{
- if (race == 1)
- return 1;
+ return race == Race::undead;
}
else
{
- if (element == 9 || race == 1)
- return 1;
+ return element == Element::undead || race == Race::undead;
}
- return 0;
}
/*==========================================
* 敵味方判定(1=肯定,0=否定,-1=エラー)
* flag&0xf0000 = 0x00000:敵じゃないか判定(ret:1=敵ではない)
- * = 0x10000:パーティー判定(ret:1=パーティーメンバ)
- * = 0x20000:全て(ret:1=敵味方両方)
- * = 0x40000:敵か判定(ret:1=敵)
- * = 0x50000:パーティーじゃないか判定(ret:1=パーティでない)
+ * = 0x10000:パーティー判定(ret:1=パーティーメンバ)
+ * = 0x20000:全て(ret:1=敵味方両方)
+ * = 0x40000:敵か判定(ret:1=敵)
+ * = 0x50000:パーティーじゃないか判定(ret:1=パーティでない)
*------------------------------------------
*/
-int battle_check_target (struct block_list *src, struct block_list *target,
- int flag)
+int battle_check_target(struct block_list *src, struct block_list *target,
+ BCT flag)
{
- int s_p, s_g, t_p, t_g;
+ int s_p, t_p;
struct block_list *ss = src;
- nullpo_retr (0, src);
- nullpo_retr (0, target);
+ nullpo_ret(src);
+ nullpo_ret(target);
- if (flag & 0x40000)
+ if (flag & BCT_ENEMY)
{ // 反転フラグ
- int ret = battle_check_target (src, target, flag & 0x30000);
+ int ret = battle_check_target(src, target, flag & (BCT_PARTY | BCT_ALL));
if (ret != -1)
return !ret;
return -1;
}
- if (flag & 0x20000)
+ if (flag & BCT_ALL)
{
- if (target->type == BL_MOB || target->type == BL_PC)
+ if (target->type == BL::MOB || target->type == BL::PC)
return 1;
else
return -1;
}
- if (src->type == BL_SKILL && target->type == BL_SKILL) // 対象がスキルユニットなら無条件肯定
- return -1;
-
- if (target->type == BL_PC
- && ((struct map_session_data *) target)->invincible_timer != -1)
+ if (target->type == BL::PC
+ && ((struct map_session_data *) target)->invincible_timer)
return -1;
- if (target->type == BL_SKILL)
- {
- switch (((struct skill_unit *) target)->group->unit_id)
- {
- case 0x8d:
- case 0x8f:
- case 0x98:
- return 0;
- break;
- }
- }
-
- // スキルユニットの場合、親を求める
- if (src->type == BL_SKILL)
- {
- int inf2 =
- skill_get_inf2 (((struct skill_unit *) src)->group->skill_id);
- if ((ss =
- map_id2bl (((struct skill_unit *) src)->group->src_id)) == NULL)
- return -1;
- if (ss->prev == NULL)
- return -1;
- if (inf2 & 0x80 && (map[src->m].flag.pvp || pc_iskiller ((struct map_session_data *) src, (struct map_session_data *) target)) && // [MouseJstr]
- !(target->type == BL_PC
- && pc_isinvisible ((struct map_session_data *) target)))
- return 0;
- if (ss == target)
- {
- if (inf2 & 0x100)
- return 0;
- if (inf2 & 0x200)
- return -1;
- }
- }
// Mobでmaster_idがあってspecial_mob_aiなら、召喚主を求める
- if (src->type == BL_MOB)
+ if (src->type == BL::MOB)
{
struct mob_data *md = (struct mob_data *) src;
if (md && md->master_id > 0)
@@ -5254,7 +2173,7 @@ int battle_check_target (struct block_list *src, struct block_list *target,
return 1;
if (md->state.special_mob_ai)
{
- if (target->type == BL_MOB)
+ if (target->type == BL::MOB)
{ //special_mob_aiで対象がMob
struct mob_data *tmd = (struct mob_data *) target;
if (tmd)
@@ -5271,7 +2190,7 @@ int battle_check_target (struct block_list *src, struct block_list *target,
}
}
}
- if ((ss = map_id2bl (md->master_id)) == NULL)
+ if ((ss = map_id2bl(md->master_id)) == NULL)
return -1;
}
}
@@ -5279,25 +2198,23 @@ int battle_check_target (struct block_list *src, struct block_list *target,
if (src == target || ss == target) // 同じなら肯定
return 1;
- if (target->type == BL_PC
- && pc_isinvisible ((struct map_session_data *) target))
+ if (target->type == BL::PC
+ && pc_isinvisible((struct map_session_data *) target))
return -1;
if (src->prev == NULL || // 死んでるならエラー
- (src->type == BL_PC && pc_isdead ((struct map_session_data *) src)))
+ (src->type == BL::PC && pc_isdead((struct map_session_data *) src)))
return -1;
- if ((ss->type == BL_PC && target->type == BL_MOB) ||
- (ss->type == BL_MOB && target->type == BL_PC))
+ if ((ss->type == BL::PC && target->type == BL::MOB) ||
+ (ss->type == BL::MOB && target->type == BL::PC))
return 0; // PCvsMOBなら否定
- s_p = battle_get_party_id (ss);
- s_g = battle_get_guild_id (ss);
+ s_p = battle_get_party_id(ss);
- t_p = battle_get_party_id (target);
- t_g = battle_get_guild_id (target);
+ t_p = battle_get_party_id(target);
- if (flag & 0x10000)
+ if (flag & BCT_PARTY)
{
if (s_p && t_p && s_p == t_p) // 同じパーティなら肯定(味方)
return 1;
@@ -5305,61 +2222,20 @@ int battle_check_target (struct block_list *src, struct block_list *target,
return 0;
}
- if (ss->type == BL_MOB && s_g > 0 && t_g > 0 && s_g == t_g) // 同じギルド/mobクラスなら肯定(味方)
- return 1;
-
-//printf("ss:%d src:%d target:%d flag:0x%x %d %d ",ss->id,src->id,target->id,flag,src->type,target->type);
-//printf("p:%d %d g:%d %d\n",s_p,t_p,s_g,t_g);
+//PRINTF("ss:%d src:%d target:%d flag:0x%x %d %d ",ss->id,src->id,target->id,flag,src->type,target->type);
+//PRINTF("p:%d %d g:%d %d\n",s_p,t_p,s_g,t_g);
- if (ss->type == BL_PC && target->type == BL_PC)
+ if (ss->type == BL::PC && target->type == BL::PC)
{ // 両方PVPモードなら否定(敵)
- struct skill_unit *su = NULL;
- if (src->type == BL_SKILL)
- su = (struct skill_unit *) src;
if (map[ss->m].flag.pvp
- || pc_iskiller ((struct map_session_data *) ss,
+ || pc_iskiller((struct map_session_data *) ss,
(struct map_session_data *) target))
{ // [MouseJstr]
- if (su && su->group->target_flag == BCT_NOENEMY)
- return 1;
- else if (battle_config.pk_mode
- && (((struct map_session_data *) ss)->status.pc_class == 0
- || ((struct map_session_data *) target)->
- status.pc_class == 0))
+ if (battle_config.pk_mode)
return 1; // prevent novice engagement in pk_mode [Valaris]
else if (map[ss->m].flag.pvp_noparty && s_p > 0 && t_p > 0
&& s_p == t_p)
return 1;
- else if (map[ss->m].flag.pvp_noguild && s_g > 0 && t_g > 0
- && s_g == t_g)
- return 1;
- return 0;
- }
- if (map[src->m].flag.gvg)
- {
- struct guild *g = NULL;
- if (su && su->group->target_flag == BCT_NOENEMY)
- return 1;
- if (s_g > 0 && s_g == t_g)
- return 1;
- if (map[src->m].flag.gvg_noparty && s_p > 0 && t_p > 0
- && s_p == t_p)
- return 1;
- if ((g = guild_search (s_g)))
- {
- int i;
- for (i = 0; i < MAX_GUILDALLIANCE; i++)
- {
- if (g->alliance[i].guild_id > 0
- && g->alliance[i].guild_id == t_g)
- {
- if (g->alliance[i].opposition)
- return 0; //敵対ギルドなら無条件に敵
- else
- return 1; //同盟ギルドなら無条件に味方
- }
- }
- }
return 0;
}
}
@@ -5371,19 +2247,19 @@ int battle_check_target (struct block_list *src, struct block_list *target,
* 射程判定
*------------------------------------------
*/
-int battle_check_range (struct block_list *src, struct block_list *bl,
+int battle_check_range(struct block_list *src, struct block_list *bl,
int range)
{
- int dx, dy;
+ int dx, dy;
struct walkpath_data wpd;
- int arange;
+ int arange;
- nullpo_retr (0, src);
- nullpo_retr (0, bl);
+ nullpo_ret(src);
+ nullpo_ret(bl);
- dx = abs (bl->x - src->x);
- dy = abs (bl->y - src->y);
+ dx = abs(bl->x - src->x);
+ dy = abs(bl->y - src->y);
arange = ((dx > dy) ? dx : dy);
if (src->m != bl->m) // 違うマップ
@@ -5402,42 +2278,22 @@ int battle_check_range (struct block_list *src, struct block_list *bl,
wpd.path_len = 0;
wpd.path_pos = 0;
wpd.path_half = 0;
- if (path_search (&wpd, src->m, src->x, src->y, bl->x, bl->y, 0x10001) !=
+ if (path_search(&wpd, src->m, src->x, src->y, bl->x, bl->y, 0x10001) !=
-1)
return 1;
dx = (dx > 0) ? 1 : ((dx < 0) ? -1 : 0);
dy = (dy > 0) ? 1 : ((dy < 0) ? -1 : 0);
- return (path_search (&wpd, src->m, src->x + dx, src->y + dy,
+ return (path_search(&wpd, src->m, src->x + dx, src->y + dy,
bl->x - dx, bl->y - dy, 0x10001) != -1) ? 1 : 0;
}
/*==========================================
- * Return numerical value of a switch configuration (modified by [Yor])
- * on/off, english, fran軋is, deutsch, espal
- *------------------------------------------
- */
-int battle_config_switch (const char *str)
-{
- if (strcasecmp (str, "on") == 0 || strcasecmp (str, "yes") == 0
- || strcasecmp (str, "oui") == 0 || strcasecmp (str, "ja") == 0
- || strcasecmp (str, "si") == 0)
- return 1;
- if (strcasecmp (str, "off") == 0 || strcasecmp (str, "no") == 0
- || strcasecmp (str, "non") == 0 || strcasecmp (str, "nein") == 0)
- return 0;
- return atoi (str);
-}
-
-/*==========================================
* 設定ファイルを読み込む
*------------------------------------------
*/
-int battle_config_read (const char *cfgName)
+int battle_config_read(const char *cfgName)
{
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
static int count = 0;
if ((count++) == 0)
@@ -5456,21 +2312,16 @@ int battle_config_read (const char *cfgName)
battle_config.skill_out_range_consume = 1;
battle_config.mob_skill_add_range = 0;
battle_config.pc_damage_delay = 1;
- battle_config.pc_damage_delay_rate = 100;
battle_config.defnotenemy = 1;
battle_config.random_monster_checklv = 1;
battle_config.attr_recover = 1;
- battle_config.flooritem_lifetime = LIFETIME_FLOORITEM * 1000;
+ battle_config.flooritem_lifetime = (int)std::chrono::duration_cast<std::chrono::milliseconds>(LIFETIME_FLOORITEM).count();
battle_config.item_auto_get = 0;
battle_config.drop_pickup_safety_zone = 20;
battle_config.item_first_get_time = 3000;
battle_config.item_second_get_time = 1000;
battle_config.item_third_get_time = 1000;
- battle_config.mvp_item_first_get_time = 10000;
- battle_config.mvp_item_second_get_time = 10000;
- battle_config.mvp_item_third_get_time = 2000;
- battle_config.drop_rate0item = 0;
battle_config.base_exp_rate = 100;
battle_config.job_exp_rate = 100;
battle_config.pvp_exp = 1;
@@ -5481,30 +2332,23 @@ int battle_config_read (const char *cfgName)
battle_config.zeny_penalty = 0;
battle_config.restart_hp_rate = 0;
battle_config.restart_sp_rate = 0;
- battle_config.mvp_item_rate = 100;
- battle_config.mvp_exp_rate = 100;
- battle_config.mvp_hp_rate = 100;
battle_config.monster_hp_rate = 100;
battle_config.monster_max_aspd = 199;
battle_config.atc_gmonly = 0;
battle_config.gm_allskill = 0;
battle_config.gm_allequip = 0;
battle_config.gm_skilluncond = 0;
- battle_config.guild_max_castles = 0;
battle_config.skillfree = 0;
battle_config.skillup_limit = 0;
battle_config.wp_rate = 100;
battle_config.pp_rate = 100;
battle_config.monster_active_enable = 1;
- battle_config.monster_damage_delay_rate = 100;
battle_config.monster_loot_type = 0;
battle_config.mob_skill_use = 1;
battle_config.mob_count_rate = 100;
battle_config.quest_skill_learn = 0;
battle_config.quest_skill_reset = 1;
battle_config.basic_skill_check = 1;
- battle_config.guild_emperium_check = 1;
- battle_config.guild_exp_limit = 50;
battle_config.pc_invincible_time = 5000;
battle_config.skill_min_damage = 0;
battle_config.finger_offensive_type = 0;
@@ -5540,25 +2384,17 @@ int battle_config_read (const char *cfgName)
battle_config.agi_penaly_type = 0;
battle_config.agi_penaly_count = 3;
battle_config.agi_penaly_num = 0;
- battle_config.agi_penaly_count_lv = ATK_FLEE;
+ battle_config.agi_penaly_count_lv = static_cast<int>(ATK::FLEE); // FIXME
battle_config.vit_penaly_type = 0;
battle_config.vit_penaly_count = 3;
battle_config.vit_penaly_num = 0;
- battle_config.vit_penaly_count_lv = ATK_DEF;
- battle_config.player_defense_type = 0;
- battle_config.monster_defense_type = 0;
- battle_config.magic_defense_type = 0;
+ battle_config.vit_penaly_count_lv = static_cast<int>(ATK::DEF); // FIXME
battle_config.pc_skill_reiteration = 0;
battle_config.monster_skill_reiteration = 0;
battle_config.pc_skill_nofootset = 0;
battle_config.monster_skill_nofootset = 0;
battle_config.pc_cloak_check_type = 0;
battle_config.monster_cloak_check_type = 0;
- battle_config.gvg_short_damage_rate = 100;
- battle_config.gvg_long_damage_rate = 100;
- battle_config.gvg_magic_damage_rate = 100;
- battle_config.gvg_misc_damage_rate = 100;
- battle_config.gvg_eliminate_time = 7000;
battle_config.mob_changetarget_byskill = 0;
battle_config.pc_attack_direction_change = 1;
battle_config.monster_attack_direction_change = 1;
@@ -5590,34 +2426,12 @@ int battle_config_read (const char *cfgName)
battle_config.invite_request_check = 1;
battle_config.skill_removetrap_type = 0;
battle_config.disp_experience = 0;
- battle_config.item_rate_common = 100;
- battle_config.item_rate_equip = 100;
- battle_config.item_rate_card = 100;
- battle_config.item_rate_heal = 100; // Added by Valaris
- battle_config.item_rate_use = 100; // End
- battle_config.item_drop_common_min = 1; // Added by TyrNemesis^
- battle_config.item_drop_common_max = 10000;
- battle_config.item_drop_equip_min = 1;
- battle_config.item_drop_equip_max = 10000;
- battle_config.item_drop_card_min = 1;
- battle_config.item_drop_card_max = 10000;
- battle_config.item_drop_mvp_min = 1;
- battle_config.item_drop_mvp_max = 10000; // End Addition
- battle_config.item_drop_heal_min = 1; // Added by Valaris
- battle_config.item_drop_heal_max = 10000;
- battle_config.item_drop_use_min = 1;
- battle_config.item_drop_use_max = 10000; // End
battle_config.prevent_logout = 1; // Added by RoVeRT
battle_config.maximum_level = 255; // Added by Valaris
battle_config.drops_by_luk = 0; // [Valaris]
- battle_config.equipment_breaking = 0; // [Valaris]
- battle_config.equipment_break_rate = 100; // [Valaris]
battle_config.pk_mode = 0; // [Valaris]
battle_config.multi_level_up = 0; // [Valaris]
battle_config.backstab_bow_penalty = 0; // Akaru
- battle_config.night_at_start = 0; // added by [Yor]
- battle_config.day_duration = 2 * 60 * 60 * 1000; // added by [Yor] (2 hours)
- battle_config.night_duration = 30 * 60 * 1000; // added by [Yor] (30 minutes)
battle_config.show_mob_hp = 0; // [Valaris]
battle_config.hack_info_GM_level = 60; // added by [Yor] (default: 60, GM level)
battle_config.any_warp_GM_min_level = 20; // added by [Yor]
@@ -5649,478 +2463,212 @@ int battle_config_read (const char *cfgName)
battle_config.mob_splash_radius = -1;
}
- fp = fopen_ (cfgName, "r");
- if (fp == NULL)
+ std::ifstream in(cfgName);
+ if (!in.is_open())
{
- printf ("file not found: %s\n", cfgName);
+ PRINTF("file not found: %s\n", cfgName);
return 1;
}
- while (fgets (line, 1020, fp))
+
+ std::string line;
+ while (std::getline(in, line))
{
+ // s/{"\([a-zA-Z_0-9]*\)", &battle_config.\1}/BATTLE_CONFIG_VAR(\1)/
const struct
{
- char str[128];
+ const char *str;
int *val;
} data[] =
{
- {
- "warp_point_debug", &battle_config.warp_point_debug},
- {
- "enemy_critical", &battle_config.enemy_critical},
- {
- "enemy_critical_rate", &battle_config.enemy_critical_rate},
- {
- "enemy_str", &battle_config.enemy_str},
- {
- "enemy_perfect_flee", &battle_config.enemy_perfect_flee},
- {
- "casting_rate", &battle_config.cast_rate},
- {
- "delay_rate", &battle_config.delay_rate},
- {
- "delay_dependon_dex", &battle_config.delay_dependon_dex},
- {
- "skill_delay_attack_enable",
- &battle_config.sdelay_attack_enable},
- {
- "left_cardfix_to_right", &battle_config.left_cardfix_to_right},
- {
- "player_skill_add_range", &battle_config.pc_skill_add_range},
- {
- "skill_out_range_consume",
- &battle_config.skill_out_range_consume},
- {
- "monster_skill_add_range", &battle_config.mob_skill_add_range},
- {
- "player_damage_delay", &battle_config.pc_damage_delay},
- {
- "player_damage_delay_rate",
- &battle_config.pc_damage_delay_rate},
- {
- "defunit_not_enemy", &battle_config.defnotenemy},
- {
- "random_monster_checklv",
- &battle_config.random_monster_checklv},
- {
- "attribute_recover", &battle_config.attr_recover},
- {
- "flooritem_lifetime", &battle_config.flooritem_lifetime},
- {
- "item_auto_get", &battle_config.item_auto_get},
- {
- "drop_pickup_safety_zone",
- &battle_config.drop_pickup_safety_zone},
- {
- "item_first_get_time", &battle_config.item_first_get_time},
- {
- "item_second_get_time", &battle_config.item_second_get_time},
- {
- "item_third_get_time", &battle_config.item_third_get_time},
- {
- "mvp_item_first_get_time",
- &battle_config.mvp_item_first_get_time},
- {
- "mvp_item_second_get_time",
- &battle_config.mvp_item_second_get_time},
- {
- "mvp_item_third_get_time",
- &battle_config.mvp_item_third_get_time},
- {
- "item_rate", &battle_config.item_rate},
- {
- "drop_rate0item", &battle_config.drop_rate0item},
- {
- "base_exp_rate", &battle_config.base_exp_rate},
- {
- "job_exp_rate", &battle_config.job_exp_rate},
- {
- "pvp_exp", &battle_config.pvp_exp},
- {
- "gtb_pvp_only", &battle_config.gtb_pvp_only},
- {
- "guild_max_castles", &battle_config.guild_max_castles},
- {
- "death_penalty_type", &battle_config.death_penalty_type},
- {
- "death_penalty_base", &battle_config.death_penalty_base},
- {
- "death_penalty_job", &battle_config.death_penalty_job},
- {
- "zeny_penalty", &battle_config.zeny_penalty},
- {
- "restart_hp_rate", &battle_config.restart_hp_rate},
- {
- "restart_sp_rate", &battle_config.restart_sp_rate},
- {
- "mvp_hp_rate", &battle_config.mvp_hp_rate},
- {
- "mvp_item_rate", &battle_config.mvp_item_rate},
- {
- "mvp_exp_rate", &battle_config.mvp_exp_rate},
- {
- "monster_hp_rate", &battle_config.monster_hp_rate},
- {
- "monster_max_aspd", &battle_config.monster_max_aspd},
- {
- "atcommand_gm_only", &battle_config.atc_gmonly},
- {
- "atcommand_spawn_quantity_limit",
- &battle_config.atc_spawn_quantity_limit},
- {
- "gm_all_skill", &battle_config.gm_allskill},
- {
- "gm_all_skill_add_abra", &battle_config.gm_allskill_addabra},
- {
- "gm_all_equipment", &battle_config.gm_allequip},
- {
- "gm_skill_unconditional", &battle_config.gm_skilluncond},
- {
- "player_skillfree", &battle_config.skillfree},
- {
- "player_skillup_limit", &battle_config.skillup_limit},
- {
- "weapon_produce_rate", &battle_config.wp_rate},
- {
- "potion_produce_rate", &battle_config.pp_rate},
- {
- "monster_active_enable", &battle_config.monster_active_enable},
- {
- "monster_damage_delay_rate",
- &battle_config.monster_damage_delay_rate},
- {
- "monster_loot_type", &battle_config.monster_loot_type},
- {
- "mob_skill_use", &battle_config.mob_skill_use},
- {
- "mob_count_rate", &battle_config.mob_count_rate},
- {
- "quest_skill_learn", &battle_config.quest_skill_learn},
- {
- "quest_skill_reset", &battle_config.quest_skill_reset},
- {
- "basic_skill_check", &battle_config.basic_skill_check},
- {
- "guild_emperium_check", &battle_config.guild_emperium_check},
- {
- "guild_exp_limit", &battle_config.guild_exp_limit},
- {
- "player_invincible_time", &battle_config.pc_invincible_time},
- {
- "skill_min_damage", &battle_config.skill_min_damage},
- {
- "finger_offensive_type", &battle_config.finger_offensive_type},
- {
- "heal_exp", &battle_config.heal_exp},
- {
- "resurrection_exp", &battle_config.resurrection_exp},
- {
- "shop_exp", &battle_config.shop_exp},
- {
- "combo_delay_rate", &battle_config.combo_delay_rate},
- {
- "item_check", &battle_config.item_check},
- {
- "wedding_modifydisplay", &battle_config.wedding_modifydisplay},
- {
- "natural_healhp_interval",
- &battle_config.natural_healhp_interval},
- {
- "natural_healsp_interval",
- &battle_config.natural_healsp_interval},
- {
- "natural_heal_skill_interval",
- &battle_config.natural_heal_skill_interval},
- {
- "natural_heal_weight_rate",
- &battle_config.natural_heal_weight_rate},
- {
- "itemheal_regeneration_factor",
- &battle_config.itemheal_regeneration_factor},
- {
- "item_name_override_grffile",
- &battle_config.item_name_override_grffile},
- {
- "arrow_decrement", &battle_config.arrow_decrement},
- {
- "max_aspd", &battle_config.max_aspd},
- {
- "max_hp", &battle_config.max_hp},
- {
- "max_sp", &battle_config.max_sp},
- {
- "max_lv", &battle_config.max_lv},
- {
- "max_parameter", &battle_config.max_parameter},
- {
- "max_cart_weight", &battle_config.max_cart_weight},
- {
- "player_skill_log", &battle_config.pc_skill_log},
- {
- "monster_skill_log", &battle_config.mob_skill_log},
- {
- "battle_log", &battle_config.battle_log},
- {
- "save_log", &battle_config.save_log},
- {
- "error_log", &battle_config.error_log},
- {
- "etc_log", &battle_config.etc_log},
- {
- "save_clothcolor", &battle_config.save_clothcolor},
- {
- "undead_detect_type", &battle_config.undead_detect_type},
- {
- "player_auto_counter_type",
- &battle_config.pc_auto_counter_type},
- {
- "monster_auto_counter_type",
- &battle_config.monster_auto_counter_type},
- {
- "agi_penaly_type", &battle_config.agi_penaly_type},
- {
- "agi_penaly_count", &battle_config.agi_penaly_count},
- {
- "agi_penaly_num", &battle_config.agi_penaly_num},
- {
- "agi_penaly_count_lv", &battle_config.agi_penaly_count_lv},
- {
- "vit_penaly_type", &battle_config.vit_penaly_type},
- {
- "vit_penaly_count", &battle_config.vit_penaly_count},
- {
- "vit_penaly_num", &battle_config.vit_penaly_num},
- {
- "vit_penaly_count_lv", &battle_config.vit_penaly_count_lv},
- {
- "player_defense_type", &battle_config.player_defense_type},
- {
- "monster_defense_type", &battle_config.monster_defense_type},
- {
- "magic_defense_type", &battle_config.magic_defense_type},
- {
- "player_skill_reiteration",
- &battle_config.pc_skill_reiteration},
- {
- "monster_skill_reiteration",
- &battle_config.monster_skill_reiteration},
- {
- "player_skill_nofootset", &battle_config.pc_skill_nofootset},
- {
- "monster_skill_nofootset",
- &battle_config.monster_skill_nofootset},
- {
- "player_cloak_check_type", &battle_config.pc_cloak_check_type},
- {
- "monster_cloak_check_type",
- &battle_config.monster_cloak_check_type},
- {
- "gvg_short_attack_damage_rate",
- &battle_config.gvg_short_damage_rate},
- {
- "gvg_long_attack_damage_rate",
- &battle_config.gvg_long_damage_rate},
- {
- "gvg_magic_attack_damage_rate",
- &battle_config.gvg_magic_damage_rate},
- {
- "gvg_misc_attack_damage_rate",
- &battle_config.gvg_misc_damage_rate},
- {
- "gvg_eliminate_time", &battle_config.gvg_eliminate_time},
- {
- "mob_changetarget_byskill",
- &battle_config.mob_changetarget_byskill},
- {
- "player_attack_direction_change",
- &battle_config.pc_attack_direction_change},
- {
- "monster_attack_direction_change",
- &battle_config.monster_attack_direction_change},
- {
- "player_land_skill_limit", &battle_config.pc_land_skill_limit},
- {
- "monster_land_skill_limit",
- &battle_config.monster_land_skill_limit},
- {
- "party_skill_penaly", &battle_config.party_skill_penaly},
- {
- "monster_class_change_full_recover",
- &battle_config.monster_class_change_full_recover},
- {
- "produce_item_name_input",
- &battle_config.produce_item_name_input},
- {
- "produce_potion_name_input",
- &battle_config.produce_potion_name_input},
- {
- "making_arrow_name_input",
- &battle_config.making_arrow_name_input},
- {
- "holywater_name_input", &battle_config.holywater_name_input},
- {
- "display_delay_skill_fail",
- &battle_config.display_delay_skill_fail},
- {
- "chat_warpportal", &battle_config.chat_warpportal},
- {
- "mob_warpportal", &battle_config.mob_warpportal},
- {
- "dead_branch_active", &battle_config.dead_branch_active},
- {
- "show_steal_in_same_party",
- &battle_config.show_steal_in_same_party},
- {
- "enable_upper_class", &battle_config.enable_upper_class},
- {
- "mob_attack_attr_none", &battle_config.mob_attack_attr_none},
- {
- "mob_ghostring_fix", &battle_config.mob_ghostring_fix},
- {
- "pc_attack_attr_none", &battle_config.pc_attack_attr_none},
- {
- "gx_allhit", &battle_config.gx_allhit},
- {
- "gx_cardfix", &battle_config.gx_cardfix},
- {
- "gx_dupele", &battle_config.gx_dupele},
- {
- "gx_disptype", &battle_config.gx_disptype},
- {
- "player_skill_partner_check",
- &battle_config.player_skill_partner_check},
- {
- "hide_GM_session", &battle_config.hide_GM_session},
- {
- "unit_movement_type", &battle_config.unit_movement_type},
- {
- "invite_request_check", &battle_config.invite_request_check},
- {
- "skill_removetrap_type", &battle_config.skill_removetrap_type},
- {
- "disp_experience", &battle_config.disp_experience},
- {
- "castle_defense_rate", &battle_config.castle_defense_rate},
- {
- "riding_weight", &battle_config.riding_weight},
- {
- "item_rate_common", &battle_config.item_rate_common}, // Added by RoVeRT
- {
- "item_rate_equip", &battle_config.item_rate_equip},
- {
- "item_rate_card", &battle_config.item_rate_card}, // End Addition
- {
- "item_rate_heal", &battle_config.item_rate_heal}, // Added by Valaris
- {
- "item_rate_use", &battle_config.item_rate_use}, // End
- {
- "item_drop_common_min", &battle_config.item_drop_common_min}, // Added by TyrNemesis^
- {
- "item_drop_common_max", &battle_config.item_drop_common_max},
- {
- "item_drop_equip_min", &battle_config.item_drop_equip_min},
- {
- "item_drop_equip_max", &battle_config.item_drop_equip_max},
- {
- "item_drop_card_min", &battle_config.item_drop_card_min},
- {
- "item_drop_card_max", &battle_config.item_drop_card_max},
- {
- "item_drop_mvp_min", &battle_config.item_drop_mvp_min},
- {
- "item_drop_mvp_max", &battle_config.item_drop_mvp_max}, // End Addition
- {
- "prevent_logout", &battle_config.prevent_logout}, // Added by RoVeRT
- {
- "alchemist_summon_reward", &battle_config.alchemist_summon_reward}, // [Valaris]
- {
- "maximum_level", &battle_config.maximum_level}, // [Valaris]
- {
- "drops_by_luk", &battle_config.drops_by_luk}, // [Valaris]
- {
- "monsters_ignore_gm", &battle_config.monsters_ignore_gm}, // [Valaris]
- {
- "equipment_breaking", &battle_config.equipment_breaking}, // [Valaris]
- {
- "equipment_break_rate", &battle_config.equipment_break_rate}, // [Valaris]
- {
- "pk_mode", &battle_config.pk_mode}, // [Valaris]
- {
- "multi_level_up", &battle_config.multi_level_up}, // [Valaris]
- {
- "backstab_bow_penalty", &battle_config.backstab_bow_penalty},
- {
- "night_at_start", &battle_config.night_at_start}, // added by [Yor]
- {
- "day_duration", &battle_config.day_duration}, // added by [Yor]
- {
- "night_duration", &battle_config.night_duration}, // added by [Yor]
- {
- "show_mob_hp", &battle_config.show_mob_hp}, // [Valaris]
- {
- "hack_info_GM_level", &battle_config.hack_info_GM_level}, // added by [Yor]
- {
- "any_warp_GM_min_level", &battle_config.any_warp_GM_min_level}, // added by [Yor]
- {
- "packet_ver_flag", &battle_config.packet_ver_flag}, // added by [Yor]
- {
- "min_hair_style", &battle_config.min_hair_style}, // added by [MouseJstr]
- {
- "max_hair_style", &battle_config.max_hair_style}, // added by [MouseJstr]
- {
- "min_hair_color", &battle_config.min_hair_color}, // added by [MouseJstr]
- {
- "max_hair_color", &battle_config.max_hair_color}, // added by [MouseJstr]
- {
- "min_cloth_color", &battle_config.min_cloth_color}, // added by [MouseJstr]
- {
- "max_cloth_color", &battle_config.max_cloth_color}, // added by [MouseJstr]
- {
- "castrate_dex_scale", &battle_config.castrate_dex_scale}, // added by [MouseJstr]
- {
- "area_size", &battle_config.area_size}, // added by [MouseJstr]
- {
- "muting_players", &battle_config.muting_players}, // added by [Apple]
- {
- "chat_lame_penalty", &battle_config.chat_lame_penalty},
- {
- "chat_spam_threshold", &battle_config.chat_spam_threshold},
- {
- "chat_spam_flood", &battle_config.chat_spam_flood},
- {
- "chat_spam_ban", &battle_config.chat_spam_ban},
- {
- "chat_spam_warn", &battle_config.chat_spam_warn},
- {
- "chat_maxline", &battle_config.chat_maxline},
- {
- "packet_spam_threshold", &battle_config.packet_spam_threshold},
- {
- "packet_spam_flood", &battle_config.packet_spam_flood},
- {
- "packet_spam_kick", &battle_config.packet_spam_kick},
- {
- "mask_ip_gms", &battle_config.mask_ip_gms},
- {
- "mob_splash_radius", &battle_config.mob_splash_radius},
+ {"warp_point_debug", &battle_config.warp_point_debug},
+ {"enemy_critical", &battle_config.enemy_critical},
+ {"enemy_critical_rate", &battle_config.enemy_critical_rate},
+ {"enemy_str", &battle_config.enemy_str},
+ {"enemy_perfect_flee", &battle_config.enemy_perfect_flee},
+ {"casting_rate", &battle_config.cast_rate},
+ {"delay_rate", &battle_config.delay_rate},
+ {"delay_dependon_dex", &battle_config.delay_dependon_dex},
+ {"skill_delay_attack_enable", &battle_config.sdelay_attack_enable},
+ {"left_cardfix_to_right", &battle_config.left_cardfix_to_right},
+ {"player_skill_add_range", &battle_config.pc_skill_add_range},
+ {"skill_out_range_consume", &battle_config.skill_out_range_consume},
+ {"monster_skill_add_range", &battle_config.mob_skill_add_range},
+ {"player_damage_delay", &battle_config.pc_damage_delay},
+ {"defunit_not_enemy", &battle_config.defnotenemy},
+ {"random_monster_checklv", &battle_config.random_monster_checklv},
+ {"attribute_recover", &battle_config.attr_recover},
+ {"flooritem_lifetime", &battle_config.flooritem_lifetime},
+ {"item_auto_get", &battle_config.item_auto_get},
+ {"drop_pickup_safety_zone", &battle_config.drop_pickup_safety_zone},
+ {"item_first_get_time", &battle_config.item_first_get_time},
+ {"item_second_get_time", &battle_config.item_second_get_time},
+ {"item_third_get_time", &battle_config.item_third_get_time},
+ {"base_exp_rate", &battle_config.base_exp_rate},
+ {"job_exp_rate", &battle_config.job_exp_rate},
+ {"pvp_exp", &battle_config.pvp_exp},
+ {"gtb_pvp_only", &battle_config.gtb_pvp_only},
+ {"death_penalty_type", &battle_config.death_penalty_type},
+ {"death_penalty_base", &battle_config.death_penalty_base},
+ {"death_penalty_job", &battle_config.death_penalty_job},
+ {"zeny_penalty", &battle_config.zeny_penalty},
+ {"restart_hp_rate", &battle_config.restart_hp_rate},
+ {"restart_sp_rate", &battle_config.restart_sp_rate},
+ {"monster_hp_rate", &battle_config.monster_hp_rate},
+ {"monster_max_aspd", &battle_config.monster_max_aspd},
+ {"atcommand_gm_only", &battle_config.atc_gmonly},
+ {"atcommand_spawn_quantity_limit", &battle_config.atc_spawn_quantity_limit},
+ {"gm_all_skill", &battle_config.gm_allskill},
+ {"gm_all_skill_add_abra", &battle_config.gm_allskill_addabra},
+ {"gm_all_equipment", &battle_config.gm_allequip},
+ {"gm_skill_unconditional", &battle_config.gm_skilluncond},
+ {"player_skillfree", &battle_config.skillfree},
+ {"player_skillup_limit", &battle_config.skillup_limit},
+ {"weapon_produce_rate", &battle_config.wp_rate},
+ {"potion_produce_rate", &battle_config.pp_rate},
+ {"monster_active_enable", &battle_config.monster_active_enable},
+ {"monster_loot_type", &battle_config.monster_loot_type},
+ {"mob_skill_use", &battle_config.mob_skill_use},
+ {"mob_count_rate", &battle_config.mob_count_rate},
+ {"quest_skill_learn", &battle_config.quest_skill_learn},
+ {"quest_skill_reset", &battle_config.quest_skill_reset},
+ {"basic_skill_check", &battle_config.basic_skill_check},
+ {"player_invincible_time", &battle_config.pc_invincible_time},
+ {"skill_min_damage", &battle_config.skill_min_damage},
+ {"finger_offensive_type", &battle_config.finger_offensive_type},
+ {"heal_exp", &battle_config.heal_exp},
+ {"resurrection_exp", &battle_config.resurrection_exp},
+ {"shop_exp", &battle_config.shop_exp},
+ {"combo_delay_rate", &battle_config.combo_delay_rate},
+ {"item_check", &battle_config.item_check},
+ {"wedding_modifydisplay", &battle_config.wedding_modifydisplay},
+ {"natural_healhp_interval", &battle_config.natural_healhp_interval},
+ {"natural_healsp_interval", &battle_config.natural_healsp_interval},
+ {"natural_heal_skill_interval", &battle_config.natural_heal_skill_interval},
+ {"natural_heal_weight_rate", &battle_config.natural_heal_weight_rate},
+ {"itemheal_regeneration_factor", &battle_config.itemheal_regeneration_factor},
+ {"item_name_override_grffile", &battle_config.item_name_override_grffile},
+ {"arrow_decrement", &battle_config.arrow_decrement},
+ {"max_aspd", &battle_config.max_aspd},
+ {"max_hp", &battle_config.max_hp},
+ {"max_sp", &battle_config.max_sp},
+ {"max_lv", &battle_config.max_lv},
+ {"max_parameter", &battle_config.max_parameter},
+ {"max_cart_weight", &battle_config.max_cart_weight},
+ {"player_skill_log", &battle_config.pc_skill_log},
+ {"monster_skill_log", &battle_config.mob_skill_log},
+ {"battle_log", &battle_config.battle_log},
+ {"save_log", &battle_config.save_log},
+ {"error_log", &battle_config.error_log},
+ {"etc_log", &battle_config.etc_log},
+ {"save_clothcolor", &battle_config.save_clothcolor},
+ {"undead_detect_type", &battle_config.undead_detect_type},
+ {"player_auto_counter_type", &battle_config.pc_auto_counter_type},
+ {"monster_auto_counter_type", &battle_config.monster_auto_counter_type},
+ {"agi_penaly_type", &battle_config.agi_penaly_type},
+ {"agi_penaly_count", &battle_config.agi_penaly_count},
+ {"agi_penaly_num", &battle_config.agi_penaly_num},
+ {"agi_penaly_count_lv", &battle_config.agi_penaly_count_lv},
+ {"vit_penaly_type", &battle_config.vit_penaly_type},
+ {"vit_penaly_count", &battle_config.vit_penaly_count},
+ {"vit_penaly_num", &battle_config.vit_penaly_num},
+ {"vit_penaly_count_lv", &battle_config.vit_penaly_count_lv},
+ {"player_skill_reiteration", &battle_config.pc_skill_reiteration},
+ {"monster_skill_reiteration", &battle_config.monster_skill_reiteration},
+ {"player_skill_nofootset", &battle_config.pc_skill_nofootset},
+ {"monster_skill_nofootset", &battle_config.monster_skill_nofootset},
+ {"player_cloak_check_type", &battle_config.pc_cloak_check_type},
+ {"monster_cloak_check_type", &battle_config.monster_cloak_check_type},
+ {"mob_changetarget_byskill", &battle_config.mob_changetarget_byskill},
+ {"player_attack_direction_change", &battle_config.pc_attack_direction_change},
+ {"monster_attack_direction_change", &battle_config.monster_attack_direction_change},
+ {"player_land_skill_limit", &battle_config.pc_land_skill_limit},
+ {"monster_land_skill_limit", &battle_config.monster_land_skill_limit},
+ {"party_skill_penaly", &battle_config.party_skill_penaly},
+ {"monster_class_change_full_recover", &battle_config.monster_class_change_full_recover},
+ {"produce_item_name_input", &battle_config.produce_item_name_input},
+ {"produce_potion_name_input", &battle_config.produce_potion_name_input},
+ {"making_arrow_name_input", &battle_config.making_arrow_name_input},
+ {"holywater_name_input", &battle_config.holywater_name_input},
+ {"display_delay_skill_fail", &battle_config.display_delay_skill_fail},
+ {"chat_warpportal", &battle_config.chat_warpportal},
+ {"mob_warpportal", &battle_config.mob_warpportal},
+ {"dead_branch_active", &battle_config.dead_branch_active},
+ {"show_steal_in_same_party", &battle_config.show_steal_in_same_party},
+ {"enable_upper_class", &battle_config.enable_upper_class},
+ {"mob_attack_attr_none", &battle_config.mob_attack_attr_none},
+ {"mob_ghostring_fix", &battle_config.mob_ghostring_fix},
+ {"pc_attack_attr_none", &battle_config.pc_attack_attr_none},
+ {"gx_allhit", &battle_config.gx_allhit},
+ {"gx_cardfix", &battle_config.gx_cardfix},
+ {"gx_dupele", &battle_config.gx_dupele},
+ {"gx_disptype", &battle_config.gx_disptype},
+ {"player_skill_partner_check", &battle_config.player_skill_partner_check},
+ {"hide_GM_session", &battle_config.hide_GM_session},
+ {"unit_movement_type", &battle_config.unit_movement_type},
+ {"invite_request_check", &battle_config.invite_request_check},
+ {"skill_removetrap_type", &battle_config.skill_removetrap_type},
+ {"disp_experience", &battle_config.disp_experience},
+ {"riding_weight", &battle_config.riding_weight},
+ {"prevent_logout", &battle_config.prevent_logout}, // Added by RoVeRT
+ {"alchemist_summon_reward", &battle_config.alchemist_summon_reward}, // [Valaris]
+ {"maximum_level", &battle_config.maximum_level}, // [Valaris]
+ {"drops_by_luk", &battle_config.drops_by_luk}, // [Valaris]
+ {"monsters_ignore_gm", &battle_config.monsters_ignore_gm}, // [Valaris]
+ {"pk_mode", &battle_config.pk_mode}, // [Valaris]
+ {"multi_level_up", &battle_config.multi_level_up}, // [Valaris]
+ {"backstab_bow_penalty", &battle_config.backstab_bow_penalty},
+ {"show_mob_hp", &battle_config.show_mob_hp}, // [Valaris]
+ {"hack_info_GM_level", &battle_config.hack_info_GM_level}, // added by [Yor]
+ {"any_warp_GM_min_level", &battle_config.any_warp_GM_min_level}, // added by [Yor]
+ {"packet_ver_flag", &battle_config.packet_ver_flag}, // added by [Yor]
+ {"min_hair_style", &battle_config.min_hair_style}, // added by [MouseJstr]
+ {"max_hair_style", &battle_config.max_hair_style}, // added by [MouseJstr]
+ {"min_hair_color", &battle_config.min_hair_color}, // added by [MouseJstr]
+ {"max_hair_color", &battle_config.max_hair_color}, // added by [MouseJstr]
+ {"min_cloth_color", &battle_config.min_cloth_color}, // added by [MouseJstr]
+ {"max_cloth_color", &battle_config.max_cloth_color}, // added by [MouseJstr]
+ {"castrate_dex_scale", &battle_config.castrate_dex_scale}, // added by [MouseJstr]
+ {"area_size", &battle_config.area_size}, // added by [MouseJstr]
+ {"chat_lame_penalty", &battle_config.chat_lame_penalty},
+ {"chat_spam_threshold", &battle_config.chat_spam_threshold},
+ {"chat_spam_flood", &battle_config.chat_spam_flood},
+ {"chat_spam_ban", &battle_config.chat_spam_ban},
+ {"chat_spam_warn", &battle_config.chat_spam_warn},
+ {"chat_maxline", &battle_config.chat_maxline},
+ {"packet_spam_threshold", &battle_config.packet_spam_threshold},
+ {"packet_spam_flood", &battle_config.packet_spam_flood},
+ {"packet_spam_kick", &battle_config.packet_spam_kick},
+ {"mask_ip_gms", &battle_config.mask_ip_gms},
+ {"mob_splash_radius", &battle_config.mob_splash_radius},
};
- if (line[0] == '/' && line[1] == '/')
+ std::string w1, w2;
+ if (!split_key_value(line, &w1, &w2))
continue;
- if (sscanf (line, "%[^:]:%s", w1, w2) != 2)
+
+ if (w1 == "import")
+ {
+ battle_config_read(w2.c_str());
continue;
- for (i = 0; i < sizeof (data) / (sizeof (data[0])); i++)
- if (strcasecmp (w1, data[i].str) == 0)
- *data[i].val = battle_config_switch (w2);
+ }
+
+ for (auto datum : data)
+ if (w1 == datum.str)
+ {
+ *datum.val = config_switch(w2.c_str());
+ goto continue_outer;
+ }
- if (strcasecmp (w1, "import") == 0)
- battle_config_read (w2);
+ PRINTF("WARNING: unknown battle conf key: %s\n", w1);
+
+ continue_outer:
+ ;
}
- fclose_ (fp);
if (--count == 0)
{
- if (battle_config.flooritem_lifetime < 1000)
- battle_config.flooritem_lifetime = LIFETIME_FLOORITEM * 1000;
+ if (static_cast<interval_t>(battle_config.flooritem_lifetime) < std::chrono::seconds(1))
+ battle_config.flooritem_lifetime = (int)std::chrono::duration_cast<std::chrono::milliseconds>(LIFETIME_FLOORITEM).count();
if (battle_config.restart_hp_rate < 0)
battle_config.restart_hp_rate = 0;
else if (battle_config.restart_hp_rate > 100)
@@ -6129,12 +2677,12 @@ int battle_config_read (const char *cfgName)
battle_config.restart_sp_rate = 0;
else if (battle_config.restart_sp_rate > 100)
battle_config.restart_sp_rate = 100;
- if (battle_config.natural_healhp_interval < NATURAL_HEAL_INTERVAL)
- battle_config.natural_healhp_interval = NATURAL_HEAL_INTERVAL;
- if (battle_config.natural_healsp_interval < NATURAL_HEAL_INTERVAL)
- battle_config.natural_healsp_interval = NATURAL_HEAL_INTERVAL;
- if (battle_config.natural_heal_skill_interval < NATURAL_HEAL_INTERVAL)
- battle_config.natural_heal_skill_interval = NATURAL_HEAL_INTERVAL;
+ if (battle_config.natural_healhp_interval < NATURAL_HEAL_INTERVAL.count())
+ battle_config.natural_healhp_interval = NATURAL_HEAL_INTERVAL.count();
+ if (battle_config.natural_healsp_interval < NATURAL_HEAL_INTERVAL.count())
+ battle_config.natural_healsp_interval = NATURAL_HEAL_INTERVAL.count();
+ if (battle_config.natural_heal_skill_interval < NATURAL_HEAL_INTERVAL.count())
+ battle_config.natural_heal_skill_interval = NATURAL_HEAL_INTERVAL.count();
if (battle_config.natural_heal_weight_rate < 50)
battle_config.natural_heal_weight_rate = 50;
if (battle_config.natural_heal_weight_rate > 101)
@@ -6173,41 +2721,6 @@ int battle_config_read (const char *cfgName)
if (battle_config.vit_penaly_count < 2)
battle_config.vit_penaly_count = 2;
- if (battle_config.guild_exp_limit > 99)
- battle_config.guild_exp_limit = 99;
- if (battle_config.guild_exp_limit < 0)
- battle_config.guild_exp_limit = 0;
-
- if (battle_config.castle_defense_rate < 0)
- battle_config.castle_defense_rate = 0;
- if (battle_config.castle_defense_rate > 100)
- battle_config.castle_defense_rate = 100;
- if (battle_config.item_drop_common_min < 1) // Added by TyrNemesis^
- battle_config.item_drop_common_min = 1;
- if (battle_config.item_drop_common_max > 10000)
- battle_config.item_drop_common_max = 10000;
- if (battle_config.item_drop_equip_min < 1)
- battle_config.item_drop_equip_min = 1;
- if (battle_config.item_drop_equip_max > 10000)
- battle_config.item_drop_equip_max = 10000;
- if (battle_config.item_drop_card_min < 1)
- battle_config.item_drop_card_min = 1;
- if (battle_config.item_drop_card_max > 10000)
- battle_config.item_drop_card_max = 10000;
- if (battle_config.item_drop_mvp_min < 1)
- battle_config.item_drop_mvp_min = 1;
- if (battle_config.item_drop_mvp_max > 10000)
- battle_config.item_drop_mvp_max = 10000; // End Addition
-
- if (battle_config.night_at_start < 0) // added by [Yor]
- battle_config.night_at_start = 0;
- else if (battle_config.night_at_start > 1) // added by [Yor]
- battle_config.night_at_start = 1;
- if (battle_config.day_duration < 0) // added by [Yor]
- battle_config.day_duration = 0;
- if (battle_config.night_duration < 0) // added by [Yor]
- battle_config.night_duration = 0;
-
if (battle_config.hack_info_GM_level < 0) // added by [Yor]
battle_config.hack_info_GM_level = 0;
else if (battle_config.hack_info_GM_level > 100)
diff --git a/src/map/battle.hpp b/src/map/battle.hpp
index 5f2a22f..6d9d8dd 100644
--- a/src/map/battle.hpp
+++ b/src/map/battle.hpp
@@ -1,357 +1,267 @@
-// $Id: battle.h,v 1.6 2004/09/29 21:08:17 Akitasha Exp $
#ifndef BATTLE_HPP
#define BATTLE_HPP
+#include "battle.t.hpp"
+
+#include "../common/timer.t.hpp"
+
+#include "magic-interpreter.t.hpp"
+#include "map.t.hpp"
+#include "skill.t.hpp"
+
// ダメージ
struct Damage
{
- int damage, damage2;
- int type, div_;
- int amotion, dmotion;
- int blewcount;
- int flag;
- int dmg_lv; //囲まれ減算計算用 0:スキル攻撃 ATK_LUCKY,ATK_FLEE,ATK_DEF
+ int damage, damage2;
+ DamageType type;
+ int div_;
+ interval_t amotion, dmotion;
+ BF flag;
+ ATK dmg_lv;
};
-// 属性表(読み込みはpc.c、battle_attr_fixで使用)
-extern int attr_fix_table[4][10][10];
-
struct map_session_data;
struct mob_data;
struct block_list;
// ダメージ計算
-struct Damage battle_calc_attack (int attack_type,
- struct block_list *bl,
- struct block_list *target, int skill_num,
- int skill_lv, int flag);
-struct Damage battle_calc_weapon_attack (struct block_list *bl,
- struct block_list *target,
- int skill_num, int skill_lv,
- int flag);
-struct Damage battle_calc_magic_attack (struct block_list *bl,
- struct block_list *target,
- int skill_num, int skill_lv,
- int flag);
-struct Damage battle_calc_misc_attack (struct block_list *bl,
- struct block_list *target,
- int skill_num, int skill_lv, int flag);
-
-// 属性修正計算
-int battle_attr_fix (int damage, int atk_elem, int def_elem);
-
-// ダメージ最終計算
-int battle_calc_damage (struct block_list *src, struct block_list *bl,
- int damage, int div_, int skill_num, int skill_lv,
- int flag);
-enum
-{ // 最終計算のフラグ
- BF_WEAPON = 0x0001,
- BF_MAGIC = 0x0002,
- BF_MISC = 0x0004,
- BF_SHORT = 0x0010,
- BF_LONG = 0x0040,
- BF_SKILL = 0x0100,
- BF_NORMAL = 0x0200,
- BF_WEAPONMASK = 0x000f,
- BF_RANGEMASK = 0x00f0,
- BF_SKILLMASK = 0x0f00,
-};
+struct Damage battle_calc_attack(BF attack_type,
+ struct block_list *bl, struct block_list *target,
+ SkillID skill_num, int skill_lv, int flag);
// 実際にHPを増減
-int battle_delay_damage (unsigned int tick, struct block_list *src,
- struct block_list *target, int damage, int flag);
-int battle_damage (struct block_list *bl, struct block_list *target,
- int damage, int flag);
-int battle_heal (struct block_list *bl, struct block_list *target, int hp,
- int sp, int flag);
+int battle_damage(struct block_list *bl, struct block_list *target,
+ int damage, int flag);
+int battle_heal(struct block_list *bl, struct block_list *target, int hp,
+ int sp, int flag);
// 攻撃や移動を止める
-int battle_stopattack (struct block_list *bl);
-int battle_stopwalking (struct block_list *bl, int type);
+int battle_stopattack(struct block_list *bl);
+int battle_stopwalking(struct block_list *bl, int type);
// 通常攻撃処理まとめ
-int battle_weapon_attack (struct block_list *bl, struct block_list *target,
- unsigned int tick, int flag);
-
-// 各種パラメータを得る
-int battle_counttargeted (struct block_list *bl, struct block_list *src,
- int target_lv);
-int battle_is_unarmed (struct block_list *bl);
-int battle_get_class (struct block_list *bl);
-int battle_get_dir (struct block_list *bl);
-int battle_get_lv (struct block_list *bl);
-int battle_get_range (struct block_list *bl);
-int battle_get_hp (struct block_list *bl);
-int battle_get_max_hp (struct block_list *bl);
-int battle_get_str (struct block_list *bl);
-int battle_get_agi (struct block_list *bl);
-int battle_get_vit (struct block_list *bl);
-int battle_get_int (struct block_list *bl);
-int battle_get_dex (struct block_list *bl);
-int battle_get_luk (struct block_list *bl);
-int battle_get_hit (struct block_list *bl);
-int battle_get_flee (struct block_list *bl);
-int battle_get_def (struct block_list *bl);
-int battle_get_mdef (struct block_list *bl);
-int battle_get_flee2 (struct block_list *bl);
-int battle_get_def2 (struct block_list *bl);
-int battle_get_mdef2 (struct block_list *bl);
-int battle_get_baseatk (struct block_list *bl);
-int battle_get_atk (struct block_list *bl);
-int battle_get_atk2 (struct block_list *bl);
-int battle_get_speed (struct block_list *bl);
-int battle_get_adelay (struct block_list *bl);
-int battle_get_amotion (struct block_list *bl);
-int battle_get_dmotion (struct block_list *bl);
-int battle_get_element (struct block_list *bl);
-int battle_get_attack_element (struct block_list *bl);
-int battle_get_attack_element2 (struct block_list *bl); //左手武器属性取得
-#define battle_get_elem_type(bl) (battle_get_element(bl)%10)
-#define battle_get_elem_level(bl) (battle_get_element(bl)/10/2)
-int battle_get_party_id (struct block_list *bl);
-int battle_get_guild_id (struct block_list *bl);
-int battle_get_race (struct block_list *bl);
-int battle_get_size (struct block_list *bl);
-int battle_get_mode (struct block_list *bl);
-int battle_get_mexp (struct block_list *bl);
-int battle_get_stat (int stat_id /* SP_VIT or similar */ ,
- struct block_list *bl);
-
-struct status_change *battle_get_sc_data (struct block_list *bl);
-short *battle_get_sc_count (struct block_list *bl);
-short *battle_get_opt1 (struct block_list *bl);
-short *battle_get_opt2 (struct block_list *bl);
-short *battle_get_opt3 (struct block_list *bl);
-short *battle_get_option (struct block_list *bl);
+ATK battle_weapon_attack(struct block_list *bl, struct block_list *target,
+ tick_t tick);
-enum
+int battle_is_unarmed(struct block_list *bl);
+int battle_get_class(struct block_list *bl);
+DIR battle_get_dir(struct block_list *bl);
+int battle_get_lv(struct block_list *bl);
+int battle_get_range(struct block_list *bl);
+int battle_get_hp(struct block_list *bl);
+int battle_get_max_hp(struct block_list *bl);
+int battle_get_str(struct block_list *bl);
+int battle_get_agi(struct block_list *bl);
+int battle_get_vit(struct block_list *bl);
+int battle_get_int(struct block_list *bl);
+int battle_get_dex(struct block_list *bl);
+int battle_get_luk(struct block_list *bl);
+int battle_get_def(struct block_list *bl);
+int battle_get_mdef(struct block_list *bl);
+int battle_get_def2(struct block_list *bl);
+int battle_get_mdef2(struct block_list *bl);
+interval_t battle_get_speed(struct block_list *bl);
+interval_t battle_get_adelay(struct block_list *bl);
+interval_t battle_get_amotion(struct block_list *bl);
+interval_t battle_get_dmotion(struct block_list *bl);
+LevelElement battle_get_element(struct block_list *bl);
+inline
+Element battle_get_elem_type(struct block_list *bl)
{
- BCT_NOENEMY = 0x00000,
- BCT_PARTY = 0x10000,
- BCT_ENEMY = 0x40000,
- BCT_NOPARTY = 0x50000,
- BCT_ALL = 0x20000,
- BCT_NOONE = 0x60000,
-};
-
-int battle_check_undead (int race, int element);
-int battle_check_target (struct block_list *src, struct block_list *target,
- int flag);
-int battle_check_range (struct block_list *src, struct block_list *bl,
- int range);
+ return battle_get_element(bl).element;
+}
+int battle_get_party_id(struct block_list *bl);
+Race battle_get_race(struct block_list *bl);
+MobMode battle_get_mode(struct block_list *bl);
+int battle_get_stat(SP stat_id, struct block_list *bl);
-// 設定
+eptr<struct status_change, StatusChange> battle_get_sc_data(struct block_list *bl);
+short *battle_get_sc_count(struct block_list *bl);
+Opt1 *battle_get_opt1(struct block_list *bl);
+Opt2 *battle_get_opt2(struct block_list *bl);
+Opt3 *battle_get_opt3(struct block_list *bl);
+Option *battle_get_option(struct block_list *bl);
-int battle_config_switch (const char *str); // [Valaris]
+bool battle_check_undead(Race race, Element element);
+int battle_check_target(struct block_list *src, struct block_list *target,
+ BCT flag);
+int battle_check_range(struct block_list *src, struct block_list *bl,
+ int range);
extern struct Battle_Config
{
- int warp_point_debug;
- int enemy_critical;
- int enemy_critical_rate;
- int enemy_str;
- int enemy_perfect_flee;
- int cast_rate, delay_rate, delay_dependon_dex;
- int sdelay_attack_enable;
- int left_cardfix_to_right;
- int pc_skill_add_range;
- int skill_out_range_consume;
- int mob_skill_add_range;
- int pc_damage_delay;
- int pc_damage_delay_rate;
- int defnotenemy;
- int random_monster_checklv;
- int attr_recover;
- int flooritem_lifetime;
- int item_auto_get;
- int item_first_get_time;
- int item_second_get_time;
- int item_third_get_time;
- int mvp_item_first_get_time;
- int mvp_item_second_get_time;
- int mvp_item_third_get_time;
- int item_rate, base_exp_rate, job_exp_rate; // removed item rate, depreciated
- int drop_rate0item;
- int death_penalty_type;
- int death_penalty_base, death_penalty_job;
- int pvp_exp; // [MouseJstr]
- int gtb_pvp_only; // [MouseJstr]
- int zeny_penalty;
- int restart_hp_rate;
- int restart_sp_rate;
- int mvp_item_rate, mvp_exp_rate;
- int mvp_hp_rate;
- int monster_hp_rate;
- int monster_max_aspd;
- int atc_gmonly;
- int atc_spawn_quantity_limit;
- int gm_allskill;
- int gm_allskill_addabra;
- int gm_allequip;
- int gm_skilluncond;
- int skillfree;
- int skillup_limit;
- int wp_rate;
- int pp_rate;
- int monster_active_enable;
- int monster_damage_delay_rate;
- int monster_loot_type;
- int mob_skill_use;
- int mob_count_rate;
- int quest_skill_learn;
- int quest_skill_reset;
- int basic_skill_check;
- int guild_emperium_check;
- int guild_exp_limit;
- int guild_max_castles;
- int pc_invincible_time;
- int skill_min_damage;
- int finger_offensive_type;
- int heal_exp;
- int resurrection_exp;
- int shop_exp;
- int combo_delay_rate;
- int item_check;
- int wedding_modifydisplay;
- int natural_healhp_interval;
- int natural_healsp_interval;
- int natural_heal_skill_interval;
- int natural_heal_weight_rate;
- int item_name_override_grffile;
- int arrow_decrement;
- int max_aspd;
- int max_hp;
- int max_sp;
- int max_lv;
- int max_parameter;
- int max_cart_weight;
- int pc_skill_log;
- int mob_skill_log;
- int battle_log;
- int save_log;
- int error_log;
- int etc_log;
- int save_clothcolor;
- int undead_detect_type;
- int pc_auto_counter_type;
- int monster_auto_counter_type;
- int agi_penaly_type;
- int agi_penaly_count;
- int agi_penaly_num;
- int vit_penaly_type;
- int vit_penaly_count;
- int vit_penaly_num;
- int player_defense_type;
- int monster_defense_type;
- int magic_defense_type;
- int pc_skill_reiteration;
- int monster_skill_reiteration;
- int pc_skill_nofootset;
- int monster_skill_nofootset;
- int pc_cloak_check_type;
- int monster_cloak_check_type;
- int gvg_short_damage_rate;
- int gvg_long_damage_rate;
- int gvg_magic_damage_rate;
- int gvg_misc_damage_rate;
- int gvg_eliminate_time;
- int mob_changetarget_byskill;
- int pc_attack_direction_change;
- int monster_attack_direction_change;
- int pc_undead_nofreeze;
- int pc_land_skill_limit;
- int monster_land_skill_limit;
- int party_skill_penaly;
- int monster_class_change_full_recover;
- int produce_item_name_input;
- int produce_potion_name_input;
- int making_arrow_name_input;
- int holywater_name_input;
- int display_delay_skill_fail;
- int chat_warpportal;
- int mob_warpportal;
- int dead_branch_active;
- int show_steal_in_same_party;
- int enable_upper_class;
- int mob_attack_attr_none;
- int mob_ghostring_fix;
- int pc_attack_attr_none;
- int item_rate_common, item_rate_card, item_rate_equip, item_rate_heal, item_rate_use; // Added by RoVeRT, Additional Heal and Usable item rate by Val
- int item_drop_common_min, item_drop_common_max; // Added by TyrNemesis^
- int item_drop_card_min, item_drop_card_max;
- int item_drop_equip_min, item_drop_equip_max;
- int item_drop_mvp_min, item_drop_mvp_max; // End Addition
- int item_drop_heal_min, item_drop_heal_max; // Added by Valatris
- int item_drop_use_min, item_drop_use_max; //End
+ int warp_point_debug;
+ int enemy_critical;
+ int enemy_critical_rate;
+ int enemy_str;
+ int enemy_perfect_flee;
+ int cast_rate, delay_rate, delay_dependon_dex;
+ int sdelay_attack_enable;
+ int left_cardfix_to_right;
+ int pc_skill_add_range;
+ int skill_out_range_consume;
+ int mob_skill_add_range;
+ int pc_damage_delay;
+ int defnotenemy;
+ int random_monster_checklv;
+ int attr_recover;
+ int flooritem_lifetime;
+ int item_auto_get;
+ int item_first_get_time;
+ int item_second_get_time;
+ int item_third_get_time;
+ int base_exp_rate, job_exp_rate;
+ int death_penalty_type;
+ int death_penalty_base, death_penalty_job;
+ int pvp_exp; // [MouseJstr]
+ int gtb_pvp_only; // [MouseJstr]
+ int zeny_penalty;
+ int restart_hp_rate;
+ int restart_sp_rate;
+ int monster_hp_rate;
+ int monster_max_aspd;
+ int atc_gmonly;
+ int atc_spawn_quantity_limit;
+ int gm_allskill;
+ int gm_allskill_addabra;
+ int gm_allequip;
+ int gm_skilluncond;
+ int skillfree;
+ int skillup_limit;
+ int wp_rate;
+ int pp_rate;
+ int monster_active_enable;
+ int monster_loot_type;
+ int mob_skill_use;
+ int mob_count_rate;
+ int quest_skill_learn;
+ int quest_skill_reset;
+ int basic_skill_check;
+ int pc_invincible_time;
+ int skill_min_damage;
+ int finger_offensive_type;
+ int heal_exp;
+ int resurrection_exp;
+ int shop_exp;
+ int combo_delay_rate;
+ int item_check;
+ int wedding_modifydisplay;
+ int natural_healhp_interval;
+ int natural_healsp_interval;
+ int natural_heal_skill_interval;
+ int natural_heal_weight_rate;
+ int item_name_override_grffile;
+ int arrow_decrement;
+ int max_aspd;
+ int max_hp;
+ int max_sp;
+ int max_lv;
+ int max_parameter;
+ int max_cart_weight;
+ int pc_skill_log;
+ int mob_skill_log;
+ int battle_log;
+ int save_log;
+ int error_log;
+ int etc_log;
+ int save_clothcolor;
+ int undead_detect_type;
+ int pc_auto_counter_type;
+ int monster_auto_counter_type;
+ int agi_penaly_type;
+ int agi_penaly_count;
+ int agi_penaly_num;
+ int vit_penaly_type;
+ int vit_penaly_count;
+ int vit_penaly_num;
+ int pc_skill_reiteration;
+ int monster_skill_reiteration;
+ int pc_skill_nofootset;
+ int monster_skill_nofootset;
+ int pc_cloak_check_type;
+ int monster_cloak_check_type;
+ int mob_changetarget_byskill;
+ int pc_attack_direction_change;
+ int monster_attack_direction_change;
+ int pc_undead_nofreeze;
+ int pc_land_skill_limit;
+ int monster_land_skill_limit;
+ int party_skill_penaly;
+ int monster_class_change_full_recover;
+ int produce_item_name_input;
+ int produce_potion_name_input;
+ int making_arrow_name_input;
+ int holywater_name_input;
+ int display_delay_skill_fail;
+ int chat_warpportal;
+ int mob_warpportal;
+ int dead_branch_active;
+ int show_steal_in_same_party;
+ int enable_upper_class;
+ int mob_attack_attr_none;
+ int mob_ghostring_fix;
+ int pc_attack_attr_none;
- int prevent_logout; // Added by RoVeRT
+ int prevent_logout; // Added by RoVeRT
- int alchemist_summon_reward; // [Valaris]
- int maximum_level;
- int drops_by_luk;
- int monsters_ignore_gm;
- int equipment_breaking;
- int equipment_break_rate;
- int multi_level_up;
- int pk_mode;
- int show_mob_hp; // end additions [Valaris]
+ int alchemist_summon_reward; // [Valaris]
+ int maximum_level;
+ int drops_by_luk;
+ int monsters_ignore_gm;
+ int multi_level_up;
+ int pk_mode;
+ int show_mob_hp; // end additions [Valaris]
- int agi_penaly_count_lv;
- int vit_penaly_count_lv;
+ int agi_penaly_count_lv;
+ int vit_penaly_count_lv;
- int gx_allhit;
- int gx_cardfix;
- int gx_dupele;
- int gx_disptype;
- int player_skill_partner_check;
- int hide_GM_session;
- int unit_movement_type;
- int invite_request_check;
- int skill_removetrap_type;
- int disp_experience;
- int castle_defense_rate;
- int riding_weight;
- int backstab_bow_penalty;
+ int gx_allhit;
+ int gx_cardfix;
+ int gx_dupele;
+ int gx_disptype;
+ int player_skill_partner_check;
+ int hide_GM_session;
+ int unit_movement_type;
+ int invite_request_check;
+ int skill_removetrap_type;
+ int disp_experience;
+ int riding_weight;
+ int backstab_bow_penalty;
- int night_at_start; // added by [Yor]
- int day_duration; // added by [Yor]
- int night_duration; // added by [Yor]
- int hack_info_GM_level; // added by [Yor]
- int any_warp_GM_min_level; // added by [Yor]
- int packet_ver_flag; // added by [Yor]
- int muting_players; // added by [Apple]
+ int hack_info_GM_level; // added by [Yor]
+ int any_warp_GM_min_level; // added by [Yor]
+ int packet_ver_flag; // added by [Yor]
- int min_hair_style; // added by [MouseJstr]
- int max_hair_style; // added by [MouseJstr]
- int min_hair_color; // added by [MouseJstr]
- int max_hair_color; // added by [MouseJstr]
- int min_cloth_color; // added by [MouseJstr]
- int max_cloth_color; // added by [MouseJstr]
+ int min_hair_style; // added by [MouseJstr]
+ int max_hair_style; // added by [MouseJstr]
+ int min_hair_color; // added by [MouseJstr]
+ int max_hair_color; // added by [MouseJstr]
+ int min_cloth_color; // added by [MouseJstr]
+ int max_cloth_color; // added by [MouseJstr]
- int castrate_dex_scale; // added by [MouseJstr]
- int area_size; // added by [MouseJstr]
+ int castrate_dex_scale; // added by [MouseJstr]
+ int area_size; // added by [MouseJstr]
- int chat_lame_penalty;
- int chat_spam_threshold;
- int chat_spam_flood;
- int chat_spam_ban;
- int chat_spam_warn;
- int chat_maxline;
+ int chat_lame_penalty;
+ int chat_spam_threshold;
+ int chat_spam_flood;
+ int chat_spam_ban;
+ int chat_spam_warn;
+ int chat_maxline;
- int packet_spam_threshold;
- int packet_spam_flood;
- int packet_spam_kick;
+ int packet_spam_threshold;
+ int packet_spam_flood;
+ int packet_spam_kick;
- int mask_ip_gms;
+ int mask_ip_gms;
- int drop_pickup_safety_zone; // [Fate] Max. distance to an object dropped by a kill by self in which dropsteal protection works
- int itemheal_regeneration_factor; // [Fate] itemheal speed factor
+ int drop_pickup_safety_zone; // [Fate] Max. distance to an object dropped by a kill by self in which dropsteal protection works
+ int itemheal_regeneration_factor; // [Fate] itemheal speed factor
- int mob_splash_radius;
+ int mob_splash_radius;
} battle_config;
-int battle_config_read (const char *cfgName);
+int battle_config_read(const char *cfgName);
-#endif
+#endif // BATTLE_HPP
diff --git a/src/map/battle.t.hpp b/src/map/battle.t.hpp
new file mode 100644
index 0000000..e374298
--- /dev/null
+++ b/src/map/battle.t.hpp
@@ -0,0 +1,223 @@
+#ifndef BATTLE_T_HPP
+#define BATTLE_T_HPP
+
+#include "../common/utils2.hpp"
+
+namespace e
+{
+enum class BF : uint16_t
+{
+ ZERO = 0x0000,
+ NEGATIVE_1 = 0xffff,
+
+ WEAPON = 0x0001,
+ MAGIC = 0x0002,
+ MISC = 0x0004,
+ SHORT = 0x0010,
+ LONG = 0x0040,
+ SKILL = 0x0100,
+ NORMAL = 0x0200,
+ WEAPONMASK = 0x000f,
+ RANGEMASK = 0x00f0,
+ SKILLMASK = 0x0f00,
+};
+ENUM_BITWISE_OPERATORS(BF)
+}
+using e::BF;
+
+struct BCT
+{
+ // former representation:
+ uint8_t lo; // 0x 00 00 00 ff
+ uint8_t mid; // 0x 00 00 ff 00
+ uint8_t classic:4; // 0x 00 0f 00 00
+ uint8_t level:4; // 0x 00 f0 00 00
+ uint8_t unused; // 0x ff 00 00 00
+
+ explicit
+ operator bool() { return lo || mid || classic || level || unused; }
+};
+
+constexpr
+BCT operator & (BCT l, BCT r) { return {uint8_t(l.lo & r.lo), uint8_t(l.mid & r.mid), uint8_t(l.classic & r.classic), uint8_t(l.level & r.level), uint8_t(l.unused & r.unused) }; }
+constexpr
+BCT operator | (BCT l, BCT r) { return {uint8_t(l.lo | r.lo), uint8_t(l.mid | r.mid), uint8_t(l.classic | r.classic), uint8_t(l.level | r.level), uint8_t(l.unused | r.unused) }; }
+constexpr
+BCT operator ^ (BCT l, BCT r) { return {uint8_t(l.lo ^ r.lo), uint8_t(l.mid ^ r.mid), uint8_t(l.classic ^ r.classic), uint8_t(l.level ^ r.level), uint8_t(l.unused ^ r.unused) }; }
+inline
+BCT& operator &= (BCT& l, BCT r) { return l = l & r; }
+inline
+BCT& operator |= (BCT& l, BCT r) { return l = l & r; }
+inline
+BCT& operator ^= (BCT& l, BCT r) { return l = l & r; }
+// BCT operator ~(BCT r);
+
+constexpr
+bool operator == (BCT l, BCT r) { return l.lo == r.lo && l.mid == r.mid && l.classic == r.classic && l.level == r.level && l.unused == r.unused; }
+constexpr
+bool operator != (BCT l, BCT r) { return !(l == r); }
+
+constexpr
+BCT BCT_NOENEMY = {0x00, 0x00, 0x0, 0x0, 0x00};
+constexpr
+BCT BCT_ZERO = BCT_NOENEMY;
+constexpr
+BCT BCT_PARTY = {0x00, 0x00, 0x1, 0x0, 0x00};
+constexpr
+BCT BCT_ENEMY = {0x00, 0x00, 0x4, 0x0, 0x00};
+constexpr
+BCT BCT_NOPARTY = {0x00, 0x00, 0x5, 0x0, 0x00};
+constexpr
+BCT BCT_ALL = {0x00, 0x00, 0x2, 0x0, 0x00};
+constexpr
+BCT BCT_NOONE = {0x00, 0x00, 0x6, 0x0, 0x00};
+
+constexpr
+BCT BCT_lo_x01 = {0x01, 0x00, 0x0, 0x0, 0x00};
+constexpr
+BCT BCT_lo_x02 = {0x02, 0x00, 0x0, 0x0, 0x00};
+constexpr
+BCT BCT_mid_x05 = {0x00, 0x05, 0x0, 0x0, 0x00};
+constexpr
+BCT BCT_mid_x80 = {0x00, 0x80, 0x0, 0x0, 0x00};
+
+constexpr
+BCT BCT_highnib = {0x00, 0x00, 0x0, 0xf, 0x00};
+
+enum class Element : uint8_t
+{
+ neutral = 0,
+ water = 1,
+ earth = 2,
+ fire = 3,
+ wind = 4,
+ poison = 5,
+ _holy = 6,
+ dark = 7,
+ _spirit = 8,
+ undead = 9,
+
+ COUNT = 10,
+};
+
+enum class Race : uint8_t
+{
+ formless = 0,
+ undead = 1,
+ _brute = 2,
+ plant = 3,
+ _insect = 4,
+ _fish = 5,
+ _demon = 6,
+ demihuman = 7,
+ _angel = 8,
+ _dragon = 9,
+ // special - one of these is applied in addition
+ boss = 10,
+ other = 11,
+
+ COUNT = 12,
+};
+
+struct LevelElement
+{
+ uint8_t level;
+ Element element;
+
+ static
+ LevelElement unpack(int packed)
+ {
+ LevelElement le;
+ le.element = static_cast<Element>(packed % 10);
+ le.level = packed / 10;
+ return le;
+ }
+ int pack() const
+ {
+ return level * 10 + static_cast<uint8_t>(element);
+ }
+};
+
+namespace e
+{
+enum class Elements : uint16_t
+{
+ ZERO = 0x0000,
+ neutral = 1 << 0,
+ water = 1 << 1,
+ earth = 1 << 2,
+ fire = 1 << 3,
+ wind = 1 << 4,
+ poison = 1 << 5,
+ _holy = 1 << 6,
+ dark = 1 << 7,
+ _spirit = 1 << 8,
+ undead = 1 << 9,
+};
+ENUM_BITWISE_OPERATORS(Elements)
+
+enum class Races : uint16_t
+{
+ ZERO = 0x0000,
+ formless = 1 << 0,
+ undead = 1 << 1,
+ _brute = 1 << 2,
+ plant = 1 << 3,
+ _insect = 1 << 4,
+ _fish = 1 << 5,
+ _demon = 1 << 6,
+ demihuman = 1 << 7,
+ _angel = 1 << 8,
+ _dragon = 1 << 9,
+ // special - one of these is applied in addition
+ boss = 1 << 10,
+ other = 1 << 11,
+};
+ENUM_BITWISE_OPERATORS(Races)
+}
+using e::Elements;
+using e::Races;
+
+constexpr
+earray<Elements, Element, Element::COUNT> element_shift //=
+{{
+ Elements::neutral,
+ Elements::water,
+ Elements::earth,
+ Elements::fire,
+ Elements::wind,
+ Elements::poison,
+ Elements::_holy,
+ Elements::dark,
+ Elements::_spirit,
+ Elements::undead,
+}};
+
+constexpr
+earray<Races, Race, Race::COUNT> race_shift //=
+{{
+ Races::formless,
+ Races::undead,
+ Races::_brute,
+ Races::plant,
+ Races::_insect,
+ Races::_fish,
+ Races::_demon,
+ Races::demihuman,
+ Races::_angel,
+ Races::_dragon,
+ Races::boss,
+ Races::other,
+}};
+
+enum class DamageType : uint8_t
+{
+ NORMAL = 0x00,
+ TAKEITEM = 0x01,
+ RETURNED = 0x04,
+ DOUBLED = 0x08,
+ CRITICAL = 0x0a,
+ FLEE2 = 0x0b,
+};
+
+#endif // BATTLE_T_HPP
diff --git a/src/map/chat.cpp b/src/map/chat.cpp
index cb274f8..0d3bb95 100644
--- a/src/map/chat.cpp
+++ b/src/map/chat.cpp
@@ -1,117 +1,33 @@
-// $Id: chat.c,v 1.2 2004/09/22 02:59:47 Akitasha Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/db.hpp"
-#include "../common/nullpo.hpp"
-#include "map.hpp"
-#include "clif.hpp"
-#include "pc.hpp"
#include "chat.hpp"
-#include "npc.hpp"
-
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
-
-int chat_triggerevent (struct chat_data *cd);
-
-/*==========================================
- * チャットルーム作成
- *------------------------------------------
- */
-int chat_createchat (struct map_session_data *sd, int limit, int pub,
- const char *pass, const char *title, int titlelen)
-{
- struct chat_data *cd;
-
- nullpo_retr (0, sd);
-
- CREATE(cd, struct chat_data, 1);
-
- cd->limit = limit;
- cd->pub = pub;
- cd->users = 1;
- memcpy (cd->pass, pass, 8);
- if (titlelen >= sizeof (cd->title) - 1)
- titlelen = sizeof (cd->title) - 1;
- memcpy (cd->title, title, titlelen);
- cd->title[titlelen] = 0;
-
- cd->owner = (struct block_list **) (&cd->usersd[0]);
- cd->usersd[0] = sd;
- cd->bl.m = sd->bl.m;
- cd->bl.x = sd->bl.x;
- cd->bl.y = sd->bl.y;
- cd->bl.type = BL_CHAT;
-
- cd->bl.id = map_addobject (&cd->bl);
- if (cd->bl.id == 0)
- {
- clif_createchat (sd, 1);
- free (cd);
- return 0;
- }
- pc_setchatid (sd, cd->bl.id);
-
- clif_createchat (sd, 0);
- clif_dispchat (cd, 0);
-
- return 0;
-}
-
-/*==========================================
- * 既存チャットルームに参加
- *------------------------------------------
- */
-int chat_joinchat (struct map_session_data *sd, int chatid, const char *pass)
-{
- struct chat_data *cd;
-
- nullpo_retr (0, sd);
-
- cd = (struct chat_data *) map_id2bl (chatid);
- if (cd == NULL)
- return 1;
- if (cd->bl.m != sd->bl.m || cd->limit <= cd->users)
- {
- clif_joinchatfail (sd, 0);
- return 0;
- }
- if (cd->pub == 0 && strncmp (pass, cd->pass, 8))
- {
- clif_joinchatfail (sd, 1);
- return 0;
- }
+#include <cstdlib>
+#include <cstring>
- cd->usersd[cd->users] = sd;
- cd->users++;
-
- pc_setchatid (sd, cd->bl.id);
+#include "../common/nullpo.hpp"
- clif_joinchatok (sd, cd); // 新たに参加した人には全員のリスト
- clif_addchat (cd, sd); // 既に中に居た人には追加した人の報告
- clif_dispchat (cd, 0); // 周囲の人には人数変化報告
+#include "map.hpp"
+#include "npc.hpp"
+#include "pc.hpp"
- chat_triggerevent (cd); // イベント
+#include "../poison.hpp"
- return 0;
-}
+static
+int chat_triggerevent(struct chat_data *cd);
+static
+int chat_npckickall(struct chat_data *cd);
/*==========================================
* チャットルームから抜ける
*------------------------------------------
*/
-int chat_leavechat (struct map_session_data *sd)
+int chat_leavechat(struct map_session_data *sd)
{
struct chat_data *cd;
- int i, leavechar;
+ int i, leavechar;
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
- cd = (struct chat_data *) map_id2bl (sd->chatID);
+ cd = (struct chat_data *) map_id2bl(sd->chatID);
if (cd == NULL)
return 1;
@@ -126,144 +42,25 @@ int chat_leavechat (struct map_session_data *sd)
if (leavechar < 0) // そのchatに所属していないらしい (バグ時のみ)
return -1;
- if (leavechar == 0 && cd->users > 1 && (*cd->owner)->type == BL_PC)
- {
- // 所有者だった&他に人が居る&PCのチャット
- clif_changechatowner (cd, cd->usersd[1]);
- clif_clearchat (cd, 0);
- }
-
- // 抜けるPCにも送るのでusersを減らす前に実行
- clif_leavechat (cd, sd);
-
cd->users--;
- pc_setchatid (sd, 0);
+ pc_setchatid(sd, 0);
- if (cd->users == 0 && (*cd->owner)->type == BL_PC)
+ if (cd->users == 0 && (*cd->owner)->type == BL::PC)
{
// 全員居なくなった&PCのチャットなので消す
- clif_clearchat (cd, 0);
- map_delobject (cd->bl.id, BL_CHAT); // freeまでしてくれる
+ map_delobject(cd->bl.id, BL::CHAT); // freeまでしてくれる
}
else
{
for (i = leavechar; i < cd->users; i++)
cd->usersd[i] = cd->usersd[i + 1];
- if (leavechar == 0 && (*cd->owner)->type == BL_PC)
+ if (leavechar == 0 && (*cd->owner)->type == BL::PC)
{
// PCのチャットなので所有者が抜けたので位置変更
cd->bl.x = cd->usersd[0]->bl.x;
cd->bl.y = cd->usersd[0]->bl.y;
}
- clif_dispchat (cd, 0);
- }
-
- return 0;
-}
-
-/*==========================================
- * チャットルームの持ち主を譲る
- *------------------------------------------
- */
-int chat_changechatowner (struct map_session_data *sd, const char *nextownername)
-{
- struct chat_data *cd;
- struct map_session_data *tmp_sd;
- int i, nextowner;
-
- nullpo_retr (1, sd);
-
- cd = (struct chat_data *) map_id2bl (sd->chatID);
- if (cd == NULL || (struct block_list *) sd != (*cd->owner))
- return 1;
-
- for (i = 1, nextowner = -1; i < cd->users; i++)
- {
- if (strcmp (cd->usersd[i]->status.name, nextownername) == 0)
- {
- nextowner = i;
- break;
- }
- }
- if (nextowner < 0) // そんな人は居ない
- return -1;
-
- clif_changechatowner (cd, cd->usersd[nextowner]);
- // 一旦消す
- clif_clearchat (cd, 0);
-
- // userlistの順番変更 (0が所有者なので)
- if ((tmp_sd = cd->usersd[0]) == NULL)
- return 1; //ありえるのかな?
- cd->usersd[0] = cd->usersd[nextowner];
- cd->usersd[nextowner] = tmp_sd;
-
- // 新しい所有者の位置へ変更
- cd->bl.x = cd->usersd[0]->bl.x;
- cd->bl.y = cd->usersd[0]->bl.y;
-
- // 再度表示
- clif_dispchat (cd, 0);
-
- return 0;
-}
-
-/*==========================================
- * チャットの状態(タイトル等)を変更
- *------------------------------------------
- */
-int chat_changechatstatus (struct map_session_data *sd, int limit, int pub,
- const char *pass, const char *title, int titlelen)
-{
- struct chat_data *cd;
-
- nullpo_retr (1, sd);
-
- cd = (struct chat_data *) map_id2bl (sd->chatID);
- if (cd == NULL || (struct block_list *) sd != (*cd->owner))
- return 1;
-
- cd->limit = limit;
- cd->pub = pub;
- memcpy (cd->pass, pass, 8);
- if (titlelen >= sizeof (cd->title) - 1)
- titlelen = sizeof (cd->title) - 1;
- memcpy (cd->title, title, titlelen);
- cd->title[titlelen] = 0;
-
- clif_changechatstatus (cd);
- clif_dispchat (cd, 0);
-
- return 0;
-}
-
-/*==========================================
- * チャットルームから蹴り出す
- *------------------------------------------
- */
-int chat_kickchat (struct map_session_data *sd, const char *kickusername)
-{
- struct chat_data *cd;
- int i, kickuser;
-
- nullpo_retr (1, sd);
-
- cd = (struct chat_data *) map_id2bl (sd->chatID);
- if (cd == NULL || (struct block_list *) sd != (*cd->owner))
- return 1;
-
- for (i = 0, kickuser = -1; i < cd->users; i++)
- {
- if (strcmp (cd->usersd[i]->status.name, kickusername) == 0)
- {
- kickuser = i;
- break;
- }
}
- if (kickuser < 0) // そんな人は居ない
- return -1;
-
- chat_leavechat (cd->usersd[kickuser]);
return 0;
}
@@ -272,44 +69,42 @@ int chat_kickchat (struct map_session_data *sd, const char *kickusername)
* npcチャットルーム作成
*------------------------------------------
*/
-int chat_createnpcchat (struct npc_data *nd, int limit, int pub, int trigger,
+int chat_createnpcchat(struct npc_data *nd, int limit, int pub, int trigger,
const char *title, int titlelen, const char *ev)
{
struct chat_data *cd;
- nullpo_retr (1, nd);
+ nullpo_retr(1, nd);
- CREATE (cd, struct chat_data, 1);
+ CREATE(cd, struct chat_data, 1);
cd->limit = cd->trigger = limit;
if (trigger > 0)
cd->trigger = trigger;
cd->pub = pub;
cd->users = 0;
- memcpy (cd->pass, "", 8);
- if (titlelen >= sizeof (cd->title) - 1)
- titlelen = sizeof (cd->title) - 1;
- memcpy (cd->title, title, titlelen);
+ memcpy(cd->pass, "", 8);
+ if (titlelen >= sizeof(cd->title) - 1)
+ titlelen = sizeof(cd->title) - 1;
+ memcpy(cd->title, title, titlelen);
cd->title[titlelen] = 0;
cd->bl.m = nd->bl.m;
cd->bl.x = nd->bl.x;
cd->bl.y = nd->bl.y;
- cd->bl.type = BL_CHAT;
+ cd->bl.type = BL::CHAT;
cd->owner_ = (struct block_list *) nd;
cd->owner = &cd->owner_;
- memcpy (cd->npc_event, ev, sizeof (cd->npc_event));
+ memcpy(cd->npc_event, ev, sizeof(cd->npc_event));
- cd->bl.id = map_addobject (&cd->bl);
+ cd->bl.id = map_addobject(&cd->bl);
if (cd->bl.id == 0)
{
- free (cd);
+ free(cd);
return 0;
}
nd->chat_id = cd->bl.id;
- clif_dispchat (cd, 0);
-
return 0;
}
@@ -317,16 +112,16 @@ int chat_createnpcchat (struct npc_data *nd, int limit, int pub, int trigger,
* npcチャットルーム削除
*------------------------------------------
*/
-int chat_deletenpcchat (struct npc_data *nd)
+int chat_deletenpcchat(struct npc_data *nd)
{
struct chat_data *cd;
- nullpo_retr (0, nd);
- nullpo_retr (0, cd = (struct chat_data *) map_id2bl (nd->chat_id));
+ nullpo_ret(nd);
+ cd = (struct chat_data *) map_id2bl(nd->chat_id);
+ nullpo_ret(cd);
- chat_npckickall (cd);
- clif_clearchat (cd, 0);
- map_delobject (cd->bl.id, BL_CHAT); // freeまでしてくれる
+ chat_npckickall(cd);
+ map_delobject(cd->bl.id, BL::CHAT); // freeまでしてくれる
nd->chat_id = 0;
return 0;
@@ -336,12 +131,12 @@ int chat_deletenpcchat (struct npc_data *nd)
* 規定人数以上でイベントが定義されてるなら実行
*------------------------------------------
*/
-int chat_triggerevent (struct chat_data *cd)
+int chat_triggerevent(struct chat_data *cd)
{
- nullpo_retr (0, cd);
+ nullpo_ret(cd);
if (cd->users >= cd->trigger && cd->npc_event[0])
- npc_event_do (cd->npc_event);
+ npc_event_do(cd->npc_event);
return 0;
}
@@ -349,12 +144,12 @@ int chat_triggerevent (struct chat_data *cd)
* イベントの有効化
*------------------------------------------
*/
-int chat_enableevent (struct chat_data *cd)
+int chat_enableevent(struct chat_data *cd)
{
- nullpo_retr (0, cd);
+ nullpo_ret(cd);
cd->trigger &= 0x7f;
- chat_triggerevent (cd);
+ chat_triggerevent(cd);
return 0;
}
@@ -362,9 +157,9 @@ int chat_enableevent (struct chat_data *cd)
* イベントの無効化
*------------------------------------------
*/
-int chat_disableevent (struct chat_data *cd)
+int chat_disableevent(struct chat_data *cd)
{
- nullpo_retr (0, cd);
+ nullpo_ret(cd);
cd->trigger |= 0x80;
return 0;
@@ -374,22 +169,13 @@ int chat_disableevent (struct chat_data *cd)
* チャットルームから全員蹴り出す
*------------------------------------------
*/
-int chat_npckickall (struct chat_data *cd)
+int chat_npckickall(struct chat_data *cd)
{
- nullpo_retr (0, cd);
+ nullpo_ret(cd);
while (cd->users > 0)
{
- chat_leavechat (cd->usersd[cd->users - 1]);
+ chat_leavechat(cd->usersd[cd->users - 1]);
}
return 0;
}
-
-/*==========================================
- * 終了
- *------------------------------------------
- */
-int do_final_chat (void)
-{
- return 0;
-}
diff --git a/src/map/chat.hpp b/src/map/chat.hpp
index fca9217..ead7b49 100644
--- a/src/map/chat.hpp
+++ b/src/map/chat.hpp
@@ -1,25 +1,12 @@
-// $Id: chat.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
#ifndef CHAT_HPP
#define CHAT_HPP
-#include "map.hpp"
+int chat_leavechat(struct map_session_data *);
-int chat_createchat (struct map_session_data *, int, int, const char *, const char *,
- int);
-int chat_joinchat (struct map_session_data *, int, const char *);
-int chat_leavechat (struct map_session_data *);
-int chat_changechatowner (struct map_session_data *, const char *);
-int chat_changechatstatus (struct map_session_data *, int, int, const char *,
- const char *, int);
-int chat_kickchat (struct map_session_data *, const char *);
+int chat_createnpcchat(struct npc_data *nd, int limit, int pub, int trigger,
+ const char *title, int titlelen, const char *ev);
+int chat_deletenpcchat(struct npc_data *nd);
+int chat_enableevent(struct chat_data *cd);
+int chat_disableevent(struct chat_data *cd);
-int chat_createnpcchat (struct npc_data *nd, int limit, int pub, int trigger,
- const char *title, int titlelen, const char *ev);
-int chat_deletenpcchat (struct npc_data *nd);
-int chat_enableevent (struct chat_data *cd);
-int chat_disableevent (struct chat_data *cd);
-int chat_npckickall (struct chat_data *cd);
-
-int do_final_chat (void);
-
-#endif
+#endif // CHAT_HPP
diff --git a/src/map/chrif.cpp b/src/map/chrif.cpp
index 24d5d26..6742f88 100644
--- a/src/map/chrif.cpp
+++ b/src/map/chrif.cpp
@@ -1,71 +1,66 @@
-// $Id: chrif.c,v 1.6 2004/09/25 11:39:17 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef LCCWIN32
-#include <winsock.h>
-#else
-#include <unistd.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
+#include "chrif.hpp"
+
#include <arpa/inet.h>
-#endif
-#include <sys/types.h>
-#include <time.h>
+#include <cstring>
+
+#include "../common/cxxstdio.hpp"
+#include "../common/nullpo.hpp"
#include "../common/socket.hpp"
#include "../common/timer.hpp"
-#include "map.hpp"
+#include "../common/utils.hpp"
+
#include "battle.hpp"
-#include "chrif.hpp"
#include "clif.hpp"
#include "intif.hpp"
+#include "itemdb.hpp"
+#include "map.hpp"
#include "npc.hpp"
#include "pc.hpp"
-#include "../common/nullpo.hpp"
-#include "itemdb.hpp"
+#include "storage.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
+#include "../poison.hpp"
-static const int packet_len_table[0x20] = {
+static
+const int packet_len_table[0x20] = {
60, 3, 10, 27, 22, -1, 6, -1, // 2af8-2aff
6, -1, 18, 7, -1, 49, 44, 0, // 2b00-2b07
6, 30, -1, 10, 86, 7, 44, 34, // 2b08-2b0f
-1, -1, 10, 6, 11, -1, 0, 0, // 2b10-2b17
};
-int char_fd;
-int srvinfo;
-static char char_ip_str[16];
-static int char_ip;
-static int char_port = 6121;
-static char userid[24], passwd[24];
-static int chrif_state;
+int char_fd;
+static
+char char_ip_str[16];
+static
+int char_ip;
+static
+int char_port = 6121;
+static
+char userid[24], passwd[24];
+static
+int chrif_state;
// 設定ファイル読み込み関係
/*==========================================
*
*------------------------------------------
*/
-void chrif_setuserid (char *id)
+void chrif_setuserid(const char *id)
{
- strncpy (userid, id, sizeof(userid)-1);
- userid[sizeof(userid)-1] = '\0';
+ strzcpy(userid, id, sizeof(userid));
}
/*==========================================
*
*------------------------------------------
*/
-void chrif_setpasswd (char *pwd)
+void chrif_setpasswd(const char *pwd)
{
- strncpy (passwd, pwd, sizeof(passwd)-1);
- passwd[sizeof(passwd)-1] = '\0';
+ strzcpy(passwd, pwd, sizeof(passwd));
}
-char *chrif_getpasswd (void)
+char *chrif_getpasswd(void)
{
return passwd;
}
@@ -74,18 +69,17 @@ char *chrif_getpasswd (void)
*
*------------------------------------------
*/
-void chrif_setip (char *ip)
+void chrif_setip(const char *ip)
{
- strncpy (char_ip_str, ip, sizeof(char_ip_str)-1);
- char_ip_str[sizeof(char_ip_str)-1] = '\0';
- char_ip = inet_addr (char_ip_str);
+ strzcpy(char_ip_str, ip, sizeof(char_ip_str));
+ char_ip = inet_addr(char_ip_str);
}
/*==========================================
*
*------------------------------------------
*/
-void chrif_setport (int port)
+void chrif_setport(int port)
{
char_port = port;
}
@@ -94,7 +88,7 @@ void chrif_setport (int port)
*
*------------------------------------------
*/
-int chrif_isconnect (void)
+int chrif_isconnect(void)
{
return chrif_state == 2;
}
@@ -103,28 +97,25 @@ int chrif_isconnect (void)
*
*------------------------------------------
*/
-int chrif_save (struct map_session_data *sd)
+int chrif_save(struct map_session_data *sd)
{
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
if (char_fd < 0)
return -1;
- pc_makesavestatus (sd);
+ pc_makesavestatus(sd);
- WFIFOW (char_fd, 0) = 0x2b01;
- WFIFOW (char_fd, 2) = sizeof (sd->status) + 12;
- WFIFOL (char_fd, 4) = sd->bl.id;
- WFIFOL (char_fd, 8) = sd->char_id;
- memcpy (WFIFOP (char_fd, 12), &sd->status, sizeof (sd->status));
- WFIFOSET (char_fd, WFIFOW (char_fd, 2));
+ WFIFOW(char_fd, 0) = 0x2b01;
+ WFIFOW(char_fd, 2) = sizeof(sd->status) + 12;
+ WFIFOL(char_fd, 4) = sd->bl.id;
+ WFIFOL(char_fd, 8) = sd->char_id;
+ memcpy(WFIFOP(char_fd, 12), &sd->status, sizeof(sd->status));
+ WFIFOSET(char_fd, WFIFOW(char_fd, 2));
//For data sync
- if (sd->state.storage_flag == 1)
- storage_storage_save (sd->status.account_id, 0);
- else if (sd->state.storage_flag == 2)
- storage_guild_storagesave (sd->status.account_id, sd->status.guild_id,
- 0);
+ if (sd->state.storage_open)
+ storage_storage_save(sd->status.account_id, 0);
return 0;
}
@@ -134,15 +125,15 @@ int chrif_save (struct map_session_data *sd)
*------------------------------------------
*/
static
-int chrif_connect (int fd)
+int chrif_connect(int fd)
{
- WFIFOW (fd, 0) = 0x2af8;
- memcpy (WFIFOP (fd, 2), userid, 24);
- memcpy (WFIFOP (fd, 26), passwd, 24);
- WFIFOL (fd, 50) = 0;
- WFIFOL (fd, 54) = clif_getip ().s_addr;
- WFIFOW (fd, 58) = clif_getport (); // [Valaris] thanks to fov
- WFIFOSET (fd, 60);
+ WFIFOW(fd, 0) = 0x2af8;
+ memcpy(WFIFOP(fd, 2), userid, 24);
+ memcpy(WFIFOP(fd, 26), passwd, 24);
+ WFIFOL(fd, 50) = 0;
+ WFIFOL(fd, 54) = clif_getip().s_addr;
+ WFIFOW(fd, 58) = clif_getport(); // [Valaris] thanks to fov
+ WFIFOSET(fd, 60);
return 0;
}
@@ -152,18 +143,18 @@ int chrif_connect (int fd)
*------------------------------------------
*/
static
-int chrif_sendmap (int fd)
+int chrif_sendmap(int fd)
{
- int i;
+ int i;
- WFIFOW (fd, 0) = 0x2afa;
+ WFIFOW(fd, 0) = 0x2afa;
for (i = 0; i < map_num; i++)
if (map[i].alias[0] != '\0') // [MouseJstr] map aliasing
- memcpy (WFIFOP (fd, 4 + i * 16), map[i].alias, 16);
+ memcpy(WFIFOP(fd, 4 + i * 16), map[i].alias, 16);
else
- memcpy (WFIFOP (fd, 4 + i * 16), map[i].name, 16);
- WFIFOW (fd, 2) = 4 + i * 16;
- WFIFOSET (fd, WFIFOW (fd, 2));
+ memcpy(WFIFOP(fd, 4 + i * 16), map[i].name, 16);
+ WFIFOW(fd, 2) = 4 + i * 16;
+ WFIFOSET(fd, WFIFOW(fd, 2));
return 0;
}
@@ -173,24 +164,24 @@ int chrif_sendmap (int fd)
*------------------------------------------
*/
static
-int chrif_recvmap (int fd)
+int chrif_recvmap(int fd)
{
- int i, j, port;
+ int i, j, port;
if (chrif_state < 2) // まだ準備中
return -1;
struct in_addr ip;
- ip.s_addr = RFIFOL (fd, 4);
- port = RFIFOW (fd, 8);
- for (i = 10, j = 0; i < RFIFOW (fd, 2); i += 16, j++)
+ ip.s_addr = RFIFOL(fd, 4);
+ port = RFIFOW(fd, 8);
+ for (i = 10, j = 0; i < RFIFOW(fd, 2); i += 16, j++)
{
- map_setipport ((const char *)RFIFOP (fd, i), ip, port);
+ map_setipport((const char *)RFIFOP(fd, i), ip, port);
// if (battle_config.etc_log)
-// printf("recv map %d %s\n", j, RFIFOP(fd,i));
+// PRINTF("recv map %d %s\n", j, RFIFOP(fd,i));
}
if (battle_config.etc_log)
- printf ("recv map on %s:%d (%d maps)\n", ip2str(ip), port, j);
+ PRINTF("recv map on %s:%d (%d maps)\n", ip2str(ip), port, j);
return 0;
}
@@ -199,12 +190,12 @@ int chrif_recvmap (int fd)
* マップ鯖間移動のためのデータ準備要求
*------------------------------------------
*/
-int chrif_changemapserver (struct map_session_data *sd, char *name, int x,
+int chrif_changemapserver(struct map_session_data *sd, char *name, int x,
int y, struct in_addr ip, short port)
{
- int i, s_ip;
+ int i, s_ip;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
s_ip = 0;
for (i = 0; i < fd_max; i++)
@@ -214,19 +205,19 @@ int chrif_changemapserver (struct map_session_data *sd, char *name, int x,
break;
}
- WFIFOW (char_fd, 0) = 0x2b05;
- WFIFOL (char_fd, 2) = sd->bl.id;
- WFIFOL (char_fd, 6) = sd->login_id1;
- WFIFOL (char_fd, 10) = sd->login_id2;
- WFIFOL (char_fd, 14) = sd->status.char_id;
- memcpy (WFIFOP (char_fd, 18), name, 16);
- WFIFOW (char_fd, 34) = x;
- WFIFOW (char_fd, 36) = y;
- WFIFOL (char_fd, 38) = ip.s_addr;
- WFIFOL (char_fd, 42) = port;
- WFIFOB (char_fd, 44) = sd->status.sex;
- WFIFOL (char_fd, 45) = s_ip;
- WFIFOSET (char_fd, 49);
+ WFIFOW(char_fd, 0) = 0x2b05;
+ WFIFOL(char_fd, 2) = sd->bl.id;
+ WFIFOL(char_fd, 6) = sd->login_id1;
+ WFIFOL(char_fd, 10) = sd->login_id2;
+ WFIFOL(char_fd, 14) = sd->status.char_id;
+ memcpy(WFIFOP(char_fd, 18), name, 16);
+ WFIFOW(char_fd, 34) = x;
+ WFIFOW(char_fd, 36) = y;
+ WFIFOL(char_fd, 38) = ip.s_addr;
+ WFIFOL(char_fd, 42) = port;
+ WFIFOB(char_fd, 44) = sd->status.sex;
+ WFIFOL(char_fd, 45) = s_ip;
+ WFIFOSET(char_fd, 49);
return 0;
}
@@ -236,22 +227,22 @@ int chrif_changemapserver (struct map_session_data *sd, char *name, int x,
*------------------------------------------
*/
static
-int chrif_changemapserverack (int fd)
+int chrif_changemapserverack(int fd)
{
- struct map_session_data *sd = map_id2sd (RFIFOL (fd, 2));
+ struct map_session_data *sd = map_id2sd(RFIFOL(fd, 2));
- if (sd == NULL || sd->status.char_id != RFIFOL (fd, 14))
+ if (sd == NULL || sd->status.char_id != RFIFOL(fd, 14))
return -1;
- if (RFIFOL (fd, 6) == 1)
+ if (RFIFOL(fd, 6) == 1)
{
if (battle_config.error_log)
- printf ("map server change failed.\n");
- pc_authfail (sd->fd);
+ PRINTF("map server change failed.\n");
+ pc_authfail(sd->fd);
return 0;
}
- clif_changemapserver (sd, (const char *)RFIFOP (fd, 18), RFIFOW (fd, 34),
- RFIFOW (fd, 36), in_addr{RFIFOL (fd, 38)}, RFIFOW (fd, 42));
+ clif_changemapserver(sd, (const char *)RFIFOP(fd, 18), RFIFOW(fd, 34),
+ RFIFOW(fd, 36), in_addr{RFIFOL(fd, 38)}, RFIFOW(fd, 42));
return 0;
}
@@ -261,25 +252,25 @@ int chrif_changemapserverack (int fd)
*------------------------------------------
*/
static
-int chrif_connectack (int fd)
+int chrif_connectack(int fd)
{
- if (RFIFOB (fd, 2))
+ if (RFIFOB(fd, 2))
{
- printf ("Connected to char-server failed %d.\n", RFIFOB (fd, 2));
- exit (1);
+ PRINTF("Connected to char-server failed %d.\n", RFIFOB(fd, 2));
+ exit(1);
}
- printf ("Connected to char-server (connection #%d).\n", fd);
+ PRINTF("Connected to char-server (connection #%d).\n", fd);
chrif_state = 1;
- chrif_sendmap (fd);
+ chrif_sendmap(fd);
- printf ("chrif: OnCharIfInit event done. (%d events)\n",
- npc_event_doall ("OnCharIfInit"));
- printf ("chrif: OnInterIfInit event done. (%d events)\n",
- npc_event_doall ("OnInterIfInit"));
+ PRINTF("chrif: OnCharIfInit event done. (%d events)\n",
+ npc_event_doall("OnCharIfInit"));
+ PRINTF("chrif: OnInterIfInit event done. (%d events)\n",
+ npc_event_doall("OnInterIfInit"));
// <Agit> Run Event [AgitInit]
-// printf("NPC_Event:[OnAgitInit] do (%d) events (Agit Initialize).\n", npc_event_doall("OnAgitInit"));
+// PRINTF("NPC_Event:[OnAgitInit] do (%d) events (Agit Initialize).\n", npc_event_doall("OnAgitInit"));
return 0;
}
@@ -289,16 +280,16 @@ int chrif_connectack (int fd)
*------------------------------------------
*/
static
-int chrif_sendmapack (int fd)
+int chrif_sendmapack(int fd)
{
- if (RFIFOB (fd, 2))
+ if (RFIFOB(fd, 2))
{
- printf ("chrif : send map list to char server failed %d\n",
- RFIFOB (fd, 2));
- exit (1);
+ PRINTF("chrif : send map list to char server failed %d\n",
+ RFIFOB(fd, 2));
+ exit(1);
}
- memcpy (wisp_server_name, RFIFOP (fd, 3), 24);
+ memcpy(wisp_server_name, RFIFOP(fd, 3), 24);
chrif_state = 2;
@@ -309,11 +300,11 @@ int chrif_sendmapack (int fd)
*
*------------------------------------------
*/
-int chrif_authreq (struct map_session_data *sd)
+int chrif_authreq(struct map_session_data *sd)
{
- int i;
+ int i;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
if (!sd || !char_fd || !sd->bl.id || !sd->login_id1)
return -1;
@@ -321,13 +312,13 @@ int chrif_authreq (struct map_session_data *sd)
for (i = 0; i < fd_max; i++)
if (session[i] && session[i]->session_data == sd)
{
- WFIFOW (char_fd, 0) = 0x2afc;
- WFIFOL (char_fd, 2) = sd->bl.id;
- WFIFOL (char_fd, 6) = sd->char_id;
- WFIFOL (char_fd, 10) = sd->login_id1;
- WFIFOL (char_fd, 14) = sd->login_id2;
- WFIFOL (char_fd, 18) = session[i]->client_addr.sin_addr.s_addr;
- WFIFOSET (char_fd, 22);
+ WFIFOW(char_fd, 0) = 0x2afc;
+ WFIFOL(char_fd, 2) = sd->bl.id;
+ WFIFOL(char_fd, 6) = sd->char_id;
+ WFIFOL(char_fd, 10) = sd->login_id1;
+ WFIFOL(char_fd, 14) = sd->login_id2;
+ WFIFOL(char_fd, 18) = session[i]->client_addr.sin_addr.s_addr;
+ WFIFOSET(char_fd, 22);
break;
}
@@ -338,11 +329,11 @@ int chrif_authreq (struct map_session_data *sd)
*
*------------------------------------------
*/
-int chrif_charselectreq (struct map_session_data *sd)
+int chrif_charselectreq(struct map_session_data *sd)
{
- int i, s_ip;
+ int i, s_ip;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
if (!sd || !char_fd || !sd->bl.id || !sd->login_id1)
return -1;
@@ -355,12 +346,12 @@ int chrif_charselectreq (struct map_session_data *sd)
break;
}
- WFIFOW (char_fd, 0) = 0x2b02;
- WFIFOL (char_fd, 2) = sd->bl.id;
- WFIFOL (char_fd, 6) = sd->login_id1;
- WFIFOL (char_fd, 10) = sd->login_id2;
- WFIFOL (char_fd, 14) = s_ip;
- WFIFOSET (char_fd, 18);
+ WFIFOW(char_fd, 0) = 0x2b02;
+ WFIFOL(char_fd, 2) = sd->bl.id;
+ WFIFOL(char_fd, 6) = sd->login_id1;
+ WFIFOL(char_fd, 10) = sd->login_id2;
+ WFIFOL(char_fd, 14) = s_ip;
+ WFIFOSET(char_fd, 18);
return 0;
}
@@ -369,14 +360,14 @@ int chrif_charselectreq (struct map_session_data *sd)
* キャラ名問い合わせ
*------------------------------------------
*/
-int chrif_searchcharid (int char_id)
+int chrif_searchcharid(int char_id)
{
if (!char_id)
return -1;
- WFIFOW (char_fd, 0) = 0x2b08;
- WFIFOL (char_fd, 2) = char_id;
- WFIFOSET (char_fd, 6);
+ WFIFOW(char_fd, 0) = 0x2b08;
+ WFIFOL(char_fd, 2) = char_id;
+ WFIFOSET(char_fd, 6);
return 0;
}
@@ -385,16 +376,16 @@ int chrif_searchcharid (int char_id)
* GMに変化要求
*------------------------------------------
*/
-int chrif_changegm (int id, const char *pass, int len)
+int chrif_changegm(int id, const char *pass, int len)
{
if (battle_config.etc_log)
- printf ("chrif_changegm: account: %d, password: '%s'.\n", id, pass);
+ PRINTF("chrif_changegm: account: %d, password: '%s'.\n", id, pass);
- WFIFOW (char_fd, 0) = 0x2b0a;
- WFIFOW (char_fd, 2) = len + 8;
- WFIFOL (char_fd, 4) = id;
- memcpy (WFIFOP (char_fd, 8), pass, len);
- WFIFOSET (char_fd, len + 8);
+ WFIFOW(char_fd, 0) = 0x2b0a;
+ WFIFOW(char_fd, 2) = len + 8;
+ WFIFOL(char_fd, 4) = id;
+ memcpy(WFIFOP(char_fd, 8), pass, len);
+ WFIFOSET(char_fd, len + 8);
return 0;
}
@@ -403,19 +394,18 @@ int chrif_changegm (int id, const char *pass, int len)
* Change Email
*------------------------------------------
*/
-int chrif_changeemail (int id, const char *actual_email,
+int chrif_changeemail(int id, const char *actual_email,
const char *new_email)
{
if (battle_config.etc_log)
- printf
- ("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n",
+ PRINTF("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n",
id, actual_email, new_email);
- WFIFOW (char_fd, 0) = 0x2b0c;
- WFIFOL (char_fd, 2) = id;
- memcpy (WFIFOP (char_fd, 6), actual_email, 40);
- memcpy (WFIFOP (char_fd, 46), new_email, 40);
- WFIFOSET (char_fd, 86);
+ WFIFOW(char_fd, 0) = 0x2b0c;
+ WFIFOL(char_fd, 2) = id;
+ memcpy(WFIFOP(char_fd, 6), actual_email, 40);
+ memcpy(WFIFOP(char_fd, 46), new_email, 40);
+ WFIFOSET(char_fd, 86);
return 0;
}
@@ -431,25 +421,25 @@ int chrif_changeemail (int id, const char *actual_email,
* 5: changesex
*------------------------------------------
*/
-int chrif_char_ask_name (int id, char *character_name, short operation_type,
+int chrif_char_ask_name(int id, char *character_name, short operation_type,
int year, int month, int day, int hour, int minute,
int second)
{
- WFIFOW (char_fd, 0) = 0x2b0e;
- WFIFOL (char_fd, 2) = id; // account_id of who ask (for answer) -1 if nobody
- memcpy (WFIFOP (char_fd, 6), character_name, 24);
- WFIFOW (char_fd, 30) = operation_type; // type of operation
+ WFIFOW(char_fd, 0) = 0x2b0e;
+ WFIFOL(char_fd, 2) = id; // account_id of who ask (for answer) -1 if nobody
+ memcpy(WFIFOP(char_fd, 6), character_name, 24);
+ WFIFOW(char_fd, 30) = operation_type; // type of operation
if (operation_type == 2)
{
- WFIFOW (char_fd, 32) = year;
- WFIFOW (char_fd, 34) = month;
- WFIFOW (char_fd, 36) = day;
- WFIFOW (char_fd, 38) = hour;
- WFIFOW (char_fd, 40) = minute;
- WFIFOW (char_fd, 42) = second;
+ WFIFOW(char_fd, 32) = year;
+ WFIFOW(char_fd, 34) = month;
+ WFIFOW(char_fd, 36) = day;
+ WFIFOW(char_fd, 38) = hour;
+ WFIFOW(char_fd, 40) = minute;
+ WFIFOW(char_fd, 42) = second;
}
- printf ("chrif : sended 0x2b0e\n");
- WFIFOSET (char_fd, 44);
+ PRINTF("chrif : sended 0x2b0e\n");
+ WFIFOSET(char_fd, 44);
return 0;
}
@@ -471,169 +461,167 @@ int chrif_char_ask_name (int id, char *character_name, short operation_type,
*------------------------------------------
*/
static
-int chrif_char_ask_name_answer (int fd)
+int chrif_char_ask_name_answer(int fd)
{
- int acc;
+ int acc;
struct map_session_data *sd;
- char output[256];
char player_name[24];
- acc = RFIFOL (fd, 2); // account_id of who has asked (-1 if nobody)
- memcpy (player_name, RFIFOP (fd, 6), sizeof (player_name));
- player_name[sizeof (player_name) - 1] = '\0';
+ acc = RFIFOL(fd, 2); // account_id of who has asked (-1 if nobody)
+ memcpy(player_name, RFIFOP(fd, 6), sizeof(player_name));
+ player_name[sizeof(player_name) - 1] = '\0';
- sd = map_id2sd (acc);
+ sd = map_id2sd(acc);
if (acc >= 0 && sd != NULL)
{
- if (RFIFOW (fd, 32) == 1) // player not found
- sprintf (output, "The player '%s' doesn't exist.", player_name);
+ std::string output;
+ if (RFIFOW(fd, 32) == 1) // player not found
+ output = STRPRINTF("The player '%s' doesn't exist.",
+ player_name);
else
{
- switch (RFIFOW (fd, 30))
+ switch (RFIFOW(fd, 30))
{
case 1: // block
- switch (RFIFOW (fd, 32))
+ switch (RFIFOW(fd, 32))
{
case 0: // login-server resquest done
- sprintf (output,
- "Login-server has been asked to block the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server has been asked to block the player '%s'.",
+ player_name);
break;
//case 1: // player not found
case 2: // gm level too low
- sprintf (output,
- "Your GM level don't authorise you to block the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Your GM level don't authorise you to block the player '%s'.",
+ player_name);
break;
case 3: // login-server offline
- sprintf (output,
- "Login-server is offline. Impossible to block the the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server is offline. Impossible to block the the player '%s'.",
+ player_name);
break;
}
break;
case 2: // ban
- switch (RFIFOW (fd, 32))
+ switch (RFIFOW(fd, 32))
{
case 0: // login-server resquest done
- sprintf (output,
- "Login-server has been asked to ban the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server has been asked to ban the player '%s'.",
+ player_name);
break;
//case 1: // player not found
case 2: // gm level too low
- sprintf (output,
- "Your GM level don't authorise you to ban the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Your GM level don't authorise you to ban the player '%s'.",
+ player_name);
break;
case 3: // login-server offline
- sprintf (output,
- "Login-server is offline. Impossible to ban the the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server is offline. Impossible to ban the the player '%s'.",
+ player_name);
break;
}
break;
case 3: // unblock
- switch (RFIFOW (fd, 32))
+ switch (RFIFOW(fd, 32))
{
case 0: // login-server resquest done
- sprintf (output,
- "Login-server has been asked to unblock the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server has been asked to unblock the player '%s'.",
+ player_name);
break;
//case 1: // player not found
case 2: // gm level too low
- sprintf (output,
- "Your GM level don't authorise you to unblock the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Your GM level don't authorise you to unblock the player '%s'.",
+ player_name);
break;
case 3: // login-server offline
- sprintf (output,
- "Login-server is offline. Impossible to unblock the the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server is offline. Impossible to unblock the the player '%s'.",
+ player_name);
break;
}
break;
case 4: // unban
- switch (RFIFOW (fd, 32))
+ switch (RFIFOW(fd, 32))
{
case 0: // login-server resquest done
- sprintf (output,
- "Login-server has been asked to unban the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server has been asked to unban the player '%s'.",
+ player_name);
break;
//case 1: // player not found
case 2: // gm level too low
- sprintf (output,
- "Your GM level don't authorise you to unban the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Your GM level don't authorise you to unban the player '%s'.",
+ player_name);
break;
case 3: // login-server offline
- sprintf (output,
- "Login-server is offline. Impossible to unban the the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server is offline. Impossible to unban the the player '%s'.",
+ player_name);
break;
}
break;
case 5: // changesex
- switch (RFIFOW (fd, 32))
+ switch (RFIFOW(fd, 32))
{
case 0: // login-server resquest done
- sprintf (output,
- "Login-server has been asked to change the sex of the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server has been asked to change the sex of the player '%s'.",
+ player_name);
break;
//case 1: // player not found
case 2: // gm level too low
- sprintf (output,
- "Your GM level don't authorise you to change the sex of the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Your GM level don't authorise you to change the sex of the player '%s'.",
+ player_name);
break;
case 3: // login-server offline
- sprintf (output,
- "Login-server is offline. Impossible to change the sex of the the player '%s'.",
- player_name);
+ output = STRPRINTF(
+ "Login-server is offline. Impossible to change the sex of the the player '%s'.",
+ player_name);
break;
}
break;
}
}
- if (output[0] != '\0')
- {
- output[sizeof (output) - 1] = '\0';
- clif_displaymessage (sd->fd, output);
- }
+ if (!output.empty())
+ clif_displaymessage(sd->fd, output);
}
else
- printf ("chrif_char_ask_name_answer failed - player not online.\n");
+ PRINTF("chrif_char_ask_name_answer failed - player not online.\n");
return 0;
}
/*==========================================
- * End of GM change (@GM) (modified by Yor)
+ * End of GM change(@GM) (modified by Yor)
*------------------------------------------
*/
static
-int chrif_changedgm (int fd)
+int chrif_changedgm(int fd)
{
- int acc, level;
+ int acc, level;
struct map_session_data *sd = NULL;
- acc = RFIFOL (fd, 2);
- level = RFIFOL (fd, 6);
+ acc = RFIFOL(fd, 2);
+ level = RFIFOL(fd, 6);
- sd = map_id2sd (acc);
+ sd = map_id2sd(acc);
if (battle_config.etc_log)
- printf ("chrif_changedgm: account: %d, GM level 0 -> %d.\n", acc,
+ PRINTF("chrif_changedgm: account: %d, GM level 0 -> %d.\n", acc,
level);
if (sd != NULL)
{
if (level > 0)
- clif_displaymessage (sd->fd, "GM modification success.");
+ clif_displaymessage(sd->fd, "GM modification success.");
else
- clif_displaymessage (sd->fd, "Failure of GM modification.");
+ clif_displaymessage(sd->fd, "Failure of GM modification.");
}
return 0;
@@ -644,68 +632,42 @@ int chrif_changedgm (int fd)
*------------------------------------------
*/
static
-int chrif_changedsex (int fd)
+int chrif_changedsex(int fd)
{
- int acc, sex, i;
+ int acc, sex, i;
struct map_session_data *sd;
- struct pc_base_job s_class;
- acc = RFIFOL (fd, 2);
- sex = RFIFOL (fd, 6);
+ acc = RFIFOL(fd, 2);
+ sex = RFIFOL(fd, 6);
if (battle_config.etc_log)
- printf ("chrif_changedsex %d.\n", acc);
- sd = map_id2sd (acc);
+ PRINTF("chrif_changedsex %d.\n", acc);
+ sd = map_id2sd(acc);
if (acc > 0)
{
if (sd != NULL && sd->status.sex != sex)
{
- s_class = pc_calc_base_job (sd->status.pc_class);
- if (sd->status.sex == 0)
- {
- sd->status.sex = 1;
- sd->sex = 1;
- }
- else if (sd->status.sex == 1)
- {
- sd->status.sex = 0;
- sd->sex = 0;
- }
+ sd->sex = sd->status.sex = !sd->status.sex;
// to avoid any problem with equipment and invalid sex, equipment is unequiped.
for (i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].nameid
- && sd->status.inventory[i].equip)
- pc_unequipitem ((struct map_session_data *) sd, i, 0);
- }
- // reset skill of some job
- if (s_class.job == 19 || s_class.job == 4020
- || s_class.job == 4042 || s_class.job == 20
- || s_class.job == 4021 || s_class.job == 4043)
- {
-
- clif_updatestatus (sd, SP_SKILLPOINT);
- // change job if necessary
- if (s_class.job == 20 || s_class.job == 4021
- || s_class.job == 4043)
- sd->status.pc_class -= 1;
- else if (s_class.job == 19 || s_class.job == 4020
- || s_class.job == 4042)
- sd->status.pc_class += 1;
+ && bool(sd->status.inventory[i].equip))
+ pc_unequipitem(sd, i, CalcStatus::NOW);
}
// save character
- chrif_save (sd);
+ chrif_save(sd);
sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
// do same modify in login-server for the account, but no in char-server (it ask again login_id1 to login, and don't remember it)
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your sex has been changed (need disconexion by the server)...");
- clif_setwaitclose (sd->fd); // forced to disconnect for the change
+ clif_setwaitclose(sd->fd); // forced to disconnect for the change
}
}
else
{
if (sd != NULL)
{
- printf ("chrif_changedsex failed.\n");
+ PRINTF("chrif_changedsex failed.\n");
}
}
@@ -716,10 +678,10 @@ int chrif_changedsex (int fd)
* アカウント変数保存要求
*------------------------------------------
*/
-int chrif_saveaccountreg2 (struct map_session_data *sd)
+int chrif_saveaccountreg2(struct map_session_data *sd)
{
- int p, j;
- nullpo_retr (-1, sd);
+ int p, j;
+ nullpo_retr(-1, sd);
p = 8;
for (j = 0; j < sd->status.account_reg2_num; j++)
@@ -727,15 +689,15 @@ int chrif_saveaccountreg2 (struct map_session_data *sd)
struct global_reg *reg = &sd->status.account_reg2[j];
if (reg->str[0] && reg->value != 0)
{
- memcpy (WFIFOP (char_fd, p), reg->str, 32);
- WFIFOL (char_fd, p + 32) = reg->value;
+ memcpy(WFIFOP(char_fd, p), reg->str, 32);
+ WFIFOL(char_fd, p + 32) = reg->value;
p += 36;
}
}
- WFIFOW (char_fd, 0) = 0x2b10;
- WFIFOW (char_fd, 2) = p;
- WFIFOL (char_fd, 4) = sd->bl.id;
- WFIFOSET (char_fd, p);
+ WFIFOW(char_fd, 0) = 0x2b10;
+ WFIFOW(char_fd, 2) = p;
+ WFIFOL(char_fd, 4) = sd->bl.id;
+ WFIFOSET(char_fd, p);
return 0;
}
@@ -745,22 +707,22 @@ int chrif_saveaccountreg2 (struct map_session_data *sd)
*------------------------------------------
*/
static
-int chrif_accountreg2 (int fd)
+int chrif_accountreg2(int fd)
{
- int j, p;
+ int j, p;
struct map_session_data *sd;
- if ((sd = map_id2sd (RFIFOL (fd, 4))) == NULL)
+ if ((sd = map_id2sd(RFIFOL(fd, 4))) == NULL)
return 1;
- for (p = 8, j = 0; p < RFIFOW (fd, 2) && j < ACCOUNT_REG2_NUM;
+ for (p = 8, j = 0; p < RFIFOW(fd, 2) && j < ACCOUNT_REG2_NUM;
p += 36, j++)
{
- memcpy (sd->status.account_reg2[j].str, RFIFOP (fd, p), 32);
- sd->status.account_reg2[j].value = RFIFOL (fd, p + 32);
+ memcpy(sd->status.account_reg2[j].str, RFIFOP(fd, p), 32);
+ sd->status.account_reg2[j].value = RFIFOL(fd, p + 32);
}
sd->status.account_reg2_num = j;
-// printf("chrif: accountreg2\n");
+// PRINTF("chrif: accountreg2\n");
return 0;
}
@@ -772,14 +734,14 @@ int chrif_accountreg2 (int fd)
*------------------------------------------
*/
static
-int chrif_divorce (int char_id, int partner_id)
+int chrif_divorce(int char_id, int partner_id)
{
struct map_session_data *sd = NULL;
if (!char_id || !partner_id)
return 0;
- sd = map_nick2sd (map_charid2nick (char_id));
+ sd = map_nick2sd(map_charid2nick(char_id));
if (sd && sd->status.partner_id == partner_id)
{
sd->status.partner_id = 0;
@@ -787,11 +749,12 @@ int chrif_divorce (int char_id, int partner_id)
if (sd->npc_flags.divorce)
{
sd->npc_flags.divorce = 0;
- map_scriptcont (sd, sd->npc_id);
+ map_scriptcont(sd, sd->npc_id);
}
}
- nullpo_retr (0, sd = map_nick2sd (map_charid2nick (partner_id)));
+ sd = map_nick2sd(map_charid2nick(partner_id));
+ nullpo_ret(sd);
if (sd->status.partner_id == char_id)
sd->status.partner_id = 0;
@@ -803,14 +766,14 @@ int chrif_divorce (int char_id, int partner_id)
* Needed to divorce when partner is not connected to map server
*-------------------------------------
*/
-int chrif_send_divorce (int char_id)
+int chrif_send_divorce(int char_id)
{
if (char_fd < 0)
return -1;
- WFIFOW (char_fd, 0) = 0x2b16;
- WFIFOL (char_fd, 2) = char_id;
- WFIFOSET (char_fd, 6);
+ WFIFOW(char_fd, 0) = 0x2b16;
+ WFIFOL(char_fd, 2) = char_id;
+ WFIFOSET(char_fd, 6);
return 0;
}
@@ -819,29 +782,29 @@ int chrif_send_divorce (int char_id)
*------------------------------------------
*/
static
-int chrif_accountdeletion (int fd)
+int chrif_accountdeletion(int fd)
{
- int acc;
+ int acc;
struct map_session_data *sd;
- acc = RFIFOL (fd, 2);
+ acc = RFIFOL(fd, 2);
if (battle_config.etc_log)
- printf ("chrif_accountdeletion %d.\n", acc);
- sd = map_id2sd (acc);
+ PRINTF("chrif_accountdeletion %d.\n", acc);
+ sd = map_id2sd(acc);
if (acc > 0)
{
if (sd != NULL)
{
sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has been deleted (disconnection)...");
- clif_setwaitclose (sd->fd); // forced to disconnect for the change
+ clif_setwaitclose(sd->fd); // forced to disconnect for the change
}
}
else
{
if (sd != NULL)
- printf ("chrif_accountdeletion failed - player not online.\n");
+ PRINTF("chrif_accountdeletion failed - player not online.\n");
}
return 0;
@@ -852,87 +815,85 @@ int chrif_accountdeletion (int fd)
*------------------------------------------
*/
static
-int chrif_accountban (int fd)
+int chrif_accountban(int fd)
{
- int acc;
+ int acc;
struct map_session_data *sd;
- acc = RFIFOL (fd, 2);
+ acc = RFIFOL(fd, 2);
if (battle_config.etc_log)
- printf ("chrif_accountban %d.\n", acc);
- sd = map_id2sd (acc);
+ PRINTF("chrif_accountban %d.\n", acc);
+ sd = map_id2sd(acc);
if (acc > 0)
{
if (sd != NULL)
{
sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
- if (RFIFOB (fd, 6) == 0)
+ if (RFIFOB(fd, 6) == 0)
{ // 0: change of statut, 1: ban
- switch (RFIFOL (fd, 7))
+ switch (RFIFOL(fd, 7))
{ // status or final date of a banishment
case 1: // 0 = Unregistered ID
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has 'Unregistered'.");
break;
case 2: // 1 = Incorrect Password
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has an 'Incorrect Password'...");
break;
case 3: // 2 = This ID is expired
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has expired.");
break;
case 4: // 3 = Rejected from Server
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has been rejected from server.");
break;
case 5: // 4 = You have been blocked by the GM Team
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has been blocked by the GM Team.");
break;
case 6: // 5 = Your Game's EXE file is not the latest version
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your Game's EXE file is not the latest version.");
break;
case 7: // 6 = Your are Prohibited to log in until %s
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has been prohibited to log in.");
break;
case 8: // 7 = Server is jammed due to over populated
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Server is jammed due to over populated.");
break;
case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this)
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has not more authorised.");
break;
case 100: // 99 = This ID has been totally erased
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has been totally erased.");
break;
default:
- clif_displaymessage (sd->fd,
+ clif_displaymessage(sd->fd,
"Your account has not more authorised.");
break;
}
}
- else if (RFIFOB (fd, 6) == 1)
- { // 0: change of statut, 1: ban
- time_t timestamp;
- char tmpstr[2048];
- timestamp = (time_t) RFIFOL (fd, 7); // status or final date of a banishment
- strcpy (tmpstr, "Your account has been banished until ");
- strftime (tmpstr + strlen (tmpstr), 24, "%d-%m-%Y %H:%M:%S",
- gmtime (&timestamp));
- clif_displaymessage (sd->fd, tmpstr);
+ else if (RFIFOB(fd, 6) == 1)
+ {
+ // 0: change of statut, 1: ban
+ TimeT timestamp = static_cast<time_t>(RFIFOL(fd, 7)); // status or final date of a banishment
+ char tmpstr[] = WITH_TIMESTAMP("Your account has been banished until ");
+ REPLACE_TIMESTAMP(tmpstr, timestamp);
+ clif_displaymessage(sd->fd, tmpstr);
}
- clif_setwaitclose (sd->fd); // forced to disconnect for the change
+ clif_setwaitclose(sd->fd); // forced to disconnect for the change
}
}
else
{
if (sd != NULL)
- printf ("chrif_accountban failed - player not online.\n");
+ PRINTF("chrif_accountban failed - player not online.\n");
}
return 0;
@@ -943,10 +904,10 @@ int chrif_accountban (int fd)
*------------------------------------------
*/
static
-int chrif_recvgmaccounts (int fd)
+int chrif_recvgmaccounts(int fd)
{
- printf ("From login-server: receiving of %d GM accounts information.\n",
- pc_read_gm_account (fd));
+ PRINTF("From login-server: receiving of %d GM accounts information.\n",
+ pc_read_gm_account(fd));
return 0;
}
@@ -955,70 +916,11 @@ int chrif_recvgmaccounts (int fd)
* Request to reload GM accounts and their levels: send to char-server by [Yor]
*------------------------------------------
*/
-int chrif_reloadGMdb (void)
-{
-
- WFIFOW (char_fd, 0) = 0x2af7;
- WFIFOSET (char_fd, 2);
-
- return 0;
-}
-
-/*==========================================
- * Send rates and motd to char server [Wizputer]
- *------------------------------------------
- */
-int chrif_ragsrvinfo (int base_rate, int job_rate, int drop_rate)
+int chrif_reloadGMdb(void)
{
- char buf[256];
- FILE *fp;
- int i;
-
- WFIFOW (char_fd, 0) = 0x2b16;
- WFIFOW (char_fd, 2) = base_rate;
- WFIFOW (char_fd, 4) = job_rate;
- WFIFOW (char_fd, 6) = drop_rate;
- if ((fp = fopen_ (motd_txt, "r")) != NULL)
- {
- if (fgets (buf, 250, fp) != NULL)
- {
- for (i = 0; buf[i]; i++)
- {
- if (buf[i] == '\r' || buf[i] == '\n')
- {
- buf[i] = 0;
- break;
- }
- }
- WFIFOW (char_fd, 8) = sizeof (buf) + 10;
- memcpy (WFIFOP (char_fd, 10), buf, sizeof (buf));
- }
- fclose_ (fp);
- }
- else
- {
- WFIFOW (char_fd, 8) = sizeof (buf) + 10;
- memcpy (WFIFOP (char_fd, 10), buf, sizeof (buf));
- }
- WFIFOSET (char_fd, WFIFOW (char_fd, 8));
-
- return 0;
-}
-
-/*=========================================
- * Tell char-server charcter disconnected [Wizputer]
- *-----------------------------------------
- */
-
-int chrif_char_offline (struct map_session_data *sd)
-{
- if (char_fd < 0)
- return -1;
-
- WFIFOW (char_fd, 0) = 0x2b17;
- WFIFOL (char_fd, 2) = sd->status.char_id;
- WFIFOSET (char_fd, 6);
+ WFIFOW(char_fd, 0) = 0x2af7;
+ WFIFOSET(char_fd, 2);
return 0;
}
@@ -1028,45 +930,46 @@ int chrif_char_offline (struct map_session_data *sd)
*----------------------------------------
*/
-static void ladmin_itemfrob_fix_item (int source, int dest, struct item *item)
+static
+void ladmin_itemfrob_fix_item(int source, int dest, struct item *item)
{
if (item && item->nameid == source)
{
item->nameid = dest;
- item->equip = 0;
+ item->equip = EPOS::ZERO;
}
}
-static int ladmin_itemfrob_c2 (struct block_list *bl, int source_id,
- int dest_id)
+static
+void ladmin_itemfrob_c2(struct block_list *bl, int source_id, int dest_id)
{
#define IFIX(v) if (v == source_id) {v = dest_id; }
#define FIX(item) ladmin_itemfrob_fix_item(source_id, dest_id, &item)
if (!bl)
- return 0;
+ return;
switch (bl->type)
{
- case BL_PC:
+ case BL::PC:
{
struct map_session_data *pc = (struct map_session_data *) bl;
- struct storage *stor = account2storage2 (pc->status.account_id);
- int j;
+ struct storage *stor = account2storage2(pc->status.account_id);
+ int j;
for (j = 0; j < MAX_INVENTORY; j++)
- IFIX (pc->status.inventory[j].nameid);
+ IFIX(pc->status.inventory[j].nameid);
for (j = 0; j < MAX_CART; j++)
- IFIX (pc->status.cart[j].nameid);
- IFIX (pc->status.weapon);
- IFIX (pc->status.shield);
- IFIX (pc->status.head_top);
- IFIX (pc->status.head_mid);
- IFIX (pc->status.head_bottom);
+ IFIX(pc->status.cart[j].nameid);
+ // IFIX(pc->status.weapon);
+ IFIX(pc->status.shield);
+ IFIX(pc->status.head_top);
+ IFIX(pc->status.head_mid);
+ IFIX(pc->status.head_bottom);
if (stor)
for (j = 0; j < stor->storage_amount; j++)
- FIX (stor->storage_[j]);
+ FIX(stor->storage_[j]);
for (j = 0; j < MAX_INVENTORY; j++)
{
@@ -1074,8 +977,8 @@ static int ladmin_itemfrob_c2 (struct block_list *bl, int source_id,
if (item && item->nameid == source_id)
{
item->nameid = dest_id;
- if (item->equip)
- pc_unequipitem (pc, j, 0);
+ if (bool(item->equip))
+ pc_unequipitem(pc, j, CalcStatus::NOW);
item->nameid = dest_id;
}
}
@@ -1083,51 +986,46 @@ static int ladmin_itemfrob_c2 (struct block_list *bl, int source_id,
break;
}
- case BL_MOB:
+ case BL::MOB:
{
struct mob_data *mob = (struct mob_data *) bl;
- int i;
+ int i;
for (i = 0; i < mob->lootitem_count; i++)
- FIX (mob->lootitem[i]);
+ FIX(mob->lootitem[i]);
break;
}
- case BL_ITEM:
+ case BL::ITEM:
{
struct flooritem_data *item = (struct flooritem_data *) bl;
- FIX (item->item_data);
+ FIX(item->item_data);
break;
}
}
#undef FIX
#undef IFIX
-
- return 0;
}
static
-int ladmin_itemfrob_c (struct block_list *bl, va_list va_args)
+void ladmin_itemfrob_c(struct block_list *bl, int source_id, int dest_id)
{
- int source_id = va_arg (va_args, int);
- int dest_id = va_arg (va_args, int);
- return ladmin_itemfrob_c2 (bl, source_id, dest_id);
+ ladmin_itemfrob_c2(bl, source_id, dest_id);
}
static
-void ladmin_itemfrob (int fd)
+void ladmin_itemfrob(int fd)
{
- int source_id = RFIFOL (fd, 2);
- int dest_id = RFIFOL (fd, 6);
- struct block_list *bl = (struct block_list *) map_get_first_session ();
+ int source_id = RFIFOL(fd, 2);
+ int dest_id = RFIFOL(fd, 6);
+ struct block_list *bl = (struct block_list *) map_get_first_session();
// flooritems
- map_foreachobject (ladmin_itemfrob_c, 0 /* any object */ , source_id,
- dest_id);
+ map_foreachobject(std::bind(ladmin_itemfrob_c, ph::_1, source_id, dest_id), BL::NUL /* any object */);
// player characters (and, hopefully, mobs)
while (bl->next)
{
- ladmin_itemfrob_c2 (bl, source_id, dest_id);
+ ladmin_itemfrob_c2(bl, source_id, dest_id);
bl = bl->next;
}
}
@@ -1137,9 +1035,9 @@ void ladmin_itemfrob (int fd)
*------------------------------------------
*/
static
-void chrif_parse (int fd)
+void chrif_parse(int fd)
{
- int packet_len, cmd;
+ int packet_len, cmd;
// only char-server can have an access to here.
// so, if it isn't the char-server, we disconnect the session (fd != char_fd).
@@ -1147,27 +1045,25 @@ void chrif_parse (int fd)
{
if (fd == char_fd)
{
- printf
- ("Map-server can't connect to char-server (connection #%d).\n",
+ PRINTF("Map-server can't connect to char-server (connection #%d).\n",
fd);
char_fd = -1;
}
- close (fd);
- delete_session (fd);
+ delete_session(fd);
return;
}
- while (RFIFOREST (fd) >= 2)
+ while (RFIFOREST(fd) >= 2)
{
- cmd = RFIFOW (fd, 0);
+ cmd = RFIFOW(fd, 0);
if (cmd < 0x2af8
|| cmd >=
0x2af8 +
- (sizeof (packet_len_table) / sizeof (packet_len_table[0]))
+ (sizeof(packet_len_table) / sizeof(packet_len_table[0]))
|| packet_len_table[cmd - 0x2af8] == 0)
{
- int r = intif_parse (fd); // intifに渡す
+ int r = intif_parse(fd); // intifに渡す
if (r == 1)
continue; // intifで処理した
@@ -1180,80 +1076,80 @@ void chrif_parse (int fd)
packet_len = packet_len_table[cmd - 0x2af8];
if (packet_len == -1)
{
- if (RFIFOREST (fd) < 4)
+ if (RFIFOREST(fd) < 4)
return;
- packet_len = RFIFOW (fd, 2);
+ packet_len = RFIFOW(fd, 2);
}
- if (RFIFOREST (fd) < packet_len)
+ if (RFIFOREST(fd) < packet_len)
return;
switch (cmd)
{
case 0x2af9:
- chrif_connectack (fd);
+ chrif_connectack(fd);
break;
case 0x2afa:
- ladmin_itemfrob (fd);
+ ladmin_itemfrob(fd);
break;
case 0x2afb:
- chrif_sendmapack (fd);
+ chrif_sendmapack(fd);
break;
case 0x2afd:
- pc_authok (RFIFOL (fd, 4), RFIFOL (fd, 8),
- (time_t) RFIFOL (fd, 12), RFIFOW (fd, 16),
- (struct mmo_charstatus *) RFIFOP (fd, 18));
+ pc_authok(RFIFOL(fd, 4), RFIFOL(fd, 8),
+ static_cast<time_t>(RFIFOL(fd, 12)), RFIFOW(fd, 16),
+ (const struct mmo_charstatus *) RFIFOP(fd, 18));
break;
case 0x2afe:
- pc_authfail (RFIFOL (fd, 2));
+ pc_authfail(RFIFOL(fd, 2));
break;
case 0x2b00:
- map_setusers (RFIFOL (fd, 2));
+ map_setusers(RFIFOL(fd, 2));
break;
case 0x2b03:
- clif_charselectok (RFIFOL (fd, 2));
+ clif_charselectok(RFIFOL(fd, 2));
break;
case 0x2b04:
- chrif_recvmap (fd);
+ chrif_recvmap(fd);
break;
case 0x2b06:
- chrif_changemapserverack (fd);
+ chrif_changemapserverack(fd);
break;
case 0x2b09:
- map_addchariddb (RFIFOL (fd, 2), (const char *)RFIFOP (fd, 6));
+ map_addchariddb(RFIFOL(fd, 2), (const char *)RFIFOP(fd, 6));
break;
case 0x2b0b:
- chrif_changedgm (fd);
+ chrif_changedgm(fd);
break;
case 0x2b0d:
- chrif_changedsex (fd);
+ chrif_changedsex(fd);
break;
case 0x2b0f:
- chrif_char_ask_name_answer (fd);
+ chrif_char_ask_name_answer(fd);
break;
case 0x2b11:
- chrif_accountreg2 (fd);
+ chrif_accountreg2(fd);
break;
case 0x2b12:
- chrif_divorce (RFIFOL (fd, 2), RFIFOL (fd, 6));
+ chrif_divorce(RFIFOL(fd, 2), RFIFOL(fd, 6));
break;
case 0x2b13:
- chrif_accountdeletion (fd);
+ chrif_accountdeletion(fd);
break;
case 0x2b14:
- chrif_accountban (fd);
+ chrif_accountban(fd);
break;
case 0x2b15:
- chrif_recvgmaccounts (fd);
+ chrif_recvgmaccounts(fd);
break;
default:
if (battle_config.error_log)
- printf ("chrif_parse : unknown packet %d %d\n", fd,
- RFIFOW (fd, 0));
+ PRINTF("chrif_parse : unknown packet %d %d\n", fd,
+ RFIFOW(fd, 0));
session[fd]->eof = 1;
return;
}
- RFIFOSKIP (fd, packet_len);
+ RFIFOSKIP(fd, packet_len);
}
}
@@ -1263,29 +1159,29 @@ void chrif_parse (int fd)
*------------------------------------------
*/
static
-void send_users_tochar (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void send_users_tochar(TimerData *, tick_t)
{
- int users = 0, i;
+ int users = 0, i;
struct map_session_data *sd;
if (char_fd <= 0 || session[char_fd] == NULL)
return;
- WFIFOW (char_fd, 0) = 0x2aff;
+ WFIFOW(char_fd, 0) = 0x2aff;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (sd = (struct map_session_data *)session[i]->session_data) && sd->state.auth &&
!((battle_config.hide_GM_session
|| sd->state.shroud_active
- || (sd->status.option & OPTION_HIDE)) && pc_isGM (sd)))
+ || bool(sd->status.option & Option::HIDE)) && pc_isGM(sd)))
{
- WFIFOL (char_fd, 6 + 4 * users) = sd->status.char_id;
+ WFIFOL(char_fd, 6 + 4 * users) = sd->status.char_id;
users++;
}
}
- WFIFOW (char_fd, 2) = 6 + 4 * users;
- WFIFOW (char_fd, 4) = users;
- WFIFOSET (char_fd, 6 + 4 * users);
+ WFIFOW(char_fd, 2) = 6 + 4 * users;
+ WFIFOW(char_fd, 4) = users;
+ WFIFOSET(char_fd, 6 + 4 * users);
}
/*==========================================
@@ -1294,18 +1190,18 @@ void send_users_tochar (timer_id tid, tick_t tick, custom_id_t id, custom_data_t
*------------------------------------------
*/
static
-void check_connect_char_server (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void check_connect_char_server(TimerData *, tick_t)
{
if (char_fd <= 0 || session[char_fd] == NULL)
{
- printf ("Attempt to connect to char-server...\n");
+ PRINTF("Attempt to connect to char-server...\n");
chrif_state = 0;
- if ((char_fd = make_connection (char_ip, char_port)) < 0)
+ if ((char_fd = make_connection(char_ip, char_port)) < 0)
return;
session[char_fd]->func_parse = chrif_parse;
- realloc_fifo (char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+ realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- chrif_connect (char_fd);
+ chrif_connect(char_fd);
}
}
@@ -1315,11 +1211,14 @@ void check_connect_char_server (timer_id tid, tick_t tick, custom_id_t id, custo
*/
int do_init_chrif (void)
{
-// add_timer_func_list (check_connect_char_server, "check_connect_char_server");
-// add_timer_func_list (send_users_tochar, "send_users_tochar");
- add_timer_interval (gettick () + 1000, check_connect_char_server, 0, 0,
- 10 * 1000);
- add_timer_interval (gettick () + 1000, send_users_tochar, 0, 0, 5 * 1000);
+ Timer(gettick() + std::chrono::seconds(1),
+ check_connect_char_server,
+ std::chrono::seconds(10)
+ ).detach();
+ Timer(gettick() + std::chrono::seconds(1),
+ send_users_tochar,
+ std::chrono::seconds(5)
+ ).detach();
return 0;
}
diff --git a/src/map/chrif.hpp b/src/map/chrif.hpp
index 82bfe0d..2816e9f 100644
--- a/src/map/chrif.hpp
+++ b/src/map/chrif.hpp
@@ -1,36 +1,36 @@
-// $Id: chrif.h,v 1.3 2004/09/25 11:39:17 MouseJstr Exp $
#ifndef CHRIF_HPP
#define CHRIF_HPP
-void chrif_setuserid (char *);
-void chrif_setpasswd (char *);
-char *chrif_getpasswd (void);
+void chrif_setuserid(const char *);
+void chrif_setpasswd(const char *);
+char *chrif_getpasswd(void);
-void chrif_setip (char *);
-void chrif_setport (int);
+void chrif_setip(const char *);
+void chrif_setport(int);
-int chrif_isconnect (void);
+int chrif_isconnect(void);
-int chrif_authreq (struct map_session_data *);
-int chrif_save (struct map_session_data *);
-int chrif_charselectreq (struct map_session_data *);
+int chrif_authreq(struct map_session_data *);
+int chrif_save(struct map_session_data *);
+int chrif_charselectreq(struct map_session_data *);
-int chrif_changemapserver (struct map_session_data *sd, char *name, int x,
- int y, struct in_addr ip, short port);
+int chrif_changemapserver(struct map_session_data *sd,
+ char *name, int x, int y,
+ struct in_addr ip, short port);
-int chrif_searchcharid (int char_id);
-int chrif_changegm (int id, const char *pass, int len);
-int chrif_changeemail (int id, const char *actual_email,
- const char *new_email);
-int chrif_char_ask_name (int id, char *character_name, short operation_type,
- int year, int month, int day, int hour, int minute,
- int second);
-int chrif_saveaccountreg2 (struct map_session_data *sd);
-int chrif_reloadGMdb (void);
-int chrif_ragsrvinfo (int base_rate, int job_rate, int drop_rate);
-int chrif_char_offline (struct map_session_data *sd);
-int chrif_send_divorce (int char_id);
+int chrif_searchcharid(int char_id);
+int chrif_changegm(int id, const char *pass, int len);
+int chrif_changeemail(int id, const char *actual_email,
+ const char *new_email);
+int chrif_char_ask_name(int id, char *character_name, short operation_type,
+ int year, int month, int day, int hour, int minute, int second);
+int chrif_saveaccountreg2(struct map_session_data *sd);
+int chrif_reloadGMdb(void);
+int chrif_send_divorce(int char_id);
-int do_init_chrif (void);
+int do_init_chrif (void);
-#endif
+// only used by intif.cpp
+extern int char_fd;
+
+#endif // CHRIF_HPP
diff --git a/src/map/clif.cpp b/src/map/clif.cpp
index fd22160..1deb1f3 100644
--- a/src/map/clif.cpp
+++ b/src/map/clif.cpp
@@ -1,105 +1,66 @@
-// $Id: clif.c 164 2004-10-01 16:46:58Z $
-
-#define DUMP_UNKNOWN_PACKET 1
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <sys/types.h>
-#ifdef LCCWIN32
-#include <winsock.h>
-#else
-#include <unistd.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
+#include "clif.hpp"
+
#include <arpa/inet.h>
-#endif
-#include <time.h>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
+
+#include "../common/cxxstdio.hpp"
+#include "../common/md5calc.hpp"
+#include "../common/random.hpp"
+#include "../common/nullpo.hpp"
#include "../common/socket.hpp"
#include "../common/timer.hpp"
#include "../common/version.hpp"
-#include "../common/nullpo.hpp"
-#include "../common/md5calc.hpp"
-#include "../common/mt_rand.hpp"
#include "atcommand.hpp"
#include "battle.hpp"
-#include "chat.hpp"
#include "chrif.hpp"
-#include "clif.hpp"
-#include "guild.hpp"
#include "intif.hpp"
#include "itemdb.hpp"
#include "magic.hpp"
#include "map.hpp"
-#include "mob.hpp"
#include "npc.hpp"
#include "party.hpp"
#include "pc.hpp"
-#include "script.hpp"
#include "skill.hpp"
#include "storage.hpp"
#include "tmw.hpp"
#include "trade.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
+#include "../poison.hpp"
+
+#define DUMP_UNKNOWN_PACKET 1
+
+constexpr int EMOTE_IGNORED = 0x0e;
+
+// functions list. Rate is how many milliseconds are required between
+// calls. Packets exceeding this rate will be dropped. flood_rates in
+// map.h must be the same length as this table. rate 0 is default
+// rate -1 is unlimited
+
+typedef void (*clif_func)(int fd, struct map_session_data *sd);
+struct func_table
+{
+ interval_t rate;
+ int len;
+ clif_func func;
-#define STATE_BLIND 0x10
-#define EMOTE_IGNORED 0x0e
-
-static const int packet_len_table[0x220] = {
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-//#0x0040
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, -1, 55, 17, 3, 37, 46, -1, 23, -1, 3, 108, 3, 2,
- 3, 28, 19, 11, 3, -1, 9, 5, 54, 53, 58, 60, 41, 2, 6, 6,
-//#0x0080
- 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 23, -1, -1, -1, 0, // 0x8b unknown... size 2 or 23?
- 7, 22, 28, 2, 6, 30, -1, -1, 3, -1, -1, 5, 9, 17, 17, 6,
- 23, 6, 6, -1, -1, -1, -1, 8, 7, 6, 7, 4, 7, 0, -1, 6,
- 8, 8, 3, 3, -1, 6, 6, -1, 7, 6, 2, 5, 6, 44, 5, 3,
-//#0x00C0
- 7, 2, 6, 8, 6, 7, -1, -1, -1, -1, 3, 3, 6, 6, 2, 27,
- 3, 4, 4, 2, -1, -1, 3, -1, 6, 14, 3, -1, 28, 29, -1, -1,
- 30, 30, 26, 2, 6, 26, 3, 3, 8, 19, 5, 2, 3, 2, 2, 2,
- 3, 2, 6, 8, 21, 8, 8, 2, 2, 26, 3, -1, 6, 27, 30, 10,
-
-//#0x0100
- 2, 6, 6, 30, 79, 31, 10, 10, -1, -1, 4, 6, 6, 2, 11, -1,
- 10, 39, 4, 10, 31, 35, 10, 18, 2, 13, 15, 20, 68, 2, 3, 16,
- 6, 14, -1, -1, 21, 8, 8, 8, 8, 8, 2, 2, 3, 4, 2, -1,
- 6, 86, 6, -1, -1, 7, -1, 6, 3, 16, 4, 4, 4, 6, 24, 26,
-//#0x0140
- 22, 14, 6, 10, 23, 19, 6, 39, 8, 9, 6, 27, -1, 2, 6, 6,
- 110, 6, -1, -1, -1, -1, -1, 6, -1, 54, 66, 54, 90, 42, 6, 42,
- -1, -1, -1, -1, -1, 30, -1, 3, 14, 3, 30, 10, 43, 14, 186, 182,
- 14, 30, 10, 3, -1, 6, 106, -1, 4, 5, 4, -1, 6, 7, -1, -1,
-//#0x0180
- 6, 3, 106, 10, 10, 34, 0, 6, 8, 4, 4, 4, 29, -1, 10, 6,
- 90, 86, 24, 6, 30, 102, 9, 4, 8, 4, 14, 10, -1, 6, 2, 6,
- 3, 3, 35, 5, 11, 26, -1, 4, 4, 6, 10, 12, 6, -1, 4, 4,
- 11, 7, -1, 67, 12, 18, 114, 6, 3, 6, 26, 26, 26, 26, 2, 3,
-//#0x01C0, Set 0x1d5=-1
- 2, 14, 10, -1, 22, 22, 4, 2, 13, 97, 0, 9, 9, 30, 6, 28,
- 8, 14, 10, 35, 6, -1, 4, 11, 54, 53, 60, 2, -1, 47, 33, 6,
- 30, 8, 34, 14, 2, 6, 26, 2, 28, 81, 6, 10, 26, 2, -1, -1,
- -1, -1, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56, -1, 4, 5, 10,
-//#0x200
- 26, -1, 26, 10, 18, 26, 11, 34, 14, 36, 10, 19, 10, -1, 24, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ // ctor exists because interval_t must be explicit
+ func_table(int r, int l, clif_func f)
+ : rate(r), len(l), func(f)
+ {}
};
+constexpr int VAR = -1;
+
+extern // not really - defined below
+func_table clif_parse_func_table[0x0220];
+
+
// local define
-enum
+enum class SendWho
{
ALL_CLIENT,
ALL_SAMEMAP,
@@ -116,42 +77,65 @@ enum
PARTY_SAMEMAP_WOS,
PARTY_AREA,
PARTY_AREA_WOS,
- GUILD,
- GUILD_WOS,
- GUILD_SAMEMAP, // [Valaris]
- GUILD_SAMEMAP_WOS,
- GUILD_AREA,
- GUILD_AREA_WOS, // end additions [Valaris]
- SELF
+ SELF,
};
-#define WBUFPOS(p,pos,x,y) { unsigned char *__p = (p); __p+=(pos); __p[0] = (x)>>2; __p[1] = ((x)<<6) | (((y)>>4)&0x3f); __p[2] = (y)<<4; }
-#define WBUFPOS2(p,pos,x0,y0,x1,y1) { unsigned char *__p = (p); __p+=(pos); __p[0] = (x0)>>2; __p[1] = ((x0)<<6) | (((y0)>>4)&0x3f); __p[2] = ((y0)<<4) | (((x1)>>6)&0x0f); __p[3]=((x1)<<2) | (((y1)>>8)&0x03); __p[4]=(y1); }
+inline
+void WBUFPOS(uint8_t *p, size_t pos, uint16_t x, uint16_t y)
+{
+ p += pos;
+ p[0] = x >> 2;
+ p[1] = (x << 6) | ((y >> 4) & 0x3f);
+ p[2] = y << 4;
+}
+inline
+void WBUFPOS2(uint8_t *p, size_t pos, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
+{
+ p += pos;
+ p[0] = x0 >> 2;
+ p[1] = (x0 << 6) | ((y0 >> 4) & 0x3f);
+ p[2] = (y0 << 4) | ((x1 >> 6) & 0x0f);
+ p[3] = (x1 << 2) | ((y1 >> 8) & 0x03);
+ p[4] = y1;
+}
+
+inline
+void WFIFOPOS(int fd, size_t pos, uint16_t x, uint16_t y)
+{
+ WBUFPOS(static_cast<uint8_t *>(WFIFOP(fd, pos)), 0, x, y);
+}
+inline
+void WFIFOPOS2(int fd, size_t pos, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
+{
+ WBUFPOS2(static_cast<uint8_t *>(WFIFOP(fd, pos)), 0, x0, y0, x1, y1);
+}
-#define WFIFOPOS(fd,pos,x,y) { WBUFPOS (WFIFOP(fd,pos),0,x,y); }
-#define WFIFOPOS2(fd,pos,x0,y0,x1,y1) { WBUFPOS2(WFIFOP(fd,pos),0,x0,y0,x1,y1); }
+static
+char map_ip_str[16];
+static
+struct in_addr map_ip;
+static
+int map_port = 5121;
-static char map_ip_str[16];
-static struct in_addr map_ip;
-static int map_port = 5121;
-int map_fd;
-char talkie_mes[80];
+static
+int clif_changelook_towards(struct block_list *bl, LOOK type, int val,
+ struct map_session_data *dstsd);
/*==========================================
* map鯖のip設定
*------------------------------------------
*/
-void clif_setip (const char *ip)
+void clif_setip(const char *ip)
{
- memcpy (map_ip_str, ip, 16);
- map_ip.s_addr = inet_addr (map_ip_str);
+ memcpy(map_ip_str, ip, 16);
+ map_ip.s_addr = inet_addr(map_ip_str);
}
/*==========================================
* map鯖のport設定
*------------------------------------------
*/
-void clif_setport (int port)
+void clif_setport(int port)
{
map_port = port;
}
@@ -160,7 +144,7 @@ void clif_setport (int port)
* map鯖のip読み出し
*------------------------------------------
*/
-struct in_addr clif_getip (void)
+struct in_addr clif_getip(void)
{
return map_ip;
}
@@ -169,7 +153,7 @@ struct in_addr clif_getip (void)
* map鯖のport読み出し
*------------------------------------------
*/
-int clif_getport (void)
+int clif_getport(void)
{
return map_port;
}
@@ -178,16 +162,16 @@ int clif_getport (void)
*
*------------------------------------------
*/
-int clif_countusers (void)
+int clif_countusers(void)
{
- int users = 0, i;
+ int users = 0, i;
struct map_session_data *sd;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (sd = (struct map_session_data *)session[i]->session_data) && sd
&& sd->state.auth && !(battle_config.hide_GM_session
- && pc_isGM (sd)))
+ && pc_isGM(sd)))
users++;
}
return users;
@@ -197,109 +181,96 @@ int clif_countusers (void)
* 全てのclientに対してfunc()実行
*------------------------------------------
*/
-int clif_foreachclient (int (*func) (struct map_session_data *, va_list), ...)
+int clif_foreachclient(std::function<void(struct map_session_data *)> func)
{
- int i;
- va_list ap;
+ int i;
struct map_session_data *sd;
- va_start (ap, func);
for (i = 0; i < fd_max; i++)
{
if (session[i] && (sd = (struct map_session_data *)session[i]->session_data) && sd
&& sd->state.auth)
- func (sd, ap);
+ func(sd);
}
- va_end (ap);
return 0;
}
-static int is_deaf (struct block_list *bl)
+static
+int is_deaf(struct block_list *bl)
{
struct map_session_data *sd = (struct map_session_data *) bl;
- if (!bl || bl->type != BL_PC)
+ if (!bl || bl->type != BL::PC)
return 0;
return sd->special_state.deaf;
}
-static void clif_emotion_towards (struct block_list *bl,
+static
+void clif_emotion_towards(struct block_list *bl,
struct block_list *target, int type);
-static char *clif_validate_chat (struct map_session_data *sd, int type,
- char **message, size_t *message_len);
+static
+char *clif_validate_chat(struct map_session_data *sd, int type,
+ const char **message, size_t *message_len);
/*==========================================
- * clif_sendでAREA*指定時用
+ * clif_sendでSendWho::AREA*指定時用
*------------------------------------------
*/
static
-int clif_send_sub (struct block_list *bl, va_list ap)
+void clif_send_sub(struct block_list *bl, const unsigned char *buf, int len,
+ struct block_list *src_bl, SendWho type)
{
- unsigned char *buf;
- int len;
- struct block_list *src_bl;
- int type;
- struct map_session_data *sd;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, sd = (struct map_session_data *) bl);
-
- buf = va_arg (ap, unsigned char *);
- len = va_arg (ap, int);
- nullpo_retr (0, src_bl = va_arg (ap, struct block_list *));
- type = va_arg (ap, int);
+ nullpo_retv(bl);
+ struct map_session_data *sd = (struct map_session_data *) bl;
switch (type)
{
- case AREA_WOS:
+ case SendWho::AREA_WOS:
if (bl && bl == src_bl)
- return 0;
+ return;
break;
- case AREA_CHAT_WOC:
- if (is_deaf (bl)
- && !(bl->type == BL_PC
- && pc_isGM ((struct map_session_data *) src_bl)))
+ case SendWho::AREA_CHAT_WOC:
+ if (is_deaf(bl)
+ && !(bl->type == BL::PC
+ && pc_isGM((struct map_session_data *) src_bl)))
{
- clif_emotion_towards (src_bl, bl, EMOTE_IGNORED);
- return 0;
+ clif_emotion_towards(src_bl, bl, EMOTE_IGNORED);
+ return;
}
- /* fall through... */
- case AREA_WOC:
+ FALLTHROUGH;
+ case SendWho::AREA_WOC:
if ((sd && sd->chatID) || (bl && bl == src_bl))
- return 0;
+ return;
break;
- case AREA_WOSC:
+ case SendWho::AREA_WOSC:
if ((sd) && sd->chatID
&& sd->chatID == ((struct map_session_data *) src_bl)->chatID)
- return 0;
+ return;
break;
}
if (session[sd->fd] != NULL)
{
- if (WFIFOP (sd->fd, 0) == buf)
+ if (WFIFOP(sd->fd, 0) == buf)
{
- printf ("WARNING: Invalid use of clif_send function\n");
- printf
- (" Packet x%4x use a WFIFO of a player instead of to use a buffer.\n",
- WBUFW (buf, 0));
- printf (" Please correct your code.\n");
+ PRINTF("WARNING: Invalid use of clif_send function\n");
+ PRINTF(" Packet x%4x use a WFIFO of a player instead of to use a buffer.\n",
+ RBUFW(buf, 0));
+ PRINTF(" Please correct your code.\n");
// don't send to not move the pointer of the packet for next sessions in the loop
}
else
{
- if (packet_len_table[RBUFW (buf, 0)])
- { // packet must exist
- memcpy (WFIFOP (sd->fd, 0), buf, len);
- WFIFOSET (sd->fd, len);
+ if (clif_parse_func_table[RBUFW(buf, 0)].len)
+ {
+ // packet must exist
+ memcpy(WFIFOP(sd->fd, 0), buf, len);
+ WFIFOSET(sd->fd, len);
}
}
}
-
- return 0;
}
/*==========================================
@@ -307,35 +278,34 @@ int clif_send_sub (struct block_list *bl, va_list ap)
*------------------------------------------
*/
static
-int clif_send (const uint8_t *buf, int len, struct block_list *bl, int type)
+int clif_send(const uint8_t *buf, int len, struct block_list *bl, SendWho type)
{
- int i;
+ int i;
struct map_session_data *sd;
struct chat_data *cd;
struct party *p = NULL;
- struct guild *g = NULL;
- int x0 = 0, x1 = 0, y0 = 0, y1 = 0;
+ int x0 = 0, x1 = 0, y0 = 0, y1 = 0;
- if (type != ALL_CLIENT)
+ if (type != SendWho::ALL_CLIENT)
{
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
{
struct map_session_data *sd2 = (struct map_session_data *) bl;
- if (sd2->status.option & OPTION_INVISIBILITY)
+ if (bool(sd2->status.option & Option::INVISIBILITY))
{
// Obscure hidden GMs
switch (type)
{
- case AREA:
- case AREA_WOC:
- type = SELF;
+ case SendWho::AREA:
+ case SendWho::AREA_WOC:
+ type = SendWho::SELF;
break;
- case AREA_WOS:
- case AREA_WOSC:
+ case SendWho::AREA_WOS:
+ case SendWho::AREA_WOSC:
return 1;
default:
@@ -347,95 +317,94 @@ int clif_send (const uint8_t *buf, int len, struct block_list *bl, int type)
switch (type)
{
- case ALL_CLIENT: // 全クライアントに送信
+ case SendWho::ALL_CLIENT: // 全クライアントに送信
for (i = 0; i < fd_max; i++)
{
if (session[i] && (sd = (struct map_session_data *)session[i]->session_data) != NULL
&& sd->state.auth)
{
- if (packet_len_table[RBUFW (buf, 0)])
+ if (clif_parse_func_table[RBUFW(buf, 0)].len)
{ // packet must exist
- memcpy (WFIFOP (i, 0), buf, len);
- WFIFOSET (i, len);
+ memcpy(WFIFOP(i, 0), buf, len);
+ WFIFOSET(i, len);
}
}
}
break;
- case ALL_SAMEMAP: // 同じマップの全クライアントに送信
+ case SendWho::ALL_SAMEMAP: // 同じマップの全クライアントに送信
for (i = 0; i < fd_max; i++)
{
if (session[i] && (sd = (struct map_session_data *)session[i]->session_data) != NULL
&& sd->state.auth && sd->bl.m == bl->m)
{
- if (packet_len_table[RBUFW (buf, 0)])
+ if (clif_parse_func_table[RBUFW(buf, 0)].len)
{ // packet must exist
- memcpy (WFIFOP (i, 0), buf, len);
- WFIFOSET (i, len);
+ memcpy(WFIFOP(i, 0), buf, len);
+ WFIFOSET(i, len);
}
}
}
break;
- case AREA:
- case AREA_WOS:
- case AREA_WOC:
- case AREA_WOSC:
- map_foreachinarea (clif_send_sub, bl->m, bl->x - AREA_SIZE,
- bl->y - AREA_SIZE, bl->x + AREA_SIZE,
- bl->y + AREA_SIZE, BL_PC, buf, len, bl, type);
+ case SendWho::AREA:
+ case SendWho::AREA_WOS:
+ case SendWho::AREA_WOC:
+ case SendWho::AREA_WOSC:
+ map_foreachinarea(std::bind(clif_send_sub, ph::_1, buf, len, bl, type),
+ bl->m, bl->x - AREA_SIZE, bl->y - AREA_SIZE,
+ bl->x + AREA_SIZE, bl->y + AREA_SIZE, BL::PC);
break;
- case AREA_CHAT_WOC:
- map_foreachinarea (clif_send_sub, bl->m, bl->x - (AREA_SIZE),
- bl->y - (AREA_SIZE),
- bl->x + (AREA_SIZE),
- bl->y + (AREA_SIZE), BL_PC, buf, len, bl,
- AREA_CHAT_WOC);
+ case SendWho::AREA_CHAT_WOC:
+ map_foreachinarea(std::bind(clif_send_sub, ph::_1, buf, len, bl, SendWho::AREA_CHAT_WOC),
+ bl->m, bl->x - (AREA_SIZE), bl->y - (AREA_SIZE),
+ bl->x + (AREA_SIZE), bl->y + (AREA_SIZE), BL::PC);
break;
- case CHAT:
- case CHAT_WOS:
+ case SendWho::CHAT:
+ case SendWho::CHAT_WOS:
cd = (struct chat_data *) bl;
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
{
sd = (struct map_session_data *) bl;
- cd = (struct chat_data *) map_id2bl (sd->chatID);
+ cd = (struct chat_data *) map_id2bl(sd->chatID);
}
- else if (bl->type != BL_CHAT)
+ else if (bl->type != BL::CHAT)
break;
if (cd == NULL)
break;
for (i = 0; i < cd->users; i++)
{
- if (type == CHAT_WOS
+ if (type == SendWho::CHAT_WOS
&& cd->usersd[i] == (struct map_session_data *) bl)
continue;
- if (packet_len_table[RBUFW (buf, 0)])
+ if (clif_parse_func_table[RBUFW(buf, 0)].len)
{ // packet must exist
- memcpy (WFIFOP (cd->usersd[i]->fd, 0), buf, len);
- WFIFOSET (cd->usersd[i]->fd, len);
+ memcpy(WFIFOP(cd->usersd[i]->fd, 0), buf, len);
+ WFIFOSET(cd->usersd[i]->fd, len);
}
}
break;
- case PARTY_AREA: // 同じ画面内の全パーティーメンバに送信
- case PARTY_AREA_WOS: // 自分以外の同じ画面内の全パーティーメンバに送信
+ case SendWho::PARTY_AREA: // 同じ画面内の全パーティーメンバに送信
+ case SendWho::PARTY_AREA_WOS: // 自分以外の同じ画面内の全パーティーメンバに送信
x0 = bl->x - AREA_SIZE;
y0 = bl->y - AREA_SIZE;
x1 = bl->x + AREA_SIZE;
y1 = bl->y + AREA_SIZE;
- case PARTY: // 全パーティーメンバに送信
- case PARTY_WOS: // 自分以外の全パーティーメンバに送信
- case PARTY_SAMEMAP: // 同じマップの全パーティーメンバに送信
- case PARTY_SAMEMAP_WOS: // 自分以外の同じマップの全パーティーメンバに送信
- if (bl->type == BL_PC)
+ FALLTHROUGH;
+ case SendWho::PARTY: // 全パーティーメンバに送信
+ case SendWho::PARTY_WOS: // 自分以外の全パーティーメンバに送信
+ case SendWho::PARTY_SAMEMAP: // 同じマップの全パーティーメンバに送信
+ case SendWho::PARTY_SAMEMAP_WOS: // 自分以外の同じマップの全パーティーメンバに送信
+ if (bl->type == BL::PC)
{
sd = (struct map_session_data *) bl;
if (sd->partyspy > 0)
{
- p = party_search (sd->partyspy);
+ p = party_search(sd->partyspy);
}
else
{
if (sd->status.party_id > 0)
- p = party_search (sd->status.party_id);
+ p = party_search(sd->status.party_id);
}
}
if (p)
@@ -444,21 +413,21 @@ int clif_send (const uint8_t *buf, int len, struct block_list *bl, int type)
{
if ((sd = p->member[i].sd) != NULL)
{
- if (sd->bl.id == bl->id && (type == PARTY_WOS ||
- type == PARTY_SAMEMAP_WOS
+ if (sd->bl.id == bl->id && (type == SendWho::PARTY_WOS ||
+ type == SendWho::PARTY_SAMEMAP_WOS
|| type ==
- PARTY_AREA_WOS))
+ SendWho::PARTY_AREA_WOS))
continue;
- if (type != PARTY && type != PARTY_WOS && bl->m != sd->bl.m) // マップチェック
+ if (type != SendWho::PARTY && type != SendWho::PARTY_WOS && bl->m != sd->bl.m) // マップチェック
continue;
- if ((type == PARTY_AREA || type == PARTY_AREA_WOS) &&
+ if ((type == SendWho::PARTY_AREA || type == SendWho::PARTY_AREA_WOS) &&
(sd->bl.x < x0 || sd->bl.y < y0 ||
sd->bl.x > x1 || sd->bl.y > y1))
continue;
- if (packet_len_table[RBUFW (buf, 0)])
+ if (clif_parse_func_table[RBUFW(buf, 0)].len)
{ // packet must exist
- memcpy (WFIFOP (sd->fd, 0), buf, len);
- WFIFOSET (sd->fd, len);
+ memcpy(WFIFOP(sd->fd, 0), buf, len);
+ WFIFOSET(sd->fd, len);
}
}
}
@@ -469,118 +438,28 @@ int clif_send (const uint8_t *buf, int len, struct block_list *bl, int type)
{
if (sd->partyspy == p->party_id)
{
- if (packet_len_table[RBUFW (buf, 0)])
+ if (clif_parse_func_table[RBUFW(buf, 0)].len)
{ // packet must exist
- memcpy (WFIFOP (sd->fd, 0), buf, len);
- WFIFOSET (sd->fd, len);
+ memcpy(WFIFOP(sd->fd, 0), buf, len);
+ WFIFOSET(sd->fd, len);
}
}
}
}
}
break;
- case SELF:
+ case SendWho::SELF:
sd = (struct map_session_data *) bl;
- if (packet_len_table[RBUFW (buf, 0)])
+ if (clif_parse_func_table[RBUFW(buf, 0)].len)
{ // packet must exist
- memcpy (WFIFOP (sd->fd, 0), buf, len);
- WFIFOSET (sd->fd, len);
- }
- break;
-
-/* New definitions for guilds [Valaris] */
-
- case GUILD_AREA:
- case GUILD_AREA_WOS:
- x0 = bl->x - AREA_SIZE;
- y0 = bl->y - AREA_SIZE;
- x1 = bl->x + AREA_SIZE;
- y1 = bl->y + AREA_SIZE;
- case GUILD:
- case GUILD_WOS:
- if (bl && bl->type == BL_PC)
- { // guildspy [Syrus22]
- sd = (struct map_session_data *) bl;
- if (sd->guildspy > 0)
- {
- g = guild_search (sd->guildspy);
- }
- else
- {
- if (sd->status.guild_id > 0)
- g = guild_search (sd->status.guild_id);
- }
- }
- if (g)
- {
- for (i = 0; i < g->max_member; i++)
- {
- if ((sd = g->member[i].sd) != NULL)
- {
- if (type == GUILD_WOS && sd->bl.id == bl->id)
- continue;
- if (packet_len_table[RBUFW (buf, 0)])
- { // packet must exist
- memcpy (WFIFOP (sd->fd, 0), buf, len);
- WFIFOSET (sd->fd, len);
- }
- }
- }
- for (i = 0; i < fd_max; i++)
- {
- if (session[i] && (sd = (struct map_session_data *)session[i]->session_data) != NULL
- && sd->state.auth)
- {
- if (sd->guildspy == g->guild_id)
- {
- if (packet_len_table[RBUFW (buf, 0)])
- { // packet must exist
- memcpy (WFIFOP (sd->fd, 0), buf, len);
- WFIFOSET (sd->fd, len);
- }
- }
- }
- }
- }
- break;
- case GUILD_SAMEMAP:
- case GUILD_SAMEMAP_WOS:
- if (bl->type == BL_PC)
- {
- sd = (struct map_session_data *) bl;
- if (sd->status.guild_id > 0)
- g = guild_search (sd->status.guild_id);
- }
- if (g)
- {
- for (i = 0; i < g->max_member; i++)
- {
- if ((sd = g->member[i].sd) != NULL)
- {
- if (sd->bl.id == bl->id && (type == GUILD_WOS ||
- type == GUILD_SAMEMAP_WOS
- || type ==
- GUILD_AREA_WOS))
- continue;
- if (type != GUILD && type != GUILD_WOS && bl->m != sd->bl.m) // マップチェック
- continue;
- if ((type == GUILD_AREA || type == GUILD_AREA_WOS) &&
- (sd->bl.x < x0 || sd->bl.y < y0 ||
- sd->bl.x > x1 || sd->bl.y > y1))
- continue;
- if (packet_len_table[RBUFW (buf, 0)])
- { // packet must exist
- memcpy (WFIFOP (sd->fd, 0), buf, len);
- WFIFOSET (sd->fd, len);
- }
- }
- }
+ memcpy(WFIFOP(sd->fd, 0), buf, len);
+ WFIFOSET(sd->fd, len);
}
break;
default:
if (battle_config.error_log)
- printf ("clif_send まだ作ってないよー\n");
+ PRINTF("clif_send まだ作ってないよー\n");
return -1;
}
@@ -594,11 +473,11 @@ int clif_send (const uint8_t *buf, int len, struct block_list *bl, int type)
*
*------------------------------------------
*/
-int clif_authok (struct map_session_data *sd)
+int clif_authok(struct map_session_data *sd)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (!sd)
return 0;
@@ -608,12 +487,12 @@ int clif_authok (struct map_session_data *sd)
fd = sd->fd;
- WFIFOW (fd, 0) = 0x73;
- WFIFOL (fd, 2) = gettick ();
- WFIFOPOS (fd, 6, sd->bl.x, sd->bl.y);
- WFIFOB (fd, 9) = 5;
- WFIFOB (fd, 10) = 5;
- WFIFOSET (fd, packet_len_table[0x73]);
+ WFIFOW(fd, 0) = 0x73;
+ WFIFOL(fd, 2) = gettick().time_since_epoch().count();
+ WFIFOPOS(fd, 6, sd->bl.x, sd->bl.y);
+ WFIFOB(fd, 9) = 5;
+ WFIFOB(fd, 10) = 5;
+ WFIFOSET(fd, clif_parse_func_table[0x73].len);
return 0;
}
@@ -622,16 +501,16 @@ int clif_authok (struct map_session_data *sd)
*
*------------------------------------------
*/
-int clif_authfail_fd (int fd, int type)
+int clif_authfail_fd(int fd, int type)
{
if (!fd || !session[fd])
return 0;
- WFIFOW (fd, 0) = 0x81;
- WFIFOL (fd, 2) = type;
- WFIFOSET (fd, packet_len_table[0x81]);
+ WFIFOW(fd, 0) = 0x81;
+ WFIFOL(fd, 2) = type;
+ WFIFOSET(fd, clif_parse_func_table[0x81].len);
- clif_setwaitclose (fd);
+ clif_setwaitclose(fd);
return 0;
}
@@ -640,21 +519,21 @@ int clif_authfail_fd (int fd, int type)
*
*------------------------------------------
*/
-int clif_charselectok (int id)
+int clif_charselectok(int id)
{
struct map_session_data *sd;
- int fd;
+ int fd;
- if ((sd = map_id2sd (id)) == NULL)
+ if ((sd = map_id2sd(id)) == NULL)
return 1;
if (!sd->fd)
return 1;
fd = sd->fd;
- WFIFOW (fd, 0) = 0xb3;
- WFIFOB (fd, 2) = 1;
- WFIFOSET (fd, packet_len_table[0xb3]);
+ WFIFOW(fd, 0) = 0xb3;
+ WFIFOB(fd, 2) = 1;
+ WFIFOSET(fd, clif_parse_func_table[0xb3].len);
return 0;
}
@@ -663,43 +542,44 @@ int clif_charselectok (int id)
*
*------------------------------------------
*/
-static int clif_set009e (struct flooritem_data *fitem, uint8_t *buf)
+static
+int clif_set009e(struct flooritem_data *fitem, uint8_t *buf)
{
- int view;
+ int view;
- nullpo_retr (0, fitem);
+ nullpo_ret(fitem);
//009e <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
- WBUFW (buf, 0) = 0x9e;
- WBUFL (buf, 2) = fitem->bl.id;
- if ((view = itemdb_viewid (fitem->item_data.nameid)) > 0)
- WBUFW (buf, 6) = view;
+ WBUFW(buf, 0) = 0x9e;
+ WBUFL(buf, 2) = fitem->bl.id;
+ if ((view = itemdb_viewid(fitem->item_data.nameid)) > 0)
+ WBUFW(buf, 6) = view;
else
- WBUFW (buf, 6) = fitem->item_data.nameid;
- WBUFB (buf, 8) = fitem->item_data.identify;
- WBUFW (buf, 9) = fitem->bl.x;
- WBUFW (buf, 11) = fitem->bl.y;
- WBUFB (buf, 13) = fitem->subx;
- WBUFB (buf, 14) = fitem->suby;
- WBUFW (buf, 15) = fitem->item_data.amount;
+ WBUFW(buf, 6) = fitem->item_data.nameid;
+ WBUFB(buf, 8) = fitem->item_data.identify;
+ WBUFW(buf, 9) = fitem->bl.x;
+ WBUFW(buf, 11) = fitem->bl.y;
+ WBUFB(buf, 13) = fitem->subx;
+ WBUFB(buf, 14) = fitem->suby;
+ WBUFW(buf, 15) = fitem->item_data.amount;
- return packet_len_table[0x9e];
+ return clif_parse_func_table[0x9e].len;
}
/*==========================================
*
*------------------------------------------
*/
-int clif_dropflooritem (struct flooritem_data *fitem)
+int clif_dropflooritem(struct flooritem_data *fitem)
{
uint8_t buf[64];
- nullpo_retr (0, fitem);
+ nullpo_ret(fitem);
if (fitem->item_data.nameid <= 0)
return 0;
- clif_set009e (fitem, buf);
- clif_send (buf, packet_len_table[0x9e], &fitem->bl, AREA);
+ clif_set009e(fitem, buf);
+ clif_send(buf, clif_parse_func_table[0x9e].len, &fitem->bl, SendWho::AREA);
return 0;
}
@@ -708,23 +588,23 @@ int clif_dropflooritem (struct flooritem_data *fitem)
*
*------------------------------------------
*/
-int clif_clearflooritem (struct flooritem_data *fitem, int fd)
+int clif_clearflooritem(struct flooritem_data *fitem, int fd)
{
unsigned char buf[16];
- nullpo_retr (0, fitem);
+ nullpo_ret(fitem);
- WBUFW (buf, 0) = 0xa1;
- WBUFL (buf, 2) = fitem->bl.id;
+ WBUFW(buf, 0) = 0xa1;
+ WBUFL(buf, 2) = fitem->bl.id;
if (fd == 0)
{
- clif_send (buf, packet_len_table[0xa1], &fitem->bl, AREA);
+ clif_send(buf, clif_parse_func_table[0xa1].len, &fitem->bl, SendWho::AREA);
}
else
{
- memcpy (WFIFOP (fd, 0), buf, 6);
- WFIFOSET (fd, packet_len_table[0xa1]);
+ memcpy(WFIFOP(fd, 0), buf, 6);
+ WFIFOSET(fd, clif_parse_func_table[0xa1].len);
}
return 0;
@@ -734,45 +614,48 @@ int clif_clearflooritem (struct flooritem_data *fitem, int fd)
*
*------------------------------------------
*/
-int clif_clearchar (struct block_list *bl, int type)
+int clif_clearchar(struct block_list *bl, BeingRemoveWhy type)
{
unsigned char buf[16];
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- WBUFW (buf, 0) = 0x80;
- WBUFL (buf, 2) = bl->id;
- if (type == 9)
+ WBUFW(buf, 0) = 0x80;
+ WBUFL(buf, 2) = bl->id;
+ if (type == BeingRemoveWhy::DISGUISE)
{
- WBUFB (buf, 6) = 0;
- clif_send (buf, packet_len_table[0x80], bl, AREA);
+ WBUFB(buf, 6) = static_cast<uint8_t>(BeingRemoveWhy::GONE);
+ clif_send(buf, clif_parse_func_table[0x80].len, bl, SendWho::AREA);
}
else
{
- WBUFB (buf, 6) = type;
- clif_send (buf, packet_len_table[0x80], bl,
- type == 1 ? AREA : AREA_WOS);
+ WBUFB(buf, 6) = static_cast<uint8_t>(type);
+ clif_send(buf, clif_parse_func_table[0x80].len, bl,
+ type == BeingRemoveWhy::DEAD ? SendWho::AREA : SendWho::AREA_WOS);
}
return 0;
}
-static void clif_clearchar_delay_sub (timer_id tid, tick_t tick, custom_id_t id,
- custom_data_t data)
+static
+void clif_clearchar_delay_sub(TimerData *, tick_t,
+ struct block_list *bl, BeingRemoveWhy type)
{
- struct block_list *bl = (struct block_list *) id;
-
- clif_clearchar (bl, data);
- map_freeblock (bl);
+ clif_clearchar(bl, type);
+ map_freeblock(bl);
}
-int clif_clearchar_delay (unsigned int tick, struct block_list *bl, int type)
+int clif_clearchar_delay(tick_t tick,
+ struct block_list *bl, BeingRemoveWhy type)
{
struct block_list *tmpbl;
- CREATE (tmpbl, struct block_list, 1);
+ CREATE(tmpbl, struct block_list, 1);
- memcpy (tmpbl, bl, sizeof (struct block_list));
- add_timer (tick, clif_clearchar_delay_sub, (custom_id_t) tmpbl, type);
+ memcpy(tmpbl, bl, sizeof(struct block_list));
+ Timer(tick,
+ std::bind(clif_clearchar_delay_sub, ph::_1, ph::_2,
+ tmpbl, type)
+ ).detach();
return 0;
}
@@ -781,544 +664,286 @@ int clif_clearchar_delay (unsigned int tick, struct block_list *bl, int type)
*
*------------------------------------------
*/
-int clif_clearchar_id (int id, int type, int fd)
+int clif_clearchar_id(int id, BeingRemoveWhy type, int fd)
{
unsigned char buf[16];
- WBUFW (buf, 0) = 0x80;
- WBUFL (buf, 2) = id;
- WBUFB (buf, 6) = type;
- memcpy (WFIFOP (fd, 0), buf, 7);
- WFIFOSET (fd, packet_len_table[0x80]);
+ WBUFW(buf, 0) = 0x80;
+ WBUFL(buf, 2) = id;
+ WBUFB(buf, 6) = static_cast<uint8_t>(type);
+ memcpy(WFIFOP(fd, 0), buf, 7);
+ WFIFOSET(fd, clif_parse_func_table[0x80].len);
return 0;
}
-/*
-static int current_weapon(struct map_session_data *sd)
-{
- if (sd->attack_spell_override)
- return sd->attack_spell_look_override;
- else {
- return sd->status.weapon;
- }
-}
-*/
-
/*==========================================
*
*------------------------------------------
*/
-static int clif_set0078 (struct map_session_data *sd, unsigned char *buf)
-{
- int level = 0;
-
- nullpo_retr (0, sd);
-
- if (sd->disguise > 23 && sd->disguise < 4001)
- { // mob disguises [Valaris]
- WBUFW (buf, 0) = 0x78;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFW (buf, 6) = battle_get_speed (&sd->bl);
- WBUFW (buf, 8) = sd->opt1;
- WBUFW (buf, 10) = sd->opt2;
- WBUFW (buf, 12) = sd->status.option;
- WBUFW (buf, 14) = sd->disguise;
- WBUFW (buf, 42) = 0;
- WBUFB (buf, 44) = 0;
- WBUFPOS (buf, 46, sd->bl.x, sd->bl.y);
- WBUFB (buf, 48) |= sd->dir & 0x0f;
- WBUFB (buf, 49) = 5;
- WBUFB (buf, 50) = 5;
- WBUFB (buf, 51) = 0;
- WBUFW (buf, 52) =
- ((level =
- battle_get_lv (&sd->bl)) >
- battle_config.max_lv) ? battle_config.max_lv : level;
-
- return packet_len_table[0x78];
- }
-
- WBUFW (buf, 0) = 0x1d8;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFW (buf, 6) = sd->speed;
- WBUFW (buf, 8) = sd->opt1;
- WBUFW (buf, 10) = sd->opt2;
- WBUFW (buf, 12) = sd->status.option;
- WBUFW (buf, 14) = sd->view_class;
- WBUFW (buf, 16) = sd->status.hair;
+static
+int clif_set0078(struct map_session_data *sd, unsigned char *buf)
+{
+ nullpo_ret(sd);
+
+ WBUFW(buf, 0) = 0x1d8;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFW(buf, 6) = static_cast<uint16_t>(sd->speed.count());
+ WBUFW(buf, 8) = static_cast<uint16_t>(sd->opt1);
+ WBUFW(buf, 10) = static_cast<uint16_t>(sd->opt2);
+ WBUFW(buf, 12) = static_cast<uint16_t>(sd->status.option);
+ WBUFW(buf, 14) = sd->status.species;
+ WBUFW(buf, 16) = sd->status.hair;
if (sd->attack_spell_override)
- WBUFB (buf, 18) = sd->attack_spell_look_override;
+ WBUFW(buf, 18) = sd->attack_spell_look_override;
else
{
- if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]]
- && sd->view_class != 22)
+ if (sd->equip_index[EQUIP::WEAPON] >= 0
+ && sd->inventory_data[sd->equip_index[EQUIP::WEAPON]])
{
- if (sd->inventory_data[sd->equip_index[9]]->view_id > 0)
- WBUFW (buf, 18) =
- sd->inventory_data[sd->equip_index[9]]->view_id;
+ if (sd->inventory_data[sd->equip_index[EQUIP::WEAPON]]->view_id > 0)
+ WBUFW(buf, 18) =
+ sd->inventory_data[sd->equip_index[EQUIP::WEAPON]]->view_id;
else
- WBUFW (buf, 18) =
- sd->status.inventory[sd->equip_index[9]].nameid;
+ WBUFW(buf, 18) =
+ sd->status.inventory[sd->equip_index[EQUIP::WEAPON]].nameid;
}
else
- WBUFW (buf, 18) = 0;
+ WBUFW(buf, 18) = 0;
}
- if (sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9]
- && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22)
+ if (sd->equip_index[EQUIP::SHIELD] >= 0
+ && sd->equip_index[EQUIP::SHIELD] != sd->equip_index[EQUIP::WEAPON]
+ && sd->inventory_data[sd->equip_index[EQUIP::SHIELD]])
{
- if (sd->inventory_data[sd->equip_index[8]]->view_id > 0)
- WBUFW (buf, 20) = sd->inventory_data[sd->equip_index[8]]->view_id;
+ if (sd->inventory_data[sd->equip_index[EQUIP::SHIELD]]->view_id > 0)
+ WBUFW(buf, 20) = sd->inventory_data[sd->equip_index[EQUIP::SHIELD]]->view_id;
else
- WBUFW (buf, 20) = sd->status.inventory[sd->equip_index[8]].nameid;
+ WBUFW(buf, 20) = sd->status.inventory[sd->equip_index[EQUIP::SHIELD]].nameid;
}
else
- WBUFW (buf, 20) = 0;
- WBUFW (buf, 22) = sd->status.head_bottom;
- WBUFW (buf, 24) = sd->status.head_top;
- WBUFW (buf, 26) = sd->status.head_mid;
- WBUFW (buf, 28) = sd->status.hair_color;
- WBUFW (buf, 30) = sd->status.clothes_color;
- WBUFW (buf, 32) = sd->head_dir;
- WBUFL (buf, 34) = sd->status.guild_id;
- WBUFW (buf, 38) = sd->guild_emblem_id;
- WBUFW (buf, 40) = sd->status.manner;
- WBUFW (buf, 42) = sd->opt3;
- WBUFB (buf, 44) = sd->status.karma;
- WBUFB (buf, 45) = sd->sex;
- WBUFPOS (buf, 46, sd->bl.x, sd->bl.y);
- WBUFB (buf, 48) |= sd->dir & 0x0f;
- WBUFW (buf, 49) = (pc_isGM (sd) == 60 || pc_isGM (sd) == 99) ? 0x80 : 0;
- WBUFB (buf, 51) = sd->state.dead_sit;
- WBUFW (buf, 52) = 0;
-
- return packet_len_table[0x1d8];
+ WBUFW(buf, 20) = 0;
+ WBUFW(buf, 22) = sd->status.head_bottom;
+ WBUFW(buf, 24) = sd->status.head_top;
+ WBUFW(buf, 26) = sd->status.head_mid;
+ WBUFW(buf, 28) = sd->status.hair_color;
+ WBUFW(buf, 30) = sd->status.clothes_color;
+ WBUFW(buf, 32) = static_cast<uint8_t>(sd->head_dir);
+ WBUFL(buf, 34) = 0 /*guild_id*/;
+ WBUFW(buf, 38) = 0 /*guild_emblem_id*/;
+ WBUFW(buf, 40) = sd->status.manner;
+ WBUFW(buf, 42) = uint16_t(sd->opt3);
+ WBUFB(buf, 44) = sd->status.karma;
+ WBUFB(buf, 45) = sd->sex;
+ WBUFPOS(buf, 46, sd->bl.x, sd->bl.y);
+ // work around ICE in gcc 4.6
+ uint8_t dir = static_cast<uint8_t>(sd->dir);
+ WBUFB(buf, 48) |= dir;
+ WBUFW(buf, 49) = (pc_isGM(sd) == 60 || pc_isGM(sd) == 99) ? 0x80 : 0;
+ WBUFB(buf, 51) = sd->state.dead_sit;
+ WBUFW(buf, 52) = 0;
+
+ return clif_parse_func_table[0x1d8].len;
}
/*==========================================
*
*------------------------------------------
*/
-static int clif_set007b (struct map_session_data *sd, unsigned char *buf)
-{
- int level = 0;
- nullpo_retr (0, sd);
-
- if (sd->disguise > 23 && sd->disguise < 4001)
- { // mob disguises [Valaris]
- WBUFW (buf, 0) = 0x7b;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFW (buf, 6) = battle_get_speed (&sd->bl);
- WBUFW (buf, 8) = sd->opt1;
- WBUFW (buf, 10) = sd->opt2;
- WBUFW (buf, 12) = sd->status.option;
- WBUFW (buf, 14) = sd->disguise;
- WBUFL (buf, 22) = gettick ();
- WBUFW (buf, 46) = 0;
- WBUFB (buf, 48) = 0;
- WBUFPOS2 (buf, 50, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y);
- WBUFB (buf, 55) = 0;
- WBUFB (buf, 56) = 5;
- WBUFB (buf, 57) = 5;
- WBUFW (buf, 58) =
- ((level =
- battle_get_lv (&sd->bl)) >
- battle_config.max_lv) ? battle_config.max_lv : level;
-
- return packet_len_table[0x7b];
- }
-
- WBUFW (buf, 0) = 0x1da;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFW (buf, 6) = sd->speed;
- WBUFW (buf, 8) = sd->opt1;
- WBUFW (buf, 10) = sd->opt2;
- WBUFW (buf, 12) = sd->status.option;
- WBUFW (buf, 14) = sd->view_class;
- WBUFW (buf, 16) = sd->status.hair;
- if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]]
- && sd->view_class != 22)
- {
- if (sd->inventory_data[sd->equip_index[9]]->view_id > 0)
- WBUFW (buf, 18) = sd->inventory_data[sd->equip_index[9]]->view_id;
+static
+int clif_set007b(struct map_session_data *sd, unsigned char *buf)
+{
+ nullpo_ret(sd);
+
+ WBUFW(buf, 0) = 0x1da;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFW(buf, 6) = static_cast<uint16_t>(sd->speed.count());
+ WBUFW(buf, 8) = static_cast<uint16_t>(sd->opt1);
+ WBUFW(buf, 10) = static_cast<uint16_t>(sd->opt2);
+ WBUFW(buf, 12) = static_cast<uint16_t>(sd->status.option);
+ WBUFW(buf, 14) = sd->status.species;
+ WBUFW(buf, 16) = sd->status.hair;
+ if (sd->equip_index[EQUIP::WEAPON] >= 0
+ && sd->inventory_data[sd->equip_index[EQUIP::WEAPON]])
+ {
+ if (sd->inventory_data[sd->equip_index[EQUIP::WEAPON]]->view_id > 0)
+ WBUFW(buf, 18) = sd->inventory_data[sd->equip_index[EQUIP::WEAPON]]->view_id;
else
- WBUFW (buf, 18) = sd->status.inventory[sd->equip_index[9]].nameid;
+ WBUFW(buf, 18) = sd->status.inventory[sd->equip_index[EQUIP::WEAPON]].nameid;
}
else
- WBUFW (buf, 18) = 0;
- if (sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9]
- && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22)
+ WBUFW(buf, 18) = 0;
+ if (sd->equip_index[EQUIP::SHIELD] >= 0
+ && sd->equip_index[EQUIP::SHIELD] != sd->equip_index[EQUIP::WEAPON]
+ && sd->inventory_data[sd->equip_index[EQUIP::SHIELD]])
{
- if (sd->inventory_data[sd->equip_index[8]]->view_id > 0)
- WBUFW (buf, 20) = sd->inventory_data[sd->equip_index[8]]->view_id;
+ if (sd->inventory_data[sd->equip_index[EQUIP::SHIELD]]->view_id > 0)
+ WBUFW(buf, 20) = sd->inventory_data[sd->equip_index[EQUIP::SHIELD]]->view_id;
else
- WBUFW (buf, 20) = sd->status.inventory[sd->equip_index[8]].nameid;
+ WBUFW(buf, 20) = sd->status.inventory[sd->equip_index[EQUIP::SHIELD]].nameid;
}
else
- WBUFW (buf, 20) = 0;
- WBUFW (buf, 22) = sd->status.head_bottom;
- WBUFL (buf, 24) = gettick ();
- WBUFW (buf, 28) = sd->status.head_top;
- WBUFW (buf, 30) = sd->status.head_mid;
- WBUFW (buf, 32) = sd->status.hair_color;
- WBUFW (buf, 34) = sd->status.clothes_color;
- WBUFW (buf, 36) = sd->head_dir;
- WBUFL (buf, 38) = sd->status.guild_id;
- WBUFW (buf, 42) = sd->guild_emblem_id;
- WBUFW (buf, 44) = sd->status.manner;
- WBUFW (buf, 46) = sd->opt3;
- WBUFB (buf, 48) = sd->status.karma;
- WBUFB (buf, 49) = sd->sex;
- WBUFPOS2 (buf, 50, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y);
- WBUFW (buf, 55) = pc_isGM (sd) == 60 ? 0x80 : 0;
- WBUFB (buf, 57) = 5;
- WBUFW (buf, 58) = 0;
-
- return packet_len_table[0x1da];
-}
-
-/*==========================================
- * クラスチェンジ typeはMobの場合は1で他は0?
- *------------------------------------------
- */
-int clif_npc_class_change (struct block_list *bl, int npc_class, int type)
-{
- uint8_t buf[16];
-
- nullpo_retr (0, bl);
-
- if (npc_class >= MAX_PC_CLASS)
- {
- WBUFW (buf, 0) = 0x1b0;
- WBUFL (buf, 2) = bl->id;
- WBUFB (buf, 6) = type;
- WBUFL (buf, 7) = npc_class;
-
- clif_send (buf, packet_len_table[0x1b0], bl, AREA);
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_mob_class_change (struct mob_data *md, int class_)
-{
- uint8_t buf[16];
- int view = mob_get_viewclass (class_);
-
- nullpo_retr (0, md);
-
- if (view >= MAX_PC_CLASS)
- {
- WBUFW (buf, 0) = 0x1b0;
- WBUFL (buf, 2) = md->bl.id;
- WBUFB (buf, 6) = 1;
- WBUFL (buf, 7) = view;
-
- clif_send (buf, packet_len_table[0x1b0], &md->bl, AREA);
- }
- return 0;
-}
-
-// mob equipment [Valaris]
-
-int clif_mob_equip (struct mob_data *md, int nameid)
-{
- unsigned char buf[16];
-
- nullpo_retr (0, md);
-
- memset (buf, 0, packet_len_table[0x1a4]);
-
- WBUFW (buf, 0) = 0x1a4;
- WBUFB (buf, 2) = 3;
- WBUFL (buf, 3) = md->bl.id;
- WBUFL (buf, 7) = nameid;
-
- clif_send (buf, packet_len_table[0x1a4], &md->bl, AREA);
-
- return 0;
+ WBUFW(buf, 20) = 0;
+ WBUFW(buf, 22) = sd->status.head_bottom;
+ WBUFL(buf, 24) = gettick().time_since_epoch().count();
+ WBUFW(buf, 28) = sd->status.head_top;
+ WBUFW(buf, 30) = sd->status.head_mid;
+ WBUFW(buf, 32) = sd->status.hair_color;
+ WBUFW(buf, 34) = sd->status.clothes_color;
+ WBUFW(buf, 36) = static_cast<uint8_t>(sd->head_dir);
+ WBUFL(buf, 38) = 0/*guild_id*/;
+ WBUFW(buf, 42) = 0/*guild_emblem_id*/;
+ WBUFW(buf, 44) = sd->status.manner;
+ WBUFW(buf, 46) = uint16_t(sd->opt3);
+ WBUFB(buf, 48) = sd->status.karma;
+ WBUFB(buf, 49) = sd->sex;
+ WBUFPOS2(buf, 50, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y);
+ WBUFW(buf, 55) = pc_isGM(sd) == 60 ? 0x80 : 0;
+ WBUFB(buf, 57) = 5;
+ WBUFW(buf, 58) = 0;
+
+ return clif_parse_func_table[0x1da].len;
}
/*==========================================
* MOB表示1
*------------------------------------------
*/
-static int clif_mob0078 (struct mob_data *md, unsigned char *buf)
-{
- int level;
-
- memset (buf, 0, packet_len_table[0x78]);
-
- nullpo_retr (0, md);
-
- WBUFW (buf, 0) = 0x78;
- WBUFL (buf, 2) = md->bl.id;
- WBUFW (buf, 6) = battle_get_speed (&md->bl);
- WBUFW (buf, 8) = md->opt1;
- WBUFW (buf, 10) = md->opt2;
- WBUFW (buf, 12) = md->option;
- WBUFW (buf, 14) = mob_get_viewclass (md->mob_class);
- if ((mob_get_viewclass (md->mob_class) <= 23)
- || (mob_get_viewclass (md->mob_class) == 812)
- || (mob_get_viewclass (md->mob_class) >= 4001))
- {
- WBUFW (buf, 12) |= mob_db[md->mob_class].option;
- WBUFW (buf, 16) = mob_get_hair (md->mob_class);
- WBUFW (buf, 18) = mob_get_weapon (md->mob_class);
- WBUFW (buf, 20) = mob_get_head_buttom (md->mob_class);
- WBUFW (buf, 22) = mob_get_shield (md->mob_class);
- WBUFW (buf, 24) = mob_get_head_top (md->mob_class);
- WBUFW (buf, 26) = mob_get_head_mid (md->mob_class);
- WBUFW (buf, 28) = mob_get_hair_color (md->mob_class);
- WBUFW (buf, 30) = mob_get_clothes_color (md->mob_class); //Add for player monster dye - Valaris
- WBUFB (buf, 45) = mob_get_sex (md->mob_class);
- }
-
- if (md->mob_class >= 1285 && md->mob_class <= 1287)
- { // Added guardian emblems [Valaris]
- struct guild *g;
- struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name);
- if (gc && gc->guild_id > 0)
- {
- g = guild_search (gc->guild_id);
- if (g)
- {
- WBUFL (buf, 26) = gc->guild_id;
- WBUFL (buf, 22) = g->emblem_id;
- }
- }
- } // End addition
-
- WBUFPOS (buf, 46, md->bl.x, md->bl.y);
- WBUFB (buf, 48) |= md->dir & 0x0f;
- WBUFB (buf, 49) = 5;
- WBUFB (buf, 50) = 5;
- WBUFW (buf, 52) =
+static
+int clif_mob0078(struct mob_data *md, unsigned char *buf)
+{
+ int level;
+
+ memset(buf, 0, clif_parse_func_table[0x78].len);
+
+ nullpo_ret(md);
+
+ WBUFW(buf, 0) = 0x78;
+ WBUFL(buf, 2) = md->bl.id;
+ WBUFW(buf, 6) = static_cast<uint16_t>(battle_get_speed(&md->bl).count());
+ WBUFW(buf, 8) = static_cast<uint16_t>(md->opt1);
+ WBUFW(buf, 10) = static_cast<uint16_t>(md->opt2);
+ WBUFW(buf, 12) = static_cast<uint16_t>(md->option);
+ WBUFW(buf, 14) = md->mob_class;
+ // snip: stuff do do with disguise as a PC
+ WBUFPOS(buf, 46, md->bl.x, md->bl.y);
+ // work around ICE in gcc 4.6
+ uint8_t dir = static_cast<uint8_t>(md->dir);
+ WBUFB(buf, 48) |= dir;
+ WBUFB(buf, 49) = 5;
+ WBUFB(buf, 50) = 5;
+ WBUFW(buf, 52) =
((level =
- battle_get_lv (&md->bl)) >
+ battle_get_lv(&md->bl)) >
battle_config.max_lv) ? battle_config.max_lv : level;
- return packet_len_table[0x78];
+ return clif_parse_func_table[0x78].len;
}
/*==========================================
* MOB表示2
*------------------------------------------
*/
-static int clif_mob007b (struct mob_data *md, unsigned char *buf)
+static
+int clif_mob007b(struct mob_data *md, unsigned char *buf)
{
- int level;
+ int level;
- memset (buf, 0, packet_len_table[0x7b]);
+ memset(buf, 0, clif_parse_func_table[0x7b].len);
- nullpo_retr (0, md);
-
- WBUFW (buf, 0) = 0x7b;
- WBUFL (buf, 2) = md->bl.id;
- WBUFW (buf, 6) = battle_get_speed (&md->bl);
- WBUFW (buf, 8) = md->opt1;
- WBUFW (buf, 10) = md->opt2;
- WBUFW (buf, 12) = md->option;
- WBUFW (buf, 14) = mob_get_viewclass (md->mob_class);
- if ((mob_get_viewclass (md->mob_class) < 24)
- || (mob_get_viewclass (md->mob_class) > 4000))
- {
- WBUFW (buf, 12) |= mob_db[md->mob_class].option;
- WBUFW (buf, 16) = mob_get_hair (md->mob_class);
- WBUFW (buf, 18) = mob_get_weapon (md->mob_class);
- WBUFW (buf, 20) = mob_get_head_buttom (md->mob_class);
- WBUFL (buf, 22) = gettick ();
- WBUFW (buf, 26) = mob_get_shield (md->mob_class);
- WBUFW (buf, 28) = mob_get_head_top (md->mob_class);
- WBUFW (buf, 30) = mob_get_head_mid (md->mob_class);
- WBUFW (buf, 32) = mob_get_hair_color (md->mob_class);
- WBUFW (buf, 34) = mob_get_clothes_color (md->mob_class); //Add for player monster dye - Valaris
- WBUFB (buf, 49) = mob_get_sex (md->mob_class);
- }
- else
- WBUFL (buf, 22) = gettick ();
+ nullpo_ret(md);
- if (md->mob_class >= 1285 && md->mob_class <= 1287)
- { // Added guardian emblems [Valaris]
- struct guild *g;
- struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name);
- if (gc && gc->guild_id > 0)
- {
- g = guild_search (gc->guild_id);
- if (g)
- {
- WBUFL (buf, 28) = gc->guild_id;
- WBUFL (buf, 24) = g->emblem_id;
- }
- }
- } // End addition
+ WBUFW(buf, 0) = 0x7b;
+ WBUFL(buf, 2) = md->bl.id;
+ WBUFW(buf, 6) = static_cast<uint16_t>(battle_get_speed(&md->bl).count());
+ WBUFW(buf, 8) = static_cast<uint16_t>(md->opt1);
+ WBUFW(buf, 10) = static_cast<uint16_t>(md->opt2);
+ WBUFW(buf, 12) = static_cast<uint16_t>(md->option);
+ WBUFW(buf, 14) = md->mob_class;
+ // snip: stuff for monsters disguised as PCs
+ WBUFL(buf, 22) = gettick().time_since_epoch().count();
- WBUFPOS2 (buf, 50, md->bl.x, md->bl.y, md->to_x, md->to_y);
- WBUFB (buf, 56) = 5;
- WBUFB (buf, 57) = 5;
- WBUFW (buf, 58) =
+ WBUFPOS2(buf, 50, md->bl.x, md->bl.y, md->to_x, md->to_y);
+ WBUFB(buf, 56) = 5;
+ WBUFB(buf, 57) = 5;
+ WBUFW(buf, 58) =
((level =
- battle_get_lv (&md->bl)) >
+ battle_get_lv(&md->bl)) >
battle_config.max_lv) ? battle_config.max_lv : level;
- return packet_len_table[0x7b];
+ return clif_parse_func_table[0x7b].len;
}
/*==========================================
*
*------------------------------------------
*/
-static int clif_npc0078 (struct npc_data *nd, unsigned char *buf)
+static
+int clif_npc0078(struct npc_data *nd, unsigned char *buf)
{
- struct guild *g;
-
- nullpo_retr (0, nd);
-
- memset (buf, 0, packet_len_table[0x78]);
-
- WBUFW (buf, 0) = 0x78;
- WBUFL (buf, 2) = nd->bl.id;
- WBUFW (buf, 6) = nd->speed;
- WBUFW (buf, 14) = nd->npc_class;
- if ((nd->npc_class == 722) && (nd->u.scr.guild_id > 0)
- && ((g = guild_search (nd->u.scr.guild_id)) != NULL))
- {
- WBUFL (buf, 22) = g->emblem_id;
- WBUFL (buf, 26) = g->guild_id;
- }
- WBUFPOS (buf, 46, nd->bl.x, nd->bl.y);
- WBUFB (buf, 48) |= nd->dir & 0x0f;
- WBUFB (buf, 49) = 5;
- WBUFB (buf, 50) = 5;
+ nullpo_ret(nd);
- return packet_len_table[0x78];
-}
+ memset(buf, 0, clif_parse_func_table[0x78].len);
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set01e1 (struct map_session_data *sd, unsigned char *buf)
-{
- nullpo_retr (0, sd);
+ WBUFW(buf, 0) = 0x78;
+ WBUFL(buf, 2) = nd->bl.id;
+ WBUFW(buf, 6) = static_cast<uint16_t>(nd->speed.count());
+ WBUFW(buf, 14) = nd->npc_class;
+ WBUFPOS(buf, 46, nd->bl.x, nd->bl.y);
+ // work around ICE in gcc 4.6
+ uint8_t dir = static_cast<uint8_t>(nd->dir);
+ WBUFB(buf, 48) |= dir;
+ WBUFB(buf, 49) = 5;
+ WBUFB(buf, 50) = 5;
- WBUFW (buf, 0) = 0x1e1;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFW (buf, 6) = sd->spiritball;
-
- return packet_len_table[0x1e1];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set0192 (int fd, int m, int x, int y, int type)
-{
- WFIFOW (fd, 0) = 0x192;
- WFIFOW (fd, 2) = x;
- WFIFOW (fd, 4) = y;
- WFIFOW (fd, 6) = type;
- memcpy (WFIFOP (fd, 8), map[m].name, 16);
- WFIFOSET (fd, packet_len_table[0x192]);
-
- return 0;
+ return clif_parse_func_table[0x78].len;
}
/* These indices are derived from equip_pos in pc.c and some guesswork */
-static int equip_points[LOOK_LAST + 1] = {
- -1, /* 0: base */
- -1, /* 1: hair */
- 9, /* 2: weapon */
- 4, /* 3: head botom -- leg armour */
- 6, /* 4: head top -- hat */
- 5, /* 5: head mid -- torso armour */
- -1, /* 6: hair colour */
- -1, /* 6: clothes colour */
- 8, /* 6: shield */
- 2, /* 9: shoes */
- 3, /* gloves */
- 1, /* cape */
- 7, /* misc1 */
- 0, /* misc2 */
-};
+static
+earray<EQUIP, LOOK, LOOK::COUNT> equip_points //=
+{{
+ EQUIP::NONE, // base
+ EQUIP::NONE, // hair
+ EQUIP::WEAPON, // weapon
+ EQUIP::LEGS, // head botom -- leg armour
+ EQUIP::HAT, // head top -- hat
+ EQUIP::TORSO, // head mid -- torso armour
+ EQUIP::NONE, // hair colour
+ EQUIP::NONE, // clothes colour
+ EQUIP::SHIELD, // shield
+ EQUIP::SHOES, // shoes
+ EQUIP::GLOVES, // gloves
+ EQUIP::CAPE, // cape
+ EQUIP::MISC1, // misc1
+ EQUIP::MISC2, // misc2
+}};
/*==========================================
*
*------------------------------------------
*/
-int clif_spawnpc (struct map_session_data *sd)
+int clif_spawnpc(struct map_session_data *sd)
{
unsigned char buf[128];
- nullpo_retr (0, sd);
-
- if (sd->disguise > 23 && sd->disguise < 4001)
- { // mob disguises [Valaris]
- clif_clearchar (&sd->bl, 9);
-
- memset (buf, 0, packet_len_table[0x119]);
-
- WBUFW (buf, 0) = 0x119;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFW (buf, 6) = 0;
- WBUFW (buf, 8) = 0;
- WBUFW (buf, 10) = 0x40;
- WBUFB (buf, 12) = 0;
-
- clif_send (buf, packet_len_table[0x119], &sd->bl, SELF);
-
- memset (buf, 0, packet_len_table[0x7c]);
-
- WBUFW (buf, 0) = 0x7c;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFW (buf, 6) = sd->speed;
- WBUFW (buf, 8) = sd->opt1;
- WBUFW (buf, 10) = sd->opt2;
- WBUFW (buf, 12) = sd->status.option;
- WBUFW (buf, 20) = sd->disguise;
- WBUFPOS (buf, 36, sd->bl.x, sd->bl.y);
- clif_send (buf, packet_len_table[0x7c], &sd->bl, AREA);
- }
-
- clif_set0078 (sd, buf);
-
- WBUFW (buf, 0) = 0x1d9;
- WBUFW (buf, 51) = 0;
- clif_send (buf, packet_len_table[0x1d9], &sd->bl, AREA_WOS);
-
- if (sd->spiritball > 0)
- clif_spiritball (sd);
+ nullpo_ret(sd);
- if (sd->status.guild_id > 0)
- { // force display of guild emblem [Valaris]
- struct guild *g = guild_search (sd->status.guild_id);
- if (g)
- clif_guild_emblem (sd, g);
- } // end addition [Valaris]
+ clif_set0078(sd, buf);
- 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 | 0x0020); // [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]
+ WBUFW(buf, 0) = 0x1d9;
+ WBUFW(buf, 51) = 0;
+ clif_send(buf, clif_parse_func_table[0x1d9].len, &sd->bl, SendWho::AREA_WOS);
if (map[sd->bl.m].flag.snow)
- clif_specialeffect (&sd->bl, 162, 1);
+ clif_specialeffect(&sd->bl, 162, 1);
if (map[sd->bl.m].flag.fog)
- clif_specialeffect (&sd->bl, 233, 1);
+ clif_specialeffect(&sd->bl, 233, 1);
if (map[sd->bl.m].flag.sakura)
- clif_specialeffect (&sd->bl, 163, 1);
+ clif_specialeffect(&sd->bl, 163, 1);
if (map[sd->bl.m].flag.leaves)
- clif_specialeffect (&sd->bl, 333, 1);
+ clif_specialeffect(&sd->bl, 333, 1);
if (map[sd->bl.m].flag.rain)
- clif_specialeffect (&sd->bl, 161, 1);
+ clif_specialeffect(&sd->bl, 161, 1);
// clif_changelook_accessories(&sd->bl, NULL);
@@ -1329,66 +954,65 @@ int clif_spawnpc (struct map_session_data *sd)
*
*------------------------------------------
*/
-int clif_spawnnpc (struct npc_data *nd)
+int clif_spawnnpc(struct npc_data *nd)
{
unsigned char buf[64];
- int len;
+ int len;
- nullpo_retr (0, nd);
+ nullpo_ret(nd);
if (nd->npc_class < 0 || nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS)
return 0;
- memset (buf, 0, packet_len_table[0x7c]);
+ memset(buf, 0, clif_parse_func_table[0x7c].len);
- WBUFW (buf, 0) = 0x7c;
- WBUFL (buf, 2) = nd->bl.id;
- WBUFW (buf, 6) = nd->speed;
- WBUFW (buf, 20) = nd->npc_class;
- WBUFPOS (buf, 36, nd->bl.x, nd->bl.y);
+ WBUFW(buf, 0) = 0x7c;
+ WBUFL(buf, 2) = nd->bl.id;
+ WBUFW(buf, 6) = static_cast<uint16_t>(nd->speed.count());
+ WBUFW(buf, 20) = nd->npc_class;
+ WBUFPOS(buf, 36, nd->bl.x, nd->bl.y);
- clif_send (buf, packet_len_table[0x7c], &nd->bl, AREA);
+ clif_send(buf, clif_parse_func_table[0x7c].len, &nd->bl, SendWho::AREA);
- len = clif_npc0078 (nd, buf);
- clif_send (buf, len, &nd->bl, AREA);
+ len = clif_npc0078(nd, buf);
+ clif_send(buf, len, &nd->bl, SendWho::AREA);
return 0;
}
-int
-clif_spawn_fake_npc_for_player (struct map_session_data *sd, int fake_npc_id)
+int clif_spawn_fake_npc_for_player(struct map_session_data *sd, int fake_npc_id)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
if (!fd)
return 0;
- WFIFOW (fd, 0) = 0x7c;
- WFIFOL (fd, 2) = fake_npc_id;
- WFIFOW (fd, 6) = 0;
- WFIFOW (fd, 8) = 0;
- WFIFOW (fd, 10) = 0;
- WFIFOW (fd, 12) = 0;
- WFIFOW (fd, 20) = 127;
- WFIFOPOS (fd, 36, sd->bl.x, sd->bl.y);
- WFIFOSET (fd, packet_len_table[0x7c]);
-
- WFIFOW (fd, 0) = 0x78;
- WFIFOL (fd, 2) = fake_npc_id;
- WFIFOW (fd, 6) = 0;
- WFIFOW (fd, 8) = 0;
- WFIFOW (fd, 10) = 0;
- WFIFOW (fd, 12) = 0;
- WFIFOW (fd, 14) = 127; // identifies as NPC
- WFIFOW (fd, 20) = 127;
- WFIFOPOS (fd, 46, sd->bl.x, sd->bl.y);
- WFIFOPOS (fd, 36, sd->bl.x, sd->bl.y);
- WFIFOB (fd, 49) = 5;
- WFIFOB (fd, 50) = 5;
- WFIFOSET (fd, packet_len_table[0x78]);
+ WFIFOW(fd, 0) = 0x7c;
+ WFIFOL(fd, 2) = fake_npc_id;
+ WFIFOW(fd, 6) = 0;
+ WFIFOW(fd, 8) = 0;
+ WFIFOW(fd, 10) = 0;
+ WFIFOW(fd, 12) = 0;
+ WFIFOW(fd, 20) = 127;
+ WFIFOPOS(fd, 36, sd->bl.x, sd->bl.y);
+ WFIFOSET(fd, clif_parse_func_table[0x7c].len);
+
+ WFIFOW(fd, 0) = 0x78;
+ WFIFOL(fd, 2) = fake_npc_id;
+ WFIFOW(fd, 6) = 0;
+ WFIFOW(fd, 8) = 0;
+ WFIFOW(fd, 10) = 0;
+ WFIFOW(fd, 12) = 0;
+ WFIFOW(fd, 14) = 127; // identifies as NPC
+ WFIFOW(fd, 20) = 127;
+ WFIFOPOS(fd, 46, sd->bl.x, sd->bl.y);
+ WFIFOPOS(fd, 36, sd->bl.x, sd->bl.y);
+ WFIFOB(fd, 49) = 5;
+ WFIFOB(fd, 50) = 5;
+ WFIFOSET(fd, clif_parse_func_table[0x78].len);
return 0;
}
@@ -1397,33 +1021,29 @@ clif_spawn_fake_npc_for_player (struct map_session_data *sd, int fake_npc_id)
*
*------------------------------------------
*/
-int clif_spawnmob (struct mob_data *md)
+int clif_spawnmob(struct mob_data *md)
{
unsigned char buf[64];
- int len;
+ int len;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if (mob_get_viewclass (md->mob_class) > 23)
{
- memset (buf, 0, packet_len_table[0x7c]);
-
- WBUFW (buf, 0) = 0x7c;
- WBUFL (buf, 2) = md->bl.id;
- WBUFW (buf, 6) = md->stats[MOB_SPEED];
- WBUFW (buf, 8) = md->opt1;
- WBUFW (buf, 10) = md->opt2;
- WBUFW (buf, 12) = md->option;
- WBUFW (buf, 20) = mob_get_viewclass (md->mob_class);
- WBUFPOS (buf, 36, md->bl.x, md->bl.y);
- clif_send (buf, packet_len_table[0x7c], &md->bl, AREA);
- }
+ memset(buf, 0, clif_parse_func_table[0x7c].len);
- len = clif_mob0078 (md, buf);
- clif_send (buf, len, &md->bl, AREA);
+ WBUFW(buf, 0) = 0x7c;
+ WBUFL(buf, 2) = md->bl.id;
+ WBUFW(buf, 6) = md->stats[mob_stat::SPEED];
+ WBUFW(buf, 8) = uint16_t(md->opt1);
+ WBUFW(buf, 10) = uint16_t(md->opt2);
+ WBUFW(buf, 12) = uint16_t(md->option);
+ WBUFW(buf, 20) = md->mob_class;
+ WBUFPOS(buf, 36, md->bl.x, md->bl.y);
+ clif_send(buf, clif_parse_func_table[0x7c].len, &md->bl, SendWho::AREA);
+ }
- if (mob_get_equip (md->mob_class) > 0) // mob equipment [Valaris]
- clif_mob_equip (md, mob_get_equip (md->mob_class));
+ len = clif_mob0078(md, buf);
+ clif_send(buf, len, &md->bl, SendWho::AREA);
return 0;
}
@@ -1433,16 +1053,16 @@ int clif_spawnmob (struct mob_data *md)
*------------------------------------------
*/
static
-int clif_servertick (struct map_session_data *sd)
+int clif_servertick(struct map_session_data *sd)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x7f;
- WFIFOL (fd, 2) = sd->server_tick;
- WFIFOSET (fd, packet_len_table[0x7f]);
+ WFIFOW(fd, 0) = 0x7f;
+ WFIFOL(fd, 2) = sd->server_tick.time_since_epoch().count();
+ WFIFOSET(fd, clif_parse_func_table[0x7f].len);
return 0;
}
@@ -1451,18 +1071,18 @@ int clif_servertick (struct map_session_data *sd)
*
*------------------------------------------
*/
-int clif_walkok (struct map_session_data *sd)
+int clif_walkok(struct map_session_data *sd)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x87;
- WFIFOL (fd, 2) = gettick ();;
- WFIFOPOS2 (fd, 6, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y);
- WFIFOB (fd, 11) = 0;
- WFIFOSET (fd, packet_len_table[0x87]);
+ WFIFOW(fd, 0) = 0x87;
+ WFIFOL(fd, 2) = gettick().time_since_epoch().count();
+ WFIFOPOS2(fd, 6, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y);
+ WFIFOB(fd, 11) = 0;
+ WFIFOSET(fd, clif_parse_func_table[0x87].len);
return 0;
}
@@ -1471,28 +1091,19 @@ int clif_walkok (struct map_session_data *sd)
*
*------------------------------------------
*/
-int clif_movechar (struct map_session_data *sd)
+int clif_movechar(struct map_session_data *sd)
{
- int fd;
- int len;
+ int len;
unsigned char buf[256];
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- fd = sd->fd;
+ len = clif_set007b(sd, buf);
- len = clif_set007b (sd, buf);
-
- if (sd->disguise > 23 && sd->disguise < 4001)
- {
- clif_send (buf, len, &sd->bl, AREA);
- return 0;
- }
- else
- clif_send (buf, len, &sd->bl, AREA_WOS);
+ clif_send(buf, len, &sd->bl, SendWho::AREA_WOS);
if (battle_config.save_clothcolor == 1 && sd->status.clothes_color > 0)
- clif_changelook (&sd->bl, LOOK_CLOTHES_COLOR,
+ clif_changelook(&sd->bl, LOOK::CLOTHES_COLOR,
sd->status.clothes_color);
return 0;
@@ -1503,17 +1114,20 @@ int clif_movechar (struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_quitsave (int fd, struct map_session_data *sd)
+void clif_quitsave(int, struct map_session_data *sd)
{
- map_quit (sd);
+ map_quit(sd);
}
/*==========================================
*
*------------------------------------------
*/
-static void clif_waitclose (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+static
+void clif_waitclose(TimerData *, tick_t, int id)
{
+ // TODO: what happens if the player disconnects
+ // and someone else connects?
if (session[id])
session[id]->eof = 1;
}
@@ -1522,31 +1136,31 @@ static void clif_waitclose (timer_id tid, tick_t tick, custom_id_t id, custom_da
*
*------------------------------------------
*/
-void clif_setwaitclose (int fd)
+void clif_setwaitclose(int fd)
{
- add_timer (gettick () + 5000, clif_waitclose, fd, 0);
+ Timer(gettick() + std::chrono::seconds(5),
+ std::bind(clif_waitclose, ph::_1, ph::_2,
+ fd)
+ ).detach();
}
/*==========================================
*
*------------------------------------------
*/
-int clif_changemap (struct map_session_data *sd, const char *mapname, int x, int y)
+int clif_changemap(struct map_session_data *sd, const char *mapname, int x, int y)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x91;
- memcpy (WFIFOP (fd, 2), mapname, 16);
- WFIFOW (fd, 18) = x;
- WFIFOW (fd, 20) = y;
- WFIFOSET (fd, packet_len_table[0x91]);
-
- if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
- clif_spawnpc (sd);
+ WFIFOW(fd, 0) = 0x91;
+ memcpy(WFIFOP(fd, 2), mapname, 16);
+ WFIFOW(fd, 18) = x;
+ WFIFOW(fd, 20) = y;
+ WFIFOSET(fd, clif_parse_func_table[0x91].len);
return 0;
}
@@ -1555,21 +1169,21 @@ int clif_changemap (struct map_session_data *sd, const char *mapname, int x, int
*
*------------------------------------------
*/
-int clif_changemapserver (struct map_session_data *sd, const char *mapname, int x,
+int clif_changemapserver(struct map_session_data *sd, const char *mapname, int x,
int y, struct in_addr ip, int port)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x92;
- memcpy (WFIFOP (fd, 2), mapname, 16);
- WFIFOW (fd, 18) = x;
- WFIFOW (fd, 20) = y;
- WFIFOL (fd, 22) = ip.s_addr;
- WFIFOW (fd, 26) = port;
- WFIFOSET (fd, packet_len_table[0x92]);
+ WFIFOW(fd, 0) = 0x92;
+ memcpy(WFIFOP(fd, 2), mapname, 16);
+ WFIFOW(fd, 18) = x;
+ WFIFOW(fd, 20) = y;
+ WFIFOL(fd, 22) = ip.s_addr;
+ WFIFOW(fd, 26) = port;
+ WFIFOSET(fd, clif_parse_func_table[0x92].len);
return 0;
}
@@ -1578,18 +1192,18 @@ int clif_changemapserver (struct map_session_data *sd, const char *mapname, int
*
*------------------------------------------
*/
-int clif_fixpos (struct block_list *bl)
+int clif_fixpos(struct block_list *bl)
{
uint8_t buf[16];
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- WBUFW (buf, 0) = 0x88;
- WBUFL (buf, 2) = bl->id;
- WBUFW (buf, 6) = bl->x;
- WBUFW (buf, 8) = bl->y;
+ WBUFW(buf, 0) = 0x88;
+ WBUFL(buf, 2) = bl->id;
+ WBUFW(buf, 6) = bl->x;
+ WBUFW(buf, 8) = bl->y;
- clif_send (buf, packet_len_table[0x88], bl, AREA);
+ clif_send(buf, clif_parse_func_table[0x88].len, bl, SendWho::AREA);
return 0;
}
@@ -1598,16 +1212,16 @@ int clif_fixpos (struct block_list *bl)
*
*------------------------------------------
*/
-int clif_npcbuysell (struct map_session_data *sd, int id)
+int clif_npcbuysell(struct map_session_data *sd, int id)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xc4;
- WFIFOL (fd, 2) = id;
- WFIFOSET (fd, packet_len_table[0xc4]);
+ WFIFOW(fd, 0) = 0xc4;
+ WFIFOL(fd, 2) = id;
+ WFIFOSET(fd, clif_parse_func_table[0xc4].len);
return 0;
}
@@ -1616,32 +1230,30 @@ int clif_npcbuysell (struct map_session_data *sd, int id)
*
*------------------------------------------
*/
-int clif_buylist (struct map_session_data *sd, struct npc_data *nd)
+int clif_buylist(struct map_session_data *sd, struct npc_data *nd)
{
struct item_data *id;
- int fd, i, val;
+ int fd, i, val;
- nullpo_retr (0, sd);
- nullpo_retr (0, nd);
+ nullpo_ret(sd);
+ nullpo_ret(nd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xc6;
+ WFIFOW(fd, 0) = 0xc6;
for (i = 0; nd->u.shop_item[i].nameid > 0; i++)
{
- id = itemdb_search (nd->u.shop_item[i].nameid);
+ 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;
- WFIFOB (fd, 12 + i * 11) = id->type;
+ 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;
+ WFIFOW(fd, 13 + i * 11) = id->view_id;
else
- WFIFOW (fd, 13 + i * 11) = nd->u.shop_item[i].nameid;
+ WFIFOW(fd, 13 + i * 11) = nd->u.shop_item[i].nameid;
}
- WFIFOW (fd, 2) = i * 11 + 4;
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOW(fd, 2) = i * 11 + 4;
+ WFIFOSET(fd, WFIFOW(fd, 2));
return 0;
}
@@ -1650,14 +1262,14 @@ int clif_buylist (struct map_session_data *sd, struct npc_data *nd)
*
*------------------------------------------
*/
-int clif_selllist (struct map_session_data *sd)
+int clif_selllist(struct map_session_data *sd)
{
- int fd, i, c = 0, val;
+ int fd, i, c = 0, val;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xc7;
+ WFIFOW(fd, 0) = 0xc7;
for (i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].nameid > 0 && sd->inventory_data[i])
@@ -1665,16 +1277,14 @@ int clif_selllist (struct map_session_data *sd)
val = sd->inventory_data[i]->value_sell;
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;
+ WFIFOW(fd, 4 + c * 10) = i + 2;
+ WFIFOL(fd, 6 + c * 10) = val; // base price
+ WFIFOL(fd, 10 + c * 10) = val; // actual price
c++;
}
}
- WFIFOW (fd, 2) = c * 10 + 4;
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOW(fd, 2) = c * 10 + 4;
+ WFIFOSET(fd, WFIFOW(fd, 2));
return 0;
}
@@ -1683,18 +1293,18 @@ int clif_selllist (struct map_session_data *sd)
*
*------------------------------------------
*/
-int clif_scriptmes (struct map_session_data *sd, int npcid, const char *mes)
+int clif_scriptmes(struct map_session_data *sd, int npcid, const char *mes)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xb4;
- WFIFOW (fd, 2) = strlen (mes) + 9;
- WFIFOL (fd, 4) = npcid;
- strcpy ((char *)WFIFOP (fd, 8), mes);
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOW(fd, 0) = 0xb4;
+ WFIFOW(fd, 2) = strlen(mes) + 9;
+ WFIFOL(fd, 4) = npcid;
+ strcpy((char *)WFIFOP(fd, 8), mes);
+ WFIFOSET(fd, WFIFOW(fd, 2));
return 0;
}
@@ -1703,16 +1313,16 @@ int clif_scriptmes (struct map_session_data *sd, int npcid, const char *mes)
*
*------------------------------------------
*/
-int clif_scriptnext (struct map_session_data *sd, int npcid)
+int clif_scriptnext(struct map_session_data *sd, int npcid)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xb5;
- WFIFOL (fd, 2) = npcid;
- WFIFOSET (fd, packet_len_table[0xb5]);
+ WFIFOW(fd, 0) = 0xb5;
+ WFIFOL(fd, 2) = npcid;
+ WFIFOSET(fd, clif_parse_func_table[0xb5].len);
return 0;
}
@@ -1721,16 +1331,16 @@ int clif_scriptnext (struct map_session_data *sd, int npcid)
*
*------------------------------------------
*/
-int clif_scriptclose (struct map_session_data *sd, int npcid)
+int clif_scriptclose(struct map_session_data *sd, int npcid)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xb6;
- WFIFOL (fd, 2) = npcid;
- WFIFOSET (fd, packet_len_table[0xb6]);
+ WFIFOW(fd, 0) = 0xb6;
+ WFIFOL(fd, 2) = npcid;
+ WFIFOSET(fd, clif_parse_func_table[0xb6].len);
return 0;
}
@@ -1739,18 +1349,18 @@ int clif_scriptclose (struct map_session_data *sd, int npcid)
*
*------------------------------------------
*/
-int clif_scriptmenu (struct map_session_data *sd, int npcid, const char *mes)
+int clif_scriptmenu(struct map_session_data *sd, int npcid, const char *mes)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xb7;
- WFIFOW (fd, 2) = strlen (mes) + 8;
- WFIFOL (fd, 4) = npcid;
- strcpy ((char *)WFIFOP (fd, 8), mes);
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOW(fd, 0) = 0xb7;
+ WFIFOW(fd, 2) = strlen(mes) + 8;
+ WFIFOL(fd, 4) = npcid;
+ strcpy((char *)WFIFOP(fd, 8), mes);
+ WFIFOSET(fd, WFIFOW(fd, 2));
return 0;
}
@@ -1759,16 +1369,16 @@ int clif_scriptmenu (struct map_session_data *sd, int npcid, const char *mes)
*
*------------------------------------------
*/
-int clif_scriptinput (struct map_session_data *sd, int npcid)
+int clif_scriptinput(struct map_session_data *sd, int npcid)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x142;
- WFIFOL (fd, 2) = npcid;
- WFIFOSET (fd, packet_len_table[0x142]);
+ WFIFOW(fd, 0) = 0x142;
+ WFIFOL(fd, 2) = npcid;
+ WFIFOSET(fd, clif_parse_func_table[0x142].len);
return 0;
}
@@ -1777,16 +1387,16 @@ int clif_scriptinput (struct map_session_data *sd, int npcid)
*
*------------------------------------------
*/
-int clif_scriptinputstr (struct map_session_data *sd, int npcid)
+int clif_scriptinputstr(struct map_session_data *sd, int npcid)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x1d4;
- WFIFOL (fd, 2) = npcid;
- WFIFOSET (fd, packet_len_table[0x1d4]);
+ WFIFOW(fd, 0) = 0x1d4;
+ WFIFOL(fd, 2) = npcid;
+ WFIFOSET(fd, clif_parse_func_table[0x1d4].len);
return 0;
}
@@ -1795,22 +1405,22 @@ int clif_scriptinputstr (struct map_session_data *sd, int npcid)
*
*------------------------------------------
*/
-int clif_viewpoint (struct map_session_data *sd, int npc_id, int type, int x,
+int clif_viewpoint(struct map_session_data *sd, int npc_id, int type, int x,
int y, int id, int color)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x144;
- WFIFOL (fd, 2) = npc_id;
- WFIFOL (fd, 6) = type;
- WFIFOL (fd, 10) = x;
- WFIFOL (fd, 14) = y;
- WFIFOB (fd, 18) = id;
- WFIFOL (fd, 19) = color;
- WFIFOSET (fd, packet_len_table[0x144]);
+ WFIFOW(fd, 0) = 0x144;
+ WFIFOL(fd, 2) = npc_id;
+ WFIFOL(fd, 6) = type;
+ WFIFOL(fd, 10) = x;
+ WFIFOL(fd, 14) = y;
+ WFIFOB(fd, 18) = id;
+ WFIFOL(fd, 19) = color;
+ WFIFOSET(fd, clif_parse_func_table[0x144].len);
return 0;
}
@@ -1819,17 +1429,17 @@ int clif_viewpoint (struct map_session_data *sd, int npc_id, int type, int x,
*
*------------------------------------------
*/
-int clif_cutin (struct map_session_data *sd, const char *image, int type)
+int clif_cutin(struct map_session_data *sd, const char *image, int type)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x1b3;
- memcpy (WFIFOP (fd, 2), image, 64);
- WFIFOB (fd, 66) = type;
- WFIFOSET (fd, packet_len_table[0x1b3]);
+ WFIFOW(fd, 0) = 0x1b3;
+ memcpy(WFIFOP(fd, 2), image, 64);
+ WFIFOB(fd, 66) = type;
+ WFIFOSET(fd, clif_parse_func_table[0x1b3].len);
return 0;
}
@@ -1838,31 +1448,27 @@ int clif_cutin (struct map_session_data *sd, const char *image, int type)
*
*------------------------------------------
*/
-int clif_additem (struct map_session_data *sd, int n, int amount, int fail)
+int clif_additem(struct map_session_data *sd, int n, int amount, PickupFail fail)
{
- int fd, j;
- unsigned char *buf;
+ nullpo_ret(sd);
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
- if (fail)
+ int fd = sd->fd;
+ if (fail != PickupFail::OKAY)
{
- WBUFW (buf, 0) = 0xa0;
- WBUFW (buf, 2) = n + 2;
- WBUFW (buf, 4) = amount;
- WBUFW (buf, 6) = 0;
- WBUFB (buf, 8) = 0;
- WBUFB (buf, 9) = 0;
- WBUFB (buf, 10) = 0;
- WBUFW (buf, 11) = 0;
- WBUFW (buf, 13) = 0;
- WBUFW (buf, 15) = 0;
- WBUFW (buf, 17) = 0;
- WBUFW (buf, 19) = 0;
- WBUFB (buf, 21) = 0;
- WBUFB (buf, 22) = fail;
+ WFIFOW(fd, 0) = 0xa0;
+ WFIFOW(fd, 2) = n + 2;
+ WFIFOW(fd, 4) = amount;
+ WFIFOW(fd, 6) = 0;
+ WFIFOB(fd, 8) = 0;
+ WFIFOB(fd, 9) = 0;
+ WFIFOB(fd, 10) = 0;
+ WFIFOW(fd, 11) = 0;
+ WFIFOW(fd, 13) = 0;
+ WFIFOW(fd, 15) = 0;
+ WFIFOW(fd, 17) = 0;
+ WFIFOW(fd, 19) = 0;
+ WFIFOB(fd, 21) = 0;
+ WFIFOB(fd, 22) = uint8_t(fail);
}
else
{
@@ -1870,59 +1476,60 @@ int clif_additem (struct map_session_data *sd, int n, int amount, int fail)
|| sd->inventory_data[n] == NULL)
return 1;
- WBUFW (buf, 0) = 0xa0;
- WBUFW (buf, 2) = n + 2;
- WBUFW (buf, 4) = amount;
+ WFIFOW(fd, 0) = 0xa0;
+ WFIFOW(fd, 2) = n + 2;
+ WFIFOW(fd, 4) = amount;
if (sd->inventory_data[n]->view_id > 0)
- WBUFW (buf, 6) = sd->inventory_data[n]->view_id;
+ WFIFOW(fd, 6) = sd->inventory_data[n]->view_id;
else
- WBUFW (buf, 6) = sd->status.inventory[n].nameid;
- WBUFB (buf, 8) = sd->status.inventory[n].identify;
+ WFIFOW(fd, 6) = sd->status.inventory[n].nameid;
+ WFIFOB(fd, 8) = sd->status.inventory[n].identify;
if (sd->status.inventory[n].broken == 1)
- WBUFB (buf, 9) = 1; // is weapon broken [Valaris]
+ WFIFOB(fd, 9) = 1; // is weapon broken [Valaris]
else
- WBUFB (buf, 9) = sd->status.inventory[n].attribute;
- WBUFB (buf, 10) = sd->status.inventory[n].refine;
+ WFIFOB(fd, 9) = sd->status.inventory[n].attribute;
+ WFIFOB(fd, 10) = sd->status.inventory[n].refine;
if (sd->status.inventory[n].card[0] == 0x00ff
|| sd->status.inventory[n].card[0] == 0x00fe
|| sd->status.inventory[n].card[0] == (short) 0xff00)
{
- WBUFW (buf, 11) = sd->status.inventory[n].card[0];
- WBUFW (buf, 13) = sd->status.inventory[n].card[1];
- WBUFW (buf, 15) = sd->status.inventory[n].card[2];
- WBUFW (buf, 17) = sd->status.inventory[n].card[3];
+ WFIFOW(fd, 11) = sd->status.inventory[n].card[0];
+ WFIFOW(fd, 13) = sd->status.inventory[n].card[1];
+ WFIFOW(fd, 15) = sd->status.inventory[n].card[2];
+ WFIFOW(fd, 17) = sd->status.inventory[n].card[3];
}
else
{
+ int j;
if (sd->status.inventory[n].card[0] > 0
- && (j = itemdb_viewid (sd->status.inventory[n].card[0])) > 0)
- WBUFW (buf, 11) = j;
+ && (j = itemdb_viewid(sd->status.inventory[n].card[0])) > 0)
+ WFIFOW(fd, 11) = j;
else
- WBUFW (buf, 11) = sd->status.inventory[n].card[0];
+ WFIFOW(fd, 11) = sd->status.inventory[n].card[0];
if (sd->status.inventory[n].card[1] > 0
- && (j = itemdb_viewid (sd->status.inventory[n].card[1])) > 0)
- WBUFW (buf, 13) = j;
+ && (j = itemdb_viewid(sd->status.inventory[n].card[1])) > 0)
+ WFIFOW(fd, 13) = j;
else
- WBUFW (buf, 13) = sd->status.inventory[n].card[1];
+ WFIFOW(fd, 13) = sd->status.inventory[n].card[1];
if (sd->status.inventory[n].card[2] > 0
- && (j = itemdb_viewid (sd->status.inventory[n].card[2])) > 0)
- WBUFW (buf, 15) = j;
+ && (j = itemdb_viewid(sd->status.inventory[n].card[2])) > 0)
+ WFIFOW(fd, 15) = j;
else
- WBUFW (buf, 15) = sd->status.inventory[n].card[2];
+ WFIFOW(fd, 15) = sd->status.inventory[n].card[2];
if (sd->status.inventory[n].card[3] > 0
- && (j = itemdb_viewid (sd->status.inventory[n].card[3])) > 0)
- WBUFW (buf, 17) = j;
+ && (j = itemdb_viewid(sd->status.inventory[n].card[3])) > 0)
+ WFIFOW(fd, 17) = j;
else
- WBUFW (buf, 17) = sd->status.inventory[n].card[3];
+ WFIFOW(fd, 17) = sd->status.inventory[n].card[3];
}
- WBUFW (buf, 19) = pc_equippoint (sd, n);
- WBUFB (buf, 21) =
- (sd->inventory_data[n]->type ==
- 7) ? 4 : sd->inventory_data[n]->type;
- WBUFB (buf, 22) = fail;
+ WFIFOW(fd, 19) = uint16_t(pc_equippoint(sd, n));
+ WFIFOB(fd, 21) = uint8_t(sd->inventory_data[n]->type == ItemType::_7
+ ? ItemType::WEAPON
+ : sd->inventory_data[n]->type);
+ WFIFOB(fd, 22) = uint8_t(fail);
}
- WFIFOSET (fd, packet_len_table[0xa0]);
+ WFIFOSET(fd, clif_parse_func_table[0xa0].len);
return 0;
}
@@ -1930,18 +1537,18 @@ int clif_additem (struct map_session_data *sd, int n, int amount, int fail)
*
*------------------------------------------
*/
-int clif_delitem (struct map_session_data *sd, int n, int amount)
+int clif_delitem(struct map_session_data *sd, int n, int amount)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xaf;
- WFIFOW (fd, 2) = n + 2;
- WFIFOW (fd, 4) = amount;
+ WFIFOW(fd, 0) = 0xaf;
+ WFIFOW(fd, 2) = n + 2;
+ WFIFOW(fd, 4) = amount;
- WFIFOSET (fd, packet_len_table[0xaf]);
+ WFIFOSET(fd, clif_parse_func_table[0xaf].len);
return 0;
}
@@ -1950,51 +1557,49 @@ int clif_delitem (struct map_session_data *sd, int n, int amount)
*
*------------------------------------------
*/
-int clif_itemlist (struct map_session_data *sd)
+int clif_itemlist(struct map_session_data *sd)
{
- int i, n, fd, arrow = -1;
- unsigned char *buf;
-
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
- WBUFW (buf, 0) = 0x1ee;
- for (i = 0, n = 0; i < MAX_INVENTORY; i++)
+ int n = 0;
+ int arrow = -1;
+ int fd = sd->fd;
+ WFIFOW(fd, 0) = 0x1ee;
+ for (int i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].nameid <= 0
|| sd->inventory_data[i] == NULL
- || itemdb_isequip2 (sd->inventory_data[i]))
+ || itemdb_isequip2(sd->inventory_data[i]))
continue;
- WBUFW (buf, n * 18 + 4) = i + 2;
+ WFIFOW(fd, n * 18 + 4) = i + 2;
if (sd->inventory_data[i]->view_id > 0)
- WBUFW (buf, n * 18 + 6) = sd->inventory_data[i]->view_id;
+ WFIFOW(fd, n * 18 + 6) = sd->inventory_data[i]->view_id;
else
- WBUFW (buf, n * 18 + 6) = sd->status.inventory[i].nameid;
- WBUFB (buf, n * 18 + 8) = sd->inventory_data[i]->type;
- WBUFB (buf, n * 18 + 9) = sd->status.inventory[i].identify;
- WBUFW (buf, n * 18 + 10) = sd->status.inventory[i].amount;
- if (sd->inventory_data[i]->equip == 0x8000)
+ WFIFOW(fd, n * 18 + 6) = sd->status.inventory[i].nameid;
+ WFIFOB(fd, n * 18 + 8) = uint8_t(sd->inventory_data[i]->type);
+ WFIFOB(fd, n * 18 + 9) = sd->status.inventory[i].identify;
+ WFIFOW(fd, n * 18 + 10) = sd->status.inventory[i].amount;
+ if (sd->inventory_data[i]->equip == EPOS::ARROW)
{
- WBUFW (buf, n * 18 + 12) = 0x8000;
- if (sd->status.inventory[i].equip)
+ WFIFOW(fd, n * 18 + 12) = uint16_t(EPOS::ARROW);
+ if (bool(sd->status.inventory[i].equip))
arrow = i; // ついでに矢装備チェック
}
else
- WBUFW (buf, n * 18 + 12) = 0;
- WBUFW (buf, n * 18 + 14) = sd->status.inventory[i].card[0];
- WBUFW (buf, n * 18 + 16) = sd->status.inventory[i].card[1];
- WBUFW (buf, n * 18 + 18) = sd->status.inventory[i].card[2];
- WBUFW (buf, n * 18 + 20) = sd->status.inventory[i].card[3];
+ WFIFOW(fd, n * 18 + 12) = uint16_t(EPOS::ZERO);
+ WFIFOW(fd, n * 18 + 14) = sd->status.inventory[i].card[0];
+ WFIFOW(fd, n * 18 + 16) = sd->status.inventory[i].card[1];
+ WFIFOW(fd, n * 18 + 18) = sd->status.inventory[i].card[2];
+ WFIFOW(fd, n * 18 + 20) = sd->status.inventory[i].card[3];
n++;
}
if (n)
{
- WBUFW (buf, 2) = 4 + n * 18;
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOW(fd, 2) = 4 + n * 18;
+ WFIFOSET(fd, WFIFOW(fd, 2));
}
if (arrow >= 0)
- clif_arrowequip (sd, arrow);
+ clif_arrowequip(sd, arrow);
return 0;
}
@@ -2002,76 +1607,75 @@ int clif_itemlist (struct map_session_data *sd)
*
*------------------------------------------
*/
-int clif_equiplist (struct map_session_data *sd)
+int clif_equiplist(struct map_session_data *sd)
{
- int i, j, n, fd;
- unsigned char *buf;
-
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
- WBUFW (buf, 0) = 0xa4;
- for (i = 0, n = 0; i < MAX_INVENTORY; i++)
+ int fd = sd->fd;
+ WFIFOW(fd, 0) = 0xa4;
+ int n = 0;
+ for (int i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].nameid <= 0
|| sd->inventory_data[i] == NULL
- || !itemdb_isequip2 (sd->inventory_data[i]))
+ || !itemdb_isequip2(sd->inventory_data[i]))
continue;
- WBUFW (buf, n * 20 + 4) = i + 2;
+ WFIFOW(fd, n * 20 + 4) = i + 2;
if (sd->inventory_data[i]->view_id > 0)
- WBUFW (buf, n * 20 + 6) = sd->inventory_data[i]->view_id;
+ WFIFOW(fd, n * 20 + 6) = sd->inventory_data[i]->view_id;
else
- WBUFW (buf, n * 20 + 6) = sd->status.inventory[i].nameid;
- WBUFB (buf, n * 20 + 8) =
- (sd->inventory_data[i]->type ==
- 7) ? 4 : sd->inventory_data[i]->type;
- WBUFB (buf, n * 20 + 9) = sd->status.inventory[i].identify;
- WBUFW (buf, n * 20 + 10) = pc_equippoint (sd, i);
- WBUFW (buf, n * 20 + 12) = sd->status.inventory[i].equip;
+ WFIFOW(fd, n * 20 + 6) = sd->status.inventory[i].nameid;
+ WFIFOB(fd, n * 20 + 8) = uint8_t(
+ sd->inventory_data[i]->type == ItemType::_7
+ ? ItemType::WEAPON
+ : sd->inventory_data[i]->type);
+ WFIFOB(fd, n * 20 + 9) = sd->status.inventory[i].identify;
+ WFIFOW(fd, n * 20 + 10) = uint16_t(pc_equippoint(sd, i));
+ WFIFOW(fd, n * 20 + 12) = uint16_t(sd->status.inventory[i].equip);
if (sd->status.inventory[i].broken == 1)
- WBUFB (buf, n * 20 + 14) = 1; // is weapon broken [Valaris]
+ WFIFOB(fd, n * 20 + 14) = 1; // is weapon broken [Valaris]
else
- WBUFB (buf, n * 20 + 14) = sd->status.inventory[i].attribute;
- WBUFB (buf, n * 20 + 15) = sd->status.inventory[i].refine;
+ WFIFOB(fd, n * 20 + 14) = sd->status.inventory[i].attribute;
+ WFIFOB(fd, n * 20 + 15) = sd->status.inventory[i].refine;
if (sd->status.inventory[i].card[0] == 0x00ff
|| sd->status.inventory[i].card[0] == 0x00fe
|| sd->status.inventory[i].card[0] == (short) 0xff00)
{
- WBUFW (buf, n * 20 + 16) = sd->status.inventory[i].card[0];
- WBUFW (buf, n * 20 + 18) = sd->status.inventory[i].card[1];
- WBUFW (buf, n * 20 + 20) = sd->status.inventory[i].card[2];
- WBUFW (buf, n * 20 + 22) = sd->status.inventory[i].card[3];
+ WFIFOW(fd, n * 20 + 16) = sd->status.inventory[i].card[0];
+ WFIFOW(fd, n * 20 + 18) = sd->status.inventory[i].card[1];
+ WFIFOW(fd, n * 20 + 20) = sd->status.inventory[i].card[2];
+ WFIFOW(fd, n * 20 + 22) = sd->status.inventory[i].card[3];
}
else
{
+ int j;
if (sd->status.inventory[i].card[0] > 0
- && (j = itemdb_viewid (sd->status.inventory[i].card[0])) > 0)
- WBUFW (buf, n * 20 + 16) = j;
+ && (j = itemdb_viewid(sd->status.inventory[i].card[0])) > 0)
+ WFIFOW(fd, n * 20 + 16) = j;
else
- WBUFW (buf, n * 20 + 16) = sd->status.inventory[i].card[0];
+ WFIFOW(fd, n * 20 + 16) = sd->status.inventory[i].card[0];
if (sd->status.inventory[i].card[1] > 0
- && (j = itemdb_viewid (sd->status.inventory[i].card[1])) > 0)
- WBUFW (buf, n * 20 + 18) = j;
+ && (j = itemdb_viewid(sd->status.inventory[i].card[1])) > 0)
+ WFIFOW(fd, n * 20 + 18) = j;
else
- WBUFW (buf, n * 20 + 18) = sd->status.inventory[i].card[1];
+ WFIFOW(fd, n * 20 + 18) = sd->status.inventory[i].card[1];
if (sd->status.inventory[i].card[2] > 0
- && (j = itemdb_viewid (sd->status.inventory[i].card[2])) > 0)
- WBUFW (buf, n * 20 + 20) = j;
+ && (j = itemdb_viewid(sd->status.inventory[i].card[2])) > 0)
+ WFIFOW(fd, n * 20 + 20) = j;
else
- WBUFW (buf, n * 20 + 20) = sd->status.inventory[i].card[2];
+ WFIFOW(fd, n * 20 + 20) = sd->status.inventory[i].card[2];
if (sd->status.inventory[i].card[3] > 0
- && (j = itemdb_viewid (sd->status.inventory[i].card[3])) > 0)
- WBUFW (buf, n * 20 + 22) = j;
+ && (j = itemdb_viewid(sd->status.inventory[i].card[3])) > 0)
+ WFIFOW(fd, n * 20 + 22) = j;
else
- WBUFW (buf, n * 20 + 22) = sd->status.inventory[i].card[3];
+ WFIFOW(fd, n * 20 + 22) = sd->status.inventory[i].card[3];
}
n++;
}
if (n)
{
- WBUFW (buf, 2) = 4 + n * 20;
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOW(fd, 2) = 4 + n * 20;
+ WFIFOSET(fd, WFIFOW(fd, 2));
}
return 0;
}
@@ -2080,45 +1684,44 @@ int clif_equiplist (struct map_session_data *sd)
* カプラさんに預けてある消耗品&収集品リスト
*------------------------------------------
*/
-int clif_storageitemlist (struct map_session_data *sd, struct storage *stor)
+int clif_storageitemlist(struct map_session_data *sd, struct storage *stor)
{
- struct item_data *id;
- int i, n, fd;
- unsigned char *buf;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor);
+ nullpo_ret(sd);
+ nullpo_ret(stor);
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
- WBUFW (buf, 0) = 0x1f0;
- for (i = 0, n = 0; i < MAX_STORAGE; i++)
+ int fd = sd->fd;
+ WFIFOW(fd, 0) = 0x1f0;
+ int n = 0;
+ for (int i = 0; i < MAX_STORAGE; i++)
{
if (stor->storage_[i].nameid <= 0)
continue;
- nullpo_retr (0, id = itemdb_search (stor->storage_[i].nameid));
- if (itemdb_isequip2 (id))
+
+ struct item_data *id;
+ id = itemdb_search(stor->storage_[i].nameid);
+ nullpo_ret(id);
+ if (itemdb_isequip2(id))
continue;
- WBUFW (buf, n * 18 + 4) = i + 1;
+ WFIFOW(fd, n * 18 + 4) = i + 1;
if (id->view_id > 0)
- WBUFW (buf, n * 18 + 6) = id->view_id;
+ WFIFOW(fd, n * 18 + 6) = id->view_id;
else
- WBUFW (buf, n * 18 + 6) = stor->storage_[i].nameid;
- WBUFB (buf, n * 18 + 8) = id->type;;
- WBUFB (buf, n * 18 + 9) = stor->storage_[i].identify;
- WBUFW (buf, n * 18 + 10) = stor->storage_[i].amount;
- WBUFW (buf, n * 18 + 12) = 0;
- WBUFW (buf, n * 18 + 14) = stor->storage_[i].card[0];
- WBUFW (buf, n * 18 + 16) = stor->storage_[i].card[1];
- WBUFW (buf, n * 18 + 18) = stor->storage_[i].card[2];
- WBUFW (buf, n * 18 + 20) = stor->storage_[i].card[3];
+ WFIFOW(fd, n * 18 + 6) = stor->storage_[i].nameid;
+ WFIFOB(fd, n * 18 + 8) = uint8_t(id->type);
+ WFIFOB(fd, n * 18 + 9) = stor->storage_[i].identify;
+ WFIFOW(fd, n * 18 + 10) = stor->storage_[i].amount;
+ WFIFOW(fd, n * 18 + 12) = 0;
+ WFIFOW(fd, n * 18 + 14) = stor->storage_[i].card[0];
+ WFIFOW(fd, n * 18 + 16) = stor->storage_[i].card[1];
+ WFIFOW(fd, n * 18 + 18) = stor->storage_[i].card[2];
+ WFIFOW(fd, n * 18 + 20) = stor->storage_[i].card[3];
n++;
}
if (n)
{
- WBUFW (buf, 2) = 4 + n * 18;
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOW(fd, 2) = 4 + n * 18;
+ WFIFOSET(fd, WFIFOW(fd, 2));
}
return 0;
}
@@ -2127,206 +1730,77 @@ int clif_storageitemlist (struct map_session_data *sd, struct storage *stor)
* カプラさんに預けてある装備リスト
*------------------------------------------
*/
-int clif_storageequiplist (struct map_session_data *sd, struct storage *stor)
+int clif_storageequiplist(struct map_session_data *sd, struct storage *stor)
{
- struct item_data *id;
- int i, j, n, fd;
- unsigned char *buf;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor);
+ nullpo_ret(sd);
+ nullpo_ret(stor);
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
- WBUFW (buf, 0) = 0xa6;
- for (i = 0, n = 0; i < MAX_STORAGE; i++)
+ int fd = sd->fd;
+ WFIFOW(fd, 0) = 0xa6;
+ int n = 0;
+ for (int i = 0; i < MAX_STORAGE; i++)
{
if (stor->storage_[i].nameid <= 0)
continue;
- nullpo_retr (0, id = itemdb_search (stor->storage_[i].nameid));
- if (!itemdb_isequip2 (id))
- continue;
- WBUFW (buf, n * 20 + 4) = i + 1;
- if (id->view_id > 0)
- WBUFW (buf, n * 20 + 6) = id->view_id;
- else
- WBUFW (buf, n * 20 + 6) = stor->storage_[i].nameid;
- WBUFB (buf, n * 20 + 8) = id->type;
- WBUFB (buf, n * 20 + 9) = stor->storage_[i].identify;
- WBUFW (buf, n * 20 + 10) = id->equip;
- WBUFW (buf, n * 20 + 12) = stor->storage_[i].equip;
- if (stor->storage_[i].broken == 1)
- WBUFB (buf, n * 20 + 14) = 1; //is weapon broken [Valaris]
- else
- WBUFB (buf, n * 20 + 14) = stor->storage_[i].attribute;
- WBUFB (buf, n * 20 + 15) = stor->storage_[i].refine;
- if (stor->storage_[i].card[0] == 0x00ff
- || stor->storage_[i].card[0] == 0x00fe
- || stor->storage_[i].card[0] == (short) 0xff00)
- {
- WBUFW (buf, n * 20 + 16) = stor->storage_[i].card[0];
- WBUFW (buf, n * 20 + 18) = stor->storage_[i].card[1];
- WBUFW (buf, n * 20 + 20) = stor->storage_[i].card[2];
- WBUFW (buf, n * 20 + 22) = stor->storage_[i].card[3];
- }
- else
- {
- if (stor->storage_[i].card[0] > 0
- && (j = itemdb_viewid (stor->storage_[i].card[0])) > 0)
- WBUFW (buf, n * 20 + 16) = j;
- else
- WBUFW (buf, n * 20 + 16) = stor->storage_[i].card[0];
- if (stor->storage_[i].card[1] > 0
- && (j = itemdb_viewid (stor->storage_[i].card[1])) > 0)
- WBUFW (buf, n * 20 + 18) = j;
- else
- WBUFW (buf, n * 20 + 18) = stor->storage_[i].card[1];
- if (stor->storage_[i].card[2] > 0
- && (j = itemdb_viewid (stor->storage_[i].card[2])) > 0)
- WBUFW (buf, n * 20 + 20) = j;
- else
- WBUFW (buf, n * 20 + 20) = stor->storage_[i].card[2];
- if (stor->storage_[i].card[3] > 0
- && (j = itemdb_viewid (stor->storage_[i].card[3])) > 0)
- WBUFW (buf, n * 20 + 22) = j;
- else
- WBUFW (buf, n * 20 + 22) = stor->storage_[i].card[3];
- }
- n++;
- }
- if (n)
- {
- WBUFW (buf, 2) = 4 + n * 20;
- WFIFOSET (fd, WFIFOW (fd, 2));
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_guildstorageitemlist (struct map_session_data *sd,
- struct guild_storage *stor)
-{
- struct item_data *id;
- int i, n, fd;
- unsigned char *buf;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor);
-
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
-
- WBUFW (buf, 0) = 0x1f0;
- for (i = 0, n = 0; i < MAX_GUILD_STORAGE; i++)
- {
- if (stor->storage_[i].nameid <= 0)
- continue;
- nullpo_retr (0, id = itemdb_search (stor->storage_[i].nameid));
- if (itemdb_isequip2 (id))
- continue;
-
- WBUFW (buf, n * 18 + 4) = i + 1;
- if (id->view_id > 0)
- WBUFW (buf, n * 18 + 6) = id->view_id;
- else
- WBUFW (buf, n * 18 + 6) = stor->storage_[i].nameid;
- WBUFB (buf, n * 18 + 8) = id->type;;
- WBUFB (buf, n * 18 + 9) = stor->storage_[i].identify;
- WBUFW (buf, n * 18 + 10) = stor->storage_[i].amount;
- WBUFW (buf, n * 18 + 12) = 0;
- WBUFW (buf, n * 18 + 14) = stor->storage_[i].card[0];
- WBUFW (buf, n * 18 + 16) = stor->storage_[i].card[1];
- WBUFW (buf, n * 18 + 18) = stor->storage_[i].card[2];
- WBUFW (buf, n * 18 + 20) = stor->storage_[i].card[3];
- n++;
- }
- if (n)
- {
- WBUFW (buf, 2) = 4 + n * 18;
- WFIFOSET (fd, WFIFOW (fd, 2));
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_guildstorageequiplist (struct map_session_data *sd,
- struct guild_storage *stor)
-{
- struct item_data *id;
- int i, j, n, fd;
- unsigned char *buf;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
- WBUFW (buf, 0) = 0xa6;
- for (i = 0, n = 0; i < MAX_GUILD_STORAGE; i++)
- {
- if (stor->storage_[i].nameid <= 0)
+ struct item_data *id;
+ id = itemdb_search(stor->storage_[i].nameid);
+ nullpo_ret(id);
+ if (!itemdb_isequip2(id))
continue;
- nullpo_retr (0, id = itemdb_search (stor->storage_[i].nameid));
- if (!itemdb_isequip2 (id))
- continue;
- WBUFW (buf, n * 20 + 4) = i + 1;
+ WFIFOW(fd, n * 20 + 4) = i + 1;
if (id->view_id > 0)
- WBUFW (buf, n * 20 + 6) = id->view_id;
+ WFIFOW(fd, n * 20 + 6) = id->view_id;
else
- WBUFW (buf, n * 20 + 6) = stor->storage_[i].nameid;
- WBUFB (buf, n * 20 + 8) = id->type;
- WBUFB (buf, n * 20 + 9) = stor->storage_[i].identify;
- WBUFW (buf, n * 20 + 10) = id->equip;
- WBUFW (buf, n * 20 + 12) = stor->storage_[i].equip;
+ WFIFOW(fd, n * 20 + 6) = stor->storage_[i].nameid;
+ WFIFOB(fd, n * 20 + 8) = uint8_t(id->type);
+ WFIFOB(fd, n * 20 + 9) = stor->storage_[i].identify;
+ WFIFOW(fd, n * 20 + 10) = uint16_t(id->equip);
+ WFIFOW(fd, n * 20 + 12) = uint16_t(stor->storage_[i].equip);
if (stor->storage_[i].broken == 1)
- WBUFB (buf, n * 20 + 14) = 1; // is weapon broken [Valaris]
+ WFIFOB(fd, n * 20 + 14) = 1; //is weapon broken [Valaris]
else
- WBUFB (buf, n * 20 + 14) = stor->storage_[i].attribute;
- WBUFB (buf, n * 20 + 15) = stor->storage_[i].refine;
+ WFIFOB(fd, n * 20 + 14) = stor->storage_[i].attribute;
+ WFIFOB(fd, n * 20 + 15) = stor->storage_[i].refine;
if (stor->storage_[i].card[0] == 0x00ff
|| stor->storage_[i].card[0] == 0x00fe
|| stor->storage_[i].card[0] == (short) 0xff00)
{
- WBUFW (buf, n * 20 + 16) = stor->storage_[i].card[0];
- WBUFW (buf, n * 20 + 18) = stor->storage_[i].card[1];
- WBUFW (buf, n * 20 + 20) = stor->storage_[i].card[2];
- WBUFW (buf, n * 20 + 22) = stor->storage_[i].card[3];
+ WFIFOW(fd, n * 20 + 16) = stor->storage_[i].card[0];
+ WFIFOW(fd, n * 20 + 18) = stor->storage_[i].card[1];
+ WFIFOW(fd, n * 20 + 20) = stor->storage_[i].card[2];
+ WFIFOW(fd, n * 20 + 22) = stor->storage_[i].card[3];
}
else
{
+ int j;
if (stor->storage_[i].card[0] > 0
- && (j = itemdb_viewid (stor->storage_[i].card[0])) > 0)
- WBUFW (buf, n * 20 + 16) = j;
+ && (j = itemdb_viewid(stor->storage_[i].card[0])) > 0)
+ WFIFOW(fd, n * 20 + 16) = j;
else
- WBUFW (buf, n * 20 + 16) = stor->storage_[i].card[0];
+ WFIFOW(fd, n * 20 + 16) = stor->storage_[i].card[0];
if (stor->storage_[i].card[1] > 0
- && (j = itemdb_viewid (stor->storage_[i].card[1])) > 0)
- WBUFW (buf, n * 20 + 18) = j;
+ && (j = itemdb_viewid(stor->storage_[i].card[1])) > 0)
+ WFIFOW(fd, n * 20 + 18) = j;
else
- WBUFW (buf, n * 20 + 18) = stor->storage_[i].card[1];
+ WFIFOW(fd, n * 20 + 18) = stor->storage_[i].card[1];
if (stor->storage_[i].card[2] > 0
- && (j = itemdb_viewid (stor->storage_[i].card[2])) > 0)
- WBUFW (buf, n * 20 + 20) = j;
+ && (j = itemdb_viewid(stor->storage_[i].card[2])) > 0)
+ WFIFOW(fd, n * 20 + 20) = j;
else
- WBUFW (buf, n * 20 + 20) = stor->storage_[i].card[2];
+ WFIFOW(fd, n * 20 + 20) = stor->storage_[i].card[2];
if (stor->storage_[i].card[3] > 0
- && (j = itemdb_viewid (stor->storage_[i].card[3])) > 0)
- WBUFW (buf, n * 20 + 22) = j;
+ && (j = itemdb_viewid(stor->storage_[i].card[3])) > 0)
+ WFIFOW(fd, n * 20 + 22) = j;
else
- WBUFW (buf, n * 20 + 22) = stor->storage_[i].card[3];
+ WFIFOW(fd, n * 20 + 22) = stor->storage_[i].card[3];
}
n++;
}
if (n)
{
- WBUFW (buf, 2) = 4 + n * 20;
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOW(fd, 2) = 4 + n * 20;
+ WFIFOSET(fd, WFIFOW(fd, 2));
}
return 0;
}
@@ -2336,239 +1810,170 @@ int clif_guildstorageequiplist (struct map_session_data *sd,
* 表示専用数字はこの中で計算して送る
*------------------------------------------
*/
-int clif_updatestatus (struct map_session_data *sd, int type)
+int clif_updatestatus(struct map_session_data *sd, SP type)
{
- int fd, len = 8;
+ int fd, len = 8;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xb0;
- WFIFOW (fd, 2) = type;
+ WFIFOW(fd, 0) = 0xb0;
+ WFIFOW(fd, 2) = static_cast<uint16_t>(type);
switch (type)
{
// 00b0
- case SP_WEIGHT:
- pc_checkweighticon (sd);
- WFIFOW (fd, 0) = 0xb0;
- WFIFOW (fd, 2) = type;
- WFIFOL (fd, 4) = sd->weight;
- break;
- case SP_MAXWEIGHT:
- WFIFOL (fd, 4) = sd->max_weight;
+ case SP::WEIGHT:
+ pc_checkweighticon(sd);
+ // is this because pc_checkweighticon can send other packets?
+ WFIFOW(fd, 0) = 0xb0;
+ WFIFOW(fd, 2) = static_cast<uint16_t>(type);
+ WFIFOL(fd, 4) = sd->weight;
break;
- case SP_SPEED:
- WFIFOL (fd, 4) = sd->speed;
+ case SP::MAXWEIGHT:
+ WFIFOL(fd, 4) = sd->max_weight;
break;
- case SP_BASELEVEL:
- WFIFOL (fd, 4) = sd->status.base_level;
+ case SP::SPEED:
+ // ...
+ WFIFOL(fd, 4) = static_cast<uint16_t>(sd->speed.count());
break;
- case SP_JOBLEVEL:
- WFIFOL (fd, 4) = 0;
+ case SP::BASELEVEL:
+ WFIFOL(fd, 4) = sd->status.base_level;
break;
- case SP_MANNER:
- WFIFOL (fd, 4) = sd->status.manner;
- clif_changestatus (&sd->bl, SP_MANNER, sd->status.manner);
+ case SP::JOBLEVEL:
+ WFIFOL(fd, 4) = 0;
break;
- case SP_STATUSPOINT:
- WFIFOL (fd, 4) = sd->status.status_point;
+ case SP::STATUSPOINT:
+ WFIFOL(fd, 4) = sd->status.status_point;
break;
- case SP_SKILLPOINT:
- WFIFOL (fd, 4) = sd->status.skill_point;
+ case SP::SKILLPOINT:
+ WFIFOL(fd, 4) = sd->status.skill_point;
break;
- case SP_HIT:
- WFIFOL (fd, 4) = sd->hit;
+ case SP::HIT:
+ WFIFOL(fd, 4) = sd->hit;
break;
- case SP_FLEE1:
- WFIFOL (fd, 4) = sd->flee;
+ case SP::FLEE1:
+ WFIFOL(fd, 4) = sd->flee;
break;
- case SP_FLEE2:
- WFIFOL (fd, 4) = sd->flee2 / 10;
+ case SP::FLEE2:
+ WFIFOL(fd, 4) = sd->flee2 / 10;
break;
- case SP_MAXHP:
- WFIFOL (fd, 4) = sd->status.max_hp;
+ case SP::MAXHP:
+ WFIFOL(fd, 4) = sd->status.max_hp;
break;
- case SP_MAXSP:
- WFIFOL (fd, 4) = sd->status.max_sp;
+ case SP::MAXSP:
+ WFIFOL(fd, 4) = sd->status.max_sp;
break;
- case SP_HP:
- WFIFOL (fd, 4) = sd->status.hp;
+ case SP::HP:
+ WFIFOL(fd, 4) = sd->status.hp;
break;
- case SP_SP:
- WFIFOL (fd, 4) = sd->status.sp;
+ case SP::SP:
+ WFIFOL(fd, 4) = sd->status.sp;
break;
- case SP_ASPD:
- WFIFOL (fd, 4) = sd->aspd;
+ case SP::ASPD:
+ WFIFOL(fd, 4) = static_cast<uint16_t>(sd->aspd.count());
break;
- case SP_ATK1:
- WFIFOL (fd, 4) = sd->base_atk + sd->watk;
+ case SP::ATK1:
+ WFIFOL(fd, 4) = sd->base_atk + sd->watk;
break;
- case SP_DEF1:
- WFIFOL (fd, 4) = sd->def;
+ case SP::DEF1:
+ WFIFOL(fd, 4) = sd->def;
break;
- case SP_MDEF1:
- WFIFOL (fd, 4) = sd->mdef;
+ case SP::MDEF1:
+ WFIFOL(fd, 4) = sd->mdef;
break;
- case SP_ATK2:
- WFIFOL (fd, 4) = sd->watk2;
+ case SP::ATK2:
+ WFIFOL(fd, 4) = sd->watk2;
break;
- case SP_DEF2:
- WFIFOL (fd, 4) = sd->def2;
+ case SP::DEF2:
+ WFIFOL(fd, 4) = sd->def2;
break;
- case SP_MDEF2:
- WFIFOL (fd, 4) = sd->mdef2;
+ case SP::MDEF2:
+ WFIFOL(fd, 4) = sd->mdef2;
break;
- case SP_CRITICAL:
- WFIFOL (fd, 4) = sd->critical / 10;
+ case SP::CRITICAL:
+ WFIFOL(fd, 4) = sd->critical / 10;
break;
- case SP_MATK1:
- WFIFOL (fd, 4) = sd->matk1;
+ case SP::MATK1:
+ WFIFOL(fd, 4) = sd->matk1;
break;
- case SP_MATK2:
- WFIFOL (fd, 4) = sd->matk2;
+ case SP::MATK2:
+ WFIFOL(fd, 4) = sd->matk2;
break;
- case SP_ZENY:
- trade_verifyzeny (sd);
- WFIFOW (fd, 0) = 0xb1;
+ case SP::ZENY:
+ trade_verifyzeny(sd);
+ WFIFOW(fd, 0) = 0xb1;
if (sd->status.zeny < 0)
sd->status.zeny = 0;
- WFIFOL (fd, 4) = sd->status.zeny;
+ WFIFOL(fd, 4) = sd->status.zeny;
break;
- case SP_BASEEXP:
- WFIFOW (fd, 0) = 0xb1;
- WFIFOL (fd, 4) = sd->status.base_exp;
+ case SP::BASEEXP:
+ WFIFOW(fd, 0) = 0xb1;
+ WFIFOL(fd, 4) = sd->status.base_exp;
break;
- case SP_JOBEXP:
- WFIFOW (fd, 0) = 0xb1;
- WFIFOL (fd, 4) = sd->status.job_exp;
+ case SP::JOBEXP:
+ WFIFOW(fd, 0) = 0xb1;
+ WFIFOL(fd, 4) = sd->status.job_exp;
break;
- case SP_NEXTBASEEXP:
- WFIFOW (fd, 0) = 0xb1;
- WFIFOL (fd, 4) = pc_nextbaseexp (sd);
+ case SP::NEXTBASEEXP:
+ WFIFOW(fd, 0) = 0xb1;
+ WFIFOL(fd, 4) = pc_nextbaseexp(sd);
break;
- case SP_NEXTJOBEXP:
- WFIFOW (fd, 0) = 0xb1;
- WFIFOL (fd, 4) = pc_nextjobexp (sd);
+ case SP::NEXTJOBEXP:
+ WFIFOW(fd, 0) = 0xb1;
+ WFIFOL(fd, 4) = pc_nextjobexp(sd);
break;
// 00be 終了
- case SP_USTR:
- case SP_UAGI:
- case SP_UVIT:
- case SP_UINT:
- case SP_UDEX:
- case SP_ULUK:
- WFIFOW (fd, 0) = 0xbe;
- WFIFOB (fd, 4) =
- pc_need_status_point (sd, type - SP_USTR + SP_STR);
+ case SP::USTR:
+ case SP::UAGI:
+ case SP::UVIT:
+ case SP::UINT:
+ case SP::UDEX:
+ case SP::ULUK:
+ WFIFOW(fd, 0) = 0xbe;
+ WFIFOB(fd, 4) = pc_need_status_point(sd, usp_to_sp(type));
len = 5;
break;
// 013a 終了
- case SP_ATTACKRANGE:
- WFIFOW (fd, 0) = 0x13a;
- WFIFOW (fd, 2) = (sd->attack_spell_override)
+ case SP::ATTACKRANGE:
+ WFIFOW(fd, 0) = 0x13a;
+ WFIFOW(fd, 2) = (sd->attack_spell_override)
? sd->attack_spell_range : sd->attackrange;
len = 4;
break;
// 0141 終了
- case SP_STR:
- WFIFOW (fd, 0) = 0x141;
- WFIFOL (fd, 2) = type;
- WFIFOL (fd, 6) = sd->status.str;
- WFIFOL (fd, 10) = sd->paramb[0] + sd->parame[0];
- len = 14;
- break;
- case SP_AGI:
- WFIFOW (fd, 0) = 0x141;
- WFIFOL (fd, 2) = type;
- WFIFOL (fd, 6) = sd->status.agi;
- WFIFOL (fd, 10) = sd->paramb[1] + sd->parame[1];
- len = 14;
- break;
- case SP_VIT:
- WFIFOW (fd, 0) = 0x141;
- WFIFOL (fd, 2) = type;
- WFIFOL (fd, 6) = sd->status.vit;
- WFIFOL (fd, 10) = sd->paramb[2] + sd->parame[2];
- len = 14;
- break;
- case SP_INT:
- WFIFOW (fd, 0) = 0x141;
- WFIFOL (fd, 2) = type;
- WFIFOL (fd, 6) = sd->status.int_;
- WFIFOL (fd, 10) = sd->paramb[3] + sd->parame[3];
- len = 14;
- break;
- case SP_DEX:
- WFIFOW (fd, 0) = 0x141;
- WFIFOL (fd, 2) = type;
- WFIFOL (fd, 6) = sd->status.dex;
- WFIFOL (fd, 10) = sd->paramb[4] + sd->parame[4];
- len = 14;
- break;
- case SP_LUK:
- WFIFOW (fd, 0) = 0x141;
- WFIFOL (fd, 2) = type;
- WFIFOL (fd, 6) = sd->status.luk;
- WFIFOL (fd, 10) = sd->paramb[5] + sd->parame[5];
- len = 14;
- break;
-
- case SP_CARTINFO:
- WFIFOW (fd, 0) = 0x121;
- WFIFOW (fd, 2) = sd->cart_num;
- WFIFOW (fd, 4) = sd->cart_max_num;
- WFIFOL (fd, 6) = sd->cart_weight;
- WFIFOL (fd, 10) = sd->cart_max_weight;
+ case SP::STR:
+ case SP::AGI:
+ case SP::VIT:
+ case SP::INT:
+ case SP::DEX:
+ case SP::LUK:
+ {
+ ATTR attr = sp_to_attr(type);
+ WFIFOW(fd, 0) = 0x141;
+ WFIFOL(fd, 2) = uint16_t(type);
+ WFIFOL(fd, 6) = sd->status.attrs[attr];
+ WFIFOL(fd, 10) = sd->paramb[attr] + sd->parame[attr];
len = 14;
+ }
break;
- case SP_GM:
- WFIFOL (fd, 4) = pc_isGM (sd);
+ case SP::GM:
+ WFIFOL(fd, 4) = pc_isGM(sd);
break;
default:
if (battle_config.error_log)
- printf ("clif_updatestatus : make %d routine\n", type);
+ PRINTF("clif_updatestatus : make %d routine\n",
+ type);
return 1;
}
- WFIFOSET (fd, len);
-
- return 0;
-}
-
-int clif_changestatus (struct block_list *bl, int type, int val)
-{
- unsigned char buf[12];
- struct map_session_data *sd = NULL;
-
- nullpo_retr (0, bl);
+ WFIFOSET(fd, len);
- if (bl->type == BL_PC)
- sd = (struct map_session_data *) bl;
-
-//printf("clif_changestatus id:%d type:%d val:%d\n",bl->id,type,val);
- if (sd)
- {
- WBUFW (buf, 0) = 0x1ab;
- WBUFL (buf, 2) = bl->id;
- WBUFW (buf, 6) = type;
- switch (type)
- {
- case SP_MANNER:
- WBUFL (buf, 8) = val;
- break;
- default:
- if (battle_config.error_log)
- printf ("clif_changestatus : make %d routine\n", type);
- return 1;
- }
- clif_send (buf, packet_len_table[0x1ab], bl, AREA_WOS);
- }
return 0;
}
@@ -2576,108 +1981,102 @@ int clif_changestatus (struct block_list *bl, int type, int val)
*
*------------------------------------------
*/
-int clif_changelook (struct block_list *bl, int type, int val)
+int clif_changelook(struct block_list *bl, LOOK type, int val)
{
- return clif_changelook_towards (bl, type, val, NULL);
+ return clif_changelook_towards(bl, type, val, NULL);
}
-int clif_changelook_towards (struct block_list *bl, int type, int val,
+int clif_changelook_towards(struct block_list *bl, LOOK type, int val,
struct map_session_data *dstsd)
{
- unsigned char rbuf[32];
- unsigned char *buf = dstsd ? WFIFOP (dstsd->fd, 0) : rbuf; // pick target buffer or general-purpose one
+ unsigned char buf[32];
struct map_session_data *sd = NULL;
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
sd = (struct map_session_data *) bl;
- if (sd && sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
- return 0;
-
- if (sd && sd->status.option & OPTION_INVISIBILITY)
+ if (sd && bool(sd->status.option & Option::INVISIBILITY))
return 0;
if (sd
- && (type == LOOK_WEAPON || type == LOOK_SHIELD || type >= LOOK_SHOES))
+ && (type == LOOK::WEAPON || type == LOOK::SHIELD || type >= LOOK::SHOES))
{
- WBUFW (buf, 0) = 0x1d7;
- WBUFL (buf, 2) = bl->id;
- if (type >= LOOK_SHOES)
+ WBUFW(buf, 0) = 0x1d7;
+ WBUFL(buf, 2) = bl->id;
+ if (type >= LOOK::SHOES)
{
- int equip_point = equip_points[type];
+ EQUIP equip_point = equip_points[type];
- WBUFB (buf, 6) = type;
+ WBUFB(buf, 6) = uint16_t(type);
if (sd->equip_index[equip_point] >= 0
&& sd->inventory_data[sd->equip_index[equip_point]])
{
if (sd->
inventory_data[sd->equip_index[equip_point]]->view_id > 0)
- WBUFW (buf, 7) =
+ WBUFW(buf, 7) =
sd->inventory_data[sd->
equip_index[equip_point]]->view_id;
else
- WBUFW (buf, 7) =
+ WBUFW(buf, 7) =
sd->status.inventory[sd->
equip_index[equip_point]].nameid;
}
else
- WBUFW (buf, 7) = 0;
- WBUFW (buf, 9) = 0;
+ WBUFW(buf, 7) = 0;
+ WBUFW(buf, 9) = 0;
}
else
{
- WBUFB (buf, 6) = 2;
+ WBUFB(buf, 6) = 2;
if (sd->attack_spell_override)
- WBUFW (buf, 7) = sd->attack_spell_look_override;
+ WBUFW(buf, 7) = sd->attack_spell_look_override;
else
{
- if (sd->equip_index[9] >= 0
- && sd->inventory_data[sd->equip_index[9]]
- && sd->view_class != 22)
+ if (sd->equip_index[EQUIP::WEAPON] >= 0
+ && sd->inventory_data[sd->equip_index[EQUIP::WEAPON]])
{
- if (sd->inventory_data[sd->equip_index[9]]->view_id > 0)
- WBUFW (buf, 7) =
- sd->inventory_data[sd->equip_index[9]]->view_id;
+ if (sd->inventory_data[sd->equip_index[EQUIP::WEAPON]]->view_id > 0)
+ WBUFW(buf, 7) =
+ sd->inventory_data[sd->equip_index[EQUIP::WEAPON]]->view_id;
else
- WBUFW (buf, 7) =
- sd->status.inventory[sd->equip_index[9]].nameid;
+ WBUFW(buf, 7) =
+ sd->status.inventory[sd->equip_index[EQUIP::WEAPON]].nameid;
}
else
- WBUFW (buf, 7) = 0;
+ WBUFW(buf, 7) = 0;
}
- if (sd->equip_index[8] >= 0
- && sd->equip_index[8] != sd->equip_index[9]
- && sd->inventory_data[sd->equip_index[8]]
- && sd->view_class != 22)
+ if (sd->equip_index[EQUIP::SHIELD] >= 0
+ && sd->equip_index[EQUIP::SHIELD] != sd->equip_index[EQUIP::WEAPON]
+ && sd->inventory_data[sd->equip_index[EQUIP::SHIELD]])
{
- if (sd->inventory_data[sd->equip_index[8]]->view_id > 0)
- WBUFW (buf, 9) =
- sd->inventory_data[sd->equip_index[8]]->view_id;
+ if (sd->inventory_data[sd->equip_index[EQUIP::SHIELD]]->view_id > 0)
+ WBUFW(buf, 9) =
+ sd->inventory_data[sd->equip_index[EQUIP::SHIELD]]->view_id;
else
- WBUFW (buf, 9) =
- sd->status.inventory[sd->equip_index[8]].nameid;
+ WBUFW(buf, 9) =
+ sd->status.inventory[sd->equip_index[EQUIP::SHIELD]].nameid;
}
else
- WBUFW (buf, 9) = 0;
+ WBUFW(buf, 9) = 0;
}
if (dstsd)
- WFIFOSET (dstsd->fd, packet_len_table[0x1d7]);
+ clif_send(buf, clif_parse_func_table[0x1d7].len, &dstsd->bl, SendWho::SELF);
else
- clif_send (buf, packet_len_table[0x1d7], bl, AREA);
+ clif_send(buf, clif_parse_func_table[0x1d7].len, bl, SendWho::AREA);
}
else
{
- WBUFW (buf, 0) = 0x1d7;
- WBUFL (buf, 2) = bl->id;
- WBUFB (buf, 6) = type;
- WBUFW (buf, 7) = val;
- WBUFW (buf, 9) = 0;
+ WBUFW(buf, 0) = 0x1d7;
+ WBUFL(buf, 2) = bl->id;
+ WBUFB(buf, 6) = uint8_t(type);
+ WBUFW(buf, 7) = val;
+ WBUFW(buf, 9) = 0;
if (dstsd)
- WFIFOSET (dstsd->fd, packet_len_table[0x1d7]);
+ clif_send(buf, clif_parse_func_table[0x1d7].len, &dstsd->bl, SendWho::SELF);
else
- clif_send (buf, packet_len_table[0x1d7], bl, AREA);
+ clif_send(buf, clif_parse_func_table[0x1d7].len, bl, SendWho::AREA);
}
return 0;
}
@@ -2687,57 +2086,54 @@ int clif_changelook_towards (struct block_list *bl, int type, int val,
*------------------------------------------
*/
static
-int clif_initialstatus (struct map_session_data *sd)
+int clif_initialstatus(struct map_session_data *sd)
{
- int fd;
- unsigned char *buf;
+ nullpo_ret(sd);
- nullpo_retr (0, sd);
+ int fd = sd->fd;
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
-
- WBUFW (buf, 0) = 0xbd;
- WBUFW (buf, 2) = sd->status.status_point;
- WBUFB (buf, 4) = (sd->status.str > 255) ? 255 : sd->status.str;
- WBUFB (buf, 5) = pc_need_status_point (sd, SP_STR);
- WBUFB (buf, 6) = (sd->status.agi > 255) ? 255 : sd->status.agi;
- WBUFB (buf, 7) = pc_need_status_point (sd, SP_AGI);
- WBUFB (buf, 8) = (sd->status.vit > 255) ? 255 : sd->status.vit;
- WBUFB (buf, 9) = pc_need_status_point (sd, SP_VIT);
- WBUFB (buf, 10) = (sd->status.int_ > 255) ? 255 : sd->status.int_;
- WBUFB (buf, 11) = pc_need_status_point (sd, SP_INT);
- WBUFB (buf, 12) = (sd->status.dex > 255) ? 255 : sd->status.dex;
- WBUFB (buf, 13) = pc_need_status_point (sd, SP_DEX);
- WBUFB (buf, 14) = (sd->status.luk > 255) ? 255 : sd->status.luk;
- WBUFB (buf, 15) = pc_need_status_point (sd, SP_LUK);
-
- WBUFW (buf, 16) = sd->base_atk + sd->watk;
- WBUFW (buf, 18) = sd->watk2; //atk bonus
- WBUFW (buf, 20) = sd->matk1;
- WBUFW (buf, 22) = sd->matk2;
- WBUFW (buf, 24) = sd->def; // def
- WBUFW (buf, 26) = sd->def2;
- WBUFW (buf, 28) = sd->mdef; // mdef
- WBUFW (buf, 30) = sd->mdef2;
- WBUFW (buf, 32) = sd->hit;
- WBUFW (buf, 34) = sd->flee;
- WBUFW (buf, 36) = sd->flee2 / 10;
- WBUFW (buf, 38) = sd->critical / 10;
- WBUFW (buf, 40) = sd->status.karma;
- WBUFW (buf, 42) = sd->status.manner;
-
- WFIFOSET (fd, packet_len_table[0xbd]);
-
- clif_updatestatus (sd, SP_STR);
- clif_updatestatus (sd, SP_AGI);
- clif_updatestatus (sd, SP_VIT);
- clif_updatestatus (sd, SP_INT);
- clif_updatestatus (sd, SP_DEX);
- clif_updatestatus (sd, SP_LUK);
-
- clif_updatestatus (sd, SP_ATTACKRANGE);
- clif_updatestatus (sd, SP_ASPD);
+ WFIFOW(fd, 0) = 0xbd;
+ WFIFOW(fd, 2) = sd->status.status_point;
+
+ WFIFOB(fd, 4) = min(sd->status.attrs[ATTR::STR], 255);
+ WFIFOB(fd, 5) = pc_need_status_point(sd, SP::STR);
+ WFIFOB(fd, 6) = min(sd->status.attrs[ATTR::AGI], 255);
+ WFIFOB(fd, 7) = pc_need_status_point(sd, SP::AGI);
+ WFIFOB(fd, 8) = min(sd->status.attrs[ATTR::VIT], 255);
+ WFIFOB(fd, 9) = pc_need_status_point(sd, SP::VIT);
+ WFIFOB(fd, 10) = min(sd->status.attrs[ATTR::INT], 255);
+ WFIFOB(fd, 11) = pc_need_status_point(sd, SP::INT);
+ WFIFOB(fd, 12) = min(sd->status.attrs[ATTR::DEX], 255);
+ WFIFOB(fd, 13) = pc_need_status_point(sd, SP::DEX);
+ WFIFOB(fd, 14) = min(sd->status.attrs[ATTR::LUK], 255);
+ WFIFOB(fd, 15) = pc_need_status_point(sd, SP::LUK);
+
+ WFIFOW(fd, 16) = sd->base_atk + sd->watk;
+ WFIFOW(fd, 18) = sd->watk2; //atk bonus
+ WFIFOW(fd, 20) = sd->matk1;
+ WFIFOW(fd, 22) = sd->matk2;
+ WFIFOW(fd, 24) = sd->def; // def
+ WFIFOW(fd, 26) = sd->def2;
+ WFIFOW(fd, 28) = sd->mdef; // mdef
+ WFIFOW(fd, 30) = sd->mdef2;
+ WFIFOW(fd, 32) = sd->hit;
+ WFIFOW(fd, 34) = sd->flee;
+ WFIFOW(fd, 36) = sd->flee2 / 10;
+ WFIFOW(fd, 38) = sd->critical / 10;
+ WFIFOW(fd, 40) = sd->status.karma;
+ WFIFOW(fd, 42) = sd->status.manner;
+
+ WFIFOSET(fd, clif_parse_func_table[0xbd].len);
+
+ clif_updatestatus(sd, SP::STR);
+ clif_updatestatus(sd, SP::AGI);
+ clif_updatestatus(sd, SP::VIT);
+ clif_updatestatus(sd, SP::INT);
+ clif_updatestatus(sd, SP::DEX);
+ clif_updatestatus(sd, SP::LUK);
+
+ clif_updatestatus(sd, SP::ATTACKRANGE);
+ clif_updatestatus(sd, SP::ASPD);
return 0;
}
@@ -2746,20 +2142,20 @@ int clif_initialstatus (struct map_session_data *sd)
*矢装備
*------------------------------------------
*/
-int clif_arrowequip (struct map_session_data *sd, int val)
+int clif_arrowequip(struct map_session_data *sd, int val)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->attacktarget && sd->attacktarget > 0) // [Valaris]
sd->attacktarget = 0;
fd = sd->fd;
- WFIFOW (fd, 0) = 0x013c;
- WFIFOW (fd, 2) = val + 2; //矢のアイテムID
+ WFIFOW(fd, 0) = 0x013c;
+ WFIFOW(fd, 2) = val + 2; //矢のアイテムID
- WFIFOSET (fd, packet_len_table[0x013c]);
+ WFIFOSET(fd, clif_parse_func_table[0x013c].len);
return 0;
}
@@ -2768,17 +2164,17 @@ int clif_arrowequip (struct map_session_data *sd, int val)
*
*------------------------------------------
*/
-int clif_arrow_fail (struct map_session_data *sd, int type)
+int clif_arrow_fail(struct map_session_data *sd, int type)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x013b;
- WFIFOW (fd, 2) = type;
+ WFIFOW(fd, 0) = 0x013b;
+ WFIFOW(fd, 2) = type;
- WFIFOSET (fd, packet_len_table[0x013b]);
+ WFIFOSET(fd, clif_parse_func_table[0x013b].len);
return 0;
}
@@ -2787,18 +2183,18 @@ int clif_arrow_fail (struct map_session_data *sd, int type)
*
*------------------------------------------
*/
-int clif_statusupack (struct map_session_data *sd, int type, int ok, int val)
+int clif_statusupack(struct map_session_data *sd, SP type, int ok, int val)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xbc;
- WFIFOW (fd, 2) = type;
- WFIFOB (fd, 4) = ok;
- WFIFOB (fd, 5) = val;
- WFIFOSET (fd, packet_len_table[0xbc]);
+ WFIFOW(fd, 0) = 0xbc;
+ WFIFOW(fd, 2) = uint16_t(type);
+ WFIFOB(fd, 4) = ok;
+ WFIFOB(fd, 5) = val;
+ WFIFOSET(fd, clif_parse_func_table[0xbc].len);
return 0;
}
@@ -2807,18 +2203,18 @@ int clif_statusupack (struct map_session_data *sd, int type, int ok, int val)
*
*------------------------------------------
*/
-int clif_equipitemack (struct map_session_data *sd, int n, int pos, int ok)
+int clif_equipitemack(struct map_session_data *sd, int n, EPOS pos, int ok)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xaa;
- WFIFOW (fd, 2) = n + 2;
- WFIFOW (fd, 4) = pos;
- WFIFOB (fd, 6) = ok;
- WFIFOSET (fd, packet_len_table[0xaa]);
+ WFIFOW(fd, 0) = 0xaa;
+ WFIFOW(fd, 2) = n + 2;
+ WFIFOW(fd, 4) = uint16_t(pos);
+ WFIFOB(fd, 6) = ok;
+ WFIFOSET(fd, clif_parse_func_table[0xaa].len);
return 0;
}
@@ -2827,18 +2223,18 @@ int clif_equipitemack (struct map_session_data *sd, int n, int pos, int ok)
*
*------------------------------------------
*/
-int clif_unequipitemack (struct map_session_data *sd, int n, int pos, int ok)
+int clif_unequipitemack(struct map_session_data *sd, int n, EPOS pos, int ok)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xac;
- WFIFOW (fd, 2) = n + 2;
- WFIFOW (fd, 4) = pos;
- WFIFOB (fd, 6) = ok;
- WFIFOSET (fd, packet_len_table[0xac]);
+ WFIFOW(fd, 0) = 0xac;
+ WFIFOW(fd, 2) = n + 2;
+ WFIFOW(fd, 4) = uint16_t(pos);
+ WFIFOB(fd, 6) = ok;
+ WFIFOSET(fd, clif_parse_func_table[0xac].len);
return 0;
}
@@ -2847,17 +2243,17 @@ int clif_unequipitemack (struct map_session_data *sd, int n, int pos, int ok)
*
*------------------------------------------
*/
-int clif_misceffect (struct block_list *bl, int type)
+int clif_misceffect(struct block_list *bl, int type)
{
uint8_t buf[32];
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- WBUFW (buf, 0) = 0x19b;
- WBUFL (buf, 2) = bl->id;
- WBUFL (buf, 6) = type;
+ WBUFW(buf, 0) = 0x19b;
+ WBUFL(buf, 2) = bl->id;
+ WBUFL(buf, 6) = type;
- clif_send (buf, packet_len_table[0x19b], bl, AREA);
+ clif_send(buf, clif_parse_func_table[0x19b].len, bl, SendWho::AREA);
return 0;
}
@@ -2866,54 +2262,24 @@ int clif_misceffect (struct block_list *bl, int type)
* 表示オプション変更
*------------------------------------------
*/
-int clif_changeoption (struct block_list *bl)
+int clif_changeoption(struct block_list *bl)
{
uint8_t buf[32];
- short option;
- struct status_change *sc_data;
- static const int omask[] = { 0x10, 0x20 };
- static const int scnum[] = { SC_FALCON, SC_RIDING };
- int i;
-
- nullpo_retr (0, bl);
-
- option = *battle_get_option (bl);
- sc_data = battle_get_sc_data (bl);
-
- WBUFW (buf, 0) = 0x119;
- WBUFL (buf, 2) = bl->id;
- WBUFW (buf, 6) = *battle_get_opt1 (bl);
- WBUFW (buf, 8) = *battle_get_opt2 (bl);
- WBUFW (buf, 10) = option;
- WBUFB (buf, 12) = 0; // ??
-
- if (bl->type == BL_PC)
- { // disguises [Valaris]
- struct map_session_data *sd = ((struct map_session_data *) bl);
- if (sd && sd->disguise > 23 && sd->disguise < 4001)
- {
- clif_send (buf, packet_len_table[0x119], bl, AREA_WOS);
- clif_spawnpc (sd);
- }
- else
- clif_send (buf, packet_len_table[0x119], bl, AREA);
- }
- else
- clif_send (buf, packet_len_table[0x119], bl, AREA);
+ eptr<struct status_change, StatusChange> sc_data;
- // アイコンの表示
- for (i = 0; i < sizeof (omask) / sizeof (omask[0]); i++)
- {
- if (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);
- }
- }
+ nullpo_ret(bl);
+
+ Option option = *battle_get_option(bl);
+ sc_data = battle_get_sc_data(bl);
+
+ WBUFW(buf, 0) = 0x119;
+ WBUFL(buf, 2) = bl->id;
+ WBUFW(buf, 6) = uint16_t(*battle_get_opt1(bl));
+ WBUFW(buf, 8) = uint16_t(*battle_get_opt2(bl));
+ WBUFW(buf, 10) = uint16_t(option);
+ WBUFB(buf, 12) = 0; // ??
+
+ clif_send(buf, clif_parse_func_table[0x119].len, bl, SendWho::AREA);
return 0;
}
@@ -2922,244 +2288,36 @@ int clif_changeoption (struct block_list *bl)
*
*------------------------------------------
*/
-int clif_useitemack (struct map_session_data *sd, int index, int amount,
+int clif_useitemack(struct map_session_data *sd, int index, int amount,
int ok)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (!ok)
{
- int fd = sd->fd;
- WFIFOW (fd, 0) = 0xa8;
- WFIFOW (fd, 2) = index + 2;
- WFIFOW (fd, 4) = amount;
- WFIFOB (fd, 6) = ok;
- WFIFOSET (fd, packet_len_table[0xa8]);
+ int fd = sd->fd;
+ WFIFOW(fd, 0) = 0xa8;
+ WFIFOW(fd, 2) = index + 2;
+ WFIFOW(fd, 4) = amount;
+ WFIFOB(fd, 6) = ok;
+ WFIFOSET(fd, clif_parse_func_table[0xa8].len);
}
else
{
uint8_t buf[32];
- WBUFW (buf, 0) = 0x1c8;
- WBUFW (buf, 2) = index + 2;
+ WBUFW(buf, 0) = 0x1c8;
+ WBUFW(buf, 2) = index + 2;
if (sd->inventory_data[index]
&& sd->inventory_data[index]->view_id > 0)
- WBUFW (buf, 4) = sd->inventory_data[index]->view_id;
+ WBUFW(buf, 4) = sd->inventory_data[index]->view_id;
else
- WBUFW (buf, 4) = sd->status.inventory[index].nameid;
- WBUFL (buf, 6) = sd->bl.id;
- WBUFW (buf, 10) = amount;
- WBUFB (buf, 12) = ok;
- clif_send (buf, packet_len_table[0x1c8], &sd->bl, SELF);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_createchat (struct map_session_data *sd, int fail)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0xd6;
- WFIFOB (fd, 2) = fail;
- WFIFOSET (fd, packet_len_table[0xd6]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_dispchat (struct chat_data *cd, int fd)
-{
- uint8_t buf[128]; // 最大title(60バイト)+17
-
- if (cd == NULL || *cd->owner == NULL)
- return 1;
-
- WBUFW (buf, 0) = 0xd7;
- WBUFW (buf, 2) = strlen (cd->title) + 17;
- WBUFL (buf, 4) = (*cd->owner)->id;
- WBUFL (buf, 8) = cd->bl.id;
- WBUFW (buf, 12) = cd->limit;
- WBUFW (buf, 14) = cd->users;
- WBUFB (buf, 16) = cd->pub;
- strcpy ((char *)WBUFP (buf, 17), cd->title);
- if (fd)
- {
- memcpy (WFIFOP (fd, 0), buf, WBUFW (buf, 2));
- WFIFOSET (fd, WBUFW (buf, 2));
- }
- else
- {
- clif_send (buf, WBUFW (buf, 2), *cd->owner, AREA_WOSC);
- }
-
- return 0;
-}
-
-/*==========================================
- * chatの状態変更成功
- * 外部の人用と命令コード(d7->df)が違うだけ
- *------------------------------------------
- */
-int clif_changechatstatus (struct chat_data *cd)
-{
- uint8_t buf[128]; // 最大title(60バイト)+17
-
- if (cd == NULL || cd->usersd[0] == NULL)
- return 1;
-
- WBUFW (buf, 0) = 0xdf;
- WBUFW (buf, 2) = strlen (cd->title) + 17;
- WBUFL (buf, 4) = cd->usersd[0]->bl.id;
- WBUFL (buf, 8) = cd->bl.id;
- WBUFW (buf, 12) = cd->limit;
- WBUFW (buf, 14) = cd->users;
- WBUFB (buf, 16) = cd->pub;
- strcpy ((char *)WBUFP (buf, 17), cd->title);
- clif_send (buf, WBUFW (buf, 2), &cd->usersd[0]->bl, CHAT);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_clearchat (struct chat_data *cd, int fd)
-{
- uint8_t buf[32];
-
- nullpo_retr (0, cd);
-
- WBUFW (buf, 0) = 0xd8;
- WBUFL (buf, 2) = cd->bl.id;
- if (fd)
- {
- memcpy (WFIFOP (fd, 0), buf, packet_len_table[0xd8]);
- WFIFOSET (fd, packet_len_table[0xd8]);
- }
- else
- {
- clif_send (buf, packet_len_table[0xd8], *cd->owner, AREA_WOSC);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_joinchatfail (struct map_session_data *sd, int fail)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
-
- WFIFOW (fd, 0) = 0xda;
- WFIFOB (fd, 2) = fail;
- WFIFOSET (fd, packet_len_table[0xda]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_joinchatok (struct map_session_data *sd, struct chat_data *cd)
-{
- int fd;
- int i;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, cd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0xdb;
- WFIFOW (fd, 2) = 8 + (28 * cd->users);
- WFIFOL (fd, 4) = cd->bl.id;
- for (i = 0; i < cd->users; i++)
- {
- WFIFOL (fd, 8 + i * 28) = (i != 0) || ((*cd->owner)->type == BL_NPC);
- memcpy (WFIFOP (fd, 8 + i * 28 + 4), cd->usersd[i]->status.name, 24);
+ WBUFW(buf, 4) = sd->status.inventory[index].nameid;
+ WBUFL(buf, 6) = sd->bl.id;
+ WBUFW(buf, 10) = amount;
+ WBUFB(buf, 12) = ok;
+ clif_send(buf, clif_parse_func_table[0x1c8].len, &sd->bl, SendWho::SELF);
}
- WFIFOSET (fd, WFIFOW (fd, 2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_addchat (struct chat_data *cd, struct map_session_data *sd)
-{
- uint8_t buf[32];
-
- nullpo_retr (0, sd);
- nullpo_retr (0, cd);
-
- WBUFW (buf, 0) = 0x0dc;
- WBUFW (buf, 2) = cd->users;
- memcpy (WBUFP (buf, 4), sd->status.name, 24);
- clif_send (buf, packet_len_table[0xdc], &sd->bl, CHAT_WOS);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changechatowner (struct chat_data *cd, struct map_session_data *sd)
-{
- uint8_t buf[64];
-
- nullpo_retr (0, sd);
- nullpo_retr (0, cd);
-
- WBUFW (buf, 0) = 0xe1;
- WBUFL (buf, 2) = 1;
- memcpy (WBUFP (buf, 6), cd->usersd[0]->status.name, 24);
- WBUFW (buf, 30) = 0xe1;
- WBUFL (buf, 32) = 0;
- memcpy (WBUFP (buf, 36), sd->status.name, 24);
-
- clif_send (buf, packet_len_table[0xe1] * 2, &sd->bl, CHAT);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_leavechat (struct chat_data *cd, struct map_session_data *sd)
-{
- uint8_t buf[32];
-
- nullpo_retr (0, sd);
- nullpo_retr (0, cd);
-
- WBUFW (buf, 0) = 0xdd;
- WBUFW (buf, 2) = cd->users - 1;
- memcpy (WBUFP (buf, 4), sd->status.name, 24);
- WBUFB (buf, 28) = 0;
-
- clif_send (buf, packet_len_table[0xdd], &sd->bl, CHAT);
return 0;
}
@@ -3168,16 +2326,16 @@ int clif_leavechat (struct chat_data *cd, struct map_session_data *sd)
* 取り引き要請受け
*------------------------------------------
*/
-int clif_traderequest (struct map_session_data *sd, const char *name)
+int clif_traderequest(struct map_session_data *sd, const char *name)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xe5;
- strcpy ((char *)WFIFOP (fd, 2), name);
- WFIFOSET (fd, packet_len_table[0xe5]);
+ WFIFOW(fd, 0) = 0xe5;
+ strcpy((char *)WFIFOP(fd, 2), name);
+ WFIFOSET(fd, clif_parse_func_table[0xe5].len);
return 0;
}
@@ -3186,16 +2344,16 @@ int clif_traderequest (struct map_session_data *sd, const char *name)
* 取り引き要求応答
*------------------------------------------
*/
-int clif_tradestart (struct map_session_data *sd, int type)
+int clif_tradestart(struct map_session_data *sd, int type)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xe7;
- WFIFOB (fd, 2) = type;
- WFIFOSET (fd, packet_len_table[0xe7]);
+ WFIFOW(fd, 0) = 0xe7;
+ WFIFOB(fd, 2) = type;
+ WFIFOSET(fd, clif_parse_func_table[0xe7].len);
return 0;
}
@@ -3204,80 +2362,80 @@ int clif_tradestart (struct map_session_data *sd, int type)
* 相手方からのアイテム追加
*------------------------------------------
*/
-int clif_tradeadditem (struct map_session_data *sd,
+int clif_tradeadditem(struct map_session_data *sd,
struct map_session_data *tsd, int index, int amount)
{
- int fd, j;
+ int fd, j;
- nullpo_retr (0, sd);
- nullpo_retr (0, tsd);
+ nullpo_ret(sd);
+ nullpo_ret(tsd);
fd = tsd->fd;
- WFIFOW (fd, 0) = 0xe9;
- WFIFOL (fd, 2) = amount;
+ WFIFOW(fd, 0) = 0xe9;
+ WFIFOL(fd, 2) = amount;
if (index == 0)
{
- WFIFOW (fd, 6) = 0; // type id
- WFIFOB (fd, 8) = 0; //identify flag
- WFIFOB (fd, 9) = 0; // attribute
- WFIFOB (fd, 10) = 0; //refine
- WFIFOW (fd, 11) = 0; //card (4w)
- WFIFOW (fd, 13) = 0; //card (4w)
- WFIFOW (fd, 15) = 0; //card (4w)
- WFIFOW (fd, 17) = 0; //card (4w)
+ WFIFOW(fd, 6) = 0; // type id
+ WFIFOB(fd, 8) = 0; //identify flag
+ WFIFOB(fd, 9) = 0; // attribute
+ WFIFOB(fd, 10) = 0; //refine
+ WFIFOW(fd, 11) = 0; //card (4w)
+ WFIFOW(fd, 13) = 0; //card (4w)
+ WFIFOW(fd, 15) = 0; //card (4w)
+ WFIFOW(fd, 17) = 0; //card (4w)
}
else
{
index -= 2;
if (sd->inventory_data[index]
&& sd->inventory_data[index]->view_id > 0)
- WFIFOW (fd, 6) = sd->inventory_data[index]->view_id;
+ WFIFOW(fd, 6) = sd->inventory_data[index]->view_id;
else
- WFIFOW (fd, 6) = sd->status.inventory[index].nameid; // type id
- WFIFOB (fd, 8) = sd->status.inventory[index].identify; //identify flag
+ WFIFOW(fd, 6) = sd->status.inventory[index].nameid; // type id
+ WFIFOB(fd, 8) = sd->status.inventory[index].identify; //identify flag
if (sd->status.inventory[index].broken == 1)
- WFIFOB (fd, 9) = 1; // is broke weapon [Valaris]
+ WFIFOB(fd, 9) = 1; // is broke weapon [Valaris]
else
- WFIFOB (fd, 9) = sd->status.inventory[index].attribute; // attribute
- WFIFOB (fd, 10) = sd->status.inventory[index].refine; //refine
+ WFIFOB(fd, 9) = sd->status.inventory[index].attribute; // attribute
+ WFIFOB(fd, 10) = sd->status.inventory[index].refine; //refine
if (sd->status.inventory[index].card[0] == 0x00ff
|| sd->status.inventory[index].card[0] == 0x00fe
|| sd->status.inventory[index].card[0] == (short) 0xff00)
{
- WFIFOW (fd, 11) = sd->status.inventory[index].card[0]; //card (4w)
- WFIFOW (fd, 13) = sd->status.inventory[index].card[1]; //card (4w)
- WFIFOW (fd, 15) = sd->status.inventory[index].card[2]; //card (4w)
- WFIFOW (fd, 17) = sd->status.inventory[index].card[3]; //card (4w)
+ WFIFOW(fd, 11) = sd->status.inventory[index].card[0]; //card (4w)
+ WFIFOW(fd, 13) = sd->status.inventory[index].card[1]; //card (4w)
+ WFIFOW(fd, 15) = sd->status.inventory[index].card[2]; //card (4w)
+ WFIFOW(fd, 17) = sd->status.inventory[index].card[3]; //card (4w)
}
else
{
if (sd->status.inventory[index].card[0] > 0
&& (j =
- itemdb_viewid (sd->status.inventory[index].card[0])) > 0)
- WFIFOW (fd, 11) = j;
+ itemdb_viewid(sd->status.inventory[index].card[0])) > 0)
+ WFIFOW(fd, 11) = j;
else
- WFIFOW (fd, 11) = sd->status.inventory[index].card[0];
+ WFIFOW(fd, 11) = sd->status.inventory[index].card[0];
if (sd->status.inventory[index].card[1] > 0
&& (j =
- itemdb_viewid (sd->status.inventory[index].card[1])) > 0)
- WFIFOW (fd, 13) = j;
+ itemdb_viewid(sd->status.inventory[index].card[1])) > 0)
+ WFIFOW(fd, 13) = j;
else
- WFIFOW (fd, 13) = sd->status.inventory[index].card[1];
+ WFIFOW(fd, 13) = sd->status.inventory[index].card[1];
if (sd->status.inventory[index].card[2] > 0
&& (j =
- itemdb_viewid (sd->status.inventory[index].card[2])) > 0)
- WFIFOW (fd, 15) = j;
+ itemdb_viewid(sd->status.inventory[index].card[2])) > 0)
+ WFIFOW(fd, 15) = j;
else
- WFIFOW (fd, 15) = sd->status.inventory[index].card[2];
+ WFIFOW(fd, 15) = sd->status.inventory[index].card[2];
if (sd->status.inventory[index].card[3] > 0
&& (j =
- itemdb_viewid (sd->status.inventory[index].card[3])) > 0)
- WFIFOW (fd, 17) = j;
+ itemdb_viewid(sd->status.inventory[index].card[3])) > 0)
+ WFIFOW(fd, 17) = j;
else
- WFIFOW (fd, 17) = sd->status.inventory[index].card[3];
+ WFIFOW(fd, 17) = sd->status.inventory[index].card[3];
}
}
- WFIFOSET (fd, packet_len_table[0xe9]);
+ WFIFOSET(fd, clif_parse_func_table[0xe9].len);
return 0;
}
@@ -3286,20 +2444,19 @@ int clif_tradeadditem (struct map_session_data *sd,
* アイテム追加成功/失敗
*------------------------------------------
*/
-int clif_tradeitemok (struct map_session_data *sd, int index, int amount,
+int clif_tradeitemok(struct map_session_data *sd, int index, int amount,
int fail)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x1b1;
- //WFIFOW(fd,0)=0xea;
- WFIFOW (fd, 2) = index;
- WFIFOW (fd, 4) = amount;
- WFIFOB (fd, 6) = fail;
- WFIFOSET (fd, packet_len_table[0x1b1]);
+ WFIFOW(fd, 0) = 0x1b1;
+ WFIFOW(fd, 2) = index;
+ WFIFOW(fd, 4) = amount;
+ WFIFOB(fd, 6) = fail;
+ WFIFOSET(fd, clif_parse_func_table[0x1b1].len);
return 0;
}
@@ -3308,16 +2465,16 @@ int clif_tradeitemok (struct map_session_data *sd, int index, int amount,
* 取り引きok押し
*------------------------------------------
*/
-int clif_tradedeal_lock (struct map_session_data *sd, int fail)
+int clif_tradedeal_lock(struct map_session_data *sd, int fail)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xec;
- WFIFOB (fd, 2) = fail; // 0=you 1=the other person
- WFIFOSET (fd, packet_len_table[0xec]);
+ WFIFOW(fd, 0) = 0xec;
+ WFIFOB(fd, 2) = fail; // 0=you 1=the other person
+ WFIFOSET(fd, clif_parse_func_table[0xec].len);
return 0;
}
@@ -3326,15 +2483,15 @@ int clif_tradedeal_lock (struct map_session_data *sd, int fail)
* 取り引きがキャンセルされました
*------------------------------------------
*/
-int clif_tradecancelled (struct map_session_data *sd)
+int clif_tradecancelled(struct map_session_data *sd)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xee;
- WFIFOSET (fd, packet_len_table[0xee]);
+ WFIFOW(fd, 0) = 0xee;
+ WFIFOSET(fd, clif_parse_func_table[0xee].len);
return 0;
}
@@ -3343,16 +2500,16 @@ int clif_tradecancelled (struct map_session_data *sd)
* 取り引き完了
*------------------------------------------
*/
-int clif_tradecompleted (struct map_session_data *sd, int fail)
+int clif_tradecompleted(struct map_session_data *sd, int fail)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xf0;
- WFIFOB (fd, 2) = fail;
- WFIFOSET (fd, packet_len_table[0xf0]);
+ WFIFOW(fd, 0) = 0xf0;
+ WFIFOB(fd, 2) = fail;
+ WFIFOSET(fd, clif_parse_func_table[0xf0].len);
return 0;
}
@@ -3361,19 +2518,19 @@ int clif_tradecompleted (struct map_session_data *sd, int fail)
* カプラ倉庫のアイテム数を更新
*------------------------------------------
*/
-int clif_updatestorageamount (struct map_session_data *sd,
+int clif_updatestorageamount(struct map_session_data *sd,
struct storage *stor)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
- nullpo_retr (0, stor);
+ nullpo_ret(sd);
+ nullpo_ret(stor);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xf2; // update storage amount
- WFIFOW (fd, 2) = stor->storage_amount; //items
- WFIFOW (fd, 4) = MAX_STORAGE; //items max
- WFIFOSET (fd, packet_len_table[0xf2]);
+ WFIFOW(fd, 0) = 0xf2; // update storage amount
+ WFIFOW(fd, 2) = stor->storage_amount; //items
+ WFIFOW(fd, 4) = MAX_STORAGE; //items max
+ WFIFOSET(fd, clif_parse_func_table[0xf2].len);
return 0;
}
@@ -3382,146 +2539,61 @@ int clif_updatestorageamount (struct map_session_data *sd,
* カプラ倉庫にアイテムを追加する
*------------------------------------------
*/
-int clif_storageitemadded (struct map_session_data *sd, struct storage *stor,
+int clif_storageitemadded(struct map_session_data *sd, struct storage *stor,
int index, int amount)
{
- int fd, j;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0xf4; // Storage item added
- WFIFOW (fd, 2) = index + 1; // index
- WFIFOL (fd, 4) = amount; // amount
-/* if((view = itemdb_viewid(stor->storage_[index].nameid)) > 0)
- WFIFOW(fd,8) =view;
- else*/
- WFIFOW (fd, 8) = stor->storage_[index].nameid;
- WFIFOB (fd, 10) = stor->storage_[index].identify; //identify flag
- if (stor->storage_[index].broken == 1)
- WFIFOB (fd, 11) = 1; // is weapon broken [Valaris]
- else
- WFIFOB (fd, 11) = stor->storage_[index].attribute; // attribute
- WFIFOB (fd, 12) = stor->storage_[index].refine; //refine
- if (stor->storage_[index].card[0] == 0x00ff
- || stor->storage_[index].card[0] == 0x00fe
- || stor->storage_[index].card[0] == (short) 0xff00)
- {
- WFIFOW (fd, 13) = stor->storage_[index].card[0]; //card (4w)
- WFIFOW (fd, 15) = stor->storage_[index].card[1]; //card (4w)
- WFIFOW (fd, 17) = stor->storage_[index].card[2]; //card (4w)
- WFIFOW (fd, 19) = stor->storage_[index].card[3]; //card (4w)
- }
- else
- {
- if (stor->storage_[index].card[0] > 0
- && (j = itemdb_viewid (stor->storage_[index].card[0])) > 0)
- WFIFOW (fd, 13) = j;
- else
- WFIFOW (fd, 13) = stor->storage_[index].card[0];
- if (stor->storage_[index].card[1] > 0
- && (j = itemdb_viewid (stor->storage_[index].card[1])) > 0)
- WFIFOW (fd, 15) = j;
- else
- WFIFOW (fd, 15) = stor->storage_[index].card[1];
- if (stor->storage_[index].card[2] > 0
- && (j = itemdb_viewid (stor->storage_[index].card[2])) > 0)
- WFIFOW (fd, 17) = j;
- else
- WFIFOW (fd, 17) = stor->storage_[index].card[2];
- if (stor->storage_[index].card[3] > 0
- && (j = itemdb_viewid (stor->storage_[index].card[3])) > 0)
- WFIFOW (fd, 19) = j;
- else
- WFIFOW (fd, 19) = stor->storage_[index].card[3];
- }
- WFIFOSET (fd, packet_len_table[0xf4]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_updateguildstorageamount (struct map_session_data *sd,
- struct guild_storage *stor)
-{
- int fd;
+ int fd, j;
- nullpo_retr (0, sd);
- nullpo_retr (0, stor);
+ nullpo_ret(sd);
+ nullpo_ret(stor);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xf2; // update storage amount
- WFIFOW (fd, 2) = stor->storage_amount; //items
- WFIFOW (fd, 4) = MAX_GUILD_STORAGE; //items max
- WFIFOSET (fd, packet_len_table[0xf2]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_guildstorageitemadded (struct map_session_data *sd,
- struct guild_storage *stor, int index,
- int amount)
-{
- int view, fd, j;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0xf4; // Storage item added
- WFIFOW (fd, 2) = index + 1; // index
- WFIFOL (fd, 4) = amount; // amount
- if ((view = itemdb_viewid (stor->storage_[index].nameid)) > 0)
- WFIFOW (fd, 8) = view;
- else
- WFIFOW (fd, 8) = stor->storage_[index].nameid; // id
- WFIFOB (fd, 10) = stor->storage_[index].identify; //identify flag
+ WFIFOW(fd, 0) = 0xf4; // Storage item added
+ WFIFOW(fd, 2) = index + 1; // index
+ WFIFOL(fd, 4) = amount; // amount
+/* if ((view = itemdb_viewid(stor->storage_[index].nameid)) > 0)
+ WFIFOW(fd,8) =view;
+ else*/
+ WFIFOW(fd, 8) = stor->storage_[index].nameid;
+ WFIFOB(fd, 10) = stor->storage_[index].identify; //identify flag
if (stor->storage_[index].broken == 1)
- WFIFOB (fd, 11) = 1; // is weapon broken [Valaris]
+ WFIFOB(fd, 11) = 1; // is weapon broken [Valaris]
else
- WFIFOB (fd, 11) = stor->storage_[index].attribute; // attribute
- WFIFOB (fd, 12) = stor->storage_[index].refine; //refine
+ WFIFOB(fd, 11) = stor->storage_[index].attribute; // attribute
+ WFIFOB(fd, 12) = stor->storage_[index].refine; //refine
if (stor->storage_[index].card[0] == 0x00ff
|| stor->storage_[index].card[0] == 0x00fe
|| stor->storage_[index].card[0] == (short) 0xff00)
{
- WFIFOW (fd, 13) = stor->storage_[index].card[0]; //card (4w)
- WFIFOW (fd, 15) = stor->storage_[index].card[1]; //card (4w)
- WFIFOW (fd, 17) = stor->storage_[index].card[2]; //card (4w)
- WFIFOW (fd, 19) = stor->storage_[index].card[3]; //card (4w)
+ WFIFOW(fd, 13) = stor->storage_[index].card[0]; //card (4w)
+ WFIFOW(fd, 15) = stor->storage_[index].card[1]; //card (4w)
+ WFIFOW(fd, 17) = stor->storage_[index].card[2]; //card (4w)
+ WFIFOW(fd, 19) = stor->storage_[index].card[3]; //card (4w)
}
else
{
if (stor->storage_[index].card[0] > 0
- && (j = itemdb_viewid (stor->storage_[index].card[0])) > 0)
- WFIFOW (fd, 13) = j;
+ && (j = itemdb_viewid(stor->storage_[index].card[0])) > 0)
+ WFIFOW(fd, 13) = j;
else
- WFIFOW (fd, 13) = stor->storage_[index].card[0];
+ WFIFOW(fd, 13) = stor->storage_[index].card[0];
if (stor->storage_[index].card[1] > 0
- && (j = itemdb_viewid (stor->storage_[index].card[1])) > 0)
- WFIFOW (fd, 15) = j;
+ && (j = itemdb_viewid(stor->storage_[index].card[1])) > 0)
+ WFIFOW(fd, 15) = j;
else
- WFIFOW (fd, 15) = stor->storage_[index].card[1];
+ WFIFOW(fd, 15) = stor->storage_[index].card[1];
if (stor->storage_[index].card[2] > 0
- && (j = itemdb_viewid (stor->storage_[index].card[2])) > 0)
- WFIFOW (fd, 17) = j;
+ && (j = itemdb_viewid(stor->storage_[index].card[2])) > 0)
+ WFIFOW(fd, 17) = j;
else
- WFIFOW (fd, 17) = stor->storage_[index].card[2];
+ WFIFOW(fd, 17) = stor->storage_[index].card[2];
if (stor->storage_[index].card[3] > 0
- && (j = itemdb_viewid (stor->storage_[index].card[3])) > 0)
- WFIFOW (fd, 19) = j;
+ && (j = itemdb_viewid(stor->storage_[index].card[3])) > 0)
+ WFIFOW(fd, 19) = j;
else
- WFIFOW (fd, 19) = stor->storage_[index].card[3];
+ WFIFOW(fd, 19) = stor->storage_[index].card[3];
}
- WFIFOSET (fd, packet_len_table[0xf4]);
+ WFIFOSET(fd, clif_parse_func_table[0xf4].len);
return 0;
}
@@ -3530,18 +2602,18 @@ int clif_guildstorageitemadded (struct map_session_data *sd,
* カプラ倉庫からアイテムを取り去る
*------------------------------------------
*/
-int clif_storageitemremoved (struct map_session_data *sd, int index,
+int clif_storageitemremoved(struct map_session_data *sd, int index,
int amount)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xf6; // Storage item removed
- WFIFOW (fd, 2) = index + 1;
- WFIFOL (fd, 4) = amount;
- WFIFOSET (fd, packet_len_table[0xf6]);
+ WFIFOW(fd, 0) = 0xf6; // Storage item removed
+ WFIFOW(fd, 2) = index + 1;
+ WFIFOL(fd, 4) = amount;
+ WFIFOSET(fd, clif_parse_func_table[0xf6].len);
return 0;
}
@@ -3550,27 +2622,24 @@ int clif_storageitemremoved (struct map_session_data *sd, int index,
* カプラ倉庫を閉じる
*------------------------------------------
*/
-int clif_storageclose (struct map_session_data *sd)
+int clif_storageclose(struct map_session_data *sd)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xf8; // Storage Closed
- WFIFOSET (fd, packet_len_table[0xf8]);
+ WFIFOW(fd, 0) = 0xf8; // Storage Closed
+ WFIFOSET(fd, clif_parse_func_table[0xf8].len);
return 0;
}
-void
-clif_changelook_accessories (struct block_list *bl,
+void clif_changelook_accessories(struct block_list *bl,
struct map_session_data *dest)
{
- int i;
-
- for (i = LOOK_SHOES; i <= LOOK_LAST; i++)
- clif_changelook_towards (bl, i, 0, dest);
+ for (LOOK i = LOOK::SHOES; i < LOOK::COUNT; i = LOOK(uint8_t(i) + 1))
+ clif_changelook_towards(bl, i, 0, dest);
}
//
@@ -3581,49 +2650,34 @@ clif_changelook_accessories (struct block_list *bl,
*------------------------------------------
*/
static
-void clif_getareachar_pc (struct map_session_data *sd,
+void clif_getareachar_pc(struct map_session_data *sd,
struct map_session_data *dstsd)
{
- int len;
+ int len;
- if (dstsd->status.option & OPTION_INVISIBILITY)
+ if (bool(dstsd->status.option & Option::INVISIBILITY))
return;
- nullpo_retv (sd);
- nullpo_retv (dstsd);
+ nullpo_retv(sd);
+ nullpo_retv(dstsd);
- if (dstsd->walktimer != -1)
+ if (dstsd->walktimer)
{
- len = clif_set007b (dstsd, WFIFOP (sd->fd, 0));
- WFIFOSET (sd->fd, len);
+ len = clif_set007b(dstsd, static_cast<uint8_t *>(WFIFOP(sd->fd, 0)));
+ WFIFOSET(sd->fd, len);
}
else
{
- len = clif_set0078 (dstsd, WFIFOP (sd->fd, 0));
- WFIFOSET (sd->fd, len);
+ len = clif_set0078(dstsd, static_cast<uint8_t *>(WFIFOP(sd->fd, 0)));
+ WFIFOSET(sd->fd, len);
}
- if (dstsd->chatID)
- {
- struct chat_data *cd;
- cd = (struct chat_data *) map_id2bl (dstsd->chatID);
- if (cd->usersd[0] == dstsd)
- clif_dispchat (cd, sd->fd);
- }
- if (dstsd->spiritball > 0)
- {
- clif_set01e1 (dstsd, WFIFOP (sd->fd, 0));
- WFIFOSET (sd->fd, packet_len_table[0x1e1]);
- }
if (battle_config.save_clothcolor == 1 && dstsd->status.clothes_color > 0)
- clif_changelook (&dstsd->bl, LOOK_CLOTHES_COLOR,
+ clif_changelook(&dstsd->bl, LOOK::CLOTHES_COLOR,
dstsd->status.clothes_color);
- if (sd->status.manner < 0)
- clif_changestatus (&sd->bl, SP_MANNER, sd->status.manner);
-
- clif_changelook_accessories (&sd->bl, dstsd);
- clif_changelook_accessories (&dstsd->bl, sd);
+ clif_changelook_accessories(&sd->bl, dstsd);
+ clif_changelook_accessories(&dstsd->bl, sd);
}
/*==========================================
@@ -3631,42 +2685,33 @@ void clif_getareachar_pc (struct map_session_data *sd,
*------------------------------------------
*/
static
-void clif_getareachar_npc (struct map_session_data *sd, struct npc_data *nd)
+void clif_getareachar_npc(struct map_session_data *sd, struct npc_data *nd)
{
- int len;
+ int len;
- nullpo_retv (sd);
- nullpo_retv (nd);
+ nullpo_retv(sd);
+ nullpo_retv(nd);
if (nd->npc_class < 0 || nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS)
return;
- len = clif_npc0078 (nd, WFIFOP (sd->fd, 0));
- WFIFOSET (sd->fd, len);
-
- if (nd->chat_id)
- {
- clif_dispchat ((struct chat_data *) map_id2bl (nd->chat_id), sd->fd);
- }
-
+ len = clif_npc0078(nd, static_cast<uint8_t *>(WFIFOP(sd->fd, 0)));
+ WFIFOSET(sd->fd, len);
}
/*==========================================
* 移動停止
*------------------------------------------
*/
-int clif_movemob (struct mob_data *md)
+int clif_movemob(struct mob_data *md)
{
unsigned char buf[256];
- int len;
-
- nullpo_retr (0, md);
+ int len;
- len = clif_mob007b (md, buf);
- clif_send (buf, len, &md->bl, AREA);
+ nullpo_ret(md);
- if (mob_get_equip (md->mob_class) > 0) // mob equipment [Valaris]
- clif_mob_equip (md, mob_get_equip (md->mob_class));
+ len = clif_mob007b(md, buf);
+ clif_send(buf, len, &md->bl, SendWho::AREA);
return 0;
}
@@ -3675,22 +2720,22 @@ int clif_movemob (struct mob_data *md)
* モンスターの位置修正
*------------------------------------------
*/
-int clif_fixmobpos (struct mob_data *md)
+int clif_fixmobpos(struct mob_data *md)
{
unsigned char buf[256];
- int len;
+ int len;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if (md->state.state == MS_WALK)
+ if (md->state.state == MS::WALK)
{
- len = clif_mob007b (md, buf);
- clif_send (buf, len, &md->bl, AREA);
+ len = clif_mob007b(md, buf);
+ clif_send(buf, len, &md->bl, SendWho::AREA);
}
else
{
- len = clif_mob0078 (md, buf);
- clif_send (buf, len, &md->bl, AREA);
+ len = clif_mob0078(md, buf);
+ clif_send(buf, len, &md->bl, SendWho::AREA);
}
return 0;
@@ -3700,24 +2745,24 @@ int clif_fixmobpos (struct mob_data *md)
* PCの位置修正
*------------------------------------------
*/
-int clif_fixpcpos (struct map_session_data *sd)
+int clif_fixpcpos(struct map_session_data *sd)
{
unsigned char buf[256];
- int len;
+ int len;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (sd->walktimer != -1)
+ if (sd->walktimer)
{
- len = clif_set007b (sd, buf);
- clif_send (buf, len, &sd->bl, AREA);
+ len = clif_set007b(sd, buf);
+ clif_send(buf, len, &sd->bl, SendWho::AREA);
}
else
{
- len = clif_set0078 (sd, buf);
- clif_send (buf, len, &sd->bl, AREA);
+ len = clif_set0078(sd, buf);
+ clif_send(buf, len, &sd->bl, SendWho::AREA);
}
- clif_changelook_accessories (&sd->bl, NULL);
+ clif_changelook_accessories(&sd->bl, NULL);
return 0;
}
@@ -3726,49 +2771,29 @@ int clif_fixpcpos (struct map_session_data *sd)
* 通常攻撃エフェクト&ダメージ
*------------------------------------------
*/
-int clif_damage (struct block_list *src, struct block_list *dst,
- unsigned int tick, int sdelay, int ddelay, int damage,
- int div, int type, int damage2)
+int clif_damage(struct block_list *src, struct block_list *dst,
+ tick_t tick, interval_t sdelay, interval_t ddelay, int damage,
+ int div, DamageType type, int damage2)
{
unsigned char buf[256];
- struct status_change *sc_data;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (0, src);
- nullpo_retr (0, dst);
+ nullpo_ret(src);
+ nullpo_ret(dst);
- sc_data = battle_get_sc_data (dst);
-
- if (type != 4 && dst->type == BL_PC
- && ((struct map_session_data *) dst)->special_state.infinite_endure)
- type = 9;
- if (sc_data)
- {
- if (type != 4 && sc_data[SC_ENDURE].timer != -1)
- type = 9;
- if (sc_data[SC_HALLUCINATION].timer != -1)
- {
- if (damage > 0)
- damage =
- damage * (5 + sc_data[SC_HALLUCINATION].val1) +
- MRAND (100);
- if (damage2 > 0)
- damage2 =
- damage2 * (5 + sc_data[SC_HALLUCINATION].val1) +
- MRAND (100);
- }
- }
+ sc_data = battle_get_sc_data(dst);
- WBUFW (buf, 0) = 0x8a;
- WBUFL (buf, 2) = src->id;
- WBUFL (buf, 6) = dst->id;
- WBUFL (buf, 10) = tick;
- WBUFL (buf, 14) = sdelay;
- WBUFL (buf, 18) = ddelay;
- WBUFW (buf, 22) = (damage > 0x7fff) ? 0x7fff : damage;
- WBUFW (buf, 24) = div;
- WBUFB (buf, 26) = type;
- WBUFW (buf, 27) = damage2;
- clif_send (buf, packet_len_table[0x8a], src, AREA);
+ WBUFW(buf, 0) = 0x8a;
+ WBUFL(buf, 2) = src->id;
+ WBUFL(buf, 6) = dst->id;
+ WBUFL(buf, 10) = tick.time_since_epoch().count();
+ WBUFL(buf, 14) = sdelay.count();
+ WBUFL(buf, 18) = ddelay.count();
+ WBUFW(buf, 22) = (damage > 0x7fff) ? 0x7fff : damage;
+ WBUFW(buf, 24) = div;
+ WBUFB(buf, 26) = static_cast<uint8_t>(type);
+ WBUFW(buf, 27) = damage2;
+ clif_send(buf, clif_parse_func_table[0x8a].len, src, SendWho::AREA);
return 0;
}
@@ -3778,25 +2803,22 @@ int clif_damage (struct block_list *src, struct block_list *dst,
*------------------------------------------
*/
static
-void clif_getareachar_mob (struct map_session_data *sd, struct mob_data *md)
+void clif_getareachar_mob(struct map_session_data *sd, struct mob_data *md)
{
- int len;
- nullpo_retv (sd);
- nullpo_retv (md);
+ int len;
+ nullpo_retv(sd);
+ nullpo_retv(md);
- if (md->state.state == MS_WALK)
+ if (md->state.state == MS::WALK)
{
- len = clif_mob007b (md, WFIFOP (sd->fd, 0));
- WFIFOSET (sd->fd, len);
+ len = clif_mob007b(md, static_cast<uint8_t *>(WFIFOP(sd->fd, 0)));
+ WFIFOSET(sd->fd, len);
}
else
{
- len = clif_mob0078 (md, WFIFOP (sd->fd, 0));
- WFIFOSET (sd->fd, len);
+ len = clif_mob0078(md, static_cast<uint8_t *>(WFIFOP(sd->fd, 0)));
+ WFIFOSET(sd->fd, len);
}
-
- if (mob_get_equip (md->mob_class) > 0) // mob equipment [Valaris]
- clif_mob_equip (md, mob_get_equip (md->mob_class));
}
/*==========================================
@@ -3804,127 +2826,30 @@ void clif_getareachar_mob (struct map_session_data *sd, struct mob_data *md)
*------------------------------------------
*/
static
-void clif_getareachar_item (struct map_session_data *sd,
+void clif_getareachar_item(struct map_session_data *sd,
struct flooritem_data *fitem)
{
- int view, fd;
+ int view, fd;
- nullpo_retv (sd);
- nullpo_retv (fitem);
+ nullpo_retv(sd);
+ nullpo_retv(fitem);
fd = sd->fd;
//009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B
- WFIFOW (fd, 0) = 0x9d;
- WFIFOL (fd, 2) = fitem->bl.id;
- if ((view = itemdb_viewid (fitem->item_data.nameid)) > 0)
- WFIFOW (fd, 6) = view;
+ WFIFOW(fd, 0) = 0x9d;
+ WFIFOL(fd, 2) = fitem->bl.id;
+ if ((view = itemdb_viewid(fitem->item_data.nameid)) > 0)
+ WFIFOW(fd, 6) = view;
else
- WFIFOW (fd, 6) = fitem->item_data.nameid;
- WFIFOB (fd, 8) = fitem->item_data.identify;
- WFIFOW (fd, 9) = fitem->bl.x;
- WFIFOW (fd, 11) = fitem->bl.y;
- WFIFOW (fd, 13) = fitem->item_data.amount;
- WFIFOB (fd, 15) = fitem->subx;
- WFIFOB (fd, 16) = fitem->suby;
-
- WFIFOSET (fd, packet_len_table[0x9d]);
-}
-
-/*==========================================
- * 場所スキルエフェクトが視界に入る
- *------------------------------------------
- */
-static
-int clif_getareachar_skillunit (struct map_session_data *sd,
- struct skill_unit *unit)
-{
- int fd;
- struct block_list *bl;
-
- nullpo_retr (0, unit);
+ WFIFOW(fd, 6) = fitem->item_data.nameid;
+ WFIFOB(fd, 8) = fitem->item_data.identify;
+ WFIFOW(fd, 9) = fitem->bl.x;
+ WFIFOW(fd, 11) = fitem->bl.y;
+ WFIFOW(fd, 13) = fitem->item_data.amount;
+ WFIFOB(fd, 15) = fitem->subx;
+ WFIFOB(fd, 16) = fitem->suby;
- fd = sd->fd;
- bl = map_id2bl (unit->group->src_id);
- memset (WFIFOP (fd, 0), 0, packet_len_table[0x1c9]);
- WFIFOW (fd, 0) = 0x1c9;
- WFIFOL (fd, 2) = unit->bl.id;
- WFIFOL (fd, 6) = unit->group->src_id;
- WFIFOW (fd, 10) = unit->bl.x;
- WFIFOW (fd, 12) = unit->bl.y;
- WFIFOB (fd, 14) = unit->group->unit_id;
- WFIFOB (fd, 15) = 1;
- WFIFOL (fd, 15 + 1) = 0; //1-4調べた限り固定
- WFIFOL (fd, 15 + 5) = 0; //5-8調べた限り固定
- //9-12マップごとで一定の77-80とはまた違う4バイトのかなり大きな数字
- WFIFOL (fd, 15 + 13) = unit->bl.y - 0x12; //13-16ユニットのY座標-18っぽい(Y:17でFF FF FF FF)
- WFIFOL (fd, 15 + 17) = 0x004f37dd; //17-20調べた限り固定
- WFIFOL (fd, 15 + 21) = 0x0012f674; //21-24調べた限り固定
- WFIFOL (fd, 15 + 25) = 0x0012f664; //25-28調べた限り固定
- WFIFOL (fd, 15 + 29) = 0x0012f654; //29-32調べた限り固定
- WFIFOL (fd, 15 + 33) = 0x77527bbc; //33-36調べた限り固定
- //37-39
- WFIFOB (fd, 15 + 40) = 0x2d; //40調べた限り固定
- WFIFOL (fd, 15 + 41) = 0; //41-44調べた限り0固定
- WFIFOL (fd, 15 + 45) = 0; //45-48調べた限り0固定
- WFIFOL (fd, 15 + 49) = 0; //49-52調べた限り0固定
- WFIFOL (fd, 15 + 53) = 0x0048d919; //53-56調べた限り固定
- WFIFOL (fd, 15 + 57) = 0x0000003e; //57-60調べた限り固定
- WFIFOL (fd, 15 + 61) = 0x0012f66c; //61-64調べた限り固定
- //65-68
- //69-72
- if (bl)
- WFIFOL (fd, 15 + 73) = bl->y; //73-76術者のY座標
- WFIFOL (fd, 15 + 77) = unit->bl.m; //77-80マップIDかなぁ?かなり2バイトで足りそうな数字
- WFIFOB (fd, 15 + 81) = 0xaa; //81終端文字0xaa
-
- /* Graffiti [Valaris] */
- if (unit->group->unit_id == 0xb0)
- {
- WFIFOL (fd, 15) = 1;
- WFIFOL (fd, 16) = 1;
- memcpy (WFIFOP (fd, 17), unit->group->valstr, 80);
- }
-
- WFIFOSET (fd, packet_len_table[0x1c9]);
- if (unit->group->skill_id == WZ_ICEWALL)
- clif_set0192 (fd, unit->bl.m, unit->bl.x, unit->bl.y, 5);
-
- return 0;
-}
-
-/*==========================================
- * 場所スキルエフェクトが視界から消える
- *------------------------------------------
- */
-static
-int clif_clearchar_skillunit (struct skill_unit *unit, int fd)
-{
- nullpo_retr (0, unit);
-
- WFIFOW (fd, 0) = 0x120;
- WFIFOL (fd, 2) = unit->bl.id;
- WFIFOSET (fd, packet_len_table[0x120]);
- if (unit->group->skill_id == WZ_ICEWALL)
- clif_set0192 (fd, unit->bl.m, unit->bl.x, unit->bl.y, unit->val2);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_01ac (struct block_list *bl)
-{
- uint8_t buf[32];
-
- nullpo_retr (0, bl);
-
- WBUFW (buf, 0) = 0x1ac;
- WBUFL (buf, 2) = bl->id;
-
- clif_send (buf, packet_len_table[0x1ac], bl, AREA);
- return 0;
+ WFIFOSET(fd, clif_parse_func_table[0x9d].len);
}
/*==========================================
@@ -3932,205 +2857,170 @@ int clif_01ac (struct block_list *bl)
*------------------------------------------
*/
static
-int clif_getareachar (struct block_list *bl, va_list ap)
+void clif_getareachar(struct block_list *bl, struct map_session_data *sd)
{
- struct map_session_data *sd;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
-
- sd = va_arg (ap, struct map_session_data *);
+ nullpo_retv(bl);
switch (bl->type)
{
- case BL_PC:
+ case BL::PC:
if (sd == (struct map_session_data *) bl)
break;
- clif_getareachar_pc (sd, (struct map_session_data *) bl);
+ clif_getareachar_pc(sd, (struct map_session_data *) bl);
break;
- case BL_NPC:
- clif_getareachar_npc (sd, (struct npc_data *) bl);
+ case BL::NPC:
+ clif_getareachar_npc(sd, (struct npc_data *) bl);
break;
- case BL_MOB:
- clif_getareachar_mob (sd, (struct mob_data *) bl);
+ case BL::MOB:
+ clif_getareachar_mob(sd, (struct mob_data *) bl);
break;
- case BL_ITEM:
- clif_getareachar_item (sd, (struct flooritem_data *) bl);
- break;
- case BL_SKILL:
- clif_getareachar_skillunit (sd, (struct skill_unit *) bl);
+ case BL::ITEM:
+ clif_getareachar_item(sd, (struct flooritem_data *) bl);
break;
default:
if (battle_config.error_log)
- printf ("get area char ??? %d\n", bl->type);
+ PRINTF("get area char ??? %d\n",
+ bl->type);
break;
}
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int clif_pcoutsight (struct block_list *bl, va_list ap)
+void clif_pcoutsight(struct block_list *bl, struct map_session_data *sd)
{
- struct map_session_data *sd, *dstsd;
+ struct map_session_data *dstsd;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, sd = va_arg (ap, struct map_session_data *));
+ nullpo_retv(bl);
+ nullpo_retv(sd);
switch (bl->type)
{
- case BL_PC:
+ case BL::PC:
dstsd = (struct map_session_data *) bl;
if (sd != dstsd)
{
- clif_clearchar_id (dstsd->bl.id, 0, sd->fd);
- clif_clearchar_id (sd->bl.id, 0, dstsd->fd);
- if (dstsd->chatID)
- {
- struct chat_data *cd;
- cd = (struct chat_data *) map_id2bl (dstsd->chatID);
- if (cd->usersd[0] == dstsd)
- clif_dispchat (cd, sd->fd);
- }
+ clif_clearchar_id(dstsd->bl.id, BeingRemoveWhy::GONE, sd->fd);
+ clif_clearchar_id(sd->bl.id, BeingRemoveWhy::GONE, dstsd->fd);
}
break;
- case BL_NPC:
+ case BL::NPC:
if (((struct npc_data *) bl)->npc_class != INVISIBLE_CLASS)
- clif_clearchar_id (bl->id, 0, sd->fd);
+ clif_clearchar_id(bl->id, BeingRemoveWhy::GONE, sd->fd);
break;
- case BL_MOB:
- clif_clearchar_id (bl->id, 0, sd->fd);
+ case BL::MOB:
+ clif_clearchar_id(bl->id, BeingRemoveWhy::GONE, sd->fd);
break;
- case BL_ITEM:
- clif_clearflooritem ((struct flooritem_data *) bl, sd->fd);
- break;
- case BL_SKILL:
- clif_clearchar_skillunit ((struct skill_unit *) bl, sd->fd);
+ case BL::ITEM:
+ clif_clearflooritem((struct flooritem_data *) bl, sd->fd);
break;
}
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int clif_pcinsight (struct block_list *bl, va_list ap)
+void clif_pcinsight(struct block_list *bl, struct map_session_data *sd)
{
- struct map_session_data *sd, *dstsd;
+ struct map_session_data *dstsd;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, sd = va_arg (ap, struct map_session_data *));
+ nullpo_retv(bl);
+ nullpo_retv(sd);
switch (bl->type)
{
- case BL_PC:
+ case BL::PC:
dstsd = (struct map_session_data *) bl;
if (sd != dstsd)
{
- clif_getareachar_pc (sd, dstsd);
- clif_getareachar_pc (dstsd, sd);
+ clif_getareachar_pc(sd, dstsd);
+ clif_getareachar_pc(dstsd, sd);
}
break;
- case BL_NPC:
- clif_getareachar_npc (sd, (struct npc_data *) bl);
- break;
- case BL_MOB:
- clif_getareachar_mob (sd, (struct mob_data *) bl);
+ case BL::NPC:
+ clif_getareachar_npc(sd, (struct npc_data *) bl);
break;
- case BL_ITEM:
- clif_getareachar_item (sd, (struct flooritem_data *) bl);
+ case BL::MOB:
+ clif_getareachar_mob(sd, (struct mob_data *) bl);
break;
- case BL_SKILL:
- clif_getareachar_skillunit (sd, (struct skill_unit *) bl);
+ case BL::ITEM:
+ clif_getareachar_item(sd, (struct flooritem_data *) bl);
break;
}
-
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int clif_moboutsight (struct block_list *bl, va_list ap)
+void clif_moboutsight(struct block_list *bl, struct mob_data *md)
{
struct map_session_data *sd;
- struct mob_data *md;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, md = va_arg (ap, struct mob_data *));
+ nullpo_retv(bl);
+ nullpo_retv(md);
- if (bl->type == BL_PC && (sd = (struct map_session_data *) bl))
+ if (bl->type == BL::PC && (sd = (struct map_session_data *) bl))
{
- clif_clearchar_id (md->bl.id, 0, sd->fd);
+ clif_clearchar_id(md->bl.id, BeingRemoveWhy::GONE, sd->fd);
}
-
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int clif_mobinsight (struct block_list *bl, va_list ap)
+void clif_mobinsight(struct block_list *bl, struct mob_data *md)
{
struct map_session_data *sd;
- struct mob_data *md;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
+ nullpo_retv(bl);
+ nullpo_retv(md);
- md = va_arg (ap, struct mob_data *);
- if (bl->type == BL_PC && (sd = (struct map_session_data *) bl))
+ if (bl->type == BL::PC && (sd = (struct map_session_data *) bl))
{
- clif_getareachar_mob (sd, md);
+ clif_getareachar_mob(sd, md);
}
-
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int clif_skillinfo (struct map_session_data *sd, int skillid, int type,
+int clif_skillinfo(struct map_session_data *sd, SkillID skillid, int type,
int range)
{
- int fd, id;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- if ((id = sd->status.skill[skillid].id) <= 0)
+ if (!sd->status.skill[skillid].lv)
return 0;
- WFIFOW (fd, 0) = 0x147;
- WFIFOW (fd, 2) = id;
+ WFIFOW(fd, 0) = 0x147;
+ WFIFOW(fd, 2) = static_cast<uint16_t>(skillid);
if (type < 0)
- WFIFOW (fd, 4) = skill_get_inf (id);
+ WFIFOW(fd, 4) = skill_get_inf(skillid);
else
- WFIFOW (fd, 4) = type;
- WFIFOW (fd, 6) = 0;
- WFIFOW (fd, 8) = sd->status.skill[skillid].lv;
- WFIFOW (fd, 10) = skill_get_sp (id, sd->status.skill[skillid].lv);
+ WFIFOW(fd, 4) = type;
+ WFIFOW(fd, 6) = 0;
+ WFIFOW(fd, 8) = sd->status.skill[skillid].lv;
+ WFIFOW(fd, 10) = skill_get_sp(skillid, sd->status.skill[skillid].lv);
if (range < 0)
{
- range = skill_get_range (id, sd->status.skill[skillid].lv);
+ range = skill_get_range(skillid, sd->status.skill[skillid].lv);
if (range < 0)
- range = battle_get_range (&sd->bl) - (range + 1);
- WFIFOW (fd, 12) = range;
+ range = battle_get_range(&sd->bl) - (range + 1);
+ WFIFOW(fd, 12) = range;
}
else
- WFIFOW (fd, 12) = range;
- memset (WFIFOP (fd, 14), 0, 24);
- WFIFOB (fd, 38) =
- (sd->status.skill[skillid].lv < skill_get_max_raise (id)) ? 1 : 0;
- WFIFOSET (fd, packet_len_table[0x147]);
+ WFIFOW(fd, 12) = range;
+ memset(WFIFOP(fd, 14), 0, 24);
+ WFIFOB(fd, 38) = sd->status.skill[skillid].lv < skill_get_max_raise(skillid);
+ WFIFOSET(fd, clif_parse_func_table[0x147].len);
return 0;
}
@@ -4139,40 +3029,38 @@ int clif_skillinfo (struct map_session_data *sd, int skillid, int type,
* スキルリストを送信する
*------------------------------------------
*/
-int clif_skillinfoblock (struct map_session_data *sd)
+int clif_skillinfoblock(struct map_session_data *sd)
{
- int fd;
- int i, c, len = 4, id, range;
+ int fd;
+ int len = 4, range;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x10f;
- for (i = c = 0; i < MAX_SKILL; i++)
+ WFIFOW(fd, 0) = 0x10f;
+ for (SkillID i : erange(SkillID(), MAX_SKILL))
{
- if ((id = sd->status.skill[i].id) != 0 && (sd->tmw_version >= 1))
- { // [Fate] Version 1 and later don't crash because of bad skill IDs anymore
- WFIFOW (fd, len) = id;
- WFIFOW (fd, len + 2) = skill_get_inf (id);
- WFIFOW (fd, len + 4) =
- skill_db[i].poolflags | (sd->status.
- skill[i].flags &
- (SKILL_POOL_ACTIVATED));
- WFIFOW (fd, len + 6) = sd->status.skill[i].lv;
- WFIFOW (fd, len + 8) = skill_get_sp (id, sd->status.skill[i].lv);
- range = skill_get_range (id, sd->status.skill[i].lv);
+ if (sd->status.skill[i].lv && sd->tmw_version >= 1)
+ {
+ // [Fate] Version 1 and later don't crash because of bad skill IDs anymore
+ WFIFOW(fd, len) = static_cast<uint16_t>(i);
+ WFIFOW(fd, len + 2) = skill_get_inf(i);
+ WFIFOW(fd, len + 4) = static_cast<uint16_t>(
+ skill_db[i].poolflags
+ | (sd->status.skill[i].flags & SkillFlags::POOL_ACTIVATED));
+ WFIFOW(fd, len + 6) = sd->status.skill[i].lv;
+ WFIFOW(fd, len + 8) = skill_get_sp(i, sd->status.skill[i].lv);
+ range = skill_get_range(i, sd->status.skill[i].lv);
if (range < 0)
- range = battle_get_range (&sd->bl) - (range + 1);
- WFIFOW (fd, len + 10) = range;
- memset (WFIFOP (fd, len + 12), 0, 24);
- WFIFOB (fd, len + 36) =
- (sd->status.skill[i].lv < skill_get_max_raise (id)) ? 1 : 0;
+ range = battle_get_range(&sd->bl) - (range + 1);
+ WFIFOW(fd, len + 10) = range;
+ memset(WFIFOP(fd, len + 12), 0, 24);
+ WFIFOB(fd, len + 36) = sd->status.skill[i].lv < skill_get_max_raise(i);
len += 37;
- c++;
}
}
- WFIFOW (fd, 2) = len;
- WFIFOSET (fd, len);
+ WFIFOW(fd, 2) = len;
+ WFIFOSET(fd, len);
return 0;
}
@@ -4181,47 +3069,23 @@ int clif_skillinfoblock (struct map_session_data *sd)
* スキル割り振り通知
*------------------------------------------
*/
-int clif_skillup (struct map_session_data *sd, int skill_num)
+int clif_skillup(struct map_session_data *sd, SkillID skill_num)
{
- int range, fd;
+ int range, fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x10e;
- WFIFOW (fd, 2) = skill_num;
- WFIFOW (fd, 4) = sd->status.skill[skill_num].lv;
- WFIFOW (fd, 6) = skill_get_sp (skill_num, sd->status.skill[skill_num].lv);
- range = skill_get_range (skill_num, sd->status.skill[skill_num].lv);
+ WFIFOW(fd, 0) = 0x10e;
+ WFIFOW(fd, 2) = uint16_t(skill_num);
+ WFIFOW(fd, 4) = sd->status.skill[skill_num].lv;
+ WFIFOW(fd, 6) = skill_get_sp(skill_num, sd->status.skill[skill_num].lv);
+ range = skill_get_range(skill_num, sd->status.skill[skill_num].lv);
if (range < 0)
- range = battle_get_range (&sd->bl) - (range + 1);
- WFIFOW (fd, 8) = range;
- WFIFOB (fd, 10) =
- (sd->status.skill[skill_num].lv <
- skill_get_max_raise (sd->status.skill[skill_num].id)) ? 1 : 0;
- WFIFOSET (fd, packet_len_table[0x10e]);
-
- return 0;
-}
-
-/*==========================================
- * スキル詠唱エフェクトを送信する
- *------------------------------------------
- */
-int clif_skillcasting (struct block_list *bl,
- int src_id, int dst_id, int dst_x, int dst_y,
- int skill_num, int casttime)
-{
- unsigned char buf[32];
- WBUFW (buf, 0) = 0x13e;
- WBUFL (buf, 2) = src_id;
- WBUFL (buf, 6) = dst_id;
- WBUFW (buf, 10) = dst_x;
- WBUFW (buf, 12) = dst_y;
- WBUFW (buf, 14) = skill_num; //魔法詠唱スキル
- WBUFL (buf, 16) = skill_get_pl (skill_num); //属性
- WBUFL (buf, 20) = casttime; //skill詠唱時間
- clif_send (buf, packet_len_table[0x13e], bl, AREA);
+ range = battle_get_range(&sd->bl) - (range + 1);
+ WFIFOW(fd, 8) = range;
+ WFIFOB(fd, 10) = sd->status.skill[skill_num].lv < skill_get_max_raise(skill_num);
+ WFIFOSET(fd, clif_parse_func_table[0x10e].len);
return 0;
}
@@ -4230,15 +3094,15 @@ int clif_skillcasting (struct block_list *bl,
*
*------------------------------------------
*/
-int clif_skillcastcancel (struct block_list *bl)
+int clif_skillcastcancel(struct block_list *bl)
{
unsigned char buf[16];
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- WBUFW (buf, 0) = 0x1b9;
- WBUFL (buf, 2) = bl->id;
- clif_send (buf, packet_len_table[0x1b9], bl, AREA);
+ WBUFW(buf, 0) = 0x1b9;
+ WBUFL(buf, 2) = bl->id;
+ clif_send(buf, clif_parse_func_table[0x1b9].len, bl, SendWho::AREA);
return 0;
}
@@ -4247,12 +3111,12 @@ int clif_skillcastcancel (struct block_list *bl)
* スキル詠唱失敗
*------------------------------------------
*/
-int clif_skill_fail (struct map_session_data *sd, int skill_id, int type,
+int clif_skill_fail(struct map_session_data *sd, SkillID skill_id, int type,
int btype)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
@@ -4261,13 +3125,13 @@ int clif_skill_fail (struct map_session_data *sd, int skill_id, int type,
return 0;
}
- WFIFOW (fd, 0) = 0x110;
- WFIFOW (fd, 2) = skill_id;
- WFIFOW (fd, 4) = btype;
- WFIFOW (fd, 6) = 0;
- WFIFOB (fd, 8) = 0;
- WFIFOB (fd, 9) = type;
- WFIFOSET (fd, packet_len_table[0x110]);
+ WFIFOW(fd, 0) = 0x110;
+ WFIFOW(fd, 2) = uint16_t(skill_id);
+ WFIFOW(fd, 4) = btype;
+ WFIFOW(fd, 6) = 0;
+ WFIFOB(fd, 8) = 0;
+ WFIFOB(fd, 9) = type;
+ WFIFOSET(fd, clif_parse_func_table[0x110].len);
return 0;
}
@@ -4276,322 +3140,49 @@ int clif_skill_fail (struct map_session_data *sd, int skill_id, int type,
* スキル攻撃エフェクト&ダメージ
*------------------------------------------
*/
-int clif_skill_damage (struct block_list *src, struct block_list *dst,
- unsigned int tick, int sdelay, int ddelay, int damage,
- int div, int skill_id, int skill_lv, int type)
+int clif_skill_damage(struct block_list *src, struct block_list *dst,
+ tick_t tick, interval_t sdelay, interval_t ddelay, int damage,
+ int div, SkillID skill_id, int skill_lv, int type)
{
unsigned char buf[64];
- struct status_change *sc_data;
-
- nullpo_retr (0, src);
- nullpo_retr (0, dst);
-
- sc_data = battle_get_sc_data (dst);
-
- if (type != 5 && dst->type == BL_PC
- && ((struct map_session_data *) dst)->special_state.infinite_endure)
- type = 9;
- if (sc_data)
- {
- if (type != 5 && sc_data[SC_ENDURE].timer != -1)
- type = 9;
- if (sc_data[SC_HALLUCINATION].timer != -1 && damage > 0)
- damage =
- damage * (5 + sc_data[SC_HALLUCINATION].val1) + MRAND (100);
- }
-
- WBUFW (buf, 0) = 0x1de;
- WBUFW (buf, 2) = skill_id;
- WBUFL (buf, 4) = src->id;
- WBUFL (buf, 8) = dst->id;
- WBUFL (buf, 12) = tick;
- WBUFL (buf, 16) = sdelay;
- WBUFL (buf, 20) = ddelay;
- WBUFL (buf, 24) = damage;
- WBUFW (buf, 28) = skill_lv;
- WBUFW (buf, 30) = div;
- WBUFB (buf, 32) = (type > 0) ? type : skill_get_hit (skill_id);
- clif_send (buf, packet_len_table[0x1de], src, AREA);
-
- return 0;
-}
-
-/*==========================================
- * 吹き飛ばしスキル攻撃エフェクト&ダメージ
- *------------------------------------------
- */
-int clif_skill_damage2 (struct block_list *src, struct block_list *dst,
- unsigned int tick, int sdelay, int ddelay, int damage,
- int div, int skill_id, int skill_lv, int type)
-{
- unsigned char buf[64];
- struct status_change *sc_data;
-
- nullpo_retr (0, src);
- nullpo_retr (0, dst);
-
- sc_data = battle_get_sc_data (dst);
-
- if (type != 5 && dst->type == BL_PC
- && ((struct map_session_data *) dst)->special_state.infinite_endure)
- type = 9;
- if (sc_data)
- {
- if (type != 5 && sc_data[SC_ENDURE].timer != -1)
- type = 9;
- if (sc_data[SC_HALLUCINATION].timer != -1 && damage > 0)
- damage =
- damage * (5 + sc_data[SC_HALLUCINATION].val1) + MRAND (100);
- }
-
- WBUFW (buf, 0) = 0x115;
- WBUFW (buf, 2) = skill_id;
- WBUFL (buf, 4) = src->id;
- WBUFL (buf, 8) = dst->id;
- WBUFL (buf, 12) = tick;
- WBUFL (buf, 16) = sdelay;
- WBUFL (buf, 20) = ddelay;
- WBUFW (buf, 24) = dst->x;
- WBUFW (buf, 26) = dst->y;
- WBUFW (buf, 28) = damage;
- WBUFW (buf, 30) = skill_lv;
- WBUFW (buf, 32) = div;
- WBUFB (buf, 34) = (type > 0) ? type : skill_get_hit (skill_id);
- clif_send (buf, packet_len_table[0x115], src, AREA);
-
- return 0;
-}
-
-/*==========================================
- * 支援/回復スキルエフェクト
- *------------------------------------------
- */
-int clif_skill_nodamage (struct block_list *src, struct block_list *dst,
- int skill_id, int heal, int fail)
-{
- unsigned char buf[32];
-
- nullpo_retr (0, src);
- nullpo_retr (0, dst);
-
- WBUFW (buf, 0) = 0x11a;
- WBUFW (buf, 2) = skill_id;
- WBUFW (buf, 4) = (heal > 0x7fff) ? 0x7fff : heal;
- WBUFL (buf, 6) = dst->id;
- WBUFL (buf, 10) = src->id;
- WBUFB (buf, 14) = fail;
- clif_send (buf, packet_len_table[0x11a], src, AREA);
-
- return 0;
-}
+ eptr<struct status_change, StatusChange> sc_data;
-/*==========================================
- * 場所スキルエフェクト
- *------------------------------------------
- */
-int clif_skill_poseffect (struct block_list *src, int skill_id, int val,
- int x, int y, int tick)
-{
- unsigned char buf[32];
+ nullpo_ret(src);
+ nullpo_ret(dst);
- nullpo_retr (0, src);
+ sc_data = battle_get_sc_data(dst);
- WBUFW (buf, 0) = 0x117;
- WBUFW (buf, 2) = skill_id;
- WBUFL (buf, 4) = src->id;
- WBUFW (buf, 8) = val;
- WBUFW (buf, 10) = x;
- WBUFW (buf, 12) = y;
- WBUFL (buf, 14) = tick;
- clif_send (buf, packet_len_table[0x117], src, AREA);
+ WBUFW(buf, 0) = 0x1de;
+ WBUFW(buf, 2) = uint16_t(skill_id);
+ WBUFL(buf, 4) = src->id;
+ WBUFL(buf, 8) = dst->id;
+ WBUFL(buf, 12) = static_cast<uint32_t>(tick.time_since_epoch().count());
+ WBUFL(buf, 16) = static_cast<uint32_t>(sdelay.count());
+ WBUFL(buf, 20) = static_cast<uint32_t>(ddelay.count());
+ WBUFL(buf, 24) = damage;
+ WBUFW(buf, 28) = skill_lv;
+ WBUFW(buf, 30) = div;
+ WBUFB(buf, 32) = (type > 0) ? type : skill_get_hit(skill_id);
+ clif_send(buf, clif_parse_func_table[0x1de].len, src, SendWho::AREA);
return 0;
}
/*==========================================
- * 場所スキルエフェクト表示
- *------------------------------------------
- */
-int clif_skill_setunit (struct skill_unit *unit)
-{
- unsigned char buf[128];
- struct block_list *bl;
-
- nullpo_retr (0, unit);
-
- bl = map_id2bl (unit->group->src_id);
-
- memset (WBUFP (buf, 0), 0, packet_len_table[0x1c9]);
- WBUFW (buf, 0) = 0x1c9;
- WBUFL (buf, 2) = unit->bl.id;
- WBUFL (buf, 6) = unit->group->src_id;
- WBUFW (buf, 10) = unit->bl.x;
- WBUFW (buf, 12) = unit->bl.y;
- WBUFB (buf, 14) = unit->group->unit_id;
- WBUFB (buf, 15) = 1;
- WBUFL (buf, 15 + 1) = 0; //1-4調べた限り固定
- WBUFL (buf, 15 + 5) = 0; //5-8調べた限り固定
- //9-12マップごとで一定の77-80とはまた違う4バイトのかなり大きな数字
- WBUFL (buf, 15 + 13) = unit->bl.y - 0x12; //13-16ユニットのY座標-18っぽい(Y:17でFF FF FF FF)
- WBUFL (buf, 15 + 17) = 0x004f37dd; //17-20調べた限り固定(0x1b2で0x004fdbddだった)
- WBUFL (buf, 15 + 21) = 0x0012f674; //21-24調べた限り固定
- WBUFL (buf, 15 + 25) = 0x0012f664; //25-28調べた限り固定
- WBUFL (buf, 15 + 29) = 0x0012f654; //29-32調べた限り固定
- WBUFL (buf, 15 + 33) = 0x77527bbc; //33-36調べた限り固定
- //37-39
- WBUFB (buf, 15 + 40) = 0x2d; //40調べた限り固定
- WBUFL (buf, 15 + 41) = 0; //41-44調べた限り0固定
- WBUFL (buf, 15 + 45) = 0; //45-48調べた限り0固定
- WBUFL (buf, 15 + 49) = 0; //49-52調べた限り0固定
- WBUFL (buf, 15 + 53) = 0x0048d919; //53-56調べた限り固定(0x01b2で0x00495119だった)
- WBUFL (buf, 15 + 57) = 0x0000003e; //57-60調べた限り固定
- WBUFL (buf, 15 + 61) = 0x0012f66c; //61-64調べた限り固定
- //65-68
- //69-72
- if (bl)
- WBUFL (buf, 15 + 73) = bl->y; //73-76術者のY座標
- WBUFL (buf, 15 + 77) = unit->bl.m; //77-80マップIDかなぁ?かなり2バイトで足りそうな数字
- WBUFB (buf, 15 + 81) = 0xaa; //81終端文字0xaa
-
- /* Graffiti [Valaris] */
- if (unit->group->unit_id == 0xb0)
- {
- WBUFL (buf, 15) = 1;
- WBUFL (buf, 16) = 1;
- memcpy (WBUFP (buf, 17), unit->group->valstr, 80);
- }
-
- clif_send (buf, packet_len_table[0x1c9], &unit->bl, AREA);
- return 0;
-}
-
-/*==========================================
- * 場所スキルエフェクト削除
- *------------------------------------------
- */
-int clif_skill_delunit (struct skill_unit *unit)
-{
- unsigned char buf[16];
-
- nullpo_retr (0, unit);
-
- WBUFW (buf, 0) = 0x120;
- WBUFL (buf, 2) = unit->bl.id;
- clif_send (buf, packet_len_table[0x120], &unit->bl, AREA);
- return 0;
-}
-
-/*==========================================
- * ワープ場所選択
- *------------------------------------------
- */
-int clif_skill_warppoint (struct map_session_data *sd, int skill_num,
- const char *map1, const char *map2,
- const char *map3, const char *map4)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x11c;
- WFIFOW (fd, 2) = skill_num;
- memcpy (WFIFOP (fd, 4), map1, 16);
- memcpy (WFIFOP (fd, 20), map2, 16);
- memcpy (WFIFOP (fd, 36), map3, 16);
- memcpy (WFIFOP (fd, 52), map4, 16);
- WFIFOSET (fd, packet_len_table[0x11c]);
- return 0;
-}
-
-/*==========================================
- * メモ応答
- *------------------------------------------
- */
-int clif_skill_memo (struct map_session_data *sd, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
-
- WFIFOW (fd, 0) = 0x11e;
- WFIFOB (fd, 2) = flag;
- WFIFOSET (fd, packet_len_table[0x11e]);
- return 0;
-}
-
-int clif_skill_teleportmessage (struct map_session_data *sd, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x189;
- WFIFOW (fd, 2) = flag;
- WFIFOSET (fd, packet_len_table[0x189]);
- return 0;
-}
-
-/*==========================================
- * モンスター情報
- *------------------------------------------
- */
-int clif_skill_estimation (struct map_session_data *sd,
- struct block_list *dst)
-{
- struct mob_data *md;
- unsigned char buf[64];
- int i;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, dst);
-
- if (dst->type != BL_MOB)
- return 0;
- if ((md = (struct mob_data *) dst) == NULL)
- return 0;
-
- WBUFW (buf, 0) = 0x18c;
- WBUFW (buf, 2) = mob_get_viewclass (md->mob_class);
- WBUFW (buf, 4) = mob_db[md->mob_class].lv;
- WBUFW (buf, 6) = mob_db[md->mob_class].size;
- WBUFL (buf, 8) = md->hp;
- WBUFW (buf, 12) = battle_get_def2 (&md->bl);
- WBUFW (buf, 14) = mob_db[md->mob_class].race;
- WBUFW (buf, 16) =
- battle_get_mdef2 (&md->bl) - (mob_db[md->mob_class].vit >> 1);
- WBUFW (buf, 18) = battle_get_elem_type (&md->bl);
- for (i = 0; i < 9; i++)
- WBUFB (buf, 20 + i) = battle_attr_fix (100, i + 1, md->def_ele);
-
- if (sd->status.party_id > 0)
- clif_send (buf, packet_len_table[0x18c], &sd->bl, PARTY_AREA);
- else
- {
- memcpy (WFIFOP (sd->fd, 0), buf, packet_len_table[0x18c]);
- WFIFOSET (sd->fd, packet_len_table[0x18c]);
- }
- return 0;
-}
-
-/*==========================================
* 状態異常アイコン/メッセージ表示
*------------------------------------------
*/
-int clif_status_change (struct block_list *bl, int type, int flag)
+int clif_status_change(struct block_list *bl, StatusChange type, int flag)
{
unsigned char buf[16];
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- WBUFW (buf, 0) = 0x0196;
- WBUFW (buf, 2) = type;
- WBUFL (buf, 4) = bl->id;
- WBUFB (buf, 8) = flag;
- clif_send (buf, packet_len_table[0x196], bl, AREA);
+ WBUFW(buf, 0) = 0x0196;
+ WBUFW(buf, 2) = uint16_t(type);
+ WBUFL(buf, 4) = bl->id;
+ WBUFB(buf, 8) = flag;
+ clif_send(buf, clif_parse_func_table[0x196].len, bl, SendWho::AREA);
return 0;
}
@@ -4599,170 +3190,56 @@ int clif_status_change (struct block_list *bl, int type, int flag)
* Send message (modified by [Yor])
*------------------------------------------
*/
-int clif_displaymessage (int fd, const char *mes)
+void clif_displaymessage(int fd, const_string mes)
{
- int len_mes = strlen (mes);
-
- if (len_mes > 0)
- { // don't send a void message (it's not displaying on the client chat). @help can send void line.
- WFIFOW (fd, 0) = 0x8e;
- WFIFOW (fd, 2) = 5 + len_mes; // 4 + len + NULL teminate
- memcpy (WFIFOP (fd, 4), mes, len_mes + 1);
- WFIFOSET (fd, 5 + len_mes);
+ if (mes)
+ {
+ // don't send a void message (it's not displaying on the client chat). @help can send void line.
+ WFIFOW(fd, 0) = 0x8e;
+ WFIFOW(fd, 2) = 5 + mes.size(); // 4 + len + NULL teminate
+ memcpy(WFIFOP(fd, 4), mes.data(), mes.size());
+ WFIFOB(fd, 4 + mes.size()) = '\0';
+ WFIFOSET(fd, 5 + mes.size());
}
-
- return 0;
}
/*==========================================
* 天の声を送信する
*------------------------------------------
*/
-int clif_GMmessage (struct block_list *bl, const char *mes, int len, int flag)
+void clif_GMmessage(struct block_list *bl, const_string mes, int flag)
{
- unsigned char lbuf[255];
- unsigned char *buf =
- ((len + 16) >= sizeof (lbuf)) ? (unsigned char*)malloc (len + 16) : lbuf;
- int lp = (flag & 0x10) ? 8 : 4;
+ unsigned char buf[mes.size() + 16];
+ int lp = (flag & 0x10) ? 8 : 4;
- WBUFW (buf, 0) = 0x9a;
- WBUFW (buf, 2) = len + lp;
- WBUFL (buf, 4) = 0x65756c62;
- memcpy (WBUFP (buf, lp), mes, len);
+ WBUFW(buf, 0) = 0x9a;
+ WBUFW(buf, 2) = mes.size() + 1 + lp;
+ WBUFL(buf, 4) = 0x65756c62;
+ memcpy(WBUFP(buf, lp), mes.data(), mes.size());
+ WBUFB(buf, lp + mes.size()) = '\0';
flag &= 0x07;
- clif_send (buf, WBUFW (buf, 2), bl,
- (flag == 1) ? ALL_SAMEMAP :
- (flag == 2) ? AREA : (flag == 3) ? SELF : ALL_CLIENT);
- if (buf != lbuf)
- free (buf);
- return 0;
-}
-
-/*==========================================
- * HPSP回復エフェクトを送信する
- *------------------------------------------
- */
-int clif_heal (int fd, int type, int val)
-{
- WFIFOW (fd, 0) = 0x13d;
- WFIFOW (fd, 2) = type;
- WFIFOW (fd, 4) = val;
- WFIFOSET (fd, packet_len_table[0x13d]);
-
- return 0;
+ clif_send(buf, WBUFW(buf, 2), bl,
+ (flag == 1) ? SendWho::ALL_SAMEMAP :
+ (flag == 2) ? SendWho::AREA :
+ (flag == 3) ? SendWho::SELF :
+ SendWho::ALL_CLIENT);
}
/*==========================================
* 復活する
*------------------------------------------
*/
-int clif_resurrection (struct block_list *bl, int type)
+int clif_resurrection(struct block_list *bl, int type)
{
unsigned char buf[16];
- nullpo_retr (0, bl);
-
- if (bl->type == BL_PC)
- { // disguises [Valaris]
- struct map_session_data *sd = ((struct map_session_data *) bl);
- if (sd && sd->disguise > 23 && sd->disguise < 4001)
- clif_spawnpc (sd);
- }
-
- WBUFW (buf, 0) = 0x148;
- WBUFL (buf, 2) = bl->id;
- WBUFW (buf, 6) = type;
-
- clif_send (buf, packet_len_table[0x148], bl, type == 1 ? AREA : AREA_WOS);
-
- return 0;
-}
-
-/*==========================================
- * PVP実装?(仮)
- *------------------------------------------
- */
-int clif_set0199 (int fd, int type)
-{
- WFIFOW (fd, 0) = 0x199;
- WFIFOW (fd, 2) = type;
- WFIFOSET (fd, packet_len_table[0x199]);
-
- return 0;
-}
-
-/*==========================================
- * PVP実装?(仮)
- *------------------------------------------
- */
-int clif_pvpset (struct map_session_data *sd, int pvprank, int pvpnum,
- int type)
-{
- nullpo_retr (0, sd);
-
- if (map[sd->bl.m].flag.nopvp)
- return 0;
+ nullpo_ret(bl);
- if (type == 2)
- {
- WFIFOW (sd->fd, 0) = 0x19a;
- WFIFOL (sd->fd, 2) = sd->bl.id;
- if (pvprank <= 0)
- pc_calc_pvprank (sd);
- WFIFOL (sd->fd, 6) = pvprank;
- WFIFOL (sd->fd, 10) = pvpnum;
- WFIFOSET (sd->fd, packet_len_table[0x19a]);
- }
- else
- {
- uint8_t buf[32];
+ WBUFW(buf, 0) = 0x148;
+ WBUFL(buf, 2) = bl->id;
+ WBUFW(buf, 6) = type;
- WBUFW (buf, 0) = 0x19a;
- WBUFL (buf, 2) = sd->bl.id;
- if (sd->status.option & 0x46)
- WBUFL (buf, 6) = -1;
- else if (pvprank <= 0)
- pc_calc_pvprank (sd);
- WBUFL (buf, 6) = pvprank;
- WBUFL (buf, 10) = pvpnum;
- if (!type)
- clif_send (buf, packet_len_table[0x19a], &sd->bl, AREA);
- else
- clif_send (buf, packet_len_table[0x19a], &sd->bl, ALL_SAMEMAP);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_send0199 (int m, int type)
-{
- struct block_list bl;
- uint8_t buf[16];
-
- bl.m = m;
- WBUFW (buf, 0) = 0x199;
- WBUFW (buf, 2) = type;
- clif_send (buf, packet_len_table[0x199], &bl, ALL_SAMEMAP);
-
- return 0;
-}
-
-/*==========================================
- * 精錬エフェクトを送信する
- *------------------------------------------
- */
-int clif_refine (int fd, struct map_session_data *sd, int fail, int index,
- int val)
-{
- WFIFOW (fd, 0) = 0x188;
- WFIFOW (fd, 2) = fail;
- WFIFOW (fd, 4) = index + 2;
- WFIFOW (fd, 6) = val;
- WFIFOSET (fd, packet_len_table[0x188]);
+ clif_send(buf, clif_parse_func_table[0x148].len, bl, type == 1 ? SendWho::AREA : SendWho::AREA_WOS);
return 0;
}
@@ -4771,13 +3248,13 @@ int clif_refine (int fd, struct map_session_data *sd, int fail, int index,
* Wisp/page is transmitted to the destination player
*------------------------------------------
*/
-int clif_wis_message (int fd, const char *nick, const char *mes, int mes_len) // R 0097 <len>.w <nick>.24B <message>.?B
+int clif_wis_message(int fd, const char *nick, const char *mes, int mes_len) // R 0097 <len>.w <nick>.24B <message>.?B
{
- WFIFOW (fd, 0) = 0x97;
- WFIFOW (fd, 2) = mes_len + 24 + 4;
- memcpy (WFIFOP (fd, 4), nick, 24);
- memcpy (WFIFOP (fd, 28), mes, mes_len);
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOW(fd, 0) = 0x97;
+ WFIFOW(fd, 2) = mes_len + 24 + 4;
+ memcpy(WFIFOP(fd, 4), nick, 24);
+ memcpy(WFIFOP(fd, 28), mes, mes_len);
+ WFIFOSET(fd, WFIFOW(fd, 2));
return 0;
}
@@ -4785,432 +3262,11 @@ int clif_wis_message (int fd, const char *nick, const char *mes, int mes_len)
* The transmission result of Wisp/page is transmitted to the source player
*------------------------------------------
*/
-int clif_wis_end (int fd, int flag) // R 0098 <type>.B: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
-{
- WFIFOW (fd, 0) = 0x98;
- WFIFOW (fd, 2) = flag;
- WFIFOSET (fd, packet_len_table[0x98]);
- return 0;
-}
-
-/*==========================================
- * キャラID名前引き結果を送信する
- *------------------------------------------
- */
-int clif_solved_charname (struct map_session_data *sd, int char_id)
+int clif_wis_end(int fd, int flag) // R 0098 <type>.B: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
{
- char *p = map_charid2nick (char_id);
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- if (p != NULL)
- {
- WFIFOW (fd, 0) = 0x194;
- WFIFOL (fd, 2) = char_id;
- memcpy (WFIFOP (fd, 6), p, 24);
- WFIFOSET (fd, packet_len_table[0x194]);
- }
- else
- {
- map_reqchariddb (sd, char_id);
- chrif_searchcharid (char_id);
- }
- return 0;
-}
-
-/*==========================================
- * カードの挿入可能リストを返す
- *------------------------------------------
- */
-int clif_use_card (struct map_session_data *sd, int idx)
-{
- nullpo_retr (0, sd);
-
- if (sd->inventory_data[idx])
- {
- int i, c;
- int ep = sd->inventory_data[idx]->equip;
- int fd = sd->fd;
- WFIFOW (fd, 0) = 0x017b;
-
- for (i = c = 0; i < MAX_INVENTORY; i++)
- {
- int j;
-
- if (sd->inventory_data[i] == NULL)
- continue;
- if (sd->inventory_data[i]->type != 4 && sd->inventory_data[i]->type != 5) // 武器防具じゃない
- continue;
- if (sd->status.inventory[i].card[0] == 0x00ff) // 製造武器
- continue;
- if (sd->status.inventory[i].card[0] == (short) 0xff00
- || sd->status.inventory[i].card[0] == 0x00fe)
- continue;
- if (sd->status.inventory[i].identify == 0) // 未鑑定
- continue;
-
- if ((sd->inventory_data[i]->equip & ep) == 0) // 装備個所が違う
- continue;
- if (sd->inventory_data[i]->type == 4 && ep == 32) // 盾カードと両手武器
- continue;
-
- for (j = 0; j < sd->inventory_data[i]->slot; j++)
- {
- if (sd->status.inventory[i].card[j] == 0)
- break;
- }
- if (j == sd->inventory_data[i]->slot) // すでにカードが一杯
- continue;
-
- WFIFOW (fd, 4 + c * 2) = i + 2;
- c++;
- }
- WFIFOW (fd, 2) = 4 + c * 2;
- WFIFOSET (fd, WFIFOW (fd, 2));
- }
-
- return 0;
-}
-
-/*==========================================
- * カードの挿入終了
- *------------------------------------------
- */
-int clif_insert_card (struct map_session_data *sd, int idx_equip,
- int idx_card, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x17d;
- WFIFOW (fd, 2) = idx_equip + 2;
- WFIFOW (fd, 4) = idx_card + 2;
- WFIFOB (fd, 6) = flag;
- WFIFOSET (fd, packet_len_table[0x17d]);
- return 0;
-}
-
-/*==========================================
- * 鑑定可能アイテムリスト送信
- *------------------------------------------
- */
-int clif_item_identify_list (struct map_session_data *sd)
-{
- int i, c;
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
-
- WFIFOW (fd, 0) = 0x177;
- for (i = c = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.inventory[i].nameid > 0
- && sd->status.inventory[i].identify != 1)
- {
- WFIFOW (fd, c * 2 + 4) = i + 2;
- c++;
- }
- }
- if (c > 0)
- {
- WFIFOW (fd, 2) = c * 2 + 4;
- WFIFOSET (fd, WFIFOW (fd, 2));
- }
- return 0;
-}
-
-/*==========================================
- * 鑑定結果
- *------------------------------------------
- */
-int clif_item_identified (struct map_session_data *sd, int idx, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x179;
- WFIFOW (fd, 2) = idx + 2;
- WFIFOB (fd, 4) = flag;
- WFIFOSET (fd, packet_len_table[0x179]);
- return 0;
-}
-
-/*==========================================
- * 修理可能アイテムリスト送信
- * ※実際のパケットがわからないので動作しません
- *------------------------------------------
- */
-int clif_item_repair_list (struct map_session_data *sd)
-{
- int i, c;
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
-
- WFIFOW (fd, 0) = 0x0;
- for (i = c = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.inventory[i].nameid > 0
- && sd->status.inventory[i].broken != 0)
- {
- WFIFOW (fd, c * 2 + 4) = i + 2;
- c++;
- }
- }
- if (c > 0)
- {
- WFIFOW (fd, 2) = c * 2 + 4;
- WFIFOSET (fd, WFIFOW (fd, 2));
- }
- return 0;
-}
-
-/*==========================================
- * アイテムによる一時的なスキル効果
- *------------------------------------------
- */
-int clif_item_skill (struct map_session_data *sd, int skillid, int skilllv,
- const char *name)
-{
- int range, fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x147;
- WFIFOW (fd, 2) = skillid;
- WFIFOW (fd, 4) = skill_get_inf (skillid);
- WFIFOW (fd, 6) = 0;
- WFIFOW (fd, 8) = skilllv;
- WFIFOW (fd, 10) = skill_get_sp (skillid, skilllv);
- range = skill_get_range (skillid, skilllv);
- if (range < 0)
- range = battle_get_range (&sd->bl) - (range + 1);
- WFIFOW (fd, 12) = range;
- memcpy (WFIFOP (fd, 14), name, 24);
- WFIFOB (fd, 38) = 0;
- WFIFOSET (fd, packet_len_table[0x147]);
- return 0;
-}
-
-/*==========================================
- * カートにアイテム追加
- *------------------------------------------
- */
-int clif_cart_additem (struct map_session_data *sd, int n, int amount,
- int fail)
-{
- int view, j, fd;
- unsigned char *buf;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
- if (n < 0 || n >= MAX_CART || sd->status.cart[n].nameid <= 0)
- return 1;
-
- WBUFW (buf, 0) = 0x124;
- WBUFW (buf, 2) = n + 2;
- WBUFL (buf, 4) = amount;
- if ((view = itemdb_viewid (sd->status.cart[n].nameid)) > 0)
- WBUFW (buf, 8) = view;
- else
- WBUFW (buf, 8) = sd->status.cart[n].nameid;
- WBUFB (buf, 10) = sd->status.cart[n].identify;
- if (sd->status.cart[n].broken == 1) //is weapon broken [Valaris]
- WBUFB (buf, 11) = 1;
- else
- WBUFB (buf, 11) = sd->status.cart[n].attribute;
- WBUFB (buf, 12) = sd->status.cart[n].refine;
- if (sd->status.cart[n].card[0] == 0x00ff
- || sd->status.cart[n].card[0] == 0x00fe
- || sd->status.cart[n].card[0] == (short) 0xff00)
- {
- WBUFW (buf, 13) = sd->status.cart[n].card[0];
- WBUFW (buf, 15) = sd->status.cart[n].card[1];
- WBUFW (buf, 17) = sd->status.cart[n].card[2];
- WBUFW (buf, 19) = sd->status.cart[n].card[3];
- }
- else
- {
- if (sd->status.cart[n].card[0] > 0
- && (j = itemdb_viewid (sd->status.cart[n].card[0])) > 0)
- WBUFW (buf, 13) = j;
- else
- WBUFW (buf, 13) = sd->status.cart[n].card[0];
- if (sd->status.cart[n].card[1] > 0
- && (j = itemdb_viewid (sd->status.cart[n].card[1])) > 0)
- WBUFW (buf, 15) = j;
- else
- WBUFW (buf, 15) = sd->status.cart[n].card[1];
- if (sd->status.cart[n].card[2] > 0
- && (j = itemdb_viewid (sd->status.cart[n].card[2])) > 0)
- WBUFW (buf, 17) = j;
- else
- WBUFW (buf, 17) = sd->status.cart[n].card[2];
- if (sd->status.cart[n].card[3] > 0
- && (j = itemdb_viewid (sd->status.cart[n].card[3])) > 0)
- WBUFW (buf, 19) = j;
- else
- WBUFW (buf, 19) = sd->status.cart[n].card[3];
- }
- WFIFOSET (fd, packet_len_table[0x124]);
- return 0;
-}
-
-/*==========================================
- * カートからアイテム削除
- *------------------------------------------
- */
-int clif_cart_delitem (struct map_session_data *sd, int n, int amount)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
-
- WFIFOW (fd, 0) = 0x125;
- WFIFOW (fd, 2) = n + 2;
- WFIFOL (fd, 4) = amount;
-
- WFIFOSET (fd, packet_len_table[0x125]);
-
- return 0;
-}
-
-/*==========================================
- * カートのアイテムリスト
- *------------------------------------------
- */
-int clif_cart_itemlist (struct map_session_data *sd)
-{
- struct item_data *id;
- int i, n, fd;
- unsigned char *buf;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
- WBUFW (buf, 0) = 0x1ef;
- for (i = 0, n = 0; i < MAX_CART; i++)
- {
- if (sd->status.cart[i].nameid <= 0)
- continue;
- id = itemdb_search (sd->status.cart[i].nameid);
- if (itemdb_isequip2 (id))
- continue;
- WBUFW (buf, n * 18 + 4) = i + 2;
- if (id->view_id > 0)
- WBUFW (buf, n * 18 + 6) = id->view_id;
- else
- WBUFW (buf, n * 18 + 6) = sd->status.cart[i].nameid;
- WBUFB (buf, n * 18 + 8) = id->type;
- WBUFB (buf, n * 18 + 9) = sd->status.cart[i].identify;
- WBUFW (buf, n * 18 + 10) = sd->status.cart[i].amount;
- WBUFW (buf, n * 18 + 12) = 0;
- WBUFW (buf, n * 18 + 14) = sd->status.cart[i].card[0];
- WBUFW (buf, n * 18 + 16) = sd->status.cart[i].card[1];
- WBUFW (buf, n * 18 + 18) = sd->status.cart[i].card[2];
- WBUFW (buf, n * 18 + 20) = sd->status.cart[i].card[3];
- n++;
- }
- if (n)
- {
- WBUFW (buf, 2) = 4 + n * 18;
- WFIFOSET (fd, WFIFOW (fd, 2));
- }
- return 0;
-}
-
-/*==========================================
- * カートの装備品リスト
- *------------------------------------------
- */
-int clif_cart_equiplist (struct map_session_data *sd)
-{
- struct item_data *id;
- int i, j, n, fd;
- unsigned char *buf;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- buf = WFIFOP (fd, 0);
-
- WBUFW (buf, 0) = 0x122;
- for (i = 0, n = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.cart[i].nameid <= 0)
- continue;
- id = itemdb_search (sd->status.cart[i].nameid);
- if (!itemdb_isequip2 (id))
- continue;
- WBUFW (buf, n * 20 + 4) = i + 2;
- if (id->view_id > 0)
- WBUFW (buf, n * 20 + 6) = id->view_id;
- else
- WBUFW (buf, n * 20 + 6) = sd->status.cart[i].nameid;
- WBUFB (buf, n * 20 + 8) = id->type;
- WBUFB (buf, n * 20 + 9) = sd->status.cart[i].identify;
- WBUFW (buf, n * 20 + 10) = id->equip;
- WBUFW (buf, n * 20 + 12) = sd->status.cart[i].equip;
- if (sd->status.cart[i].broken == 1)
- WBUFB (buf, n * 20 + 14) = 1; //is weapon broken [Valaris]
- else
- WBUFB (buf, n * 20 + 14) = sd->status.cart[i].attribute;
- WBUFB (buf, n * 20 + 15) = sd->status.cart[i].refine;
- if (sd->status.cart[i].card[0] == 0x00ff
- || sd->status.cart[i].card[0] == 0x00fe
- || sd->status.cart[i].card[0] == (short) 0xff00)
- {
- WBUFW (buf, n * 20 + 16) = sd->status.cart[i].card[0];
- WBUFW (buf, n * 20 + 18) = sd->status.cart[i].card[1];
- WBUFW (buf, n * 20 + 20) = sd->status.cart[i].card[2];
- WBUFW (buf, n * 20 + 22) = sd->status.cart[i].card[3];
- }
- else
- {
- if (sd->status.cart[i].card[0] > 0
- && (j = itemdb_viewid (sd->status.cart[i].card[0])) > 0)
- WBUFW (buf, n * 20 + 16) = j;
- else
- WBUFW (buf, n * 20 + 16) = sd->status.cart[i].card[0];
- if (sd->status.cart[i].card[1] > 0
- && (j = itemdb_viewid (sd->status.cart[i].card[1])) > 0)
- WBUFW (buf, n * 20 + 18) = j;
- else
- WBUFW (buf, n * 20 + 18) = sd->status.cart[i].card[1];
- if (sd->status.cart[i].card[2] > 0
- && (j = itemdb_viewid (sd->status.cart[i].card[2])) > 0)
- WBUFW (buf, n * 20 + 20) = j;
- else
- WBUFW (buf, n * 20 + 20) = sd->status.cart[i].card[2];
- if (sd->status.cart[i].card[3] > 0
- && (j = itemdb_viewid (sd->status.cart[i].card[3])) > 0)
- WBUFW (buf, n * 20 + 22) = j;
- else
- WBUFW (buf, n * 20 + 22) = sd->status.cart[i].card[3];
- }
- n++;
- }
- if (n)
- {
- WBUFW (buf, 2) = 4 + n * 20;
- WFIFOSET (fd, WFIFOW (fd, 2));
- }
+ WFIFOW(fd, 0) = 0x98;
+ WFIFOW(fd, 2) = flag;
+ WFIFOSET(fd, clif_parse_func_table[0x98].len);
return 0;
}
@@ -5226,16 +3282,16 @@ int clif_cart_equiplist (struct map_session_data *sd)
* 2 The character is already in a party.
*------------------------------------------
*/
-int clif_party_created (struct map_session_data *sd, int flag)
+int clif_party_created(struct map_session_data *sd, int flag)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xfa;
- WFIFOB (fd, 2) = flag;
- WFIFOSET (fd, packet_len_table[0xfa]);
+ WFIFOW(fd, 0) = 0xfa;
+ WFIFOB(fd, 2) = flag;
+ WFIFOSET(fd, clif_parse_func_table[0xfa].len);
return 0;
}
@@ -5243,16 +3299,16 @@ int clif_party_created (struct map_session_data *sd, int flag)
* パーティ情報送信
*------------------------------------------
*/
-int clif_party_info (struct party *p, int fd)
+int clif_party_info(struct party *p, int fd)
{
unsigned char buf[1024];
- int i, c;
+ int i, c;
struct map_session_data *sd = NULL;
- nullpo_retr (0, p);
+ nullpo_ret(p);
- WBUFW (buf, 0) = 0xfb;
- memcpy (WBUFP (buf, 4), p->name, 24);
+ WBUFW(buf, 0) = 0xfb;
+ memcpy(WBUFP(buf, 4), p->name, 24);
for (i = c = 0; i < MAX_PARTY; i++)
{
struct party_member *m = &p->member[i];
@@ -5260,23 +3316,23 @@ int clif_party_info (struct party *p, int fd)
{
if (sd == NULL)
sd = m->sd;
- WBUFL (buf, 28 + c * 46) = m->account_id;
- memcpy (WBUFP (buf, 28 + c * 46 + 4), m->name, 24);
- memcpy (WBUFP (buf, 28 + c * 46 + 28), m->map, 16);
- WBUFB (buf, 28 + c * 46 + 44) = (m->leader) ? 0 : 1;
- WBUFB (buf, 28 + c * 46 + 45) = (m->online) ? 0 : 1;
+ WBUFL(buf, 28 + c * 46) = m->account_id;
+ memcpy(WBUFP(buf, 28 + c * 46 + 4), m->name, 24);
+ memcpy(WBUFP(buf, 28 + c * 46 + 28), m->map, 16);
+ WBUFB(buf, 28 + c * 46 + 44) = (m->leader) ? 0 : 1;
+ WBUFB(buf, 28 + c * 46 + 45) = (m->online) ? 0 : 1;
c++;
}
}
- WBUFW (buf, 2) = 28 + c * 46;
+ WBUFW(buf, 2) = 28 + c * 46;
if (fd >= 0)
{ // fdが設定されてるならそれに送る
- memcpy (WFIFOP (fd, 0), buf, WBUFW (buf, 2));
- WFIFOSET (fd, WFIFOW (fd, 2));
+ memcpy(WFIFOP(fd, 0), buf, WBUFW(buf, 2));
+ WFIFOSET(fd, WFIFOW(fd, 2));
return 9;
}
if (sd != NULL)
- clif_send (buf, WBUFW (buf, 2), &sd->bl, PARTY);
+ clif_send(buf, WBUFW(buf, 2), &sd->bl, SendWho::PARTY);
return 0;
}
@@ -5287,24 +3343,24 @@ int clif_party_info (struct party *p, int fd)
* (R 00fe <sender_ID>.l <party_name>.24B)
*------------------------------------------
*/
-int clif_party_invite (struct map_session_data *sd,
+int clif_party_invite(struct map_session_data *sd,
struct map_session_data *tsd)
{
- int fd;
+ int fd;
struct party *p;
- nullpo_retr (0, sd);
- nullpo_retr (0, tsd);
+ nullpo_ret(sd);
+ nullpo_ret(tsd);
fd = tsd->fd;
- if (!(p = party_search (sd->status.party_id)))
+ if (!(p = party_search(sd->status.party_id)))
return 0;
- WFIFOW (fd, 0) = 0xfe;
- WFIFOL (fd, 2) = sd->status.account_id;
- memcpy (WFIFOP (fd, 6), p->name, 24);
- WFIFOSET (fd, packet_len_table[0xfe]);
+ WFIFOW(fd, 0) = 0xfe;
+ WFIFOL(fd, 2) = sd->status.account_id;
+ memcpy(WFIFOP(fd, 6), p->name, 24);
+ WFIFOSET(fd, clif_parse_func_table[0xfe].len);
return 0;
}
@@ -5322,17 +3378,17 @@ int clif_party_invite (struct map_session_data *sd,
* 4 The character is in the same party.
*------------------------------------------
*/
-int clif_party_inviteack (struct map_session_data *sd, const char *nick, int flag)
+int clif_party_inviteack(struct map_session_data *sd, const char *nick, int flag)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xfd;
- memcpy (WFIFOP (fd, 2), nick, 24);
- WFIFOB (fd, 26) = flag;
- WFIFOSET (fd, packet_len_table[0xfd]);
+ WFIFOW(fd, 0) = 0xfd;
+ memcpy(WFIFOP(fd, 2), nick, 24);
+ WFIFOB(fd, 26) = flag;
+ WFIFOSET(fd, clif_parse_func_table[0xfd].len);
return 0;
}
@@ -5343,32 +3399,32 @@ int clif_party_inviteack (struct map_session_data *sd, const char *nick, int fla
* 0x100=一人にのみ送信
*------------------------------------------
*/
-int clif_party_option (struct party *p, struct map_session_data *sd, int flag)
+int clif_party_option(struct party *p, struct map_session_data *sd, int flag)
{
unsigned char buf[16];
- nullpo_retr (0, p);
+ nullpo_ret(p);
// if(battle_config.etc_log)
-// printf("clif_party_option: %d %d %d\n",p->exp,p->item,flag);
+// PRINTF("clif_party_option: %d %d %d\n",p->exp,p->item,flag);
if (sd == NULL && flag == 0)
{
- int i;
+ int i;
for (i = 0; i < MAX_PARTY; i++)
- if ((sd = map_id2sd (p->member[i].account_id)) != NULL)
+ if ((sd = map_id2sd(p->member[i].account_id)) != NULL)
break;
}
if (sd == NULL)
return 0;
- WBUFW (buf, 0) = 0x101;
- WBUFW (buf, 2) = ((flag & 0x01) ? 2 : p->exp);
- WBUFW (buf, 4) = ((flag & 0x10) ? 2 : p->item);
+ WBUFW(buf, 0) = 0x101;
+ WBUFW(buf, 2) = ((flag & 0x01) ? 2 : p->exp);
+ WBUFW(buf, 4) = ((flag & 0x10) ? 2 : p->item);
if (flag == 0)
- clif_send (buf, packet_len_table[0x101], &sd->bl, PARTY);
+ clif_send(buf, clif_parse_func_table[0x101].len, &sd->bl, SendWho::PARTY);
else
{
- memcpy (WFIFOP (sd->fd, 0), buf, packet_len_table[0x101]);
- WFIFOSET (sd->fd, packet_len_table[0x101]);
+ memcpy(WFIFOP(sd->fd, 0), buf, clif_parse_func_table[0x101].len);
+ WFIFOSET(sd->fd, clif_parse_func_table[0x101].len);
}
return 0;
}
@@ -5377,18 +3433,18 @@ int clif_party_option (struct party *p, struct map_session_data *sd, int flag)
* パーティ脱退(脱退前に呼ぶこと)
*------------------------------------------
*/
-int clif_party_leaved (struct party *p, struct map_session_data *sd,
+int clif_party_leaved(struct party *p, struct map_session_data *sd,
int account_id, const char *name, int flag)
{
unsigned char buf[64];
- int i;
+ int i;
- nullpo_retr (0, p);
+ nullpo_ret(p);
- WBUFW (buf, 0) = 0x105;
- WBUFL (buf, 2) = account_id;
- memcpy (WBUFP (buf, 6), name, 24);
- WBUFB (buf, 30) = flag & 0x0f;
+ WBUFW(buf, 0) = 0x105;
+ WBUFL(buf, 2) = account_id;
+ memcpy(WBUFP(buf, 6), name, 24);
+ WBUFB(buf, 30) = flag & 0x0f;
if ((flag & 0xf0) == 0)
{
@@ -5397,12 +3453,12 @@ int clif_party_leaved (struct party *p, struct map_session_data *sd,
if ((sd = p->member[i].sd) != NULL)
break;
if (sd != NULL)
- clif_send (buf, packet_len_table[0x105], &sd->bl, PARTY);
+ clif_send(buf, clif_parse_func_table[0x105].len, &sd->bl, SendWho::PARTY);
}
else if (sd != NULL)
{
- memcpy (WFIFOP (sd->fd, 0), buf, packet_len_table[0x105]);
- WFIFOSET (sd->fd, packet_len_table[0x105]);
+ memcpy(WFIFOP(sd->fd, 0), buf, clif_parse_func_table[0x105].len);
+ WFIFOSET(sd->fd, clif_parse_func_table[0x105].len);
}
return 0;
}
@@ -5411,12 +3467,13 @@ int clif_party_leaved (struct party *p, struct map_session_data *sd,
* パーティメッセージ送信
*------------------------------------------
*/
-int clif_party_message (struct party *p, int account_id, const char *mes, int len)
+int clif_party_message(struct party *p, int account_id, const char *mes, int len)
{
- struct map_session_data *sd;
- int i;
+ // always set, but clang is not smart enough
+ struct map_session_data *sd = nullptr;
+ int i;
- nullpo_retr (0, p);
+ nullpo_ret(p);
for (i = 0; i < MAX_PARTY; i++)
{
@@ -5426,11 +3483,11 @@ int clif_party_message (struct party *p, int account_id, const char *mes, int le
if (sd != NULL)
{
unsigned char buf[1024];
- WBUFW (buf, 0) = 0x109;
- WBUFW (buf, 2) = len + 8;
- WBUFL (buf, 4) = account_id;
- memcpy (WBUFP (buf, 8), mes, len);
- clif_send (buf, len + 8, &sd->bl, PARTY);
+ WBUFW(buf, 0) = 0x109;
+ WBUFW(buf, 2) = len + 8;
+ WBUFL(buf, 4) = account_id;
+ memcpy(WBUFP(buf, 8), mes, len);
+ clif_send(buf, len + 8, &sd->bl, SendWho::PARTY);
}
return 0;
}
@@ -5439,19 +3496,19 @@ int clif_party_message (struct party *p, int account_id, const char *mes, int le
* パーティ座標通知
*------------------------------------------
*/
-int clif_party_xy (struct party *p, struct map_session_data *sd)
+int clif_party_xy(struct party *, struct map_session_data *sd)
{
unsigned char buf[16];
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- WBUFW (buf, 0) = 0x107;
- WBUFL (buf, 2) = sd->status.account_id;
- WBUFW (buf, 6) = sd->bl.x;
- WBUFW (buf, 8) = sd->bl.y;
- clif_send (buf, packet_len_table[0x107], &sd->bl, PARTY_SAMEMAP_WOS);
+ WBUFW(buf, 0) = 0x107;
+ WBUFL(buf, 2) = sd->status.account_id;
+ WBUFW(buf, 6) = sd->bl.x;
+ WBUFW(buf, 8) = sd->bl.y;
+ clif_send(buf, clif_parse_func_table[0x107].len, &sd->bl, SendWho::PARTY_SAMEMAP_WOS);
// if(battle_config.etc_log)
-// printf("clif_party_xy %d\n",sd->status.account_id);
+// PRINTF("clif_party_xy %d\n",sd->status.account_id);
return 0;
}
@@ -5459,44 +3516,20 @@ int clif_party_xy (struct party *p, struct map_session_data *sd)
* パーティHP通知
*------------------------------------------
*/
-int clif_party_hp (struct party *p, struct map_session_data *sd)
+int clif_party_hp(struct party *, struct map_session_data *sd)
{
unsigned char buf[16];
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- WBUFW (buf, 0) = 0x106;
- WBUFL (buf, 2) = sd->status.account_id;
- WBUFW (buf, 6) = (sd->status.hp > 0x7fff) ? 0x7fff : sd->status.hp;
- WBUFW (buf, 8) =
+ WBUFW(buf, 0) = 0x106;
+ WBUFL(buf, 2) = sd->status.account_id;
+ WBUFW(buf, 6) = (sd->status.hp > 0x7fff) ? 0x7fff : sd->status.hp;
+ WBUFW(buf, 8) =
(sd->status.max_hp > 0x7fff) ? 0x7fff : sd->status.max_hp;
- clif_send (buf, packet_len_table[0x106], &sd->bl, PARTY_AREA_WOS);
+ clif_send(buf, clif_parse_func_table[0x106].len, &sd->bl, SendWho::PARTY_AREA_WOS);
// if(battle_config.etc_log)
-// printf("clif_party_hp %d\n",sd->status.account_id);
- return 0;
-}
-
-/*==========================================
- * パーティ場所移動(未使用)
- *------------------------------------------
- */
-int clif_party_move (struct party *p, struct map_session_data *sd, int online)
-{
- unsigned char buf[128];
-
- nullpo_retr (0, sd);
- nullpo_retr (0, p);
-
- WBUFW (buf, 0) = 0x104;
- WBUFL (buf, 2) = sd->status.account_id;
- WBUFL (buf, 6) = 0;
- WBUFW (buf, 10) = sd->bl.x;
- WBUFW (buf, 12) = sd->bl.y;
- WBUFB (buf, 14) = !online;
- memcpy (WBUFP (buf, 15), p->name, 24);
- memcpy (WBUFP (buf, 39), sd->status.name, 24);
- memcpy (WBUFP (buf, 63), map[sd->bl.m].name, 16);
- clif_send (buf, packet_len_table[0x104], &sd->bl, PARTY);
+// PRINTF("clif_party_hp %d\n",sd->status.account_id);
return 0;
}
@@ -5504,199 +3537,22 @@ int clif_party_move (struct party *p, struct map_session_data *sd, int online)
* 攻撃するために移動が必要
*------------------------------------------
*/
-int clif_movetoattack (struct map_session_data *sd, struct block_list *bl)
-{
- int fd;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, bl);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x139;
- WFIFOL (fd, 2) = bl->id;
- WFIFOW (fd, 6) = bl->x;
- WFIFOW (fd, 8) = bl->y;
- WFIFOW (fd, 10) = sd->bl.x;
- WFIFOW (fd, 12) = sd->bl.y;
- WFIFOW (fd, 14) = sd->attackrange;
- WFIFOSET (fd, packet_len_table[0x139]);
- return 0;
-}
-
-/*==========================================
- * 製造エフェクト
- *------------------------------------------
- */
-int clif_produceeffect (struct map_session_data *sd, int flag, int nameid)
+int clif_movetoattack(struct map_session_data *sd, struct block_list *bl)
{
- int view, fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- // 名前の登録と送信を先にしておく
- if (map_charid2nick (sd->status.char_id) == NULL)
- map_addchariddb (sd->status.char_id, sd->status.name);
- clif_solved_charname (sd, sd->status.char_id);
-
- WFIFOW (fd, 0) = 0x18f;
- WFIFOW (fd, 2) = flag;
- if ((view = itemdb_viewid (nameid)) > 0)
- WFIFOW (fd, 4) = view;
- else
- WFIFOW (fd, 4) = nameid;
- WFIFOSET (fd, packet_len_table[0x18f]);
- return 0;
-}
-
-/*==========================================
- * オートスペル リスト送信
- *------------------------------------------
- */
-int clif_autospell (struct map_session_data *sd, int skilllv)
-{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
+ nullpo_ret(bl);
fd = sd->fd;
- WFIFOW (fd, 0) = 0x1cd;
-
- if (skilllv > 0 && pc_checkskill (sd, MG_NAPALMBEAT) > 0)
- WFIFOL (fd, 2) = MG_NAPALMBEAT;
- else
- WFIFOL (fd, 2) = 0x00000000;
- if (skilllv > 1 && pc_checkskill (sd, MG_COLDBOLT) > 0)
- WFIFOL (fd, 6) = MG_COLDBOLT;
- else
- WFIFOL (fd, 6) = 0x00000000;
- if (skilllv > 1 && pc_checkskill (sd, MG_FIREBOLT) > 0)
- WFIFOL (fd, 10) = MG_FIREBOLT;
- else
- WFIFOL (fd, 10) = 0x00000000;
- if (skilllv > 1 && pc_checkskill (sd, MG_LIGHTNINGBOLT) > 0)
- WFIFOL (fd, 14) = MG_LIGHTNINGBOLT;
- else
- WFIFOL (fd, 14) = 0x00000000;
- if (skilllv > 4 && pc_checkskill (sd, MG_SOULSTRIKE) > 0)
- WFIFOL (fd, 18) = MG_SOULSTRIKE;
- else
- WFIFOL (fd, 18) = 0x00000000;
- if (skilllv > 7 && pc_checkskill (sd, MG_FIREBALL) > 0)
- WFIFOL (fd, 22) = MG_FIREBALL;
- else
- WFIFOL (fd, 22) = 0x00000000;
- if (skilllv > 9 && pc_checkskill (sd, MG_FROSTDIVER) > 0)
- WFIFOL (fd, 26) = MG_FROSTDIVER;
- else
- WFIFOL (fd, 26) = 0x00000000;
-
- WFIFOSET (fd, packet_len_table[0x1cd]);
- return 0;
-}
-
-/*==========================================
- * ディボーションの青い糸
- *------------------------------------------
- */
-int clif_devotion (struct map_session_data *sd, int target)
-{
- unsigned char buf[56];
- int n;
-
- nullpo_retr (0, sd);
-
- WBUFW (buf, 0) = 0x1cf;
- WBUFL (buf, 2) = sd->bl.id;
-// WBUFL(buf,6)=target;
- for (n = 0; n < 5; n++)
- WBUFL (buf, 6 + 4 * n) = sd->dev.val2[n];
-// WBUFL(buf,10+4*n)=0;
- WBUFB (buf, 26) = 8;
- WBUFB (buf, 27) = 0;
-
- clif_send (buf, packet_len_table[0x1cf], &sd->bl, AREA);
- return 0;
-}
-
-/*==========================================
- * 氣球
- *------------------------------------------
- */
-int clif_spiritball (struct map_session_data *sd)
-{
- unsigned char buf[16];
-
- nullpo_retr (0, sd);
-
- WBUFW (buf, 0) = 0x1d0;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFW (buf, 6) = sd->spiritball;
- clif_send (buf, packet_len_table[0x1d0], &sd->bl, AREA);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_combo_delay (struct block_list *bl, int wait)
-{
- unsigned char buf[32];
-
- nullpo_retr (0, bl);
-
- WBUFW (buf, 0) = 0x1d2;
- WBUFL (buf, 2) = bl->id;
- WBUFL (buf, 6) = wait;
- clif_send (buf, packet_len_table[0x1d2], bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- *白刃取り
- *------------------------------------------
- */
-int clif_bladestop (struct block_list *src, struct block_list *dst, int boolean)
-{
- unsigned char buf[32];
-
- nullpo_retr (0, src);
- nullpo_retr (0, dst);
-
- WBUFW (buf, 0) = 0x1d1;
- WBUFL (buf, 2) = src->id;
- WBUFL (buf, 6) = dst->id;
- WBUFL (buf, 10) = boolean;
-
- clif_send (buf, packet_len_table[0x1d1], src, AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changemapcell (int m, int x, int y, int cell_type, int type)
-{
- struct block_list bl;
- uint8_t buf[32];
-
- bl.m = m;
- bl.x = x;
- bl.y = y;
- WBUFW (buf, 0) = 0x192;
- WBUFW (buf, 2) = x;
- WBUFW (buf, 4) = y;
- WBUFW (buf, 6) = cell_type;
- memcpy (WBUFP (buf, 8), map[m].name, 16);
- if (!type)
- clif_send (buf, packet_len_table[0x192], &bl, AREA);
- else
- clif_send (buf, packet_len_table[0x192], &bl, ALL_SAMEMAP);
-
+ WFIFOW(fd, 0) = 0x139;
+ WFIFOL(fd, 2) = bl->id;
+ WFIFOW(fd, 6) = bl->x;
+ WFIFOW(fd, 8) = bl->y;
+ WFIFOW(fd, 10) = sd->bl.x;
+ WFIFOW(fd, 12) = sd->bl.y;
+ WFIFOW(fd, 14) = sd->attackrange;
+ WFIFOSET(fd, clif_parse_func_table[0x139].len);
return 0;
}
@@ -5704,764 +3560,15 @@ int clif_changemapcell (int m, int x, int y, int cell_type, int type)
* MVPエフェクト
*------------------------------------------
*/
-int clif_mvp_effect (struct map_session_data *sd)
+int clif_mvp_effect(struct map_session_data *sd)
{
unsigned char buf[16];
- nullpo_retr (0, sd);
-
- WBUFW (buf, 0) = 0x10c;
- WBUFL (buf, 2) = sd->bl.id;
- clif_send (buf, packet_len_table[0x10c], &sd->bl, AREA);
- return 0;
-}
+ nullpo_ret(sd);
-/*==========================================
- * MVPアイテム所得
- *------------------------------------------
- */
-int clif_mvp_item (struct map_session_data *sd, int nameid)
-{
- int view, fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x10a;
- if ((view = itemdb_viewid (nameid)) > 0)
- WFIFOW (fd, 2) = view;
- else
- WFIFOW (fd, 2) = nameid;
- WFIFOSET (fd, packet_len_table[0x10a]);
- return 0;
-}
-
-/*==========================================
- * MVP経験値所得
- *------------------------------------------
- */
-int clif_mvp_exp (struct map_session_data *sd, int exp)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x10b;
- WFIFOL (fd, 2) = exp;
- WFIFOSET (fd, packet_len_table[0x10b]);
- return 0;
-}
-
-/*==========================================
- * ギルド作成可否通知
- * Relay the result of guild creation.
- *
- * (R 0167 <flag>.B)
- *
- * flag:
- * 0 The guild was created.
- * 1 The character is already in a guild.
- * 2 The guild name is invalid/taken.
- * 3 The Emperium item is required.
- *------------------------------------------
- */
-int clif_guild_created (struct map_session_data *sd, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x167;
- WFIFOB (fd, 2) = flag;
- WFIFOSET (fd, packet_len_table[0x167]);
- return 0;
-}
-
-/*==========================================
- * ギルド所属通知
- *------------------------------------------
- */
-int clif_guild_belonginfo (struct map_session_data *sd, struct guild *g)
-{
- int ps, fd;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, g);
-
- fd = sd->fd;
- ps = guild_getposition (sd, g);
-
- memset (WFIFOP (fd, 0), 0, packet_len_table[0x16c]);
- WFIFOW (fd, 0) = 0x16c;
- WFIFOL (fd, 2) = g->guild_id;
- WFIFOL (fd, 6) = g->emblem_id;
- WFIFOL (fd, 10) = g->position[ps].mode;
- memcpy (WFIFOP (fd, 19), g->name, 24);
- WFIFOSET (fd, packet_len_table[0x16c]);
- return 0;
-}
-
-/*==========================================
- * ギルドメンバログイン通知
- *------------------------------------------
- */
-int clif_guild_memberlogin_notice (struct guild *g, int idx, int flag)
-{
- unsigned char buf[64];
-
- nullpo_retr (0, g);
-
- WBUFW (buf, 0) = 0x16d;
- WBUFL (buf, 2) = g->member[idx].account_id;
- WBUFL (buf, 6) = 0;
- WBUFL (buf, 10) = flag;
- if (g->member[idx].sd == NULL)
- {
- struct map_session_data *sd = guild_getavailablesd (g);
- if (sd != NULL)
- clif_send (buf, packet_len_table[0x16d], &sd->bl, GUILD);
- }
- else
- clif_send (buf, packet_len_table[0x16d], &g->member[idx].sd->bl,
- GUILD_WOS);
- return 0;
-}
-
-/*==========================================
- * ギルドマスター通知(14dへの応答)
- *------------------------------------------
- */
-static
-int clif_guild_masterormember (struct map_session_data *sd)
-{
- int type = 0x57, fd;
- struct guild *g;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- g = guild_search (sd->status.guild_id);
- if (g != NULL && strcmp (g->master, sd->status.name) == 0)
- type = 0xd7;
- WFIFOW (fd, 0) = 0x14e;
- WFIFOL (fd, 2) = type;
- WFIFOSET (fd, packet_len_table[0x14e]);
- return 0;
-}
-
-/*==========================================
- * Basic Info (Territories [Valaris])
- *------------------------------------------
- */
-int clif_guild_basicinfo (struct map_session_data *sd)
-{
- int fd, i, t = 0;
- struct guild *g;
- struct guild_castle *gc = NULL;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- g = guild_search (sd->status.guild_id);
- if (g == NULL)
- return 0;
-
- WFIFOW (fd, 0) = 0x1b6; //0x150;
- WFIFOL (fd, 2) = g->guild_id;
- WFIFOL (fd, 6) = g->guild_lv;
- WFIFOL (fd, 10) = g->connect_member;
- WFIFOL (fd, 14) = g->max_member;
- WFIFOL (fd, 18) = g->average_lv;
- WFIFOL (fd, 22) = g->exp;
- WFIFOL (fd, 26) = g->next_exp;
- WFIFOL (fd, 30) = 0; // 上納
- WFIFOL (fd, 34) = 0; // VW(性格の悪さ?:性向グラフ左右)
- WFIFOL (fd, 38) = 0; // RF(正義の度合い?:性向グラフ上下)
- WFIFOL (fd, 42) = 0; // 人数?
- memcpy (WFIFOP (fd, 46), g->name, 24);
- memcpy (WFIFOP (fd, 70), g->master, 24);
-
- for (i = 0; i < MAX_GUILDCASTLE; i++)
- {
- gc = guild_castle_search (i);
- if (!gc)
- continue;
- if (g->guild_id == gc->guild_id)
- t++;
- }
-
- if (t == 1)
- memcpy (WFIFOP (fd, 94), "One Castle", 20);
- else if (t == 2)
- memcpy (WFIFOP (fd, 94), "Two Castles", 20);
- else if (t == 3)
- memcpy (WFIFOP (fd, 94), "Three Castles", 20);
- else if (t == 4)
- memcpy (WFIFOP (fd, 94), "Four Castles", 20);
- else if (t == 5)
- memcpy (WFIFOP (fd, 94), "Five Castles", 20);
- else if (t == 6)
- memcpy (WFIFOP (fd, 94), "Six Castles", 20);
- else if (t == 7)
- memcpy (WFIFOP (fd, 94), "Seven Castles", 20);
- else if (t == 8)
- memcpy (WFIFOP (fd, 94), "Eight Castles", 20);
- else if (t == 9)
- memcpy (WFIFOP (fd, 94), "Nine Castles", 20);
- else if (t == 10)
- memcpy (WFIFOP (fd, 94), "Ten Castles", 20);
- else if (t == 11)
- memcpy (WFIFOP (fd, 94), "Eleven Castles", 20);
- else if (t == 12)
- memcpy (WFIFOP (fd, 94), "Twelve Castles", 20);
- else if (t == 13)
- memcpy (WFIFOP (fd, 94), "Thirteen Castles", 20);
- else if (t == 14)
- memcpy (WFIFOP (fd, 94), "Fourteen Castles", 20);
- else if (t == 15)
- memcpy (WFIFOP (fd, 94), "Fifteen Castles", 20);
- else if (t == 16)
- memcpy (WFIFOP (fd, 94), "Sixteen Castles", 20);
- else if (t == 17)
- memcpy (WFIFOP (fd, 94), "Seventeen Castles", 20);
- else if (t == 18)
- memcpy (WFIFOP (fd, 94), "Eighteen Castles", 20);
- else if (t == 19)
- memcpy (WFIFOP (fd, 94), "Nineteen Castles", 20);
- else if (t == 20)
- memcpy (WFIFOP (fd, 94), "Twenty Castles", 20);
- else if (t == 21)
- memcpy (WFIFOP (fd, 94), "Twenty One Castles", 20);
- else if (t == 22)
- memcpy (WFIFOP (fd, 94), "Twenty Two Castles", 20);
- else if (t == 23)
- memcpy (WFIFOP (fd, 94), "Twenty Three Castles", 20);
- else if (t == 24)
- memcpy (WFIFOP (fd, 94), "Twenty Four Castles", 20);
- else if (t == MAX_GUILDCASTLE)
- memcpy (WFIFOP (fd, 94), "Total Domination", 20);
- else
- memcpy (WFIFOP (fd, 94), "None Taken", 20);
-
- WFIFOSET (fd, packet_len_table[WFIFOW (fd, 0)]);
- clif_guild_emblem (sd, g); // Guild emblem vanish fix [Valaris]
- return 0;
-}
-
-/*==========================================
- * ギルド同盟/敵対情報
- *------------------------------------------
- */
-int clif_guild_allianceinfo (struct map_session_data *sd)
-{
- int fd, i, c;
- struct guild *g;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- g = guild_search (sd->status.guild_id);
- if (g == NULL)
- return 0;
- WFIFOW (fd, 0) = 0x14c;
- for (i = c = 0; i < MAX_GUILDALLIANCE; i++)
- {
- GuildAlliance *a = &g->alliance[i];
- if (a->guild_id > 0)
- {
- WFIFOL (fd, c * 32 + 4) = a->opposition;
- WFIFOL (fd, c * 32 + 8) = a->guild_id;
- memcpy (WFIFOP (fd, c * 32 + 12), a->name, 24);
- c++;
- }
- }
- WFIFOW (fd, 2) = c * 32 + 4;
- WFIFOSET (fd, WFIFOW (fd, 2));
- return 0;
-}
-
-/*==========================================
- * ギルドメンバーリスト
- *------------------------------------------
- */
-int clif_guild_memberlist (struct map_session_data *sd)
-{
- int fd;
- int i, c;
- struct guild *g;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- g = guild_search (sd->status.guild_id);
- if (g == NULL)
- return 0;
-
- WFIFOW (fd, 0) = 0x154;
- for (i = 0, c = 0; i < g->max_member; i++)
- {
- struct guild_member *m = &g->member[i];
- if (m->account_id == 0)
- continue;
- WFIFOL (fd, c * 104 + 4) = m->account_id;
- WFIFOL (fd, c * 104 + 8) = 0;
- WFIFOW (fd, c * 104 + 12) = m->hair;
- WFIFOW (fd, c * 104 + 14) = m->hair_color;
- WFIFOW (fd, c * 104 + 16) = m->gender;
- WFIFOW (fd, c * 104 + 18) = m->pc_class;
- WFIFOW (fd, c * 104 + 20) = m->lv;
- WFIFOL (fd, c * 104 + 22) = m->exp;
- WFIFOL (fd, c * 104 + 26) = m->online;
- WFIFOL (fd, c * 104 + 30) = m->position;
- memset (WFIFOP (fd, c * 104 + 34), 0, 50); // メモ?
- memcpy (WFIFOP (fd, c * 104 + 84), m->name, 24);
- c++;
- }
- WFIFOW (fd, 2) = c * 104 + 4;
- WFIFOSET (fd, WFIFOW (fd, 2));
- return 0;
-}
-
-/*==========================================
- * ギルド役職名リスト
- *------------------------------------------
- */
-static
-int clif_guild_positionnamelist (struct map_session_data *sd)
-{
- int i, fd;
- struct guild *g;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- g = guild_search (sd->status.guild_id);
- if (g == NULL)
- return 0;
- WFIFOW (fd, 0) = 0x166;
- for (i = 0; i < MAX_GUILDPOSITION; i++)
- {
- WFIFOL (fd, i * 28 + 4) = i;
- memcpy (WFIFOP (fd, i * 28 + 8), g->position[i].name, 24);
- }
- WFIFOW (fd, 2) = i * 28 + 4;
- WFIFOSET (fd, WFIFOW (fd, 2));
- return 0;
-}
-
-/*==========================================
- * ギルド役職情報リスト
- *------------------------------------------
- */
-static
-int clif_guild_positioninfolist (struct map_session_data *sd)
-{
- int i, fd;
- struct guild *g;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- g = guild_search (sd->status.guild_id);
- if (g == NULL)
- return 0;
- WFIFOW (fd, 0) = 0x160;
- for (i = 0; i < MAX_GUILDPOSITION; i++)
- {
- struct guild_position *p = &g->position[i];
- WFIFOL (fd, i * 16 + 4) = i;
- WFIFOL (fd, i * 16 + 8) = p->mode;
- WFIFOL (fd, i * 16 + 12) = i;
- WFIFOL (fd, i * 16 + 16) = p->exp_mode;
- }
- WFIFOW (fd, 2) = i * 16 + 4;
- WFIFOSET (fd, WFIFOW (fd, 2));
- return 0;
-}
-
-/*==========================================
- * ギルド役職変更通知
- *------------------------------------------
- */
-int clif_guild_positionchanged (struct guild *g, int idx)
-{
- struct map_session_data *sd;
- unsigned char buf[128];
-
- nullpo_retr (0, g);
-
- WBUFW (buf, 0) = 0x174;
- WBUFW (buf, 2) = 44;
- WBUFL (buf, 4) = idx;
- WBUFL (buf, 8) = g->position[idx].mode;
- WBUFL (buf, 12) = idx;
- WBUFL (buf, 16) = g->position[idx].exp_mode;
- memcpy (WBUFP (buf, 20), g->position[idx].name, 24);
- if ((sd = guild_getavailablesd (g)) != NULL)
- clif_send (buf, WBUFW (buf, 2), &sd->bl, GUILD);
- return 0;
-}
-
-/*==========================================
- * ギルドメンバ変更通知
- *------------------------------------------
- */
-int clif_guild_memberpositionchanged (struct guild *g, int idx)
-{
- struct map_session_data *sd;
- unsigned char buf[64];
-
- nullpo_retr (0, g);
-
- WBUFW (buf, 0) = 0x156;
- WBUFW (buf, 2) = 16;
- WBUFL (buf, 4) = g->member[idx].account_id;
- WBUFL (buf, 8) = 0;
- WBUFL (buf, 12) = g->member[idx].position;
- if ((sd = guild_getavailablesd (g)) != NULL)
- clif_send (buf, WBUFW (buf, 2), &sd->bl, GUILD);
- return 0;
-}
-
-/*==========================================
- * ギルドエンブレム送信
- *------------------------------------------
- */
-int clif_guild_emblem (struct map_session_data *sd, struct guild *g)
-{
- int fd;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, g);
-
- fd = sd->fd;
-
- if (g->emblem_len <= 0)
- return 0;
- WFIFOW (fd, 0) = 0x152;
- WFIFOW (fd, 2) = g->emblem_len + 12;
- WFIFOL (fd, 4) = g->guild_id;
- WFIFOL (fd, 8) = g->emblem_id;
- memcpy (WFIFOP (fd, 12), g->emblem_data, g->emblem_len);
- WFIFOSET (fd, WFIFOW (fd, 2));
- return 0;
-}
-
-/*==========================================
- * ギルドスキル送信
- *------------------------------------------
- */
-int clif_guild_skillinfo (struct map_session_data *sd)
-{
- int fd;
- int i, id, c;
- struct guild *g;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- g = guild_search (sd->status.guild_id);
- if (g == NULL)
- return 0;
- WFIFOW (fd, 0) = 0x0162;
- WFIFOW (fd, 4) = g->skill_point;
- for (i = c = 0; i < MAX_GUILDSKILL; i++)
- {
- if (g->skill[i].id > 0)
- {
- WFIFOW (fd, c * 37 + 6) = id = g->skill[i].id;
- WFIFOW (fd, c * 37 + 8) = guild_skill_get_inf (id);
- WFIFOW (fd, c * 37 + 10) = 0;
- WFIFOW (fd, c * 37 + 12) = g->skill[i].lv;
- WFIFOW (fd, c * 37 + 14) =
- guild_skill_get_sp (id, g->skill[i].lv);
- WFIFOW (fd, c * 37 + 16) = guild_skill_get_range (id);
- memset (WFIFOP (fd, c * 37 + 18), 0, 24);
- WFIFOB (fd, c * 37 + 42) = //up;
- (g->skill[i].lv < guild_skill_get_max (id)) ? 1 : 0;
- c++;
- }
- }
- WFIFOW (fd, 2) = c * 37 + 6;
- WFIFOSET (fd, WFIFOW (fd, 2));
- return 0;
-}
-
-/*==========================================
- * ギルド告知送信
- *------------------------------------------
- */
-int clif_guild_notice (struct map_session_data *sd, struct guild *g)
-{
- int fd;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, g);
-
- fd = sd->fd;
- if (*g->mes1 == 0 && *g->mes2 == 0)
- return 0;
- WFIFOW (fd, 0) = 0x16f;
- memcpy (WFIFOP (fd, 2), g->mes1, 60);
- memcpy (WFIFOP (fd, 62), g->mes2, 120);
- WFIFOSET (fd, packet_len_table[0x16f]);
- return 0;
-}
-
-/*==========================================
- * ギルドメンバ勧誘
- *------------------------------------------
- */
-int clif_guild_invite (struct map_session_data *sd, struct guild *g)
-{
- int fd;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, g);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x16a;
- WFIFOL (fd, 2) = g->guild_id;
- memcpy (WFIFOP (fd, 6), g->name, 24);
- WFIFOSET (fd, packet_len_table[0x16a]);
- return 0;
-}
-
-/*==========================================
- * ギルドメンバ勧誘結果
- *------------------------------------------
- */
-int clif_guild_inviteack (struct map_session_data *sd, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x169;
- WFIFOB (fd, 2) = flag;
- WFIFOSET (fd, packet_len_table[0x169]);
- return 0;
-}
-
-/*==========================================
- * ギルドメンバ脱退通知
- *------------------------------------------
- */
-int clif_guild_leave (struct map_session_data *sd, const char *name,
- const char *mes)
-{
- unsigned char buf[128];
-
- nullpo_retr (0, sd);
-
- WBUFW (buf, 0) = 0x15a;
- memcpy (WBUFP (buf, 2), name, 24);
- memcpy (WBUFP (buf, 26), mes, 40);
- clif_send (buf, packet_len_table[0x15a], &sd->bl, GUILD);
- return 0;
-}
-
-/*==========================================
- * ギルドメンバ追放通知
- *------------------------------------------
- */
-int clif_guild_explusion (struct map_session_data *sd, const char *name,
- const char *mes, int account_id)
-{
- unsigned char buf[128];
-
- nullpo_retr (0, sd);
-
- WBUFW (buf, 0) = 0x15c;
- memcpy (WBUFP (buf, 2), name, 24);
- memcpy (WBUFP (buf, 26), mes, 40);
- memcpy (WBUFP (buf, 66), "dummy", 24);
- clif_send (buf, packet_len_table[0x15c], &sd->bl, GUILD);
- return 0;
-}
-
-/*==========================================
- * ギルド追放メンバリスト
- *------------------------------------------
- */
-static
-int clif_guild_explusionlist (struct map_session_data *sd)
-{
- int fd;
- int i, c;
- struct guild *g;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- g = guild_search (sd->status.guild_id);
- if (g == NULL)
- return 0;
- WFIFOW (fd, 0) = 0x163;
- for (i = c = 0; i < MAX_GUILDEXPLUSION; i++)
- {
- GuildExpulsion *e = &g->explusion[i];
- if (e->account_id > 0)
- {
- memcpy (WFIFOP (fd, c * 88 + 4), e->name, 24);
- memcpy (WFIFOP (fd, c * 88 + 28), e->acc, 24);
- memcpy (WFIFOP (fd, c * 88 + 52), e->mes, 44);
- c++;
- }
- }
- WFIFOW (fd, 2) = c * 88 + 4;
- WFIFOSET (fd, WFIFOW (fd, 2));
- return 0;
-}
-
-/*==========================================
- * ギルド会話
- *------------------------------------------
- */
-int clif_guild_message (struct guild *g, int account_id, const char *mes,
- int len)
-{
- struct map_session_data *sd;
- unsigned char lbuf[255];
- unsigned char *buf = lbuf;
- if (len + 32 >= sizeof (lbuf))
- buf = (unsigned char *)malloc (len + 32);
- WBUFW (buf, 0) = 0x17f;
- WBUFW (buf, 2) = len + 4;
- memcpy (WBUFP (buf, 4), mes, len);
-
- if ((sd = guild_getavailablesd (g)) != NULL)
- clif_send (buf, WBUFW (buf, 2), &sd->bl, GUILD);
- if (buf != lbuf)
- free (buf);
- return 0;
-}
-
-/*==========================================
- * ギルドスキル割り振り通知
- *------------------------------------------
- */
-int clif_guild_skillup (struct map_session_data *sd, int skill_num, int lv)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x10e;
- WFIFOW (fd, 2) = skill_num;
- WFIFOW (fd, 4) = lv;
- WFIFOW (fd, 6) = guild_skill_get_sp (skill_num, lv);
- WFIFOW (fd, 8) = guild_skill_get_range (skill_num);
- WFIFOB (fd, 10) = 1;
- WFIFOSET (fd, 11);
- return 0;
-}
-
-/*==========================================
- * ギルド同盟要請
- *------------------------------------------
- */
-int clif_guild_reqalliance (struct map_session_data *sd, int account_id,
- const char *name)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x171;
- WFIFOL (fd, 2) = account_id;
- memcpy (WFIFOP (fd, 6), name, 24);
- WFIFOSET (fd, packet_len_table[0x171]);
- return 0;
-}
-
-/*==========================================
- * ギルド同盟結果
- *------------------------------------------
- */
-int clif_guild_allianceack (struct map_session_data *sd, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x173;
- WFIFOL (fd, 2) = flag;
- WFIFOSET (fd, packet_len_table[0x173]);
- return 0;
-}
-
-/*==========================================
- * ギルド関係解消通知
- *------------------------------------------
- */
-int clif_guild_delalliance (struct map_session_data *sd, int guild_id,
- int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x184;
- WFIFOL (fd, 2) = guild_id;
- WFIFOL (fd, 6) = flag;
- WFIFOSET (fd, packet_len_table[0x184]);
- return 0;
-}
-
-/*==========================================
- * ギルド敵対結果
- *------------------------------------------
- */
-int clif_guild_oppositionack (struct map_session_data *sd, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x181;
- WFIFOB (fd, 2) = flag;
- WFIFOSET (fd, packet_len_table[0x181]);
- return 0;
-}
-
-/*==========================================
- * ギルド関係追加
- *------------------------------------------
- */
-/*int clif_guild_allianceadded(struct guild *g,int idx)
-{
- unsigned char buf[64];
- WBUFW(fd,0)=0x185;
- WBUFL(fd,2)=g->alliance[idx].opposition;
- WBUFL(fd,6)=g->alliance[idx].guild_id;
- memcpy(WBUFP(fd,10),g->alliance[idx].name,24);
- clif_send(buf,packet_len_table[0x185],guild_getavailablesd(g),GUILD);
- return 0;
-}*/
-
-/*==========================================
- * ギルド解散通知
- *------------------------------------------
- */
-int clif_guild_broken (struct map_session_data *sd, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x15e;
- WFIFOL (fd, 2) = flag;
- WFIFOSET (fd, packet_len_table[0x15e]);
+ WBUFW(buf, 0) = 0x10c;
+ WBUFL(buf, 2) = sd->bl.id;
+ clif_send(buf, clif_parse_func_table[0x10c].len, &sd->bl, SendWho::AREA);
return 0;
}
@@ -6469,261 +3576,120 @@ int clif_guild_broken (struct map_session_data *sd, int flag)
* エモーション
*------------------------------------------
*/
-void clif_emotion (struct block_list *bl, int type)
+void clif_emotion(struct block_list *bl, int type)
{
unsigned char buf[8];
- nullpo_retv (bl);
+ nullpo_retv(bl);
- WBUFW (buf, 0) = 0xc0;
- WBUFL (buf, 2) = bl->id;
- WBUFB (buf, 6) = type;
- clif_send (buf, packet_len_table[0xc0], bl, AREA);
+ WBUFW(buf, 0) = 0xc0;
+ WBUFL(buf, 2) = bl->id;
+ WBUFB(buf, 6) = type;
+ clif_send(buf, clif_parse_func_table[0xc0].len, bl, SendWho::AREA);
}
-static void clif_emotion_towards (struct block_list *bl,
+static
+void clif_emotion_towards(struct block_list *bl,
struct block_list *target, int type)
{
unsigned char buf[8];
- int len = packet_len_table[0xc0];
+ int len = clif_parse_func_table[0xc0].len;
struct map_session_data *sd = (struct map_session_data *) target;
- nullpo_retv (bl);
- nullpo_retv (target);
+ nullpo_retv(bl);
+ nullpo_retv(target);
- if (target->type != BL_PC)
+ if (target->type != BL::PC)
return;
- WBUFW (buf, 0) = 0xc0;
- WBUFL (buf, 2) = bl->id;
- WBUFB (buf, 6) = type;
-
- memcpy (WFIFOP (sd->fd, 0), buf, len);
- WFIFOSET (sd->fd, len);
-}
-
-/*==========================================
- * トーキーボックス
- *------------------------------------------
- */
-void clif_talkiebox (struct block_list *bl, const char *talkie)
-{
- unsigned char buf[86];
-
- nullpo_retv (bl);
+ WBUFW(buf, 0) = 0xc0;
+ WBUFL(buf, 2) = bl->id;
+ WBUFB(buf, 6) = type;
- WBUFW (buf, 0) = 0x191;
- WBUFL (buf, 2) = bl->id;
- memcpy (WBUFP (buf, 6), talkie, 80);
- clif_send (buf, packet_len_table[0x191], bl, AREA);
+ memcpy(WFIFOP(sd->fd, 0), buf, len);
+ WFIFOSET(sd->fd, len);
}
/*==========================================
- * 結婚エフェクト
- *------------------------------------------
- */
-void clif_wedding_effect (struct block_list *bl)
-{
- unsigned char buf[6];
-
- nullpo_retv (bl);
-
- WBUFW (buf, 0) = 0x1ea;
- WBUFL (buf, 2) = bl->id;
- clif_send (buf, packet_len_table[0x1ea], bl, AREA);
-}
-
-/*==========================================
- * あなたに逢いたい使用時名前叫び
- *------------------------------------------
-
-void clif_callpartner(struct map_session_data *sd)
-{
- unsigned char buf[26];
- char *p;
-
- nullpo_retv(sd);
-
- if(sd->status.partner_id){
- WBUFW(buf,0)=0x1e6;
- p = map_charid2nick(sd->status.partner_id);
- if(p){
- memcpy(WBUFP(buf,2),p,24);
- }else{
- map_reqchariddb(sd,sd->status.partner_id);
- chrif_searchcharid(sd->status.partner_id);
- WBUFB(buf,2) = 0;
- }
- clif_send(buf,packet_len_table[0x1e6]&sd->bl,AREA);
- }
- return;
-}
-*/
-/*==========================================
* 座る
*------------------------------------------
*/
-void clif_sitting (int fd, struct map_session_data *sd)
+void clif_sitting(int, struct map_session_data *sd)
{
unsigned char buf[64];
- nullpo_retv (sd);
-
- WBUFW (buf, 0) = 0x8a;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFB (buf, 26) = 2;
- clif_send (buf, packet_len_table[0x8a], &sd->bl, AREA);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_disp_onlyself (struct map_session_data *sd, const char *mes, int len)
-{
- unsigned char lbuf[255];
- unsigned char *buf =
- (len + 32 >= sizeof (lbuf)) ? (unsigned char *)malloc (len + 32) : lbuf;
-
- nullpo_retr (0, sd);
-
- WBUFW (buf, 0) = 0x17f;
- WBUFW (buf, 2) = len + 8;
- memcpy (WBUFP (buf, 4), mes, len + 4);
-
- clif_send (buf, WBUFW (buf, 2), &sd->bl, SELF);
+ nullpo_retv(sd);
- if (buf != lbuf)
- free (buf);
-
- return 0;
+ WBUFW(buf, 0) = 0x8a;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFB(buf, 26) = 2;
+ clif_send(buf, clif_parse_func_table[0x8a].len, &sd->bl, SendWho::AREA);
}
/*==========================================
*
*------------------------------------------
*/
-
-int clif_GM_kickack (struct map_session_data *sd, int id)
+static
+int clif_GM_kickack(struct map_session_data *sd, int id)
{
- int fd;
+ int fd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
fd = sd->fd;
- WFIFOW (fd, 0) = 0xcd;
- WFIFOL (fd, 2) = id;
- WFIFOSET (fd, packet_len_table[0xcd]);
+ WFIFOW(fd, 0) = 0xcd;
+ WFIFOL(fd, 2) = id;
+ WFIFOSET(fd, clif_parse_func_table[0xcd].len);
return 0;
}
-void clif_parse_QuitGame (int fd, struct map_session_data *sd);
+static
+void clif_parse_QuitGame(int fd, struct map_session_data *sd);
-int clif_GM_kick (struct map_session_data *sd, struct map_session_data *tsd,
+int clif_GM_kick(struct map_session_data *sd, struct map_session_data *tsd,
int type)
{
- nullpo_retr (0, tsd);
+ nullpo_ret(tsd);
if (type)
- clif_GM_kickack (sd, tsd->status.account_id);
- tsd->opt1 = tsd->opt2 = 0;
- clif_parse_QuitGame (tsd->fd, tsd);
-
- return 0;
-}
-
-/*==========================================
- * Wis拒否許可応答
- *------------------------------------------
- */
-static
-int clif_wisexin (struct map_session_data *sd, int type, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0xd1;
- WFIFOB (fd, 2) = type;
- WFIFOB (fd, 3) = flag;
- WFIFOSET (fd, packet_len_table[0xd1]);
-
- return 0;
-}
-
-/*==========================================
- * Wis全拒否許可応答
- *------------------------------------------
- */
-static
-int clif_wisall (struct map_session_data *sd, int type, int flag)
-{
- int fd;
-
- nullpo_retr (0, sd);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0xd2;
- WFIFOB (fd, 2) = type;
- WFIFOB (fd, 3) = flag;
- WFIFOSET (fd, packet_len_table[0xd2]);
+ clif_GM_kickack(sd, tsd->status.account_id);
+ tsd->opt1 = Opt1::ZERO;
+ tsd->opt2 = Opt2::ZERO;
+ clif_parse_QuitGame(tsd->fd, tsd);
return 0;
}
-/*==========================================
- * サウンドエフェクト
- *------------------------------------------
- */
-void clif_soundeffect (struct map_session_data *sd, struct block_list *bl,
- const char *name, int type)
-{
- int fd;
-
- nullpo_retv (sd);
- nullpo_retv (bl);
-
- fd = sd->fd;
- WFIFOW (fd, 0) = 0x1d3;
- memcpy (WFIFOP (fd, 2), name, 24);
- WFIFOB (fd, 26) = type;
- WFIFOL (fd, 27) = 0;
- WFIFOL (fd, 31) = bl->id;
- WFIFOSET (fd, packet_len_table[0x1d3]);
-
- return;
-}
-
// displaying special effects (npcs, weather, etc) [Valaris]
-int clif_specialeffect (struct block_list *bl, int type, int flag)
+int clif_specialeffect(struct block_list *bl, int type, int flag)
{
unsigned char buf[24];
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- memset (buf, 0, packet_len_table[0x19b]);
+ memset(buf, 0, clif_parse_func_table[0x19b].len);
- WBUFW (buf, 0) = 0x19b;
- WBUFL (buf, 2) = bl->id;
- WBUFL (buf, 6) = type;
+ WBUFW(buf, 0) = 0x19b;
+ WBUFL(buf, 2) = bl->id;
+ WBUFL(buf, 6) = type;
if (flag == 2)
{
struct map_session_data *sd = NULL;
- int i;
+ int i;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (sd = (struct map_session_data *)session[i]->session_data) != NULL
&& sd->state.auth && sd->bl.m == bl->m)
- clif_specialeffect (&sd->bl, type, 1);
+ clif_specialeffect(&sd->bl, type, 1);
}
}
else if (flag == 1)
- clif_send (buf, packet_len_table[0x19b], bl, SELF);
+ clif_send(buf, clif_parse_func_table[0x19b].len, bl, SendWho::SELF);
else if (!flag)
- clif_send (buf, packet_len_table[0x19b], bl, AREA);
+ clif_send(buf, clif_parse_func_table[0x19b].len, bl, SendWho::AREA);
return 0;
@@ -6738,49 +3704,49 @@ int clif_specialeffect (struct block_list *bl, int type, int flag)
*------------------------------------------
*/
static
-void clif_parse_WantToConnection (int fd, struct map_session_data *sd)
+void clif_parse_WantToConnection(int fd, struct map_session_data *sd)
{
struct map_session_data *old_sd;
- int account_id; // account_id in the packet
+ int account_id; // account_id in the packet
if (sd)
{
if (battle_config.error_log)
- printf ("clif_parse_WantToConnection : invalid request?\n");
+ PRINTF("clif_parse_WantToConnection : invalid request?\n");
return;
}
- if (RFIFOW (fd, 0) == 0x72)
+ if (RFIFOW(fd, 0) == 0x72)
{
- account_id = RFIFOL (fd, 2);
+ account_id = RFIFOL(fd, 2);
}
else
return; // Not the auth packet
- WFIFOL (fd, 0) = account_id;
- WFIFOSET (fd, 4);
+ WFIFOL(fd, 0) = account_id;
+ WFIFOSET(fd, 4);
// if same account already connected, we disconnect the 2 sessions
- if ((old_sd = map_id2sd (account_id)) != NULL)
+ if ((old_sd = map_id2sd(account_id)) != NULL)
{
- clif_authfail_fd (fd, 2); // same id
- clif_authfail_fd (old_sd->fd, 2); // same id
- printf
- ("clif_parse_WantToConnection: Double connection for account %d (sessions: #%d (new) and #%d (old)).\n",
+ clif_authfail_fd(fd, 2); // same id
+ clif_authfail_fd(old_sd->fd, 2); // same id
+ PRINTF("clif_parse_WantToConnection: Double connection for account %d (sessions: #%d (new) and #%d (old)).\n",
account_id, fd, old_sd->fd);
}
else
{
- CREATE (sd, struct map_session_data, 1);
+ CREATE(sd, struct map_session_data, 1);
session[fd]->session_data = sd;
sd->fd = fd;
- pc_setnewpc (sd, account_id, RFIFOL (fd, 6), RFIFOL (fd, 10),
- RFIFOL (fd, 14), RFIFOB (fd, 18), fd);
+ pc_setnewpc(sd, account_id, RFIFOL(fd, 6), RFIFOL(fd, 10),
+ tick_t(static_cast<interval_t>(RFIFOL(fd, 14))),
+ RFIFOB(fd, 18));
- map_addiddb (&sd->bl);
+ map_addiddb(&sd->bl);
- chrif_authreq (sd);
+ chrif_authreq(sd);
}
return;
@@ -6792,11 +3758,11 @@ void clif_parse_WantToConnection (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_LoadEndAck (int fd, struct map_session_data *sd)
+void clif_parse_LoadEndAck(int, struct map_session_data *sd)
{
// struct item_data* item;
- int i;
- nullpo_retv (sd);
+ int i;
+ nullpo_retv(sd);
if (sd->bl.prev != NULL)
return;
@@ -6804,144 +3770,88 @@ void clif_parse_LoadEndAck (int fd, struct map_session_data *sd)
// 接続ok時
//clif_authok();
if (sd->npc_id)
- npc_event_dequeue (sd);
- clif_skillinfoblock (sd);
- pc_checkitem (sd);
+ npc_event_dequeue(sd);
+ clif_skillinfoblock(sd);
+ pc_checkitem(sd);
//guild_info();
// loadendack時
// next exp
- clif_updatestatus (sd, SP_NEXTBASEEXP);
- clif_updatestatus (sd, SP_NEXTJOBEXP);
+ clif_updatestatus(sd, SP::NEXTBASEEXP);
+ clif_updatestatus(sd, SP::NEXTJOBEXP);
// skill point
- clif_updatestatus (sd, SP_SKILLPOINT);
+ clif_updatestatus(sd, SP::SKILLPOINT);
// item
- clif_itemlist (sd);
- clif_equiplist (sd);
- // cart
- if (pc_iscarton (sd))
- {
- clif_cart_itemlist (sd);
- clif_cart_equiplist (sd);
- clif_updatestatus (sd, SP_CARTINFO);
- }
+ clif_itemlist(sd);
+ clif_equiplist(sd);
// param all
- clif_initialstatus (sd);
+ clif_initialstatus(sd);
// party
- party_send_movemap (sd);
- // guild
- guild_send_memberinfoshort (sd, 1);
+ party_send_movemap(sd);
// 119
// 78
if (battle_config.pc_invincible_time > 0)
{
- if (map[sd->bl.m].flag.gvg)
- pc_setinvincibletimer (sd, battle_config.pc_invincible_time << 1);
- else
- pc_setinvincibletimer (sd, battle_config.pc_invincible_time);
+ pc_setinvincibletimer(sd, static_cast<interval_t>(battle_config.pc_invincible_time));
}
- map_addblock (&sd->bl); // ブロック登録
- clif_spawnpc (sd); // spawn
+ map_addblock(&sd->bl); // ブロック登録
+ clif_spawnpc(sd); // spawn
// weight max , now
- clif_updatestatus (sd, SP_MAXWEIGHT);
- clif_updatestatus (sd, SP_WEIGHT);
+ clif_updatestatus(sd, SP::MAXWEIGHT);
+ clif_updatestatus(sd, SP::WEIGHT);
// pvp
- if (sd->pvp_timer != -1 && !battle_config.pk_mode)
- delete_timer (sd->pvp_timer, pc_calc_pvprank_timer);
+ if (!battle_config.pk_mode)
+ sd->pvp_timer.cancel();
+
if (map[sd->bl.m].flag.pvp)
{
if (!battle_config.pk_mode)
- { // remove pvp stuff for pk_mode [Valaris]
- sd->pvp_timer =
- add_timer (gettick () + 200, pc_calc_pvprank_timer, sd->bl.id,
- 0);
+ {
+ // remove pvp stuff for pk_mode [Valaris]
+ sd->pvp_timer = Timer(gettick() + std::chrono::milliseconds(200),
+ std::bind(pc_calc_pvprank_timer, ph::_1, ph::_2,
+ sd->bl.id));
sd->pvp_rank = 0;
sd->pvp_lastusers = 0;
sd->pvp_point = 5;
}
- clif_set0199 (sd->fd, 1);
}
else
{
- sd->pvp_timer = -1;
- }
- if (map[sd->bl.m].flag.gvg)
- {
- clif_set0199 (sd->fd, 3);
+ // sd->pvp_timer = nullptr;
}
- if (sd->state.connect_new)
- {
- sd->state.connect_new = 0;
- if (sd->status.pc_class != sd->view_class)
- clif_changelook (&sd->bl, LOOK_BASE, sd->view_class);
-
-/* Stop players from spawning inside castles [Valaris] */
-
- {
- struct guild_castle *gc = guild_mapname2gc (map[sd->bl.m].name);
- if (gc)
- pc_setpos (sd, sd->status.save_point.map,
- sd->status.save_point.x, sd->status.save_point.y,
- 2);
- }
-
-/* End Addition [Valaris] */
-
- }
+ sd->state.connect_new = 0;
// view equipment item
- clif_changelook (&sd->bl, LOOK_WEAPON, 0);
+ clif_changelook(&sd->bl, LOOK::WEAPON, static_cast<uint16_t>(ItemLook::NONE));
if (battle_config.save_clothcolor == 1 && sd->status.clothes_color > 0)
- clif_changelook (&sd->bl, LOOK_CLOTHES_COLOR,
+ 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);
-
// option
- clif_changeoption (&sd->bl);
- if (sd->sc_data[SC_TRICKDEAD].timer != -1)
- skill_status_change_end (&sd->bl, SC_TRICKDEAD, -1);
- if (sd->sc_data[SC_SIGNUMCRUCIS].timer != -1
- && !battle_check_undead (7, sd->def_ele))
- skill_status_change_end (&sd->bl, SC_SIGNUMCRUCIS, -1);
- if (sd->special_state.infinite_endure
- && sd->sc_data[SC_ENDURE].timer == -1)
- skill_status_change_start (&sd->bl, SC_ENDURE, 10, 1, 0, 0, 0, 0);
+ clif_changeoption(&sd->bl);
for (i = 0; i < MAX_INVENTORY; i++)
{
- if (sd->status.inventory[i].equip
- && sd->status.inventory[i].equip & 0x0002
+ if (bool(sd->status.inventory[i].equip)
+ && bool(sd->status.inventory[i].equip & EPOS::WEAPON)
&& sd->status.inventory[i].broken == 1)
- skill_status_change_start (&sd->bl, SC_BROKNWEAPON, 0, 0, 0, 0, 0,
- 0);
- if (sd->status.inventory[i].equip
- && sd->status.inventory[i].equip & 0x0010
+ skill_status_change_start(&sd->bl, StatusChange::SC_BROKNWEAPON, 0, interval_t::zero());
+ if (bool(sd->status.inventory[i].equip)
+ && bool(sd->status.inventory[i].equip & EPOS::MISC1)
&& sd->status.inventory[i].broken == 1)
- skill_status_change_start (&sd->bl, SC_BROKNARMOR, 0, 0, 0, 0, 0,
- 0);
+ skill_status_change_start(&sd->bl, StatusChange::SC_BROKNARMOR, 0, interval_t::zero());
}
// clif_changelook_accessories(sd, NULL);
- map_foreachinarea (clif_getareachar, sd->bl.m, sd->bl.x - AREA_SIZE,
+ map_foreachinarea(std::bind(clif_getareachar, ph::_1, sd), sd->bl.m, sd->bl.x - AREA_SIZE,
sd->bl.y - AREA_SIZE, sd->bl.x + AREA_SIZE,
- sd->bl.y + AREA_SIZE, 0, sd);
+ sd->bl.y + AREA_SIZE, BL::NUL);
}
/*==========================================
@@ -6949,13 +3859,13 @@ void clif_parse_LoadEndAck (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_TickSend (int fd, struct map_session_data *sd)
+void clif_parse_TickSend(int fd, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
- sd->client_tick = RFIFOL (fd, 2);
- sd->server_tick = gettick ();
- clif_servertick (sd);
+ sd->client_tick = tick_t(static_cast<interval_t>(RFIFOL(fd, 2)));
+ sd->server_tick = gettick();
+ clif_servertick(sd);
}
/*==========================================
@@ -6963,49 +3873,39 @@ void clif_parse_TickSend (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_WalkToXY (int fd, struct map_session_data *sd)
+void clif_parse_WalkToXY(int fd, struct map_session_data *sd)
{
- int x, y;
+ int x, y;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- clif_clearchar_area (&sd->bl, 1);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::DEAD);
return;
}
- if (sd->npc_id != 0 || sd->state.storage_flag)
- return;
-
- if (sd->skilltimer != -1 && pc_checkskill (sd, SA_FREECAST) <= 0) // フリーキャスト
+ if (sd->npc_id != 0 || sd->state.storage_open)
return;
if (sd->chatID)
return;
- if (sd->canmove_tick > gettick ())
+ if (sd->canmove_tick > gettick())
return;
// ステータス異常やハイディング中(トンネルドライブ無)で動けない
- if ((sd->opt1 > 0 && sd->opt1 != 6) || 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 ((sd->status.option & 2) && pc_checkskill (sd, RG_TUNNELDRIVE) <= 0)
+ if (bool(sd->opt1) && sd->opt1 != (Opt1::_stone6))
return;
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer (sd);
+ if (sd->invincible_timer)
+ pc_delinvincibletimer(sd);
- pc_stopattack (sd);
+ pc_stopattack(sd);
- x = RFIFOB (fd, 2) * 4 + (RFIFOB (fd, 3) >> 6);
- y = ((RFIFOB (fd, 3) & 0x3f) << 4) + (RFIFOB (fd, 4) >> 4);
- pc_walktoxy (sd, x, y);
+ x = RFIFOB(fd, 2) * 4 + (RFIFOB(fd, 3) >> 6);
+ y = ((RFIFOB(fd, 3) & 0x3f) << 4) + (RFIFOB(fd, 4) >> 4);
+ pc_walktoxy(sd, x, y);
}
@@ -7013,41 +3913,33 @@ void clif_parse_WalkToXY (int fd, struct map_session_data *sd)
*
*------------------------------------------
*/
-void clif_parse_QuitGame (int fd, struct map_session_data *sd)
+void clif_parse_QuitGame(int fd, struct map_session_data *sd)
{
- unsigned int tick = gettick ();
- struct skill_unit_group *sg;
+ tick_t tick = gettick();
- nullpo_retv (sd);
+ nullpo_retv(sd);
- WFIFOW (fd, 0) = 0x18b;
- if ((!pc_isdead (sd)
- && (sd->opt1
- || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND))))
- || sd->skilltimer != -1 || (DIFF_TICK (tick, sd->canact_tick) < 0)
- || (sd->sc_data && sd->sc_data[SC_DANCING].timer != -1
- && sd->sc_data[SC_DANCING].val4
- && (sg = (struct skill_unit_group *) sd->sc_data[SC_DANCING].val2)
- && sg->src_id == sd->bl.id))
+ WFIFOW(fd, 0) = 0x18b;
+ if ((!pc_isdead(sd) && (sd->opt1 != Opt1::ZERO || sd->opt2 != Opt2::ZERO))
+ || (tick < sd->canact_tick))
{
- WFIFOW (fd, 2) = 1;
- WFIFOSET (fd, packet_len_table[0x18b]);
+ WFIFOW(fd, 2) = 1;
+ WFIFOSET(fd, clif_parse_func_table[0x18b].len);
return;
}
/* Rovert's prevent logout option fixed [Valaris] */
- if ((battle_config.prevent_logout
- && (gettick () - sd->canlog_tick) >= 10000)
- || (!battle_config.prevent_logout))
+ if (!battle_config.prevent_logout
+ || tick >= sd->canlog_tick + std::chrono::seconds(10))
{
- clif_setwaitclose (fd);
- WFIFOW (fd, 2) = 0;
+ clif_setwaitclose(fd);
+ WFIFOW(fd, 2) = 0;
}
else
{
- WFIFOW (fd, 2) = 1;
+ WFIFOW(fd, 2) = 1;
}
- WFIFOSET (fd, packet_len_table[0x18b]);
+ WFIFOSET(fd, clif_parse_func_table[0x18b].len);
}
@@ -7056,59 +3948,40 @@ void clif_parse_QuitGame (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_GetCharNameRequest (int fd, struct map_session_data *sd)
+void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd)
{
struct block_list *bl;
- int account_id;
+ int account_id;
- account_id = RFIFOL (fd, 2);
- bl = map_id2bl (account_id);
+ account_id = RFIFOL(fd, 2);
+ bl = map_id2bl(account_id);
if (bl == NULL)
return;
- WFIFOW (fd, 0) = 0x95;
- WFIFOL (fd, 2) = account_id;
+ WFIFOW(fd, 0) = 0x95;
+ WFIFOL(fd, 2) = account_id;
switch (bl->type)
{
- case BL_PC:
+ case BL::PC:
{
struct map_session_data *ssd = (struct map_session_data *) bl;
- nullpo_retv (ssd);
+ nullpo_retv(ssd);
if (ssd->state.shroud_active)
- memset (WFIFOP (fd, 6), 0, 24);
+ memset(WFIFOP(fd, 6), 0, 24);
else
- memcpy (WFIFOP (fd, 6), ssd->status.name, 24);
- WFIFOSET (fd, packet_len_table[0x95]);
+ memcpy(WFIFOP(fd, 6), ssd->status.name, 24);
+ WFIFOSET(fd, clif_parse_func_table[0x95].len);
- struct guild *g = NULL;
struct party *p = NULL;
- const char *guild_name = "", *guild_pos = "", *party_name = "";
+ const char *party_name = "";
int send = 0;
- if (ssd->status.guild_id > 0 && (g = guild_search (ssd->status.guild_id)) != NULL)
- {
- // there used to be a comment near here, but the code has changed slightly
- // ギルド所属ならパケット0195を返す
- // google says that means: 0195 return if the packet belongs Guild
- int i, ps = -1;
- for (i = 0; i < g->max_member; i++)
- {
- if (g->member[i].account_id == ssd->status.account_id)
- ps = g->member[i].position;
- }
- if (ps >= 0 && ps < MAX_GUILDPOSITION)
- {
- guild_name = g->name;
- guild_pos = g->position[ps].name;
- send = 1;
- }
- }
- if (ssd->status.party_id > 0 && (p = party_search (ssd->status.party_id)) != NULL)
+ if (ssd->status.party_id > 0 && (p = party_search(ssd->status.party_id)) != NULL)
{
party_name = p->name;
send = 1;
@@ -7116,37 +3989,37 @@ void clif_parse_GetCharNameRequest (int fd, struct map_session_data *sd)
if (send)
{
- WFIFOW (fd, 0) = 0x195;
- WFIFOL (fd, 2) = account_id;
- memcpy (WFIFOP (fd, 6), party_name, 24);
- memcpy (WFIFOP (fd, 30), guild_name, 24);
- memcpy (WFIFOP (fd, 54), guild_pos, 24);
- memcpy (WFIFOP (fd, 78), guild_pos, 24); // We send this value twice because the client expects it
- WFIFOSET (fd, packet_len_table[0x195]);
+ WFIFOW(fd, 0) = 0x195;
+ WFIFOL(fd, 2) = account_id;
+ memcpy(WFIFOP(fd, 6), party_name, 24);
+ memcpy(WFIFOP(fd, 30), "", 24);
+ memcpy(WFIFOP(fd, 54), "", 24);
+ memcpy(WFIFOP(fd, 78), "", 24); // We send this value twice because the client expects it
+ WFIFOSET(fd, clif_parse_func_table[0x195].len);
}
if (pc_isGM(sd) >= battle_config.hack_info_GM_level)
{
struct in_addr ip = ssd->ip;
- WFIFOW (fd, 0) = 0x20C;
+ WFIFOW(fd, 0) = 0x20C;
// Mask the IP using the char-server password
if (battle_config.mask_ip_gms)
- ip = MD5_ip(chrif_getpasswd (), ssd->ip);
+ ip = MD5_ip(chrif_getpasswd(), ssd->ip);
- WFIFOL (fd, 2) = account_id;
- WFIFOL (fd, 6) = ip.s_addr;
- WFIFOSET (fd, packet_len_table[0x20C]);
+ WFIFOL(fd, 2) = account_id;
+ WFIFOL(fd, 6) = ip.s_addr;
+ WFIFOSET(fd, clif_parse_func_table[0x20C].len);
}
}
break;
- case BL_NPC:
- memcpy (WFIFOP (fd, 6), ((struct npc_data *) bl)->name, 24);
+ case BL::NPC:
+ memcpy(WFIFOP(fd, 6), ((struct npc_data *) bl)->name, 24);
{
- char *start = (char *)WFIFOP (fd, 6);
- char *end = strchr (start, '#'); // [fate] elim hashed out/invisible names for the client
+ char *start = (char *)WFIFOP(fd, 6);
+ char *end = strchr(start, '#'); // [fate] elim hashed out/invisible names for the client
if (end)
while (*end)
*end++ = 0;
@@ -7155,21 +4028,21 @@ void clif_parse_GetCharNameRequest (int fd, struct map_session_data *sd)
while (*start == '_')
*start++ = ' ';
}
- WFIFOSET (fd, packet_len_table[0x95]);
+ WFIFOSET(fd, clif_parse_func_table[0x95].len);
break;
- case BL_MOB:
+ case BL::MOB:
{
struct mob_data *md = (struct mob_data *) bl;
- nullpo_retv (md);
+ nullpo_retv(md);
- memcpy (WFIFOP (fd, 6), md->name, 24);
- WFIFOSET (fd, packet_len_table[0x95]);
+ memcpy(WFIFOP(fd, 6), md->name, 24);
+ WFIFOSET(fd, clif_parse_func_table[0x95].len);
}
break;
default:
if (battle_config.error_log)
- printf ("clif_parse_GetCharNameRequest : bad type %d(%d)\n",
+ PRINTF("clif_parse_GetCharNameRequest : bad type %d (%d)\n",
bl->type, account_id);
break;
}
@@ -7183,75 +4056,73 @@ void clif_parse_GetCharNameRequest (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_GlobalMessage (int fd, struct map_session_data *sd)
+void clif_parse_GlobalMessage(int fd, struct map_session_data *sd)
{
- int msg_len = RFIFOW (fd, 2) - 4; /* Header (2) + length (2). */
+ int msg_len = RFIFOW(fd, 2) - 4; /* Header(2) + length(2). */
size_t message_len = 0;
// sometimes uint8_t
char *buf = NULL;
- char *message = NULL; /* The message text only. */
+ const char *message = NULL; /* The message text only. */
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (!(buf = clif_validate_chat (sd, 2, &message, &message_len)))
+ if (!(buf = clif_validate_chat(sd, 2, &message, &message_len)))
{
- clif_displaymessage (fd, "Your message could not be sent.");
+ clif_displaymessage(fd, "Your message could not be sent.");
return;
}
- if (is_atcommand (fd, sd, message, 0) != AtCommand_None
- || (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 //バーサーク時は会話も不可
- || sd->sc_data[SC_NOCHAT].timer != -1)))//チャット禁止
+ if (is_atcommand(fd, sd, message, 0)) //チャット禁止
{
- free (buf);
+ free(buf);
return;
}
- if (!magic_message (sd, buf, msg_len))
+ if (!magic_message(sd, buf, msg_len))
{
/* Don't send chat that results in an automatic ban. */
- if (tmw_CheckChatSpam (sd, message))
+ if (tmw_CheckChatSpam(sd, message))
{
- free (buf);
- clif_displaymessage (fd, "Your message could not be sent.");
+ free(buf);
+ clif_displaymessage(fd, "Your message could not be sent.");
return;
}
/* It's not a spell/magic message, so send the message to others. */
- WBUFW (buf, 0) = 0x8d;
- WBUFW (buf, 2) = msg_len + 8; /* Header (2) + length (2) + ID (4). */
- WBUFL (buf, 4) = sd->bl.id;
+ WBUFW(reinterpret_cast<uint8_t *>(buf), 0) = 0x8d;
+ WBUFW(reinterpret_cast<uint8_t *>(buf), 2) = msg_len + 8; /* Header(2) + length(2) + ID(4). */
+ WBUFL(reinterpret_cast<uint8_t *>(buf), 4) = sd->bl.id;
// evil multiuse buffer!
- clif_send ((const uint8_t *)buf, msg_len + 8, &sd->bl,
- sd->chatID ? CHAT_WOS : AREA_CHAT_WOC);
+ clif_send((const uint8_t *)buf, msg_len + 8, &sd->bl,
+ sd->chatID ? SendWho::CHAT_WOS : SendWho::AREA_CHAT_WOC);
}
/* Send the message back to the speaker. */
- memcpy (WFIFOP (fd, 0), RFIFOP (fd, 0), RFIFOW (fd, 2));
- WFIFOW (fd, 0) = 0x8e;
- WFIFOSET (fd, WFIFOW (fd, 2));
+ memcpy(WFIFOP(fd, 0), RFIFOP(fd, 0), RFIFOW(fd, 2));
+ WFIFOW(fd, 0) = 0x8e;
+ WFIFOSET(fd, WFIFOW(fd, 2));
- free (buf);
+ free(buf);
return;
}
-int clif_message (struct block_list *bl, const char *msg)
+int clif_message(struct block_list *bl, const char *msg)
{
- unsigned short msg_len = strlen (msg) + 1;
+ unsigned short msg_len = strlen(msg) + 1;
unsigned char buf[512];
if (msg_len + 16 > 512)
return 0;
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
- WBUFW (buf, 0) = 0x8d;
- WBUFW (buf, 2) = msg_len + 8;
- WBUFL (buf, 4) = bl->id;
- memcpy (WBUFP (buf, 8), msg, msg_len);
+ WBUFW(buf, 0) = 0x8d;
+ WBUFW(buf, 2) = msg_len + 8;
+ WBUFL(buf, 4) = bl->id;
+ memcpy(WBUFP(buf, 8), msg, msg_len);
- clif_send (buf, WBUFW (buf, 2), bl, AREA);
+ clif_send(buf, WBUFW(buf, 2), bl, SendWho::AREA);
return 0;
}
@@ -7261,58 +4132,28 @@ int clif_message (struct block_list *bl, const char *msg)
*------------------------------------------
*/
static
-void clif_parse_MapMove (int fd, struct map_session_data *sd)
-{
-// /m /mapmove (as @rura GM command)
- char output[100];
- char map_name[17];
-
- nullpo_retv (sd);
-
- memset (output, '\0', sizeof (output));
- memset (map_name, '\0', sizeof (map_name));
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) &&
- (pc_isGM (sd) >= get_atcommand_level (AtCommand_MapMove)))
- {
- memcpy (map_name, RFIFOP (fd, 2), 16);
- sprintf (output, "%s %d %d", map_name, RFIFOW (fd, 18),
- RFIFOW (fd, 20));
- log_atcommand (sd, "@warp %s", output);
- atcommand_warp (fd, sd, "@warp", output);
- }
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static
-void clif_parse_ChangeDir (int fd, struct map_session_data *sd)
+void clif_parse_ChangeDir(int fd, struct map_session_data *sd)
{
unsigned char buf[64];
- short dir;
- nullpo_retv (sd);
+ nullpo_retv(sd);
-// RFIFOW(fd,2); // Apparently does nothing?
- dir = RFIFOB (fd, 4);
+ // RFIFOW(fd, 2) is always 0
+ DIR dir = static_cast<DIR>(RFIFOB(fd, 4));
+ if (dir >= DIR::COUNT)
+ return;
if (dir == sd->dir)
return;
- pc_setdir (sd, dir);
+ pc_setdir(sd, dir);
- WBUFW (buf, 0) = 0x9c;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFW (buf, 6) = 0;
- WBUFB (buf, 8) = dir;
- if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
- clif_send (buf, packet_len_table[0x9c], &sd->bl, AREA);
- else
- clif_send (buf, packet_len_table[0x9c], &sd->bl, AREA_WOS);
+ WBUFW(buf, 0) = 0x9c;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFW(buf, 6) = 0;
+ WBUFB(buf, 8) = static_cast<uint8_t>(dir);
+
+ clif_send(buf, clif_parse_func_table[0x9c].len, &sd->bl, SendWho::AREA_WOS);
}
@@ -7321,22 +4162,22 @@ void clif_parse_ChangeDir (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_Emotion (int fd, struct map_session_data *sd)
+void clif_parse_Emotion(int fd, struct map_session_data *sd)
{
unsigned char buf[64];
- nullpo_retv (sd);
+ nullpo_retv(sd);
if (battle_config.basic_skill_check == 0
- || pc_checkskill (sd, NV_EMOTE) >= 1)
+ || pc_checkskill(sd, SkillID::NV_EMOTE) >= 1)
{
- WBUFW (buf, 0) = 0xc0;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFB (buf, 6) = RFIFOB (fd, 2);
- clif_send (buf, packet_len_table[0xc0], &sd->bl, AREA);
+ WBUFW(buf, 0) = 0xc0;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFB(buf, 6) = RFIFOB(fd, 2);
+ clif_send(buf, clif_parse_func_table[0xc0].len, &sd->bl, SendWho::AREA);
}
else
- clif_skill_fail (sd, 1, 0, 1);
+ clif_skill_fail(sd, SkillID::ONE, 0, 1);
}
/*==========================================
@@ -7344,11 +4185,11 @@ void clif_parse_Emotion (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_HowManyConnections (int fd, struct map_session_data *sd)
+void clif_parse_HowManyConnections(int fd, struct map_session_data *)
{
- WFIFOW (fd, 0) = 0xc2;
- WFIFOL (fd, 2) = map_getusers ();
- WFIFOSET (fd, packet_len_table[0xc2]);
+ WFIFOW(fd, 0) = 0xc2;
+ WFIFOL(fd, 2) = map_getusers();
+ WFIFOSET(fd, clif_parse_func_table[0xc2].len);
}
/*==========================================
@@ -7356,68 +4197,64 @@ void clif_parse_HowManyConnections (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_ActionRequest (int fd, struct map_session_data *sd)
+void clif_parse_ActionRequest(int fd, struct map_session_data *sd)
{
- unsigned int tick;
unsigned char buf[64];
- int action_type, target_id;
+ int action_type, target_id;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- clif_clearchar_area (&sd->bl, 1);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::DEAD);
return;
}
- if (sd->npc_id != 0 || sd->opt1 > 0 || sd->status.option & 2 || sd->state.storage_flag ||
- (sd->sc_data && (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //オートカウンター
- sd->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り
- sd->sc_data[SC_DANCING].timer != -1)))
+ if (sd->npc_id != 0
+ || bool(sd->opt1)
+ || sd->state.storage_open)
return;
- tick = gettick ();
+ tick_t tick = gettick();
- pc_stop_walking (sd, 0);
- pc_stopattack (sd);
+ pc_stop_walking(sd, 0);
+ pc_stopattack(sd);
- target_id = RFIFOL (fd, 2);
- action_type = RFIFOB (fd, 6);
+ target_id = RFIFOL(fd, 2);
+ action_type = RFIFOB(fd, 6);
switch (action_type)
{
case 0x00: // once attack
case 0x07: // continuous attack
- if (sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22
- || sd->status.option & OPTION_HIDE)
+ if (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)
+ if (tick < sd->canact_tick)
{
- clif_skill_fail (sd, 1, 4, 0);
+ clif_skill_fail(sd, SkillID::ONE, 4, 0);
return;
}
}
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer (sd);
+ if (sd->invincible_timer)
+ pc_delinvincibletimer(sd);
if (sd->attacktarget > 0) // [Valaris]
sd->attacktarget = 0;
- pc_attack (sd, target_id, action_type != 0);
+ pc_attack(sd, target_id, action_type != 0);
break;
case 0x02: // sitdown
- pc_stop_walking (sd, 1);
- skill_gangsterparadise (sd, 1); // ギャングスターパラダイス設定
- pc_setsit (sd);
- clif_sitting (fd, sd);
+ pc_stop_walking(sd, 1);
+ skill_gangsterparadise(sd, 1); // ギャングスターパラダイス設定
+ pc_setsit(sd);
+ clif_sitting(fd, sd);
break;
case 0x03: // standup
- skill_gangsterparadise (sd, 0); // ギャングスターパラダイス解除
- pc_setstand (sd);
- WBUFW (buf, 0) = 0x8a;
- WBUFL (buf, 2) = sd->bl.id;
- WBUFB (buf, 26) = 3;
- clif_send (buf, packet_len_table[0x8a], &sd->bl, AREA);
+ skill_gangsterparadise(sd, 0); // ギャングスターパラダイス解除
+ pc_setstand(sd);
+ WBUFW(buf, 0) = 0x8a;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFB(buf, 26) = 3;
+ clif_send(buf, clif_parse_func_table[0x8a].len, &sd->bl, SendWho::AREA);
break;
}
}
@@ -7427,39 +4264,35 @@ void clif_parse_ActionRequest (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_Restart (int fd, struct map_session_data *sd)
+void clif_parse_Restart(int fd, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
- switch (RFIFOB (fd, 2))
+ switch (RFIFOB(fd, 2))
{
case 0x00:
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- pc_setstand (sd);
- pc_setrestartvalue (sd, 3);
- pc_setpos (sd, sd->status.save_point.map,
+ pc_setstand(sd);
+ pc_setrestartvalue(sd, 3);
+ pc_setpos(sd, sd->status.save_point.map,
sd->status.save_point.x, sd->status.save_point.y,
- 2);
+ BeingRemoveWhy::QUIT);
}
break;
case 0x01:
- /*if(!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND))))
- * return; */
-
/* Rovert's Prevent logout option - Fixed [Valaris] */
- if ((battle_config.prevent_logout
- && (gettick () - sd->canlog_tick) >= 10000)
- || (!battle_config.prevent_logout))
+ if (!battle_config.prevent_logout
+ || gettick() >= sd->canlog_tick + std::chrono::seconds(10))
{
- chrif_charselectreq (sd);
+ chrif_charselectreq(sd);
}
else
{
- WFIFOW (fd, 0) = 0x18b;
- WFIFOW (fd, 2) = 1;
+ WFIFOW(fd, 0) = 0x18b;
+ WFIFOW(fd, 2) = 1;
- WFIFOSET (fd, packet_len_table[0x018b]);
+ WFIFOSET(fd, clif_parse_func_table[0x018b].len);
}
break;
}
@@ -7476,34 +4309,32 @@ void clif_parse_Restart (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_Wis (int fd, struct map_session_data *sd)
+void clif_parse_Wis(int fd, struct map_session_data *sd)
{
size_t message_len = 0;
char *buf = NULL;
- char *message = NULL; /* The message text only. */
+ const char *message = NULL; /* The message text only. */
struct map_session_data *dstsd = NULL;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (!(buf = clif_validate_chat (sd, 1, &message, &message_len)))
+ if (!(buf = clif_validate_chat(sd, 1, &message, &message_len)))
{
- clif_displaymessage (fd, "Your message could not be sent.");
+ clif_displaymessage(fd, "Your message could not be sent.");
return;
}
- if (is_atcommand (fd, sd, message, 0) != AtCommand_None
- || (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1
- || sd->sc_data[SC_NOCHAT].timer != -1)))
+ if (is_atcommand(fd, sd, message, 0))
{
- free (buf);
+ free(buf);
return;
}
/* Don't send chat that results in an automatic ban. */
- if (tmw_CheckChatSpam (sd, message))
+ if (tmw_CheckChatSpam(sd, message))
{
- free (buf);
- clif_displaymessage (fd, "Your message could not be sent.");
+ free(buf);
+ clif_displaymessage(fd, "Your message could not be sent.");
return;
}
@@ -7513,75 +4344,50 @@ void clif_parse_Wis (int fd, struct map_session_data *sd)
* conflict (for instance, "Test" versus "test"), the char-server must
* settle the discrepancy.
*/
- if (!(dstsd = map_nick2sd ((const char *)RFIFOP (fd, 4)))
- || strcmp (dstsd->status.name, (const char *)RFIFOP (fd, 4)) != 0)
- intif_wis_message (sd, (const char *)RFIFOP (fd, 4), message, RFIFOW (fd, 2) - 28);
+ if (!(dstsd = map_nick2sd((const char *)RFIFOP(fd, 4)))
+ || strcmp(dstsd->status.name, (const char *)RFIFOP(fd, 4)) != 0)
+ intif_wis_message(sd, (const char *)RFIFOP(fd, 4), message, RFIFOW(fd, 2) - 28);
else
{
/* Refuse messages addressed to self. */
if (dstsd->fd == fd)
{
const char *mes = "You cannot page yourself.";
- clif_wis_message (fd, wisp_server_name, mes, strlen (mes) + 1);
+ clif_wis_message(fd, wisp_server_name, mes, strlen(mes) + 1);
}
else
{
/* The target is ignoring all whispers. */
if (dstsd->ignoreAll == 1)
/* Ignored by target. */
- clif_wis_end (fd, 2);
+ clif_wis_end(fd, 2);
else
{
int i;
- size_t end = sizeof (dstsd->ignore) / sizeof (dstsd->ignore[0]);
+ size_t end = sizeof(dstsd->ignore) / sizeof(dstsd->ignore[0]);
/* See if the source player is being ignored. */
for (i = 0; i < end; ++i)
- if (strcmp (dstsd->ignore[i].name, sd->status.name) == 0)
+ if (strcmp(dstsd->ignore[i].name, sd->status.name) == 0)
{
/* Ignored by target. */
- clif_wis_end (fd, 2);
+ clif_wis_end(fd, 2);
break;
}
/* The player is not being ignored. */
if (i == end)
{
- clif_wis_message (dstsd->fd, sd->status.name, message,
- RFIFOW (fd, 2) - 28);
+ clif_wis_message(dstsd->fd, sd->status.name, message,
+ RFIFOW(fd, 2) - 28);
/* The whisper was sent successfully. */
- clif_wis_end (fd, 0);
+ clif_wis_end(fd, 0);
}
}
}
}
- free (buf);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static
-void clif_parse_GMmessage (int fd, struct map_session_data *sd)
-{
- char m[512];
- char output[200];
- nullpo_retv (sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) &&
- (pc_isGM (sd) >= get_atcommand_level (AtCommand_Broadcast)))
- {
- strncpy (m, (const char *)RFIFOP (fd, 4), RFIFOW (fd, 2) - 4);
- m[RFIFOW (fd, 2) - 4] = 0;
- log_atcommand (sd, "/announce %s", m);
-
- memset (output, '\0', sizeof (output));
- snprintf (output, 199, "%s : %s", sd->status.name, m);
-
- intif_GMmessage (output, strlen (output) + 1, 0);
- }
+ free(buf);
}
/*==========================================
@@ -7589,40 +4395,37 @@ void clif_parse_GMmessage (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_TakeItem (int fd, struct map_session_data *sd)
+void clif_parse_TakeItem(int fd, struct map_session_data *sd)
{
struct flooritem_data *fitem;
- int map_object_id;
+ int map_object_id;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- map_object_id = RFIFOL (fd, 2);
- fitem = (struct flooritem_data *) map_id2bl (map_object_id);
+ map_object_id = RFIFOL(fd, 2);
+ fitem = (struct flooritem_data *) map_id2bl(map_object_id);
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- clif_clearchar_area (&sd->bl, 1);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::DEAD);
return;
}
- if (sd->npc_id != 0 || sd->opt1 > 0 || (sd->sc_data &&
- (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))) //会話禁止
+ if (sd->npc_id != 0
+ || sd->opt1 != Opt1::ZERO) //会話禁止
return;
if (fitem == NULL || fitem->bl.m != sd->bl.m)
return;
- if (abs (sd->bl.x - fitem->bl.x) >= 2
- || abs (sd->bl.y - fitem->bl.y) >= 2)
+ if (abs(sd->bl.x - fitem->bl.x) >= 2
+ || abs(sd->bl.y - fitem->bl.y) >= 2)
return; // too far away to pick up
if (sd->state.shroud_active && sd->state.shroud_disappears_on_pickup)
- magic_unshroud (sd);
+ magic_unshroud(sd);
- pc_takeitem (sd, fitem);
+ pc_takeitem(sd, fitem);
}
/*==========================================
@@ -7630,15 +4433,15 @@ void clif_parse_TakeItem (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_DropItem (int fd, struct map_session_data *sd)
+void clif_parse_DropItem(int fd, struct map_session_data *sd)
{
- int item_index, item_amount;
+ int item_index, item_amount;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- clif_clearchar_area (&sd->bl, 1);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::DEAD);
return;
}
if (map[sd->bl.m].flag.no_player_drops)
@@ -7646,19 +4449,17 @@ void clif_parse_DropItem (int fd, struct map_session_data *sd)
clif_displaymessage(sd->fd, "Can't drop items here.");
return;
}
- if (sd->npc_id != 0 || sd->opt1 > 0 ||
- (sd->sc_data && (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //オートカウンター
- sd->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り
- sd->sc_data[SC_BERSERK].timer != -1))) //バーサーク
+ if (sd->npc_id != 0
+ || sd->opt1 != Opt1::ZERO)
{
clif_displaymessage(sd->fd, "Can't drop items right now.");
return;
}
- item_index = RFIFOW (fd, 2) - 2;
- item_amount = RFIFOW (fd, 4);
+ item_index = RFIFOW(fd, 2) - 2;
+ item_amount = RFIFOW(fd, 4);
- pc_dropitem (sd, item_index, item_amount);
+ pc_dropitem(sd, item_index, item_amount);
}
/*==========================================
@@ -7666,26 +4467,23 @@ void clif_parse_DropItem (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_UseItem (int fd, struct map_session_data *sd)
+void clif_parse_UseItem(int fd, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- clif_clearchar_area (&sd->bl, 1);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::DEAD);
return;
}
- if (sd->npc_id != 0 || sd->opt1 > 0 || (sd->sc_data &&
- (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))) //会話禁止
+ if (sd->npc_id != 0
+ || sd->opt1 != Opt1::ZERO) //会話禁止
return;
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer (sd);
+ if (sd->invincible_timer)
+ pc_delinvincibletimer(sd);
- pc_useitem (sd, RFIFOW (fd, 2) - 2);
+ pc_useitem(sd, RFIFOW(fd, 2) - 2);
}
/*==========================================
@@ -7693,24 +4491,20 @@ void clif_parse_UseItem (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_EquipItem (int fd, struct map_session_data *sd)
+void clif_parse_EquipItem(int fd, struct map_session_data *sd)
{
- int index;
+ int index;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- clif_clearchar_area (&sd->bl, 1);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::DEAD);
return;
}
- index = RFIFOW (fd, 2) - 2;
+ index = RFIFOW(fd, 2) - 2;
if (sd->npc_id != 0)
return;
- if (sd->sc_data
- && (sd->sc_data[SC_BLADESTOP].timer != -1
- || sd->sc_data[SC_BERSERK].timer != -1))
- return;
if (sd->status.inventory[index].identify != 1)
{ // 未鑑定
@@ -7723,9 +4517,13 @@ void clif_parse_EquipItem (int fd, struct map_session_data *sd)
//ペット用装備であるかないか
if (sd->inventory_data[index])
{
- if (sd->inventory_data[index]->type == 10)
- RFIFOW (fd, 4) = 0x8000; // 矢を無理やり装備できるように(−−;
- pc_equipitem (sd, index, RFIFOW (fd, 4));
+ EPOS epos = EPOS(RFIFOW(fd, 4));
+ if (sd->inventory_data[index]->type == ItemType::ARROW)
+ // 矢を無理やり装備できるように(−−;
+ epos = EPOS::ARROW;
+
+ // Note: the EPOS argument to pc_equipitem is actually ignored
+ pc_equipitem(sd, index, epos);
}
}
@@ -7734,32 +4532,27 @@ void clif_parse_EquipItem (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_UnequipItem (int fd, struct map_session_data *sd)
+void clif_parse_UnequipItem(int fd, struct map_session_data *sd)
{
- int index;
+ int index;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- clif_clearchar_area (&sd->bl, 1);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::DEAD);
return;
}
- index = RFIFOW (fd, 2) - 2;
- if (sd->status.inventory[index].broken == 1 && sd->sc_data
- && sd->sc_data[SC_BROKNWEAPON].timer != -1)
- skill_status_change_end (&sd->bl, SC_BROKNWEAPON, -1);
- if (sd->status.inventory[index].broken == 1 && sd->sc_data
- && sd->sc_data[SC_BROKNARMOR].timer != -1)
- skill_status_change_end (&sd->bl, SC_BROKNARMOR, -1);
- if (sd->sc_data
- && (sd->sc_data[SC_BLADESTOP].timer != -1
- || sd->sc_data[SC_BERSERK].timer != -1))
- return;
+ index = RFIFOW(fd, 2) - 2;
+ if (sd->status.inventory[index].broken == 1 && sd->sc_data[StatusChange::SC_BROKNWEAPON].timer)
+ skill_status_change_end(&sd->bl, StatusChange::SC_BROKNWEAPON, nullptr);
+ if (sd->status.inventory[index].broken == 1 && sd->sc_data[StatusChange::SC_BROKNARMOR].timer)
+ skill_status_change_end(&sd->bl, StatusChange::SC_BROKNARMOR, nullptr);
- if (sd->npc_id != 0 || sd->opt1 > 0)
+ if (sd->npc_id != 0
+ || sd->opt1 != Opt1::ZERO)
return;
- pc_unequipitem (sd, index, 0);
+ pc_unequipitem(sd, index, CalcStatus::NOW);
}
/*==========================================
@@ -7767,18 +4560,18 @@ void clif_parse_UnequipItem (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_NpcClicked (int fd, struct map_session_data *sd)
+void clif_parse_NpcClicked(int fd, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- clif_clearchar_area (&sd->bl, 1);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::DEAD);
return;
}
if (sd->npc_id != 0)
return;
- npc_click (sd, RFIFOL (fd, 2));
+ npc_click(sd, RFIFOL(fd, 2));
}
/*==========================================
@@ -7786,9 +4579,9 @@ void clif_parse_NpcClicked (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_NpcBuySellSelected (int fd, struct map_session_data *sd)
+void clif_parse_NpcBuySellSelected(int fd, struct map_session_data *sd)
{
- npc_buysellsel (sd, RFIFOL (fd, 2), RFIFOB (fd, 6));
+ npc_buysellsel(sd, RFIFOL(fd, 2), RFIFOB(fd, 6));
}
/*==========================================
@@ -7796,71 +4589,17 @@ void clif_parse_NpcBuySellSelected (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_NpcBuyListSend (int fd, struct map_session_data *sd)
+void clif_parse_NpcBuyListSend(int fd, struct map_session_data *sd)
{
- int fail = 0, n;
- unsigned short *item_list;
-
- n = (RFIFOW (fd, 2) - 4) / 4;
- item_list = (unsigned short *) RFIFOP (fd, 4);
+ int n = (RFIFOW(fd, 2) - 4) / 4;
+ // really an array of pairs of uint16_t
+ const uint16_t *item_list = static_cast<const uint16_t *>(RFIFOP(fd, 4));
- fail = npc_buylist (sd, n, item_list);
-
- WFIFOW (fd, 0) = 0xca;
- WFIFOB (fd, 2) = fail;
- WFIFOSET (fd, packet_len_table[0xca]);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static
-void clif_parse_NpcSellListSend (int fd, struct map_session_data *sd)
-{
- int fail = 0, n;
- unsigned short *item_list;
-
- n = (RFIFOW (fd, 2) - 4) / 4;
- item_list = (unsigned short *) RFIFOP (fd, 4);
-
- fail = npc_selllist (sd, n, item_list);
-
- WFIFOW (fd, 0) = 0xcb;
- WFIFOB (fd, 2) = fail;
- WFIFOSET (fd, packet_len_table[0xcb]);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static
-void clif_parse_CreateChatRoom (int fd, struct map_session_data *sd)
-{
- chat_createchat (sd, RFIFOW (fd, 4), RFIFOB (fd, 6), (const char *)RFIFOP (fd, 7),
- (const char *)RFIFOP (fd, 15), RFIFOW (fd, 2) - 15);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static
-void clif_parse_ChatAddMember (int fd, struct map_session_data *sd)
-{
- chat_joinchat (sd, RFIFOL (fd, 2), (const char *)RFIFOP (fd, 6));
-}
+ int fail = npc_buylist(sd, n, item_list);
-/*==========================================
- *
- *------------------------------------------
- */
-static
-void clif_parse_ChatRoomStatusChange (int fd, struct map_session_data *sd)
-{
- chat_changechatstatus (sd, RFIFOW (fd, 4), RFIFOB (fd, 6), (const char *)RFIFOP (fd, 7),
- (const char *)RFIFOP (fd, 15), RFIFOW (fd, 2) - 15);
+ WFIFOW(fd, 0) = 0xca;
+ WFIFOB(fd, 2) = fail;
+ WFIFOSET(fd, clif_parse_func_table[0xca].len);
}
/*==========================================
@@ -7868,29 +4607,17 @@ void clif_parse_ChatRoomStatusChange (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_ChangeChatOwner (int fd, struct map_session_data *sd)
+void clif_parse_NpcSellListSend(int fd, struct map_session_data *sd)
{
- chat_changechatowner (sd, (const char *)RFIFOP (fd, 6));
-}
+ int n = (RFIFOW(fd, 2) - 4) / 4;
+ // really an array of pairs of uint16_t
+ const uint16_t *item_list = static_cast<const uint16_t *>(RFIFOP(fd, 4));
-/*==========================================
- *
- *------------------------------------------
- */
-static
-void clif_parse_KickFromChat (int fd, struct map_session_data *sd)
-{
- chat_kickchat (sd, (const char *)RFIFOP (fd, 2));
-}
+ int fail = npc_selllist(sd, n, item_list);
-/*==========================================
- *
- *------------------------------------------
- */
-static
-void clif_parse_ChatLeave (int fd, struct map_session_data *sd)
-{
- chat_leavechat (sd);
+ WFIFOW(fd, 0) = 0xcb;
+ WFIFOB(fd, 2) = fail;
+ WFIFOSET(fd, clif_parse_func_table[0xcb].len);
}
/*==========================================
@@ -7898,17 +4625,17 @@ void clif_parse_ChatLeave (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_TradeRequest (int fd, struct map_session_data *sd)
+void clif_parse_TradeRequest(int, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
if (battle_config.basic_skill_check == 0
- || pc_checkskill (sd, NV_TRADE) >= 1)
+ || pc_checkskill(sd, SkillID::NV_TRADE) >= 1)
{
- trade_traderequest (sd, RFIFOL (sd->fd, 2));
+ trade_traderequest(sd, RFIFOL(sd->fd, 2));
}
else
- clif_skill_fail (sd, 1, 0, 0);
+ clif_skill_fail(sd, SkillID::ONE, 0, 0);
}
/*==========================================
@@ -7916,11 +4643,11 @@ void clif_parse_TradeRequest (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_TradeAck (int fd, struct map_session_data *sd)
+void clif_parse_TradeAck(int, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
- trade_tradeack (sd, RFIFOB (sd->fd, 2));
+ trade_tradeack(sd, RFIFOB(sd->fd, 2));
}
/*==========================================
@@ -7928,11 +4655,11 @@ void clif_parse_TradeAck (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_TradeAddItem (int fd, struct map_session_data *sd)
+void clif_parse_TradeAddItem(int, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
- trade_tradeadditem (sd, RFIFOW (sd->fd, 2), RFIFOL (sd->fd, 4));
+ trade_tradeadditem(sd, RFIFOW(sd->fd, 2), RFIFOL(sd->fd, 4));
}
/*==========================================
@@ -7940,9 +4667,9 @@ void clif_parse_TradeAddItem (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_TradeOk (int fd, struct map_session_data *sd)
+void clif_parse_TradeOk(int, struct map_session_data *sd)
{
- trade_tradeok (sd);
+ trade_tradeok(sd);
}
/*==========================================
@@ -7950,9 +4677,9 @@ void clif_parse_TradeOk (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_TradeCansel (int fd, struct map_session_data *sd)
+void clif_parse_TradeCansel(int, struct map_session_data *sd)
{
- trade_tradecancel (sd);
+ trade_tradecancel(sd);
}
/*==========================================
@@ -7960,9 +4687,9 @@ void clif_parse_TradeCansel (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_TradeCommit (int fd, struct map_session_data *sd)
+void clif_parse_TradeCommit(int, struct map_session_data *sd)
{
- trade_tradecommit (sd);
+ trade_tradecommit(sd);
}
/*==========================================
@@ -7970,72 +4697,9 @@ void clif_parse_TradeCommit (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_StopAttack (int fd, struct map_session_data *sd)
-{
- pc_stopattack (sd);
-}
-
-/*==========================================
- * カートへアイテムを移す
- *------------------------------------------
- */
-static
-void clif_parse_PutItemToCart (int fd, struct map_session_data *sd)
-{
- nullpo_retv (sd);
-
- if (sd->npc_id != 0 || sd->trade_partner != 0)
- return;
- pc_putitemtocart (sd, RFIFOW (fd, 2) - 2, RFIFOL (fd, 4));
-}
-
-/*==========================================
- * カートからアイテムを出す
- *------------------------------------------
- */
-static
-void clif_parse_GetItemFromCart (int fd, struct map_session_data *sd)
-{
- nullpo_retv (sd);
-
- if (sd->npc_id != 0 || sd->trade_partner != 0)
- return;
- pc_getitemfromcart (sd, RFIFOW (fd, 2) - 2, RFIFOL (fd, 4));
-}
-
-/*==========================================
- * 付属品(鷹,ペコ,カート)をはずす
- *------------------------------------------
- */
-static
-void clif_parse_RemoveOption (int fd, struct map_session_data *sd)
+void clif_parse_StopAttack(int, struct map_session_data *sd)
{
- if (pc_isriding (sd))
- { // jobchange when removing peco [Valaris]
- if (sd->status.pc_class == 13)
- sd->status.pc_class = sd->view_class = 7;
-
- if (sd->status.pc_class == 21)
- sd->status.pc_class = sd->view_class = 14;
-
- if (sd->status.pc_class == 4014)
- sd->status.pc_class = sd->view_class = 4008;
-
- if (sd->status.pc_class == 4022)
- sd->status.pc_class = sd->view_class = 4015;
- }
-
- pc_setoption (sd, 0);
-}
-
-/*==========================================
- * チェンジカート
- *------------------------------------------
- */
-static
-void clif_parse_ChangeCart (int fd, struct map_session_data *sd)
-{
- pc_setcart (sd, RFIFOW (fd, 2));
+ pc_stopattack(sd);
}
/*==========================================
@@ -8043,9 +4707,9 @@ void clif_parse_ChangeCart (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_StatusUp (int fd, struct map_session_data *sd)
+void clif_parse_StatusUp(int fd, struct map_session_data *sd)
{
- pc_statusup (sd, RFIFOW (fd, 2));
+ pc_statusup(sd, SP(RFIFOW(fd, 2)));
}
/*==========================================
@@ -8053,196 +4717,9 @@ void clif_parse_StatusUp (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_SkillUp (int fd, struct map_session_data *sd)
+void clif_parse_SkillUp(int fd, struct map_session_data *sd)
{
- pc_skillup (sd, RFIFOW (fd, 2));
-}
-
-/*==========================================
- * スキル使用(ID指定)
- *------------------------------------------
- */
-static
-void clif_parse_UseSkillToId (int fd, struct map_session_data *sd)
-{
- int skillnum, skilllv, lv, target_id;
- unsigned int tick = gettick ();
-
- nullpo_retv (sd);
-
- if (map[sd->bl.m].flag.noskill)
- return;
- if (sd->chatID || sd->npc_id != 0 || sd->state.storage_flag)
- return;
-
- skilllv = RFIFOW (fd, 2);
- skillnum = RFIFOW (fd, 4);
- target_id = RFIFOL (fd, 6);
-
- if (sd->skilltimer != -1)
- {
- if (skillnum != SA_CASTCANCEL)
- return;
- }
- else if (DIFF_TICK (tick, sd->canact_tick) < 0)
- {
- clif_skill_fail (sd, skillnum, 4, 0);
- return;
- }
-
- if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) ||
- 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)
- return;
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer (sd);
- if (sd->skillitem >= 0 && sd->skillitem == skillnum)
- {
- if (skilllv != sd->skillitemlv)
- skilllv = sd->skillitemlv;
- skill_use_id (sd, target_id, skillnum, skilllv);
- }
- else
- {
- sd->skillitem = sd->skillitemlv = -1;
- if (skillnum == MO_EXTREMITYFIST)
- {
- if ((sd->sc_data[SC_COMBO].timer == -1
- || (sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH
- && sd->sc_data[SC_COMBO].val1 != 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)
- skilllv = lv;
- skill_use_id (sd, target_id, skillnum, skilllv);
- if (sd->state.skill_flag)
- sd->state.skill_flag = 0;
- }
- }
-}
-
-/*==========================================
- * スキル使用(場所指定)
- *------------------------------------------
- */
-static
-void clif_parse_UseSkillToPos (int fd, struct map_session_data *sd)
-{
- int skillnum, skilllv, lv, x, y;
- unsigned int tick = gettick ();
- int skillmoreinfo;
-
- nullpo_retv (sd);
-
- if (map[sd->bl.m].flag.noskill)
- return;
- if (sd->npc_id != 0 || sd->state.storage_flag)
- return;
- if (sd->chatID)
- return;
-
- skillmoreinfo = -1;
- skilllv = RFIFOW (fd, 2);
- skillnum = RFIFOW (fd, 4);
- x = RFIFOW (fd, 6);
- y = RFIFOW (fd, 8);
- if (RFIFOW (fd, 0) == 0x190)
- skillmoreinfo = 10;
-
- if (skillmoreinfo != -1)
- {
- if (pc_issit (sd))
- {
- clif_skill_fail (sd, skillnum, 0, 0);
- return;
- }
- memcpy (talkie_mes, RFIFOP (fd, skillmoreinfo), 80);
- }
-
- if (sd->skilltimer != -1)
- return;
- else if (DIFF_TICK (tick, sd->canact_tick) < 0)
- {
- clif_skill_fail (sd, skillnum, 4, 0);
- return;
- }
-
- if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) ||
- 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)
- return;
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer (sd);
- if (sd->skillitem >= 0 && sd->skillitem == skillnum)
- {
- if (skilllv != sd->skillitemlv)
- skilllv = sd->skillitemlv;
- skill_use_pos (sd, x, y, skillnum, skilllv);
- }
- else
- {
- sd->skillitem = sd->skillitemlv = -1;
- if ((lv = pc_checkskill (sd, skillnum)) > 0)
- {
- if (skilllv > lv)
- skilllv = lv;
- skill_use_pos (sd, x, y, skillnum, skilllv);
- }
- }
-}
-
-/*==========================================
- * スキル使用(map指定)
- *------------------------------------------
- */
-static
-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;
-
- if (sd->npc_id != 0 || (sd->sc_data &&
- (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)))
- return;
-
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer (sd);
-
- skill_castend_map (sd, RFIFOW (fd, 2), (const char *)RFIFOP (fd, 4));
-}
-
-/*==========================================
- * メモ要求
- *------------------------------------------
- */
-static
-void clif_parse_RequestMemo (int fd, struct map_session_data *sd)
-{
- pc_memo (sd, -1);
+ pc_skillup(sd, SkillID(RFIFOW(fd, 2)));
}
/*==========================================
@@ -8250,12 +4727,12 @@ void clif_parse_RequestMemo (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_NpcSelectMenu (int fd, struct map_session_data *sd)
+void clif_parse_NpcSelectMenu(int fd, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
- sd->npc_menu = RFIFOB (fd, 6);
- map_scriptcont (sd, RFIFOL (fd, 2));
+ sd->npc_menu = RFIFOB(fd, 6);
+ map_scriptcont(sd, RFIFOL(fd, 2));
}
/*==========================================
@@ -8263,9 +4740,9 @@ void clif_parse_NpcSelectMenu (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_NpcNextClicked (int fd, struct map_session_data *sd)
+void clif_parse_NpcNextClicked(int fd, struct map_session_data *sd)
{
- map_scriptcont (sd, RFIFOL (fd, 2));
+ map_scriptcont(sd, RFIFOL(fd, 2));
}
/*==========================================
@@ -8273,17 +4750,12 @@ void clif_parse_NpcNextClicked (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_NpcAmountInput (int fd, struct map_session_data *sd)
+void clif_parse_NpcAmountInput(int fd, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
-#define RFIFOL_(fd,pos) (*(int*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
- //Input Value overflow Exploit FIX
- sd->npc_amount = RFIFOL_ (fd, 6); //fixed by Lupus. npc_amount is (int) but was RFIFOL changing it to (unsigned int)
-
-#undef RFIFOL_
-
- map_scriptcont (sd, RFIFOL (fd, 2));
+ sd->npc_amount = RFIFOL(fd, 6);
+ map_scriptcont(sd, RFIFOL(fd, 2));
}
/*==========================================
@@ -8293,12 +4765,12 @@ void clif_parse_NpcAmountInput (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_NpcStringInput (int fd, struct map_session_data *sd)
+void clif_parse_NpcStringInput(int fd, struct map_session_data *sd)
{
- int len;
- nullpo_retv (sd);
+ int len;
+ nullpo_retv(sd);
- len = RFIFOW (fd, 2) - 8;
+ len = RFIFOW(fd, 2) - 8;
/*
* If we check for equal to 0, too, we'll freeze clients that send (or
@@ -8307,17 +4779,17 @@ void clif_parse_NpcStringInput (int fd, struct map_session_data *sd)
if (len < 0)
return;
- if (len >= sizeof (sd->npc_str) - 1)
+ if (len >= sizeof(sd->npc_str) - 1)
{
- printf ("clif_parse_NpcStringInput(): Input string too long!\n");
- len = sizeof (sd->npc_str) - 1;
+ PRINTF("clif_parse_NpcStringInput(): Input string too long!\n");
+ len = sizeof(sd->npc_str) - 1;
}
if (len > 0)
- strncpy (sd->npc_str, (const char *)RFIFOP (fd, 8), len);
+ strncpy(sd->npc_str, (const char *)RFIFOP(fd, 8), len);
sd->npc_str[len] = '\0';
- map_scriptcont (sd, RFIFOL (fd, 4));
+ map_scriptcont(sd, RFIFOL(fd, 4));
}
/*==========================================
@@ -8325,112 +4797,9 @@ void clif_parse_NpcStringInput (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_NpcCloseClicked (int fd, struct map_session_data *sd)
-{
- map_scriptcont (sd, RFIFOL (fd, 2));
-}
-
-/*==========================================
- * アイテム鑑定
- *------------------------------------------
- */
-static
-void clif_parse_ItemIdentify (int fd, struct map_session_data *sd)
-{
- pc_item_identify (sd, RFIFOW (fd, 2) - 2);
-}
-
-/*==========================================
- * オートスペル受信
- *------------------------------------------
- */
-static
-void clif_parse_AutoSpell (int fd, struct map_session_data *sd)
-{
- skill_autospell (sd, RFIFOW (fd, 2));
-}
-
-/*==========================================
- * カード使用
- *------------------------------------------
- */
-static
-void clif_parse_UseCard (int fd, struct map_session_data *sd)
-{
- clif_use_card (sd, RFIFOW (fd, 2) - 2);
-}
-
-/*==========================================
- * カード挿入装備選択
- *------------------------------------------
- */
-static
-void clif_parse_InsertCard (int fd, struct map_session_data *sd)
-{
- pc_insert_card (sd, RFIFOW (fd, 2) - 2, RFIFOW (fd, 4) - 2);
-}
-
-/*==========================================
- * 0193 キャラID名前引き
- *------------------------------------------
- */
-static
-void clif_parse_SolveCharName (int fd, struct map_session_data *sd)
-{
- int char_id;
-
- char_id = RFIFOL (fd, 2);
- clif_solved_charname (sd, char_id);
-}
-
-/*==========================================
- * 0197 /resetskill /resetstate
- *------------------------------------------
- */
-static
-void clif_parse_ResetChar (int fd, struct map_session_data *sd)
-{
- nullpo_retv (sd);
-
- if (battle_config.atc_gmonly == 0 || pc_isGM (sd))
- {
- switch (RFIFOW (fd, 2))
- {
- case 0:
- log_atcommand (sd, "@charstreset %s", sd->status.name);
- if (pc_isGM (sd) >=
- get_atcommand_level (AtCommand_ResetState))
- pc_resetstate (sd);
- break;
- case 1:
- log_atcommand (sd, "@charskreset %s", sd->status.name);
- if (pc_isGM (sd) >=
- get_atcommand_level (AtCommand_ResetState))
- pc_resetskill (sd);
- break;
- }
- }
-}
-
-/*==========================================
- * 019c /lb等
- *------------------------------------------
- */
-static
-void clif_parse_LGMmessage (int fd, struct map_session_data *sd)
+void clif_parse_NpcCloseClicked(int fd, struct map_session_data *sd)
{
- unsigned char buf[64];
-
- nullpo_retv (sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) &&
- (pc_isGM (sd) >= get_atcommand_level (AtCommand_LocalBroadcast)))
- {
- WBUFW (buf, 0) = 0x9a;
- WBUFW (buf, 2) = RFIFOW (fd, 2);
- memcpy (WBUFP (buf, 4), RFIFOP (fd, 4), RFIFOW (fd, 2) - 4);
- clif_send (buf, RFIFOW (fd, 2), &sd->bl, ALL_SAMEMAP);
- }
+ map_scriptcont(sd, RFIFOL(fd, 2));
}
/*==========================================
@@ -8438,23 +4807,21 @@ void clif_parse_LGMmessage (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_MoveToKafra (int fd, struct map_session_data *sd)
+void clif_parse_MoveToKafra(int fd, struct map_session_data *sd)
{
- int item_index, item_amount;
+ int item_index, item_amount;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- item_index = RFIFOW (fd, 2) - 2;
- item_amount = RFIFOL (fd, 4);
+ item_index = RFIFOW(fd, 2) - 2;
+ item_amount = RFIFOL(fd, 4);
if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0
- || !sd->state.storage_flag)
+ || !sd->state.storage_open)
return;
- if (sd->state.storage_flag == 1)
- storage_storageadd (sd, item_index, item_amount);
- else if (sd->state.storage_flag == 2)
- storage_guild_storageadd (sd, item_index, item_amount);
+ if (sd->state.storage_open)
+ storage_storageadd(sd, item_index, item_amount);
}
/*==========================================
@@ -8462,61 +4829,21 @@ void clif_parse_MoveToKafra (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_MoveFromKafra (int fd, struct map_session_data *sd)
+void clif_parse_MoveFromKafra(int fd, struct map_session_data *sd)
{
- int item_index, item_amount;
+ int item_index, item_amount;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- item_index = RFIFOW (fd, 2) - 1;
- item_amount = RFIFOL (fd, 4);
+ item_index = RFIFOW(fd, 2) - 1;
+ item_amount = RFIFOL(fd, 4);
if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0
- || !sd->state.storage_flag)
+ || !sd->state.storage_open)
return;
- if (sd->state.storage_flag == 1)
- storage_storageget (sd, item_index, item_amount);
- else if (sd->state.storage_flag == 2)
- storage_guild_storageget (sd, item_index, item_amount);
-}
-
-/*==========================================
- * カプラ倉庫へカートから入れる
- *------------------------------------------
- */
-static
-void clif_parse_MoveToKafraFromCart (int fd, struct map_session_data *sd)
-{
- nullpo_retv (sd);
-
- if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0
- || !sd->state.storage_flag)
- return;
- if (sd->state.storage_flag == 1)
- storage_storageaddfromcart (sd, RFIFOW (fd, 2) - 2, RFIFOL (fd, 4));
- else if (sd->state.storage_flag == 2)
- storage_guild_storageaddfromcart (sd, RFIFOW (fd, 2) - 2,
- RFIFOL (fd, 4));
-}
-
-/*==========================================
- * カプラ倉庫から出す
- *------------------------------------------
- */
-static
-void clif_parse_MoveFromKafraToCart (int fd, struct map_session_data *sd)
-{
- nullpo_retv (sd);
-
- if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0
- || !sd->state.storage_flag)
- return;
- if (sd->state.storage_flag == 1)
- storage_storagegettocart (sd, RFIFOW (fd, 2) - 1, RFIFOL (fd, 4));
- else if (sd->state.storage_flag == 2)
- storage_guild_storagegettocart (sd, RFIFOW (fd, 2) - 1,
- RFIFOL (fd, 4));
+ if (sd->state.storage_open)
+ storage_storageget(sd, item_index, item_amount);
}
/*==========================================
@@ -8524,14 +4851,12 @@ void clif_parse_MoveFromKafraToCart (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_CloseKafra (int fd, struct map_session_data *sd)
+void clif_parse_CloseKafra(int, struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (sd->state.storage_flag == 1)
- storage_storageclose (sd);
- else if (sd->state.storage_flag == 2)
- storage_guild_storageclose (sd);
+ if (sd->state.storage_open)
+ storage_storageclose(sd);
}
/*==========================================
@@ -8542,39 +4867,15 @@ void clif_parse_CloseKafra (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_CreateParty (int fd, struct map_session_data *sd)
-{
- if (battle_config.basic_skill_check == 0
- || pc_checkskill (sd, NV_PARTY) >= 2)
- {
- party_create (sd, (const char *)RFIFOP (fd, 2));
- }
- else
- clif_skill_fail (sd, 1, 0, 4);
-}
-
-/*==========================================
- * パーティを作る
- * Process request to create a party.
- *
- * (S 01e8 <party_name>.24B <exp>.B <itm>.B)
- *
- * Note: Upstream eAthena uses this to
- * specify experience/item sharing,
- * respectively, but it was left
- * incomplete here.
- *------------------------------------------
- */
-static
-void clif_parse_CreateParty2 (int fd, struct map_session_data *sd)
+void clif_parse_CreateParty(int fd, struct map_session_data *sd)
{
if (battle_config.basic_skill_check == 0
- || pc_checkskill (sd, NV_PARTY) >= 2)
+ || pc_checkskill(sd, SkillID::NV_PARTY) >= 2)
{
- party_create (sd, (const char *)RFIFOP (fd, 2));
+ party_create(sd, (const char *)RFIFOP(fd, 2));
}
else
- clif_skill_fail (sd, 1, 0, 4);
+ clif_skill_fail(sd, SkillID::ONE, 0, 4);
}
/*==========================================
@@ -8585,9 +4886,9 @@ void clif_parse_CreateParty2 (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_PartyInvite (int fd, struct map_session_data *sd)
+void clif_parse_PartyInvite(int fd, struct map_session_data *sd)
{
- party_invite (sd, RFIFOL (fd, 2));
+ party_invite(sd, RFIFOL(fd, 2));
}
/*==========================================
@@ -8598,17 +4899,17 @@ void clif_parse_PartyInvite (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_ReplyPartyInvite (int fd, struct map_session_data *sd)
+void clif_parse_ReplyPartyInvite(int fd, struct map_session_data *sd)
{
if (battle_config.basic_skill_check == 0
- || pc_checkskill (sd, NV_PARTY) >= 1)
+ || pc_checkskill(sd, SkillID::NV_PARTY) >= 1)
{
- party_reply_invite (sd, RFIFOL (fd, 2), RFIFOL (fd, 6));
+ party_reply_invite(sd, RFIFOL(fd, 2), RFIFOL(fd, 6));
}
else
{
- party_reply_invite (sd, RFIFOL (fd, 2), 0);
- clif_skill_fail (sd, 1, 0, 4);
+ party_reply_invite(sd, RFIFOL(fd, 2), 0);
+ clif_skill_fail(sd, SkillID::ONE, 0, 4);
}
}
@@ -8617,9 +4918,9 @@ void clif_parse_ReplyPartyInvite (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_LeaveParty (int fd, struct map_session_data *sd)
+void clif_parse_LeaveParty(int, struct map_session_data *sd)
{
- party_leave (sd);
+ party_leave(sd);
}
/*==========================================
@@ -8627,9 +4928,9 @@ void clif_parse_LeaveParty (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_RemovePartyMember (int fd, struct map_session_data *sd)
+void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd)
{
- party_removemember (sd, RFIFOL (fd, 2), (const char *)RFIFOP (fd, 6));
+ party_removemember(sd, RFIFOL(fd, 2), (const char *)RFIFOP(fd, 6));
}
/*==========================================
@@ -8637,9 +4938,9 @@ void clif_parse_RemovePartyMember (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_PartyChangeOption (int fd, struct map_session_data *sd)
+void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd)
{
- party_changeoption (sd, RFIFOW (fd, 2), RFIFOW (fd, 4));
+ party_changeoption(sd, RFIFOW(fd, 2), RFIFOW(fd, 4));
}
/*==========================================
@@ -8651,1381 +4952,646 @@ void clif_parse_PartyChangeOption (int fd, struct map_session_data *sd)
*------------------------------------------
*/
static
-void clif_parse_PartyMessage (int fd, struct map_session_data *sd)
-{
- size_t message_len = 0;
- char *buf = NULL;
- char *message = NULL; /* The message text only. */
-
- nullpo_retv (sd);
-
- if (!(buf = clif_validate_chat (sd, 0, &message, &message_len)))
- {
- clif_displaymessage (fd, "Your message could not be sent.");
- return;
- }
-
- if (is_atcommand (fd, sd, message, 0) != AtCommand_None
- || (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 //バーサーク時は会話も不可
- || sd->sc_data[SC_NOCHAT].timer != -1))) //チャット禁止
- {
- free (buf);
- return;
- }
-
- /* Don't send chat that results in an automatic ban. */
- if (tmw_CheckChatSpam (sd, message))
- {
- free (buf);
- clif_displaymessage (fd, "Your message could not be sent.");
- return;
- }
-
- party_send_message (sd, message, RFIFOW (fd, 2) - 4);
- free (buf);
-}
-
-/*==========================================
- * /monster /item rewriten by [Yor]
- *------------------------------------------
- */
-static
-void clif_parse_GM_Monster_Item (int fd, struct map_session_data *sd)
-{
- char monster_item_name[25];
-
- nullpo_retv (sd);
-
- memset (monster_item_name, '\0', sizeof (monster_item_name));
-
- if (battle_config.atc_gmonly == 0 || pc_isGM (sd))
- {
- memcpy (monster_item_name, RFIFOP (fd, 2), 24);
-
- if (mobdb_searchname (monster_item_name) != 0)
- {
- if (pc_isGM (sd) >= get_atcommand_level (AtCommand_Monster))
- {
- log_atcommand (sd, "@spawn %s", monster_item_name);
- atcommand_spawn (fd, sd, "@spawn", monster_item_name); // as @spawn
- }
- }
- else if (itemdb_searchname (monster_item_name) != NULL)
- {
- if (pc_isGM (sd) >= get_atcommand_level (AtCommand_Item))
- {
- log_atcommand (sd, "@item %s", monster_item_name);
- atcommand_item (fd, sd, "@item", monster_item_name); // as @item
- }
- }
-
- }
-}
-
-/*==========================================
- * ギルドを作る
- * Process request to create a guild.
- *
- * (S 0165 <account_ID>.l <guild_name>.24B)
- *
- * Note: The account ID seems to be ignored.
- *------------------------------------------
- */
-static
-void clif_parse_CreateGuild (int fd, struct map_session_data *sd)
-{
- guild_create (sd, (const char *)RFIFOP (fd, 6));
-}
-
-/*==========================================
- * ギルドマスターかどうか確認
- *------------------------------------------
- */
-static
-void clif_parse_GuildCheckMaster (int fd, struct map_session_data *sd)
-{
- clif_guild_masterormember (sd);
-}
-
-/*==========================================
- * ギルド情報要求
- *------------------------------------------
- */
-static
-void clif_parse_GuildReqeustInfo (int fd, struct map_session_data *sd)
-{
- switch (RFIFOL (fd, 2))
- {
- case 0: // ギルド基本情報、同盟敵対情報
- clif_guild_basicinfo (sd);
- clif_guild_allianceinfo (sd);
- break;
- case 1: // メンバーリスト、役職名リスト
- clif_guild_positionnamelist (sd);
- clif_guild_memberlist (sd);
- break;
- case 2: // 役職名リスト、役職情報リスト
- clif_guild_positionnamelist (sd);
- clif_guild_positioninfolist (sd);
- break;
- case 3: // スキルリスト
- clif_guild_skillinfo (sd);
- break;
- case 4: // 追放リスト
- clif_guild_explusionlist (sd);
- break;
- default:
- if (battle_config.error_log)
- printf ("clif: guild request info: unknown type %d\n",
- RFIFOL (fd, 2));
- break;
- }
-}
-
-/*==========================================
- * ギルド役職変更
- *------------------------------------------
- */
-static
-void clif_parse_GuildChangePositionInfo (int fd, struct map_session_data *sd)
-{
- struct guild *g;
- int i, ps;
-
- nullpo_retv (sd);
-
- g = guild_search (sd->status.guild_id);
-
- if (g == NULL)
- return;
-
- if ((ps = guild_getposition (sd, g)) < 0
- || (!(g->position[ps].mode & 0x0010) && strcmp (g->master, sd->status.name)))
- return;
-
- for (i = 4; i < RFIFOW (fd, 2); i += 40)
- {
- guild_change_position (sd, RFIFOL (fd, i), RFIFOL (fd, i + 4),
- RFIFOL (fd, i + 12), (const char *)RFIFOP (fd, i + 16));
- }
-}
-
-/*==========================================
- * ギルドメンバ役職変更
- *------------------------------------------
- */
-static
-void clif_parse_GuildChangeMemberPosition (int fd,
- struct map_session_data *sd)
-{
- struct guild *g;
- int i, ps;
-
- nullpo_retv (sd);
-
- g = guild_search (sd->status.guild_id);
-
- if (g == NULL)
- return;
-
- if ((ps = guild_getposition (sd, g)) < 0
- || (!(g->position[ps].mode & 0x0010) && strcmp (g->master, sd->status.name)))
- return;
-
- for (i = 4; i < RFIFOW (fd, 2); i += 12)
- {
- guild_change_memberposition (sd->status.guild_id,
- RFIFOL (fd, i), RFIFOL (fd, i + 4),
- RFIFOL (fd, i + 8));
- }
-}
-
-/*==========================================
- * ギルドエンブレム要求
- *------------------------------------------
- */
-static
-void clif_parse_GuildRequestEmblem (int fd, struct map_session_data *sd)
-{
- struct guild *g = guild_search (RFIFOL (fd, 2));
- if (g != NULL)
- clif_guild_emblem (sd, g);
-}
-
-/*==========================================
- * ギルドエンブレム変更
- *------------------------------------------
- */
-static
-void clif_parse_GuildChangeEmblem (int fd, struct map_session_data *sd)
-{
- guild_change_emblem (sd, RFIFOW (fd, 2) - 4, (const char *)RFIFOP (fd, 4));
-}
-
-/*==========================================
- * ギルド告知変更
- *------------------------------------------
- */
-static
-void clif_parse_GuildChangeNotice (int fd, struct map_session_data *sd)
-{
- guild_change_notice (sd, RFIFOL (fd, 2), (const char *)RFIFOP (fd, 6), (const char *)RFIFOP (fd, 66));
-}
-
-/*==========================================
- * ギルド勧誘
- *------------------------------------------
- */
-static
-void clif_parse_GuildInvite (int fd, struct map_session_data *sd)
-{
- guild_invite (sd, RFIFOL (fd, 2));
-}
-
-/*==========================================
- * ギルド勧誘返信
- *------------------------------------------
- */
-static
-void clif_parse_GuildReplyInvite (int fd, struct map_session_data *sd)
-{
- guild_reply_invite (sd, RFIFOL (fd, 2), RFIFOB (fd, 6));
-}
-
-/*==========================================
- * ギルド脱退
- *------------------------------------------
- */
-static
-void clif_parse_GuildLeave (int fd, struct map_session_data *sd)
-{
- guild_leave (sd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10),
- (const char *)RFIFOP (fd, 14));
-}
-
-/*==========================================
- * ギルド追放
- *------------------------------------------
- */
-static
-void clif_parse_GuildExplusion (int fd, struct map_session_data *sd)
-{
- guild_explusion (sd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10),
- (const char *)RFIFOP (fd, 14));
-}
-
-/*==========================================
- * ギルド会話
- * Validate and process transmission of a
- * guild message.
- *
- * (S 017e <len>.w <message>.?B)
- *------------------------------------------
- */
-static
-void clif_parse_GuildMessage (int fd, struct map_session_data *sd)
+void clif_parse_PartyMessage(int fd, struct map_session_data *sd)
{
size_t message_len = 0;
char *buf = NULL;
- char *message = NULL; /* The message text only. */
+ const char *message = NULL; /* The message text only. */
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (!(buf = clif_validate_chat (sd, 2, &message, &message_len)))
+ if (!(buf = clif_validate_chat(sd, 0, &message, &message_len)))
{
- clif_displaymessage (fd, "Your message could not be sent.");
+ clif_displaymessage(fd, "Your message could not be sent.");
return;
}
- if (is_atcommand (fd, sd, message, 0) != AtCommand_None
- || (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 //バーサーク時は会話も不可
- || sd->sc_data[SC_NOCHAT].timer != -1))) //チャット禁止
+ if (is_atcommand(fd, sd, message, 0)) //チャット禁止
{
- free (buf);
+ free(buf);
return;
}
/* Don't send chat that results in an automatic ban. */
- if (tmw_CheckChatSpam (sd, message))
- {
- free (buf);
- clif_displaymessage (fd, "Your message could not be sent.");
- return;
- }
-
- guild_send_message (sd, buf + 8, RFIFOW (fd, 2) - 4);
- free (buf);
-}
-
-/*==========================================
- * ギルド同盟要求
- *------------------------------------------
- */
-static
-void clif_parse_GuildRequestAlliance (int fd, struct map_session_data *sd)
-{
- guild_reqalliance (sd, RFIFOL (fd, 2));
-}
-
-/*==========================================
- * ギルド同盟要求返信
- *------------------------------------------
- */
-static
-void clif_parse_GuildReplyAlliance (int fd, struct map_session_data *sd)
-{
- guild_reply_reqalliance (sd, RFIFOL (fd, 2), RFIFOL (fd, 6));
-}
-
-/*==========================================
- * ギルド関係解消
- *------------------------------------------
- */
-static
-void clif_parse_GuildDelAlliance (int fd, struct map_session_data *sd)
-{
- guild_delalliance (sd, RFIFOL (fd, 2), RFIFOL (fd, 6));
-}
-
-/*==========================================
- * ギルド敵対
- *------------------------------------------
- */
-static
-void clif_parse_GuildOpposition (int fd, struct map_session_data *sd)
-{
- guild_opposition (sd, RFIFOL (fd, 2));
-}
-
-/*==========================================
- * ギルド解散
- *------------------------------------------
- */
-static
-void clif_parse_GuildBreak (int fd, struct map_session_data *sd)
-{
- guild_break (sd, (const char *)RFIFOP (fd, 2));
-}
-
-// Kick (right click menu for GM "(name) force to quit")
-static
-void clif_parse_GMKick (int fd, struct map_session_data *sd)
-{
- struct block_list *target;
- int tid = RFIFOL (fd, 2);
-
- nullpo_retv (sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) &&
- (pc_isGM (sd) >= get_atcommand_level (AtCommand_Kick)))
- {
- target = map_id2bl (tid);
- if (target)
- {
- if (target->type == BL_PC)
- {
- struct map_session_data *tsd =
- (struct map_session_data *) target;
- log_atcommand (sd, "@kick %s", tsd->status.name);
- if (pc_isGM (sd) > pc_isGM (tsd))
- clif_GM_kick (sd, tsd, 1);
- else
- clif_GM_kickack (sd, 0);
- }
- else if (target->type == BL_MOB)
- {
- struct mob_data *md = (struct mob_data *) target;
- sd->state.attack_type = 0;
- mob_damage (&sd->bl, md, md->hp, 2);
- }
- else
- clif_GM_kickack (sd, 0);
- }
- else
- clif_GM_kickack (sd, 0);
- }
-}
-
-/*==========================================
- * /shift
- *------------------------------------------
- */
-static
-void clif_parse_Shift (int fd, struct map_session_data *sd)
-{ // Rewriten by [Yor]
- char player_name[25];
-
- nullpo_retv (sd);
-
- memset (player_name, '\0', sizeof (player_name));
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) &&
- (pc_isGM (sd) >= get_atcommand_level (AtCommand_Goto)))
- {
- memcpy (player_name, RFIFOP (fd, 2), 24);
- log_atcommand (sd, "@goto %s", player_name);
- atcommand_goto (fd, sd, "@goto", player_name); // as @jumpto
- }
-
- return;
-}
-
-/*==========================================
- * /recall
- *------------------------------------------
- */
-static
-void clif_parse_Recall (int fd, struct map_session_data *sd)
-{ // Added by RoVeRT
- char player_name[25];
-
- nullpo_retv (sd);
-
- memset (player_name, '\0', sizeof (player_name));
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) &&
- (pc_isGM (sd) >= get_atcommand_level (AtCommand_Recall)))
- {
- memcpy (player_name, RFIFOP (fd, 2), 24);
- log_atcommand (sd, "@recall %s", player_name);
- atcommand_recall (fd, sd, "@recall", player_name); // as @recall
- }
-
- return;
-}
-
-static
-void clif_parse_GMHide (int fd, struct map_session_data *sd)
-{ // Modified by [Yor]
- nullpo_retv (sd);
-
- //printf("%2x %2x %2x\n", RFIFOW(fd,0), RFIFOW(fd,2), RFIFOW(fd,4)); // R 019d <Option_value>.2B <flag>.2B
- if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) &&
- (pc_isGM (sd) >= get_atcommand_level (AtCommand_Hide)))
+ if (tmw_CheckChatSpam(sd, message))
{
- log_atcommand (sd, "@hide");
- if (sd->status.option & OPTION_HIDE)
- { // OPTION_HIDE = 0x40
- sd->status.option &= ~OPTION_HIDE; // OPTION_HIDE = 0x40
- clif_displaymessage (fd, "Invisible: Off.");
- }
- else
- {
- sd->status.option |= OPTION_HIDE; // OPTION_HIDE = 0x40
- clif_displaymessage (fd, "Invisible: On.");
- }
- clif_changeoption (&sd->bl);
- }
-}
-
-/*==========================================
- * GMによるチャット禁止時間付与
- *------------------------------------------
- */
-static
-void clif_parse_GMReqNoChat (int fd, struct map_session_data *sd)
-{
- int tid = RFIFOL (fd, 2);
- int type = RFIFOB (fd, 6);
- int limit = RFIFOW (fd, 7);
- struct block_list *bl = map_id2bl (tid);
- struct map_session_data *dstsd;
- int dstfd;
-
- nullpo_retv (sd);
-
- if (!battle_config.muting_players)
- {
- clif_displaymessage (fd, "Muting is disabled.");
+ free(buf);
+ clif_displaymessage(fd, "Your message could not be sent.");
return;
}
- if (type == 0)
- limit = 0 - limit;
- if (bl->type == BL_PC && (dstsd = (struct map_session_data *) bl))
- {
- if ((tid == bl->id && type == 2 && !pc_isGM (sd))
- || (pc_isGM (sd) > pc_isGM (dstsd)))
- {
- dstfd = dstsd->fd;
- WFIFOW (dstfd, 0) = 0x14b;
- WFIFOB (dstfd, 2) = (type == 2) ? 1 : type;
- memcpy (WFIFOP (dstfd, 3), sd->status.name, 24);
- WFIFOSET (dstfd, packet_len_table[0x14b]);
- dstsd->status.manner -= limit;
- if (dstsd->status.manner < 0)
- skill_status_change_start (bl, SC_NOCHAT, 0, 0, 0, 0, 0, 0);
- else
- {
- dstsd->status.manner = 0;
- skill_status_change_end (bl, SC_NOCHAT, -1);
- }
- printf ("name:%s type:%d limit:%d manner:%d\n",
- dstsd->status.name, type, limit, dstsd->status.manner);
- }
- }
-
- return;
-}
-
-/*==========================================
- * GMによるチャット禁止時間参照(?)
- *------------------------------------------
- */
-static
-void clif_parse_GMReqNoChatCount (int fd, struct map_session_data *sd)
-{
- int tid = RFIFOL (fd, 2);
-
- WFIFOW (fd, 0) = 0x1e0;
- WFIFOL (fd, 2) = tid;
- sprintf ((char *)WFIFOP (fd, 6), "%d", tid);
-// memcpy(WFIFOP(fd,6),"TESTNAME",24);
- WFIFOSET (fd, packet_len_table[0x1e0]);
-
- return;
-}
-
-static
-void clif_parse_PMIgnore (int fd, struct map_session_data *sd)
-{ // Rewritten by [Yor]
- char output[1024];
- char *nick; // S 00cf <nick>.24B <type>.B: 00 (/ex nick) deny speech from nick, 01 (/in nick) allow speech from nick
- int i;
- int pos;
-
- memset (output, '\0', sizeof (output));
-
- nick = (char *)RFIFOP (fd, 2); // speed up
- //printf("Ignore: char '%s' state: %d\n", nick, RFIFOB(fd,26));
- // we ask for deny (we add nick only if it's not already exist
- if (RFIFOB (fd, 26) == 0)
- { // type
- if (strlen (nick) >= 4 && strlen (nick) < 24)
- { // do something only if nick can be exist
- pos = -1;
- for (i = 0; i < (sizeof (sd->ignore) / sizeof (sd->ignore[0]));
- i++)
- {
- if (strcmp (sd->ignore[i].name, nick) == 0)
- break;
- else if (pos == -1 && sd->ignore[i].name[0] == '\0')
- pos = i;
- }
- WFIFOW (fd, 0) = 0x0d1; // R 00d1 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB (fd, 2) = 0;
- // if a position is found and name not found, we add it in the list
- if (pos != -1
- && i == (sizeof (sd->ignore) / sizeof (sd->ignore[0])))
- {
- memcpy (sd->ignore[pos].name, nick, 24);
- WFIFOB (fd, 3) = 0; // success
- WFIFOSET (fd, packet_len_table[0x0d1]);
- if (strcmp (wisp_server_name, nick) == 0)
- { // to found possible bot users that automaticaly ignores people.
- sprintf (output,
- "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?",
- sd->status.name, sd->status.account_id,
- wisp_server_name);
- intif_wis_message_to_gm (wisp_server_name,
- battle_config.hack_info_GM_level,
- output, strlen (output) + 1);
- // send something to be inform and force bot to ignore twice... If GM receiving block + block again, it's a bot :)
- clif_wis_message (fd, wisp_server_name,
- "Add me in your ignore list, doesn't block my wisps.",
- strlen
- ("Add me in your ignore list, doesn't block my wisps.")
- + 1);
- }
- }
- else
- {
- WFIFOB (fd, 3) = 1; // fail
- if (i == (sizeof (sd->ignore) / sizeof (sd->ignore[0])))
- {
- clif_wis_message (fd, wisp_server_name,
- "You can not block more people.",
- strlen
- ("You can not block more people.") + 1);
- if (strcmp (wisp_server_name, nick) == 0)
- { // to found possible bot users that automaticaly ignores people.
- sprintf (output,
- "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?",
- sd->status.name, sd->status.account_id,
- wisp_server_name);
- intif_wis_message_to_gm (wisp_server_name,
- battle_config.hack_info_GM_level,
- output, strlen (output) + 1);
- }
- }
- else
- {
- clif_wis_message (fd, wisp_server_name,
- "This player is already blocked.",
- strlen
- ("This player is already blocked.") +
- 1);
- if (strcmp (wisp_server_name, nick) == 0)
- { // to found possible bot users that automaticaly ignores people.
- sprintf (output,
- "Character '%s' (account: %d) has tried AGAIN to block wisps from '%s' (wisp name of the server). Bot user?",
- sd->status.name, sd->status.account_id,
- wisp_server_name);
- intif_wis_message_to_gm (wisp_server_name,
- battle_config.hack_info_GM_level,
- output, strlen (output) + 1);
- }
- }
- }
- }
- else
- clif_wis_message (fd, wisp_server_name,
- "It's impossible to block this player.",
- strlen ("It's impossible to block this player.")
- + 1);
- // we ask for allow (we remove all same nick if exist)
- }
- else
- {
- if (strlen (nick) >= 4 && strlen (nick) < 24)
- { // do something only if nick can be exist
- WFIFOW (fd, 0) = 0x0d1; // R 00d1 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB (fd, 2) = 1;
- for (i = 0; i < (sizeof (sd->ignore) / sizeof (sd->ignore[0]));
- i++)
- if (strcmp (sd->ignore[i].name, nick) == 0)
- {
- memset (sd->ignore[i].name, 0,
- sizeof (sd->ignore[i].name));
- WFIFOB (fd, 3) = 0; // success
- WFIFOSET (fd, packet_len_table[0x0d1]);
- break;
- }
- if (i == (sizeof (sd->ignore) / sizeof (sd->ignore[0])))
- {
- WFIFOB (fd, 3) = 1; // fail
- WFIFOSET (fd, packet_len_table[0x0d1]);
- clif_wis_message (fd, wisp_server_name,
- "This player is not blocked by you.",
- strlen
- ("This player is not blocked by you.") + 1);
- }
- }
- else
- clif_wis_message (fd, wisp_server_name,
- "It's impossible to unblock this player.",
- strlen
- ("It's impossible to unblock this player.") +
- 1);
- }
-
-// for(i = 0; i < (sizeof(sd->ignore) / sizeof(sd->ignore[0])); i++) // for debug only
-// if (sd->ignore[i].name[0] != '\0')
-// printf("Ignored player: '%s'\n", sd->ignore[i].name);
-
- return;
+ party_send_message(sd, message, RFIFOW(fd, 2) - 4);
+ free(buf);
}
+// 4144 wants this, but I don't like it ...
static
-void clif_parse_PMIgnoreAll (int fd, struct map_session_data *sd)
+void clif_parse_PMIgnoreAll(int fd, struct map_session_data *sd)
{ // Rewritten by [Yor]
- //printf("Ignore all: state: %d\n", RFIFOB(fd,2));
- if (RFIFOB (fd, 2) == 0)
+ //PRINTF("Ignore all: state: %d\n", RFIFOB(fd,2));
+ if (RFIFOB(fd, 2) == 0)
{ // S 00d0 <type>len.B: 00 (/exall) deny all speech, 01 (/inall) allow all speech
- WFIFOW (fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB (fd, 2) = 0;
+ WFIFOW(fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
+ WFIFOB(fd, 2) = 0;
if (sd->ignoreAll == 0)
{
sd->ignoreAll = 1;
- WFIFOB (fd, 3) = 0; // success
- WFIFOSET (fd, packet_len_table[0x0d2]);
+ WFIFOB(fd, 3) = 0; // success
+ WFIFOSET(fd, clif_parse_func_table[0x0d2].len);
}
else
{
- WFIFOB (fd, 3) = 1; // fail
- WFIFOSET (fd, packet_len_table[0x0d2]);
- clif_wis_message (fd, wisp_server_name,
+ WFIFOB(fd, 3) = 1; // fail
+ WFIFOSET(fd, clif_parse_func_table[0x0d2].len);
+ clif_wis_message(fd, wisp_server_name,
"You already block everyone.",
- strlen ("You already block everyone.") + 1);
+ strlen("You already block everyone.") + 1);
}
}
else
{
- WFIFOW (fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB (fd, 2) = 1;
+ WFIFOW(fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
+ WFIFOB(fd, 2) = 1;
if (sd->ignoreAll == 1)
{
sd->ignoreAll = 0;
- WFIFOB (fd, 3) = 0; // success
- WFIFOSET (fd, packet_len_table[0x0d2]);
+ WFIFOB(fd, 3) = 0; // success
+ WFIFOSET(fd, clif_parse_func_table[0x0d2].len);
}
else
{
- WFIFOB (fd, 3) = 1; // fail
- WFIFOSET (fd, packet_len_table[0x0d2]);
- clif_wis_message (fd, wisp_server_name,
+ WFIFOB(fd, 3) = 1; // fail
+ WFIFOSET(fd, clif_parse_func_table[0x0d2].len);
+ clif_wis_message(fd, wisp_server_name,
"You already allow everyone.",
- strlen ("You already allow everyone.") + 1);
+ strlen("You already allow everyone.") + 1);
}
}
return;
}
-static
-void clif_parse_skillMessage (int fd, struct map_session_data *sd)
-{ // Added by RoVeRT
- int skillid, skilllv, x, y;
- char *mes;
-
- skilllv = RFIFOW (fd, 2);
- skillid = RFIFOW (fd, 4);
-
- y = RFIFOB (fd, 6);
- x = RFIFOB (fd, 8);
-
- mes = (char *)RFIFOP (fd, 10);
-
- // skill 220 = graffiti
-// printf("skill: %d %d location: %3d %3d message: %s\n", skillid, skilllv, x, y, (char*)mes);
-}
-
-static
-int monk (struct map_session_data *sd, struct block_list *target, int type)
-{
-//R 01d1 <Monk id>L <Target monster id>L <Bool>L
- int fd = sd->fd;
- WFIFOW (fd, 0) = 0x1d1;
- WFIFOL (fd, 2) = sd->bl.id;
- WFIFOL (fd, 6) = target->id;
- WFIFOL (fd, 10) = type;
- WFIFOSET (fd, packet_len_table[0x1d1]);
-
- return 0;
-}
-
-/*==========================================
- * スパノビの/doridoriによるSPR2倍
- *------------------------------------------
- */
-static
-void clif_parse_sn_doridori (int fd, struct map_session_data *sd)
-{
- if (sd)
- sd->doridori_counter = 1;
-
- return;
-}
-
-/*==========================================
- * スパノビの爆裂波動
- *------------------------------------------
- */
-static
-void clif_parse_sn_explosionspirits (int fd, struct map_session_data *sd)
-{
- if (sd)
- {
- int nextbaseexp = pc_nextbaseexp (sd);
- struct pc_base_job s_class = pc_calc_base_job (sd->status.pc_class);
- if (battle_config.etc_log)
- {
- if (nextbaseexp != 0)
- printf ("SuperNovice explosionspirits!! %d %d %d %d\n",
- sd->bl.id, s_class.job, sd->status.base_exp,
- (int) ((double) 1000 * sd->status.base_exp /
- nextbaseexp));
- else
- printf ("SuperNovice explosionspirits!! %d %d %d 000\n",
- sd->bl.id, s_class.job, sd->status.base_exp);
- }
- if (s_class.job == 23 && sd->status.base_exp > 0 && nextbaseexp > 0
- && (int) ((double) 1000 * sd->status.base_exp / nextbaseexp) %
- 100 == 0)
- {
- clif_skill_nodamage (&sd->bl, &sd->bl, MO_EXPLOSIONSPIRITS, 5, 1);
- skill_status_change_start (&sd->bl,
- SkillStatusChangeTable
- [MO_EXPLOSIONSPIRITS], 5, 0, 0, 0,
- skill_get_time (MO_EXPLOSIONSPIRITS,
- 5), 0);
- }
- }
- return;
-}
-
-// functions list. Rate is how many milliseconds are required between
-// calls. Packets exceeding this rate will be dropped. flood_rates in
-// map.h must be the same length as this table. rate 0 is default
-// rate -1 is unlimited
-typedef struct func_table
-{
- void (*func)(int fd, struct map_session_data *sd);
- int rate;
-} func_table;
-// *INDENT-OFF*
-func_table clif_parse_func_table[0x220] =
-{
- { NULL, 0 }, // 0
- { NULL, 0 }, // 1
- { NULL, 0 }, // 2
- { NULL, 0 }, // 3
- { NULL, 0 }, // 4
- { NULL, 0 }, // 5
- { NULL, 0 }, // 6
- { NULL, 0 }, // 7
- { NULL, 0 }, // 8
- { NULL, 0 }, // 9
- { NULL, 0 }, // a
- { NULL, 0 }, // b
- { NULL, 0 }, // c
- { NULL, 0 }, // d
- { NULL, 0 }, // e
- { NULL, 0 }, // f
- { NULL, 0 }, // 10
- { NULL, 0 }, // 11
- { NULL, 0 }, // 12
- { NULL, 0 }, // 13
- { NULL, 0 }, // 14
- { NULL, 0 }, // 15
- { NULL, 0 }, // 16
- { NULL, 0 }, // 17
- { NULL, 0 }, // 18
- { NULL, 0 }, // 19
- { NULL, 0 }, // 1a
- { NULL, 0 }, // 1b
- { NULL, 0 }, // 1c
- { NULL, 0 }, // 1d
- { NULL, 0 }, // 1e
- { NULL, 0 }, // 1f
- { NULL, 0 }, // 20
- { NULL, 0 }, // 21
- { NULL, 0 }, // 22
- { NULL, 0 }, // 23
- { NULL, 0 }, // 24
- { NULL, 0 }, // 25
- { NULL, 0 }, // 26
- { NULL, 0 }, // 27
- { NULL, 0 }, // 28
- { NULL, 0 }, // 29
- { NULL, 0 }, // 2a
- { NULL, 0 }, // 2b
- { NULL, 0 }, // 2c
- { NULL, 0 }, // 2d
- { NULL, 0 }, // 2e
- { NULL, 0 }, // 2f
- { NULL, 0 }, // 30
- { NULL, 0 }, // 31
- { NULL, 0 }, // 32
- { NULL, 0 }, // 33
- { NULL, 0 }, // 34
- { NULL, 0 }, // 35
- { NULL, 0 }, // 36
- { NULL, 0 }, // 37
- { NULL, 0 }, // 38
- { NULL, 0 }, // 39
- { NULL, 0 }, // 3a
- { NULL, 0 }, // 3b
- { NULL, 0 }, // 3c
- { NULL, 0 }, // 3d
- { NULL, 0 }, // 3e
- { NULL, 0 }, // 3f
- { NULL, 0 }, // 40
- { NULL, 0 }, // 41
- { NULL, 0 }, // 42
- { NULL, 0 }, // 43
- { NULL, 0 }, // 44
- { NULL, 0 }, // 45
- { NULL, 0 }, // 46
- { NULL, 0 }, // 47
- { NULL, 0 }, // 48
- { NULL, 0 }, // 49
- { NULL, 0 }, // 4a
- { NULL, 0 }, // 4b
- { NULL, 0 }, // 4c
- { NULL, 0 }, // 4d
- { NULL, 0 }, // 4e
- { NULL, 0 }, // 4f
- { NULL, 0 }, // 50
- { NULL, 0 }, // 51
- { NULL, 0 }, // 52
- { NULL, 0 }, // 53
- { NULL, 0 }, // 54
- { NULL, 0 }, // 55
- { NULL, 0 }, // 56
- { NULL, 0 }, // 57
- { NULL, 0 }, // 58
- { NULL, 0 }, // 59
- { NULL, 0 }, // 5a
- { NULL, 0 }, // 5b
- { NULL, 0 }, // 5c
- { NULL, 0 }, // 5d
- { NULL, 0 }, // 5e
- { NULL, 0 }, // 5f
- { NULL, 0 }, // 60
- { NULL, 0 }, // 61
- { NULL, 0 }, // 62
- { NULL, 0 }, // 63
- { NULL, 0 }, // 64
- { NULL, 0 }, // 65
- { NULL, 0 }, // 66
- { NULL, 0 }, // 67
- { NULL, 0 }, // 68
- { NULL, 0 }, // 69
- { NULL, 0 }, // 6a
- { NULL, 0 }, // 6b
- { NULL, 0 }, // 6c
- { NULL, 0 }, // 6d
- { NULL, 0 }, // 6e
- { NULL, 0 }, // 6f
- { NULL, 0 }, // 70
- { NULL, 0 }, // 71
- { clif_parse_WantToConnection, 0 }, // 72
- { NULL, 0 }, // 73
- { NULL, 0 }, // 74
- { NULL, 0 }, // 75
- { NULL, 0 }, // 76
- { NULL, 0 }, // 77
- { NULL, 0 }, // 78
- { NULL, 0 }, // 79
- { NULL, 0 }, // 7a
- { NULL, 0 }, // 7b
- { NULL, 0 }, // 7c
- { clif_parse_LoadEndAck, -1 }, // 7d
- { clif_parse_TickSend, 0 }, // 7e
- { NULL, 0 }, // 7f
- { NULL, 0 }, // 80
- { NULL, 0 }, // 81
- { NULL, 0 }, // 82
- { NULL, 0 }, // 83
- { NULL, 0 }, // 84
- { clif_parse_WalkToXY, -1 }, // 85 Walk code limits this on it's own
- { NULL, 0 }, // 86
- { NULL, 0 }, // 87
- { NULL, 0 }, // 88
- { clif_parse_ActionRequest, 1000 }, // 89 Special case - see below
- { NULL, 0 }, // 8a
- { NULL, 0 }, // 8b
- { clif_parse_GlobalMessage, 300 }, // 8c
- { NULL, 0 }, // 8d
- { NULL, 0 }, // 8e
- { NULL, 0 }, // 8f
- { clif_parse_NpcClicked, 500 }, // 90
- { NULL, 0 }, // 91
- { NULL, 0 }, // 92
- { NULL, 0 }, // 93
- { clif_parse_GetCharNameRequest, -1 }, // 94
- { NULL, 0 }, // 95
- { clif_parse_Wis, 300 }, // 96
- { NULL, 0 }, // 97
- { NULL, 0 }, // 98
- { clif_parse_GMmessage, 300 }, // 99
- { NULL, 0 }, // 9a
- { clif_parse_ChangeDir, -1 }, // 9b
- { NULL, 0 }, // 9c
- { NULL, 0 }, // 9d
- { NULL, 0 }, // 9e
- { clif_parse_TakeItem, 400 }, // 9f
- { NULL, 0 }, // a0
- { NULL, 0 }, // a1
- { clif_parse_DropItem, 50 }, // a2
- { NULL, 0 }, // a3
- { NULL, 0 }, // a4
- { NULL, 0 }, // a5
- { NULL, 0 }, // a6
- { clif_parse_UseItem, 0 }, // a7
- { NULL, 0 }, // a8
- { clif_parse_EquipItem, -1 }, // a9 Special case - outfit window (not implemented yet - needs to allow bursts)
- { NULL, 0 }, // aa
- { clif_parse_UnequipItem, -1 }, // ab Special case - outfit window (not implemented yet - needs to allow bursts)
- { NULL, 0 }, // ac
- { NULL, 0 }, // ad
- { NULL, 0 }, // ae
- { NULL, 0 }, // af
- { NULL, 0 }, // b0
- { NULL, 0 }, // b1
- { clif_parse_Restart, 0 }, // b2
- { NULL, 0 }, // b3
- { NULL, 0 }, // b4
- { NULL, 0 }, // b5
- { NULL, 0 }, // b6
- { NULL, 0 }, // b7
- { clif_parse_NpcSelectMenu, 0 }, // b8
- { clif_parse_NpcNextClicked, -1 }, // b9
- { NULL, 0 }, // ba
- { clif_parse_StatusUp, -1 }, // bb People click this very quickly
- { NULL, 0 }, // bc
- { NULL, 0 }, // bd
- { NULL, 0 }, // be
- { clif_parse_Emotion, 1000 }, // bf
- { NULL, 0 }, // c0
- { clif_parse_HowManyConnections, 0 }, // c1
- { NULL, 0 }, // c2
- { NULL, 0 }, // c3
- { NULL, 0 }, // c4
- { clif_parse_NpcBuySellSelected, 0 }, // c5
- { NULL, 0 }, // c6
- { NULL, 0 }, // c7
- { clif_parse_NpcBuyListSend, -1 }, // c8
- { clif_parse_NpcSellListSend, -1 }, // c9 Selling multiple 1-slot items
- { NULL, 0 }, // ca
- { NULL, 0 }, // cb
- { clif_parse_GMKick, 0 }, // cc
- { NULL, 0 }, // cd
- { NULL, 0 }, // ce
- { clif_parse_PMIgnore, 0 }, // cf
- { clif_parse_PMIgnoreAll, 0 }, // d0
- { NULL, 0 }, // d1
- { NULL, 0 }, // d2
- { NULL, 0 }, // d3
- { NULL, 0 }, // d4
- { clif_parse_CreateChatRoom, 1000 }, // d5
- { NULL, 0 }, // d6
- { NULL, 0 }, // d7
- { NULL, 0 }, // d8
- { clif_parse_ChatAddMember, 0 }, // d9
- { NULL, 0 }, // da
- { NULL, 0 }, // db
- { NULL, 0 }, // dc
- { NULL, 0 }, // dd
- { clif_parse_ChatRoomStatusChange, 0 }, // de
- { NULL, 0 }, // df
- { clif_parse_ChangeChatOwner, 0 }, // e0
- { NULL, 0 }, // e1
- { clif_parse_KickFromChat, 0 }, // e2
- { clif_parse_ChatLeave, 0 }, // e3
- { clif_parse_TradeRequest, 2000 }, // e4
- { NULL, 0 }, // e5
- { clif_parse_TradeAck, 0 }, // e6
- { NULL, 0 }, // e7
- { clif_parse_TradeAddItem, 0 }, // e8
- { NULL, 0 }, // e9
- { NULL, 0 }, // ea
- { clif_parse_TradeOk, 0 }, // eb
- { NULL, 0 }, // ec
- { clif_parse_TradeCansel, 0 }, // ed
- { NULL, 0 }, // ee
- { clif_parse_TradeCommit, 0 }, // ef
- { NULL, 0 }, // f0
- { NULL, 0 }, // f1
- { NULL, 0 }, // f2
- { clif_parse_MoveToKafra, -1 }, // f3
- { NULL, 0 }, // f4
- { clif_parse_MoveFromKafra, -1 }, // f5
- { NULL, 0 }, // f6
- { clif_parse_CloseKafra, 0 }, // f7
- { NULL, 0 }, // f8
- { clif_parse_CreateParty, 2000 }, // f9
- { NULL, 0 }, // fa
- { NULL, 0 }, // fb
- { clif_parse_PartyInvite, 2000 }, // fc
- { NULL, 0 }, // fd
- { NULL, 0 }, // fe
- { clif_parse_ReplyPartyInvite, 0 }, // ff
- { clif_parse_LeaveParty, 0 }, // 100
- { NULL, 0 }, // 101
- { clif_parse_PartyChangeOption, 0 }, // 102
- { clif_parse_RemovePartyMember, 0 }, // 103
- { NULL, 0 }, // 104
- { NULL, 0 }, // 105
- { NULL, 0 }, // 106
- { NULL, 0 }, // 107
- { clif_parse_PartyMessage, 300 }, // 108
- { NULL, 0 }, // 109
- { NULL, 0 }, // 10a
- { NULL, 0 }, // 10b
- { NULL, 0 }, // 10c
- { NULL, 0 }, // 10d
- { NULL, 0 }, // 10e
- { NULL, 0 }, // 10f
- { NULL, 0 }, // 110
- { NULL, 0 }, // 111
- { clif_parse_SkillUp, -1 }, // 112
- { clif_parse_UseSkillToId, 0 }, // 113
- { NULL, 0 }, // 114
- { NULL, 0 }, // 115
- { clif_parse_UseSkillToPos, 0 }, // 116
- { NULL, 0 }, // 117
- { clif_parse_StopAttack, 0 }, // 118
- { NULL, 0 }, // 119
- { NULL, 0 }, // 11a
- { clif_parse_UseSkillMap, 0 }, // 11b
- { NULL, 0 }, // 11c
- { clif_parse_RequestMemo, 0 }, // 11d
- { NULL, 0 }, // 11e
- { NULL, 0 }, // 11f
- { NULL, 0 }, // 120
- { NULL, 0 }, // 121
- { NULL, 0 }, // 122
- { NULL, 0 }, // 123
- { NULL, 0 }, // 124
- { NULL, 0 }, // 125
- { clif_parse_PutItemToCart, 0 }, // 126
- { clif_parse_GetItemFromCart, 0 }, // 127
- { clif_parse_MoveFromKafraToCart, 0 }, // 128
- { clif_parse_MoveToKafraFromCart, 0 }, // 129
- { clif_parse_RemoveOption, 0 }, // 12a
- { NULL, 0 }, // 12b
- { NULL, 0 }, // 12c
- { NULL, 0 }, // 12d
- { NULL, 0 }, // 12e
- { NULL, 0 }, // 12f
- { NULL, 0 }, // 130
- { NULL, 0 }, // 131
- { NULL, 0 }, // 132
- { NULL, 0 }, // 133
- { NULL, 0 }, // 134
- { NULL, 0 }, // 135
- { NULL, 0 }, // 136
- { NULL, 0 }, // 137
- { NULL, 0 }, // 138
- { NULL, 0 }, // 139
- { NULL, 0 }, // 13a
- { NULL, 0 }, // 13b
- { NULL, 0 }, // 13c
- { NULL, 0 }, // 13d
- { NULL, 0 }, // 13e
- { clif_parse_GM_Monster_Item, 0 }, // 13f
- { clif_parse_MapMove, 0 }, // 140
- { NULL, 0 }, // 141
- { NULL, 0 }, // 142
- { clif_parse_NpcAmountInput, 300 }, // 143
- { NULL, 0 }, // 144
- { NULL, 0 }, // 145
- { clif_parse_NpcCloseClicked, 300 }, // 146
- { NULL, 0 }, // 147
- { NULL, 0 }, // 148
- { clif_parse_GMReqNoChat, 0 }, // 149
- { NULL, 0 }, // 14a
- { NULL, 0 }, // 14b
- { NULL, 0 }, // 14c
- { clif_parse_GuildCheckMaster, 0 }, // 14d
- { NULL, 0 }, // 14e
- { clif_parse_GuildReqeustInfo, 0 }, // 14f
- { NULL, 0 }, // 150
- { clif_parse_GuildRequestEmblem, 0 }, // 151
- { NULL, 0 }, // 152
- { clif_parse_GuildChangeEmblem, 0 }, // 153
- { NULL, 0 }, // 154
- { clif_parse_GuildChangeMemberPosition, 0 }, // 155
- { NULL, 0 }, // 156
- { NULL, 0 }, // 157
- { NULL, 0 }, // 158
- { clif_parse_GuildLeave, 0 }, // 159
- { NULL, 0 }, // 15a
- { clif_parse_GuildExplusion, 0 }, // 15b
- { NULL, 0 }, // 15c
- { clif_parse_GuildBreak, 0 }, // 15d
- { NULL, 0 }, // 15e
- { NULL, 0 }, // 15f
- { NULL, 0 }, // 160
- { clif_parse_GuildChangePositionInfo, 0 }, // 161
- { NULL, 0 }, // 162
- { NULL, 0 }, // 163
- { NULL, 0 }, // 164
- { clif_parse_CreateGuild, 0 }, // 165
- { NULL, 0 }, // 166
- { NULL, 0 }, // 167
- { clif_parse_GuildInvite, 2000 }, // 168
- { NULL, 0 }, // 169
- { NULL, 0 }, // 16a
- { clif_parse_GuildReplyInvite, 0 }, // 16b
- { NULL, 0 }, // 16c
- { NULL, 0 }, // 16d
- { clif_parse_GuildChangeNotice, 0 }, // 16e
- { NULL, 0 }, // 16f
- { clif_parse_GuildRequestAlliance, 0 }, // 170
- { NULL, 0 }, // 171
- { clif_parse_GuildReplyAlliance, 0 }, // 172
- { NULL, 0 }, // 173
- { NULL, 0 }, // 174
- { NULL, 0 }, // 175
- { NULL, 0 }, // 176
- { NULL, 0 }, // 177
- { clif_parse_ItemIdentify, 0 }, // 178
- { NULL, 0 }, // 179
- { clif_parse_UseCard, 0 }, // 17a
- { NULL, 0 }, // 17b
- { clif_parse_InsertCard, 0 }, // 17c
- { NULL, 0 }, // 17d
- { clif_parse_GuildMessage, 300 }, // 17e
- { NULL, 0 }, // 17f
- { clif_parse_GuildOpposition, 0 }, // 180
- { NULL, 0 }, // 181
- { NULL, 0 }, // 182
- { clif_parse_GuildDelAlliance, 0 }, // 183
- { NULL, 0 }, // 184
- { NULL, 0 }, // 185
- { NULL, 0 }, // 186
- { NULL, 0 }, // 187
- { NULL, 0 }, // 188
- { NULL, 0 }, // 189
- { clif_parse_QuitGame, 0 }, // 18a
- { NULL, 0 }, // 18b
- { NULL, 0 }, // 18c
- { NULL, 0 }, // 18d
- { NULL, 0 }, // 18e
- { NULL, 0 }, // 18f
- { clif_parse_UseSkillToPos, 0 }, // 190
- { NULL, 0 }, // 191
- { NULL, 0 }, // 192
- { clif_parse_SolveCharName, 0 }, // 193
- { NULL, 0 }, // 194
- { NULL, 0 }, // 195
- { NULL, 0 }, // 196
- { clif_parse_ResetChar, 0 }, // 197
- { NULL, 0 }, // 198
- { NULL, 0 }, // 199
- { NULL, 0 }, // 19a
- { NULL, 0 }, // 19b
- { clif_parse_LGMmessage, 0 }, // 19c
- { clif_parse_GMHide, 300 }, // 19d
- { NULL, 0 }, // 19e
- { NULL, 0 }, // 19f
- { NULL, 0 }, // 1a0
- { NULL, 0 }, // 1a1
- { NULL, 0 }, // 1a2
- { NULL, 0 }, // 1a3
- { NULL, 0 }, // 1a4
- { NULL, 0 }, // 1a5
- { NULL, 0 }, // 1a6
- { NULL, 0 }, // 1a7
- { NULL, 0 }, // 1a8
- { NULL, 0 }, // 1a9
- { NULL, 0 }, // 1aa
- { NULL, 0 }, // 1ab
- { NULL, 0 }, // 1ac
- { NULL, 0 }, // 1ad
- { NULL, 0 }, // 1ae
- { clif_parse_ChangeCart, 0 }, // 1af
- { NULL, 0 }, // 1b0
- { NULL, 0 }, // 1b1
- { NULL, 0 }, // 1b2
- { NULL, 0 }, // 1b3
- { NULL, 0 }, // 1b4
- { NULL, 0 }, // 1b5
- { NULL, 0 }, // 1b6
- { NULL, 0 }, // 1b7
- { NULL, 0 }, // 1b8
- { NULL, 0 }, // 1b9
- { clif_parse_Shift, 300 }, // 1ba
- { clif_parse_Shift, 300 }, // 1bb
- { clif_parse_Recall, 300 }, // 1bc
- { clif_parse_Recall, 300 }, // 1bd
- { NULL, 0 }, // 1be
- { NULL, 0 }, // 1bf
- { NULL, 0 }, // 1c0
- { NULL, 0 }, // 1c1
- { NULL, 0 }, // 1c2
- { NULL, 0 }, // 1c3
- { NULL, 0 }, // 1c4
- { NULL, 0 }, // 1c5
- { NULL, 0 }, // 1c6
- { NULL, 0 }, // 1c7
- { NULL, 0 }, // 1c8
- { NULL, 0 }, // 1c9
- { NULL, 0 }, // 1ca
- { NULL, 0 }, // 1cb
- { NULL, 0 }, // 1cc
- { NULL, 0 }, // 1cd
- { clif_parse_AutoSpell, 0 }, // 1ce
- { NULL, 0 }, // 1cf
- { NULL, 0 }, // 1d0
- { NULL, 0 }, // 1d1
- { NULL, 0 }, // 1d2
- { NULL, 0 }, // 1d3
- { NULL, 0 }, // 1d4
- { clif_parse_NpcStringInput, 300 }, // 1d5
- { NULL, 0 }, // 1d6
- { NULL, 0 }, // 1d7
- { NULL, 0 }, // 1d8
- { NULL, 0 }, // 1d9
- { NULL, 0 }, // 1da
- { NULL, 0 }, // 1db
- { NULL, 0 }, // 1dc
- { NULL, 0 }, // 1dd
- { NULL, 0 }, // 1de
- { clif_parse_GMReqNoChatCount, 0 }, // 1df
- { NULL, 0 }, // 1e0
- { NULL, 0 }, // 1e1
- { NULL, 0 }, // 1e2
- { NULL, 0 }, // 1e3
- { NULL, 0 }, // 1e4
- { NULL, 0 }, // 1e5
- { NULL, 0 }, // 1e6
- { clif_parse_sn_doridori, 0 }, // 1e7
- { clif_parse_CreateParty2, 1000 }, // 1e8
- { NULL, 0 }, // 1e9
- { NULL, 0 }, // 1ea
- { NULL, 0 }, // 1eb
- { NULL, 0 }, // 1ec
- { clif_parse_sn_explosionspirits, 0 }, // 1ed
- { NULL, 0 }, // 1ee
- { NULL, 0 }, // 1ef
- { NULL, 0 }, // 1f0
- { NULL, 0 }, // 1f1
- { NULL, 0 }, // 1f2
- { NULL, 0 }, // 1f3
- { NULL, 0 }, // 1f4
- { NULL, 0 }, // 1f5
- { NULL, 0 }, // 1f6
- { NULL, 0 }, // 1f7
- { NULL, 0 }, // 1f8
- { NULL, 0 }, // 1f9
- { NULL, 0 }, // 1fa
- { NULL, 0 }, // 1fb
- { NULL, 0 }, // 1fc
- { NULL, 0 }, // 1fd
- { NULL, 0 }, // 1fe
- { NULL, 0 }, // 1ff
- { NULL, 0 }, // 200
- { NULL, 0 }, // 201
- { NULL, 0 }, // 202
- { NULL, 0 }, // 203
- { NULL, 0 }, // 204
- { NULL, 0 }, // 205
- { NULL, 0 }, // 206
- { NULL, 0 }, // 207
- { NULL, 0 }, // 208
- { NULL, 0 }, // 209
- { NULL, 0 }, // 20a
- { NULL, 0 }, // 20b
- { NULL, 0 }, // 20c
- { NULL, 0 }, // 20d
- { NULL, 0 }, // 20e
- { NULL, 0 }, // 20f
- { NULL, 0 }, // 210
- { NULL, 0 }, // 211
- { NULL, 0 }, // 212
- { NULL, 0 }, // 213
- { NULL, 0 }, // 214
- { NULL, 0 }, // 215
- { NULL, 0 }, // 216
- { NULL, 0 }, // 217
- { NULL, 0 }, // 218
- { NULL, 0 }, // 219
- { NULL, 0 }, // 21a
- { NULL, 0 }, // 21b
- { NULL, 0 }, // 21c
- { NULL, 0 }, // 21d
- { NULL, 0 }, // 21e
- { NULL, 0 }, // 21f
+func_table clif_parse_func_table[0x0220] =
+{
+ {0, 10, NULL, }, // 0x0000
+ {0, 0, NULL, }, // 0x0001
+ {0, 0, NULL, }, // 0x0002
+ {0, 0, NULL, }, // 0x0003
+ {0, 0, NULL, }, // 0x0004
+ {0, 0, NULL, }, // 0x0005
+ {0, 0, NULL, }, // 0x0006
+ {0, 0, NULL, }, // 0x0007
+ {0, 0, NULL, }, // 0x0008
+ {0, 0, NULL, }, // 0x0009
+ {0, 0, NULL, }, // 0x000a
+ {0, 0, NULL, }, // 0x000b
+ {0, 0, NULL, }, // 0x000c
+ {0, 0, NULL, }, // 0x000d
+ {0, 0, NULL, }, // 0x000e
+ {0, 0, NULL, }, // 0x000f
+ {0, 0, NULL, }, // 0x0010
+ {0, 0, NULL, }, // 0x0011
+ {0, 0, NULL, }, // 0x0012
+ {0, 0, NULL, }, // 0x0013
+ {0, 0, NULL, }, // 0x0014
+ {0, 0, NULL, }, // 0x0015
+ {0, 0, NULL, }, // 0x0016
+ {0, 0, NULL, }, // 0x0017
+ {0, 0, NULL, }, // 0x0018
+ {0, 0, NULL, }, // 0x0019
+ {0, 0, NULL, }, // 0x001a
+ {0, 0, NULL, }, // 0x001b
+ {0, 0, NULL, }, // 0x001c
+ {0, 0, NULL, }, // 0x001d
+ {0, 0, NULL, }, // 0x001e
+ {0, 0, NULL, }, // 0x001f
+ {0, 0, NULL, }, // 0x0020
+ {0, 0, NULL, }, // 0x0021
+ {0, 0, NULL, }, // 0x0022
+ {0, 0, NULL, }, // 0x0023
+ {0, 0, NULL, }, // 0x0024
+ {0, 0, NULL, }, // 0x0025
+ {0, 0, NULL, }, // 0x0026
+ {0, 0, NULL, }, // 0x0027
+ {0, 0, NULL, }, // 0x0028
+ {0, 0, NULL, }, // 0x0029
+ {0, 0, NULL, }, // 0x002a
+ {0, 0, NULL, }, // 0x002b
+ {0, 0, NULL, }, // 0x002c
+ {0, 0, NULL, }, // 0x002d
+ {0, 0, NULL, }, // 0x002e
+ {0, 0, NULL, }, // 0x002f
+ {0, 0, NULL, }, // 0x0030
+ {0, 0, NULL, }, // 0x0031
+ {0, 0, NULL, }, // 0x0032
+ {0, 0, NULL, }, // 0x0033
+ {0, 0, NULL, }, // 0x0034
+ {0, 0, NULL, }, // 0x0035
+ {0, 0, NULL, }, // 0x0036
+ {0, 0, NULL, }, // 0x0037
+ {0, 0, NULL, }, // 0x0038
+ {0, 0, NULL, }, // 0x0039
+ {0, 0, NULL, }, // 0x003a
+ {0, 0, NULL, }, // 0x003b
+ {0, 0, NULL, }, // 0x003c
+ {0, 0, NULL, }, // 0x003d
+ {0, 0, NULL, }, // 0x003e
+ {0, 0, NULL, }, // 0x003f
+ {0, 0, NULL, }, // 0x0040
+ {0, 0, NULL, }, // 0x0041
+ {0, 0, NULL, }, // 0x0042
+ {0, 0, NULL, }, // 0x0043
+ {0, 0, NULL, }, // 0x0044
+ {0, 0, NULL, }, // 0x0045
+ {0, 0, NULL, }, // 0x0046
+ {0, 0, NULL, }, // 0x0047
+ {0, 0, NULL, }, // 0x0048
+ {0, 0, NULL, }, // 0x0049
+ {0, 0, NULL, }, // 0x004a
+ {0, 0, NULL, }, // 0x004b
+ {0, 0, NULL, }, // 0x004c
+ {0, 0, NULL, }, // 0x004d
+ {0, 0, NULL, }, // 0x004e
+ {0, 0, NULL, }, // 0x004f
+ {0, 0, NULL, }, // 0x0050
+ {0, 0, NULL, }, // 0x0051
+ {0, 0, NULL, }, // 0x0052
+ {0, 0, NULL, }, // 0x0053
+ {0, 0, NULL, }, // 0x0054
+ {0, 0, NULL, }, // 0x0055
+ {0, 0, NULL, }, // 0x0056
+ {0, 0, NULL, }, // 0x0057
+ {0, 0, NULL, }, // 0x0058
+ {0, 0, NULL, }, // 0x0059
+ {0, 0, NULL, }, // 0x005a
+ {0, 0, NULL, }, // 0x005b
+ {0, 0, NULL, }, // 0x005c
+ {0, 0, NULL, }, // 0x005d
+ {0, 0, NULL, }, // 0x005e
+ {0, 0, NULL, }, // 0x005f
+ {0, 0, NULL, }, // 0x0060
+ {0, 0, NULL, }, // 0x0061
+ {0, 0, NULL, }, // 0x0062
+ {0, VAR,NULL, }, // 0x0063
+ {0, 55, NULL, }, // 0x0064
+ {0, 17, NULL, }, // 0x0065
+ {0, 3, NULL, }, // 0x0066
+ {0, 37, NULL, }, // 0x0067
+ {0, 46, NULL, }, // 0x0068
+ {0, VAR,NULL, }, // 0x0069
+ {0, 23, NULL, }, // 0x006a
+ {0, VAR,NULL, }, // 0x006b
+ {0, 3, NULL, }, // 0x006c
+ {0, 108,NULL, }, // 0x006d
+ {0, 3, NULL, }, // 0x006e
+ {0, 2, NULL, }, // 0x006f
+ {0, 3, NULL, }, // 0x0070
+ {0, 28, NULL, }, // 0x0071
+ {0, 19, clif_parse_WantToConnection, }, // 0x0072
+ {0, 11, NULL, }, // 0x0073
+ {0, 3, NULL, }, // 0x0074
+ {0, VAR,NULL, }, // 0x0075
+ {0, 9, NULL, }, // 0x0076
+ {0, 5, NULL, }, // 0x0077
+ {0, 54, NULL, }, // 0x0078
+ {0, 53, NULL, }, // 0x0079
+ {0, 58, NULL, }, // 0x007a
+ {0, 60, NULL, }, // 0x007b
+ {0, 41, NULL, }, // 0x007c
+ {-1, 2, clif_parse_LoadEndAck, }, // 0x007d
+ {0, 6, clif_parse_TickSend, }, // 0x007e
+ {0, 6, NULL, }, // 0x007f
+ {0, 7, NULL, }, // 0x0080
+ {0, 3, NULL, }, // 0x0081
+ {0, 2, NULL, }, // 0x0082
+ {0, 2, NULL, }, // 0x0083
+ {0, 2, NULL, }, // 0x0084
+ {-1, 5, clif_parse_WalkToXY, }, // 0x0085 Walk code limits this on it's own
+ {0, 16, NULL, }, // 0x0086
+ {0, 12, NULL, }, // 0x0087
+ {0, 10, NULL, }, // 0x0088
+ {1000, 7, clif_parse_ActionRequest, }, // 0x0089 Special case - see below
+ {0, 29, NULL, }, // 0x008a
+ {0, 23, NULL, }, // 0x008b unknown... size 2 or 23?
+ {300, VAR,clif_parse_GlobalMessage, }, // 0x008c
+ {0, VAR,NULL, }, // 0x008d
+ {0, VAR,NULL, }, // 0x008e
+ {0, 0, NULL, }, // 0x008f
+ {500, 7, clif_parse_NpcClicked, }, // 0x0090
+ {0, 22, NULL, }, // 0x0091
+ {0, 28, NULL, }, // 0x0092
+ {0, 2, NULL, }, // 0x0093
+ {-1, 6, clif_parse_GetCharNameRequest, }, // 0x0094
+ {0, 30, NULL, }, // 0x0095
+ {300, VAR,clif_parse_Wis, }, // 0x0096
+ {0, VAR,NULL, }, // 0x0097
+ {0, 3, NULL, }, // 0x0098
+ {300, VAR,NULL, }, // 0x0099
+ {0, VAR,NULL, }, // 0x009a
+ {-1, 5, clif_parse_ChangeDir, }, // 0x009b
+ {0, 9, NULL, }, // 0x009c
+ {0, 17, NULL, }, // 0x009d
+ {0, 17, NULL, }, // 0x009e
+ {400, 6, clif_parse_TakeItem, }, // 0x009f
+ {0, 23, NULL, }, // 0x00a0
+ {0, 6, NULL, }, // 0x00a1
+ {50, 6, clif_parse_DropItem, }, // 0x00a2
+ {0, VAR,NULL, }, // 0x00a3
+ {0, VAR,NULL, }, // 0x00a4
+ {0, VAR,NULL, }, // 0x00a5
+ {0, VAR,NULL, }, // 0x00a6
+ {0, 8, clif_parse_UseItem, }, // 0x00a7
+ {0, 7, NULL, }, // 0x00a8
+ {-1, 6, clif_parse_EquipItem, }, // 0x00a9 Special case - outfit window (not implemented yet - needs to allow bursts)
+ {0, 7, NULL, }, // 0x00aa
+ {-1, 4, clif_parse_UnequipItem, }, // 0x00ab Special case - outfit window (not implemented yet - needs to allow bursts)
+ {0, 7, NULL, }, // 0x00ac
+ {0, 0, NULL, }, // 0x00ad
+ {0, VAR,NULL, }, // 0x00ae
+ {0, 6, NULL, }, // 0x00af
+ {0, 8, NULL, }, // 0x00b0
+ {0, 8, NULL, }, // 0x00b1
+ {0, 3, clif_parse_Restart, }, // 0x00b2
+ {0, 3, NULL, }, // 0x00b3
+ {0, VAR,NULL, }, // 0x00b4
+ {0, 6, NULL, }, // 0x00b5
+ {0, 6, NULL, }, // 0x00b6
+ {0, VAR,NULL, }, // 0x00b7
+ {0, 7, clif_parse_NpcSelectMenu, }, // 0x00b8
+ {-1, 6, clif_parse_NpcNextClicked, }, // 0x00b9
+ {0, 2, NULL, }, // 0x00ba
+ {-1, 5, clif_parse_StatusUp, }, // 0x00bb People click this very quickly
+ {0, 6, NULL, }, // 0x00bc
+ {0, 44, NULL, }, // 0x00bd
+ {0, 5, NULL, }, // 0x00be
+ {1000, 3, clif_parse_Emotion, }, // 0x00bf
+ {0, 7, NULL, }, // 0x00c0
+ {0, 2, clif_parse_HowManyConnections, }, // 0x00c1
+ {0, 6, NULL, }, // 0x00c2
+ {0, 8, NULL, }, // 0x00c3
+ {0, 6, NULL, }, // 0x00c4
+ {0, 7, clif_parse_NpcBuySellSelected, }, // 0x00c5
+ {0, VAR,NULL, }, // 0x00c6
+ {0, VAR,NULL, }, // 0x00c7
+ {-1, VAR,clif_parse_NpcBuyListSend, }, // 0x00c8
+ {-1, VAR,clif_parse_NpcSellListSend, }, // 0x00c9 Selling multiple 1-slot items
+ {0, 3, NULL, }, // 0x00ca
+ {0, 3, NULL, }, // 0x00cb
+ {0, 6, NULL, }, // 0x00cc
+ {0, 6, NULL, }, // 0x00cd
+ {0, 2, NULL, }, // 0x00ce
+ {0, 27, NULL, }, // 0x00cf
+ {0, 3, clif_parse_PMIgnoreAll, }, // 0x00d0
+ {0, 4, NULL, }, // 0x00d1
+ {0, 4, NULL, }, // 0x00d2
+ {0, 2, NULL, }, // 0x00d3
+ {0, VAR,NULL, }, // 0x00d4
+ {0, VAR,NULL, }, // 0x00d5
+ {0, 3, NULL, }, // 0x00d6
+ {0, VAR,NULL, }, // 0x00d7
+ {0, 6, NULL, }, // 0x00d8
+ {0, 14, NULL, }, // 0x00d9
+ {0, 3, NULL, }, // 0x00da
+ {0, VAR,NULL, }, // 0x00db
+ {0, 28, NULL, }, // 0x00dc
+ {0, 29, NULL, }, // 0x00dd
+ {0, VAR,NULL, }, // 0x00de
+ {0, VAR,NULL, }, // 0x00df
+ {0, 30, NULL, }, // 0x00e0
+ {0, 30, NULL, }, // 0x00e1
+ {0, 26, NULL, }, // 0x00e2
+ {0, 2, NULL, }, // 0x00e3
+ {2000, 6, clif_parse_TradeRequest, }, // 0x00e4
+ {0, 26, NULL, }, // 0x00e5
+ {0, 3, clif_parse_TradeAck, }, // 0x00e6
+ {0, 3, NULL, }, // 0x00e7
+ {0, 8, clif_parse_TradeAddItem, }, // 0x00e8
+ {0, 19, NULL, }, // 0x00e9
+ {0, 5, NULL, }, // 0x00ea
+ {0, 2, clif_parse_TradeOk, }, // 0x00eb
+ {0, 3, NULL, }, // 0x00ec
+ {0, 2, clif_parse_TradeCansel, }, // 0x00ed
+ {0, 2, NULL, }, // 0x00ee
+ {0, 2, clif_parse_TradeCommit, }, // 0x00ef
+ {0, 3, NULL, }, // 0x00f0
+ {0, 2, NULL, }, // 0x00f1
+ {0, 6, NULL, }, // 0x00f2
+ {-1, 8, clif_parse_MoveToKafra, }, // 0x00f3
+ {0, 21, NULL, }, // 0x00f4
+ {-1, 8, clif_parse_MoveFromKafra, }, // 0x00f5
+ {0, 8, NULL, }, // 0x00f6
+ {0, 2, clif_parse_CloseKafra, }, // 0x00f7
+ {0, 2, NULL, }, // 0x00f8
+ {2000, 26, clif_parse_CreateParty, }, // 0x00f9
+ {0, 3, NULL, }, // 0x00fa
+ {0, VAR,NULL, }, // 0x00fb
+ {2000, 6, clif_parse_PartyInvite, }, // 0x00fc
+ {0, 27, NULL, }, // 0x00fd
+ {0, 30, NULL, }, // 0x00fe
+ {0, 10, clif_parse_ReplyPartyInvite, }, // 0x00ff
+ {0, 2, clif_parse_LeaveParty, }, // 0x0100
+ {0, 6, NULL, }, // 0x0101
+ {0, 6, clif_parse_PartyChangeOption, }, // 0x0102
+ {0, 30, clif_parse_RemovePartyMember, }, // 0x0103
+ {0, 79, NULL, }, // 0x0104
+ {0, 31, NULL, }, // 0x0105
+ {0, 10, NULL, }, // 0x0106
+ {0, 10, NULL, }, // 0x0107
+ {300, VAR,clif_parse_PartyMessage, }, // 0x0108
+ {0, VAR,NULL, }, // 0x0109
+ {0, 4, NULL, }, // 0x010a
+ {0, 6, NULL, }, // 0x010b
+ {0, 6, NULL, }, // 0x010c
+ {0, 2, NULL, }, // 0x010d
+ {0, 11, NULL, }, // 0x010e
+ {0, VAR,NULL, }, // 0x010f
+ {0, 10, NULL, }, // 0x0110
+ {0, 39, NULL, }, // 0x0111
+ {-1, 4, clif_parse_SkillUp, }, // 0x0112
+ {0, 10, NULL, }, // 0x0113
+ {0, 31, NULL, }, // 0x0114
+ {0, 35, NULL, }, // 0x0115
+ {0, 10, NULL, }, // 0x0116
+ {0, 18, NULL, }, // 0x0117
+ {0, 2, clif_parse_StopAttack, }, // 0x0118
+ {0, 13, NULL, }, // 0x0119
+ {0, 15, NULL, }, // 0x011a
+ {0, 20, NULL, }, // 0x011b
+ {0, 68, NULL, }, // 0x011c
+ {0, 2, NULL, }, // 0x011d
+ {0, 3, NULL, }, // 0x011e
+ {0, 16, NULL, }, // 0x011f
+ {0, 6, NULL, }, // 0x0120
+ {0, 14, NULL, }, // 0x0121
+ {0, VAR,NULL, }, // 0x0122
+ {0, VAR,NULL, }, // 0x0123
+ {0, 21, NULL, }, // 0x0124
+ {0, 8, NULL, }, // 0x0125
+ {0, 8, NULL, }, // 0x0126
+ {0, 8, NULL, }, // 0x0127
+ {0, 8, NULL, }, // 0x0128
+ {0, 8, NULL, }, // 0x0129
+ {0, 2, NULL, }, // 0x012a
+ {0, 2, NULL, }, // 0x012b
+ {0, 3, NULL, }, // 0x012c
+ {0, 4, NULL, }, // 0x012d
+ {0, 2, NULL, }, // 0x012e
+ {0, VAR,NULL, }, // 0x012f
+ {0, 6, NULL, }, // 0x0130
+ {0, 86, NULL, }, // 0x0131
+ {0, 6, NULL, }, // 0x0132
+ {0, VAR,NULL, }, // 0x0133
+ {0, VAR,NULL, }, // 0x0134
+ {0, 7, NULL, }, // 0x0135
+ {0, VAR,NULL, }, // 0x0136
+ {0, 6, NULL, }, // 0x0137
+ {0, 3, NULL, }, // 0x0138
+ {0, 16, NULL, }, // 0x0139
+ {0, 4, NULL, }, // 0x013a
+ {0, 4, NULL, }, // 0x013b
+ {0, 4, NULL, }, // 0x013c
+ {0, 6, NULL, }, // 0x013d
+ {0, 24, NULL, }, // 0x013e
+ {0, 26, NULL, }, // 0x013f
+ {0, 22, NULL, }, // 0x0140
+ {0, 14, NULL, }, // 0x0141
+ {0, 6, NULL, }, // 0x0142
+ {300, 10, clif_parse_NpcAmountInput, }, // 0x0143
+ {0, 23, NULL, }, // 0x0144
+ {0, 19, NULL, }, // 0x0145
+ {300, 6, clif_parse_NpcCloseClicked, }, // 0x0146
+ {0, 39, NULL, }, // 0x0147
+ {0, 8, NULL, }, // 0x0148
+ {0, 9, NULL, }, // 0x0149
+ {0, 6, NULL, }, // 0x014a
+ {0, 27, NULL, }, // 0x014b
+ {0, VAR,NULL, }, // 0x014c
+ {0, 2, NULL, }, // 0x014d
+ {0, 6, NULL, }, // 0x014e
+ {0, 6, NULL, }, // 0x014f
+ {0, 110,NULL, }, // 0x0150
+ {0, 6, NULL, }, // 0x0151
+ {0, VAR,NULL, }, // 0x0152
+ {0, VAR,NULL, }, // 0x0153
+ {0, VAR,NULL, }, // 0x0154
+ {0, VAR,NULL, }, // 0x0155
+ {0, VAR,NULL, }, // 0x0156
+ {0, 6, NULL, }, // 0x0157
+ {0, VAR,NULL, }, // 0x0158
+ {0, 54, NULL, }, // 0x0159
+ {0, 66, NULL, }, // 0x015a
+ {0, 54, NULL, }, // 0x015b
+ {0, 90, NULL, }, // 0x015c
+ {0, 42, NULL, }, // 0x015d
+ {0, 6, NULL, }, // 0x015e
+ {0, 42, NULL, }, // 0x015f
+ {0, VAR,NULL, }, // 0x0160
+ {0, VAR,NULL, }, // 0x0161
+ {0, VAR,NULL, }, // 0x0162
+ {0, VAR,NULL, }, // 0x0163
+ {0, VAR,NULL, }, // 0x0164
+ {0, 30, NULL, }, // 0x0165
+ {0, VAR,NULL, }, // 0x0166
+ {0, 3, NULL, }, // 0x0167
+ {0, 14, NULL, }, // 0x0168
+ {0, 3, NULL, }, // 0x0169
+ {0, 30, NULL, }, // 0x016a
+ {0, 10, NULL, }, // 0x016b
+ {0, 43, NULL, }, // 0x016c
+ {0, 14, NULL, }, // 0x016d
+ {0, 186,NULL, }, // 0x016e
+ {0, 182,NULL, }, // 0x016f
+ {0, 14, NULL, }, // 0x0170
+ {0, 30, NULL, }, // 0x0171
+ {0, 10, NULL, }, // 0x0172
+ {0, 3, NULL, }, // 0x0173
+ {0, VAR,NULL, }, // 0x0174
+ {0, 6, NULL, }, // 0x0175
+ {0, 106,NULL, }, // 0x0176
+ {0, VAR,NULL, }, // 0x0177
+ {0, 4, NULL, }, // 0x0178
+ {0, 5, NULL, }, // 0x0179
+ {0, 4, NULL, }, // 0x017a
+ {0, VAR,NULL, }, // 0x017b
+ {0, 6, NULL, }, // 0x017c
+ {0, 7, NULL, }, // 0x017d
+ {0, VAR,NULL, }, // 0x017e
+ {0, VAR,NULL, }, // 0x017f
+ {0, 6, NULL, }, // 0x0180
+ {0, 3, NULL, }, // 0x0181
+ {0, 106,NULL, }, // 0x0182
+ {0, 10, NULL, }, // 0x0183
+ {0, 10, NULL, }, // 0x0184
+ {0, 34, NULL, }, // 0x0185
+ {0, 0, NULL, }, // 0x0186
+ {0, 6, NULL, }, // 0x0187
+ {0, 8, NULL, }, // 0x0188
+ {0, 4, NULL, }, // 0x0189
+ {0, 4, clif_parse_QuitGame, }, // 0x018a
+ {0, 4, NULL, }, // 0x018b
+ {0, 29, NULL, }, // 0x018c
+ {0, VAR,NULL, }, // 0x018d
+ {0, 10, NULL, }, // 0x018e
+ {0, 6, NULL, }, // 0x018f
+ {0, 90, NULL, }, // 0x0190
+ {0, 86, NULL, }, // 0x0191
+ {0, 24, NULL, }, // 0x0192
+ {0, 6, NULL, }, // 0x0193
+ {0, 30, NULL, }, // 0x0194
+ {0, 102,NULL, }, // 0x0195
+ {0, 9, NULL, }, // 0x0196
+ {0, 4, NULL, }, // 0x0197
+ {0, 8, NULL, }, // 0x0198
+ {0, 4, NULL, }, // 0x0199
+ {0, 14, NULL, }, // 0x019a
+ {0, 10, NULL, }, // 0x019b
+ {0, VAR,NULL, }, // 0x019c
+ {300, 6, NULL, }, // 0x019d
+ {0, 2, NULL, }, // 0x019e
+ {0, 6, NULL, }, // 0x019f
+ {0, 3, NULL, }, // 0x01a0
+ {0, 3, NULL, }, // 0x01a1
+ {0, 35, NULL, }, // 0x01a2
+ {0, 5, NULL, }, // 0x01a3
+ {0, 11, NULL, }, // 0x01a4
+ {0, 26, NULL, }, // 0x01a5
+ {0, VAR,NULL, }, // 0x01a6
+ {0, 4, NULL, }, // 0x01a7
+ {0, 4, NULL, }, // 0x01a8
+ {0, 6, NULL, }, // 0x01a9
+ {0, 10, NULL, }, // 0x01aa
+ {0, 12, NULL, }, // 0x01ab
+ {0, 6, NULL, }, // 0x01ac
+ {0, VAR,NULL, }, // 0x01ad
+ {0, 4, NULL, }, // 0x01ae
+ {0, 4, NULL, }, // 0x01af
+ {0, 11, NULL, }, // 0x01b0
+ {0, 7, NULL, }, // 0x01b1
+ {0, VAR,NULL, }, // 0x01b2
+ {0, 67, NULL, }, // 0x01b3
+ {0, 12, NULL, }, // 0x01b4
+ {0, 18, NULL, }, // 0x01b5
+ {0, 114,NULL, }, // 0x01b6
+ {0, 6, NULL, }, // 0x01b7
+ {0, 3, NULL, }, // 0x01b8
+ {0, 6, NULL, }, // 0x01b9
+ {0, 26, NULL, }, // 0x01ba
+ {0, 26, NULL, }, // 0x01bb
+ {0, 26, NULL, }, // 0x01bc
+ {0, 26, NULL, }, // 0x01bd
+ {0, 2, NULL, }, // 0x01be
+ {0, 3, NULL, }, // 0x01bf
+ {0, 2, NULL, }, // 0x01c0
+ {0, 14, NULL, }, // 0x01c1
+ {0, 10, NULL, }, // 0x01c2
+ {0, VAR,NULL, }, // 0x01c3
+ {0, 22, NULL, }, // 0x01c4
+ {0, 22, NULL, }, // 0x01c5
+ {0, 4, NULL, }, // 0x01c6
+ {0, 2, NULL, }, // 0x01c7
+ {0, 13, NULL, }, // 0x01c8
+ {0, 97, NULL, }, // 0x01c9
+ {0, 0, NULL, }, // 0x01ca
+ {0, 9, NULL, }, // 0x01cb
+ {0, 9, NULL, }, // 0x01cc
+ {0, 30, NULL, }, // 0x01cd
+ {0, 6, NULL, }, // 0x01ce
+ {0, 28, NULL, }, // 0x01cf
+ {0, 8, NULL, }, // 0x01d0
+ {0, 14, NULL, }, // 0x01d1
+ {0, 10, NULL, }, // 0x01d2
+ {0, 35, NULL, }, // 0x01d3
+ {0, 6, NULL, }, // 0x01d4
+ {300, VAR,clif_parse_NpcStringInput, }, // 0x01d5 - set to -1
+ {0, 4, NULL, }, // 0x01d6
+ {0, 11, NULL, }, // 0x01d7
+ {0, 54, NULL, }, // 0x01d8
+ {0, 53, NULL, }, // 0x01d9
+ {0, 60, NULL, }, // 0x01da
+ {0, 2, NULL, }, // 0x01db
+ {0, VAR,NULL, }, // 0x01dc
+ {0, 47, NULL, }, // 0x01dd
+ {0, 33, NULL, }, // 0x01de
+ {0, 6, NULL, }, // 0x01df
+ {0, 30, NULL, }, // 0x01e0
+ {0, 8, NULL, }, // 0x01e1
+ {0, 34, NULL, }, // 0x01e2
+ {0, 14, NULL, }, // 0x01e3
+ {0, 2, NULL, }, // 0x01e4
+ {0, 6, NULL, }, // 0x01e5
+ {0, 26, NULL, }, // 0x01e6
+ {0, 2, NULL, }, // 0x01e7
+ {0, 28, NULL, }, // 0x01e8
+ {0, 81, NULL, }, // 0x01e9
+ {0, 6, NULL, }, // 0x01ea
+ {0, 10, NULL, }, // 0x01eb
+ {0, 26, NULL, }, // 0x01ec
+ {0, 2, NULL, }, // 0x01ed
+ {0, VAR,NULL, }, // 0x01ee
+ {0, VAR,NULL, }, // 0x01ef
+ {0, VAR,NULL, }, // 0x01f0
+ {0, VAR,NULL, }, // 0x01f1
+ {0, 20, NULL, }, // 0x01f2
+ {0, 10, NULL, }, // 0x01f3
+ {0, 32, NULL, }, // 0x01f4
+ {0, 9, NULL, }, // 0x01f5
+ {0, 34, NULL, }, // 0x01f6
+ {0, 14, NULL, }, // 0x01f7
+ {0, 2, NULL, }, // 0x01f8
+ {0, 6, NULL, }, // 0x01f9
+ {0, 48, NULL, }, // 0x01fa
+ {0, 56, NULL, }, // 0x01fb
+ {0, VAR,NULL, }, // 0x01fc
+ {0, 4, NULL, }, // 0x01fd
+ {0, 5, NULL, }, // 0x01fe
+ {0, 10, NULL, }, // 0x01ff
+ {0, 26, NULL, }, // 0x0200
+ {0, VAR,NULL, }, // 0x0201
+ {0, 26, NULL, }, // 0x0202
+ {0, 10, NULL, }, // 0x0203
+ {0, 18, NULL, }, // 0x0204
+ {0, 26, NULL, }, // 0x0205
+ {0, 11, NULL, }, // 0x0206
+ {0, 34, NULL, }, // 0x0207
+ {0, 14, NULL, }, // 0x0208
+ {0, 36, NULL, }, // 0x0209
+ {0, 10, NULL, }, // 0x020a
+ {0, 19, NULL, }, // 0x020b
+ {0, 10, NULL, }, // 0x020c
+ {0, VAR,NULL, }, // 0x020d
+ {0, 24, NULL, }, // 0x020e
+ {0, 0, NULL, }, // 0x020f
+ {0, 0, NULL, }, // 0x0210
+ {0, 0, NULL, }, // 0x0211
+ {0, 0, NULL, }, // 0x0212
+ {0, 0, NULL, }, // 0x0213
+ {0, 0, NULL, }, // 0x0214
+ {0, 0, NULL, }, // 0x0215
+ {0, 0, NULL, }, // 0x0216
+ {0, 0, NULL, }, // 0x0217
+ {0, 0, NULL, }, // 0x0218
+ {0, 0, NULL, }, // 0x0219
+ {0, 0, NULL, }, // 0x021a
+ {0, 0, NULL, }, // 0x021b
+ {0, 0, NULL, }, // 0x021c
+ {0, 0, NULL, }, // 0x021d
+ {0, 0, NULL, }, // 0x021e
+ {0, 0, NULL, }, // 0x021f
};
-// *INDENT-ON*
// Checks for packet flooding
static
int clif_check_packet_flood(int fd, int cmd)
{
struct map_session_data *sd = (struct map_session_data *)session[fd]->session_data;
- unsigned int rate, tick = gettick();
+ tick_t tick = gettick();
// sd will not be set if the client hasn't requested
// WantToConnection yet. Do not apply flood logic to GMs
// as approved bots (GMlvl1) should not have to work around
// flood logic.
- if (!sd || pc_isGM(sd) || clif_parse_func_table[cmd].rate == -1)
- return 0;
+ if (!sd || pc_isGM(sd) || clif_parse_func_table[cmd].rate == static_cast<interval_t>(-1))
+ return 0;
// Timer has wrapped
if (tick < sd->flood_rates[cmd])
@@ -10035,17 +5601,18 @@ int clif_check_packet_flood(int fd, int cmd)
}
// Default rate is 100ms
- if ((rate = clif_parse_func_table[cmd].rate) == 0)
- rate = 100;
+ interval_t rate = clif_parse_func_table[cmd].rate;
+ if (rate == interval_t::zero())
+ rate = std::chrono::milliseconds(100);
// ActionRequest - attacks are allowed a faster rate than sit/stand
if (cmd == 0x89)
{
- int action_type = RFIFOB (fd, 6);
+ int action_type = RFIFOB(fd, 6);
if (action_type == 0x00 || action_type == 0x07)
- rate = 20;
+ rate = std::chrono::milliseconds(20);
else
- rate = 1000;
+ rate = std::chrono::seconds(1);
}
// Restore this code when mana1.0 is released
@@ -10064,12 +5631,12 @@ int clif_check_packet_flood(int fd, int cmd)
// They are flooding
if (tick < sd->flood_rates[cmd] + rate)
{
- time_t now = time(NULL);
+ TimeT now = TimeT::now();
// If it's a nasty flood we log and possibly kick
if (now > sd->packet_flood_reset_due)
{
- sd->packet_flood_reset_due = now + battle_config.packet_spam_threshold;
+ sd->packet_flood_reset_due = static_cast<time_t>(now) + battle_config.packet_spam_threshold;
sd->packet_flood_in = 0;
}
@@ -10077,7 +5644,7 @@ int clif_check_packet_flood(int fd, int cmd)
if (sd->packet_flood_in >= battle_config.packet_spam_flood)
{
- printf("packet flood detected from %s [0x%x]\n", sd->status.name, cmd);
+ PRINTF("packet flood detected from %s [0x%x]\n", sd->status.name, cmd);
if (battle_config.packet_spam_kick)
{
session[fd]->eof = 1; // Kick
@@ -10093,9 +5660,12 @@ int clif_check_packet_flood(int fd, int cmd)
return 0;
}
-#define WARN_MALFORMED_MSG(sd, msg) \
- printf ("clif_validate_chat(): %s (ID %d) sent a malformed" \
- " message: %s.\n", sd->status.name, sd->status.account_id, msg)
+inline
+void WARN_MALFORMED_MSG(struct map_session_data *sd, const char *msg)
+{
+ PRINTF("clif_validate_chat(): %s (ID %d) sent a malformed message: %s.\n",
+ sd->status.name, sd->status.account_id, msg);
+}
/**
* Validate message integrity (inspired by upstream source (eAthena)).
*
@@ -10108,8 +5678,9 @@ int clif_check_packet_flood(int fd, int cmd)
* @param[out] message_len the length of the actual text, excluding NUL
* @return a dynamically allocated copy of the message, or NULL upon failure
*/
-static char *clif_validate_chat (struct map_session_data *sd, int type,
- char **message, size_t *message_len)
+static
+char *clif_validate_chat(struct map_session_data *sd, int type,
+ const char **message, size_t *message_len)
{
int fd;
unsigned int buf_len; /* Actual message length. */
@@ -10117,12 +5688,11 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
unsigned int min_len; /* Minimum message length. */
size_t name_len; /* Sender's name length. */
char *buf = NULL; /* Copy of actual message data. */
- char *p = NULL; /* Temporary pointer to message. */
*message = NULL;
*message_len = 0;
- nullpo_retr (NULL, sd);
+ nullpo_retr(NULL, sd);
/*
* Don't send chat in the period between the ban and the connection's
* closure.
@@ -10131,8 +5701,8 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
return NULL;
fd = sd->fd;
- msg_len = RFIFOW (fd, 2) - 4;
- name_len = strlen (sd->status.name);
+ msg_len = RFIFOW(fd, 2) - 4;
+ name_len = strlen(sd->status.name);
/*
* At least one character is required in all instances.
* Notes for length checks:
@@ -10148,14 +5718,14 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
/* The player just sent the header (2) and length (2) words. */
if (!msg_len)
{
- WARN_MALFORMED_MSG (sd, "no message sent");
+ WARN_MALFORMED_MSG(sd, "no message sent");
return NULL;
}
/* The client sent (or claims to have sent) an empty message. */
if (msg_len == min_len)
{
- WARN_MALFORMED_MSG (sd, "empty message");
+ WARN_MALFORMED_MSG(sd, "empty message");
return NULL;
}
@@ -10163,12 +5733,12 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
if (type == 1 && msg_len < min_len)
{
/* Disallow malformed messages. */
- clif_setwaitclose (fd);
- WARN_MALFORMED_MSG (sd, "illegal target name");
+ clif_setwaitclose(fd);
+ WARN_MALFORMED_MSG(sd, "illegal target name");
return NULL;
}
- p = (char *) ((type != 1) ? RFIFOP (fd, 4) : RFIFOP (fd, 28));
+ const char *p = static_cast<const char *>((type != 1) ? RFIFOP(fd, 4) : RFIFOP(fd, 28));
buf_len = (type == 1) ? msg_len - min_len: msg_len;
/*
@@ -10180,15 +5750,15 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
*/
if (buf_len >= battle_config.chat_maxline)
{
- WARN_MALFORMED_MSG (sd, "exceeded maximum message length");
+ WARN_MALFORMED_MSG(sd, "exceeded maximum message length");
return NULL;
}
/* We're leaving an extra eight bytes for public/global chat, 1 for NUL. */
buf_len += (type == 2) ? 8 + 1 : 1;
- buf = (char *) malloc (buf_len);
- memcpy ((type != 2) ? buf : buf + 8, p,
+ buf = (char *) malloc(buf_len);
+ memcpy((type != 2) ? buf : buf + 8, p,
(type != 2) ? buf_len - 1 : buf_len - 8 - 1);
buf[buf_len - 1] = '\0';
p = (type != 2) ? buf : buf + 8;
@@ -10201,15 +5771,15 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
}
else
{
- char *pos = NULL;
+ const char *pos = NULL;
if (!(pos = strstr(p, " : "))
- || strncmp (p, sd->status.name, name_len)
+ || strncmp(p, sd->status.name, name_len)
|| pos - p != name_len)
{
- free (buf);
+ free(buf);
/* Disallow malformed/spoofed messages. */
- clif_setwaitclose (fd);
- WARN_MALFORMED_MSG (sd, "spoofed name/invalid format");
+ clif_setwaitclose(fd);
+ WARN_MALFORMED_MSG(sd, "spoofed name/invalid format");
return NULL;
}
/* Step beyond the separator. */
@@ -10226,51 +5796,50 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
* socket.cのdo_parsepacketから呼び出される
*------------------------------------------
*/
-static void clif_parse (int fd)
+static
+void clif_parse(int fd)
{
- int packet_len = 0, cmd = 0;
+ int packet_len = 0, cmd = 0;
struct map_session_data *sd = (struct map_session_data *)session[fd]->session_data;
if (!sd || (sd && !sd->state.auth))
{
- if (RFIFOREST (fd) < 2)
+ if (RFIFOREST(fd) < 2)
{ // too small a packet disconnect
session[fd]->eof = 1;
}
- if (RFIFOW (fd, 0) != 0x72)
+ if (RFIFOW(fd, 0) != 0x72)
{ // first packet not auth, disconnect
session[fd]->eof = 1;
}
}
// 接続が切れてるので後始末
- if (!chrif_isconnect () || session[fd]->eof)
+ if (!chrif_isconnect() || session[fd]->eof)
{ // char鯖に繋がってない間は接続禁止 (!chrif_isconnect())
if (sd && sd->state.auth)
{
- pc_logout (sd);
- clif_quitsave (fd, sd);
+ pc_logout(sd);
+ clif_quitsave(fd, sd);
if (sd->status.name != NULL)
- printf ("Player [%s] has logged off your server.\n", sd->status.name); // Player logout display [Valaris]
+ PRINTF("Player [%s] has logged off your server.\n", sd->status.name); // Player logout display [Valaris]
else
- printf ("Player with account [%d] has logged off your server.\n", sd->bl.id); // Player logout display [Yor]
+ PRINTF("Player with account [%d] has logged off your server.\n", sd->bl.id); // Player logout display [Yor]
}
else if (sd)
{ // not authentified! (refused by char-server or disconnect before to be authentified)
- printf ("Player with account [%d] has logged off your server (not auth account).\n", sd->bl.id); // Player logout display [Yor]
- map_deliddb (&sd->bl); // account_id has been included in the DB before auth answer
+ PRINTF("Player with account [%d] has logged off your server (not auth account).\n", sd->bl.id); // Player logout display [Yor]
+ map_deliddb(&sd->bl); // account_id has been included in the DB before auth answer
}
if (fd)
- close (fd);
- if (fd)
- delete_session (fd);
+ delete_session(fd);
return;
}
- if (RFIFOREST (fd) < 2)
+ if (RFIFOREST(fd) < 2)
return; // Too small (no packet number)
- cmd = RFIFOW (fd, 0);
+ cmd = RFIFOW(fd, 0);
// 管理用パケット処理
if (cmd >= 30000)
@@ -10278,16 +5847,16 @@ static void clif_parse (int fd)
switch (cmd)
{
case 0x7530: // Athena情報所得
- WFIFOW (fd, 0) = 0x7531;
- WFIFOB (fd, 2) = ATHENA_MAJOR_VERSION;
- WFIFOB (fd, 3) = ATHENA_MINOR_VERSION;
- WFIFOB (fd, 4) = ATHENA_REVISION;
- WFIFOB (fd, 5) = ATHENA_RELEASE_FLAG;
- WFIFOB (fd, 6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB (fd, 7) = ATHENA_SERVER_MAP;
- WFIFOW (fd, 8) = ATHENA_MOD_VERSION;
- WFIFOSET (fd, 10);
- RFIFOSKIP (fd, 2);
+ WFIFOW(fd, 0) = 0x7531;
+ WFIFOB(fd, 2) = ATHENA_MAJOR_VERSION;
+ WFIFOB(fd, 3) = ATHENA_MINOR_VERSION;
+ WFIFOB(fd, 4) = ATHENA_REVISION;
+ WFIFOB(fd, 5) = ATHENA_RELEASE_FLAG;
+ WFIFOB(fd, 6) = ATHENA_OFFICIAL_FLAG;
+ WFIFOB(fd, 7) = ATHENA_SERVER_MAP;
+ WFIFOW(fd, 8) = ATHENA_MOD_VERSION;
+ WFIFOSET(fd, 10);
+ RFIFOSKIP(fd, 2);
break;
case 0x7532: // 接続の切断
session[fd]->eof = 1;
@@ -10299,14 +5868,14 @@ static void clif_parse (int fd)
return;
// パケット長を計算
- packet_len = packet_len_table[cmd];
- if (packet_len == -1)
+ packet_len = clif_parse_func_table[cmd].len;
+ if (packet_len == VAR)
{
- if (RFIFOREST (fd) < 4)
+ if (RFIFOREST(fd) < 4)
{
return; // Runt packet (variable length without a length sent)
}
- packet_len = RFIFOW (fd, 2);
+ packet_len = RFIFOW(fd, 2);
if (packet_len < 4 || packet_len > 32768)
{
session[fd]->eof = 1;
@@ -10314,7 +5883,7 @@ static void clif_parse (int fd)
}
}
- if (RFIFOREST (fd) < packet_len)
+ if (RFIFOREST(fd) < packet_len)
{
return; // Runt packet (sent legnth is too small)
}
@@ -10332,7 +5901,7 @@ static void clif_parse (int fd)
return;
}
- clif_parse_func_table[cmd].func (fd, sd);
+ clif_parse_func_table[cmd].func(fd, sd);
}
else
{
@@ -10340,78 +5909,76 @@ static void clif_parse (int fd)
if (battle_config.error_log)
{
if (fd)
- printf ("\nclif_parse: session #%d, packet 0x%x, lenght %d\n",
+ PRINTF("\nclif_parse: session #%d, packet 0x%x, lenght %d\n",
fd, cmd, packet_len);
#ifdef DUMP_UNKNOWN_PACKET
{
- int i;
+ int i;
FILE *fp;
char packet_txt[256] = "save/packet.txt";
- time_t now;
- printf
- ("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
+ PRINTF("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
for (i = 0; i < packet_len; i++)
{
if ((i & 15) == 0)
- printf ("\n%04X ", i);
- printf ("%02X ", RFIFOB (fd, i));
+ PRINTF("\n%04X ", i);
+ PRINTF("%02X ", RFIFOB(fd, i));
}
if (sd && sd->state.auth)
{
if (sd->status.name != NULL)
- printf
- ("\nAccount ID %d, character ID %d, player name %s.\n",
+ PRINTF("\nAccount ID %d, character ID %d, player name %s.\n",
sd->status.account_id, sd->status.char_id,
sd->status.name);
else
- printf ("\nAccount ID %d.\n", sd->bl.id);
+ PRINTF("\nAccount ID %d.\n", sd->bl.id);
}
else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
- printf ("\nAccount ID %d.\n", sd->bl.id);
+ PRINTF("\nAccount ID %d.\n", sd->bl.id);
- if ((fp = fopen_ (packet_txt, "a")) == NULL)
+ if ((fp = fopen_(packet_txt, "a")) == NULL)
{
- printf ("clif.c: cant write [%s] !!! data is lost !!!\n",
+ PRINTF("clif.c: cant write [%s] !!! data is lost !!!\n",
packet_txt);
return;
}
else
{
- time (&now);
+ timestamp_seconds_buffer now;
+ stamp_time(now);
if (sd && sd->state.auth)
{
if (sd->status.name != NULL)
- fprintf (fp,
- "%sPlayer with account ID %d (character ID %d, player name %s) sent wrong packet:\n",
- asctime (gmtime (&now)),
- sd->status.account_id,
- sd->status.char_id, sd->status.name);
+ FPRINTF(fp,
+ "%s\nPlayer with account ID %d (character ID %d, player name %s) sent wrong packet:\n",
+ now,
+ sd->status.account_id,
+ sd->status.char_id, sd->status.name);
else
- fprintf (fp,
- "%sPlayer with account ID %d sent wrong packet:\n",
- asctime (gmtime (&now)), sd->bl.id);
+ FPRINTF(fp,
+ "%s\nPlayer with account ID %d sent wrong packet:\n",
+ now, sd->bl.id);
}
else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
- fprintf (fp,
- "%sPlayer with account ID %d sent wrong packet:\n",
- asctime (gmtime (&now)), sd->bl.id);
+ FPRINTF(fp,
+ "%s\nPlayer with account ID %d sent wrong packet:\n",
+ now, sd->bl.id);
- fprintf (fp,
+ FPRINTF(fp,
"\t---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
for (i = 0; i < packet_len; i++)
{
if ((i & 15) == 0)
- fprintf (fp, "\n\t%04X ", i);
- fprintf (fp, "%02X ", RFIFOB (fd, i));
+ FPRINTF(fp, "\n\t%04X ", i);
+ FPRINTF(fp, "%02X ", RFIFOB(fd, i));
}
- fprintf (fp, "\n\n");
- fclose_ (fp);
+ FPRINTF(fp, "\n\n");
+ fclose_(fp);
}
}
#endif
}
}
- RFIFOSKIP (fd, packet_len);
+ RFIFOSKIP(fd, packet_len);
}
/*==========================================
@@ -10420,24 +5987,8 @@ static void clif_parse (int fd)
*/
int do_init_clif (void)
{
- int i;
-
- set_defaultparse (clif_parse);
- for (i = 0; i < 10; i++)
- {
- if (make_listen_port (map_port))
- break;
-#ifdef LCCWIN32
- Sleep (20000);
-#else
- sleep (20);
-#endif
- }
- if (i == 10)
- {
- printf ("cant bind game port\n");
- exit (1);
- }
+ set_defaultparse(clif_parse);
+ make_listen_port(map_port);
return 0;
}
diff --git a/src/map/clif.hpp b/src/map/clif.hpp
index 01f6a50..df0a48b 100644
--- a/src/map/clif.hpp
+++ b/src/map/clif.hpp
@@ -1,280 +1,164 @@
-// $Id: clif.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
#ifndef CLIF_HPP
#define CLIF_HPP
-#include <sys/types.h>
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include "map.hpp"
-
-void clif_setip (const char *);
-void clif_setport (int);
-
-struct in_addr clif_getip (void);
-int clif_getport (void);
-int clif_countusers (void);
-void clif_setwaitclose (int);
-
-int clif_authok (struct map_session_data *);
-int clif_authfail_fd (int, int);
-int clif_charselectok (int);
-int clif_dropflooritem (struct flooritem_data *);
-int clif_clearflooritem (struct flooritem_data *, int);
-int clif_clearchar (struct block_list *, int); // area or fd
-int clif_clearchar_delay (unsigned int, struct block_list *, int);
-#define clif_clearchar_area(bl,type) clif_clearchar(bl,type)
-int clif_clearchar_id (int, int, int);
-int clif_spawnpc (struct map_session_data *); //area
-int clif_spawnnpc (struct npc_data *); // area
-int clif_spawn_fake_npc_for_player (struct map_session_data *sd,
- int fake_npc_id);
-int clif_spawnmob (struct mob_data *); // area
-int clif_walkok (struct map_session_data *); // self
-int clif_movechar (struct map_session_data *); // area
-int clif_movemob (struct mob_data *); //area
-int clif_changemap (struct map_session_data *, const char *, int, int); //self
-int clif_changemapserver (struct map_session_data *, const char *, int, int, struct in_addr, int); //self
-int clif_fixpos (struct block_list *); // area
-int clif_fixmobpos (struct mob_data *md);
-int clif_fixpcpos (struct map_session_data *sd);
-int clif_npcbuysell (struct map_session_data *, int); //self
-int clif_buylist (struct map_session_data *, struct npc_data *); //self
-int clif_selllist (struct map_session_data *); //self
-int clif_scriptmes (struct map_session_data *, int, const char *); //self
-int clif_scriptnext (struct map_session_data *, int); //self
-int clif_scriptclose (struct map_session_data *, int); //self
-int clif_scriptmenu (struct map_session_data *, int, const char *); //self
-int clif_scriptinput (struct map_session_data *, int); //self
-int clif_scriptinputstr (struct map_session_data *sd, int npcid); // self
-int clif_cutin (struct map_session_data *, const char *, int); //self
-int clif_viewpoint (struct map_session_data *, int, int, int, int, int, int); //self
-int clif_additem (struct map_session_data *, int, int, int); //self
-int clif_delitem (struct map_session_data *, int, int); //self
-int clif_updatestatus (struct map_session_data *, int); //self
-int clif_changestatus (struct block_list *, int, int); //area
-int clif_damage (struct block_list *, struct block_list *, unsigned int, int, int, int, int, int, int); // area
-#define clif_takeitem(src,dst) clif_damage(src,dst,0,0,0,0,0,1,0)
-int clif_changelook (struct block_list *, int, int); // area
-int clif_changelook_towards (struct block_list *, int, int, struct map_session_data *dst); // area or target
-void clif_changelook_accessories (struct block_list *bl, struct map_session_data *dst); // area or target; list gloves, boots etc.
-int clif_arrowequip (struct map_session_data *sd, int val); //self
-int clif_arrow_fail (struct map_session_data *sd, int type); //self
-int clif_statusupack (struct map_session_data *, int, int, int); // self
-int clif_equipitemack (struct map_session_data *, int, int, int); // self
-int clif_unequipitemack (struct map_session_data *, int, int, int); // self
-int clif_misceffect (struct block_list *, int); // area
-int clif_changeoption (struct block_list *); // area
-int clif_useitemack (struct map_session_data *, int, int, int); // self
-
-int clif_createchat (struct map_session_data *, int); // self
-int clif_dispchat (struct chat_data *, int); // area or fd
-int clif_joinchatfail (struct map_session_data *, int); // self
-int clif_joinchatok (struct map_session_data *, struct chat_data *); // self
-int clif_addchat (struct chat_data *, struct map_session_data *); // chat
-int clif_changechatowner (struct chat_data *, struct map_session_data *); // chat
-int clif_clearchat (struct chat_data *, int); // area or fd
-int clif_leavechat (struct chat_data *, struct map_session_data *); // chat
-int clif_changechatstatus (struct chat_data *); // chat
-
-void clif_emotion (struct block_list *bl, int type);
-void clif_talkiebox (struct block_list *bl, const char *talkie);
-void clif_wedding_effect (struct block_list *bl);
-void clif_sitting (int fd, struct map_session_data *sd);
-//void clif_callpartner(struct map_session_data *sd);
-//void clif_sitting(struct map_session_data *sd);
-void clif_soundeffect (struct map_session_data *sd, struct block_list *bl,
- const char *name, int type);
+#include "clif.t.hpp"
+
+#include <functional>
+
+#include "../common/const_array.hpp"
+#include "../common/timer.t.hpp"
+
+#include "battle.t.hpp"
+#include "map.t.hpp"
+#include "pc.t.hpp"
+#include "skill.t.hpp"
+
+void clif_setip(const char *);
+void clif_setport(int);
+
+struct in_addr clif_getip(void);
+int clif_getport(void);
+int clif_countusers(void);
+void clif_setwaitclose(int);
+
+int clif_authok(struct map_session_data *);
+int clif_authfail_fd(int, int);
+int clif_charselectok(int);
+int clif_dropflooritem(struct flooritem_data *);
+int clif_clearflooritem(struct flooritem_data *, int);
+int clif_clearchar(struct block_list *, BeingRemoveWhy); // area or fd
+int clif_clearchar_delay(tick_t, struct block_list *, BeingRemoveWhy);
+int clif_clearchar_id(int, BeingRemoveWhy, int);
+int clif_spawnpc(struct map_session_data *); //area
+int clif_spawnnpc(struct npc_data *); // area
+int clif_spawn_fake_npc_for_player(struct map_session_data *sd,
+ int fake_npc_id);
+int clif_spawnmob(struct mob_data *); // area
+int clif_walkok(struct map_session_data *); // self
+int clif_movechar(struct map_session_data *); // area
+int clif_movemob(struct mob_data *); //area
+int clif_changemap(struct map_session_data *, const char *, int, int); //self
+int clif_changemapserver(struct map_session_data *, const char *, int, int, struct in_addr, int); //self
+int clif_fixpos(struct block_list *); // area
+int clif_fixmobpos(struct mob_data *md);
+int clif_fixpcpos(struct map_session_data *sd);
+int clif_npcbuysell(struct map_session_data *, int); //self
+int clif_buylist(struct map_session_data *, struct npc_data *); //self
+int clif_selllist(struct map_session_data *); //self
+int clif_scriptmes(struct map_session_data *, int, const char *); //self
+int clif_scriptnext(struct map_session_data *, int); //self
+int clif_scriptclose(struct map_session_data *, int); //self
+int clif_scriptmenu(struct map_session_data *, int, const char *); //self
+int clif_scriptinput(struct map_session_data *, int); //self
+int clif_scriptinputstr(struct map_session_data *sd, int npcid); // self
+int clif_cutin(struct map_session_data *, const char *, int); //self
+int clif_viewpoint(struct map_session_data *, int, int, int, int, int, int); //self
+int clif_additem(struct map_session_data *, int, int, PickupFail); //self
+int clif_delitem(struct map_session_data *, int, int); //self
+int clif_updatestatus(struct map_session_data *, SP); //self
+int clif_damage(struct block_list *, struct block_list *,
+ tick_t, interval_t, interval_t,
+ int, int, DamageType, int); // area
+inline
+int clif_takeitem(struct block_list *src, struct block_list *dst)
+{
+ return clif_damage(src, dst, tick_t(), interval_t::zero(), interval_t::zero(), 0, 0, DamageType::TAKEITEM, 0);
+}
+int clif_changelook(struct block_list *, LOOK, int); // area
+void clif_changelook_accessories(struct block_list *bl, struct map_session_data *dst); // area or target; list gloves, boots etc.
+int clif_arrowequip(struct map_session_data *sd, int val); //self
+int clif_arrow_fail(struct map_session_data *sd, int type); //self
+int clif_statusupack(struct map_session_data *, SP, int, int); // self
+int clif_equipitemack(struct map_session_data *, int, EPOS, int); // self
+int clif_unequipitemack(struct map_session_data *, int, EPOS, int); // self
+int clif_misceffect(struct block_list *, int); // area
+int clif_changeoption(struct block_list *); // area
+int clif_useitemack(struct map_session_data *, int, int, int); // self
+
+void clif_emotion(struct block_list *bl, int type);
+void clif_sitting(int fd, struct map_session_data *sd);
// trade
-int clif_traderequest (struct map_session_data *sd, const char *name);
-int clif_tradestart (struct map_session_data *sd, int type);
-int clif_tradeadditem (struct map_session_data *sd,
- struct map_session_data *tsd, int index, int amount);
-int clif_tradeitemok (struct map_session_data *sd, int index, int amount,
- int fail);
-int clif_tradedeal_lock (struct map_session_data *sd, int fail);
-int clif_tradecancelled (struct map_session_data *sd);
-int clif_tradecompleted (struct map_session_data *sd, int fail);
+int clif_traderequest(struct map_session_data *sd, const char *name);
+int clif_tradestart(struct map_session_data *sd, int type);
+int clif_tradeadditem(struct map_session_data *sd,
+ struct map_session_data *tsd, int index, int amount);
+int clif_tradeitemok(struct map_session_data *sd, int index, int amount,
+ int fail);
+int clif_tradedeal_lock(struct map_session_data *sd, int fail);
+int clif_tradecancelled(struct map_session_data *sd);
+int clif_tradecompleted(struct map_session_data *sd, int fail);
// storage
-#include "storage.hpp"
-int clif_storageitemlist (struct map_session_data *sd, struct storage *stor);
-int clif_storageequiplist (struct map_session_data *sd,
- struct storage *stor);
-int clif_updatestorageamount (struct map_session_data *sd,
- struct storage *stor);
-int clif_storageitemadded (struct map_session_data *sd, struct storage *stor,
- int index, int amount);
-int clif_storageitemremoved (struct map_session_data *sd, int index,
- int amount);
-int clif_storageclose (struct map_session_data *sd);
-int clif_guildstorageitemlist (struct map_session_data *sd,
- struct guild_storage *stor);
-int clif_guildstorageequiplist (struct map_session_data *sd,
- struct guild_storage *stor);
-int clif_updateguildstorageamount (struct map_session_data *sd,
- struct guild_storage *stor);
-int clif_guildstorageitemadded (struct map_session_data *sd,
- struct guild_storage *stor, int index,
- int amount);
-
-int clif_pcinsight (struct block_list *, va_list); // map_forallinmovearea callback
-int clif_pcoutsight (struct block_list *, va_list); // map_forallinmovearea callback
-int clif_mobinsight (struct block_list *, va_list); // map_forallinmovearea callback
-int clif_moboutsight (struct block_list *, va_list); // map_forallinmovearea callback
-
-int clif_npc_class_change (struct block_list *bl, int npc_class, int type);
-int clif_mob_class_change (struct mob_data *md, int mob_class);
-int clif_mob_equip (struct mob_data *md, int nameid); // [Valaris]
-
-int clif_skillinfo (struct map_session_data *sd, int skillid, int type,
- int range);
-int clif_skillinfoblock (struct map_session_data *sd);
-int clif_skillup (struct map_session_data *sd, int skill_num);
-
-int clif_skillcasting (struct block_list *bl,
- int src_id, int dst_id, int dst_x, int dst_y,
- int skill_num, int casttime);
-int clif_skillcastcancel (struct block_list *bl);
-int clif_skill_fail (struct map_session_data *sd, int skill_id, int type,
- int btype);
-int clif_skill_damage (struct block_list *src, struct block_list *dst,
- unsigned int tick, int sdelay, int ddelay, int damage,
- int div, int skill_id, int skill_lv, int type);
-int clif_skill_damage2 (struct block_list *src, struct block_list *dst,
- unsigned int tick, int sdelay, int ddelay,
- int damage, int div, int skill_id, int skill_lv,
- int type);
-int clif_skill_nodamage (struct block_list *src, struct block_list *dst,
- int skill_id, int heal, int fail);
-int clif_skill_poseffect (struct block_list *src, int skill_id, int val,
- int x, int y, int tick);
-int clif_skill_estimation (struct map_session_data *sd,
- struct block_list *dst);
-int clif_skill_warppoint (struct map_session_data *sd, int skill_num,
- const char *map1, const char *map2,
- const char *map3, const char *map4);
-int clif_skill_memo (struct map_session_data *sd, int flag);
-int clif_skill_teleportmessage (struct map_session_data *sd, int flag);
-
-int clif_produceeffect (struct map_session_data *sd, int flag, int nameid);
-
-int clif_skill_setunit (struct skill_unit *unit);
-int clif_skill_delunit (struct skill_unit *unit);
-
-int clif_01ac (struct block_list *bl);
-
-int clif_autospell (struct map_session_data *sd, int skilllv);
-int clif_devotion (struct map_session_data *sd, int target);
-int clif_spiritball (struct map_session_data *sd);
-int clif_combo_delay (struct block_list *src, int wait);
-int clif_bladestop (struct block_list *src, struct block_list *dst,
- int boolean);
-int clif_changemapcell (int m, int x, int y, int cell_type, int type);
-
-int clif_status_change (struct block_list *bl, int type, int flag);
-
-int clif_wis_message (int fd, const char *nick, const char *mes, int mes_len);
-int clif_wis_end (int fd, int flag);
-
-int clif_solved_charname (struct map_session_data *sd, int char_id);
-
-int clif_use_card (struct map_session_data *sd, int idx);
-int clif_insert_card (struct map_session_data *sd, int idx_equip,
- int idx_card, int flag);
-
-int clif_itemlist (struct map_session_data *sd);
-int clif_equiplist (struct map_session_data *sd);
-
-int clif_cart_additem (struct map_session_data *, int, int, int);
-int clif_cart_delitem (struct map_session_data *, int, int);
-int clif_cart_itemlist (struct map_session_data *sd);
-int clif_cart_equiplist (struct map_session_data *sd);
-
-int clif_item_identify_list (struct map_session_data *sd);
-int clif_item_identified (struct map_session_data *sd, int idx, int flag);
-int clif_item_repair_list (struct map_session_data *sd);
-
-int clif_item_skill (struct map_session_data *sd, int skillid, int skilllv,
- const char *name);
-
-int clif_mvp_effect (struct map_session_data *sd);
-int clif_mvp_item (struct map_session_data *sd, int nameid);
-int clif_mvp_exp (struct map_session_data *sd, int exp);
-
-int clif_movetoattack (struct map_session_data *sd, struct block_list *bl);
+int clif_storageitemlist(struct map_session_data *sd, struct storage *stor);
+int clif_storageequiplist(struct map_session_data *sd,
+ struct storage *stor);
+int clif_updatestorageamount(struct map_session_data *sd,
+ struct storage *stor);
+int clif_storageitemadded(struct map_session_data *sd, struct storage *stor,
+ int index, int amount);
+int clif_storageitemremoved(struct map_session_data *sd, int index,
+ int amount);
+int clif_storageclose(struct map_session_data *sd);
+
+// map_forallinmovearea callbacks
+void clif_pcinsight(struct block_list *, struct map_session_data *);
+void clif_pcoutsight(struct block_list *, struct map_session_data *);
+void clif_mobinsight(struct block_list *, struct mob_data *);
+void clif_moboutsight(struct block_list *, struct mob_data *);
+
+int clif_skillinfo(struct map_session_data *sd, SkillID skillid, int type,
+ int range);
+int clif_skillinfoblock(struct map_session_data *sd);
+int clif_skillup(struct map_session_data *sd, SkillID skill_num);
+
+int clif_skillcastcancel(struct block_list *bl);
+int clif_skill_fail(struct map_session_data *sd, SkillID skill_id, int type,
+ int btype);
+int clif_skill_damage(struct block_list *src, struct block_list *dst,
+ tick_t tick, interval_t sdelay, interval_t ddelay, int damage,
+ int div, SkillID skill_id, int skill_lv, int type);
+
+int clif_status_change(struct block_list *bl,
+ StatusChange type, int flag);
+
+int clif_wis_message(int fd, const char *nick, const char *mes, int mes_len);
+int clif_wis_end(int fd, int flag);
+
+int clif_itemlist(struct map_session_data *sd);
+int clif_equiplist(struct map_session_data *sd);
+
+int clif_mvp_effect(struct map_session_data *sd);
+
+int clif_movetoattack(struct map_session_data *sd, struct block_list *bl);
// party
-int clif_party_created (struct map_session_data *sd, int flag);
-int clif_party_info (struct party *p, int fd);
-int clif_party_invite (struct map_session_data *sd,
- struct map_session_data *tsd);
-int clif_party_inviteack (struct map_session_data *sd, const char *nick, int flag);
-int clif_party_option (struct party *p, struct map_session_data *sd,
- int flag);
-int clif_party_leaved (struct party *p, struct map_session_data *sd,
- int account_id, const char *name, int flag);
-int clif_party_message (struct party *p, int account_id, const char *mes, int len);
-int clif_party_move (struct party *p, struct map_session_data *sd,
- int online);
-int clif_party_xy (struct party *p, struct map_session_data *sd);
-int clif_party_hp (struct party *p, struct map_session_data *sd);
-
-// guild
-int clif_guild_created (struct map_session_data *sd, int flag);
-int clif_guild_belonginfo (struct map_session_data *sd, struct guild *g);
-int clif_guild_basicinfo (struct map_session_data *sd);
-int clif_guild_allianceinfo (struct map_session_data *sd);
-int clif_guild_memberlist (struct map_session_data *sd);
-int clif_guild_skillinfo (struct map_session_data *sd);
-int clif_guild_memberlogin_notice (struct guild *g, int idx, int flag);
-int clif_guild_invite (struct map_session_data *sd, struct guild *g);
-int clif_guild_inviteack (struct map_session_data *sd, int flag);
-int clif_guild_leave (struct map_session_data *sd, const char *name,
- const char *mes);
-int clif_guild_explusion (struct map_session_data *sd, const char *name,
- const char *mes, int account_id);
-int clif_guild_positionchanged (struct guild *g, int idx);
-int clif_guild_memberpositionchanged (struct guild *g, int idx);
-int clif_guild_emblem (struct map_session_data *sd, struct guild *g);
-int clif_guild_notice (struct map_session_data *sd, struct guild *g);
-int clif_guild_message (struct guild *g, int account_id, const char *mes,
- int len);
-int clif_guild_skillup (struct map_session_data *sd, int skill_num, int lv);
-int clif_guild_reqalliance (struct map_session_data *sd, int account_id,
- const char *name);
-int clif_guild_allianceack (struct map_session_data *sd, int flag);
-int clif_guild_delalliance (struct map_session_data *sd, int guild_id,
- int flag);
-int clif_guild_oppositionack (struct map_session_data *sd, int flag);
-int clif_guild_broken (struct map_session_data *sd, int flag);
+int clif_party_created(struct map_session_data *sd, int flag);
+int clif_party_info(struct party *p, int fd);
+int clif_party_invite(struct map_session_data *sd,
+ struct map_session_data *tsd);
+int clif_party_inviteack(struct map_session_data *sd, const char *nick, int flag);
+int clif_party_option(struct party *p, struct map_session_data *sd,
+ int flag);
+int clif_party_leaved(struct party *p, struct map_session_data *sd,
+ int account_id, const char *name, int flag);
+int clif_party_message(struct party *p, int account_id, const char *mes, int len);
+int clif_party_xy(struct party *p, struct map_session_data *sd);
+int clif_party_hp(struct party *p, struct map_session_data *sd);
// atcommand
-int clif_displaymessage (int fd, const char *mes);
-int clif_disp_onlyself (struct map_session_data *sd, const char *mes, int len);
-int clif_GMmessage (struct block_list *bl, const char *mes, int len, int flag);
-int clif_heal (int fd, int type, int val);
-int clif_resurrection (struct block_list *bl, int type);
-int clif_set0199 (int fd, int type);
-int clif_pvpset (struct map_session_data *sd, int pvprank, int pvpnum,
- int type);
-int clif_send0199 (int map, int type);
-int clif_refine (int fd, struct map_session_data *sd, int fail, int index,
- int val);
+void clif_displaymessage(int fd, const_string mes);
+void clif_GMmessage(struct block_list *bl, const_string mes, int flag);
+int clif_resurrection(struct block_list *bl, int type);
-int clif_specialeffect (struct block_list *bl, int type, int flag); // special effects [Valaris]
-int clif_message (struct block_list *bl, const char *msg); // messages (from mobs/npcs) [Valaris]
+int clif_specialeffect(struct block_list *bl, int type, int flag); // special effects [Valaris]
+int clif_message(struct block_list *bl, const char *msg); // messages (from mobs/npcs) [Valaris]
-int clif_GM_kickack (struct map_session_data *sd, int id);
-int clif_GM_kick (struct map_session_data *sd, struct map_session_data *tsd,
- int type);
+int clif_GM_kick(struct map_session_data *sd, struct map_session_data *tsd,
+ int type);
-int clif_foreachclient (int (*)(struct map_session_data *, va_list), ...);
+int clif_foreachclient(std::function<void(struct map_session_data *)>);
-int do_final_clif (void);
-int do_init_clif (void);
+int do_init_clif (void);
-#endif
+#endif // CLIF_HPP
diff --git a/src/map/clif.t.hpp b/src/map/clif.t.hpp
new file mode 100644
index 0000000..38394e9
--- /dev/null
+++ b/src/map/clif.t.hpp
@@ -0,0 +1,21 @@
+#ifndef CLIF_T_HPP
+#define CLIF_T_HPP
+
+#include <cstdint>
+
+enum class BeingRemoveWhy : uint8_t
+{
+ // general disappearance
+ GONE = 0,
+ // only case handled specially in client
+ DEAD = 1,
+ QUIT = 2,
+ WARPED = 3,
+ // handled specially in clif_clearchar - sent as 0 over network
+ DISGUISE = 9,
+
+ // handled speciall in mob_warp - not actually sent over network
+ NEGATIVE1 = 0xff,
+};
+
+#endif // CLIF_T_HPP
diff --git a/src/map/grfio.cpp b/src/map/grfio.cpp
new file mode 100644
index 0000000..a190d1b
--- /dev/null
+++ b/src/map/grfio.cpp
@@ -0,0 +1,72 @@
+// Reads .gat files by name-mapping .wlk files
+#include "grfio.hpp"
+
+#include <sys/stat.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <cassert>
+#include <cstdio>
+#include <cstring>
+
+#include <fstream>
+#include <map>
+
+#include "../common/cxxstdio.hpp"
+#include "../common/extract.hpp"
+
+#include "../poison.hpp"
+
+static
+std::map<std::string, std::string> load_resnametable()
+{
+ std::ifstream in("data/resnametable.txt");
+ if (!in.is_open())
+ {
+ fprintf(stderr, "Missing data/resnametable.txt");
+ abort();
+ }
+ std::map<std::string, std::string> out;
+
+ std::string line;
+ while (std::getline(in, line))
+ {
+ std::string key, value;
+ if (!extract(line,
+ record<'#'>(&key, &value)))
+ continue;
+ out[key] = value;
+ }
+ return out;
+}
+
+/// Change *.gat to *.wlk
+static
+std::string grfio_resnametable(const_string rname)
+{
+ static
+ std::map<std::string, std::string> resnametable = load_resnametable();
+
+ return resnametable.at(std::string(rname.begin(), rname.end()));
+}
+
+std::vector<uint8_t> grfio_reads(const_string rname)
+{
+ std::string lfname = "data/" + grfio_resnametable(rname);
+
+ int fd = open(lfname.c_str(), O_RDONLY);
+ if (fd == -1)
+ {
+ FPRINTF(stderr, "Resource %s (file %s) not found\n",
+ std::string(rname.begin(), rname.end()), lfname);
+ return {};
+ }
+ off_t len = lseek(fd, 0, SEEK_END);
+ assert (len != -1);
+ std::vector<uint8_t> buffer(len);
+ int err = pread(fd, buffer.data(), len, 0);
+ assert (err == len);
+ close(fd);
+ return buffer;
+}
diff --git a/src/map/grfio.hpp b/src/map/grfio.hpp
new file mode 100644
index 0000000..fd7b871
--- /dev/null
+++ b/src/map/grfio.hpp
@@ -0,0 +1,15 @@
+#ifndef GRFIO_HPP
+#define GRFIO_HPP
+
+#include <cstdint>
+
+#include <vector>
+
+#include "../common/const_array.hpp"
+
+/// Load a resource into memory, subject to data/resnametable.txt.
+/// Normally, resourcename is xxx-y.gat and the file is xxx-y.wlk.
+/// Currently there is exactly one .wlk per .gat, but multiples are fine.
+std::vector<uint8_t> grfio_reads(const_string resourcename);
+
+#endif // GRFIO_HPP
diff --git a/src/map/guild.cpp b/src/map/guild.cpp
deleted file mode 100644
index eba856d..0000000
--- a/src/map/guild.cpp
+++ /dev/null
@@ -1,1922 +0,0 @@
-// $Id: guild.c,v 1.5 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "guild.hpp"
-#include "storage.hpp"
-#include "../common/db.hpp"
-#include "../common/timer.hpp"
-#include "../common/socket.hpp"
-#include "../common/nullpo.hpp"
-#include "battle.hpp"
-#include "npc.hpp"
-#include "pc.hpp"
-#include "map.hpp"
-#include "mob.hpp"
-#include "intif.hpp"
-#include "clif.hpp"
-#include "tmw.hpp"
-
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
-
-static struct dbt *guild_db;
-static struct dbt *castle_db;
-static struct dbt *guild_expcache_db;
-static struct dbt *guild_infoevent_db;
-static struct dbt *guild_castleinfoevent_db;
-
-struct eventlist
-{
- char name[50];
- struct eventlist *next;
-};
-
-// ギルドのEXPキャッシュのフラッシュに関連する定数
-#define GUILD_PAYEXP_INVERVAL 10000 // 間隔(キャッシュの最大生存時間、ミリ秒)
-#define GUILD_PAYEXP_LIST 8192 // キャッシュの最大数
-
-// ギルドのEXPキャッシュ
-struct guild_expcache
-{
- int guild_id, account_id, char_id, exp;
-};
-
-// ギルドスキルdbのアクセサ(今は直打ちで代用)
-int guild_skill_get_inf (int id)
-{
- return 0;
-}
-
-int guild_skill_get_sp (int id, int lv)
-{
- return 0;
-}
-
-int guild_skill_get_range (int id)
-{
- return 0;
-}
-
-int guild_skill_get_max (int id)
-{
- return (id == 10004) ? 10 : 1;
-}
-
-// ギルドスキルがあるか確認
-int guild_checkskill (struct guild *g, int id)
-{
- return g->skill[id - 10000].lv;
-}
-
-void guild_payexp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
-void guild_gvg_eliminate_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
-
-static int guild_read_castledb (void)
-{
- FILE *fp;
- char line[1024];
- int j, ln = 0;
- char *str[32], *p;
- struct guild_castle *gc;
-
- if ((fp = fopen_ ("db/castle_db.txt", "r")) == NULL)
- {
- printf ("can't read db/castle_db.txt\n");
- return -1;
- }
-
- while (fgets (line, 1020, fp))
- {
- if (line[0] == '/' && line[1] == '/')
- continue;
- memset (str, 0, sizeof (str));
- CREATE (gc, struct guild_castle, 1);
- for (j = 0, p = line; j < 6 && p; j++)
- {
- str[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
-
- gc->guild_id = 0; // <Agit> Clear Data for Initialize
- gc->economy = 0;
- gc->defense = 0;
- gc->triggerE = 0;
- gc->triggerD = 0;
- gc->nextTime = 0;
- gc->payTime = 0;
- gc->createTime = 0;
- gc->visibleC = 0;
- gc->visibleG0 = 0;
- gc->visibleG1 = 0;
- gc->visibleG2 = 0;
- gc->visibleG3 = 0;
- gc->visibleG4 = 0;
- gc->visibleG5 = 0;
- gc->visibleG6 = 0;
- gc->visibleG7 = 0;
- gc->Ghp0 = 0;
- gc->Ghp1 = 0;
- gc->Ghp2 = 0;
- gc->Ghp3 = 0;
- gc->Ghp4 = 0;
- gc->Ghp5 = 0;
- gc->Ghp6 = 0;
- gc->Ghp7 = 0; // guardian HP [Valaris]
-
- gc->castle_id = atoi (str[0]);
- memcpy (gc->map_name, str[1], 24);
- memcpy (gc->castle_name, str[2], 24);
- memcpy (gc->castle_event, str[3], 24);
-
- numdb_insert (castle_db, gc->castle_id, gc);
-
- //intif_guild_castle_info(gc->castle_id);
-
- ln++;
- }
- fclose_ (fp);
- printf ("read db/castle_db.txt done (count=%d)\n", ln);
- return 0;
-}
-
-// 初期化
-void do_init_guild (void)
-{
- guild_db = numdb_init ();
- castle_db = numdb_init ();
- guild_expcache_db = numdb_init ();
- guild_infoevent_db = numdb_init ();
- guild_castleinfoevent_db = numdb_init ();
-
- guild_read_castledb ();
-
- add_timer_interval (gettick () + GUILD_PAYEXP_INVERVAL,
- guild_payexp_timer, 0, 0, GUILD_PAYEXP_INVERVAL);
-}
-
-// 検索
-struct guild *guild_search (int guild_id)
-{
- return (struct guild *)numdb_search (guild_db, guild_id);
-}
-
-static
-void guild_searchname_sub (db_key_t key, db_val_t data, va_list ap)
-{
- struct guild *g = (struct guild *) data, **dst;
- char *str;
- str = va_arg (ap, char *);
- dst = va_arg (ap, struct guild **);
- if (strcasecmp (g->name, str) == 0)
- *dst = g;
-}
-
-// ギルド名検索
-struct guild *guild_searchname (const char *str)
-{
- struct guild *g = NULL;
- numdb_foreach (guild_db, guild_searchname_sub, str, &g);
- return g;
-}
-
-struct guild_castle *guild_castle_search (int gcid)
-{
- return (struct guild_castle *)numdb_search (castle_db, gcid);
-}
-
-// mapnameに対応したアジトのgcを返す
-struct guild_castle *guild_mapname2gc (const char *mapname)
-{
- int i;
- struct guild_castle *gc = NULL;
- for (i = 0; i < MAX_GUILDCASTLE; i++)
- {
- gc = guild_castle_search (i);
- if (!gc)
- continue;
- if (strcmp (gc->map_name, mapname) == 0)
- return gc;
- }
- return NULL;
-}
-
-// ログイン中のギルドメンバーの1人のsdを返す
-struct map_session_data *guild_getavailablesd (struct guild *g)
-{
- int i;
-
- nullpo_retr (NULL, g);
-
- for (i = 0; i < g->max_member; i++)
- if (g->member[i].sd != NULL)
- return g->member[i].sd;
- return NULL;
-}
-
-// ギルドメンバーのインデックスを返す
-int guild_getindex (struct guild *g, int account_id, int char_id)
-{
- int i;
- if (g == NULL)
- return -1;
- for (i = 0; i < g->max_member; i++)
- if (g->member[i].account_id == account_id)
- return i;
- return -1;
-}
-
-// ギルドメンバーの役職を返す
-int guild_getposition (struct map_session_data *sd, struct guild *g)
-{
- int i;
-
- nullpo_retr (-1, sd);
-
- if (g == NULL && (g = guild_search (sd->status.guild_id)) == NULL)
- return -1;
- for (i = 0; i < g->max_member; i++)
- if (g->member[i].account_id == sd->status.account_id)
- return g->member[i].position;
- return -1;
-}
-
-// メンバー情報の作成
-static
-void guild_makemember (struct guild_member *m, struct map_session_data *sd)
-{
- nullpo_retv (sd);
-
- memset (m, 0, sizeof (struct guild_member));
- m->account_id = sd->status.account_id;
- m->char_id = 0;
- m->hair = sd->status.hair;
- m->hair_color = sd->status.hair_color;
- m->gender = sd->sex;
- m->pc_class = sd->status.pc_class;
- m->lv = sd->status.base_level;
- m->exp = 0;
- m->exp_payper = 0;
- m->online = 1;
- m->position = MAX_GUILDPOSITION - 1;
- memcpy (m->name, sd->status.name, 24);
- return;
-}
-
-// ギルド競合確認
-static
-int guild_check_conflict (struct map_session_data *sd)
-{
- nullpo_retr (0, sd);
-
- intif_guild_checkconflict (sd->status.guild_id,
- sd->status.account_id, 0 /*char_id*/);
- return 0;
-}
-
-// ギルドのEXPキャッシュをinter鯖にフラッシュする
-static
-void guild_payexp_timer_sub (db_key_t key, db_val_t data, va_list ap)
-{
- int i, *dellist, *delp, dataid = key.i;
- struct guild_expcache *c;
- struct guild *g;
-
- nullpo_retv (ap);
- nullpo_retv (c = (struct guild_expcache *) data);
- nullpo_retv (dellist = va_arg (ap, int *));
- nullpo_retv (delp = va_arg (ap, int *));
-
- if (*delp >= GUILD_PAYEXP_LIST
- || (g = guild_search (c->guild_id)) == NULL)
- return;
- if ((i = guild_getindex (g, c->account_id, 0 /*c->char_id*/)) < 0)
- return;
-
- g->member[i].exp += c->exp;
- intif_guild_change_memberinfo (g->guild_id, c->account_id, 0 /*char_id*/,
- GMI_EXP, &g->member[i].exp,
- sizeof (g->member[i].exp));
- c->exp = 0;
-
- dellist[(*delp)++] = dataid;
- free (c);
-}
-
-void guild_payexp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{
- int dellist[GUILD_PAYEXP_LIST], delp = 0, i;
- numdb_foreach (guild_expcache_db, guild_payexp_timer_sub, dellist, &delp);
- for (i = 0; i < delp; i++)
- numdb_erase (guild_expcache_db, dellist[i]);
-// if(battle_config.etc_log)
-// printf("guild exp %d charactor's exp flushed !\n",delp);
-}
-
-//------------------------------------------------------------------------
-
-/* Process a guild creation request. */
-int guild_create (struct map_session_data *sd, const char *name)
-{
- char pname[24];
-
- nullpo_retr (0, sd);
-
- strncpy (pname, name, 24);
- pname[23] = '\0';
- tmw_TrimStr (pname);
-
- /* The guild name is empty/invalid. */
- if (!*pname)
- clif_guild_created (sd, 2);
-
- /* Make sure the character isn't already in a guild. */
- if (sd->status.guild_id == 0)
- {
- /*
- * A special item is required to create a guild. This is specified
- * in battle_athena.conf as guild_emperium_check. This item will
- * be removed from the player's inventory when used to create a
- * guild.
- */
- if (!battle_config.guild_emperium_check
- || pc_search_inventory (sd,
- battle_config.guild_emperium_check) >= 0)
- {
- struct guild_member m;
- guild_makemember (&m, sd);
- m.position = 0;
- intif_guild_create (pname, &m);
- }
- else
- clif_guild_created (sd, 3);
- }
- else
- clif_guild_created (sd, 1);
-
- return 0;
-}
-
-/* Relay the result of a guild creation request. */
-int guild_created (int account_id, int guild_id)
-{
- struct map_session_data *sd = map_id2sd (account_id);
-
- if (!sd)
- return 0;
-
- /* The guild name is valid and not already taken. */
- if (guild_id > 0)
- {
- struct guild *g;
- sd->status.guild_id = guild_id;
- sd->guild_sended = 0;
-
- if ((g = (struct guild *)numdb_search (guild_db, guild_id)) != NULL)
- {
- printf ("guild_created(): ID already exists!\n");
- exit (1);
- }
-
- /* The guild was created successfully. */
- clif_guild_created (sd, 0);
-
- if (battle_config.guild_emperium_check)
- pc_delitem (sd,
- pc_search_inventory (sd,
- battle_config.
- guild_emperium_check), 1, 0);
- }
- else
- clif_guild_created (sd, 2);
-
- return 0;
-}
-
-// 情報要求
-int guild_request_info (int guild_id)
-{
-// if(battle_config.etc_log)
-// printf("guild_request_info\n");
- return intif_guild_request_info (guild_id);
-}
-
-// イベント付き情報要求
-int guild_npc_request_info (int guild_id, const char *event)
-{
- struct eventlist *ev;
-
- if (guild_search (guild_id))
- {
- if (event && *event)
- npc_event_do (event);
- return 0;
- }
-
- if (event == NULL || *event == 0)
- return guild_request_info (guild_id);
-
- CREATE (ev, struct eventlist, 1);
- memcpy (ev->name, event, sizeof (ev->name));
- ev->next =
- (struct eventlist *) numdb_search (guild_infoevent_db, guild_id);
- numdb_insert (guild_infoevent_db, guild_id, ev);
- return guild_request_info (guild_id);
-}
-
-// 所属キャラの確認
-static
-int guild_check_member (const struct guild *g)
-{
- int i;
- struct map_session_data *sd;
-
- nullpo_retr (0, g);
-
- for (i = 0; i < fd_max; i++)
- {
- if (session[i] && (sd = (struct map_session_data *)session[i]->session_data) && sd->state.auth)
- {
- if (sd->status.guild_id == g->guild_id)
- {
- int j, f = 1;
- for (j = 0; j < MAX_GUILD; j++)
- { // データがあるか
- if (g->member[j].account_id == sd->status.account_id)
- f = 0;
- }
- if (f)
- {
- sd->status.guild_id = 0;
- sd->guild_sended = 0;
- sd->guild_emblem_id = 0;
- if (battle_config.error_log)
- printf ("guild: check_member %d[%s] is not member\n",
- sd->status.account_id, sd->status.name);
- }
- }
- }
- }
- return 0;
-}
-
-// 情報所得失敗(そのIDのキャラを全部未所属にする)
-int guild_recv_noinfo (int guild_id)
-{
- int i;
- struct map_session_data *sd;
- for (i = 0; i < fd_max; i++)
- {
- if (session[i] && (sd = (struct map_session_data *)session[i]->session_data) && sd->state.auth)
- {
- if (sd->status.guild_id == guild_id)
- sd->status.guild_id = 0;
- }
- }
- return 0;
-}
-
-// 情報所得
-int guild_recv_info (struct guild *sg)
-{
- struct guild *g, before;
- int i, bm, m;
- struct eventlist *ev, *ev2;
-
- nullpo_retr (0, sg);
-
- if ((g = (struct guild *)numdb_search (guild_db, sg->guild_id)) == NULL)
- {
- CREATE (g, struct guild, 1);
- numdb_insert (guild_db, sg->guild_id, g);
- before = *sg;
-
- // 最初のロードなのでユーザーのチェックを行う
- guild_check_member (sg);
- }
- else
- before = *g;
- memcpy (g, sg, sizeof (struct guild));
-
- for (i = bm = m = 0; i < g->max_member; i++)
- { // sdの設定と人数の確認
- if (g->member[i].account_id > 0)
- {
- struct map_session_data *sd = map_id2sd (g->member[i].account_id);
- g->member[i].sd = (sd != NULL &&
- sd->status.guild_id ==
- g->guild_id) ? sd : NULL;
- m++;
- }
- else
- g->member[i].sd = NULL;
- if (before.member[i].account_id > 0)
- bm++;
- }
-
- for (i = 0; i < g->max_member; i++)
- { // 情報の送信
- struct map_session_data *sd = g->member[i].sd;
- if (sd == NULL)
- continue;
-
- if (before.guild_lv != g->guild_lv || bm != m ||
- before.max_member != g->max_member)
- {
- clif_guild_basicinfo (sd); // 基本情報送信
- clif_guild_emblem (sd, g); // エンブレム送信
- }
-
- if (bm != m)
- { // メンバー情報送信
- clif_guild_memberlist (g->member[i].sd);
- }
-
- if (before.skill_point != g->skill_point)
- clif_guild_skillinfo (sd); // スキル情報送信
-
- if (sd->guild_sended == 0)
- { // 未送信なら所属情報も送る
- clif_guild_belonginfo (sd, g);
- clif_guild_notice (sd, g);
- sd->guild_emblem_id = g->emblem_id;
- sd->guild_sended = 1;
- }
- }
-
- // イベントの発生
- if ((ev = (struct eventlist *)numdb_search (guild_infoevent_db, sg->guild_id)) != NULL)
- {
- numdb_erase (guild_infoevent_db, sg->guild_id);
- for (; ev; ev2 = ev->next, free (ev), ev = ev2)
- {
- npc_event_do (ev->name);
- }
- }
-
- return 0;
-}
-
-// ギルドへの勧誘
-int guild_invite (struct map_session_data *sd, int account_id)
-{
- struct map_session_data *tsd;
- struct guild *g;
- int i;
-
- nullpo_retr (0, sd);
-
- tsd = map_id2sd (account_id);
- g = guild_search (sd->status.guild_id);
-
- if (tsd == NULL || g == NULL)
- return 0;
- if (!battle_config.invite_request_check)
- {
- if (tsd->party_invite > 0 || tsd->trade_partner)
- { // 相手が取引中かどうか
- clif_guild_inviteack (sd, 0);
- return 0;
- }
- }
- if (tsd->status.guild_id > 0 || tsd->guild_invite > 0)
- { // 相手の所属確認
- clif_guild_inviteack (sd, 0);
- return 0;
- }
-
- // 定員確認
- for (i = 0; i < g->max_member; i++)
- if (g->member[i].account_id == 0)
- break;
- if (i == g->max_member)
- {
- clif_guild_inviteack (sd, 3);
- return 0;
- }
-
- tsd->guild_invite = sd->status.guild_id;
- tsd->guild_invite_account = sd->status.account_id;
-
- clif_guild_invite (tsd, g);
- return 0;
-}
-
-// ギルド勧誘への返答
-int guild_reply_invite (struct map_session_data *sd, int guild_id, int flag)
-{
- struct map_session_data *tsd;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, tsd = map_id2sd (sd->guild_invite_account));
-
- if (sd->guild_invite != guild_id) // 勧誘とギルドIDが違う
- return 0;
-
- if (flag == 1)
- { // 承諾
- struct guild_member m;
- struct guild *g;
- int i;
-
- // 定員確認
- if ((g = guild_search (tsd->status.guild_id)) == NULL)
- {
- sd->guild_invite = 0;
- sd->guild_invite_account = 0;
- return 0;
- }
- for (i = 0; i < g->max_member; i++)
- if (g->member[i].account_id == 0)
- break;
- if (i == g->max_member)
- {
- sd->guild_invite = 0;
- sd->guild_invite_account = 0;
- clif_guild_inviteack (tsd, 3);
- return 0;
- }
-
- //inter鯖へ追加要求
- guild_makemember (&m, sd);
- intif_guild_addmember (sd->guild_invite, &m);
- return 0;
- }
- else
- { // 拒否
- sd->guild_invite = 0;
- sd->guild_invite_account = 0;
- if (tsd == NULL)
- return 0;
- clif_guild_inviteack (tsd, 1);
- }
- return 0;
-}
-
-// ギルドメンバが追加された
-int guild_member_added (int guild_id, int account_id, int char_id, int flag)
-{
- struct map_session_data *sd = map_id2sd (account_id), *sd2;
- struct guild *g;
-
- if ((g = guild_search (guild_id)) == NULL)
- return 0;
-
- if ((sd == NULL || sd->guild_invite == 0) && flag == 0)
- {
- // キャラ側に登録できなかったため脱退要求を出す
- if (battle_config.error_log)
- printf ("guild: member added error %d is not online\n",
- account_id);
- intif_guild_leave (guild_id, account_id, 0 /*char_id*/, 0, "**登録失敗**");
- return 0;
- }
- sd->guild_invite = 0;
- sd->guild_invite_account = 0;
-
- sd2 = map_id2sd (sd->guild_invite_account);
-
- if (flag == 1)
- { // 失敗
- if (sd2 != NULL)
- clif_guild_inviteack (sd2, 3);
- return 0;
- }
-
- // 成功
- sd->guild_sended = 0;
- sd->status.guild_id = guild_id;
-
- if (sd2 != NULL)
- clif_guild_inviteack (sd2, 2);
-
- // いちおう競合確認
- guild_check_conflict (sd);
-
- return 0;
-}
-
-// ギルド脱退要求
-int guild_leave (struct map_session_data *sd, int guild_id,
- int account_id, int char_id, const char *mes)
-{
- struct guild *g;
- int i;
-
- nullpo_retr (0, sd);
-
- g = guild_search (sd->status.guild_id);
-
- if (g == NULL)
- return 0;
-
- if (sd->status.account_id != account_id ||
- sd->status.guild_id != guild_id)
- return 0;
-
- for (i = 0; i < g->max_member; i++)
- { // 所属しているか
- if (g->member[i].account_id == sd->status.account_id)
- {
- intif_guild_leave (g->guild_id, sd->status.account_id,
- sd->status.char_id, 0, mes);
- return 0;
- }
- }
- return 0;
-}
-
-// ギルド追放要求
-int guild_explusion (struct map_session_data *sd, int guild_id,
- int account_id, int char_id, const char *mes)
-{
- struct guild *g;
- int i, ps;
-
- nullpo_retr (0, sd);
-
- g = guild_search (sd->status.guild_id);
-
- if (g == NULL)
- return 0;
-
- if (sd->status.guild_id != guild_id)
- return 0;
-
- if ((ps = guild_getposition (sd, g)) < 0
- || !(g->position[ps].mode & 0x0010))
- return 0; // 処罰権限無し
-
- for (i = 0; i < g->max_member; i++)
- { // 所属しているか
- if (g->member[i].account_id == account_id)
- {
- intif_guild_leave (g->guild_id, account_id, 0 /*char_id*/, 1, mes);
- return 0;
- }
- }
- return 0;
-}
-
-// ギルドメンバが脱退した
-int guild_member_leaved (int guild_id, int account_id, int char_id, int flag,
- const char *name, const char *mes)
-{
- struct map_session_data *sd = map_id2sd (account_id);
- struct guild *g = guild_search (guild_id);
- int i;
-
- if (g != NULL)
- {
- int i;
- for (i = 0; i < g->max_member; i++)
- if (g->member[i].account_id == account_id)
- {
- struct map_session_data *sd2 = sd;
- if (sd2 == NULL)
- sd2 = guild_getavailablesd (g);
- else
- {
- if (flag == 0)
- clif_guild_leave (sd2, name, mes);
- else
- clif_guild_explusion (sd2, name, mes, account_id);
- }
- g->member[i].account_id = 0;
- g->member[i].sd = NULL;
- }
- }
- if (sd != NULL && sd->status.guild_id == guild_id)
- {
- if (sd->state.storage_flag == 2) //Close the guild storage.
- storage_guild_storageclose (sd);
- sd->status.guild_id = 0;
- sd->guild_emblem_id = 0;
- sd->guild_sended = 0;
- }
-
- // メンバーリストを全員に再通知
- for (i = 0; i < g->max_member; i++)
- {
- if (g->member[i].sd != NULL)
- clif_guild_memberlist (g->member[i].sd);
- }
-
- return 0;
-}
-
-// ギルドメンバのオンライン状態/Lv更新送信
-int guild_send_memberinfoshort (struct map_session_data *sd, int online)
-{
- struct guild *g;
-
- nullpo_retr (0, sd);
-
- if (sd->status.guild_id <= 0)
- return 0;
- g = guild_search (sd->status.guild_id);
- if (g == NULL)
- return 0;
-
- intif_guild_memberinfoshort (g->guild_id,
- sd->status.account_id, 0 /*char_id*/,
- online, sd->status.base_level,
- sd->status.pc_class);
-
- if (!online)
- { // ログアウトするならsdをクリアして終了
- int i =
- guild_getindex (g, sd->status.account_id, 0 /*char_id*/);
- if (i >= 0)
- g->member[i].sd = NULL;
- return 0;
- }
-
- if (sd->guild_sended != 0) // ギルド初期送信データは送信済み
- return 0;
-
- // 競合確認
- guild_check_conflict (sd);
-
- // あるならギルド初期送信データ送信
- if ((g = guild_search (sd->status.guild_id)) != NULL)
- {
- guild_check_member (g); // 所属を確認する
- if (sd->status.guild_id == g->guild_id)
- {
- clif_guild_belonginfo (sd, g);
- clif_guild_notice (sd, g);
- sd->guild_sended = 1;
- sd->guild_emblem_id = g->emblem_id;
- }
- }
- return 0;
-}
-
-// ギルドメンバのオンライン状態/Lv更新通知
-int guild_recv_memberinfoshort (int guild_id, int account_id, int char_id,
- int online, int lv, int pc_class)
-{
- int i, alv, c, idx = 0, om = 0, oldonline = -1;
- struct guild *g = guild_search (guild_id);
- if (g == NULL)
- return 0;
- for (i = 0, alv = 0, c = 0, om = 0; i < g->max_member; i++)
- {
- struct guild_member *m = &g->member[i];
- if (m->account_id == account_id)
- {
- oldonline = m->online;
- m->online = online;
- m->lv = lv;
- m->pc_class = pc_class;
- idx = i;
- }
- if (m->account_id > 0)
- {
- alv += m->lv;
- c++;
- }
- if (m->online)
- om++;
- }
- if (idx == g->max_member)
- {
- if (battle_config.error_log)
- printf ("guild: not found member %d,%d on %d[%s]\n", account_id,
- char_id, guild_id, g->name);
- return 0;
- }
- g->average_lv = alv / c;
- g->connect_member = om;
-
- if (oldonline != online) // オンライン状態が変わったので通知
- clif_guild_memberlogin_notice (g, idx, online);
-
- for (i = 0; i < g->max_member; i++)
- { // sd再設定
- struct map_session_data *sd = map_id2sd (g->member[i].account_id);
- g->member[i].sd = (sd != NULL &&
- sd->status.guild_id == guild_id) ? sd : NULL;
- }
-
- // ここにクライアントに送信処理が必要
-
- return 0;
-}
-
-// ギルド会話送信
-int guild_send_message (struct map_session_data *sd, const char *mes, int len)
-{
- nullpo_retr (0, sd);
-
- if (sd->status.guild_id == 0)
- return 0;
- intif_guild_message (sd->status.guild_id, sd->status.account_id, mes,
- len);
- return 0;
-}
-
-// ギルド会話受信
-int guild_recv_message (int guild_id, int account_id, const char *mes, int len)
-{
- struct guild *g;
- if ((g = guild_search (guild_id)) == NULL)
- return 0;
- clif_guild_message (g, account_id, mes, len);
- return 0;
-}
-
-// ギルドメンバの役職変更
-int guild_change_memberposition (int guild_id, int account_id, int char_id,
- int idx)
-{
- return intif_guild_change_memberinfo (guild_id, account_id, 0 /*char_id*/,
- GMI_POSITION, &idx, sizeof (idx));
-}
-
-// ギルドメンバの役職変更通知
-int guild_memberposition_changed (struct guild *g, int idx, int pos)
-{
- nullpo_retr (0, g);
-
- g->member[idx].position = pos;
- clif_guild_memberpositionchanged (g, idx);
- return 0;
-}
-
-// ギルド役職変更
-int guild_change_position (struct map_session_data *sd, int idx,
- int mode, int exp_mode, const char *name)
-{
- struct guild_position p;
-
- nullpo_retr (0, sd);
-
- if (exp_mode > battle_config.guild_exp_limit)
- exp_mode = battle_config.guild_exp_limit;
- if (exp_mode < 0)
- exp_mode = 0;
- p.mode = mode;
- p.exp_mode = exp_mode;
- memcpy (p.name, name, 24);
- return intif_guild_position (sd->status.guild_id, idx, &p);
-}
-
-// ギルド役職変更通知
-int guild_position_changed (int guild_id, int idx, struct guild_position *p)
-{
- struct guild *g = guild_search (guild_id);
- if (g == NULL)
- return 0;
- memcpy (&g->position[idx], p, sizeof (struct guild_position));
- clif_guild_positionchanged (g, idx);
- return 0;
-}
-
-// ギルド告知変更
-int guild_change_notice (struct map_session_data *sd, int guild_id,
- const char *mes1, const char *mes2)
-{
- struct guild *g;
- int ps;
-
- nullpo_retr (0, sd);
-
- g = guild_search (sd->status.guild_id);
-
- if (g == NULL)
- return 0;
-
- if ((ps = guild_getposition (sd, g)) < 0
- || !(g->position[ps].mode & 0x0010))
- return 0;
-
- if (guild_id != sd->status.guild_id)
- return 0;
-
- return intif_guild_notice (guild_id, mes1, mes2);
-}
-
-// ギルド告知変更通知
-int guild_notice_changed (int guild_id, const char *mes1, const char *mes2)
-{
- int i;
- struct map_session_data *sd;
- struct guild *g = guild_search (guild_id);
- if (g == NULL)
- return 0;
-
- memcpy (g->mes1, mes1, 60);
- memcpy (g->mes2, mes2, 120);
-
- for (i = 0; i < g->max_member; i++)
- {
- if ((sd = g->member[i].sd) != NULL)
- clif_guild_notice (sd, g);
- }
- return 0;
-}
-
-// ギルドエンブレム変更
-int guild_change_emblem (struct map_session_data *sd, int len,
- const char *data)
-{
- struct guild *g;
- int ps;
-
- nullpo_retr (0, sd);
-
- g = guild_search (sd->status.guild_id);
-
- if (g == NULL)
- return 0;
-
- if ((ps = guild_getposition (sd, g)) < 0
- || !(g->position[ps].mode & 0x0010))
- return 0;
-
- return intif_guild_emblem (sd->status.guild_id, len, data);
-}
-
-// ギルドエンブレム変更通知
-int guild_emblem_changed (int len, int guild_id, int emblem_id,
- const char *data)
-{
- int i;
- struct map_session_data *sd;
- struct guild *g = guild_search (guild_id);
- if (g == NULL)
- return 0;
-
- memcpy (g->emblem_data, data, len);
- g->emblem_len = len;
- g->emblem_id = emblem_id;
-
- for (i = 0; i < g->max_member; i++)
- {
- if ((sd = g->member[i].sd) != NULL)
- {
- sd->guild_emblem_id = emblem_id;
- clif_guild_belonginfo (sd, g);
- clif_guild_emblem (sd, g);
- }
- }
- return 0;
-}
-
-// ギルドのEXP上納
-int guild_payexp (struct map_session_data *sd, int exp)
-{
- struct guild *g;
- struct guild_expcache *c;
- int per, exp2;
-
- nullpo_retr (0, sd);
-
- if (sd->status.guild_id == 0
- || (g = guild_search (sd->status.guild_id)) == NULL)
- return 0;
- if ((per = g->position[guild_getposition (sd, g)].exp_mode) <= 0)
- return 0;
- if (per > 100)
- per = 100;
-
- if ((exp2 = exp * per / 100) <= 0)
- return 0;
-
- if ((c = (struct guild_expcache *)numdb_search (guild_expcache_db, sd->status.account_id /*char_id*/)) == NULL)
- {
- CREATE (c, struct guild_expcache, 1);
- c->guild_id = sd->status.guild_id;
- c->account_id = sd->status.account_id;
- c->char_id = 0;
- c->exp = exp2;
- numdb_insert (guild_expcache_db, c->account_id /*char_id*/, c);
- }
- else
- {
- c->exp += exp2;
- }
- return exp2;
-}
-
-// スキルポイント割り振り
-int guild_skillup (struct map_session_data *sd, int skill_num)
-{
- struct guild *g;
- int idx;
-
- nullpo_retr (0, sd);
-
- if (sd->status.guild_id == 0
- || (g = guild_search (sd->status.guild_id)) == NULL)
- return 0;
- if (strcmp (sd->status.name, g->master))
- return 0;
-
- if (g->skill_point > 0 &&
- g->skill[(idx = skill_num - 10000)].id != 0 &&
- g->skill[idx].lv < guild_skill_get_max (skill_num))
- {
- intif_guild_skillup (g->guild_id, skill_num, sd->status.account_id);
- }
- return 0;
-}
-
-// スキルポイント割り振り通知
-int guild_skillupack (int guild_id, int skill_num, int account_id)
-{
- struct map_session_data *sd = map_id2sd (account_id);
- struct guild *g = guild_search (guild_id);
- int i;
- if (g == NULL)
- return 0;
- if (sd != NULL)
- clif_guild_skillup (sd, skill_num, g->skill[skill_num - 10000].lv);
- // 全員に通知
- for (i = 0; i < g->max_member; i++)
- if ((sd = g->member[i].sd) != NULL)
- clif_guild_skillinfo (sd);
- return 0;
-}
-
-// ギルド同盟数所得
-static
-int guild_get_alliance_count (struct guild *g, int flag)
-{
- int i, c;
-
- nullpo_retr (0, g);
-
- for (i = c = 0; i < MAX_GUILDALLIANCE; i++)
- {
- if (g->alliance[i].guild_id > 0 && g->alliance[i].opposition == flag)
- c++;
- }
- return c;
-}
-
-// ギルド同盟要求
-int guild_reqalliance (struct map_session_data *sd, int account_id)
-{
- struct map_session_data *tsd = map_id2sd (account_id);
- struct guild *g[2];
- int i, ps;
-
- if (agit_flag)
- { // Disable alliance creation during woe [Valaris]
- clif_displaymessage (sd->fd,
- "Alliances cannot be made during Guild Wars!");
- return 0;
- } // end addition [Valaris]
-
- nullpo_retr (0, sd);
-
- if (tsd == NULL || tsd->status.guild_id <= 0)
- return 0;
-
- g[0] = guild_search (sd->status.guild_id);
- g[1] = guild_search (tsd->status.guild_id);
-
- if (g[0] == NULL || g[1] == NULL)
- return 0;
-
- if ((ps = guild_getposition (sd, g[0])) < 0
- || !(g[0]->position[ps].mode & 0x0010))
- return 0;
-
- if (guild_get_alliance_count (g[0], 0) > 3) // 同盟数確認
- clif_guild_allianceack (sd, 4);
- if (guild_get_alliance_count (g[1], 0) > 3)
- clif_guild_allianceack (sd, 3);
-
- if (tsd->guild_alliance > 0)
- { // 相手が同盟要請状態かどうか確認
- clif_guild_allianceack (sd, 1);
- return 0;
- }
-
- for (i = 0; i < MAX_GUILDALLIANCE; i++)
- { // すでに同盟状態か確認
- if (g[0]->alliance[i].guild_id == tsd->status.guild_id &&
- g[0]->alliance[i].opposition == 0)
- {
- clif_guild_allianceack (sd, 0);
- return 0;
- }
- }
-
- tsd->guild_alliance = sd->status.guild_id;
- tsd->guild_alliance_account = sd->status.account_id;
-
- clif_guild_reqalliance (tsd, sd->status.account_id, g[0]->name);
- return 0;
-}
-
-// ギルド勧誘への返答
-int guild_reply_reqalliance (struct map_session_data *sd, int account_id,
- int flag)
-{
- struct map_session_data *tsd;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, tsd = map_id2sd (account_id));
-
- if (sd->guild_alliance != tsd->status.guild_id) // 勧誘とギルドIDが違う
- return 0;
-
- if (flag == 1)
- { // 承諾
- int i;
-
- struct guild *g; // 同盟数再確認
- if ((g = guild_search (sd->status.guild_id)) == NULL ||
- guild_get_alliance_count (g, 0) > 3)
- {
- clif_guild_allianceack (sd, 4);
- clif_guild_allianceack (tsd, 3);
- return 0;
- }
- if ((g = guild_search (tsd->status.guild_id)) == NULL ||
- guild_get_alliance_count (g, 0) > 3)
- {
- clif_guild_allianceack (sd, 3);
- clif_guild_allianceack (tsd, 4);
- return 0;
- }
-
- // 敵対関係なら敵対を止める
- if ((g = guild_search (sd->status.guild_id)) == NULL)
- return 0;
- for (i = 0; i < MAX_GUILDALLIANCE; i++)
- {
- if (g->alliance[i].guild_id == tsd->status.guild_id &&
- g->alliance[i].opposition == 1)
- intif_guild_alliance (sd->status.guild_id,
- tsd->status.guild_id,
- sd->status.account_id,
- tsd->status.account_id, 9);
- }
- if ((g = guild_search (tsd->status.guild_id)) == NULL)
- return 0;
- for (i = 0; i < MAX_GUILDALLIANCE; i++)
- {
- if (g->alliance[i].guild_id == sd->status.guild_id &&
- g->alliance[i].opposition == 1)
- intif_guild_alliance (tsd->status.guild_id,
- sd->status.guild_id,
- tsd->status.account_id,
- sd->status.account_id, 9);
- }
-
- // inter鯖へ同盟要請
- intif_guild_alliance (sd->status.guild_id, tsd->status.guild_id,
- sd->status.account_id, tsd->status.account_id,
- 0);
- return 0;
- }
- else
- { // 拒否
- sd->guild_alliance = 0;
- sd->guild_alliance_account = 0;
- if (tsd != NULL)
- clif_guild_allianceack (tsd, 3);
- }
- return 0;
-}
-
-// ギルド関係解消
-int guild_delalliance (struct map_session_data *sd, int guild_id, int flag)
-{
- if (agit_flag)
- { // Disable alliance breaking during woe [Valaris]
- clif_displaymessage (sd->fd,
- "Alliances cannot be broken during Guild Wars!");
- return 0;
- } // end addition [Valaris]
-
- struct guild *g;
- int ps;
-
- nullpo_retr (0, sd);
-
- g = guild_search (sd->status.guild_id);
-
- if (g == NULL)
- return 0;
-
- if ((ps = guild_getposition (sd, g)) < 0
- || !(g->position[ps].mode & 0x0010))
- return 0;
-
- intif_guild_alliance (sd->status.guild_id, guild_id,
- sd->status.account_id, 0, flag | 8);
- return 0;
-}
-
-// ギルド敵対
-int guild_opposition (struct map_session_data *sd, int account_id /*char_id*/)
-{
- struct map_session_data *tsd = map_id2sd (account_id /*char_id*/);
- struct guild *g;
- int i, ps;
-
- nullpo_retr (0, sd);
-
- g = guild_search (sd->status.guild_id);
- if (g == NULL || tsd == NULL)
- return 0;
-
- if ((ps = guild_getposition (sd, g)) < 0
- || !(g->position[ps].mode & 0x0010))
- return 0;
-
- if (guild_get_alliance_count (g, 1) > 3) // 敵対数確認
- clif_guild_oppositionack (sd, 1);
-
- for (i = 0; i < MAX_GUILDALLIANCE; i++)
- { // すでに関係を持っているか確認
- if (g->alliance[i].guild_id == tsd->status.guild_id)
- {
- if (g->alliance[i].opposition == 1)
- { // すでに敵対
- clif_guild_oppositionack (sd, 2);
- return 0;
- }
- else // 同盟破棄
- intif_guild_alliance (sd->status.guild_id,
- tsd->status.guild_id,
- sd->status.account_id,
- tsd->status.account_id, 8);
- }
- }
-
- // inter鯖に敵対要請
- intif_guild_alliance (sd->status.guild_id, tsd->status.guild_id,
- sd->status.account_id, tsd->status.account_id, 1);
- return 0;
-}
-
-// ギルド同盟/敵対通知
-int guild_allianceack (int guild_id1, int guild_id2, int account_id1,
- int account_id2, int flag, const char *name1,
- const char *name2)
-{
- struct guild *g[2];
- int guild_id[2] = { guild_id1, guild_id2 };
- const char *guild_name[2] = { name1, name2 };
- struct map_session_data *sd[2] =
- { map_id2sd (account_id1), map_id2sd (account_id2) };
- int j, i;
-
- g[0] = guild_search (guild_id1);
- g[1] = guild_search (guild_id2);
-
- if (sd[0] != NULL && (flag & 0x0f) == 0)
- {
- sd[0]->guild_alliance = 0;
- sd[0]->guild_alliance_account = 0;
- }
-
- if (flag & 0x70)
- { // 失敗
- for (i = 0; i < 2 - (flag & 1); i++)
- if (sd[i] != NULL)
- clif_guild_allianceack (sd[i],
- ((flag >> 4) == i + 1) ? 3 : 4);
- return 0;
- }
-// if(battle_config.etc_log)
-// printf("guild alliance_ack %d %d %d %d %d %s %s\n",guild_id1,guild_id2,account_id1,account_id2,flag,name1,name2);
-
- if (!(flag & 0x08))
- { // 関係追加
- for (i = 0; i < 2 - (flag & 1); i++)
- if (g[i] != NULL)
- for (j = 0; j < MAX_GUILDALLIANCE; j++)
- if (g[i]->alliance[j].guild_id == 0)
- {
- g[i]->alliance[j].guild_id = guild_id[1 - i];
- memcpy (g[i]->alliance[j].name, guild_name[1 - i],
- 24);
- g[i]->alliance[j].opposition = flag & 1;
- break;
- }
- }
- else
- { // 関係解消
- for (i = 0; i < 2 - (flag & 1); i++)
- {
- if (g[i] != NULL)
- for (j = 0; j < MAX_GUILDALLIANCE; j++)
- if (g[i]->alliance[j].guild_id == guild_id[1 - i] &&
- g[i]->alliance[j].opposition == (flag & 1))
- {
- g[i]->alliance[j].guild_id = 0;
- break;
- }
- if (sd[i] != NULL) // 解消通知
- clif_guild_delalliance (sd[i], guild_id[1 - i], (flag & 1));
- }
- }
-
- if ((flag & 0x0f) == 0)
- { // 同盟通知
- if (sd[1] != NULL)
- clif_guild_allianceack (sd[1], 2);
- }
- else if ((flag & 0x0f) == 1)
- { // 敵対通知
- if (sd[0] != NULL)
- clif_guild_oppositionack (sd[0], 0);
- }
-
- for (i = 0; i < 2 - (flag & 1); i++)
- { // 同盟/敵対リストの再送信
- struct map_session_data *sd;
- if (g[i] != NULL)
- for (j = 0; j < g[i]->max_member; j++)
- if ((sd = g[i]->member[j].sd) != NULL)
- clif_guild_allianceinfo (sd);
- }
- return 0;
-}
-
-// ギルド解散通知用
-static
-void guild_broken_sub (db_key_t key, db_val_t data, va_list ap)
-{
- struct guild *g = (struct guild *) data;
- int guild_id = va_arg (ap, int);
- int i, j;
- struct map_session_data *sd = NULL;
-
- nullpo_retv (g);
-
- for (i = 0; i < MAX_GUILDALLIANCE; i++)
- { // 関係を破棄
- if (g->alliance[i].guild_id == guild_id)
- {
- for (j = 0; j < g->max_member; j++)
- if ((sd = g->member[j].sd) != NULL)
- clif_guild_delalliance (sd, guild_id,
- g->alliance[i].opposition);
- g->alliance[i].guild_id = 0;
- }
- }
-}
-
-// ギルド解散通知
-int guild_broken (int guild_id, int flag)
-{
- struct guild *g = guild_search (guild_id);
- struct map_session_data *sd;
- int i;
- if (flag != 0 || g == NULL)
- return 0;
-
- for (i = 0; i < g->max_member; i++)
- { // ギルド解散を通知
- if ((sd = g->member[i].sd) != NULL)
- {
- if (sd->state.storage_flag == 2)
- storage_guild_storage_quit (sd, 1);
- sd->status.guild_id = 0;
- sd->guild_sended = 0;
- clif_guild_broken (g->member[i].sd, 0);
- }
- }
-
- numdb_foreach (guild_db, guild_broken_sub, guild_id);
- numdb_erase (guild_db, guild_id);
- guild_storage_delete (guild_id);
- free (g);
- return 0;
-}
-
-// ギルド解散
-int guild_break (struct map_session_data *sd, const char *name)
-{
- struct guild *g;
- int i;
-
- nullpo_retr (0, sd);
-
- if ((g = guild_search (sd->status.guild_id)) == NULL)
- return 0;
- if (strcmp (g->name, name) != 0)
- return 0;
- if (strcmp (sd->status.name, g->master) != 0)
- return 0;
- for (i = 0; i < g->max_member; i++)
- {
- if (g->member[i].account_id > 0
- && (g->member[i].account_id != sd->status.account_id))
- break;
- }
- if (i < g->max_member)
- {
- clif_guild_broken (sd, 2);
- return 0;
- }
-
- intif_guild_break (g->guild_id);
- return 0;
-}
-
-// ギルド城データ要求
-int guild_castledataload (int castle_id, int index)
-{
- return intif_guild_castle_dataload (castle_id, index);
-}
-
-// ギルド城情報所得時イベント追加
-int guild_addcastleinfoevent (int castle_id, int index, const char *name)
-{
- struct eventlist *ev;
- int code = castle_id | (index << 16);
-
- if (name == NULL || *name == 0)
- return 0;
-
- CREATE (ev, struct eventlist, 1);
- memcpy (ev->name, name, sizeof (ev->name));
- ev->next = (struct eventlist *)numdb_search (guild_castleinfoevent_db, code);
- numdb_insert (guild_castleinfoevent_db, code, ev);
- return 0;
-}
-
-// ギルド城データ要求返信
-int guild_castledataloadack (int castle_id, int index, int value)
-{
- struct guild_castle *gc = guild_castle_search (castle_id);
- int code = castle_id | (index << 16);
- struct eventlist *ev, *ev2;
-
- if (gc == NULL)
- {
- return 0;
- }
- switch (index)
- {
- case 1:
- gc->guild_id = value;
- break;
- case 2:
- gc->economy = value;
- break;
- case 3:
- gc->defense = value;
- break;
- case 4:
- gc->triggerE = value;
- break;
- case 5:
- gc->triggerD = value;
- break;
- case 6:
- gc->nextTime = value;
- break;
- case 7:
- gc->payTime = value;
- break;
- case 8:
- gc->createTime = value;
- break;
- case 9:
- gc->visibleC = value;
- break;
- case 10:
- gc->visibleG0 = value;
- break;
- case 11:
- gc->visibleG1 = value;
- break;
- case 12:
- gc->visibleG2 = value;
- break;
- case 13:
- gc->visibleG3 = value;
- break;
- case 14:
- gc->visibleG4 = value;
- break;
- case 15:
- gc->visibleG5 = value;
- break;
- case 16:
- gc->visibleG6 = value;
- break;
- case 17:
- gc->visibleG7 = value;
- break;
- case 18:
- gc->Ghp0 = value;
- break; // guardian HP [Valaris]
- case 19:
- gc->Ghp1 = value;
- break;
- case 20:
- gc->Ghp2 = value;
- break;
- case 21:
- gc->Ghp3 = value;
- break;
- case 22:
- gc->Ghp4 = value;
- break;
- case 23:
- gc->Ghp5 = value;
- break;
- case 24:
- gc->Ghp6 = value;
- break;
- case 25:
- gc->Ghp7 = value;
- break; // end additions [Valaris]
- default:
- printf ("guild_castledataloadack ERROR!! (Not found index=%d)\n",
- index);
- return 0;
- }
- if ((ev = (struct eventlist *)numdb_search (guild_castleinfoevent_db, code)) != NULL)
- {
- numdb_erase (guild_castleinfoevent_db, code);
- for (; ev; ev2 = ev->next, free (ev), ev = ev2)
- {
- npc_event_do (ev->name);
- }
- }
- return 1;
-}
-
-// ギルド城データ変更要求
-int guild_castledatasave (int castle_id, int index, int value)
-{
- return intif_guild_castle_datasave (castle_id, index, value);
-}
-
-// ギルド城データ変更通知
-int guild_castledatasaveack (int castle_id, int index, int value)
-{
- struct guild_castle *gc = guild_castle_search (castle_id);
- if (gc == NULL)
- {
- return 0;
- }
- switch (index)
- {
- case 1:
- gc->guild_id = value;
- break;
- case 2:
- gc->economy = value;
- break;
- case 3:
- gc->defense = value;
- break;
- case 4:
- gc->triggerE = value;
- break;
- case 5:
- gc->triggerD = value;
- break;
- case 6:
- gc->nextTime = value;
- break;
- case 7:
- gc->payTime = value;
- break;
- case 8:
- gc->createTime = value;
- break;
- case 9:
- gc->visibleC = value;
- break;
- case 10:
- gc->visibleG0 = value;
- break;
- case 11:
- gc->visibleG1 = value;
- break;
- case 12:
- gc->visibleG2 = value;
- break;
- case 13:
- gc->visibleG3 = value;
- break;
- case 14:
- gc->visibleG4 = value;
- break;
- case 15:
- gc->visibleG5 = value;
- break;
- case 16:
- gc->visibleG6 = value;
- break;
- case 17:
- gc->visibleG7 = value;
- break;
- case 18:
- gc->Ghp0 = value;
- break; // guardian HP [Valaris]
- case 19:
- gc->Ghp1 = value;
- break;
- case 20:
- gc->Ghp2 = value;
- break;
- case 21:
- gc->Ghp3 = value;
- break;
- case 22:
- gc->Ghp4 = value;
- break;
- case 23:
- gc->Ghp5 = value;
- break;
- case 24:
- gc->Ghp6 = value;
- break;
- case 25:
- gc->Ghp7 = value;
- break; // end additions [Valaris]
- default:
- printf ("guild_castledatasaveack ERROR!! (Not found index=%d)\n",
- index);
- return 0;
- }
- return 1;
-}
-
-// ギルドデータ一括受信(初期化時)
-int guild_castlealldataload (int len, struct guild_castle *gc)
-{
- int i;
- int n = (len - 4) / sizeof (struct guild_castle), ev = -1;
-
- nullpo_retr (0, gc);
-
- // イベント付きで要求するデータ位置を探す(最後の占拠データ)
- for (i = 0; i < n; i++)
- {
- if ((gc + i)->guild_id)
- ev = i;
- }
-
- // 城データ格納とギルド情報要求
- for (i = 0; i < n; i++, gc++)
- {
- struct guild_castle *c = guild_castle_search (gc->castle_id);
- if (!c)
- {
- printf ("guild_castlealldataload ??\n");
- continue;
- }
- memcpy (&c->guild_id, &gc->guild_id,
- sizeof (struct guild_castle) - ((int) &c->guild_id -
- (int) c));
- if (c->guild_id)
- {
- if (i != ev)
- guild_request_info (c->guild_id);
- else
- guild_npc_request_info (c->guild_id, "::OnAgitInit");
- }
- }
- if (ev == -1)
- npc_event_doall ("OnAgitInit");
- return 0;
-}
-
-int guild_agit_start (void)
-{ // Run All NPC_Event[OnAgitStart]
- int c = npc_event_doall ("OnAgitStart");
- printf ("NPC_Event:[OnAgitStart] Run (%d) Events by @AgitStart.\n", c);
- return 0;
-}
-
-int guild_agit_end (void)
-{ // Run All NPC_Event[OnAgitEnd]
- int c = npc_event_doall ("OnAgitEnd");
- printf ("NPC_Event:[OnAgitEnd] Run (%d) Events by @AgitEnd.\n", c);
- return 0;
-}
-
-void guild_gvg_eliminate_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{ // Run One NPC_Event[OnAgitEliminate]
- size_t len = strlen ((const char *) data);
- char *evname;
- CREATE (evname, char, len + 4);
- int c = 0;
-
- if (!agit_flag)
- return; // Agit already End
- memcpy (evname, (const char *) data, len - 5);
- strcpy (evname + len - 5, "Eliminate");
- c = npc_event_do (evname);
- printf ("NPC_Event:[%s] Run (%d) Events.\n", evname, c);
-}
-
-int guild_agit_break (struct mob_data *md)
-{ // Run One NPC_Event[OnAgitBreak]
- char *evname;
-
- nullpo_retr (0, md);
-
- CREATE (evname, char, strlen (md->npc_event) + 1);
-
- strcpy (evname, md->npc_event);
-// Now By User to Run [OnAgitBreak] NPC Event...
-// It's a little impossible to null point with player disconnect in this!
-// But Script will be stop, so nothing...
-// Maybe will be changed in the futher..
-// int c = npc_event_do(evname);
- if (!agit_flag)
- return 0; // Agit already End
- add_timer (gettick () + battle_config.gvg_eliminate_time,
- guild_gvg_eliminate_timer, md->bl.m, (int) evname);
- return 0;
-}
-
-// [MouseJstr]
-// How many castles does this guild have?
-int guild_checkcastles (struct guild *g)
-{
- int i, nb_cas = 0, id, cas_id = 0;
- struct guild_castle *gc;
- id = g->guild_id;
- for (i = 0; i < MAX_GUILDCASTLE; i++)
- {
- gc = guild_castle_search (i);
- cas_id = gc->guild_id;
- if (g->guild_id == cas_id)
- nb_cas = nb_cas + 1;
- } //end for
- return nb_cas;
-}
-
-// [MouseJstr]
-// is this guild allied with this castle?
-int guild_isallied (struct guild *g, struct guild_castle *gc)
-{
- int i;
-
- nullpo_retr (0, g);
-
- if (g->guild_id == gc->guild_id)
- return 1;
-
- if (gc->guild_id == 0)
- return 0;
-
- for (i = 0; i < MAX_GUILDALLIANCE; i++)
- if (g->alliance[i].guild_id == gc->guild_id)
- {
- if (g->alliance[i].opposition == 0)
- return 1;
- else
- return 0;
- }
-
- return 0;
-}
-
-static void guild_db_final (db_key_t key, db_val_t data, va_list ap)
-{
- free (data);
-}
-
-static void castle_db_final (db_key_t key, db_val_t data, va_list ap)
-{
- free (data);
-}
-
-static void guild_expcache_db_final (db_key_t key, db_val_t data, va_list ap)
-{
- free (data);
-}
-
-static void guild_infoevent_db_final (db_key_t key, db_val_t data, va_list ap)
-{
- free (data);
-}
-
-void do_final_guild (void)
-{
- if (guild_db)
- numdb_final (guild_db, guild_db_final);
- if (castle_db)
- numdb_final (castle_db, castle_db_final);
- if (guild_expcache_db)
- numdb_final (guild_expcache_db, guild_expcache_db_final);
- if (guild_infoevent_db)
- numdb_final (guild_infoevent_db, guild_infoevent_db_final);
- if (guild_castleinfoevent_db)
- numdb_final (guild_castleinfoevent_db, guild_infoevent_db_final);
-}
diff --git a/src/map/guild.hpp b/src/map/guild.hpp
deleted file mode 100644
index 983934c..0000000
--- a/src/map/guild.hpp
+++ /dev/null
@@ -1,95 +0,0 @@
-// $Id: guild.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef GUILD_HPP
-#define GUILD_HPP
-
-struct map_session_data;
-struct mob_data;
-struct guild;
-struct guild_member;
-struct guild_position;
-struct guild_castle;
-
-int guild_skill_get_inf (int id);
-int guild_skill_get_sp (int id, int lv);
-int guild_skill_get_range (int id);
-int guild_skill_get_max (int id);
-
-int guild_checkskill (struct guild *g, int id);
-int guild_checkcastles (struct guild *g); // [MouseJstr]
-int guild_isallied (struct guild *g, struct guild_castle *gc);
-
-void do_init_guild (void);
-struct guild *guild_search (int guild_id);
-struct guild *guild_searchname (const char *str);
-struct guild_castle *guild_castle_search (int gcid);
-
-struct guild_castle *guild_mapname2gc (const char *mapname);
-
-struct map_session_data *guild_getavailablesd (struct guild *g);
-int guild_getindex (struct guild *g, int account_id, int char_id);
-int guild_getposition (struct map_session_data *sd, struct guild *g);
-int guild_payexp (struct map_session_data *sd, int exp);
-
-int guild_create (struct map_session_data *sd, const char *name);
-int guild_created (int account_id, int guild_id);
-int guild_request_info (int guild_id);
-int guild_recv_noinfo (int guild_id);
-int guild_recv_info (struct guild *sg);
-int guild_npc_request_info (int guild_id, const char *ev);
-int guild_invite (struct map_session_data *sd, int account_id);
-int guild_reply_invite (struct map_session_data *sd, int guild_id, int flag);
-int guild_member_added (int guild_id, int account_id, int char_id, int flag);
-int guild_leave (struct map_session_data *sd, int guild_id,
- int account_id, int char_id, const char *mes);
-int guild_member_leaved (int guild_id, int account_id, int char_id, int flag,
- const char *name, const char *mes);
-int guild_explusion (struct map_session_data *sd, int guild_id,
- int account_id, int char_id, const char *mes);
-int guild_skillup (struct map_session_data *sd, int skill_num);
-int guild_reqalliance (struct map_session_data *sd, int account_id);
-int guild_reply_reqalliance (struct map_session_data *sd, int account_id,
- int flag);
-int guild_alliance (int guild_id1, int guild_id2, int account_id1,
- int account_id2);
-int guild_allianceack (int guild_id1, int guild_id2, int account_id1,
- int account_id2, int flag, const char *name1,
- const char *name2);
-int guild_delalliance (struct map_session_data *sd, int guild_id, int flag);
-int guild_opposition (struct map_session_data *sd, int char_id);
-
-int guild_send_memberinfoshort (struct map_session_data *sd, int online);
-int guild_recv_memberinfoshort (int guild_id, int account_id, int char_id,
- int online, int lv, int class_);
-int guild_change_memberposition (int guild_id, int account_id, int char_id,
- int idx);
-int guild_memberposition_changed (struct guild *g, int idx, int pos);
-int guild_change_position (struct map_session_data *sd, int idx,
- int mode, int exp_mode, const char *name);
-int guild_position_changed (int guild_id, int idx, struct guild_position *p);
-int guild_change_notice (struct map_session_data *sd, int guild_id,
- const char *mes1, const char *mes2);
-int guild_notice_changed (int guild_id, const char *mes1, const char *mes2);
-int guild_change_emblem (struct map_session_data *sd, int len,
- const char *data);
-int guild_emblem_changed (int len, int guild_id, int emblem_id,
- const char *data);
-int guild_send_message (struct map_session_data *sd, const char *mes, int len);
-int guild_recv_message (int guild_id, int account_id, const char *mes, int len);
-int guild_skillupack (int guild_id, int skill_num, int account_id);
-int guild_break (struct map_session_data *sd, const char *name);
-int guild_broken (int guild_id, int flag);
-
-int guild_addcastleinfoevent (int castle_id, int index, const char *name);
-int guild_castledataload (int castle_id, int index);
-int guild_castledataloadack (int castle_id, int index, int value);
-int guild_castledatasave (int castle_id, int index, int value);
-int guild_castledatasaveack (int castle_id, int index, int value);
-int guild_castlealldataload (int len, struct guild_castle *gc);
-
-int guild_agit_start (void);
-int guild_agit_end (void);
-int guild_agit_break (struct mob_data *md);
-
-void do_final_guild (void);
-
-#endif
diff --git a/src/map/intif.cpp b/src/map/intif.cpp
index dfbc665..6c8edf5 100644
--- a/src/map/intif.cpp
+++ b/src/map/intif.cpp
@@ -1,42 +1,24 @@
-// $Id: intif.c,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
-#include <sys/types.h>
-#ifdef LCCWIN32
-#include <winsock.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef LCCWIN32
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <arpa/inet.h>
-#endif
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
+#include "intif.hpp"
+
+#include <cstdlib>
+#include <cstring>
+#include "../common/cxxstdio.hpp"
#include "../common/nullpo.hpp"
#include "../common/socket.hpp"
-#include "../common/timer.hpp"
#include "battle.hpp"
#include "chrif.hpp"
#include "clif.hpp"
-#include "guild.hpp"
-#include "intif.hpp"
#include "map.hpp"
#include "party.hpp"
#include "pc.hpp"
#include "storage.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
+#include "../poison.hpp"
-static const int packet_len_table[] = {
+static
+const int packet_len_table[] = {
-1, -1, 27, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-1, 7, 0, 0, 0, 0, 0, 0, -1, 11, 0, 0, 0, 0, 0, 0,
35, -1, 11, 15, 34, 29, 7, -1, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -48,40 +30,37 @@ static const int packet_len_table[] = {
11, -1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
-extern int char_fd; // inter serverのfdはchar_fdを使う
-#define inter_fd (char_fd) // エイリアス
//-----------------------------------------------------------------
// inter serverへの送信
// Message for all GMs on all map servers
-int intif_GMmessage (const char *mes, int len, int flag)
+void intif_GMmessage(const_string mes, int flag)
{
- int lp = (flag & 0x10) ? 8 : 4;
- WFIFOW (inter_fd, 0) = 0x3000;
- WFIFOW (inter_fd, 2) = lp + len;
- WFIFOL (inter_fd, 4) = 0x65756c62;
- memcpy (WFIFOP (inter_fd, lp), mes, len);
- WFIFOSET (inter_fd, WFIFOW (inter_fd, 2));
-
- return 0;
+ int lp = (flag & 0x10) ? 8 : 4;
+ WFIFOW(char_fd, 0) = 0x3000;
+ WFIFOW(char_fd, 2) = lp + mes.size() + 1;
+ WFIFOL(char_fd, 4) = 0x65756c62;
+ memcpy(WFIFOP(char_fd, lp), mes.data(), mes.size());
+ WFIFOB(char_fd, lp + mes.size()) = '\0';
+ WFIFOSET(char_fd, WFIFOW(char_fd, 2));
}
// The transmission of Wisp/Page to inter-server (player not found on this server)
-int intif_wis_message (struct map_session_data *sd, const char *nick, const char *mes,
+int intif_wis_message(struct map_session_data *sd, const char *nick, const char *mes,
int mes_len)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- WFIFOW (inter_fd, 0) = 0x3001;
- WFIFOW (inter_fd, 2) = mes_len + 52;
- memcpy (WFIFOP (inter_fd, 4), sd->status.name, 24);
- memcpy (WFIFOP (inter_fd, 28), nick, 24);
- memcpy (WFIFOP (inter_fd, 52), mes, mes_len);
- WFIFOSET (inter_fd, WFIFOW (inter_fd, 2));
+ WFIFOW(char_fd, 0) = 0x3001;
+ WFIFOW(char_fd, 2) = mes_len + 52;
+ memcpy(WFIFOP(char_fd, 4), sd->status.name, 24);
+ memcpy(WFIFOP(char_fd, 28), nick, 24);
+ memcpy(WFIFOP(char_fd, 52), mes, mes_len);
+ WFIFOSET(char_fd, WFIFOW(char_fd, 2));
if (battle_config.etc_log)
- printf ("intif_wis_message from %s to %s (message: '%s')\n",
+ PRINTF("intif_wis_message from %s to %s (message: '%s')\n",
sd->status.name, nick, mes);
return 0;
@@ -89,437 +68,200 @@ int intif_wis_message (struct map_session_data *sd, const char *nick, const char
// The reply of Wisp/page
static
-int intif_wis_replay (int id, int flag)
+int intif_wis_replay(int id, int flag)
{
- WFIFOW (inter_fd, 0) = 0x3002;
- WFIFOL (inter_fd, 2) = id;
- WFIFOB (inter_fd, 6) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- WFIFOSET (inter_fd, 7);
+ WFIFOW(char_fd, 0) = 0x3002;
+ WFIFOL(char_fd, 2) = id;
+ WFIFOB(char_fd, 6) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ WFIFOSET(char_fd, 7);
if (battle_config.etc_log)
- printf ("intif_wis_replay: id: %d, flag:%d\n", id, flag);
+ PRINTF("intif_wis_replay: id: %d, flag:%d\n", id, flag);
return 0;
}
// The transmission of GM only Wisp/Page from server to inter-server
-int intif_wis_message_to_gm (const char *Wisp_name, int min_gm_level, const char *mes,
+int intif_wis_message_to_gm(const char *Wisp_name, int min_gm_level, const char *mes,
int mes_len)
{
- WFIFOW (inter_fd, 0) = 0x3003;
- WFIFOW (inter_fd, 2) = mes_len + 30;
- memcpy (WFIFOP (inter_fd, 4), Wisp_name, 24);
- WFIFOW (inter_fd, 28) = (short) min_gm_level;
- memcpy (WFIFOP (inter_fd, 30), mes, mes_len);
- WFIFOSET (inter_fd, WFIFOW (inter_fd, 2));
+ WFIFOW(char_fd, 0) = 0x3003;
+ WFIFOW(char_fd, 2) = mes_len + 30;
+ memcpy(WFIFOP(char_fd, 4), Wisp_name, 24);
+ WFIFOW(char_fd, 28) = (short) min_gm_level;
+ memcpy(WFIFOP(char_fd, 30), mes, mes_len);
+ WFIFOSET(char_fd, WFIFOW(char_fd, 2));
if (battle_config.etc_log)
- printf
- ("intif_wis_message_to_gm: from: '%s', min level: %d, message: '%s'.\n",
+ PRINTF("intif_wis_message_to_gm: from: '%s', min level: %d, message: '%s'.\n",
Wisp_name, min_gm_level, mes);
return 0;
}
// アカウント変数送信
-int intif_saveaccountreg (struct map_session_data *sd)
+int intif_saveaccountreg(struct map_session_data *sd)
{
- int j, p;
+ int j, p;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- WFIFOW (inter_fd, 0) = 0x3004;
- WFIFOL (inter_fd, 4) = sd->bl.id;
+ WFIFOW(char_fd, 0) = 0x3004;
+ WFIFOL(char_fd, 4) = sd->bl.id;
for (j = 0, p = 8; j < sd->status.account_reg_num; j++, p += 36)
{
- memcpy (WFIFOP (inter_fd, p), sd->status.account_reg[j].str, 32);
- WFIFOL (inter_fd, p + 32) = sd->status.account_reg[j].value;
+ memcpy(WFIFOP(char_fd, p), sd->status.account_reg[j].str, 32);
+ WFIFOL(char_fd, p + 32) = sd->status.account_reg[j].value;
}
- WFIFOW (inter_fd, 2) = p;
- WFIFOSET (inter_fd, p);
+ WFIFOW(char_fd, 2) = p;
+ WFIFOSET(char_fd, p);
return 0;
}
// アカウント変数要求
-int intif_request_accountreg (struct map_session_data *sd)
+int intif_request_accountreg(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- WFIFOW (inter_fd, 0) = 0x3005;
- WFIFOL (inter_fd, 2) = sd->bl.id;
- WFIFOSET (inter_fd, 6);
+ WFIFOW(char_fd, 0) = 0x3005;
+ WFIFOL(char_fd, 2) = sd->bl.id;
+ WFIFOSET(char_fd, 6);
return 0;
}
// 倉庫データ要求
-int intif_request_storage (int account_id)
+int intif_request_storage(int account_id)
{
- WFIFOW (inter_fd, 0) = 0x3010;
- WFIFOL (inter_fd, 2) = account_id;
- WFIFOSET (inter_fd, 6);
+ WFIFOW(char_fd, 0) = 0x3010;
+ WFIFOL(char_fd, 2) = account_id;
+ WFIFOSET(char_fd, 6);
return 0;
}
// 倉庫データ送信
-int intif_send_storage (struct storage *stor)
-{
- nullpo_retr (0, stor);
- WFIFOW (inter_fd, 0) = 0x3011;
- WFIFOW (inter_fd, 2) = sizeof (struct storage) + 8;
- WFIFOL (inter_fd, 4) = stor->account_id;
- memcpy (WFIFOP (inter_fd, 8), stor, sizeof (struct storage));
- WFIFOSET (inter_fd, WFIFOW (inter_fd, 2));
- return 0;
-}
-
-int intif_request_guild_storage (int account_id, int guild_id)
-{
- WFIFOW (inter_fd, 0) = 0x3018;
- WFIFOL (inter_fd, 2) = account_id;
- WFIFOL (inter_fd, 6) = guild_id;
- WFIFOSET (inter_fd, 10);
- return 0;
-}
-
-int intif_send_guild_storage (int account_id, struct guild_storage *gstor)
+int intif_send_storage(struct storage *stor)
{
- WFIFOW (inter_fd, 0) = 0x3019;
- WFIFOW (inter_fd, 2) = sizeof (struct guild_storage) + 12;
- WFIFOL (inter_fd, 4) = account_id;
- WFIFOL (inter_fd, 8) = gstor->guild_id;
- memcpy (WFIFOP (inter_fd, 12), gstor, sizeof (struct guild_storage));
- WFIFOSET (inter_fd, WFIFOW (inter_fd, 2));
+ nullpo_ret(stor);
+ WFIFOW(char_fd, 0) = 0x3011;
+ WFIFOW(char_fd, 2) = sizeof(struct storage) + 8;
+ WFIFOL(char_fd, 4) = stor->account_id;
+ memcpy(WFIFOP(char_fd, 8), stor, sizeof(struct storage));
+ WFIFOSET(char_fd, WFIFOW(char_fd, 2));
return 0;
}
// パーティ作成要求
-int intif_create_party (struct map_session_data *sd, const char *name)
+int intif_create_party(struct map_session_data *sd, const char *name)
{
- nullpo_retr (0, sd);
-
- WFIFOW (inter_fd, 0) = 0x3020;
- WFIFOL (inter_fd, 2) = sd->status.account_id;
- memcpy (WFIFOP (inter_fd, 6), name, 24);
- memcpy (WFIFOP (inter_fd, 30), sd->status.name, 24);
- memcpy (WFIFOP (inter_fd, 54), map[sd->bl.m].name, 16);
- WFIFOW (inter_fd, 70) = sd->status.base_level;
- WFIFOSET (inter_fd, 72);
+ nullpo_ret(sd);
+
+ WFIFOW(char_fd, 0) = 0x3020;
+ WFIFOL(char_fd, 2) = sd->status.account_id;
+ memcpy(WFIFOP(char_fd, 6), name, 24);
+ memcpy(WFIFOP(char_fd, 30), sd->status.name, 24);
+ memcpy(WFIFOP(char_fd, 54), map[sd->bl.m].name, 16);
+ WFIFOW(char_fd, 70) = sd->status.base_level;
+ WFIFOSET(char_fd, 72);
// if(battle_config.etc_log)
-// printf("intif: create party\n");
+// PRINTF("intif: create party\n");
return 0;
}
// パーティ情報要求
-int intif_request_partyinfo (int party_id)
+int intif_request_partyinfo(int party_id)
{
- WFIFOW (inter_fd, 0) = 0x3021;
- WFIFOL (inter_fd, 2) = party_id;
- WFIFOSET (inter_fd, 6);
+ WFIFOW(char_fd, 0) = 0x3021;
+ WFIFOL(char_fd, 2) = party_id;
+ WFIFOSET(char_fd, 6);
// if(battle_config.etc_log)
-// printf("intif: request party info\n");
+// PRINTF("intif: request party info\n");
return 0;
}
// パーティ追加要求
-int intif_party_addmember (int party_id, int account_id)
+int intif_party_addmember(int party_id, int account_id)
{
struct map_session_data *sd;
- sd = map_id2sd (account_id);
+ sd = map_id2sd(account_id);
// if(battle_config.etc_log)
-// printf("intif: party add member %d %d\n",party_id,account_id);
+// PRINTF("intif: party add member %d %d\n",party_id,account_id);
if (sd != NULL)
{
- WFIFOW (inter_fd, 0) = 0x3022;
- WFIFOL (inter_fd, 2) = party_id;
- WFIFOL (inter_fd, 6) = account_id;
- memcpy (WFIFOP (inter_fd, 10), sd->status.name, 24);
- memcpy (WFIFOP (inter_fd, 34), map[sd->bl.m].name, 16);
- WFIFOW (inter_fd, 50) = sd->status.base_level;
- WFIFOSET (inter_fd, 52);
+ WFIFOW(char_fd, 0) = 0x3022;
+ WFIFOL(char_fd, 2) = party_id;
+ WFIFOL(char_fd, 6) = account_id;
+ memcpy(WFIFOP(char_fd, 10), sd->status.name, 24);
+ memcpy(WFIFOP(char_fd, 34), map[sd->bl.m].name, 16);
+ WFIFOW(char_fd, 50) = sd->status.base_level;
+ WFIFOSET(char_fd, 52);
}
return 0;
}
// パーティ設定変更
-int intif_party_changeoption (int party_id, int account_id, int exp, int item)
+int intif_party_changeoption(int party_id, int account_id, int exp, int item)
{
- WFIFOW (inter_fd, 0) = 0x3023;
- WFIFOL (inter_fd, 2) = party_id;
- WFIFOL (inter_fd, 6) = account_id;
- WFIFOW (inter_fd, 10) = exp;
- WFIFOW (inter_fd, 12) = item;
- WFIFOSET (inter_fd, 14);
+ WFIFOW(char_fd, 0) = 0x3023;
+ WFIFOL(char_fd, 2) = party_id;
+ WFIFOL(char_fd, 6) = account_id;
+ WFIFOW(char_fd, 10) = exp;
+ WFIFOW(char_fd, 12) = item;
+ WFIFOSET(char_fd, 14);
return 0;
}
// パーティ脱退要求
-int intif_party_leave (int party_id, int account_id)
+int intif_party_leave(int party_id, int account_id)
{
// if(battle_config.etc_log)
-// printf("intif: party leave %d %d\n",party_id,account_id);
- WFIFOW (inter_fd, 0) = 0x3024;
- WFIFOL (inter_fd, 2) = party_id;
- WFIFOL (inter_fd, 6) = account_id;
- WFIFOSET (inter_fd, 10);
+// PRINTF("intif: party leave %d %d\n",party_id,account_id);
+ WFIFOW(char_fd, 0) = 0x3024;
+ WFIFOL(char_fd, 2) = party_id;
+ WFIFOL(char_fd, 6) = account_id;
+ WFIFOSET(char_fd, 10);
return 0;
}
// パーティ移動要求
-int intif_party_changemap (struct map_session_data *sd, int online)
+int intif_party_changemap(struct map_session_data *sd, int online)
{
if (sd != NULL)
{
- WFIFOW (inter_fd, 0) = 0x3025;
- WFIFOL (inter_fd, 2) = sd->status.party_id;
- WFIFOL (inter_fd, 6) = sd->status.account_id;
- memcpy (WFIFOP (inter_fd, 10), map[sd->bl.m].name, 16);
- WFIFOB (inter_fd, 26) = online;
- WFIFOW (inter_fd, 27) = sd->status.base_level;
- WFIFOSET (inter_fd, 29);
+ WFIFOW(char_fd, 0) = 0x3025;
+ WFIFOL(char_fd, 2) = sd->status.party_id;
+ WFIFOL(char_fd, 6) = sd->status.account_id;
+ memcpy(WFIFOP(char_fd, 10), map[sd->bl.m].name, 16);
+ WFIFOB(char_fd, 26) = online;
+ WFIFOW(char_fd, 27) = sd->status.base_level;
+ WFIFOSET(char_fd, 29);
}
// if(battle_config.etc_log)
-// printf("party: change map\n");
- return 0;
-}
-
-// パーティー解散要求
-int intif_break_party (int party_id)
-{
- WFIFOW (inter_fd, 0) = 0x3026;
- WFIFOL (inter_fd, 2) = party_id;
- WFIFOSET (inter_fd, 6);
+// PRINTF("party: change map\n");
return 0;
}
// パーティ会話送信
-int intif_party_message (int party_id, int account_id, const char *mes, int len)
+int intif_party_message(int party_id, int account_id, const char *mes, int len)
{
// if(battle_config.etc_log)
-// printf("intif_party_message: %s\n",mes);
- WFIFOW (inter_fd, 0) = 0x3027;
- WFIFOW (inter_fd, 2) = len + 12;
- WFIFOL (inter_fd, 4) = party_id;
- WFIFOL (inter_fd, 8) = account_id;
- memcpy (WFIFOP (inter_fd, 12), mes, len);
- WFIFOSET (inter_fd, len + 12);
+// PRINTF("intif_party_message: %s\n",mes);
+ WFIFOW(char_fd, 0) = 0x3027;
+ WFIFOW(char_fd, 2) = len + 12;
+ WFIFOL(char_fd, 4) = party_id;
+ WFIFOL(char_fd, 8) = account_id;
+ memcpy(WFIFOP(char_fd, 12), mes, len);
+ WFIFOSET(char_fd, len + 12);
return 0;
}
// パーティ競合チェック要求
-int intif_party_checkconflict (int party_id, int account_id, const char *nick)
-{
- WFIFOW (inter_fd, 0) = 0x3028;
- WFIFOL (inter_fd, 2) = party_id;
- WFIFOL (inter_fd, 6) = account_id;
- memcpy (WFIFOP (inter_fd, 10), nick, 24);
- WFIFOSET (inter_fd, 34);
- return 0;
-}
-
-// ギルド作成要求
-int intif_guild_create (const char *name, const struct guild_member *master)
-{
- nullpo_retr (0, master);
-
- WFIFOW (inter_fd, 0) = 0x3030;
- WFIFOW (inter_fd, 2) = sizeof (struct guild_member) + 32;
- WFIFOL (inter_fd, 4) = master->account_id;
- memcpy (WFIFOP (inter_fd, 8), name, 24);
- memcpy (WFIFOP (inter_fd, 32), master, sizeof (struct guild_member));
- WFIFOSET (inter_fd, WFIFOW (inter_fd, 2));
- return 0;
-}
-
-// ギルド情報要求
-int intif_guild_request_info (int guild_id)
-{
- WFIFOW (inter_fd, 0) = 0x3031;
- WFIFOL (inter_fd, 2) = guild_id;
- WFIFOSET (inter_fd, 6);
- return 0;
-}
-
-// ギルドメンバ追加要求
-int intif_guild_addmember (int guild_id, struct guild_member *m)
-{
- WFIFOW (inter_fd, 0) = 0x3032;
- WFIFOW (inter_fd, 2) = sizeof (struct guild_member) + 8;
- WFIFOL (inter_fd, 4) = guild_id;
- memcpy (WFIFOP (inter_fd, 8), m, sizeof (struct guild_member));
- WFIFOSET (inter_fd, WFIFOW (inter_fd, 2));
- return 0;
-}
-
-// ギルドメンバ脱退/追放要求
-int intif_guild_leave (int guild_id, int account_id, int char_id, int flag,
- const char *mes)
-{
- WFIFOW (inter_fd, 0) = 0x3034;
- WFIFOL (inter_fd, 2) = guild_id;
- WFIFOL (inter_fd, 6) = account_id;
- WFIFOL (inter_fd, 10) = char_id;
- WFIFOB (inter_fd, 14) = flag;
- memcpy (WFIFOP (inter_fd, 15), mes, 40);
- WFIFOSET (inter_fd, 55);
- return 0;
-}
-
-// ギルドメンバのオンライン状況/Lv更新要求
-int intif_guild_memberinfoshort (int guild_id,
- int account_id, int char_id, int online,
- int lv, int class_)
-{
- WFIFOW (inter_fd, 0) = 0x3035;
- WFIFOL (inter_fd, 2) = guild_id;
- WFIFOL (inter_fd, 6) = account_id;
- WFIFOL (inter_fd, 10) = char_id;
- WFIFOB (inter_fd, 14) = online;
- WFIFOW (inter_fd, 15) = lv;
- WFIFOW (inter_fd, 17) = class_;
- WFIFOSET (inter_fd, 19);
- return 0;
-}
-
-// ギルド解散通知
-int intif_guild_break (int guild_id)
-{
- WFIFOW (inter_fd, 0) = 0x3036;
- WFIFOL (inter_fd, 2) = guild_id;
- WFIFOSET (inter_fd, 6);
- return 0;
-}
-
-// ギルド会話送信
-int intif_guild_message (int guild_id, int account_id, const char *mes, int len)
-{
- WFIFOW (inter_fd, 0) = 0x3037;
- WFIFOW (inter_fd, 2) = len + 12;
- WFIFOL (inter_fd, 4) = guild_id;
- WFIFOL (inter_fd, 8) = account_id;
- memcpy (WFIFOP (inter_fd, 12), mes, len);
- WFIFOSET (inter_fd, len + 12);
- return 0;
-}
-
-// ギルド競合チェック要求
-int intif_guild_checkconflict (int guild_id, int account_id, int char_id)
-{
- WFIFOW (inter_fd, 0) = 0x3038;
- WFIFOL (inter_fd, 2) = guild_id;
- WFIFOL (inter_fd, 6) = account_id;
- WFIFOL (inter_fd, 10) = char_id;
- WFIFOSET (inter_fd, 14);
- return 0;
-}
-
-// ギルド基本情報変更要求
-int intif_guild_change_basicinfo (int guild_id, int type, const void *data,
- int len)
-{
- WFIFOW (inter_fd, 0) = 0x3039;
- WFIFOW (inter_fd, 2) = len + 10;
- WFIFOL (inter_fd, 4) = guild_id;
- WFIFOW (inter_fd, 8) = type;
- memcpy (WFIFOP (inter_fd, 10), data, len);
- WFIFOSET (inter_fd, len + 10);
- return 0;
-}
-
-// ギルドメンバ情報変更要求
-int intif_guild_change_memberinfo (int guild_id, int account_id, int char_id,
- int type, const void *data, int len)
-{
- WFIFOW (inter_fd, 0) = 0x303a;
- WFIFOW (inter_fd, 2) = len + 18;
- WFIFOL (inter_fd, 4) = guild_id;
- WFIFOL (inter_fd, 8) = account_id;
- WFIFOL (inter_fd, 12) = char_id;
- WFIFOW (inter_fd, 16) = type;
- memcpy (WFIFOP (inter_fd, 18), data, len);
- WFIFOSET (inter_fd, len + 18);
- return 0;
-}
-
-// ギルド役職変更要求
-int intif_guild_position (int guild_id, int idx, struct guild_position *p)
-{
- WFIFOW (inter_fd, 0) = 0x303b;
- WFIFOW (inter_fd, 2) = sizeof (struct guild_position) + 12;
- WFIFOL (inter_fd, 4) = guild_id;
- WFIFOL (inter_fd, 8) = idx;
- memcpy (WFIFOP (inter_fd, 12), p, sizeof (struct guild_position));
- WFIFOSET (inter_fd, WFIFOW (inter_fd, 2));
- return 0;
-}
-
-// ギルドスキルアップ要求
-int intif_guild_skillup (int guild_id, int skill_num, int account_id)
-{
- WFIFOW (inter_fd, 0) = 0x303c;
- WFIFOL (inter_fd, 2) = guild_id;
- WFIFOL (inter_fd, 6) = skill_num;
- WFIFOL (inter_fd, 10) = account_id;
- WFIFOSET (inter_fd, 14);
- return 0;
-}
-
-// ギルド同盟/敵対要求
-int intif_guild_alliance (int guild_id1, int guild_id2, int account_id1,
- int account_id2, int flag)
-{
- WFIFOW (inter_fd, 0) = 0x303d;
- WFIFOL (inter_fd, 2) = guild_id1;
- WFIFOL (inter_fd, 6) = guild_id2;
- WFIFOL (inter_fd, 10) = account_id1;
- WFIFOL (inter_fd, 14) = account_id2;
- WFIFOB (inter_fd, 18) = flag;
- WFIFOSET (inter_fd, 19);
- return 0;
-}
-
-// ギルド告知変更要求
-int intif_guild_notice (int guild_id, const char *mes1, const char *mes2)
+int intif_party_checkconflict(int party_id, int account_id, const char *nick)
{
- WFIFOW (inter_fd, 0) = 0x303e;
- WFIFOL (inter_fd, 2) = guild_id;
- memcpy (WFIFOP (inter_fd, 6), mes1, 60);
- memcpy (WFIFOP (inter_fd, 66), mes2, 120);
- WFIFOSET (inter_fd, 186);
- return 0;
-}
-
-// ギルドエンブレム変更要求
-int intif_guild_emblem (int guild_id, int len, const char *data)
-{
- if (guild_id <= 0 || len < 0 || len > 2000)
- return 0;
- WFIFOW (inter_fd, 0) = 0x303f;
- WFIFOW (inter_fd, 2) = len + 12;
- WFIFOL (inter_fd, 4) = guild_id;
- WFIFOL (inter_fd, 8) = 0;
- memcpy (WFIFOP (inter_fd, 12), data, len);
- WFIFOSET (inter_fd, len + 12);
- return 0;
-}
-
-//現在のギルド城占領ギルドを調べる
-int intif_guild_castle_dataload (int castle_id, int index)
-{
- WFIFOW (inter_fd, 0) = 0x3040;
- WFIFOW (inter_fd, 2) = castle_id;
- WFIFOB (inter_fd, 4) = index;
- WFIFOSET (inter_fd, 5);
- return 0;
-}
-
-//ギルド城占領ギルド変更要求
-int intif_guild_castle_datasave (int castle_id, int index, int value)
-{
- WFIFOW (inter_fd, 0) = 0x3041;
- WFIFOW (inter_fd, 2) = castle_id;
- WFIFOB (inter_fd, 4) = index;
- WFIFOL (inter_fd, 5) = value;
- WFIFOSET (inter_fd, 9);
+ WFIFOW(char_fd, 0) = 0x3028;
+ WFIFOL(char_fd, 2) = party_id;
+ WFIFOL(char_fd, 6) = account_id;
+ memcpy(WFIFOP(char_fd, 10), nick, 24);
+ WFIFOSET(char_fd, 34);
return 0;
}
@@ -528,573 +270,290 @@ int intif_guild_castle_datasave (int castle_id, int index, int value)
// Wisp/Page reception
static
-int intif_parse_WisMessage (int fd)
+int intif_parse_WisMessage(int fd)
{ // rewritten by [Yor]
struct map_session_data *sd;
- int i;
+ int i;
if (battle_config.etc_log)
- printf
- ("intif_parse_wismessage: id: %d, from: %s, to: %s, message: '%s'\n",
- RFIFOL (fd, 4), RFIFOP (fd, 8), RFIFOP (fd, 32), RFIFOP (fd,
- 56));
- sd = map_nick2sd ((const char *)RFIFOP (fd, 32)); // Searching destination player
- if (sd != NULL && strcmp (sd->status.name, (const char *)RFIFOP (fd, 32)) == 0)
+ PRINTF("intif_parse_wismessage: id: %d, from: %s, to: %s, message: '%s'\n",
+ RFIFOL(fd, 4),
+ static_cast<const char *>(RFIFOP(fd, 8)),
+ static_cast<const char *>(RFIFOP(fd, 32)),
+ static_cast<const char *>(RFIFOP(fd, 56)));
+ sd = map_nick2sd((const char *)RFIFOP(fd, 32)); // Searching destination player
+ if (sd != NULL && strcmp(sd->status.name, (const char *)RFIFOP(fd, 32)) == 0)
{ // exactly same name (inter-server have checked the name before)
// if player ignore all
if (sd->ignoreAll == 1)
- intif_wis_replay (RFIFOL (fd, 4), 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ intif_wis_replay(RFIFOL(fd, 4), 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
else
{
- const char *wisp_source = (const char *)RFIFOP (fd, 8); // speed up
+ const char *wisp_source = (const char *)RFIFOP(fd, 8); // speed up
// if player ignore the source character
- for (i = 0; i < (sizeof (sd->ignore) / sizeof (sd->ignore[0]));
+ for (i = 0; i < (sizeof(sd->ignore) / sizeof(sd->ignore[0]));
i++)
- if (strcmp (sd->ignore[i].name, wisp_source) == 0)
+ if (strcmp(sd->ignore[i].name, wisp_source) == 0)
{
- intif_wis_replay (RFIFOL (fd, 4), 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ intif_wis_replay(RFIFOL(fd, 4), 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
break;
}
// if source player not found in ignore list
- if (i == (sizeof (sd->ignore) / sizeof (sd->ignore[0])))
+ if (i == (sizeof(sd->ignore) / sizeof(sd->ignore[0])))
{
- clif_wis_message (sd->fd, (const char *)RFIFOP (fd, 8), (const char *)RFIFOP (fd, 56),
- RFIFOW (fd, 2) - 56);
- intif_wis_replay (RFIFOL (fd, 4), 0); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ clif_wis_message(sd->fd, (const char *)RFIFOP(fd, 8), (const char *)RFIFOP(fd, 56),
+ RFIFOW(fd, 2) - 56);
+ intif_wis_replay(RFIFOL(fd, 4), 0); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
}
}
}
else
- intif_wis_replay (RFIFOL (fd, 4), 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ intif_wis_replay(RFIFOL(fd, 4), 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
return 0;
}
// Wisp/page transmission result reception
static
-int intif_parse_WisEnd (int fd)
+int intif_parse_WisEnd(int fd)
{
struct map_session_data *sd;
if (battle_config.etc_log)
- printf ("intif_parse_wisend: player: %s, flag: %d\n", RFIFOP (fd, 2), RFIFOB (fd, 26)); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- sd = map_nick2sd ((const char *)RFIFOP (fd, 2));
+ // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ PRINTF("intif_parse_wisend: player: %s, flag: %d\n",
+ static_cast<const char *>(RFIFOP(fd, 2)), RFIFOB(fd, 26));
+ sd = map_nick2sd((const char *)RFIFOP(fd, 2));
if (sd != NULL)
- clif_wis_end (sd->fd, RFIFOB (fd, 26));
+ clif_wis_end(sd->fd, RFIFOB(fd, 26));
return 0;
}
// Received wisp message from map-server via char-server for ALL gm
static
-int mapif_parse_WisToGM (int fd)
+int mapif_parse_WisToGM(int fd)
{ // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
- int i, min_gm_level, len;
+ int i, min_gm_level, len;
struct map_session_data *pl_sd;
char Wisp_name[24];
char mbuf[255];
- if (RFIFOW (fd, 2) - 30 <= 0)
+ if (RFIFOW(fd, 2) - 30 <= 0)
return 0;
- len = RFIFOW (fd, 2) - 30;
- char *message = ((len) >= 255) ? (char *) malloc (len) : mbuf;
+ len = RFIFOW(fd, 2) - 30;
+ char *message = ((len) >= 255) ? (char *) malloc(len) : mbuf;
- min_gm_level = (int) RFIFOW (fd, 28);
- memcpy (Wisp_name, RFIFOP (fd, 4), 24);
+ min_gm_level = (int) RFIFOW(fd, 28);
+ memcpy(Wisp_name, RFIFOP(fd, 4), 24);
Wisp_name[23] = '\0';
- memcpy (message, RFIFOP (fd, 30), len);
+ memcpy(message, RFIFOP(fd, 30), len);
message[len - 1] = '\0';
// information is sended to all online GM
for (i = 0; i < fd_max; i++)
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
- if (pc_isGM (pl_sd) >= min_gm_level)
- clif_wis_message (i, Wisp_name, message,
- strlen (message) + 1);
+ if (pc_isGM(pl_sd) >= min_gm_level)
+ clif_wis_message(i, Wisp_name, message,
+ strlen(message) + 1);
if (message != mbuf)
- free (message);
+ free(message);
return 0;
}
// アカウント変数通知
static
-int intif_parse_AccountReg (int fd)
+int intif_parse_AccountReg(int fd)
{
- int j, p;
+ int j, p;
struct map_session_data *sd;
- if ((sd = map_id2sd (RFIFOL (fd, 4))) == NULL)
+ if ((sd = map_id2sd(RFIFOL(fd, 4))) == NULL)
return 1;
- for (p = 8, j = 0; p < RFIFOW (fd, 2) && j < ACCOUNT_REG_NUM;
+ for (p = 8, j = 0; p < RFIFOW(fd, 2) && j < ACCOUNT_REG_NUM;
p += 36, j++)
{
- memcpy (sd->status.account_reg[j].str, RFIFOP (fd, p), 32);
- sd->status.account_reg[j].value = RFIFOL (fd, p + 32);
+ memcpy(sd->status.account_reg[j].str, RFIFOP(fd, p), 32);
+ sd->status.account_reg[j].value = RFIFOL(fd, p + 32);
}
sd->status.account_reg_num = j;
-// printf("intif: accountreg\n");
+// PRINTF("intif: accountreg\n");
return 0;
}
// 倉庫データ受信
static
-int intif_parse_LoadStorage (int fd)
+int intif_parse_LoadStorage(int fd)
{
struct storage *stor;
struct map_session_data *sd;
- sd = map_id2sd (RFIFOL (fd, 4));
+ sd = map_id2sd(RFIFOL(fd, 4));
if (sd == NULL)
{
if (battle_config.error_log)
- printf ("intif_parse_LoadStorage: user not found %d\n",
- RFIFOL (fd, 4));
+ PRINTF("intif_parse_LoadStorage: user not found %d\n",
+ RFIFOL(fd, 4));
return 1;
}
- stor = account2storage (RFIFOL (fd, 4));
+ stor = account2storage(RFIFOL(fd, 4));
if (stor->storage_status == 1)
{ // Already open.. lets ignore this update
if (battle_config.error_log)
- printf
- ("intif_parse_LoadStorage: storage received for a client already open (User %d:%d)\n",
+ PRINTF("intif_parse_LoadStorage: storage received for a client already open (User %d:%d)\n",
sd->status.account_id, sd->status.char_id);
return 1;
}
if (stor->dirty)
{ // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex]
if (battle_config.error_log)
- printf
- ("intif_parse_LoadStorage: received storage for an already modified non-saved storage! (User %d:%d)\n",
+ PRINTF("intif_parse_LoadStorage: received storage for an already modified non-saved storage! (User %d:%d)\n",
sd->status.account_id, sd->status.char_id);
return 1;
}
- if (RFIFOW (fd, 2) - 8 != sizeof (struct storage))
+ if (RFIFOW(fd, 2) - 8 != sizeof(struct storage))
{
if (battle_config.error_log)
- printf ("intif_parse_LoadStorage: data size error %d %d\n",
- RFIFOW (fd, 2) - 8, sizeof (struct storage));
+ PRINTF("intif_parse_LoadStorage: data size error %d %zu\n",
+ RFIFOW(fd, 2) - 8, sizeof(struct storage));
return 1;
}
if (battle_config.save_log)
- printf ("intif_openstorage: %d\n", RFIFOL (fd, 4));
- memcpy (stor, RFIFOP (fd, 8), sizeof (struct storage));
+ PRINTF("intif_openstorage: %d\n", RFIFOL(fd, 4));
+ memcpy(stor, RFIFOP(fd, 8), sizeof(struct storage));
stor->dirty = 0;
stor->storage_status = 1;
- sd->state.storage_flag = 1;
- clif_storageitemlist (sd, stor);
- clif_storageequiplist (sd, stor);
- clif_updatestorageamount (sd, stor);
+ sd->state.storage_open = 1;
+ clif_storageitemlist(sd, stor);
+ clif_storageequiplist(sd, stor);
+ clif_updatestorageamount(sd, stor);
return 0;
}
// 倉庫データ送信成功
static
-int intif_parse_SaveStorage (int fd)
+int intif_parse_SaveStorage(int fd)
{
if (battle_config.save_log)
- printf ("intif_savestorage: done %d %d\n", RFIFOL (fd, 2),
- RFIFOB (fd, 6));
- storage_storage_saved (RFIFOL (fd, 2));
- return 0;
-}
-
-static
-int intif_parse_LoadGuildStorage (int fd)
-{
- struct guild_storage *gstor;
- struct map_session_data *sd;
- int guild_id;
-
- guild_id = RFIFOL (fd, 8);
- if (guild_id > 0)
- {
- gstor = guild2storage (guild_id);
- if (!gstor)
- {
- if (battle_config.error_log)
- printf
- ("intif_parse_LoadGuildStorage: error guild_id %d not exist\n",
- guild_id);
- return 1;
- }
- if (RFIFOW (fd, 2) - 12 != sizeof (struct guild_storage))
- {
- gstor->storage_status = 0;
- if (battle_config.error_log)
- printf
- ("intif_parse_LoadGuildStorage: data size error %d %d\n",
- RFIFOW (fd, 2) - 12, sizeof (struct guild_storage));
- return 1;
- }
- sd = map_id2sd (RFIFOL (fd, 4));
- if (sd == NULL)
- {
- if (battle_config.error_log)
- printf ("intif_parse_LoadGuildStorage: user not found %d\n",
- RFIFOL (fd, 4));
- return 1;
- }
- if (gstor->storage_status == 1)
- { // Already open.. lets ignore this update
- if (battle_config.error_log)
- printf
- ("intif_parse_LoadGuildStorage: storage received for a client already open (User %d:%d)\n",
- sd->status.account_id, sd->status.char_id);
- return 1;
- }
- if (gstor->dirty)
- { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex]
- if (battle_config.error_log)
- printf
- ("intif_parse_LoadGuildStorage: received storage for an already modified non-saved storage! (User %d:%d)\n",
- sd->status.account_id, sd->status.char_id);
- return 1;
- }
- if (battle_config.save_log)
- printf ("intif_open_guild_storage: %d\n", RFIFOL (fd, 4));
- memcpy (gstor, RFIFOP (fd, 12), sizeof (struct guild_storage));
- gstor->storage_status = 1;
- sd->state.storage_flag = 2;
- clif_guildstorageitemlist (sd, gstor);
- clif_guildstorageequiplist (sd, gstor);
- clif_updateguildstorageamount (sd, gstor);
- }
- return 0;
-}
-
-static
-int intif_parse_SaveGuildStorage (int fd)
-{
- if (battle_config.save_log)
- {
- printf ("intif_save_guild_storage: done %d %d %d\n", RFIFOL (fd, 2),
- RFIFOL (fd, 6), RFIFOB (fd, 10));
- }
- storage_guild_storagesaved ( /*RFIFOL(fd,2), */ RFIFOL (fd, 6));
+ PRINTF("intif_savestorage: done %d %d\n", RFIFOL(fd, 2),
+ RFIFOB(fd, 6));
+ storage_storage_saved(RFIFOL(fd, 2));
return 0;
}
// パーティ作成可否
static
-int intif_parse_PartyCreated (int fd)
+int intif_parse_PartyCreated(int fd)
{
if (battle_config.etc_log)
- printf ("intif: party created\n");
- party_created (RFIFOL (fd, 2), RFIFOB (fd, 6), RFIFOL (fd, 7),
- (const char *)RFIFOP (fd, 11));
+ PRINTF("intif: party created\n");
+ party_created(RFIFOL(fd, 2), RFIFOB(fd, 6), RFIFOL(fd, 7),
+ (const char *)RFIFOP(fd, 11));
return 0;
}
// パーティ情報
static
-int intif_parse_PartyInfo (int fd)
+int intif_parse_PartyInfo(int fd)
{
- if (RFIFOW (fd, 2) == 8)
+ if (RFIFOW(fd, 2) == 8)
{
if (battle_config.error_log)
- printf ("intif: party noinfo %d\n", RFIFOL (fd, 4));
- party_recv_noinfo (RFIFOL (fd, 4));
+ PRINTF("intif: party noinfo %d\n", RFIFOL(fd, 4));
+ party_recv_noinfo(RFIFOL(fd, 4));
return 0;
}
-// printf("intif: party info %d\n",RFIFOL(fd,4));
- if (RFIFOW (fd, 2) != sizeof (struct party) + 4)
+// PRINTF("intif: party info %d\n",RFIFOL(fd,4));
+ if (RFIFOW(fd, 2) != sizeof(struct party) + 4)
{
if (battle_config.error_log)
- printf ("intif: party info : data size error %d %d %d\n",
- RFIFOL (fd, 4), RFIFOW (fd, 2),
- sizeof (struct party) + 4);
+ PRINTF("intif: party info : data size error %d %d %zu\n",
+ RFIFOL(fd, 4), RFIFOW(fd, 2),
+ sizeof(struct party) + 4);
}
- party_recv_info ((struct party *) RFIFOP (fd, 4));
+ party_recv_info(static_cast<const struct party *>(RFIFOP(fd, 4)));
return 0;
}
// パーティ追加通知
static
-int intif_parse_PartyMemberAdded (int fd)
+int intif_parse_PartyMemberAdded(int fd)
{
if (battle_config.etc_log)
- printf ("intif: party member added %d %d %d\n", RFIFOL (fd, 2),
- RFIFOL (fd, 6), RFIFOB (fd, 10));
- party_member_added (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOB (fd, 10));
+ PRINTF("intif: party member added %d %d %d\n", RFIFOL(fd, 2),
+ RFIFOL(fd, 6), RFIFOB(fd, 10));
+ party_member_added(RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOB(fd, 10));
return 0;
}
// パーティ設定変更通知
static
-int intif_parse_PartyOptionChanged (int fd)
+int intif_parse_PartyOptionChanged(int fd)
{
- party_optionchanged (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOW (fd, 10),
- RFIFOW (fd, 12), RFIFOB (fd, 14));
+ party_optionchanged(RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOW(fd, 10),
+ RFIFOW(fd, 12), RFIFOB(fd, 14));
return 0;
}
// パーティ脱退通知
static
-int intif_parse_PartyMemberLeaved (int fd)
+int intif_parse_PartyMemberLeaved(int fd)
{
if (battle_config.etc_log)
- printf ("intif: party member leaved %d %d %s\n", RFIFOL (fd, 2),
- RFIFOL (fd, 6), (const char *)RFIFOP (fd, 10));
- party_member_leaved (RFIFOL (fd, 2), RFIFOL (fd, 6), (const char *)RFIFOP (fd, 10));
+ PRINTF("intif: party member leaved %d %d %s\n", RFIFOL(fd, 2),
+ RFIFOL(fd, 6), (const char *)RFIFOP(fd, 10));
+ party_member_leaved(RFIFOL(fd, 2), RFIFOL(fd, 6), (const char *)RFIFOP(fd, 10));
return 0;
}
// パーティ解散通知
static
-int intif_parse_PartyBroken (int fd)
+int intif_parse_PartyBroken(int fd)
{
- party_broken (RFIFOL (fd, 2));
+ party_broken(RFIFOL(fd, 2));
return 0;
}
// パーティ移動通知
static
-int intif_parse_PartyMove (int fd)
+int intif_parse_PartyMove(int fd)
{
// if(battle_config.etc_log)
-// printf("intif: party move %d %d %s %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27));
- party_recv_movemap (RFIFOL (fd, 2), RFIFOL (fd, 6), (const char *)RFIFOP (fd, 10),
- RFIFOB (fd, 26), RFIFOW (fd, 27));
+// PRINTF("intif: party move %d %d %s %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27));
+ party_recv_movemap(RFIFOL(fd, 2), RFIFOL(fd, 6), (const char *)RFIFOP(fd, 10),
+ RFIFOB(fd, 26), RFIFOW(fd, 27));
return 0;
}
// パーティメッセージ
static
-int intif_parse_PartyMessage (int fd)
+int intif_parse_PartyMessage(int fd)
{
// if(battle_config.etc_log)
-// printf("intif_parse_PartyMessage: %s\n",RFIFOP(fd,12));
- party_recv_message (RFIFOL (fd, 4), RFIFOL (fd, 8), (const char *)RFIFOP (fd, 12),
- RFIFOW (fd, 2) - 12);
+// PRINTF("intif_parse_PartyMessage: %s\n",RFIFOP(fd,12));
+ party_recv_message(RFIFOL(fd, 4), RFIFOL(fd, 8), (const char *)RFIFOP(fd, 12),
+ RFIFOW(fd, 2) - 12);
return 0;
}
-// ギルド作成可否
-static
-int intif_parse_GuildCreated (int fd)
-{
- guild_created (RFIFOL (fd, 2), RFIFOL (fd, 6));
- return 0;
-}
-
-// ギルド情報
-static
-int intif_parse_GuildInfo (int fd)
-{
- if (RFIFOW (fd, 2) == 8)
- {
- if (battle_config.error_log)
- printf ("intif: guild noinfo %d\n", RFIFOL (fd, 4));
- guild_recv_noinfo (RFIFOL (fd, 4));
- return 0;
- }
-
-// if(battle_config.etc_log)
-// printf("intif: guild info %d\n",RFIFOL(fd,4));
- if (RFIFOW (fd, 2) != sizeof (struct guild) + 4)
- {
- if (battle_config.error_log)
- printf ("intif: guild info : data size error\n %d %d %d",
- RFIFOL (fd, 4), RFIFOW (fd, 2),
- sizeof (struct guild) + 4);
- }
- guild_recv_info ((struct guild *) RFIFOP (fd, 4));
- return 0;
-}
-
-// ギルドメンバ追加通知
-static
-int intif_parse_GuildMemberAdded (int fd)
-{
- if (battle_config.etc_log)
- printf ("intif: guild member added %d %d %d %d\n", RFIFOL (fd, 2),
- RFIFOL (fd, 6), RFIFOL (fd, 10), RFIFOB (fd, 14));
- guild_member_added (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10),
- RFIFOB (fd, 14));
- return 0;
-}
-
-// ギルドメンバ脱退/追放通知
-static
-int intif_parse_GuildMemberLeaved (int fd)
-{
- guild_member_leaved (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10),
- RFIFOB (fd, 14), (const char *)RFIFOP (fd, 55), (const char *)RFIFOP (fd, 15));
- return 0;
-}
-
-// ギルドメンバオンライン状態/Lv変更通知
-static
-int intif_parse_GuildMemberInfoShort (int fd)
-{
- guild_recv_memberinfoshort (RFIFOL (fd, 2), RFIFOL (fd, 6),
- RFIFOL (fd, 10), RFIFOB (fd, 14), RFIFOW (fd,
- 15),
- RFIFOW (fd, 17));
- return 0;
-}
-
-// ギルド解散通知
-static
-int intif_parse_GuildBroken (int fd)
-{
- guild_broken (RFIFOL (fd, 2), RFIFOB (fd, 6));
- return 0;
-}
-
-// ギルド基本情報変更通知
-static
-int intif_parse_GuildBasicInfoChanged (int fd)
-{
- int type = RFIFOW (fd, 8), guild_id = RFIFOL (fd, 4);
- void *data = RFIFOP (fd, 10);
- struct guild *g = guild_search (guild_id);
- short dw = *((short *) data);
- int dd = *((int *) data);
- if (g == NULL)
- return 0;
- switch (type)
- {
- case GBI_EXP:
- g->exp = dd;
- break;
- case GBI_GUILDLV:
- g->guild_lv = dw;
- break;
- case GBI_SKILLPOINT:
- g->skill_point = dd;
- break;
- }
- return 0;
-}
-
-// ギルドメンバ情報変更通知
-static
-int intif_parse_GuildMemberInfoChanged (int fd)
-{
- int type = RFIFOW (fd, 16), guild_id = RFIFOL (fd, 4);
- int account_id = RFIFOL (fd, 8), char_id = RFIFOL (fd, 12);
- void *data = RFIFOP (fd, 18);
- struct guild *g = guild_search (guild_id);
- int idx, dd = *((int *) data);
- if (g == NULL)
- return 0;
- idx = guild_getindex (g, account_id, char_id);
- switch (type)
- {
- case GMI_POSITION:
- g->member[idx].position = dd;
- guild_memberposition_changed (g, idx, dd);
- break;
- case GMI_EXP:
- g->member[idx].exp = dd;
- break;
- }
- return 0;
-}
-
-// ギルド役職変更通知
-static
-int intif_parse_GuildPosition (int fd)
-{
- if (RFIFOW (fd, 2) != sizeof (struct guild_position) + 12)
- {
- if (battle_config.error_log)
- printf ("intif: guild info : data size error\n %d %d %d",
- RFIFOL (fd, 4), RFIFOW (fd, 2),
- sizeof (struct guild_position) + 12);
- }
- guild_position_changed (RFIFOL (fd, 4), RFIFOL (fd, 8),
- (struct guild_position *) RFIFOP (fd, 12));
- return 0;
-}
-
-// ギルドスキル割り振り通知
-static
-int intif_parse_GuildSkillUp (int fd)
-{
- guild_skillupack (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10));
- return 0;
-}
-
-// ギルド同盟/敵対通知
-static
-int intif_parse_GuildAlliance (int fd)
-{
- guild_allianceack (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10),
- RFIFOL (fd, 14), RFIFOB (fd, 18), (const char *)RFIFOP (fd, 19),
- (const char *)RFIFOP (fd, 43));
- return 0;
-}
-
-// ギルド告知変更通知
-static
-int intif_parse_GuildNotice (int fd)
-{
- guild_notice_changed (RFIFOL (fd, 2), (const char *)RFIFOP (fd, 6), (const char *)RFIFOP (fd, 66));
- return 0;
-}
-
-// ギルドエンブレム変更通知
-static
-int intif_parse_GuildEmblem (int fd)
-{
- guild_emblem_changed (RFIFOW (fd, 2) - 12, RFIFOL (fd, 4), RFIFOL (fd, 8),
- (const char *)RFIFOP (fd, 12));
- return 0;
-}
-
-// ギルド会話受信
-static
-int intif_parse_GuildMessage (int fd)
-{
- guild_recv_message (RFIFOL (fd, 4), RFIFOL (fd, 8), (const char *)RFIFOP (fd, 12),
- RFIFOW (fd, 2) - 12);
- return 0;
-}
-
-// ギルド城データ要求返信
-static
-int intif_parse_GuildCastleDataLoad (int fd)
-{
- return guild_castledataloadack (RFIFOW (fd, 2), RFIFOB (fd, 4),
- RFIFOL (fd, 5));
-}
-
-// ギルド城データ変更通知
-static
-int intif_parse_GuildCastleDataSave (int fd)
-{
- return guild_castledatasaveack (RFIFOW (fd, 2), RFIFOB (fd, 4),
- RFIFOL (fd, 5));
-}
-
-// ギルド城データ一括受信(初期化時)
-static
-int intif_parse_GuildCastleAllDataLoad (int fd)
-{
- return guild_castlealldataload (RFIFOW (fd, 2),
- (struct guild_castle *) RFIFOP (fd, 4));
-}
-
//-----------------------------------------------------------------
// inter serverからの通信
// エラーがあれば0(false)を返すこと
// パケットが処理できれば1,パケット長が足りなければ2を返すこと
-int intif_parse (int fd)
+int intif_parse(int fd)
{
- int packet_len;
- int cmd = RFIFOW (fd, 0);
+ int packet_len;
+ int cmd = RFIFOW(fd, 0);
// パケットのID確認
if (cmd < 0x3800
|| cmd >=
- 0x3800 + (sizeof (packet_len_table) / sizeof (packet_len_table[0]))
+ 0x3800 + (sizeof(packet_len_table) / sizeof(packet_len_table[0]))
|| packet_len_table[cmd - 0x3800] == 0)
{
return 0;
@@ -1103,13 +562,13 @@ int intif_parse (int fd)
packet_len = packet_len_table[cmd - 0x3800];
if (packet_len == -1)
{
- if (RFIFOREST (fd) < 4)
+ if (RFIFOREST(fd) < 4)
return 2;
- packet_len = RFIFOW (fd, 2);
+ packet_len = RFIFOW(fd, 2);
}
// if(battle_config.etc_log)
-// printf("intif_parse %d %x %d %d\n",fd,cmd,packet_len,RFIFOREST(fd));
- if (RFIFOREST (fd) < packet_len)
+// PRINTF("intif_parse %d %x %d %d\n",fd,cmd,packet_len,RFIFOREST(fd));
+ if (RFIFOREST(fd) < packet_len)
{
return 2;
}
@@ -1117,118 +576,59 @@ int intif_parse (int fd)
switch (cmd)
{
case 0x3800:
- clif_GMmessage (NULL, (const char *)RFIFOP (fd, 4), packet_len - 4, 0);
+ clif_GMmessage(NULL,
+ const_string((const char *)RFIFOP(fd, 4),
+ (packet_len - 4) - 1), 0);
break;
case 0x3801:
- intif_parse_WisMessage (fd);
+ intif_parse_WisMessage(fd);
break;
case 0x3802:
- intif_parse_WisEnd (fd);
+ intif_parse_WisEnd(fd);
break;
case 0x3803:
- mapif_parse_WisToGM (fd);
+ mapif_parse_WisToGM(fd);
break;
case 0x3804:
- intif_parse_AccountReg (fd);
+ intif_parse_AccountReg(fd);
break;
case 0x3810:
- intif_parse_LoadStorage (fd);
+ intif_parse_LoadStorage(fd);
break;
case 0x3811:
- intif_parse_SaveStorage (fd);
- break;
- case 0x3818:
- intif_parse_LoadGuildStorage (fd);
- break;
- case 0x3819:
- intif_parse_SaveGuildStorage (fd);
+ intif_parse_SaveStorage(fd);
break;
case 0x3820:
- intif_parse_PartyCreated (fd);
+ intif_parse_PartyCreated(fd);
break;
case 0x3821:
- intif_parse_PartyInfo (fd);
+ intif_parse_PartyInfo(fd);
break;
case 0x3822:
- intif_parse_PartyMemberAdded (fd);
+ intif_parse_PartyMemberAdded(fd);
break;
case 0x3823:
- intif_parse_PartyOptionChanged (fd);
+ intif_parse_PartyOptionChanged(fd);
break;
case 0x3824:
- intif_parse_PartyMemberLeaved (fd);
+ intif_parse_PartyMemberLeaved(fd);
break;
case 0x3825:
- intif_parse_PartyMove (fd);
+ intif_parse_PartyMove(fd);
break;
case 0x3826:
- intif_parse_PartyBroken (fd);
+ intif_parse_PartyBroken(fd);
break;
case 0x3827:
- intif_parse_PartyMessage (fd);
- break;
- case 0x3830:
- intif_parse_GuildCreated (fd);
- break;
- case 0x3831:
- intif_parse_GuildInfo (fd);
- break;
- case 0x3832:
- intif_parse_GuildMemberAdded (fd);
- break;
- case 0x3834:
- intif_parse_GuildMemberLeaved (fd);
- break;
- case 0x3835:
- intif_parse_GuildMemberInfoShort (fd);
- break;
- case 0x3836:
- intif_parse_GuildBroken (fd);
- break;
- case 0x3837:
- intif_parse_GuildMessage (fd);
- break;
- case 0x3839:
- intif_parse_GuildBasicInfoChanged (fd);
- break;
- case 0x383a:
- intif_parse_GuildMemberInfoChanged (fd);
- break;
- case 0x383b:
- intif_parse_GuildPosition (fd);
- break;
- case 0x383c:
- intif_parse_GuildSkillUp (fd);
- break;
- case 0x383d:
- intif_parse_GuildAlliance (fd);
- break;
- case 0x383e:
- intif_parse_GuildNotice (fd);
- break;
- case 0x383f:
- intif_parse_GuildEmblem (fd);
- break;
- case 0x3840:
- intif_parse_GuildCastleDataLoad (fd);
- break;
- case 0x3841:
- intif_parse_GuildCastleDataSave (fd);
- break;
- case 0x3842:
- intif_parse_GuildCastleAllDataLoad (fd);
+ intif_parse_PartyMessage(fd);
break;
- //case 0x3880: intif_parse_CreateP.et(fd); break;
- //case 0x3881: intif_parse_RecvP.etData(fd); break;
- //case 0x3882: intif_parse_SaveP.etOk(fd); break;
- //case 0x3883: intif_parse_DeleteP.etOk(fd); break;
default:
if (battle_config.error_log)
- printf ("intif_parse : unknown packet %d %x\n", fd,
- RFIFOW (fd, 0));
+ PRINTF("intif_parse : unknown packet %d %x\n", fd,
+ RFIFOW(fd, 0));
return 0;
}
// パケット読み飛ばし
- RFIFOSKIP (fd, packet_len);
+ RFIFOSKIP(fd, packet_len);
return 1;
}
diff --git a/src/map/intif.hpp b/src/map/intif.hpp
index fcca523..25f69e3 100644
--- a/src/map/intif.hpp
+++ b/src/map/intif.hpp
@@ -1,56 +1,31 @@
-// $Id: intif.h,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
#ifndef INTIF_HPP
#define INTIF_HPP
-int intif_parse (int fd);
-
-int intif_GMmessage (const char *mes, int len, int flag);
-
-int intif_wis_message (struct map_session_data *sd, const char *nick, const char *mes,
- int mes_len);
-int intif_wis_message_to_gm (const char *Wisp_name, int min_gm_level, const char *mes,
- int mes_len);
-
-int intif_saveaccountreg (struct map_session_data *sd);
-int intif_request_accountreg (struct map_session_data *sd);
-
-int intif_request_storage (int account_id);
-int intif_send_storage (struct storage *stor);
-int intif_request_guild_storage (int account_id, int guild_id);
-int intif_send_guild_storage (int account_id, struct guild_storage *gstor);
-
-int intif_create_party (struct map_session_data *sd, const char *name);
-int intif_request_partyinfo (int party_id);
-int intif_party_addmember (int party_id, int account_id);
-int intif_party_changeoption (int party_id, int account_id, int exp,
- int item);
-int intif_party_leave (int party_id, int accound_id);
-int intif_party_changemap (struct map_session_data *sd, int online);
-int intif_break_party (int party_id);
-int intif_party_message (int party_id, int account_id, const char *mes, int len);
-int intif_party_checkconflict (int party_id, int account_id, const char *nick);
-
-int intif_guild_create (const char *name, const struct guild_member *master);
-int intif_guild_request_info (int guild_id);
-int intif_guild_addmember (int guild_id, struct guild_member *m);
-int intif_guild_leave (int guild_id, int account_id, int char_id, int flag,
- const char *mes);
-int intif_guild_memberinfoshort (int guild_id, int account_id, int char_id,
- int online, int lv, int class_);
-int intif_guild_break (int guild_id);
-int intif_guild_message (int guild_id, int account_id, const char *mes, int len);
-int intif_guild_checkconflict (int guild_id, int account_id, int char_id);
-int intif_guild_change_basicinfo (int guild_id, int type, const void *data,
- int len);
-int intif_guild_change_memberinfo (int guild_id, int account_id, int char_id,
- int type, const void *data, int len);
-int intif_guild_position (int guild_id, int idx, struct guild_position *p);
-int intif_guild_skillup (int guild_id, int skill_num, int account_id);
-int intif_guild_alliance (int guild_id1, int guild_id2, int account_id1,
- int account_id2, int flag);
-int intif_guild_notice (int guild_id, const char *mes1, const char *mes2);
-int intif_guild_emblem (int guild_id, int len, const char *data);
-int intif_guild_castle_dataload (int castle_id, int index);
-int intif_guild_castle_datasave (int castle_id, int index, int value);
-
-#endif
+#include "../common/const_array.hpp"
+
+int intif_parse(int fd);
+
+void intif_GMmessage(const_string mes, int flag);
+
+int intif_wis_message(struct map_session_data *sd, const char *nick, const char *mes,
+ int mes_len);
+int intif_wis_message_to_gm(const char *Wisp_name, int min_gm_level, const char *mes,
+ int mes_len);
+
+int intif_saveaccountreg(struct map_session_data *sd);
+int intif_request_accountreg(struct map_session_data *sd);
+
+int intif_request_storage(int account_id);
+int intif_send_storage(struct storage *stor);
+
+int intif_create_party(struct map_session_data *sd, const char *name);
+int intif_request_partyinfo(int party_id);
+int intif_party_addmember(int party_id, int account_id);
+int intif_party_changeoption(int party_id, int account_id, int exp,
+ int item);
+int intif_party_leave(int party_id, int accound_id);
+int intif_party_changemap(struct map_session_data *sd, int online);
+int intif_party_message(int party_id, int account_id, const char *mes, int len);
+int intif_party_checkconflict(int party_id, int account_id, const char *nick);
+
+#endif // INTIF_HPP
diff --git a/src/map/itemdb.cpp b/src/map/itemdb.cpp
index 03e59d6..f60dc53 100644
--- a/src/map/itemdb.cpp
+++ b/src/map/itemdb.cpp
@@ -1,164 +1,80 @@
-// $Id: itemdb.c,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include "itemdb.hpp"
+
+#include <cstdlib>
+#include <cstring>
+#include "../common/cxxstdio.hpp"
#include "../common/db.hpp"
-#include "../common/grfio.hpp"
+#include "../common/random.hpp"
#include "../common/nullpo.hpp"
-#include "map.hpp"
-#include "battle.hpp"
-#include "itemdb.hpp"
-#include "script.hpp"
-#include "pc.hpp"
#include "../common/socket.hpp"
-#include "../common/mt_rand.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
+#include "../poison.hpp"
-#define MAX_RANDITEM 2000
+constexpr int MAX_RANDITEM = 2000;
// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
// 定義すると、itemdb.txtとgrfで名前が異なる場合、表示します.
//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
-static struct dbt *item_db;
-
-static struct random_item_data blue_box[MAX_RANDITEM],
- violet_box[MAX_RANDITEM], card_album[MAX_RANDITEM],
- gift_box[MAX_RANDITEM], scroll[MAX_RANDITEM];
-static int blue_box_count = 0, violet_box_count = 0, card_album_count =
- 0, gift_box_count = 0, scroll_count = 0;
-static int blue_box_default = 0, violet_box_default = 0, card_album_default =
- 0, gift_box_default = 0, scroll_default = 0;
+static
+Map<int, struct item_data> item_db;
// Function declarations
-static void itemdb_read (void);
-static int itemdb_readdb (void);
-static int itemdb_read_randomitem (void);
-static int itemdb_read_itemavail (void);
-static int itemdb_read_itemnametable (void);
-static int itemdb_read_noequip (void);
-
-/*==========================================
- * 名前で検索用
- *------------------------------------------
- */
-// name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)
static
-void itemdb_searchname_sub (db_key_t key, db_val_t data, va_list ap)
-{
- struct item_data *item = (struct item_data *) data, **dst;
- char *str;
- str = va_arg (ap, char *);
- dst = va_arg (ap, struct item_data **);
-// if( strcasecmp(item->name,str)==0 || strcmp(item->jname,str)==0 ||
-// memcmp(item->name,str,24)==0 || memcmp(item->jname,str,24)==0 )
- if (strcasecmp (item->name, str) == 0) //by lupus
- *dst = item;
-}
+void itemdb_read(void);
+static
+int itemdb_readdb(void);
+static
+int itemdb_read_itemavail(void);
+static
+int itemdb_read_noequip(void);
/*==========================================
* 名前で検索用
*------------------------------------------
*/
+// name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)
static
-int itemdb_searchjname_sub (void *key, void *data, va_list ap)
+void itemdb_searchname_sub(struct item_data *item, const char *str, struct item_data **dst)
{
- struct item_data *item = (struct item_data *) data, **dst;
- char *str;
- str = va_arg (ap, char *);
- dst = va_arg (ap, struct item_data **);
- if (strcasecmp (item->jname, str) == 0)
+ if (strcasecmp(item->name, str) == 0) //by lupus
*dst = item;
- return 0;
}
/*==========================================
* 名前で検索
*------------------------------------------
*/
-struct item_data *itemdb_searchname (const char *str)
+struct item_data *itemdb_searchname(const char *str)
{
struct item_data *item = NULL;
- numdb_foreach (item_db, itemdb_searchname_sub, str, &item);
+ for (auto& pair : item_db)
+ itemdb_searchname_sub(&pair.second, str, &item);
return item;
}
/*==========================================
- * 箱系アイテム検索
- *------------------------------------------
- */
-int itemdb_searchrandomid (int flags)
-{
- int nameid = 0, i, index, count;
- struct random_item_data *list = NULL;
-
- struct
- {
- int nameid, count;
- struct random_item_data *list;
- } data[] =
- {
- {
- 0, 0, NULL},
- {
- blue_box_default, blue_box_count, blue_box},
- {
- violet_box_default, violet_box_count, violet_box},
- {
- card_album_default, card_album_count, card_album},
- {
- gift_box_default, gift_box_count, gift_box},
- {
- scroll_default, scroll_count, scroll},};
-
- if (flags >= 1 && flags <= 5)
- {
- nameid = data[flags].nameid;
- count = data[flags].count;
- list = data[flags].list;
-
- if (count > 0)
- {
- for (i = 0; i < 1000; i++)
- {
- index = MRAND (count);
- if (MRAND (1000000) < list[index].per)
- {
- nameid = list[index].nameid;
- break;
- }
- }
- }
- }
- return nameid;
-}
-
-/*==========================================
* DBの存在確認
*------------------------------------------
*/
-struct item_data *itemdb_exists (int nameid)
+struct item_data *itemdb_exists(int nameid)
{
- return (struct item_data *)numdb_search (item_db, nameid);
+ return item_db.search(nameid);
}
/*==========================================
* DBの検索
*------------------------------------------
*/
-struct item_data *itemdb_search (int nameid)
+struct item_data *itemdb_search(int nameid)
{
- struct item_data *id = (struct item_data *)numdb_search (item_db, nameid);
+ struct item_data *id = item_db.search(nameid);
if (id)
return id;
- id = (struct item_data *) calloc (1, sizeof (struct item_data));
- numdb_insert (item_db, nameid, id);
+ id = item_db.init(nameid);
id->nameid = nameid;
id->value_buy = 10;
@@ -173,21 +89,21 @@ struct item_data *itemdb_search (int nameid)
id->view_id = 0;
if (nameid > 500 && nameid < 600)
- id->type = 0; //heal item
+ id->type = ItemType::USE;
else if (nameid > 600 && nameid < 700)
- id->type = 2; //use item
+ id->type = ItemType::_2;
else if ((nameid > 700 && nameid < 1100) ||
(nameid > 7000 && nameid < 8000))
- id->type = 3; //correction
+ id->type = ItemType::JUNK;
else if (nameid >= 1750 && nameid < 1771)
- id->type = 10; //arrow
+ id->type = ItemType::ARROW;
else if (nameid > 1100 && nameid < 2000)
- id->type = 4; //weapon
+ id->type = ItemType::WEAPON;
else if ((nameid > 2100 && nameid < 3000) ||
(nameid > 5000 && nameid < 6000))
- id->type = 5; //armor
+ id->type = ItemType::ARMOR;
else if (nameid > 4000 && nameid < 5000)
- id->type = 6; //card
+ id->type = ItemType::_6;
return id;
}
@@ -196,135 +112,85 @@ struct item_data *itemdb_search (int nameid)
*
*------------------------------------------
*/
-int itemdb_isequip (int nameid)
+int itemdb_isequip(int nameid)
{
- int type = itemdb_type (nameid);
- if (type == 0 || type == 2 || type == 3 || type == 6 || type == 10)
- return 0;
- return 1;
+ ItemType type = itemdb_type(nameid);
+ return !(type == ItemType::USE
+ || type == ItemType::_2
+ || type == ItemType::JUNK
+ || type == ItemType::_6
+ || type == ItemType::ARROW);
}
/*==========================================
*
*------------------------------------------
*/
-int itemdb_isequip2 (struct item_data *data)
+int itemdb_isequip2(struct item_data *data)
{
- if (data)
- {
- int type = data->type;
- if (type == 0 || type == 2 || type == 3 || type == 6 || type == 10)
- return 0;
- else
- return 1;
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip3 (int nameid)
-{
- int type = itemdb_type (nameid);
- if (type == 4 || type == 5 || type == 8)
- return 1;
- return 0;
+ if (!data)
+ return false;
+ ItemType type = data->type;
+ return !(type == ItemType::USE
+ || type == ItemType::_2
+ || type == ItemType::JUNK
+ || type == ItemType::_6
+ || type == ItemType::ARROW);
}
/*==========================================
- * 捨てられるアイテムは1、そうでないアイテムは0
- *------------------------------------------
- */
-int itemdb_isdropable (int nameid)
-{
- //結婚指輪は捨てられない
- switch (nameid)
- {
- case 2634: //結婚指輪
- case 2635: //結婚指輪
- return 0;
- }
-
- return 1;
-}
-
-//
-// 初期化
-//
-/*==========================================
*
*------------------------------------------
*/
-static int itemdb_read_itemslottable (void)
+int itemdb_isequip3(int nameid)
{
- char *buf, *p;
- size_t s;
-
- buf = (char *)grfio_reads ("data\\itemslottable.txt", &s);
- if (buf == NULL)
- return -1;
- buf[s] = 0;
- for (p = buf; p - buf < s;)
- {
- int nameid, equip;
- sscanf (p, "%d#%d#", &nameid, &equip);
- itemdb_search (nameid)->equip = equip;
- p = strchr (p, 10);
- if (!p)
- break;
- p++;
- p = strchr (p, 10);
- if (!p)
- break;
- p++;
- }
- free (buf);
-
- return 0;
+ ItemType type = itemdb_type(nameid);
+ return (type == ItemType::WEAPON
+ || type == ItemType::ARMOR
+ || type == ItemType::_8);
}
/*==========================================
* アイテムデータベースの読み込み
*------------------------------------------
*/
-static int itemdb_readdb (void)
+static
+int itemdb_readdb(void)
{
FILE *fp;
char line[1024];
- int ln = 0, lines = 0;
- int nameid, j;
+ int ln = 0, lines = 0;
+ int nameid, j;
char *str[32], *p, *np;
struct item_data *id;
- int i = 0;
+ int i = 0;
const char *filename[] = { "db/item_db.txt", "db/item_db2.txt" };
for (i = 0; i < 2; i++)
{
- fp = fopen_ (filename[i], "r");
+ fp = fopen_(filename[i], "r");
if (fp == NULL)
{
if (i > 0)
continue;
- printf ("can't read %s\n", filename[i]);
- exit (1);
+ PRINTF("can't read %s\n", filename[i]);
+ exit(1);
}
lines = 0;
- while (fgets (line, 1020, fp))
+ while (fgets(line, 1020, fp))
{
lines++;
if (line[0] == '/' && line[1] == '/')
continue;
- memset (str, 0, sizeof (str));
+ memset(str, 0, sizeof(str));
for (j = 0, np = p = line; j < 17 && p; j++)
{
while (*p == '\t' || *p == ' ')
p++;
str[j] = p;
- p = strchr (p, ',');
+ p = strchr(p, ',');
if (p)
{
*p++ = 0;
@@ -334,18 +200,18 @@ static int itemdb_readdb (void)
if (str[0] == NULL)
continue;
- nameid = atoi (str[0]);
+ nameid = atoi(str[0]);
if (nameid <= 0 || nameid >= 20000)
continue;
ln++;
//ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View
- id = itemdb_search (nameid);
- memcpy (id->name, str[1], 24);
- memcpy (id->jname, str[2], 24);
- id->type = atoi (str[3]);
- id->value_buy = atoi (str[4]);
- id->value_sell = atoi (str[5]);
+ id = itemdb_search(nameid);
+ memcpy(id->name, str[1], 24);
+ memcpy(id->jname, str[2], 24);
+ id->type = ItemType(atoi(str[3]));
+ id->value_buy = atoi(str[4]);
+ id->value_sell = atoi(str[5]);
if (id->value_buy == 0 && id->value_sell == 0)
{
}
@@ -357,17 +223,17 @@ static int itemdb_readdb (void)
{
id->value_sell = id->value_buy / 2;
}
- id->weight = atoi (str[6]);
- id->atk = atoi (str[7]);
- id->def = atoi (str[8]);
- id->range = atoi (str[9]);
- id->magic_bonus = atoi (str[10]);
- id->slot = atoi (str[11]);
- id->sex = atoi (str[12]);
- id->equip = atoi (str[13]);
- id->wlv = atoi (str[14]);
- id->elv = atoi (str[15]);
- id->look = atoi (str[16]);
+ id->weight = atoi(str[6]);
+ id->atk = atoi(str[7]);
+ id->def = atoi(str[8]);
+ id->range = atoi(str[9]);
+ id->magic_bonus = atoi(str[10]);
+ id->slot = atoi(str[11]);
+ id->sex = atoi(str[12]);
+ id->equip = EPOS(atoi(str[13]));
+ id->wlv = atoi(str[14]);
+ id->elv = atoi(str[15]);
+ id->look = static_cast<ItemLook>(atoi(str[16]));
id->flag.available = 1;
id->flag.value_notdc = 0;
id->flag.value_notoc = 0;
@@ -376,16 +242,16 @@ static int itemdb_readdb (void)
id->use_script = NULL;
id->equip_script = NULL;
- if ((p = strchr (np, '{')) == NULL)
+ if ((p = strchr(np, '{')) == NULL)
continue;
- id->use_script = parse_script (p, lines);
+ id->use_script = parse_script(p, lines);
- if ((p = strchr (p + 1, '{')) == NULL)
+ if ((p = strchr(p + 1, '{')) == NULL)
continue;
- id->equip_script = parse_script (p, lines);
+ id->equip_script = parse_script(p, lines);
}
- fclose_ (fp);
- printf ("read %s done (count=%d)\n", filename[i], ln);
+ fclose_(fp);
+ PRINTF("read %s done (count=%d)\n", filename[i], ln);
}
return 0;
}
@@ -393,124 +259,34 @@ static int itemdb_readdb (void)
// Removed item_value_db, don't re-add!
/*==========================================
- * ランダムアイテム出現データの読み込み
- *------------------------------------------
- */
-static int itemdb_read_randomitem (void)
-{
- FILE *fp;
- char line[1024];
- int ln = 0;
- int nameid, i, j;
- char *str[10], *p;
-
- const struct
- {
- char filename[64];
- struct random_item_data *pdata;
- int *pcount, *pdefault;
- } data[] =
- {
- {
- "db/item_bluebox.txt", blue_box, &blue_box_count,
- &blue_box_default},
- {
- "db/item_violetbox.txt", violet_box, &violet_box_count,
- &violet_box_default},
- {
- "db/item_cardalbum.txt", card_album, &card_album_count,
- &card_album_default},
- {
- "db/item_giftbox.txt", gift_box, &gift_box_count,
- &gift_box_default},
- {
- "db/item_scroll.txt", scroll, &scroll_count, &scroll_default},};
-
- for (i = 0; i < sizeof (data) / sizeof (data[0]); i++)
- {
- struct random_item_data *pd = data[i].pdata;
- int *pc = data[i].pcount;
- int *pdefault = data[i].pdefault;
- const char *fn = data[i].filename;
-
- *pdefault = 0;
- if ((fp = fopen_ (fn, "r")) == NULL)
- {
- printf ("can't read %s\n", fn);
- continue;
- }
-
- while (fgets (line, 1020, fp))
- {
- if (line[0] == '/' && line[1] == '/')
- continue;
- memset (str, 0, sizeof (str));
- for (j = 0, p = line; j < 3 && p; j++)
- {
- str[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
-
- if (str[0] == NULL)
- continue;
-
- nameid = atoi (str[0]);
- if (nameid < 0 || nameid >= 20000)
- continue;
- if (nameid == 0)
- {
- if (str[2])
- *pdefault = atoi (str[2]);
- continue;
- }
-
- if (str[2])
- {
- pd[*pc].nameid = nameid;
- pd[(*pc)++].per = atoi (str[2]);
- }
-
- if (ln >= MAX_RANDITEM)
- break;
- ln++;
- }
- fclose_ (fp);
- printf ("read %s done (count=%d)\n", fn, *pc);
- }
-
- return 0;
-}
-
-/*==========================================
* アイテム使用可能フラグのオーバーライド
*------------------------------------------
*/
-static int itemdb_read_itemavail (void)
+static
+int itemdb_read_itemavail(void)
{
FILE *fp;
char line[1024];
- int ln = 0;
- int nameid, j, k;
+ int ln = 0;
+ int nameid, j, k;
char *str[10], *p;
- if ((fp = fopen_ ("db/item_avail.txt", "r")) == NULL)
+ if ((fp = fopen_("db/item_avail.txt", "r")) == NULL)
{
- printf ("can't read db/item_avail.txt\n");
+ PRINTF("can't read db/item_avail.txt\n");
return -1;
}
- while (fgets (line, 1020, fp))
+ while (fgets(line, 1020, fp))
{
struct item_data *id;
if (line[0] == '/' && line[1] == '/')
continue;
- memset (str, 0, sizeof (str));
+ memset(str, 0, sizeof(str));
for (j = 0, p = line; j < 2 && p; j++)
{
str[j] = p;
- p = strchr (p, ',');
+ p = strchr(p, ',');
if (p)
*p++ = 0;
}
@@ -518,10 +294,10 @@ static int itemdb_read_itemavail (void)
if (str[0] == NULL)
continue;
- nameid = atoi (str[0]);
- if (nameid < 0 || nameid >= 20000 || !(id = itemdb_exists (nameid)))
+ nameid = atoi(str[0]);
+ if (nameid < 0 || nameid >= 20000 || !(id = itemdb_exists(nameid)))
continue;
- k = atoi (str[1]);
+ k = atoi(str[1]);
if (k > 0)
{
id->flag.available = 1;
@@ -531,92 +307,8 @@ static int itemdb_read_itemavail (void)
id->flag.available = 0;
ln++;
}
- fclose_ (fp);
- printf ("read db/item_avail.txt done (count=%d)\n", ln);
- return 0;
-}
-
-/*==========================================
- * アイテムの名前テーブルを読み込む
- *------------------------------------------
- */
-static int itemdb_read_itemnametable (void)
-{
- char *buf, *p;
- size_t s;
-
- buf = (char *)grfio_reads ("data\\idnum2itemdisplaynametable.txt", &s);
-
- if (buf == NULL)
- return -1;
-
- buf[s] = 0;
- for (p = buf; p - buf < s;)
- {
- int nameid;
- char buf2[64];
-
- if (sscanf (p, "%d#%[^#]#", &nameid, buf2) == 2)
- {
-
-#ifdef ITEMDB_OVERRIDE_NAME_VERBOSE
- if (itemdb_exists (nameid) &&
- strncmp (itemdb_search (nameid)->jname, buf2, 24) != 0)
- {
- printf ("[override] %d %s => %s\n", nameid,
- itemdb_search (nameid)->jname, buf2);
- }
-#endif
-
- memcpy (itemdb_search (nameid)->jname, buf2, 24);
- }
-
- p = strchr (p, 10);
- if (!p)
- break;
- p++;
- }
- free (buf);
- printf ("read data\\idnum2itemdisplaynametable.txt done.\n");
-
- return 0;
-}
-
-/*==========================================
- * カードイラストのリソース名前テーブルを読み込む
- *------------------------------------------
- */
-static int itemdb_read_cardillustnametable (void)
-{
- char *buf, *p;
- size_t s;
-
- buf = (char *)grfio_reads ("data\\num2cardillustnametable.txt", &s);
-
- if (buf == NULL)
- return -1;
-
- buf[s] = 0;
- for (p = buf; p - buf < s;)
- {
- int nameid;
- char buf2[64];
-
- if (sscanf (p, "%d#%[^#]#", &nameid, buf2) == 2)
- {
- strcat (buf2, ".bmp");
- memcpy (itemdb_search (nameid)->cardillustname, buf2, 64);
-// printf("%d %s\n",nameid,itemdb_search(nameid)->cardillustname);
- }
-
- p = strchr (p, 10);
- if (!p)
- break;
- p++;
- }
- free (buf);
- printf ("read data\\num2cardillustnametable.txt done.\n");
-
+ fclose_(fp);
+ PRINTF("read db/item_avail.txt done (count=%d)\n", ln);
return 0;
}
@@ -624,46 +316,47 @@ static int itemdb_read_cardillustnametable (void)
* 装備制限ファイル読み出し
*------------------------------------------
*/
-static int itemdb_read_noequip (void)
+static
+int itemdb_read_noequip(void)
{
FILE *fp;
char line[1024];
- int ln = 0;
- int nameid, j;
+ int ln = 0;
+ int nameid, j;
char *str[32], *p;
struct item_data *id;
- if ((fp = fopen_ ("db/item_noequip.txt", "r")) == NULL)
+ if ((fp = fopen_("db/item_noequip.txt", "r")) == NULL)
{
- printf ("can't read db/item_noequip.txt\n");
+ PRINTF("can't read db/item_noequip.txt\n");
return -1;
}
- while (fgets (line, 1020, fp))
+ while (fgets(line, 1020, fp))
{
if (line[0] == '/' && line[1] == '/')
continue;
- memset (str, 0, sizeof (str));
+ memset(str, 0, sizeof(str));
for (j = 0, p = line; j < 2 && p; j++)
{
str[j] = p;
- p = strchr (p, ',');
+ p = strchr(p, ',');
if (p)
*p++ = 0;
}
if (str[0] == NULL)
continue;
- nameid = atoi (str[0]);
- if (nameid <= 0 || nameid >= 20000 || !(id = itemdb_exists (nameid)))
+ nameid = atoi(str[0]);
+ if (nameid <= 0 || nameid >= 20000 || !(id = itemdb_exists(nameid)))
continue;
- id->flag.no_equip = atoi (str[1]);
+ id->flag.no_equip = atoi(str[1]);
ln++;
}
- fclose_ (fp);
- printf ("read db/item_noequip.txt done (count=%d)\n", ln);
+ fclose_(fp);
+ PRINTF("read db/item_noequip.txt done (count=%d)\n", ln);
return 0;
}
@@ -671,20 +364,16 @@ static int itemdb_read_noequip (void)
*
*------------------------------------------
*/
-static void itemdb_final (db_key_t key, db_val_t data, va_list ap)
+static
+void itemdb_final(struct item_data *id)
{
- struct item_data *id;
-
- nullpo_retv (id = (struct item_data *)data);
-
if (id->use_script)
- free (const_cast<ScriptCode *>(id->use_script));
+ free(const_cast<ScriptCode *>(id->use_script));
if (id->equip_script)
- free (const_cast<ScriptCode *>(id->equip_script));
- free (id);
+ free(const_cast<ScriptCode *>(id->equip_script));
}
-void itemdb_reload (void)
+void itemdb_reload(void)
{
/*
*
@@ -693,34 +382,34 @@ void itemdb_reload (void)
*
*/
- do_init_itemdb ();
+ do_init_itemdb();
}
/*==========================================
*
*------------------------------------------
*/
-void do_final_itemdb (void)
+void do_final_itemdb(void)
{
- if (item_db)
- {
- numdb_final (item_db, itemdb_final);
- item_db = NULL;
- }
+ for (auto& pair : item_db)
+ itemdb_final(&pair.second);
+ item_db.clear();
}
/*
-static FILE *dfp;
-static int itemdebug(void *key,void *data,va_list ap){
-// struct item_data *id=(struct item_data *)data;
- fprintf(dfp,"%6d",(int)key);
- return 0;
+static
+FILE *dfp;
+static
+int itemdebug(void *key,void *data,_va_list ap){
+// struct item_data *id=(struct item_data *)data;
+ FPRINTF(dfp,"%6d", (int)key);
+ return 0;
}
void itemdebugtxt()
{
- dfp=fopen_("itemdebug.txt","wt");
- numdb_foreach(item_db,itemdebug);
- fclose_(dfp);
+ dfp=fopen_("itemdebug.txt","wt");
+ numdb_foreach(item_db,itemdebug);
+ fclose_(dfp);
}
*/
@@ -728,27 +417,19 @@ void itemdebugtxt()
* Removed item_value_db, don't re-add
*------------------------------------
*/
-static void itemdb_read (void)
+static
+void itemdb_read(void)
{
- itemdb_read_itemslottable ();
- itemdb_readdb ();
- itemdb_read_randomitem ();
- itemdb_read_itemavail ();
- itemdb_read_noequip ();
- itemdb_read_cardillustnametable ();
- if (!battle_config.item_name_override_grffile)
- itemdb_read_itemnametable ();
+ itemdb_readdb();
+ itemdb_read_itemavail();
+ itemdb_read_noequip();
}
/*==========================================
*
*------------------------------------------
*/
-int do_init_itemdb (void)
+void do_init_itemdb(void)
{
- item_db = numdb_init ();
-
- itemdb_read ();
-
- return 0;
+ itemdb_read();
}
diff --git a/src/map/itemdb.hpp b/src/map/itemdb.hpp
index e03892d..279c7a8 100644
--- a/src/map/itemdb.hpp
+++ b/src/map/itemdb.hpp
@@ -1,31 +1,32 @@
-// $Id: itemdb.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
#ifndef ITEMDB_HPP
#define ITEMDB_HPP
-#include "map.hpp"
+#include "../common/mmo.hpp"
+
+#include "map.t.hpp"
#include "script.hpp"
struct item_data
{
- int nameid;
+ int nameid;
char name[24], jname[24];
char prefix[24], suffix[24];
char cardillustname[64];
- int value_buy;
- int value_sell;
- int type;
- int sex;
- int equip;
- int weight;
- int atk;
- int def;
- int range;
- int magic_bonus;
- int slot;
- int look;
- int elv;
- int wlv;
- int refine;
+ int value_buy;
+ int value_sell;
+ ItemType type;
+ int sex;
+ EPOS equip;
+ int weight;
+ int atk;
+ int def;
+ int range;
+ int magic_bonus;
+ int slot;
+ ItemLook look;
+ int elv;
+ int wlv;
+ int refine;
const ScriptCode *use_script;
const ScriptCode *equip_script;
struct
@@ -37,47 +38,78 @@ struct item_data
unsigned no_drop:1;
unsigned no_use:1;
} flag;
- int view_id;
+ int view_id;
};
struct random_item_data
{
- int nameid;
- int per;
+ int nameid;
+ int per;
};
-struct item_data *itemdb_searchname (const char *name);
-struct item_data *itemdb_search (int nameid);
-struct item_data *itemdb_exists (int nameid);
-#define itemdb_type(n) itemdb_search(n)->type
-#define itemdb_atk(n) itemdb_search(n)->atk
-#define itemdb_def(n) itemdb_search(n)->def
-#define itemdb_look(n) itemdb_search(n)->look
-#define itemdb_weight(n) itemdb_search(n)->weight
-#define itemdb_equip(n) itemdb_search(n)->equip
-#define itemdb_usescript(n) itemdb_search(n)->use_script
-#define itemdb_equipscript(n) itemdb_search(n)->equip_script
-#define itemdb_wlv(n) itemdb_search(n)->wlv
-#define itemdb_range(n) itemdb_search(n)->range
-#define itemdb_slot(n) itemdb_search(n)->slot
-#define itemdb_available(n) (itemdb_exists(n) && itemdb_search(n)->flag.available)
-#define itemdb_viewid(n) (itemdb_search(n)->view_id)
+struct item_data *itemdb_searchname(const char *name);
+struct item_data *itemdb_search(int nameid);
+struct item_data *itemdb_exists(int nameid);
-int itemdb_searchrandomid (int flags);
+inline
+ItemType itemdb_type(int n)
+{
+ return itemdb_search(n)->type;
+}
+inline
+ItemLook itemdb_look(int n)
+{
+ return itemdb_search(n)->look;
+}
+inline
+int itemdb_weight(int n)
+{
+ return itemdb_search(n)->weight;
+}
+inline
+const ScriptCode *itemdb_equipscript(int n)
+{
+ return itemdb_search(n)->equip_script;
+}
+inline
+int itemdb_wlv(int n)
+{
+ return itemdb_search(n)->wlv;
+}
+inline
+bool itemdb_available(int n)
+{
+ return itemdb_exists(n) && itemdb_search(n)->flag.available;
+}
+inline
+int itemdb_viewid(int n)
+{
+ return itemdb_search(n)->view_id;
+}
-#define itemdb_value_buy(n) itemdb_search(n)->value_buy
-#define itemdb_value_sell(n) itemdb_search(n)->value_sell
-#define itemdb_value_notdc(n) itemdb_search(n)->flag.value_notdc
-#define itemdb_value_notoc(n) itemdb_search(n)->flag.value_notoc
+inline
+int itemdb_value_sell(int n)
+{
+ return itemdb_search(n)->value_sell;
+}
+inline
+int itemdb_value_notdc(int n)
+{
+ return itemdb_search(n)->flag.value_notdc;
+}
+inline
+int itemdb_value_notoc(int n)
+{
+ return itemdb_search(n)->flag.value_notoc;
+}
-int itemdb_isequip (int);
-int itemdb_isequip2 (struct item_data *);
-int itemdb_isequip3 (int);
-int itemdb_isdropable (int nameid);
+int itemdb_isequip(int);
+int itemdb_isequip2(struct item_data *);
+int itemdb_isequip3(int);
-void itemdb_reload (void);
+void itemdb_reload(void);
-void do_final_itemdb (void);
-int do_init_itemdb (void);
+void do_final_itemdb(void);
+void do_init_itemdb(void);
-#endif
+#endif // ITEMDB_HPP
diff --git a/src/map/magic-expr-eval.hpp b/src/map/magic-expr-eval.hpp
index a08b964..d6decd9 100644
--- a/src/map/magic-expr-eval.hpp
+++ b/src/map/magic-expr-eval.hpp
@@ -1,20 +1,20 @@
-#ifndef MAGIC_EXPR_EVAL
-#define MAGIC_EXPR_EVAL
+#ifndef MAGIC_EXPR_EVAL_HPP
+#define MAGIC_EXPR_EVAL_HPP
-/* Helper definitions for dealing with functions and operations */
+#include "../common/utils2.hpp"
+
+#include "magic-interpreter.hpp"
-static int heading_x[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
-static int heading_y[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
+/* Helper definitions for dealing with functions and operations */
-int magic_signature_check (const char *opname, const char *funname, const char *signature,
- int args_nr, val_t * args, int line, int column);
+int magic_signature_check(const char *opname, const char *funname, const char *signature,
+ int args_nr, val_t *args, int line, int column);
-void
-magic_area_rect (int *m, int *x, int *y, int *width, int *height,
- area_t * area);
+void magic_area_rect(int *m, int *x, int *y, int *width, int *height,
+ area_t *area);
#define ARGINT(x) args[x].v.v_int
-#define ARGDIR(x) args[x].v.v_int
+#define ARGDIR(x) args[x].v.v_dir
#define ARGSTR(x) args[x].v.v_string
#define ARGENTITY(x) args[x].v.v_entity
#define ARGLOCATION(x) args[x].v.v_location
@@ -23,7 +23,7 @@ magic_area_rect (int *m, int *x, int *y, int *width, int *height,
#define ARGINVOCATION(x) args[x].v.v_invocation
#define RESULTINT result->v.v_int
-#define RESULTDIR result->v.v_int
+#define RESULTDIR result->v.v_dir
#define RESULTSTR result->v.v_string
#define RESULTENTITY result->v.v_entity
#define RESULTLOCATION result->v.v_location
@@ -31,13 +31,13 @@ magic_area_rect (int *m, int *x, int *y, int *width, int *height,
#define RESULTSPELL result->v.v_spell
#define RESULTINVOCATION result->v.v_invocation
-#define TY(x) args[x].ty
-#define ETY(x) ARGENTITY(x)->type
+#define ARG_TYPE(x) args[x].ty
+#define ENTITY_TYPE(x) ARGENTITY(x)->type
#define ARGPC(x) ((struct map_session_data *)ARGENTITY(x))
#define ARGNPC(x) ((struct map_session_data *)ARGENTITY(x))
#define ARGMOB(x) ((struct map_session_data *)ARGENTITY(x))
-#define ARG_MAY_BE_AREA(x) (TY(x) == TY_AREA || TY(x) == TY_LOCATION)
+#define ARG_MAY_BE_AREA(x) (ARG_TYPE(x) == TYPE::AREA || ARG_TYPE(x) == TYPE::LOCATION)
-#endif /* !defined(MAGIC_EXPR_EVAL) */
+#endif // MAGIC_EXPR_EVAL_HPP
diff --git a/src/map/magic-expr.cpp b/src/map/magic-expr.cpp
index 4b4e3a3..4a72a38 100644
--- a/src/map/magic-expr.cpp
+++ b/src/map/magic-expr.cpp
@@ -1,47 +1,49 @@
-#include "magic-expr.hpp"
#include "magic-expr-eval.hpp"
-#include "itemdb.hpp"
-#include <math.h>
+#include "magic-expr.hpp"
+#include "magic-interpreter-aux.hpp"
-#include "../common/mt_rand.hpp"
+#include <cmath>
-#define IS_SOLID(c) ((c) == 1 || (c) == 5)
+#include "../common/cxxstdio.hpp"
+#include "../common/random.hpp"
-int map_is_solid (int m, int x, int y)
-{
- return (IS_SOLID (map_getcell (m, x, y)));
-}
+#include "battle.hpp"
+#include "npc.hpp"
+#include "pc.hpp"
+#include "itemdb.hpp"
-#undef IS_SOLID
+#include "../poison.hpp"
-static void free_area (area_t * area)
+static
+void free_area(area_t *area)
{
if (!area)
return;
switch (area->ty)
{
- case AREA_UNION:
- free_area (area->a.a_union[0]);
- free_area (area->a.a_union[1]);
+ case AREA::UNION:
+ free_area(area->a.a_union[0]);
+ free_area(area->a.a_union[1]);
break;
default:
break;
}
- free (area);
+ free(area);
}
-static area_t *dup_area (area_t * area)
+static
+area_t *dup_area(area_t *area)
{
- area_t *retval = (area_t *)malloc (sizeof (area_t));
+ area_t *retval = (area_t *)malloc(sizeof(area_t));
*retval = *area;
switch (area->ty)
{
- case AREA_UNION:
- retval->a.a_union[0] = dup_area (retval->a.a_union[0]);
- retval->a.a_union[1] = dup_area (retval->a.a_union[1]);
+ case AREA::UNION:
+ retval->a.a_union[0] = dup_area(retval->a.a_union[0]);
+ retval->a.a_union[1] = dup_area(retval->a.a_union[1]);
break;
default:
break;
@@ -50,17 +52,17 @@ static area_t *dup_area (area_t * area)
return retval;
}
-void magic_copy_var (val_t * dest, val_t * src)
+void magic_copy_var(val_t *dest, val_t *src)
{
*dest = *src;
switch (dest->ty)
{
- case TY_STRING:
- dest->v.v_string = strdup (dest->v.v_string);
+ case TYPE::STRING:
+ dest->v.v_string = strdup(dest->v.v_string);
break;
- case TY_AREA:
- dest->v.v_area = dup_area (dest->v.v_area);
+ case TYPE::AREA:
+ dest->v.v_area = dup_area(dest->v.v_area);
break;
default:
break;
@@ -68,15 +70,15 @@ void magic_copy_var (val_t * dest, val_t * src)
}
-void magic_clear_var (val_t * v)
+void magic_clear_var(val_t *v)
{
switch (v->ty)
{
- case TY_STRING:
- free (v->v.v_string);
+ case TYPE::STRING:
+ free(v->v.v_string);
break;
- case TY_AREA:
- free_area (v->v.v_area);
+ case TYPE::AREA:
+ free_area(v->v.v_area);
break;
default:
break;
@@ -84,116 +86,120 @@ void magic_clear_var (val_t * v)
}
static
-const char *show_entity (entity_t * entity)
+const char *show_entity(entity_t *entity)
{
switch (entity->type)
{
- case BL_PC:
+ case BL::PC:
return ((struct map_session_data *) entity)->status.name;
- case BL_NPC:
+ case BL::NPC:
return ((struct npc_data *) entity)->name;
- case BL_MOB:
+ case BL::MOB:
return ((struct mob_data *) entity)->name;
- case BL_ITEM:
+ case BL::ITEM:
/* Sorry about this one... */
return ((struct item_data
*) (&((struct flooritem_data *) entity)->
item_data))->name;
- case BL_SKILL:
- return "%skill";
- case BL_SPELL:
+ case BL::SPELL:
return "%invocation(ERROR:this-should-not-be-an-entity)";
default:
return "%unknown-entity";
}
}
-static void stringify (val_t * v, int within_op)
+static
+void stringify(val_t *v, int within_op)
{
static const char *dirs[8] =
- { "south", "south-west", "west", "north-west", "north", "north-east",
+ {
+ "south", "south-west",
+ "west", "north-west",
+ "north", "north-east",
"east", "south-east"
};
- char *buf;
+ std::string buf;
switch (v->ty)
{
- case TY_UNDEF:
- buf = strdup ("UNDEF");
+ case TYPE::UNDEF:
+ buf = "UNDEF";
break;
- case TY_INT:
- buf = (char *)malloc (32);
- sprintf (buf, "%i", v->v.v_int);
+ case TYPE::INT:
+ buf = STRPRINTF("%i", v->v.v_int);
break;
- case TY_STRING:
+ case TYPE::STRING:
return;
- case TY_DIR:
- buf = strdup (dirs[v->v.v_int]);
+ case TYPE::DIR:
+ buf = dirs[v->v.v_int];
break;
- case TY_ENTITY:
- buf = strdup (show_entity (v->v.v_entity));
+ case TYPE::ENTITY:
+ buf = show_entity(v->v.v_entity);
break;
- case TY_LOCATION:
- buf = (char *) malloc (128);
- sprintf (buf, "<\"%s\", %d, %d>", map[v->v.v_location.m].name,
- v->v.v_location.x, v->v.v_location.y);
+ case TYPE::LOCATION:
+ buf = STRPRINTF("<\"%s\", %d, %d>",
+ map[v->v.v_location.m].name,
+ v->v.v_location.x,
+ v->v.v_location.y);
break;
- case TY_AREA:
- buf = strdup ("%area");
- free_area (v->v.v_area);
+ case TYPE::AREA:
+ buf = "%area";
+ free_area(v->v.v_area);
break;
- case TY_SPELL:
- buf = strdup (v->v.v_spell->name);
+ case TYPE::SPELL:
+ buf = v->v.v_spell->name;
break;
- case TY_INVOCATION:
+ case TYPE::INVOCATION:
{
invocation_t *invocation = within_op
- ? v->v.v_invocation : (invocation_t *) map_id2bl (v->v.v_int);
- buf = strdup (invocation->spell->name);
+ ? v->v.v_invocation
+ : (invocation_t *) map_id2bl(v->v.v_int);
+ buf = invocation->spell->name;
}
break;
default:
- fprintf (stderr, "[magic] INTERNAL ERROR: Cannot stringify %d\n",
- v->ty);
+ FPRINTF(stderr, "[magic] INTERNAL ERROR: Cannot stringify %d\n",
+ v->ty);
return;
}
- v->v.v_string = buf;
- v->ty = TY_STRING;
+ v->v.v_string = strdup(buf.c_str());
+ v->ty = TYPE::STRING;
}
-static void intify (val_t * v)
+static
+void intify(val_t *v)
{
- if (v->ty == TY_INT)
+ if (v->ty == TYPE::INT)
return;
- magic_clear_var (v);
- v->ty = TY_INT;
+ magic_clear_var(v);
+ v->ty = TYPE::INT;
v->v.v_int = 1;
}
static
-area_t *area_new (int ty)
+area_t *area_new(AREA ty)
{
area_t *retval;
- CREATE (retval, area_t, 1);
+ CREATE(retval, area_t, 1);
retval->ty = ty;
return retval;
}
static
-area_t *area_union (area_t * area, area_t * other_area)
+area_t *area_union(area_t *area, area_t *other_area)
{
- area_t *retval = area_new (AREA_UNION);
+ area_t *retval = area_new(AREA::UNION);
retval->a.a_union[0] = area;
retval->a.a_union[1] = other_area;
retval->size = area->size + other_area->size; /* Assume no overlap */
@@ -203,256 +209,277 @@ area_t *area_union (area_t * area, area_t * other_area)
/**
* Turns location into area, leaves other types untouched
*/
-static void make_area (val_t * v)
+static
+void make_area(val_t *v)
{
- if (v->ty == TY_LOCATION)
+ if (v->ty == TYPE::LOCATION)
{
- area_t *a = (area_t *)malloc (sizeof (area_t));
- v->ty = TY_AREA;
- a->ty = AREA_LOCATION;
+ area_t *a = (area_t *)malloc(sizeof(area_t));
+ v->ty = TYPE::AREA;
+ a->ty = AREA::LOCATION;
a->a.a_loc = v->v.v_location;
v->v.v_area = a;
}
}
-static void make_location (val_t * v)
+static
+void make_location(val_t *v)
{
- if (v->ty == TY_AREA && v->v.v_area->ty == AREA_LOCATION)
+ if (v->ty == TYPE::AREA && v->v.v_area->ty == AREA::LOCATION)
{
location_t location = v->v.v_area->a.a_loc;
- free_area (v->v.v_area);
- v->ty = TY_LOCATION;
+ free_area(v->v.v_area);
+ v->ty = TYPE::LOCATION;
v->v.v_location = location;
}
}
-static void make_spell (val_t * v)
+static
+void make_spell(val_t *v)
{
- if (v->ty == TY_INVOCATION)
+ if (v->ty == TYPE::INVOCATION)
{
invocation_t *invoc = v->v.v_invocation; //(invocation_t *) map_id2bl(v->v.v_int);
if (!invoc)
- v->ty = TY_FAIL;
+ v->ty = TYPE::FAIL;
else
{
- v->ty = TY_SPELL;
+ v->ty = TYPE::SPELL;
v->v.v_spell = invoc->spell;
}
}
}
-static int fun_add (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_add(env_t *, int, val_t *result, val_t *args)
{
- if (TY (0) == TY_INT && TY (1) == TY_INT)
+ if (ARG_TYPE(0) == TYPE::INT && ARG_TYPE(1) == TYPE::INT)
{
/* Integer addition */
- RESULTINT = ARGINT (0) + ARGINT (1);
- result->ty = TY_INT;
+ RESULTINT = ARGINT(0) + ARGINT(1);
+ result->ty = TYPE::INT;
}
- else if (ARG_MAY_BE_AREA (0) && ARG_MAY_BE_AREA (1))
+ else if (ARG_MAY_BE_AREA(0) && ARG_MAY_BE_AREA(1))
{
/* Area union */
- make_area (&args[0]);
- make_area (&args[1]);
- RESULTAREA = area_union (ARGAREA (0), ARGAREA (1));
- ARGAREA (0) = NULL;
- ARGAREA (1) = NULL;
- result->ty = TY_AREA;
+ make_area(&args[0]);
+ make_area(&args[1]);
+ RESULTAREA = area_union(ARGAREA(0), ARGAREA(1));
+ ARGAREA(0) = NULL;
+ ARGAREA(1) = NULL;
+ result->ty = TYPE::AREA;
}
else
{
/* Anything else -> string concatenation */
- stringify (&args[0], 1);
- stringify (&args[1], 1);
+ stringify(&args[0], 1);
+ stringify(&args[1], 1);
/* Yes, we could speed this up. */
RESULTSTR =
- (char *) malloc (1 + strlen (ARGSTR (0)) + strlen (ARGSTR (1)));
- strcpy (RESULTSTR, ARGSTR (0));
- strcat (RESULTSTR, ARGSTR (1));
- result->ty = TY_STRING;
+ (char *) malloc(1 + strlen(ARGSTR(0)) + strlen(ARGSTR(1)));
+ strcpy(RESULTSTR, ARGSTR(0));
+ strcat(RESULTSTR, ARGSTR(1));
+ result->ty = TYPE::STRING;
}
return 0;
}
-static int fun_sub (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_sub(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGINT (0) - ARGINT (1);
+ RESULTINT = ARGINT(0) - ARGINT(1);
return 0;
}
-static int fun_mul (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_mul(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGINT (0) * ARGINT (1);
+ RESULTINT = ARGINT(0) * ARGINT(1);
return 0;
}
-static int fun_div (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_div(env_t *, int, val_t *result, val_t *args)
{
- if (!ARGINT (1))
+ if (!ARGINT(1))
return 1; /* division by zero */
- RESULTINT = ARGINT (0) / ARGINT (1);
+ RESULTINT = ARGINT(0) / ARGINT(1);
return 0;
}
-static int fun_mod (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_mod(env_t *, int, val_t *result, val_t *args)
{
- if (!ARGINT (1))
+ if (!ARGINT(1))
return 1; /* division by zero */
- RESULTINT = ARGINT (0) % ARGINT (1);
+ RESULTINT = ARGINT(0) % ARGINT(1);
return 0;
}
-static int fun_or (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_or(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGINT (0) || ARGINT (1);
+ RESULTINT = ARGINT(0) || ARGINT(1);
return 0;
}
-static int fun_and (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_and(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGINT (0) && ARGINT (1);
+ RESULTINT = ARGINT(0) && ARGINT(1);
return 0;
}
-static int fun_not (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_not(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = !ARGINT (0);
+ RESULTINT = !ARGINT(0);
return 0;
}
-static int fun_neg (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_neg(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ~ARGINT (0);
+ RESULTINT = ~ARGINT(0);
return 0;
}
-static int fun_gte (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_gte(env_t *, int, val_t *result, val_t *args)
{
- if (TY (0) == TY_STRING || TY (1) == TY_STRING)
+ if (ARG_TYPE(0) == TYPE::STRING || ARG_TYPE(1) == TYPE::STRING)
{
- stringify (&args[0], 1);
- stringify (&args[1], 1);
- RESULTINT = strcmp (ARGSTR (0), ARGSTR (1)) >= 0;
+ stringify(&args[0], 1);
+ stringify(&args[1], 1);
+ RESULTINT = strcmp(ARGSTR(0), ARGSTR(1)) >= 0;
}
else
{
- intify (&args[0]);
- intify (&args[1]);
- RESULTINT = ARGINT (0) >= ARGINT (1);
+ intify(&args[0]);
+ intify(&args[1]);
+ RESULTINT = ARGINT(0) >= ARGINT(1);
}
return 0;
}
-static int fun_gt (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_gt(env_t *, int, val_t *result, val_t *args)
{
- if (TY (0) == TY_STRING || TY (1) == TY_STRING)
+ if (ARG_TYPE(0) == TYPE::STRING || ARG_TYPE(1) == TYPE::STRING)
{
- stringify (&args[0], 1);
- stringify (&args[1], 1);
- RESULTINT = strcmp (ARGSTR (0), ARGSTR (1)) > 0;
+ stringify(&args[0], 1);
+ stringify(&args[1], 1);
+ RESULTINT = strcmp(ARGSTR(0), ARGSTR(1)) > 0;
}
else
{
- intify (&args[0]);
- intify (&args[1]);
- RESULTINT = ARGINT (0) > ARGINT (1);
+ intify(&args[0]);
+ intify(&args[1]);
+ RESULTINT = ARGINT(0) > ARGINT(1);
}
return 0;
}
-static int fun_eq (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_eq(env_t *, int, val_t *result, val_t *args)
{
- if (TY (0) == TY_STRING || TY (1) == TY_STRING)
+ if (ARG_TYPE(0) == TYPE::STRING || ARG_TYPE(1) == TYPE::STRING)
{
- stringify (&args[0], 1);
- stringify (&args[1], 1);
- RESULTINT = strcmp (ARGSTR (0), ARGSTR (1)) == 0;
+ stringify(&args[0], 1);
+ stringify(&args[1], 1);
+ RESULTINT = strcmp(ARGSTR(0), ARGSTR(1)) == 0;
}
- else if (TY (0) == TY_DIR && TY (1) == TY_DIR)
- RESULTINT = ARGDIR (0) == ARGDIR (1);
- else if (TY (0) == TY_ENTITY && TY (1) == TY_ENTITY)
- RESULTINT = ARGENTITY (0) == ARGENTITY (1);
- else if (TY (0) == TY_LOCATION && TY (1) == TY_LOCATION)
- RESULTINT = (ARGLOCATION (0).x == ARGLOCATION (1).x
- && ARGLOCATION (0).y == ARGLOCATION (1).y
- && ARGLOCATION (0).m == ARGLOCATION (1).m);
- else if (TY (0) == TY_AREA && TY (1) == TY_AREA)
- RESULTINT = ARGAREA (0) == ARGAREA (1); /* Probably not that great an idea... */
- else if (TY (0) == TY_SPELL && TY (1) == TY_SPELL)
- RESULTINT = ARGSPELL (0) == ARGSPELL (1);
- else if (TY (0) == TY_INVOCATION && TY (1) == TY_INVOCATION)
- RESULTINT = ARGINVOCATION (0) == ARGINVOCATION (1);
+ else if (ARG_TYPE(0) == TYPE::DIR && ARG_TYPE(1) == TYPE::DIR)
+ RESULTINT = ARGDIR(0) == ARGDIR(1);
+ else if (ARG_TYPE(0) == TYPE::ENTITY && ARG_TYPE(1) == TYPE::ENTITY)
+ RESULTINT = ARGENTITY(0) == ARGENTITY(1);
+ else if (ARG_TYPE(0) == TYPE::LOCATION && ARG_TYPE(1) == TYPE::LOCATION)
+ RESULTINT = (ARGLOCATION(0).x == ARGLOCATION(1).x
+ && ARGLOCATION(0).y == ARGLOCATION(1).y
+ && ARGLOCATION(0).m == ARGLOCATION(1).m);
+ else if (ARG_TYPE(0) == TYPE::AREA && ARG_TYPE(1) == TYPE::AREA)
+ RESULTINT = ARGAREA(0) == ARGAREA(1); /* Probably not that great an idea... */
+ else if (ARG_TYPE(0) == TYPE::SPELL && ARG_TYPE(1) == TYPE::SPELL)
+ RESULTINT = ARGSPELL(0) == ARGSPELL(1);
+ else if (ARG_TYPE(0) == TYPE::INVOCATION && ARG_TYPE(1) == TYPE::INVOCATION)
+ RESULTINT = ARGINVOCATION(0) == ARGINVOCATION(1);
else
{
- intify (&args[0]);
- intify (&args[1]);
- RESULTINT = ARGINT (0) == ARGINT (1);
+ intify(&args[0]);
+ intify(&args[1]);
+ RESULTINT = ARGINT(0) == ARGINT(1);
}
return 0;
}
-static int fun_bitand (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_bitand(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGINT (0) & ARGINT (1);
+ RESULTINT = ARGINT(0) & ARGINT(1);
return 0;
}
-static int fun_bitor (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_bitor(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGINT (0) | ARGINT (1);
+ RESULTINT = ARGINT(0) | ARGINT(1);
return 0;
}
-static int fun_bitxor (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_bitxor(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGINT (0) ^ ARGINT (1);
+ RESULTINT = ARGINT(0) ^ ARGINT(1);
return 0;
}
-static int fun_bitshl (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_bitshl(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGINT (0) << ARGINT (1);
+ RESULTINT = ARGINT(0) << ARGINT(1);
return 0;
}
-static int fun_bitshr (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_bitshr(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGINT (0) >> ARGINT (1);
+ RESULTINT = ARGINT(0) >> ARGINT(1);
return 0;
}
-static int fun_max (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_max(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = MAX (ARGINT (0), ARGINT (1));
+ RESULTINT = max(ARGINT(0), ARGINT(1));
return 0;
}
-static int fun_min (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_min(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = MIN (ARGINT (0), ARGINT (1));
+ RESULTINT = min(ARGINT(0), ARGINT(1));
return 0;
}
-static int
-fun_if_then_else (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_if_then_else(env_t *, int, val_t *result, val_t *args)
{
- if (ARGINT (0))
- magic_copy_var (result, &args[1]);
+ if (ARGINT(0))
+ magic_copy_var(result, &args[1]);
else
- magic_copy_var (result, &args[2]);
+ magic_copy_var(result, &args[2]);
return 0;
}
-void
-magic_area_rect (int *m, int *x, int *y, int *width, int *height,
- area_t * area)
+void magic_area_rect(int *m, int *x, int *y, int *width, int *height,
+ area_t *area)
{
switch (area->ty)
{
- case AREA_UNION:
+ case AREA::UNION:
break;
- case AREA_LOCATION:
+ case AREA::LOCATION:
*m = area->a.a_loc.m;
*x = area->a.a_loc.x;
*y = area->a.a_loc.y;
@@ -460,7 +487,7 @@ magic_area_rect (int *m, int *x, int *y, int *width, int *height,
*height = 1;
break;
- case AREA_RECT:
+ case AREA::RECT:
*m = area->a.a_rect.loc.m;
*x = area->a.a_rect.loc.x;
*y = area->a.a_rect.loc.y;
@@ -468,38 +495,38 @@ magic_area_rect (int *m, int *x, int *y, int *width, int *height,
*height = area->a.a_rect.height;
break;
- case AREA_BAR:
+ case AREA::BAR:
{
- int tx = area->a.a_bar.loc.x;
- int ty = area->a.a_bar.loc.y;
- int twidth = area->a.a_bar.width;
- int tdepth = area->a.a_bar.width;
+ int tx = area->a.a_bar.loc.x;
+ int ty = area->a.a_bar.loc.y;
+ int twidth = area->a.a_bar.width;
+ int tdepth = area->a.a_bar.width;
*m = area->a.a_bar.loc.m;
switch (area->a.a_bar.dir)
{
- case DIR_S:
+ case DIR::S:
*x = tx - twidth;
*y = ty;
*width = twidth * 2 + 1;
*height = tdepth;
break;
- case DIR_W:
+ case DIR::W:
*x = tx - tdepth;
*y = ty - twidth;
*width = tdepth;
*height = twidth * 2 + 1;
break;
- case DIR_N:
+ case DIR::N:
*x = tx - twidth;
*y = ty - tdepth;
*width = twidth * 2 + 1;
*height = tdepth;
break;
- case DIR_E:
+ case DIR::E:
*x = tx;
*y = ty - twidth;
*width = tdepth;
@@ -507,7 +534,7 @@ magic_area_rect (int *m, int *x, int *y, int *width, int *height,
break;
default:
- fprintf (stderr,
+ FPRINTF(stderr,
"Error: Trying to compute area of NE/SE/NW/SW-facing bar");
*x = tx;
*y = ty;
@@ -518,124 +545,162 @@ magic_area_rect (int *m, int *x, int *y, int *width, int *height,
}
}
-int magic_location_in_area (int m, int x, int y, area_t * area)
+int magic_location_in_area(int m, int x, int y, area_t *area)
{
switch (area->ty)
{
- case AREA_UNION:
- return magic_location_in_area (m, x, y, area->a.a_union[0])
- || magic_location_in_area (m, x, y, area->a.a_union[1]);
- case AREA_LOCATION:
- case AREA_RECT:
- case AREA_BAR:
+ case AREA::UNION:
+ return magic_location_in_area(m, x, y, area->a.a_union[0])
+ || magic_location_in_area(m, x, y, area->a.a_union[1]);
+ case AREA::LOCATION:
+ case AREA::RECT:
+ case AREA::BAR:
{
- int am;
- int ax, ay, awidth, aheight;
- magic_area_rect (&am, &ax, &ay, &awidth, &aheight, area);
+ int am;
+ int ax, ay, awidth, aheight;
+ magic_area_rect(&am, &ax, &ay, &awidth, &aheight, area);
return (am == m
&& (x >= ax) && (y >= ay)
&& (x < ax + awidth) && (y < ay + aheight));
}
default:
- fprintf (stderr, "INTERNAL ERROR: Invalid area\n");
+ FPRINTF(stderr, "INTERNAL ERROR: Invalid area\n");
return 0;
}
}
-static int fun_is_in (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_is_in(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = magic_location_in_area (ARGLOCATION (0).m,
- ARGLOCATION (0).x,
- ARGLOCATION (0).y, ARGAREA (1));
+ RESULTINT = magic_location_in_area(ARGLOCATION(0).m,
+ ARGLOCATION(0).x,
+ ARGLOCATION(0).y, ARGAREA(1));
return 0;
}
-static int fun_skill (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_skill(env_t *, int, val_t *result, val_t *args)
{
- if (ETY (0) != BL_PC
- || ARGINT (1) < 0
- || ARGINT (1) >= MAX_SKILL
- || ARGPC (0)->status.skill[ARGINT (1)].id != ARGINT (1))
+ if (ENTITY_TYPE(0) != BL::PC
+ // don't convert to enum until after the range check
+ || ARGINT(1) < 0
+ || ARGINT(1) >= uint16_t(MAX_SKILL))
+ {
RESULTINT = 0;
+ }
else
- RESULTINT = ARGPC (0)->status.skill[ARGINT (1)].lv;
+ {
+ SkillID id = static_cast<SkillID>(ARGINT(1));
+ RESULTINT = ARGPC(0)->status.skill[id].lv;
+ }
return 0;
}
-static int
-fun_has_shroud (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_has_shroud(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = (ETY (0) == BL_PC && ARGPC (0)->state.shroud_active);
+ RESULTINT = (ENTITY_TYPE(0) == BL::PC && ARGPC(0)->state.shroud_active);
return 0;
}
-#define BATTLE_GETTER(name) static int fun_get_##name(env_t *env, int args_nr, val_t *result, val_t *args) { RESULTINT = battle_get_##name(ARGENTITY(0)); return 0; }
-
-BATTLE_GETTER (str);
-BATTLE_GETTER (agi);
-BATTLE_GETTER (vit);
-BATTLE_GETTER (dex);
-BATTLE_GETTER (luk);
-BATTLE_GETTER (int);
-BATTLE_GETTER (lv);
-BATTLE_GETTER (hp);
-BATTLE_GETTER (mdef);
-BATTLE_GETTER (def);
-BATTLE_GETTER (max_hp);
-BATTLE_GETTER (dir);
+#define BATTLE_GETTER(name) \
+static \
+int fun_get_##name(env_t *, int, val_t *result, val_t *args) \
+{ \
+ RESULTINT = battle_get_##name(ARGENTITY(0)); \
+ return 0; \
+}
+
+BATTLE_GETTER(str)
+BATTLE_GETTER(agi)
+BATTLE_GETTER(vit)
+BATTLE_GETTER(dex)
+BATTLE_GETTER(luk)
+BATTLE_GETTER(int)
+BATTLE_GETTER(lv)
+BATTLE_GETTER(hp)
+BATTLE_GETTER(mdef)
+BATTLE_GETTER(def)
+BATTLE_GETTER(max_hp)
+static
+int fun_get_dir(env_t *, int, val_t *result, val_t *args)
+{
+ RESULTDIR = battle_get_dir(ARGENTITY(0));
+ return 0;
+}
-#define MMO_GETTER(name) static int fun_get_##name(env_t *env, int args_nr, val_t *result, val_t *args) { \
- if (ETY(0) == BL_PC) \
- RESULTINT = ARGPC(0)->status.name; \
- else \
- RESULTINT = 0; \
- return 0; }
+#define MMO_GETTER(name) \
+static \
+int fun_get_##name(env_t *, int, val_t *result, val_t *args) \
+{ \
+ if (ENTITY_TYPE(0) == BL::PC) \
+ RESULTINT = ARGPC(0)->status.name; \
+ else \
+ RESULTINT = 0; \
+ return 0; \
+}
-MMO_GETTER (sp);
-MMO_GETTER (max_sp);
+MMO_GETTER(sp)
+MMO_GETTER(max_sp)
-static int
-fun_name_of (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_name_of(env_t *, int, val_t *result, val_t *args)
{
- if (TY (0) == TY_ENTITY)
+ if (ARG_TYPE(0) == TYPE::ENTITY)
{
- RESULTSTR = strdup (show_entity (ARGENTITY (0)));
+ RESULTSTR = strdup(show_entity(ARGENTITY(0)));
return 0;
}
- else if (TY (0) == TY_SPELL)
+ else if (ARG_TYPE(0) == TYPE::SPELL)
{
- RESULTSTR = strdup (ARGSPELL (0)->name);
+ RESULTSTR = strdup(ARGSPELL(0)->name);
return 0;
}
- else if (TY (0) == TY_INVOCATION)
+ else if (ARG_TYPE(0) == TYPE::INVOCATION)
{
- RESULTSTR = strdup (ARGINVOCATION (0)->spell->name);
+ RESULTSTR = strdup(ARGINVOCATION(0)->spell->name);
return 0;
}
return 1;
}
/* [Freeyorp] I'm putting this one in as name_of seems to have issues with summoned or spawned mobs. */
-static int
-fun_mob_id (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_mob_id(env_t *, int, val_t *result, val_t *args)
{
- if (ETY (0) != BL_MOB) return 1;
- RESULTINT = ((struct mob_data *) (ARGENTITY(0)))->mob_class;
+ if (ENTITY_TYPE(0) != BL::MOB)
+ return 1;
+ RESULTINT = ((struct mob_data *)(ARGENTITY(0)))->mob_class;
return 0;
}
-#define COPY_LOCATION(dest, src) (dest).x = (src).x; (dest).y = (src).y; (dest).m = (src).m;
+inline
+void COPY_LOCATION(entity_t& dest, location_t& src)
+{
+ dest.x = src.x;
+ dest.y = src.y;
+ dest.m = src.m;
+}
+
+inline
+void COPY_LOCATION(location_t& dest, entity_t& src)
+{
+ dest.x = src.x;
+ dest.y = src.y;
+ dest.m = src.m;
+}
-static int
-fun_location (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_location(env_t *, int, val_t *result, val_t *args)
{
- COPY_LOCATION (RESULTLOCATION, *(ARGENTITY (0)));
+ COPY_LOCATION(RESULTLOCATION, *(ARGENTITY(0)));
return 0;
}
-static int fun_random (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_random(env_t *, int, val_t *result, val_t *args)
{
- int delta = ARGINT (0);
+ int delta = ARGINT(0);
if (delta < 0)
delta = -delta;
if (delta == 0)
@@ -643,94 +708,98 @@ static int fun_random (env_t * env, int args_nr, val_t * result, val_t * args)
RESULTINT = 0;
return 0;
}
- RESULTINT = MRAND (delta);
+ RESULTINT = random_::to(delta);
- if (ARGINT (0) < 0)
+ if (ARGINT(0) < 0)
RESULTINT = -RESULTINT;
return 0;
}
-static int
-fun_random_dir (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_random_dir(env_t *, int, val_t *result, val_t *args)
{
- if (ARGINT (0))
- RESULTDIR = mt_random () & 0x7;
+ if (ARGINT(0))
+ RESULTDIR = random_::choice({DIR::S, DIR::SW, DIR::W, DIR::NW, DIR::N, DIR::NE, DIR::E, DIR::SE});
else
- RESULTDIR = (mt_random () & 0x3) * 2;
+ RESULTDIR = random_::choice({DIR::S, DIR::W, DIR::N, DIR::E});
return 0;
}
-static int
-fun_hash_entity (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_hash_entity(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGENTITY (0)->id;
+ RESULTINT = ARGENTITY(0)->id;
return 0;
}
-int // ret -1: not a string, ret 1: no such item, ret 0: OK
-magic_find_item (val_t * args, int index, struct item *item, int *stackable)
+int // ret -1: not a string, ret 1: no such item, ret 0: OK
+magic_find_item(val_t *args, int index, struct item *item, int *stackable)
{
struct item_data *item_data;
- int must_add_sequentially;
+ int must_add_sequentially;
- if (TY (index) == TY_INT)
- item_data = itemdb_exists (ARGINT (index));
- else if (TY (index) == TY_STRING)
- item_data = itemdb_searchname (ARGSTR (index));
+ if (ARG_TYPE(index) == TYPE::INT)
+ item_data = itemdb_exists(ARGINT(index));
+ else if (ARG_TYPE(index) == TYPE::STRING)
+ item_data = itemdb_searchname(ARGSTR(index));
else
return -1;
if (!item_data)
return 1;
- must_add_sequentially = (item_data->type == 4 || item_data->type == 5 || item_data->type == 7 || item_data->type == 8); /* Very elegant. */
+ // Very elegant.
+ must_add_sequentially = (
+ item_data->type == ItemType::WEAPON
+ || item_data->type == ItemType::ARMOR
+ || item_data->type == ItemType::_7
+ || item_data->type == ItemType::_8);
if (stackable)
*stackable = !must_add_sequentially;
- memset (item, 0, sizeof (struct item));
+ memset(item, 0, sizeof(struct item));
item->nameid = item_data->nameid;
item->identify = 1;
return 0;
}
-static int
-fun_count_item (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_count_item(env_t *, int, val_t *result, val_t *args)
{
- character_t *chr = (ETY (0) == BL_PC) ? ARGPC (0) : NULL;
- int stackable;
+ character_t *chr = (ENTITY_TYPE(0) == BL::PC) ? ARGPC(0) : NULL;
+ int stackable;
struct item item;
- GET_ARG_ITEM (1, item, stackable);
+ GET_ARG_ITEM(1, item, stackable);
if (!chr)
return 1;
- RESULTINT = pc_count_all_items (chr, item.nameid);
+ RESULTINT = pc_count_all_items(chr, item.nameid);
return 0;
}
-static int
-fun_is_equipped (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_is_equipped(env_t *, int, val_t *result, val_t *args)
{
- character_t *chr = (ETY (0) == BL_PC) ? ARGPC (0) : NULL;
- int stackable;
+ character_t *chr = (ENTITY_TYPE(0) == BL::PC) ? ARGPC(0) : NULL;
+ int stackable;
struct item item;
- int i;
- int retval = 0;
+ bool retval = false;
- GET_ARG_ITEM (1, item, stackable);
+ GET_ARG_ITEM(1, item, stackable);
if (!chr)
return 1;
- for (i = 0; i < 11; i++)
+ for (EQUIP i : EQUIPs)
if (chr->equip_index[i] >= 0
&& chr->status.inventory[chr->equip_index[i]].nameid ==
item.nameid)
{
- retval = i + 1;
+ retval = true;
break;
}
@@ -738,48 +807,51 @@ fun_is_equipped (env_t * env, int args_nr, val_t * result, val_t * args)
return 0;
}
-static int
-fun_is_married (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_is_married(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = (ETY (0) == BL_PC && ARGPC (0)->status.partner_id);
+ RESULTINT = (ENTITY_TYPE(0) == BL::PC && ARGPC(0)->status.partner_id);
return 0;
}
-static int
-fun_is_dead (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_is_dead(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = (ETY (0) == BL_PC && pc_isdead (ARGPC (0)));
+ RESULTINT = (ENTITY_TYPE(0) == BL::PC && pc_isdead(ARGPC(0)));
return 0;
}
-static int fun_is_pc (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_is_pc(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = (ETY (0) == BL_PC);
+ RESULTINT = (ENTITY_TYPE(0) == BL::PC);
return 0;
}
-static int
-fun_partner (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_partner(env_t *, int, val_t *result, val_t *args)
{
- if (ETY (0) == BL_PC && ARGPC (0)->status.partner_id)
+ if (ENTITY_TYPE(0) == BL::PC && ARGPC(0)->status.partner_id)
{
RESULTENTITY =
(entity_t *)
- map_nick2sd (map_charid2nick (ARGPC (0)->status.partner_id));
+ map_nick2sd(map_charid2nick(ARGPC(0)->status.partner_id));
return 0;
}
else
return 1;
}
-static int
-fun_awayfrom (env_t * env, int args_nr, val_t * result, val_t * args)
-{
- location_t *loc = &ARGLOCATION (0);
- int dx = heading_x[ARGDIR (1)];
- int dy = heading_y[ARGDIR (1)];
- int distance = ARGINT (2);
- while (distance-- && !map_is_solid (loc->m, loc->x + dx, loc->y + dy))
+static
+int fun_awayfrom(env_t *, int, val_t *result, val_t *args)
+{
+ location_t *loc = &ARGLOCATION(0);
+ int dx = dirx[ARGDIR(1)];
+ int dy = diry[ARGDIR(1)];
+ int distance = ARGINT(2);
+ while (distance--
+ && !bool(read_gat(loc->m, loc->x + dx, loc->y + dy)
+ & MapCell::UNWALKABLE))
{
loc->x += dx;
loc->y += dy;
@@ -789,101 +861,104 @@ fun_awayfrom (env_t * env, int args_nr, val_t * result, val_t * args)
return 0;
}
-static int fun_failed (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_failed(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = TY (0) == TY_FAIL;
+ RESULTINT = ARG_TYPE(0) == TYPE::FAIL;
return 0;
}
-static int fun_npc (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_npc(env_t *, int, val_t *result, val_t *args)
{
- RESULTENTITY = (entity_t *) npc_name2id (ARGSTR (0));
+ RESULTENTITY = (entity_t *) npc_name2id(ARGSTR(0));
return RESULTENTITY == NULL;
}
-static int fun_pc (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_pc(env_t *, int, val_t *result, val_t *args)
{
- RESULTENTITY = (entity_t *) map_nick2sd (ARGSTR (0));
+ RESULTENTITY = (entity_t *) map_nick2sd(ARGSTR(0));
return RESULTENTITY == NULL;
}
-static int
-fun_distance (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_distance(env_t *, int, val_t *result, val_t *args)
{
- if (ARGLOCATION (0).m != ARGLOCATION (1).m)
- RESULTINT = INT_MAX;
+ if (ARGLOCATION(0).m != ARGLOCATION(1).m)
+ RESULTINT = 0x7fffffff;
else
- RESULTINT = MAX (abs (ARGLOCATION (0).x - ARGLOCATION (1).x),
- abs (ARGLOCATION (0).y - ARGLOCATION (1).y));
+ RESULTINT = max(abs(ARGLOCATION(0).x - ARGLOCATION(1).x),
+ abs(ARGLOCATION(0).y - ARGLOCATION(1).y));
return 0;
}
-static int
-fun_rdistance (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_rdistance(env_t *, int, val_t *result, val_t *args)
{
- if (ARGLOCATION (0).m != ARGLOCATION (1).m)
- RESULTINT = INT_MAX;
+ if (ARGLOCATION(0).m != ARGLOCATION(1).m)
+ RESULTINT = 0x7fffffff;
else
{
- int dx = ARGLOCATION (0).x - ARGLOCATION (1).x;
- int dy = ARGLOCATION (0).y - ARGLOCATION (1).y;
- RESULTINT = (int) (sqrt ((dx * dx) + (dy * dy)));
+ int dx = ARGLOCATION(0).x - ARGLOCATION(1).x;
+ int dy = ARGLOCATION(0).y - ARGLOCATION(1).y;
+ RESULTINT = (int)(sqrt((dx * dx) + (dy * dy)));
}
return 0;
}
-static int fun_anchor (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_anchor(env_t *env, int, val_t *result, val_t *args)
{
- teleport_anchor_t *anchor = magic_find_anchor (ARGSTR (0));
+ teleport_anchor_t *anchor = magic_find_anchor(ARGSTR(0));
if (!anchor)
return 1;
- magic_eval (env, result, anchor->location);
+ magic_eval(env, result, anchor->location);
- make_area (result);
- if (result->ty != TY_AREA)
+ make_area(result);
+ if (result->ty != TYPE::AREA)
{
- magic_clear_var (result);
+ magic_clear_var(result);
return 1;
}
return 0;
}
-static int
-fun_line_of_sight (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_line_of_sight(env_t *, int, val_t *result, val_t *args)
{
entity_t e1, e2;
- COPY_LOCATION (e1, ARGLOCATION (0));
- COPY_LOCATION (e2, ARGLOCATION (1));
+ COPY_LOCATION(e1, ARGLOCATION(0));
+ COPY_LOCATION(e2, ARGLOCATION(1));
- RESULTINT = battle_check_range (&e1, &e2, 0);
+ RESULTINT = battle_check_range(&e1, &e2, 0);
return 0;
}
-void magic_random_location (location_t * dest, area_t * area)
+void magic_random_location(location_t *dest, area_t *area)
{
switch (area->ty)
{
- case AREA_UNION:
+ case AREA::UNION:
{
- int rv = MRAND (area->size);
- if (rv < area->a.a_union[0]->size)
- magic_random_location (dest, area->a.a_union[0]);
+ if (random_::chance({area->a.a_union[0]->size, area->size}))
+ magic_random_location(dest, area->a.a_union[0]);
else
- magic_random_location (dest, area->a.a_union[1]);
+ magic_random_location(dest, area->a.a_union[1]);
break;
}
- case AREA_LOCATION:
- case AREA_RECT:
- case AREA_BAR:
+ case AREA::LOCATION:
+ case AREA::RECT:
+ case AREA::BAR:
{
- int m, x, y, w, h;
- magic_area_rect (&m, &x, &y, &w, &h, area);
+ int m, x, y, w, h;
+ magic_area_rect(&m, &x, &y, &w, &h, area);
if (w <= 1)
w = 1;
@@ -891,73 +966,49 @@ void magic_random_location (location_t * dest, area_t * area)
if (h <= 1)
h = 1;
- x += MRAND (w);
- y += MRAND (h);
-
- if (!map_is_solid (m, x, y))
- {
- int start_x = x;
- int start_y = y;
- int i;
- int initial_dir = mt_random () & 0x7;
- int dir = initial_dir;
-
- /* try all directions, up to a distance to 10, for a free slot */
- do
- {
- x = start_x;
- y = start_y;
-
- for (i = 0; i < 10 && map_is_solid (m, x, y); i++)
- {
- x += heading_x[dir];
- y += heading_y[dir];
- }
-
- dir = (dir + 1) & 0x7;
- }
- while (map_is_solid (m, x, y) && dir != initial_dir);
-
- }
- /* We've tried our best. If the map is still solid, the engine will automatically randomise the target location if we try to warp. */
+ // This is not exactly the same as the old logic,
+ // but it's better.
+ auto pair = map_randfreecell(m, x, y, w, h);
dest->m = m;
- dest->x = x;
- dest->y = y;
+ dest->x = pair.first;
+ dest->y = pair.second;
break;
}
default:
- fprintf (stderr, "Unknown area type %d\n", area->ty);
+ FPRINTF(stderr, "Unknown area type %d\n",
+ area->ty);
}
}
-static int
-fun_pick_location (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_pick_location(env_t *, int, val_t *result, val_t *args)
{
- magic_random_location (&result->v.v_location, ARGAREA (0));
+ magic_random_location(&result->v.v_location, ARGAREA(0));
return 0;
}
-static int
-fun_read_script_int (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_read_script_int(env_t *, int, val_t *result, val_t *args)
{
- entity_t *subject_p = ARGENTITY (0);
- char *var_name = ARGSTR (1);
+ entity_t *subject_p = ARGENTITY(0);
+ char *var_name = ARGSTR(1);
- if (subject_p->type != BL_PC)
+ if (subject_p->type != BL::PC)
return 1;
- RESULTINT = pc_readglobalreg ((character_t *) subject_p, var_name);
+ RESULTINT = pc_readglobalreg((character_t *) subject_p, var_name);
return 0;
}
-static int fun_rbox (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_rbox(env_t *, int, val_t *result, val_t *args)
{
- location_t loc = ARGLOCATION (0);
- int radius = ARGINT (1);
+ location_t loc = ARGLOCATION(0);
+ int radius = ARGINT(1);
- RESULTAREA = area_new (AREA_RECT);
+ RESULTAREA = area_new(AREA::RECT);
RESULTAREA->a.a_rect.loc.m = loc.m;
RESULTAREA->a.a_rect.loc.x = loc.x - radius;
RESULTAREA->a.a_rect.loc.y = loc.y - radius;
@@ -967,79 +1018,83 @@ static int fun_rbox (env_t * env, int args_nr, val_t * result, val_t * args)
return 0;
}
-static int
-fun_running_status_update (env_t * env, int args_nr, val_t * result,
- val_t * args)
+static
+int fun_running_status_update(env_t *, int, val_t *result, val_t *args)
{
- if (ETY (0) != BL_PC && ETY (0) != BL_MOB)
+ if (ENTITY_TYPE(0) != BL::PC && ENTITY_TYPE(0) != BL::MOB)
return 1;
- RESULTINT = battle_get_sc_data (ARGENTITY (0))[ARGINT (1)].timer != -1;
+ StatusChange sc = StatusChange(ARGINT(1));
+ RESULTINT = bool(battle_get_sc_data(ARGENTITY(0))[sc].timer);
return 0;
}
-static int
-fun_status_option (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_status_option(env_t *, int, val_t *result, val_t *args)
{
RESULTINT =
- ((((struct map_session_data *) ARGENTITY (0))->
- status.option & ARGINT (0)) != 0);
+ (bool(((struct map_session_data *) ARGENTITY(0))->
+ status.option & Option(ARGINT(0))));
return 0;
}
-static int
-fun_element (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_element(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = battle_get_element (ARGENTITY (0)) % 10;
+ RESULTINT = static_cast<int>(battle_get_element(ARGENTITY(0)).element);
return 0;
}
-static int
-fun_element_level (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_element_level(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = battle_get_element (ARGENTITY (0)) / 10;
+ RESULTINT = battle_get_element(ARGENTITY(0)).level;
return 0;
}
-static int fun_index (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_index(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = ARGSPELL (0)->index;
+ RESULTINT = ARGSPELL(0)->index;
return 0;
}
-static int
-fun_is_exterior (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_is_exterior(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = map[ARGLOCATION (0).m].name[4] == '1';
+ RESULTINT = map[ARGLOCATION(0).m].name[4] == '1';
return 0;
}
-static int
-fun_contains_string (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_contains_string(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = NULL != strstr (ARGSTR (0), ARGSTR (1));
+ RESULTINT = NULL != strstr(ARGSTR(0), ARGSTR(1));
return 0;
}
-static int fun_strstr (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_strstr(env_t *, int, val_t *result, val_t *args)
{
- char *offset = strstr (ARGSTR (0), ARGSTR (1));
- RESULTINT = offset - ARGSTR (0);
+ char *offset = strstr(ARGSTR(0), ARGSTR(1));
+ RESULTINT = offset - ARGSTR(0);
return offset == NULL;
}
-static int fun_strlen (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_strlen(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = strlen (ARGSTR (0));
+ RESULTINT = strlen(ARGSTR(0));
return 0;
}
-static int fun_substr (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_substr(env_t *, int, val_t *result, val_t *args)
{
- const char *src = ARGSTR (0);
- const int slen = strlen (src);
- int offset = ARGINT (1);
- int len = ARGINT (2);
+ const char *src = ARGSTR(0);
+ const int slen = strlen(src);
+ int offset = ARGINT(1);
+ int len = ARGINT(2);
if (len < 0)
len = 0;
@@ -1052,57 +1107,59 @@ static int fun_substr (env_t * env, int args_nr, val_t * result, val_t * args)
if (offset + len > slen)
len = slen - offset;
- RESULTSTR = (char *) calloc (1, 1 + len);
- memcpy (RESULTSTR, src + offset, len);
+ RESULTSTR = (char *) calloc(1, 1 + len);
+ memcpy(RESULTSTR, src + offset, len);
return 0;
}
-static int fun_sqrt (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_sqrt(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = (int) sqrt (ARGINT (0));
+ RESULTINT = (int) sqrt(ARGINT(0));
return 0;
}
-static int
-fun_map_level (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_map_level(env_t *, int, val_t *result, val_t *args)
{
- RESULTINT = map[ARGLOCATION (0).m].name[4] - '0';
+ RESULTINT = map[ARGLOCATION(0).m].name[4] - '0';
return 0;
}
-static int fun_map_nr (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_map_nr(env_t *, int, val_t *result, val_t *args)
{
- const char *mapname = map[ARGLOCATION (0).m].name;
+ const char *mapname = map[ARGLOCATION(0).m].name;
RESULTINT = ((mapname[0] - '0') * 100)
+ ((mapname[1] - '0') * 10) + ((mapname[2] - '0'));
return 0;
}
-static int
-fun_dir_towards (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_dir_towards(env_t *, int, val_t *result, val_t *args)
{
- int dx;
- int dy;
+ int dx;
+ int dy;
- if (ARGLOCATION (0).m != ARGLOCATION (1).m)
+ if (ARGLOCATION(0).m != ARGLOCATION(1).m)
return 1;
- dx = ARGLOCATION (1).x - ARGLOCATION (0).x;
- dy = ARGLOCATION (1).y - ARGLOCATION (0).y;
+ dx = ARGLOCATION(1).x - ARGLOCATION(0).x;
+ dy = ARGLOCATION(1).y - ARGLOCATION(0).y;
- if (ARGINT (1))
+ if (ARGINT(1))
{
/* 8-direction mode */
- if (abs (dx) > abs (dy) * 2)
+ if (abs(dx) > abs(dy) * 2)
{ /* east or west */
if (dx < 0)
RESULTINT = 2 /* west */ ;
else
RESULTINT = 6 /* east */ ;
}
- else if (abs (dy) > abs (dx) * 2)
+ else if (abs(dy) > abs(dx) * 2)
{ /* north or south */
if (dy > 0)
RESULTINT = 0 /* south */ ;
@@ -1127,7 +1184,7 @@ fun_dir_towards (env_t * env, int args_nr, val_t * result, val_t * args)
else
{
/* 4-direction mode */
- if (abs (dx) > abs (dy))
+ if (abs(dx) > abs(dy))
{ /* east or west */
if (dx < 0)
RESULTINT = 2 /* west */ ;
@@ -1146,21 +1203,20 @@ fun_dir_towards (env_t * env, int args_nr, val_t * result, val_t * args)
return 0;
}
-static int
-fun_extract_healer_xp (env_t * env, int args_nr, val_t * result, val_t * args)
+static
+int fun_extract_healer_xp(env_t *, int, val_t *result, val_t *args)
{
- character_t *sd = (ETY (0) == BL_PC) ? ARGPC (0) : NULL;
+ character_t *sd = (ENTITY_TYPE(0) == BL::PC) ? ARGPC(0) : NULL;
if (!sd)
RESULTINT = 0;
else
- RESULTINT = pc_extract_healer_exp (sd, ARGINT (1));
+ RESULTINT = pc_extract_healer_exp(sd, ARGINT(1));
return 0;
}
-#define BATTLE_RECORD2(sname, name) { sname, "e", 'i', fun_get_##name }
-#define BATTLE_RECORD(name) BATTLE_RECORD2(#name, name)
-static fun_t functions[] = {
+static
+fun_t functions[] = {
{"+", "..", '.', fun_add},
{"-", "ii", 'i', fun_sub},
{"*", "ii", 'i', fun_mul},
@@ -1183,19 +1239,19 @@ static fun_t functions[] = {
{"is_in", "la", 'i', fun_is_in},
{"if_then_else", "i__", '_', fun_if_then_else},
{"skill", "ei", 'i', fun_skill},
- BATTLE_RECORD (str),
- BATTLE_RECORD (agi),
- BATTLE_RECORD (vit),
- BATTLE_RECORD (dex),
- BATTLE_RECORD (luk),
- BATTLE_RECORD (int),
- BATTLE_RECORD2 ("level", lv),
- BATTLE_RECORD (mdef),
- BATTLE_RECORD (def),
- BATTLE_RECORD (hp),
- BATTLE_RECORD (max_hp),
- BATTLE_RECORD (sp),
- BATTLE_RECORD (max_sp),
+ {"str", "e", 'i', fun_get_str},
+ {"agi", "e", 'i', fun_get_agi},
+ {"vit", "e", 'i', fun_get_vit},
+ {"dex", "e", 'i', fun_get_dex},
+ {"luk", "e", 'i', fun_get_luk},
+ {"int", "e", 'i', fun_get_int},
+ {"level", "e", 'i', fun_get_lv},
+ {"mdef", "e", 'i', fun_get_mdef},
+ {"def", "e", 'i', fun_get_def},
+ {"hp", "e", 'i', fun_get_hp},
+ {"max_hp", "e", 'i', fun_get_max_hp},
+ {"sp", "e", 'i', fun_get_sp},
+ {"max_sp", "e", 'i', fun_get_max_sp},
{"dir", "e", 'd', fun_get_dir},
{"name_of", ".", 's', fun_name_of},
{"mob_id", "e", 'i', fun_mob_id},
@@ -1239,17 +1295,19 @@ static fun_t functions[] = {
{NULL, NULL, '.', NULL}
};
-static int functions_are_sorted = 0;
+static
+int functions_are_sorted = 0;
static
-int compare_fun (const void *lhs, const void *rhs)
+int compare_fun(const void *lhs, const void *rhs)
{
- return strcmp (((fun_t *) lhs)->name, ((fun_t *) rhs)->name);
+ return strcmp(((const fun_t *) lhs)->name, ((const fun_t *) rhs)->name);
}
-fun_t *magic_get_fun (const char *name, int *index)
+fun_t *magic_get_fun(const char *name, int *index)
{
- static int functions_nr;
+ static
+int functions_nr;
fun_t *result;
fun_t key;
@@ -1261,12 +1319,12 @@ fun_t *magic_get_fun (const char *name, int *index)
++it;
functions_nr = it - functions;
- qsort (functions, functions_nr, sizeof (fun_t), compare_fun);
+ qsort(functions, functions_nr, sizeof(fun_t), compare_fun);
functions_are_sorted = 1;
}
key.name = name;
- result = (fun_t *) bsearch (&key, functions, functions_nr, sizeof (fun_t),
+ result = (fun_t *) bsearch(&key, functions, functions_nr, sizeof(fun_t),
compare_fun);
if (result && index)
@@ -1275,19 +1333,20 @@ fun_t *magic_get_fun (const char *name, int *index)
return result;
}
-static int // 1 on failure
-eval_location (env_t * env, location_t * dest, e_location_t * expr)
+static
+int // 1 on failure
+eval_location(env_t *env, location_t *dest, e_location_t *expr)
{
val_t m, x, y;
- magic_eval (env, &m, expr->m);
- magic_eval (env, &x, expr->x);
- magic_eval (env, &y, expr->y);
+ magic_eval(env, &m, expr->m);
+ magic_eval(env, &x, expr->x);
+ magic_eval(env, &y, expr->y);
- if (CHECK_TYPE (&m, TY_STRING)
- && CHECK_TYPE (&x, TY_INT) && CHECK_TYPE (&y, TY_INT))
+ if (CHECK_TYPE(&m, TYPE::STRING)
+ && CHECK_TYPE(&x, TYPE::INT) && CHECK_TYPE(&y, TYPE::INT))
{
- int map_id = map_mapname2mapid (m.v.v_string);
- magic_clear_var (&m);
+ int map_id = map_mapname2mapid(m.v.v_string);
+ magic_clear_var(&m);
if (map_id < 0)
return 1;
dest->m = map_id;
@@ -1297,36 +1356,37 @@ eval_location (env_t * env, location_t * dest, e_location_t * expr)
}
else
{
- magic_clear_var (&m);
- magic_clear_var (&x);
- magic_clear_var (&y);
+ magic_clear_var(&m);
+ magic_clear_var(&x);
+ magic_clear_var(&y);
return 1;
}
}
-static area_t *eval_area (env_t * env, e_area_t * expr)
+static
+area_t *eval_area(env_t *env, e_area_t *expr)
{
- area_t *area = (area_t *)malloc (sizeof (area_t));
+ area_t *area = (area_t *)malloc(sizeof(area_t));
area->ty = expr->ty;
switch (expr->ty)
{
- case AREA_LOCATION:
+ case AREA::LOCATION:
area->size = 1;
- if (eval_location (env, &area->a.a_loc, &expr->a.a_loc))
+ if (eval_location(env, &area->a.a_loc, &expr->a.a_loc))
{
- free (area);
+ free(area);
return NULL;
}
else
return area;
- case AREA_UNION:
+ case AREA::UNION:
{
- int i, fail = 0;
+ int i, fail = 0;
for (i = 0; i < 2; i++)
{
- area->a.a_union[i] = eval_area (env, expr->a.a_union[i]);
+ area->a.a_union[i] = eval_area(env, expr->a.a_union[i]);
if (!area->a.a_union[i])
fail = 1;
}
@@ -1336,152 +1396,153 @@ static area_t *eval_area (env_t * env, e_area_t * expr)
for (i = 0; i < 2; i++)
{
if (area->a.a_union[i])
- free_area (area->a.a_union[i]);
+ free_area(area->a.a_union[i]);
}
- free (area);
+ free(area);
return NULL;
}
area->size = area->a.a_union[0]->size + area->a.a_union[1]->size;
return area;
}
- case AREA_RECT:
+ case AREA::RECT:
{
val_t width, height;
- magic_eval (env, &width, expr->a.a_rect.width);
- magic_eval (env, &height, expr->a.a_rect.height);
+ magic_eval(env, &width, expr->a.a_rect.width);
+ magic_eval(env, &height, expr->a.a_rect.height);
area->a.a_rect.width = width.v.v_int;
area->a.a_rect.height = height.v.v_int;
- if (CHECK_TYPE (&width, TY_INT)
- && CHECK_TYPE (&height, TY_INT)
- && !eval_location (env, &(area->a.a_rect.loc),
+ if (CHECK_TYPE(&width, TYPE::INT)
+ && CHECK_TYPE(&height, TYPE::INT)
+ && !eval_location(env, &(area->a.a_rect.loc),
&expr->a.a_rect.loc))
{
area->size = area->a.a_rect.width * area->a.a_rect.height;
- magic_clear_var (&width);
- magic_clear_var (&height);
+ magic_clear_var(&width);
+ magic_clear_var(&height);
return area;
}
else
{
- free (area);
- magic_clear_var (&width);
- magic_clear_var (&height);
+ free(area);
+ magic_clear_var(&width);
+ magic_clear_var(&height);
return NULL;
}
}
- case AREA_BAR:
+ case AREA::BAR:
{
val_t width, depth, dir;
- magic_eval (env, &width, expr->a.a_bar.width);
- magic_eval (env, &depth, expr->a.a_bar.depth);
- magic_eval (env, &dir, expr->a.a_bar.dir);
+ magic_eval(env, &width, expr->a.a_bar.width);
+ magic_eval(env, &depth, expr->a.a_bar.depth);
+ magic_eval(env, &dir, expr->a.a_bar.dir);
area->a.a_bar.width = width.v.v_int;
area->a.a_bar.depth = depth.v.v_int;
- area->a.a_bar.dir = dir.v.v_int;
+ area->a.a_bar.dir = dir.v.v_dir;
- if (CHECK_TYPE (&width, TY_INT)
- && CHECK_TYPE (&depth, TY_INT)
- && CHECK_TYPE (&dir, TY_DIR)
- && !eval_location (env, &area->a.a_bar.loc,
+ if (CHECK_TYPE(&width, TYPE::INT)
+ && CHECK_TYPE(&depth, TYPE::INT)
+ && CHECK_TYPE(&dir, TYPE::DIR)
+ && !eval_location(env, &area->a.a_bar.loc,
&expr->a.a_bar.loc))
{
area->size =
(area->a.a_bar.width * 2 + 1) * area->a.a_bar.depth;
- magic_clear_var (&width);
- magic_clear_var (&depth);
- magic_clear_var (&dir);
+ magic_clear_var(&width);
+ magic_clear_var(&depth);
+ magic_clear_var(&dir);
return area;
}
else
{
- free (area);
- magic_clear_var (&width);
- magic_clear_var (&depth);
- magic_clear_var (&dir);
+ free(area);
+ magic_clear_var(&width);
+ magic_clear_var(&depth);
+ magic_clear_var(&dir);
return NULL;
}
}
default:
- fprintf (stderr, "INTERNAL ERROR: Unknown area type %d\n",
- area->ty);
- free (area);
+ FPRINTF(stderr, "INTERNAL ERROR: Unknown area type %d\n",
+ area->ty);
+ free(area);
return NULL;
}
}
-static int type_key (char ty_key)
+static
+TYPE type_key(char ty_key)
{
switch (ty_key)
{
case 'i':
- return TY_INT;
+ return TYPE::INT;
case 'd':
- return TY_DIR;
+ return TYPE::DIR;
case 's':
- return TY_STRING;
+ return TYPE::STRING;
case 'e':
- return TY_ENTITY;
+ return TYPE::ENTITY;
case 'l':
- return TY_LOCATION;
+ return TYPE::LOCATION;
case 'a':
- return TY_AREA;
+ return TYPE::AREA;
case 'S':
- return TY_SPELL;
+ return TYPE::SPELL;
case 'I':
- return TY_INVOCATION;
+ return TYPE::INVOCATION;
default:
- return -1;
+ return TYPE::NEGATIVE_1;
}
}
-int magic_signature_check (const char *opname, const char *funname, const char *signature,
- int args_nr, val_t * args, int line, int column)
+int magic_signature_check(const char *opname, const char *funname, const char *signature,
+ int args_nr, val_t *args, int line, int column)
{
- int i;
+ int i;
for (i = 0; i < args_nr; i++)
{
val_t *arg = &args[i];
char ty_key = signature[i];
- int ty = arg->ty;
- int desired_ty = type_key (ty_key);
+ TYPE ty = arg->ty;
+ TYPE desired_ty = type_key(ty_key);
- if (ty == TY_ENTITY)
+ if (ty == TYPE::ENTITY)
{
/* Dereference entities in preparation for calling function */
- arg->v.v_entity = map_id2bl (arg->v.v_int);
+ arg->v.v_entity = map_id2bl(arg->v.v_int);
if (!arg->v.v_entity)
- ty = arg->ty = TY_FAIL;
+ ty = arg->ty = TYPE::FAIL;
}
- else if (ty == TY_INVOCATION)
+ else if (ty == TYPE::INVOCATION)
{
- arg->v.v_invocation = (invocation_t *) map_id2bl (arg->v.v_int);
+ arg->v.v_invocation = (invocation_t *) map_id2bl(arg->v.v_int);
if (!arg->v.v_entity)
- ty = arg->ty = TY_FAIL;
+ ty = arg->ty = TYPE::FAIL;
}
if (!ty_key)
{
- fprintf (stderr,
+ FPRINTF(stderr,
"[magic-eval]: L%d:%d: Too many arguments (%d) to %s `%s'\n",
line, column, args_nr, opname, funname);
return 1;
}
- if (ty == TY_FAIL && ty_key != '_')
+ if (ty == TYPE::FAIL && ty_key != '_')
return 1; /* Fail `in a sane way': This is a perfectly permissible error */
- if (ty == desired_ty || desired_ty < 0 /* `dontcare' */ )
+ if (ty == desired_ty || desired_ty == TYPE::NEGATIVE_1)
continue;
- if (ty == TY_UNDEF)
+ if (ty == TYPE::UNDEF)
{
- fprintf (stderr,
+ FPRINTF(stderr,
"[magic-eval]: L%d:%d: Argument #%d to %s `%s' undefined\n",
line, column, i + 1, opname, funname);
return 1;
@@ -1490,20 +1551,20 @@ int magic_signature_check (const char *opname, const char *funname, const char *
/* If we are here, we have a type mismatch but no failure _yet_. Try to coerce. */
switch (desired_ty)
{
- case TY_INT:
- intify (arg);
+ case TYPE::INT:
+ intify(arg);
break; /* 100% success rate */
- case TY_STRING:
- stringify (arg, 1);
+ case TYPE::STRING:
+ stringify(arg, 1);
break; /* 100% success rate */
- case TY_AREA:
- make_area (arg);
+ case TYPE::AREA:
+ make_area(arg);
break; /* Only works for locations */
- case TY_LOCATION:
- make_location (arg);
+ case TYPE::LOCATION:
+ make_location(arg);
break; /* Only works for some areas */
- case TY_SPELL:
- make_spell (arg);
+ case TYPE::SPELL:
+ make_spell(arg);
break; /* Only works for still-active invocatoins */
default:
break; /* We'll fail right below */
@@ -1512,10 +1573,11 @@ int magic_signature_check (const char *opname, const char *funname, const char *
ty = arg->ty;
if (ty != desired_ty)
{ /* Coercion failed? */
- if (ty != TY_FAIL)
- fprintf (stderr,
+ if (ty != TYPE::FAIL)
+ FPRINTF(stderr,
"[magic-eval]: L%d:%d: Argument #%d to %s `%s' of incorrect type (%d)\n",
- line, column, i + 1, opname, funname, ty);
+ line, column, i + 1, opname, funname,
+ ty);
return 1;
}
}
@@ -1525,149 +1587,139 @@ int magic_signature_check (const char *opname, const char *funname, const char *
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow"
-void magic_eval (env_t * env, val_t * dest, expr_t * expr)
+void magic_eval(env_t *env, val_t *dest, expr_t *expr)
{
-#ifdef RECENT_GCC
#pragma GCC diagnostic pop
-#endif
switch (expr->ty)
{
- case EXPR_VAL:
- magic_copy_var (dest, &expr->e.e_val);
+ case EXPR::VAL:
+ magic_copy_var(dest, &expr->e.e_val);
break;
- case EXPR_LOCATION:
- if (eval_location (env, &dest->v.v_location, &expr->e.e_location))
- dest->ty = TY_FAIL;
+ case EXPR::LOCATION:
+ if (eval_location(env, &dest->v.v_location, &expr->e.e_location))
+ dest->ty = TYPE::FAIL;
else
- dest->ty = TY_LOCATION;
+ dest->ty = TYPE::LOCATION;
break;
- case EXPR_AREA:
- if ((dest->v.v_area = eval_area (env, &expr->e.e_area)))
- dest->ty = TY_AREA;
+ case EXPR::AREA:
+ if ((dest->v.v_area = eval_area(env, &expr->e.e_area)))
+ dest->ty = TYPE::AREA;
else
- dest->ty = TY_FAIL;
+ dest->ty = TYPE::FAIL;
break;
- case EXPR_FUNAPP:
+ case EXPR::FUNAPP:
{
val_t arguments[MAX_ARGS];
- int args_nr = expr->e.e_funapp.args_nr;
- int i;
+ int args_nr = expr->e.e_funapp.args_nr;
+ int i;
fun_t *f = functions + expr->e.e_funapp.id;
for (i = 0; i < args_nr; ++i)
- magic_eval (env, &arguments[i], expr->e.e_funapp.args[i]);
- if (magic_signature_check
- ("function", f->name, f->signature, args_nr, arguments,
+ magic_eval(env, &arguments[i], expr->e.e_funapp.args[i]);
+ if (magic_signature_check("function", f->name, f->signature, args_nr, arguments,
expr->e.e_funapp.line_nr, expr->e.e_funapp.column)
- || f->fun (env, args_nr, dest, arguments))
- dest->ty = TY_FAIL;
+ || f->fun(env, args_nr, dest, arguments))
+ dest->ty = TYPE::FAIL;
else
{
- int dest_ty = type_key (f->ret_ty);
- if (dest_ty != -1)
+ TYPE dest_ty = type_key(f->ret_ty);
+ if (dest_ty != TYPE::NEGATIVE_1)
dest->ty = dest_ty;
/* translate entity back into persistent int */
- if (dest->ty == TY_ENTITY)
+ if (dest->ty == TYPE::ENTITY)
{
if (dest->v.v_entity)
dest->v.v_int = dest->v.v_entity->id;
else
- dest->ty = TY_FAIL;
+ dest->ty = TYPE::FAIL;
}
}
for (i = 0; i < args_nr; ++i)
- magic_clear_var (&arguments[i]);
+ magic_clear_var(&arguments[i]);
break;
}
- case EXPR_ID:
+ case EXPR::ID:
{
- val_t v = VAR (expr->e.e_id);
- magic_copy_var (dest, &v);
+ val_t v = VAR(expr->e.e_id);
+ magic_copy_var(dest, &v);
break;
}
- case EXPR_SPELLFIELD:
+ case EXPR::SPELLFIELD:
{
val_t v;
- int id = expr->e.e_field.id;
- magic_eval (env, &v, expr->e.e_field.expr);
+ int id = expr->e.e_field.id;
+ magic_eval(env, &v, expr->e.e_field.expr);
- if (v.ty == TY_INVOCATION)
+ if (v.ty == TYPE::INVOCATION)
{
- invocation_t *t = (invocation_t *) map_id2bl (v.v.v_int);
+ invocation_t *t = (invocation_t *) map_id2bl(v.v.v_int);
if (!t)
- dest->ty = TY_UNDEF;
+ dest->ty = TYPE::UNDEF;
else
{
-#ifdef RECENT_GCC
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow"
-#endif
env_t *env = t->env;
-#ifdef RECENT_GCC
#pragma GCC diagnostic pop
-#endif
- val_t val = VAR (id);
- magic_copy_var (dest, &val);
+ val_t val = VAR(id);
+ magic_copy_var(dest, &val);
}
}
else
{
- fprintf (stderr,
+ FPRINTF(stderr,
"[magic] Attempt to access field %s on non-spell\n",
env->base_env->var_name[id]);
- dest->ty = TY_FAIL;
+ dest->ty = TYPE::FAIL;
}
break;
}
default:
- fprintf (stderr,
+ FPRINTF(stderr,
"[magic] INTERNAL ERROR: Unknown expression type %d\n",
expr->ty);
break;
}
}
-#ifndef RECENT_GCC
-#pragma GCC diagnostic pop
-#endif
-int magic_eval_int (env_t * env, expr_t * expr)
+int magic_eval_int(env_t *env, expr_t *expr)
{
val_t result;
- magic_eval (env, &result, expr);
+ magic_eval(env, &result, expr);
- if (result.ty == TY_FAIL || result.ty == TY_UNDEF)
+ if (result.ty == TYPE::FAIL || result.ty == TYPE::UNDEF)
return 0;
- intify (&result);
+ intify(&result);
return result.v.v_int;
}
-char *magic_eval_str (env_t * env, expr_t * expr)
+char *magic_eval_str(env_t *env, expr_t *expr)
{
val_t result;
- magic_eval (env, &result, expr);
+ magic_eval(env, &result, expr);
- if (result.ty == TY_FAIL || result.ty == TY_UNDEF)
- return strdup ("?");
+ if (result.ty == TYPE::FAIL || result.ty == TYPE::UNDEF)
+ return strdup("?");
- stringify (&result, 0);
+ stringify(&result, 0);
return result.v.v_string;
}
-expr_t *magic_new_expr (int ty)
+expr_t *magic_new_expr(EXPR ty)
{
- expr_t *expr = (expr_t *) malloc (sizeof (expr_t));
+ expr_t *expr = (expr_t *) malloc(sizeof(expr_t));
expr->ty = ty;
return expr;
}
diff --git a/src/map/magic-expr.hpp b/src/map/magic-expr.hpp
index 7a251df..419c833 100644
--- a/src/map/magic-expr.hpp
+++ b/src/map/magic-expr.hpp
@@ -1,18 +1,7 @@
#ifndef MAGIC_EXPR_HPP
#define MAGIC_EXPR_HPP
-#include "magic-interpreter.hpp"
-#include "magic-interpreter-aux.hpp"
-
-#ifndef MAX
-# define MAX(x,y) (((x)>(y)) ? (x) : (y))
-#endif
-#ifndef MIN
-# define MIN(x,y) (((x)<(y)) ? (x) : (y))
-#endif
-#ifndef INT_MAX
-# define INT_MAX (1<<30) // It's more than that, but this is quite sufficient for our purposes.
-#endif
+#include "magic-interpreter.hpp"
/*
* Argument types:
@@ -32,14 +21,14 @@ typedef struct fun
const char *name;
const char *signature;
char ret_ty;
- int (*fun) (env_t * env, int args_nr, val_t * result, val_t * args);
+ int(*fun)(env_t *env, int args_nr, val_t *result, val_t *args);
} fun_t;
typedef struct op
{
const char *name;
const char *signature;
- int (*op) (env_t * env, int args_nr, val_t * args);
+ int(*op)(env_t *env, int args_nr, val_t *args);
} op_t;
/**
@@ -47,49 +36,49 @@ typedef struct op
* @param name The name to look up
* @return A function of that name, or NULL, and a function index
*/
-fun_t *magic_get_fun (const char *name, int *index);
+fun_t *magic_get_fun(const char *name, int *index);
/**
* Retrieves an operation by name
* @param name The name to look up
* @return An operation of that name, or NULL, and a function index
*/
-op_t *magic_get_op (char *name, int *index);
+op_t *magic_get_op(char *name, int *index);
/**
* Evaluates an expression and stores the result in `dest'
*/
-void magic_eval (env_t * env, val_t * dest, expr_t * expr);
+void magic_eval(env_t *env, val_t *dest, expr_t *expr);
/**
* Evaluates an expression and coerces the result into an integer
*/
-int magic_eval_int (env_t * env, expr_t * expr);
+int magic_eval_int(env_t *env, expr_t *expr);
/**
* Evaluates an expression and coerces the result into a string
*/
-char *magic_eval_str (env_t * env, expr_t * expr);
-
-int map_is_solid (int m, int x, int y);
-
-expr_t *magic_new_expr (int ty);
-
-void magic_clear_var (val_t * v);
-
-void magic_copy_var (val_t * dest, val_t * src);
-
-void magic_random_location (location_t * dest, area_t * area);
+char *magic_eval_str(env_t *env, expr_t *expr);
-int // ret -1: not a string, ret 1: no such item, ret 0: OK
+expr_t *magic_new_expr(EXPR ty);
+void magic_clear_var(val_t *v);
+void magic_copy_var(val_t *dest, val_t *src);
+void magic_random_location(location_t *dest, area_t *area);
- magic_find_item (val_t * args, int index, struct item *item, int *stackable);
+// ret -1: not a string, ret 1: no such item, ret 0: OK
+int magic_find_item(val_t *args, int index, struct item *item, int *stackable);
-#define GET_ARG_ITEM(index, dest, stackable) switch(magic_find_item(args, index, &dest, &stackable)) { case -1 : return 1; case 1 : return 0; }
+#define GET_ARG_ITEM(index, dest, stackable) \
+ switch (magic_find_item(args, index, &dest, &stackable)) \
+ { \
+ case -1: return 1; \
+ case 1: return 0; \
+ default: break; \
+ }
-int magic_location_in_area (int m, int x, int y, area_t * area);
+int magic_location_in_area(int m, int x, int y, area_t *area);
-#endif /* !defined(MAGIC_EXPR_H_) */
+#endif // MAGIC_EXPR_HPP
diff --git a/src/map/magic-interpreter-aux.hpp b/src/map/magic-interpreter-aux.hpp
index ea05b88..4bb0a82 100644
--- a/src/map/magic-interpreter-aux.hpp
+++ b/src/map/magic-interpreter-aux.hpp
@@ -1,8 +1,18 @@
#ifndef MAGIC_INTERPRETER_AUX_HPP
#define MAGIC_INTERPRETER_AUX_HPP
-#define CHECK_TYPE(v, t) ((v)->ty == t)
+#include "magic-interpreter.t.hpp"
-#define VAR(i) ((!env->vars || env->vars[i].ty == TY_UNDEF)? env->base_env->vars[i] : env->vars[i])
+template<class T>
+bool CHECK_TYPE(T *v, TYPE t)
+{
+ return v->ty == t;
+}
-#endif /* !defined(MAGIC_INTERPRETER_AUX_H_) */
+// FIXME: macro capture!
+#define VAR(i) \
+ ((!env->vars || env->vars[i].ty == TYPE::UNDEF) \
+ ? env->base_env->vars[i] \
+ : env->vars[i])
+
+#endif // MAGIC_INTERPRETER_AUX_HPP
diff --git a/src/map/magic-interpreter-base.cpp b/src/map/magic-interpreter-base.cpp
index 0305192..26d75af 100644
--- a/src/map/magic-interpreter-base.cpp
+++ b/src/map/magic-interpreter-base.cpp
@@ -1,34 +1,49 @@
-#include "magic.hpp"
+#include "magic-interpreter-aux.hpp"
#include "magic-interpreter.hpp"
+
+#include "../common/cxxstdio.hpp"
+#include "../common/timer.hpp"
+
#include "magic-expr.hpp"
-#include "magic-interpreter-aux.hpp"
-static void set_int_p (val_t * v, int i, int t)
+#include "pc.hpp"
+
+#include "../poison.hpp"
+
+static
+void set_int_p(val_t *v, int i, TYPE t)
{
v->ty = t;
v->v.v_int = i;
}
-#define set_int(v, i) set_int_p(v, i, TY_INT)
-#define set_dir(v, i) set_int_p(v, i, TY_DIR)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-macros"
+
+#define set_int(v, i) set_int_p(v, i, TYPE::INT)
+#define set_dir(v, i) set_int_p(v, i, TYPE::DIR)
#define SETTER(tty, dyn_ty, field) (val_t *v, tty x) { v->ty = dyn_ty; v->v.field = x; }
-static void set_string SETTER (char *, TY_STRING, v_string);
+static
+void set_string SETTER(char *, TYPE::STRING, v_string)
-static void set_entity (val_t * v, entity_t * e)
+static
+void set_entity(val_t *v, entity_t *e)
{
- v->ty = TY_ENTITY;
+ v->ty = TYPE::ENTITY;
v->v.v_int = e->id;
}
-static void set_invocation (val_t * v, invocation_t * i)
+static
+void set_invocation(val_t *v, invocation_t *i)
{
- v->ty = TY_INVOCATION;
+ v->ty = TYPE::INVOCATION;
v->v.v_int = i->bl.id;
}
-static void set_spell SETTER (spell_t *, TY_SPELL, v_spell);
+static
+void set_spell SETTER(spell_t *, TYPE::SPELL, v_spell)
#define setenv(f, v, x) f(&(env->vars[v]), x)
@@ -41,29 +56,33 @@ static void set_spell SETTER (spell_t *, TY_SPELL, v_spell);
#define set_env_invocation(v, x) setenv(set_invocation, v, x)
#define set_env_spell(v, x) setenv(set_spell, v, x)
+#pragma GCC diagnostic pop
+
magic_conf_t magic_conf; /* Global magic conf */
env_t magic_default_env = { &magic_conf, NULL };
-static int spells_sorted = 0;
+static
+int spells_sorted = 0;
const char *magic_find_invocation(const char *spellname)
{
- int i;
+ int i;
- for (i = 0; i < abs (magic_conf.spells_nr); i++)
- if (!strcmp (magic_conf.spells[i]->name, spellname))
+ for (i = 0; i < abs(magic_conf.spells_nr); i++)
+ if (!strcmp(magic_conf.spells[i]->name, spellname))
return magic_conf.spells[i]->invocation;
return NULL;
}
-static int spell_compare (const void *lhs, const void *rhs)
+static
+int spell_compare(const void *lhs, const void *rhs)
{
- return strcmp ((*((spell_t **) lhs))->invocation,
- (*((spell_t **) rhs))->invocation);
+ return strcmp((*((const spell_t *const*) lhs))->invocation,
+ (*((const spell_t *const*) rhs))->invocation);
}
-spell_t *magic_find_spell (char *invocation)
+spell_t *magic_find_spell(char *invocation)
{
spell_t key;
spell_t *keyp = &key;
@@ -71,7 +90,7 @@ spell_t *magic_find_spell (char *invocation)
if (!spells_sorted)
{
- qsort (magic_conf.spells, magic_conf.spells_nr, sizeof (spell_t *),
+ qsort(magic_conf.spells, magic_conf.spells_nr, sizeof(spell_t *),
spell_compare);
spells_sorted = 1;
}
@@ -80,8 +99,8 @@ spell_t *magic_find_spell (char *invocation)
retval =
((spell_t **)
- bsearch (&keyp, magic_conf.spells, magic_conf.spells_nr,
- sizeof (spell_t *), spell_compare));
+ bsearch(&keyp, magic_conf.spells, magic_conf.spells_nr,
+ sizeof(spell_t *), spell_compare));
if (!retval)
return NULL;
@@ -93,24 +112,25 @@ spell_t *magic_find_spell (char *invocation)
/* Spell anchors */
/* -------------------------------------------------------------------------------- */
-static int compare_teleport_anchor (const void *lhs, const void *rhs)
+static
+int compare_teleport_anchor(const void *lhs, const void *rhs)
{
- return strcmp ((*((teleport_anchor_t **) lhs))->invocation,
- (*((teleport_anchor_t **) rhs))->invocation);
+ return strcmp((*((const teleport_anchor_t *const*) lhs))->invocation,
+ (*((const teleport_anchor_t *const*) rhs))->invocation);
}
const char *magic_find_anchor_invocation(const char *anchor_name)
{
- int i;
+ int i;
- for (i = 0; i < abs (magic_conf.anchors_nr); i++)
- if (!strcmp (magic_conf.anchors[i]->name, anchor_name))
+ for (i = 0; i < abs(magic_conf.anchors_nr); i++)
+ if (!strcmp(magic_conf.anchors[i]->name, anchor_name))
return magic_conf.anchors[i]->invocation;
return NULL;
}
-teleport_anchor_t *magic_find_anchor (char *name)
+teleport_anchor_t *magic_find_anchor(char *name)
{
teleport_anchor_t key;
teleport_anchor_t *keyp = &key;
@@ -118,17 +138,17 @@ teleport_anchor_t *magic_find_anchor (char *name)
if (magic_conf.anchors_nr > 0)
{ /* unsorted */
- qsort (magic_conf.anchors, magic_conf.anchors_nr,
- sizeof (teleport_anchor_t *), compare_teleport_anchor);
+ qsort(magic_conf.anchors, magic_conf.anchors_nr,
+ sizeof(teleport_anchor_t *), compare_teleport_anchor);
magic_conf.anchors_nr = -magic_conf.anchors_nr;
}
key.invocation = name;
- retval = (teleport_anchor_t **) bsearch (&keyp,
+ retval = (teleport_anchor_t **) bsearch(&keyp,
magic_conf.anchors,
-magic_conf.anchors_nr,
- sizeof (teleport_anchor_t *),
+ sizeof(teleport_anchor_t *),
compare_teleport_anchor);
if (!retval)
@@ -141,83 +161,86 @@ teleport_anchor_t *magic_find_anchor (char *name)
/* Spell guard checks */
/* -------------------------------------------------------------------------------- */
-static env_t *alloc_env (magic_conf_t * conf)
+static
+env_t *alloc_env(magic_conf_t *conf)
{
env_t *env;
- CREATE (env, env_t, 1);
- CREATE (env->vars, val_t, conf->vars_nr);
+ CREATE(env, env_t, 1);
+ CREATE(env->vars, val_t, conf->vars_nr);
env->base_env = conf;
return env;
}
-static env_t *clone_env (env_t * src)
+static
+env_t *clone_env(env_t *src)
{
- env_t *retval = alloc_env (src->base_env);
- int i;
+ env_t *retval = alloc_env(src->base_env);
+ int i;
for (i = 0; i < src->base_env->vars_nr; i++)
- magic_copy_var (&retval->vars[i], &src->vars[i]);
+ magic_copy_var(&retval->vars[i], &src->vars[i]);
return retval;
}
-void magic_free_env (env_t * env)
+void magic_free_env(env_t *env)
{
- int i;
+ int i;
for (i = 0; i < env->base_env->vars_nr; i++)
- magic_clear_var (&env->vars[i]);
- free (env);
+ magic_clear_var(&env->vars[i]);
+ free(env);
}
-env_t *spell_create_env (magic_conf_t * conf, spell_t * spell,
- character_t * caster, int spellpower, char *param)
+env_t *spell_create_env(magic_conf_t *conf, spell_t *spell,
+ character_t *caster, int spellpower, char *param)
{
- env_t *env = alloc_env (conf);
+ env_t *env = alloc_env(conf);
switch (spell->spellarg_ty)
{
- case SPELLARG_STRING:
- set_env_string (spell->arg, param);
+ case SPELLARG::STRING:
+ set_env_string(spell->arg, param);
break;
- case SPELLARG_PC:
+ case SPELLARG::PC:
{
- character_t *subject = map_nick2sd (param);
+ character_t *subject = map_nick2sd(param);
if (!subject)
subject = caster;
- set_env_entity (spell->arg, &subject->bl);
- free (param);
+ set_env_entity(spell->arg, &subject->bl);
+ free(param);
break;
}
- case SPELLARG_NONE:
- free (param);
+ case SPELLARG::NONE:
+ free(param);
break;
default:
- free (param);
- fprintf (stderr, "Unexpected spellarg type %d\n",
+ free(param);
+ FPRINTF(stderr, "Unexpected spellarg type %d\n",
spell->spellarg_ty);
}
- set_env_entity (VAR_CASTER, &caster->bl);
- set_env_int (VAR_SPELLPOWER, spellpower);
- set_env_spell (VAR_SPELL, spell);
+ set_env_entity(VAR_CASTER, &caster->bl);
+ set_env_int(VAR_SPELLPOWER, spellpower);
+ set_env_spell(VAR_SPELL, spell);
return env;
}
-static void free_components (component_t ** component_holder)
+static
+void free_components(component_t ** component_holder)
{
if (*component_holder == NULL)
return;
- free_components (&(*component_holder)->next);
- free (*component_holder);
+ free_components(&(*component_holder)->next);
+ free(*component_holder);
*component_holder = NULL;
}
-void magic_add_component (component_t ** component_holder, int id, int count)
+void magic_add_component(component_t ** component_holder, int id, int count)
{
if (count <= 0)
return;
@@ -225,7 +248,7 @@ void magic_add_component (component_t ** component_holder, int id, int count)
if (*component_holder == NULL)
{
component_t *component =
- (component_t *) malloc (sizeof (component_t));
+ (component_t *) malloc(sizeof(component_t));
component->next = NULL;
component->item_id = id;
component->count = count;
@@ -240,33 +263,35 @@ void magic_add_component (component_t ** component_holder, int id, int count)
return;
}
else
- magic_add_component (&component->next, id, count);
+ magic_add_component(&component->next, id, count);
/* Tail-recurse; gcc can optimise this. Not that it matters. */
}
}
-static void
-copy_components (component_t ** component_holder, component_t * component)
+static
+void copy_components(component_t ** component_holder, component_t *component)
{
if (component == NULL)
return;
- magic_add_component (component_holder, component->item_id,
+ magic_add_component(component_holder, component->item_id,
component->count);
- copy_components (component_holder, component->next);
+ copy_components(component_holder, component->next);
}
typedef struct spellguard_check
{
component_t *catalysts, *components;
- int mana, casttime;
+ int mana;
+ interval_t casttime;
} spellguard_check_t;
-static int check_prerequisites (character_t * caster, component_t * component)
+static
+int check_prerequisites(character_t *caster, component_t *component)
{
while (component)
{
- if (pc_count_all_items (caster, component->item_id)
+ if (pc_count_all_items(caster, component->item_id)
< component->count)
return 0; /* insufficient */
@@ -276,59 +301,51 @@ static int check_prerequisites (character_t * caster, component_t * component)
return 1;
}
-static void consume_components (character_t * caster, component_t * component)
+static
+void consume_components(character_t *caster, component_t *component)
{
while (component)
{
- pc_remove_items (caster, component->item_id, component->count);
+ pc_remove_items(caster, component->item_id, component->count);
component = component->next;
}
}
-static int
-spellguard_can_satisfy (spellguard_check_t * check, character_t * caster,
- env_t * env, int *near_miss)
+static
+int spellguard_can_satisfy(spellguard_check_t *check, character_t *caster,
+ env_t *env, int *near_miss)
{
- unsigned int tick = gettick ();
-
- int retval = check_prerequisites (caster, check->catalysts);
+ tick_t tick = gettick();
-/*
- fprintf(stderr, "MC(%d/%s)? %d%d%d%d (%u <= %u)\n",
- caster->bl.id, caster->status.name,
- retval,
- caster->cast_tick <= tick,
- check->mana <= caster->status.sp,
- check_prerequisites(caster, check->components),
- caster->cast_tick, tick);
-*/
+ int retval = check_prerequisites(caster, check->catalysts);
if (retval && near_miss)
*near_miss = 1; // close enough!
retval = retval && caster->cast_tick <= tick /* Hasn't cast a spell too recently */
&& check->mana <= caster->status.sp
- && check_prerequisites (caster, check->components);
+ && check_prerequisites(caster, check->components);
if (retval)
{
- unsigned int casttime = (unsigned int) check->casttime;
+ interval_t casttime = check->casttime;
- if (VAR (VAR_MIN_CASTTIME).ty == TY_INT)
- casttime = MAX (casttime, VAR (VAR_MIN_CASTTIME).v.v_int);
+ if (VAR(VAR_MIN_CASTTIME).ty == TYPE::INT)
+ casttime = max(casttime, static_cast<interval_t>(VAR(VAR_MIN_CASTTIME).v.v_int));
caster->cast_tick = tick + casttime; /* Make sure not to cast too frequently */
- consume_components (caster, check->components);
- pc_heal (caster, 0, -check->mana);
+ consume_components(caster, check->components);
+ pc_heal(caster, 0, -check->mana);
}
return retval;
}
-static effect_set_t *spellguard_check_sub (spellguard_check_t * check,
- spellguard_t * guard,
- character_t * caster, env_t * env,
+static
+effect_set_t *spellguard_check_sub(spellguard_check_t *check,
+ spellguard_t *guard,
+ character_t *caster, env_t *env,
int *near_miss)
{
if (guard == NULL)
@@ -336,20 +353,20 @@ static effect_set_t *spellguard_check_sub (spellguard_check_t * check,
switch (guard->ty)
{
- case SPELLGUARD_CONDITION:
- if (!magic_eval_int (env, guard->s.s_condition))
+ case SPELLGUARD::CONDITION:
+ if (!magic_eval_int(env, guard->s.s_condition))
return NULL;
break;
- case SPELLGUARD_COMPONENTS:
- copy_components (&check->components, guard->s.s_components);
+ case SPELLGUARD::COMPONENTS:
+ copy_components(&check->components, guard->s.s_components);
break;
- case SPELLGUARD_CATALYSTS:
- copy_components (&check->catalysts, guard->s.s_catalysts);
+ case SPELLGUARD::CATALYSTS:
+ copy_components(&check->catalysts, guard->s.s_catalysts);
break;
- case SPELLGUARD_CHOICE:
+ case SPELLGUARD::CHOICE:
{
spellguard_check_t altcheck = *check;
effect_set_t *retval;
@@ -357,57 +374,60 @@ static effect_set_t *spellguard_check_sub (spellguard_check_t * check,
altcheck.components = NULL;
altcheck.catalysts = NULL;
- copy_components (&altcheck.catalysts, check->catalysts);
- copy_components (&altcheck.components, check->components);
+ copy_components(&altcheck.catalysts, check->catalysts);
+ copy_components(&altcheck.components, check->components);
retval =
- spellguard_check_sub (&altcheck, guard->next, caster, env,
+ spellguard_check_sub(&altcheck, guard->next, caster, env,
near_miss);
- free_components (&altcheck.catalysts);
- free_components (&altcheck.components);
+ free_components(&altcheck.catalysts);
+ free_components(&altcheck.components);
if (retval)
return retval;
else
- return spellguard_check_sub (check, guard->s.s_alt, caster,
+ return spellguard_check_sub(check, guard->s.s_alt, caster,
env, near_miss);
}
- case SPELLGUARD_MANA:
- check->mana += magic_eval_int (env, guard->s.s_mana);
+ case SPELLGUARD::MANA:
+ check->mana += magic_eval_int(env, guard->s.s_mana);
break;
- case SPELLGUARD_CASTTIME:
- check->casttime += magic_eval_int (env, guard->s.s_mana);
+ case SPELLGUARD::CASTTIME:
+ check->casttime += static_cast<interval_t>(magic_eval_int(env, guard->s.s_mana));
break;
- case SPELLGUARD_EFFECT:
- if (spellguard_can_satisfy (check, caster, env, near_miss))
+ case SPELLGUARD::EFFECT:
+ if (spellguard_can_satisfy(check, caster, env, near_miss))
return &guard->s.s_effect;
else
return NULL;
default:
- fprintf (stderr, "Unexpected spellguard type %d\n", guard->ty);
+ FPRINTF(stderr, "Unexpected spellguard type %d\n",
+ guard->ty);
return NULL;
}
- return spellguard_check_sub (check, guard->next, caster, env, near_miss);
+ return spellguard_check_sub(check, guard->next, caster, env, near_miss);
}
-static effect_set_t *check_spellguard (spellguard_t * guard,
- character_t * caster, env_t * env,
+static
+effect_set_t *check_spellguard(spellguard_t *guard,
+ character_t *caster, env_t *env,
int *near_miss)
{
spellguard_check_t check;
effect_set_t *retval;
check.catalysts = NULL;
check.components = NULL;
- check.mana = check.casttime = 0;
+ check.mana = 0;
+ check.casttime = interval_t::zero();
- retval = spellguard_check_sub (&check, guard, caster, env, near_miss);
+ retval = spellguard_check_sub(&check, guard, caster, env, near_miss);
- free_components (&check.catalysts);
- free_components (&check.components);
+ free_components(&check.catalysts);
+ free_components(&check.components);
return retval;
}
@@ -416,114 +436,115 @@ static effect_set_t *check_spellguard (spellguard_t * guard,
/* Public API */
/* -------------------------------------------------------------------------------- */
-effect_set_t *spell_trigger (spell_t * spell, character_t * caster,
- env_t * env, int *near_miss)
+effect_set_t *spell_trigger(spell_t *spell, character_t *caster,
+ env_t *env, int *near_miss)
{
- int i;
+ int i;
spellguard_t *guard = spell->spellguard;
if (near_miss)
*near_miss = 0;
for (i = 0; i < spell->letdefs_nr; i++)
- magic_eval (env,
+ magic_eval(env,
&env->vars[spell->letdefs[i].id], spell->letdefs[i].expr);
- return check_spellguard (guard, caster, env, near_miss);
+ return check_spellguard(guard, caster, env, near_miss);
}
-static void spell_set_location (invocation_t * invocation, entity_t * entity)
+static
+void spell_set_location(invocation_t *invocation, entity_t *entity)
{
- magic_clear_var (&invocation->env->vars[VAR_LOCATION]);
- invocation->env->vars[VAR_LOCATION].ty = TY_LOCATION;
+ magic_clear_var(&invocation->env->vars[VAR_LOCATION]);
+ invocation->env->vars[VAR_LOCATION].ty = TYPE::LOCATION;
invocation->env->vars[VAR_LOCATION].v.v_location.m = entity->m;
invocation->env->vars[VAR_LOCATION].v.v_location.x = entity->x;
invocation->env->vars[VAR_LOCATION].v.v_location.y = entity->y;
}
-void spell_update_location (invocation_t * invocation)
+void spell_update_location(invocation_t *invocation)
{
- if (invocation->spell->flags & SPELL_FLAG_LOCAL)
+ if (bool(invocation->spell->flags & SPELL_FLAG::LOCAL))
return;
else
{
- character_t *owner = (character_t *) map_id2bl (invocation->subject);
+ character_t *owner = (character_t *) map_id2bl(invocation->subject);
if (!owner)
return;
- spell_set_location (invocation, (entity_t *) owner);
+ spell_set_location(invocation, (entity_t *) owner);
}
}
-invocation_t *spell_instantiate (effect_set_t * effect_set, env_t * env)
+invocation_t *spell_instantiate(effect_set_t *effect_set, env_t *env)
{
invocation_t *retval;
- CREATE (retval, invocation_t, 1);
+ CREATE(retval, invocation_t, 1);
entity_t *caster;
retval->env = env;
- retval->caster = VAR (VAR_CASTER).v.v_int;
- retval->spell = VAR (VAR_SPELL).v.v_spell;
+ retval->caster = VAR(VAR_CASTER).v.v_int;
+ retval->spell = VAR(VAR_SPELL).v.v_spell;
retval->stack_size = 0;
retval->current_effect = effect_set->effect;
retval->trigger_effect = effect_set->at_trigger;
retval->end_effect = effect_set->at_end;
- caster = map_id2bl (retval->caster); // must still exist
- retval->bl.id = map_addobject (&retval->bl);
- retval->bl.type = BL_SPELL;
+ caster = map_id2bl(retval->caster); // must still exist
+ retval->bl.id = map_addobject(&retval->bl);
+ retval->bl.type = BL::SPELL;
retval->bl.m = caster->m;
retval->bl.x = caster->x;
retval->bl.y = caster->y;
- map_addblock (&retval->bl);
- set_env_invocation (VAR_INVOCATION, retval);
+ map_addblock(&retval->bl);
+ set_env_invocation(VAR_INVOCATION, retval);
return retval;
}
-invocation_t *spell_clone_effect (invocation_t * base)
+invocation_t *spell_clone_effect(invocation_t *base)
{
- invocation_t *retval = (invocation_t *) malloc (sizeof (invocation_t));
+ invocation_t *retval = (invocation_t *) calloc(1, sizeof(invocation_t));
env_t *env;
- memcpy (retval, base, sizeof (invocation_t));
+ memcpy(retval, base, sizeof(invocation_t));
- retval->env = clone_env (retval->env);
+ retval->env = clone_env(retval->env);
env = retval->env;
retval->current_effect = retval->trigger_effect;
retval->next_invocation = NULL;
retval->end_effect = NULL;
retval->script_pos = 0;
retval->stack_size = 0;
- retval->timer = 0;
+ // retval->timer = 0;
retval->subject = 0;
retval->status_change_refs_nr = 0;
retval->status_change_refs = NULL;
- retval->flags = 0;
+ retval->flags = INVOCATION_FLAG::ZERO;
retval->bl.id = 0;
retval->bl.prev = NULL;
retval->bl.next = NULL;
- retval->bl.id = map_addobject (&retval->bl);
- set_env_invocation (VAR_INVOCATION, retval);
+ retval->bl.id = map_addobject(&retval->bl);
+ set_env_invocation(VAR_INVOCATION, retval);
return retval;
}
-void spell_bind (character_t * subject, invocation_t * invocation)
+void spell_bind(character_t *subject, invocation_t *invocation)
{
/* Only bind nonlocal spells */
- if (!(invocation->spell->flags & SPELL_FLAG_LOCAL))
+ if (!bool(invocation->spell->flags & SPELL_FLAG::LOCAL))
{
- if (invocation->flags & INVOCATION_FLAG_BOUND
+ if (bool(invocation->flags & INVOCATION_FLAG::BOUND)
|| invocation->subject || invocation->next_invocation)
{
int *i = NULL;
- fprintf (stderr,
+ FPRINTF(stderr,
"[magic] INTERNAL ERROR: Attempt to re-bind spell invocation `%s'\n",
invocation->spell->name);
*i = 1;
@@ -532,14 +553,14 @@ void spell_bind (character_t * subject, invocation_t * invocation)
invocation->next_invocation = subject->active_spells;
subject->active_spells = invocation;
- invocation->flags |= INVOCATION_FLAG_BOUND;
+ invocation->flags |= INVOCATION_FLAG::BOUND;
invocation->subject = subject->bl.id;
}
- spell_set_location (invocation, (entity_t *) subject);
+ spell_set_location(invocation, (entity_t *) subject);
}
-int spell_unbind (character_t * subject, invocation_t * invocation)
+int spell_unbind(character_t *subject, invocation_t *invocation)
{
invocation_t **seeker = &subject->active_spells;
@@ -549,7 +570,7 @@ int spell_unbind (character_t * subject, invocation_t * invocation)
{
*seeker = invocation->next_invocation;
- invocation->flags &= ~INVOCATION_FLAG_BOUND;
+ invocation->flags &= ~INVOCATION_FLAG::BOUND;
invocation->next_invocation = NULL;
invocation->subject = 0;
diff --git a/src/map/magic-interpreter-lexer.lpp b/src/map/magic-interpreter-lexer.lpp
index c7f9c09..96598a3 100644
--- a/src/map/magic-interpreter-lexer.lpp
+++ b/src/map/magic-interpreter-lexer.lpp
@@ -1,15 +1,18 @@
%{
-#include "magic-interpreter.hpp"
#include "magic-interpreter-parser.hpp"
+#include "../common/cxxstdio.hpp"
+
#ifdef HEADING
-# undef HEADING
+# error "what platform is this? please tell me who #defined HEADING"
#endif
#define FIXLOC magic_frontend_lloc.first_line = magic_frontend_lineno
#define HEADING(dir) { magic_frontend_lval.i = dir; FIXLOC; return DIR; }
+// silence compiler warnings
+#define YY_USER_INIT (void)yylval, (void)yylloc
%}
%option yylineno
@@ -21,86 +24,86 @@
%%
-"S" HEADING(0);
-"SW" HEADING(1);
-"W" HEADING(2);
-"NW" HEADING(3);
-"N" HEADING(4);
-"NE" HEADING(5);
-"E" HEADING(6);
-"SE" HEADING(7);
-"=" {FIXLOC; return '=';}
-"==" {FIXLOC; return EQ;}
-"<>" {FIXLOC; return NEQ;}
-"!=" {FIXLOC; return NEQ;}
-">" {FIXLOC; return '>';}
-"<" {FIXLOC; return '<';}
-">=" {FIXLOC; return GTE;}
-"<=" {FIXLOC; return LTE;}
-"(" {FIXLOC; return '(';}
-")" {FIXLOC; return ')';}
-"+" {FIXLOC; return '+';}
-"-" {FIXLOC; return '-';}
-"*" {FIXLOC; return '*';}
-"/" {FIXLOC; return '/';}
-"%" {FIXLOC; return '%';}
-"&&" {FIXLOC; return ANDAND;}
-"||" {FIXLOC; return OROR;}
-";" {FIXLOC; return ';';}
-":" {FIXLOC; return ':';}
-"," {FIXLOC; return ',';}
-"@" {FIXLOC; return '@';}
-"|" {FIXLOC; return '|';}
-"[" {FIXLOC; return '[';}
-"]" {FIXLOC; return ']';}
-"&" {FIXLOC; return '&';}
-"^" {FIXLOC; return '^';}
-"." {FIXLOC; return '.';}
-"<<" {FIXLOC; return SHL;}
-">>" {FIXLOC; return SHR;}
-"PROCEDURE" {FIXLOC; return PROCEDURE;}
-"CALL" {FIXLOC; return CALL;}
-"OR" {FIXLOC; return OR;}
-"TO" {FIXLOC; return TO;}
-"TOWARDS" {FIXLOC; return TOWARDS;}
-"TELEPORT-ANCHOR" {FIXLOC; return TELEPORT_ANCHOR;}
-"SILENT" {FIXLOC; return SILENT;}
-"LOCAL" {FIXLOC; return LOCAL;}
-"NONMAGIC" {FIXLOC; return NONMAGIC;}
-"SPELL" {FIXLOC; return SPELL;}
-"LET" {FIXLOC; return LET;}
-"IN" {FIXLOC; return IN;}
-"END" {FIXLOC; return END;}
-"=>" {FIXLOC; return DARROW;}
-"STRING" {FIXLOC; return STRING_TY;}
-"REQUIRE" {FIXLOC; return REQUIRE;}
-"CATALYSTS" {FIXLOC; return CATALYSTS;}
-"COMPONENTS" {FIXLOC; return COMPONENTS;}
-"MANA" {FIXLOC; return MANA;}
-"CASTTIME" {FIXLOC; return CASTTIME;}
-"SKIP" {FIXLOC; return SKIP;}
-"ABORT" {FIXLOC; return ABORT;}
-"BREAK" {FIXLOC; return BREAK;}
-"EFFECT" {FIXLOC; return EFFECT;}
-"ATEND" {FIXLOC; return ATEND;}
-"ATTRIGGER" {FIXLOC; return ATTRIGGER;}
-"CONST" {FIXLOC; return CONST;}
-"PC" {FIXLOC; return PC_F;}
-"NPC" {FIXLOC; return NPC_F;}
-"MOB" {FIXLOC; return MOB_F;}
-"ENTITY" {FIXLOC; return ENTITY_F;}
-"TARGET" {FIXLOC; return TARGET_F;}
-"IF" {FIXLOC; return IF;}
-"THEN" {FIXLOC; return THEN;}
-"ELSE" {FIXLOC; return ELSE;}
-"FOREACH" {FIXLOC; return FOREACH;}
-"FOR" {FIXLOC; return FOR;}
-"DO" {FIXLOC; return DO;}
-"WAIT" {FIXLOC; return SLEEP;}
+"S" HEADING(0);
+"SW" HEADING(1);
+"W" HEADING(2);
+"NW" HEADING(3);
+"N" HEADING(4);
+"NE" HEADING(5);
+"E" HEADING(6);
+"SE" HEADING(7);
+"=" {FIXLOC; return '=';}
+"==" {FIXLOC; return EQ;}
+"<>" {FIXLOC; return NEQ;}
+"!=" {FIXLOC; return NEQ;}
+">" {FIXLOC; return '>';}
+"<" {FIXLOC; return '<';}
+">=" {FIXLOC; return GTE;}
+"<=" {FIXLOC; return LTE;}
+"(" {FIXLOC; return '(';}
+")" {FIXLOC; return ')';}
+"+" {FIXLOC; return '+';}
+"-" {FIXLOC; return '-';}
+"*" {FIXLOC; return '*';}
+"/" {FIXLOC; return '/';}
+"%" {FIXLOC; return '%';}
+"&&" {FIXLOC; return ANDAND;}
+"||" {FIXLOC; return OROR;}
+";" {FIXLOC; return ';';}
+":" {FIXLOC; return ':';}
+"," {FIXLOC; return ',';}
+"@" {FIXLOC; return '@';}
+"|" {FIXLOC; return '|';}
+"[" {FIXLOC; return '[';}
+"]" {FIXLOC; return ']';}
+"&" {FIXLOC; return '&';}
+"^" {FIXLOC; return '^';}
+"." {FIXLOC; return '.';}
+"<<" {FIXLOC; return SHL;}
+">>" {FIXLOC; return SHR;}
+"PROCEDURE" {FIXLOC; return PROCEDURE;}
+"CALL" {FIXLOC; return CALL;}
+"OR" {FIXLOC; return OR;}
+"TO" {FIXLOC; return TO;}
+"TOWARDS" {FIXLOC; return TOWARDS;}
+"TELEPORT-ANCHOR" {FIXLOC; return TELEPORT_ANCHOR;}
+"SILENT" {FIXLOC; return SILENT;}
+"LOCAL" {FIXLOC; return LOCAL;}
+"NONMAGIC" {FIXLOC; return NONMAGIC;}
+"SPELL" {FIXLOC; return SPELL;}
+"LET" {FIXLOC; return LET;}
+"IN" {FIXLOC; return IN;}
+"END" {FIXLOC; return END;}
+"=>" {FIXLOC; return DARROW;}
+"STRING" {FIXLOC; return STRING_TY;}
+"REQUIRE" {FIXLOC; return REQUIRE;}
+"CATALYSTS" {FIXLOC; return CATALYSTS;}
+"COMPONENTS" {FIXLOC; return COMPONENTS;}
+"MANA" {FIXLOC; return MANA;}
+"CASTTIME" {FIXLOC; return CASTTIME;}
+"SKIP" {FIXLOC; return SKIP;}
+"ABORT" {FIXLOC; return ABORT;}
+"BREAK" {FIXLOC; return BREAK;}
+"EFFECT" {FIXLOC; return EFFECT_;}
+"ATEND" {FIXLOC; return ATEND;}
+"ATTRIGGER" {FIXLOC; return ATTRIGGER;}
+"CONST" {FIXLOC; return CONST;}
+"PC" {FIXLOC; return PC_F;}
+"NPC" {FIXLOC; return NPC_F;}
+"MOB" {FIXLOC; return MOB_F;}
+"ENTITY" {FIXLOC; return ENTITY_F;}
+"TARGET" {FIXLOC; return TARGET_F;}
+"IF" {FIXLOC; return IF;}
+"THEN" {FIXLOC; return THEN;}
+"ELSE" {FIXLOC; return ELSE;}
+"FOREACH" {FIXLOC; return FOREACH;}
+"FOR" {FIXLOC; return FOR;}
+"DO" {FIXLOC; return DO;}
+"WAIT" {FIXLOC; return SLEEP;}
\{([^\}]|\\.)*\} { char *string = strdup(yytext);
magic_frontend_lval.s = string;
- FIXLOC;
+ FIXLOC;
return SCRIPT_DATA;
}
@@ -115,26 +118,26 @@
*dst++ = *src++;
*dst = '\0'; /* terminate */
magic_frontend_lval.s = string;
- FIXLOC;
+ FIXLOC;
return STRING;
}
-"-"?[0-9]+ { magic_frontend_lval.i = atoi(yytext);
- FIXLOC;
+"-"?[0-9]+ { magic_frontend_lval.i = atoi(yytext);
+ FIXLOC;
return INT; }
"0x"[0-9a-fA-F]+ { magic_frontend_lval.i = strtol(yytext + 2, NULL, 16);
- FIXLOC;
+ FIXLOC;
return INT; }
[a-zA-Z][-_a-zA-Z0-9?!]* { magic_frontend_lval.s = strdup(yytext);
- FIXLOC;
+ FIXLOC;
return ID; }
-"#".*$ /* Ignore comments */
-"//".*$ /* Ignore comments */
-[ \n\t\r] /* ignore whitespace */
-. fprintf(stderr, "%s: Unexpected character in line %d\n", MAGIC_CONFIG_FILE, magic_frontend_lineno);
+"#".*$ /* Ignore comments */
+"//".*$ /* Ignore comments */
+[ \n\t\r] /* ignore whitespace */
+. FPRINTF(stderr, "%s: Unexpected character in line %d\n", MAGIC_CONFIG_FILE, magic_frontend_lineno);
%%
diff --git a/src/map/magic-interpreter-parser.ypp b/src/map/magic-interpreter-parser.ypp
index 5fe2646..dd62edf 100644
--- a/src/map/magic-interpreter-parser.ypp
+++ b/src/map/magic-interpreter-parser.ypp
@@ -1,71 +1,84 @@
%code requires {
-#include "magic-expr.hpp"
+#include "magic-interpreter.hpp"
}
%code{
#include "magic-interpreter-parser.hpp"
-#include "magic-interpreter.hpp"
-#include <stdarg.h>
+#include <cstdarg> // exception to "no va_list" rule, even after cxxstdio
+
+#include "../common/cxxstdio.hpp"
+
+#include "itemdb.hpp"
+#include "magic-expr.hpp"
#define YYLEX_PARAM 0, 0
-static int
-intern_id(const char *id_name);
+static
+int intern_id(const char *id_name);
-static expr_t *
-fun_expr(const char *name, int args_nr, expr_t **args, int line, int column);
+static
+expr_t *fun_expr(const char *name, int args_nr, expr_t **args, int line, int column);
-static expr_t *
-dot_expr(expr_t *lhs, int id);
+static
+expr_t *dot_expr(expr_t *lhs, int id);
-#define BIN_EXPR(x, name, arg1, arg2, line, column) { expr_t *e[2]; e[0] = arg1; e[1] = arg2; x = fun_expr(name, 2, e, line, column); }
+static
+void BIN_EXPR(expr_t *& x, const char *name, expr_t *arg1, expr_t *arg2, int line, int column)
+{
+ expr_t *e[2];
+ e[0] = arg1;
+ e[1] = arg2;
+ x = fun_expr(name, 2, e, line, column);
+}
-static int failed_flag = 0;
+static
+int failed_flag = 0;
-static void
-magic_frontend_error(const char *msg);
+static
+void magic_frontend_error(const char *msg);
-static void
-fail(int line, int column, const char *fmt, ...);
+static
+void fail(int line, int column, const char *fmt, ...);
-static spell_t *
-new_spell(spellguard_t *guard);
+static
+spell_t *new_spell(spellguard_t *guard);
-static spellguard_t *
-spellguard_implication(spellguard_t *a, spellguard_t *b);
+static
+spellguard_t *spellguard_implication(spellguard_t *a, spellguard_t *b);
-static spellguard_t *
-new_spellguard(int ty);
+static
+spellguard_t *new_spellguard(SPELLGUARD ty);
-static effect_t *
-new_effect(int ty);
+static
+effect_t *new_effect(EFFECT ty);
-static effect_t *
-set_effect_continuation(effect_t *src, effect_t *continuation);
+static
+effect_t *set_effect_continuation(effect_t *src, effect_t *continuation);
-static void
-add_spell(spell_t *spell, int line_nr);
+static
+void add_spell(spell_t *spell, int line_nr);
-static void
-add_teleport_anchor(teleport_anchor_t *anchor, int line_nr);
+static
+void add_teleport_anchor(teleport_anchor_t *anchor, int line_nr);
-static effect_t *
-op_effect(char *name, int args_nr, expr_t **args, int line, int column);
+static
+effect_t *op_effect(char *name, int args_nr, expr_t **args, int line, int column);
+// in magic-interpreter-lexer.cpp
int magic_frontend_lex(YYSTYPE *, YYLTYPE *);
-static void
-install_proc(proc_t *proc);
+static
+void install_proc(proc_t *proc);
-static effect_t *
-call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column);
+static
+effect_t *call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column);
-static void
-bind_constant(char *name, val_t *val, int line_nr);
+static
+void bind_constant(char *name, val_t *val, int line_nr);
-static val_t *
-find_constant(char *name);
+static
+val_t *find_constant(char *name);
}
@@ -75,6 +88,9 @@ find_constant(char *name);
%union {
int i;
+ SPELL_FLAG spell_flags;
+ SPELLARG spell_arg;
+ FOREACH_FILTER foreach_filter;
char *s;
int op;
magic_conf_t *magic_conf;
@@ -85,7 +101,7 @@ find_constant(char *name);
args_rec_t arg_list;
struct { int letdefs_nr; letdef_t *letdefs; } letdefs;
spell_t *spell;
- struct { int id, ty; } spellarg_def;
+ struct { int id; SPELLARG ty; } spellarg_def;
letdef_t vardef;
spellguard_t *spellguard;
component_t *components;
@@ -152,7 +168,7 @@ find_constant(char *name);
%token SKIP
%token ABORT
%token BREAK
-%token EFFECT
+%token EFFECT_
%token ATEND
%token ATTRIGGER
%token PC_F
@@ -186,15 +202,15 @@ find_constant(char *name);
%type <components> items
%type <components> item_list
%type <i> item_name
-%type <i> selection;
+%type <foreach_filter> selection;
%type <effect> effect
%type <effect> effect_list
%type <effect> maybe_trigger
%type <effect> maybe_end
-%type <i> spell_flags;
+%type <spell_flags> spell_flags;
%type <expr> expr
-%type <i> arg_ty
+%type <spell_arg> arg_ty
%type <proc> proc_formals_list
%type <proc> proc_formals_list_ne
@@ -211,41 +227,41 @@ find_constant(char *name);
%%
-spellconf : /* empty */
+spellconf : /* empty */
{}
| spellconf_option semicolons spellconf
{}
- ;
+ ;
-semicolons : /* empty */
- {}
+semicolons : /* empty */
+ {}
| semicolons ';'
{}
- ;
+ ;
-proc_formals_list : /* empty */
- { CREATE ($$, proc_t, 1); }
- | proc_formals_list_ne
+proc_formals_list : /* empty */
+ { CREATE($$, proc_t, 1); }
+ | proc_formals_list_ne
{ $$ = $1; }
- ;
+ ;
-proc_formals_list_ne : ID
- { CREATE ($$, proc_t, 1);
+proc_formals_list_ne : ID
+ { CREATE($$, proc_t, 1);
$$->args_nr = 1;
$$->args = (int*)malloc(sizeof(int));
$$->args[0] = intern_id($1);
}
- | proc_formals_list_ne ',' ID
+ | proc_formals_list_ne ',' ID
{ $$ = $1;
$$->args = (int*)realloc($$->args, sizeof(int) * (1 + $$->args_nr));
$$->args[$$->args_nr++] = intern_id($3);
}
- ;
+ ;
-spellconf_option : ID '=' expr
- {
+spellconf_option : ID '=' expr
+ {
int var_id;
if (find_constant($1)) {
fail(@1.first_line, 0, "Attempt to redefine constant `%s' as global\n", $1);
@@ -255,8 +271,8 @@ spellconf_option : ID '=' expr
magic_eval(&magic_default_env, &magic_conf.vars[var_id], $3);
}
}
- | CONST ID '=' expr
- {
+ | CONST ID '=' expr
+ {
val_t var;
magic_eval(&magic_default_env, &var, $4);
bind_constant($2, &var, @1.first_line);
@@ -264,7 +280,7 @@ spellconf_option : ID '=' expr
| TELEPORT_ANCHOR ID ':' expr '=' expr
{
teleport_anchor_t *anchor;
- CREATE (anchor, teleport_anchor_t, 1);
+ CREATE(anchor, teleport_anchor_t, 1);
anchor->name = $2;
anchor->invocation = magic_eval_str(&magic_default_env, $4);
anchor->location = $6;
@@ -275,7 +291,7 @@ spellconf_option : ID '=' expr
free(anchor);
failed_flag = 0;
}
- | PROCEDURE ID '(' proc_formals_list ')' '=' effect_list
+ | PROCEDURE ID '(' proc_formals_list ')' '=' effect_list
{
proc_t *proc = $4;
proc->name = $2;
@@ -296,27 +312,27 @@ spellconf_option : ID '=' expr
failed_flag = 0;
}
-spell_flags : /* empty */
- { $$ = 0; }
- | LOCAL spell_flags
- { if ($2 & SPELL_FLAG_LOCAL)
+spell_flags : /* empty */
+ { $$ = SPELL_FLAG::ZERO; }
+ | LOCAL spell_flags
+ { if (bool($2 & SPELL_FLAG::LOCAL))
fail(@1.first_line, @1.first_column, "`LOCAL' specified more than once");
- $$ = $2 | SPELL_FLAG_LOCAL;
+ $$ = $2 | SPELL_FLAG::LOCAL;
}
- | NONMAGIC spell_flags
- { if ($2 & SPELL_FLAG_NONMAGIC)
+ | NONMAGIC spell_flags
+ { if (bool($2 & SPELL_FLAG::NONMAGIC))
fail(@1.first_line, @1.first_column, "`NONMAGIC' specified more than once");
- $$ = $2 | SPELL_FLAG_NONMAGIC;
+ $$ = $2 | SPELL_FLAG::NONMAGIC;
}
- | SILENT spell_flags
- { if ($2 & SPELL_FLAG_SILENT)
+ | SILENT spell_flags
+ { if (bool($2 & SPELL_FLAG::SILENT))
fail(@1.first_line, @1.first_column, "`SILENT' specified more than once");
- $$ = $2 | SPELL_FLAG_SILENT;
+ $$ = $2 | SPELL_FLAG::SILENT;
}
-argopt : /* empty */
- { $$.ty = SPELLARG_NONE; }
+argopt : /* empty */
+ { $$.ty = SPELLARG::NONE; }
| '(' ID ':' arg_ty ')'
{ $$.id = intern_id($2);
$$.ty = $4; }
@@ -324,160 +340,160 @@ argopt : /* empty */
arg_ty : PC_F
- { $$ = SPELLARG_PC; }
+ { $$ = SPELLARG::PC; }
| STRING_TY
- { $$ = SPELLARG_STRING; }
+ { $$ = SPELLARG::STRING; }
;
-value : DIR
- { $$.ty = TY_DIR;
+value : DIR
+ { $$.ty = TYPE::DIR;
$$.v.v_int = $1; }
- | INT
- { $$.ty = TY_INT;
+ | INT
+ { $$.ty = TYPE::INT;
$$.v.v_int = $1; }
- | STRING
- { $$.ty = TY_STRING;
+ | STRING
+ { $$.ty = TYPE::STRING;
$$.v.v_string = $1; }
- ;
+ ;
-expr : value
- { $$ = magic_new_expr(EXPR_VAL);
+expr : value
+ { $$ = magic_new_expr(EXPR::VAL);
$$->e.e_val = $1; }
- | ID
- {
+ | ID
+ {
val_t *val;
if ((val = find_constant($1))) {
- $$ = magic_new_expr(EXPR_VAL);
+ $$ = magic_new_expr(EXPR::VAL);
$$->e.e_val = *val;
} else {
- $$ = magic_new_expr(EXPR_ID);
+ $$ = magic_new_expr(EXPR::ID);
$$->e.e_id = intern_id($1);
}
}
- | area
- { $$ = magic_new_expr(EXPR_AREA);
+ | area
+ { $$ = magic_new_expr(EXPR::AREA);
$$->e.e_area = $1; }
- | expr '+' expr
- { BIN_EXPR($$, "+", $1, $3, @1.first_line, @1.first_column); }
- | expr '-' expr
- { BIN_EXPR($$, "-", $1, $3, @1.first_line, @1.first_column); }
- | expr '*' expr
- { BIN_EXPR($$, "*", $1, $3, @1.first_line, @1.first_column); }
- | expr '%' expr
- { BIN_EXPR($$, "%", $1, $3, @1.first_line, @1.first_column); }
- | expr '/' expr
- { BIN_EXPR($$, "/", $1, $3, @1.first_line, @1.first_column); }
- | expr '<' expr
- { BIN_EXPR($$, ">", $3, $1, @1.first_line, @1.first_column); }
- | expr '>' expr
- { BIN_EXPR($$, ">", $1, $3, @1.first_line, @1.first_column); }
- | expr '&' expr
- { BIN_EXPR($$, "&", $1, $3, @1.first_line, @1.first_column); }
- | expr '^' expr
- { BIN_EXPR($$, "^", $1, $3, @1.first_line, @1.first_column); }
- | expr '|' expr
- { BIN_EXPR($$, "|", $1, $3, @1.first_line, @1.first_column); }
- | expr SHL expr
- { BIN_EXPR($$, "<<", $1, $3, @1.first_line, @1.first_column); }
- | expr SHR expr
- { BIN_EXPR($$, ">>", $1, $3, @1.first_line, @1.first_column); }
- | expr LTE expr
- { BIN_EXPR($$, ">=", $3, $1, @1.first_line, @1.first_column); }
- | expr GTE expr
- { BIN_EXPR($$, ">=", $1, $3, @1.first_line, @1.first_column); }
- | expr ANDAND expr
- { BIN_EXPR($$, "&&", $1, $3, @1.first_line, @1.first_column); }
- | expr OROR expr
- { BIN_EXPR($$, "||", $1, $3, @1.first_line, @1.first_column); }
- | expr EQ expr
- { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column); }
- | expr '=' expr
- { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column); }
- | expr NEQ expr
- { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column);
+ | expr '+' expr
+ { BIN_EXPR($$, "+", $1, $3, @1.first_line, @1.first_column); }
+ | expr '-' expr
+ { BIN_EXPR($$, "-", $1, $3, @1.first_line, @1.first_column); }
+ | expr '*' expr
+ { BIN_EXPR($$, "*", $1, $3, @1.first_line, @1.first_column); }
+ | expr '%' expr
+ { BIN_EXPR($$, "%", $1, $3, @1.first_line, @1.first_column); }
+ | expr '/' expr
+ { BIN_EXPR($$, "/", $1, $3, @1.first_line, @1.first_column); }
+ | expr '<' expr
+ { BIN_EXPR($$, ">", $3, $1, @1.first_line, @1.first_column); }
+ | expr '>' expr
+ { BIN_EXPR($$, ">", $1, $3, @1.first_line, @1.first_column); }
+ | expr '&' expr
+ { BIN_EXPR($$, "&", $1, $3, @1.first_line, @1.first_column); }
+ | expr '^' expr
+ { BIN_EXPR($$, "^", $1, $3, @1.first_line, @1.first_column); }
+ | expr '|' expr
+ { BIN_EXPR($$, "|", $1, $3, @1.first_line, @1.first_column); }
+ | expr SHL expr
+ { BIN_EXPR($$, "<<", $1, $3, @1.first_line, @1.first_column); }
+ | expr SHR expr
+ { BIN_EXPR($$, ">>", $1, $3, @1.first_line, @1.first_column); }
+ | expr LTE expr
+ { BIN_EXPR($$, ">=", $3, $1, @1.first_line, @1.first_column); }
+ | expr GTE expr
+ { BIN_EXPR($$, ">=", $1, $3, @1.first_line, @1.first_column); }
+ | expr ANDAND expr
+ { BIN_EXPR($$, "&&", $1, $3, @1.first_line, @1.first_column); }
+ | expr OROR expr
+ { BIN_EXPR($$, "||", $1, $3, @1.first_line, @1.first_column); }
+ | expr EQ expr
+ { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column); }
+ | expr '=' expr
+ { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column); }
+ | expr NEQ expr
+ { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column);
$$ = fun_expr("not", 1, &$$, @1.first_line, @1.first_column); }
- | ID '(' arg_list ')'
- { $$ = fun_expr($1, $3.args_nr, $3.args, @1.first_line, @1.first_column);
+ | ID '(' arg_list ')'
+ { $$ = fun_expr($1, $3.args_nr, $3.args, @1.first_line, @1.first_column);
if ($3.args)
free($3.args);
free($1); }
- | '(' expr ')'
- { $$ = $2; }
- | expr '.' ID
- { $$ = dot_expr($1, intern_id($3)); }
- ;
+ | '(' expr ')'
+ { $$ = $2; }
+ | expr '.' ID
+ { $$ = dot_expr($1, intern_id($3)); }
+ ;
-arg_list : /* empty */
- { $$.args_nr = 0; }
- | arg_list_ne
- { $$ = $1; }
- ;
+arg_list : /* empty */
+ { $$.args_nr = 0; }
+ | arg_list_ne
+ { $$ = $1; }
+ ;
-arg_list_ne : expr
- { CREATE($$.args, expr_t *, 1);
+arg_list_ne : expr
+ { CREATE($$.args, expr_t *, 1);
$$.args_nr = 1;
$$.args[0] = $1;
}
- | arg_list_ne ',' expr
- { RECREATE($$.args, expr_t *, 1 + $$.args_nr);
+ | arg_list_ne ',' expr
+ { RECREATE($$.args, expr_t *, 1 + $$.args_nr);
$$.args[$$.args_nr++] = $3;
}
- ;
+ ;
-location : '@' '(' expr ',' expr ',' expr ')'
- { $$.m = $3; $$.x = $5; $$.y = $7; }
- ;
+location : '@' '(' expr ',' expr ',' expr ')'
+ { $$.m = $3; $$.x = $5; $$.y = $7; }
+ ;
-area : location
- { $$.ty = AREA_LOCATION;
+area : location
+ { $$.ty = AREA::LOCATION;
$$.a.a_loc = $1;
- }
- | location '@' '+' '(' expr ',' expr ')'
- { $$.ty = AREA_RECT;
+ }
+ | location '@' '+' '(' expr ',' expr ')'
+ { $$.ty = AREA::RECT;
$$.a.a_rect.loc = $1;
$$.a.a_rect.width = $5;
$$.a.a_rect.height = $7;
}
- | location TOWARDS expr ':' '(' expr ',' expr ')'
- { $$.ty = AREA_BAR;
+ | location TOWARDS expr ':' '(' expr ',' expr ')'
+ { $$.ty = AREA::BAR;
$$.a.a_bar.loc = $1;
$$.a.a_bar.width = $6;
$$.a.a_bar.depth = $8;
$$.a.a_bar.dir = $3;
}
- ;
+ ;
-spelldef : spellbody_list
+spelldef : spellbody_list
{ $$ = new_spell($1); }
- | LET defs IN spellbody_list
+ | LET defs IN spellbody_list
{ $$ = new_spell($4);
$$->letdefs_nr = $2.letdefs_nr;
$$->letdefs = $2.letdefs;
$$->spellguard = $4;
}
- ;
+ ;
-defs : semicolons
- { $$.letdefs_nr = 0;
+defs : semicolons
+ { $$.letdefs_nr = 0;
CREATE($$.letdefs, letdef_t, 1);
}
- | defs def semicolons
- { $$ = $1;
+ | defs def semicolons
+ { $$ = $1;
$$.letdefs_nr++;
- RECREATE ($$.letdefs, letdef_t, $$.letdefs_nr);
+ RECREATE($$.letdefs, letdef_t, $$.letdefs_nr);
$$.letdefs[$1.letdefs_nr] = $2;
}
;
-def : ID '=' expr
- {
+def : ID '=' expr
+ {
if (find_constant($1)) {
fail(@1.first_line, @1.first_column, "Attempt to re-define constant `%s' as LET-bound variable.\n", $1);
free($1);
@@ -486,216 +502,216 @@ def : ID '=' expr
$$.expr = $3;
}
}
- ;
+ ;
-spellbody_list : spellbody
- { $$ = $1; }
- | spellbody '|' spellbody_list
- { spellguard_t *sg = new_spellguard(SPELLGUARD_CHOICE);
+spellbody_list : spellbody
+ { $$ = $1; }
+ | spellbody '|' spellbody_list
+ { spellguard_t *sg = new_spellguard(SPELLGUARD::CHOICE);
sg->next = $1;
sg->s.s_alt = $3;
$$ = sg;
}
- ;
+ ;
-spellbody : spellguard DARROW spellbody
- { $$ = spellguard_implication($1, $3); }
- | '(' spellbody_list ')'
- { $$ = $2; }
- | EFFECT effect_list maybe_trigger maybe_end
- { spellguard_t *sg = new_spellguard(SPELLGUARD_EFFECT);
+spellbody : spellguard DARROW spellbody
+ { $$ = spellguard_implication($1, $3); }
+ | '(' spellbody_list ')'
+ { $$ = $2; }
+ | EFFECT_ effect_list maybe_trigger maybe_end
+ { spellguard_t *sg = new_spellguard(SPELLGUARD::EFFECT);
sg->s.s_effect.effect = $2;
sg->s.s_effect.at_trigger = $3;
sg->s.s_effect.at_end = $4;
$$ = sg;
}
- ;
+ ;
-maybe_trigger : /* empty */
- { $$ = NULL; }
- | ATTRIGGER effect_list
- { $$ = $2; }
- ;
+maybe_trigger : /* empty */
+ { $$ = NULL; }
+ | ATTRIGGER effect_list
+ { $$ = $2; }
+ ;
-maybe_end : /* empty */
- { $$ = NULL; }
- | ATEND effect_list
- { $$ = $2; }
- ;
+maybe_end : /* empty */
+ { $$ = NULL; }
+ | ATEND effect_list
+ { $$ = $2; }
+ ;
-spellguard : prereq
- { $$ = $1; }
- | spellguard OR spellguard
- { spellguard_t *sg = new_spellguard(SPELLGUARD_CHOICE);
+spellguard : prereq
+ { $$ = $1; }
+ | spellguard OR spellguard
+ { spellguard_t *sg = new_spellguard(SPELLGUARD::CHOICE);
sg->next = $1;
sg->s.s_alt = $3;
$$ = sg;
}
- | '(' spellguard_list ')'
- { $$ = $2; }
- ;
+ | '(' spellguard_list ')'
+ { $$ = $2; }
+ ;
-spellguard_list : spellguard
- { $$ = $1; }
- | spellguard ',' spellguard_list
- { $$ = spellguard_implication ($1, $3); }
- ;
+spellguard_list : spellguard
+ { $$ = $1; }
+ | spellguard ',' spellguard_list
+ { $$ = spellguard_implication($1, $3); }
+ ;
-prereq : REQUIRE expr
- { $$ = new_spellguard(SPELLGUARD_CONDITION);
+prereq : REQUIRE expr
+ { $$ = new_spellguard(SPELLGUARD::CONDITION);
$$->s.s_condition = $2;
}
- | CATALYSTS items
- { $$ = new_spellguard(SPELLGUARD_CATALYSTS);
+ | CATALYSTS items
+ { $$ = new_spellguard(SPELLGUARD::CATALYSTS);
$$->s.s_catalysts = $2;
}
- | COMPONENTS items
- { $$ = new_spellguard(SPELLGUARD_COMPONENTS);
+ | COMPONENTS items
+ { $$ = new_spellguard(SPELLGUARD::COMPONENTS);
$$->s.s_components = $2;
}
- | MANA expr
- { $$ = new_spellguard(SPELLGUARD_MANA);
+ | MANA expr
+ { $$ = new_spellguard(SPELLGUARD::MANA);
$$->s.s_mana = $2;
}
- | CASTTIME expr
- { $$ = new_spellguard(SPELLGUARD_CASTTIME);
+ | CASTTIME expr
+ { $$ = new_spellguard(SPELLGUARD::CASTTIME);
$$->s.s_casttime = $2;
}
- ;
+ ;
-items : '[' item_list ']'
- { $$ = $2; }
- ;
+items : '[' item_list ']'
+ { $$ = $2; }
+ ;
-item_list : item
- { $$ = NULL;
+item_list : item
+ { $$ = NULL;
magic_add_component(&$$, $1.id, $1.count);
}
- | item_list ',' item
- { $$ = $1;
+ | item_list ',' item
+ { $$ = $1;
magic_add_component(&$$, $3.id, $3.count);
}
- ;
+ ;
-item : INT '*' item_name
- { $$.id = $3; $$.count = $1; }
- | item_name
- { $$.id = $1; $$.count = 1; }
- ;
+item : INT '*' item_name
+ { $$.id = $3; $$.count = $1; }
+ | item_name
+ { $$.id = $1; $$.count = 1; }
+ ;
-item_name : STRING
- { struct item_data *item = itemdb_searchname($1);
+item_name : STRING
+ { struct item_data *item = itemdb_searchname($1);
if (!item) {
- fail (@1.first_line, @1.first_column, "Unknown item `%s'\n", $1);
+ fail(@1.first_line, @1.first_column, "Unknown item `%s'\n", $1);
$$ = 0;
} else
$$ = item->nameid;
- free ($1);
+ free($1);
}
- | INT
- { $$ = $1; }
- ;
-
-
-selection : PC_F
- { $$ = FOREACH_FILTER_PC; }
- | MOB_F
- { $$ = FOREACH_FILTER_MOB; }
- | ENTITY_F
- { $$ = FOREACH_FILTER_ENTITY; }
- | SPELL
- { $$ = FOREACH_FILTER_SPELL; }
- | TARGET_F
- { $$ = FOREACH_FILTER_TARGET; }
- | NPC_F
- { $$ = FOREACH_FILTER_NPC; }
- ;
-
-
-effect : '(' effect_list ')'
- { $$ = $2; }
- | SKIP ';'
- { $$ = new_effect(EFFECT_SKIP); }
- | ABORT ';'
- { $$ = new_effect(EFFECT_ABORT); }
- | END ';'
- { $$ = new_effect(EFFECT_END); }
- | BREAK ';'
- { $$ = new_effect(EFFECT_BREAK); }
- | ID '=' expr ';'
- {
+ | INT
+ { $$ = $1; }
+ ;
+
+
+selection : PC_F
+ { $$ = FOREACH_FILTER::PC; }
+ | MOB_F
+ { $$ = FOREACH_FILTER::MOB; }
+ | ENTITY_F
+ { $$ = FOREACH_FILTER::ENTITY; }
+ | SPELL
+ { $$ = FOREACH_FILTER::SPELL; }
+ | TARGET_F
+ { $$ = FOREACH_FILTER::TARGET; }
+ | NPC_F
+ { $$ = FOREACH_FILTER::NPC; }
+ ;
+
+
+effect : '(' effect_list ')'
+ { $$ = $2; }
+ | SKIP ';'
+ { $$ = new_effect(EFFECT::SKIP); }
+ | ABORT ';'
+ { $$ = new_effect(EFFECT::ABORT); }
+ | END ';'
+ { $$ = new_effect(EFFECT::END); }
+ | BREAK ';'
+ { $$ = new_effect(EFFECT::BREAK); }
+ | ID '=' expr ';'
+ {
if (find_constant($1)) {
fail(@1.first_line, @1.first_column, "Attempt to re-define constant `%s' in assignment.", $1);
free($1);
} else {
- $$ = new_effect(EFFECT_ASSIGN);
+ $$ = new_effect(EFFECT::ASSIGN);
$$->e.e_assign.id = intern_id($1);
$$->e.e_assign.expr = $3;
}
}
- | FOREACH selection ID IN expr DO effect
- { $$ = new_effect(EFFECT_FOREACH);
+ | FOREACH selection ID IN expr DO effect
+ { $$ = new_effect(EFFECT::FOREACH);
$$->e.e_foreach.id = intern_id($3);
$$->e.e_foreach.area = $5;
$$->e.e_foreach.body = $7;
$$->e.e_foreach.filter = $2;
}
- | FOR ID '=' expr TO expr DO effect
- { $$ = new_effect(EFFECT_FOR);
+ | FOR ID '=' expr TO expr DO effect
+ { $$ = new_effect(EFFECT::FOR);
$$->e.e_for.id = intern_id($2);
$$->e.e_for.start = $4;
$$->e.e_for.stop = $6;
$$->e.e_for.body = $8;
}
- | IF expr THEN effect ELSE effect
- { $$ = new_effect(EFFECT_IF);
+ | IF expr THEN effect ELSE effect
+ { $$ = new_effect(EFFECT::IF);
$$->e.e_if.cond = $2;
$$->e.e_if.true_branch = $4;
$$->e.e_if.false_branch = $6;
}
- | IF expr THEN effect
- { $$ = new_effect(EFFECT_IF);
+ | IF expr THEN effect
+ { $$ = new_effect(EFFECT::IF);
$$->e.e_if.cond = $2;
$$->e.e_if.true_branch = $4;
- $$->e.e_if.false_branch = new_effect(EFFECT_SKIP);
+ $$->e.e_if.false_branch = new_effect(EFFECT::SKIP);
}
- | SLEEP expr ';'
- { $$ = new_effect(EFFECT_SLEEP);
+ | SLEEP expr ';'
+ { $$ = new_effect(EFFECT::SLEEP);
$$->e.e_sleep = $2;
}
- | ID '(' arg_list ')' ';'
+ | ID '(' arg_list ')' ';'
{ $$ = op_effect($1, $3.args_nr, $3.args, @1.first_line, @1.first_column);
free($1);
}
- | SCRIPT_DATA
- { $$ = new_effect(EFFECT_SCRIPT);
+ | SCRIPT_DATA
+ { $$ = new_effect(EFFECT::SCRIPT);
$$->e.e_script = parse_script($1, @1.first_line);
free($1);
if ($$->e.e_script == NULL)
fail(@1.first_line, @1.first_column, "Failed to compile script\n");
}
- | CALL ID '(' arg_list ')' ';'
- { $$ = call_proc($2, $4.args_nr, $4.args, @1.first_line, @1.first_column);
+ | CALL ID '(' arg_list ')' ';'
+ { $$ = call_proc($2, $4.args_nr, $4.args, @1.first_line, @1.first_column);
free($2);
}
- ;
+ ;
-effect_list : /* empty */
- { $$ = new_effect(EFFECT_SKIP); }
- | effect semicolons effect_list
- { $$ = set_effect_continuation($1, $3); }
- ;
+effect_list : /* empty */
+ { $$ = new_effect(EFFECT::SKIP); }
+ | effect semicolons effect_list
+ { $$ = set_effect_continuation($1, $3); }
+ ;
%%
@@ -703,8 +719,8 @@ effect_list : /* empty */
/* We do incremental realloc here to store our results. Since this happens only once
* during startup for a relatively manageable set of configs, it should be fine. */
-static int
-intern_id(const char *id_name)
+static
+int intern_id(const char *id_name)
{
int i;
@@ -719,13 +735,13 @@ intern_id(const char *id_name)
RECREATE(magic_conf.var_name, const char *, magic_conf.vars_nr);
magic_conf.var_name[i] = id_name;
RECREATE(magic_conf.vars, val_t, magic_conf.vars_nr);
- magic_conf.vars[i].ty = TY_UNDEF;
+ magic_conf.vars[i].ty = TYPE::UNDEF;
return i;
}
-static void
-add_spell(spell_t *spell, int line_nr)
+static
+void add_spell(spell_t *spell, int line_nr)
{
int index = magic_conf.spells_nr;
int i;
@@ -749,8 +765,8 @@ add_spell(spell_t *spell, int line_nr)
}
-static void
-add_teleport_anchor(teleport_anchor_t *anchor, int line_nr)
+static
+void add_teleport_anchor(teleport_anchor_t *anchor, int line_nr)
{
int index = magic_conf.anchors_nr;
int i;
@@ -777,24 +793,24 @@ static __attribute__((format(printf, 3, 4)))
void fail(int line, int column, const char *fmt, ...)
{
va_list ap;
- fprintf(stderr, "[magic-init] L%d:%d: ", line, column);
+ FPRINTF(stderr, "[magic-init] L%d:%d: ", line, column);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
failed_flag = 1;
}
-static expr_t *
-dot_expr(expr_t *expr, int id)
+static
+expr_t *dot_expr(expr_t *expr, int id)
{
- expr_t *retval = magic_new_expr(EXPR_SPELLFIELD);
+ expr_t *retval = magic_new_expr(EXPR::SPELLFIELD);
retval->e.e_field.id = id;
retval->e.e_field.expr = expr;
return retval;
}
-static expr_t *
-fun_expr(const char *name, int args_nr, expr_t **args, int line, int column)
+static
+expr_t *fun_expr(const char *name, int args_nr, expr_t **args, int line, int column)
{
int id;
expr_t *expr;
@@ -803,14 +819,14 @@ fun_expr(const char *name, int args_nr, expr_t **args, int line, int column)
if (!fun) {
fail(line, column, "Unknown function `%s'\n", name);
} else if (strlen(fun->signature) != args_nr) {
- fail(line, column, "Incorrect number of arguments to function `%s': Expected %d, found %d\n", name, strlen(fun->signature), args_nr);
+ fail(line, column, "Incorrect number of arguments to function `%s': Expected %zu, found %d\n", name, strlen(fun->signature), args_nr);
fun = NULL;
}
if (fun) {
int i;
- expr = magic_new_expr(EXPR_FUNAPP);
+ expr = magic_new_expr(EXPR::FUNAPP);
expr->e.e_funapp.line_nr = line;
expr->e.e_funapp.column = column;
expr->e.e_funapp.id = id;
@@ -819,15 +835,15 @@ fun_expr(const char *name, int args_nr, expr_t **args, int line, int column)
for (i = 0; i < args_nr; i++)
expr->e.e_funapp.args[i] = args[i];
} else { /* failure */
- expr = magic_new_expr(EXPR_VAL);
- expr->e.e_val.ty = TY_FAIL;
+ expr = magic_new_expr(EXPR::VAL);
+ expr->e.e_val.ty = TYPE::FAIL;
}
return expr;
}
-static spell_t *
-new_spell(spellguard_t *guard)
+static
+spell_t *new_spell(spellguard_t *guard)
{
static int spell_counter = 0;
@@ -837,16 +853,16 @@ new_spell(spellguard_t *guard)
return retval;
}
-static spellguard_t *
-new_spellguard(int ty)
+static
+spellguard_t *new_spellguard(SPELLGUARD ty)
{
spellguard_t *retval = (spellguard_t *)calloc(1, sizeof(spellguard_t));
retval->ty = ty;
return retval;
}
-static spellguard_t *
-spellguard_implication(spellguard_t *a, spellguard_t *b)
+static
+spellguard_t *spellguard_implication(spellguard_t *a, spellguard_t *b)
{
spellguard_t *retval = a;
@@ -864,7 +880,7 @@ spellguard_implication(spellguard_t *a, spellguard_t *b)
return retval;
/* If the premise is a disjunction, b is the continuation of _all_ branches */
- if (a->ty == SPELLGUARD_CHOICE)
+ if (a->ty == SPELLGUARD::CHOICE)
spellguard_implication(a->s.s_alt, b);
if (a->next)
spellguard_implication(a->next, b);
@@ -875,16 +891,16 @@ spellguard_implication(spellguard_t *a, spellguard_t *b)
return retval;
}
-static effect_t *
-new_effect(int ty)
+static
+effect_t *new_effect(EFFECT ty)
{
effect_t *effect = (effect_t *) calloc(1, sizeof(effect_t));
effect->ty = ty;
return effect;
}
-static effect_t *
-set_effect_continuation(effect_t *src, effect_t *continuation)
+static
+effect_t *set_effect_continuation(effect_t *src, effect_t *continuation)
{
effect_t *retval = src;
/* This function is completely analogous to `spellguard_implication' above; read the control flow implications above first before pondering it. */
@@ -894,7 +910,7 @@ set_effect_continuation(effect_t *src, effect_t *continuation)
/* For FOR and FOREACH, we use special stack handlers and thus don't have to set
* the continuation. It's only IF that we need to handle in this fashion. */
- if (src->ty == EFFECT_IF) {
+ if (src->ty == EFFECT::IF) {
set_effect_continuation(src->e.e_if.true_branch, continuation);
set_effect_continuation(src->e.e_if.false_branch, continuation);
}
@@ -906,8 +922,8 @@ set_effect_continuation(effect_t *src, effect_t *continuation)
return retval;
}
-static effect_t *
-op_effect(char *name, int args_nr, expr_t **args, int line, int column)
+static
+effect_t *op_effect(char *name, int args_nr, expr_t **args, int line, int column)
{
int id;
effect_t *effect;
@@ -916,14 +932,14 @@ op_effect(char *name, int args_nr, expr_t **args, int line, int column)
if (!op)
fail(line, column, "Unknown operation `%s'\n", name);
else if (strlen(op->signature) != args_nr) {
- fail(line, column, "Incorrect number of arguments to operation `%s': Expected %d, found %d\n", name, strlen(op->signature), args_nr);
+ fail(line, column, "Incorrect number of arguments to operation `%s': Expected %zu, found %d\n", name, strlen(op->signature), args_nr);
op = NULL;
}
if (op) {
int i;
- effect = new_effect(EFFECT_OP);
+ effect = new_effect(EFFECT::OP);
effect->e.e_op.line_nr = line;
effect->e.e_op.column = column;
effect->e.e_op.id = id;
@@ -932,7 +948,7 @@ op_effect(char *name, int args_nr, expr_t **args, int line, int column)
for (i = 0; i < args_nr; i++)
effect->e.e_op.args[i] = args[i];
} else /* failure */
- effect = new_effect(EFFECT_SKIP);
+ effect = new_effect(EFFECT::SKIP);
return effect;
}
@@ -942,20 +958,20 @@ proc_t *procs = NULL;
int procs_nr = 0;
// I think this is a memory leak, or undefined behavior
-static void
-install_proc(proc_t *proc)
+static
+void install_proc(proc_t *proc)
{
if (!procs) {
procs = proc;
procs_nr = 1;
} else {
- RECREATE (procs, proc_t, 1 + procs_nr);
+ RECREATE(procs, proc_t, 1 + procs_nr);
procs[procs_nr++] = *proc;
}
}
-static effect_t *
-call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column)
+static
+effect_t *call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column)
{
proc_t *p = NULL;
int i;
@@ -969,15 +985,15 @@ call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column)
if (!p) {
fail(line_nr, column, "Unknown procedure `%s'\n", name);
- return new_effect(EFFECT_SKIP);
+ return new_effect(EFFECT::SKIP);
}
if (p->args_nr != args_nr) {
fail(line_nr, column, "Procedure %s/%d invoked with %d parameters\n", name, p->args_nr, args_nr);
- return new_effect(EFFECT_SKIP);
+ return new_effect(EFFECT::SKIP);
}
- retval = new_effect(EFFECT_CALL);
+ retval = new_effect(EFFECT::CALL);
retval->e.e_call.body = p->body;
retval->e.e_call.args_nr = args_nr;
retval->e.e_call.formals = p->args;
@@ -992,8 +1008,8 @@ struct const_def_rec {
int const_defs_nr = 0;
-static void
-bind_constant(char *name, val_t *val, int line_nr)
+static
+void bind_constant(char *name, val_t *val, int line_nr)
{
if (find_constant(name)) {
fail(line_nr, 0, "Redefinition of constant `%s'\n", name);
@@ -1011,8 +1027,8 @@ bind_constant(char *name, val_t *val, int line_nr)
++const_defs_nr;
}
-static val_t *
-find_constant(char *name)
+static
+val_t *find_constant(char *name)
{
int i;
for (i = 0; i < const_defs_nr; i++) {
@@ -1027,8 +1043,16 @@ find_constant(char *name)
-
-#define INTERN_ASSERT(name, id) { int zid = intern_id(name); if (zid != id) fprintf(stderr, "[magic-conf] INTERNAL ERROR: Builtin special var %s interned to %d, not %d as it should be!\n", name, zid, id); error_flag = 1; }
+// FIXME: macro capture
+#define INTERN_ASSERT(name, id) \
+{ \
+ int zid = intern_id(name); \
+ if (zid != id) \
+ FPRINTF(stderr, \
+ "[magic-conf] INTERNAL ERROR: Builtin special var %s interned to %d, not %d as it should be!\n", \
+ name, zid, id); \
+ error_flag = 1; \
+}
extern FILE *magic_frontend_in;
@@ -1063,18 +1087,18 @@ int magic_init(const char *conffile)
magic_frontend_in = fopen(conffile, "r");
if (!magic_frontend_in) {
- fprintf(stderr, "[magic-conf] Magic configuration file `%s' not found -> no magic.\n", conffile);
+ FPRINTF(stderr, "[magic-conf] Magic configuration file `%s' not found -> no magic.\n", conffile);
return 0;
}
magic_frontend_parse();
- if (magic_conf.vars[VAR_MIN_CASTTIME].ty == TY_INT)
+ if (magic_conf.vars[VAR_MIN_CASTTIME].ty == TYPE::INT)
magic_conf.min_casttime = magic_conf.vars[VAR_MIN_CASTTIME].v.v_int;
- if (magic_conf.vars[VAR_OBSCURE_CHANCE].ty == TY_INT)
+ if (magic_conf.vars[VAR_OBSCURE_CHANCE].ty == TYPE::INT)
magic_conf.obscure_chance = magic_conf.vars[VAR_OBSCURE_CHANCE].v.v_int;
- printf("[magic-conf] Magic initialised; obscure at %d%%. %d spells, %d teleport anchors.\n",
+ PRINTF("[magic-conf] Magic initialised; obscure at %d%%. %d spells, %d teleport anchors.\n",
magic_conf.obscure_chance, magic_conf.spells_nr, magic_conf.anchors_nr);
if (procs)
@@ -1084,9 +1108,9 @@ int magic_init(const char *conffile)
extern int magic_frontend_lineno;
-static void
-magic_frontend_error(const char *msg)
+static
+void magic_frontend_error(const char *msg)
{
- fprintf(stderr, "[magic-conf] Parse error: %s at line %d\n", msg, magic_frontend_lineno);
+ FPRINTF(stderr, "[magic-conf] Parse error: %s at line %d\n", msg, magic_frontend_lineno);
failed_flag = 1;
}
diff --git a/src/map/magic-interpreter.hpp b/src/map/magic-interpreter.hpp
index 21e8d39..22223ec 100644
--- a/src/map/magic-interpreter.hpp
+++ b/src/map/magic-interpreter.hpp
@@ -1,62 +1,12 @@
-/* Magic interpreter */
-
#ifndef MAGIC_INTERPRETER_HPP
#define MAGIC_INTERPRETER_HPP
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#include "../common/nullpo.hpp"
+#include "magic-interpreter.t.hpp"
-#include "battle.hpp"
-#include "chat.hpp"
-#include "chrif.hpp"
-#include "clif.hpp"
-#include "intif.hpp"
-#include "itemdb.hpp"
#include "magic.hpp"
#include "map.hpp"
-#include "mob.hpp"
-#include "npc.hpp"
-#include "pc.hpp"
-#include "party.hpp"
#include "script.hpp"
-#include "skill.hpp"
-#include "storage.hpp"
-#include "trade.hpp"
-
-#include "../common/timer.hpp"
-#include "../common/socket.hpp"
-
-#define SPELLARG_NONE 0 /* No spell parameter */
-#define SPELLARG_PC 1 /* Spell parameter describes pc (defaults to self) */
-#define SPELLARG_STRING 2 /* Spell parameter describes pc (defaults to self) */
-
-/* ------ */
-/* Values */
-/* ------ */
-
-#define TY_UNDEF 0
-#define TY_INT 1
-#define TY_DIR 2
-#define TY_STRING 3
-#define TY_ENTITY 5
-#define TY_LOCATION 6
-#define TY_AREA 7
-#define TY_SPELL 8
-#define TY_INVOCATION 9
-#define TY_FAIL 127
-
-#define DIR_S 0
-#define DIR_SW 1
-#define DIR_W 2
-#define DIR_NW 3
-#define DIR_N 4
-#define DIR_NE 5
-#define DIR_E 6
-#define DIR_SE 7
+#include "skill.t.hpp"
struct expr;
struct val;
@@ -67,15 +17,10 @@ struct invocation;
typedef struct location
{
- int m;
- int x, y;
+ int m;
+ int x, y;
} location_t;
-#define AREA_LOCATION 0
-#define AREA_UNION 1
-#define AREA_RECT 2
-#define AREA_BAR 3
-
typedef struct area
{
union a
@@ -84,24 +29,26 @@ typedef struct area
struct
{
location_t loc;
- int width, depth, dir;
+ int width, depth;
+ DIR dir;
} a_bar;
struct
{
location_t loc;
- int width, height;
+ int width, height;
} a_rect;
struct area *a_union[2];
} a;
- int size;
- unsigned char ty;
+ int size;
+ AREA ty;
} area_t;
typedef struct val
{
union v
{
- int v_int;
+ int v_int;
+ DIR v_dir;
char *v_string;
entity_t *v_entity; /* Used ONLY during operation/function invocation; otherwise we use v_int */
area_t *v_area;
@@ -109,7 +56,7 @@ typedef struct val
struct invocation *v_invocation; /* Used ONLY during operation/function invocation; otherwise we use v_int */
struct spell *v_spell;
} v;
- unsigned char ty;
+ TYPE ty;
} val_t;
/* ----------- */
@@ -118,13 +65,6 @@ typedef struct val
#define MAX_ARGS 7 /* Max. # of args used in builtin primitive functions */
-#define EXPR_VAL 0
-#define EXPR_LOCATION 1
-#define EXPR_AREA 2
-#define EXPR_FUNAPP 3
-#define EXPR_ID 4
-#define EXPR_SPELLFIELD 5
-
typedef struct e_location
{
struct expr *m, *x, *y;
@@ -147,7 +87,7 @@ typedef struct e_area
} a_rect;
struct e_area *a_union[2];
} a;
- unsigned char ty;
+ AREA ty;
} e_area_t;
typedef struct expr
@@ -159,44 +99,20 @@ typedef struct expr
e_area_t e_area;
struct
{
- int id, line_nr, column;
- int args_nr;
+ int id, line_nr, column;
+ int args_nr;
struct expr *args[MAX_ARGS];
} e_funapp;
- int e_id;
+ int e_id;
struct
{
struct expr *expr;
- int id;
+ int id;
} e_field;
} e;
- unsigned char ty;
+ EXPR ty;
} expr_t;
-/* ------- */
-/* Effects */
-/* ------- */
-
-#define EFFECT_SKIP 0
-#define EFFECT_ABORT 1
-#define EFFECT_ASSIGN 2
-#define EFFECT_FOREACH 3
-#define EFFECT_FOR 4
-#define EFFECT_IF 5
-#define EFFECT_SLEEP 6
-#define EFFECT_SCRIPT 7
-#define EFFECT_BREAK 8
-#define EFFECT_OP 9
-#define EFFECT_END 10
-#define EFFECT_CALL 11
-
-#define FOREACH_FILTER_MOB 1
-#define FOREACH_FILTER_PC 2
-#define FOREACH_FILTER_ENTITY 3
-#define FOREACH_FILTER_TARGET 4
-#define FOREACH_FILTER_SPELL 5
-#define FOREACH_FILTER_NPC 6
-
typedef struct effect
{
struct effect *next;
@@ -204,19 +120,19 @@ typedef struct effect
{
struct
{
- int id;
+ int id;
expr_t *expr;
} e_assign;
struct
{
- int id;
+ int id;
expr_t *area;
struct effect *body;
- unsigned char filter;
+ FOREACH_FILTER filter;
} e_foreach;
struct
{
- int id;
+ int id;
expr_t *start, *stop;
struct effect *body;
} e_for;
@@ -229,19 +145,19 @@ typedef struct effect
const ScriptCode *e_script;
struct
{
- int id;
- int args_nr;
- int line_nr, column;
+ int id;
+ int args_nr;
+ int line_nr, column;
expr_t *args[MAX_ARGS];
} e_op;
struct
{
- int args_nr, *formals;
+ int args_nr, *formals;
expr_t **actuals;
struct effect *body;
} e_call;
} e;
- unsigned char ty;
+ EFFECT ty;
} effect_t;
/* ---------- */
@@ -251,21 +167,10 @@ typedef struct effect
typedef struct component
{
struct component *next;
- int item_id;
- int count;
+ int item_id;
+ int count;
} component_t;
-/* ----------- */
-/* Spellguards */
-/* ----------- */
-
-#define SPELLGUARD_CONDITION 0
-#define SPELLGUARD_COMPONENTS 1
-#define SPELLGUARD_CATALYSTS 2
-#define SPELLGUARD_CHOICE 3
-#define SPELLGUARD_MANA 4
-#define SPELLGUARD_CASTTIME 5
-#define SPELLGUARD_EFFECT 6
typedef struct effect_set
{
@@ -285,7 +190,7 @@ typedef struct spellguard
struct spellguard *s_alt; /* either `next' or `s.s_alt' */
effect_set_t s_effect;
} s;
- unsigned char ty;
+ SPELLGUARD ty;
} spellguard_t;
/* ------ */
@@ -294,24 +199,20 @@ typedef struct spellguard
typedef struct letdef
{
- int id;
+ int id;
expr_t *expr;
} letdef_t;
-#define SPELL_FLAG_LOCAL (1 << 0) // spell associated not with caster but with place
-#define SPELL_FLAG_SILENT (1 << 1) // spell invocation never uttered
-#define SPELL_FLAG_NONMAGIC (1 << 2) // `magic word' only: don't require spellcasting ability
-
typedef struct spell
{
char *name;
char *invocation;
- int index; // Relative location in the definitions file
- int flags;
- int arg;
- int spellarg_ty;
+ int index; // Relative location in the definitions file
+ SPELL_FLAG flags;
+ int arg;
+ SPELLARG spellarg_ty;
- int letdefs_nr;
+ int letdefs_nr;
letdef_t *letdefs;
spellguard_t *spellguard;
@@ -334,31 +235,32 @@ typedef struct teleport_anchor
typedef struct
{
- int vars_nr;
+ int vars_nr;
const char **var_name;
val_t *vars; /* Initial assignments, if any, or NULL */
- int obscure_chance;
- int min_casttime;
+ int obscure_chance;
+ int min_casttime;
- int spells_nr;
+ int spells_nr;
spell_t **spells;
- int anchors_nr; /* NEGATIVE iff we have sorted the anchors */
+ int anchors_nr; /* NEGATIVE iff we have sorted the anchors */
teleport_anchor_t **anchors;
} magic_conf_t;
/* Execution environment */
-#define VAR_MIN_CASTTIME 0
-#define VAR_OBSCURE_CHANCE 1
-#define VAR_CASTER 2
-#define VAR_SPELLPOWER 3
-#define VAR_SPELL 4
-#define VAR_INVOCATION 5
-#define VAR_TARGET 6
-#define VAR_SCRIPTTARGET 7
-#define VAR_LOCATION 8
+// these are not an enum they're a nasty intern hack
+#define VAR_MIN_CASTTIME 0
+#define VAR_OBSCURE_CHANCE 1
+#define VAR_CASTER 2
+#define VAR_SPELLPOWER 3
+#define VAR_SPELL 4
+#define VAR_INVOCATION 5
+#define VAR_TARGET 6
+#define VAR_SCRIPTTARGET 7
+#define VAR_LOCATION 8
struct magic_config;
@@ -370,10 +272,6 @@ typedef struct env
#define MAX_STACK_SIZE 32
-#define CONT_STACK_FOREACH 0
-#define CONT_STACK_FOR 1
-#define CONT_STACK_PROC 2
-
typedef struct cont_activation_record
{
effect_t *return_location;
@@ -381,62 +279,59 @@ typedef struct cont_activation_record
{
struct
{
- int id, ty;
+ int id;
+ TYPE ty;
effect_t *body;
- int entities_nr;
+ int entities_nr;
int *entities;
- int index;
+ int index;
} c_foreach;
struct
{
- int id;
+ int id;
effect_t *body;
- int current;
- int stop;
+ int current;
+ int stop;
} c_for;
struct
{
- int args_nr, *formals;
+ int args_nr, *formals;
val_t *old_actuals;
} c_proc;
} c;
- unsigned char ty;
+ CONT_STACK ty;
} cont_activation_record_t;
typedef struct status_change_ref
{
- int sc_type;
- int bl_id;
+ StatusChange sc_type;
+ int bl_id;
} status_change_ref_t;
-#define INVOCATION_FLAG_BOUND (1 << 0) /* Bound directly to the caster (i.e., ignore its location) */
-#define INVOCATION_FLAG_ABORTED (1 << 1) /* Used `abort' to terminate */
-#define INVOCATION_FLAG_STOPATTACK (1 << 2) /* On magical attacks: if we run out of steam, stop attacking altogether */
-
typedef struct invocation
{
struct block_list bl;
struct invocation *next_invocation; /* used for spells directly associated with a caster: they form a singly-linked list */
- int flags;
+ INVOCATION_FLAG flags;
env_t *env;
spell_t *spell;
- int caster; /* this is the person who originally invoked the spell */
- int subject; /* when this person dies, the spell dies with it */
+ int caster; /* this is the person who originally invoked the spell */
+ int subject; /* when this person dies, the spell dies with it */
- int timer; /* spell timer, if any */
+ Timer timer; /* spell timer, if any */
- int stack_size;
+ int stack_size;
cont_activation_record_t stack[MAX_STACK_SIZE];
- int script_pos; /* Script position; if nonzero, resume the script we were running. */
+ int script_pos; /* Script position; if nonzero, resume the script we were running. */
effect_t *current_effect;
effect_t *trigger_effect; /* If non-NULL, this is used to spawn a cloned effect based on the same environment */
effect_t *end_effect; /* If non-NULL, this is executed when the spell terminates naturally, e.g. when all status changes have run out or all delays are over. */
/* Status change references: for status change updates, keep track of whom we updated where */
- int status_change_refs_nr;
+ int status_change_refs_nr;
status_change_ref_t *status_change_refs;
} invocation_t;
@@ -447,58 +342,58 @@ extern env_t magic_default_env; /* Fake default environment */
/**
* Adds a component selection to a component holder (which may initially be NULL)
*/
-void magic_add_component (component_t ** component_holder, int id, int count);
+void magic_add_component(component_t ** component_holder, int id, int count);
-teleport_anchor_t *magic_find_anchor (char *name);
+teleport_anchor_t *magic_find_anchor(char *name);
/**
* The parameter `param' must have been dynamically allocated; ownership is transferred to the resultant env_t.
*/
-env_t *spell_create_env (magic_conf_t * conf, spell_t * spell,
- character_t * caster, int spellpower, char *param);
+env_t *spell_create_env(magic_conf_t *conf, spell_t *spell,
+ character_t *caster, int spellpower, char *param);
-void magic_free_env (env_t * env);
+void magic_free_env(env_t *env);
/**
* near_miss is set to nonzero iff the spell only failed due to ephemereal issues (spell delay in effect, out of mana, out of components)
*/
-effect_set_t *spell_trigger (spell_t * spell, character_t * caster,
- env_t * env, int *near_miss);
+effect_set_t *spell_trigger(spell_t *spell, character_t *caster,
+ env_t *env, int *near_miss);
-invocation_t *spell_instantiate (effect_set_t * effect, env_t * env);
+invocation_t *spell_instantiate(effect_set_t *effect, env_t *env);
/**
* Bind a spell to a subject (this is a no-op for `local' spells).
*/
-void spell_bind (character_t * subject, invocation_t * invocation);
+void spell_bind(character_t *subject, invocation_t *invocation);
-int // 1 on failure
- spell_unbind (character_t * subject, invocation_t * invocation);
+// 1 on failure
+int spell_unbind(character_t *subject, invocation_t *invocation);
/**
* Clones a spell to run the at_effect field
*/
-invocation_t *spell_clone_effect (invocation_t * source);
+invocation_t *spell_clone_effect(invocation_t *source);
-spell_t *magic_find_spell (char *invocation);
+spell_t *magic_find_spell(char *invocation);
/* The following is used only by the parser: */
typedef struct args_rec
{
- int args_nr;
+ int args_nr;
expr_t **args;
} args_rec_t;
typedef struct
{
char *name;
- int args_nr;
+ int args_nr;
int *args;
effect_t *body;
} proc_t;
// must be called after itemdb initialisation
int magic_init(const char *);
-void spell_update_location (invocation_t * invocation);
+void spell_update_location(invocation_t *invocation);
-#endif /* !defined (MAGIC_INTERPRETER_H) */
+#endif // MAGIC_INTERPRETER_HPP
diff --git a/src/map/magic-interpreter.t.hpp b/src/map/magic-interpreter.t.hpp
new file mode 100644
index 0000000..d5aa5e5
--- /dev/null
+++ b/src/map/magic-interpreter.t.hpp
@@ -0,0 +1,159 @@
+#ifndef MAGIC_INTERPRETER_T_HPP
+#define MAGIC_INTERPRETER_T_HPP
+
+#include "../common/utils2.hpp"
+
+enum class SPELLARG : uint8_t
+{
+ NONE,
+ PC,
+ STRING,
+};
+
+enum class TYPE : uint8_t
+{
+ UNDEF,
+ INT,
+ DIR,
+ STRING,
+ ENTITY,
+ LOCATION,
+ AREA,
+ SPELL,
+ INVOCATION,
+ FAIL = 127,
+
+ NEGATIVE_1 = 255,
+};
+
+// Note: there is also a typedef by this name in <dirent.h>
+// but we should be fine since we never include it.
+// (in the long term we should still rename this though)
+enum class DIR : uint8_t
+{
+ S = 0,
+ SW = 1,
+ W = 2,
+ NW = 3,
+ N = 4,
+ NE = 5,
+ E = 6,
+ SE = 7,
+
+ COUNT,
+};
+
+constexpr
+earray<int, DIR, DIR::COUNT> dirx //=
+{{
+ 0, -1, -1, -1, 0, 1, 1, 1,
+}}, diry //=
+{{
+ 1, 1, 0, -1, -1, -1, 0, 1,
+}};
+
+constexpr
+bool dir_is_diagonal(DIR d)
+{
+ return static_cast<uint8_t>(d) & 1;
+}
+
+enum class AREA : uint8_t
+{
+ LOCATION,
+ UNION,
+ RECT,
+ BAR,
+};
+
+enum class EXPR : uint8_t
+{
+ VAL,
+ LOCATION,
+ AREA,
+ FUNAPP,
+ ID,
+ SPELLFIELD,
+};
+
+// temporary rename to avoid collision with enum value
+// in magic-interpreter-parser
+enum class EFFECT : uint8_t
+{
+ SKIP,
+ ABORT,
+ ASSIGN,
+ FOREACH,
+ FOR,
+ IF,
+ SLEEP,
+ SCRIPT,
+ BREAK,
+ OP,
+ END,
+ CALL,
+};
+
+enum class FOREACH_FILTER : uint8_t
+{
+ MOB,
+ PC,
+ ENTITY,
+ TARGET,
+ SPELL,
+ NPC,
+};
+
+enum class SPELLGUARD : uint8_t
+{
+ CONDITION,
+ COMPONENTS,
+ CATALYSTS,
+ CHOICE,
+ MANA,
+ CASTTIME,
+ EFFECT,
+};
+
+namespace e
+{
+enum class SPELL_FLAG : uint8_t
+{
+ ZERO = 0,
+
+ // spell associated not with caster but with place
+ LOCAL = 1 << 0,
+ // spell invocation never uttered
+ SILENT = 1 << 1,
+ // `magic word' only: don't require spellcasting ability
+ NONMAGIC = 1 << 2,
+};
+ENUM_BITWISE_OPERATORS(SPELL_FLAG)
+}
+using e::SPELL_FLAG;
+
+enum class CONT_STACK : uint8_t
+{
+ FOREACH,
+ FOR,
+ PROC,
+};
+
+namespace e
+{
+enum class INVOCATION_FLAG : uint8_t
+{
+ ZERO = 0,
+
+ // Bound directly to the caster (i.e., ignore its location)
+ BOUND = 1 << 0,
+ // Used `abort' to terminate
+ ABORTED = 1 << 1,
+ // On magical attacks: if we run out of steam, stop attacking altogether
+ STOPATTACK = 1 << 2,
+};
+ENUM_BITWISE_OPERATORS(INVOCATION_FLAG)
+}
+using e::INVOCATION_FLAG;
+
+#endif // MAGIC_INTERPRETER_T_HPP
diff --git a/src/map/magic-stmt.cpp b/src/map/magic-stmt.cpp
index 5dd51d7..f132ca6 100644
--- a/src/map/magic-stmt.cpp
+++ b/src/map/magic-stmt.cpp
@@ -1,282 +1,314 @@
-#include "magic-interpreter.hpp"
+#include <cassert>
+
+#include "../common/cxxstdio.hpp"
+#include "../common/random2.hpp"
+#include "../common/timer.hpp"
+
#include "magic-expr.hpp"
#include "magic-expr-eval.hpp"
+#include "magic-interpreter.hpp"
#include "magic-interpreter-aux.hpp"
-#define INVISIBLE_NPC 127 /* used for local spell effects */
+#include "battle.hpp"
+#include "clif.hpp"
+#include "mob.hpp"
+#include "npc.hpp"
+#include "pc.hpp"
+#include "skill.hpp"
+
+#include "../poison.hpp"
+
+/* used for local spell effects */
+constexpr int INVISIBLE_NPC = 127;
//#define DEBUG
#ifdef DEBUG
-static void print_val (val_t * v)
+static
+void print_val(val_t *v)
{
switch (v->ty)
{
- case TY_UNDEF:
- fprintf (stderr, "UNDEF");
+ case TYPE::UNDEF:
+ FPRINTF(stderr, "UNDEF");
break;
- case TY_INT:
- fprintf (stderr, "%d", v->v.v_int);
+ case TYPE::INT:
+ FPRINTF(stderr, "%d", v->v.v_int);
break;
- case TY_DIR:
- fprintf (stderr, "dir%d", v->v.v_int);
+ case TYPE::DIR:
+ FPRINTF(stderr, "dir%d", v->v.v_int);
break;
- case TY_STRING:
- fprintf (stderr, "`%s'", v->v.v_string);
+ case TYPE::STRING:
+ FPRINTF(stderr, "`%s'", v->v.v_string);
break;
default:
- fprintf (stderr, "ty%d", v->ty);
+ FPRINTF(stderr, "ty%d", v->ty);
break;
}
}
-static void dump_env (env_t * env)
+static
+void dump_env(env_t *env)
{
- int i;
+ int i;
for (i = 0; i < env->base_env->vars_nr; i++)
{
val_t *v = &env->vars[i];
val_t *bv = &env->base_env->vars[i];
- fprintf (stderr, "%02x %30s ", i, env->base_env->var_name[i]);
- print_val (v);
- fprintf (stderr, "\t(");
- print_val (bv);
- fprintf (stderr, ")\n");
+ FPRINTF(stderr, "%02x %30s ", i, env->base_env->var_name[i]);
+ print_val(v);
+ FPRINTF(stderr, "\t(");
+ print_val(bv);
+ FPRINTF(stderr, ")\n");
}
}
#endif
-static void clear_activation_record (cont_activation_record_t * ar)
+static
+void clear_activation_record(cont_activation_record_t *ar)
{
switch (ar->ty)
{
- case CONT_STACK_FOREACH:
- free (ar->c.c_foreach.entities);
+ case CONT_STACK::FOREACH:
+ free(ar->c.c_foreach.entities);
break;
- case CONT_STACK_PROC:
- free (ar->c.c_proc.old_actuals);
+ case CONT_STACK::PROC:
+ free(ar->c.c_proc.old_actuals);
break;
}
}
-static void
-invocation_timer_callback (timer_id UNUSED, tick_t UNUSED, custom_id_t id, custom_data_t data)
+static
+void invocation_timer_callback(TimerData *, tick_t, int id)
{
- invocation_t *invocation = (invocation_t *) map_id2bl (id);
+ invocation_t *invocation = (invocation_t *) map_id2bl(id);
- if (invocation)
+ assert (invocation != NULL);
{
- invocation->timer = 0;
- spell_execute (invocation);
+ spell_execute(invocation);
}
}
-static void clear_stack (invocation_t * invocation)
+static
+void clear_stack(invocation_t *invocation)
{
- int i;
+ int i;
for (i = 0; i < invocation->stack_size; i++)
- clear_activation_record (&invocation->stack[i]);
+ clear_activation_record(&invocation->stack[i]);
invocation->stack_size = 0;
}
-void spell_free_invocation (invocation_t * invocation)
+void spell_free_invocation(invocation_t *invocation)
{
if (invocation->status_change_refs)
{
- free (invocation->status_change_refs);
+ free(invocation->status_change_refs);
/* The following cleanup shouldn't be necessary, but I've added it to help tracking a certain bug */
invocation->status_change_refs = NULL;
invocation->status_change_refs_nr = 0;
}
- if (invocation->flags & INVOCATION_FLAG_BOUND)
+ if (bool(invocation->flags & INVOCATION_FLAG::BOUND))
{
- entity_t *e = map_id2bl (invocation->subject);
- if (e && e->type == BL_PC)
- spell_unbind ((character_t *) e, invocation);
+ entity_t *e = map_id2bl(invocation->subject);
+ if (e && e->type == BL::PC)
+ spell_unbind((character_t *) e, invocation);
}
- clear_stack (invocation);
+ clear_stack(invocation);
- if (invocation->timer)
- delete_timer (invocation->timer, invocation_timer_callback);
+ invocation->timer.cancel();
- magic_free_env (invocation->env);
+ magic_free_env(invocation->env);
- map_delblock (&invocation->bl);
- map_delobject (invocation->bl.id, BL_SPELL); // also frees the object
+ map_delblock(&invocation->bl);
+ map_delobject(invocation->bl.id, BL::SPELL); // also frees the object
// free(invocation);
}
-static void
-char_set_weapon_icon (character_t * subject, int count, int icon, int look)
+static
+void char_set_weapon_icon(character_t *subject, int count,
+ StatusChange icon, int look)
{
- const int old_icon = subject->attack_spell_icon_override;
+ const StatusChange old_icon = subject->attack_spell_icon_override;
subject->attack_spell_icon_override = icon;
subject->attack_spell_look_override = look;
- if (old_icon && old_icon != icon)
- clif_status_change (&subject->bl, old_icon, 0);
+ if (old_icon != StatusChange::ZERO && old_icon != icon)
+ clif_status_change(&subject->bl, old_icon, 0);
- clif_fixpcpos (subject);
+ clif_fixpcpos(subject);
if (count)
{
- clif_changelook (&subject->bl, LOOK_WEAPON, look);
- if (icon)
- clif_status_change (&subject->bl, icon, 1);
+ clif_changelook(&subject->bl, LOOK::WEAPON, look);
+ if (icon != StatusChange::ZERO)
+ clif_status_change(&subject->bl, icon, 1);
}
else
{
/* Set it to `normal' */
- clif_changelook (&subject->bl, LOOK_WEAPON, subject->status.weapon);
+ clif_changelook(&subject->bl, LOOK::WEAPON,
+ static_cast<uint16_t>(subject->status.weapon));
}
}
-static void char_set_attack_info (character_t * subject, int speed, int range)
+static
+void char_set_attack_info(character_t *subject, interval_t speed, int range)
{
subject->attack_spell_delay = speed;
subject->attack_spell_range = range;
- if (speed == 0)
+ if (speed == interval_t::zero())
{
- pc_calcstatus (subject, 1);
- clif_updatestatus (subject, SP_ASPD);
- clif_updatestatus (subject, SP_ATTACKRANGE);
+ pc_calcstatus(subject, 1);
+ clif_updatestatus(subject, SP::ASPD);
+ clif_updatestatus(subject, SP::ATTACKRANGE);
}
else
{
subject->aspd = speed;
- clif_updatestatus (subject, SP_ASPD);
- clif_updatestatus (subject, SP_ATTACKRANGE);
+ clif_updatestatus(subject, SP::ASPD);
+ clif_updatestatus(subject, SP::ATTACKRANGE);
}
}
-void magic_stop_completely (character_t * c)
+void magic_stop_completely(character_t *c)
{
- int i;
// Zap all status change references to spells
- for (i = 0; i < MAX_STATUSCHANGE; i++)
+ for (StatusChange i : erange(StatusChange(), StatusChange::MAX_STATUSCHANGE))
c->sc_data[i].spell_invocation = 0;
while (c->active_spells)
- spell_free_invocation (c->active_spells);
+ spell_free_invocation(c->active_spells);
if (c->attack_spell_override)
{
invocation_t *attack_spell =
- (invocation_t *) map_id2bl (c->attack_spell_override);
+ (invocation_t *) map_id2bl(c->attack_spell_override);
if (attack_spell)
- spell_free_invocation (attack_spell);
+ spell_free_invocation(attack_spell);
c->attack_spell_override = 0;
- char_set_weapon_icon (c, 0, 0, 0);
- char_set_attack_info (c, 0, 0);
+ char_set_weapon_icon(c, 0, StatusChange::ZERO, 0);
+ char_set_attack_info(c, interval_t::zero(), 0);
}
}
/* Spell execution has finished normally or we have been notified by a finished skill timer */
-static void try_to_finish_invocation (invocation_t * invocation)
+static
+void try_to_finish_invocation(invocation_t *invocation)
{
if (invocation->status_change_refs_nr == 0 && !invocation->current_effect)
{
if (invocation->end_effect)
{
- clear_stack (invocation);
+ clear_stack(invocation);
invocation->current_effect = invocation->end_effect;
invocation->end_effect = NULL;
- spell_execute (invocation);
+ spell_execute(invocation);
}
else
- spell_free_invocation (invocation);
+ spell_free_invocation(invocation);
}
}
-static int trigger_spell (int subject, int spell)
+static
+int trigger_spell(int subject, int spell)
{
- invocation_t *invocation = (invocation_t *) map_id2bl (spell);
+ invocation_t *invocation = (invocation_t *) map_id2bl(spell);
if (!invocation)
return 0;
- invocation = spell_clone_effect (invocation);
+ invocation = spell_clone_effect(invocation);
- spell_bind ((character_t *) map_id2bl (subject), invocation);
- magic_clear_var (&invocation->env->vars[VAR_CASTER]);
- invocation->env->vars[VAR_CASTER].ty = TY_ENTITY;
+ spell_bind((character_t *) map_id2bl(subject), invocation);
+ magic_clear_var(&invocation->env->vars[VAR_CASTER]);
+ invocation->env->vars[VAR_CASTER].ty = TYPE::ENTITY;
invocation->env->vars[VAR_CASTER].v.v_int = subject;
return invocation->bl.id;
}
-static void entity_warp (entity_t * target, int destm, int destx, int desty);
+static
+void entity_warp(entity_t *target, int destm, int destx, int desty);
-static void char_update (character_t * character)
+static
+void char_update(character_t *character)
{
- entity_warp ((entity_t *) character, character->bl.m, character->bl.x,
+ entity_warp((entity_t *) character, character->bl.m, character->bl.x,
character->bl.y);
}
-static void timer_callback_effect (timer_id UNUSED, tick_t UNUSED, custom_id_t id, custom_data_t data)
+static
+void timer_callback_effect(TimerData *, tick_t, int id, int data)
{
- entity_t *target = map_id2bl (id);
+ entity_t *target = map_id2bl(id);
if (target)
- clif_misceffect (target, data);
+ clif_misceffect(target, data);
}
-static void entity_effect (entity_t * entity, int effect_nr, int delay)
+static
+void entity_effect(entity_t *entity, int effect_nr, interval_t delay)
{
- add_timer (gettick () + delay,
- &timer_callback_effect, entity->id, effect_nr);
+ Timer(gettick() + delay,
+ std::bind(&timer_callback_effect, ph::_1, ph::_2,
+ entity->id, effect_nr)
+ ).detach();
}
-void magic_unshroud (character_t * other_char)
+void magic_unshroud(character_t *other_char)
{
other_char->state.shroud_active = 0;
// Now warp the caster out of and back into here to refresh everyone's display
- char_update (other_char);
- clif_displaymessage (other_char->fd, "Your shroud has been dispelled!");
+ char_update(other_char);
+ clif_displaymessage(other_char->fd, "Your shroud has been dispelled!");
// entity_effect(&other_char->bl, MAGIC_EFFECT_REVEAL);
}
-static void
-timer_callback_effect_npc_delete (timer_id UNUSED, tick_t odelay,
- custom_id_t npc_id, custom_data_t UNUSED)
+static
+void timer_callback_effect_npc_delete(TimerData *, tick_t, int npc_id)
{
- struct npc_data *effect_npc = (struct npc_data *) map_id2bl (npc_id);
- npc_free (effect_npc);
+ struct npc_data *effect_npc = (struct npc_data *) map_id2bl(npc_id);
+ npc_free(effect_npc);
}
-static struct npc_data *local_spell_effect (int m, int x, int y, int effect,
- int tdelay)
+static
+struct npc_data *local_spell_effect(int m, int x, int y, int effect,
+ interval_t tdelay)
{
- int delay = 30000; /* 1 minute should be enough for all interesting spell effects, I hope */
- struct npc_data *effect_npc = npc_spawn_text (m, x, y,
- INVISIBLE_NPC, "", "?");
- int effect_npc_id = effect_npc->bl.id;
-
- entity_effect (&effect_npc->bl, effect, tdelay);
- add_timer (gettick () + delay,
- timer_callback_effect_npc_delete, effect_npc_id, 0);
+ /* 1 minute should be enough for all interesting spell effects, I hope */
+ std::chrono::seconds delay = std::chrono::seconds(30);
+ struct npc_data *effect_npc = npc_spawn_text(m, x, y,
+ INVISIBLE_NPC, "", "?");
+ int effect_npc_id = effect_npc->bl.id;
+
+ entity_effect(&effect_npc->bl, effect, tdelay);
+ Timer(gettick() + delay,
+ std::bind(timer_callback_effect_npc_delete, ph::_1, ph::_2,
+ effect_npc_id)
+ ).detach();
return effect_npc;
}
-static int op_sfx (env_t * env, int args_nr, val_t * args)
+static
+int op_sfx(env_t *, int, val_t *args)
{
- int delay = ARGINT (2);
+ interval_t delay = static_cast<interval_t>(ARGINT(2));
- if (TY (0) == TY_ENTITY)
+ if (ARG_TYPE(0) == TYPE::ENTITY)
{
- entity_effect (ARGENTITY (0), ARGINT (1), delay);
+ entity_effect(ARGENTITY(0), ARGINT(1), delay);
}
- else if (TY (0) == TY_LOCATION)
+ else if (ARG_TYPE(0) == TYPE::LOCATION)
{
- local_spell_effect (ARGLOCATION (0).m,
- ARGLOCATION (0).x,
- ARGLOCATION (0).y, ARGINT (1), delay);
+ local_spell_effect(ARGLOCATION(0).m,
+ ARGLOCATION(0).x,
+ ARGLOCATION(0).y, ARGINT(1), delay);
}
else
return 1;
@@ -284,192 +316,213 @@ static int op_sfx (env_t * env, int args_nr, val_t * args)
return 0;
}
-static int op_instaheal (env_t * env, int args_nr, val_t * args)
+static
+int op_instaheal(env_t *env, int, val_t *args)
{
- entity_t *caster = (VAR (VAR_CASTER).ty == TY_ENTITY)
- ? map_id2bl (VAR (VAR_CASTER).v.v_int) : NULL;
- entity_t *subject = ARGENTITY (0);
+ entity_t *caster = (VAR(VAR_CASTER).ty == TYPE::ENTITY)
+ ? map_id2bl(VAR(VAR_CASTER).v.v_int) : NULL;
+ entity_t *subject = ARGENTITY(0);
if (!caster)
caster = subject;
- if (caster->type == BL_PC && subject->type == BL_PC)
+ if (caster->type == BL::PC && subject->type == BL::PC)
{
character_t *caster_pc = (character_t *) caster;
character_t *subject_pc = (character_t *) subject;
- MAP_LOG_PC (caster_pc, "SPELLHEAL-INSTA PC%d FOR %d",
- subject_pc->status.char_id, ARGINT (1));
+ MAP_LOG_PC(caster_pc, "SPELLHEAL-INSTA PC%d FOR %d",
+ subject_pc->status.char_id, ARGINT(1));
}
- battle_heal (caster, subject, ARGINT (1), ARGINT (2), 0);
+ battle_heal(caster, subject, ARGINT(1), ARGINT(2), 0);
return 0;
}
-static int op_itemheal (env_t * env, int args_nr, val_t * args)
+static
+int op_itemheal(env_t *env, int args_nr, val_t *args)
{
- entity_t *subject = ARGENTITY (0);
- if (subject->type == BL_PC)
+ entity_t *subject = ARGENTITY(0);
+ if (subject->type == BL::PC)
{
- pc_itemheal ((struct map_session_data *) subject,
- ARGINT (1), ARGINT (2));
+ pc_itemheal((struct map_session_data *) subject,
+ ARGINT(1), ARGINT(2));
}
else
- return op_instaheal (env, args_nr, args);
+ return op_instaheal(env, args_nr, args);
return 0;
}
-#define SHROUD_HIDE_NAME_TALKING_FLAG (1 << 0)
-#define SHROUD_DISAPPEAR_ON_PICKUP_FLAG (1 << 1)
-#define SHROUD_DISAPPEAR_ON_TALK_FLAG (1 << 2)
+namespace e
+{
+enum class Shroud
+{
+ HIDE_NAME_TALKING_FLAG = 1 << 0,
+ DISAPPEAR_ON_PICKUP_FLAG = 1 << 1,
+ DISAPPEAR_ON_TALK_FLAG = 1 << 2,
+};
+ENUM_BITWISE_OPERATORS(Shroud)
+}
+using e::Shroud;
-#define ARGCHAR(n) (ARGENTITY(n)->type == BL_PC) ? (character_t *)(ARGENTITY(n)) : NULL
+// differs from ARGPC by checking
+#define ARGCHAR(n) (ARGENTITY(n)->type == BL::PC) ? (character_t *)(ARGENTITY(n)) : NULL
-static int op_shroud (env_t * env, int args_nr, val_t * args)
+static
+int op_shroud(env_t *, int, val_t *args)
{
- character_t *subject = ARGCHAR (0);
- int arg = ARGINT (1);
+ character_t *subject = ARGCHAR(0);
+ Shroud arg = static_cast<Shroud>(ARGINT(1));
if (!subject)
return 0;
subject->state.shroud_active = 1;
subject->state.shroud_hides_name_talking =
- (arg & SHROUD_HIDE_NAME_TALKING_FLAG) != 0;
+ bool(arg & Shroud::HIDE_NAME_TALKING_FLAG);
subject->state.shroud_disappears_on_pickup =
- (arg & SHROUD_DISAPPEAR_ON_PICKUP_FLAG) != 0;
+ bool(arg & Shroud::DISAPPEAR_ON_PICKUP_FLAG);
subject->state.shroud_disappears_on_talk =
- (arg & SHROUD_DISAPPEAR_ON_TALK_FLAG) != 0;
+ bool(arg & Shroud::DISAPPEAR_ON_TALK_FLAG);
return 0;
}
-static int op_reveal (env_t * env, int args_nr, val_t * args)
+static
+int op_reveal(env_t *, int, val_t *args)
{
- character_t *subject = ARGCHAR (0);
+ character_t *subject = ARGCHAR(0);
if (subject && subject->state.shroud_active)
- magic_unshroud (subject);
+ magic_unshroud(subject);
return 0;
}
-static int op_message (env_t * env, int args_nr, val_t * args)
+static
+int op_message(env_t *, int, val_t *args)
{
- character_t *subject = ARGCHAR (0);
+ character_t *subject = ARGCHAR(0);
if (subject)
- clif_displaymessage (subject->fd, ARGSTR (1));
+ clif_displaymessage(subject->fd, ARGSTR(1));
return 0;
}
-static void
-timer_callback_kill_npc (timer_id UNUSED, tick_t odelay, custom_id_t npc_id,
- custom_data_t data)
+static
+void timer_callback_kill_npc(TimerData *, tick_t, int npc_id)
{
- struct npc_data *npc = (struct npc_data *) map_id2bl (npc_id);
+ struct npc_data *npc = (struct npc_data *) map_id2bl(npc_id);
if (npc)
- npc_free (npc);
+ npc_free(npc);
}
-static int op_messenger_npc (env_t * env, int args_nr, val_t * args)
+static
+int op_messenger_npc(env_t *, int, val_t *args)
{
struct npc_data *npc;
- location_t *loc = &ARGLOCATION (0);
+ location_t *loc = &ARGLOCATION(0);
- npc = npc_spawn_text (loc->m, loc->x, loc->y,
- ARGINT (1), ARGSTR (2), ARGSTR (3));
+ npc = npc_spawn_text(loc->m, loc->x, loc->y,
+ ARGINT(1), ARGSTR(2), ARGSTR(3));
- add_timer (gettick () + ARGINT (4),
- &timer_callback_kill_npc, npc->bl.id, 0);
+ Timer(gettick() + static_cast<interval_t>(ARGINT(4)),
+ std::bind(timer_callback_kill_npc, ph::_1, ph::_2,
+ npc->bl.id)
+ ).detach();
return 0;
}
-static void entity_warp (entity_t * target, int destm, int destx, int desty)
+static
+void entity_warp(entity_t *target, int destm, int destx, int desty)
{
- if (target->type == BL_PC || target->type == BL_MOB)
+ if (target->type == BL::PC || target->type == BL::MOB)
{
switch (target->type)
{
- case BL_PC:
+ case BL::PC:
{
character_t *character = (character_t *) target;
char *map_name;
- clif_clearchar_area (&character->bl, 3);
- map_delblock (&character->bl);
+ clif_clearchar(&character->bl, BeingRemoveWhy::WARPED);
+ map_delblock(&character->bl);
character->bl.x = destx;
character->bl.y = desty;
character->bl.m = destm;
- pc_touch_all_relevant_npcs (character);
+ pc_touch_all_relevant_npcs(character);
// Note that touching NPCs may have triggered warping and thereby updated x and y:
map_name = map[character->bl.m].name;
// Warp part #1: update relevant data, interrupt trading etc.:
- pc_setpos (character, map_name, character->bl.x, character->bl.y, 0);
+ pc_setpos(character, map_name, character->bl.x, character->bl.y, BeingRemoveWhy::GONE);
// Warp part #2: now notify the client
- clif_changemap (character, map_name,
+ clif_changemap(character, map_name,
character->bl.x, character->bl.y);
break;
}
- case BL_MOB:
+ case BL::MOB:
target->x = destx;
target->y = desty;
target->m = destm;
- clif_fixmobpos ((struct mob_data *) target);
+ clif_fixmobpos((struct mob_data *) target);
break;
}
}
}
-static int op_move (env_t * env, int args_nr, val_t * args)
+static
+int op_move(env_t *, int, val_t *args)
{
- entity_t *subject = ARGENTITY (0);
- int dir = ARGDIR (1);
+ entity_t *subject = ARGENTITY(0);
+ DIR dir = ARGDIR(1);
- int newx = subject->x + heading_x[dir];
- int newy = subject->y + heading_y[dir];
+ int newx = subject->x + dirx[dir];
+ int newy = subject->y + diry[dir];
- if (!map_is_solid (subject->m, newx, newy))
- entity_warp (subject, subject->m, newx, newy);
+ if (!bool(map_getcell(subject->m, newx, newy) & MapCell::UNWALKABLE))
+ entity_warp(subject, subject->m, newx, newy);
return 0;
}
-static int op_warp (env_t * env, int args_nr, val_t * args)
+static
+int op_warp(env_t *, int, val_t *args)
{
- entity_t *subject = ARGENTITY (0);
- location_t *loc = &ARGLOCATION (1);
+ entity_t *subject = ARGENTITY(0);
+ location_t *loc = &ARGLOCATION(1);
- entity_warp (subject, loc->m, loc->x, loc->y);
+ entity_warp(subject, loc->m, loc->x, loc->y);
return 0;
}
-static int op_banish (env_t * env, int args_nr, val_t * args)
+static
+int op_banish(env_t *, int, val_t *args)
{
- entity_t *subject = ARGENTITY (0);
+ entity_t *subject = ARGENTITY(0);
- if (subject->type == BL_MOB)
+ if (subject->type == BL::MOB)
{
struct mob_data *mob = (struct mob_data *) subject;
- if (mob->mode & MOB_MODE_SUMMONED)
- mob_catch_delete (mob, 3);
+ if (bool(mob->mode & MobMode::SUMMONED))
+ mob_catch_delete(mob, BeingRemoveWhy::WARPED);
}
return 0;
}
-static void
-record_status_change (invocation_t * invocation, int bl_id, int sc_id)
+static
+void record_status_change(invocation_t *invocation, int bl_id,
+ StatusChange sc_id)
{
- int index = invocation->status_change_refs_nr++;
+ int index = invocation->status_change_refs_nr++;
status_change_ref_t *cr;
- RECREATE (invocation->status_change_refs, status_change_ref_t, invocation->status_change_refs_nr);
+ RECREATE(invocation->status_change_refs, status_change_ref_t, invocation->status_change_refs_nr);
cr = &invocation->status_change_refs[index];
@@ -477,44 +530,51 @@ record_status_change (invocation_t * invocation, int bl_id, int sc_id)
cr->bl_id = bl_id;
}
-static int op_status_change (env_t * env, int args_nr, val_t * args)
+static
+int op_status_change(env_t *env, int, val_t *args)
{
- entity_t *subject = ARGENTITY (0);
- int invocation_id = VAR (VAR_INVOCATION).ty == TY_INVOCATION
- ? VAR (VAR_INVOCATION).v.v_int : 0;
- invocation_t *invocation = (invocation_t *) map_id2bl (invocation_id);
+ entity_t *subject = ARGENTITY(0);
+ int invocation_id = VAR(VAR_INVOCATION).ty == TYPE::INVOCATION
+ ? VAR(VAR_INVOCATION).v.v_int : 0;
+ invocation_t *invocation = (invocation_t *) map_id2bl(invocation_id);
- skill_status_effect (subject, ARGINT (1), ARGINT (2), ARGINT (3),
- ARGINT (4), ARGINT (5), ARGINT (6), 0,
- invocation_id);
+ assert (!ARGINT(3));
+ assert (!ARGINT(4));
+ assert (!ARGINT(5));
+ skill_status_effect(subject, static_cast<StatusChange>(ARGINT(1)),
+ ARGINT(2),
+ static_cast<interval_t>(ARGINT(6)), invocation_id);
- if (invocation && subject->type == BL_PC)
- record_status_change (invocation, subject->id, ARGINT (1));
+ if (invocation && subject->type == BL::PC)
+ record_status_change(invocation, subject->id, StatusChange(ARGINT(1)));
return 0;
}
-static int op_stop_status_change (env_t * env, int args_nr, val_t * args)
+static
+int op_stop_status_change(env_t *, int, val_t *args)
{
- entity_t *subject = ARGENTITY (0);
+ entity_t *subject = ARGENTITY(0);
- skill_status_change_end (subject, ARGINT (1), -1);
+ StatusChange sc = static_cast<StatusChange>(ARGINT(1));
+ skill_status_change_end(subject, sc, nullptr);
return 0;
}
-static int op_override_attack (env_t * env, int args_nr, val_t * args)
+static
+int op_override_attack(env_t *env, int, val_t *args)
{
- entity_t *psubject = ARGENTITY (0);
- int charges = ARGINT (1);
- int attack_delay = ARGINT (2);
- int attack_range = ARGINT (3);
- int icon = ARGINT (4);
- int look = ARGINT (5);
- int stopattack = ARGINT (6);
+ entity_t *psubject = ARGENTITY(0);
+ int charges = ARGINT(1);
+ interval_t attack_delay = static_cast<interval_t>(ARGINT(2));
+ int attack_range = ARGINT(3);
+ StatusChange icon = StatusChange(ARGINT(4));
+ int look = ARGINT(5);
+ int stopattack = ARGINT(6);
character_t *subject;
- if (psubject->type != BL_PC)
+ if (psubject->type != BL::PC)
return 0;
subject = (character_t *) psubject;
@@ -522,76 +582,86 @@ static int op_override_attack (env_t * env, int args_nr, val_t * args)
if (subject->attack_spell_override)
{
invocation_t *old_invocation =
- (invocation_t *) map_id2bl (subject->attack_spell_override);
+ (invocation_t *) map_id2bl(subject->attack_spell_override);
if (old_invocation)
- spell_free_invocation (old_invocation);
+ spell_free_invocation(old_invocation);
}
subject->attack_spell_override =
- trigger_spell (subject->bl.id, VAR (VAR_INVOCATION).v.v_int);
+ trigger_spell(subject->bl.id, VAR(VAR_INVOCATION).v.v_int);
subject->attack_spell_charges = charges;
if (subject->attack_spell_override)
{
invocation_t *attack_spell =
- (invocation_t *) map_id2bl (subject->attack_spell_override);
+ (invocation_t *) map_id2bl(subject->attack_spell_override);
if (attack_spell && stopattack)
- attack_spell->flags |= INVOCATION_FLAG_STOPATTACK;
+ attack_spell->flags |= INVOCATION_FLAG::STOPATTACK;
- char_set_weapon_icon (subject, charges, icon, look);
- char_set_attack_info (subject, attack_delay, attack_range);
+ char_set_weapon_icon(subject, charges, icon, look);
+ char_set_attack_info(subject, attack_delay, attack_range);
}
return 0;
}
-static int op_create_item (env_t * env, int args_nr, val_t * args)
+static
+int op_create_item(env_t *, int, val_t *args)
{
struct item item;
- entity_t *entity = ARGENTITY (0);
+ entity_t *entity = ARGENTITY(0);
character_t *subject;
- int stackable;
- int count = ARGINT (2);
+ int stackable;
+ int count = ARGINT(2);
if (count <= 0)
return 0;
- if (entity->type == BL_PC)
+ if (entity->type == BL::PC)
subject = (character_t *) entity;
else
return 0;
- GET_ARG_ITEM (1, item, stackable);
+ GET_ARG_ITEM(1, item, stackable);
if (!stackable)
while (count--)
- pc_additem (subject, &item, 1);
+ pc_additem(subject, &item, 1);
else
- pc_additem (subject, &item, count);
+ pc_additem(subject, &item, count);
return 0;
}
-#define AGGRAVATION_MODE_ATTACKS_CASTER(n) ((n) == 0 || (n) == 2)
-#define AGGRAVATION_MODE_MAKES_AGGRESSIVE(n) ((n) > 0)
+inline
+bool AGGRAVATION_MODE_ATTACKS_CASTER(int n)
+{
+ return n == 0 || n == 2;
+}
+inline
+bool AGGRAVATION_MODE_MAKES_AGGRESSIVE(int n)
+{
+ return n > 0;
+}
-static int op_aggravate (env_t * env, int args_nr, val_t * args)
+static
+int op_aggravate(env_t *, int, val_t *args)
{
- entity_t *victim = ARGENTITY (2);
- int mode = ARGINT (1);
- entity_t *target = ARGENTITY (0);
+ entity_t *victim = ARGENTITY(2);
+ int mode = ARGINT(1);
+ entity_t *target = ARGENTITY(0);
struct mob_data *other;
- if (target->type == BL_MOB)
+ if (target->type == BL::MOB)
other = (struct mob_data *) target;
else
return 0;
- mob_target (other, victim, battle_get_range (victim));
+ mob_target(other, victim, battle_get_range(victim));
- if (AGGRAVATION_MODE_MAKES_AGGRESSIVE (mode))
- other->mode = 0x85 | (other->mode & MOB_SENSIBLE_MASK); /* war */
+ if (AGGRAVATION_MODE_MAKES_AGGRESSIVE(mode))
+ other->mode = MobMode::war | (other->mode & MobMode::SENSIBLE_MASK);
- if (AGGRAVATION_MODE_ATTACKS_CASTER (mode))
+ if (AGGRAVATION_MODE_ATTACKS_CASTER(mode))
{
other->target_id = victim->id;
other->attacked_id = victim->id;
@@ -600,37 +670,42 @@ static int op_aggravate (env_t * env, int args_nr, val_t * args)
return 0;
}
-#define MONSTER_ATTITUDE_HOSTILE 0
-#define MONSTER_ATTITUDE_FRIENDLY 1
-#define MONSTER_ATTITUDE_SERVANT 2
-#define MONSTER_ATTITUDE_FROZEN 3
-
-static int op_spawn (env_t * env, int args_nr, val_t * args)
+enum class MonsterAttitude
{
- area_t *area = ARGAREA (0);
- entity_t *owner_e = ARGENTITY (1);
- int monster_id = ARGINT (2);
- int monster_attitude = ARGINT (3);
- int monster_count = ARGINT (4);
- int monster_lifetime = ARGINT (5);
- int i;
+ HOSTILE = 0,
+ FRIENDLY = 1,
+ SERVANT = 2,
+ FROZEN = 3,
+};
- character_t *owner = (monster_attitude == MONSTER_ATTITUDE_SERVANT
- && owner_e->type ==
- BL_PC) ? (character_t *) owner_e : NULL;
+static
+int op_spawn(env_t *, int, val_t *args)
+{
+ area_t *area = ARGAREA(0);
+ entity_t *owner_e = ARGENTITY(1);
+ int monster_id = ARGINT(2);
+ MonsterAttitude monster_attitude = static_cast<MonsterAttitude>(ARGINT(3));
+ int monster_count = ARGINT(4);
+ interval_t monster_lifetime = static_cast<interval_t>(ARGINT(5));
+ int i;
+
+ character_t *owner = NULL;
+ if (monster_attitude == MonsterAttitude::SERVANT
+ && owner_e->type == BL::PC)
+ owner = (character_t *) owner_e;
for (i = 0; i < monster_count; i++)
{
location_t loc;
- magic_random_location (&loc, area);
+ magic_random_location(&loc, area);
- int mob_id;
+ int mob_id;
struct mob_data *mob;
- mob_id = mob_once_spawn (owner, map[loc.m].name, loc.x, loc.y, "--ja--", // Is that needed?
+ mob_id = mob_once_spawn(owner, map[loc.m].name, loc.x, loc.y, "--ja--", // Is that needed?
monster_id, 1, "");
- mob = (struct mob_data *) map_id2bl (mob_id);
+ mob = (struct mob_data *) map_id2bl(mob_id);
if (mob)
{
@@ -638,18 +713,17 @@ static int op_spawn (env_t * env, int args_nr, val_t * args)
switch (monster_attitude)
{
-
- case MONSTER_ATTITUDE_SERVANT:
+ case MonsterAttitude::SERVANT:
mob->state.special_mob_ai = 1;
- mob->mode |= 0x04;
+ mob->mode |= MobMode::AGGRESSIVE;
break;
- case MONSTER_ATTITUDE_FRIENDLY:
- mob->mode = 0x80 | (mob->mode & 1);
+ case MonsterAttitude::FRIENDLY:
+ mob->mode = MobMode::CAN_ATTACK | (mob->mode & MobMode::CAN_MOVE);
break;
- case MONSTER_ATTITUDE_HOSTILE:
- mob->mode = 0x84 | (mob->mode & 1);
+ case MonsterAttitude::HOSTILE:
+ mob->mode = MobMode::CAN_ATTACK | MobMode::AGGRESSIVE | (mob->mode & MobMode::CAN_MOVE);
if (owner)
{
mob->target_id = owner->bl.id;
@@ -657,16 +731,17 @@ static int op_spawn (env_t * env, int args_nr, val_t * args)
}
break;
- case MONSTER_ATTITUDE_FROZEN:
- mob->mode = 0;
+ case MonsterAttitude::FROZEN:
+ mob->mode = MobMode::ZERO;
break;
}
mob->mode |=
- MOB_MODE_SUMMONED | MOB_MODE_TURNS_AGAINST_BAD_MASTER;
+ MobMode::SUMMONED | MobMode::TURNS_AGAINST_BAD_MASTER;
- mob->deletetimer = add_timer (gettick () + monster_lifetime,
- mob_timer_delete, mob_id, 0);
+ mob->deletetimer = Timer(gettick() + monster_lifetime,
+ std::bind(mob_timer_delete, ph::_1, ph::_2,
+ mob_id));
if (owner)
{
@@ -680,13 +755,13 @@ static int op_spawn (env_t * env, int args_nr, val_t * args)
}
static
-const char *get_invocation_name (env_t * env)
+const char *get_invocation_name(env_t *env)
{
invocation_t *invocation;
- if (VAR (VAR_INVOCATION).ty != TY_INVOCATION)
+ if (VAR(VAR_INVOCATION).ty != TYPE::INVOCATION)
return "?";
- invocation = (invocation_t *) map_id2bl (VAR (VAR_INVOCATION).v.v_int);
+ invocation = (invocation_t *) map_id2bl(VAR(VAR_INVOCATION).v.v_int);
if (invocation)
return invocation->spell->name;
@@ -694,16 +769,17 @@ const char *get_invocation_name (env_t * env)
return "??";
}
-static int op_injure (env_t * env, int args_nr, val_t * args)
+static
+int op_injure(env_t *env, int, val_t *args)
{
- entity_t *caster = ARGENTITY (0);
- entity_t *target = ARGENTITY (1);
- int damage_caused = ARGINT (2);
- int mp_damage = ARGINT (3);
- int target_hp = battle_get_hp (target);
- int mdef = battle_get_mdef (target);
-
- if (target->type == BL_PC && !map[target->m].flag.pvp && !((character_t *) target)->special_state.killable && (caster->type != BL_PC || !((character_t *) caster)->special_state.killer))
+ entity_t *caster = ARGENTITY(0);
+ entity_t *target = ARGENTITY(1);
+ int damage_caused = ARGINT(2);
+ int mp_damage = ARGINT(3);
+ int target_hp = battle_get_hp(target);
+ int mdef = battle_get_mdef(target);
+
+ if (target->type == BL::PC && !map[target->m].flag.pvp && !((character_t *) target)->special_state.killable && (caster->type != BL::PC || !((character_t *) caster)->special_state.killer))
return 0; /* Cannot damage other players outside of pvp */
if (target != caster)
@@ -719,107 +795,117 @@ static int op_injure (env_t * env, int args_nr, val_t * args)
damage_caused = 0;
// display damage first, because dealing damage may deallocate the target.
- clif_damage (caster, target, gettick (), 0, 0, damage_caused, 0, 0, 0);
+ clif_damage(caster, target,
+ gettick(), interval_t::zero(), interval_t::zero(),
+ damage_caused, 0, DamageType::NORMAL, 0);
- if (caster->type == BL_PC)
+ if (caster->type == BL::PC)
{
character_t *caster_pc = (character_t *) caster;
- if (target->type == BL_MOB)
+ if (target->type == BL::MOB)
{
struct mob_data *mob = (struct mob_data *) target;
- MAP_LOG_PC (caster_pc, "SPELLDMG MOB%d %d FOR %d BY %s",
+ MAP_LOG_PC(caster_pc, "SPELLDMG MOB%d %d FOR %d BY %s",
mob->bl.id, mob->mob_class, damage_caused,
- get_invocation_name (env));
+ get_invocation_name(env));
}
}
- battle_damage (caster, target, damage_caused, mp_damage);
+ battle_damage(caster, target, damage_caused, mp_damage);
return 0;
}
-static int op_emote (env_t * env, int args_nr, val_t * args)
+static
+int op_emote(env_t *, int, val_t *args)
{
- entity_t *victim = ARGENTITY (0);
- int emotion = ARGINT (1);
- clif_emotion (victim, emotion);
+ entity_t *victim = ARGENTITY(0);
+ int emotion = ARGINT(1);
+ clif_emotion(victim, emotion);
return 0;
}
-static int op_set_script_variable (env_t * env, int args_nr, val_t * args)
+static
+int op_set_script_variable(env_t *, int, val_t *args)
{
- character_t *c = (ETY (0) == BL_PC) ? ARGPC (0) : NULL;
+ character_t *c = (ENTITY_TYPE(0) == BL::PC) ? ARGPC(0) : NULL;
if (!c)
return 1;
- pc_setglobalreg (c, ARGSTR (1), ARGINT (2));
+ pc_setglobalreg(c, ARGSTR(1), ARGINT(2));
return 0;
}
-static int op_set_hair_colour (env_t * env, int args_nr, val_t * args)
+static
+int op_set_hair_colour(env_t *, int, val_t *args)
{
- character_t *c = (ETY (0) == BL_PC) ? ARGPC (0) : NULL;
+ character_t *c = (ENTITY_TYPE(0) == BL::PC) ? ARGPC(0) : NULL;
if (!c)
return 1;
- pc_changelook (c, LOOK_HAIR_COLOR, ARGINT (1));
+ pc_changelook(c, LOOK::HAIR_COLOR, ARGINT(1));
return 0;
}
-static int op_set_hair_style (env_t * env, int args_nr, val_t * args)
+static
+int op_set_hair_style(env_t *, int, val_t *args)
{
- character_t *c = (ETY (0) == BL_PC) ? ARGPC (0) : NULL;
+ character_t *c = (ENTITY_TYPE(0) == BL::PC) ? ARGPC(0) : NULL;
if (!c)
return 1;
- pc_changelook (c, LOOK_HAIR, ARGINT (1));
+ pc_changelook(c, LOOK::HAIR, ARGINT(1));
return 0;
}
-static int op_drop_item_for (env_t * env, int args_nr, val_t * args)
+static
+int op_drop_item_for (env_t *, int args_nr, val_t *args)
{
struct item item;
- int stackable;
- location_t *loc = &ARGLOCATION (0);
- int count = ARGINT (2);
- int time = ARGINT (3);
- character_t *c = ((args_nr > 4) && (ETY (4) == BL_PC)) ? ARGPC (4) : NULL;
- int delay = (args_nr > 5) ? ARGINT (5) : 0;
- int delaytime[3] = { delay, delay, delay };
+ int stackable;
+ location_t *loc = &ARGLOCATION(0);
+ int count = ARGINT(2);
+ interval_t interval = static_cast<interval_t>(ARGINT(3));
+ character_t *c = ((args_nr > 4) && (ENTITY_TYPE(4) == BL::PC)) ? ARGPC(4) : NULL;
+ interval_t delay = (args_nr > 5) ? static_cast<interval_t>(ARGINT(5)) : interval_t::zero();
+ interval_t delaytime[3] = { delay, delay, delay };
character_t *owners[3] = { c, NULL, NULL };
- GET_ARG_ITEM (1, item, stackable);
+ GET_ARG_ITEM(1, item, stackable);
if (stackable)
- map_addflooritem_any (&item, count, loc->m, loc->x, loc->y,
- owners, delaytime, time, 0);
+ map_addflooritem_any(&item, count, loc->m, loc->x, loc->y,
+ owners, delaytime, interval, 0);
else
while (count-- > 0)
- map_addflooritem_any (&item, 1, loc->m, loc->x, loc->y,
- owners, delaytime, time, 0);
+ map_addflooritem_any(&item, 1, loc->m, loc->x, loc->y,
+ owners, delaytime, interval, 0);
return 0;
}
-static int op_gain_exp (env_t * env, int args_nr, val_t * args)
+static
+int op_gain_exp(env_t *, int, val_t *args)
{
- character_t *c = (ETY (0) == BL_PC) ? ARGPC (0) : NULL;
+ character_t *c = (ENTITY_TYPE(0) == BL::PC) ? ARGPC(0) : NULL;
if (!c)
return 1;
- pc_gainexp_reason (c, ARGINT (1), ARGINT (2), ARGINT (3));
+ pc_gainexp_reason(c, ARGINT(1), ARGINT(2),
+ PC_GAINEXP_REASON(ARGINT(3)));
return 0;
}
-static op_t operations[] = {
+static
+op_t operations[] = {
{"sfx", ".ii", op_sfx},
{"instaheal", "eii", op_instaheal},
{"itemheal", "eii", op_itemheal},
@@ -847,16 +933,18 @@ static op_t operations[] = {
{NULL, NULL, NULL}
};
-static int operations_sorted = 0;
-static int operation_count;
+static
+int operations_sorted = 0;
+static
+int operation_count;
static
-int compare_operations (const void *lhs, const void *rhs)
+int compare_operations(const void *lhs, const void *rhs)
{
- return strcmp (((op_t *) lhs)->name, ((op_t *) rhs)->name);
+ return strcmp(((const op_t *) lhs)->name, ((const op_t *) rhs)->name);
}
-op_t *magic_get_op (char *name, int *index)
+op_t *magic_get_op(char *name, int *index)
{
op_t key;
@@ -869,13 +957,13 @@ op_t *magic_get_op (char *name, int *index)
operation_count = opc - operations;
- qsort (operations, operation_count, sizeof (op_t),
+ qsort(operations, operation_count, sizeof(op_t),
compare_operations);
operations_sorted = 1;
}
key.name = name;
- op_t *op = (op_t *)bsearch (&key, operations, operation_count, sizeof (op_t),
+ op_t *op = (op_t *)bsearch(&key, operations, operation_count, sizeof(op_t),
compare_operations);
if (op && index)
@@ -884,15 +972,14 @@ op_t *magic_get_op (char *name, int *index)
return op;
}
-void
-spell_effect_report_termination (int invocation_id, int bl_id, int sc_id,
- int supplanted)
+void spell_effect_report_termination(int invocation_id, int bl_id,
+ StatusChange sc_id, int)
{
- int i;
- int index = -1;
- invocation_t *invocation = (invocation_t *) map_id2bl (invocation_id);
+ int i;
+ int index = -1;
+ invocation_t *invocation = (invocation_t *) map_id2bl(invocation_id);
- if (!invocation || invocation->bl.type != BL_SPELL)
+ if (!invocation || invocation->bl.type != BL::SPELL)
return;
for (i = 0; i < invocation->status_change_refs_nr; i++)
@@ -907,9 +994,9 @@ spell_effect_report_termination (int invocation_id, int bl_id, int sc_id,
if (index == -1)
{
- entity_t *entity = map_id2bl (bl_id);
- if (entity->type == BL_PC)
- fprintf (stderr,
+ entity_t *entity = map_id2bl(bl_id);
+ if (entity->type == BL::PC)
+ FPRINTF(stderr,
"[magic] INTERNAL ERROR: spell-effect-report-termination: tried to terminate on unexpected bl %d, sc %d\n",
bl_id, sc_id);
return;
@@ -922,10 +1009,11 @@ spell_effect_report_termination (int invocation_id, int bl_id, int sc_id,
invocation->
status_change_refs[--invocation->status_change_refs_nr];
- try_to_finish_invocation (invocation);
+ try_to_finish_invocation(invocation);
}
-static effect_t *return_to_stack (invocation_t * invocation)
+static
+effect_t *return_to_stack(invocation_t *invocation)
{
if (!invocation->stack_size)
return NULL;
@@ -936,28 +1024,28 @@ static effect_t *return_to_stack (invocation_t * invocation)
switch (ar->ty)
{
- case CONT_STACK_PROC:
+ case CONT_STACK::PROC:
{
effect_t *ret = ar->return_location;
- int i;
+ int i;
for (i = 0; i < ar->c.c_proc.args_nr; i++)
{
val_t *var =
&invocation->env->vars[ar->c.c_proc.formals[i]];
- magic_clear_var (var);
+ magic_clear_var(var);
*var = ar->c.c_proc.old_actuals[i];
}
- clear_activation_record (ar);
+ clear_activation_record(ar);
--invocation->stack_size;
return ret;
}
- case CONT_STACK_FOREACH:
+ case CONT_STACK::FOREACH:
{
- int entity_id;
+ int entity_id;
val_t *var = &invocation->env->vars[ar->c.c_foreach.id];
do
@@ -965,7 +1053,7 @@ static effect_t *return_to_stack (invocation_t * invocation)
if (ar->c.c_foreach.index >= ar->c.c_foreach.entities_nr)
{
effect_t *ret = ar->return_location;
- clear_activation_record (ar);
+ clear_activation_record(ar);
--invocation->stack_size;
return ret;
}
@@ -973,33 +1061,33 @@ static effect_t *return_to_stack (invocation_t * invocation)
entity_id =
ar->c.c_foreach.entities[ar->c.c_foreach.index++];
}
- while (!entity_id || !map_id2bl (entity_id));
+ while (!entity_id || !map_id2bl(entity_id));
- magic_clear_var (var);
+ magic_clear_var(var);
var->ty = ar->c.c_foreach.ty;
var->v.v_int = entity_id;
return ar->c.c_foreach.body;
}
- case CONT_STACK_FOR:
+ case CONT_STACK::FOR:
if (ar->c.c_for.current > ar->c.c_for.stop)
{
effect_t *ret = ar->return_location;
- clear_activation_record (ar);
+ clear_activation_record(ar);
--invocation->stack_size;
return ret;
}
- magic_clear_var (&invocation->env->vars[ar->c.c_for.id]);
- invocation->env->vars[ar->c.c_for.id].ty = TY_INT;
+ magic_clear_var(&invocation->env->vars[ar->c.c_for.id]);
+ invocation->env->vars[ar->c.c_for.id].ty = TYPE::INT;
invocation->env->vars[ar->c.c_for.id].v.v_int =
ar->c.c_for.current++;
return ar->c.c_for.body;
default:
- fprintf (stderr,
+ FPRINTF(stderr,
"[magic] INTERNAL ERROR: While executing spell `%s': stack corruption\n",
invocation->spell->name);
return NULL;
@@ -1007,15 +1095,15 @@ static effect_t *return_to_stack (invocation_t * invocation)
}
}
-static cont_activation_record_t *add_stack_entry (invocation_t * invocation,
- int ty,
- effect_t * return_location)
+static
+cont_activation_record_t *add_stack_entry(invocation_t *invocation,
+ CONT_STACK ty, effect_t *return_location)
{
cont_activation_record_t *ar =
invocation->stack + invocation->stack_size++;
if (invocation->stack_size >= MAX_STACK_SIZE)
{
- fprintf (stderr,
+ FPRINTF(stderr,
"[magic] Execution stack size exceeded in spell `%s'; truncating effect\n",
invocation->spell->name);
invocation->stack_size--;
@@ -1027,121 +1115,119 @@ static cont_activation_record_t *add_stack_entry (invocation_t * invocation,
return ar;
}
-static int find_entities_in_area_c (entity_t * target, va_list va)
+static
+void find_entities_in_area_c(entity_t *target,
+ int *entities_allocd_p,
+ int *entities_nr_p,
+ int **entities_p,
+ FOREACH_FILTER filter)
{
- int *entities_allocd_p = va_arg (va, int *);
- int *entities_nr_p = va_arg (va, int *);
- int **entities_p = va_arg (va, int **);
- int filter = va_arg (va, int);
-
/* The following macro adds an entity to the result list: */
#define ADD_ENTITY(e) \
if (*entities_nr_p == *entities_allocd_p) { \
/* Need more space */ \
(*entities_allocd_p) += 32; \
- RECREATE (*entities_p, int, *entities_allocd_p); \
+ RECREATE(*entities_p, int, *entities_allocd_p); \
} \
(*entities_p)[(*entities_nr_p)++] = e;
switch (target->type)
{
- case BL_PC:
- if (filter == FOREACH_FILTER_PC
- || filter == FOREACH_FILTER_ENTITY
- || (filter == FOREACH_FILTER_TARGET
+ case BL::PC:
+ if (filter == FOREACH_FILTER::PC
+ || filter == FOREACH_FILTER::ENTITY
+ || (filter == FOREACH_FILTER::TARGET
&& map[target->m].flag.pvp))
break;
- else if (filter == FOREACH_FILTER_SPELL)
+ else if (filter == FOREACH_FILTER::SPELL)
{ /* Check all spells bound to the caster */
invocation_t *invoc = ((character_t *) target)->active_spells;
/* Add all spells locked onto thie PC */
while (invoc)
{
- ADD_ENTITY (invoc->bl.id);
+ ADD_ENTITY(invoc->bl.id);
invoc = invoc->next_invocation;
}
}
- return 0;
+ return;
- case BL_MOB:
- if (filter == FOREACH_FILTER_MOB
- || filter == FOREACH_FILTER_ENTITY
- || filter == FOREACH_FILTER_TARGET)
+ case BL::MOB:
+ if (filter == FOREACH_FILTER::MOB
+ || filter == FOREACH_FILTER::ENTITY
+ || filter == FOREACH_FILTER::TARGET)
break;
else
- return 0;
+ return;
- case BL_SPELL:
- if (filter == FOREACH_FILTER_SPELL)
+ case BL::SPELL:
+ if (filter == FOREACH_FILTER::SPELL)
{
invocation_t *invocation = (invocation_t *) target;
- /* Check whether the spell is `bound'-- if so, we'll consider it iff we see the caster (case BL_PC). */
- if (invocation->flags & INVOCATION_FLAG_BOUND)
- return 0;
+ /* Check whether the spell is `bound'-- if so, we'll consider it iff we see the caster(case BL::PC). */
+ if (bool(invocation->flags & INVOCATION_FLAG::BOUND))
+ return;
else
break; /* Add the spell */
}
else
- return 0;
+ return;
- case BL_NPC:
- if (filter == FOREACH_FILTER_NPC)
+ case BL::NPC:
+ if (filter == FOREACH_FILTER::NPC)
break;
else
- return 0;
+ return;
default:
- return 0;
+ return;
}
- ADD_ENTITY (target->id);
+ ADD_ENTITY(target->id);
#undef ADD_ENTITY
- return 0;
}
-static void
-find_entities_in_area (area_t * area, int *entities_allocd_p,
- int *entities_nr_p, int **entities_p, int filter)
+static
+void find_entities_in_area(area_t *area, int *entities_allocd_p,
+ int *entities_nr_p, int **entities_p, FOREACH_FILTER filter)
{
switch (area->ty)
{
- case AREA_UNION:
- find_entities_in_area (area->a.a_union[0], entities_allocd_p,
+ case AREA::UNION:
+ find_entities_in_area(area->a.a_union[0], entities_allocd_p,
entities_nr_p, entities_p, filter);
- find_entities_in_area (area->a.a_union[1], entities_allocd_p,
+ find_entities_in_area(area->a.a_union[1], entities_allocd_p,
entities_nr_p, entities_p, filter);
break;
default:
{
- int m, x, y, width, height;
- magic_area_rect (&m, &x, &y, &width, &height, area);
- map_foreachinarea (find_entities_in_area_c,
+ int m, x, y, width, height;
+ magic_area_rect(&m, &x, &y, &width, &height, area);
+ map_foreachinarea(std::bind(find_entities_in_area_c, ph::_1, entities_allocd_p, entities_nr_p, entities_p, filter),
m, x, y, x + width, y + height,
- 0 /* filter elsewhere */ ,
- entities_allocd_p, entities_nr_p, entities_p,
- filter);
+ BL::NUL /* filter elsewhere */);
}
}
}
-static effect_t *run_foreach (invocation_t * invocation, effect_t * foreach,
- effect_t * return_location)
+static
+effect_t *run_foreach(invocation_t *invocation, effect_t *foreach,
+ effect_t *return_location)
{
val_t area;
- int filter = foreach->e.e_foreach.filter;
- int id = foreach->e.e_foreach.id;
+ FOREACH_FILTER filter = foreach->e.e_foreach.filter;
+ int id = foreach->e.e_foreach.id;
effect_t *body = foreach->e.e_foreach.body;
- magic_eval (invocation->env, &area, foreach->e.e_foreach.area);
+ magic_eval(invocation->env, &area, foreach->e.e_foreach.area);
- if (area.ty != TY_AREA)
+ if (area.ty != TYPE::AREA)
{
- magic_clear_var (&area);
- fprintf (stderr,
+ magic_clear_var(&area);
+ FPRINTF(stderr,
"[magic] Error in spell `%s': FOREACH loop over non-area\n",
invocation->spell->name);
return return_location;
@@ -1149,38 +1235,20 @@ static effect_t *run_foreach (invocation_t * invocation, effect_t * foreach,
else
{
cont_activation_record_t *ar =
- add_stack_entry (invocation, CONT_STACK_FOREACH, return_location);
- int entities_allocd = 64;
- int *entities_collect;
+ add_stack_entry(invocation, CONT_STACK::FOREACH, return_location);
+ int entities_allocd = 64;
int *entities;
- int *shuffle_board;
- int entities_nr = 0;
- int i;
+ int entities_nr = 0;
if (!ar)
return return_location;
- CREATE (entities_collect, int, entities_allocd);
-
- find_entities_in_area (area.v.v_area, &entities_allocd, &entities_nr,
- &entities_collect, filter);
-
- /* Now shuffle */
- CREATE (shuffle_board, int, entities_nr);
- CREATE (entities, int, entities_nr);
- for (i = 0; i < entities_nr; i++)
- shuffle_board[i] = i;
-
- for (i = entities_nr - 1; i >= 0; i--)
- {
- int random_index = rand () % (i + 1);
- entities[i] = entities_collect[shuffle_board[random_index]];
- shuffle_board[random_index] = shuffle_board[i]; // thus, we are guaranteed only to use unused indices
- }
-
- free (entities_collect);
- free (shuffle_board);
- /* Done shuffling */
+ CREATE(entities, int, entities_allocd);
+ find_entities_in_area(area.v.v_area, &entities_allocd, &entities_nr,
+ &entities, filter);
+ RECREATE(entities, int, entities_nr);
+ // iterator_pair will go away when this gets properly containerized.
+ random_::shuffle(iterator_pair(entities, entities + entities_nr));
ar->c.c_foreach.id = id;
ar->c.c_foreach.body = body;
@@ -1188,36 +1256,37 @@ static effect_t *run_foreach (invocation_t * invocation, effect_t * foreach,
ar->c.c_foreach.entities_nr = entities_nr;
ar->c.c_foreach.entities = entities;
ar->c.c_foreach.ty =
- (filter == FOREACH_FILTER_SPELL) ? TY_INVOCATION : TY_ENTITY;
+ (filter == FOREACH_FILTER::SPELL) ? TYPE::INVOCATION : TYPE::ENTITY;
- magic_clear_var (&area);
+ magic_clear_var(&area);
- return return_to_stack (invocation);
+ return return_to_stack(invocation);
}
}
-static effect_t *run_for (invocation_t * invocation, effect_t * for_,
- effect_t * return_location)
+static
+effect_t *run_for (invocation_t *invocation, effect_t *for_,
+ effect_t *return_location)
{
cont_activation_record_t *ar;
- int id = for_->e.e_for.id;
+ int id = for_->e.e_for.id;
val_t start;
val_t stop;
- magic_eval (invocation->env, &start, for_->e.e_for.start);
- magic_eval (invocation->env, &stop, for_->e.e_for.stop);
+ magic_eval(invocation->env, &start, for_->e.e_for.start);
+ magic_eval(invocation->env, &stop, for_->e.e_for.stop);
- if (start.ty != TY_INT || stop.ty != TY_INT)
+ if (start.ty != TYPE::INT || stop.ty != TYPE::INT)
{
- magic_clear_var (&start);
- magic_clear_var (&stop);
- fprintf (stderr,
+ magic_clear_var(&start);
+ magic_clear_var(&stop);
+ FPRINTF(stderr,
"[magic] Error in spell `%s': FOR loop start or stop point is not an integer\n",
invocation->spell->name);
return return_location;
}
- ar = add_stack_entry (invocation, CONT_STACK_FOR, return_location);
+ ar = add_stack_entry(invocation, CONT_STACK::FOR, return_location);
if (!ar)
return return_location;
@@ -1227,21 +1296,22 @@ static effect_t *run_for (invocation_t * invocation, effect_t * for_,
ar->c.c_for.stop = stop.v.v_int;
ar->c.c_for.body = for_->e.e_for.body;
- return return_to_stack (invocation);
+ return return_to_stack(invocation);
}
-static effect_t *run_call (invocation_t * invocation,
- effect_t * return_location)
+static
+effect_t *run_call(invocation_t *invocation,
+ effect_t *return_location)
{
effect_t *current = invocation->current_effect;
cont_activation_record_t *ar;
- int args_nr = current->e.e_call.args_nr;
+ int args_nr = current->e.e_call.args_nr;
int *formals = current->e.e_call.formals;
val_t *old_actuals;
- CREATE (old_actuals, val_t, args_nr);
- int i;
+ CREATE(old_actuals, val_t, args_nr);
+ int i;
- ar = add_stack_entry (invocation, CONT_STACK_PROC, return_location);
+ ar = add_stack_entry(invocation, CONT_STACK::PROC, return_location);
ar->c.c_proc.args_nr = args_nr;
ar->c.c_proc.formals = formals;
ar->c.c_proc.old_actuals = old_actuals;
@@ -1249,8 +1319,8 @@ static effect_t *run_call (invocation_t * invocation,
{
val_t *env_val = &invocation->env->vars[formals[i]];
val_t result;
- magic_copy_var (&old_actuals[i], env_val);
- magic_eval (invocation->env, &result, current->e.e_call.actuals[i]);
+ magic_copy_var(&old_actuals[i], env_val);
+ magic_eval(invocation->env, &result, current->e.e_call.actuals[i]);
*env_val = result;
}
@@ -1258,67 +1328,68 @@ static effect_t *run_call (invocation_t * invocation,
}
#ifdef DEBUG
-static void print_cfg (int i, effect_t * e)
+static
+void print_cfg(int i, effect_t *e)
{
- int j;
+ int j;
for (j = 0; j < i; j++)
- printf (" ");
+ PRINTF(" ");
- printf ("%p: ", e);
+ PRINTF("%p: ", e);
if (!e)
{
- puts (" -- end --");
+ puts(" -- end --");
return;
}
switch (e->ty)
{
- case EFFECT_SKIP:
- puts ("SKIP");
+ case EFFECT::SKIP:
+ puts("SKIP");
break;
- case EFFECT_END:
- puts ("END");
+ case EFFECT::END:
+ puts("END");
break;
- case EFFECT_ABORT:
- puts ("ABORT");
+ case EFFECT::ABORT:
+ puts("ABORT");
break;
- case EFFECT_ASSIGN:
- puts ("ASSIGN");
+ case EFFECT::ASSIGN:
+ puts("ASSIGN");
break;
- case EFFECT_FOREACH:
- puts ("FOREACH");
- print_cfg (i + 1, e->e.e_foreach.body);
+ case EFFECT::FOREACH:
+ puts("FOREACH");
+ print_cfg(i + 1, e->e.e_foreach.body);
break;
- case EFFECT_FOR:
- puts ("FOR");
- print_cfg (i + 1, e->e.e_for.body);
+ case EFFECT::FOR:
+ puts("FOR");
+ print_cfg(i + 1, e->e.e_for.body);
break;
- case EFFECT_IF:
- puts ("IF");
+ case EFFECT::IF:
+ puts("IF");
for (j = 0; j < i; j++)
- printf (" ");
- puts ("THEN");
- print_cfg (i + 1, e->e.e_if.true_branch);
+ PRINTF(" ");
+ puts("THEN");
+ print_cfg(i + 1, e->e.e_if.true_branch);
for (j = 0; j < i; j++)
- printf (" ");
- puts ("ELSE");
- print_cfg (i + 1, e->e.e_if.false_branch);
+ PRINTF(" ");
+ puts("ELSE");
+ print_cfg(i + 1, e->e.e_if.false_branch);
break;
- case EFFECT_SLEEP:
- puts ("SLEEP");
+ case EFFECT::SLEEP:
+ puts("SLEEP");
break;
- case EFFECT_SCRIPT:
- puts ("SCRIPT");
+ case EFFECT::SCRIPT:
+ puts("NpcSubtype::SCRIPT");
break;
- case EFFECT_BREAK:
- puts ("BREAK");
+ case EFFECT::BREAK:
+ puts("BREAK");
break;
- case EFFECT_OP:
- puts ("OP");
+ case EFFECT::OP:
+ puts("OP");
break;
}
- print_cfg (i, e->next);
+ print_cfg(i, e->next);
}
#endif
@@ -1331,105 +1402,107 @@ static void print_cfg (int i, effect_t * e)
* >1 if we hit `sleep'; the result is the number of ticks we should sleep for.
* -1 if we paused to wait for a user action (via script interaction)
*/
-static int spell_run (invocation_t * invocation, int allow_delete)
+static
+interval_t spell_run(invocation_t *invocation, int allow_delete)
{
const int invocation_id = invocation->bl.id;
-#define REFRESH_INVOCATION invocation = (invocation_t *) map_id2bl(invocation_id); if (!invocation) return 0;
+#define REFRESH_INVOCATION invocation = (invocation_t *) map_id2bl(invocation_id); if (!invocation) return interval_t::zero();
#ifdef DEBUG
- fprintf (stderr, "Resuming execution: invocation of `%s'\n",
+ FPRINTF(stderr, "Resuming execution: invocation of `%s'\n",
invocation->spell->name);
- print_cfg (1, invocation->current_effect);
+ print_cfg(1, invocation->current_effect);
#endif
while (invocation->current_effect)
{
effect_t *e = invocation->current_effect;
effect_t *next = e->next;
- int i;
+ int i;
#ifdef DEBUG
- fprintf (stderr, "Next step of type %d\n", e->ty);
- dump_env (invocation->env);
+ FPRINTF(stderr, "Next step of type %d\n", e->ty);
+ dump_env(invocation->env);
#endif
switch (e->ty)
{
- case EFFECT_SKIP:
+ case EFFECT::SKIP:
break;
- case EFFECT_ABORT:
- invocation->flags |= INVOCATION_FLAG_ABORTED;
+ case EFFECT::ABORT:
+ invocation->flags |= INVOCATION_FLAG::ABORTED;
invocation->end_effect = NULL;
- case EFFECT_END:
- clear_stack (invocation);
+ FALLTHROUGH;
+ case EFFECT::END:
+ clear_stack(invocation);
next = NULL;
break;
- case EFFECT_ASSIGN:
- magic_eval (invocation->env,
+ case EFFECT::ASSIGN:
+ magic_eval(invocation->env,
&invocation->env->vars[e->e.e_assign.id],
e->e.e_assign.expr);
break;
- case EFFECT_FOREACH:
- next = run_foreach (invocation, e, next);
+ case EFFECT::FOREACH:
+ next = run_foreach(invocation, e, next);
break;
- case EFFECT_FOR:
+ case EFFECT::FOR:
next = run_for (invocation, e, next);
break;
- case EFFECT_IF:
- if (magic_eval_int (invocation->env, e->e.e_if.cond))
+ case EFFECT::IF:
+ if (magic_eval_int(invocation->env, e->e.e_if.cond))
next = e->e.e_if.true_branch;
else
next = e->e.e_if.false_branch;
break;
- case EFFECT_SLEEP:
+ case EFFECT::SLEEP:
{
- int sleeptime =
- magic_eval_int (invocation->env, e->e.e_sleep);
+ interval_t sleeptime = static_cast<interval_t>(
+ magic_eval_int(invocation->env, e->e.e_sleep));
invocation->current_effect = next;
- if (sleeptime > 0)
+ if (sleeptime > interval_t::zero())
return sleeptime;
break;
}
- case EFFECT_SCRIPT:
+ case EFFECT::SCRIPT:
{
character_t *caster =
- (character_t *) map_id2bl (invocation->caster);
+ (character_t *) map_id2bl(invocation->caster);
if (caster)
{
env_t *env = invocation->env;
argrec_t arg[] = { {"@target",
- VAR (VAR_TARGET).ty ==
- TY_ENTITY ? 0 : VAR (VAR_TARGET).
+ VAR(VAR_TARGET).ty ==
+ TYPE::ENTITY ? 0 : VAR(VAR_TARGET).
v.v_int}
,
{"@caster", invocation->caster}
,
{"@caster_name$", caster ? caster->status.name : ""}
};
- int message_recipient =
- VAR (VAR_SCRIPTTARGET).ty ==
- TY_ENTITY ? VAR (VAR_SCRIPTTARGET).
+ int message_recipient =
+ VAR(VAR_SCRIPTTARGET).ty ==
+ TYPE::ENTITY ? VAR(VAR_SCRIPTTARGET).
v.v_int : invocation->caster;
character_t *recipient =
- (character_t *) map_id2bl (message_recipient);
+ (character_t *) map_id2bl(message_recipient);
if (recipient->npc_id
&& recipient->npc_id != invocation->bl.id)
break; /* Don't send multiple message boxes at once */
if (!invocation->script_pos) // first time running this script?
- clif_spawn_fake_npc_for_player (recipient,
+ clif_spawn_fake_npc_for_player(recipient,
invocation->bl.id);
// We have to do this or otherwise the client won't think that it's
// dealing with an NPC
- int newpos = run_script_l (e->e.e_script,
+ int newpos = run_script_l(e->e.e_script,
invocation->script_pos,
message_recipient,
invocation->bl.id,
@@ -1440,133 +1513,125 @@ static int spell_run (invocation_t * invocation, int allow_delete)
/* Must set up for continuation */
recipient->npc_id = invocation->bl.id;
recipient->npc_pos = invocation->script_pos = newpos;
- return -1; /* Signal `wait for script' */
+ return static_cast<interval_t>(-1); /* Signal `wait for script' */
}
else
invocation->script_pos = 0;
- clif_clearchar_id (invocation->bl.id, 1, caster->fd);
+ clif_clearchar_id(invocation->bl.id, BeingRemoveWhy::DEAD, caster->fd);
}
REFRESH_INVOCATION; // Script may have killed the caster
break;
}
- case EFFECT_BREAK:
- next = return_to_stack (invocation);
+ case EFFECT::BREAK:
+ next = return_to_stack(invocation);
break;
- case EFFECT_OP:
+ case EFFECT::OP:
{
op_t *op = &operations[e->e.e_op.id];
val_t args[MAX_ARGS];
for (i = 0; i < e->e.e_op.args_nr; i++)
- magic_eval (invocation->env, &args[i], e->e.e_op.args[i]);
+ magic_eval(invocation->env, &args[i], e->e.e_op.args[i]);
- if (!magic_signature_check ("effect", op->name, op->signature,
+ if (!magic_signature_check("effect", op->name, op->signature,
e->e.e_op.args_nr, args,
e->e.e_op.line_nr,
e->e.e_op.column))
- op->op (invocation->env, e->e.e_op.args_nr, args);
+ op->op(invocation->env, e->e.e_op.args_nr, args);
for (i = 0; i < e->e.e_op.args_nr; i++)
- magic_clear_var (&args[i]);
+ magic_clear_var(&args[i]);
REFRESH_INVOCATION; // Effect may have killed the caster
break;
}
- case EFFECT_CALL:
- next = run_call (invocation, next);
+ case EFFECT::CALL:
+ next = run_call(invocation, next);
break;
default:
- fprintf (stderr,
+ FPRINTF(stderr,
"[magic] INTERNAL ERROR: Unknown effect %d\n",
e->ty);
}
if (!next)
- next = return_to_stack (invocation);
+ next = return_to_stack(invocation);
invocation->current_effect = next;
}
if (allow_delete)
- try_to_finish_invocation (invocation);
- return 0;
+ try_to_finish_invocation(invocation);
+ return interval_t::zero();
#undef REFRESH_INVOCATION
}
static
-void spell_execute_d (invocation_t * invocation, int allow_deletion)
+void spell_execute_d(invocation_t *invocation, int allow_deletion)
{
- int delta;
-
- spell_update_location (invocation);
- delta = spell_run (invocation, allow_deletion);
+ spell_update_location(invocation);
+ interval_t delta = spell_run(invocation, allow_deletion);
- if (delta > 0)
+ if (delta > interval_t::zero())
{
- if (invocation->timer)
- {
- fprintf (stderr,
- "[magic] FATAL ERROR: Trying to add multiple timers to the same spell! Already had timer: %d\n",
- invocation->timer);
- /* *((int *)0x0) = 0; */
- }
- invocation->timer = add_timer (gettick () + delta,
- &invocation_timer_callback,
- invocation->bl.id, 0);
+ assert (!invocation->timer);
+ invocation->timer = Timer(gettick() + delta,
+ std::bind(invocation_timer_callback, ph::_1, ph::_2,
+ invocation->bl.id));
}
- /* If 0, the script cleaned itself. If -1 (wait-for-script), we must wait for the user. */
+ /* If 0, the script cleaned itself. If -1(wait-for-script), we must wait for the user. */
}
-void spell_execute (invocation_t * invocation)
+void spell_execute(invocation_t *invocation)
{
- spell_execute_d (invocation, 1);
+ spell_execute_d(invocation, 1);
}
-void spell_execute_script (invocation_t * invocation)
+void spell_execute_script(invocation_t *invocation)
{
if (invocation->script_pos)
- spell_execute_d (invocation, 1);
+ spell_execute_d(invocation, 1);
/* Otherwise the script-within-the-spell has been terminated by some other means.
* In practice this happens when the script doesn't wait for user input: the client
* may still notify the server that it's done. Without the above check, we'd be
* running the same spell twice! */
}
-int spell_attack (int caster_id, int target_id)
+int spell_attack(int caster_id, int target_id)
{
- character_t *caster = (character_t *) map_id2bl (caster_id);
+ character_t *caster = (character_t *) map_id2bl(caster_id);
invocation_t *invocation;
- int stop_attack = 0;
+ int stop_attack = 0;
if (!caster)
return 0;
- invocation = (invocation_t *) map_id2bl (caster->attack_spell_override);
+ invocation = (invocation_t *) map_id2bl(caster->attack_spell_override);
- if (invocation && invocation->flags & INVOCATION_FLAG_STOPATTACK)
+ if (invocation && bool(invocation->flags & INVOCATION_FLAG::STOPATTACK))
stop_attack = 1;
if (invocation && caster->attack_spell_charges > 0)
{
- magic_clear_var (&invocation->env->vars[VAR_TARGET]);
- invocation->env->vars[VAR_TARGET].ty = TY_ENTITY;
+ magic_clear_var(&invocation->env->vars[VAR_TARGET]);
+ invocation->env->vars[VAR_TARGET].ty = TYPE::ENTITY;
invocation->env->vars[VAR_TARGET].v.v_int = target_id;
invocation->current_effect = invocation->trigger_effect;
- invocation->flags &= ~INVOCATION_FLAG_ABORTED;
- spell_execute_d (invocation,
+ invocation->flags &= ~INVOCATION_FLAG::ABORTED;
+ spell_execute_d(invocation,
0 /* don't delete the invocation if done */ );
// If the caster died, we need to refresh here:
invocation =
- (invocation_t *) map_id2bl (caster->attack_spell_override);
+ (invocation_t *) map_id2bl(caster->attack_spell_override);
- if (invocation && !(invocation->flags & INVOCATION_FLAG_ABORTED)) // If we didn't abort:
+ if (invocation && !bool(invocation->flags & INVOCATION_FLAG::ABORTED)) // If we didn't abort:
caster->attack_spell_charges--;
}
@@ -1578,14 +1643,14 @@ int spell_attack (int caster_id, int target_id)
else if (!invocation || caster->attack_spell_charges <= 0)
{
caster->attack_spell_override = 0;
- char_set_weapon_icon (caster, 0, 0, 0);
- char_set_attack_info (caster, 0, 0);
+ char_set_weapon_icon(caster, 0, StatusChange::ZERO, 0);
+ char_set_attack_info(caster, interval_t::zero(), 0);
if (stop_attack)
- pc_stopattack (caster);
+ pc_stopattack(caster);
if (invocation)
- spell_free_invocation (invocation);
+ spell_free_invocation(invocation);
}
return 1;
diff --git a/src/map/magic.cpp b/src/map/magic.cpp
index 4311f09..1377979 100644
--- a/src/map/magic.cpp
+++ b/src/map/magic.cpp
@@ -1,41 +1,43 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
+#include <cstring>
+
+#include "../common/cxxstdio.hpp"
#include "magic-interpreter.hpp"
+#include "pc.hpp"
+
+#include "../poison.hpp"
#undef DEBUG
-static char *magic_preprocess_message (character_t * character, char *start,
+static
+char *magic_preprocess_message(character_t *character, char *start,
char *end)
{
if (character->state.shroud_active
&& character->state.shroud_disappears_on_talk)
- magic_unshroud (character);
+ magic_unshroud(character);
if (character->state.shroud_active
&& character->state.shroud_hides_name_talking)
{
- int len = strlen (end);
- strcpy (start, "? ");
- memmove (start + 2, end, len + 1);
+ int len = strlen(end);
+ strcpy(start, "? ");
+ memmove(start + 2, end, len + 1);
return start + 4;
}
else
return end + 2; /* step past blank */
}
-#define ISBLANK(c) ((c) == ' ')
-
/* Returns a dynamically allocated copy of `src'.
* `*parameter' may point within that copy or be NULL. */
-static char *magic_tokenise (char *src, char **parameter)
+static
+char *magic_tokenise(char *src, char **parameter)
{
- char *retval = strdup (src);
+ char *retval = strdup(src);
char *seeker = retval;
- while (*seeker && !ISBLANK (*seeker))
+ while (*seeker && *seeker != ' ')
++seeker;
if (!*seeker)
@@ -45,7 +47,7 @@ static char *magic_tokenise (char *src, char **parameter)
*seeker = 0; /* Terminate invocation */
++seeker;
- while (ISBLANK (*seeker))
+ while (*seeker == ' ')
++seeker;
*parameter = seeker;
@@ -54,15 +56,15 @@ static char *magic_tokenise (char *src, char **parameter)
return retval;
}
-int magic_message (character_t * caster, char *spell_, size_t spell_len)
+int magic_message(character_t *caster, char *spell_, size_t)
{
- if (pc_isdead (caster))
+ if (pc_isdead(caster))
return 0;
- int power = caster->matk1;
+ int power = caster->matk1;
char *invocation_base = spell_ + 8;
char *source_invocation =
- 1 + invocation_base + strlen (caster->status.name);
+ 1 + invocation_base + strlen(caster->status.name);
spell_t *spell;
char *parameter;
char *spell_invocation;
@@ -72,57 +74,57 @@ int magic_message (character_t * caster, char *spell_, size_t spell_len)
/* Pre-message filter in case some spell alters output */
source_invocation =
- magic_preprocess_message (caster, invocation_base, source_invocation);
+ magic_preprocess_message(caster, invocation_base, source_invocation);
- spell_invocation = magic_tokenise (source_invocation, &parameter);
- parameter = parameter ? strdup (parameter) : strdup ("");
+ spell_invocation = magic_tokenise(source_invocation, &parameter);
+ parameter = parameter ? strdup(parameter) : strdup("");
- spell = magic_find_spell (spell_invocation);
- free (spell_invocation);
+ spell = magic_find_spell(spell_invocation);
+ free(spell_invocation);
if (spell)
{
- int near_miss;
+ int near_miss;
env_t *env =
- spell_create_env (&magic_conf, spell, caster, power, parameter);
+ spell_create_env(&magic_conf, spell, caster, power, parameter);
effect_set_t *effects;
- if ((spell->flags & SPELL_FLAG_NONMAGIC) || (power >= 1))
- effects = spell_trigger (spell, caster, env, &near_miss);
+ if (bool(spell->flags & SPELL_FLAG::NONMAGIC) || (power >= 1))
+ effects = spell_trigger(spell, caster, env, &near_miss);
else
effects = NULL;
#ifdef DEBUG
- fprintf (stderr, "Found spell `%s', triggered = %d\n", spell_,
+ FPRINTF(stderr, "Found spell `%s', triggered = %d\n", spell_,
effects != NULL);
#endif
- if (caster->status.option & OPTION_HIDE)
+ if (bool(caster->status.option & Option::HIDE))
return 0; // No spellcasting while hidden
- MAP_LOG_PC (caster, "CAST %s %s",
+ MAP_LOG_PC(caster, "CAST %s %s",
spell->name, effects ? "SUCCESS" : "FAILURE");
if (effects)
{
- invocation_t *invocation = spell_instantiate (effects, env);
+ invocation_t *invocation = spell_instantiate(effects, env);
- spell_bind (caster, invocation);
- spell_execute (invocation);
+ spell_bind(caster, invocation);
+ spell_execute(invocation);
- return (spell->flags & SPELL_FLAG_SILENT) ? -1 : 1;
+ return bool(spell->flags & SPELL_FLAG::SILENT) ? -1 : 1;
}
else
- magic_free_env (env);
+ magic_free_env(env);
return 1;
}
else
- free (parameter);
+ free(parameter);
return 0; /* Not a spell */
}
-void do_init_magic (void)
+void do_init_magic(void)
{
- magic_init (MAGIC_CONFIG_FILE);
+ magic_init(MAGIC_CONFIG_FILE);
}
diff --git a/src/map/magic.hpp b/src/map/magic.hpp
index 168a05f..4b567ea 100644
--- a/src/map/magic.hpp
+++ b/src/map/magic.hpp
@@ -1,8 +1,7 @@
#ifndef MAGIC_HPP
#define MAGIC_HPP
-#include "clif.hpp"
-#include "intif.hpp"
+#include "skill.t.hpp"
#define MAGIC_CONFIG_FILE "conf/magic.conf"
@@ -22,69 +21,68 @@ struct invocation; /* Spell invocation */
* \return 1 or -1 if the input message was magic and was handled by this function, 0 otherwise. -1 is returned when the
* message should not be repeated.
*/
-int magic_message (character_t * caster, char *spell, size_t spell_len);
+int magic_message(character_t *caster, char *spell, size_t spell_len);
/**
* Removes the shroud from a character
*
* \param character The character to remove the shroud from
*/
-void magic_unshroud (character_t * character);
+void magic_unshroud(character_t *character);
/**
* Notifies a running spell that a status_change timer triggered by the spell has expired
*
* \param invocation The invocation to notify
* \param bl_id ID of the PC for whom this happened
- * \param type sc_id ID of the status change entry that finished
+ * \param sc_id ID of the status change entry that finished
* \param supplanted Whether the status_change finished normally (0) or was supplanted by a new status_change (1)
*/
-void
-spell_effect_report_termination (int invocation, int bl_id, int sc_id,
- int supplanted);
+void spell_effect_report_termination(int invocation, int bl_id,
+ StatusChange sc_id, int supplanted);
/**
* Initialise all spells, read config data
*/
-void do_init_magic (void);
+void do_init_magic(void);
/**
* Identifies the invocation used to trigger a spell
*
* Returns NULL if not found
*/
-const char *magic_find_invocation (const char *spellame);
+const char *magic_find_invocation(const char *spellame);
/**
* Identifies the invocation used to denote a teleport location
*
* Returns NULL if not found
*/
-const char *magic_find_anchor_invocation (const char *teleport_location);
+const char *magic_find_anchor_invocation(const char *teleport_location);
/**
* Execute a spell invocation and sets up timers to finish
*/
-void spell_execute (struct invocation *invocation);
+void spell_execute(struct invocation *invocation);
/**
* Continue an NPC script embedded in a spell
*/
-void spell_execute_script (struct invocation *invocation);
+void spell_execute_script(struct invocation *invocation);
/**
* Stops all magic bound to the specified character
*
*/
-void magic_stop_completely (character_t * c);
+void magic_stop_completely(character_t *c);
/**
* Attacks with a magical spell charged to the character
*
* Returns 0 if there is no charged spell or the spell is depleted.
*/
-int spell_attack (int caster, int target);
+int spell_attack(int caster, int target);
-void spell_free_invocation (struct invocation *invocation);
+void spell_free_invocation(struct invocation *invocation);
-#endif /* !defined(MAGIC_H_) */
+#endif // MAGIC_HPP
diff --git a/src/map/map.cpp b/src/map/map.cpp
index af49ad4..a3f600a 100644
--- a/src/map/map.cpp
+++ b/src/map/map.cpp
@@ -1,89 +1,103 @@
-// $Id: map.c,v 1.6 2004/09/25 17:37:01 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#ifdef LCCWIN32
-#include <winsock.h>
-#else
+#include "map.hpp"
+
+#include <sys/time.h>
+#include <sys/wait.h>
+
#include <netdb.h>
-#endif
+#include <unistd.h>
+
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
+
+#include <fstream>
#include "../common/core.hpp"
-#include "../common/timer.hpp"
+#include "../common/cxxstdio.hpp"
#include "../common/db.hpp"
-#include "../common/grfio.hpp"
-#include "../common/mt_rand.hpp"
-#include "map.hpp"
+#include "../common/random2.hpp"
+#include "../common/nullpo.hpp"
+#include "../common/socket.hpp"
+#include "../common/timer.hpp"
+
+#include "atcommand.hpp"
+#include "battle.hpp"
+#include "chat.hpp"
#include "chrif.hpp"
#include "clif.hpp"
-#include "intif.hpp"
+#include "grfio.hpp"
+#include "itemdb.hpp"
+#include "magic.hpp"
+#include "mob.hpp"
#include "npc.hpp"
+#include "party.hpp"
#include "pc.hpp"
-#include "mob.hpp"
-#include "chat.hpp"
-#include "itemdb.hpp"
-#include "storage.hpp"
+#include "script.hpp"
#include "skill.hpp"
+#include "storage.hpp"
#include "trade.hpp"
-#include "party.hpp"
-#include "battle.hpp"
-#include "script.hpp"
-#include "guild.hpp"
-#include "atcommand.hpp"
-#include "../common/nullpo.hpp"
-#include "../common/socket.hpp"
-#include "magic.hpp"
-
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
-
-// 極力 staticでローカルに収める
-static struct dbt *id_db = NULL;
-static struct dbt *map_db = NULL;
-static struct dbt *nick_db = NULL;
-static struct dbt *charid_db = NULL;
-
-static int users = 0;
-static struct block_list *object[MAX_FLOORITEM];
-static int first_free_object_id = 0, last_object_id = 0;
-
-#define block_free_max 1048576
-static void *block_free[block_free_max];
-static int block_free_count = 0, block_free_lock = 0;
-#define BL_LIST_MAX 1048576
-static struct block_list *bl_list[BL_LIST_MAX];
-static int bl_list_count = 0;
+#include "../poison.hpp"
-struct map_data map[MAX_MAP_PER_SERVER];
-int map_num = 0;
+DMap<int, struct block_list *> id_db;
-int map_port = 0;
+static
+DMap<std::string, struct map_data *> map_db;
-int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
-int save_settings = 0xFFFF;
-int agit_flag = 0;
-int night_flag = 0; // 0=day, 1=night [Yor]
+static
+DMap<std::string, struct map_session_data *> nick_db;
struct charid2nick
{
char nick[24];
- int req_id;
+ int req_id;
};
+static
+Map<int, struct charid2nick> charid_db;
+
+static
+int users = 0;
+static
+struct block_list *object[MAX_FLOORITEM];
+static
+int first_free_object_id = 0, last_object_id = 0;
+
+constexpr int block_free_max = 1048576;
+static
+void *block_free[block_free_max];
+static
+int block_free_count = 0, block_free_lock = 0;
+
+constexpr int BL_LIST_MAX = 1048576;
+static
+struct block_list *bl_list[BL_LIST_MAX];
+static
+int bl_list_count = 0;
+
+struct map_data map[MAX_MAP_PER_SERVER];
+int map_num = 0;
+
+static
+int map_port = 0;
+
+interval_t autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
+int save_settings = 0xFFFF;
+
char motd_txt[256] = "conf/motd.txt";
char help_txt[256] = "conf/help.txt";
char wisp_server_name[24] = "Server"; // can be modified in char-server configuration file
+static
+int map_delmap(const char *mapname);
+
/*==========================================
* 全map鯖総計での接続数設定
* (char鯖から送られてくる)
*------------------------------------------
*/
-void map_setusers (int n)
+void map_setusers(int n)
{
users = n;
}
@@ -92,7 +106,7 @@ void map_setusers (int n)
* 全map鯖総計での接続数取得 (/wへの応答用)
*------------------------------------------
*/
-int map_getusers (void)
+int map_getusers(void)
{
return users;
}
@@ -106,11 +120,11 @@ int map_getusers (void)
* ロックされているときはバッファにためる
*------------------------------------------
*/
-int map_freeblock (void *bl)
+int map_freeblock(void *bl)
{
if (block_free_lock == 0)
{
- free (bl);
+ free(bl);
bl = NULL;
}
else
@@ -118,8 +132,7 @@ int map_freeblock (void *bl)
if (block_free_count >= block_free_max)
{
if (battle_config.error_log)
- printf
- ("map_freeblock: *WARNING* too many free block! %d %d\n",
+ PRINTF("map_freeblock: *WARNING* too many free block! %d %d\n",
block_free_count, block_free_lock);
}
else
@@ -132,7 +145,7 @@ int map_freeblock (void *bl)
* blockのfreeを一時的に禁止する
*------------------------------------------
*/
-int map_freeblock_lock (void)
+int map_freeblock_lock(void)
{
return ++block_free_lock;
}
@@ -143,18 +156,18 @@ int map_freeblock_lock (void)
* バッファにたまっていたblockを全部削除
*------------------------------------------
*/
-int map_freeblock_unlock (void)
+int map_freeblock_unlock(void)
{
if ((--block_free_lock) == 0)
{
- int i;
+ int i;
// if(block_free_count>0) {
// if(battle_config.error_log)
-// printf("map_freeblock_unlock: free %d object\n",block_free_count);
+// PRINTF("map_freeblock_unlock: free %d object\n",block_free_count);
// }
for (i = 0; i < block_free_count; i++)
{
- free (block_free[i]);
+ free(block_free[i]);
block_free[i] = NULL;
}
block_free_count = 0;
@@ -162,20 +175,16 @@ int map_freeblock_unlock (void)
else if (block_free_lock < 0)
{
if (battle_config.error_log)
- printf ("map_freeblock_unlock: lock count < 0 !\n");
+ PRINTF("map_freeblock_unlock: lock count < 0 !\n");
}
return block_free_lock;
}
-//
-// block化処理
-//
-/*==========================================
- * map[]のblock_listから繋がっている場合に
- * bl->prevにbl_headのアドレスを入れておく
- *------------------------------------------
- */
-static struct block_list bl_head;
+/// This is a dummy entry that is shared by all the linked lists,
+/// so that any entry can unlink itself without worrying about
+/// whether it was the the head of the list.
+static
+struct block_list bl_head;
/*==========================================
* map[]のblock_listに追加
@@ -184,16 +193,16 @@ static struct block_list bl_head;
* 既にlink済みかの確認が無い。危険かも
*------------------------------------------
*/
-int map_addblock (struct block_list *bl)
+int map_addblock(struct block_list *bl)
{
- int m, x, y;
+ int m, x, y;
- nullpo_retr (0, bl);
+ nullpo_ret(bl);
if (bl->prev != NULL)
{
if (battle_config.error_log)
- printf ("map_addblock error : bl->prev!=NULL\n");
+ PRINTF("map_addblock error : bl->prev!=NULL\n");
return 0;
}
@@ -204,7 +213,7 @@ int map_addblock (struct block_list *bl)
x < 0 || x >= map[m].xs || y < 0 || y >= map[m].ys)
return 1;
- if (bl->type == BL_MOB)
+ if (bl->type == BL::MOB)
{
bl->next =
map[m].block_mob[x / BLOCK_SIZE + (y / BLOCK_SIZE) * map[m].bxs];
@@ -224,7 +233,7 @@ int map_addblock (struct block_list *bl)
bl->next->prev = bl;
map[m].block[x / BLOCK_SIZE + (y / BLOCK_SIZE) * map[m].bxs] = bl;
map[m].block_count[x / BLOCK_SIZE + (y / BLOCK_SIZE) * map[m].bxs]++;
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
map[m].users++;
}
@@ -236,10 +245,10 @@ int map_addblock (struct block_list *bl)
* prevがNULLの場合listに繋がってない
*------------------------------------------
*/
-int map_delblock (struct block_list *bl)
+int map_delblock(struct block_list *bl)
{
- int b;
- nullpo_retr (0, bl);
+ int b;
+ nullpo_ret(bl);
// 既にblocklistから抜けている
if (bl->prev == NULL)
@@ -248,14 +257,14 @@ int map_delblock (struct block_list *bl)
{
// prevがNULLでnextがNULLでないのは有ってはならない
if (battle_config.error_log)
- printf ("map_delblock error : bl->next!=NULL\n");
+ PRINTF("map_delblock error : bl->next!=NULL\n");
}
return 0;
}
b = bl->x / BLOCK_SIZE + (bl->y / BLOCK_SIZE) * map[bl->m].bxs;
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
map[bl->m].users--;
if (bl->next)
@@ -263,7 +272,7 @@ int map_delblock (struct block_list *bl)
if (bl->prev == &bl_head)
{
// リストの頭なので、map[]のblock_listを更新する
- if (bl->type == BL_MOB)
+ if (bl->type == BL::MOB)
{
map[bl->m].block_mob[b] = bl->next;
if ((map[bl->m].block_mob_count[b]--) < 0)
@@ -287,47 +296,15 @@ int map_delblock (struct block_list *bl)
}
/*==========================================
- * 周囲のPC人数を数える (現在未使用)
- *------------------------------------------
- */
-int map_countnearpc (int m, int x, int y)
-{
- int bx, by, c = 0;
- struct block_list *bl = NULL;
-
- if (map[m].users == 0)
- return 0;
- for (by = y / BLOCK_SIZE - AREA_SIZE / BLOCK_SIZE - 1;
- by <= y / BLOCK_SIZE + AREA_SIZE / BLOCK_SIZE + 1; by++)
- {
- if (by < 0 || by >= map[m].bys)
- continue;
- for (bx = x / BLOCK_SIZE - AREA_SIZE / BLOCK_SIZE - 1;
- bx <= x / BLOCK_SIZE + AREA_SIZE / BLOCK_SIZE + 1; bx++)
- {
- if (bx < 0 || bx >= map[m].bxs)
- continue;
- bl = map[m].block[bx + by * map[m].bxs];
- for (; bl; bl = bl->next)
- {
- if (bl->type == BL_PC)
- c++;
- }
- }
- }
- return c;
-}
-
-/*==========================================
* セル上のPCとMOBの数を数える (グランドクロス用)
*------------------------------------------
*/
-int map_count_oncell (int m, int x, int y)
+int map_count_oncell(int m, int x, int y)
{
- int bx, by;
+ int bx, by;
struct block_list *bl = NULL;
- int i, c;
- int count = 0;
+ int i, c;
+ int count = 0;
if (x < 0 || y < 0 || (x >= map[m].xs) || (y >= map[m].ys))
return 1;
@@ -338,7 +315,7 @@ int map_count_oncell (int m, int x, int y)
c = map[m].block_count[bx + by * map[m].bxs];
for (i = 0; i < c && bl; i++, bl = bl->next)
{
- if (bl->x == x && bl->y == y && bl->type == BL_PC)
+ if (bl->x == x && bl->y == y && bl->type == BL::PC)
count++;
}
bl = map[m].block_mob[bx + by * map[m].bxs];
@@ -359,17 +336,17 @@ int map_count_oncell (int m, int x, int y)
* type!=0 ならその種類のみ
*------------------------------------------
*/
-void map_foreachinarea (int (*func) (struct block_list *, va_list), int m,
- int x0, int y0, int x1, int y1, int type, ...)
+void map_foreachinarea(std::function<void(struct block_list *)> func,
+ int m,
+ int x0, int y0, int x1, int y1,
+ BL type)
{
- int bx, by;
+ int bx, by;
struct block_list *bl = NULL;
- va_list ap = NULL;
- int blockcount = bl_list_count, i, c;
+ int blockcount = bl_list_count, i, c;
if (m < 0)
return;
- va_start (ap, type);
if (x0 < 0)
x0 = 0;
if (y0 < 0)
@@ -378,7 +355,7 @@ void map_foreachinarea (int (*func) (struct block_list *, va_list), int m,
x1 = map[m].xs - 1;
if (y1 >= map[m].ys)
y1 = map[m].ys - 1;
- if (type == 0 || type != BL_MOB)
+ if (type == BL::NUL || type != BL::MOB)
for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++)
{
for (bx = x0 / BLOCK_SIZE; bx <= x1 / BLOCK_SIZE; bx++)
@@ -387,7 +364,7 @@ void map_foreachinarea (int (*func) (struct block_list *, va_list), int m,
c = map[m].block_count[bx + by * map[m].bxs];
for (i = 0; i < c && bl; i++, bl = bl->next)
{
- if (bl && type && bl->type != type)
+ if (bl && type != BL::NUL && bl->type != type)
continue;
if (bl && bl->x >= x0 && bl->x <= x1 && bl->y >= y0
&& bl->y <= y1 && bl_list_count < BL_LIST_MAX)
@@ -395,7 +372,7 @@ void map_foreachinarea (int (*func) (struct block_list *, va_list), int m,
}
}
}
- if (type == 0 || type == BL_MOB)
+ if (type == BL::NUL || type == BL::MOB)
for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++)
{
for (bx = x0 / BLOCK_SIZE; bx <= x1 / BLOCK_SIZE; bx++)
@@ -414,18 +391,17 @@ void map_foreachinarea (int (*func) (struct block_list *, va_list), int m,
if (bl_list_count >= BL_LIST_MAX)
{
if (battle_config.error_log)
- printf ("map_foreachinarea: *WARNING* block count too many!\n");
+ PRINTF("map_foreachinarea: *WARNING* block count too many!\n");
}
- map_freeblock_lock (); // メモリからの解放を禁止する
+ map_freeblock_lock(); // メモリからの解放を禁止する
for (i = blockcount; i < bl_list_count; i++)
if (bl_list[i]->prev) // 有効かどうかチェック
- func (bl_list[i], ap);
+ func(bl_list[i]);
- map_freeblock_unlock (); // 解放を許可する
+ map_freeblock_unlock(); // 解放を許可する
- va_end (ap);
bl_list_count = blockcount;
}
@@ -437,16 +413,16 @@ void map_foreachinarea (int (*func) (struct block_list *, va_list), int m,
* dx,dyは-1,0,1のみとする(どんな値でもいいっぽい?)
*------------------------------------------
*/
-void map_foreachinmovearea (int (*func) (struct block_list *, va_list), int m,
- int x0, int y0, int x1, int y1, int dx, int dy,
- int type, ...)
+void map_foreachinmovearea(std::function<void(struct block_list *)> func,
+ int m,
+ int x0, int y0, int x1, int y1,
+ int dx, int dy,
+ BL type)
{
- int bx, by;
+ int bx, by;
struct block_list *bl = NULL;
- va_list ap = NULL;
- int blockcount = bl_list_count, i, c;
+ int blockcount = bl_list_count, i, c;
- va_start (ap, type);
if (dx == 0 || dy == 0)
{
// 矩形領域の場合
@@ -488,7 +464,7 @@ void map_foreachinmovearea (int (*func) (struct block_list *, va_list), int m,
c = map[m].block_count[bx + by * map[m].bxs];
for (i = 0; i < c && bl; i++, bl = bl->next)
{
- if (bl && type && bl->type != type)
+ if (bl && type != BL::NUL && bl->type != type)
continue;
if (bl && bl->x >= x0 && bl->x <= x1 && bl->y >= y0
&& bl->y <= y1 && bl_list_count < BL_LIST_MAX)
@@ -498,7 +474,7 @@ void map_foreachinmovearea (int (*func) (struct block_list *, va_list), int m,
c = map[m].block_mob_count[bx + by * map[m].bxs];
for (i = 0; i < c && bl; i++, bl = bl->next)
{
- if (bl && type && bl->type != type)
+ if (bl && type != BL::NUL && bl->type != type)
continue;
if (bl && bl->x >= x0 && bl->x <= x1 && bl->y >= y0
&& bl->y <= y1 && bl_list_count < BL_LIST_MAX)
@@ -527,7 +503,7 @@ void map_foreachinmovearea (int (*func) (struct block_list *, va_list), int m,
c = map[m].block_count[bx + by * map[m].bxs];
for (i = 0; i < c && bl; i++, bl = bl->next)
{
- if (bl && type && bl->type != type)
+ if (bl && type != BL::NUL && bl->type != type)
continue;
if ((bl)
&& !(bl->x >= x0 && bl->x <= x1 && bl->y >= y0
@@ -546,7 +522,7 @@ void map_foreachinmovearea (int (*func) (struct block_list *, va_list), int m,
c = map[m].block_mob_count[bx + by * map[m].bxs];
for (i = 0; i < c && bl; i++, bl = bl->next)
{
- if (bl && type && bl->type != type)
+ if (bl && type != BL::NUL && bl->type != type)
continue;
if ((bl)
&& !(bl->x >= x0 && bl->x <= x1 && bl->y >= y0
@@ -569,18 +545,17 @@ void map_foreachinmovearea (int (*func) (struct block_list *, va_list), int m,
if (bl_list_count >= BL_LIST_MAX)
{
if (battle_config.error_log)
- printf ("map_foreachinarea: *WARNING* block count too many!\n");
+ PRINTF("map_foreachinarea: *WARNING* block count too many!\n");
}
- map_freeblock_lock (); // メモリからの解放を禁止する
+ map_freeblock_lock(); // メモリからの解放を禁止する
for (i = blockcount; i < bl_list_count; i++)
if (bl_list[i]->prev) // 有効かどうかチェック
- func (bl_list[i], ap);
+ func(bl_list[i]);
- map_freeblock_unlock (); // 解放を許可する
+ map_freeblock_unlock(); // 解放を許可する
- va_end (ap);
bl_list_count = blockcount;
}
@@ -588,33 +563,32 @@ void map_foreachinmovearea (int (*func) (struct block_list *, va_list), int m,
// which only checks the exact single x/y passed to it rather than an
// area radius - may be more useful in some instances)
//
-void map_foreachincell (int (*func) (struct block_list *, va_list), int m,
- int x, int y, int type, ...)
+void map_foreachincell(std::function<void(struct block_list *)> func,
+ int m,
+ int x, int y,
+ BL type)
{
- int bx, by;
+ int bx, by;
struct block_list *bl = NULL;
- va_list ap = NULL;
- int blockcount = bl_list_count, i, c;
-
- va_start (ap, type);
+ int blockcount = bl_list_count, i, c;
by = y / BLOCK_SIZE;
bx = x / BLOCK_SIZE;
- if (type == 0 || type != BL_MOB)
+ if (type == BL::NUL || type != BL::MOB)
{
bl = map[m].block[bx + by * map[m].bxs];
c = map[m].block_count[bx + by * map[m].bxs];
for (i = 0; i < c && bl; i++, bl = bl->next)
{
- if (type && bl && bl->type != type)
+ if (type != BL::NUL && bl && bl->type != type)
continue;
if (bl && bl->x == x && bl->y == y && bl_list_count < BL_LIST_MAX)
bl_list[bl_list_count++] = bl;
}
}
- if (type == 0 || type == BL_MOB)
+ if (type == BL::NUL || type == BL::MOB)
{
bl = map[m].block_mob[bx + by * map[m].bxs];
c = map[m].block_mob_count[bx + by * map[m].bxs];
@@ -628,18 +602,17 @@ void map_foreachincell (int (*func) (struct block_list *, va_list), int m,
if (bl_list_count >= BL_LIST_MAX)
{
if (battle_config.error_log)
- printf ("map_foreachincell: *WARNING* block count too many!\n");
+ PRINTF("map_foreachincell: *WARNING* block count too many!\n");
}
- map_freeblock_lock (); // メモリからの解放を禁止する
+ map_freeblock_lock(); // メモリからの解放を禁止する
for (i = blockcount; i < bl_list_count; i++)
if (bl_list[i]->prev) // 有効かどうかチェック
- func (bl_list[i], ap);
+ func(bl_list[i]);
- map_freeblock_unlock (); // 解放を許可する
+ map_freeblock_unlock(); // 解放を許可する
- va_end (ap);
bl_list_count = blockcount;
}
@@ -650,12 +623,12 @@ void map_foreachincell (int (*func) (struct block_list *, va_list), int m,
* bl->idもこの中で設定して問題無い?
*------------------------------------------
*/
-int map_addobject (struct block_list *bl)
+int map_addobject(struct block_list *bl)
{
- int i;
+ int i;
if (bl == NULL)
{
- printf ("map_addobject nullpo?\n");
+ PRINTF("map_addobject nullpo?\n");
return 0;
}
if (first_free_object_id < 2 || first_free_object_id >= MAX_FLOORITEM)
@@ -666,36 +639,37 @@ int map_addobject (struct block_list *bl)
if (i >= MAX_FLOORITEM)
{
if (battle_config.error_log)
- printf ("no free object id\n");
+ PRINTF("no free object id\n");
return 0;
}
first_free_object_id = i;
if (last_object_id < i)
last_object_id = i;
object[i] = bl;
- numdb_insert (id_db, i, bl);
+ id_db.put(i, bl);
return i;
}
/*==========================================
* 一時objectの解放
- * map_delobjectのfreeしないバージョン
+ * map_delobjectのfreeしないバージョン
*------------------------------------------
*/
-int map_delobjectnofree (int id, int type)
+int map_delobjectnofree(int id, BL type)
{
if (object[id] == NULL)
return 0;
if (object[id]->type != type)
{
- fprintf (stderr, "Incorrect type: expected %d, got %d\n", type,
- object[id]->type);
- *((char *) 0) = 0; // break for backtrace
+ FPRINTF(stderr, "Incorrect type: expected %d, got %d\n",
+ type,
+ object[id]->type);
+ abort();
}
- map_delblock (object[id]);
- numdb_erase (id_db, id);
+ map_delblock(object[id]);
+ id_db.put(id, nullptr);
// map_freeblock(object[id]);
object[id] = NULL;
@@ -716,18 +690,18 @@ int map_delobjectnofree (int id, int type)
* addとの対称性が無いのが気になる
*------------------------------------------
*/
-int map_delobject (int id, int type)
+int map_delobject(int id, BL type)
{
struct block_list *obj = object[id];
if (obj == NULL)
return 0;
- map_delobjectnofree (id, type);
- if (obj->type == BL_PC) // [Fate] Not sure where else to put this... I'm not sure where delobject for PCs is called from
- pc_cleanup ((struct map_session_data *) obj);
+ map_delobjectnofree(id, type);
+ if (obj->type == BL::PC) // [Fate] Not sure where else to put this... I'm not sure where delobject for PCs is called from
+ pc_cleanup((struct map_session_data *) obj);
- map_freeblock (obj);
+ map_freeblock(obj);
return 0;
}
@@ -737,40 +711,36 @@ int map_delobject (int id, int type)
*
*------------------------------------------
*/
-void map_foreachobject (int (*func) (struct block_list *, va_list), int type,
- ...)
+void map_foreachobject(std::function<void(struct block_list *)> func,
+ BL type)
{
- int i;
- int blockcount = bl_list_count;
- va_list ap = NULL;
-
- va_start (ap, type);
+ int i;
+ int blockcount = bl_list_count;
for (i = 2; i <= last_object_id; i++)
{
if (object[i])
{
- if (type && object[i]->type != type)
+ if (type != BL::NUL && object[i]->type != type)
continue;
if (bl_list_count >= BL_LIST_MAX)
{
if (battle_config.error_log)
- printf ("map_foreachobject: too many block !\n");
+ PRINTF("map_foreachobject: too many block !\n");
}
else
bl_list[bl_list_count++] = object[i];
}
}
- map_freeblock_lock ();
+ map_freeblock_lock();
for (i = blockcount; i < bl_list_count; i++)
if (bl_list[i]->prev || bl_list[i]->next)
- func (bl_list[i], ap);
+ func(bl_list[i]);
- map_freeblock_unlock ();
+ map_freeblock_unlock();
- va_end (ap);
bl_list_count = blockcount;
}
@@ -784,73 +754,41 @@ void map_foreachobject (int (*func) (struct block_list *, va_list), int type,
* map.h内で#defineしてある
*------------------------------------------
*/
-void map_clearflooritem_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void map_clearflooritem_timer(TimerData *tid, tick_t, int id)
{
struct flooritem_data *fitem = NULL;
fitem = (struct flooritem_data *) object[id];
- if (fitem == NULL || fitem->bl.type != BL_ITEM
- || (!data && fitem->cleartimer != tid))
+ if (fitem == NULL || fitem->bl.type != BL::ITEM)
{
if (battle_config.error_log)
- printf ("map_clearflooritem_timer : error\n");
+ PRINTF("map_clearflooritem_timer : error\n");
return;
}
- if (data)
- delete_timer (fitem->cleartimer, map_clearflooritem_timer);
- clif_clearflooritem (fitem, 0);
- map_delobject (fitem->bl.id, BL_ITEM);
+ if (!tid)
+ fitem->cleartimer.cancel();
+ clif_clearflooritem(fitem, 0);
+ map_delobject(fitem->bl.id, BL::ITEM);
}
-/*==========================================
- * (m,x,y)の周囲rangeマス内の空き(=侵入可能)cellの
- * 内から適当なマス目の座標をx+(y<<16)で返す
- *
- * 現状range=1でアイテムドロップ用途のみ
- *------------------------------------------
- */
-int map_searchrandfreecell (int m, int x, int y, int range)
+std::pair<uint16_t, uint16_t> map_randfreecell(int m, uint16_t x, uint16_t y, uint16_t w, uint16_t h)
{
- int free_cell, i, j, c;
-
- for (free_cell = 0, i = -range; i <= range; i++)
- {
- if (i + y < 0 || i + y >= map[m].ys)
- continue;
- for (j = -range; j <= range; j++)
- {
- if (j + x < 0 || j + x >= map[m].xs)
- continue;
- if ((c = read_gat (m, j + x, i + y)) == 1 || c == 5)
- continue;
- free_cell++;
- }
- }
- if (free_cell == 0)
- return -1;
- free_cell = MRAND (free_cell);
- for (i = -range; i <= range; i++)
+ for (int itr : random_::iterator(w * h))
{
- if (i + y < 0 || i + y >= map[m].ys)
- continue;
- for (j = -range; j <= range; j++)
- {
- if (j + x < 0 || j + x >= map[m].xs)
- continue;
- if ((c = read_gat (m, j + x, i + y)) == 1 || c == 5)
- continue;
- if (free_cell == 0)
- {
- x += j;
- y += i;
- i = range + 1;
- break;
- }
- free_cell--;
- }
+ int dx = itr % w;
+ int dy = itr / w;
+ if (!bool(read_gat(m, x + dx, y + dy) & MapCell::UNWALKABLE))
+ return {static_cast<uint16_t>(x + dx), static_cast<uint16_t>(y + dy)};
}
+ return {static_cast<uint16_t>(0), static_cast<uint16_t>(0)};
+}
- return x + (y << 16);
+/// Return a randomly selected passable cell within a given range.
+static
+std::pair<uint16_t, uint16_t> map_searchrandfreecell(int m, int x, int y, int range)
+{
+ int whole_range = 2 * range + 1;
+ return map_randfreecell(m, x - range, y - range, whole_range, whole_range);
}
/*==========================================
@@ -859,41 +797,39 @@ int map_searchrandfreecell (int m, int x, int y, int range)
* item_dataはamount以外をcopyする
*------------------------------------------
*/
-int map_addflooritem_any (struct item *item_data, int amount, int m, int x,
- int y, struct map_session_data **owners,
- int *owner_protection, int lifetime, int dispersal)
+int map_addflooritem_any(struct item *item_data, int amount,
+ int m, int x, int y,
+ struct map_session_data **owners, interval_t *owner_protection,
+ interval_t lifetime, int dispersal)
{
- int xy, r;
- unsigned int tick;
struct flooritem_data *fitem = NULL;
- nullpo_retr (0, item_data);
-
- if ((xy = map_searchrandfreecell (m, x, y, dispersal)) < 0)
+ nullpo_ret(item_data);
+ auto xy = map_searchrandfreecell(m, x, y, dispersal);
+ if (xy.first == 0 && xy.second == 0)
return 0;
- r = mt_random ();
- CREATE (fitem, struct flooritem_data, 1);
- fitem->bl.type = BL_ITEM;
+ CREATE(fitem, struct flooritem_data, 1);
+ fitem->bl.type = BL::ITEM;
fitem->bl.prev = fitem->bl.next = NULL;
fitem->bl.m = m;
- fitem->bl.x = xy & 0xffff;
- fitem->bl.y = (xy >> 16) & 0xffff;
+ fitem->bl.x = xy.first;
+ fitem->bl.y = xy.second;
fitem->first_get_id = 0;
- fitem->first_get_tick = 0;
+ fitem->first_get_tick = tick_t();
fitem->second_get_id = 0;
- fitem->second_get_tick = 0;
+ fitem->second_get_tick = tick_t();
fitem->third_get_id = 0;
- fitem->third_get_tick = 0;
+ fitem->third_get_tick = tick_t();
- fitem->bl.id = map_addobject (&fitem->bl);
+ fitem->bl.id = map_addobject(&fitem->bl);
if (fitem->bl.id == 0)
{
- free (fitem);
+ free(fitem);
return 0;
}
- tick = gettick ();
+ tick_t tick = gettick();
if (owners[0])
fitem->first_get_id = owners[0]->bl.id;
@@ -907,189 +843,90 @@ int map_addflooritem_any (struct item *item_data, int amount, int m, int x,
fitem->third_get_id = owners[2]->bl.id;
fitem->third_get_tick = tick + owner_protection[2];
- memcpy (&fitem->item_data, item_data, sizeof (*item_data));
+ memcpy(&fitem->item_data, item_data, sizeof(*item_data));
fitem->item_data.amount = amount;
- fitem->subx = (r & 3) * 3 + 3;
- fitem->suby = ((r >> 2) & 3) * 3 + 3;
- fitem->cleartimer =
- add_timer (gettick () + lifetime, map_clearflooritem_timer,
- fitem->bl.id, 0);
-
- map_addblock (&fitem->bl);
- clif_dropflooritem (fitem);
+ // TODO - talk to 4144 about maybe removing this.
+ // It has no effect on the server itself, it is visual only.
+ // If it is desirable to prevent items from visibly stacking
+ // on the ground, that can be done with client-side randomness.
+ // Currently, it yields the numbers {3 6 9 12}.
+ fitem->subx = random_::in(1, 4) * 3;
+ fitem->suby = random_::in(1, 4) * 3;
+ fitem->cleartimer = Timer(gettick() + lifetime,
+ std::bind(map_clearflooritem_timer, ph::_1, ph::_2,
+ fitem->bl.id));
+
+ map_addblock(&fitem->bl);
+ clif_dropflooritem(fitem);
return fitem->bl.id;
}
-int map_addflooritem (struct item *item_data, int amount, int m, int x, int y,
- struct map_session_data *first_sd,
- struct map_session_data *second_sd,
- struct map_session_data *third_sd, int type)
+int map_addflooritem(struct item *item_data, int amount,
+ int m, int x, int y,
+ struct map_session_data *first_sd,
+ struct map_session_data *second_sd,
+ struct map_session_data *third_sd)
{
struct map_session_data *owners[3] = { first_sd, second_sd, third_sd };
- int owner_protection[3];
+ interval_t owner_protection[3];
- if (type)
- {
- owner_protection[0] = battle_config.mvp_item_first_get_time;
- owner_protection[1] =
- owner_protection[0] + battle_config.mvp_item_second_get_time;
- owner_protection[2] =
- owner_protection[1] + battle_config.mvp_item_third_get_time;
- }
- else
{
- owner_protection[0] = battle_config.item_first_get_time;
- owner_protection[1] =
- owner_protection[0] + battle_config.item_second_get_time;
- owner_protection[2] =
- owner_protection[1] + battle_config.item_third_get_time;
+ owner_protection[0] = static_cast<interval_t>(battle_config.item_first_get_time);
+ owner_protection[1] = owner_protection[0] + static_cast<interval_t>(battle_config.item_second_get_time);
+ owner_protection[2] = owner_protection[1] + static_cast<interval_t>(battle_config.item_third_get_time);
}
- return map_addflooritem_any (item_data, amount, m, x, y,
- owners, owner_protection,
- battle_config.flooritem_lifetime, 1);
+ return map_addflooritem_any(item_data, amount, m, x, y,
+ owners, owner_protection,
+ static_cast<interval_t>(battle_config.flooritem_lifetime), 1);
}
-/* int xy,r; */
-/* unsigned int tick; */
-/* struct flooritem_data *fitem=NULL; */
-
-/* nullpo_retr(0, item_data); */
-
-/* if((xy=map_searchrandfreecell(m,x,y,1))<0) */
-/* return 0; */
-/* r=rand(); */
-
-/* fitem = (struct flooritem_data *)aCalloc(1,sizeof(*fitem)); */
-/* fitem->bl.type=BL_ITEM; */
-/* fitem->bl.prev = fitem->bl.next = NULL; */
-/* fitem->bl.m=m; */
-/* fitem->bl.x=xy&0xffff; */
-/* fitem->bl.y=(xy>>16)&0xffff; */
-/* fitem->first_get_id = 0; */
-/* fitem->first_get_tick = 0; */
-/* fitem->second_get_id = 0; */
-/* fitem->second_get_tick = 0; */
-/* fitem->third_get_id = 0; */
-/* fitem->third_get_tick = 0; */
-
-/* fitem->bl.id = map_addobject(&fitem->bl); */
-/* if(fitem->bl.id==0){ */
-/* free(fitem); */
-/* return 0; */
-/* } */
-
-/* tick = gettick(); */
-/* if(first_sd) { */
-/* fitem->first_get_id = first_sd->bl.id; */
-/* if(type) */
-/* fitem->first_get_tick = tick + battle_config.mvp_item_first_get_time; */
-/* else */
-/* fitem->first_get_tick = tick + battle_config.item_first_get_time; */
-/* } */
-/* if(second_sd) { */
-/* fitem->second_get_id = second_sd->bl.id; */
-/* if(type) */
-/* fitem->second_get_tick = tick + battle_config.mvp_item_first_get_time + battle_config.mvp_item_second_get_time; */
-/* else */
-/* fitem->second_get_tick = tick + battle_config.item_first_get_time + battle_config.item_second_get_time; */
-/* } */
-/* if(third_sd) { */
-/* fitem->third_get_id = third_sd->bl.id; */
-/* if(type) */
-/* fitem->third_get_tick = tick + battle_config.mvp_item_first_get_time + battle_config.mvp_item_second_get_time + battle_config.mvp_item_third_get_time; */
-/* else */
-/* fitem->third_get_tick = tick + battle_config.item_first_get_time + battle_config.item_second_get_time + battle_config.item_third_get_time; */
-/* } */
-
-/* memcpy(&fitem->item_data,item_data,sizeof(*item_data)); */
-/* fitem->item_data.amount=amount; */
-/* fitem->subx=(r&3)*3+3; */
-/* fitem->suby=((r>>2)&3)*3+3; */
-/* fitem->cleartimer=add_timer(gettick()+battle_config.flooritem_lifetime,map_clearflooritem_timer,fitem->bl.id,0); */
-
-/* map_addblock(&fitem->bl); */
-/* clif_dropflooritem(fitem); */
-
-/* return fitem->bl.id; */
-/* } */
-
/*==========================================
* charid_dbへ追加(返信待ちがあれば返信)
*------------------------------------------
*/
-void map_addchariddb (int charid, const char *name)
+void map_addchariddb(int charid, const char *name)
{
- struct charid2nick *p = (struct charid2nick *)numdb_search (charid_db, charid);
+ struct charid2nick *p = charid_db.search(charid);
if (p == NULL)
- { // データベースにない
- CREATE (p, struct charid2nick, 1);
- p->req_id = 0;
- }
- else
- numdb_erase (charid_db, charid);
+ p = charid_db.init(charid);
- int req = p->req_id;
- memcpy (p->nick, name, 24);
+ memcpy(p->nick, name, 24);
p->req_id = 0;
- numdb_insert (charid_db, charid, p);
- if (req)
- { // 返信待ちがあれば返信
- struct map_session_data *sd = map_id2sd (req);
- if (sd != NULL)
- clif_solved_charname (sd, charid);
- }
-}
-
-/*==========================================
- * charid_dbへ追加(返信要求のみ)
- *------------------------------------------
- */
-int map_reqchariddb (struct map_session_data *sd, int charid)
-{
- nullpo_retr (0, sd);
-
- struct charid2nick *p = (struct charid2nick *)numdb_search (charid_db, charid);
- if (p != NULL) // データベースにすでにある
- return 0;
- CREATE (p, struct charid2nick, 1);
- p->req_id = sd->bl.id;
- numdb_insert (charid_db, charid, p);
- return 0;
}
/*==========================================
* id_dbへblを追加
*------------------------------------------
*/
-void map_addiddb (struct block_list *bl)
+void map_addiddb(struct block_list *bl)
{
- nullpo_retv (bl);
+ nullpo_retv(bl);
- numdb_insert (id_db, bl->id, bl);
+ id_db.put(bl->id, bl);
}
/*==========================================
* id_dbからblを削除
*------------------------------------------
*/
-void map_deliddb (struct block_list *bl)
+void map_deliddb(struct block_list *bl)
{
- nullpo_retv (bl);
+ nullpo_retv(bl);
- numdb_erase (id_db, bl->id);
+ id_db.put(bl->id, nullptr);
}
/*==========================================
* nick_dbへsdを追加
*------------------------------------------
*/
-void map_addnickdb (struct map_session_data *sd)
+void map_addnickdb(struct map_session_data *sd)
{
- nullpo_retv (sd);
+ nullpo_retv(sd);
- strdb_insert (nick_db, sd->status.name, sd);
+ nick_db.put(sd->status.name, sd);
}
/*==========================================
@@ -1098,79 +935,62 @@ void map_addnickdb (struct map_session_data *sd)
* quit処理の主体が違うような気もしてきた
*------------------------------------------
*/
-int map_quit (struct map_session_data *sd)
+void map_quit(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_retv(sd);
if (sd->chatID) // チャットから出る
- chat_leavechat (sd);
+ chat_leavechat(sd);
if (sd->trade_partner) // 取引を中断する
- trade_tradecancel (sd);
+ trade_tradecancel(sd);
if (sd->party_invite > 0) // パーティ勧誘を拒否する
- party_reply_invite (sd, sd->party_invite_account, 0);
-
- if (sd->guild_invite > 0) // ギルド勧誘を拒否する
- guild_reply_invite (sd, sd->guild_invite, 0);
- if (sd->guild_alliance > 0) // ギルド同盟勧誘を拒否する
- guild_reply_reqalliance (sd, sd->guild_alliance_account, 0);
+ party_reply_invite(sd, sd->party_invite_account, 0);
- party_send_logout (sd); // パーティのログアウトメッセージ送信
+ party_send_logout(sd); // パーティのログアウトメッセージ送信
- guild_send_memberinfoshort (sd, 0); // ギルドのログアウトメッセージ送信
+ pc_cleareventtimer(sd); // イベントタイマを破棄する
- pc_cleareventtimer (sd); // イベントタイマを破棄する
+ skill_castcancel(&sd->bl, 0); // 詠唱を中断する
+ skill_stop_dancing(&sd->bl, 1); // ダンス/演奏中断
- skill_castcancel (&sd->bl, 0); // 詠唱を中断する
- skill_stop_dancing (&sd->bl, 1); // ダンス/演奏中断
+ skill_status_change_clear(&sd->bl, 1); // ステータス異常を解除する
+ pc_stop_walking(sd, 0);
+ pc_stopattack(sd);
+ pc_delinvincibletimer(sd);
+ skill_gangsterparadise(sd, 0);
- if (sd->sc_data && sd->sc_data[SC_BERSERK].timer != -1) //バーサーク中の終了はHPを100に
- sd->status.hp = 100;
+ pc_calcstatus(sd, 4);
- skill_status_change_clear (&sd->bl, 1); // ステータス異常を解除する
- skill_clear_unitgroup (&sd->bl); // スキルユニットグループの削除
- skill_cleartimerskill (&sd->bl);
- pc_stop_walking (sd, 0);
- pc_stopattack (sd);
- pc_delinvincibletimer (sd);
- pc_delspiritball (sd, sd->spiritball, 1);
- skill_gangsterparadise (sd, 0);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::QUIT);
- pc_calcstatus (sd, 4);
-
- clif_clearchar_area (&sd->bl, 2);
-
- if (pc_isdead (sd))
- pc_setrestartvalue (sd, 2);
- pc_makesavestatus (sd);
+ if (pc_isdead(sd))
+ pc_setrestartvalue(sd, 2);
+ pc_makesavestatus(sd);
//クローンスキルで覚えたスキルは消す
//The storage closing routines will save the char if needed. [Skotlex]
- if (!sd->state.storage_flag)
- chrif_save (sd);
- else if (sd->state.storage_flag == 1)
- storage_storage_quit (sd);
- else if (sd->state.storage_flag == 2)
- storage_guild_storage_quit (sd, 1);
+ if (!sd->state.storage_open)
+ chrif_save(sd);
+ else if (sd->state.storage_open)
+ storage_storage_quit(sd);
if (sd->npc_stackbuf && sd->npc_stackbuf != NULL)
- free (sd->npc_stackbuf);
-
- map_delblock (&sd->bl);
+ free(sd->npc_stackbuf);
- numdb_erase (id_db, sd->bl.id);
- strdb_erase (nick_db, sd->status.name);
- numdb_erase (charid_db, sd->status.char_id);
+ map_delblock(&sd->bl);
- return 0;
+ id_db.put(sd->bl.id, nullptr);
+ nick_db.put(sd->status.name, nullptr);
+ charid_db.erase(sd->status.char_id);
}
/*==========================================
* id番号のPCを探す。居なければNULL
*------------------------------------------
*/
-struct map_session_data *map_id2sd (int id)
+struct map_session_data *map_id2sd(int id)
{
// remove search from db, because:
// 1 - all players, npc, items and mob are in this db (to search, it's not speed, and search in session is more sure)
@@ -1179,14 +999,14 @@ struct map_session_data *map_id2sd (int id)
// replaced by searching in all session.
// by searching in session, we are sure that fd, session, and account exist.
/*
- struct block_list *bl;
+ struct block_list *bl;
- bl=numdb_search(id_db,id);
- if(bl && bl->type==BL_PC)
- return (struct map_session_data*)bl;
- return NULL;
+ bl=numdb_search(id_db,id);
+ if (bl && bl->type==BL::PC)
+ return (struct map_session_data*)bl;
+ return NULL;
*/
- int i;
+ int i;
struct map_session_data *sd = NULL;
for (i = 0; i < fd_max; i++)
@@ -1200,9 +1020,9 @@ struct map_session_data *map_id2sd (int id)
* char_id番号の名前を探す
*------------------------------------------
*/
-char *map_charid2nick (int id)
+char *map_charid2nick(int id)
{
- struct charid2nick *p = (struct charid2nick *)numdb_search (charid_db, id);
+ struct charid2nick *p = charid_db.search(id);
if (p == NULL)
return NULL;
@@ -1214,7 +1034,8 @@ char *map_charid2nick (int id)
/*========================================*/
/* [Fate] Operations to iterate over active map sessions */
-static struct map_session_data *map_get_session (int i)
+static
+struct map_session_data *map_get_session(int i)
{
struct map_session_data *d;
@@ -1225,12 +1046,13 @@ static struct map_session_data *map_get_session (int i)
return NULL;
}
-static struct map_session_data *map_get_session_forward (int start)
+static
+struct map_session_data *map_get_session_forward(int start)
{
- int i;
+ int i;
for (i = start; i < fd_max; i++)
{
- struct map_session_data *d = map_get_session (i);
+ struct map_session_data *d = map_get_session(i);
if (d)
return d;
}
@@ -1238,12 +1060,13 @@ static struct map_session_data *map_get_session_forward (int start)
return NULL;
}
-static struct map_session_data *map_get_session_backward (int start)
+static
+struct map_session_data *map_get_session_backward(int start)
{
- int i;
+ int i;
for (i = start; i >= 0; i--)
{
- struct map_session_data *d = map_get_session (i);
+ struct map_session_data *d = map_get_session(i);
if (d)
return d;
}
@@ -1251,24 +1074,24 @@ static struct map_session_data *map_get_session_backward (int start)
return NULL;
}
-struct map_session_data *map_get_first_session (void)
+struct map_session_data *map_get_first_session(void)
{
- return map_get_session_forward (0);
+ return map_get_session_forward(0);
}
-struct map_session_data *map_get_next_session (struct map_session_data *d)
+struct map_session_data *map_get_next_session(struct map_session_data *d)
{
- return map_get_session_forward (d->fd + 1);
+ return map_get_session_forward(d->fd + 1);
}
-struct map_session_data *map_get_last_session (void)
+struct map_session_data *map_get_last_session(void)
{
- return map_get_session_backward (fd_max);
+ return map_get_session_backward(fd_max);
}
-struct map_session_data *map_get_prev_session (struct map_session_data *d)
+struct map_session_data *map_get_prev_session(struct map_session_data *d)
{
- return map_get_session_backward (d->fd - 1);
+ return map_get_session_backward(d->fd - 1);
}
/*==========================================
@@ -1277,16 +1100,16 @@ struct map_session_data *map_get_prev_session (struct map_session_data *d)
* return map_session_data pointer or NULL
*------------------------------------------
*/
-struct map_session_data *map_nick2sd (const char *nick)
+struct map_session_data *map_nick2sd(const char *nick)
{
- int i, quantity = 0, nicklen;
+ int i, quantity = 0, nicklen;
struct map_session_data *sd = NULL;
struct map_session_data *pl_sd = NULL;
if (nick == NULL)
return NULL;
- nicklen = strlen (nick);
+ nicklen = strlen(nick);
for (i = 0; i < fd_max; i++)
{
@@ -1294,10 +1117,10 @@ struct map_session_data *map_nick2sd (const char *nick)
&& pl_sd->state.auth)
{
// Without case sensitive check (increase the number of similar character names found)
- if (strncasecmp (pl_sd->status.name, nick, nicklen) == 0)
+ if (strncasecmp(pl_sd->status.name, nick, nicklen) == 0)
{
// Strict comparison (if found, we finish the function immediatly with correct value)
- if (strcmp (pl_sd->status.name, nick) == 0)
+ if (strcmp(pl_sd->status.name, nick) == 0)
return pl_sd;
quantity++;
sd = pl_sd;
@@ -1318,38 +1141,24 @@ struct map_session_data *map_nick2sd (const char *nick)
* 一時objectの場合は配列を引くのみ
*------------------------------------------
*/
-struct block_list *map_id2bl (int id)
+struct block_list *map_id2bl(int id)
{
struct block_list *bl = NULL;
- if (id < sizeof (object) / sizeof (object[0]))
+ if (id < sizeof(object) / sizeof(object[0]))
bl = object[id];
else
- bl = (struct block_list *)numdb_search (id_db, id);
+ bl = id_db.get(id);
return bl;
}
/*==========================================
- * id_db内の全てにfuncを実行
- *------------------------------------------
- */
-int map_foreachiddb (db_func_t func, ...)
-{
- va_list ap = NULL;
-
- va_start (ap, func);
- numdb_foreach (id_db, func, ap);
- va_end (ap);
- return 0;
-}
-
-/*==========================================
* map.npcへ追加 (warp等の領域持ちのみ)
*------------------------------------------
*/
-int map_addnpc (int m, struct npc_data *nd)
+int map_addnpc(int m, struct npc_data *nd)
{
- int i;
+ int i;
if (m < 0 || m >= map_num)
return -1;
for (i = 0; i < map[m].npc_num && i < MAX_NPC_PER_MAP; i++)
@@ -1358,7 +1167,7 @@ int map_addnpc (int m, struct npc_data *nd)
if (i == MAX_NPC_PER_MAP)
{
if (battle_config.error_log)
- printf ("too many NPCs in one map %s\n", map[m].name);
+ PRINTF("too many NPCs in one map %s\n", map[m].name);
return -1;
}
if (i == map[m].npc_num)
@@ -1366,19 +1175,19 @@ int map_addnpc (int m, struct npc_data *nd)
map[m].npc_num++;
}
- nullpo_retr (0, nd);
+ nullpo_ret(nd);
map[m].npc[i] = nd;
nd->n = i;
- numdb_insert (id_db, nd->bl.id, nd);
+ id_db.put(nd->bl.id, (struct block_list *)nd);
return i;
}
static
-void map_removenpc (void)
+void map_removenpc(void)
{
- int i, m, n = 0;
+ int i, m, n = 0;
for (m = 0; m < map_num; m++)
{
@@ -1386,30 +1195,30 @@ void map_removenpc (void)
{
if (map[m].npc[i] != NULL)
{
- clif_clearchar_area (&map[m].npc[i]->bl, 2);
- map_delblock (&map[m].npc[i]->bl);
- numdb_erase (id_db, map[m].npc[i]->bl.id);
- if (map[m].npc[i]->bl.subtype == SCRIPT)
+ clif_clearchar(&map[m].npc[i]->bl, BeingRemoveWhy::QUIT);
+ map_delblock(&map[m].npc[i]->bl);
+ id_db.put(map[m].npc[i]->bl.id, nullptr);
+ if (map[m].npc[i]->bl.subtype == NpcSubtype::SCRIPT)
{
// free(map[m].npc[i]->u.scr.script);
// free(map[m].npc[i]->u.scr.label_list);
}
- free (map[m].npc[i]);
+ free(map[m].npc[i]);
map[m].npc[i] = NULL;
n++;
}
}
}
- printf ("%d NPCs removed.\n", n);
+ PRINTF("%d NPCs removed.\n", n);
}
/*==========================================
* map名からmap番号へ変換
*------------------------------------------
*/
-int map_mapname2mapid (const char *name)
+int map_mapname2mapid(const char *name)
{
- struct map_data *md = (struct map_data *)strdb_search (map_db, name);
+ struct map_data *md = map_db.get(name);
if (md == NULL || md->gat == NULL)
return -1;
return md->m;
@@ -1419,9 +1228,9 @@ int map_mapname2mapid (const char *name)
* 他鯖map名からip,port変換
*------------------------------------------
*/
-int map_mapname2ipport (const char *name, struct in_addr *ip, int *port)
+int map_mapname2ipport(const char *name, struct in_addr *ip, int *port)
{
- struct map_data_other_server *mdos = (struct map_data_other_server *)strdb_search (map_db, name);
+ struct map_data_other_server *mdos = (struct map_data_other_server *)map_db.get(name);
if (mdos == NULL || mdos->gat)
return -1;
*ip = mdos->ip;
@@ -1429,100 +1238,73 @@ int map_mapname2ipport (const char *name, struct in_addr *ip, int *port)
return 0;
}
-/*==========================================
- *
- *------------------------------------------
- */
-int map_check_dir (int s_dir, int t_dir)
+/// Check compatibility of directions.
+/// Directions are compatible if they are at most 45° apart.
+///
+/// @return false if compatible, true if incompatible.
+bool map_check_dir(const DIR s_dir, const DIR t_dir)
{
if (s_dir == t_dir)
- return 0;
- switch (s_dir)
- {
- case 0:
- if (t_dir == 7 || t_dir == 1 || t_dir == 0)
- return 0;
- break;
- case 1:
- if (t_dir == 0 || t_dir == 2 || t_dir == 1)
- return 0;
- break;
- case 2:
- if (t_dir == 1 || t_dir == 3 || t_dir == 2)
- return 0;
- break;
- case 3:
- if (t_dir == 2 || t_dir == 4 || t_dir == 3)
- return 0;
- break;
- case 4:
- if (t_dir == 3 || t_dir == 5 || t_dir == 4)
- return 0;
- break;
- case 5:
- if (t_dir == 4 || t_dir == 6 || t_dir == 5)
- return 0;
- break;
- case 6:
- if (t_dir == 5 || t_dir == 7 || t_dir == 6)
- return 0;
- break;
- case 7:
- if (t_dir == 6 || t_dir == 0 || t_dir == 7)
- return 0;
- break;
- }
- return 1;
+ return false;
+
+ const uint8_t sdir = static_cast<uint8_t>(s_dir);
+ const uint8_t tdir = static_cast<uint8_t>(t_dir);
+ if ((sdir + 1) % 8 == tdir)
+ return false;
+ if (sdir == (tdir + 1) % 8)
+ return false;
+
+ return true;
}
/*==========================================
* 彼我の方向を計算
*------------------------------------------
*/
-int map_calc_dir (struct block_list *src, int x, int y)
+DIR map_calc_dir(struct block_list *src, int x, int y)
{
- int dir = 0;
- int dx, dy;
+ DIR dir = DIR::S;
+ int dx, dy;
- nullpo_retr (0, src);
+ nullpo_retr(DIR::S, src);
dx = x - src->x;
dy = y - src->y;
if (dx == 0 && dy == 0)
- { // 彼我の場所一致
- dir = 0; // 上
+ {
+ dir = DIR::S;
}
else if (dx >= 0 && dy >= 0)
- { // 方向的に右上
- dir = 7; // 右上
+ {
+ dir = DIR::SE;
if (dx * 3 - 1 < dy)
- dir = 0; // 上
+ dir = DIR::S;
if (dx > dy * 3)
- dir = 6; // 右
+ dir = DIR::E;
}
else if (dx >= 0 && dy <= 0)
- { // 方向的に右下
- dir = 5; // 右下
+ {
+ dir = DIR::NE;
if (dx * 3 - 1 < -dy)
- dir = 4; // 下
+ dir = DIR::N;
if (dx > -dy * 3)
- dir = 6; // 右
+ dir = DIR::E;
}
else if (dx <= 0 && dy <= 0)
- { // 方向的に左下
- dir = 3; // 左下
+ {
+ dir = DIR::NW;
if (dx * 3 + 1 > dy)
- dir = 4; // 下
+ dir = DIR::N;
if (dx < dy * 3)
- dir = 2; // 左
+ dir = DIR::W;
}
else
- { // 方向的に左上
- dir = 1; // 左上
+ {
+ dir = DIR::SW;
if (-dx * 3 - 1 < dy)
- dir = 0; // 上
+ dir = DIR::S;
if (-dx > dy * 3)
- dir = 2; // 左
+ dir = DIR::W;
}
return dir;
}
@@ -1532,10 +1314,10 @@ int map_calc_dir (struct block_list *src, int x, int y)
* (m,x,y)の状態を調べる
*------------------------------------------
*/
-int map_getcell (int m, int x, int y)
+MapCell map_getcell(int m, int x, int y)
{
if (x < 0 || x >= map[m].xs - 1 || y < 0 || y >= map[m].ys - 1)
- return 1;
+ return MapCell::UNWALKABLE;
return map[m].gat[x + y * map[m].xs];
}
@@ -1543,44 +1325,47 @@ int map_getcell (int m, int x, int y)
* (m,x,y)の状態をtにする
*------------------------------------------
*/
-int map_setcell (int m, int x, int y, int t)
+void map_setcell(int m, int x, int y, MapCell t)
{
if (x < 0 || x >= map[m].xs || y < 0 || y >= map[m].ys)
- return t;
- return map[m].gat[x + y * map[m].xs] = t;
+ return;
+ map[m].gat[x + y * map[m].xs] = t;
}
/*==========================================
* 他鯖管理のマップをdbに追加
*------------------------------------------
*/
-int map_setipport (const char *name, struct in_addr ip, int port)
+int map_setipport(const char *name, struct in_addr ip, int port)
{
- struct map_data_other_server *mdos = NULL;
-
- struct map_data *md = (struct map_data *)strdb_search (map_db, name);
+ struct map_data *md = map_db.get(name);
if (md == NULL)
- { // not exist -> add new data
- CREATE (mdos, struct map_data_other_server, 1);
- memcpy (mdos->name, name, 24);
+ {
+ struct map_data_other_server *mdos = NULL;
+ // not exist -> add new data
+ CREATE(mdos, struct map_data_other_server, 1);
+ memcpy(mdos->name, name, 24);
mdos->gat = NULL;
mdos->ip = ip;
mdos->port = port;
- strdb_insert (map_db, mdos->name, mdos);
+ map_db.put(mdos->name, (struct map_data *)mdos);
}
else
{
if (md->gat)
- { // local -> check data
- if (ip.s_addr != clif_getip ().s_addr || port != clif_getport ())
+ {
+ // local -> check data
+ if (ip.s_addr != clif_getip().s_addr || port != clif_getport())
{
- printf ("from char server : %s -> %s:%d\n", name, ip2str(ip),
+ PRINTF("from char server : %s -> %s:%d\n", name, ip2str(ip),
port);
return 1;
}
}
else
- { // update
+ {
+ // update
+ struct map_data_other_server *mdos = NULL;
mdos = (struct map_data_other_server *) md;
mdos->ip = ip;
mdos->port = port;
@@ -1589,139 +1374,54 @@ int map_setipport (const char *name, struct in_addr ip, int port)
return 0;
}
-// 初期化周り
-/*==========================================
- * 水場高さ設定
- *------------------------------------------
- */
-static struct Waterlist
-{
- char mapname[24];
- int waterheight;
-} *waterlist = NULL;
-
-#define NO_WATER 1000000
-
-static int map_waterheight (char *mapname)
-{
- if (waterlist)
- {
- int i;
- for (i = 0; waterlist[i].mapname[0] && i < MAX_MAP_PER_SERVER; i++)
- if (strcmp (waterlist[i].mapname, mapname) == 0)
- return waterlist[i].waterheight;
- }
- return NO_WATER;
-}
-
-static void map_readwater (char *watertxt)
-{
- char line[1024], w1[1024];
- FILE *fp = NULL;
- int n = 0;
-
- fp = fopen_ (watertxt, "r");
- if (fp == NULL)
- {
- printf ("file not found: %s\n", watertxt);
- return;
- }
- if (waterlist == NULL)
- {
- CREATE (waterlist, struct Waterlist, MAX_MAP_PER_SERVER);
- }
- while (fgets (line, 1020, fp) && n < MAX_MAP_PER_SERVER)
- {
- int wh, count;
- if (line[0] == '/' && line[1] == '/')
- continue;
- if ((count = sscanf (line, "%s%d", w1, &wh)) < 1)
- {
- continue;
- }
- strcpy (waterlist[n].mapname, w1);
- if (count >= 2)
- waterlist[n].waterheight = wh;
- else
- waterlist[n].waterheight = 3;
- n++;
- }
- fclose_ (fp);
-}
-
/*==========================================
* マップ1枚読み込み
*------------------------------------------
*/
-static int map_readmap (int m, char *fn, char *alias)
+static
+bool map_readmap(int m, const_string fn)
{
- int s;
- int x, y, xs, ys;
- struct gat_1cell
- {
- char type;
- } *p;
- int wh;
- size_t size;
-
// read & convert fn
- uint8_t *gat = (uint8_t *)grfio_read (fn);
- if (gat == NULL)
- return -1;
-
- printf ("\rLoading Maps [%d/%d]: %-50s ", m, map_num, fn);
- fflush (stdout);
+ std::vector<uint8_t> gat_v = grfio_reads(fn);
+ if (gat_v.empty())
+ return false;
+ size_t s = gat_v.size() - 4;
map[m].m = m;
- xs = map[m].xs = *(short *) (gat);
- ys = map[m].ys = *(short *) (gat + 2);
- printf ("\n%i %i\n", xs, ys);
- map[m].gat = (uint8_t *)calloc (s = map[m].xs * map[m].ys, 1);
+ int xs = map[m].xs = gat_v[0] | gat_v[1] << 8;
+ int ys = map[m].ys = gat_v[2] | gat_v[3] << 8;
+ PRINTF("\rLoading Maps [%d/%d]: %-30s (%i, %i)",
+ m, map_num, std::string(fn.begin(), fn.end()), xs, ys);
+ fflush(stdout);
+
+ assert (s == xs * ys);
+ map[m].gat = make_unique<MapCell[]>(s);
if (map[m].gat == NULL)
{
- printf ("out of memory : map_readmap gat\n");
- exit (1);
+ PRINTF("out of memory : map_readmap gat\n");
+ exit(1);
}
map[m].npc_num = 0;
map[m].users = 0;
- memset (&map[m].flag, 0, sizeof (map[m].flag));
+ memset(&map[m].flag, 0, sizeof(map[m].flag));
if (battle_config.pk_mode)
map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris]
- wh = map_waterheight (map[m].name);
- for (y = 0; y < ys; y++)
- {
- p = (struct gat_1cell *) (gat + y * xs + 4);
- for (x = 0; x < xs; x++)
- {
- /*if(wh!=NO_WATER && p->type==0){
- * // 水場判定
- * map[m].gat[x+y*xs]=(p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0;
- * } else { */
- map[m].gat[x + y * xs] = p->type;
- //}
- p++;
- }
- }
- free (gat);
+ MapCell *gat_m = reinterpret_cast<MapCell *>(&gat_v[4]);
+ std::copy(gat_m, gat_m + s, &map[m].gat[0]);
map[m].bxs = (xs + BLOCK_SIZE - 1) / BLOCK_SIZE;
map[m].bys = (ys + BLOCK_SIZE - 1) / BLOCK_SIZE;
- size = map[m].bxs * map[m].bys;
-
- CREATE (map[m].block, struct block_list *, size);
-
- CREATE (map[m].block_mob, struct block_list *, size);
-
- CREATE (map[m].block_count, int, size);
-
- CREATE (map[m].block_mob_count, int, size);
+ size_t size = map[m].bxs * map[m].bys;
- strdb_insert (map_db, map[m].name, &map[m]);
+ CREATE(map[m].block, struct block_list *, size);
+ CREATE(map[m].block_mob, struct block_list *, size);
+ CREATE(map[m].block_count, int, size);
+ CREATE(map[m].block_mob_count, int, size);
-// printf("%s read done\n",fn);
+ map_db.put(map[m].name, &map[m]);
- return 0;
+ return true;
}
/*==========================================
@@ -1729,57 +1429,26 @@ static int map_readmap (int m, char *fn, char *alias)
*------------------------------------------
*/
static
-int map_readallmap (void)
+int map_readallmap(void)
{
- int i, maps_removed = 0;
- char fn[256] = "";
+ int i, maps_removed = 0;
- // 先に全部のャbプの存在を確認
- for (i = 0; i < map_num; i++)
- {
- if (strstr (map[i].name, ".gat") == NULL)
- continue;
- sprintf (fn, "data\\%s", map[i].name);
- // TODO - remove this, it is the last call to grfio_size, which is deprecated
- if (!grfio_size (fn))
- {
- map_delmap (map[i].name);
- maps_removed++;
- }
- }
for (i = 0; i < map_num; i++)
{
- if (strstr (map[i].name, ".gat") != NULL)
+ assert (strstr(map[i].name, ".gat") != NULL);
{
- char *p = strstr (map[i].name, ">"); // [MouseJstr]
- if (p != NULL)
{
- char alias[64];
- *p = '\0';
- strcpy (alias, map[i].name);
- strcpy (map[i].name, p + 1);
- sprintf (fn, "data\\%s", map[i].name);
- if (map_readmap (i, fn, alias) == -1)
+ if (!map_readmap(i, map[i].name))
{
- map_delmap (map[i].name);
- maps_removed++;
- }
- }
- else
- {
- sprintf (fn, "data\\%s", map[i].name);
- if (map_readmap (i, fn, NULL) == -1)
- {
- map_delmap (map[i].name);
+ map_delmap(map[i].name);
maps_removed++;
}
}
}
}
- free (waterlist);
- printf ("\rMaps Loaded: %d %60s\n", map_num, "");
- printf ("\rMaps Removed: %d \n", maps_removed);
+ PRINTF("\rMaps Loaded: %d %60s\n", map_num, "");
+ PRINTF("\rMaps Removed: %d \n", maps_removed);
return 0;
}
@@ -1788,9 +1457,9 @@ int map_readallmap (void)
*------------------------------------------
*/
static
-int map_addmap (char *mapname)
+int map_addmap(const char *mapname)
{
- if (strcasecmp (mapname, "clear") == 0)
+ if (strcasecmp(mapname, "clear") == 0)
{
map_num = 0;
return 0;
@@ -1798,10 +1467,10 @@ int map_addmap (char *mapname)
if (map_num >= MAX_MAP_PER_SERVER - 1)
{
- printf ("too many map\n");
+ PRINTF("too many map\n");
return 1;
}
- memcpy (map[map_num].name, mapname, 24);
+ memcpy(map[map_num].name, mapname, 24);
map_num++;
return 0;
}
@@ -1810,11 +1479,12 @@ int map_addmap (char *mapname)
* 読み込むmapを削除する
*------------------------------------------
*/
-int map_delmap (char *mapname)
+static
+int map_delmap(const char *mapname)
{
- int i;
+ int i;
- if (strcasecmp (mapname, "all") == 0)
+ if (strcasecmp(mapname, "all") == 0)
{
map_num = 0;
return 0;
@@ -1822,84 +1492,94 @@ int map_delmap (char *mapname)
for (i = 0; i < map_num; i++)
{
- if (strcmp (map[i].name, mapname) == 0)
+ if (strcmp(map[i].name, mapname) == 0)
{
- printf ("Removing map [ %s ] from maplist\n", map[i].name);
- memmove (map + i, map + i + 1,
- sizeof (map[0]) * (map_num - i - 1));
+ PRINTF("Removing map [ %s ] from maplist\n", map[i].name);
+ memmove(map + i, map + i + 1,
+ sizeof(map[0]) * (map_num - i - 1));
map_num--;
}
}
return 0;
}
-extern char *gm_logfile_name;
-
-#define LOGFILE_SECONDS_PER_CHUNK_SHIFT 10
+constexpr int LOGFILE_SECONDS_PER_CHUNK_SHIFT = 10;
+static
FILE *map_logfile = NULL;
+static
char *map_logfile_name = NULL;
-static long map_logfile_index;
+static
+long map_logfile_index;
-static void map_close_logfile (void)
+static
+void map_close_logfile(void)
{
if (map_logfile)
{
- char *filenameop_buf = (char*)malloc (strlen (map_logfile_name) + 50);
- sprintf (filenameop_buf, "gzip -f %s.%ld &", map_logfile_name,
- map_logfile_index);
-
- fclose (map_logfile);
+ std::string filename = STRPRINTF("%s.%ld", map_logfile_name, map_logfile_index);
+ const char *args[] =
+ {
+ "gzip",
+ "-f",
+ filename.c_str(),
+ NULL
+ };
+ char **argv = const_cast<char **>(args);
- if (!system (filenameop_buf))
- perror (filenameop_buf);
+ fclose(map_logfile);
- free (filenameop_buf);
+ if (!fork())
+ {
+ execvp("gzip", argv);
+ _exit(1);
+ }
+ wait(NULL);
}
}
-static void map_start_logfile (long suffix)
+static
+void map_start_logfile(long index)
{
- char *filename_buf = (char*)malloc (strlen (map_logfile_name) + 50);
- map_logfile_index = suffix >> LOGFILE_SECONDS_PER_CHUNK_SHIFT;
+ map_logfile_index = index;
- sprintf (filename_buf, "%s.%ld", map_logfile_name, map_logfile_index);
- map_logfile = fopen (filename_buf, "w+");
+ std::string filename_buf = STRPRINTF(
+ "%s.%ld",
+ map_logfile_name,
+ map_logfile_index);
+ map_logfile = fopen(filename_buf.c_str(), "w+");
if (!map_logfile)
- perror (map_logfile_name);
-
- free (filename_buf);
+ perror(map_logfile_name);
}
-static void map_set_logfile (const char *filename)
+static
+void map_set_logfile(const char *filename)
{
struct timeval tv;
- map_logfile_name = strdup (filename);
- gettimeofday (&tv, NULL);
+ map_logfile_name = strdup(filename);
+ gettimeofday(&tv, NULL);
- map_start_logfile (tv.tv_sec);
+ map_start_logfile(tv.tv_sec);
- MAP_LOG ("log-start v3");
+ MAP_LOG("log-start v4");
}
-void map_write_log (const char *format, ...)
+void map_log(const_string line)
{
- struct timeval tv;
- va_list args;
- va_start (args, format);
+ if (!map_logfile)
+ return;
- gettimeofday (&tv, NULL);
+ time_t t = TimeT::now();
+ long i = t >> LOGFILE_SECONDS_PER_CHUNK_SHIFT;
- if ((tv.tv_sec >> LOGFILE_SECONDS_PER_CHUNK_SHIFT) != map_logfile_index)
+ if (i != map_logfile_index)
{
- map_close_logfile ();
- map_start_logfile (tv.tv_sec);
+ map_close_logfile();
+ map_start_logfile(i);
}
- fprintf (map_logfile, "%ld.%06ld ", (long) tv.tv_sec, (long) tv.tv_usec);
- vfprintf (map_logfile, format, args);
- fputc ('\n', map_logfile);
+ log_with_timestamp(map_logfile, line);
}
/*==========================================
@@ -1907,216 +1587,198 @@ void map_write_log (const char *format, ...)
*------------------------------------------
*/
static
-int map_config_read (const char *cfgName)
+int map_config_read(const char *cfgName)
{
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
struct hostent *h = NULL;
- fp = fopen_ (cfgName, "r");
- if (fp == NULL)
+ std::ifstream in(cfgName);
+ if (!in.is_open())
{
- printf ("Map configuration file not found at: %s\n", cfgName);
- exit (1);
+ PRINTF("Map configuration file not found at: %s\n", cfgName);
+ exit(1);
}
- while (fgets (line, sizeof (line) - 1, fp))
+
+ std::string line;
+ while (std::getline(in, line))
{
- if (line[0] == '/' && line[1] == '/')
+ std::string w1, w2;
+ if (!split_key_value(line, &w1, &w2))
continue;
- if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2)
+ if (w1 == "userid")
{
- if (strcasecmp (w1, "userid") == 0)
- {
- chrif_setuserid (w2);
- }
- else if (strcasecmp (w1, "passwd") == 0)
- {
- chrif_setpasswd (w2);
- }
- else if (strcasecmp (w1, "char_ip") == 0)
+ chrif_setuserid(w2.c_str());
+ }
+ else if (w1 == "passwd")
+ {
+ chrif_setpasswd(w2.c_str());
+ }
+ else if (w1 == "char_ip")
+ {
+ h = gethostbyname(w2.c_str());
+ if (h != NULL)
{
- h = gethostbyname (w2);
- if (h != NULL)
- {
- printf
- ("Character server IP address : %s -> %d.%d.%d.%d\n",
- w2, (unsigned char) h->h_addr[0],
+ PRINTF("Character server IP address : %s -> %d.%d.%d.%d\n",
+ w2, (unsigned char) h->h_addr[0],
+ (unsigned char) h->h_addr[1],
+ (unsigned char) h->h_addr[2],
+ (unsigned char) h->h_addr[3]);
+ SPRINTF(w2, "%d.%d.%d.%d", (unsigned char) h->h_addr[0],
(unsigned char) h->h_addr[1],
(unsigned char) h->h_addr[2],
(unsigned char) h->h_addr[3]);
- sprintf (w2, "%d.%d.%d.%d", (unsigned char) h->h_addr[0],
- (unsigned char) h->h_addr[1],
- (unsigned char) h->h_addr[2],
- (unsigned char) h->h_addr[3]);
- }
- chrif_setip (w2);
- }
- else if (strcasecmp (w1, "char_port") == 0)
- {
- chrif_setport (atoi (w2));
- }
- else if (strcasecmp (w1, "map_ip") == 0)
- {
- h = gethostbyname (w2);
- if (h != NULL)
- {
- printf ("Map server IP address : %s -> %d.%d.%d.%d\n", w2,
- (unsigned char) h->h_addr[0],
- (unsigned char) h->h_addr[1],
- (unsigned char) h->h_addr[2],
- (unsigned char) h->h_addr[3]);
- sprintf (w2, "%d.%d.%d.%d", (unsigned char) h->h_addr[0],
- (unsigned char) h->h_addr[1],
- (unsigned char) h->h_addr[2],
- (unsigned char) h->h_addr[3]);
- }
- clif_setip (w2);
- }
- else if (strcasecmp (w1, "map_port") == 0)
- {
- clif_setport (atoi (w2));
- map_port = (atoi (w2));
- }
- else if (strcasecmp (w1, "water_height") == 0)
- {
- map_readwater (w2);
- }
- else if (strcasecmp (w1, "map") == 0)
- {
- map_addmap (w2);
- }
- else if (strcasecmp (w1, "delmap") == 0)
- {
- map_delmap (w2);
- }
- else if (strcasecmp (w1, "npc") == 0)
- {
- npc_addsrcfile (w2);
- }
- else if (strcasecmp (w1, "delnpc") == 0)
- {
- npc_delsrcfile (w2);
- }
- else if (strcasecmp (w1, "autosave_time") == 0)
- {
- autosave_interval = atoi (w2) * 1000;
- if (autosave_interval <= 0)
- autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
- }
- else if (strcasecmp (w1, "motd_txt") == 0)
- {
- strcpy (motd_txt, w2);
- }
- else if (strcasecmp (w1, "help_txt") == 0)
- {
- strcpy (help_txt, w2);
}
- else if (strcasecmp (w1, "mapreg_txt") == 0)
- {
- strcpy (mapreg_txt, w2);
- }
- else if (strcasecmp (w1, "gm_log") == 0)
- {
- gm_logfile_name = strdup (w2);
- }
- else if (strcasecmp (w1, "log_file") == 0)
- {
- map_set_logfile (w2);
- }
- else if (strcasecmp (w1, "import") == 0)
+ chrif_setip(w2.c_str());
+ }
+ else if (w1 == "char_port")
+ {
+ chrif_setport(atoi(w2.c_str()));
+ }
+ else if (w1 == "map_ip")
+ {
+ h = gethostbyname(w2.c_str());
+ if (h != NULL)
{
- map_config_read (w2);
+ PRINTF("Map server IP address : %s -> %d.%d.%d.%d\n", w2,
+ (unsigned char) h->h_addr[0],
+ (unsigned char) h->h_addr[1],
+ (unsigned char) h->h_addr[2],
+ (unsigned char) h->h_addr[3]);
+ SPRINTF(w2, "%d.%d.%d.%d", (unsigned char) h->h_addr[0],
+ (unsigned char) h->h_addr[1],
+ (unsigned char) h->h_addr[2],
+ (unsigned char) h->h_addr[3]);
}
+ clif_setip(w2.c_str());
+ }
+ else if (w1 == "map_port")
+ {
+ clif_setport(atoi(w2.c_str()));
+ }
+ else if (w1 == "map")
+ {
+ map_addmap(w2.c_str());
+ }
+ else if (w1 == "delmap")
+ {
+ map_delmap(w2.c_str());
+ }
+ else if (w1 == "npc")
+ {
+ npc_addsrcfile(w2.c_str());
+ }
+ else if (w1 == "delnpc")
+ {
+ npc_delsrcfile(w2.c_str());
+ }
+ else if (w1 == "autosave_time")
+ {
+ autosave_interval = std::chrono::seconds(atoi(w2.c_str()));
+ if (autosave_interval <= interval_t::zero())
+ autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
+ }
+ else if (w1 == "motd_txt")
+ {
+ strzcpy(motd_txt, w2.c_str(), sizeof(motd_txt));
+ }
+ else if (w1 == "help_txt")
+ {
+ strzcpy(help_txt, w2.c_str(), sizeof(help_txt));
+ }
+ else if (w1 == "mapreg_txt")
+ {
+ strzcpy(mapreg_txt, w2.c_str(), sizeof(mapreg_txt));
+ }
+ else if (w1 == "gm_log")
+ {
+ gm_logfile_name = strdup(w2.c_str());
+ }
+ else if (w1 == "log_file")
+ {
+ map_set_logfile(w2.c_str());
+ }
+ else if (w1 == "import")
+ {
+ map_config_read(w2.c_str());
}
}
- fclose_ (fp);
return 0;
}
-static int cleanup_sub (struct block_list *bl, va_list ap)
+static
+void cleanup_sub(struct block_list *bl)
{
- nullpo_retr (0, bl);
+ nullpo_retv(bl);
switch (bl->type)
{
- case BL_PC:
- map_delblock (bl); // There is something better...
+ case BL::PC:
+ map_delblock(bl); // There is something better...
break;
- case BL_NPC:
- npc_delete ((struct npc_data *) bl);
+ case BL::NPC:
+ npc_delete((struct npc_data *) bl);
break;
- case BL_MOB:
- mob_delete ((struct mob_data *) bl);
+ case BL::MOB:
+ mob_delete((struct mob_data *) bl);
break;
- case BL_ITEM:
- map_clearflooritem (bl->id);
+ case BL::ITEM:
+ map_clearflooritem(bl->id);
break;
- case BL_SKILL:
- skill_delunit ((struct skill_unit *) bl);
- break;
- case BL_SPELL:
- spell_free_invocation ((struct invocation *) bl);
+ case BL::SPELL:
+ spell_free_invocation((struct invocation *) bl);
break;
}
-
- return 0;
}
/*==========================================
* map鯖終了時処理
*------------------------------------------
*/
-void term_func (void)
+void term_func(void)
{
- map_close_logfile ();
+ map_close_logfile();
- int map_id, i;
+ int map_id, i;
for (map_id = 0; map_id < map_num; map_id++)
{
if (map[map_id].m)
- map_foreachinarea (cleanup_sub, map_id, 0, 0, map[map_id].xs,
- map[map_id].ys, 0, 0);
+ map_foreachinarea(cleanup_sub, map_id,
+ 0, 0, map[map_id].xs, map[map_id].ys,
+ BL::NUL);
}
for (i = 0; i < fd_max; i++)
- delete_session (i);
-
- map_removenpc ();
+ delete_session(i);
- numdb_final (id_db, NULL);
- strdb_final (map_db, NULL);
- strdb_final (nick_db, NULL);
- numdb_final (charid_db, NULL);
+ map_removenpc();
for (i = 0; i <= map_num; i++)
{
- if (map[i].gat)
- free (map[i].gat);
+ map[i].gat = nullptr;
if (map[i].block)
- free (map[i].block);
+ free(map[i].block);
if (map[i].block_mob)
- free (map[i].block_mob);
+ free(map[i].block_mob);
if (map[i].block_count)
- free (map[i].block_count);
+ free(map[i].block_count);
if (map[i].block_mob_count)
- free (map[i].block_mob_count);
+ free(map[i].block_mob_count);
}
- do_final_script ();
- do_final_itemdb ();
- do_final_storage ();
- do_final_guild ();
+ do_final_script();
+ do_final_itemdb();
+ do_final_storage();
}
/// --help was passed
// FIXME this should produce output
-void map_helpscreen (void)
+static __attribute__((noreturn))
+void map_helpscreen(void)
{
- exit (1);
+ exit(1);
}
-int compare_item (struct item *a, struct item *b)
+int compare_item(struct item *a, struct item *b)
{
return ((a->nameid == b->nameid) &&
(a->identify == b->identify) &&
@@ -2131,86 +1793,71 @@ int compare_item (struct item *a, struct item *b)
* Map-Server Init and Command-line Arguments [Valaris]
*------------------------------------------------------
*/
-int do_init (int argc, char *argv[])
+int do_init(int argc, char *argv[])
{
- int i;
+ int i;
const char *MAP_CONF_NAME = "conf/map_athena.conf";
const char *BATTLE_CONF_FILENAME = "conf/battle_athena.conf";
const char *ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
- const char *SCRIPT_CONF_NAME = "conf/script_athena.conf";
- const char *MSG_CONF_NAME = "conf/msg_athena.conf";
for (i = 1; i < argc; i++)
{
- if (strcmp (argv[i], "--help") == 0 || strcmp (argv[i], "--h") == 0
- || strcmp (argv[i], "--?") == 0 || strcmp (argv[i], "/?") == 0)
- map_helpscreen ();
- else if (strcmp (argv[i], "--map_config") == 0)
+ if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--h") == 0
+ || strcmp(argv[i], "--?") == 0 || strcmp(argv[i], "/?") == 0)
+ map_helpscreen();
+ else if (strcmp(argv[i], "--map_config") == 0)
MAP_CONF_NAME = argv[i + 1];
- else if (strcmp (argv[i], "--battle_config") == 0)
+ else if (strcmp(argv[i], "--battle_config") == 0)
BATTLE_CONF_FILENAME = argv[i + 1];
- else if (strcmp (argv[i], "--atcommand_config") == 0)
+ else if (strcmp(argv[i], "--atcommand_config") == 0)
ATCOMMAND_CONF_FILENAME = argv[i + 1];
- else if (strcmp (argv[i], "--script_config") == 0)
- SCRIPT_CONF_NAME = argv[i + 1];
- else if (strcmp (argv[i], "--msg_config") == 0)
- MSG_CONF_NAME = argv[i + 1];
}
- map_config_read (MAP_CONF_NAME);
- battle_config_read (BATTLE_CONF_FILENAME);
- atcommand_config_read (ATCOMMAND_CONF_FILENAME);
- script_config_read (SCRIPT_CONF_NAME);
-
- id_db = numdb_init ();
- map_db = strdb_init (16);
- nick_db = strdb_init (24);
- charid_db = numdb_init ();
-
- map_readallmap ();
+ map_config_read(MAP_CONF_NAME);
+ battle_config_read(BATTLE_CONF_FILENAME);
+ atcommand_config_read(ATCOMMAND_CONF_FILENAME);
+ script_config_read();
-// add_timer_func_list (map_clearflooritem_timer, "map_clearflooritem_timer");
+ map_readallmap();
do_init_chrif ();
do_init_clif ();
- do_init_itemdb ();
- do_init_mob (); // npcの初期化時内でmob_spawnして、mob_dbを参照するのでinit_npcより先
- do_init_script ();
- do_init_npc ();
- do_init_pc ();
- do_init_party ();
- do_init_guild ();
- do_init_storage ();
- do_init_skill ();
- do_init_magic ();
-
- npc_event_do_oninit (); // npcのOnInitイベント実行
+ do_init_itemdb();
+ do_init_mob(); // npcの初期化時内でmob_spawnして、mob_dbを参照するのでinit_npcより先
+ do_init_script();
+ do_init_npc();
+ do_init_pc();
+ do_init_party();
+ do_init_storage();
+ do_init_skill();
+ do_init_magic();
+
+ npc_event_do_oninit(); // npcのOnInitイベント実行
if (battle_config.pk_mode == 1)
- printf ("The server is running in \033[1;31mPK Mode\033[0m.\n");
+ PRINTF("The server is running in \033[1;31mPK Mode\033[0m.\n");
- printf
- ("The map-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n",
+ PRINTF("The map-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n",
map_port);
return 0;
}
-int map_scriptcont (struct map_session_data *sd, int id)
+int map_scriptcont(struct map_session_data *sd, int id)
{
- struct block_list *bl = map_id2bl (id);
+ struct block_list *bl = map_id2bl(id);
if (!bl)
return 0;
switch (bl->type)
{
- case BL_NPC:
- return npc_scriptcont (sd, id);
- case BL_SPELL:
- spell_execute_script ((struct invocation *) bl);
+ case BL::NPC:
+ return npc_scriptcont(sd, id);
+ case BL::SPELL:
+ spell_execute_script((struct invocation *) bl);
break;
}
diff --git a/src/map/map.hpp b/src/map/map.hpp
index 8130739..374282d 100644
--- a/src/map/map.hpp
+++ b/src/map/map.hpp
@@ -1,166 +1,83 @@
-// $Id: map.h,v 1.8 2004/09/25 11:39:17 MouseJstr Exp $
#ifndef MAP_HPP
#define MAP_HPP
-#include <stdio.h>
-#include <stdarg.h>
-#include <time.h>
-#include <sys/time.h>
+#include "map.t.hpp"
+
#include <netinet/in.h>
-#include "../common/mmo.hpp"
-#include "../common/timer.hpp"
+
+#include <functional>
+
#include "../common/db.hpp"
-#include "script.hpp"
-
-#ifndef MAX
-# define MAX(x,y) (((x)>(y)) ? (x) : (y))
-#endif
-#ifndef MIN
-# define MIN(x,y) (((x)<(y)) ? (x) : (y))
-#endif
-
-#define MAX_PC_CLASS (1+6+6+1+6+1+1+1+1+4023)
-#define PC_CLASS_BASE 0
-#define PC_CLASS_BASE2 (PC_CLASS_BASE + 4001)
-#define PC_CLASS_BASE3 (PC_CLASS_BASE2 + 22)
-#define MAX_NPC_PER_MAP 512
-#define BLOCK_SIZE 8
+#include "../common/timer.t.hpp"
+
+#include "battle.t.hpp"
+#include "magic-interpreter.t.hpp"
+#include "mob.t.hpp"
+#include "script.hpp" // change to script.t.hpp
+#include "skill.t.hpp"
+
+constexpr int MAX_NPC_PER_MAP = 512;
+constexpr int BLOCK_SIZE = 8;
#define AREA_SIZE battle_config.area_size
-#define LOCAL_REG_NUM 16
-#define LIFETIME_FLOORITEM 60
-#define DAMAGELOG_SIZE 30
-#define LOOTITEM_SIZE 10
-#define MAX_SKILL_LEVEL 100
-#define MAX_STATUSCHANGE 200
-#define MAX_SKILLUNITGROUP 32
-#define MAX_MOBSKILLUNITGROUP 8
-#define MAX_SKILLUNITGROUPTICKSET 128
-#define MAX_SKILLTIMERSKILL 32
-#define MAX_MOBSKILLTIMERSKILL 10
-#define MAX_MOBSKILL 32
-#define MAX_EVENTQUEUE 2
-#define MAX_EVENTTIMER 32
-#define NATURAL_HEAL_INTERVAL 500
-#define MAX_FLOORITEM 500000
-#define MAX_LEVEL 255
-#define MAX_WALKPATH 48
-#define MAX_DROP_PER_MAP 48
-
-#define DEFAULT_AUTOSAVE_INTERVAL 60*1000
-
-// [Fate] status.option properties. These are persistent status changes.
-// IDs that are not listed are not used in the code (to the best of my knowledge)
-#define OPTION_HIDE2 0x0002 // apparently some weaker non-GM hide
-#define OPTION_CLOAK 0x0004
-#define OPTION_10 0x0010
-#define OPTION_20 0x0020
-#define OPTION_HIDE 0x0040 // [Fate] This is the GM `@hide' flag
-#define OPTION_800 0x0800
-#define OPTION_INVISIBILITY 0x1000 // [Fate] Complete invisibility to other clients
-#define OPTION_SCRIBE 0x2000 // [Fate] Auto-logging of nearby comments
-#define OPTION_CHASEWALK 0x4000
-
-// Below are special clif_changestatus() IDs reserved for option updates
-#define CLIF_OPTION_SC_BASE 0x1000
-#define CLIF_OPTION_SC_INVISIBILITY (CLIF_OPTION_SC_BASE)
-#define CLIF_OPTION_SC_SCRIBE (CLIF_OPTION_SC_BASE + 1)
-
-enum
-{ BL_NUL, BL_PC, BL_NPC, BL_MOB, BL_ITEM, BL_CHAT, BL_SKILL, BL_SPELL };
-enum
-{ WARP, SHOP, SCRIPT, MONS, MESSAGE };
+constexpr std::chrono::seconds LIFETIME_FLOORITEM = std::chrono::minutes(1);
+constexpr int DAMAGELOG_SIZE = 30;
+constexpr int LOOTITEM_SIZE = 10;
+constexpr int MAX_SKILL_LEVEL = 100;
+constexpr int MAX_MOBSKILL = 32;
+constexpr int MAX_EVENTQUEUE = 2;
+constexpr int MAX_EVENTTIMER = 32;
+constexpr interval_t NATURAL_HEAL_INTERVAL = std::chrono::milliseconds(500);
+constexpr int MAX_FLOORITEM = 500000;
+constexpr int MAX_LEVEL = 255;
+constexpr int MAX_WALKPATH = 48;
+constexpr int MAX_DROP_PER_MAP = 48;
+
+constexpr interval_t DEFAULT_AUTOSAVE_INTERVAL = std::chrono::minutes(1);
+
struct block_list
{
struct block_list *next, *prev;
- int id;
+ int id;
short m, x, y;
- unsigned char type;
- unsigned char subtype;
+ BL type;
+ NpcSubtype subtype;
};
struct walkpath_data
{
unsigned char path_len, path_pos, path_half;
- unsigned char path[MAX_WALKPATH];
+ DIR path[MAX_WALKPATH];
};
struct script_reg
{
- int index;
- int data;
+ int index;
+ int data;
};
struct script_regstr
{
- int index;
+ int index;
char data[256];
};
struct status_change
{
- int timer;
- int val1, val2, val3, val4;
- int spell_invocation; /* [Fate] If triggered by a spell, record here */
+ Timer timer;
+ int val1;
+ int spell_invocation; /* [Fate] If triggered by a spell, record here */
};
struct invocation;
-struct skill_unit_group;
-struct skill_unit
-{
- struct block_list bl;
-
- struct skill_unit_group *group;
-
- int limit;
- int val1, val2;
- short alive, range;
-};
-struct skill_unit_group
-{
- int src_id;
- int party_id;
- int guild_id;
- int map, range;
- int target_flag;
- unsigned int tick;
- int limit, interval;
-
- int skill_id, skill_lv;
- int val1, val2;
- char *valstr;
- int unit_id;
- int group_id;
- int unit_count, alive_count;
- struct skill_unit *unit;
-};
-struct skill_unit_group_tickset
-{
- unsigned int tick;
- int group_id;
-};
-struct skill_timerskill
-{
- int timer;
- int src_id;
- int target_id;
- int map;
- short x, y;
- short skill_id, skill_lv;
- int type;
- int flag;
-};
-
struct npc_data;
struct item_data;
struct square;
struct quick_regeneration
{ // [Fate]
- int amount; // Amount of HP/SP left to regenerate
+ int amount; // Amount of HP/SP left to regenerate
unsigned char speed; // less is faster (number of half-second ticks to wait between updates)
unsigned char tickdelay; // number of ticks to next update
};
-#define VERSION_2_SKILLINFO 0x02 // client supports full skillinfo blocks
-
struct map_session_data
{
struct block_list bl;
@@ -176,13 +93,12 @@ struct map_session_data
unsigned lr_flag:2;
unsigned connect_new:1;
unsigned arrow_atk:1;
- unsigned attack_type:3;
+ BF attack_type;//:3;
unsigned skill_flag:1;
unsigned gangsterparadise:1;
unsigned produce_flag:1;
unsigned make_arrow_flag:1;
- unsigned potionpitcher_flag:1;
- unsigned storage_flag:2; //0: closed, 1: Normal Storage open, 2: guild storage open [Skotlex]
+ unsigned storage_open:1;
unsigned shroud_active:1;
unsigned shroud_hides_name_talking:1;
unsigned shroud_disappears_on_pickup:1;
@@ -192,42 +108,35 @@ struct map_session_data
{
unsigned killer:1;
unsigned killable:1;
- unsigned restart_full_recover:1;
- unsigned no_castcancel:1;
- unsigned no_castcancel2:1;
- unsigned no_sizefix:1;
- unsigned no_magic_damage:1;
- unsigned no_weapon_damage:1;
- unsigned no_gemstone:1;
- unsigned infinite_endure:1;
unsigned unbreakable_weapon:1;
unsigned unbreakable_armor:1;
- unsigned infinite_autospell:1;
unsigned deaf:1;
} special_state;
- int char_id, login_id1, login_id2, sex;
+ int char_id, login_id1, login_id2, sex;
unsigned char tmw_version; // tmw client version
struct mmo_charstatus status;
struct item_data *inventory_data[MAX_INVENTORY];
- short equip_index[11];
- int weight, max_weight;
- int cart_weight, cart_max_weight, cart_num, cart_max_num;
+ earray<short, EQUIP, EQUIP::COUNT> equip_index;
+ int weight, max_weight;
+ int cart_weight, cart_max_weight, cart_num, cart_max_num;
char mapname[24];
- int fd, new_fd;
+ int fd, new_fd;
short to_x, to_y;
- short speed, prev_speed;
- short opt1, opt2, opt3;
- char dir, head_dir;
- unsigned int client_tick, server_tick;
+ interval_t speed;
+ Opt1 opt1;
+ Opt2 opt2;
+ Opt3 opt3;
+ DIR dir, head_dir;
+ tick_t client_tick, server_tick;
struct walkpath_data walkpath;
- int walktimer;
- int npc_id, areanpc_id, npc_shopid;
- int npc_pos;
- int npc_menu;
- int npc_amount;
- int npc_stack, npc_stackmax;
+ Timer walktimer;
+ int npc_id, areanpc_id, npc_shopid;
+ int npc_pos;
+ int npc_menu;
+ int npc_amount;
+ int npc_stack, npc_stackmax;
const ScriptCode *npc_script, *npc_scriptroot;
- char *npc_stackbuf;
+ struct script_data *npc_stackbuf;
char npc_str[256];
struct
{
@@ -236,158 +145,105 @@ struct map_session_data
} npc_flags;
unsigned int chatID;
- int attacktimer;
- int attacktarget;
- short attacktarget_lv;
- unsigned int attackabletime;
+ Timer attacktimer;
+ int attacktarget;
+ ATK attacktarget_lv;
+ tick_t attackabletime;
- int followtimer; // [MouseJstr]
- int followtarget;
+ // used by @hugo and @linus
+ int followtarget;
- unsigned int cast_tick; // [Fate] Next tick at which spellcasting is allowed
+ tick_t cast_tick; // [Fate] Next tick at which spellcasting is allowed
struct invocation *active_spells; // [Fate] Singly-linked list of active spells linked to this PC
- int attack_spell_override; // [Fate] When an attack spell is active for this player, they trigger it
+ int attack_spell_override; // [Fate] When an attack spell is active for this player, they trigger it
// like a weapon. Check pc_attack_timer() for details.
- short attack_spell_icon_override; // Weapon equipment slot (slot 4) item override
+ // Weapon equipment slot (slot 4) item override
+ StatusChange attack_spell_icon_override;
short attack_spell_look_override; // Weapon `look' (attack animation) override
short attack_spell_charges; // [Fate] Remaining number of charges for the attack spell
- short attack_spell_delay; // [Fate] ms delay after spell attack
+ interval_t attack_spell_delay; // [Fate] ms delay after spell attack
short attack_spell_range; // [Fate] spell range
short spellpower_bonus_target, spellpower_bonus_current; // [Fate] Spellpower boni. _current is the active one.
//_current slowly approximates _target, and _target is determined by equipment.
short attackrange, attackrange_;
- int skilltimer;
- int skilltarget;
- short skillx, skilly;
- short skillid, skilllv;
- short skillitem, skillitemlv;
- short skillid_old, skilllv_old;
- short skillid_dance, skilllv_dance;
- struct skill_unit_group skillunit[MAX_SKILLUNITGROUP];
- struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
- struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL];
- int cloneskill_id, cloneskill_lv;
- int potion_hp, potion_sp, potion_per_hp, potion_per_sp;
// [Fate] Used for gradual healing; amount of enqueued regeneration
struct quick_regeneration quick_regeneration_hp, quick_regeneration_sp;
// [Fate] XP that can be extracted from this player by healing
- int heal_xp; // i.e., OTHER players (healers) can partake in this player's XP
-
- int invincible_timer;
- unsigned int canact_tick;
- unsigned int canmove_tick;
- unsigned int canlog_tick;
- int hp_sub, sp_sub;
- int inchealhptick, inchealsptick, inchealspirithptick,
- inchealspiritsptick;
-// -- moonsoul (new tick for berserk self-damage)
- int berserkdamagetick;
- int fame;
-
- short view_class;
- short weapontype1, weapontype2;
- short disguiseflag, disguise; // [Valaris]
- int paramb[6], paramc[6], parame[6], paramcard[6];
- int hit, flee, flee2, aspd, amotion, dmotion;
- int watk, watk2, atkmods[3];
- int def, def2, mdef, mdef2, critical, matk1, matk2;
- int atk_ele, def_ele, star, overrefine;
- int castrate, hprate, sprate, dsprate;
- int addele[10], addrace[12], addsize[3], subele[10], subrace[12];
- int addeff[10], addeff2[10], reseff[10];
- int watk_, watk_2, atkmods_[3], addele_[10], addrace_[12], addsize_[3]; //二刀流のために追加
- int atk_ele_, star_, overrefine_; //二刀流のために追加
- int base_atk, atk_rate;
- int arrow_atk, arrow_ele, arrow_cri, arrow_hit, arrow_range;
- int arrow_addele[10], arrow_addrace[12], arrow_addsize[3],
- arrow_addeff[10], arrow_addeff2[10];
- int nhealhp, nhealsp, nshealhp, nshealsp, nsshealhp, nsshealsp;
- int aspd_rate, speed_rate, hprecov_rate, sprecov_rate, critical_def,
+ int heal_xp; // i.e., OTHER players (healers) can partake in this player's XP
+
+ Timer invincible_timer;
+ tick_t canact_tick;
+ tick_t canmove_tick;
+ tick_t canlog_tick;
+ interval_t hp_sub, sp_sub;
+ interval_t inchealhptick, inchealsptick;
+
+ ItemLook weapontype1, weapontype2;
+ earray<int, ATTR, ATTR::COUNT> paramb, paramc, parame, paramcard;
+ int hit, flee, flee2;
+ interval_t aspd, amotion, dmotion;
+ int watk, watk2;
+ int def, def2, mdef, mdef2, critical, matk1, matk2;
+ int star, overrefine;
+ int hprate, sprate, dsprate;
+ int watk_, watk_2;
+ int star_, overrefine_; //二刀流のために追加
+ int base_atk, atk_rate;
+ int arrow_atk;
+ int arrow_cri, arrow_hit, arrow_range;
+ int nhealhp, nhealsp, nshealhp, nshealsp, nsshealhp, nsshealsp;
+ int aspd_rate, speed_rate, hprecov_rate, sprecov_rate, critical_def,
double_rate;
- int near_attack_def_rate, long_attack_def_rate, magic_def_rate,
- misc_def_rate;
- int matk_rate, ignore_def_ele, ignore_def_race, ignore_def_ele_,
- ignore_def_race_;
- int ignore_mdef_ele, ignore_mdef_race;
- int magic_addele[10], magic_addrace[12], magic_subrace[12];
- int perfect_hit, get_zeny_num;
- int critical_rate, hit_rate, flee_rate, flee2_rate, def_rate, def2_rate,
+ int matk_rate;
+ int perfect_hit;
+ int critical_rate, hit_rate, flee_rate, flee2_rate, def_rate, def2_rate,
mdef_rate, mdef2_rate;
- int def_ratio_atk_ele, def_ratio_atk_ele_, def_ratio_atk_race,
- def_ratio_atk_race_;
- int add_damage_class_count, add_damage_class_count_,
- add_magic_damage_class_count;
- short add_damage_classid[10], add_damage_classid_[10],
- add_magic_damage_classid[10];
- int add_damage_classrate[10], add_damage_classrate_[10],
- add_magic_damage_classrate[10];
- short add_def_class_count, add_mdef_class_count;
- short add_def_classid[10], add_mdef_classid[10];
- int add_def_classrate[10], add_mdef_classrate[10];
- short monster_drop_item_count;
- short monster_drop_itemid[10];
- int monster_drop_race[10], monster_drop_itemrate[10];
- int double_add_rate, speed_add_rate, aspd_add_rate, perfect_hit_add,
- get_zeny_add_num;
- short splash_range, splash_add_range;
- short autospell_id, autospell_lv, autospell_rate;
+ int double_add_rate, speed_add_rate, aspd_add_rate, perfect_hit_add;
short hp_drain_rate, hp_drain_per, sp_drain_rate, sp_drain_per;
short hp_drain_rate_, hp_drain_per_, sp_drain_rate_, sp_drain_per_;
- int short_weapon_damage_return, long_weapon_damage_return;
- int weapon_coma_ele[10], weapon_coma_race[12];
short break_weapon_rate, break_armor_rate;
short add_steal_rate;
- short spiritball, spiritball_old;
- int spirit_timer[MAX_SKILL_LEVEL];
- int magic_damage_return; // AppleGirl Was Here
- int random_attack_increase_add, random_attack_increase_per; // [Valaris]
- int perfect_hiding; // [Valaris]
- int unbreakable;
-
- int die_counter;
- short doridori_counter;
+ int die_counter;
- int reg_num;
+ int reg_num;
struct script_reg *reg;
- int regstr_num;
+ int regstr_num;
struct script_regstr *regstr;
- struct status_change sc_data[MAX_STATUSCHANGE];
+ earray<struct status_change, StatusChange, StatusChange::MAX_STATUSCHANGE> sc_data;
short sc_count;
struct square dev;
- int trade_partner;
- int deal_item_index[10];
- int deal_item_amount[10];
- int deal_zeny;
+ int trade_partner;
+ int deal_item_index[10];
+ int deal_item_amount[10];
+ int deal_zeny;
short deal_locked;
- int party_sended, party_invite, party_invite_account;
- int party_hp, party_x, party_y;
+ int party_sended, party_invite, party_invite_account;
+ int party_hp, party_x, party_y;
- int guild_sended, guild_invite, guild_invite_account;
- int guild_emblem_id, guild_alliance, guild_alliance_account;
- int guildspy; // [Syrus22]
- int partyspy; // [Syrus22]
+ int partyspy; // [Syrus22]
char message[80];
- int catch_target_class;
+ int catch_target_class;
- int pvp_point, pvp_rank, pvp_timer, pvp_lastusers;
+ int pvp_point, pvp_rank;
+ Timer pvp_timer;
+ int pvp_lastusers;
char eventqueue[MAX_EVENTQUEUE][50];
- int eventtimer[MAX_EVENTTIMER];
+ Timer eventtimer[MAX_EVENTTIMER];
- int last_skillid, last_skilllv; // Added by RoVeRT
struct
{
char name[24];
} ignore[80];
- int ignoreAll;
+ int ignoreAll;
short sg_count;
struct
@@ -395,14 +251,14 @@ struct map_session_data
unsigned in_progress:1;
} auto_ban_info;
- time_t chat_reset_due;
- time_t chat_repeat_reset_due;
- int chat_lines_in;
- int chat_total_repeats;
+ TimeT chat_reset_due;
+ TimeT chat_repeat_reset_due;
+ int chat_lines_in;
+ int chat_total_repeats;
char chat_lastmsg[513];
- unsigned int flood_rates[0x220];
- time_t packet_flood_reset_due;
+ tick_t flood_rates[0x220];
+ TimeT packet_flood_reset_due;
int packet_flood_in;
struct in_addr ip;
@@ -410,27 +266,32 @@ struct map_session_data
struct npc_timerevent_list
{
- int timer, pos;
+ interval_t timer;
+ int pos;
};
struct npc_label_list
{
char name[24];
- int pos;
+ int pos;
};
struct npc_item_list
{
- int nameid, value;
+ int nameid, value;
};
struct npc_data
{
struct block_list bl;
short n;
- short npc_class, dir;
- short speed;
+ short npc_class;
+ DIR dir;
+ interval_t speed;
char name[24];
char exname[24];
- int chat_id;
- short opt1, opt2, opt3, option;
+ int chat_id;
+ Opt1 opt1;
+ Opt2 opt2;
+ Opt3 opt3;
+ Option option;
short flag;
union
{
@@ -438,13 +299,14 @@ struct npc_data
{
const ScriptCode *script;
short xs, ys;
- int guild_id;
- int timer, timerid, timeramount, nexttimer;
- unsigned int timertick;
+ interval_t timer;
+ Timer timerid;
+ int timeramount, nexttimer;
+ tick_t timertick;
struct npc_timerevent_list *timer_event;
- int label_list_num;
+ int label_list_num;
struct npc_label_list *label_list;
- int src_id;
+ int src_id;
} scr;
struct npc_item_list shop_item[1];
struct
@@ -453,50 +315,33 @@ struct npc_data
short x, y;
char name[16];
} warp;
- char *message; // for MESSAGE: only send this message
+ char *message; // for NpcSubtype::MESSAGE: only send this message
} u;
// ここにメンバを追加してはならない(shop_itemが可変長の為)
char eventqueue[MAX_EVENTQUEUE][50];
- int eventtimer[MAX_EVENTTIMER];
+ Timer eventtimer[MAX_EVENTTIMER];
short arenaflag;
};
-#define MOB_MODE_SUMMONED 0x1000
-#define MOB_MODE_TURNS_AGAINST_BAD_MASTER 0x2000
-
-#define MOB_SENSIBLE_MASK 0xf000 // fate: mob mode flags that I actually understand
-
-enum mob_stat
-{
- MOB_LV,
- MOB_MAX_HP,
- MOB_STR, MOB_AGI, MOB_VIT, MOB_INT, MOB_DEX, MOB_LUK,
- MOB_ATK1, MOB_ATK2, // low and high attacks
- MOB_ADELAY, // attack delay
- MOB_DEF, MOB_MDEF,
- MOB_SPEED,
- // These must come last:
- MOB_XP_BONUS, /* [Fate] Encoded as base to 1024: 1024 means 100% */
- MOB_LAST
-};
-
-#define MOB_XP_BONUS_BASE 1024
-#define MOB_XP_BONUS_SHIFT 10
+constexpr int MOB_XP_BONUS_BASE = 1024;
+constexpr int MOB_XP_BONUS_SHIFT = 10;
struct mob_data
{
struct block_list bl;
short n;
- short base_class, mob_class, dir, mode;
+ short mob_class;
+ DIR dir;
+ MobMode mode;
short m, x0, y0, xs, ys;
char name[24];
- int spawndelay1, spawndelay2;
+ interval_t spawndelay1, spawndelay2;
struct
{
- unsigned state:8;
- unsigned skillstate:8;
- unsigned targettype:1;
+ MS state;
+ MobSkillState skillstate;
+ unsigned attackable:1;
unsigned steal_flag:1;
unsigned steal_coin_flag:1;
unsigned skillcastcancel:1;
@@ -505,71 +350,64 @@ struct mob_data
unsigned walk_easy:1;
unsigned special_mob_ai:3;
} state;
- int timer;
+ Timer timer;
short to_x, to_y;
- int hp;
- int target_id, attacked_id;
- short target_lv;
+ int hp;
+ int target_id, attacked_id;
+ ATK target_lv;
struct walkpath_data walkpath;
- unsigned int next_walktime;
- unsigned int attackabletime;
- unsigned int last_deadtime, last_spawntime, last_thinktime;
- unsigned int canmove_tick;
+ tick_t next_walktime;
+ tick_t attackabletime;
+ tick_t last_deadtime, last_spawntime, last_thinktime;
+ tick_t canmove_tick;
short move_fail_count;
struct
{
- int id;
- int dmg;
+ int id;
+ int dmg;
} dmglog[DAMAGELOG_SIZE];
struct item *lootitem;
short lootitem_count;
- struct status_change sc_data[MAX_STATUSCHANGE];
+ earray<struct status_change, StatusChange, StatusChange::MAX_STATUSCHANGE> sc_data;
short sc_count;
- short opt1, opt2, opt3, option;
+ Opt1 opt1;
+ Opt2 opt2;
+ Opt3 opt3;
+ Option option;
short min_chase;
short sg_count;
- int guild_id;
- int deletetimer;
+ Timer deletetimer;
- int skilltimer;
- int skilltarget;
+ Timer skilltimer;
+ int skilltarget;
short skillx, skilly;
- short skillid, skilllv, skillidx;
- unsigned int skilldelay[MAX_MOBSKILL];
- int def_ele;
- int master_id, master_dist;
- int exclusion_src, exclusion_party, exclusion_guild;
- struct skill_timerskill skilltimerskill[MAX_MOBSKILLTIMERSKILL];
- struct skill_unit_group skillunit[MAX_MOBSKILLUNITGROUP];
- struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
+ SkillID skillid;
+ short skilllv, skillidx;
+ tick_t skilldelay[MAX_MOBSKILL];
+ LevelElement def_ele;
+ int master_id, master_dist;
+ int exclusion_src, exclusion_party;
char npc_event[50];
- unsigned short stats[MOB_LAST]; // [Fate] mob-specific stats
+ // [Fate] mob-specific stats
+ earray<unsigned short, mob_stat, mob_stat::LAST> stats;
short size;
};
-enum
-{ MS_IDLE, MS_WALK, MS_ATTACK, MS_DEAD, MS_DELAY };
-
-enum
-{ NONE_ATTACKABLE, ATTACKABLE };
-
-enum
-{ ATK_LUCKY = 1, ATK_FLEE, ATK_DEF }; // 囲まれペナルティ計算用
-
struct map_data
{
char name[24];
char alias[24]; // [MouseJstr]
- unsigned char *gat; // NULLなら下のmap_data_other_serverとして扱う
+ // if NULL, actually a map_data_other_server
+ std::unique_ptr<MapCell[]> gat;
struct block_list **block;
struct block_list **block_mob;
int *block_count, *block_mob_count;
- int m;
+ int m;
short xs, ys;
short bxs, bys;
- int npc_num;
- int users;
+ int npc_num;
+ int users;
struct
{
unsigned alias:1;
@@ -582,14 +420,9 @@ struct map_data
unsigned nopenalty:1;
unsigned pvp:1;
unsigned pvp_noparty:1;
- unsigned pvp_noguild:1;
- unsigned pvp_nightmaredrop:1;
unsigned pvp_nocalcrank:1;
- unsigned gvg:1;
- unsigned gvg_noparty:1;
unsigned nozenypenalty:1;
unsigned notrade:1;
- unsigned noskill:1;
unsigned nowarp:1;
unsigned nowarpto:1;
unsigned nopvp:1; // [Valaris]
@@ -606,9 +439,9 @@ struct map_data
struct npc_data *npc[MAX_NPC_PER_MAP];
struct
{
- int drop_id;
- int drop_type;
- int drop_per;
+ int drop_id;
+ int drop_type;
+ int drop_per;
} drop_list[MAX_DROP_PER_MAP];
};
struct map_data_other_server
@@ -618,92 +451,37 @@ struct map_data_other_server
struct in_addr ip;
unsigned int port;
};
-#define read_gat(m,x,y) (map[m].gat[(x)+(y)*map[m].xs])
-#define read_gatp(m,x,y) (m->gat[(x)+(y)*m->xs])
-struct flooritem_data
-{
- struct block_list bl;
- short subx, suby;
- int cleartimer;
- int first_get_id, second_get_id, third_get_id;
- unsigned int first_get_tick, second_get_tick, third_get_tick;
- struct item item_data;
-};
+extern struct map_data map[];
+extern int map_num;
-enum
+inline
+MapCell read_gatp(struct map_data *m, int x, int y)
{
- SP_SPEED, SP_BASEEXP, SP_JOBEXP, SP_KARMA, SP_MANNER, SP_HP, SP_MAXHP, SP_SP, // 0-7
- SP_MAXSP, SP_STATUSPOINT, SP_0a, SP_BASELEVEL, SP_SKILLPOINT, SP_STR, SP_AGI, SP_VIT, // 8-15
- SP_INT, SP_DEX, SP_LUK, SP_CLASS, SP_ZENY, SP_SEX, SP_NEXTBASEEXP, SP_NEXTJOBEXP, // 16-23
- SP_WEIGHT, SP_MAXWEIGHT, SP_1a, SP_1b, SP_1c, SP_1d, SP_1e, SP_1f, // 24-31
- SP_USTR, SP_UAGI, SP_UVIT, SP_UINT, SP_UDEX, SP_ULUK, SP_26, SP_27, // 32-39
- SP_28, SP_ATK1, SP_ATK2, SP_MATK1, SP_MATK2, SP_DEF1, SP_DEF2, SP_MDEF1, // 40-47
- SP_MDEF2, SP_HIT, SP_FLEE1, SP_FLEE2, SP_CRITICAL, SP_ASPD, SP_36, SP_JOBLEVEL, // 48-55
- SP_UPPER, SP_PARTNER, SP_CART, SP_FAME, SP_UNBREAKABLE, //56-58
- SP_DEAF = 70,
- SP_CARTINFO = 99, // 99
- SP_GM = 500,
-
- // original 1000-
- SP_ATTACKRANGE = 1000, SP_ATKELE, SP_DEFELE, // 1000-1002
- SP_CASTRATE, SP_MAXHPRATE, SP_MAXSPRATE, SP_SPRATE, // 1003-1006
- SP_ADDELE, SP_ADDRACE, SP_ADDSIZE, SP_SUBELE, SP_SUBRACE, // 1007-1011
- SP_ADDEFF, SP_RESEFF, // 1012-1013
- SP_BASE_ATK, SP_ASPD_RATE, SP_HP_RECOV_RATE, SP_SP_RECOV_RATE, SP_SPEED_RATE, // 1014-1018
- SP_CRITICAL_DEF, SP_NEAR_ATK_DEF, SP_LONG_ATK_DEF, // 1019-1021
- SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_MATK, SP_MATK_RATE, // 1022-1025
- SP_IGNORE_DEF_ELE, SP_IGNORE_DEF_RACE, // 1026-1027
- SP_ATK_RATE, SP_SPEED_ADDRATE, SP_ASPD_ADDRATE, // 1028-1030
- SP_MAGIC_ATK_DEF, SP_MISC_ATK_DEF, // 1031-1032
- SP_IGNORE_MDEF_ELE, SP_IGNORE_MDEF_RACE, // 1033-1034
- SP_MAGIC_ADDELE, SP_MAGIC_ADDRACE, SP_MAGIC_SUBRACE, // 1035-1037
- SP_PERFECT_HIT_RATE, SP_PERFECT_HIT_ADD_RATE, SP_CRITICAL_RATE, SP_GET_ZENY_NUM, SP_ADD_GET_ZENY_NUM, // 1038-1042
- SP_ADD_DAMAGE_CLASS, SP_ADD_MAGIC_DAMAGE_CLASS, SP_ADD_DEF_CLASS, SP_ADD_MDEF_CLASS, // 1043-1046
- SP_ADD_MONSTER_DROP_ITEM, SP_DEF_RATIO_ATK_ELE, SP_DEF_RATIO_ATK_RACE, SP_ADD_SPEED, // 1047-1050
- SP_HIT_RATE, SP_FLEE_RATE, SP_FLEE2_RATE, SP_DEF_RATE, SP_DEF2_RATE, SP_MDEF_RATE, SP_MDEF2_RATE, // 1051-1057
- SP_SPLASH_RANGE, SP_SPLASH_ADD_RANGE, SP_AUTOSPELL, SP_HP_DRAIN_RATE, SP_SP_DRAIN_RATE, // 1058-1062
- SP_SHORT_WEAPON_DAMAGE_RETURN, SP_LONG_WEAPON_DAMAGE_RETURN, SP_WEAPON_COMA_ELE, SP_WEAPON_COMA_RACE, // 1063-1066
- SP_ADDEFF2, SP_BREAK_WEAPON_RATE, SP_BREAK_ARMOR_RATE, SP_ADD_STEAL_RATE, // 1067-1070
- SP_MAGIC_DAMAGE_RETURN, SP_RANDOM_ATTACK_INCREASE, SP_ALL_STATS, SP_AGI_VIT, SP_AGI_DEX_STR, SP_PERFECT_HIDE, // 1071-1077
- SP_DISGUISE, // 1077
-
- SP_RESTART_FULL_RECORVER = 2000, SP_NO_CASTCANCEL, SP_NO_SIZEFIX, SP_NO_MAGIC_DAMAGE, SP_NO_WEAPON_DAMAGE, SP_NO_GEMSTONE, // 2000-2005
- SP_NO_CASTCANCEL2, SP_INFINITE_ENDURE, SP_UNBREAKABLE_WEAPON, SP_UNBREAKABLE_ARMOR // 2006-2009
-};
-
-enum
+ return m->gat[x + y * m->xs];
+}
+inline
+MapCell read_gat(int m, int x, int y)
{
- LOOK_BASE,
- LOOK_HAIR,
- LOOK_WEAPON,
- LOOK_HEAD_BOTTOM,
- LOOK_HEAD_TOP,
- LOOK_HEAD_MID,
- LOOK_HAIR_COLOR,
- LOOK_CLOTHES_COLOR,
- LOOK_SHIELD,
- LOOK_SHOES, /* 9 */
- LOOK_GLOVES,
- LOOK_CAPE,
- LOOK_MISC1,
- LOOK_MISC2
-};
+ return read_gatp(&map[m], x, y);
+}
-enum
+struct flooritem_data
{
- EQUIP_SHIELD = 8,
- EQUIP_WEAPON = 9
+ struct block_list bl;
+ short subx, suby;
+ Timer cleartimer;
+ int first_get_id, second_get_id, third_get_id;
+ tick_t first_get_tick, second_get_tick, third_get_tick;
+ struct item item_data;
};
-#define LOOK_LAST LOOK_MISC2
-
struct chat_data
{
struct block_list bl;
char pass[8]; /* password */
- char title[61]; /* room title MAX 60 */
+ char title[61]; /* room title max 60 */
unsigned char limit; /* join limit */
unsigned char trigger;
unsigned char users; /* current users */
@@ -714,111 +492,109 @@ struct chat_data
char npc_event[50];
};
-extern struct map_data map[];
-extern int map_num;
-extern int autosave_interval;
+extern interval_t autosave_interval;
extern int save_settings;
-extern int agit_flag;
-extern int night_flag; // 0=day, 1=night [Yor]
extern char motd_txt[];
extern char help_txt[];
-extern char talkie_mes[];
-
extern char wisp_server_name[];
// 鯖全体情報
-void map_setusers (int);
-int map_getusers (void);
+void map_setusers(int);
+int map_getusers(void);
// block削除関連
-int map_freeblock (void *bl);
-int map_freeblock_lock (void);
-int map_freeblock_unlock (void);
+int map_freeblock(void *bl);
+int map_freeblock_lock(void);
+int map_freeblock_unlock(void);
// block関連
-int map_addblock (struct block_list *);
-int map_delblock (struct block_list *);
-void map_foreachinarea (int (*)(struct block_list *, va_list), int, int, int,
- int, int, int, ...);
+int map_addblock(struct block_list *);
+int map_delblock(struct block_list *);
+void map_foreachinarea(std::function<void(struct block_list *)>,
+ int,
+ int, int, int, int,
+ BL);
// -- moonsoul (added map_foreachincell)
-void map_foreachincell (int (*)(struct block_list *, va_list), int, int, int,
- int, ...);
-void map_foreachinmovearea (int (*)(struct block_list *, va_list), int, int,
- int, int, int, int, int, int, ...);
-int map_countnearpc (int, int, int);
+void map_foreachincell(std::function<void(struct block_list *)>,
+ int,
+ int, int,
+ BL);
+void map_foreachinmovearea(std::function<void(struct block_list *)>,
+ int,
+ int, int, int, int,
+ int, int,
+ BL);
//block関連に追加
-int map_count_oncell (int m, int x, int y);
+int map_count_oncell(int m, int x, int y);
// 一時的object関連
-int map_addobject (struct block_list *);
-int map_delobject (int, int type);
-int map_delobjectnofree (int id, int type);
-void map_foreachobject (int (*)(struct block_list *, va_list), int, ...);
+int map_addobject(struct block_list *);
+int map_delobject(int, BL type);
+int map_delobjectnofree(int id, BL type);
+void map_foreachobject(std::function<void(struct block_list *)>,
+ BL);
//
-int map_quit (struct map_session_data *);
+void map_quit(struct map_session_data *);
// npc
-int map_addnpc (int, struct npc_data *);
+int map_addnpc(int, struct npc_data *);
-extern FILE *map_logfile;
-__attribute__((format(printf, 1, 2)))
-void map_write_log (const char *format, ...);
-#define MAP_LOG(format, args...) {if (map_logfile) map_write_log(format, ##args);}
+void map_log(const_string line);
+#define MAP_LOG(format, ...) \
+ map_log(static_cast<const std::string&>(STRPRINTF(format, ## __VA_ARGS__)))
-#define MAP_LOG_PC(sd, fmt, args...) MAP_LOG("PC%d %d:%d,%d " fmt, sd->status.char_id, sd->bl.m, sd->bl.x, sd->bl.y, ## args)
+#define MAP_LOG_PC(sd, fmt, ...) \
+ MAP_LOG("PC%d %d:%d,%d " fmt, \
+ sd->status.char_id, sd->bl.m, sd->bl.x, sd->bl.y, ## __VA_ARGS__)
// 床アイテム関連
-void map_clearflooritem_timer (timer_id, tick_t, custom_id_t, custom_data_t);
-#define map_clearflooritem(id) map_clearflooritem_timer(0,0,id,1)
-int map_addflooritem_any (struct item *, int amount, int m, int x, int y,
- struct map_session_data **owners,
- int *owner_protection,
- int lifetime, int dispersal);
-int map_addflooritem (struct item *, int, int, int, int,
- struct map_session_data *, struct map_session_data *,
- struct map_session_data *, int);
-int map_searchrandfreecell (int, int, int, int);
+void map_clearflooritem_timer(TimerData *, tick_t, int);
+inline
+void map_clearflooritem(int id)
+{
+ map_clearflooritem_timer(nullptr, tick_t(), id);
+}
+int map_addflooritem_any(struct item *, int amount, int m, int x, int y,
+ struct map_session_data **owners, interval_t *owner_protection,
+ interval_t lifetime, int dispersal);
+int map_addflooritem(struct item *, int, int, int, int,
+ struct map_session_data *, struct map_session_data *,
+ struct map_session_data *);
// キャラid=>キャラ名 変換関連
-void map_addchariddb (int charid, const char *name);
-void map_delchariddb (int charid);
-int map_reqchariddb (struct map_session_data *sd, int charid);
-char *map_charid2nick (int);
-
-struct map_session_data *map_id2sd (int);
-struct block_list *map_id2bl (int);
-int map_mapname2mapid (const char *);
-int map_mapname2ipport (const char *, struct in_addr *, int *);
-int map_setipport (const char *name, struct in_addr ip, int port);
-int map_eraseipport (const char *name, struct in_addr ip, int port);
-void map_addiddb (struct block_list *);
-void map_deliddb (struct block_list *bl);
-int map_foreachiddb (db_func_t, ...);
-void map_addnickdb (struct map_session_data *);
-int map_scriptcont (struct map_session_data *sd, int id); /* Continues a script either on a spell or on an NPC */
-struct map_session_data *map_nick2sd (const char *);
-int compare_item (struct item *a, struct item *b);
-
-struct map_session_data *map_get_first_session (void);
-struct map_session_data *map_get_last_session (void);
-struct map_session_data *map_get_next_session (struct map_session_data
- *current);
-struct map_session_data *map_get_prev_session (struct map_session_data
- *current);
+extern
+DMap<int, struct block_list *> id_db;
+void map_addchariddb(int charid, const char *name);
+char *map_charid2nick(int);
+
+struct map_session_data *map_id2sd(int);
+struct block_list *map_id2bl(int);
+int map_mapname2mapid(const char *);
+int map_mapname2ipport(const char *, struct in_addr *, int *);
+int map_setipport(const char *name, struct in_addr ip, int port);
+void map_addiddb(struct block_list *);
+void map_deliddb(struct block_list *bl);
+void map_addnickdb(struct map_session_data *);
+int map_scriptcont(struct map_session_data *sd, int id); /* Continues a script either on a spell or on an NPC */
+struct map_session_data *map_nick2sd(const char *);
+int compare_item(struct item *a, struct item *b);
+
+struct map_session_data *map_get_first_session(void);
+struct map_session_data *map_get_last_session(void);
+struct map_session_data *map_get_next_session(
+ struct map_session_data *current);
+struct map_session_data *map_get_prev_session(
+ struct map_session_data *current);
// gat関連
-int map_getcell (int, int, int);
-int map_setcell (int, int, int, int);
+MapCell map_getcell(int, int, int);
+void map_setcell(int, int, int, MapCell);
// その他
-int map_check_dir (int s_dir, int t_dir);
-int map_calc_dir (struct block_list *src, int x, int y);
+bool map_check_dir(DIR s_dir, DIR t_dir);
+DIR map_calc_dir(struct block_list *src, int x, int y);
// path.cより
-int path_search (struct walkpath_data *, int, int, int, int, int, int);
-int path_blownpos (int m, int x0, int y0, int dx, int dy, int count);
-
-int map_who (int fd);
+int path_search(struct walkpath_data *, int, int, int, int, int, int);
-void map_helpscreen (void); // [Valaris]
-int map_delmap (char *mapname);
+std::pair<uint16_t, uint16_t> map_randfreecell(int m, uint16_t x, uint16_t y, uint16_t w, uint16_t h);
-#endif
+#endif // MAP_HPP
diff --git a/src/map/map.t.hpp b/src/map/map.t.hpp
new file mode 100644
index 0000000..c57ea06
--- /dev/null
+++ b/src/map/map.t.hpp
@@ -0,0 +1,560 @@
+#ifndef MAP_T_HPP
+#define MAP_T_HPP
+
+#include "../common/mmo.hpp"
+#include "../common/utils2.hpp"
+
+namespace e
+{
+// [Fate] status.option properties. These are persistent status changes.
+// IDs that are not listed are not used in the code (to the best of my knowledge)
+enum class Option : uint16_t
+{
+ ZERO = 0x0000,
+
+ // [Fate] This is the GM `@hide' flag
+ HIDE = 0x0040,
+ // [Fate] Complete invisibility to other clients
+ INVISIBILITY = 0x1000,
+
+ // ?
+ REAL_ANY_HIDE = HIDE,
+};
+enum class Opt1 : uint16_t
+{
+ ZERO = 0,
+ _stone1 = 1,
+ _freeze = 2,
+ _stan = 3,
+ _sleep = 4,
+ _stone6 = 6,
+};
+enum class Opt2 : uint16_t
+{
+ ZERO = 0x0000,
+ _poison = 0x0001,
+ _curse = 0x0002,
+ _silence = 0x0004,
+ BLIND = 0x0010,
+ _speedpotion0 = 0x0020,
+ _signumcrucis = 0x0040,
+ _atkpot = 0x0080,
+ _heal = 0x0100,
+ _slowpoison = 0x0200,
+};
+enum class Opt3 : uint16_t
+{
+ ZERO = 0x0000,
+ _concentration = 0x0001,
+ _overthrust = 0x0002,
+ _energycoat = 0x0004,
+ _explosionspirits = 0x0008,
+ _steelbody = 0x0010,
+ _berserk = 0x0080,
+
+ _marionette = 0x0400,
+ _assumptio = 0x0800,
+};
+
+ENUM_BITWISE_OPERATORS(Option)
+ENUM_BITWISE_OPERATORS(Opt2)
+ENUM_BITWISE_OPERATORS(Opt3)
+}
+using e::Option;
+using e::Opt1;
+using e::Opt2;
+using e::Opt3;
+
+enum class BL : uint8_t
+{
+ NUL,
+ PC,
+ NPC,
+ MOB,
+ ITEM,
+ CHAT,
+ SPELL,
+};
+enum class NpcSubtype : uint8_t
+{
+ WARP,
+ SHOP,
+ SCRIPT,
+ MONS,
+ MESSAGE,
+};
+
+enum class mob_stat
+{
+ LV,
+ MAX_HP,
+ STR,
+ AGI,
+ VIT,
+ INT,
+ DEX,
+ LUK,
+ // low and high attacks
+ ATK1,
+ ATK2,
+ // attack delay
+ ADELAY,
+ DEF,
+ MDEF,
+ SPEED,
+ // These must come last:
+ // [Fate] Encoded as base to 1024: 1024 means 100%
+ XP_BONUS,
+ LAST,
+};
+
+enum class MS : uint8_t
+{
+ IDLE,
+ WALK,
+ ATTACK,
+ DEAD,
+};
+
+enum class ATK
+{
+ ZERO = 0,
+
+ LUCKY,
+ FLEE,
+ DEF,
+};
+
+enum class SP : uint16_t
+{
+ // sent to client
+ SPEED = 0,
+
+ // when used as "no stat"
+ ZERO = 0,
+
+ // sent to client
+ BASEEXP = 1,
+ // sent to client
+ JOBEXP = 2,
+#if 0
+ KARMA = 3,
+#endif
+
+ // sent to client
+ HP = 5,
+ // sent to client
+ MAXHP = 6,
+ // sent to client
+ SP = 7,
+ // sent to client
+ MAXSP = 8,
+ // sent to client
+ STATUSPOINT = 9,
+
+ // sent to client
+ BASELEVEL = 11,
+ // sent to client
+ SKILLPOINT = 12,
+ // sent to client
+ STR = 13,
+ // sent to client
+ AGI = 14,
+ // sent to client
+ VIT = 15,
+ // sent to client
+ INT = 16,
+ // sent to client
+ DEX = 17,
+ // sent to client
+ LUK = 18,
+ CLASS = 19,
+ // sent to client
+ ZENY = 20,
+ SEX = 21,
+ // sent to client
+ NEXTBASEEXP = 22,
+ // sent to client
+ NEXTJOBEXP = 23,
+ // sent to client
+ WEIGHT = 24,
+ // sent to client
+ MAXWEIGHT = 25,
+
+ // sent to client
+ USTR = 32,
+ // sent to client
+ UAGI = 33,
+ // sent to client
+ UVIT = 34,
+ // sent to client
+ UINT = 35,
+ // sent to client
+ UDEX = 36,
+ // sent to client
+ ULUK = 37,
+
+ // sent to client
+ ATK1 = 41,
+ // sent to client
+ ATK2 = 42,
+ // sent to client
+ MATK1 = 43,
+ // sent to client
+ MATK2 = 44,
+ // sent to client
+ DEF1 = 45,
+ // sent to client
+ DEF2 = 46,
+ // sent to client
+ MDEF1 = 47,
+ // sent to client
+ MDEF2 = 48,
+ // sent to client
+ HIT = 49,
+ // sent to client
+ FLEE1 = 50,
+ // sent to client
+ FLEE2 = 51,
+ // sent to client
+ CRITICAL = 52,
+ // sent to client
+ ASPD = 53,
+
+ // sent to client
+ JOBLEVEL = 55,
+
+#if 0
+ PARTNER = 57,
+ CART = 58,
+ FAME = 59,
+ UNBREAKABLE = 60,
+#endif
+
+ DEAF = 70,
+
+ // sent to client
+ GM = 500,
+
+ // sent to client
+ ATTACKRANGE = 1000,
+#if 0
+ ATKELE = 1001,
+#endif
+#if 0
+ DEFELE = 1002,
+#endif
+#if 0
+ CASTRATE = 1003,
+#endif
+ MAXHPRATE = 1004,
+#if 0
+ MAXSPRATE = 1005,
+#endif
+#if 0
+ SPRATE = 1006,
+#endif
+
+#if 0
+ ADDEFF = 1012,
+#endif
+#if 0
+ RESEFF = 1013,
+#endif
+ BASE_ATK = 1014,
+ ASPD_RATE = 1015,
+ HP_RECOV_RATE = 1016,
+#if 0
+ SP_RECOV_RATE = 1017,
+#endif
+#if 0
+ SPEED_RATE = 1018,
+#endif
+ CRITICAL_DEF = 1019,
+#if 0
+ NEAR_ATK_DEF = 1020,
+#endif
+#if 0
+ LONG_ATK_DEF = 1021,
+#endif
+#if 0
+ DOUBLE_RATE = 1022,
+#endif
+ DOUBLE_ADD_RATE = 1023,
+#if 0
+ MATK = 1024,
+#endif
+#if 0
+ MATK_RATE = 1025,
+#endif
+#if 0
+ IGNORE_DEF_ELE = 1026,
+#endif
+#if 0
+ IGNORE_DEF_RACE = 1027,
+#endif
+#if 0
+ ATK_RATE = 1028,
+#endif
+ SPEED_ADDRATE = 1029,
+#if 0
+ ASPD_ADDRATE = 1030,
+#endif
+#if 0
+ MAGIC_ATK_DEF = 1031,
+#endif
+#if 0
+ MISC_ATK_DEF = 1032,
+#endif
+#if 0
+ IGNORE_MDEF_ELE = 1033,
+#endif
+#if 0
+ IGNORE_MDEF_RACE = 1034,
+#endif
+
+#if 0
+ PERFECT_HIT_RATE = 1038,
+#endif
+#if 0
+ PERFECT_HIT_ADD_RATE = 1039,
+#endif
+#if 0
+ CRITICAL_RATE = 1040,
+#endif
+#if 0
+ GET_ZENY_NUM = 1041,
+#endif
+#if 0
+ ADD_GET_ZENY_NUM = 1042,
+#endif
+
+#if 0
+ ADD_MONSTER_DROP_ITEM = 1047,
+#endif
+#if 0
+ DEF_RATIO_ATK_ELE = 1048,
+#endif
+#if 0
+ DEF_RATIO_ATK_RACE = 1049,
+#endif
+#if 0
+ ADD_SPEED = 1050,
+#endif
+#if 0
+ HIT_RATE = 1051,
+#endif
+#if 0
+ FLEE_RATE = 1052,
+#endif
+#if 0
+ FLEE2_RATE = 1053,
+#endif
+ DEF_RATE = 1054,
+ DEF2_RATE = 1055,
+#if 0
+ MDEF_RATE = 1056,
+#endif
+#if 0
+ MDEF2_RATE = 1057,
+#endif
+#if 0
+ SPLASH_RANGE = 1058,
+#endif
+#if 0
+ SPLASH_ADD_RANGE = 1059,
+#endif
+
+ HP_DRAIN_RATE = 1061,
+#if 0
+ SP_DRAIN_RATE = 1062,
+#endif
+#if 0
+ SHORT_WEAPON_DAMAGE_RETURN = 1063,
+#endif
+#if 0
+ LONG_WEAPON_DAMAGE_RETURN = 1064,
+#endif
+
+#if 0
+ ADDEFF2 = 1067,
+#endif
+ BREAK_WEAPON_RATE = 1068,
+ BREAK_ARMOR_RATE = 1069,
+ ADD_STEAL_RATE = 1070,
+ MAGIC_DAMAGE_RETURN = 1071,
+#if 0
+ RANDOM_ATTACK_INCREASE = 1072,
+#endif
+};
+
+constexpr
+SP attr_to_sp(ATTR attr)
+{
+ return SP(uint16_t(attr) + uint16_t(SP::STR));
+}
+
+constexpr
+ATTR sp_to_attr(SP sp)
+{
+ return ATTR(uint16_t(sp) - uint16_t(SP::STR));
+}
+
+constexpr
+SP attr_to_usp(ATTR attr)
+{
+ return SP(uint16_t(attr) + uint16_t(SP::USTR));
+}
+
+constexpr
+ATTR usp_to_attr(SP sp)
+{
+ return ATTR(uint16_t(sp) - uint16_t(SP::USTR));
+}
+
+constexpr
+SP sp_to_usp(SP sp)
+{
+ return attr_to_usp(sp_to_attr(sp));
+}
+
+constexpr
+SP usp_to_sp(SP sp)
+{
+ return attr_to_sp(usp_to_attr(sp));
+}
+
+
+enum class LOOK : uint8_t
+{
+ BASE = 0,
+ HAIR = 1,
+ WEAPON = 2,
+ HEAD_BOTTOM = 3,
+ HEAD_TOP = 4,
+ HEAD_MID = 5,
+ HAIR_COLOR = 6,
+ CLOTHES_COLOR = 7,
+ SHIELD = 8,
+ SHOES = 9,
+ GLOVES = 10,
+ CAPE = 11,
+ MISC1 = 12,
+ MISC2 = 13,
+
+ COUNT,
+};
+
+enum class EQUIP
+{
+ NONE = -1,
+ MISC2 = 0,
+ CAPE = 1,
+ SHOES = 2,
+ GLOVES = 3,
+ LEGS = 4, // also called "head bottom"
+ TORSO = 5, // also called "head middle"
+ HAT = 6, // also called "head top"
+ MISC1 = 7,
+ SHIELD = 8,
+ WEAPON = 9,
+ ARROW = 10,
+ COUNT = 11,
+};
+
+constexpr
+EQUIP EQUIPs[] =
+{
+ EQUIP::MISC2,
+ EQUIP::CAPE,
+ EQUIP::SHOES,
+ EQUIP::GLOVES,
+ EQUIP::LEGS,
+ EQUIP::TORSO,
+ EQUIP::HAT,
+ EQUIP::MISC1,
+ EQUIP::SHIELD,
+ EQUIP::WEAPON,
+ EQUIP::ARROW,
+};
+
+constexpr
+EQUIP EQUIPs_noarrow[] =
+{
+ EQUIP::MISC2,
+ EQUIP::CAPE,
+ EQUIP::SHOES,
+ EQUIP::GLOVES,
+ EQUIP::LEGS,
+ EQUIP::TORSO,
+ EQUIP::HAT,
+ EQUIP::MISC1,
+ EQUIP::SHIELD,
+ EQUIP::WEAPON,
+};
+
+enum class ItemType : uint8_t
+{
+ USE = 0, // in eA, healing only
+ _1 = 1, // unused
+ _2 = 2, // in eA, other usable items
+ JUNK = 3, // "useless" items (e.g. quests)
+ WEAPON = 4, // all weapons
+ ARMOR = 5, // all other equipment
+ _6 = 6, // in eA, card
+ _7 = 7, // in eA, pet egg
+ _8 = 8, // in eA, pet equipment
+ _9 = 9, // unused
+ ARROW = 10, // ammo
+ _11 = 11, // in eA, delayed use (special script)
+};
+
+namespace e
+{
+enum class MobMode : uint16_t
+{
+ ZERO = 0x0000,
+
+ CAN_MOVE = 0x0001,
+ LOOTER = 0x0002,
+ AGGRESSIVE = 0x0004,
+ ASSIST = 0x0008,
+
+ CAST_SENSOR = 0x0010,
+ BOSS = 0x0020,
+ // sometimes also called "robust"
+ PLANT = 0x0040,
+ CAN_ATTACK = 0x0080,
+
+ DETECTOR = 0x0100,
+ CHANGE_TARGET = 0x0200,
+
+ war = CAN_MOVE | AGGRESSIVE | CAN_ATTACK,
+
+ SUMMONED = 0x1000,
+ TURNS_AGAINST_BAD_MASTER = 0x2000,
+
+ // mob mode flags that Fate actually understood
+ SENSIBLE_MASK = 0xf000,
+};
+
+ENUM_BITWISE_OPERATORS(MobMode)
+}
+using e::MobMode;
+
+namespace e
+{
+enum class MapCell : uint8_t
+{
+ // the usual thing
+ UNWALKABLE = 0x01,
+ // not in tmwa data
+ _range = 0x04,
+ // set in code, not imported
+ NPC_NEAR = 0x80,
+};
+ENUM_BITWISE_OPERATORS(MapCell)
+}
+using e::MapCell;
+
+#endif // MAP_T_HPP
diff --git a/src/map/mob.cpp b/src/map/mob.cpp
index c329a14..be9e71d 100644
--- a/src/map/mob.cpp
+++ b/src/map/mob.cpp
@@ -1,39 +1,36 @@
-// $Id: mob.c,v 1.7 2004/09/25 05:32:18 MouseJstr Exp $
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include "../common/timer.hpp"
-#include "../common/socket.hpp"
-#include "../common/db.hpp"
+#include "mob.hpp"
+
+#include <cassert>
+#include <cmath>
+#include <cstdlib>
+#include <cstring>
+
+#include <algorithm>
+
+#include "../common/cxxstdio.hpp"
+#include "../common/random.hpp"
#include "../common/nullpo.hpp"
-#include "../common/mt_rand.hpp"
-#include "map.hpp"
+#include "../common/socket.hpp"
+#include "../common/timer.hpp"
+
+#include "battle.hpp"
#include "clif.hpp"
-#include "intif.hpp"
-#include "pc.hpp"
-#include "mob.hpp"
-#include "guild.hpp"
#include "itemdb.hpp"
-#include "skill.hpp"
-#include "battle.hpp"
-#include "party.hpp"
+#include "map.hpp"
#include "npc.hpp"
+#include "party.hpp"
+#include "pc.hpp"
+#include "skill.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
-
-#ifndef max
-#define max( a, b ) ( ((a) > (b)) ? (a) : (b) )
-#endif
+#include "../poison.hpp"
-#define MIN_MOBTHINKTIME 100
+constexpr interval_t MIN_MOBTHINKTIME = std::chrono::milliseconds(100);
-#define MOB_LAZYMOVEPERC 50 // Move probability in the negligent mode MOB (rate of 1000 minute)
-#define MOB_LAZYWARPPERC 20 // Warp probability in the negligent mode MOB (rate of 1000 minute)
+// Move probability in the negligent mode MOB (rate of 1000 minute)
+constexpr random_::Fraction MOB_LAZYMOVEPERC {50, 1000};
+// Warp probability in the negligent mode MOB (rate of 1000 minute)
+constexpr random_::Fraction MOB_LAZYWARPPERC {20, 1000};
struct mob_db mob_db[2001];
@@ -41,29 +38,30 @@ struct mob_db mob_db[2001];
* Local prototype declaration (only required thing)
*------------------------------------------
*/
-static int distance (int, int, int, int);
-static int mob_makedummymobdb (int);
-static void mob_timer (timer_id, tick_t, custom_id_t, custom_data_t);
-int mobskill_deltimer (struct mob_data *md);
-int mob_skillid2skillidx (int mob_class, int skillid);
-int mobskill_use_id (struct mob_data *md, struct block_list *target,
- int skill_idx);
-static int mob_unlocktarget (struct mob_data *md, int tick);
+static
+int distance(int, int, int, int);
+static
+int mob_makedummymobdb(int);
+static
+void mob_timer(TimerData *, tick_t, int, unsigned char);
+static
+int mobskill_use_id(struct mob_data *md, struct block_list *target,
+ int skill_idx);
/*==========================================
* Mob is searched with a name.
*------------------------------------------
*/
-int mobdb_searchname (const char *str)
+int mobdb_searchname(const char *str)
{
- int i;
+ int i;
- for (i = 0; i < sizeof (mob_db) / sizeof (mob_db[0]); i++)
+ for (i = 0; i < sizeof(mob_db) / sizeof(mob_db[0]); i++)
{
- if (strcasecmp (mob_db[i].name, str) == 0
- || strcmp (mob_db[i].jname, str) == 0
- || memcmp (mob_db[i].name, str, 24) == 0
- || memcmp (mob_db[i].jname, str, 24) == 0)
+ if (strcasecmp(mob_db[i].name, str) == 0
+ || strcmp(mob_db[i].jname, str) == 0
+ || memcmp(mob_db[i].name, str, 24) == 0
+ || memcmp(mob_db[i].jname, str, 24) == 0)
return i;
}
@@ -74,45 +72,46 @@ int mobdb_searchname (const char *str)
* Id Mob is checked.
*------------------------------------------
*/
-int mobdb_checkid (const int id)
+int mobdb_checkid(const int id)
{
- if (id <= 0 || id >= (sizeof (mob_db) / sizeof (mob_db[0]))
+ if (id <= 0 || id >= (sizeof(mob_db) / sizeof(mob_db[0]))
|| mob_db[id].name[0] == '\0')
return 0;
return id;
}
-static void mob_init (struct mob_data *md);
+static
+void mob_init(struct mob_data *md);
/*==========================================
* The minimum data set for MOB spawning
*------------------------------------------
*/
static
-int mob_spawn_dataset (struct mob_data *md, const char *mobname, int mob_class)
+int mob_spawn_dataset(struct mob_data *md, const char *mobname, int mob_class)
{
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if (strcmp (mobname, "--en--") == 0)
- memcpy (md->name, mob_db[mob_class].name, 24);
- else if (strcmp (mobname, "--ja--") == 0)
- memcpy (md->name, mob_db[mob_class].jname, 24);
+ if (strcmp(mobname, "--en--") == 0)
+ memcpy(md->name, mob_db[mob_class].name, 24);
+ else if (strcmp(mobname, "--ja--") == 0)
+ memcpy(md->name, mob_db[mob_class].jname, 24);
else
- memcpy (md->name, mobname, 24);
+ memcpy(md->name, mobname, 24);
md->bl.prev = NULL;
md->bl.next = NULL;
md->n = 0;
- md->base_class = md->mob_class = mob_class;
- md->bl.id = npc_get_new_npc_id ();
+ md->mob_class = mob_class;
+ md->bl.id = npc_get_new_npc_id();
- memset (&md->state, 0, sizeof (md->state));
- md->timer = -1;
+ memset(&md->state, 0, sizeof(md->state));
+ // md->timer = nullptr;
md->target_id = 0;
md->attacked_id = 0;
- mob_init (md);
+ mob_init(md);
return 0;
}
@@ -120,41 +119,45 @@ int mob_spawn_dataset (struct mob_data *md, const char *mobname, int mob_class)
// Mutation values indicate how `valuable' a change to each stat is, XP wise.
// For one 256th of change, we give out that many 1024th fractions of XP change
// (i.e., 1024 means a 100% XP increase for a single point of adjustment, 4 means 100% XP bonus for doubling the value)
-static int mutation_value[MOB_XP_BONUS] = {
- 2, // MOB_LV
- 3, // MOB_MAX_HP
- 1, // MOB_STR
- 2, // MOB_AGI
- 1, // MOB_VIT
- 0, // MOB_INT
- 2, // MOB_DEX
- 2, // MOB_LUK
- 1, // MOB_ATK1
- 1, // MOB_ATK2
- 2, // MOB_ADELAY
- 2, // MOB_DEF
- 2, // MOB_MDEF
- 2, // MOB_SPEED
-};
+static
+earray<int, mob_stat, mob_stat::XP_BONUS> mutation_value //=
+{{
+ 2, // mob_stat::LV
+ 3, // mob_stat::MAX_HP
+ 1, // mob_stat::STR
+ 2, // mob_stat::AGI
+ 1, // mob_stat::VIT
+ 0, // mob_stat::INT
+ 2, // mob_stat::DEX
+ 2, // mob_stat::LUK
+ 1, // mob_stat::ATK1
+ 1, // mob_stat::ATK2
+ 2, // mob_stat::ADELAY
+ 2, // mob_stat::DEF
+ 2, // mob_stat::MDEF
+ 2, // mob_stat::SPEED
+}};
// The mutation scale indicates how far `up' we can go, with 256 indicating 100% Note that this may stack with multiple
// calls to `mutate'.
-static int mutation_scale[MOB_XP_BONUS] = {
- 16, // MOB_LV
- 256, // MOB_MAX_HP
- 32, // MOB_STR
- 48, // MOB_AGI
- 48, // MOB_VIT
- 48, // MOB_INT
- 48, // MOB_DEX
- 64, // MOB_LUK
- 48, // MOB_ATK1
- 48, // MOB_ATK2
- 80, // MOB_ADELAY
- 48, // MOB_DEF
- 48, // MOB_MDEF
- 80, // MOB_SPEED
-};
+static
+earray<int, mob_stat, mob_stat::XP_BONUS> mutation_scale //=
+{{
+ 16, // mob_stat::LV
+ 256, // mob_stat::MAX_HP
+ 32, // mob_stat::STR
+ 48, // mob_stat::AGI
+ 48, // mob_stat::VIT
+ 48, // mob_stat::INT
+ 48, // mob_stat::DEX
+ 64, // mob_stat::LUK
+ 48, // mob_stat::ATK1
+ 48, // mob_stat::ATK2
+ 80, // mob_stat::ADELAY
+ 48, // mob_stat::DEF
+ 48, // mob_stat::MDEF
+ 80, // mob_stat::SPEED
+}};
// The table below indicates the `average' value for each of the statistics, or -1 if there is none.
// This average is used to determine XP modifications for mutations. The experience point bonus is
@@ -163,54 +166,58 @@ static int mutation_scale[MOB_XP_BONUS] = {
// (2) second, determine the absolute stat change
// (3) third, compute the percentage stat change relative to mutation_base (p1)
// (4) fourth, compute the XP mofication based on the smaller of (p0, p1).
-static int mutation_base[MOB_XP_BONUS] = {
- 30, // MOB_LV
- -1, // MOB_MAX_HP
- 20, // MOB_STR
- 20, // MOB_AGI
- 20, // MOB_VIT
- 20, // MOB_INT
- 20, // MOB_DEX
- 20, // MOB_LUK
- -1, // MOB_ATK1
- -1, // MOB_ATK2
- -1, // MOB_ADELAY
- -1, // MOB_DEF
- 20, // MOB_MDEF
- -1, // MOB_SPEED
-};
+static
+earray<int, mob_stat, mob_stat::XP_BONUS> mutation_base //=
+{{
+ 30, // mob_stat::LV
+ -1, // mob_stat::MAX_HP
+ 20, // mob_stat::STR
+ 20, // mob_stat::AGI
+ 20, // mob_stat::VIT
+ 20, // mob_stat::INT
+ 20, // mob_stat::DEX
+ 20, // mob_stat::LUK
+ -1, // mob_stat::ATK1
+ -1, // mob_stat::ATK2
+ -1, // mob_stat::ADELAY
+ -1, // mob_stat::DEF
+ 20, // mob_stat::MDEF
+ -1, // mob_stat::SPEED
+}};
/*========================================
* Mutates a MOB. For large `direction' values, calling this multiple times will give bigger XP boni.
*----------------------------------------
*/
-static void mob_mutate (struct mob_data *md, int stat, int intensity) // intensity: positive: strengthen, negative: weaken. 256 = 100%.
+// intensity: positive: strengthen, negative: weaken. 256 = 100%.
+static
+void mob_mutate(struct mob_data *md, mob_stat stat, int intensity)
{
- int old_stat;
- int new_stat;
- int real_intensity; // relative intensity
+ int old_stat;
+ int new_stat;
+ int real_intensity; // relative intensity
const int mut_base = mutation_base[stat];
- int sign = 1;
+ int sign = 1;
- if (!md || stat < 0 || stat >= MOB_XP_BONUS || intensity == 0)
+ if (!md || stat >= mob_stat::XP_BONUS || intensity == 0)
return;
while (intensity > mutation_scale[stat])
{
- mob_mutate (md, stat, mutation_scale[stat]); // give better XP assignments
+ mob_mutate(md, stat, mutation_scale[stat]); // give better XP assignments
intensity -= mutation_scale[stat];
}
while (intensity < -mutation_scale[stat])
{
- mob_mutate (md, stat, mutation_scale[stat]); // give better XP assignments
+ mob_mutate(md, stat, mutation_scale[stat]); // give better XP assignments
intensity += mutation_scale[stat];
}
if (!intensity)
return;
- // MOB_ADELAY and MOB_SPEED are special because going DOWN is good here.
- if (stat == MOB_ADELAY || stat == MOB_SPEED)
+ // mob_stat::ADELAY and mob_stat::SPEED are special because going DOWN is good here.
+ if (stat == mob_stat::ADELAY || stat == mob_stat::SPEED)
sign = -1;
// Now compute the new stat
@@ -229,7 +236,7 @@ static void mob_mutate (struct mob_data *md, int stat, int intensity) // inten
{
// Now compute the mutation intensity relative to an absolute value.
// Take the lesser of the two effects.
- int real_intensity2 = (((new_stat - old_stat) << 8) / mut_base);
+ int real_intensity2 = (((new_stat - old_stat) << 8) / mut_base);
if (real_intensity < 0)
if (real_intensity2 > real_intensity)
@@ -245,22 +252,22 @@ static void mob_mutate (struct mob_data *md, int stat, int intensity) // inten
md->stats[stat] = new_stat;
// Adjust XP value
- md->stats[MOB_XP_BONUS] += mutation_value[stat] * real_intensity;
- if (md->stats[MOB_XP_BONUS] <= 0)
- md->stats[MOB_XP_BONUS] = 1;
+ md->stats[mob_stat::XP_BONUS] += mutation_value[stat] * real_intensity;
+ if (md->stats[mob_stat::XP_BONUS] <= 0)
+ md->stats[mob_stat::XP_BONUS] = 1;
// Sanitise
- if (md->stats[MOB_ATK1] > md->stats[MOB_ATK2])
+ if (md->stats[mob_stat::ATK1] > md->stats[mob_stat::ATK2])
{
- int swap = md->stats[MOB_ATK2];
- md->stats[MOB_ATK2] = md->stats[MOB_ATK1];
- md->stats[MOB_ATK1] = swap;
+ int swap = md->stats[mob_stat::ATK2];
+ md->stats[mob_stat::ATK2] = md->stats[mob_stat::ATK1];
+ md->stats[mob_stat::ATK1] = swap;
}
}
// This calculates the exp of a given mob
static
-int mob_gen_exp (struct mob_db *mob)
+int mob_gen_exp(struct mob_db *mob)
{
if (mob->max_hp <= 1)
return 1;
@@ -268,70 +275,90 @@ int mob_gen_exp (struct mob_db *mob)
if (100 == mob->def)
mod_def = 1;
double effective_hp =
- ((50 - mob->luk) * mob->max_hp / 50.0) +
- (2 * mob->luk * mob->max_hp / mod_def);
+ ((50 - mob->attrs[ATTR::LUK]) * mob->max_hp / 50.0) +
+ (2 * mob->attrs[ATTR::LUK] * mob->max_hp / mod_def);
double attack_factor =
- (mob->atk1 + mob->atk2 + mob->str / 3.0 + mob->dex / 2.0 +
- mob->luk) * (1872.0 / mob->adelay) / 4;
+ (mob->atk1 + mob->atk2 + mob->attrs[ATTR::STR] / 3.0 + mob->attrs[ATTR::DEX] / 2.0 +
+ mob->attrs[ATTR::LUK]) * (1872.0 / mob->adelay) / 4;
double dodge_factor =
- pow (mob->lv + mob->agi + mob->luk / 2.0, 4.0 / 3.0);
+ pow(mob->lv + mob->attrs[ATTR::AGI] + mob->attrs[ATTR::LUK] / 2.0, 4.0 / 3.0);
+ // TODO s/persuit/pursuit/g sometime when I'm not worried about diffs
double persuit_factor =
- (3 + mob->range) * (mob->mode % 2) * 1000 / mob->speed;
- double aggression_factor = (mob->mode & 4) == 4 ? 10.0 / 9.0 : 1.0;
- int xp =
- (int) floor (effective_hp *
- pow (sqrt (attack_factor) + sqrt (dodge_factor) +
- sqrt (persuit_factor) + 55,
+ (3 + mob->range) * bool(mob->mode & MobMode::CAN_MOVE) * 1000 / mob->speed;
+ double aggression_factor =
+ bool(mob->mode & MobMode::AGGRESSIVE)
+ ? 10.0 / 9.0
+ : 1.0;
+ int xp =
+ (int) floor(effective_hp *
+ pow(sqrt(attack_factor) + sqrt(dodge_factor) +
+ sqrt(persuit_factor) + 55,
3) * aggression_factor / 2000000.0 *
(double) battle_config.base_exp_rate / 100.);
if (xp < 1)
xp = 1;
- printf ("Exp for mob '%s' generated: %d\n", mob->name, xp);
+ PRINTF("Exp for mob '%s' generated: %d\n", mob->name, xp);
return xp;
}
-static void mob_init (struct mob_data *md)
+static
+void mob_init(struct mob_data *md)
{
- int i;
+ int i;
const int mob_class = md->mob_class;
const int mutations_nr = mob_db[mob_class].mutations_nr;
const int mutation_power = mob_db[mob_class].mutation_power;
- md->stats[MOB_LV] = mob_db[mob_class].lv;
- md->stats[MOB_MAX_HP] = mob_db[mob_class].max_hp;
- md->stats[MOB_STR] = mob_db[mob_class].str;
- md->stats[MOB_AGI] = mob_db[mob_class].agi;
- md->stats[MOB_VIT] = mob_db[mob_class].vit;
- md->stats[MOB_INT] = mob_db[mob_class].int_;
- md->stats[MOB_DEX] = mob_db[mob_class].dex;
- md->stats[MOB_LUK] = mob_db[mob_class].luk;
- md->stats[MOB_ATK1] = mob_db[mob_class].atk1;
- md->stats[MOB_ATK2] = mob_db[mob_class].atk2;
- md->stats[MOB_ADELAY] = mob_db[mob_class].adelay;
- md->stats[MOB_DEF] = mob_db[mob_class].def;
- md->stats[MOB_MDEF] = mob_db[mob_class].mdef;
- md->stats[MOB_SPEED] = mob_db[mob_class].speed;
- md->stats[MOB_XP_BONUS] = MOB_XP_BONUS_BASE;
+ md->stats[mob_stat::LV] = mob_db[mob_class].lv;
+ md->stats[mob_stat::MAX_HP] = mob_db[mob_class].max_hp;
+ md->stats[mob_stat::STR] = mob_db[mob_class].attrs[ATTR::STR];
+ md->stats[mob_stat::AGI] = mob_db[mob_class].attrs[ATTR::AGI];
+ md->stats[mob_stat::VIT] = mob_db[mob_class].attrs[ATTR::VIT];
+ md->stats[mob_stat::INT] = mob_db[mob_class].attrs[ATTR::INT];
+ md->stats[mob_stat::DEX] = mob_db[mob_class].attrs[ATTR::DEX];
+ md->stats[mob_stat::LUK] = mob_db[mob_class].attrs[ATTR::LUK];
+ md->stats[mob_stat::ATK1] = mob_db[mob_class].atk1;
+ md->stats[mob_stat::ATK2] = mob_db[mob_class].atk2;
+ md->stats[mob_stat::ADELAY] = mob_db[mob_class].adelay;
+ md->stats[mob_stat::DEF] = mob_db[mob_class].def;
+ md->stats[mob_stat::MDEF] = mob_db[mob_class].mdef;
+ md->stats[mob_stat::SPEED] = mob_db[mob_class].speed;
+ md->stats[mob_stat::XP_BONUS] = MOB_XP_BONUS_BASE;
for (i = 0; i < mutations_nr; i++)
{
- int stat_nr = MRAND (MOB_XP_BONUS + 1);
- int strength;
-
- if (stat_nr >= MOB_XP_BONUS)
- stat_nr = MOB_MAX_HP;
-
- strength =
- ((MRAND ((mutation_power >> 1)) +
- (MRAND ((mutation_power >> 1))) +
- 2) * mutation_scale[stat_nr]) / 100;
-
- strength = MRAND (2) ? strength : -strength;
+ mob_stat stat_nr = random_::choice({
+ mob_stat::LV,
+ mob_stat::MAX_HP,
+ mob_stat::STR,
+ mob_stat::AGI,
+ mob_stat::VIT,
+ mob_stat::INT,
+ mob_stat::DEX,
+ mob_stat::LUK,
+ mob_stat::ATK1,
+ mob_stat::ATK2,
+ mob_stat::ADELAY,
+ mob_stat::DEF,
+ mob_stat::MDEF,
+ mob_stat::SPEED,
+ // double chance to modify hp
+ mob_stat::MAX_HP,
+ });
+ // TODO: if I don't remove this entirely, look into
+ // normal distributions.
+ int strength = (random_::to(mutation_power / 2)
+ + random_::to(mutation_power / 2)
+ + 2)
+ * mutation_scale[stat_nr] / 100;
+
+ if (random_::coin())
+ strength = -strength;
if (strength < -240)
strength = -240; /* Don't go too close to zero */
- mob_mutate (md, stat_nr, strength);
+ mob_mutate(md, stat_nr, strength);
}
}
@@ -339,53 +366,21 @@ static void mob_init (struct mob_data *md)
* The MOB appearance for one time (for scripts)
*------------------------------------------
*/
-int mob_once_spawn (struct map_session_data *sd, const char *mapname,
+int mob_once_spawn(struct map_session_data *sd, const char *mapname,
int x, int y, const char *mobname, int mob_class, int amount,
const char *event)
{
struct mob_data *md = NULL;
- int m, count, lv = 255, r = mob_class;
-
- if (sd)
- lv = sd->status.base_level;
+ int m, count, r = mob_class;
- if (sd && strcmp (mapname, "this") == 0)
+ if (sd && strcmp(mapname, "this") == 0)
m = sd->bl.m;
else
- m = map_mapname2mapid (mapname);
+ m = map_mapname2mapid(mapname);
if (m < 0 || amount <= 0 || (mob_class >= 0 && mob_class <= 1000) || mob_class > 2000) // 値が異常なら召喚を止める
return 0;
- if (mob_class < 0)
- { // ランダムに召喚
- int i = 0;
- int j = -mob_class - 1;
- int k;
- if (j >= 0 && j < MAX_RANDOMMONSTER)
- {
- do
- {
- mob_class = MPRAND (1001, 1000);
- k = MRAND (1000000);
- }
- while ((mob_db[mob_class].max_hp <= 0
- || mob_db[mob_class].summonper[j] <= k
- || (lv < mob_db[mob_class].lv
- && battle_config.random_monster_checklv == 1))
- && (i++) < 2000);
- if (i >= 2000)
- {
- mob_class = mob_db[0].summonper[j];
- }
- }
- else
- {
- return 0;
- }
-// if(battle_config.etc_log==1)
-// printf("mobmob_class=%d try=%d\n",mob_class,i);
- }
if (sd)
{
if (x <= 0)
@@ -395,48 +390,38 @@ int mob_once_spawn (struct map_session_data *sd, const char *mapname,
}
else if (x <= 0 || y <= 0)
{
- printf ("mob_once_spawn: ??\n");
+ PRINTF("mob_once_spawn: ??\n");
}
for (count = 0; count < amount; count++)
{
- md = (struct mob_data *) calloc (1, sizeof (struct mob_data));
- if (mob_db[mob_class].mode & 0x02)
+ md = (struct mob_data *) calloc(1, sizeof(struct mob_data));
+ if (bool(mob_db[mob_class].mode & MobMode::LOOTER))
md->lootitem =
- (struct item *) calloc (LOOTITEM_SIZE, sizeof (struct item));
+ (struct item *) calloc(LOOTITEM_SIZE, sizeof(struct item));
else
md->lootitem = NULL;
- mob_spawn_dataset (md, mobname, mob_class);
+ mob_spawn_dataset(md, mobname, mob_class);
md->bl.m = m;
md->bl.x = x;
md->bl.y = y;
if (r < 0 && battle_config.dead_branch_active == 1)
- md->mode = 0x1 + 0x4 + 0x80; //移動してアクティブで反撃する
+ //移動してアクティブで反撃する
+ md->mode = MobMode::war;
md->m = m;
md->x0 = x;
md->y0 = y;
md->xs = 0;
md->ys = 0;
- md->spawndelay1 = -1; // Only once is a flag.
- md->spawndelay2 = -1; // Only once is a flag.
-
- memcpy (md->npc_event, event, sizeof (md->npc_event));
+ md->spawndelay1 = static_cast<interval_t>(-1); // Only once is a flag.
+ md->spawndelay2 = static_cast<interval_t>(-1); // Only once is a flag.
- md->bl.type = BL_MOB;
- map_addiddb (&md->bl);
- mob_spawn (md->bl.id);
-
- if (mob_class == 1288)
- { // emperium hp based on defense level [Valaris]
- struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name);
- if (gc)
- {
- mob_db[mob_class].max_hp += 2000 * gc->defense;
- md->hp = mob_db[mob_class].max_hp;
- }
- } // end addition [Valaris]
+ memcpy(md->npc_event, event, sizeof(md->npc_event));
+ md->bl.type = BL::MOB;
+ map_addiddb(&md->bl);
+ mob_spawn(md->bl.id);
}
return (amount > 0) ? md->bl.id : 0;
}
@@ -445,18 +430,18 @@ int mob_once_spawn (struct map_session_data *sd, const char *mapname,
* The MOB appearance for one time (& area specification for scripts)
*------------------------------------------
*/
-int mob_once_spawn_area (struct map_session_data *sd, const char *mapname,
+int mob_once_spawn_area(struct map_session_data *sd, const char *mapname,
int x0, int y0, int x1, int y1,
const char *mobname, int mob_class, int amount,
const char *event)
{
- int x, y, i, c, max, lx = -1, ly = -1, id = 0;
- int m;
+ int x, y, i, max, lx = -1, ly = -1, id = 0;
+ int m;
- if (strcmp (mapname, "this") == 0)
+ if (strcmp(mapname, "this") == 0)
m = sd->bl.m;
else
- m = map_mapname2mapid (mapname);
+ m = map_mapname2mapid(mapname);
max = (y1 - y0 + 1) * (x1 - x0 + 1) * 3;
if (max > 1000)
@@ -467,13 +452,14 @@ int mob_once_spawn_area (struct map_session_data *sd, const char *mapname,
for (i = 0; i < amount; i++)
{
- int j = 0;
+ int j = 0;
do
{
- x = MPRAND (x0, (x1 - x0 + 1));
- y = MPRAND (y0, (y1 - y0 + 1));
+ x = random_::in(x0, x1);
+ y = random_::in(y0, y1);
}
- while (((c = map_getcell (m, x, y)) == 1 || c == 5) && (++j) < max);
+ while (bool(map_getcell(m, x, y) & MapCell::UNWALKABLE)
+ && (++j) < max);
if (j >= max)
{
if (lx >= 0)
@@ -484,178 +470,60 @@ int mob_once_spawn_area (struct map_session_data *sd, const char *mapname,
else
return 0; // Since reference of the place which boils first went wrong, it stops.
}
- id = mob_once_spawn (sd, mapname, x, y, mobname, mob_class, 1, event);
+ id = mob_once_spawn(sd, mapname, x, y, mobname, mob_class, 1, event);
lx = x;
ly = y;
}
return id;
}
-/*==========================================
- * Summoning Guardians [Valaris]
- *------------------------------------------
- */
-int mob_spawn_guardian (struct map_session_data *sd, const char *mapname,
- int x, int y, const char *mobname, int mob_class,
- int amount, const char *event, int guardian)
-{
- struct mob_data *md = NULL;
- int m, count = 1, lv = 255;
-
- if (sd)
- lv = sd->status.base_level;
-
- if (sd && strcmp (mapname, "this") == 0)
- m = sd->bl.m;
- else
- m = map_mapname2mapid (mapname);
-
- if (m < 0 || amount <= 0 || (mob_class >= 0 && mob_class <= 1000) || mob_class > 2000) // 値が異常なら召喚を止める
- return 0;
-
- if (mob_class < 0)
- return 0;
-
- if (sd)
- {
- if (x <= 0)
- x = sd->bl.x;
- if (y <= 0)
- y = sd->bl.y;
- }
-
- else if (x <= 0 || y <= 0)
- printf ("mob_spawn_guardian: ??\n");
-
- for (count = 0; count < amount; count++)
- {
- struct guild_castle *gc;
- CREATE (md, struct mob_data, 1);
-
- mob_spawn_dataset (md, mobname, mob_class);
- md->bl.m = m;
- md->bl.x = x;
- md->bl.y = y;
- md->m = m;
- md->x0 = x;
- md->y0 = y;
- md->xs = 0;
- md->ys = 0;
- md->spawndelay1 = -1; // Only once is a flag.
- md->spawndelay2 = -1; // Only once is a flag.
-
- memcpy (md->npc_event, event, sizeof (md->npc_event));
-
- md->bl.type = BL_MOB;
- map_addiddb (&md->bl);
- mob_spawn (md->bl.id);
-
- gc = guild_mapname2gc (map[md->bl.m].name);
- if (gc)
- {
- mob_db[mob_class].max_hp += 2000 * gc->defense;
- if (guardian == 0)
- {
- md->hp = gc->Ghp0;
- gc->GID0 = md->bl.id;
- }
- if (guardian == 1)
- {
- md->hp = gc->Ghp1;
- gc->GID1 = md->bl.id;
- }
- if (guardian == 2)
- {
- md->hp = gc->Ghp2;
- gc->GID2 = md->bl.id;
- }
- if (guardian == 3)
- {
- md->hp = gc->Ghp3;
- gc->GID3 = md->bl.id;
- }
- if (guardian == 4)
- {
- md->hp = gc->Ghp4;
- gc->GID4 = md->bl.id;
- }
- if (guardian == 5)
- {
- md->hp = gc->Ghp5;
- gc->GID5 = md->bl.id;
- }
- if (guardian == 6)
- {
- md->hp = gc->Ghp6;
- gc->GID6 = md->bl.id;
- }
- if (guardian == 7)
- {
- md->hp = gc->Ghp7;
- gc->GID7 = md->bl.id;
- }
-
- }
- }
-
- return (amount > 0) ? md->bl.id : 0;
-}
-
-/*==========================================
- * Appearance income of mob
- *------------------------------------------
- */
-int mob_get_viewclass (int mob_class)
-{
- return mob_db[mob_class].view_class;
-}
-
-int mob_get_sex (int mob_class)
+// TODO: deprecate these
+int mob_get_sex(int mob_class)
{
return mob_db[mob_class].sex;
}
-short mob_get_hair (int mob_class)
+short mob_get_hair(int mob_class)
{
return mob_db[mob_class].hair;
}
-short mob_get_hair_color (int mob_class)
+short mob_get_hair_color(int mob_class)
{
return mob_db[mob_class].hair_color;
}
-short mob_get_weapon (int mob_class)
+short mob_get_weapon(int mob_class)
{
return mob_db[mob_class].weapon;
}
-short mob_get_shield (int mob_class)
+short mob_get_shield(int mob_class)
{
return mob_db[mob_class].shield;
}
-short mob_get_head_top (int mob_class)
+short mob_get_head_top(int mob_class)
{
return mob_db[mob_class].head_top;
}
-short mob_get_head_mid (int mob_class)
+short mob_get_head_mid(int mob_class)
{
return mob_db[mob_class].head_mid;
}
-short mob_get_head_buttom (int mob_class)
+short mob_get_head_buttom(int mob_class)
{
return mob_db[mob_class].head_buttom;
}
-short mob_get_clothes_color (int mob_class) // Add for player monster dye - Valaris
+short mob_get_clothes_color(int mob_class) // Add for player monster dye - Valaris
{
return mob_db[mob_class].clothes_color; // End
}
-int mob_get_equip (int mob_class) // mob equip [Valaris]
+int mob_get_equip(int mob_class) // mob equip [Valaris]
{
return mob_db[mob_class].equip;
}
@@ -665,19 +533,12 @@ int mob_get_equip (int mob_class) // mob equip [Valaris]
*------------------------------------------
*/
static
-int mob_can_move (struct mob_data *md)
+int mob_can_move(struct mob_data *md)
{
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if (md->canmove_tick > gettick () || (md->opt1 > 0 && md->opt1 != 6)
- || md->option & 2)
- 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 //スパイダーウェッブ
- )
+ if (md->canmove_tick > gettick()
+ || (bool(md->opt1) && md->opt1 != Opt1::_stone6))
return 0;
return 1;
@@ -687,34 +548,34 @@ int mob_can_move (struct mob_data *md)
* Time calculation concerning one step next to mob
*------------------------------------------
*/
-static int calc_next_walk_step (struct mob_data *md)
+static
+interval_t calc_next_walk_step(struct mob_data *md)
{
- nullpo_retr (0, md);
+ nullpo_retr(interval_t::zero(), md);
if (md->walkpath.path_pos >= md->walkpath.path_len)
- return -1;
- if (md->walkpath.path[md->walkpath.path_pos] & 1)
- return battle_get_speed (&md->bl) * 14 / 10;
- return battle_get_speed (&md->bl);
+ return static_cast<interval_t>(-1);
+ if (dir_is_diagonal(md->walkpath.path[md->walkpath.path_pos]))
+ return battle_get_speed(&md->bl) * 14 / 10;
+ return battle_get_speed(&md->bl);
}
-static int mob_walktoxy_sub (struct mob_data *md);
+static
+int mob_walktoxy_sub(struct mob_data *md);
/*==========================================
* Mob Walk processing
*------------------------------------------
*/
-static int mob_walk (struct mob_data *md, unsigned int tick, int data)
+static
+int mob_walk(struct mob_data *md, tick_t tick, unsigned char data)
{
- int moveblock;
- int i, ctype;
- static int dirx[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
- static int diry[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
- int x, y, dx, dy;
+ int moveblock;
+ int x, y, dx, dy;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- md->state.state = MS_IDLE;
+ md->state.state = MS::IDLE;
if (md->walkpath.path_pos >= md->walkpath.path_len
|| md->walkpath.path_pos != data)
return 0;
@@ -725,41 +586,41 @@ static int mob_walk (struct mob_data *md, unsigned int tick, int data)
md->walkpath.path_pos++;
if (md->state.change_walk_target)
{
- mob_walktoxy_sub (md);
+ mob_walktoxy_sub(md);
return 0;
}
}
else
{
- if (md->walkpath.path[md->walkpath.path_pos] >= 8)
+ if (md->walkpath.path[md->walkpath.path_pos] >= DIR::COUNT)
return 1;
x = md->bl.x;
y = md->bl.y;
- ctype = map_getcell (md->bl.m, x, y);
- if (ctype == 1 || ctype == 5)
+ if (bool(map_getcell(md->bl.m, x, y) & MapCell::UNWALKABLE))
{
- mob_stop_walking (md, 1);
+ mob_stop_walking(md, 1);
return 0;
}
md->dir = md->walkpath.path[md->walkpath.path_pos];
dx = dirx[md->dir];
dy = diry[md->dir];
- ctype = map_getcell (md->bl.m, x + dx, y + dy);
- if (ctype == 1 || ctype == 5)
+ if (bool(map_getcell(md->bl.m, x + dx, y + dy)
+ & MapCell::UNWALKABLE))
{
- mob_walktoxy_sub (md);
+ mob_walktoxy_sub(md);
return 0;
}
moveblock = (x / BLOCK_SIZE != (x + dx) / BLOCK_SIZE
|| y / BLOCK_SIZE != (y + dy) / BLOCK_SIZE);
- md->state.state = MS_WALK;
- map_foreachinmovearea (clif_moboutsight, md->bl.m, x - AREA_SIZE,
- y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE,
- dx, dy, BL_PC, md);
+ md->state.state = MS::WALK;
+ map_foreachinmovearea(std::bind(clif_moboutsight, ph::_1, md),
+ md->bl.m, x - AREA_SIZE, y - AREA_SIZE,
+ x + AREA_SIZE, y + AREA_SIZE,
+ dx, dy, BL::PC);
x += dx;
y += dy;
@@ -767,33 +628,31 @@ static int mob_walk (struct mob_data *md, unsigned int tick, int data)
md->min_chase--;
if (moveblock)
- map_delblock (&md->bl);
+ map_delblock(&md->bl);
md->bl.x = x;
md->bl.y = y;
if (moveblock)
- map_addblock (&md->bl);
-
- map_foreachinmovearea (clif_mobinsight, md->bl.m, x - AREA_SIZE,
- y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE,
- -dx, -dy, BL_PC, md);
- md->state.state = MS_IDLE;
+ map_addblock(&md->bl);
- if (md->option & 4)
- skill_check_cloaking (&md->bl);
-
- skill_unit_move (&md->bl, tick, 1); // Inspection of a skill unit
+ map_foreachinmovearea(std::bind(clif_mobinsight, ph::_1, md),
+ md->bl.m, x - AREA_SIZE, y - AREA_SIZE,
+ x + AREA_SIZE, y + AREA_SIZE,
+ -dx, -dy, BL::PC);
+ md->state.state = MS::IDLE;
}
- if ((i = calc_next_walk_step (md)) > 0)
+ interval_t i = calc_next_walk_step(md);
+ if (i > interval_t::zero())
{
- i = i >> 1;
- if (i < 1 && md->walkpath.path_half == 0)
- i = 1;
- md->timer =
- add_timer (tick + i, mob_timer, md->bl.id, md->walkpath.path_pos);
- md->state.state = MS_WALK;
+ i = i / 2;
+ if (md->walkpath.path_half == 0)
+ i = std::max(i, std::chrono::milliseconds(1));
+ md->timer = Timer(tick + i,
+ std::bind(mob_timer, ph::_1, ph::_2,
+ md->bl.id, md->walkpath.path_pos));
+ md->state.state = MS::WALK;
if (md->walkpath.path_pos >= md->walkpath.path_len)
- clif_fixmobpos (md); // When mob stops, retransmission current of a position.
+ clif_fixmobpos(md); // When mob stops, retransmission current of a position.
}
return 0;
}
@@ -802,152 +661,145 @@ static int mob_walk (struct mob_data *md, unsigned int tick, int data)
* Check if mob should be attempting to attack
*------------------------------------------
*/
-static int mob_check_attack (struct mob_data *md)
+static
+int mob_check_attack(struct mob_data *md)
{
struct block_list *tbl = NULL;
struct map_session_data *tsd = NULL;
struct mob_data *tmd = NULL;
- int mode, race, range;
+ MobMode mode;
+ int range;
- nullpo_retr (0, md);
+ nullpo_ret(md);
md->min_chase = 13;
- md->state.state = MS_IDLE;
- md->state.skillstate = MSS_IDLE;
+ md->state.state = MS::IDLE;
+ md->state.skillstate = MobSkillState::MSS_IDLE;
- if (md->skilltimer != -1)
+ if (md->skilltimer)
return 0;
- if (md->opt1 > 0 || md->option & 2)
+ if (bool(md->opt1))
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)
+ if ((tbl = map_id2bl(md->target_id)) == NULL)
{
md->target_id = 0;
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
return 0;
}
- if (tbl->type == BL_PC)
+ if (tbl->type == BL::PC)
tsd = (struct map_session_data *) tbl;
- else if (tbl->type == BL_MOB)
+ else if (tbl->type == BL::MOB)
tmd = (struct mob_data *) tbl;
else
return 0;
if (tsd)
{
- if (pc_isdead (tsd) || tsd->invincible_timer != -1
- || pc_isinvisible (tsd) || md->bl.m != tbl->m || tbl->prev == NULL
- || distance (md->bl.x, md->bl.y, tbl->x, tbl->y) >= 13)
+ if (pc_isdead(tsd) || tsd->invincible_timer
+ || pc_isinvisible(tsd) || md->bl.m != tbl->m || tbl->prev == NULL
+ || distance(md->bl.x, md->bl.y, tbl->x, tbl->y) >= 13)
{
md->target_id = 0;
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
return 0;
}
}
if (tmd)
{
if (md->bl.m != tbl->m || tbl->prev == NULL
- || distance (md->bl.x, md->bl.y, tbl->x, tbl->y) >= 13)
+ || distance(md->bl.x, md->bl.y, tbl->x, tbl->y) >= 13)
{
md->target_id = 0;
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
return 0;
}
}
- if (!md->mode)
+ if (md->mode == MobMode::ZERO)
mode = mob_db[md->mob_class].mode;
else
mode = md->mode;
- race = mob_db[md->mob_class].race;
- if (!(mode & 0x80))
+ Race race = mob_db[md->mob_class].race;
+ if (!bool(mode & MobMode::CAN_ATTACK))
{
md->target_id = 0;
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
return 0;
}
- if (tsd && !(mode & 0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 ||
- ((pc_ishiding (tsd)
- || tsd->state.gangsterparadise)
- && race != 4 && race != 6)))
+ if (tsd
+ && !bool(mode & MobMode::BOSS)
+ && (tsd->state.gangsterparadise
+ && race != Race::_insect
+ && race != Race::_demon))
{
md->target_id = 0;
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
return 0;
}
range = mob_db[md->mob_class].range;
- if (mode & 1)
+ if (bool(mode & MobMode::CAN_MOVE))
range++;
- if (distance (md->bl.x, md->bl.y, tbl->x, tbl->y) > range)
+ if (distance(md->bl.x, md->bl.y, tbl->x, tbl->y) > range)
return 0;
return 1;
}
-static int mob_ancillary_attack(struct block_list *bl, va_list ap)
+static
+void mob_ancillary_attack(struct block_list *bl,
+ struct block_list *mdbl, struct block_list *tbl, tick_t tick)
{
- struct block_list *mdbl = va_arg(ap, struct block_list *);
- struct block_list *tbl = va_arg(ap, struct block_list *);
- unsigned int tick = va_arg(ap, unsigned int);
if (bl != tbl)
- battle_weapon_attack(mdbl, bl, tick, 0);
- return 0;
+ battle_weapon_attack(mdbl, bl, tick);
}
/*==========================================
* Attack processing of mob
*------------------------------------------
*/
-static int mob_attack (struct mob_data *md, unsigned int tick, int data)
+static
+int mob_attack(struct mob_data *md, tick_t tick)
{
struct block_list *tbl = NULL;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if ((tbl = map_id2bl (md->target_id)) == NULL)
+ if ((tbl = map_id2bl(md->target_id)) == NULL)
return 0;
- if (!mob_check_attack (md))
+ if (!mob_check_attack(md))
return 0;
if (battle_config.monster_attack_direction_change)
- md->dir = map_calc_dir (&md->bl, tbl->x, tbl->y); // 向き設定
+ md->dir = map_calc_dir(&md->bl, tbl->x, tbl->y); // 向き設定
//clif_fixmobpos(md);
- md->state.skillstate = MSS_ATTACK;
- if (mobskill_use (md, tick, -2)) // スキル使用
+ md->state.skillstate = MobSkillState::MSS_ATTACK;
+ if (mobskill_use(md, tick, MobSkillCondition::NEVER_EQUAL))
return 0;
- md->target_lv = battle_weapon_attack (&md->bl, tbl, tick, 0);
+ md->target_lv = battle_weapon_attack(&md->bl, tbl, tick);
// If you are reading this, please note:
// it is highly platform-specific that this even works at all.
int radius = battle_config.mob_splash_radius;
- if (radius >= 0 && tbl->type == BL_PC && !map[tbl->m].flag.town)
- map_foreachinarea(mob_ancillary_attack,
- tbl->m, tbl->x - radius, tbl->y - radius, tbl->x + radius, tbl->y + radius,
- BL_PC,
- &md->bl, tbl, tick);
-
- if (!(battle_config.monster_cloak_check_type & 2)
- && md->sc_data[SC_CLOAKING].timer != -1)
- skill_status_change_end (&md->bl, SC_CLOAKING, -1);
+ if (radius >= 0 && tbl->type == BL::PC && !map[tbl->m].flag.town)
+ map_foreachinarea(std::bind(mob_ancillary_attack, ph::_1, &md->bl, tbl, tick),
+ tbl->m, tbl->x - radius, tbl->y - radius,
+ tbl->x + radius, tbl->y + radius, BL::PC);
- md->attackabletime = tick + battle_get_adelay (&md->bl);
+ md->attackabletime = tick + battle_get_adelay(&md->bl);
- md->timer = add_timer (md->attackabletime, mob_timer, md->bl.id, 0);
- md->state.state = MS_ATTACK;
+ md->timer = Timer(md->attackabletime,
+ std::bind(mob_timer, ph::_1, ph::_2,
+ md->bl.id, 0));
+ md->state.state = MS::ATTACK;
return 0;
}
@@ -958,86 +810,78 @@ static int mob_attack (struct mob_data *md, unsigned int tick, int data)
*------------------------------------------
*/
static
-int mob_stopattacked (struct map_session_data *sd, va_list ap)
+void mob_stopattacked(struct map_session_data *sd, int id)
{
- int id;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, ap);
+ nullpo_retv(sd);
- id = va_arg (ap, int);
if (sd->attacktarget == id)
- pc_stopattack (sd);
- return 0;
+ pc_stopattack(sd);
}
/*==========================================
* The timer in which the mob's states changes
*------------------------------------------
*/
-int mob_changestate (struct mob_data *md, int state, int type)
+static
+int mob_changestate(struct mob_data *md, MS state, bool type)
{
- unsigned int tick;
- int i;
-
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if (md->timer != -1)
- delete_timer (md->timer, mob_timer);
- md->timer = -1;
+ md->timer.cancel();
md->state.state = state;
switch (state)
{
- case MS_WALK:
- if ((i = calc_next_walk_step (md)) > 0)
+ case MS::WALK:
+ {
+ interval_t i = calc_next_walk_step(md);
+ if (i > interval_t::zero())
{
- i = i >> 2;
- md->timer =
- add_timer (gettick () + i, mob_timer, md->bl.id, 0);
+ i = i / 4;
+ md->timer = Timer(gettick() + i,
+ std::bind(mob_timer, ph::_1, ph::_2,
+ md->bl.id, 0));
}
else
- md->state.state = MS_IDLE;
+ md->state.state = MS::IDLE;
+ }
break;
- case MS_ATTACK:
- tick = gettick ();
- i = DIFF_TICK (md->attackabletime, tick);
- if (i > 0 && i < 2000)
- md->timer =
- add_timer (md->attackabletime, mob_timer, md->bl.id, 0);
+ case MS::ATTACK:
+ {
+ tick_t tick = gettick();
+ interval_t i = md->attackabletime - tick;
+ if (i > interval_t::zero() && i < std::chrono::seconds(2))
+ md->timer = Timer(md->attackabletime,
+ std::bind(mob_timer, ph::_1, ph::_2,
+ md->bl.id, 0));
else if (type)
{
- md->attackabletime = tick + battle_get_amotion (&md->bl);
- md->timer =
- add_timer (md->attackabletime, mob_timer, md->bl.id, 0);
+ md->attackabletime = tick + battle_get_amotion(&md->bl);
+ md->timer = Timer(md->attackabletime,
+ std::bind(mob_timer, ph::_1, ph::_2,
+ md->bl.id, 0));
}
else
{
- md->attackabletime = tick + 1;
- md->timer =
- add_timer (md->attackabletime, mob_timer, md->bl.id, 0);
+ md->attackabletime = tick + std::chrono::milliseconds(1);
+ md->timer = Timer(md->attackabletime,
+ std::bind(mob_timer, ph::_1, ph::_2,
+ md->bl.id, 0));
}
+ }
break;
- case MS_DELAY:
- md->timer =
- add_timer (gettick () + type, mob_timer, md->bl.id, 0);
- break;
- case MS_DEAD:
- skill_castcancel (&md->bl, 0);
-// mobskill_deltimer(md);
- md->state.skillstate = MSS_DEAD;
- md->last_deadtime = gettick ();
+ case MS::DEAD:
+ {
+ skill_castcancel(&md->bl, 0);
+ md->state.skillstate = MobSkillState::MSS_DEAD;
+ md->last_deadtime = gettick();
// Since it died, all aggressors' attack to this mob is stopped.
- clif_foreachclient (mob_stopattacked, md->bl.id);
- skill_unit_out_all (&md->bl, gettick (), 1);
- skill_status_change_clear (&md->bl, 2); // The abnormalities in status are canceled.
- skill_clear_unitgroup (&md->bl); // All skill unit groups are deleted.
- skill_cleartimerskill (&md->bl);
- if (md->deletetimer != -1)
- delete_timer (md->deletetimer, mob_timer_delete);
- md->deletetimer = -1;
+ clif_foreachclient(std::bind(mob_stopattacked, ph::_1, md->bl.id));
+ skill_status_change_clear(&md->bl, 2); // The abnormalities in status are canceled.
+ md->deletetimer.cancel();
md->hp = md->target_id = md->attacked_id = 0;
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
+ }
break;
}
@@ -1049,53 +893,42 @@ int mob_changestate (struct mob_data *md, int state, int type)
* It branches to a walk and an attack.
*------------------------------------------
*/
-static void mob_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+static
+void mob_timer(TimerData *, tick_t tick, int id, unsigned char data)
{
struct mob_data *md;
struct block_list *bl;
-
- if ((bl = map_id2bl (id)) == NULL)
+ bl = map_id2bl(id);
+ if (bl == NULL)
{ //攻撃してきた敵がもういないのは正常のようだ
return;
}
- if (!bl || !bl->type || bl->type != BL_MOB)
+ if (bl->type == BL::NUL || bl->type != BL::MOB)
return;
- nullpo_retv (md = (struct mob_data *) bl);
+ md = (struct mob_data *) bl;
- if (!md->bl.type || md->bl.type != BL_MOB)
+ if (md->bl.prev == NULL || md->state.state == MS::DEAD)
return;
- if (md->timer != tid)
- {
- if (battle_config.error_log == 1)
- printf ("mob_timer %d != %d\n", md->timer, tid);
- return;
- }
- md->timer = -1;
- if (md->bl.prev == NULL || md->state.state == MS_DEAD)
- return;
-
- map_freeblock_lock ();
+ map_freeblock_lock();
switch (md->state.state)
{
- case MS_WALK:
- mob_check_attack (md);
- mob_walk (md, tick, data);
+ case MS::WALK:
+ mob_check_attack(md);
+ mob_walk(md, tick, data);
break;
- case MS_ATTACK:
- mob_attack (md, tick, data);
- break;
- case MS_DELAY:
- mob_changestate (md, MS_IDLE, 0);
+ case MS::ATTACK:
+ mob_attack(md, tick);
break;
default:
if (battle_config.error_log == 1)
- printf ("mob_timer : %d ?\n", md->state.state);
+ PRINTF("mob_timer : %d ?\n",
+ md->state.state);
break;
}
- map_freeblock_unlock ();
+ map_freeblock_unlock();
return;
}
@@ -1103,21 +936,21 @@ static void mob_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t
*
*------------------------------------------
*/
-static int mob_walktoxy_sub (struct mob_data *md)
+static
+int mob_walktoxy_sub(struct mob_data *md)
{
struct walkpath_data wpd;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if (path_search
- (&wpd, md->bl.m, md->bl.x, md->bl.y, md->to_x, md->to_y,
+ if (path_search(&wpd, md->bl.m, md->bl.x, md->bl.y, md->to_x, md->to_y,
md->state.walk_easy))
return 1;
- memcpy (&md->walkpath, &wpd, sizeof (wpd));
+ memcpy(&md->walkpath, &wpd, sizeof(wpd));
md->state.change_walk_target = 0;
- mob_changestate (md, MS_WALK, 0);
- clif_movemob (md);
+ mob_changestate(md, MS::WALK, 0);
+ clif_movemob(md);
return 0;
}
@@ -1126,26 +959,27 @@ static int mob_walktoxy_sub (struct mob_data *md)
* mob move start
*------------------------------------------
*/
-int mob_walktoxy (struct mob_data *md, int x, int y, int easy)
+static
+int mob_walktoxy(struct mob_data *md, int x, int y, int easy)
{
struct walkpath_data wpd;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if (md->state.state == MS_WALK
- && path_search (&wpd, md->bl.m, md->bl.x, md->bl.y, x, y, easy))
+ if (md->state.state == MS::WALK
+ && path_search(&wpd, md->bl.m, md->bl.x, md->bl.y, x, y, easy))
return 1;
md->state.walk_easy = easy;
md->to_x = x;
md->to_y = y;
- if (md->state.state == MS_WALK)
+ if (md->state.state == MS::WALK)
{
md->state.change_walk_target = 1;
}
else
{
- return mob_walktoxy_sub (md);
+ return mob_walktoxy_sub(md);
}
return 0;
@@ -1155,9 +989,10 @@ int mob_walktoxy (struct mob_data *md, int x, int y, int easy)
* mob spawn with delay (timer function)
*------------------------------------------
*/
-static void mob_delayspawn (timer_id tid, tick_t tick, custom_id_t m, custom_data_t n)
+static
+void mob_delayspawn(TimerData *, tick_t, int m)
{
- mob_spawn (m);
+ mob_spawn(m);
}
/*==========================================
@@ -1165,54 +1000,47 @@ static void mob_delayspawn (timer_id tid, tick_t tick, custom_id_t m, custom_dat
*------------------------------------------
*/
static
-int mob_setdelayspawn (int id)
+int mob_setdelayspawn(int id)
{
- unsigned int spawntime, spawntime1, spawntime2, spawntime3;
struct mob_data *md;
struct block_list *bl;
- if ((bl = map_id2bl (id)) == NULL)
+ if ((bl = map_id2bl(id)) == NULL)
return -1;
- if (!bl || !bl->type || bl->type != BL_MOB)
+ if (!bl || bl->type == BL::NUL || bl->type != BL::MOB)
return -1;
- nullpo_retr (-1, md = (struct mob_data *) bl);
+ md = (struct mob_data *) bl;
+ nullpo_retr(-1, md);
- if (!md || md->bl.type != BL_MOB)
+ if (!md || md->bl.type != BL::MOB)
return -1;
// Processing of MOB which is not revitalized
- if (md->spawndelay1 == -1 && md->spawndelay2 == -1 && md->n == 0)
+ if (md->spawndelay1 == static_cast<interval_t>(-1)
+ && md->spawndelay2 == static_cast<interval_t>(-1)
+ && md->n == 0)
{
- map_deliddb (&md->bl);
+ map_deliddb(&md->bl);
if (md->lootitem)
{
- map_freeblock (md->lootitem);
+ map_freeblock(md->lootitem);
md->lootitem = NULL;
}
- map_freeblock (md); // Instead of [ of free ]
+ map_freeblock(md); // Instead of [ of free ]
return 0;
}
- spawntime1 = md->last_spawntime + md->spawndelay1;
- spawntime2 = md->last_deadtime + md->spawndelay2;
- spawntime3 = gettick () + 5000;
- // spawntime = max(spawntime1,spawntime2,spawntime3);
- if (DIFF_TICK (spawntime1, spawntime2) > 0)
- {
- spawntime = spawntime1;
- }
- else
- {
- spawntime = spawntime2;
- }
- if (DIFF_TICK (spawntime3, spawntime) > 0)
- {
- spawntime = spawntime3;
- }
+ tick_t spawntime1 = md->last_spawntime + md->spawndelay1;
+ tick_t spawntime2 = md->last_deadtime + md->spawndelay2;
+ tick_t spawntime3 = gettick() + std::chrono::seconds(5);
+ tick_t spawntime = std::max({spawntime1, spawntime2, spawntime3});
- add_timer (spawntime, mob_delayspawn, id, 0);
+ Timer(spawntime,
+ std::bind(mob_delayspawn, ph::_1, ph::_2,
+ id)
+ ).detach();
return 0;
}
@@ -1220,121 +1048,124 @@ int mob_setdelayspawn (int id)
* Mob spawning. Initialization is also variously here.
*------------------------------------------
*/
-int mob_spawn (int id)
+int mob_spawn(int id)
{
- int x = 0, y = 0, i = 0, c;
- unsigned int tick = gettick ();
+ int x = 0, y = 0;
+ tick_t tick = gettick();
struct mob_data *md;
struct block_list *bl;
- nullpo_retr (-1, bl = map_id2bl (id));
+ bl = map_id2bl(id);
+ nullpo_retr(-1, bl);
- if (!bl || !bl->type || bl->type != BL_MOB)
+ if (!bl || bl->type == BL::NUL || bl->type != BL::MOB)
return -1;
- nullpo_retr (-1, md = (struct mob_data *) bl);
+ md = (struct mob_data *) bl;
+ nullpo_retr(-1, md);
- if (!md || !md->bl.type || md->bl.type != BL_MOB)
+ if (!md || md->bl.type == BL::NUL || md->bl.type != BL::MOB)
return -1;
md->last_spawntime = tick;
if (md->bl.prev != NULL)
{
-// clif_clearchar_area(&md->bl,3);
- skill_unit_out_all (&md->bl, gettick (), 1);
- map_delblock (&md->bl);
+ map_delblock(&md->bl);
}
- else
- md->mob_class = md->base_class;
md->bl.m = md->m;
- do
{
- if (md->x0 == 0 && md->y0 == 0)
+ int i = 0;
+ do
{
- x = MPRAND (1, (map[md->bl.m].xs - 2));
- y = MPRAND (1, (map[md->bl.m].ys - 2));
+ if (md->x0 == 0 && md->y0 == 0)
+ {
+ x = random_::in(1, map[md->bl.m].xs - 2);
+ y = random_::in(1, map[md->bl.m].ys - 2);
+ }
+ else
+ {
+ // TODO: move this logic earlier - possibly all the way
+ // into the data files
+ x = md->x0 - md->xs / 2 + random_::in(0, md->xs);
+ y = md->y0 - md->ys / 2 + random_::in(0, md->ys);
+ }
+ i++;
}
- else
+ while (bool(map_getcell(md->bl.m, x, y) & MapCell::UNWALKABLE)
+ && i < 50);
+
+ if (i >= 50)
{
- x = MPRAND (md->x0, (md->xs + 1)) - md->xs / 2;
- y = MPRAND (md->y0, (md->ys + 1)) - md->ys / 2;
+ // if(battle_config.error_log==1)
+ // PRINTF("MOB spawn error %d @ %s\n",id,map[md->bl.m].name);
+ Timer(tick + std::chrono::seconds(5),
+ std::bind(mob_delayspawn, ph::_1, ph::_2,
+ id)
+ ).detach();
+ return 1;
}
- i++;
- }
- while (((c = map_getcell (md->bl.m, x, y)) == 1 || c == 5) && i < 50);
-
- if (i >= 50)
- {
-// if(battle_config.error_log==1)
-// printf("MOB spawn error %d @ %s\n",id,map[md->bl.m].name);
- add_timer (tick + 5000, mob_delayspawn, id, 0);
- return 1;
}
md->to_x = md->bl.x = x;
md->to_y = md->bl.y = y;
- md->dir = 0;
+ md->dir = DIR::S;
- map_addblock (&md->bl);
+ map_addblock(&md->bl);
- memset (&md->state, 0, sizeof (md->state));
+ memset(&md->state, 0, sizeof(md->state));
md->attacked_id = 0;
md->target_id = 0;
md->move_fail_count = 0;
- mob_init (md);
+ mob_init(md);
- if (!md->stats[MOB_SPEED])
- md->stats[MOB_SPEED] = mob_db[md->mob_class].speed;
+ if (!md->stats[mob_stat::SPEED])
+ md->stats[mob_stat::SPEED] = mob_db[md->mob_class].speed;
md->def_ele = mob_db[md->mob_class].element;
md->master_id = 0;
md->master_dist = 0;
- md->state.state = MS_IDLE;
- md->state.skillstate = MSS_IDLE;
- md->timer = -1;
+ md->state.state = MS::IDLE;
+ md->state.skillstate = MobSkillState::MSS_IDLE;
+ assert (!md->timer);
md->last_thinktime = tick;
- md->next_walktime = tick + MPRAND (5000, 50);
+ md->next_walktime = tick + std::chrono::seconds(5) + std::chrono::milliseconds(random_::to(50));
md->attackabletime = tick;
md->canmove_tick = tick;
md->sg_count = 0;
- md->deletetimer = -1;
+ // md->deletetimer = nullptr;
- md->skilltimer = -1;
- for (i = 0, c = tick - 1000 * 3600 * 10; i < MAX_MOBSKILL; i++)
- md->skilldelay[i] = c;
- md->skillid = 0;
+ // md->skilltimer = nullptr;
+ for (int i = 0; i < MAX_MOBSKILL; i++)
+ md->skilldelay[i] = tick - std::chrono::hours(10);
+ md->skillid = SkillID();
md->skilllv = 0;
- memset (md->dmglog, 0, sizeof (md->dmglog));
+ memset(md->dmglog, 0, sizeof(md->dmglog));
if (md->lootitem)
- memset (md->lootitem, 0, sizeof (md->lootitem));
+ memset(md->lootitem, 0, sizeof(*md->lootitem));
md->lootitem_count = 0;
- for (i = 0; i < MAX_MOBSKILLTIMERSKILL; i++)
- md->skilltimerskill[i].timer = -1;
-
- for (i = 0; i < MAX_STATUSCHANGE; i++)
+ for (StatusChange i : erange(StatusChange(), StatusChange::MAX_STATUSCHANGE))
{
- md->sc_data[i].timer = -1;
- md->sc_data[i].val1 = md->sc_data[i].val2 = md->sc_data[i].val3 =
- md->sc_data[i].val4 = 0;
+ assert (!md->sc_data[i].timer);
+ md->sc_data[i].val1 = 0;
}
md->sc_count = 0;
- md->opt1 = md->opt2 = md->opt3 = md->option = 0;
+ md->opt1 = Opt1::ZERO;
+ md->opt2 = Opt2::ZERO;
+ md->opt3 = Opt3::ZERO;
+ md->option = Option::ZERO;
- memset (md->skillunit, 0, sizeof (md->skillunit));
- memset (md->skillunittick, 0, sizeof (md->skillunittick));
-
- md->hp = battle_get_max_hp (&md->bl);
+ md->hp = battle_get_max_hp(&md->bl);
if (md->hp <= 0)
{
- mob_makedummymobdb (md->mob_class);
- md->hp = battle_get_max_hp (&md->bl);
+ mob_makedummymobdb(md->mob_class);
+ md->hp = battle_get_max_hp(&md->bl);
}
- clif_spawnmob (md);
+ clif_spawnmob(md);
return 0;
}
@@ -1343,12 +1174,13 @@ int mob_spawn (int id)
* Distance calculation between two points
*------------------------------------------
*/
-static int distance (int x0, int y0, int x1, int y1)
+static
+int distance(int x0, int y0, int x1, int y1)
{
- int dx, dy;
+ int dx, dy;
- dx = abs (x0 - x1);
- dy = abs (y0 - y1);
+ dx = abs(x0 - x1);
+ dy = abs(y0 - y1);
return dx > dy ? dx : dy;
}
@@ -1356,10 +1188,10 @@ static int distance (int x0, int y0, int x1, int y1)
* The stop of MOB's attack
*------------------------------------------
*/
-int mob_stopattack (struct mob_data *md)
+int mob_stopattack(struct mob_data *md)
{
md->target_id = 0;
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
md->attacked_id = 0;
return 0;
}
@@ -1368,13 +1200,13 @@ int mob_stopattack (struct mob_data *md)
* The stop of MOB's walking
*------------------------------------------
*/
-int mob_stop_walking (struct mob_data *md, int type)
+int mob_stop_walking(struct mob_data *md, int type)
{
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if (md->state.state == MS_WALK || md->state.state == MS_IDLE)
+ if (md->state.state == MS::WALK || md->state.state == MS::IDLE)
{
- int dx = 0, dy = 0;
+ int dx = 0, dy = 0;
md->walkpath.path_len = 0;
if (type & 4)
@@ -1394,17 +1226,17 @@ int mob_stop_walking (struct mob_data *md, int type)
md->to_y = md->bl.y + dy;
if (dx != 0 || dy != 0)
{
- mob_walktoxy_sub (md);
+ mob_walktoxy_sub(md);
return 0;
}
- mob_changestate (md, MS_IDLE, 0);
+ mob_changestate(md, MS::IDLE, 0);
}
if (type & 0x01)
- clif_fixmobpos (md);
+ clif_fixmobpos(md);
if (type & 0x02)
{
- int delay = battle_get_dmotion (&md->bl);
- unsigned int tick = gettick ();
+ interval_t delay = battle_get_dmotion(&md->bl);
+ tick_t tick = gettick();
if (md->canmove_tick < tick)
md->canmove_tick = tick + delay;
}
@@ -1417,54 +1249,22 @@ int mob_stop_walking (struct mob_data *md, int type)
*------------------------------------------
*/
static
-int mob_can_reach (struct mob_data *md, struct block_list *bl, int range)
+int mob_can_reach(struct mob_data *md, struct block_list *bl, int range)
{
- int dx, dy;
+ int dx, dy;
struct walkpath_data wpd;
- int i;
-
- nullpo_retr (0, md);
- nullpo_retr (0, bl);
-
- dx = abs (bl->x - md->bl.x);
- dy = abs (bl->y - md->bl.y);
-
- //=========== guildcastle guardian no search start===========
- //when players are the guild castle member not attack them !
- if (md->mob_class == 1285 || md->mob_class == 1286 || md->mob_class == 1287)
- {
- struct map_session_data *sd;
- struct guild *g = NULL;
- struct guild_castle *gc = guild_mapname2gc (map[bl->m].name);
-
- if (gc && agit_flag == 0) // Guardians will not attack during non-woe time [Valaris]
- return 0; // end addition [Valaris]
-
- if (bl && bl->type == BL_PC)
- {
- if ((sd = (struct map_session_data *) bl) == NULL)
- {
- printf ("mob_can_reach nullpo\n");
- return 0;
- }
+ int i;
- if (gc && sd && sd->status.guild_id && sd->status.guild_id > 0)
- {
- g = guild_search (sd->status.guild_id); // don't attack guild members [Valaris]
- if (g && g->guild_id > 0 && g->guild_id == gc->guild_id)
- return 0;
- if (g && gc && guild_isallied (g, gc))
- return 0;
+ nullpo_ret(md);
+ nullpo_ret(bl);
- }
- }
- }
- //========== guildcastle guardian no search eof==============
+ dx = abs(bl->x - md->bl.x);
+ dy = abs(bl->y - md->bl.y);
- if (bl && bl->type == BL_PC && battle_config.monsters_ignore_gm == 1)
+ if (bl && bl->type == BL::PC && battle_config.monsters_ignore_gm == 1)
{ // option to have monsters ignore GMs [Valaris]
struct map_session_data *sd;
- if ((sd = (struct map_session_data *) bl) != NULL && pc_isGM (sd))
+ if ((sd = (struct map_session_data *) bl) != NULL && pc_isGM(sd))
return 0;
}
@@ -1481,23 +1281,21 @@ int mob_can_reach (struct mob_data *md, struct block_list *bl, int range)
wpd.path_len = 0;
wpd.path_pos = 0;
wpd.path_half = 0;
- if (path_search (&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x, bl->y, 0) !=
+ if (path_search(&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x, bl->y, 0) !=
-1)
return 1;
- if (bl->type != BL_PC && bl->type != BL_MOB)
+ if (bl->type != BL::PC && bl->type != BL::MOB)
return 0;
// It judges whether it can adjoin or not.
dx = (dx > 0) ? 1 : ((dx < 0) ? -1 : 0);
dy = (dy > 0) ? 1 : ((dy < 0) ? -1 : 0);
- if (path_search
- (&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x - dx, bl->y - dy, 0) != -1)
+ if (path_search(&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x - dx, bl->y - dy, 0) != -1)
return 1;
for (i = 0; i < 9; i++)
{
- if (path_search
- (&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x - 1 + i / 3,
+ if (path_search(&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x - 1 + i / 3,
bl->y - 1 + i % 3, 0) != -1)
return 1;
}
@@ -1508,21 +1306,20 @@ int mob_can_reach (struct mob_data *md, struct block_list *bl, int range)
* Determination for an attack of a monster
*------------------------------------------
*/
-int mob_target (struct mob_data *md, struct block_list *bl, int dist)
+int mob_target(struct mob_data *md, struct block_list *bl, int dist)
{
struct map_session_data *sd;
- struct status_change *sc_data;
- short *option;
- int mode, race;
+ eptr<struct status_change, StatusChange> sc_data;
+ MobMode mode;
- nullpo_retr (0, md);
- nullpo_retr (0, bl);
+ nullpo_ret(md);
+ nullpo_ret(bl);
- sc_data = battle_get_sc_data (bl);
- option = battle_get_option (bl);
- race = mob_db[md->mob_class].race;
+ sc_data = battle_get_sc_data(bl);
+ Option *option = battle_get_option(bl);
+ Race race = mob_db[md->mob_class].race;
- if (!md->mode)
+ if (md->mode == MobMode::ZERO)
{
mode = mob_db[md->mob_class].mode;
}
@@ -1530,35 +1327,39 @@ int mob_target (struct mob_data *md, struct block_list *bl, int dist)
{
mode = md->mode;
}
- if (!(mode & 0x80))
+ if (!bool(mode & MobMode::CAN_ATTACK))
{
md->target_id = 0;
return 0;
}
// Nothing will be carried out if there is no mind of changing TAGE by TAGE ending.
- if ((md->target_id > 0 && md->state.targettype == ATTACKABLE)
- && (!(mode & 0x04) || MRAND (100) > 25))
+ if ((md->target_id > 0 && md->state.attackable)
+ && (!bool(mode & MobMode::AGGRESSIVE)
+ || !random_::chance({25 + 1, 100})))
return 0;
- if (mode & 0x20 || // Coercion is exerted if it is MVPMOB.
- (sc_data && sc_data[SC_TRICKDEAD].timer == -1 &&
- ((option && !(*option & 0x06)) || race == 4 || race == 6)))
+ // Coercion is exerted if it is MVPMOB.
+ if (bool(mode & MobMode::BOSS)
+ || (option != NULL
+ || race == Race::_insect
+ || race == Race::_demon))
{
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
{
- nullpo_retr (0, sd = (struct map_session_data *) bl);
- if (sd->invincible_timer != -1 || pc_isinvisible (sd))
+ sd = (struct map_session_data *) bl;
+ nullpo_ret(sd);
+ if (sd->invincible_timer || pc_isinvisible(sd))
return 0;
- if (!(mode & 0x20) && race != 4 && race != 6
+ if (!bool(mode & MobMode::BOSS) && race != Race::_insect && race != Race::_demon
&& sd->state.gangsterparadise)
return 0;
}
md->target_id = bl->id; // Since there was no disturbance, it locks on to target.
- if (bl->type == BL_PC || bl->type == BL_MOB)
- md->state.targettype = ATTACKABLE;
+ if (bl->type == BL::PC || bl->type == BL::MOB)
+ md->state.attackable = true;
else
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
md->min_chase = dist + 13;
if (md->min_chase > 26)
md->min_chase = 26;
@@ -1570,56 +1371,61 @@ int mob_target (struct mob_data *md, struct block_list *bl, int dist)
* The ?? routine of an active monster
*------------------------------------------
*/
-static int mob_ai_sub_hard_activesearch (struct block_list *bl, va_list ap)
+static
+void mob_ai_sub_hard_activesearch(struct block_list *bl,
+ struct mob_data *smd, int *pcc)
{
struct map_session_data *tsd = NULL;
- struct mob_data *smd, *tmd = NULL;
- int mode, race, dist, *pcc;
+ struct mob_data *tmd = NULL;
+ MobMode mode;
+ int dist;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, smd = va_arg (ap, struct mob_data *));
- nullpo_retr (0, pcc = va_arg (ap, int *));
+ nullpo_retv(bl);
+ nullpo_retv(smd);
+ nullpo_retv(pcc);
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
tsd = (struct map_session_data *) bl;
- else if (bl->type == BL_MOB)
+ else if (bl->type == BL::MOB)
tmd = (struct mob_data *) bl;
else
- return 0;
+ return;
//敵味方判定
- if (battle_check_target (&smd->bl, bl, BCT_ENEMY) == 0)
- return 0;
+ if (battle_check_target(&smd->bl, bl, BCT_ENEMY) == 0)
+ return;
- if (!smd->mode)
+ if (smd->mode == MobMode::ZERO)
mode = mob_db[smd->mob_class].mode;
else
mode = smd->mode;
// アクティブでターゲット射程内にいるなら、ロックする
- if (mode & 0x04)
+ if (bool(mode & MobMode::AGGRESSIVE))
{
- race = mob_db[smd->mob_class].race;
+ Race race = mob_db[smd->mob_class].race;
//対象がPCの場合
if (tsd &&
- !pc_isdead (tsd) &&
+ !pc_isdead(tsd) &&
tsd->bl.m == smd->bl.m &&
- tsd->invincible_timer == -1 &&
- !pc_isinvisible (tsd) &&
+ !tsd->invincible_timer &&
+ !pc_isinvisible(tsd) &&
(dist =
- distance (smd->bl.x, smd->bl.y, tsd->bl.x, tsd->bl.y)) < 9)
+ distance(smd->bl.x, smd->bl.y, tsd->bl.x, tsd->bl.y)) < 9)
{
- if (mode & 0x20 ||
- (tsd->sc_data[SC_TRICKDEAD].timer == -1 &&
- ((!pc_ishiding (tsd) && !tsd->state.gangsterparadise)
- || race == 4 || race == 6)))
- { // 妨害がないか判定
- if (mob_can_reach (smd, bl, 12) && // 到達可能性判定
- MRAND (1000) < 1000 / (++(*pcc)))
- { // 範囲内PCで等確率にする
+ if (bool(mode & MobMode::BOSS)
+ || (!tsd->state.gangsterparadise
+ || race == Race::_insect
+ || race == Race::_demon))
+ {
+ // 妨害がないか判定
+ // 到達可能性判定
+ if (mob_can_reach(smd, bl, 12)
+ && random_::chance({1, ++*pcc}))
+ {
+ // 範囲内PCで等確率にする
smd->target_id = tsd->bl.id;
- smd->state.targettype = ATTACKABLE;
+ smd->state.attackable = true;
smd->min_chase = 13;
}
}
@@ -1628,35 +1434,34 @@ static int mob_ai_sub_hard_activesearch (struct block_list *bl, va_list ap)
else if (tmd &&
tmd->bl.m == smd->bl.m &&
(dist =
- distance (smd->bl.x, smd->bl.y, tmd->bl.x, tmd->bl.y)) < 9)
+ distance(smd->bl.x, smd->bl.y, tmd->bl.x, tmd->bl.y)) < 9)
{
- if (mob_can_reach (smd, bl, 12) && // 到達可能性判定
- MRAND (1000) < 1000 / (++(*pcc)))
- { // 範囲内で等確率にする
+ // 到達可能性判定
+ if (mob_can_reach(smd, bl, 12)
+ && random_::chance({1, ++*pcc}))
+ {
+ // 範囲内で等確率にする
smd->target_id = bl->id;
- smd->state.targettype = ATTACKABLE;
+ smd->state.attackable = true;
smd->min_chase = 13;
}
}
}
- return 0;
}
/*==========================================
* loot monster item search
*------------------------------------------
*/
-static int mob_ai_sub_hard_lootsearch (struct block_list *bl, va_list ap)
+static
+void mob_ai_sub_hard_lootsearch(struct block_list *bl, struct mob_data *md, int *itc)
{
- struct mob_data *md;
- int mode, dist, *itc;
+ MobMode mode;
+ int dist;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, md = va_arg (ap, struct mob_data *));
- nullpo_retr (0, itc = va_arg (ap, int *));
+ nullpo_retv(bl);
- if (!md->mode)
+ if (md->mode == MobMode::ZERO)
{
mode = mob_db[md->mob_class].mode;
}
@@ -1665,118 +1470,110 @@ static int mob_ai_sub_hard_lootsearch (struct block_list *bl, va_list ap)
mode = md->mode;
}
- if (!md->target_id && mode & 0x02)
+ if (!md->target_id && bool(mode & MobMode::LOOTER))
{
if (!md->lootitem
|| (battle_config.monster_loot_type == 1
&& md->lootitem_count >= LOOTITEM_SIZE))
- return 0;
+ return;
if (bl->m == md->bl.m
- && (dist = distance (md->bl.x, md->bl.y, bl->x, bl->y)) < 9)
+ && (dist = distance(md->bl.x, md->bl.y, bl->x, bl->y)) < 9)
{
- if (mob_can_reach (md, bl, 12) && // Reachability judging
- MRAND (1000) < 1000 / (++(*itc)))
- { // It is made a probability, such as within the limits PC.
+ // Reachability judging
+ if (mob_can_reach(md, bl, 12)
+ && random_::chance({1, ++*itc}))
+ {
+ // It is made a probability, such as within the limits PC.
md->target_id = bl->id;
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
md->min_chase = 13;
}
}
}
- return 0;
}
/*==========================================
* The ?? routine of a link monster
*------------------------------------------
*/
-static int mob_ai_sub_hard_linksearch (struct block_list *bl, va_list ap)
+static
+void mob_ai_sub_hard_linksearch(struct block_list *bl, struct mob_data *md, struct block_list *target)
{
struct mob_data *tmd;
- struct mob_data *md;
- struct block_list *target;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, tmd = (struct mob_data *) bl);
- nullpo_retr (0, md = va_arg (ap, struct mob_data *));
- nullpo_retr (0, target = va_arg (ap, struct block_list *));
-
- // same family free in a range at a link monster -- it will be made to lock if MOB is
-/* if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && mob_db[md->mob_class].mode&0x08){
- if( tmd->mob_class==md->mob_class && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE) && tmd->bl.m == md->bl.m){
- if( mob_can_reach(tmd,target,12) ){ // Reachability judging
- tmd->target_id=md->target_id;
- tmd->state.targettype = ATTACKABLE;
- tmd->min_chase=13;
- }
- }
- }*/
- if (md->attacked_id > 0 && mob_db[md->mob_class].mode & 0x08)
+
+ nullpo_retv(bl);
+ tmd = (struct mob_data *) bl;
+ nullpo_retv(md);
+ nullpo_retv(target);
+
+ if (md->attacked_id > 0
+ && bool(mob_db[md->mob_class].mode & MobMode::ASSIST))
{
- if (tmd->mob_class == md->mob_class && tmd->bl.m == md->bl.m
- && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE))
+ if (tmd->mob_class == md->mob_class
+ && tmd->bl.m == md->bl.m
+ && (!tmd->target_id || !md->state.attackable))
{
- if (mob_can_reach (tmd, target, 12))
- { // Reachability judging
+ if (mob_can_reach(tmd, target, 12))
+ {
+ // Reachability judging
tmd->target_id = md->attacked_id;
- tmd->state.targettype = ATTACKABLE;
+ tmd->state.attackable = true;
tmd->min_chase = 13;
}
}
}
-
- return 0;
}
/*==========================================
* Processing of slave monsters
*------------------------------------------
*/
-static int mob_ai_sub_hard_slavemob (struct mob_data *md, unsigned int tick)
+static
+int mob_ai_sub_hard_slavemob(struct mob_data *md, tick_t tick)
{
struct mob_data *mmd = NULL;
struct block_list *bl;
- int mode, race, old_dist;
+ MobMode mode;
+ int old_dist;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if ((bl = map_id2bl (md->master_id)) != NULL)
+ if ((bl = map_id2bl(md->master_id)) != NULL)
mmd = (struct mob_data *) bl;
mode = mob_db[md->mob_class].mode;
// It is not main monster/leader.
- if (!mmd || mmd->bl.type != BL_MOB || mmd->bl.id != md->master_id)
+ if (!mmd || mmd->bl.type != BL::MOB || mmd->bl.id != md->master_id)
return 0;
// Since it is in the map on which the master is not, teleport is carried out and it pursues.
if (mmd->bl.m != md->bl.m)
{
- mob_warp (md, mmd->bl.m, mmd->bl.x, mmd->bl.y, 3);
+ mob_warp(md, mmd->bl.m, mmd->bl.x, mmd->bl.y, BeingRemoveWhy::WARPED);
md->state.master_check = 1;
return 0;
}
// Distance with between slave and master is measured.
old_dist = md->master_dist;
- md->master_dist = distance (md->bl.x, md->bl.y, mmd->bl.x, mmd->bl.y);
+ md->master_dist = distance(md->bl.x, md->bl.y, mmd->bl.x, mmd->bl.y);
// Since the master was in near immediately before, teleport is carried out and it pursues.
if (old_dist < 10 && md->master_dist > 18)
{
- mob_warp (md, -1, mmd->bl.x, mmd->bl.y, 3);
+ mob_warp(md, -1, mmd->bl.x, mmd->bl.y, BeingRemoveWhy::WARPED);
md->state.master_check = 1;
return 0;
}
// Although there is the master, since it is somewhat far, it approaches.
- if ((!md->target_id || md->state.targettype == NONE_ATTACKABLE)
- && mob_can_move (md)
+ if ((!md->target_id || !md->state.attackable)
+ && mob_can_move(md)
&& (md->walkpath.path_pos >= md->walkpath.path_len
|| md->walkpath.path_len == 0) && md->master_dist < 15)
{
- int i = 0, dx, dy, ret;
+ int i = 0, dx, dy, ret;
if (md->master_dist > 4)
{
do
@@ -1786,21 +1583,21 @@ static int mob_ai_sub_hard_slavemob (struct mob_data *md, unsigned int tick)
dx = mmd->bl.x - md->bl.x;
dy = mmd->bl.y - md->bl.y;
if (dx < 0)
- dx += (MPRAND (1, ((dx < -3) ? 3 : -dx)));
+ dx += random_::in(1, std::min(3, -dx));
else if (dx > 0)
- dx -= (MPRAND (1, ((dx > 3) ? 3 : dx)));
+ dx -= random_::in(1, std::min(3, dx));
if (dy < 0)
- dy += (MPRAND (1, ((dy < -3) ? 3 : -dy)));
+ dy += random_::in(1, std::min(3, -dy));
else if (dy > 0)
- dy -= (MPRAND (1, ((dy > 3) ? 3 : dy)));
+ dy -= random_::in(1, std::min(3, dy));
}
else
{
- dx = mmd->bl.x - md->bl.x + MRAND (7) - 3;
- dy = mmd->bl.y - md->bl.y + MRAND (7) - 3;
+ dx = mmd->bl.x - md->bl.x + random_::in(-3, 3);
+ dy = mmd->bl.y - md->bl.y + random_::in(-3, 3);
}
- ret = mob_walktoxy (md, md->bl.x + dx, md->bl.y + dy, 0);
+ ret = mob_walktoxy(md, md->bl.x + dx, md->bl.y + dy, 0);
i++;
}
while (ret && i < 10);
@@ -1809,69 +1606,53 @@ static int mob_ai_sub_hard_slavemob (struct mob_data *md, unsigned int tick)
{
do
{
- dx = MRAND (9) - 5;
- dy = MRAND (9) - 5;
+ // changed to do what it was obviously supposed to do,
+ // instead of what it was doing ...
+ dx = random_::in(-4, 4);
+ dy = random_::in(-4, 4);
if (dx == 0 && dy == 0)
{
- dx = (MRAND (1)) ? 1 : -1;
- dy = (MRAND (1)) ? 1 : -1;
+ dx = random_::coin() ? 1 : -1;
+ dy = random_::coin() ? 1 : -1;
}
dx += mmd->bl.x;
dy += mmd->bl.y;
- ret = mob_walktoxy (md, mmd->bl.x + dx, mmd->bl.y + dy, 0);
+ ret = mob_walktoxy(md, mmd->bl.x + dx, mmd->bl.y + dy, 0);
i++;
}
while (ret && i < 10);
}
- md->next_walktime = tick + 500;
+ md->next_walktime = tick + std::chrono::milliseconds(500);
md->state.master_check = 1;
}
// There is the master, the master locks a target and he does not lock.
- if ((mmd->target_id > 0 && mmd->state.targettype == ATTACKABLE)
- && (!md->target_id || md->state.targettype == NONE_ATTACKABLE))
+ if ((mmd->target_id > 0 && mmd->state.attackable)
+ && (!md->target_id || !md->state.attackable))
{
- struct map_session_data *sd = map_id2sd (mmd->target_id);
- if (sd != NULL && !pc_isdead (sd) && sd->invincible_timer == -1
- && !pc_isinvisible (sd))
+ struct map_session_data *sd = map_id2sd(mmd->target_id);
+ if (sd != NULL && !pc_isdead(sd) && !sd->invincible_timer
+ && !pc_isinvisible(sd))
{
- race = mob_db[md->mob_class].race;
- if (mode & 0x20 ||
- (sd->sc_data[SC_TRICKDEAD].timer == -1 &&
- ((!pc_ishiding (sd) && !sd->state.gangsterparadise)
- || race == 4 || race == 6)))
+ Race race = mob_db[md->mob_class].race;
+ if (bool(mode & MobMode::BOSS)
+ || (!sd->state.gangsterparadise
+ || race == Race::_insect
+ || race == Race::_demon))
{ // 妨害がないか判定
md->target_id = sd->bl.id;
- md->state.targettype = ATTACKABLE;
+ md->state.attackable = true;
md->min_chase =
- 5 + distance (md->bl.x, md->bl.y, sd->bl.x, sd->bl.y);
+ 5 + distance(md->bl.x, md->bl.y, sd->bl.x, sd->bl.y);
md->state.master_check = 1;
}
}
}
- // There is the master, the master locks a target and he does not lock.
-/* if( (md->target_id>0 && mmd->state.targettype == ATTACKABLE) && (!mmd->target_id || mmd->state.targettype == NONE_ATTACKABLE) ){
- struct map_session_data *sd=map_id2sd(md->target_id);
- if(sd!=NULL && !pc_isdead(sd) && sd->invincible_timer == -1 && !pc_isinvisible(sd)){
-
- race=mob_db[mmd->mob_class].race;
- if(mode&0x20 ||
- (sd->sc_data[SC_TRICKDEAD].timer == -1 &&
- (!(sd->status.option&0x06) || race==4 || race==6)
- ) ){ // It judges whether there is any disturbance.
-
- mmd->target_id=sd->bl.id;
- mmd->state.targettype = ATTACKABLE;
- mmd->min_chase=5+distance(mmd->bl.x,mmd->bl.y,sd->bl.x,sd->bl.y);
- }
- }
- }*/
-
return 0;
}
@@ -1879,14 +1660,15 @@ static int mob_ai_sub_hard_slavemob (struct mob_data *md, unsigned int tick)
* A lock of target is stopped and mob moves to a standby state.
*------------------------------------------
*/
-static int mob_unlocktarget (struct mob_data *md, int tick)
+static
+int mob_unlocktarget(struct mob_data *md, tick_t tick)
{
- nullpo_retr (0, md);
+ nullpo_ret(md);
md->target_id = 0;
- md->state.targettype = NONE_ATTACKABLE;
- md->state.skillstate = MSS_IDLE;
- md->next_walktime = tick + MPRAND (3000, 3000);
+ md->state.attackable = false;
+ md->state.skillstate = MobSkillState::MSS_IDLE;
+ md->next_walktime = tick + std::chrono::seconds(3) + std::chrono::milliseconds(random_::to(3000));
return 0;
}
@@ -1894,26 +1676,26 @@ static int mob_unlocktarget (struct mob_data *md, int tick)
* Random walk
*------------------------------------------
*/
-static int mob_randomwalk (struct mob_data *md, int tick)
+static
+int mob_randomwalk(struct mob_data *md, tick_t tick)
{
const int retrycount = 20;
- int speed;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- speed = battle_get_speed (&md->bl);
- if (DIFF_TICK (md->next_walktime, tick) < 0)
+ interval_t speed = battle_get_speed(&md->bl);
+ if (md->next_walktime < tick)
{
- int i, x, y, c, d = 12 - md->move_fail_count;
+ int i, x, y, d = 12 - md->move_fail_count;
if (d < 5)
d = 5;
for (i = 0; i < retrycount; i++)
- { // Search of a movable place
- int r = mt_random ();
- x = md->bl.x + r % (d * 2 + 1) - d;
- y = md->bl.y + r / (d * 2 + 1) % (d * 2 + 1) - d;
- if ((c = map_getcell (md->bl.m, x, y)) != 1 && c != 5
- && mob_walktoxy (md, x, y, 1) == 0)
+ {
+ // Search of a movable place
+ x = md->bl.x + random_::in(-d, d);
+ y = md->bl.y + random_::in(-d, d);
+ if (!bool(map_getcell(md->bl.m, x, y) & MapCell::UNWALKABLE)
+ && mob_walktoxy(md, x, y, 1) == 0)
{
md->move_fail_count = 0;
break;
@@ -1924,23 +1706,24 @@ static int mob_randomwalk (struct mob_data *md, int tick)
if (md->move_fail_count > 1000)
{
if (battle_config.error_log == 1)
- printf
- ("MOB cant move. random spawn %d, mob_class = %d\n",
+ PRINTF("MOB cant move. random spawn %d, mob_class = %d\n",
md->bl.id, md->mob_class);
md->move_fail_count = 0;
- mob_spawn (md->bl.id);
+ mob_spawn(md->bl.id);
}
}
}
- for (i = c = 0; i < md->walkpath.path_len; i++)
- { // The next walk start time is calculated.
- if (md->walkpath.path[i] & 1)
+ interval_t c = interval_t::zero();
+ for (i = 0; i < md->walkpath.path_len; i++)
+ {
+ // The next walk start time is calculated.
+ if (dir_is_diagonal(md->walkpath.path[i]))
c += speed * 14 / 10;
else
c += speed;
}
- md->next_walktime = tick + MPRAND (3000, 3000) + c;
- md->state.skillstate = MSS_WALK;
+ md->next_walktime = tick + std::chrono::seconds(3) + std::chrono::milliseconds(random_::to(3000)) + c;
+ md->state.skillstate = MobSkillState::MSS_WALK;
return 1;
}
return 0;
@@ -1950,85 +1733,81 @@ static int mob_randomwalk (struct mob_data *md, int tick)
* AI of MOB whose is near a Player
*------------------------------------------
*/
-static int mob_ai_sub_hard (struct block_list *bl, va_list ap)
+static
+void mob_ai_sub_hard(struct block_list *bl, tick_t tick)
{
struct mob_data *md, *tmd = NULL;
struct map_session_data *tsd = NULL;
struct block_list *tbl = NULL;
struct flooritem_data *fitem;
- unsigned int tick;
- int i, dx, dy, ret, dist;
- int attack_type = 0;
- int mode, race;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, md = (struct mob_data *) bl);
+ int i, dx, dy, ret, dist;
+ int attack_type = 0;
+ MobMode mode;
- tick = va_arg (ap, unsigned int);
+ nullpo_retv(bl);
+ md = (struct mob_data *) bl;
- if (DIFF_TICK (tick, md->last_thinktime) < MIN_MOBTHINKTIME)
- return 0;
+ if (tick < md->last_thinktime + MIN_MOBTHINKTIME)
+ return;
md->last_thinktime = tick;
- if (md->skilltimer != -1 || md->bl.prev == NULL)
- { // Under a skill aria and death
- if (DIFF_TICK (tick, md->next_walktime) > MIN_MOBTHINKTIME)
+ if (md->skilltimer || md->bl.prev == NULL)
+ {
+ // Under a skill aria and death
+ if (tick > md->next_walktime + MIN_MOBTHINKTIME)
md->next_walktime = tick;
- return 0;
+ return;
}
- if (!md->mode)
+ if (md->mode == MobMode::ZERO)
mode = mob_db[md->mob_class].mode;
else
mode = md->mode;
- race = mob_db[md->mob_class].race;
+ Race race = mob_db[md->mob_class].race;
// Abnormalities
- if ((md->opt1 > 0 && md->opt1 != 6) || md->state.state == MS_DELAY
- || md->sc_data[SC_BLADESTOP].timer != -1)
- return 0;
+ if (bool(md->opt1) && md->opt1 != Opt1::_stone6)
+ return;
- if (!(mode & 0x80) && md->target_id > 0)
+ if (!bool(mode & MobMode::CAN_ATTACK) && md->target_id > 0)
md->target_id = 0;
- if (md->attacked_id > 0 && mode & 0x08)
+ if (md->attacked_id > 0 && bool(mode & MobMode::ASSIST))
{ // Link monster
- struct map_session_data *asd = map_id2sd (md->attacked_id);
+ struct map_session_data *asd = map_id2sd(md->attacked_id);
if (asd)
{
- if (asd->invincible_timer == -1 && !pc_isinvisible (asd))
+ if (!asd->invincible_timer && !pc_isinvisible(asd))
{
- map_foreachinarea (mob_ai_sub_hard_linksearch, md->bl.m,
- md->bl.x - 13, md->bl.y - 13,
- md->bl.x + 13, md->bl.y + 13,
- BL_MOB, md, &asd->bl);
+ map_foreachinarea(std::bind(mob_ai_sub_hard_linksearch, ph::_1, md, &asd->bl),
+ md->bl.m, md->bl.x - 13, md->bl.y - 13,
+ md->bl.x + 13, md->bl.y + 13, BL::MOB);
}
}
}
// It checks to see it was attacked first (if active, it is target change at 25% of probability).
- if (mode > 0 && md->attacked_id > 0
- && (!md->target_id || md->state.targettype == NONE_ATTACKABLE
- || (mode & 0x04 && MRAND (100) < 25)))
+ if (mode != MobMode::ZERO && md->attacked_id > 0
+ && (!md->target_id || !md->state.attackable
+ || (bool(mode & MobMode::AGGRESSIVE) && random_::chance({25, 100}))))
{
- struct block_list *abl = map_id2bl (md->attacked_id);
+ struct block_list *abl = map_id2bl(md->attacked_id);
struct map_session_data *asd = NULL;
if (abl)
{
- if (abl->type == BL_PC)
+ if (abl->type == BL::PC)
asd = (struct map_session_data *) abl;
if (asd == NULL || md->bl.m != abl->m || abl->prev == NULL
- || asd->invincible_timer != -1 || pc_isinvisible (asd)
+ || asd->invincible_timer || pc_isinvisible(asd)
|| (dist =
- distance (md->bl.x, md->bl.y, abl->x, abl->y)) >= 32
- || battle_check_target (bl, abl, BCT_ENEMY) == 0)
+ distance(md->bl.x, md->bl.y, abl->x, abl->y)) >= 32
+ || battle_check_target(bl, abl, BCT_ENEMY) == 0)
md->attacked_id = 0;
else
{
md->target_id = md->attacked_id; // set target
- md->state.targettype = ATTACKABLE;
+ md->state.attackable = true;
attack_type = 1;
md->attacked_id = 0;
md->min_chase = dist + 13;
@@ -2041,96 +1820,89 @@ static int mob_ai_sub_hard (struct block_list *bl, va_list ap)
md->state.master_check = 0;
// Processing of slave monster
if (md->master_id > 0 && md->state.special_mob_ai == 0)
- mob_ai_sub_hard_slavemob (md, tick);
+ mob_ai_sub_hard_slavemob(md, tick);
// アクティヴモンスターの策敵 (?? of a bitter taste TIVU monster)
- if ((!md->target_id || md->state.targettype == NONE_ATTACKABLE)
- && mode & 0x04 && !md->state.master_check
+ if ((!md->target_id || !md->state.attackable)
+ && bool(mode & MobMode::AGGRESSIVE) && !md->state.master_check
&& battle_config.monster_active_enable == 1)
{
i = 0;
if (md->state.special_mob_ai)
{
- map_foreachinarea (mob_ai_sub_hard_activesearch, md->bl.m,
- md->bl.x - AREA_SIZE * 2,
- md->bl.y - AREA_SIZE * 2,
- md->bl.x + AREA_SIZE * 2,
- md->bl.y + AREA_SIZE * 2, 0, md, &i);
+ map_foreachinarea(std::bind(mob_ai_sub_hard_activesearch, ph::_1, md, &i),
+ md->bl.m, md->bl.x - AREA_SIZE * 2, md->bl.y - AREA_SIZE * 2,
+ md->bl.x + AREA_SIZE * 2, md->bl.y + AREA_SIZE * 2,
+ BL::NUL);
}
else
{
- map_foreachinarea (mob_ai_sub_hard_activesearch, md->bl.m,
- md->bl.x - AREA_SIZE * 2,
- md->bl.y - AREA_SIZE * 2,
- md->bl.x + AREA_SIZE * 2,
- md->bl.y + AREA_SIZE * 2, BL_PC, md, &i);
+ map_foreachinarea(std::bind(mob_ai_sub_hard_activesearch, ph::_1, md, &i),
+ md->bl.m, md->bl.x - AREA_SIZE * 2, md->bl.y - AREA_SIZE * 2,
+ md->bl.x + AREA_SIZE * 2, md->bl.y + AREA_SIZE * 2, BL::PC);
}
}
// The item search of a route monster
- if (!md->target_id && mode & 0x02 && !md->state.master_check)
+ if (!md->target_id
+ && bool(mode & MobMode::LOOTER)
+ && !md->state.master_check)
{
i = 0;
- map_foreachinarea (mob_ai_sub_hard_lootsearch, md->bl.m,
- md->bl.x - AREA_SIZE * 2, md->bl.y - AREA_SIZE * 2,
- md->bl.x + AREA_SIZE * 2, md->bl.y + AREA_SIZE * 2,
- BL_ITEM, md, &i);
+ map_foreachinarea(std::bind(mob_ai_sub_hard_lootsearch, ph::_1, md, &i),
+ md->bl.m, md->bl.x - AREA_SIZE * 2, md->bl.y - AREA_SIZE * 2,
+ md->bl.x + AREA_SIZE * 2, md->bl.y + AREA_SIZE * 2, BL::ITEM);
}
// It will attack, if the candidate for an attack is.
if (md->target_id > 0)
{
- if ((tbl = map_id2bl (md->target_id)))
+ if ((tbl = map_id2bl(md->target_id)))
{
- if (tbl->type == BL_PC)
+ if (tbl->type == BL::PC)
tsd = (struct map_session_data *) tbl;
- else if (tbl->type == BL_MOB)
+ else if (tbl->type == BL::MOB)
tmd = (struct mob_data *) tbl;
if (tsd || tmd)
{
if (tbl->m != md->bl.m || tbl->prev == NULL
|| (dist =
- distance (md->bl.x, md->bl.y, tbl->x,
+ distance(md->bl.x, md->bl.y, tbl->x,
tbl->y)) >= md->min_chase)
- mob_unlocktarget (md, tick); // 別マップか、視界外
- else if (tsd && !(mode & 0x20)
- && (tsd->sc_data[SC_TRICKDEAD].timer != -1
- ||
- ((pc_ishiding (tsd)
- || tsd->state.gangsterparadise) && race != 4
- && race != 6)))
- mob_unlocktarget (md, tick); // スキルなどによる策敵妨害
- else if (!battle_check_range
- (&md->bl, tbl, mob_db[md->mob_class].range))
+ mob_unlocktarget(md, tick); // 別マップか、視界外
+ else if (tsd && !bool(mode & MobMode::BOSS)
+ && (tsd->state.gangsterparadise
+ && race != Race::_insect
+ && race != Race::_demon))
+ mob_unlocktarget(md, tick); // スキルなどによる策敵妨害
+ else if (!battle_check_range(&md->bl, tbl, mob_db[md->mob_class].range))
{
// 攻撃範囲外なので移動
- if (!(mode & 1))
+ if (!bool(mode & MobMode::CAN_MOVE))
{ // 移動しないモード
- mob_unlocktarget (md, tick);
- return 0;
+ mob_unlocktarget(md, tick);
+ return;
}
- if (!mob_can_move (md)) // 動けない状態にある
- return 0;
- md->state.skillstate = MSS_CHASE; // 突撃時スキル
- mobskill_use (md, tick, -1);
-// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tsd->bl.x,tsd->bl.y)<2) )
- if (md->timer != -1 && md->state.state != MS_ATTACK
- && (DIFF_TICK (md->next_walktime, tick) < 0
- || distance (md->to_x, md->to_y, tbl->x,
- tbl->y) < 2))
- return 0; // 既に移動中
- if (!mob_can_reach
- (md, tbl, (md->min_chase > 13) ? md->min_chase : 13))
- mob_unlocktarget (md, tick); // 移動できないのでタゲ解除(IWとか?)
+ if (!mob_can_move(md)) // 動けない状態にある
+ return;
+ md->state.skillstate = MobSkillState::MSS_CHASE; // 突撃時スキル
+ mobskill_use(md, tick, MobSkillCondition::ANY);
+ if (md->timer && md->state.state != MS::ATTACK
+ && (md->next_walktime < tick
+ || distance(md->to_x, md->to_y, tbl->x, tbl->y) < 2))
+ return; // 既に移動中
+ if (!mob_can_reach(md, tbl, (md->min_chase > 13) ? md->min_chase : 13))
+ mob_unlocktarget(md, tick); // 移動できないのでタゲ解除(IWとか?)
else
{
// 追跡
- md->next_walktime = tick + 500;
+ md->next_walktime = tick + std::chrono::milliseconds(500);
i = 0;
do
{
if (i == 0)
- { // 最初はAEGISと同じ方法で検索
+ {
+ // 最初はAEGISと同じ方法で検索
dx = tbl->x - md->bl.x;
dy = tbl->y - md->bl.y;
if (dx < 0)
@@ -2143,21 +1915,13 @@ static int mob_ai_sub_hard (struct block_list *bl, va_list ap)
dy--;
}
else
- { // だめならAthena式(ランダム)
- dx = tbl->x - md->bl.x + MRAND (3) - 1;
- dy = tbl->y - md->bl.y + MRAND (3) - 1;
+ {
+ // だめならAthena式(ランダム)
+ // {0 1 2}
+ dx = tbl->x - md->bl.x + random_::in(-1, 1);
+ dy = tbl->y - md->bl.y + random_::in(-1, 1);
}
- /* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){
- * dx=tsd->bl.x - md->bl.x;
- * dy=tsd->bl.y - md->bl.y;
- * if(dx<0) dx--;
- * else if(dx>0) dx++;
- * if(dy<0) dy--;
- * else if(dy>0) dy++;
- * } */
- ret =
- mob_walktoxy (md, md->bl.x + dx,
- md->bl.y + dy, 0);
+ ret = mob_walktoxy(md, md->bl.x + dx, md->bl.y + dy, 0);
i++;
}
while (ret && i < 5);
@@ -2172,200 +1936,178 @@ static int mob_ai_sub_hard (struct block_list *bl, va_list ap)
dy = 2;
else if (dy > 0)
dy = -2;
- mob_walktoxy (md, md->bl.x + dx, md->bl.y + dy,
+ mob_walktoxy(md, md->bl.x + dx, md->bl.y + dy,
0);
}
}
}
else
{ // 攻撃射程範囲内
- md->state.skillstate = MSS_ATTACK;
- if (md->state.state == MS_WALK)
- mob_stop_walking (md, 1); // 歩行中なら停止
- if (md->state.state == MS_ATTACK)
- return 0; // 既に攻撃中
- mob_changestate (md, MS_ATTACK, attack_type);
-
-/* if(mode&0x08){ // リンクモンスター
- map_foreachinarea(mob_ai_sub_hard_linksearch,md->bl.m,
- md->bl.x-13,md->bl.y-13,
- md->bl.x+13,md->bl.y+13,
- BL_MOB,md,&tsd->bl);
- }*/
+ md->state.skillstate = MobSkillState::MSS_ATTACK;
+ if (md->state.state == MS::WALK)
+ mob_stop_walking(md, 1); // 歩行中なら停止
+ if (md->state.state == MS::ATTACK)
+ return; // 既に攻撃中
+ mob_changestate(md, MS::ATTACK, attack_type);
}
- return 0;
+ return;
}
else
{ // ルートモンスター処理
- if (tbl == NULL || tbl->type != BL_ITEM || tbl->m != md->bl.m
+ if (tbl == NULL || tbl->type != BL::ITEM || tbl->m != md->bl.m
|| (dist =
- distance (md->bl.x, md->bl.y, tbl->x,
+ distance(md->bl.x, md->bl.y, tbl->x,
tbl->y)) >= md->min_chase || !md->lootitem)
{
// 遠すぎるかアイテムがなくなった
- mob_unlocktarget (md, tick);
- if (md->state.state == MS_WALK)
- mob_stop_walking (md, 1); // 歩行中なら停止
+ mob_unlocktarget(md, tick);
+ if (md->state.state == MS::WALK)
+ mob_stop_walking(md, 1); // 歩行中なら停止
}
else if (dist)
{
- if (!(mode & 1))
+ if (!bool(mode & MobMode::CAN_MOVE))
{ // 移動しないモード
- mob_unlocktarget (md, tick);
- return 0;
+ mob_unlocktarget(md, tick);
+ return;
}
- if (!mob_can_move (md)) // 動けない状態にある
- return 0;
- md->state.skillstate = MSS_LOOT; // ルート時スキル使用
- mobskill_use (md, tick, -1);
-// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) )
- if (md->timer != -1 && md->state.state != MS_ATTACK
- && (DIFF_TICK (md->next_walktime, tick) < 0
- || distance (md->to_x, md->to_y, tbl->x,
- tbl->y) <= 0))
- return 0; // 既に移動中
- md->next_walktime = tick + 500;
+ if (!mob_can_move(md)) // 動けない状態にある
+ return;
+ md->state.skillstate = MobSkillState::MSS_LOOT; // ルート時スキル使用
+ mobskill_use(md, tick, MobSkillCondition::ANY);
+ if (md->timer && md->state.state != MS::ATTACK
+ && (md->next_walktime < tick
+ || distance(md->to_x, md->to_y, tbl->x, tbl->y) <= 0))
+ return; // 既に移動中
+ md->next_walktime = tick + std::chrono::milliseconds(500);
dx = tbl->x - md->bl.x;
dy = tbl->y - md->bl.y;
-/* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){
- dx=tbl->x - md->bl.x;
- dy=tbl->y - md->bl.y;
- }*/
- ret = mob_walktoxy (md, md->bl.x + dx, md->bl.y + dy, 0);
+ ret = mob_walktoxy(md, md->bl.x + dx, md->bl.y + dy, 0);
if (ret)
- mob_unlocktarget (md, tick); // 移動できないのでタゲ解除(IWとか?)
+ mob_unlocktarget(md, tick); // 移動できないのでタゲ解除(IWとか?)
}
else
{ // アイテムまでたどり着いた
- if (md->state.state == MS_ATTACK)
- return 0; // 攻撃中
- if (md->state.state == MS_WALK)
- mob_stop_walking (md, 1); // 歩行中なら停止
+ if (md->state.state == MS::ATTACK)
+ return; // 攻撃中
+ if (md->state.state == MS::WALK)
+ mob_stop_walking(md, 1); // 歩行中なら停止
fitem = (struct flooritem_data *) tbl;
if (md->lootitem_count < LOOTITEM_SIZE)
- memcpy (&md->lootitem[md->lootitem_count++],
- &fitem->item_data, sizeof (md->lootitem[0]));
+ memcpy(&md->lootitem[md->lootitem_count++],
+ &fitem->item_data, sizeof(md->lootitem[0]));
else if (battle_config.monster_loot_type == 1
&& md->lootitem_count >= LOOTITEM_SIZE)
{
- mob_unlocktarget (md, tick);
- return 0;
+ mob_unlocktarget(md, tick);
+ return;
}
else
{
for (i = 0; i < LOOTITEM_SIZE - 1; i++)
- memcpy (&md->lootitem[i], &md->lootitem[i + 1],
- sizeof (md->lootitem[0]));
- memcpy (&md->lootitem[LOOTITEM_SIZE - 1],
- &fitem->item_data, sizeof (md->lootitem[0]));
+ memcpy(&md->lootitem[i], &md->lootitem[i + 1],
+ sizeof(md->lootitem[0]));
+ memcpy(&md->lootitem[LOOTITEM_SIZE - 1],
+ &fitem->item_data, sizeof(md->lootitem[0]));
}
- map_clearflooritem (tbl->id);
- mob_unlocktarget (md, tick);
+ map_clearflooritem(tbl->id);
+ mob_unlocktarget(md, tick);
}
- return 0;
+ return;
}
}
else
{
- mob_unlocktarget (md, tick);
- if (md->state.state == MS_WALK)
- mob_stop_walking (md, 4); // 歩行中なら停止
- return 0;
+ mob_unlocktarget(md, tick);
+ if (md->state.state == MS::WALK)
+ mob_stop_walking(md, 4); // 歩行中なら停止
+ return;
}
}
// It is skill use at the time of /standby at the time of a walk.
- if (mobskill_use (md, tick, -1))
- return 0;
-
- // 歩行処理
- if (mode & 1 && mob_can_move (md) && // 移動可能MOB&動ける状態にある
- (md->master_id == 0 || md->state.special_mob_ai
- || md->master_dist > 10))
- { //取り巻きMOBじゃない
+ if (mobskill_use(md, tick, MobSkillCondition::ANY))
+ return;
- if (DIFF_TICK (md->next_walktime, tick) > +7000 &&
- (md->walkpath.path_len == 0
- || md->walkpath.path_pos >= md->walkpath.path_len))
+ // mobs that are not slaves can random-walk
+ if (bool(mode & MobMode::CAN_MOVE)
+ && mob_can_move(md)
+ && (md->master_id == 0 || md->state.special_mob_ai
+ || md->master_dist > 10))
+ {
+ // if walktime is more than 7 seconds in the future,
+ // set it to somewhere between 3 and 5 seconds
+ if (md->next_walktime > tick + std::chrono::seconds(7)
+ && (md->walkpath.path_len == 0
+ || md->walkpath.path_pos >= md->walkpath.path_len))
{
- md->next_walktime = tick + 3000 * MRAND (2000);
+ md->next_walktime = tick + std::chrono::seconds(3)
+ + std::chrono::milliseconds(random_::to(2000));
}
// Random movement
- if (mob_randomwalk (md, tick))
- return 0;
+ if (mob_randomwalk(md, tick))
+ return;
}
// Since he has finished walking, it stands by.
if (md->walkpath.path_len == 0
|| md->walkpath.path_pos >= md->walkpath.path_len)
- md->state.skillstate = MSS_IDLE;
- return 0;
+ md->state.skillstate = MobSkillState::MSS_IDLE;
}
/*==========================================
* Serious processing for mob in PC field of view (foreachclient)
*------------------------------------------
*/
-static int mob_ai_sub_foreachclient (struct map_session_data *sd, va_list ap)
+static
+void mob_ai_sub_foreachclient(struct map_session_data *sd, tick_t tick)
{
- unsigned int tick;
- nullpo_retr (0, sd);
- nullpo_retr (0, ap);
+ nullpo_retv(sd);
- tick = va_arg (ap, unsigned int);
- map_foreachinarea (mob_ai_sub_hard, sd->bl.m,
- sd->bl.x - AREA_SIZE * 2, sd->bl.y - AREA_SIZE * 2,
- sd->bl.x + AREA_SIZE * 2, sd->bl.y + AREA_SIZE * 2,
- BL_MOB, tick);
-
- return 0;
+ map_foreachinarea(std::bind(mob_ai_sub_hard, ph::_1, tick),
+ sd->bl.m, sd->bl.x - AREA_SIZE * 2, sd->bl.y - AREA_SIZE * 2,
+ sd->bl.x + AREA_SIZE * 2, sd->bl.y + AREA_SIZE * 2, BL::MOB);
}
/*==========================================
* Serious processing for mob in PC field of view (interval timer function)
*------------------------------------------
*/
-static void mob_ai_hard (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+static
+void mob_ai_hard(TimerData *, tick_t tick)
{
- clif_foreachclient (mob_ai_sub_foreachclient, tick);
+ clif_foreachclient(std::bind(mob_ai_sub_foreachclient, ph::_1, tick));
}
/*==========================================
* Negligent mode MOB AI (PC is not in near)
*------------------------------------------
*/
-static void mob_ai_sub_lazy (db_key_t key, db_val_t data, va_list app)
+static
+void mob_ai_sub_lazy(struct block_list *bl, tick_t tick)
{
- struct mob_data *md = (struct mob_data *)data;
- unsigned int tick;
- va_list ap;
-
- nullpo_retv (md);
- nullpo_retv (app);
- nullpo_retv (ap = va_arg (app, va_list));
+ nullpo_retv(bl);
- if (md == NULL)
+ if (bl->type != BL::MOB)
return;
- if (!md->bl.type || md->bl.type != BL_MOB)
- return;
+ struct mob_data *md = (struct mob_data *)bl;
- tick = va_arg (ap, unsigned int);
-
- if (DIFF_TICK (tick, md->last_thinktime) < MIN_MOBTHINKTIME * 10)
+ if (tick < md->last_thinktime + MIN_MOBTHINKTIME * 10)
return;
md->last_thinktime = tick;
- if (md->bl.prev == NULL || md->skilltimer != -1)
+ if (md->bl.prev == NULL || md->skilltimer)
{
- if (DIFF_TICK (tick, md->next_walktime) > MIN_MOBTHINKTIME * 10)
+ if (tick > md->next_walktime + MIN_MOBTHINKTIME * 10)
md->next_walktime = tick;
return;
}
- if (DIFF_TICK (md->next_walktime, tick) < 0 &&
- (mob_db[md->mob_class].mode & 1) && mob_can_move (md))
+ if (md->next_walktime < tick
+ && bool(mob_db[md->mob_class].mode & MobMode::CAN_MOVE)
+ && mob_can_move(md))
{
if (map[md->bl.m].users > 0)
@@ -2373,14 +2115,15 @@ static void mob_ai_sub_lazy (db_key_t key, db_val_t data, va_list app)
// Since PC is in the same map, somewhat better negligent processing is carried out.
// It sometimes moves.
- if (MRAND (1000) < MOB_LAZYMOVEPERC)
- mob_randomwalk (md, tick);
+ if (random_::chance(MOB_LAZYMOVEPERC))
+ mob_randomwalk(md, tick);
// MOB which is not not the summons MOB but BOSS, either sometimes reboils.
- else if (MRAND (1000) < MOB_LAZYWARPPERC && md->x0 <= 0
- && md->master_id != 0 && mob_db[md->mob_class].mexp <= 0
- && !(mob_db[md->mob_class].mode & 0x20))
- mob_spawn (md->bl.id);
+ else if (random_::chance(MOB_LAZYWARPPERC)
+ && md->x0 <= 0
+ && md->master_id != 0
+ && !bool(mob_db[md->mob_class].mode & MobMode::BOSS))
+ mob_spawn(md->bl.id);
}
else
@@ -2388,13 +2131,14 @@ static void mob_ai_sub_lazy (db_key_t key, db_val_t data, va_list app)
// Since PC is not even in the same map, suitable processing is carried out even if it takes.
// MOB which is not BOSS which is not Summons MOB, either -- a case -- sometimes -- leaping
- if (MRAND (1000) < MOB_LAZYWARPPERC && md->x0 <= 0
- && md->master_id != 0 && mob_db[md->mob_class].mexp <= 0
- && !(mob_db[md->mob_class].mode & 0x20))
- mob_warp (md, -1, -1, -1, -1);
+ if (random_::chance(MOB_LAZYWARPPERC)
+ && md->x0 <= 0
+ && md->master_id != 0
+ && !bool(mob_db[md->mob_class].mode & MobMode::BOSS))
+ mob_warp(md, -1, -1, -1, BeingRemoveWhy::NEGATIVE1);
}
- md->next_walktime = tick + MPRAND (5000, 10000);
+ md->next_walktime = tick + std::chrono::seconds(5) + std::chrono::milliseconds(random_::to(10 * 1000));
}
}
@@ -2402,9 +2146,11 @@ static void mob_ai_sub_lazy (db_key_t key, db_val_t data, va_list app)
* Negligent processing for mob outside PC field of view (interval timer function)
*------------------------------------------
*/
-static void mob_ai_lazy (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+static
+void mob_ai_lazy(TimerData *, tick_t tick)
{
- map_foreachiddb (mob_ai_sub_lazy, tick);
+ for (auto& pair : id_db)
+ mob_ai_sub_lazy(pair.second, tick);
}
/*==========================================
@@ -2415,14 +2161,14 @@ static void mob_ai_lazy (timer_id tid, tick_t tick, custom_id_t id, custom_data_
*/
struct delay_item_drop
{
- int m, x, y;
- int nameid, amount;
+ int m, x, y;
+ int nameid, amount;
struct map_session_data *first_sd, *second_sd, *third_sd;
};
struct delay_item_drop2
{
- int m, x, y;
+ int m, x, y;
struct item item_data;
struct map_session_data *first_sd, *second_sd, *third_sd;
};
@@ -2431,116 +2177,117 @@ struct delay_item_drop2
* item drop with delay (timer function)
*------------------------------------------
*/
-static void mob_delay_item_drop (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+static
+void mob_delay_item_drop(TimerData *, tick_t, struct delay_item_drop *ditem)
{
- struct delay_item_drop *ditem;
struct item temp_item;
- int flag;
+ PickupFail flag;
- nullpo_retv (ditem = (struct delay_item_drop *) id);
+ nullpo_retv(ditem);
- memset (&temp_item, 0, sizeof (temp_item));
+ memset(&temp_item, 0, sizeof(temp_item));
temp_item.nameid = ditem->nameid;
temp_item.amount = ditem->amount;
- temp_item.identify = !itemdb_isequip3 (temp_item.nameid);
+ temp_item.identify = !itemdb_isequip3(temp_item.nameid);
if (battle_config.item_auto_get == 1)
{
if (ditem->first_sd
&& (flag =
- pc_additem (ditem->first_sd, &temp_item, ditem->amount)))
+ pc_additem(ditem->first_sd, &temp_item, ditem->amount))
+ != PickupFail::OKAY)
{
- clif_additem (ditem->first_sd, 0, 0, flag);
- map_addflooritem (&temp_item, 1, ditem->m, ditem->x, ditem->y,
- ditem->first_sd, ditem->second_sd,
- ditem->third_sd, 0);
+ clif_additem(ditem->first_sd, 0, 0, flag);
+ map_addflooritem(&temp_item, 1,
+ ditem->m, ditem->x, ditem->y,
+ ditem->first_sd, ditem->second_sd, ditem->third_sd);
}
- free (ditem);
+ free(ditem);
return;
}
- map_addflooritem (&temp_item, 1, ditem->m, ditem->x, ditem->y,
- ditem->first_sd, ditem->second_sd, ditem->third_sd, 0);
+ map_addflooritem(&temp_item, 1,
+ ditem->m, ditem->x, ditem->y,
+ ditem->first_sd, ditem->second_sd, ditem->third_sd);
- free (ditem);
+ free(ditem);
}
/*==========================================
* item drop (timer function)-lootitem with delay
*------------------------------------------
*/
-static void mob_delay_item_drop2 (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+static
+void mob_delay_item_drop2(TimerData *, tick_t, struct delay_item_drop2 *ditem)
{
- struct delay_item_drop2 *ditem;
- int flag;
+ PickupFail flag;
- nullpo_retv (ditem = (struct delay_item_drop2 *) id);
+ nullpo_retv(ditem);
if (battle_config.item_auto_get == 1)
{
if (ditem->first_sd
&& (flag =
- pc_additem (ditem->first_sd, &ditem->item_data,
- ditem->item_data.amount)))
+ pc_additem(ditem->first_sd, &ditem->item_data,
+ ditem->item_data.amount))
+ != PickupFail::OKAY)
{
- clif_additem (ditem->first_sd, 0, 0, flag);
- map_addflooritem (&ditem->item_data, ditem->item_data.amount,
- ditem->m, ditem->x, ditem->y, ditem->first_sd,
- ditem->second_sd, ditem->third_sd, 0);
+ clif_additem(ditem->first_sd, 0, 0, flag);
+ map_addflooritem(&ditem->item_data, ditem->item_data.amount,
+ ditem->m, ditem->x, ditem->y,
+ ditem->first_sd, ditem->second_sd, ditem->third_sd);
}
- free (ditem);
+ free(ditem);
return;
}
- map_addflooritem (&ditem->item_data, ditem->item_data.amount, ditem->m,
- ditem->x, ditem->y, ditem->first_sd, ditem->second_sd,
- ditem->third_sd, 0);
+ map_addflooritem(&ditem->item_data, ditem->item_data.amount,
+ ditem->m, ditem->x, ditem->y,
+ ditem->first_sd, ditem->second_sd, ditem->third_sd);
- free (ditem);
+ free(ditem);
}
/*==========================================
* mob data is erased.
*------------------------------------------
*/
-int mob_delete (struct mob_data *md)
+int mob_delete(struct mob_data *md)
{
- nullpo_retr (1, md);
+ nullpo_retr(1, md);
if (md->bl.prev == NULL)
return 1;
- mob_changestate (md, MS_DEAD, 0);
- clif_clearchar_area (&md->bl, 1);
- map_delblock (&md->bl);
- if (mob_get_viewclass (md->mob_class) <= 1000)
- clif_clearchar_delay (gettick () + 3000, &md->bl, 0);
- mob_deleteslave (md);
- mob_setdelayspawn (md->bl.id);
+ mob_changestate(md, MS::DEAD, 0);
+ clif_clearchar(&md->bl, BeingRemoveWhy::DEAD);
+ map_delblock(&md->bl);
+ mob_deleteslave(md);
+ mob_setdelayspawn(md->bl.id);
return 0;
}
-int mob_catch_delete (struct mob_data *md, int type)
+int mob_catch_delete(struct mob_data *md, BeingRemoveWhy type)
{
- nullpo_retr (1, md);
+ nullpo_retr(1, md);
if (md->bl.prev == NULL)
return 1;
- mob_changestate (md, MS_DEAD, 0);
- clif_clearchar_area (&md->bl, type);
- map_delblock (&md->bl);
- mob_setdelayspawn (md->bl.id);
+ mob_changestate(md, MS::DEAD, 0);
+ clif_clearchar(&md->bl, type);
+ map_delblock(&md->bl);
+ mob_setdelayspawn(md->bl.id);
return 0;
}
-void mob_timer_delete (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void mob_timer_delete(TimerData *, tick_t, int id)
{
- struct block_list *bl = map_id2bl (id);
+ struct block_list *bl = map_id2bl(id);
struct mob_data *md;
- nullpo_retv (bl);
+ nullpo_retv(bl);
md = (struct mob_data *) bl;
- mob_catch_delete (md, 3);
+ mob_catch_delete(md, BeingRemoveWhy::WARPED);
}
/*==========================================
@@ -2548,37 +2295,36 @@ void mob_timer_delete (timer_id tid, tick_t tick, custom_id_t id, custom_data_t
*------------------------------------------
*/
static
-int mob_deleteslave_sub (struct block_list *bl, va_list ap)
+void mob_deleteslave_sub(struct block_list *bl, int id)
{
struct mob_data *md;
- int id;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, md = (struct mob_data *) bl);
+ nullpo_retv(bl);
+ md = (struct mob_data *) bl;
- id = va_arg (ap, int);
if (md->master_id > 0 && md->master_id == id)
- mob_damage (NULL, md, md->hp, 1);
- return 0;
+ mob_damage(NULL, md, md->hp, 1);
}
/*==========================================
*
*------------------------------------------
*/
-int mob_deleteslave (struct mob_data *md)
+int mob_deleteslave(struct mob_data *md)
{
- nullpo_retr (0, md);
+ nullpo_ret(md);
- map_foreachinarea (mob_deleteslave_sub, md->bl.m,
- 0, 0, map[md->bl.m].xs, map[md->bl.m].ys,
- BL_MOB, md->bl.id);
+ map_foreachinarea(std::bind(mob_deleteslave_sub, ph::_1, md->bl.id),
+ md->bl.m, 0, 0,
+ map[md->bl.m].xs, map[md->bl.m].ys, BL::MOB);
return 0;
}
-#define DAMAGE_BONUS_COUNT 6 // max. number of players to account for
-const static double damage_bonus_factor[DAMAGE_BONUS_COUNT + 1] = {
+// max. number of players to account for
+constexpr int DAMAGE_BONUS_COUNT = 6;
+const static
+double damage_bonus_factor[DAMAGE_BONUS_COUNT + 1] =
+{
1.0, 1.0, 2.0, 2.5, 2.75, 2.9, 3.0
};
@@ -2586,7 +2332,7 @@ const static double damage_bonus_factor[DAMAGE_BONUS_COUNT + 1] = {
* It is the damage of sd to damage to md.
*------------------------------------------
*/
-int mob_damage (struct block_list *src, struct mob_data *md, int damage,
+int mob_damage(struct block_list *src, struct mob_data *md, int damage,
int type)
{
int count, minpos, mindmg;
@@ -2594,64 +2340,62 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
struct
{
struct party *p;
- int id, base_exp, job_exp;
+ int id, base_exp, job_exp;
} pt[DAMAGELOG_SIZE];
- int pnum = 0;
- int mvp_damage, max_hp;
- unsigned int tick = gettick ();
+ int pnum = 0;
+ int mvp_damage, max_hp;
+ tick_t tick = gettick();
struct map_session_data *mvp_sd = NULL, *second_sd = NULL, *third_sd =
NULL;
- double dmg_rate, tdmg, temp;
- struct item item;
- int ret;
- int skill, sp;
+ double tdmg;
- nullpo_retr (0, md); //srcはNULLで呼ばれる場合もあるので、他でチェック
+ nullpo_ret(md); //srcはNULLで呼ばれる場合もあるので、他でチェック
if (src && src->id == md->master_id
- && md->mode & MOB_MODE_TURNS_AGAINST_BAD_MASTER)
+ && bool(md->mode & MobMode::TURNS_AGAINST_BAD_MASTER))
{
/* If the master hits a monster, have the monster turn against him */
md->master_id = 0;
- md->mode = 0x85; /* Regular war mode */
+ md->mode = MobMode::war; /* Regular war mode */
md->target_id = src->id;
md->attacked_id = src->id;
}
- max_hp = battle_get_max_hp (&md->bl);
+ max_hp = battle_get_max_hp(&md->bl);
- if (src && src->type == BL_PC)
+ if (src && src->type == BL::PC)
{
sd = (struct map_session_data *) src;
mvp_sd = sd;
}
// if(battle_config.battle_log)
-// printf("mob_damage %d %d %d\n",md->hp,max_hp,damage);
+// PRINTF("mob_damage %d %d %d\n",md->hp,max_hp,damage);
if (md->bl.prev == NULL)
{
if (battle_config.error_log == 1)
- printf ("mob_damage : BlockError!!\n");
+ PRINTF("mob_damage : BlockError!!\n");
return 0;
}
- if (md->state.state == MS_DEAD || md->hp <= 0)
+ if (md->state.state == MS::DEAD || md->hp <= 0)
{
if (md->bl.prev != NULL)
{
- mob_changestate (md, MS_DEAD, 0);
- mobskill_use (md, tick, -1); // It is skill at the time of death.
- clif_clearchar_area (&md->bl, 1);
- map_delblock (&md->bl);
- mob_setdelayspawn (md->bl.id);
+ mob_changestate(md, MS::DEAD, 0);
+ // It is skill at the time of death.
+ mobskill_use(md, tick, MobSkillCondition::ANY);
+
+ clif_clearchar(&md->bl, BeingRemoveWhy::DEAD);
+ map_delblock(&md->bl);
+ mob_setdelayspawn(md->bl.id);
}
return 0;
}
- if (md->sc_data[SC_ENDURE].timer == -1)
- mob_stop_walking (md, 3);
+ mob_stop_walking(md, 3);
if (damage > max_hp >> 2)
- skill_stop_dancing (&md->bl, 0);
+ skill_stop_dancing(&md->bl, 0);
if (md->hp > max_hp)
md->hp = max_hp;
@@ -2692,20 +2436,20 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
if (md->attacked_id <= 0 && md->state.special_mob_ai == 0)
md->attacked_id = sd->bl.id;
}
- if (src && src->type == BL_MOB
+ if (src && src->type == BL::MOB
&& ((struct mob_data *) src)->state.special_mob_ai)
{
struct mob_data *md2 = (struct mob_data *) src;
- struct block_list *master_bl = map_id2bl (md2->master_id);
- if (master_bl && master_bl->type == BL_PC)
+ struct block_list *master_bl = map_id2bl(md2->master_id);
+ if (master_bl && master_bl->type == BL::PC)
{
- MAP_LOG_PC (((struct map_session_data *) master_bl),
+ MAP_LOG_PC(((struct map_session_data *) master_bl),
"MOB-TO-MOB-DMG FROM MOB%d %d TO MOB%d %d FOR %d",
md2->bl.id, md2->mob_class, md->bl.id, md->mob_class,
damage);
}
- nullpo_retr (0, md2);
+ nullpo_ret(md2);
int i;
for (i = 0, minpos = 0, mindmg = 0x7fffffff; i < DAMAGELOG_SIZE;
i++)
@@ -2739,138 +2483,27 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
md->hp -= damage;
- if (md->mob_class >= 1285 && md->mob_class <= 1287)
- { // guardian hp update [Valaris]
- struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name);
- if (gc)
- {
-
- if (md->bl.id == gc->GID0)
- {
- gc->Ghp0 = md->hp;
- if (gc->Ghp0 <= 0)
- {
- guild_castledatasave (gc->castle_id, 10, 0);
- guild_castledatasave (gc->castle_id, 18, 0);
- }
- }
- if (md->bl.id == gc->GID1)
- {
- gc->Ghp1 = md->hp;
- if (gc->Ghp1 <= 0)
- {
- guild_castledatasave (gc->castle_id, 11, 0);
- guild_castledatasave (gc->castle_id, 19, 0);
- }
- }
- if (md->bl.id == gc->GID2)
- {
- gc->Ghp2 = md->hp;
- if (gc->Ghp2 <= 0)
- {
- guild_castledatasave (gc->castle_id, 12, 0);
- guild_castledatasave (gc->castle_id, 20, 0);
- }
- }
- if (md->bl.id == gc->GID3)
- {
- gc->Ghp3 = md->hp;
- if (gc->Ghp3 <= 0)
- {
- guild_castledatasave (gc->castle_id, 13, 0);
- guild_castledatasave (gc->castle_id, 21, 0);
- }
- }
- if (md->bl.id == gc->GID4)
- {
- gc->Ghp4 = md->hp;
- if (gc->Ghp4 <= 0)
- {
- guild_castledatasave (gc->castle_id, 14, 0);
- guild_castledatasave (gc->castle_id, 22, 0);
- }
- }
- if (md->bl.id == gc->GID5)
- {
- gc->Ghp5 = md->hp;
- if (gc->Ghp5 <= 0)
- {
- guild_castledatasave (gc->castle_id, 15, 0);
- guild_castledatasave (gc->castle_id, 23, 0);
- }
- }
- if (md->bl.id == gc->GID6)
- {
- gc->Ghp6 = md->hp;
- if (gc->Ghp6 <= 0)
- {
- guild_castledatasave (gc->castle_id, 16, 0);
- guild_castledatasave (gc->castle_id, 24, 0);
- }
- }
- if (md->bl.id == gc->GID7)
- {
- gc->Ghp7 = md->hp;
- if (gc->Ghp7 <= 0)
- {
- guild_castledatasave (gc->castle_id, 17, 0);
- guild_castledatasave (gc->castle_id, 25, 0);
-
- }
- }
- }
- } // end addition [Valaris]
-
- if (md->option & 2)
- skill_status_change_end (&md->bl, SC_HIDING, -1);
- if (md->option & 4)
- skill_status_change_end (&md->bl, SC_CLOAKING, -1);
-
- if (md->state.special_mob_ai == 2)
- { //スフィアーマイン
- int skillidx = 0;
-
- if ((skillidx =
- mob_skillid2skillidx (md->mob_class, NPC_SELFDESTRUCTION2)) >= 0)
- {
- md->mode |= 0x1;
- md->next_walktime = tick;
- mobskill_use_id (md, &md->bl, skillidx); //自爆詠唱開始
- md->state.special_mob_ai++;
- }
- }
-
if (md->hp > 0)
{
return 0;
}
- MAP_LOG ("MOB%d DEAD", md->bl.id);
+ MAP_LOG("MOB%d DEAD", md->bl.id);
// ----- ここから死亡処理 -----
- map_freeblock_lock ();
- mob_changestate (md, MS_DEAD, 0);
- mobskill_use (md, tick, -1); // 死亡時スキル
+ map_freeblock_lock();
+ // cancels timers
+ mob_changestate(md, MS::DEAD, 0);
+ mobskill_use(md, tick, MobSkillCondition::ANY);
- memset (tmpsd, 0, sizeof (tmpsd));
- memset (pt, 0, sizeof (pt));
+ memset(tmpsd, 0, sizeof(tmpsd));
+ memset(pt, 0, sizeof(pt));
- max_hp = battle_get_max_hp (&md->bl);
+ max_hp = battle_get_max_hp(&md->bl);
- if (src && src->type == BL_MOB)
- mob_unlocktarget ((struct mob_data *) src, tick);
-
- /* ソウルドレイン */
- if (sd && (skill = pc_checkskill (sd, HW_SOULDRAIN)) > 0)
- {
- clif_skill_nodamage (src, &md->bl, HW_SOULDRAIN, skill, 1);
- 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;
- clif_heal (sd->fd, SP_SP, sp);
- }
+ if (src && src->type == BL::MOB)
+ mob_unlocktarget((struct mob_data *) src, tick);
// map外に消えた人は計算から除くので
// overkill分は無いけどsumはmax_hpとは違う
@@ -2882,11 +2515,11 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
{
if (md->dmglog[i].id == 0)
continue;
- tmpsd[i] = map_id2sd (md->dmglog[i].id);
+ tmpsd[i] = map_id2sd(md->dmglog[i].id);
if (tmpsd[i] == NULL)
continue;
count++;
- if (tmpsd[i]->bl.m != md->bl.m || pc_isdead (tmpsd[i]))
+ if (tmpsd[i]->bl.m != md->bl.m || pc_isdead(tmpsd[i]))
continue;
tdmg += (double) md->dmglog[i].dmg;
@@ -2902,31 +2535,25 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
// [MouseJstr]
if ((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1))
{
-
- if ((double) max_hp < tdmg)
- dmg_rate = ((double) max_hp) / tdmg;
- else
- dmg_rate = 1;
-
// 経験値の分配
for (int i = 0; i < DAMAGELOG_SIZE; i++)
{
- int pid, base_exp, job_exp, flag = 1;
+ int pid, base_exp, job_exp, flag = 1;
double per;
struct party *p;
if (tmpsd[i] == NULL || tmpsd[i]->bl.m != md->bl.m)
continue;
/* jAthena's exp formula
- per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./((double)max_hp) * dmg_rate;
- temp = ((double)mob_db[md->mob_class].base_exp * (double)battle_config.base_exp_rate / 100. * per);
- base_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
- if(mob_db[md->mob_class].base_exp > 0 && base_exp < 1) base_exp = 1;
- if(base_exp < 0) base_exp = 0;
- temp = ((double)mob_db[md->mob_class].job_exp * (double)battle_config.job_exp_rate / 100. * per);
- job_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
- if(mob_db[md->mob_class].job_exp > 0 && job_exp < 1) job_exp = 1;
- if(job_exp < 0) job_exp = 0;
+ per = ((double)md->dmglog[i].dmg)* (9.+(double)((count > 6)? 6:count))/10./((double)max_hp) * dmg_rate;
+ temp = ((double)mob_db[md->mob_class].base_exp * (double)battle_config.base_exp_rate / 100. * per);
+ base_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
+ if (mob_db[md->mob_class].base_exp > 0 && base_exp < 1) base_exp = 1;
+ if (base_exp < 0) base_exp = 0;
+ temp = ((double)mob_db[md->mob_class].job_exp * (double)battle_config.job_exp_rate / 100. * per);
+ job_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
+ if (mob_db[md->mob_class].job_exp > 0 && job_exp < 1) job_exp = 1;
+ if (job_exp < 0) job_exp = 0;
*/
//eAthena's exp formula rather than jAthena's
// per=(double)md->dmglog[i].dmg*256*(9+(double)((count > 6)? 6:count))/10/(double)max_hp;
@@ -2940,7 +2567,7 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
base_exp =
((mob_db[md->mob_class].base_exp *
- md->stats[MOB_XP_BONUS]) >> MOB_XP_BONUS_SHIFT) * per / 256;
+ md->stats[mob_stat::XP_BONUS]) >> MOB_XP_BONUS_SHIFT) * per / 256;
if (base_exp < 1)
base_exp = 1;
if (sd && md && battle_config.pk_mode == 1
@@ -2965,13 +2592,13 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
if ((pid = tmpsd[i]->status.party_id) > 0)
{ // パーティに入っている
- int j = 0;
+ int j = 0;
for (j = 0; j < pnum; j++) // 公平パーティリストにいるかどうか
if (pt[j].id == pid)
break;
if (j == pnum)
{ // いないときは公平かどうか確認
- if ((p = party_search (pid)) != NULL && p->exp != 0)
+ if ((p = party_search(pid)) != NULL && p->exp != 0)
{
pt[pnum].id = pid;
pt[pnum].p = p;
@@ -2989,11 +2616,12 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
}
}
if (flag) // 各自所得
- pc_gainexp (tmpsd[i], base_exp, job_exp);
+ pc_gainexp_reason(tmpsd[i], base_exp, job_exp,
+ PC_GAINEXP_REASON::KILLING);
}
// 公平分配
for (int i = 0; i < pnum; i++)
- party_exp_share (pt[i].p, md->bl.m, pt[i].base_exp,
+ party_exp_share(pt[i].p, md->bl.m, pt[i].base_exp,
pt[i].job_exp);
// item drop
@@ -3002,26 +2630,23 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
for (int i = 0; i < 8; i++)
{
struct delay_item_drop *ditem;
- int drop_rate;
if (md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) // Added [Valaris]
break; // End
if (mob_db[md->mob_class].dropitem[i].nameid <= 0)
continue;
- drop_rate = mob_db[md->mob_class].dropitem[i].p;
- if (drop_rate <= 0 && battle_config.drop_rate0item == 1)
- drop_rate = 1;
+ random_::Fixed<int, 10000> drop_rate = mob_db[md->mob_class].dropitem[i].p;
if (battle_config.drops_by_luk > 0 && sd && md)
- drop_rate += (sd->status.luk * battle_config.drops_by_luk) / 100; // drops affected by luk [Valaris]
+ drop_rate.num += (sd->status.attrs[ATTR::LUK] * battle_config.drops_by_luk) / 100; // drops affected by luk [Valaris]
if (sd && md && battle_config.pk_mode == 1
&& (mob_db[md->mob_class].lv - sd->status.base_level >= 20))
- drop_rate *= 1.25; // pk_mode increase drops if 20 level difference [Valaris]
- if (drop_rate <= MRAND (10000))
+ drop_rate.num *= 1.25; // pk_mode increase drops if 20 level difference [Valaris]
+ if (!random_::chance(drop_rate))
continue;
ditem = (struct delay_item_drop *)
- calloc (1, sizeof (struct delay_item_drop));
+ calloc(1, sizeof(struct delay_item_drop));
ditem->nameid = mob_db[md->mob_class].dropitem[i].nameid;
ditem->amount = 1;
ditem->m = md->bl.m;
@@ -3030,43 +2655,10 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
ditem->first_sd = mvp_sd;
ditem->second_sd = second_sd;
ditem->third_sd = third_sd;
- add_timer (tick + 500 + i, mob_delay_item_drop, (int) ditem, 0);
- }
- if (sd && sd->state.attack_type == BF_WEAPON)
- {
- for (int i = 0; i < sd->monster_drop_item_count; i++)
- {
- struct delay_item_drop *ditem;
- int race = battle_get_race (&md->bl);
- if (sd->monster_drop_itemid[i] <= 0)
- continue;
- if (sd->monster_drop_race[i] & (1 << race) ||
- (mob_db[md->mob_class].mode & 0x20
- && sd->monster_drop_race[i] & 1 << 10)
- || (!(mob_db[md->mob_class].mode & 0x20)
- && sd->monster_drop_race[i] & 1 << 11))
- {
- if (sd->monster_drop_itemrate[i] <= MRAND (10000))
- continue;
-
- ditem = (struct delay_item_drop *)
- calloc (1, sizeof (struct delay_item_drop));
- ditem->nameid = sd->monster_drop_itemid[i];
- ditem->amount = 1;
- ditem->m = md->bl.m;
- ditem->x = md->bl.x;
- ditem->y = md->bl.y;
- ditem->first_sd = mvp_sd;
- ditem->second_sd = second_sd;
- ditem->third_sd = third_sd;
- add_timer (tick + 520 + i, mob_delay_item_drop,
- (int) ditem, 0);
- }
- }
- if (sd->get_zeny_num > 0)
- pc_getzeny (sd,
- mob_db[md->mob_class].lv * 10 +
- MRAND ((sd->get_zeny_num + 1)));
+ Timer(tick + std::chrono::milliseconds(500) + static_cast<interval_t>(i),
+ std::bind(mob_delay_item_drop, ph::_1, ph::_2,
+ ditem)
+ ).detach();
}
if (md->lootitem)
{
@@ -3075,80 +2667,25 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
struct delay_item_drop2 *ditem;
ditem = (struct delay_item_drop2 *)
- calloc (1, sizeof (struct delay_item_drop2));
- memcpy (&ditem->item_data, &md->lootitem[i],
- sizeof (md->lootitem[0]));
+ calloc(1, sizeof(struct delay_item_drop2));
+ memcpy(&ditem->item_data, &md->lootitem[i],
+ sizeof(md->lootitem[0]));
ditem->m = md->bl.m;
ditem->x = md->bl.x;
ditem->y = md->bl.y;
ditem->first_sd = mvp_sd;
ditem->second_sd = second_sd;
ditem->third_sd = third_sd;
- add_timer (tick + 540 + i, mob_delay_item_drop2,
- (int) ditem, 0);
+ // ?
+ Timer(tick + std::chrono::milliseconds(540) + static_cast<interval_t>(i),
+ std::bind(mob_delay_item_drop2, ph::_1, ph::_2,
+ ditem)
+ ).detach();
}
}
}
-
- // mvp処理
- if (mvp_sd && mob_db[md->mob_class].mexp > 0)
- {
- int j;
- int mexp = battle_get_mexp (&md->bl);
- temp =
- ((double) mexp * (double) battle_config.mvp_exp_rate *
- (9. + (double) count) / 1000.);
- mexp = (temp > 2147483647.) ? 0x7fffffff : (int) temp;
- if (mexp < 1)
- mexp = 1;
- clif_mvp_effect (mvp_sd); // エフェクト
- clif_mvp_exp (mvp_sd, mexp);
- pc_gainexp (mvp_sd, mexp, 0);
- for (j = 0; j < 3; j++)
- {
- int i = MRAND (3);
- if (mob_db[md->mob_class].mvpitem[i].nameid <= 0)
- continue;
- int drop_rate = mob_db[md->mob_class].mvpitem[i].p;
- if (drop_rate <= 0 && battle_config.drop_rate0item == 1)
- drop_rate = 1;
- if (drop_rate < battle_config.item_drop_mvp_min)
- drop_rate = battle_config.item_drop_mvp_min;
- if (drop_rate > battle_config.item_drop_mvp_max)
- drop_rate = battle_config.item_drop_mvp_max;
- if (drop_rate <= MRAND (10000))
- continue;
- memset (&item, 0, sizeof (item));
- item.nameid = mob_db[md->mob_class].mvpitem[i].nameid;
- item.identify = !itemdb_isequip3 (item.nameid);
- clif_mvp_item (mvp_sd, item.nameid);
- if (mvp_sd->weight * 2 > mvp_sd->max_weight)
- map_addflooritem (&item, 1, mvp_sd->bl.m, mvp_sd->bl.x,
- mvp_sd->bl.y, mvp_sd, second_sd,
- third_sd, 1);
- else if ((ret = pc_additem (mvp_sd, &item, 1)))
- {
- clif_additem (sd, 0, 0, ret);
- map_addflooritem (&item, 1, mvp_sd->bl.m, mvp_sd->bl.x,
- mvp_sd->bl.y, mvp_sd, second_sd,
- third_sd, 1);
- }
- break;
- }
- }
-
} // [MouseJstr]
- // <Agit> NPC Event [OnAgitBreak]
- if (md->npc_event[0]
- && strcmp (((md->npc_event) + strlen (md->npc_event) - 13),
- "::OnAgitBreak") == 0)
- {
- printf ("MOB.C: Run NPC_Event[OnAgitBreak].\n");
- if (agit_flag == 1) //Call to Run NPC_Event[OnAgitBreak]
- guild_agit_break (md);
- }
-
// SCRIPT実行
if (md->npc_event[0])
{
@@ -3159,7 +2696,7 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
else
{
struct map_session_data *tmp_sd;
- int i;
+ int i;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (tmp_sd = (struct map_session_data *)session[i]->session_data)
@@ -3175,95 +2712,14 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
}
}
if (sd)
- npc_event (sd, md->npc_event, 0);
+ npc_event(sd, md->npc_event, 0);
}
- clif_clearchar_area (&md->bl, 1);
- map_delblock (&md->bl);
- if (mob_get_viewclass (md->mob_class) <= 1000)
- clif_clearchar_delay (tick + 3000, &md->bl, 0);
- mob_deleteslave (md);
- mob_setdelayspawn (md->bl.id);
- map_freeblock_unlock ();
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int mob_class_change (struct mob_data *md, int *value)
-{
- unsigned int tick = gettick ();
- int i, c, hp_rate, max_hp, mob_class, count = 0;
-
- nullpo_retr (0, md);
- nullpo_retr (0, value);
-
- if (value[0] <= 1000 || value[0] > 2000)
- return 0;
- if (md->bl.prev == NULL)
- return 0;
-
- while (count < 5 && value[count] > 1000 && value[count] <= 2000)
- count++;
- if (count < 1)
- return 0;
-
- mob_class = value[MRAND (count)];
- if (mob_class <= 1000 || mob_class > 2000)
- return 0;
-
- max_hp = battle_get_max_hp (&md->bl);
- hp_rate = md->hp * 100 / max_hp;
- clif_mob_class_change (md, mob_class);
- md->mob_class = mob_class;
- max_hp = battle_get_max_hp (&md->bl);
- if (battle_config.monster_class_change_full_recover == 1)
- {
- md->hp = max_hp;
- memset (md->dmglog, 0, sizeof (md->dmglog));
- }
- else
- md->hp = max_hp * hp_rate / 100;
- if (md->hp > max_hp)
- md->hp = max_hp;
- else if (md->hp < 1)
- md->hp = 1;
-
- memcpy (md->name, mob_db[mob_class].jname, 24);
- memset (&md->state, 0, sizeof (md->state));
- md->attacked_id = 0;
- md->target_id = 0;
- md->move_fail_count = 0;
-
- md->stats[MOB_SPEED] = mob_db[md->mob_class].speed;
- md->def_ele = mob_db[md->mob_class].element;
-
- mob_changestate (md, MS_IDLE, 0);
- skill_castcancel (&md->bl, 0);
- md->state.skillstate = MSS_IDLE;
- md->last_thinktime = tick;
- md->next_walktime = tick + MPRAND (5000, 50);
- md->attackabletime = tick;
- md->canmove_tick = tick;
- md->sg_count = 0;
-
- for (i = 0, c = tick - 1000 * 3600 * 10; i < MAX_MOBSKILL; i++)
- md->skilldelay[i] = c;
- md->skillid = 0;
- md->skilllv = 0;
-
- if (md->lootitem == NULL && mob_db[mob_class].mode & 0x02)
- md->lootitem = (struct item *)
- calloc (LOOTITEM_SIZE, sizeof (struct item));
-
- skill_clear_unitgroup (&md->bl);
- skill_cleartimerskill (&md->bl);
-
- clif_clearchar_area (&md->bl, 0);
- clif_spawnmob (md);
+ clif_clearchar(&md->bl, BeingRemoveWhy::DEAD);
+ map_delblock(&md->bl);
+ mob_deleteslave(md);
+ mob_setdelayspawn(md->bl.id);
+ map_freeblock_unlock();
return 0;
}
@@ -3272,40 +2728,16 @@ int mob_class_change (struct mob_data *md, int *value)
* mob回復
*------------------------------------------
*/
-int mob_heal (struct mob_data *md, int heal)
+int mob_heal(struct mob_data *md, int heal)
{
- int max_hp = battle_get_max_hp (&md->bl);
+ int max_hp = battle_get_max_hp(&md->bl);
- nullpo_retr (0, md);
+ nullpo_ret(md);
md->hp += heal;
if (max_hp < md->hp)
md->hp = max_hp;
- if (md->mob_class >= 1285 && md->mob_class <= 1287)
- { // guardian hp update [Valaris]
- struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name);
- if (gc)
- {
- if (md->bl.id == gc->GID0)
- gc->Ghp0 = md->hp;
- if (md->bl.id == gc->GID1)
- gc->Ghp1 = md->hp;
- if (md->bl.id == gc->GID2)
- gc->Ghp2 = md->hp;
- if (md->bl.id == gc->GID3)
- gc->Ghp3 = md->hp;
- if (md->bl.id == gc->GID4)
- gc->Ghp4 = md->hp;
- if (md->bl.id == gc->GID5)
- gc->Ghp5 = md->hp;
- if (md->bl.id == gc->GID6)
- gc->Ghp6 = md->hp;
- if (md->bl.id == gc->GID7)
- gc->Ghp7 = md->hp;
- }
- } // end addition [Valaris]
-
return 0;
}
@@ -3314,18 +2746,14 @@ int mob_heal (struct mob_data *md, int heal)
*------------------------------------------
*/
static
-int mob_warpslave_sub (struct block_list *bl, va_list ap)
+void mob_warpslave_sub(struct block_list *bl, int id, int x, int y)
{
struct mob_data *md = (struct mob_data *) bl;
- int id, x, y;
- id = va_arg (ap, int);
- x = va_arg (ap, int);
- y = va_arg (ap, int);
+
if (md->master_id == id)
{
- mob_warp (md, -1, x, y, 2);
+ mob_warp(md, -1, x, y, BeingRemoveWhy::QUIT);
}
- return 0;
}
/*==========================================
@@ -3333,13 +2761,12 @@ int mob_warpslave_sub (struct block_list *bl, va_list ap)
*------------------------------------------
*/
static
-int mob_warpslave (struct mob_data *md, int x, int y)
+int mob_warpslave(struct mob_data *md, int x, int y)
{
-//printf("warp slave\n");
- map_foreachinarea (mob_warpslave_sub, md->bl.m,
- x - AREA_SIZE, y - AREA_SIZE,
- x + AREA_SIZE, y + AREA_SIZE, BL_MOB,
- md->bl.id, md->bl.x, md->bl.y);
+//PRINTF("warp slave\n");
+ map_foreachinarea(std::bind(mob_warpslave_sub, ph::_1, md->bl.id, md->bl.x, md->bl.y),
+ md->bl.m, x - AREA_SIZE, y - AREA_SIZE,
+ x + AREA_SIZE, y + AREA_SIZE, BL::MOB);
return 0;
}
@@ -3347,11 +2774,11 @@ int mob_warpslave (struct mob_data *md, int x, int y)
* mobワープ
*------------------------------------------
*/
-int mob_warp (struct mob_data *md, int m, int x, int y, int type)
+int mob_warp(struct mob_data *md, int m, int x, int y, BeingRemoveWhy type)
{
- int i = 0, c, xs = 0, ys = 0, bx = x, by = y;
+ int i = 0, xs = 0, ys = 0, bx = x, by = y;
- nullpo_retr (0, md);
+ nullpo_ret(md);
if (md->bl.prev == NULL)
return 0;
@@ -3359,35 +2786,38 @@ int mob_warp (struct mob_data *md, int m, int x, int y, int type)
if (m < 0)
m = md->bl.m;
- if (type >= 0)
+ if (type != BeingRemoveWhy::NEGATIVE1)
{
if (map[md->bl.m].flag.monster_noteleport)
return 0;
- clif_clearchar_area (&md->bl, type);
+ clif_clearchar(&md->bl, type);
}
- skill_unit_out_all (&md->bl, gettick (), 1);
- map_delblock (&md->bl);
+ map_delblock(&md->bl);
if (bx > 0 && by > 0)
{ // 位置指定の場合周囲9セルを探索
xs = ys = 9;
}
- while ((x < 0 || y < 0 || ((c = read_gat (m, x, y)) == 1 || c == 5))
- && (i++) < 1000)
+ while ((x < 0
+ || y < 0
+ || bool(read_gat(m, x, y) & MapCell::UNWALKABLE))
+ && (i++) < 1000)
{
if (xs > 0 && ys > 0 && i < 250)
- { // 指定位置付近の探索
- x = MPRAND (bx, xs) - xs / 2;
- y = MPRAND (by, ys) - ys / 2;
+ {
+ // 指定位置付近の探索
+ x = bx + random_::to(xs) - xs / 2;
+ y = by + random_::to(ys) - ys / 2;
}
else
- { // 完全ランダム探索
- x = MPRAND (1, (map[m].xs - 2));
- y = MPRAND (1, (map[m].ys - 2));
+ {
+ // 完全ランダム探索
+ x = random_::in(1, map[m].xs - 2);
+ y = random_::in(1, map[m].ys - 2);
}
}
- md->dir = 0;
+ md->dir = DIR::S;
if (i < 1000)
{
md->bl.x = md->to_x = x;
@@ -3396,29 +2826,29 @@ int mob_warp (struct mob_data *md, int m, int x, int y, int type)
}
else
{
- m = md->bl.m;
if (battle_config.error_log == 1)
- printf ("MOB %d warp failed, mob_class = %d\n", md->bl.id, md->mob_class);
+ PRINTF("MOB %d warp failed, mob_class = %d\n", md->bl.id, md->mob_class);
}
md->target_id = 0; // タゲを解除する
- md->state.targettype = NONE_ATTACKABLE;
+ md->state.attackable = false;
md->attacked_id = 0;
- md->state.skillstate = MSS_IDLE;
- mob_changestate (md, MS_IDLE, 0);
+ md->state.skillstate = MobSkillState::MSS_IDLE;
+ mob_changestate(md, MS::IDLE, 0);
- if (type > 0 && i == 1000)
+ if (type != BeingRemoveWhy::GONE && type != BeingRemoveWhy::NEGATIVE1
+ && i == 1000)
{
if (battle_config.battle_log == 1)
- printf ("MOB %d warp to (%d,%d), mob_class = %d\n", md->bl.id, x, y,
+ PRINTF("MOB %d warp to (%d,%d), mob_class = %d\n", md->bl.id, x, y,
md->mob_class);
}
- map_addblock (&md->bl);
- if (type > 0)
+ map_addblock(&md->bl);
+ if (type != BeingRemoveWhy::GONE && type != BeingRemoveWhy::NEGATIVE1)
{
- clif_spawnmob (md);
- mob_warpslave (md, md->bl.x, md->bl.y);
+ clif_spawnmob(md);
+ mob_warpslave(md, md->bl.x, md->bl.y);
}
return 0;
@@ -3429,21 +2859,15 @@ int mob_warp (struct mob_data *md, int m, int x, int y, int type)
*------------------------------------------
*/
static
-int mob_countslave_sub (struct block_list *bl, va_list ap)
+void mob_countslave_sub(struct block_list *bl, int id, int *c)
{
- int id, *c;
struct mob_data *md;
- id = va_arg (ap, int);
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, c = va_arg (ap, int *));
- nullpo_retr (0, md = (struct mob_data *) bl);
+ nullpo_retv(bl);
+ md = (struct mob_data *) bl;
if (md->master_id == id)
(*c)++;
- return 0;
}
/*==========================================
@@ -3451,15 +2875,15 @@ int mob_countslave_sub (struct block_list *bl, va_list ap)
*------------------------------------------
*/
static
-int mob_countslave (struct mob_data *md)
+int mob_countslave(struct mob_data *md)
{
- int c = 0;
+ int c = 0;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- map_foreachinarea (mob_countslave_sub, md->bl.m,
- 0, 0, map[md->bl.m].xs - 1, map[md->bl.m].ys - 1,
- BL_MOB, md->bl.id, &c);
+ map_foreachinarea(std::bind(mob_countslave_sub, ph::_1, md->bl.id, &c),
+ md->bl.m, 0, 0,
+ map[md->bl.m].xs - 1, map[md->bl.m].ys - 1, BL::MOB);
return c;
}
@@ -3467,13 +2891,13 @@ int mob_countslave (struct mob_data *md)
* 手下MOB召喚
*------------------------------------------
*/
-int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag)
+int mob_summonslave(struct mob_data *md2, int *value, int amount, int flag)
{
struct mob_data *md;
- int bx, by, m, count = 0, mob_class, k, a = amount;
+ int bx, by, m, count = 0, mob_class, k, a = amount;
- nullpo_retr (0, md2);
- nullpo_retr (0, value);
+ nullpo_ret(md2);
+ nullpo_ret(value);
bx = md2->bl.x;
by = md2->bl.y;
@@ -3494,19 +2918,21 @@ int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag)
continue;
for (; amount > 0; amount--)
{
- int x = 0, y = 0, c = 0, i = 0;
- md = (struct mob_data *) calloc (1, sizeof (struct mob_data));
- if (mob_db[mob_class].mode & 0x02)
+ int x = 0, y = 0, i = 0;
+ md = (struct mob_data *) calloc(1, sizeof(struct mob_data));
+ if (bool(mob_db[mob_class].mode & MobMode::LOOTER))
md->lootitem = (struct item *)
- calloc (LOOTITEM_SIZE, sizeof (struct item));
+ calloc(LOOTITEM_SIZE, sizeof(struct item));
else
md->lootitem = NULL;
- while ((x <= 0 || y <= 0 || (c = map_getcell (m, x, y)) == 1
- || c == 5) && (i++) < 100)
+ while ((x <= 0
+ || y <= 0
+ || bool(map_getcell(m, x, y) & MapCell::UNWALKABLE))
+ && (i++) < 100)
{
- x = MPRAND (bx, 9) - 4;
- y = MPRAND (by, 9) - 4;
+ x = bx + random_::in(-4, 4);
+ y = by + random_::in(-4, 4);
}
if (i >= 100)
{
@@ -3514,7 +2940,7 @@ int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag)
y = by;
}
- mob_spawn_dataset (md, "--ja--", mob_class);
+ mob_spawn_dataset(md, "--ja--", mob_class);
md->bl.prev = NULL;
md->bl.next = NULL;
md->bl.m = m;
@@ -3526,17 +2952,14 @@ int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag)
md->y0 = y;
md->xs = 0;
md->ys = 0;
- md->stats[MOB_SPEED] = md2->stats[MOB_SPEED];
- md->spawndelay1 = -1; // 一度のみフラグ
- md->spawndelay2 = -1; // 一度のみフラグ
-
- memset (md->npc_event, 0, sizeof (md->npc_event));
- md->bl.type = BL_MOB;
- map_addiddb (&md->bl);
- mob_spawn (md->bl.id);
- clif_skill_nodamage (&md->bl, &md->bl,
- (flag) ? NPC_SUMMONSLAVE : NPC_SUMMONMONSTER,
- a, 1);
+ md->stats[mob_stat::SPEED] = md2->stats[mob_stat::SPEED];
+ md->spawndelay1 = static_cast<interval_t>(-1); // 一度のみフラグ
+ md->spawndelay2 = static_cast<interval_t>(-1); // 一度のみフラグ
+
+ memset(md->npc_event, 0, sizeof(md->npc_event));
+ md->bl.type = BL::MOB;
+ map_addiddb(&md->bl);
+ mob_spawn(md->bl.id);
if (flag)
md->master_id = md2->bl.id;
@@ -3549,76 +2972,49 @@ int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag)
* 自分をロックしているPCの数を数える(foreachclient)
*------------------------------------------
*/
-static int mob_counttargeted_sub (struct block_list *bl, va_list ap)
+static
+void mob_counttargeted_sub(struct block_list *bl,
+ int id, int *c, struct block_list *src, ATK target_lv)
{
- int id, *c, target_lv;
- struct block_list *src;
-
- id = va_arg (ap, int);
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, c = va_arg (ap, int *));
+ nullpo_retv(bl);
+ nullpo_retv(c);
- src = va_arg (ap, struct block_list *);
- target_lv = va_arg (ap, int);
if (id == bl->id || (src && id == src->id))
- return 0;
- if (bl->type == BL_PC)
+ return;
+ if (bl->type == BL::PC)
{
struct map_session_data *sd = (struct map_session_data *) bl;
- if (sd && sd->attacktarget == id && sd->attacktimer != -1
+ if (sd && sd->attacktarget == id && sd->attacktimer
&& sd->attacktarget_lv >= target_lv)
(*c)++;
}
- else if (bl->type == BL_MOB)
+ else if (bl->type == BL::MOB)
{
struct mob_data *md = (struct mob_data *) bl;
- if (md && md->target_id == id && md->timer != -1
- && md->state.state == MS_ATTACK && md->target_lv >= target_lv)
+ if (md && md->target_id == id && md->timer
+ && md->state.state == MS::ATTACK && md->target_lv >= target_lv)
(*c)++;
}
- return 0;
}
/*==========================================
* 自分をロックしているPCの数を数える
*------------------------------------------
*/
-int mob_counttargeted (struct mob_data *md, struct block_list *src,
- int target_lv)
+int mob_counttargeted(struct mob_data *md, struct block_list *src,
+ ATK target_lv)
{
- int c = 0;
+ int c = 0;
- nullpo_retr (0, md);
+ nullpo_ret(md);
- map_foreachinarea (mob_counttargeted_sub, md->bl.m,
- md->bl.x - AREA_SIZE, md->bl.y - AREA_SIZE,
- md->bl.x + AREA_SIZE, md->bl.y + AREA_SIZE, 0,
- md->bl.id, &c, src, target_lv);
+ map_foreachinarea(std::bind(mob_counttargeted_sub, ph::_1, md->bl.id, &c, src, target_lv),
+ md->bl.m, md->bl.x - AREA_SIZE, md->bl.y - AREA_SIZE,
+ md->bl.x + AREA_SIZE, md->bl.y + AREA_SIZE,
+ BL::NUL);
return c;
}
-/*==========================================
- *MOBskillから該当skillidのskillidxを返す
- *------------------------------------------
- */
-int mob_skillid2skillidx (int mob_class, int skillid)
-{
- int i;
- struct mob_skill *ms = mob_db[mob_class].skill;
-
- if (ms == NULL)
- return -1;
-
- for (i = 0; i < mob_db[mob_class].maxskill; i++)
- {
- if (ms[i].skill_id == skillid)
- return i;
- }
- return -1;
-
-}
-
//
// MOBスキル
//
@@ -3627,104 +3023,66 @@ int mob_skillid2skillidx (int mob_class, int skillid)
* スキル使用(詠唱完了、ID指定)
*------------------------------------------
*/
-void mobskill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void mobskill_castend_id(TimerData *, tick_t tick, int id)
{
struct mob_data *md = NULL;
struct block_list *bl;
struct block_list *mbl;
- int range;
+ int range;
- if ((mbl = map_id2bl (id)) == NULL) //詠唱したMobがもういないというのは良くある正常処理
+ if ((mbl = map_id2bl(id)) == NULL) //詠唱したMobがもういないというのは良くある正常処理
return;
if ((md = (struct mob_data *) mbl) == NULL)
{
- printf ("mobskill_castend_id nullpo mbl->id:%d\n", mbl->id);
+ PRINTF("mobskill_castend_id nullpo mbl->id:%d\n", mbl->id);
return;
}
- if (md->bl.type != BL_MOB || md->bl.prev == NULL)
+ if (md->bl.type != BL::MOB || md->bl.prev == NULL)
return;
- if (md->skilltimer != tid) // タイマIDの確認
+
+ if (bool(md->opt1))
return;
- md->skilltimer = -1;
- //沈黙や状態異常など
- if (md->sc_data)
- {
- if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1
- || 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 (md->skillid != NPC_EMOTION)
- md->last_thinktime = tick + battle_get_adelay (&md->bl);
+ if (md->skillid != SkillID::NPC_EMOTION)
+ md->last_thinktime = tick + battle_get_adelay(&md->bl);
- if ((bl = map_id2bl (md->skilltarget)) == NULL || bl->prev == NULL)
+ if ((bl = map_id2bl(md->skilltarget)) == NULL || bl->prev == NULL)
{ //スキルターゲットが存在しない
- //printf("mobskill_castend_id nullpo\n");//ターゲットがいないときはnullpoじゃなくて普通に終了
+ //PRINTF("mobskill_castend_id nullpo\n");//ターゲットがいないときはnullpoじゃなくて普通に終了
return;
}
if (md->bl.m != bl->m)
return;
- if (md->skillid == PR_LEXAETERNA)
- {
- struct status_change *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)
+ if (((skill_get_inf(md->skillid) & 1) || (skill_get_inf2(md->skillid) & 4)) && // 彼我敵対関係チェック
+ battle_check_target(&md->bl, bl, BCT_ENEMY) <= 0)
return;
- range = skill_get_range (md->skillid, md->skilllv);
+ range = skill_get_range(md->skillid, md->skilllv);
if (range < 0)
- range = battle_get_range (&md->bl) - (range + 1);
+ range = battle_get_range(&md->bl) - (range + 1);
if (range + battle_config.mob_skill_add_range <
- distance (md->bl.x, md->bl.y, bl->x, bl->y))
+ distance(md->bl.x, md->bl.y, bl->x, bl->y))
return;
md->skilldelay[md->skillidx] = tick;
if (battle_config.mob_skill_log == 1)
- printf ("MOB skill castend skill=%d, mob_class = %d\n", md->skillid,
- md->mob_class);
- mob_stop_walking (md, 0);
+ PRINTF("MOB skill castend skill=%d, mob_class = %d\n",
+ md->skillid, md->mob_class);
+ mob_stop_walking(md, 0);
- switch (skill_get_nk (md->skillid))
+ switch (skill_get_nk(md->skillid))
{
// 攻撃系/吹き飛ばし系
case 0:
case 2:
- skill_castend_damage_id (&md->bl, bl, md->skillid, md->skilllv,
- tick, 0);
+ skill_castend_damage_id(&md->bl, bl,
+ md->skillid, md->skilllv,
+ tick, BCT_ZERO);
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))
- && battle_check_undead (battle_get_race (bl),
- battle_get_elem_type (bl)))
- skill_castend_damage_id (&md->bl, bl, md->skillid,
- md->skilllv, tick, 0);
- else
- skill_castend_nodamage_id (&md->bl, bl, md->skillid,
- md->skilllv, tick, 0);
+ skill_castend_nodamage_id(&md->bl, bl,
+ md->skillid, md->skilllv);
break;
}
}
@@ -3733,152 +3091,56 @@ void mobskill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data
* スキル使用(詠唱完了、場所指定)
*------------------------------------------
*/
-void mobskill_castend_pos (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void mobskill_castend_pos(TimerData *, tick_t tick, int id)
{
struct mob_data *md = NULL;
struct block_list *bl;
- int range, maxcount;
+ int range;
//mobskill_castend_id同様詠唱したMobが詠唱完了時にもういないというのはありそうなのでnullpoから除外
- if ((bl = map_id2bl (id)) == NULL)
+ if ((bl = map_id2bl(id)) == NULL)
return;
- nullpo_retv (md = (struct mob_data *) bl);
+ md = (struct mob_data *) bl;
+ nullpo_retv(md);
- if (md->bl.type != BL_MOB || md->bl.prev == NULL)
+ if (md->bl.type != BL::MOB || md->bl.prev == NULL)
return;
- if (md->skilltimer != tid) // タイマIDの確認
+ if (bool(md->opt1))
return;
- md->skilltimer = -1;
- if (md->sc_data)
- {
- if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1
- || 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)
- {
- maxcount = skill_get_maxcount (md->skillid);
- if (maxcount > 0)
- {
- int i, c;
- for (i = c = 0; i < MAX_MOBSKILLUNITGROUP; i++)
- {
- if (md->skillunit[i].alive_count > 0
- && md->skillunit[i].skill_id == md->skillid)
- c++;
- }
- if (c >= maxcount)
- return;
- }
- }
-
- range = skill_get_range (md->skillid, md->skilllv);
+ range = skill_get_range(md->skillid, md->skilllv);
if (range < 0)
- range = battle_get_range (&md->bl) - (range + 1);
+ range = battle_get_range(&md->bl) - (range + 1);
if (range + battle_config.mob_skill_add_range <
- distance (md->bl.x, md->bl.y, md->skillx, md->skilly))
+ distance(md->bl.x, md->bl.y, md->skillx, md->skilly))
return;
md->skilldelay[md->skillidx] = tick;
if (battle_config.mob_skill_log == 1)
- 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, 0);
-
- return;
+ PRINTF("MOB skill castend skill=%d, mob_class = %d\n",
+ md->skillid, md->mob_class);
+ mob_stop_walking(md, 0);
}
/*==========================================
* Skill use (an aria start, ID specification)
*------------------------------------------
*/
-int mobskill_use_id (struct mob_data *md, struct block_list *target,
+int mobskill_use_id(struct mob_data *md, struct block_list *target,
int skill_idx)
{
- int casttime, range;
+ int range;
struct mob_skill *ms;
- int skill_id, skill_lv, forcecast = 0;
+ SkillID skill_id;
+ int skill_lv;
- nullpo_retr (0, md);
- nullpo_retr (0, ms = &mob_db[md->mob_class].skill[skill_idx]);
+ nullpo_ret(md);
+ ms = &mob_db[md->mob_class].skill[skill_idx];
+ nullpo_ret(ms);
- if (target == NULL && (target = map_id2bl (md->target_id)) == NULL)
+ if (target == NULL && (target = map_id2bl(md->target_id)) == NULL)
return 0;
if (target->prev == NULL || md->bl.prev == NULL)
@@ -3887,91 +3149,32 @@ int mobskill_use_id (struct mob_data *md, struct block_list *target,
skill_id = ms->skill_id;
skill_lv = ms->skill_lv;
- // 沈黙や異常
- if (md->sc_data)
- {
- if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1
- || 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 (md->option & 4 && skill_id == TF_HIDING)
- return 0;
- if (md->option & 2 && skill_id != TF_HIDING && skill_id != AS_GRIMTOOTH
- && skill_id != RG_BACKSTAP && skill_id != RG_RAID)
- return 0;
-
- if (map[md->bl.m].flag.gvg
- && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT
- || skill_id == AL_WARP || skill_id == WZ_ICEWALL
- || skill_id == TF_BACKSLIDING))
+ if (bool(md->opt1))
return 0;
- if (skill_get_inf2 (skill_id) & 0x200 && md->bl.id == target->id)
+ if (skill_get_inf2(skill_id) & 0x200 && md->bl.id == target->id)
return 0;
// 射程と障害物チェック
- range = skill_get_range (skill_id, skill_lv);
+ range = skill_get_range(skill_id, skill_lv);
if (range < 0)
- range = battle_get_range (&md->bl) - (range + 1);
+ range = battle_get_range(&md->bl) - (range + 1);
- if (!battle_check_range (&md->bl, target, range))
+ if (!battle_check_range(&md->bl, target, range))
return 0;
// delay=skill_delayfix(&md->bl, skill_get_delay( skill_id,skill_lv) );
- casttime = skill_castfix (&md->bl, ms->casttime);
+ interval_t casttime = skill_castfix(&md->bl, ms->casttime);
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)))
- { /* 敵がアンデッドなら */
- forcecast = 1; /* ターンアンデットと同じ詠唱時間 */
- casttime =
- skill_castfix (&md->bl,
- skill_get_cast (PR_TURNUNDEAD, skill_lv));
- }
- break;
- case MO_EXTREMITYFIST: /*阿修羅覇鳳拳 */
- case SA_MAGICROD:
- case SA_SPELLBREAKER:
- forcecast = 1;
- break;
- }
+ md->skilldelay[skill_idx] = gettick();
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, casttime, md->mob_class);
-
- if (casttime > 0 || forcecast)
- { // 詠唱が必要
-// struct mob_data *md2;
- clif_skillcasting (&md->bl,
- md->bl.id, target->id, 0, 0, skill_id, casttime);
-
- // 詠唱反応モンスター
-/* if( target->type==BL_MOB && mob_db[(md2=(struct mob_data *)target)->mob_class].mode&0x10 &&
- md2->state.state!=MS_ATTACK){
- md2->target_id=md->bl.id;
- md->state.targettype = ATTACKABLE;
- md2->min_chase=13;
- }*/
- }
+ PRINTF("MOB skill use target_id=%d skill=%d lv=%d cast=%d, mob_class = %d\n",
+ target->id, skill_id, skill_lv,
+ static_cast<uint32_t>(casttime.count()), md->mob_class);
- if (casttime <= 0) // 詠唱の無いものはキャンセルされない
+ if (casttime <= interval_t::zero()) // 詠唱の無いものはキャンセルされない
md->state.skillcastcancel = 0;
md->skilltarget = target->id;
@@ -3981,20 +3184,16 @@ int mobskill_use_id (struct mob_data *md, struct block_list *target,
md->skilllv = skill_lv;
md->skillidx = skill_idx;
- if (!(battle_config.monster_cloak_check_type & 2)
- && md->sc_data[SC_CLOAKING].timer != -1 && md->skillid != AS_CLOAKING)
- skill_status_change_end (&md->bl, SC_CLOAKING, -1);
-
- if (casttime > 0)
+ if (casttime > interval_t::zero())
{
- md->skilltimer =
- add_timer (gettick () + casttime, mobskill_castend_id, md->bl.id,
- 0);
+ md->skilltimer = Timer(gettick() + casttime,
+ std::bind(mobskill_castend_id, ph::_1, ph::_2,
+ md->bl.id));
}
else
{
- md->skilltimer = -1;
- mobskill_castend_id (md->skilltimer, gettick (), md->bl.id, 0);
+ assert (!md->skilltimer);
+ mobskill_castend_id(nullptr, gettick(), md->bl.id);
}
return 1;
@@ -4005,74 +3204,50 @@ int mobskill_use_id (struct mob_data *md, struct block_list *target,
*------------------------------------------
*/
static
-int mobskill_use_pos (struct mob_data *md,
+int mobskill_use_pos(struct mob_data *md,
int skill_x, int skill_y, int skill_idx)
{
- int casttime = 0, range;
+ int range;
struct mob_skill *ms;
struct block_list bl;
- int skill_id, skill_lv;
+ int skill_lv;
- nullpo_retr (0, md);
- nullpo_retr (0, ms = &mob_db[md->mob_class].skill[skill_idx]);
+ nullpo_ret(md);
+ ms = &mob_db[md->mob_class].skill[skill_idx];
+ nullpo_ret(ms);
if (md->bl.prev == NULL)
return 0;
- skill_id = ms->skill_id;
+ SkillID skill_id = ms->skill_id;
skill_lv = ms->skill_lv;
- //沈黙や状態異常など
- if (md->sc_data)
- {
- if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1
- || 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 (md->option & 2)
- return 0;
-
- if (map[md->bl.m].flag.gvg
- && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT
- || skill_id == AL_WARP || skill_id == WZ_ICEWALL
- || skill_id == TF_BACKSLIDING))
+ if (bool(md->opt1))
return 0;
// 射程と障害物チェック
- bl.type = BL_NUL;
+ bl.type = BL::NUL;
bl.m = md->bl.m;
bl.x = skill_x;
bl.y = skill_y;
- range = skill_get_range (skill_id, skill_lv);
+ range = skill_get_range(skill_id, skill_lv);
if (range < 0)
- range = battle_get_range (&md->bl) - (range + 1);
- if (!battle_check_range (&md->bl, &bl, range))
+ range = battle_get_range(&md->bl) - (range + 1);
+ if (!battle_check_range(&md->bl, &bl, range))
return 0;
// delay=skill_delayfix(&sd->bl, skill_get_delay( skill_id,skill_lv) );
- casttime = skill_castfix (&md->bl, ms->casttime);
- md->skilldelay[skill_idx] = gettick ();
+ interval_t casttime = skill_castfix(&md->bl, ms->casttime);
+ md->skilldelay[skill_idx] = gettick();
md->state.skillcastcancel = ms->cancel;
if (battle_config.mob_skill_log == 1)
- printf
- ("MOB skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d, mob_class = %d\n",
- skill_x, skill_y, skill_id, skill_lv, casttime, md->mob_class);
-
- if (casttime > 0) // A cast time is required.
- clif_skillcasting (&md->bl,
- md->bl.id, 0, skill_x, skill_y, skill_id,
- casttime);
+ PRINTF("MOB skill use target_pos= (%d,%d) skill=%d lv=%d cast=%d, mob_class = %d\n",
+ skill_x, skill_y, skill_id, skill_lv,
+ static_cast<uint32_t>(casttime.count()), md->mob_class);
- if (casttime <= 0) // A skill without a cast time wont be cancelled.
+ if (casttime <= interval_t::zero())
+ // A skill without a cast time wont be cancelled.
md->state.skillcastcancel = 0;
md->skillx = skill_x;
@@ -4081,238 +3256,94 @@ int mobskill_use_pos (struct mob_data *md,
md->skillid = skill_id;
md->skilllv = skill_lv;
md->skillidx = skill_idx;
- if (!(battle_config.monster_cloak_check_type & 2)
- && md->sc_data[SC_CLOAKING].timer != -1)
- skill_status_change_end (&md->bl, SC_CLOAKING, -1);
- if (casttime > 0)
+ if (casttime > interval_t::zero())
{
- md->skilltimer =
- add_timer (gettick () + casttime, mobskill_castend_pos, md->bl.id,
- 0);
+ md->skilltimer = Timer(gettick() + casttime,
+ std::bind(mobskill_castend_pos, ph::_1, ph::_2,
+ md->bl.id));
}
else
{
- md->skilltimer = -1;
- mobskill_castend_pos (md->skilltimer, gettick (), md->bl.id, 0);
+ assert (!md->skilltimer);
+ mobskill_castend_pos(nullptr, gettick(), md->bl.id);
}
return 1;
}
/*==========================================
- * Friendly Mob whose HP is decreasing by a nearby MOB is looked for.
- *------------------------------------------
- */
-static
-int mob_getfriendhpltmaxrate_sub (struct block_list *bl, va_list ap)
-{
- int rate;
- struct mob_data **fr, *md, *mmd;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, mmd = va_arg (ap, struct mob_data *));
-
- md = (struct mob_data *) bl;
-
- if (mmd->bl.id == bl->id)
- return 0;
- rate = va_arg (ap, int);
- fr = va_arg (ap, struct mob_data **);
- if (md->hp < mob_db[md->mob_class].max_hp * rate / 100)
- (*fr) = md;
- return 0;
-}
-
-static
-struct mob_data *mob_getfriendhpltmaxrate (struct mob_data *md, int rate)
-{
- struct mob_data *fr = NULL;
- const int r = 8;
-
- nullpo_retr (NULL, md);
-
- map_foreachinarea (mob_getfriendhpltmaxrate_sub, md->bl.m,
- md->bl.x - r, md->bl.y - r, md->bl.x + r, md->bl.y + r,
- BL_MOB, md, rate, &fr);
- return fr;
-}
-
-/*==========================================
- * What a status state suits by nearby MOB is looked for.
- *------------------------------------------
- */
-static
-int mob_getfriendstatus_sub (struct block_list *bl, va_list ap)
-{
- int cond1, cond2;
- struct mob_data **fr, *md, *mmd;
- int flag = 0;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, md = (struct mob_data *) bl);
- nullpo_retr (0, mmd = va_arg (ap, struct mob_data *));
-
- if (mmd->bl.id == bl->id)
- return 0;
- cond1 = va_arg (ap, int);
- cond2 = va_arg (ap, int);
- fr = va_arg (ap, struct mob_data **);
- if (cond2 == -1)
- {
- int j;
- for (j = SC_STONE; j <= SC_BLIND && !flag; j++)
- {
- flag = (md->sc_data[j].timer != -1);
- }
- }
- else
- flag = (md->sc_data[cond2].timer != -1);
- if (flag ^ (cond1 == MSC_FRIENDSTATUSOFF))
- (*fr) = md;
-
- return 0;
-}
-
-static
-struct mob_data *mob_getfriendstatus (struct mob_data *md, int cond1,
- int cond2)
-{
- struct mob_data *fr = NULL;
- const int r = 8;
-
- nullpo_retr (0, md);
-
- map_foreachinarea (mob_getfriendstatus_sub, md->bl.m,
- md->bl.x - r, md->bl.y - r, md->bl.x + r, md->bl.y + r,
- BL_MOB, md, cond1, cond2, &fr);
- return fr;
-}
-
-/*==========================================
* Skill use judging
*------------------------------------------
*/
-int mobskill_use (struct mob_data *md, unsigned int tick, int event)
+int mobskill_use(struct mob_data *md, tick_t tick,
+ MobSkillCondition event)
{
struct mob_skill *ms;
// struct block_list *target=NULL;
int max_hp;
- nullpo_retr (0, md);
- nullpo_retr (0, ms = mob_db[md->mob_class].skill);
+ nullpo_ret(md);
+ ms = mob_db[md->mob_class].skill;
+ nullpo_ret(ms);
- max_hp = battle_get_max_hp (&md->bl);
+ max_hp = battle_get_max_hp(&md->bl);
- if (battle_config.mob_skill_use == 0 || md->skilltimer != -1)
+ if (battle_config.mob_skill_use == 0 || md->skilltimer)
return 0;
if (md->state.special_mob_ai)
return 0;
- if (md->sc_data[SC_SELFDESTRUCTION].timer != -1) //自爆中はスキルを使わない
- return 0;
-
for (int ii = 0; ii < mob_db[md->mob_class].maxskill; ii++)
{
- int c2 = ms[ii].cond2, flag = 0;
- struct mob_data *fmd = NULL;
+ int flag = 0;
// ディレイ中
- if (DIFF_TICK (tick, md->skilldelay[ii]) < ms[ii].delay)
+ if (tick < md->skilldelay[ii] + ms[ii].delay)
continue;
// 状態判定
- if (ms[ii].state >= 0 && ms[ii].state != md->state.skillstate)
+ if (ms[ii].state != MobSkillState::ANY && ms[ii].state != md->state.skillstate)
continue;
- // 条件判定
+ // Note: these *may* both be MobSkillCondition::ANY
flag = (event == ms[ii].cond1);
if (!flag)
{
switch (ms[ii].cond1)
{
- case MSC_ALWAYS:
+ case MobSkillCondition::MSC_ALWAYS:
flag = 1;
break;
- case MSC_MYHPLTMAXRATE: // HP< maxhp%
- flag = (md->hp < max_hp * c2 / 100);
- break;
- case MSC_MYSTATUSON: // status[num] on
- case MSC_MYSTATUSOFF: // status[num] off
- if (ms[ii].cond2 == -1)
- {
- int j;
- for (j = SC_STONE; j <= SC_BLIND && !flag; j++)
- {
- flag = (md->sc_data[j].timer != -1);
- }
- }
- else
- flag = (md->sc_data[ms[ii].cond2].timer != -1);
- flag ^= (ms[ii].cond1 == MSC_MYSTATUSOFF);
- break;
- case MSC_FRIENDHPLTMAXRATE: // friend HP < maxhp%
- flag =
- ((fmd =
- mob_getfriendhpltmaxrate (md,
- ms[ii].cond2)) != NULL);
- break;
- case MSC_FRIENDSTATUSON: // friend status[num] on
- case MSC_FRIENDSTATUSOFF: // friend status[num] off
- flag =
- ((fmd =
- mob_getfriendstatus (md, ms[ii].cond1,
- ms[ii].cond2)) != NULL);
+ case MobSkillCondition::MSC_MYHPLTMAXRATE: // HP< maxhp%
+ flag = (md->hp < max_hp * ms[ii].cond2i / 100);
break;
- case MSC_NOTINTOWN: // Only outside of towns.
+ case MobSkillCondition::MSC_NOTINTOWN: // Only outside of towns.
flag = !map[md->bl.m].flag.town;
break;
- case MSC_SLAVELT: // slave < num
- flag = (mob_countslave (md) < c2);
+ case MobSkillCondition::MSC_SLAVELT: // slave < num
+ flag = (mob_countslave(md) < ms[ii].cond2i);
break;
- case MSC_ATTACKPCGT: // attack pc > num
- flag = (mob_counttargeted (md, NULL, 0) > c2);
- break;
- case MSC_SLAVELE: // slave <= num
- flag = (mob_countslave (md) <= c2);
- break;
- case MSC_ATTACKPCGE: // attack pc >= num
- flag = (mob_counttargeted (md, NULL, 0) >= c2);
- break;
- case MSC_SKILLUSED: // specificated skill used
- flag = ((event & 0xffff) == MSC_SKILLUSED
- && ((event >> 16) == c2 || c2 == 0));
+ case MobSkillCondition::MSC_SLAVELE: // slave <= num
+ flag = (mob_countslave(md) <= ms[ii].cond2i);
break;
}
}
// 確率判定
- if (flag && MRAND (10000) < ms[ii].permillage)
+ if (flag && random_::chance({ms[ii].permillage, 10000}))
{
- if (skill_get_inf (ms[ii].skill_id) & 2)
+ if (skill_get_inf(ms[ii].skill_id) & 2)
{
// 場所指定
struct block_list *bl = NULL;
- int x = 0, y = 0;
- if (ms[ii].target <= MST_AROUND)
+ int x = 0, y = 0;
{
- if (ms[ii].target == MST_MASTER)
- {
- bl = &md->bl;
- if (md->master_id)
- bl = map_id2bl (md->master_id);
- }
- else
{
- bl = ((ms[ii].target == MST_TARGET
- || ms[ii].target ==
- MST_AROUND5) ? map_id2bl (md->
- target_id)
- : (ms[ii].target ==
- MST_FRIEND) ? &fmd->bl : &md->bl);
+ bl = ms[ii].target == MobSkillTarget::MST_TARGET
+ ? map_id2bl(md->target_id)
+ : &md->bl;
}
if (bl)
@@ -4323,77 +3354,22 @@ int mobskill_use (struct mob_data *md, unsigned int tick, int event)
}
if (x <= 0 || y <= 0)
continue;
- // 自分の周囲
- if (ms[ii].target >= MST_AROUND1)
- {
- int bx = x, by = y, i = 0, c, m = bl->m, r =
- ms[i].target - MST_AROUND1;
- do
- {
- bx = x + MRAND ((r * 2 + 3)) - r;
- by = y + MRAND ((r * 2 + 3)) - r;
- }
- while ((bx <= 0 || by <= 0 || bx >= map[m].xs
- || by >= map[m].ys
- || ((c = read_gat (m, bx, by)) == 1 || c == 5))
- && (i++) < 1000);
- if (i < 1000)
- {
- x = bx;
- y = by;
- }
- }
- // 相手の周囲
- if (ms[ii].target >= MST_AROUND5)
- {
- int bx = x, by = y, i = 0, c, m = bl->m, r =
- (ms[i].target - MST_AROUND5) + 1;
- do
- {
- bx = x + MRAND ((r * 2 + 1)) - r;
- by = y + MRAND ((r * 2 + 1)) - r;
- }
- while ((bx <= 0 || by <= 0 || bx >= map[m].xs
- || by >= map[m].ys
- || ((c = read_gat (m, bx, by)) == 1 || c == 5))
- && (i++) < 1000);
- if (i < 1000)
- {
- x = bx;
- y = by;
- }
- }
- if (!mobskill_use_pos (md, x, y, ii))
+ if (!mobskill_use_pos(md, x, y, ii))
return 0;
-
}
else
{
- if (ms[ii].target == MST_MASTER)
- {
- struct block_list *bl = &md->bl;
- if (md->master_id)
- bl = map_id2bl (md->master_id);
-
- if (bl && !mobskill_use_id (md, bl, ii))
- return 0;
- }
- // ID指定
- if (ms[ii].target <= MST_FRIEND)
{
struct block_list *bl = NULL;
- bl = ((ms[ii].target ==
- MST_TARGET) ? map_id2bl (md->
- target_id) : (ms[ii].target
- ==
- MST_FRIEND)
- ? &fmd->bl : &md->bl);
- if (bl && !mobskill_use_id (md, bl, ii))
+ bl = (ms[ii].target == MobSkillTarget::MST_TARGET)
+ ? map_id2bl(md->target_id)
+ : &md->bl;
+ if (bl && !mobskill_use_id(md, bl, ii))
return 0;
}
}
if (ms[ii].emotion >= 0)
- clif_emotion (&md->bl, ms[ii].emotion);
+ clif_emotion(&md->bl, ms[ii].emotion);
return 1;
}
}
@@ -4405,73 +3381,22 @@ int mobskill_use (struct mob_data *md, unsigned int tick, int event)
* Skill use event processing
*------------------------------------------
*/
-int mobskill_event (struct mob_data *md, int flag)
+int mobskill_event(struct mob_data *md, BF flag)
{
- nullpo_retr (0, md);
+ nullpo_ret(md);
- if (flag == -1 && mobskill_use (md, gettick (), MSC_CASTTARGETED))
+ if (flag == BF::NEGATIVE_1
+ && mobskill_use(md, gettick(), MobSkillCondition::ANY))
return 1;
- if ((flag & BF_SHORT)
- && mobskill_use (md, gettick (), MSC_CLOSEDATTACKED))
+ if (bool(flag & BF::SHORT)
+ && mobskill_use(md, gettick(), MobSkillCondition::ANY))
return 1;
- if ((flag & BF_LONG)
- && mobskill_use (md, gettick (), MSC_LONGRANGEATTACKED))
+ if (bool(flag & BF::LONG)
+ && mobskill_use(md, gettick(), MobSkillCondition::ANY))
return 1;
return 0;
}
-/*==========================================
- * Mobがエンペリウムなどの場合の判定
- *------------------------------------------
- */
-int mob_gvmobcheck (struct map_session_data *sd, struct block_list *bl)
-{
- struct mob_data *md = NULL;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, bl);
-
- if (bl->type == BL_MOB && (md = (struct mob_data *) bl) &&
- (md->mob_class == 1288 || md->mob_class == 1287 || md->mob_class == 1286
- || md->mob_class == 1285))
- {
- struct guild_castle *gc = guild_mapname2gc (map[sd->bl.m].name);
- struct guild *g = guild_search (sd->status.guild_id);
-
- if (g == NULL && md->mob_class == 1288)
- return 0; //ギルド未加入ならダメージ無し
- else if (gc != NULL && !map[sd->bl.m].flag.gvg)
- return 0; //砦内でGvじゃないときはダメージなし
- else if (g && gc != NULL && g->guild_id == gc->guild_id)
- return 0; //自占領ギルドのエンペならダメージ無し
- else if (g && guild_checkskill (g, GD_APPROVAL) <= 0
- && md->mob_class == 1288)
- return 0; //正規ギルド承認がないとダメージ無し
-
- }
-
- return 1;
-}
-
-/*==========================================
- * スキル用タイマー削除
- *------------------------------------------
- */
-int mobskill_deltimer (struct mob_data *md)
-{
- nullpo_retr (0, md);
-
- if (md->skilltimer != -1)
- {
- if (skill_get_inf (md->skillid) & 2)
- delete_timer (md->skilltimer, mobskill_castend_pos);
- else
- delete_timer (md->skilltimer, mobskill_castend_id);
- md->skilltimer = -1;
- }
- return 0;
-}
-
//
// 初期化
//
@@ -4479,12 +3404,13 @@ int mobskill_deltimer (struct mob_data *md)
* Since un-setting [ mob ] up was used, it is an initial provisional value setup.
*------------------------------------------
*/
-static int mob_makedummymobdb (int mob_class)
+static
+int mob_makedummymobdb(int mob_class)
{
- int i;
+ int i;
- sprintf (mob_db[mob_class].name, "mob%d", mob_class);
- sprintf (mob_db[mob_class].jname, "mob%d", mob_class);
+ sprintf(mob_db[mob_class].name, "mob%d", mob_class);
+ sprintf(mob_db[mob_class].jname, "mob%d", mob_class);
mob_db[mob_class].lv = 1;
mob_db[mob_class].max_hp = 1000;
mob_db[mob_class].max_sp = 1;
@@ -4495,39 +3421,27 @@ static int mob_makedummymobdb (int mob_class)
mob_db[mob_class].atk2 = 10;
mob_db[mob_class].def = 0;
mob_db[mob_class].mdef = 0;
- mob_db[mob_class].str = 1;
- mob_db[mob_class].agi = 1;
- mob_db[mob_class].vit = 1;
- mob_db[mob_class].int_ = 1;
- mob_db[mob_class].dex = 6;
- mob_db[mob_class].luk = 2;
+ mob_db[mob_class].attrs[ATTR::STR] = 1;
+ mob_db[mob_class].attrs[ATTR::AGI] = 1;
+ mob_db[mob_class].attrs[ATTR::VIT] = 1;
+ mob_db[mob_class].attrs[ATTR::INT] = 1;
+ mob_db[mob_class].attrs[ATTR::DEX] = 6;
+ mob_db[mob_class].attrs[ATTR::LUK] = 2;
mob_db[mob_class].range2 = 10;
mob_db[mob_class].range3 = 10;
- mob_db[mob_class].size = 0;
- mob_db[mob_class].race = 0;
- mob_db[mob_class].element = 0;
- mob_db[mob_class].mode = 0;
+ mob_db[mob_class].size = 0; // 1
+ mob_db[mob_class].race = Race::formless;
+ mob_db[mob_class].element = LevelElement{0, Element::neutral};
+ mob_db[mob_class].mode = MobMode::ZERO;
mob_db[mob_class].speed = 300;
mob_db[mob_class].adelay = 1000;
mob_db[mob_class].amotion = 500;
mob_db[mob_class].dmotion = 500;
- mob_db[mob_class].dropitem[0].nameid = 909; // Jellopy
- mob_db[mob_class].dropitem[0].p = 1000;
- for (i = 1; i < 8; i++)
+ for (i = 0; i < 8; i++)
{
mob_db[mob_class].dropitem[i].nameid = 0;
- mob_db[mob_class].dropitem[i].p = 0;
- }
- // Item1,Item2
- mob_db[mob_class].mexp = 0;
- mob_db[mob_class].mexpper = 0;
- for (i = 0; i < 3; i++)
- {
- mob_db[mob_class].mvpitem[i].nameid = 0;
- mob_db[mob_class].mvpitem[i].p = 0;
+ mob_db[mob_class].dropitem[i].p.num = 0;
}
- for (i = 0; i < MAX_RANDOMMONSTER; i++)
- mob_db[mob_class].summonper[i] = 0;
return 0;
}
@@ -4535,27 +3449,28 @@ static int mob_makedummymobdb (int mob_class)
* db/mob_db.txt reading
*------------------------------------------
*/
-static int mob_readdb (void)
+static
+int mob_readdb(void)
{
FILE *fp;
char line[1024];
const char *filename[] = { "db/mob_db.txt", "db/mob_db2.txt" };
- memset (mob_db, 0, sizeof (mob_db));
+ memset(mob_db, 0, sizeof(mob_db));
for (int j = 0; j < 2; j++)
{
- fp = fopen_ (filename[j], "r");
+ fp = fopen_(filename[j], "r");
if (fp == NULL)
{
if (j > 0)
continue;
return -1;
}
- while (fgets (line, 1020, fp))
+ while (fgets(line, 1020, fp))
{
- int mob_class;
+ int mob_class;
char *str[57], *p, *np;
if (line[0] == '/' && line[1] == '/')
@@ -4566,7 +3481,7 @@ static int mob_readdb (void)
{
while (*p == '\t' || *p == ' ')
p++;
- if ((np = strchr (p, ',')) != NULL)
+ if ((np = strchr(p, ',')) != NULL)
{
str[i] = p;
*np = 0;
@@ -4576,18 +3491,17 @@ static int mob_readdb (void)
str[i] = p;
}
- mob_class = atoi (str[0]);
+ mob_class = atoi(str[0]);
if (mob_class <= 1000 || mob_class > 2000)
continue;
- mob_db[mob_class].view_class = mob_class;
- memcpy (mob_db[mob_class].name, str[1], 24);
- memcpy (mob_db[mob_class].jname, str[2], 24);
- mob_db[mob_class].lv = atoi (str[3]);
- mob_db[mob_class].max_hp = atoi (str[4]);
- mob_db[mob_class].max_sp = atoi (str[5]);
+ memcpy(mob_db[mob_class].name, str[1], 24);
+ memcpy(mob_db[mob_class].jname, str[2], 24);
+ mob_db[mob_class].lv = atoi(str[3]);
+ mob_db[mob_class].max_hp = atoi(str[4]);
+ mob_db[mob_class].max_sp = atoi(str[5]);
- mob_db[mob_class].base_exp = atoi (str[6]);
+ mob_db[mob_class].base_exp = atoi(str[6]);
if (mob_db[mob_class].base_exp < 0)
mob_db[mob_class].base_exp = 0;
else if (mob_db[mob_class].base_exp > 0
@@ -4599,7 +3513,7 @@ static int mob_readdb (void)
else
mob_db[mob_class].base_exp *= battle_config.base_exp_rate / 100;
- mob_db[mob_class].job_exp = atoi (str[7]);
+ mob_db[mob_class].job_exp = atoi(str[7]);
if (mob_db[mob_class].job_exp < 0)
mob_db[mob_class].job_exp = 0;
else if (mob_db[mob_class].job_exp > 0
@@ -4611,85 +3525,39 @@ static int mob_readdb (void)
else
mob_db[mob_class].job_exp *= battle_config.job_exp_rate / 100;
- mob_db[mob_class].range = atoi (str[8]);
- mob_db[mob_class].atk1 = atoi (str[9]);
- mob_db[mob_class].atk2 = atoi (str[10]);
- mob_db[mob_class].def = atoi (str[11]);
- mob_db[mob_class].mdef = atoi (str[12]);
- mob_db[mob_class].str = atoi (str[13]);
- mob_db[mob_class].agi = atoi (str[14]);
- mob_db[mob_class].vit = atoi (str[15]);
- mob_db[mob_class].int_ = atoi (str[16]);
- mob_db[mob_class].dex = atoi (str[17]);
- mob_db[mob_class].luk = atoi (str[18]);
- mob_db[mob_class].range2 = atoi (str[19]);
- mob_db[mob_class].range3 = atoi (str[20]);
- mob_db[mob_class].size = atoi (str[21]);
- mob_db[mob_class].race = atoi (str[22]);
- mob_db[mob_class].element = atoi (str[23]);
- mob_db[mob_class].mode = atoi (str[24]);
- mob_db[mob_class].speed = atoi (str[25]);
- mob_db[mob_class].adelay = atoi (str[26]);
- mob_db[mob_class].amotion = atoi (str[27]);
- mob_db[mob_class].dmotion = atoi (str[28]);
+ mob_db[mob_class].range = atoi(str[8]);
+ mob_db[mob_class].atk1 = atoi(str[9]);
+ mob_db[mob_class].atk2 = atoi(str[10]);
+ mob_db[mob_class].def = atoi(str[11]);
+ mob_db[mob_class].mdef = atoi(str[12]);
+ mob_db[mob_class].attrs[ATTR::STR] = atoi(str[13]);
+ mob_db[mob_class].attrs[ATTR::AGI] = atoi(str[14]);
+ mob_db[mob_class].attrs[ATTR::VIT] = atoi(str[15]);
+ mob_db[mob_class].attrs[ATTR::INT] = atoi(str[16]);
+ mob_db[mob_class].attrs[ATTR::DEX] = atoi(str[17]);
+ mob_db[mob_class].attrs[ATTR::LUK] = atoi(str[18]);
+ mob_db[mob_class].range2 = atoi(str[19]);
+ mob_db[mob_class].range3 = atoi(str[20]);
+ mob_db[mob_class].size = atoi(str[21]); // always 1
+ mob_db[mob_class].race = static_cast<Race>(atoi(str[22]));
+ mob_db[mob_class].element = LevelElement::unpack(atoi(str[23]));
+ mob_db[mob_class].mode = static_cast<MobMode>(atoi(str[24]));
+ mob_db[mob_class].speed = atoi(str[25]);
+ mob_db[mob_class].adelay = atoi(str[26]);
+ mob_db[mob_class].amotion = atoi(str[27]);
+ mob_db[mob_class].dmotion = atoi(str[28]);
for (int i = 0; i < 8; i++)
{
- int rate = 0, type, ratemin, ratemax;
- mob_db[mob_class].dropitem[i].nameid = atoi (str[29 + i * 2]);
- type = itemdb_type (mob_db[mob_class].dropitem[i].nameid);
- if (type == 0)
- { // Added [Valaris]
- rate = battle_config.item_rate_heal;
- ratemin = battle_config.item_drop_heal_min;
- ratemax = battle_config.item_drop_heal_max;
- }
- else if (type == 2)
- {
- rate = battle_config.item_rate_use;
- ratemin = battle_config.item_drop_use_min;
- ratemax = battle_config.item_drop_use_max; // End
- }
- else if (type == 4 || type == 5 || type == 8)
- {
- rate = battle_config.item_rate_equip;
- ratemin = battle_config.item_drop_equip_min;
- ratemax = battle_config.item_drop_equip_max;
- }
- else if (type == 6)
- {
- rate = battle_config.item_rate_card;
- ratemin = battle_config.item_drop_card_min;
- ratemax = battle_config.item_drop_card_max;
- }
- else
- {
- rate = battle_config.item_rate_common;
- ratemin = battle_config.item_drop_common_min;
- ratemax = battle_config.item_drop_common_max;
- }
- rate = (rate / 100) * atoi (str[30 + i * 2]);
- rate =
- (rate < ratemin) ? ratemin : (rate >
- ratemax) ? ratemax : rate;
- mob_db[mob_class].dropitem[i].p = rate;
+ mob_db[mob_class].dropitem[i].nameid = atoi(str[29 + i * 2]);
+ int rate = atoi(str[30 + i * 2]);
+ if (rate < 1) rate = 1;
+ if (rate > 10000) rate = 10000;
+ mob_db[mob_class].dropitem[i].p.num = rate;
}
- // Item1,Item2
- mob_db[mob_class].mexp =
- atoi (str[45]) * battle_config.mvp_exp_rate / 100;
- mob_db[mob_class].mexpper = atoi (str[46]);
- for (int i = 0; i < 3; i++)
- {
- mob_db[mob_class].mvpitem[i].nameid = atoi (str[47 + i * 2]);
- mob_db[mob_class].mvpitem[i].p =
- atoi (str[48 + i * 2]) * battle_config.mvp_item_rate /
- 100;
- }
- mob_db[mob_class].mutations_nr = atoi (str[55]);
- mob_db[mob_class].mutation_power = atoi (str[56]);
+ mob_db[mob_class].mutations_nr = atoi(str[55]);
+ mob_db[mob_class].mutation_power = atoi(str[56]);
- for (int i = 0; i < MAX_RANDOMMONSTER; i++)
- mob_db[mob_class].summonper[i] = 0;
mob_db[mob_class].maxskill = 0;
mob_db[mob_class].sex = 0;
@@ -4703,136 +3571,10 @@ static int mob_readdb (void)
mob_db[mob_class].clothes_color = 0; //Add for player monster dye - Valaris
if (mob_db[mob_class].base_exp == 0)
- mob_db[mob_class].base_exp = mob_gen_exp (&mob_db[mob_class]);
+ mob_db[mob_class].base_exp = mob_gen_exp(&mob_db[mob_class]);
}
- fclose_ (fp);
- printf ("read %s done\n", filename[j]);
- }
- return 0;
-}
-
-/*==========================================
- * MOB display graphic change data reading
- *------------------------------------------
- */
-static int mob_readdb_mobavail (void)
-{
- FILE *fp;
- char line[1024];
- int ln = 0;
- int mob_class, j, k;
- char *str[20], *p, *np;
-
- if ((fp = fopen_ ("db/mob_avail.txt", "r")) == NULL)
- {
- printf ("can't read db/mob_avail.txt\n");
- return -1;
- }
-
- while (fgets (line, 1020, fp))
- {
- if (line[0] == '/' && line[1] == '/')
- continue;
- memset (str, 0, sizeof (str));
-
- for (j = 0, p = line; j < 12; j++)
- {
- if ((np = strchr (p, ',')) != NULL)
- {
- str[j] = p;
- *np = 0;
- p = np + 1;
- }
- else
- str[j] = p;
- }
-
- if (str[0] == NULL)
- continue;
-
- mob_class = atoi (str[0]);
-
- if (mob_class <= 1000 || mob_class > 2000) // 値が異常なら処理しない。
- continue;
- k = atoi (str[1]);
- if (k >= 0)
- mob_db[mob_class].view_class = k;
-
- if ((mob_db[mob_class].view_class < 24)
- || (mob_db[mob_class].view_class > 4000))
- {
- mob_db[mob_class].sex = atoi (str[2]);
- mob_db[mob_class].hair = atoi (str[3]);
- mob_db[mob_class].hair_color = atoi (str[4]);
- mob_db[mob_class].weapon = atoi (str[5]);
- mob_db[mob_class].shield = atoi (str[6]);
- mob_db[mob_class].head_top = atoi (str[7]);
- mob_db[mob_class].head_mid = atoi (str[8]);
- mob_db[mob_class].head_buttom = atoi (str[9]);
- mob_db[mob_class].option = atoi (str[10]) & ~0x46;
- mob_db[mob_class].clothes_color = atoi (str[11]); // Monster player dye option - Valaris
- }
-
- else if (atoi (str[2]) > 0)
- mob_db[mob_class].equip = atoi (str[2]); // mob equipment [Valaris]
-
- ln++;
- }
- fclose_ (fp);
- printf ("read db/mob_avail.txt done (count=%d)\n", ln);
- return 0;
-}
-
-/*==========================================
- * Reading of random monster data
- *------------------------------------------
- */
-static int mob_read_randommonster (void)
-{
- FILE *fp;
- char line[1024];
- char *str[10], *p;
- int i, j;
-
- const char *mobfile[] = {
- "db/mob_branch.txt",
- "db/mob_poring.txt",
- "db/mob_boss.txt"
- };
-
- for (i = 0; i < MAX_RANDOMMONSTER; i++)
- {
- mob_db[0].summonper[i] = 1002; // 設定し忘れた場合はポリンが出るようにしておく
- fp = fopen_ (mobfile[i], "r");
- if (fp == NULL)
- {
- printf ("can't read %s\n", mobfile[i]);
- return -1;
- }
- while (fgets (line, 1020, fp))
- {
- int mob_class, per;
- if (line[0] == '/' && line[1] == '/')
- continue;
- memset (str, 0, sizeof (str));
- for (j = 0, p = line; j < 3 && p; j++)
- {
- str[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
-
- if (str[0] == NULL || str[2] == NULL)
- continue;
-
- mob_class = atoi (str[0]);
- per = atoi (str[2]);
- if ((mob_class > 1000 && mob_class <= 2000) || mob_class == 0)
- mob_db[mob_class].summonper[i] = per;
- }
- fclose_ (fp);
- printf ("read %s done\n", mobfile[i]);
+ fclose_(fp);
+ PRINTF("read %s done\n", filename[j]);
}
return 0;
}
@@ -4841,221 +3583,144 @@ static int mob_read_randommonster (void)
* db/mob_skill_db.txt reading
*------------------------------------------
*/
-static int mob_readskilldb (void)
+static
+int mob_readskilldb(void)
{
FILE *fp;
char line[1024];
- int i;
+ int i;
const struct
{
char str[32];
- int id;
+ MobSkillCondition id;
} cond1[] =
{
- {
- "always", MSC_ALWAYS},
- {
- "myhpltmaxrate", MSC_MYHPLTMAXRATE},
- {
- "friendhpltmaxrate", MSC_FRIENDHPLTMAXRATE},
- {
- "mystatuson", MSC_MYSTATUSON},
- {
- "mystatusoff", MSC_MYSTATUSOFF},
- {
- "friendstatuson", MSC_FRIENDSTATUSON},
- {
- "friendstatusoff", MSC_FRIENDSTATUSOFF},
- {
- "notintown", MSC_NOTINTOWN},
- {
- "attackpcgt", MSC_ATTACKPCGT},
- {
- "attackpcge", MSC_ATTACKPCGE},
- {
- "slavelt", MSC_SLAVELT},
- {
- "slavele", MSC_SLAVELE},
- {
- "closedattacked", MSC_CLOSEDATTACKED},
- {
- "longrangeattacked", MSC_LONGRANGEATTACKED},
- {
- "skillused", MSC_SKILLUSED},
- {
- "casttargeted", MSC_CASTTARGETED},}, cond2[] =
+ {"always", MobSkillCondition::MSC_ALWAYS},
+ {"myhpltmaxrate", MobSkillCondition::MSC_MYHPLTMAXRATE},
+ {"notintown", MobSkillCondition::MSC_NOTINTOWN},
+ {"slavelt", MobSkillCondition::MSC_SLAVELT},
+ {"slavele", MobSkillCondition::MSC_SLAVELE},
+ };
+ const struct
{
- {
- "anybad", -1},
- {
- "stone", SC_STONE},
- {
- "freeze", SC_FREEZE},
- {
- "stan", SC_STAN},
- {
- "sleep", SC_SLEEP},
- {
- "poison", SC_POISON},
- {
- "curse", SC_CURSE},
- {
- "silence", SC_SILENCE},
- {
- "confusion", SC_CONFUSION},
- {
- "blind", SC_BLIND},
- {
- "hiding", SC_HIDING},
- {
- "sight", SC_SIGHT},}, state[] =
+ char str[32];
+ MobSkillState id;
+ } state[] =
{
- {
- "any", -1},
- {
- "idle", MSS_IDLE},
- {
- "walk", MSS_WALK},
- {
- "attack", MSS_ATTACK},
- {
- "dead", MSS_DEAD},
- {
- "loot", MSS_LOOT},
- {
- "chase", MSS_CHASE},}, target[] =
+ {"any", MobSkillState::ANY},
+ {"idle", MobSkillState::MSS_IDLE},
+ {"walk", MobSkillState::MSS_WALK},
+ {"attack", MobSkillState::MSS_ATTACK},
+ };
+ const struct
{
- {
- "target", MST_TARGET},
- {
- "self", MST_SELF},
- {
- "friend", MST_FRIEND},
- {
- "master", MST_MASTER},
- {
- "around5", MST_AROUND5},
- {
- "around6", MST_AROUND6},
- {
- "around7", MST_AROUND7},
- {
- "around8", MST_AROUND8},
- {
- "around1", MST_AROUND1},
- {
- "around2", MST_AROUND2},
- {
- "around3", MST_AROUND3},
- {
- "around4", MST_AROUND4},
- {
- "around", MST_AROUND},};
+ char str[32];
+ MobSkillTarget id;
+ } target[] =
+ {
+ {"target", MobSkillTarget::MST_TARGET},
+ {"self", MobSkillTarget::MST_SELF},
+ };
- int x;
+ int x;
const char *filename[] = { "db/mob_skill_db.txt", "db/mob_skill_db2.txt" };
for (x = 0; x < 2; x++)
{
- fp = fopen_ (filename[x], "r");
+ fp = fopen_(filename[x], "r");
if (fp == NULL)
{
if (x == 0)
- printf ("can't read %s\n", filename[x]);
+ PRINTF("can't read %s\n", filename[x]);
continue;
}
- while (fgets (line, 1020, fp))
+ while (fgets(line, 1020, fp))
{
char *sp[20], *p;
- int mob_id;
- struct mob_skill *ms;
- int j = 0;
+ int mob_id;
+ // always initialized, but clang is not smart enough yet
+ struct mob_skill *ms = nullptr;
+ int j = 0;
if (line[0] == '/' && line[1] == '/')
continue;
- memset (sp, 0, sizeof (sp));
+ memset(sp, 0, sizeof(sp));
for (i = 0, p = line; i < 18 && p; i++)
{
sp[i] = p;
- if ((p = strchr (p, ',')) != NULL)
+ if ((p = strchr(p, ',')) != NULL)
*p++ = 0;
}
- if ((mob_id = atoi (sp[0])) <= 0)
+ if ((mob_id = atoi(sp[0])) <= 0)
continue;
- if (strcmp (sp[1], "clear") == 0)
+ if (strcmp(sp[1], "clear") == 0)
{
- memset (mob_db[mob_id].skill, 0,
- sizeof (mob_db[mob_id].skill));
+ memset(mob_db[mob_id].skill, 0,
+ sizeof(mob_db[mob_id].skill));
mob_db[mob_id].maxskill = 0;
continue;
}
for (i = 0; i < MAX_MOBSKILL; i++)
- if ((ms = &mob_db[mob_id].skill[i])->skill_id == 0)
+ if ((ms = &mob_db[mob_id].skill[i])->skill_id == SkillID::ZERO)
break;
if (i == MAX_MOBSKILL)
{
- printf
- ("mob_skill: readdb: too many skill ! [%s] in %d[%s]\n",
+ PRINTF("mob_skill: readdb: too many skill ! [%s] in %d[%s]\n",
sp[1], mob_id, mob_db[mob_id].jname);
continue;
}
- ms->state = atoi (sp[2]);
- for (j = 0; j < sizeof (state) / sizeof (state[0]); j++)
+ ms->state = static_cast<MobSkillState>(atoi(sp[2]));
+ for (j = 0; j < sizeof(state) / sizeof(state[0]); j++)
{
- if (strcmp (sp[2], state[j].str) == 0)
+ if (strcmp(sp[2], state[j].str) == 0)
ms->state = state[j].id;
}
- ms->skill_id = atoi (sp[3]);
- ms->skill_lv = atoi (sp[4]);
-
- ms->permillage = atoi (sp[5]);
- ms->casttime = atoi (sp[6]);
- ms->delay = atoi (sp[7]);
- ms->cancel = atoi (sp[8]);
- if (strcmp (sp[8], "yes") == 0)
+ ms->skill_id = SkillID(atoi(sp[3]));
+ ms->skill_lv = atoi(sp[4]);
+
+ ms->permillage = atoi(sp[5]);
+ ms->casttime = static_cast<interval_t>(atoi(sp[6]));
+ ms->delay = static_cast<interval_t>(atoi(sp[7]));
+ ms->cancel = atoi(sp[8]);
+ if (strcmp(sp[8], "yes") == 0)
ms->cancel = 1;
- ms->target = atoi (sp[9]);
- for (j = 0; j < sizeof (target) / sizeof (target[0]); j++)
+ ms->target = static_cast<MobSkillTarget>(atoi(sp[9]));
+ for (j = 0; j < sizeof(target) / sizeof(target[0]); j++)
{
- if (strcmp (sp[9], target[j].str) == 0)
+ if (strcmp(sp[9], target[j].str) == 0)
ms->target = target[j].id;
}
- ms->cond1 = -1;
- for (j = 0; j < sizeof (cond1) / sizeof (cond1[0]); j++)
+ ms->cond1 = MobSkillCondition::ANY;
+ for (j = 0; j < sizeof(cond1) / sizeof(cond1[0]); j++)
{
- if (strcmp (sp[10], cond1[j].str) == 0)
+ if (strcmp(sp[10], cond1[j].str) == 0)
ms->cond1 = cond1[j].id;
}
- ms->cond2 = atoi (sp[11]);
- for (j = 0; j < sizeof (cond2) / sizeof (cond2[0]); j++)
- {
- if (strcmp (sp[11], cond2[j].str) == 0)
- ms->cond2 = cond2[j].id;
- }
- ms->val[0] = atoi (sp[12]);
- ms->val[1] = atoi (sp[13]);
- ms->val[2] = atoi (sp[14]);
- ms->val[3] = atoi (sp[15]);
- ms->val[4] = atoi (sp[16]);
- if (sp[17] != NULL && strlen (sp[17]) > 2)
- ms->emotion = atoi (sp[17]);
+ ms->cond2i = atoi(sp[11]);
+ ms->val[0] = atoi(sp[12]);
+ ms->val[1] = atoi(sp[13]);
+ ms->val[2] = atoi(sp[14]);
+ ms->val[3] = atoi(sp[15]);
+ ms->val[4] = atoi(sp[16]);
+ if (sp[17] != NULL && strlen(sp[17]) > 2)
+ ms->emotion = atoi(sp[17]);
else
ms->emotion = -1;
mob_db[mob_id].maxskill = i + 1;
}
- fclose_ (fp);
- printf ("read %s done\n", filename[x]);
+ fclose_(fp);
+ PRINTF("read %s done\n", filename[x]);
}
return 0;
}
-void mob_reload (void)
+void mob_reload(void)
{
/*
*
@@ -5064,25 +3729,27 @@ void mob_reload (void)
*
*/
- do_init_mob ();
+ do_init_mob();
}
/*==========================================
* Circumference initialization of mob
*------------------------------------------
*/
-int do_init_mob (void)
+int do_init_mob(void)
{
- mob_readdb ();
+ mob_readdb();
- mob_readdb_mobavail ();
- mob_read_randommonster ();
- mob_readskilldb ();
+ mob_readskilldb();
- add_timer_interval (gettick () + MIN_MOBTHINKTIME, mob_ai_hard, 0, 0,
- MIN_MOBTHINKTIME);
- add_timer_interval (gettick () + MIN_MOBTHINKTIME * 10, mob_ai_lazy, 0, 0,
- MIN_MOBTHINKTIME * 10);
+ Timer(gettick() + MIN_MOBTHINKTIME,
+ mob_ai_hard,
+ MIN_MOBTHINKTIME
+ ).detach();
+ Timer(gettick() + MIN_MOBTHINKTIME * 10,
+ mob_ai_lazy,
+ MIN_MOBTHINKTIME * 10
+ ).detach();
return 0;
}
diff --git a/src/map/mob.hpp b/src/map/mob.hpp
index 19addf2..16715c4 100644
--- a/src/map/mob.hpp
+++ b/src/map/mob.hpp
@@ -1,151 +1,105 @@
-// $Id: mob.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
#ifndef MOB_HPP
#define MOB_HPP
-#include "../common/timer.hpp"
-#define MAX_RANDOMMONSTER 3
+
+#include "mob.t.hpp"
+
+#include "../common/mmo.hpp"
+#include "../common/timer.t.hpp"
+#include "../common/random.t.hpp"
+
+#include "clif.t.hpp"
+#include "map.hpp"
+#include "skill.t.hpp"
struct mob_skill
{
- short state;
- short skill_id, skill_lv;
+ MobSkillState state;
+ SkillID skill_id;
+ short skill_lv;
short permillage;
- int casttime, delay;
+ interval_t casttime, delay;
short cancel;
- short cond1, cond2;
- short target;
- int val[5];
+ MobSkillCondition cond1;
+ int cond2i;
+ MobSkillTarget target;
+ int val[5];
short emotion;
};
struct mob_db
{
char name[24], jname[24];
- int lv;
- int max_hp, max_sp;
- int base_exp, job_exp;
- int atk1, atk2;
- int def, mdef;
- int str, agi, vit, int_, dex, luk;
- int range, range2, range3;
- int size, race, element, mode;
- int speed, adelay, amotion, dmotion;
- int mexp, mexpper;
- int mutations_nr, mutation_power;
+ int lv;
+ int max_hp, max_sp;
+ int base_exp, job_exp;
+ int atk1, atk2;
+ int def, mdef;
+ earray<int, ATTR, ATTR::COUNT> attrs;
+ int range, range2, range3;
+ // always 1
+ int size;
+ Race race;
+ LevelElement element;
+ MobMode mode;
+ int speed, adelay, amotion, dmotion;
+ int mutations_nr, mutation_power;
struct
{
- int nameid, p;
+ int nameid;
+ random_::Fixed<int, 10000> p;
} dropitem[8];
- struct
- {
- int nameid, p;
- } mvpitem[3];
- int view_class, sex;
+ int sex;
short hair, hair_color, weapon, shield, head_top, head_mid, head_buttom, option, clothes_color; // [Valaris]
- int equip; // [Valaris]
- int summonper[MAX_RANDOMMONSTER];
- int maxskill;
+ int equip; // [Valaris]
+ int maxskill;
struct mob_skill skill[MAX_MOBSKILL];
};
extern struct mob_db mob_db[];
-enum
-{
- MST_TARGET = 0,
- MST_SELF,
- MST_FRIEND,
- MST_MASTER,
- MST_AROUND5,
- MST_AROUND6,
- MST_AROUND7,
- MST_AROUND8,
- MST_AROUND1,
- MST_AROUND2,
- MST_AROUND3,
- MST_AROUND4,
- MST_AROUND = MST_AROUND4,
-
- MSC_ALWAYS = 0x0000,
- MSC_MYHPLTMAXRATE = 0x0001,
- MSC_FRIENDHPLTMAXRATE = 0x0010,
- MSC_MYSTATUSON = 0x0020,
- MSC_MYSTATUSOFF = 0x0021,
- MSC_FRIENDSTATUSON = 0x0030,
- MSC_FRIENDSTATUSOFF = 0x0031,
- MSC_NOTINTOWN = 0x0032,
-
- MSC_ATTACKPCGT = 0x0100,
- MSC_ATTACKPCGE = 0x0101,
- MSC_SLAVELT = 0x0110,
- MSC_SLAVELE = 0x0111,
- MSC_CLOSEDATTACKED = 0x1000,
- MSC_LONGRANGEATTACKED = 0x1001,
- MSC_SKILLUSED = 0x1010,
- MSC_CASTTARGETED = 0x1011,
-};
-
-enum
-{
- MSS_IDLE, // 待機
- MSS_WALK, // 移動
- MSS_ATTACK, // 攻撃
- MSS_DEAD, // 死亡
- MSS_LOOT, // ルート
- MSS_CHASE, // 突撃
-};
-
-int mobdb_searchname (const char *str);
-int mobdb_checkid (const int id);
-int mob_once_spawn (struct map_session_data *sd, const char *mapname,
- int x, int y, const char *mobname, int class_, int amount,
- const char *event);
-int mob_once_spawn_area (struct map_session_data *sd, const char *mapname, int x0,
- int y0, int x1, int y1, const char *mobname,
- int class_, int amount, const char *event);
-
-int mob_spawn_guardian (struct map_session_data *sd, const char *mapname, // Spawning Guardians [Valaris]
- int x, int y, const char *mobname, int class_, int amount, const char *event, int guardian); // Spawning Guardians [Valaris]
-
-int mob_walktoxy (struct mob_data *md, int x, int y, int easy);
-
-int mob_target (struct mob_data *md, struct block_list *bl, int dist);
-int mob_stop_walking (struct mob_data *md, int type);
-int mob_stopattack (struct mob_data *);
-int mob_spawn (int);
-int mob_damage (struct block_list *, struct mob_data *, int, int);
-int mob_changestate (struct mob_data *md, int state, int type);
-int mob_heal (struct mob_data *, int);
-int mob_get_viewclass (int);
-int mob_get_sex (int);
-short mob_get_hair (int);
-short mob_get_hair_color (int);
-short mob_get_weapon (int);
-short mob_get_shield (int);
-short mob_get_head_top (int);
-short mob_get_head_mid (int);
-short mob_get_head_buttom (int);
-short mob_get_clothes_color (int); //player mob dye [Valaris]
-int mob_get_equip (int); // mob equip [Valaris]
-int do_init_mob (void);
-
-int mob_delete (struct mob_data *md);
-int mob_catch_delete (struct mob_data *md, int type);
-void mob_timer_delete (timer_id, tick_t, custom_id_t, custom_data_t);
-
-int mob_deleteslave (struct mob_data *md);
-
-int mob_counttargeted (struct mob_data *md, struct block_list *src,
- int target_lv);
-
-int mob_class_change (struct mob_data *md, int *value);
-int mob_warp (struct mob_data *md, int m, int x, int y, int type);
-
-int mobskill_use (struct mob_data *md, unsigned int tick, int event);
-int mobskill_event (struct mob_data *md, int flag);
-void mobskill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
-void mobskill_castend_pos (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
-int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag);
-
-int mob_gvmobcheck (struct map_session_data *sd, struct block_list *bl);
-void mob_reload (void);
-
-#endif
+int mobdb_searchname(const char *str);
+int mobdb_checkid(const int id);
+int mob_once_spawn(struct map_session_data *sd,
+ const char *mapname, int x, int y,
+ const char *mobname, int class_, int amount, const char *event);
+int mob_once_spawn_area(struct map_session_data *sd,
+ const char *mapname, int x0, int y0, int x1, int y1,
+ const char *mobname, int class_, int amount, const char *event);
+
+int mob_target(struct mob_data *md, struct block_list *bl, int dist);
+int mob_stop_walking(struct mob_data *md, int type);
+int mob_stopattack(struct mob_data *);
+int mob_spawn(int);
+int mob_damage(struct block_list *, struct mob_data *, int, int);
+int mob_heal(struct mob_data *, int);
+int mob_get_sex(int);
+short mob_get_hair(int);
+short mob_get_hair_color(int);
+short mob_get_weapon(int);
+short mob_get_shield(int);
+short mob_get_head_top(int);
+short mob_get_head_mid(int);
+short mob_get_head_buttom(int);
+short mob_get_clothes_color(int); //player mob dye [Valaris]
+int mob_get_equip(int); // mob equip [Valaris]
+int do_init_mob(void);
+
+int mob_delete(struct mob_data *md);
+int mob_catch_delete(struct mob_data *md, BeingRemoveWhy type);
+void mob_timer_delete(TimerData *, tick_t, int);
+
+int mob_deleteslave(struct mob_data *md);
+
+int mob_counttargeted(struct mob_data *md, struct block_list *src,
+ ATK target_lv);
+
+int mob_warp(struct mob_data *md, int m, int x, int y, BeingRemoveWhy type);
+
+int mobskill_use(struct mob_data *md, tick_t tick, MobSkillCondition event);
+int mobskill_event(struct mob_data *md, BF flag);
+void mobskill_castend_id(TimerData *tid, tick_t tick, int id);
+void mobskill_castend_pos(TimerData *tid, tick_t tick, int id);
+int mob_summonslave(struct mob_data *md2, int *value, int amount, int flag);
+
+void mob_reload(void);
+
+#endif // MOB_HPP
diff --git a/src/map/mob.t.hpp b/src/map/mob.t.hpp
new file mode 100644
index 0000000..b112c69
--- /dev/null
+++ b/src/map/mob.t.hpp
@@ -0,0 +1,41 @@
+#ifndef MOB_T_HPP
+#define MOB_T_HPP
+
+#include <cstdint>
+
+enum class MobSkillTarget
+{
+ MST_TARGET = 0,
+ MST_SELF,
+};
+
+/// Used as a condition when trying to apply the chosen mob skill.
+enum class MobSkillCondition : uint16_t
+{
+ // used as something that never compares true
+ NEVER_EQUAL = 0xfffe,
+ ANY = 0xffff,
+
+ MSC_ALWAYS = 0x0000,
+ MSC_MYHPLTMAXRATE = 0x0001,
+
+ MSC_NOTINTOWN = 0x0032,
+
+ MSC_SLAVELT = 0x0110,
+ MSC_SLAVELE = 0x0111,
+};
+
+/// Used as a filter when trying to choose a mob skill to use.
+enum class MobSkillState : uint8_t
+{
+ ANY = 0xff,
+
+ MSS_IDLE = 0,
+ MSS_WALK,
+ MSS_ATTACK,
+ MSS_DEAD,
+ MSS_LOOT,
+ MSS_CHASE,
+};
+
+#endif // MOB_T_HPP
diff --git a/src/map/npc.cpp b/src/map/npc.cpp
index c25f585..c08a0e7 100644
--- a/src/map/npc.cpp
+++ b/src/map/npc.cpp
@@ -1,30 +1,26 @@
-// $Id: npc.c,v 1.5 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <math.h>
-#include <time.h>
+#include "npc.hpp"
+
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
+#include "../common/cxxstdio.hpp"
+#include "../common/db.hpp"
#include "../common/nullpo.hpp"
+#include "../common/socket.hpp"
#include "../common/timer.hpp"
#include "battle.hpp"
#include "clif.hpp"
-#include "../common/db.hpp"
-#include "intif.hpp"
#include "itemdb.hpp"
#include "map.hpp"
#include "mob.hpp"
-#include "npc.hpp"
#include "pc.hpp"
#include "script.hpp"
#include "skill.hpp"
-#include "../common/socket.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
+#include "../poison.hpp"
struct npc_src_list
{
@@ -33,24 +29,30 @@ struct npc_src_list
char name[4];
};
-static struct npc_src_list *npc_src_first, *npc_src_last;
-static int npc_id = START_NPC_NUM;
-static int npc_warp, npc_shop, npc_script, npc_mob;
+static
+struct npc_src_list *npc_src_first, *npc_src_last;
+static
+int npc_id = START_NPC_NUM;
+static
+int npc_warp, npc_shop, npc_script, npc_mob;
-int npc_get_new_npc_id (void)
+int npc_get_new_npc_id(void)
{
return npc_id++;
}
-static struct dbt *ev_db;
-static struct dbt *npcname_db;
-
struct event_data
{
struct npc_data *nd;
- int pos;
+ int pos;
};
-static struct tm ev_tm_b; // 時計イベント用
+static
+Map<std::string, struct event_data> ev_db;
+static
+DMap<std::string, struct npc_data *> npcname_db;
+
+static
+struct tm ev_tm_b; // 時計イベント用
/*==========================================
* NPCの無効化/有効化
@@ -59,63 +61,48 @@ static struct tm ev_tm_b; // 時計イベント用
*------------------------------------------
*/
static
-int npc_enable_sub (struct block_list *bl, va_list ap)
+void npc_enable_sub(struct block_list *bl, struct npc_data *nd)
{
struct map_session_data *sd;
- struct npc_data *nd;
- char *name = (char *) calloc (50, sizeof (char));
+ char *name = (char *) calloc(50, sizeof(char));
+
+ nullpo_retv(bl);
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, nd = va_arg (ap, struct npc_data *));
- if (bl->type == BL_PC && (sd = (struct map_session_data *) bl))
+ if (bl->type == BL::PC && (sd = (struct map_session_data *) bl))
{
if (nd->flag & 1) // 無効化されている
- return 1;
+ return;
- memcpy (name, nd->name, sizeof(nd->name));
+ memcpy(name, nd->name, sizeof(nd->name));
if (sd->areanpc_id == nd->bl.id)
- return 1;
+ return; // TODO fix leak of 'name'
sd->areanpc_id = nd->bl.id;
- npc_event (sd, strcat (name, "::OnTouch"), 0);
+ npc_event(sd, strcat(name, "::OnTouch"), 0);
}
- free (name);
- return 0;
+ free(name);
}
-int npc_enable (const char *name, int flag)
+int npc_enable(const char *name, bool flag)
{
- struct npc_data *nd = (struct npc_data *)strdb_search (npcname_db, name);
+ struct npc_data *nd = npcname_db.get(name);
if (nd == NULL)
return 0;
- if (flag & 1)
+ if (flag)
{ // 有効化
nd->flag &= ~1;
- clif_spawnnpc (nd);
- }
- else if (flag & 2)
- {
- nd->flag &= ~1;
- nd->option = 0x0000;
- clif_changeoption (&nd->bl);
- }
- else if (flag & 4)
- {
- nd->flag |= 1;
- nd->option = 0x0002;
- clif_changeoption (&nd->bl);
+ clif_spawnnpc(nd);
}
else
{ // 無効化
nd->flag |= 1;
- clif_clearchar (&nd->bl, 0);
+ clif_clearchar(&nd->bl, BeingRemoveWhy::GONE);
}
- if (flag & 3 && (nd->u.scr.xs > 0 || nd->u.scr.ys > 0))
- map_foreachinarea (npc_enable_sub, nd->bl.m, nd->bl.x - nd->u.scr.xs,
- nd->bl.y - nd->u.scr.ys, nd->bl.x + nd->u.scr.xs,
- nd->bl.y + nd->u.scr.ys, BL_PC, nd);
+ if (flag && (nd->u.scr.xs > 0 || nd->u.scr.ys > 0))
+ map_foreachinarea(std::bind(npc_enable_sub, ph::_1, nd),
+ nd->bl.m, nd->bl.x - nd->u.scr.xs, nd->bl.y - nd->u.scr.ys,
+ nd->bl.x + nd->u.scr.xs, nd->bl.y + nd->u.scr.ys, BL::PC);
return 0;
}
@@ -124,32 +111,32 @@ int npc_enable (const char *name, int flag)
* NPCを名前で探す
*------------------------------------------
*/
-struct npc_data *npc_name2id (const char *name)
+struct npc_data *npc_name2id(const char *name)
{
- return (struct npc_data *)strdb_search (npcname_db, name);
+ return npcname_db.get(name);
}
/*==========================================
* イベントキューのイベント処理
*------------------------------------------
*/
-int npc_event_dequeue (struct map_session_data *sd)
+int npc_event_dequeue(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
sd->npc_id = 0;
if (sd->eventqueue[0][0]) // キューのイベント処理
{
- if (!pc_addeventtimer(sd, 100, sd->eventqueue[0]))
+ if (!pc_addeventtimer(sd, std::chrono::milliseconds(100), sd->eventqueue[0]))
{
- printf ("npc_event_dequeue(): Event timer is full.\n");
+ PRINTF("npc_event_dequeue(): Event timer is full.\n");
return 0;
}
if (MAX_EVENTQUEUE > 1)
- memmove (sd->eventqueue[0], sd->eventqueue[1],
- (MAX_EVENTQUEUE - 1) * sizeof (sd->eventqueue[0]));
+ memmove(sd->eventqueue[0], sd->eventqueue[1],
+ (MAX_EVENTQUEUE - 1) * sizeof(sd->eventqueue[0]));
sd->eventqueue[MAX_EVENTQUEUE - 1][0] = '\0';
return 1;
}
@@ -157,213 +144,94 @@ int npc_event_dequeue (struct map_session_data *sd)
return 0;
}
-int npc_delete (struct npc_data *nd)
+int npc_delete(struct npc_data *nd)
{
- nullpo_retr (1, nd);
+ nullpo_retr(1, nd);
if (nd->bl.prev == NULL)
return 1;
- clif_clearchar_area (&nd->bl, 1);
- map_delblock (&nd->bl);
+ clif_clearchar(&nd->bl, BeingRemoveWhy::DEAD);
+ map_delblock(&nd->bl);
return 0;
}
-/*==========================================
- * イベントの遅延実行
- *------------------------------------------
- */
-void npc_event_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+int npc_timer_event(const char *eventname) // Added by RoVeRT
{
- struct map_session_data *sd = map_id2sd (id);
- if (sd == NULL)
- return;
-
- npc_event (sd, (const char *) data, 0);
- free ((void *) data);
-}
-
-int npc_timer_event (const char *eventname) // Added by RoVeRT
-{
- struct event_data *ev = (struct event_data *)strdb_search (ev_db, eventname);
+ struct event_data *ev = ev_db.search(eventname);
struct npc_data *nd;
// int xs,ys;
if ((ev == NULL || (nd = ev->nd) == NULL))
{
- printf ("npc_event: event not found [%s]\n", eventname);
+ PRINTF("npc_event: event not found [%s]\n", eventname);
return 0;
}
- run_script (nd->u.scr.script, ev->pos, nd->bl.id, nd->bl.id);
+ run_script(nd->u.scr.script, ev->pos, nd->bl.id, nd->bl.id);
return 0;
}
-/*
-int npc_timer_sub_sub(void *key,void *data,va_list ap) // Added by RoVeRT
-{
- char *p=(char *)key;
- struct event_data *ev=(struct event_data *)data;
- int *c=va_arg(ap,int *);
- int tick=0,ctick=gettick();
- char temp[10];
- char event[100];
-
- if(ev->nd->bl.id==(int)*c && (p=strchr(p,':')) && p && strncasecmp("::OnTimer",p,8)==0 ){
- sscanf(&p[9],"%s",temp);
- tick=atoi(temp);
-
- strcpy( event, ev->nd->name);
- strcat( event, p);
-
- if (ctick >= ev->nd->lastaction && ctick - ev->nd->timer >= tick) {
- npc_timer_event(event);
- ev->nd->lastaction = ctick;
- }
- }
- return 0;
-}
-
-int npc_timer_sub(void *key,void *data,va_list ap) // Added by RoVeRT
-{
- struct npc_data *nd=(struct npc_data*)data;
-
- if(nd->timer == -1)
- return 0;
-
- strdb_foreach(ev_db,npc_timer_sub_sub,&nd->bl.id);
-
- return 0;
-}
-
-int npc_timer(int tid,unsigned int tick,int id,int data) // Added by RoVeRT
-{
- strdb_foreach(npcname_db,npc_timer_sub);
-
- free((void*)data);
- return 0;
-}*/
-/*==========================================
- * イベント用ラベルのエクスポート
- * npc_parse_script->strdb_foreachから呼ばれる
- *------------------------------------------
- */
-static
-int npc_event_export (void *key, void *data, va_list ap)
-{
- char *lname = (char *) key;
- int pos = (int) data;
- struct npc_data *nd = va_arg (ap, struct npc_data *);
-
- if ((lname[0] == 'O' || lname[0] == 'o')
- && (lname[1] == 'N' || lname[1] == 'n'))
- {
- struct event_data *ev;
- char *buf;
- char *p = strchr (lname, ':');
- // エクスポートされる
- CREATE (ev, struct event_data, 1);
- CREATE (buf, char, 50);
- if (p == NULL || (p - lname) > 24)
- {
- printf ("npc_event_export: label name error !\n");
- exit (1);
- }
- else
- {
- ev->nd = nd;
- ev->pos = pos;
- *p = '\0';
- sprintf (buf, "%s::%s", nd->exname, lname);
- *p = ':';
- strdb_insert (ev_db, buf, ev);
-// if (battle_config.etc_log)
-// printf("npc_event_export: export [%s]\n",buf);
- }
- }
- return 0;
-}
-
/*==========================================
* 全てのNPCのOn*イベント実行
*------------------------------------------
*/
static
-void npc_event_doall_sub (db_key_t key, db_val_t data, va_list ap)
+void npc_event_doall_sub(const std::string& key, struct event_data *ev,
+ int *c, const char *name, int rid, int argc, argrec_t *argv)
{
- const char *p = key.s;
- int rid, argc;
- argrec_t *argv;
- struct event_data *ev;
- int *c;
- const char *name;
+ const char *p = key.c_str();
- nullpo_retv (ev = (struct event_data *) data);
- nullpo_retv (ap);
- nullpo_retv (c = va_arg (ap, int *));
+ nullpo_retv(ev);
- name = va_arg (ap, const char *);
- rid = va_arg (ap, int);
- argc = va_arg (ap, int);
- argv = va_arg (ap, argrec_t *);
-
- if ((p = strchr (p, ':')) && p && strcasecmp (name, p) == 0)
+ if ((p = strchr(p, ':')) && p && strcasecmp(name, p) == 0)
{
- run_script_l (ev->nd->u.scr.script, ev->pos, rid, ev->nd->bl.id, argc,
+ run_script_l(ev->nd->u.scr.script, ev->pos, rid, ev->nd->bl.id, argc,
argv);
(*c)++;
}
}
-int npc_event_doall_l (const char *name, int rid, int argc, argrec_t * args)
+int npc_event_doall_l(const char *name, int rid, int argc, argrec_t *args)
{
- int c = 0;
+ int c = 0;
char buf[64] = "::";
- strncpy (buf + 2, name, sizeof(buf)-3);
+ strncpy(buf + 2, name, sizeof(buf)-3);
buf[sizeof(buf)-1] = '\0';
- strdb_foreach (ev_db, npc_event_doall_sub, &c, buf, rid, argc, args);
+ for (auto& pair : ev_db)
+ npc_event_doall_sub(pair.first, &pair.second, &c, buf, rid, argc, args);
return c;
}
static
-void npc_event_do_sub (db_key_t key, db_val_t data, va_list ap)
+void npc_event_do_sub(const std::string& key, struct event_data *ev,
+ int *c, const char *name, int rid, int argc, argrec_t *argv)
{
- const char *p = key.s;
- struct event_data *ev;
- int *c;
- const char *name;
- int rid, argc;
- argrec_t *argv;
-
- nullpo_retv (ev = (struct event_data *) data);
- nullpo_retv (ap);
- nullpo_retv (c = va_arg (ap, int *));
+ const char *p = key.c_str();
- name = va_arg (ap, const char *);
- rid = va_arg (ap, int);
- argc = va_arg (ap, int);
- argv = va_arg (ap, argrec_t *);
+ nullpo_retv(ev);
- if (p && strcasecmp (name, p) == 0)
+ if (p && strcasecmp(name, p) == 0)
{
- run_script_l (ev->nd->u.scr.script, ev->pos, rid, ev->nd->bl.id, argc,
+ run_script_l(ev->nd->u.scr.script, ev->pos, rid, ev->nd->bl.id, argc,
argv);
(*c)++;
}
}
-int npc_event_do_l (const char *name, int rid, int argc, argrec_t * args)
+int npc_event_do_l(const char *name, int rid, int argc, argrec_t *args)
{
- int c = 0;
+ int c = 0;
if (*name == ':' && name[1] == ':')
{
- return npc_event_doall_l (name + 2, rid, argc, args);
+ return npc_event_doall_l(name + 2, rid, argc, args);
}
- strdb_foreach (ev_db, npc_event_do_sub, &c, name, rid, argc, args);
+ for (auto& pair : ev_db)
+ npc_event_do_sub(pair.first, &pair.second, &c, name, rid, argc, args);
return c;
}
@@ -372,180 +240,47 @@ int npc_event_do_l (const char *name, int rid, int argc, argrec_t * args)
*------------------------------------------
*/
static
-void npc_event_do_clock (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void npc_event_do_clock(TimerData *, tick_t)
{
- time_t timer;
- struct tm *t;
- char buf[64];
- int c = 0;
-
- time (&timer);
- t = gmtime (&timer);
+ struct tm t = TimeT::now();
- if (t->tm_min != ev_tm_b.tm_min)
+ if (t.tm_min != ev_tm_b.tm_min)
{
- sprintf (buf, "OnMinute%02d", t->tm_min);
- c += npc_event_doall (buf);
- sprintf (buf, "OnClock%02d%02d", t->tm_hour, t->tm_min);
- c += npc_event_doall (buf);
+ std::string buf;
+ buf = STRPRINTF("OnMinute%02d", t.tm_min);
+ npc_event_doall(buf.c_str());
+ buf = STRPRINTF("OnClock%02d%02d", t.tm_hour, t.tm_min);
+ npc_event_doall(buf.c_str());
}
- if (t->tm_hour != ev_tm_b.tm_hour)
+ if (t.tm_hour != ev_tm_b.tm_hour)
{
- sprintf (buf, "OnHour%02d", t->tm_hour);
- c += npc_event_doall (buf);
+ std::string buf;
+ buf = STRPRINTF("OnHour%02d", t.tm_hour);
+ npc_event_doall(buf.c_str());
}
- if (t->tm_mday != ev_tm_b.tm_mday)
+ if (t.tm_mday != ev_tm_b.tm_mday)
{
- sprintf (buf, "OnDay%02d%02d", t->tm_mon + 1, t->tm_mday);
- c += npc_event_doall (buf);
+ std::string buf;
+ buf = STRPRINTF("OnDay%02d%02d", t.tm_mon + 1, t.tm_mday);
+ npc_event_doall(buf.c_str());
}
- memcpy (&ev_tm_b, t, sizeof (ev_tm_b));
+ ev_tm_b = t;
}
/*==========================================
* OnInitイベント実行(&時計イベント開始)
*------------------------------------------
*/
-int npc_event_do_oninit (void)
-{
- int c = npc_event_doall ("OnInit");
- printf ("npc: OnInit Event done. (%d npc)\n", c);
-
- add_timer_interval (gettick () + 100, npc_event_do_clock, 0, 0, 1000);
-
- return 0;
-}
-
-/*==========================================
- * OnTimer NPC event - by RoVeRT
- *------------------------------------------
- */
-static
-int npc_addeventtimer (struct npc_data *nd, int tick, const char *name)
-{
- int i;
- for (i = 0; i < MAX_EVENTTIMER; i++)
- if (nd->eventtimer[i] == -1)
- break;
- if (i < MAX_EVENTTIMER)
- {
- char *evname;
- CREATE (evname, char, 24);
- memcpy (evname, name, 24);
- nd->eventtimer[i] = add_timer (gettick () + tick,
- npc_event_timer, nd->bl.id,
- (int) evname);
- }
- else
- printf ("npc_addtimer: event timer is full !\n");
-
- return 0;
-}
-
-static
-int npc_deleventtimer (struct npc_data *nd, const char *name)
-{
- int i;
- for (i = 0; i < MAX_EVENTTIMER; i++)
- if (nd->eventtimer[i] != -1 && strcmp ((char
- *) (get_timer (nd->eventtimer
- [i])->data),
- name) == 0)
- {
- delete_timer (nd->eventtimer[i], npc_event_timer);
- nd->eventtimer[i] = -1;
- break;
- }
-
- return 0;
-}
-
-static
-int npc_cleareventtimer (struct npc_data *nd)
-{
- int i;
- for (i = 0; i < MAX_EVENTTIMER; i++)
- if (nd->eventtimer[i] != -1)
- {
- delete_timer (nd->eventtimer[i], npc_event_timer);
- nd->eventtimer[i] = -1;
- }
-
- return 0;
-}
-
-static
-void npc_do_ontimer_sub (db_key_t key, db_val_t data, va_list ap)
+int npc_event_do_oninit(void)
{
- const char *p = key.s;
- struct event_data *ev = (struct event_data *) data;
- int *c = va_arg (ap, int *);
-// struct map_session_data *sd=va_arg(ap,struct map_session_data *);
- int option = va_arg (ap, int);
- int tick = 0;
- char temp[10];
- char event[50];
+ int c = npc_event_doall("OnInit");
+ PRINTF("npc: OnInit Event done. (%d npc)\n", c);
- if (ev->nd->bl.id == (int) *c && (p = strchr (p, ':')) && p
- && strncasecmp ("::OnTimer", p, 8) == 0)
- {
- sscanf (&p[9], "%s", temp);
- tick = atoi (temp);
-
- strcpy (event, ev->nd->name);
- strcat (event, p);
-
- if (option != 0)
- {
- npc_addeventtimer (ev->nd, tick, event);
- }
- else
- {
- npc_deleventtimer (ev->nd, event);
- }
- }
-}
-
-int npc_do_ontimer (int id, struct map_session_data *sd, int option)
-{
- strdb_foreach (ev_db, npc_do_ontimer_sub, &id, sd, option);
- return 0;
-}
+ Timer(gettick() + std::chrono::milliseconds(100),
+ npc_event_do_clock,
+ std::chrono::seconds(1)
+ ).detach();
-/*==========================================
- * タイマーイベント用ラベルの取り込み
- * npc_parse_script->strdb_foreachから呼ばれる
- *------------------------------------------
- */
-static
-int npc_timerevent_import (void *key, void *data, va_list ap)
-{
- char *lname = (char *) key;
- int pos = (int) data;
- struct npc_data *nd = va_arg (ap, struct npc_data *);
- int t = 0, i = 0;
-
- if (sscanf (lname, "OnTimer%d%n", &t, &i) == 1 && lname[i] == ':')
- {
- // タイマーイベント
- struct npc_timerevent_list *te = nd->u.scr.timer_event;
- int j;
- i = nd->u.scr.timeramount;
- RECREATE (te, struct npc_timerevent_list, i+1);
- for (j = 0; j < i; j++)
- {
- if (te[j].timer > t)
- {
- memmove (te + j + 1, te + j,
- sizeof (struct npc_timerevent_list) * (i - j));
- break;
- }
- }
- te[j].timer = t;
- te[j].pos = pos;
- nd->u.scr.timer_event = te;
- nd->u.scr.timeramount = i + 1;
- }
return 0;
}
@@ -554,40 +289,39 @@ int npc_timerevent_import (void *key, void *data, va_list ap)
*------------------------------------------
*/
static
-void npc_timerevent (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void npc_timerevent(TimerData *, tick_t tick, int id, interval_t data)
{
- int next, t;
- struct npc_data *nd = (struct npc_data *) map_id2bl (id);
+ struct npc_data *nd = (struct npc_data *) map_id2bl(id);
struct npc_timerevent_list *te;
- if (nd == NULL || nd->u.scr.nexttimer < 0)
- {
- printf ("npc_timerevent: ??\n");
- return;
- }
+ assert (nd != NULL);
+ assert (nd->u.scr.nexttimer >= 0);
+
nd->u.scr.timertick = tick;
te = nd->u.scr.timer_event + nd->u.scr.nexttimer;
- nd->u.scr.timerid = -1;
+ // nd->u.scr.timerid = nullptr;
- t = nd->u.scr.timer += data;
+ interval_t t = nd->u.scr.timer += data;
nd->u.scr.nexttimer++;
if (nd->u.scr.timeramount > nd->u.scr.nexttimer)
{
- next = nd->u.scr.timer_event[nd->u.scr.nexttimer].timer - t;
- nd->u.scr.timerid = add_timer (tick + next, npc_timerevent, id, next);
+ interval_t next = nd->u.scr.timer_event[nd->u.scr.nexttimer].timer - t;
+ nd->u.scr.timerid = Timer(tick + next,
+ std::bind(npc_timerevent, ph::_1, ph::_2,
+ id, next));
}
- run_script (nd->u.scr.script, te->pos, 0, nd->bl.id);
+ run_script(nd->u.scr.script, te->pos, 0, nd->bl.id);
}
/*==========================================
* タイマーイベント開始
*------------------------------------------
*/
-int npc_timerevent_start (struct npc_data *nd)
+int npc_timerevent_start(struct npc_data *nd)
{
- int j, n, next;
+ int j, n;
- nullpo_retr (0, nd);
+ nullpo_ret(nd);
n = nd->u.scr.timeramount;
if (nd->u.scr.nexttimer >= 0 || n == 0)
@@ -599,14 +333,15 @@ int npc_timerevent_start (struct npc_data *nd)
break;
}
nd->u.scr.nexttimer = j;
- nd->u.scr.timertick = gettick ();
+ nd->u.scr.timertick = gettick();
if (j >= n)
return 0;
- next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer;
- nd->u.scr.timerid =
- add_timer (gettick () + next, npc_timerevent, nd->bl.id, next);
+ interval_t next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer;
+ nd->u.scr.timerid = Timer(gettick() + next,
+ std::bind(npc_timerevent, ph::_1, ph::_2,
+ nd->bl.id, next));
return 0;
}
@@ -614,17 +349,15 @@ int npc_timerevent_start (struct npc_data *nd)
* タイマーイベント終了
*------------------------------------------
*/
-int npc_timerevent_stop (struct npc_data *nd)
+int npc_timerevent_stop(struct npc_data *nd)
{
- nullpo_retr (0, nd);
+ nullpo_ret(nd);
if (nd->u.scr.nexttimer >= 0)
{
nd->u.scr.nexttimer = -1;
- nd->u.scr.timer += (int) (gettick () - nd->u.scr.timertick);
- if (nd->u.scr.timerid != -1)
- delete_timer (nd->u.scr.timerid, npc_timerevent);
- nd->u.scr.timerid = -1;
+ nd->u.scr.timer += gettick() - nd->u.scr.timertick;
+ nd->u.scr.timerid.cancel();
}
return 0;
}
@@ -633,16 +366,14 @@ int npc_timerevent_stop (struct npc_data *nd)
* タイマー値の所得
*------------------------------------------
*/
-int npc_gettimerevent_tick (struct npc_data *nd)
+interval_t npc_gettimerevent_tick(struct npc_data *nd)
{
- int tick;
-
- nullpo_retr (0, nd);
+ nullpo_retr(interval_t::zero(), nd);
- tick = nd->u.scr.timer;
+ interval_t tick = nd->u.scr.timer;
if (nd->u.scr.nexttimer >= 0)
- tick += (int) (gettick () - nd->u.scr.timertick);
+ tick += gettick() - nd->u.scr.timertick;
return tick;
}
@@ -650,18 +381,18 @@ int npc_gettimerevent_tick (struct npc_data *nd)
* タイマー値の設定
*------------------------------------------
*/
-int npc_settimerevent_tick (struct npc_data *nd, int newtimer)
+int npc_settimerevent_tick(struct npc_data *nd, interval_t newtimer)
{
- int flag;
+ int flag;
- nullpo_retr (0, nd);
+ nullpo_ret(nd);
flag = nd->u.scr.nexttimer;
- npc_timerevent_stop (nd);
+ npc_timerevent_stop(nd);
nd->u.scr.timer = newtimer;
if (flag >= 0)
- npc_timerevent_start (nd);
+ npc_timerevent_start(nd);
return 0;
}
@@ -669,41 +400,41 @@ int npc_settimerevent_tick (struct npc_data *nd, int newtimer)
* イベント型のNPC処理
*------------------------------------------
*/
-int npc_event (struct map_session_data *sd, const char *eventname,
+int npc_event(struct map_session_data *sd, const char *eventname,
int mob_kill)
{
- struct event_data *ev = (struct event_data *)strdb_search (ev_db, eventname);
+ struct event_data *ev = ev_db.search(eventname);
struct npc_data *nd;
- int xs, ys;
+ int xs, ys;
char mobevent[100];
if (sd == NULL)
{
- printf ("npc_event nullpo?\n");
+ PRINTF("npc_event nullpo?\n");
}
if (ev == NULL && eventname
- && strcmp (((eventname) + strlen (eventname) - 9), "::OnTouch") == 0)
+ && strcmp(((eventname) + strlen(eventname) - 9), "::OnTouch") == 0)
return 1;
if (ev == NULL || (nd = ev->nd) == NULL)
{
if (mob_kill && (ev == NULL || (nd = ev->nd) == NULL))
{
- strcpy (mobevent, eventname);
- strcat (mobevent, "::OnMyMobDead");
- ev = (struct event_data *)strdb_search (ev_db, mobevent);
+ strcpy(mobevent, eventname);
+ strcat(mobevent, "::OnMyMobDead");
+ ev = ev_db.search(mobevent);
if (ev == NULL || (nd = ev->nd) == NULL)
{
- if (strncasecmp (eventname, "GM_MONSTER", 10) != 0)
- printf ("npc_event: event not found [%s]\n", mobevent);
+ if (strncasecmp(eventname, "GM_MONSTER", 10) != 0)
+ PRINTF("npc_event: event not found [%s]\n", mobevent);
return 0;
}
}
else
{
if (battle_config.error_log)
- printf ("npc_event: event not found [%s]\n", eventname);
+ PRINTF("npc_event: event not found [%s]\n", eventname);
return 0;
}
}
@@ -725,59 +456,57 @@ int npc_event (struct map_session_data *sd, const char *eventname,
if (sd->npc_id != 0)
{
// if (battle_config.error_log)
-// printf("npc_event: npc_id != 0\n");
- int i;
+// PRINTF("npc_event: npc_id != 0\n");
+ int i;
for (i = 0; i < MAX_EVENTQUEUE; i++)
if (!sd->eventqueue[i][0])
break;
if (i == MAX_EVENTQUEUE)
{
if (battle_config.error_log)
- printf ("npc_event: event queue is full !\n");
+ PRINTF("npc_event: event queue is full !\n");
}
else
{
// if (battle_config.etc_log)
-// printf("npc_event: enqueue\n");
- strncpy (sd->eventqueue[i], eventname, 50);
+// PRINTF("npc_event: enqueue\n");
+ strncpy(sd->eventqueue[i], eventname, 50);
sd->eventqueue[i][49] = '\0';
}
return 1;
}
if (nd->flag & 1)
{ // 無効化されている
- npc_event_dequeue (sd);
+ npc_event_dequeue(sd);
return 0;
}
sd->npc_id = nd->bl.id;
sd->npc_pos =
- run_script (nd->u.scr.script, ev->pos, sd->bl.id, nd->bl.id);
+ run_script(nd->u.scr.script, ev->pos, sd->bl.id, nd->bl.id);
return 0;
}
static
-void npc_command_sub (db_key_t key, db_val_t data, va_list ap)
+void npc_command_sub(const std::string& key, struct event_data *ev, const char *npcname, const char *command)
{
- const char *p = key.s;
- struct event_data *ev = (struct event_data *) data;
- char *npcname = va_arg (ap, char *);
- char *command = va_arg (ap, char *);
+ const char *p = key.c_str();
char temp[100];
- if (strcmp (ev->nd->name, npcname) == 0 && (p = strchr (p, ':')) && p
- && strncasecmp ("::OnCommand", p, 10) == 0)
+ if (strcmp(ev->nd->name, npcname) == 0 && (p = strchr(p, ':')) && p
+ && strncasecmp("::OnCommand", p, 10) == 0)
{
- sscanf (&p[11], "%s", temp);
+ sscanf(&p[11], "%s", temp);
- if (strcmp (command, temp) == 0)
- run_script (ev->nd->u.scr.script, ev->pos, 0, ev->nd->bl.id);
+ if (strcmp(command, temp) == 0)
+ run_script(ev->nd->u.scr.script, ev->pos, 0, ev->nd->bl.id);
}
}
-int npc_command (struct map_session_data *sd, const char *npcname, const char *command)
+int npc_command(struct map_session_data *, const char *npcname, const char *command)
{
- strdb_foreach (ev_db, npc_command_sub, npcname, command);
+ for (auto& pair : ev_db)
+ npc_command_sub(pair.first, &pair.second, npcname, command);
return 0;
}
@@ -786,12 +515,12 @@ int npc_command (struct map_session_data *sd, const char *npcname, const char *c
* 接触型のNPC処理
*------------------------------------------
*/
-int npc_touch_areanpc (struct map_session_data *sd, int m, int x, int y)
+int npc_touch_areanpc(struct map_session_data *sd, int m, int x, int y)
{
- int i, f = 1;
- int xs, ys;
+ int i, f = 1;
+ int xs, ys;
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
if (sd->npc_id)
return 1;
@@ -806,12 +535,12 @@ int npc_touch_areanpc (struct map_session_data *sd, int m, int x, int y)
switch (map[m].npc[i]->bl.subtype)
{
- case WARP:
+ case NpcSubtype::WARP:
xs = map[m].npc[i]->u.warp.xs;
ys = map[m].npc[i]->u.warp.ys;
break;
- case MESSAGE:
- case SCRIPT:
+ case NpcSubtype::MESSAGE:
+ case NpcSubtype::SCRIPT:
xs = map[m].npc[i]->u.scr.xs;
ys = map[m].npc[i]->u.scr.ys;
break;
@@ -829,29 +558,29 @@ int npc_touch_areanpc (struct map_session_data *sd, int m, int x, int y)
if (f)
{
if (battle_config.error_log)
- printf ("npc_touch_areanpc : some bug \n");
+ PRINTF("npc_touch_areanpc : some bug \n");
}
return 1;
}
switch (map[m].npc[i]->bl.subtype)
{
- case WARP:
- skill_stop_dancing (&sd->bl, 0);
- pc_setpos (sd, map[m].npc[i]->u.warp.name,
- map[m].npc[i]->u.warp.x, map[m].npc[i]->u.warp.y, 0);
+ case NpcSubtype::WARP:
+ skill_stop_dancing(&sd->bl, 0);
+ pc_setpos(sd, map[m].npc[i]->u.warp.name,
+ map[m].npc[i]->u.warp.x, map[m].npc[i]->u.warp.y, BeingRemoveWhy::GONE);
break;
- case MESSAGE:
- case SCRIPT:
+ case NpcSubtype::MESSAGE:
+ case NpcSubtype::SCRIPT:
{
- char *name = (char *)malloc (50);
+ char *name = (char *)malloc(50);
- memcpy (name, map[m].npc[i]->name, 50);
+ memcpy(name, map[m].npc[i]->name, 50);
if (sd->areanpc_id == map[m].npc[i]->bl.id)
- return 1;
+ return 1; // TODO fix leak of 'name'
sd->areanpc_id = map[m].npc[i]->bl.id;
- if (npc_event (sd, strcat (name, "::OnTouch"), 0) > 0)
- npc_click (sd, map[m].npc[i]->bl.id);
- free (name);
+ if (npc_event(sd, strcat(name, "::OnTouch"), 0) > 0)
+ npc_click(sd, map[m].npc[i]->bl.id);
+ free(name);
break;
}
}
@@ -862,17 +591,18 @@ int npc_touch_areanpc (struct map_session_data *sd, int m, int x, int y)
* 近くかどうかの判定
*------------------------------------------
*/
-int npc_checknear (struct map_session_data *sd, int id)
+static
+int npc_checknear(struct map_session_data *sd, int id)
{
struct npc_data *nd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- nd = (struct npc_data *) map_id2bl (id);
- if (nd == NULL || nd->bl.type != BL_NPC)
+ nd = (struct npc_data *) map_id2bl(id);
+ if (nd == NULL || nd->bl.type != BL::NPC)
{
if (battle_config.error_log)
- printf ("no such npc : %d\n", id);
+ PRINTF("no such npc : %d\n", id);
return 1;
}
@@ -894,25 +624,25 @@ int npc_checknear (struct map_session_data *sd, int id)
* クリック時のNPC処理
*------------------------------------------
*/
-int npc_click (struct map_session_data *sd, int id)
+int npc_click(struct map_session_data *sd, int id)
{
struct npc_data *nd;
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
if (sd->npc_id != 0)
{
if (battle_config.error_log)
- printf ("npc_click: npc_id != 0\n");
+ PRINTF("npc_click: npc_id != 0\n");
return 1;
}
- if (npc_checknear (sd, id)) {
- clif_scriptclose (sd, id);
+ if (npc_checknear(sd, id)) {
+ clif_scriptclose(sd, id);
return 1;
}
- nd = (struct npc_data *) map_id2bl (id);
+ nd = (struct npc_data *) map_id2bl(id);
if (nd->flag & 1) // 無効化されている
return 1;
@@ -920,18 +650,18 @@ int npc_click (struct map_session_data *sd, int id)
sd->npc_id = id;
switch (nd->bl.subtype)
{
- case SHOP:
- clif_npcbuysell (sd, id);
- npc_event_dequeue (sd);
+ case NpcSubtype::SHOP:
+ clif_npcbuysell(sd, id);
+ npc_event_dequeue(sd);
break;
- case SCRIPT:
- sd->npc_pos = run_script (nd->u.scr.script, 0, sd->bl.id, id);
+ case NpcSubtype::SCRIPT:
+ sd->npc_pos = run_script(nd->u.scr.script, 0, sd->bl.id, id);
break;
- case MESSAGE:
+ case NpcSubtype::MESSAGE:
if (nd->u.message)
{
- clif_scriptmes (sd, id, nd->u.message);
- clif_scriptclose (sd, id);
+ clif_scriptmes(sd, id, nd->u.message);
+ clif_scriptclose(sd, id);
}
break;
}
@@ -943,29 +673,29 @@ int npc_click (struct map_session_data *sd, int id)
*
*------------------------------------------
*/
-int npc_scriptcont (struct map_session_data *sd, int id)
+int npc_scriptcont(struct map_session_data *sd, int id)
{
struct npc_data *nd;
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
if (id != sd->npc_id)
return 1;
- if (npc_checknear (sd, id)) {
- clif_scriptclose (sd, id);
+ if (npc_checknear(sd, id)) {
+ clif_scriptclose(sd, id);
return 1;
}
- nd = (struct npc_data *) map_id2bl (id);
+ nd = (struct npc_data *) map_id2bl(id);
- if (!nd /* NPC was disposed? */ || nd->bl.subtype == MESSAGE)
+ if (!nd /* NPC was disposed? */ || nd->bl.subtype == NpcSubtype::MESSAGE)
{
- clif_scriptclose (sd, id);
- npc_event_dequeue (sd);
+ clif_scriptclose(sd, id);
+ npc_event_dequeue(sd);
return 0;
}
- sd->npc_pos = run_script (nd->u.scr.script, sd->npc_pos, sd->bl.id, id);
+ sd->npc_pos = run_script(nd->u.scr.script, sd->npc_pos, sd->bl.id, id);
return 0;
}
@@ -974,20 +704,20 @@ int npc_scriptcont (struct map_session_data *sd, int id)
*
*------------------------------------------
*/
-int npc_buysellsel (struct map_session_data *sd, int id, int type)
+int npc_buysellsel(struct map_session_data *sd, int id, int type)
{
struct npc_data *nd;
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
- if (npc_checknear (sd, id))
+ if (npc_checknear(sd, id))
return 1;
- nd = (struct npc_data *) map_id2bl (id);
- if (nd->bl.subtype != SHOP)
+ nd = (struct npc_data *) map_id2bl(id);
+ if (nd->bl.subtype != NpcSubtype::SHOP)
{
if (battle_config.error_log)
- printf ("no such shop npc : %d\n", id);
+ PRINTF("no such shop npc : %d\n", id);
sd->npc_id = 0;
return 1;
}
@@ -997,11 +727,11 @@ int npc_buysellsel (struct map_session_data *sd, int id, int type)
sd->npc_shopid = id;
if (type == 0)
{
- clif_buylist (sd, nd);
+ clif_buylist(sd, nd);
}
else
{
- clif_selllist (sd);
+ clif_selllist(sd);
}
return 0;
}
@@ -1010,21 +740,22 @@ int npc_buysellsel (struct map_session_data *sd, int id, int type)
*
*------------------------------------------
*/
-int npc_buylist (struct map_session_data *sd, int n,
- unsigned short *item_list)
+// TODO enumify return type
+int npc_buylist(struct map_session_data *sd, int n,
+ const uint16_t *item_list)
{
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);
+ nullpo_retr(3, sd);
+ nullpo_retr(3, item_list);
- if (npc_checknear (sd, sd->npc_shopid))
+ if (npc_checknear(sd, sd->npc_shopid))
return 3;
- nd = (struct npc_data *) map_id2bl (sd->npc_shopid);
- if (nd->bl.subtype != SHOP)
+ nd = (struct npc_data *) map_id2bl(sd->npc_shopid);
+ if (nd->bl.subtype != NpcSubtype::SHOP)
return 3;
for (i = 0, w = 0, z = 0; i < n; i++)
@@ -1037,88 +768,67 @@ 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]))
+ switch (pc_checkadditem(sd, item_list[i * 2 + 1], item_list[i * 2]))
{
- case ADDITEM_EXIST:
+ case ADDITEM::EXIST:
break;
- case ADDITEM_NEW:
- if (itemdb_isequip (item_list[i * 2 + 1]))
+ case ADDITEM::NEW:
+ if (itemdb_isequip(item_list[i * 2 + 1]))
new_stacks += item_list[i * 2];
else
new_stacks++;
break;
- case ADDITEM_OVERAMOUNT:
+ case ADDITEM::OVERAMOUNT:
return 2;
}
- w += itemdb_weight (item_list[i * 2 + 1]) * item_list[i * 2];
+ w += itemdb_weight(item_list[i * 2 + 1]) * item_list[i * 2];
}
if (z > (double) sd->status.zeny)
return 1; // zeny不足
if (w + sd->weight > sd->max_weight)
return 2; // 重量超過
- if (pc_inventoryblank (sd) < new_stacks)
+ if (pc_inventoryblank(sd) < new_stacks)
return 3; // 種類数超過
if (sd->trade_partner != 0)
return 4; // cant buy while trading
- pc_payzeny (sd, (int) z);
+ pc_payzeny(sd, (int) z);
for (i = 0; i < n; i++)
{
struct item_data *item_data;
- if ((item_data = itemdb_exists (item_list[i * 2 + 1])) != NULL)
+ if ((item_data = itemdb_exists(item_list[i * 2 + 1])) != NULL)
{
- int amount = item_list[i * 2];
+ int amount = item_list[i * 2];
struct item item_tmp;
- memset (&item_tmp, 0, sizeof (item_tmp));
+ memset(&item_tmp, 0, sizeof(item_tmp));
item_tmp.nameid = item_data->nameid;
item_tmp.identify = 1; // npc販売アイテムは鑑定済み
if (amount > 1
- && (item_data->type == 4 || item_data->type == 5
- || item_data->type == 7 || item_data->type == 8))
+ && (item_data->type == ItemType::WEAPON
+ || item_data->type == ItemType::ARMOR
+ || item_data->type == ItemType::_7
+ || item_data->type == ItemType::_8))
{
for (j = 0; j < amount; j++)
{
- pc_additem (sd, &item_tmp, 1);
+ pc_additem(sd, &item_tmp, 1);
}
}
else
{
- pc_additem (sd, &item_tmp, amount);
+ pc_additem(sd, &item_tmp, amount);
}
}
}
- //商人経験値
-/* 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;
}
@@ -1126,20 +836,20 @@ int npc_buylist (struct map_session_data *sd, int n,
*
*------------------------------------------
*/
-int npc_selllist (struct map_session_data *sd, int n,
- unsigned short *item_list)
+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);
+ nullpo_retr(1, sd);
+ nullpo_retr(1, item_list);
- if (npc_checknear (sd, sd->npc_shopid))
+ if (npc_checknear(sd, sd->npc_shopid))
return 1;
for (i = 0, z = 0; i < n; i++)
{
- int nameid;
+ int nameid;
if (item_list[i * 2] - 2 < 0 || item_list[i * 2] - 2 >= MAX_INVENTORY)
return 1;
nameid = sd->status.inventory[item_list[i * 2] - 2].nameid;
@@ -1149,40 +859,17 @@ 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];
}
if (z > MAX_ZENY)
z = MAX_ZENY;
- pc_getzeny (sd, (int) z);
+ pc_getzeny(sd, (int) z);
for (i = 0; i < n; i++)
{
- int item_id = item_list[i * 2] - 2;
- 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);
- }
+ int item_id = item_list[i * 2] - 2;
+ pc_delitem(sd, item_id, item_list[i * 2 + 1], 0);
}
return 0;
@@ -1198,7 +885,7 @@ int npc_selllist (struct map_session_data *sd, int n,
*------------------------------------------
*/
static
-void npc_clearsrcfile (void)
+void npc_clearsrcfile(void)
{
struct npc_src_list *p = npc_src_first;
@@ -1206,7 +893,7 @@ void npc_clearsrcfile (void)
{
struct npc_src_list *p2 = p;
p = p->next;
- free (p2);
+ free(p2);
}
npc_src_first = NULL;
npc_src_last = NULL;
@@ -1216,21 +903,21 @@ void npc_clearsrcfile (void)
* 読み込むnpcファイルの追加
*------------------------------------------
*/
-void npc_addsrcfile (char *name)
+void npc_addsrcfile(const char *name)
{
struct npc_src_list *new_src;
size_t len;
- if (strcasecmp (name, "clear") == 0)
+ if (strcasecmp(name, "clear") == 0)
{
- npc_clearsrcfile ();
+ npc_clearsrcfile();
return;
}
- len = sizeof (*new_src) + strlen (name);
- new_src = (struct npc_src_list *) calloc (1, len);
+ len = sizeof(*new_src) + strlen(name);
+ new_src = (struct npc_src_list *) calloc(1, len);
new_src->next = NULL;
- strncpy (new_src->name, name, strlen (name) + 1);
+ strncpy(new_src->name, name, strlen(name) + 1);
if (npc_src_first == NULL)
npc_src_first = new_src;
if (npc_src_last)
@@ -1243,24 +930,24 @@ void npc_addsrcfile (char *name)
* 読み込むnpcファイルの削除
*------------------------------------------
*/
-void npc_delsrcfile (char *name)
+void npc_delsrcfile(const char *name)
{
struct npc_src_list *p = npc_src_first, *pp = NULL, **lp = &npc_src_first;
- if (strcasecmp (name, "all") == 0)
+ if (strcasecmp(name, "all") == 0)
{
- npc_clearsrcfile ();
+ npc_clearsrcfile();
return;
}
for (; p; lp = &p->next, pp = p, p = p->next)
{
- if (strcmp (p->name, name) == 0)
+ if (strcmp(p->name, name) == 0)
{
*lp = p->next;
if (npc_src_last == p)
npc_src_last = pp;
- free (p);
+ free(p);
break;
}
}
@@ -1270,48 +957,48 @@ void npc_delsrcfile (char *name)
* warp行解析
*------------------------------------------
*/
-int npc_parse_warp (const char *w1, const char *w2, const char *w3, const char *w4)
+int npc_parse_warp(const char *w1, const char *, const char *w3, const char *w4)
{
- int x, y, xs, ys, to_x, to_y, m;
- int i, j;
+ int x, y, xs, ys, to_x, to_y, m;
+ int i, j;
char mapname[24], to_mapname[24];
struct npc_data *nd;
// 引数の個数チェック
- if (sscanf (w1, "%[^,],%d,%d", mapname, &x, &y) != 3 ||
- sscanf (w4, "%d,%d,%[^,],%d,%d", &xs, &ys, to_mapname, &to_x,
+ if (sscanf(w1, "%[^,],%d,%d", mapname, &x, &y) != 3 ||
+ sscanf(w4, "%d,%d,%[^,],%d,%d", &xs, &ys, to_mapname, &to_x,
&to_y) != 5)
{
- printf ("bad warp line : %s\n", w3);
+ PRINTF("bad warp line : %s\n", w3);
return 1;
}
- m = map_mapname2mapid (mapname);
+ m = map_mapname2mapid(mapname);
- nd = (struct npc_data *) calloc (1, sizeof (struct npc_data));
- nd->bl.id = npc_get_new_npc_id ();
- nd->n = map_addnpc (m, nd);
+ nd = (struct npc_data *) calloc(1, sizeof(struct npc_data));
+ nd->bl.id = npc_get_new_npc_id();
+ nd->n = map_addnpc(m, nd);
nd->bl.prev = nd->bl.next = NULL;
nd->bl.m = m;
nd->bl.x = x;
nd->bl.y = y;
- nd->dir = 0;
+ nd->dir = DIR::S;
nd->flag = 0;
- memcpy (nd->name, w3, 24);
- memcpy (nd->exname, w3, 24);
+ memcpy(nd->name, w3, 24);
+ memcpy(nd->exname, w3, 24);
nd->chat_id = 0;
if (!battle_config.warp_point_debug)
nd->npc_class = WARP_CLASS;
else
nd->npc_class = WARP_DEBUG_CLASS;
- nd->speed = 200;
- nd->option = 0;
- nd->opt1 = 0;
- nd->opt2 = 0;
- nd->opt3 = 0;
- memcpy (nd->u.warp.name, to_mapname, 16);
+ nd->speed = std::chrono::milliseconds(200);
+ nd->option = Option::ZERO;
+ nd->opt1 = Opt1::ZERO;
+ nd->opt2 = Opt2::ZERO;
+ nd->opt3 = Opt3::ZERO;
+ memcpy(nd->u.warp.name, to_mapname, 16);
xs += 2;
ys += 2;
nd->u.warp.x = to_x;
@@ -1323,21 +1010,24 @@ int npc_parse_warp (const char *w1, const char *w2, const char *w3, const char *
{
for (j = 0; j < xs; j++)
{
- int t;
- t = map_getcell (m, x - xs / 2 + j, y - ys / 2 + i);
- if (t == 1 || t == 5)
+ int x_lo = x - xs / 2;
+ int y_lo = y - ys / 2;
+ int xc = x_lo + j;
+ int yc = y_lo + i;
+ MapCell t = map_getcell(m, xc, yc);
+ if (bool(t & MapCell::UNWALKABLE))
continue;
- map_setcell (m, x - xs / 2 + j, y - ys / 2 + i, t | 0x80);
+ map_setcell(m, xc, yc, t | MapCell::NPC_NEAR);
}
}
-// printf("warp npc %s %d read done\n",mapname,nd->bl.id);
+// PRINTF("warp npc %s %d read done\n",mapname,nd->bl.id);
npc_warp++;
- nd->bl.type = BL_NPC;
- nd->bl.subtype = WARP;
- map_addblock (&nd->bl);
- clif_spawnnpc (nd);
- strdb_insert (npcname_db, nd->name, nd);
+ nd->bl.type = BL::NPC;
+ nd->bl.subtype = NpcSubtype::WARP;
+ map_addblock(&nd->bl);
+ clif_spawnnpc(nd);
+ npcname_db.put(nd->name, nd);
return 0;
}
@@ -1346,40 +1036,46 @@ int npc_parse_warp (const char *w1, const char *w2, const char *w3, const char *
* shop行解析
*------------------------------------------
*/
-static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
+static
+int npc_parse_shop(char *w1, char *, char *w3, char *w4)
{
char *p;
- int x, y, dir, m;
- int max = 100, pos = 0;
+ int x, y;
+ DIR dir;
+ int m;
+ int max = 100, pos = 0;
char mapname[24];
struct npc_data *nd;
// 引数の個数チェック
- if (sscanf (w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
- strchr (w4, ',') == NULL)
+ int dir_; // TODO use SSCANF or extract
+ if (sscanf(w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir_) != 4
+ || dir_ < 0 || dir_ >= 8
+ || strchr(w4, ',') == NULL)
{
- printf ("bad shop line : %s\n", w3);
+ PRINTF("bad shop line : %s\n", w3);
return 1;
}
- m = map_mapname2mapid (mapname);
+ dir = static_cast<DIR>(dir_);
+ m = map_mapname2mapid(mapname);
- nd = (struct npc_data *) calloc (1, sizeof (struct npc_data) +
- sizeof (nd->u.shop_item[0]) * (max +
+ nd = (struct npc_data *) calloc(1, sizeof(struct npc_data) +
+ sizeof(nd->u.shop_item[0]) * (max +
1));
- p = strchr (w4, ',');
+ p = strchr(w4, ',');
while (p && pos < max)
{
- int nameid, value;
+ int nameid, value;
char name[24];
struct item_data *id = NULL;
p++;
- if (sscanf (p, "%d:%d", &nameid, &value) == 2)
+ if (sscanf(p, "%d:%d", &nameid, &value) == 2)
{
}
- else if (sscanf (p, "%s :%d", name, &value) == 2)
+ else if (sscanf(p, "%s :%d", name, &value) == 2)
{
- id = itemdb_searchname (name);
+ id = itemdb_searchname(name);
if (id == NULL)
nameid = -1;
else
@@ -1394,18 +1090,18 @@ static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
if (value < 0)
{
if (id == NULL)
- id = itemdb_search (nameid);
- value = id->value_buy * abs (value);
+ id = itemdb_search(nameid);
+ value = id->value_buy * abs(value);
}
nd->u.shop_item[pos].value = value;
pos++;
}
- p = strchr (p, ',');
+ p = strchr(p, ',');
}
if (pos == 0)
{
- free (nd);
+ free(nd);
return 1;
}
nd->u.shop_item[pos++].nameid = 0;
@@ -1414,29 +1110,29 @@ static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
nd->bl.m = m;
nd->bl.x = x;
nd->bl.y = y;
- nd->bl.id = npc_get_new_npc_id ();
+ nd->bl.id = npc_get_new_npc_id();
nd->dir = dir;
nd->flag = 0;
- memcpy (nd->name, w3, 24);
- nd->npc_class = atoi (w4);
- nd->speed = 200;
+ memcpy(nd->name, w3, 24);
+ nd->npc_class = atoi(w4);
+ nd->speed = std::chrono::milliseconds(200);
nd->chat_id = 0;
- nd->option = 0;
- nd->opt1 = 0;
- nd->opt2 = 0;
- nd->opt3 = 0;
+ nd->option = Option::ZERO;
+ nd->opt1 = Opt1::ZERO;
+ nd->opt2 = Opt2::ZERO;
+ nd->opt3 = Opt3::ZERO;
nd = (struct npc_data *)
- realloc (nd, sizeof (struct npc_data) + sizeof (nd->u.shop_item[0]) * pos);
+ realloc(nd, sizeof(struct npc_data) + sizeof(nd->u.shop_item[0]) * pos);
- //printf("shop npc %s %d read done\n",mapname,nd->bl.id);
+ //PRINTF("shop npc %s %d read done\n",mapname,nd->bl.id);
npc_shop++;
- nd->bl.type = BL_NPC;
- nd->bl.subtype = SHOP;
- nd->n = map_addnpc (m, nd);
- map_addblock (&nd->bl);
- clif_spawnnpc (nd);
- strdb_insert (npcname_db, nd->name, nd);
+ nd->bl.type = BL::NPC;
+ nd->bl.subtype = NpcSubtype::SHOP;
+ nd->n = map_addnpc(m, nd);
+ map_addblock(&nd->bl);
+ clif_spawnnpc(nd);
+ npcname_db.put(nd->name, nd);
return 0;
}
@@ -1446,36 +1142,26 @@ static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
*------------------------------------------
*/
static
-void npc_convertlabel_db (db_key_t key, db_val_t data, va_list ap)
+void npc_convertlabel_db(const std::string& lname, int pos, struct npc_data *nd)
{
- const char *lname = key.s;
- int pos = (int) data;
- struct npc_data *nd;
struct npc_label_list *lst;
- int num;
- // this exists for evil purposes
- char *p = const_cast<char *>(strchr (lname, ':'));
+ int num;
- nullpo_retv (ap);
- nullpo_retv (nd = va_arg (ap, struct npc_data *));
+ nullpo_retv(nd);
lst = nd->u.scr.label_list;
num = nd->u.scr.label_list_num;
if (!lst)
{
lst = (struct npc_label_list *)
- calloc (1, sizeof (struct npc_label_list));
+ calloc(1, sizeof(struct npc_label_list));
num = 0;
}
else
lst = (struct npc_label_list *)
- realloc (lst, sizeof (struct npc_label_list) * (num + 1));
+ realloc(lst, sizeof(struct npc_label_list) * (num + 1));
- *p = '\0';
- // temporarily NUL-terminate lname
- strncpy (lst[num].name, lname, sizeof(lst[num].name)-1);
- lst[num].name[sizeof(lst[num].name)-1] = '\0';
- *p = ':';
+ strzcpy(lst[num].name, lname.c_str(), sizeof(lst[num].name));
lst[num].pos = pos;
nd->u.scr.label_list = lst;
nd->u.scr.label_list_num = num + 1;
@@ -1486,25 +1172,26 @@ void npc_convertlabel_db (db_key_t key, db_val_t data, va_list ap)
*------------------------------------------
*/
static
-int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
+int npc_parse_script(char *w1, char *w2, char *w3, char *w4,
const char *first_line, FILE * fp, int *lines)
{
- int x, y, dir = 0, m, xs = 0, ys = 0, npc_class = 0; // [Valaris] thanks to fov
+ int x, y;
+ DIR dir = DIR::S;
+ int m, xs = 0, ys = 0, npc_class = 0; // [Valaris] thanks to fov
char mapname[24];
char *srcbuf = NULL;
const ScriptCode *script = NULL;
- int srcsize = 65536;
- int startline = 0;
+ int srcsize = 65536;
+ int startline = 0;
char line[1024];
struct npc_data *nd;
- int evflag = 0;
- struct dbt *label_db;
+ int evflag = 0;
char *p;
struct npc_label_list *label_dup = NULL;
- int label_dupnum = 0;
- int src_id = 0;
+ int label_dupnum = 0;
+ int src_id = 0;
- if (strcmp (w1, "-") == 0)
+ if (strcmp(w1, "-") == 0)
{
x = 0;
y = 0;
@@ -1513,22 +1200,25 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
else
{
// 引数の個数チェック
- if (sscanf (w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
- (strcmp (w2, "script") == 0 && strchr (w4, ',') == NULL))
+ int dir_; // TODO use SSCANF or extract
+ if (sscanf(w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir_) != 4
+ || dir_ < 0 || dir_ >= 8
+ || (strcmp(w2, "script") == 0 && strchr(w4, ',') == NULL))
{
- printf ("bad script line : %s\n", w3);
+ PRINTF("bad script line : %s\n", w3);
return 1;
}
- m = map_mapname2mapid (mapname);
+ dir = static_cast<DIR>(dir_);
+ m = map_mapname2mapid(mapname);
}
- if (strcmp (w2, "script") == 0)
+ if (strcmp(w2, "script") == 0)
{
// スクリプトの解析
- srcbuf = (char *) calloc (srcsize, sizeof (char));
- if (strchr (first_line, '{'))
+ srcbuf = (char *) calloc(srcsize, sizeof(char));
+ if (strchr(first_line, '{'))
{
- strcpy (srcbuf, strchr (first_line, '{'));
+ strcpy(srcbuf, strchr(first_line, '{'));
startline = *lines;
}
else
@@ -1536,36 +1226,36 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
while (1)
{
int i;
- for (i = strlen (srcbuf) - 1; i >= 0 && isspace (srcbuf[i]); i--);
+ for (i = strlen(srcbuf) - 1; i >= 0 && isspace(srcbuf[i]); i--);
if (i >= 0 && srcbuf[i] == '}')
break;
- if (!fgets (line, 1020, fp))
+ if (!fgets(line, 1020, fp))
break;
(*lines)++;
- if (feof (fp))
+ if (feof(fp))
break;
- if (strlen (srcbuf) + strlen (line) + 1 >= srcsize)
+ if (strlen(srcbuf) + strlen(line) + 1 >= srcsize)
{
srcsize += 65536;
- srcbuf = (char *) realloc (srcbuf, srcsize);
- memset (srcbuf + srcsize - 65536, '\0', 65536);
+ srcbuf = (char *) realloc(srcbuf, srcsize);
+ memset(srcbuf + srcsize - 65536, '\0', 65536);
}
if (srcbuf[0] != '{')
{
- if (strchr (line, '{'))
+ if (strchr(line, '{'))
{
- strcpy (srcbuf, strchr (line, '{'));
+ strcpy(srcbuf, strchr(line, '{'));
startline = *lines;
}
}
else
- strcat (srcbuf, line);
+ strcat(srcbuf, line);
}
- script = parse_script (srcbuf, startline);
+ script = parse_script(srcbuf, startline);
if (script == NULL)
{
// script parse error?
- free (srcbuf);
+ free(srcbuf);
return 1;
}
@@ -1576,14 +1266,14 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
char srcname[128];
struct npc_data *nd2;
- if (sscanf (w2, "duplicate(%[^)])", srcname) != 1)
+ if (sscanf(w2, "duplicate (%[^)])", srcname) != 1)
{
- printf ("bad duplicate name! : %s", w2);
+ PRINTF("bad duplicate name! : %s", w2);
return 0;
}
- if ((nd2 = npc_name2id (srcname)) == NULL)
+ if ((nd2 = npc_name2id(srcname)) == NULL)
{
- printf ("bad duplicate name! (not exist) : %s\n", srcname);
+ PRINTF("bad duplicate name! (not exist) : %s\n", srcname);
return 0;
}
script = nd2->u.scr.script;
@@ -1593,17 +1283,17 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
} // end of スクリプト解析
- nd = (struct npc_data *) calloc (1, sizeof (struct npc_data));
+ nd = (struct npc_data *) calloc(1, sizeof(struct npc_data));
if (m == -1)
{
// スクリプトコピー用のダミーNPC
}
- else if (sscanf (w4, "%d,%d,%d", &npc_class, &xs, &ys) == 3)
+ else if (sscanf(w4, "%d,%d,%d", &npc_class, &xs, &ys) == 3)
{
// 接触型NPC
- int i, j;
+ int i, j;
if (xs >= 0)
xs = xs * 2 + 1;
@@ -1617,11 +1307,14 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
{
for (j = 0; j < xs; j++)
{
- int t;
- t = map_getcell (m, x - xs / 2 + j, y - ys / 2 + i);
- if (t == 1 || t == 5)
+ int x_lo = x - xs / 2;
+ int y_lo = y - ys / 2;
+ int xc = x_lo + j;
+ int yc = y_lo + i;
+ MapCell t = map_getcell(m, xc, yc);
+ if (bool(t & MapCell::UNWALKABLE))
continue;
- map_setcell (m, x - xs / 2 + j, y - ys / 2 + i, t | 0x80);
+ map_setcell(m, xc, yc, t | MapCell::NPC_NEAR);
}
}
}
@@ -1631,7 +1324,7 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
}
else
{ // クリック型NPC
- npc_class = atoi (w4);
+ npc_class = atoi(w4);
nd->u.scr.xs = 0;
nd->u.scr.ys = 0;
}
@@ -1641,7 +1334,7 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
evflag = 1;
}
- while ((p = strchr (w3, ':')))
+ while ((p = strchr(w3, ':')))
{
if (p[1] == ':')
break;
@@ -1649,53 +1342,52 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
if (p)
{
*p = 0;
- memcpy (nd->name, w3, 24);
- memcpy (nd->exname, p + 2, 24);
+ memcpy(nd->name, w3, 24);
+ memcpy(nd->exname, p + 2, 24);
}
else
{
- memcpy (nd->name, w3, 24);
- memcpy (nd->exname, w3, 24);
+ memcpy(nd->name, w3, 24);
+ memcpy(nd->exname, w3, 24);
}
nd->bl.prev = nd->bl.next = NULL;
nd->bl.m = m;
nd->bl.x = x;
nd->bl.y = y;
- nd->bl.id = npc_get_new_npc_id ();
+ nd->bl.id = npc_get_new_npc_id();
nd->dir = dir;
nd->flag = 0;
nd->npc_class = npc_class;
- nd->speed = 200;
+ nd->speed = std::chrono::milliseconds(200);
nd->u.scr.script = script;
nd->u.scr.src_id = src_id;
nd->chat_id = 0;
- nd->option = 0;
- nd->opt1 = 0;
- nd->opt2 = 0;
- nd->opt3 = 0;
+ nd->option = Option::ZERO;
+ nd->opt1 = Opt1::ZERO;
+ nd->opt2 = Opt2::ZERO;
+ nd->opt3 = Opt3::ZERO;
- //printf("script npc %s %d %d read done\n",mapname,nd->bl.id,nd->class);
+ //PRINTF("script npc %s %d %d read done\n",mapname,nd->bl.id,nd->class);
npc_script++;
- nd->bl.type = BL_NPC;
- nd->bl.subtype = SCRIPT;
+ nd->bl.type = BL::NPC;
+ nd->bl.subtype = NpcSubtype::SCRIPT;
if (m >= 0)
{
- nd->n = map_addnpc (m, nd);
- map_addblock (&nd->bl);
+ nd->n = map_addnpc(m, nd);
+ map_addblock(&nd->bl);
if (evflag)
{ // イベント型
- struct event_data *ev =
- (struct event_data *) calloc (1, sizeof (struct event_data));
- ev->nd = nd;
- ev->pos = 0;
- strdb_insert (ev_db, nd->exname, ev);
+ struct event_data ev {};
+ ev.nd = nd;
+ ev.pos = 0;
+ ev_db.insert(nd->exname, ev);
}
else
- clif_spawnnpc (nd);
+ clif_spawnnpc(nd);
}
- strdb_insert (npcname_db, nd->exname, nd);
+ npcname_db.put(nd->exname, nd);
//-----------------------------------------
// ラベルデータの準備
@@ -1704,11 +1396,11 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
// script本体がある場合の処理
// ラベルデータのコンバート
- label_db = script_get_label_db ();
- strdb_foreach (label_db, npc_convertlabel_db, nd);
+ for (auto& pair : scriptlabel_db)
+ npc_convertlabel_db(pair.first, pair.second, nd);
// もう使わないのでバッファ解放
- free (srcbuf);
+ free(srcbuf);
}
else
@@ -1727,29 +1419,21 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
for (int i = 0; i < nd->u.scr.label_list_num; i++)
{
char *lname = nd->u.scr.label_list[i].name;
- int pos = nd->u.scr.label_list[i].pos;
+ int pos = nd->u.scr.label_list[i].pos;
if ((lname[0] == 'O' || lname[0] == 'o')
&& (lname[1] == 'N' || lname[1] == 'n'))
{
- struct event_data *ev;
- char *buf;
- // エクスポートされる
- ev = (struct event_data *) calloc (1,
- sizeof (struct event_data));
- buf = (char *) calloc (50, sizeof (char));
- if (strlen (lname) > 24)
+ if (strlen(lname) > 24)
{
- printf ("npc_parse_script: label name error !\n");
- exit (1);
- }
- else
- {
- ev->nd = nd;
- ev->pos = pos;
- sprintf (buf, "%s::%s", nd->exname, lname);
- strdb_insert (ev_db, buf, ev);
+ PRINTF("npc_parse_script: label name error !\n");
+ exit(1);
}
+ struct event_data ev {};
+ ev.nd = nd;
+ ev.pos = pos;
+ std::string buf = STRPRINTF("%s::%s", nd->exname, lname);
+ ev_db.insert(buf, ev);
}
}
@@ -1757,29 +1441,30 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
// ラベルデータからタイマーイベント取り込み
for (int i = 0; i < nd->u.scr.label_list_num; i++)
{
- int t = 0, n = 0;
+ int t_ = 0, n = 0;
char *lname = nd->u.scr.label_list[i].name;
- int pos = nd->u.scr.label_list[i].pos;
- if (sscanf (lname, "OnTimer%d%n", &t, &n) == 1 && lname[n] == '\0')
+ int pos = nd->u.scr.label_list[i].pos;
+ if (sscanf(lname, "OnTimer%d%n", &t_, &n) == 1 && lname[n] == '\0')
{
+ interval_t t = static_cast<interval_t>(t_);
// タイマーイベント
struct npc_timerevent_list *te = nd->u.scr.timer_event;
- int j, k = nd->u.scr.timeramount;
+ int j, k = nd->u.scr.timeramount;
if (te == NULL)
- te = (struct npc_timerevent_list *) calloc (1,
- sizeof (struct
+ te = (struct npc_timerevent_list *) calloc(1,
+ sizeof(struct
npc_timerevent_list));
else
- te = (struct npc_timerevent_list *) realloc (te,
- sizeof (struct
+ te = (struct npc_timerevent_list *) realloc(te,
+ sizeof(struct
npc_timerevent_list)
* (k + 1));
for (j = 0; j < k; j++)
{
if (te[j].timer > t)
{
- memmove (te + j + 1, te + j,
- sizeof (struct npc_timerevent_list) * (k - j));
+ memmove(te + j + 1, te + j,
+ sizeof(struct npc_timerevent_list) * (k - j));
break;
}
}
@@ -1790,7 +1475,7 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
}
}
nd->u.scr.nexttimer = -1;
- nd->u.scr.timerid = -1;
+ // nd->u.scr.timerid = nullptr;
return 0;
}
@@ -1799,73 +1484,66 @@ int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
* function行解析
*------------------------------------------
*/
-static int npc_parse_function (char *w1, char *w2, char *w3, char *w4,
+static
+int npc_parse_function(char *, char *, char *w3, char *,
char *first_line, FILE * fp, int *lines)
{
char *srcbuf = NULL;
const ScriptCode *script;
- int srcsize = 65536;
- int startline = 0;
+ int srcsize = 65536;
+ int startline = 0;
char line[1024];
- int i;
-// struct dbt *label_db;
- char *p;
+ int i;
// スクリプトの解析
- srcbuf = (char *) calloc (srcsize, sizeof (char));
- if (strchr (first_line, '{'))
+ srcbuf = (char *) calloc(srcsize, sizeof(char));
+ if (strchr(first_line, '{'))
{
- strcpy (srcbuf, strchr (first_line, '{'));
+ strcpy(srcbuf, strchr(first_line, '{'));
startline = *lines;
}
else
srcbuf[0] = 0;
while (1)
{
- for (i = strlen (srcbuf) - 1; i >= 0 && isspace (srcbuf[i]); i--);
+ for (i = strlen(srcbuf) - 1; i >= 0 && isspace(srcbuf[i]); i--);
if (i >= 0 && srcbuf[i] == '}')
break;
- if (!fgets (line, 1020, fp))
+ if (!fgets(line, 1020, fp))
break;
(*lines)++;
- if (feof (fp))
+ if (feof(fp))
break;
- if (strlen (srcbuf) + strlen (line) + 1 >= srcsize)
+ if (strlen(srcbuf) + strlen(line) + 1 >= srcsize)
{
srcsize += 65536;
- srcbuf = (char *) realloc (srcbuf, srcsize);
- memset (srcbuf + srcsize - 65536, '\0', 65536);
+ srcbuf = (char *) realloc(srcbuf, srcsize);
+ memset(srcbuf + srcsize - 65536, '\0', 65536);
}
if (srcbuf[0] != '{')
{
- if (strchr (line, '{'))
+ if (strchr(line, '{'))
{
- strcpy (srcbuf, strchr (line, '{'));
+ strcpy(srcbuf, strchr(line, '{'));
startline = *lines;
}
}
else
- strcat (srcbuf, line);
+ strcat(srcbuf, line);
}
- script = parse_script (srcbuf, startline);
+ script = parse_script(srcbuf, startline);
if (script == NULL)
{
// script parse error?
- free (srcbuf);
+ free(srcbuf);
return 1;
}
- p = (char *) calloc (50, sizeof (char));
-
- strncpy (p, w3, 49);
- strdb_insert (script_get_userfunc_db (), p, script);
-
-// label_db=script_get_label_db();
+ std::string p = w3;
+ userfunc_db.put(p, script);
// もう使わないのでバッファ解放
- free (srcbuf);
-
-// printf("function %s => %p\n",p,script);
+ free(srcbuf);
return 0;
}
@@ -1874,26 +1552,29 @@ static int npc_parse_function (char *w1, char *w2, char *w3, char *w4,
* mob行解析
*------------------------------------------
*/
-int npc_parse_mob (const char *w1, const char *w2, const char *w3, const char *w4)
+static
+int npc_parse_mob(const char *w1, const char *, const char *w3, const char *w4)
{
- int m, x, y, xs, ys, mob_class, num, delay1, delay2;
- int i;
+ int m, x, y, xs, ys, mob_class, num;
+ int i;
char mapname[24];
char eventname[24] = "";
struct mob_data *md;
xs = ys = 0;
- delay1 = delay2 = 0;
+ int delay1_ = 0, delay2_ = 0;
// 引数の個数チェック
- if (sscanf (w1, "%[^,],%d,%d,%d,%d", mapname, &x, &y, &xs, &ys) < 3 ||
- sscanf (w4, "%d,%d,%d,%d,%s", &mob_class, &num, &delay1, &delay2,
+ if (sscanf(w1, "%[^,],%d,%d,%d,%d", mapname, &x, &y, &xs, &ys) < 3 ||
+ sscanf(w4, "%d,%d,%d,%d,%s", &mob_class, &num, &delay1_, &delay2_,
eventname) < 2)
{
- printf ("bad monster line : %s\n", w3);
+ PRINTF("bad monster line : %s\n", w3);
return 1;
}
+ interval_t delay1 = std::chrono::milliseconds(delay1_);
+ interval_t delay2 = std::chrono::milliseconds(delay2_);
- m = map_mapname2mapid (mapname);
+ m = map_mapname2mapid(mapname);
if (num > 1 && battle_config.mob_count_rate != 100)
{
@@ -1903,23 +1584,23 @@ int npc_parse_mob (const char *w1, const char *w2, const char *w3, const char *w
for (i = 0; i < num; i++)
{
- md = (struct mob_data *) calloc (1, sizeof (struct mob_data));
+ md = (struct mob_data *) calloc(1, sizeof(struct mob_data));
md->bl.prev = NULL;
md->bl.next = NULL;
md->bl.m = m;
md->bl.x = x;
md->bl.y = y;
- if (strcmp (w3, "--en--") == 0)
- memcpy (md->name, mob_db[mob_class].name, 24);
- else if (strcmp (w3, "--ja--") == 0)
- memcpy (md->name, mob_db[mob_class].jname, 24);
+ if (strcmp(w3, "--en--") == 0)
+ memcpy(md->name, mob_db[mob_class].name, 24);
+ else if (strcmp(w3, "--ja--") == 0)
+ memcpy(md->name, mob_db[mob_class].jname, 24);
else
- memcpy (md->name, w3, 24);
+ memcpy(md->name, w3, 24);
md->n = i;
- md->base_class = md->mob_class = mob_class;
- md->bl.id = npc_get_new_npc_id ();
+ md->mob_class = mob_class;
+ md->bl.id = npc_get_new_npc_id();
md->m = m;
md->x0 = x;
md->y0 = y;
@@ -1928,31 +1609,31 @@ int npc_parse_mob (const char *w1, const char *w2, const char *w3, const char *w
md->spawndelay1 = delay1;
md->spawndelay2 = delay2;
- memset (&md->state, 0, sizeof (md->state));
- md->timer = -1;
+ memset(&md->state, 0, sizeof(md->state));
+ // md->timer = nullptr;
md->target_id = 0;
md->attacked_id = 0;
- if (mob_db[mob_class].mode & 0x02)
+ if (bool(mob_db[mob_class].mode & MobMode::LOOTER))
md->lootitem =
- (struct item *) calloc (LOOTITEM_SIZE, sizeof (struct item));
+ (struct item *) calloc(LOOTITEM_SIZE, sizeof(struct item));
else
md->lootitem = NULL;
- if (strlen (eventname) >= 4)
+ if (strlen(eventname) >= 4)
{
- memcpy (md->npc_event, eventname, 24);
+ memcpy(md->npc_event, eventname, 24);
}
else
- memset (md->npc_event, 0, 24);
+ memset(md->npc_event, 0, 24);
- md->bl.type = BL_MOB;
- map_addiddb (&md->bl);
- mob_spawn (md->bl.id);
+ md->bl.type = BL::MOB;
+ map_addiddb(&md->bl);
+ mob_spawn(md->bl.id);
npc_mob++;
}
- //printf("warp npc %s %d read done\n",mapname,nd->bl.id);
+ //PRINTF("warp npc %s %d read done\n",mapname,nd->bl.id);
return 0;
}
@@ -1961,175 +1642,125 @@ int npc_parse_mob (const char *w1, const char *w2, const char *w3, const char *w
* マップフラグ行の解析
*------------------------------------------
*/
-static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
+static
+int npc_parse_mapflag(char *w1, char *, char *w3, char *w4)
{
- int m;
+ int m;
char mapname[24], savemap[16];
- int savex, savey;
- char drop_arg1[16], drop_arg2[16];
- int drop_id = 0, drop_type = 0, drop_per = 0;
+ int savex, savey;
// 引数の個数チェック
// if ( sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 )
- if (sscanf (w1, "%[^,]", mapname) != 1)
+ if (sscanf(w1, "%[^,]", mapname) != 1)
return 1;
- m = map_mapname2mapid (mapname);
+ m = map_mapname2mapid(mapname);
if (m < 0)
return 1;
//マップフラグ
- if (strcasecmp (w3, "nosave") == 0)
+ if (strcasecmp(w3, "nosave") == 0)
{
- if (strcmp (w4, "SavePoint") == 0)
+ if (strcmp(w4, "SavePoint") == 0)
{
- memcpy (map[m].save.map, "SavePoint", 16);
+ memcpy(map[m].save.map, "SavePoint", 16);
map[m].save.x = -1;
map[m].save.y = -1;
}
- else if (sscanf (w4, "%[^,],%d,%d", savemap, &savex, &savey) == 3)
+ else if (sscanf(w4, "%[^,],%d,%d", savemap, &savex, &savey) == 3)
{
- memcpy (map[m].save.map, savemap, 16);
+ memcpy(map[m].save.map, savemap, 16);
map[m].save.x = savex;
map[m].save.y = savey;
}
map[m].flag.nosave = 1;
}
- else if (strcasecmp (w3, "nomemo") == 0)
+ else if (strcasecmp(w3, "nomemo") == 0)
{
map[m].flag.nomemo = 1;
}
- else if (strcasecmp (w3, "noteleport") == 0)
+ else if (strcasecmp(w3, "noteleport") == 0)
{
map[m].flag.noteleport = 1;
}
- else if (strcasecmp (w3, "nowarp") == 0)
+ else if (strcasecmp(w3, "nowarp") == 0)
{
map[m].flag.nowarp = 1;
}
- else if (strcasecmp (w3, "nowarpto") == 0)
+ else if (strcasecmp(w3, "nowarpto") == 0)
{
map[m].flag.nowarpto = 1;
}
- else if (strcasecmp (w3, "noreturn") == 0)
+ else if (strcasecmp(w3, "noreturn") == 0)
{
map[m].flag.noreturn = 1;
}
- else if (strcasecmp (w3, "monster_noteleport") == 0)
+ else if (strcasecmp(w3, "monster_noteleport") == 0)
{
map[m].flag.monster_noteleport = 1;
}
- else if (strcasecmp (w3, "nobranch") == 0)
+ else if (strcasecmp(w3, "nobranch") == 0)
{
map[m].flag.nobranch = 1;
}
- else if (strcasecmp (w3, "nopenalty") == 0)
+ else if (strcasecmp(w3, "nopenalty") == 0)
{
map[m].flag.nopenalty = 1;
}
- else if (strcasecmp (w3, "pvp") == 0)
+ else if (strcasecmp(w3, "pvp") == 0)
{
map[m].flag.pvp = 1;
}
- else if (strcasecmp (w3, "pvp_noparty") == 0)
+ else if (strcasecmp(w3, "pvp_noparty") == 0)
{
map[m].flag.pvp_noparty = 1;
}
- else if (strcasecmp (w3, "pvp_noguild") == 0)
- {
- map[m].flag.pvp_noguild = 1;
- }
- else if (strcasecmp (w3, "pvp_nightmaredrop") == 0)
- {
- if (sscanf (w4, "%[^,],%[^,],%d", drop_arg1, drop_arg2, &drop_per) ==
- 3)
- {
- int i;
- if (strcmp (drop_arg1, "random") == 0)
- drop_id = -1;
- else if (itemdb_exists ((drop_id = atoi (drop_arg1))) == NULL)
- drop_id = 0;
- if (strcmp (drop_arg2, "inventory") == 0)
- drop_type = 1;
- else if (strcmp (drop_arg2, "equip") == 0)
- drop_type = 2;
- else if (strcmp (drop_arg2, "all") == 0)
- drop_type = 3;
-
- if (drop_id != 0)
- {
- for (i = 0; i < MAX_DROP_PER_MAP; i++)
- {
- if (map[m].drop_list[i].drop_id == 0)
- {
- map[m].drop_list[i].drop_id = drop_id;
- map[m].drop_list[i].drop_type = drop_type;
- map[m].drop_list[i].drop_per = drop_per;
- break;
- }
- }
- map[m].flag.pvp_nightmaredrop = 1;
- }
- }
- }
- else if (strcasecmp (w3, "pvp_nocalcrank") == 0)
+ else if (strcasecmp(w3, "pvp_nocalcrank") == 0)
{
map[m].flag.pvp_nocalcrank = 1;
}
- else if (strcasecmp (w3, "gvg") == 0)
- {
- map[m].flag.gvg = 1;
- }
- else if (strcasecmp (w3, "gvg_noparty") == 0)
- {
- map[m].flag.gvg_noparty = 1;
- }
- else if (strcasecmp (w3, "nozenypenalty") == 0)
+ else if (strcasecmp(w3, "nozenypenalty") == 0)
{
map[m].flag.nozenypenalty = 1;
}
- else if (strcasecmp (w3, "notrade") == 0)
+ else if (strcasecmp(w3, "notrade") == 0)
{
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)
+ else if (battle_config.pk_mode && strcasecmp(w3, "nopvp") == 0)
{ // nopvp for pk mode [Valaris]
map[m].flag.nopvp = 1;
map[m].flag.pvp = 0;
}
- else if (strcasecmp (w3, "noicewall") == 0)
+ else if (strcasecmp(w3, "noicewall") == 0)
{ // noicewall [Valaris]
map[m].flag.noicewall = 1;
}
- else if (strcasecmp (w3, "snow") == 0)
+ else if (strcasecmp(w3, "snow") == 0)
{ // snow [Valaris]
map[m].flag.snow = 1;
}
- else if (strcasecmp (w3, "fog") == 0)
+ else if (strcasecmp(w3, "fog") == 0)
{ // fog [Valaris]
map[m].flag.fog = 1;
}
- else if (strcasecmp (w3, "sakura") == 0)
+ else if (strcasecmp(w3, "sakura") == 0)
{ // sakura [Valaris]
map[m].flag.sakura = 1;
}
- else if (strcasecmp (w3, "leaves") == 0)
+ else if (strcasecmp(w3, "leaves") == 0)
{ // leaves [Valaris]
map[m].flag.leaves = 1;
}
- else if (strcasecmp (w3, "rain") == 0)
+ else if (strcasecmp(w3, "rain") == 0)
{ // rain [Valaris]
map[m].flag.rain = 1;
}
- else if (strcasecmp (w3, "no_player_drops") == 0)
+ else if (strcasecmp(w3, "no_player_drops") == 0)
{ // no player drops [Jaxad0127]
map[m].flag.no_player_drops = 1;
}
- else if (strcasecmp (w3, "town") == 0)
+ else if (strcasecmp(w3, "town") == 0)
{ // town/safe zone [remoitnane]
map[m].flag.town = 1;
}
@@ -2137,177 +1768,119 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
return 0;
}
-static void ev_db_final (db_key_t key, db_val_t data, va_list ap)
-{
- free (data);
- if (strstr (key.s, "::") != NULL)
- free ((char*)key.s);
-}
-
-struct npc_data *npc_spawn_text (int m, int x, int y,
+struct npc_data *npc_spawn_text(int m, int x, int y,
int npc_class, const char *name, const char *message)
{
struct npc_data *retval =
- (struct npc_data *) calloc (1, sizeof (struct npc_data));
- retval->bl.id = npc_get_new_npc_id ();
+ (struct npc_data *) calloc(1, sizeof(struct npc_data));
+ retval->bl.id = npc_get_new_npc_id();
retval->bl.x = x;
retval->bl.y = y;
retval->bl.m = m;
- retval->bl.type = BL_NPC;
- retval->bl.subtype = MESSAGE;
+ retval->bl.type = BL::NPC;
+ retval->bl.subtype = NpcSubtype::MESSAGE;
- strncpy (retval->name, name, 23);
- strncpy (retval->exname, name, 23);
+ strncpy(retval->name, name, 23);
+ strncpy(retval->exname, name, 23);
retval->name[15] = 0;
retval->exname[15] = 0;
- retval->u.message = message ? strdup (message) : NULL;
+ retval->u.message = message ? strdup(message) : NULL;
retval->npc_class = npc_class;
- retval->speed = 200;
+ retval->speed = std::chrono::milliseconds(200);
- clif_spawnnpc (retval);
- map_addblock (&retval->bl);
- map_addiddb (&retval->bl);
+ clif_spawnnpc(retval);
+ map_addblock(&retval->bl);
+ map_addiddb(&retval->bl);
if (retval->name && retval->name[0])
- strdb_insert (npcname_db, retval->name, retval);
+ npcname_db.put(retval->name, retval);
return retval;
}
-static void npc_free_internal (struct npc_data *nd)
+static
+void npc_free_internal(struct npc_data *nd)
{
struct chat_data *cd;
- if (nd->chat_id && (cd = (struct chat_data *) map_id2bl (nd->chat_id)))
+ if (nd->chat_id && (cd = (struct chat_data *) map_id2bl(nd->chat_id)))
{
- free (cd);
+ free(cd);
cd = NULL;
}
- if (nd->bl.subtype == SCRIPT)
+ if (nd->bl.subtype == NpcSubtype::SCRIPT)
{
if (nd->u.scr.timer_event)
- free (nd->u.scr.timer_event);
+ free(nd->u.scr.timer_event);
if (nd->u.scr.src_id == 0)
{
if (nd->u.scr.script)
{
- free (const_cast<ScriptCode *>(nd->u.scr.script));
+ free(const_cast<ScriptCode *>(nd->u.scr.script));
nd->u.scr.script = NULL;
}
if (nd->u.scr.label_list)
{
- free (nd->u.scr.label_list);
+ free(nd->u.scr.label_list);
nd->u.scr.label_list = NULL;
}
}
}
- else if (nd->bl.subtype == MESSAGE && nd->u.message)
+ else if (nd->bl.subtype == NpcSubtype::MESSAGE && nd->u.message)
{
- free (nd->u.message);
+ free(nd->u.message);
}
- free (nd);
+ free(nd);
}
static
-void npc_propagate_update (struct npc_data *nd)
-{
- map_foreachinarea (npc_enable_sub,
- nd->bl.m,
- nd->bl.x - nd->u.scr.xs, nd->bl.y - nd->u.scr.ys,
- nd->bl.x + nd->u.scr.xs, nd->bl.y + nd->u.scr.ys,
- BL_PC, nd);
-}
-
-void npc_free (struct npc_data *nd)
+void npc_propagate_update(struct npc_data *nd)
{
- clif_clearchar (&nd->bl, 0);
- npc_propagate_update (nd);
- map_deliddb (&nd->bl);
- map_delblock (&nd->bl);
- npc_free_internal (nd);
+ map_foreachinarea(std::bind(npc_enable_sub, ph::_1, nd),
+ nd->bl.m, nd->bl.x - nd->u.scr.xs, nd->bl.y - nd->u.scr.ys,
+ nd->bl.x + nd->u.scr.xs, nd->bl.y + nd->u.scr.ys, BL::PC);
}
-/*==========================================
- * 終了
- *------------------------------------------
- */
-int do_final_npc (void)
+void npc_free(struct npc_data *nd)
{
- int i;
- struct block_list *bl;
- struct npc_data *nd;
- struct mob_data *md;
-
- if (ev_db)
- strdb_final (ev_db, ev_db_final);
- if (npcname_db)
- strdb_final (npcname_db, NULL);
-
- for (i = START_NPC_NUM; i < npc_id; i++)
- {
- if ((bl = map_id2bl (i)))
- {
- if (bl->type == BL_NPC && (nd = (struct npc_data *) bl))
- npc_free_internal (nd);
- else if (bl->type == BL_MOB && (md = (struct mob_data *) bl))
- {
- if (md->lootitem)
- {
- free (md->lootitem);
- md->lootitem = NULL;
- }
- free (md);
- md = NULL;
- }
- }
- }
-
- return 0;
-}
-
-static
-void ev_release (db_key_t key, db_val_t val)
-{
- free ((char*)key.s);
- free (val);
+ clif_clearchar(&nd->bl, BeingRemoveWhy::GONE);
+ npc_propagate_update(nd);
+ map_deliddb(&nd->bl);
+ map_delblock(&nd->bl);
+ npc_free_internal(nd);
}
/*==========================================
* npc初期化
*------------------------------------------
*/
-int do_init_npc (void)
+int do_init_npc(void)
{
struct npc_src_list *nsl;
FILE *fp;
char line[1024];
- int m, lines;
-
- ev_db = strdb_init (24);
- npcname_db = strdb_init (24);
-
- ev_db->release = ev_release;
+ int m, lines;
- memset (&ev_tm_b, -1, sizeof (ev_tm_b));
+ memset(&ev_tm_b, -1, sizeof(ev_tm_b));
for (nsl = npc_src_first; nsl; nsl = nsl->next)
{
if (nsl->prev)
{
- free (nsl->prev);
+ free(nsl->prev);
nsl->prev = NULL;
}
- fp = fopen_ (nsl->name, "r");
+ fp = fopen_(nsl->name, "r");
if (fp == NULL)
{
- printf ("file not found : %s\n", nsl->name);
- exit (1);
+ PRINTF("file not found : %s\n", nsl->name);
+ exit(1);
}
lines = 0;
- while (fgets (line, 1020, fp))
+ while (fgets(line, 1020, fp))
{
char w1[1024], w2[1024], w3[1024], w4[1024], mapname[1024];
- int i, j, w4pos, count;
+ int i, j, w4pos, count;
lines++;
if (line[0] == '/' && line[1] == '/')
@@ -2319,7 +1892,7 @@ int do_init_npc (void)
{
if (!
((line[i + 1]
- && (isspace (line[i + 1]) || line[i + 1] == ','))
+ && (isspace(line[i + 1]) || line[i + 1] == ','))
|| (j && line[j - 1] == ',')))
line[j++] = ' ';
}
@@ -2333,67 +1906,67 @@ int do_init_npc (void)
}
// 最初はタブ区切りでチェックしてみて、ダメならスペース区切りで確認
if ((count =
- sscanf (line, "%[^\t]\t%[^\t]\t%[^\t\r\n]\t%n%[^\t\r\n]", w1,
+ sscanf(line, "%[^\t]\t%[^\t]\t%[^\t\r\n]\t%n%[^\t\r\n]", w1,
w2, w3, &w4pos, w4)) < 3
&& (count =
- sscanf (line, "%s%s%s%n%s", w1, w2, w3, &w4pos, w4)) < 3)
+ sscanf(line, "%s%s%s%n%s", w1, w2, w3, &w4pos, w4)) < 3)
{
continue;
}
// マップの存在確認
- if (strcmp (w1, "-") != 0 && strcasecmp (w1, "function") != 0)
+ if (strcmp(w1, "-") != 0 && strcasecmp(w1, "function") != 0)
{
- sscanf (w1, "%[^,]", mapname);
- m = map_mapname2mapid (mapname);
- if (strlen (mapname) > 16 || m < 0)
+ sscanf(w1, "%[^,]", mapname);
+ m = map_mapname2mapid(mapname);
+ if (strlen(mapname) > 16 || m < 0)
{
// "mapname" is not assigned to this server
continue;
}
}
- if (strcasecmp (w2, "warp") == 0 && count > 3)
+ if (strcasecmp(w2, "warp") == 0 && count > 3)
{
- npc_parse_warp (w1, w2, w3, w4);
+ npc_parse_warp(w1, w2, w3, w4);
}
- else if (strcasecmp (w2, "shop") == 0 && count > 3)
+ else if (strcasecmp(w2, "shop") == 0 && count > 3)
{
- npc_parse_shop (w1, w2, w3, w4);
+ npc_parse_shop(w1, w2, w3, w4);
}
- else if (strcasecmp (w2, "script") == 0 && count > 3)
+ else if (strcasecmp(w2, "script") == 0 && count > 3)
{
- if (strcasecmp (w1, "function") == 0)
+ if (strcasecmp(w1, "function") == 0)
{
- npc_parse_function (w1, w2, w3, w4, line + w4pos, fp,
+ npc_parse_function(w1, w2, w3, w4, line + w4pos, fp,
&lines);
}
else
{
- npc_parse_script (w1, w2, w3, w4, line + w4pos, fp,
+ npc_parse_script(w1, w2, w3, w4, line + w4pos, fp,
&lines);
}
}
else if ((i =
- 0, sscanf (w2, "duplicate%n", &i), (i > 0
+ 0, sscanf(w2, "duplicate%n", &i), (i > 0
&& w2[i] == '('))
&& count > 3)
{
- npc_parse_script (w1, w2, w3, w4, line + w4pos, fp, &lines);
+ npc_parse_script(w1, w2, w3, w4, line + w4pos, fp, &lines);
}
- else if (strcasecmp (w2, "monster") == 0 && count > 3)
+ else if (strcasecmp(w2, "monster") == 0 && count > 3)
{
- npc_parse_mob (w1, w2, w3, w4);
+ npc_parse_mob(w1, w2, w3, w4);
}
- else if (strcasecmp (w2, "mapflag") == 0 && count >= 3)
+ else if (strcasecmp(w2, "mapflag") == 0 && count >= 3)
{
- npc_parse_mapflag (w1, w2, w3, w4);
+ npc_parse_mapflag(w1, w2, w3, w4);
}
}
- fclose_ (fp);
- printf ("\rLoading NPCs [%d]: %-54s", npc_id - START_NPC_NUM,
+ fclose_(fp);
+ PRINTF("\rLoading NPCs [%d]: %-54s", npc_id - START_NPC_NUM,
nsl->name);
- fflush (stdout);
+ fflush(stdout);
}
- printf ("\rNPCs Loaded: %d [Warps:%d Shops:%d Scripts:%d Mobs:%d]\n",
+ PRINTF("\rNPCs Loaded: %d [Warps:%d Shops:%d Scripts:%d Mobs:%d]\n",
npc_id - START_NPC_NUM, npc_warp, npc_shop, npc_script, npc_mob);
return 0;
diff --git a/src/map/npc.hpp b/src/map/npc.hpp
index 6204316..bedca83 100644
--- a/src/map/npc.hpp
+++ b/src/map/npc.hpp
@@ -1,64 +1,71 @@
-// $Id: npc.h,v 1.5 2004/09/25 11:39:17 MouseJstr Exp $
#ifndef NPC_HPP
#define NPC_HPP
-#define START_NPC_NUM 110000000
+#include <cstddef>
+#include <cstdint>
-#define WARP_CLASS 45
-#define WARP_DEBUG_CLASS 722
-#define INVISIBLE_CLASS 32767
+#include "../common/timer.t.hpp"
-int npc_event_dequeue (struct map_session_data *sd);
-void npc_event_timer (timer_id, tick_t, custom_id_t, custom_data_t);
-int npc_event (struct map_session_data *sd, const char *npcname, int);
-int npc_timer_event (const char *eventname); // Added by RoVeRT
-int npc_command (struct map_session_data *sd, const char *npcname, const char *command);
-int npc_touch_areanpc (struct map_session_data *, int, int, int);
-int npc_click (struct map_session_data *, int);
-int npc_scriptcont (struct map_session_data *, int);
-int npc_checknear (struct map_session_data *, int);
-int npc_buysellsel (struct map_session_data *, int, int);
-int npc_buylist (struct map_session_data *, int, unsigned short *);
-int npc_selllist (struct map_session_data *, int, unsigned short *);
-int npc_parse_mob (const char *w1, const char *w2, const char *w3, const char *w4);
-int npc_parse_warp (const char *w1, const char *w2, const char *w3, const char *w4);
+constexpr int START_NPC_NUM = 110000000;
-int npc_enable (const char *name, int flag);
-struct npc_data *npc_name2id (const char *name);
+constexpr int WARP_CLASS = 45;
+constexpr int WARP_DEBUG_CLASS = 722;
+constexpr int INVISIBLE_CLASS = 32767;
-int npc_get_new_npc_id (void);
+int npc_event_dequeue(struct map_session_data *sd);
+int npc_event(struct map_session_data *sd, const char *npcname, int);
+int npc_timer_event(const char *eventname); // Added by RoVeRT
+int npc_command(struct map_session_data *sd, const char *npcname, const char *command);
+int npc_touch_areanpc(struct map_session_data *, int, int, int);
+int npc_click(struct map_session_data *, int);
+int npc_scriptcont(struct map_session_data *, int);
+int npc_buysellsel(struct map_session_data *, int, int);
+int npc_buylist(struct map_session_data *, int, const uint16_t *);
+int npc_selllist(struct map_session_data *, int, const uint16_t *);
+int npc_parse_warp(const char *w1, const char *w2, const char *w3, const char *w4);
+
+int npc_enable(const char *name, bool flag);
+struct npc_data *npc_name2id(const char *name);
+
+int npc_get_new_npc_id(void);
/**
* Spawns and installs a talk-only NPC
*
* \param message The message to speak. If message is NULL, the NPC will not do anything at all.
*/
-struct npc_data *npc_spawn_text (int m, int x, int y, int class_, const char *name, const char *message); // message is strdup'd within
+struct npc_data *npc_spawn_text(int m, int x, int y, int class_, const char *name, const char *message); // message is strdup'd within
/**
* Uninstalls and frees an NPC
*/
-void npc_free (struct npc_data *npc);
+void npc_free(struct npc_data *npc);
-void npc_addsrcfile (char *);
-void npc_delsrcfile (char *);
-int do_final_npc (void);
-int do_init_npc (void);
-int npc_event_do_oninit (void);
-int npc_do_ontimer (int, struct map_session_data *, int);
+void npc_addsrcfile(const char *);
+void npc_delsrcfile(const char *);
+int do_init_npc(void);
+int npc_event_do_oninit(void);
struct argrec;
-int npc_event_doall_l (const char *name, int rid, int argc,
- struct argrec *argv);
-int npc_event_do_l (const char *name, int rid, int argc,
- struct argrec *argv);
-#define npc_event_doall(name) npc_event_doall_l(name, 0, 0, NULL)
-#define npc_event_do(name) npc_event_do_l(name, 0, 0, NULL)
+int npc_event_doall_l(const char *name, int rid,
+ int argc, struct argrec *argv);
+int npc_event_do_l(const char *name, int rid,
+ int argc, struct argrec *argv);
+inline
+int npc_event_doall(const char *name)
+{
+ return npc_event_doall_l(name, 0, 0, NULL);
+}
+inline
+int npc_event_do(const char *name)
+{
+ return npc_event_do_l(name, 0, 0, NULL);
+}
-int npc_timerevent_start (struct npc_data *nd);
-int npc_timerevent_stop (struct npc_data *nd);
-int npc_gettimerevent_tick (struct npc_data *nd);
-int npc_settimerevent_tick (struct npc_data *nd, int newtimer);
-int npc_delete (struct npc_data *nd);
+int npc_timerevent_start(struct npc_data *nd);
+int npc_timerevent_stop(struct npc_data *nd);
+interval_t npc_gettimerevent_tick(struct npc_data *nd);
+int npc_settimerevent_tick(struct npc_data *nd, interval_t newtimer);
+int npc_delete(struct npc_data *nd);
-#endif
+#endif // NPC_HPP
diff --git a/src/map/party.cpp b/src/map/party.cpp
index 95763b8..f737601 100644
--- a/src/map/party.cpp
+++ b/src/map/party.cpp
@@ -1,151 +1,135 @@
-// $Id: party.c,v 1.2 2004/09/22 02:59:47 Akitasha Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
#include "party.hpp"
+
+#include <cstring>
+
+#include "../common/cxxstdio.hpp"
#include "../common/db.hpp"
-#include "../common/timer.hpp"
-#include "../common/socket.hpp"
#include "../common/nullpo.hpp"
-#include "pc.hpp"
-#include "map.hpp"
+#include "../common/socket.hpp"
+#include "../common/timer.hpp"
+
#include "battle.hpp"
-#include "intif.hpp"
#include "clif.hpp"
-#include "skill.hpp"
+#include "intif.hpp"
+#include "map.hpp"
+#include "pc.hpp"
#include "tmw.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
-
-#define PARTY_SEND_XYHP_INVERVAL 1000 // 座標やHP送信の間隔
+#include "../poison.hpp"
-static struct dbt *party_db;
+// 座標やHP送信の間隔
+constexpr interval_t PARTY_SEND_XYHP_INVERVAL = std::chrono::seconds(1);
-void party_send_xyhp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
-/*==========================================
- * 終了
- *------------------------------------------
- */
-static void party_db_final (db_key_t key, db_val_t data, va_list ap)
-{
- free (data);
-}
+static
+Map<int, struct party> party_db;
-void do_final_party (void)
-{
- if (party_db)
- numdb_final (party_db, party_db_final);
-}
+static
+int party_check_conflict(struct map_session_data *sd);
+static
+void party_send_xyhp_timer(TimerData *tid, tick_t tick);
// 初期化
-void do_init_party (void)
+void do_init_party(void)
{
- party_db = numdb_init ();
- add_timer_interval (gettick () + PARTY_SEND_XYHP_INVERVAL,
- party_send_xyhp_timer, 0, 0,
- PARTY_SEND_XYHP_INVERVAL);
+ Timer(gettick() + PARTY_SEND_XYHP_INVERVAL,
+ party_send_xyhp_timer,
+ PARTY_SEND_XYHP_INVERVAL
+ ).detach();
}
// 検索
-struct party *party_search (int party_id)
+struct party *party_search(int party_id)
{
- return (struct party *)numdb_search (party_db, party_id);
+ return party_db.search(party_id);
}
static
-void party_searchname_sub (db_key_t key, db_val_t data, va_list ap)
+void party_searchname_sub(struct party *p, const char *str, struct party **dst)
{
- struct party *p = (struct party *) data, **dst;
- const char *str;
- str = va_arg (ap, const char *);
- dst = va_arg (ap, struct party **);
- if (strcasecmp (p->name, str) == 0)
+ if (strcasecmp(p->name, str) == 0)
*dst = p;
}
// パーティ名検索
-struct party *party_searchname (const char *str)
+struct party *party_searchname(const char *str)
{
struct party *p = NULL;
- numdb_foreach (party_db, party_searchname_sub, str, &p);
+ for (auto& pair : party_db)
+ party_searchname_sub(&pair.second, str, &p);
return p;
}
/* Process a party creation request. */
-int party_create (struct map_session_data *sd, const char *name)
+int party_create(struct map_session_data *sd, const char *name)
{
char pname[24];
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- strncpy (pname, name, 24);
+ strncpy(pname, name, 24);
pname[23] = '\0';
- tmw_TrimStr (pname);
+ tmw_TrimStr(pname);
/* The party name is empty/invalid. */
if (!*pname)
- clif_party_created (sd, 1);
+ clif_party_created(sd, 1);
/* Make sure the character isn't already in a party. */
if (sd->status.party_id == 0)
- intif_create_party (sd, pname);
+ intif_create_party(sd, pname);
else
- clif_party_created (sd, 2);
+ clif_party_created(sd, 2);
return 0;
}
/* Relay the result of a party creation request. */
-int party_created (int account_id, int fail, int party_id, const char *name)
+int party_created(int account_id, int fail, int party_id, const char *name)
{
struct map_session_data *sd;
- sd = map_id2sd (account_id);
+ sd = map_id2sd(account_id);
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
/* The party name is valid and not already taken. */
if (!fail)
{
- struct party *p;
sd->status.party_id = party_id;
- if ((p = (struct party *)numdb_search (party_db, party_id)) != NULL)
+ struct party *p = party_db.search(party_id);
+ if (p != NULL)
{
- printf ("party_created(): ID already exists!\n");
- exit (1);
+ PRINTF("party_created(): ID already exists!\n");
+ exit(1);
}
- CREATE (p, struct party, 1);
+ p = party_db.init(party_id);
p->party_id = party_id;
- memcpy (p->name, name, 24);
- numdb_insert (party_db, party_id, p);
+ memcpy(p->name, name, 24);
/* The party was created successfully. */
- clif_party_created (sd, 0);
+ clif_party_created(sd, 0);
}
else
- clif_party_created (sd, 1);
+ clif_party_created(sd, 1);
return 0;
}
// 情報要求
-int party_request_info (int party_id)
+int party_request_info(int party_id)
{
- return intif_request_partyinfo (party_id);
+ return intif_request_partyinfo(party_id);
}
// 所属キャラの確認
static
-int party_check_member (struct party *p)
+int party_check_member(struct party *p)
{
- int i;
+ int i;
struct map_session_data *sd;
- nullpo_retr (0, p);
+ nullpo_ret(p);
for (i = 0; i < fd_max; i++)
{
@@ -153,22 +137,25 @@ int party_check_member (struct party *p)
{
if (sd->status.party_id == p->party_id)
{
- int j, f = 1;
+ int j, f = 1;
for (j = 0; j < MAX_PARTY; j++)
{ // パーティにデータがあるか確認
if (p->member[j].account_id == sd->status.account_id)
{
- if (strcmp (p->member[j].name, sd->status.name) == 0)
+ if (strcmp(p->member[j].name, sd->status.name) == 0)
f = 0; // データがある
else
- p->member[j].sd = NULL; // 同垢別キャラだった
+ {
+ // I can prove it was already zeroed
+ // p->member[j].sd = NULL; // 同垢別キャラだった
+ }
}
}
if (f)
{
sd->status.party_id = 0;
if (battle_config.error_log)
- printf ("party: check_member %d[%s] is not member\n",
+ PRINTF("party: check_member %d[%s] is not member\n",
sd->status.account_id, sd->status.name);
}
}
@@ -178,9 +165,9 @@ int party_check_member (struct party *p)
}
// 情報所得失敗(そのIDのキャラを全部未所属にする)
-int party_recv_noinfo (int party_id)
+int party_recv_noinfo(int party_id)
{
- int i;
+ int i;
struct map_session_data *sd;
for (i = 0; i < fd_max; i++)
{
@@ -194,31 +181,32 @@ int party_recv_noinfo (int party_id)
}
// 情報所得
-int party_recv_info (struct party *sp)
+int party_recv_info(const struct party *sp)
{
- struct party *p;
- int i;
+ int i;
- nullpo_retr (0, sp);
+ nullpo_ret(sp);
- if ((p = (struct party *)numdb_search (party_db, sp->party_id)) == NULL)
+ struct party *p = party_db.search(sp->party_id);
+ if (p == NULL)
{
- CREATE (p, struct party, 1);
- numdb_insert (party_db, sp->party_id, p);
+ p = party_db.init(sp->party_id);
// 最初のロードなのでユーザーのチェックを行う
- party_check_member (sp);
+ *p = *sp;
+ party_check_member(p);
}
- memcpy (p, sp, sizeof (struct party));
+ else
+ *p = *sp;
for (i = 0; i < MAX_PARTY; i++)
{ // sdの設定
- struct map_session_data *sd = map_id2sd (p->member[i].account_id);
+ struct map_session_data *sd = map_id2sd(p->member[i].account_id);
p->member[i].sd = (sd != NULL
&& sd->status.party_id == p->party_id) ? sd : NULL;
}
- clif_party_info (p, -1);
+ clif_party_info(p, -1);
for (i = 0; i < MAX_PARTY; i++)
{ // 設定情報の送信
@@ -226,7 +214,7 @@ int party_recv_info (struct party *sp)
struct map_session_data *sd = p->member[i].sd;
if (sd != NULL && sd->party_sended == 0)
{
- clif_party_option (p, sd, 0x100);
+ clif_party_option(p, sd, 0x100);
sd->party_sended = 1;
}
}
@@ -235,14 +223,14 @@ int party_recv_info (struct party *sp)
}
/* Process party invitation from sd to account_id. */
-int party_invite (struct map_session_data *sd, int account_id)
+int party_invite(struct map_session_data *sd, int account_id)
{
- struct map_session_data *tsd = map_id2sd (account_id);
- struct party *p = party_search (sd->status.party_id);
- int i;
- int full = 1; /* Indicates whether or not there's room for one more. */
+ struct map_session_data *tsd = map_id2sd(account_id);
+ struct party *p = party_search(sd->status.party_id);
+ int i;
+ int full = 1; /* Indicates whether or not there's room for one more. */
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (!tsd || !p || !tsd->fd)
return 0;
@@ -250,10 +238,10 @@ int party_invite (struct map_session_data *sd, int account_id)
if (!battle_config.invite_request_check)
{
/* Disallow the invitation under these conditions. */
- if (tsd->guild_invite > 0 || tsd->trade_partner || tsd->npc_id
- || tsd->npc_shopid || pc_checkskill (tsd, NV_PARTY) < 1)
+ if (tsd->trade_partner || tsd->npc_id
+ || tsd->npc_shopid || pc_checkskill(tsd, SkillID::NV_PARTY) < 1)
{
- clif_party_inviteack (sd, tsd->status.name, 1);
+ clif_party_inviteack(sd, tsd->status.name, 1);
return 0;
}
}
@@ -261,7 +249,7 @@ int party_invite (struct map_session_data *sd, int account_id)
/* The target player is already in a party, or has a pending invitation. */
if (tsd->status.party_id > 0 || tsd->party_invite > 0)
{
- clif_party_inviteack (sd, tsd->status.name, 0);
+ clif_party_inviteack(sd, tsd->status.name, 0);
return 0;
}
@@ -275,7 +263,7 @@ int party_invite (struct map_session_data *sd, int account_id)
*/
if (p->member[i].account_id == account_id)
{
- clif_party_inviteack (sd, tsd->status.name, 1);
+ clif_party_inviteack(sd, tsd->status.name, 1);
return 0;
}
@@ -286,7 +274,7 @@ int party_invite (struct map_session_data *sd, int account_id)
/* There isn't enough room for a new member. */
if (full)
{
- clif_party_inviteack (sd, tsd->status.name, 3);
+ clif_party_inviteack(sd, tsd->status.name, 3);
return 0;
}
@@ -294,14 +282,14 @@ int party_invite (struct map_session_data *sd, int account_id)
tsd->party_invite = sd->status.party_id;
tsd->party_invite_account = sd->status.account_id;
- clif_party_invite (sd, tsd);
+ clif_party_invite(sd, tsd);
return 0;
}
/* Process response to party invitation. */
-int party_reply_invite (struct map_session_data *sd, int account_id, int flag)
+int party_reply_invite(struct map_session_data *sd, int account_id, int flag)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
/* There is no pending invitation. */
if (!sd->party_invite || !sd->party_invite_account)
@@ -316,7 +304,7 @@ int party_reply_invite (struct map_session_data *sd, int account_id, int flag)
/* The invitation was accepted. */
if (flag == 1)
- intif_party_addmember (sd->party_invite, sd->status.account_id);
+ intif_party_addmember(sd->party_invite, sd->status.account_id);
/* The invitation was rejected. */
else
{
@@ -326,44 +314,44 @@ int party_reply_invite (struct map_session_data *sd, int account_id, int flag)
sd->party_invite = 0;
sd->party_invite_account = 0;
- if ((tsd = map_id2sd (account_id)))
- clif_party_inviteack (tsd, sd->status.name, 1);
+ if ((tsd = map_id2sd(account_id)))
+ clif_party_inviteack(tsd, sd->status.name, 1);
}
return 0;
}
// パーティが追加された
-int party_member_added (int party_id, int account_id, int flag)
+int party_member_added(int party_id, int account_id, int flag)
{
- struct map_session_data *sd = map_id2sd (account_id), *sd2;
- struct party *p = party_search (party_id);
+ struct map_session_data *sd = map_id2sd(account_id), *sd2;
+ struct party *p = party_search(party_id);
if (sd == NULL)
{
if (flag == 0)
{
if (battle_config.error_log)
- printf ("party: member added error %d is not online\n",
+ PRINTF("party: member added error %d is not online\n",
account_id);
- intif_party_leave (party_id, account_id); // キャラ側に登録できなかったため脱退要求を出す
+ intif_party_leave(party_id, account_id); // キャラ側に登録できなかったため脱退要求を出す
}
return 0;
}
- sd2 = map_id2sd (sd->party_invite_account);
+ sd2 = map_id2sd(sd->party_invite_account);
sd->party_invite = 0;
sd->party_invite_account = 0;
if (p == NULL)
{
- printf ("party_member_added: party %d not found.\n", party_id);
- intif_party_leave (party_id, account_id);
+ PRINTF("party_member_added: party %d not found.\n", party_id);
+ intif_party_leave(party_id, account_id);
return 0;
}
if (flag == 1)
{ // 失敗
if (sd2 != NULL)
- clif_party_inviteack (sd2, sd->status.name, 0);
+ clif_party_inviteack(sd2, sd->status.name, 0);
return 0;
}
@@ -372,26 +360,25 @@ int party_member_added (int party_id, int account_id, int flag)
sd->status.party_id = party_id;
if (sd2 != NULL)
- clif_party_inviteack (sd2, sd->status.name, 2);
+ clif_party_inviteack(sd2, sd->status.name, 2);
// いちおう競合確認
- party_check_conflict (sd);
+ party_check_conflict(sd);
- party_send_xy_clear (p);
+ party_send_xy_clear(p);
return 0;
}
// パーティ除名要求
-int party_removemember (struct map_session_data *sd, int account_id,
- const char *name)
+int party_removemember(struct map_session_data *sd, int account_id, const char *)
{
struct party *p;
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if ((p = party_search (sd->status.party_id)) == NULL)
+ if ((p = party_search(sd->status.party_id)) == NULL)
return 0;
for (i = 0; i < MAX_PARTY; i++)
@@ -405,7 +392,7 @@ int party_removemember (struct map_session_data *sd, int account_id,
{ // 所属しているか調べる
if (p->member[i].account_id == account_id)
{
- intif_party_leave (p->party_id, account_id);
+ intif_party_leave(p->party_id, account_id);
return 0;
}
}
@@ -413,21 +400,21 @@ int party_removemember (struct map_session_data *sd, int account_id,
}
// パーティ脱退要求
-int party_leave (struct map_session_data *sd)
+int party_leave(struct map_session_data *sd)
{
struct party *p;
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if ((p = party_search (sd->status.party_id)) == NULL)
+ if ((p = party_search(sd->status.party_id)) == NULL)
return 0;
for (i = 0; i < MAX_PARTY; i++)
{ // 所属しているか
if (p->member[i].account_id == sd->status.account_id)
{
- intif_party_leave (p->party_id, sd->status.account_id);
+ intif_party_leave(p->party_id, sd->status.account_id);
return 0;
}
}
@@ -435,17 +422,17 @@ int party_leave (struct map_session_data *sd)
}
// パーティメンバが脱退した
-int party_member_leaved (int party_id, int account_id, const char *name)
+int party_member_leaved(int party_id, int account_id, const char *name)
{
- struct map_session_data *sd = map_id2sd (account_id);
- struct party *p = party_search (party_id);
+ struct map_session_data *sd = map_id2sd(account_id);
+ struct party *p = party_search(party_id);
if (p != NULL)
{
- int i;
+ int i;
for (i = 0; i < MAX_PARTY; i++)
if (p->member[i].account_id == account_id)
{
- clif_party_leaved (p, sd, account_id, name, 0x00);
+ clif_party_leaved(p, sd, account_id, name, 0x00);
p->member[i].account_id = 0;
p->member[i].sd = NULL;
}
@@ -459,79 +446,79 @@ int party_member_leaved (int party_id, int account_id, const char *name)
}
// パーティ解散通知
-int party_broken (int party_id)
+int party_broken(int party_id)
{
struct party *p;
- int i;
- if ((p = party_search (party_id)) == NULL)
+ int i;
+ if ((p = party_search(party_id)) == NULL)
return 0;
for (i = 0; i < MAX_PARTY; i++)
{
if (p->member[i].sd != NULL)
{
- clif_party_leaved (p, p->member[i].sd,
+ clif_party_leaved(p, p->member[i].sd,
p->member[i].account_id, p->member[i].name,
0x10);
p->member[i].sd->status.party_id = 0;
p->member[i].sd->party_sended = 0;
}
}
- numdb_erase (party_db, party_id);
+ party_db.erase(party_id);
return 0;
}
// パーティの設定変更要求
-int party_changeoption (struct map_session_data *sd, int exp, int item)
+int party_changeoption(struct map_session_data *sd, int exp, int item)
{
struct party *p;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->status.party_id == 0
- || (p = party_search (sd->status.party_id)) == NULL)
+ || (p = party_search(sd->status.party_id)) == NULL)
return 0;
- intif_party_changeoption (sd->status.party_id, sd->status.account_id, exp,
+ intif_party_changeoption(sd->status.party_id, sd->status.account_id, exp,
item);
return 0;
}
// パーティの設定変更通知
-int party_optionchanged (int party_id, int account_id, int exp, int item,
+int party_optionchanged(int party_id, int account_id, int exp, int item,
int flag)
{
struct party *p;
- struct map_session_data *sd = map_id2sd (account_id);
- if ((p = party_search (party_id)) == NULL)
+ struct map_session_data *sd = map_id2sd(account_id);
+ if ((p = party_search(party_id)) == NULL)
return 0;
if (!(flag & 0x01))
p->exp = exp;
if (!(flag & 0x10))
p->item = item;
- clif_party_option (p, sd, flag);
+ clif_party_option(p, sd, flag);
return 0;
}
// パーティメンバの移動通知
-int party_recv_movemap (int party_id, int account_id, const char *map, int online,
+int party_recv_movemap(int party_id, int account_id, const char *mapname, int online,
int lv)
{
struct party *p;
- int i;
- if ((p = party_search (party_id)) == NULL)
+ int i;
+ if ((p = party_search(party_id)) == NULL)
return 0;
for (i = 0; i < MAX_PARTY; i++)
{
struct party_member *m = &p->member[i];
if (m == NULL)
{
- printf ("party_recv_movemap nullpo?\n");
+ PRINTF("party_recv_movemap nullpo?\n");
return 0;
}
if (m->account_id == account_id)
{
- memcpy (m->map, map, 16);
+ memcpy(m->map, mapname, 16);
m->online = online;
m->lv = lv;
break;
@@ -540,49 +527,49 @@ int party_recv_movemap (int party_id, int account_id, const char *map, int onlin
if (i == MAX_PARTY)
{
if (battle_config.error_log)
- printf ("party: not found member %d on %d[%s]", account_id,
+ PRINTF("party: not found member %d on %d[%s]", account_id,
party_id, p->name);
return 0;
}
for (i = 0; i < MAX_PARTY; i++)
{ // sd再設定
- struct map_session_data *sd = map_id2sd (p->member[i].account_id);
+ struct map_session_data *sd = map_id2sd(p->member[i].account_id);
p->member[i].sd = (sd != NULL
&& sd->status.party_id == p->party_id) ? sd : NULL;
}
- party_send_xy_clear (p); // 座標再通知要請
+ party_send_xy_clear(p); // 座標再通知要請
- clif_party_info (p, -1);
+ clif_party_info(p, -1);
return 0;
}
// パーティメンバの移動
-int party_send_movemap (struct map_session_data *sd)
+int party_send_movemap(struct map_session_data *sd)
{
struct party *p;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->status.party_id == 0)
return 0;
- intif_party_changemap (sd, 1);
+ intif_party_changemap(sd, 1);
if (sd->party_sended != 0) // もうパーティデータは送信済み
return 0;
// 競合確認
- party_check_conflict (sd);
+ party_check_conflict(sd);
// あるならパーティ情報送信
- if ((p = party_search (sd->status.party_id)) != NULL)
+ if ((p = party_search(sd->status.party_id)) != NULL)
{
- party_check_member (p); // 所属を確認する
+ party_check_member(p); // 所属を確認する
if (sd->status.party_id == p->party_id)
{
- clif_party_info (p, sd->fd);
- clif_party_option (p, sd, 0x100);
+ clif_party_info(p, sd->fd);
+ clif_party_option(p, sd, 0x100);
sd->party_sended = 1;
}
}
@@ -591,19 +578,19 @@ int party_send_movemap (struct map_session_data *sd)
}
// パーティメンバのログアウト
-int party_send_logout (struct map_session_data *sd)
+int party_send_logout(struct map_session_data *sd)
{
struct party *p;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->status.party_id > 0)
- intif_party_changemap (sd, 0);
+ intif_party_changemap(sd, 0);
// sdが無効になるのでパーティ情報から削除
- if ((p = party_search (sd->status.party_id)) != NULL)
+ if ((p = party_search(sd->status.party_id)) != NULL)
{
- int i;
+ int i;
for (i = 0; i < MAX_PARTY; i++)
if (p->member[i].sd == sd)
p->member[i].sd = NULL;
@@ -613,43 +600,42 @@ int party_send_logout (struct map_session_data *sd)
}
// パーティメッセージ送信
-int party_send_message (struct map_session_data *sd, const char *mes, int len)
+int party_send_message(struct map_session_data *sd, const char *mes, int len)
{
if (sd->status.party_id == 0)
return 0;
- intif_party_message (sd->status.party_id, sd->status.account_id, mes,
+ intif_party_message(sd->status.party_id, sd->status.account_id, mes,
len);
return 0;
}
// パーティメッセージ受信
-int party_recv_message (int party_id, int account_id, const char *mes, int len)
+int party_recv_message(int party_id, int account_id, const char *mes, int len)
{
struct party *p;
- if ((p = party_search (party_id)) == NULL)
+ if ((p = party_search(party_id)) == NULL)
return 0;
- clif_party_message (p, account_id, mes, len);
+ clif_party_message(p, account_id, mes, len);
return 0;
}
// パーティ競合確認
-int party_check_conflict (struct map_session_data *sd)
+int party_check_conflict(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- intif_party_checkconflict (sd->status.party_id, sd->status.account_id,
+ intif_party_checkconflict(sd->status.party_id, sd->status.account_id,
sd->status.name);
return 0;
}
// 位置やHP通知用
static
-void party_send_xyhp_timer_sub (db_key_t key, db_val_t data, va_list ap)
+void party_send_xyhp_timer_sub(struct party *p)
{
- struct party *p = (struct party *) data;
- int i;
+ int i;
- nullpo_retv (p);
+ nullpo_retv(p);
for (i = 0; i < MAX_PARTY; i++)
{
@@ -659,14 +645,14 @@ void party_send_xyhp_timer_sub (db_key_t key, db_val_t data, va_list ap)
// 座標通知
if (sd->party_x != sd->bl.x || sd->party_y != sd->bl.y)
{
- clif_party_xy (p, sd);
+ clif_party_xy(p, sd);
sd->party_x = sd->bl.x;
sd->party_y = sd->bl.y;
}
// HP通知
if (sd->party_hp != sd->status.hp)
{
- clif_party_hp (p, sd);
+ clif_party_hp(p, sd);
sd->party_hp = sd->status.hp;
}
@@ -675,17 +661,18 @@ void party_send_xyhp_timer_sub (db_key_t key, db_val_t data, va_list ap)
}
// 位置やHP通知
-void party_send_xyhp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void party_send_xyhp_timer(TimerData *, tick_t)
{
- numdb_foreach (party_db, party_send_xyhp_timer_sub, tick);
+ for (auto& pair : party_db)
+ party_send_xyhp_timer_sub(&pair.second);
}
// 位置通知クリア
-int party_send_xy_clear (struct party *p)
+int party_send_xy_clear(struct party *p)
{
- int i;
+ int i;
- nullpo_retr (0, p);
+ nullpo_ret(p);
for (i = 0; i < MAX_PARTY; i++)
{
@@ -701,62 +688,55 @@ int party_send_xy_clear (struct party *p)
}
// HP通知の必要性検査用(map_foreachinmoveareaから呼ばれる)
-int party_send_hp_check (struct block_list *bl, va_list ap)
+void party_send_hp_check(struct block_list *bl, int party_id, int *flag)
{
- int party_id;
- int *flag;
struct map_session_data *sd;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, sd = (struct map_session_data *) bl);
-
- party_id = va_arg (ap, int);
- flag = va_arg (ap, int *);
+ nullpo_retv(bl);
+ sd = (struct map_session_data *) bl;
if (sd->status.party_id == party_id)
{
*flag = 1;
sd->party_hp = -1;
}
- return 0;
}
// 経験値公平分配
-int party_exp_share (struct party *p, int map, int base_exp, int job_exp)
+int party_exp_share(struct party *p, int mapid, int base_exp, int job_exp)
{
struct map_session_data *sd;
- int i, c;
+ int i, c;
- nullpo_retr (0, p);
+ nullpo_ret(p);
for (i = c = 0; i < MAX_PARTY; i++)
- if ((sd = p->member[i].sd) != NULL && sd->bl.m == map)
+ if ((sd = p->member[i].sd) != NULL && sd->bl.m == mapid)
c++;
if (c == 0)
return 0;
for (i = 0; i < MAX_PARTY; i++)
- if ((sd = p->member[i].sd) != NULL && sd->bl.m == map)
- pc_gainexp (sd, base_exp / c + 1, job_exp / c + 1);
+ if ((sd = p->member[i].sd) != NULL && sd->bl.m == mapid)
+ pc_gainexp_reason(sd, base_exp / c + 1, job_exp / c + 1,
+ PC_GAINEXP_REASON::SHARING);
return 0;
}
// 同じマップのパーティメンバー全体に処理をかける
// type==0 同じマップ
// !=0 画面内
-void party_foreachsamemap (int (*func) (struct block_list *, va_list),
- struct map_session_data *sd, int type, ...)
+void party_foreachsamemap(std::function<void(struct block_list *)> func,
+ struct map_session_data *sd, int type)
{
struct party *p;
- va_list ap;
- int i;
- int x0, y0, x1, y1;
+ int i;
+ int x0, y0, x1, y1;
struct block_list *list[MAX_PARTY];
- int blockcount = 0;
+ int blockcount = 0;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if ((p = party_search (sd->status.party_id)) == NULL)
+ if ((p = party_search(sd->status.party_id)) == NULL)
return;
x0 = sd->bl.x - AREA_SIZE;
@@ -764,8 +744,6 @@ void party_foreachsamemap (int (*func) (struct block_list *, va_list),
x1 = sd->bl.x + AREA_SIZE;
y1 = sd->bl.y + AREA_SIZE;
- va_start (ap, type);
-
for (i = 0; i < MAX_PARTY; i++)
{
struct party_member *m = &p->member[i];
@@ -781,13 +759,11 @@ void party_foreachsamemap (int (*func) (struct block_list *, va_list),
}
}
- map_freeblock_lock (); // メモリからの解放を禁止する
+ map_freeblock_lock(); // メモリからの解放を禁止する
for (i = 0; i < blockcount; i++)
if (list[i]->prev) // 有効かどうかチェック
- func (list[i], ap);
-
- map_freeblock_unlock (); // 解放を許可する
+ func(list[i]);
- va_end (ap);
+ map_freeblock_unlock(); // 解放を許可する
}
diff --git a/src/map/party.hpp b/src/map/party.hpp
index b4d462e..77e3aaf 100644
--- a/src/map/party.hpp
+++ b/src/map/party.hpp
@@ -1,52 +1,48 @@
-// $Id: party.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
#ifndef PARTY_HPP
#define PARTY_HPP
-#include <stdarg.h>
+#include <functional>
struct party;
struct map_session_data;
struct block_list;
-void do_init_party (void);
-void do_final_party (void);
-struct party *party_search (int party_id);
-struct party *party_searchname (const char *str);
-
-int party_create (struct map_session_data *sd, const char *name);
-int party_created (int account_id, int fail, int party_id, const char *name);
-int party_request_info (int party_id);
-int party_invite (struct map_session_data *sd, int account_id);
-int party_member_added (int party_id, int account_id, int flag);
-int party_leave (struct map_session_data *sd);
-int party_removemember (struct map_session_data *sd, int account_id,
- const char *name);
-int party_member_leaved (int party_id, int account_id, const char *name);
-int party_reply_invite (struct map_session_data *sd, int account_id,
- int flag);
-int party_recv_noinfo (int party_id);
-int party_recv_info (struct party *sp);
-int party_recv_movemap (int party_id, int account_id, const char *map, int online,
- int lv);
-int party_broken (int party_id);
-int party_optionchanged (int party_id, int account_id, int exp, int item,
- int flag);
-int party_changeoption (struct map_session_data *sd, int exp, int item);
-
-int party_send_movemap (struct map_session_data *sd);
-int party_send_logout (struct map_session_data *sd);
-
-int party_send_message (struct map_session_data *sd, const char *mes, int len);
-int party_recv_message (int party_id, int account_id, const char *mes, int len);
-
-int party_check_conflict (struct map_session_data *sd);
-
-int party_send_xy_clear (struct party *p);
-int party_send_hp_check (struct block_list *bl, va_list ap);
-
-int party_exp_share (struct party *p, int map, int base_exp, int job_exp);
-
-void party_foreachsamemap (int (*func) (struct block_list *, va_list),
- struct map_session_data *sd, int type, ...);
-
-#endif
+void do_init_party(void);
+struct party *party_search(int party_id);
+struct party *party_searchname(const char *str);
+
+int party_create(struct map_session_data *sd, const char *name);
+int party_created(int account_id, int fail, int party_id, const char *name);
+int party_request_info(int party_id);
+int party_invite(struct map_session_data *sd, int account_id);
+int party_member_added(int party_id, int account_id, int flag);
+int party_leave(struct map_session_data *sd);
+int party_removemember(struct map_session_data *sd, int account_id,
+ const char *name);
+int party_member_leaved(int party_id, int account_id, const char *name);
+int party_reply_invite(struct map_session_data *sd, int account_id,
+ int flag);
+int party_recv_noinfo(int party_id);
+int party_recv_info(const struct party *sp);
+int party_recv_movemap(int party_id, int account_id, const char *map,
+ int online, int lv);
+int party_broken(int party_id);
+int party_optionchanged(int party_id, int account_id, int exp, int item,
+ int flag);
+int party_changeoption(struct map_session_data *sd, int exp, int item);
+
+int party_send_movemap(struct map_session_data *sd);
+int party_send_logout(struct map_session_data *sd);
+
+int party_send_message(struct map_session_data *sd, const char *mes, int len);
+int party_recv_message(int party_id, int account_id, const char *mes, int len);
+
+int party_send_xy_clear(struct party *p);
+void party_send_hp_check(struct block_list *bl, int party_id, int *flag);
+
+int party_exp_share(struct party *p, int map, int base_exp, int job_exp);
+
+void party_foreachsamemap(std::function<void(struct block_list *)> func,
+ struct map_session_data *sd, int type);
+
+#endif // PARTY_HPP
diff --git a/src/map/path.cpp b/src/map/path.cpp
index b68dae6..7a8eb37 100644
--- a/src/map/path.cpp
+++ b/src/map/path.cpp
@@ -1,37 +1,40 @@
-// $Id: path.c,v 1.1.1.1 2004/09/10 17:27:00 MagicalTux Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include "../common/cxxstdio.hpp"
+#include "../common/random.hpp"
+#include "../common/nullpo.hpp"
-#include "map.hpp"
#include "battle.hpp"
-#include "../common/nullpo.hpp"
+#include "map.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
+#include "../poison.hpp"
//#define PATH_STANDALONETEST
-#define MAX_HEAP 150
+constexpr int MAX_HEAP = 150;
struct tmp_path
{
short x, y, dist, before, cost;
- char dir, flag;
+ DIR dir;
+ char flag;
};
-#define calc_index(x,y) (((x)+(y)*MAX_WALKPATH) & (MAX_WALKPATH*MAX_WALKPATH-1))
+
+static
+int calc_index(int x, int y)
+{
+ return (x + y * MAX_WALKPATH) & (MAX_WALKPATH * MAX_WALKPATH - 1);
+}
/*==========================================
* 経路探索補助heap push
*------------------------------------------
*/
-static void push_heap_path (int *heap, struct tmp_path *tp, int index)
+static
+void push_heap_path(int *heap, struct tmp_path *tp, int index)
{
- int i, h;
+ int i, h;
if (heap == NULL || tp == NULL)
{
- printf ("push_heap_path nullpo\n");
+ PRINTF("push_heap_path nullpo\n");
return;
}
@@ -48,20 +51,21 @@ static void push_heap_path (int *heap, struct tmp_path *tp, int index)
* costが減ったので根の方へ移動
*------------------------------------------
*/
-static void update_heap_path (int *heap, struct tmp_path *tp, int index)
+static
+void update_heap_path(int *heap, struct tmp_path *tp, int index)
{
- int i, h;
+ int i, h;
- nullpo_retv (heap);
- nullpo_retv (tp);
+ nullpo_retv(heap);
+ nullpo_retv(tp);
for (h = 0; h < heap[0]; h++)
if (heap[h + 1] == index)
break;
if (h == heap[0])
{
- fprintf (stderr, "update_heap_path bug\n");
- exit (1);
+ FPRINTF(stderr, "update_heap_path bug\n");
+ exit(1);
}
for (i = (h - 1) / 2;
h > 0 && tp[index].cost < tp[heap[i + 1]].cost; i = (h - 1) / 2)
@@ -73,13 +77,14 @@ static void update_heap_path (int *heap, struct tmp_path *tp, int index)
* 経路探索補助heap pop
*------------------------------------------
*/
-static int pop_heap_path (int *heap, struct tmp_path *tp)
+static
+int pop_heap_path(int *heap, struct tmp_path *tp)
{
- int i, h, k;
- int ret, last;
+ int i, h, k;
+ int ret, last;
- nullpo_retr (-1, heap);
- nullpo_retr (-1, tp);
+ nullpo_retr(-1, heap);
+ nullpo_retr(-1, tp);
if (heap[0] <= 0)
return -1;
@@ -108,11 +113,12 @@ static int pop_heap_path (int *heap, struct tmp_path *tp)
* 現在の点のcost計算
*------------------------------------------
*/
-static int calc_cost (struct tmp_path *p, int x1, int y1)
+static
+int calc_cost(struct tmp_path *p, int x1, int y1)
{
- int xd, yd;
+ int xd, yd;
- nullpo_retr (0, p);
+ nullpo_ret(p);
xd = x1 - p->x;
if (xd < 0)
@@ -127,15 +133,16 @@ static int calc_cost (struct tmp_path *p, int x1, int y1)
* 必要ならpathを追加/修正する
*------------------------------------------
*/
-static int add_path (int *heap, struct tmp_path *tp, int x, int y, int dist,
- int dir, int before, int x1, int y1)
+static
+int add_path(int *heap, struct tmp_path *tp, int x, int y, int dist,
+ DIR dir, int before, int x1, int y1)
{
- int i;
+ int i;
- nullpo_retr (0, heap);
- nullpo_retr (0, tp);
+ nullpo_ret(heap);
+ nullpo_ret(tp);
- i = calc_index (x, y);
+ i = calc_index(x, y);
if (tp[i].x == x && tp[i].y == y)
{
@@ -144,11 +151,11 @@ static int add_path (int *heap, struct tmp_path *tp, int x, int y, int dist,
tp[i].dist = dist;
tp[i].dir = dir;
tp[i].before = before;
- tp[i].cost = calc_cost (&tp[i], x1, y1);
+ tp[i].cost = calc_cost(&tp[i], x1, y1);
if (tp[i].flag)
- push_heap_path (heap, tp, i);
+ push_heap_path(heap, tp, i);
else
- update_heap_path (heap, tp, i);
+ update_heap_path(heap, tp, i);
tp[i].flag = 0;
}
return 0;
@@ -162,9 +169,9 @@ static int add_path (int *heap, struct tmp_path *tp, int x, int y, int dist,
tp[i].dist = dist;
tp[i].dir = dir;
tp[i].before = before;
- tp[i].cost = calc_cost (&tp[i], x1, y1);
+ tp[i].cost = calc_cost(&tp[i], x1, y1);
tp[i].flag = 0;
- push_heap_path (heap, tp, i);
+ push_heap_path(heap, tp, i);
return 0;
}
@@ -174,116 +181,57 @@ static int add_path (int *heap, struct tmp_path *tp, int x, int y, int dist,
* flag 0x10000 遠距離攻撃判定
*------------------------------------------
*/
-static int can_place (struct map_data *m, int x, int y, int flag)
+static
+bool can_place(struct map_data *m, int x, int y)
{
- int c;
-
- nullpo_retr (0, m);
-
- c = read_gatp (m, x, y);
+ nullpo_ret(m);
- if (c == 1)
- return 0;
- if (!(flag & 0x10000) && c == 5)
- return 0;
- return 1;
+ return !bool(read_gatp(m, x, y) & MapCell::UNWALKABLE);
}
/*==========================================
* (x0,y0)から(x1,y1)へ1歩で移動可能か計算
*------------------------------------------
*/
-static int can_move (struct map_data *m, int x0, int y0, int x1, int y1,
- int flag)
+static
+int can_move(struct map_data *m, int x0, int y0, int x1, int y1)
{
- nullpo_retr (0, m);
+ nullpo_ret(m);
if (x0 - x1 < -1 || x0 - x1 > 1 || y0 - y1 < -1 || y0 - y1 > 1)
return 0;
if (x1 < 0 || y1 < 0 || x1 >= m->xs || y1 >= m->ys)
return 0;
- if (!can_place (m, x0, y0, flag))
+ if (!can_place(m, x0, y0))
return 0;
- if (!can_place (m, x1, y1, flag))
+ if (!can_place(m, x1, y1))
return 0;
if (x0 == x1 || y0 == y1)
return 1;
- if (!can_place (m, x0, y1, flag) || !can_place (m, x1, y0, flag))
+ if (!can_place(m, x0, y1) || !can_place(m, x1, y0))
return 0;
return 1;
}
/*==========================================
- * (x0,y0)から(dx,dy)方向へcountセル分
- * 吹き飛ばしたあとの座標を所得
- *------------------------------------------
- */
-int path_blownpos (int m, int x0, int y0, int dx, int dy, int count)
-{
- struct map_data *md;
-
- if (!map[m].gat)
- return -1;
- md = &map[m];
-
- if (count > 15)
- { // 最大10マスに制限
- if (battle_config.error_log)
- printf ("path_blownpos: count too many %d !\n", count);
- count = 15;
- }
- if (dx > 1 || dx < -1 || dy > 1 || dy < -1)
- {
- if (battle_config.error_log)
- printf ("path_blownpos: illeagal dx=%d or dy=%d !\n", dx, dy);
- dx = (dx >= 0) ? 1 : ((dx < 0) ? -1 : 0);
- dy = (dy >= 0) ? 1 : ((dy < 0) ? -1 : 0);
- }
-
- while ((count--) > 0 && (dx != 0 || dy != 0))
- {
- if (!can_move (md, x0, y0, x0 + dx, y0 + dy, 0))
- {
- int fx = (dx != 0 && can_move (md, x0, y0, x0 + dx, y0, 0));
- int fy = (dy != 0 && can_move (md, x0, y0, x0, y0 + dy, 0));
- if (fx && fy)
- {
- if (rand () & 1)
- dx = 0;
- else
- dy = 0;
- }
- if (!fx)
- dx = 0;
- if (!fy)
- dy = 0;
- }
- x0 += dx;
- y0 += dy;
- }
- return (x0 << 16) | y0;
-}
-
-/*==========================================
* path探索 (x0,y0)->(x1,y1)
*------------------------------------------
*/
-int path_search (struct walkpath_data *wpd, int m, int x0, int y0, int x1,
- int y1, int flag)
+int path_search(struct walkpath_data *wpd, int m, int x0, int y0, int x1, int y1, int flag)
{
- int heap[MAX_HEAP + 1];
+ int heap[MAX_HEAP + 1];
struct tmp_path tp[MAX_WALKPATH * MAX_WALKPATH];
- int i, rp, x, y;
+ int i, rp, x, y;
struct map_data *md;
- int dx, dy;
+ int dx, dy;
- nullpo_retr (0, wpd);
+ nullpo_ret(wpd);
if (!map[m].gat)
return -1;
md = &map[m];
if (x1 < 0 || x1 >= md->xs || y1 < 0 || y1 >= md->ys
- || (i = read_gatp (md, x1, y1)) == 1 || i == 5)
+ || bool(read_gatp(md, x1, y1) & MapCell::UNWALKABLE))
return -1;
// easy
@@ -291,30 +239,31 @@ int path_search (struct walkpath_data *wpd, int m, int x0, int y0, int x1,
dy = (y1 - y0 < 0) ? -1 : 1;
for (x = x0, y = y0, i = 0; x != x1 || y != y1;)
{
- if (i >= sizeof (wpd->path))
+ if (i >= sizeof(wpd->path))
return -1;
if (x != x1 && y != y1)
{
- if (!can_move (md, x, y, x + dx, y + dy, flag))
+ if (!can_move(md, x, y, x + dx, y + dy))
break;
x += dx;
y += dy;
- wpd->path[i++] =
- (dx < 0) ? ((dy > 0) ? 1 : 3) : ((dy < 0) ? 5 : 7);
+ wpd->path[i++] = (dx < 0)
+ ? ((dy > 0) ? DIR::SW : DIR::NW)
+ : ((dy < 0) ? DIR::NE : DIR::SE);
}
else if (x != x1)
{
- if (!can_move (md, x, y, x + dx, y, flag))
+ if (!can_move(md, x, y, x + dx, y))
break;
x += dx;
- wpd->path[i++] = (dx < 0) ? 2 : 6;
+ wpd->path[i++] = (dx < 0) ? DIR::W : DIR::E;
}
else
{ // y!=y1
- if (!can_move (md, x, y, x, y + dy, flag))
+ if (!can_move(md, x, y, x, y + dy))
break;
y += dy;
- wpd->path[i++] = (dy > 0) ? 0 : 4;
+ wpd->path[i++] = (dy > 0) ? DIR::S : DIR::N;
}
if (x == x1 && y == y1)
{
@@ -327,34 +276,34 @@ int path_search (struct walkpath_data *wpd, int m, int x0, int y0, int x1,
if (flag & 1)
return -1;
- memset (tp, 0, sizeof (tp));
+ memset(tp, 0, sizeof(tp));
- i = calc_index (x0, y0);
+ i = calc_index(x0, y0);
tp[i].x = x0;
tp[i].y = y0;
tp[i].dist = 0;
- tp[i].dir = 0;
+ tp[i].dir = DIR::S;
tp[i].before = 0;
- tp[i].cost = calc_cost (&tp[i], x1, y1);
+ tp[i].cost = calc_cost(&tp[i], x1, y1);
tp[i].flag = 0;
heap[0] = 0;
- push_heap_path (heap, tp, calc_index (x0, y0));
+ push_heap_path(heap, tp, calc_index(x0, y0));
while (1)
{
- int e = 0, fromdir;
+ int e = 0;
if (heap[0] == 0)
return -1;
- rp = pop_heap_path (heap, tp);
+ rp = pop_heap_path(heap, tp);
x = tp[rp].x;
y = tp[rp].y;
if (x == x1 && y == y1)
{
- int len, j;
+ int len, j;
- for (len = 0, i = rp; len < 100 && i != calc_index (x0, y0);
+ for (len = 0, i = rp; len < 100 && i != calc_index(x0, y0);
i = tp[i].before, len++);
- if (len == 100 || len >= sizeof (wpd->path))
+ if (len == 100 || len >= sizeof(wpd->path))
return -1;
wpd->path_len = len;
wpd->path_pos = 0;
@@ -364,82 +313,24 @@ int path_search (struct walkpath_data *wpd, int m, int x0, int y0, int x1,
return 0;
}
- fromdir = tp[rp].dir;
- if (can_move (md, x, y, x + 1, y - 1, flag))
- e += add_path (heap, tp, x + 1, y - 1, tp[rp].dist + 14, 5, rp,
- x1, y1);
- if (can_move (md, x, y, x + 1, y, flag))
- e += add_path (heap, tp, x + 1, y, tp[rp].dist + 10, 6, rp, x1,
- y1);
- if (can_move (md, x, y, x + 1, y + 1, flag))
- e += add_path (heap, tp, x + 1, y + 1, tp[rp].dist + 14, 7, rp,
- x1, y1);
- if (can_move (md, x, y, x, y + 1, flag))
- e += add_path (heap, tp, x, y + 1, tp[rp].dist + 10, 0, rp, x1,
- y1);
- if (can_move (md, x, y, x - 1, y + 1, flag))
- e += add_path (heap, tp, x - 1, y + 1, tp[rp].dist + 14, 1, rp,
- x1, y1);
- if (can_move (md, x, y, x - 1, y, flag))
- e += add_path (heap, tp, x - 1, y, tp[rp].dist + 10, 2, rp, x1,
- y1);
- if (can_move (md, x, y, x - 1, y - 1, flag))
- e += add_path (heap, tp, x - 1, y - 1, tp[rp].dist + 14, 3, rp,
- x1, y1);
- if (can_move (md, x, y, x, y - 1, flag))
- e += add_path (heap, tp, x, y - 1, tp[rp].dist + 10, 4, rp, x1,
- y1);
+ if (can_move(md, x, y, x + 1, y - 1))
+ e += add_path(heap, tp, x + 1, y - 1, tp[rp].dist + 14, DIR::NE, rp, x1, y1);
+ if (can_move(md, x, y, x + 1, y))
+ e += add_path(heap, tp, x + 1, y, tp[rp].dist + 10, DIR::E, rp, x1, y1);
+ if (can_move(md, x, y, x + 1, y + 1))
+ e += add_path(heap, tp, x + 1, y + 1, tp[rp].dist + 14, DIR::SE, rp, x1, y1);
+ if (can_move(md, x, y, x, y + 1))
+ e += add_path(heap, tp, x, y + 1, tp[rp].dist + 10, DIR::S, rp, x1, y1);
+ if (can_move(md, x, y, x - 1, y + 1))
+ e += add_path(heap, tp, x - 1, y + 1, tp[rp].dist + 14, DIR::SW, rp, x1, y1);
+ if (can_move(md, x, y, x - 1, y))
+ e += add_path(heap, tp, x - 1, y, tp[rp].dist + 10, DIR::W, rp, x1, y1);
+ if (can_move(md, x, y, x - 1, y - 1))
+ e += add_path(heap, tp, x - 1, y - 1, tp[rp].dist + 14, DIR::NW, rp, x1, y1);
+ if (can_move(md, x, y, x, y - 1))
+ e += add_path(heap, tp, x, y - 1, tp[rp].dist + 10, DIR::N, rp, x1, y1);
tp[rp].flag = 1;
if (e || heap[0] >= MAX_HEAP - 5)
return -1;
}
- return -1;
-}
-
-#ifdef PATH_STANDALONETEST
-char gat[64][64] = {
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
-};
-
-struct map_data map[1];
-
-/*==========================================
- * 経路探索ルーチン単体テスト用main関数
- *------------------------------------------
- */
-void main (int argc, char *argv[])
-{
- struct walkpath_data wpd;
-
- map[0].gat = gat;
- map[0].xs = 64;
- map[0].ys = 64;
-
- path_search (&wpd, 0, 3, 4, 5, 4);
- path_search (&wpd, 0, 5, 4, 3, 4);
- path_search (&wpd, 0, 6, 4, 3, 4);
- path_search (&wpd, 0, 7, 4, 3, 4);
- path_search (&wpd, 0, 4, 3, 4, 5);
- path_search (&wpd, 0, 4, 2, 4, 5);
- path_search (&wpd, 0, 4, 1, 4, 5);
- path_search (&wpd, 0, 4, 5, 4, 3);
- path_search (&wpd, 0, 4, 6, 4, 3);
- path_search (&wpd, 0, 4, 7, 4, 3);
- path_search (&wpd, 0, 7, 4, 3, 4);
- path_search (&wpd, 0, 8, 4, 3, 4);
- path_search (&wpd, 0, 9, 4, 3, 4);
- path_search (&wpd, 0, 10, 4, 3, 4);
- path_search (&wpd, 0, 11, 4, 3, 4);
- path_search (&wpd, 0, 12, 4, 3, 4);
- path_search (&wpd, 0, 13, 4, 3, 4);
- path_search (&wpd, 0, 14, 4, 3, 4);
- path_search (&wpd, 0, 15, 4, 3, 4);
- path_search (&wpd, 0, 16, 4, 3, 4);
- path_search (&wpd, 0, 17, 4, 3, 4);
- path_search (&wpd, 0, 18, 4, 3, 4);
}
-#endif
diff --git a/src/map/pc.cpp b/src/map/pc.cpp
index 256244a..a098978 100644
--- a/src/map/pc.cpp
+++ b/src/map/pc.cpp
@@ -1,118 +1,245 @@
-// $Id: pc.c 101 2004-09-25 17:57:22Z Valaris $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <time.h>
-
-#include "../common/socket.hpp" // [Valaris]
-#include "../common/timer.hpp"
-#include "../common/db.hpp"
+#include "pc.hpp"
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
+
+#include "../common/cxxstdio.hpp"
+#include "../common/random.hpp"
#include "../common/nullpo.hpp"
-#include "../common/mt_rand.hpp"
+#include "../common/socket.hpp"
+#include "../common/timer.hpp"
#include "atcommand.hpp"
#include "battle.hpp"
#include "chat.hpp"
#include "chrif.hpp"
#include "clif.hpp"
-#include "guild.hpp"
#include "intif.hpp"
#include "itemdb.hpp"
+#include "magic.hpp"
#include "map.hpp"
#include "mob.hpp"
#include "npc.hpp"
#include "party.hpp"
-#include "pc.hpp"
#include "script.hpp"
#include "skill.hpp"
#include "storage.hpp"
#include "trade.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
+#include "../poison.hpp"
-#define PVP_CALCRANK_INTERVAL 1000 // PVP順位計算の間隔
+// PVP順位計算の間隔
+constexpr std::chrono::milliseconds PVP_CALCRANK_INTERVAL =
+ std::chrono::seconds(1);
//define it here, since the ifdef only occurs in this file
#define USE_ASTRAL_SOUL_SKILL
-#define STATE_BLIND 0x10
-
#ifdef USE_ASTRAL_SOUL_SKILL
-#define MAGIC_SKILL_THRESHOLD 200 // [fate] At this threshold, the Astral Soul skill kicks in
+// [fate] At this threshold, the Astral Soul skill kicks in
+constexpr int MAGIC_SKILL_THRESHOLD = 200;
#endif
-#define MAP_LOG_STATS(sd, suffix) \
- MAP_LOG_PC(sd, "STAT %d %d %d %d %d %d " suffix, \
- sd->status.str, sd->status.agi, sd->status.vit, sd->status.int_, sd->status.dex, sd->status.luk)
-
-#define MAP_LOG_XP(sd, suffix) \
- MAP_LOG_PC(sd, "XP %d %d JOB %d %d %d ZENY %d + %d " suffix, \
- sd->status.base_level, sd->status.base_exp, sd->status.job_level, sd->status.job_exp, sd->status.skill_point, sd->status.zeny, pc_readaccountreg(sd, "BankAccount"))
-
-#define MAP_LOG_MAGIC(sd, suffix) \
- MAP_LOG_PC(sd, "MAGIC %d %d %d %d %d %d EXP %d %d " suffix, \
- sd->status.skill[TMW_MAGIC].lv, \
- sd->status.skill[TMW_MAGIC_LIFE].lv, \
- sd->status.skill[TMW_MAGIC_WAR].lv, \
- sd->status.skill[TMW_MAGIC_TRANSMUTE].lv, \
- sd->status.skill[TMW_MAGIC_NATURE].lv, \
- sd->status.skill[TMW_MAGIC_ETHER].lv, \
- pc_readglobalreg(sd, "MAGIC_EXPERIENCE") & 0xffff, \
+#define MAP_LOG_STATS(sd, suffix) \
+ MAP_LOG_PC(sd, "STAT %d %d %d %d %d %d " suffix, \
+ sd->status.attrs[ATTR::STR], \
+ sd->status.attrs[ATTR::AGI], \
+ sd->status.attrs[ATTR::VIT], \
+ sd->status.attrs[ATTR::INT], \
+ sd->status.attrs[ATTR::DEX], \
+ sd->status.attrs[ATTR::LUK])
+
+#define MAP_LOG_XP(sd, suffix) \
+ MAP_LOG_PC(sd, "XP %d %d JOB %d %d %d ZENY %d + %d " suffix, \
+ sd->status.base_level, sd->status.base_exp, \
+ sd->status.job_level, sd->status.job_exp, sd->status.skill_point, \
+ sd->status.zeny, pc_readaccountreg(sd, "BankAccount"))
+
+#define MAP_LOG_MAGIC(sd, suffix) \
+ MAP_LOG_PC(sd, "MAGIC %d %d %d %d %d %d EXP %d %d " suffix, \
+ sd->status.skill[SkillID::TMW_MAGIC].lv, \
+ sd->status.skill[SkillID::TMW_MAGIC_LIFE].lv, \
+ sd->status.skill[SkillID::TMW_MAGIC_WAR].lv, \
+ sd->status.skill[SkillID::TMW_MAGIC_TRANSMUTE].lv, \
+ sd->status.skill[SkillID::TMW_MAGIC_NATURE].lv, \
+ sd->status.skill[SkillID::TMW_MAGIC_ETHER].lv, \
+ pc_readglobalreg(sd, "MAGIC_EXPERIENCE") & 0xffff, \
(pc_readglobalreg(sd, "MAGIC_EXPERIENCE") >> 24) & 0xff)
-timer_id day_timer_tid;
-timer_id night_timer_tid;
-
-static int max_weight_base[MAX_PC_CLASS];
-static int hp_coefficient[MAX_PC_CLASS];
-static int hp_coefficient2[MAX_PC_CLASS];
-static int hp_sigma_val[MAX_PC_CLASS][MAX_LEVEL];
-static int sp_coefficient[MAX_PC_CLASS];
-static int aspd_base[MAX_PC_CLASS][20];
-static char job_bonus[3][MAX_PC_CLASS][MAX_LEVEL];
-static int exp_table[14][MAX_LEVEL];
-static char statp[255][7];
-static struct
-{
- int id;
- int max;
- struct
- {
- short id, lv;
- } need[6];
-} skill_tree[3][MAX_PC_CLASS][100];
-
-static int atkmods[3][20]; // 武器ATKサイズ修正(size_fix.txt)
-static int refinebonus[5][3]; // 精錬ボーナステーブル(refine_db.txt)
-static int percentrefinery[5][10]; // 精錬成功率(refine_db.txt)
-
-static int dirx[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
-static int diry[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
-
-static unsigned int equip_pos[11] =
- { 0x0080, 0x0008, 0x0040, 0x0004, 0x0001, 0x0200, 0x0100, 0x0010, 0x0020,
- 0x0002, 0x8000
+static //const
+int max_weight_base_0 = 20000;
+static //const
+int hp_coefficient_0 = 0;
+static //const
+int hp_coefficient2_0 = 500;
+// TODO see if this can be turned into an "as-needed" formula
+static
+int hp_sigma_val_0[MAX_LEVEL];
+static //const
+int sp_coefficient_0 = 100;
+
+// coefficients for each weapon type
+// (not all used)
+static //const
+earray<interval_t, ItemLook, ItemLook::SINGLE_HANDED_COUNT> aspd_base_0 //=
+{{
+std::chrono::milliseconds(650),
+std::chrono::milliseconds(700),
+std::chrono::milliseconds(750),
+std::chrono::milliseconds(600),
+std::chrono::milliseconds(2000),
+std::chrono::milliseconds(2000),
+std::chrono::milliseconds(800),
+std::chrono::milliseconds(2000),
+std::chrono::milliseconds(700),
+std::chrono::milliseconds(700),
+std::chrono::milliseconds(650),
+std::chrono::milliseconds(900),
+std::chrono::milliseconds(2000),
+std::chrono::milliseconds(2000),
+std::chrono::milliseconds(2000),
+std::chrono::milliseconds(2000),
+std::chrono::milliseconds(2000),
+}};
+static const
+int exp_table_0[MAX_LEVEL] =
+{
+ // 1 .. 9
+ 9, 16, 25, 36,
+ 77, 112, 153, 200, 253,
+ // 10 .. 19
+ 320, 385, 490, 585, 700,
+ 830, 970, 1120, 1260, 1420,
+ // 20 .. 29
+ 1620, 1860, 1990, 2240, 2504,
+ 2950, 3426, 3934, 4474, 6889,
+ // 30 .. 39
+ 7995, 9174, 10425, 11748, 13967,
+ 15775, 17678, 19677, 21773, 30543,
+ // 40 .. 49
+ 34212, 38065, 42102, 46323, 53026,
+ 58419, 64041, 69892, 75973, 102468,
+ // 50 .. 59
+ 115254, 128692, 142784, 157528, 178184,
+ 196300, 215198, 234879, 255341, 330188,
+ // 60 .. 69
+ 365914, 403224, 442116, 482590, 536948,
+ 585191, 635278, 687211, 740988, 925400,
+ // 70 .. 79
+ 1473746, 1594058, 1718928, 1848355, 1982340,
+ 2230113, 2386162, 2547417, 2713878, 3206160,
+ // 80 .. 89
+ 3681024, 4022472, 4377024, 4744680, 5125440,
+ 5767272, 6204000, 6655464, 7121664, 7602600,
+ // 90 .. 99
+ 9738720, 11649960, 13643520, 18339300, 23836800,
+ 35658000, 48687000, 58135000, 99999999, 0,
+};
+// is this *actually* used anywhere?
+static const
+int exp_table_7[MAX_LEVEL] =
+{
+ // 1 .. 9
+ 10, 18, 28, 40, 91, 151, 205, 268, 340
+};
+// TODO generate this table instead
+static int stat_p[MAX_LEVEL] =
+{
+ // 1..9
+ 48, 52, 56, 60, 64, 69, 74, 79, 84,
+ // 10..19
+ 90, 96, 102,108,115, 122,129,136,144,152,
+ // 20..29
+ 160,168,177,186,195, 204,214,224,234,244,
+ // 30..39
+ 255,266,277,288,300, 312,324,336,349,362,
+ // 40..49
+ 375,388,402,416,430, 444,459,474,489,504,
+ // 50..59
+ 520,536,552,568,585, 602,619,636,654,672,
+ // 60..69
+ 690,708,727,746,765, 784,804,824,844,864,
+ // 70..79
+ 885,906,927,948,970, 992,1014,1036,1059,1082,
+ // 80..89
+ 1105,1128,1152,1176,1200, 1224,1249,1274,1299,1324,
+ // 90..99
+ 1350,1376,1402,1428,1455, 1482,1509,1536,1564,1592,
+ // 100..109
+ 1620,1648,1677,1706,1735, 1764,1794,1824,1854,1884,
+ // 110..119
+ 1915,1946,1977,2008,2040, 2072,2104,2136,2169,2202,
+ // 120..129
+ 2235,2268,2302,2336,2370, 2404,2439,2474,2509,2544,
+ // 130..139
+ 2580,2616,2652,2688,2725, 2762,2799,2836,2874,2912,
+ // 140..149
+ 2950,2988,3027,3066,3105, 3144,3184,3224,3264,3304,
+ // 150..159
+ 3345,3386,3427,3468,3510, 3552,3594,3636,3679,3722,
+ // 160..169
+ 3765,3808,3852,3896,3940, 3984,4029,4074,4119,4164,
+ // 170..179
+ 4210,4256,4302,4348,4395, 4442,4489,4536,4584,4632,
+ // 180..189
+ 4680,4728,4777,4826,4875, 4924,4974,5024,5074,5124,
+ // 190..199
+ 5175,5226,5277,5328,5380, 5432,5484,5536,5589,5642,
+ // 200..209
+ 5695,5748,5802,5856,5910, 5964,6019,6074,6129,6184,
+ // 210..219
+ 6240,6296,6352,6408,6465, 6522,6579,6636,6694,6752,
+ // 220..229
+ 6810,6868,6927,6986,7045, 7104,7164,7224,7284,7344,
+ // 230..239
+ 7405,7466,7527,7588,7650, 7712,7774,7836,7899,7962,
+ // 240..249
+ 8025,8088,8152,8216,8280, 8344,8409,8474,8539,8604,
+ // 250..255
+ 8670,8736,8802,8868,8935, 9002,
};
-//static struct dbt *gm_account_db;
-static struct gm_account *gm_account = NULL;
-static int GM_num = 0;
+static
+earray<EPOS, EQUIP, EQUIP::COUNT> equip_pos //=
+{{
+ EPOS::MISC2,
+ EPOS::CAPE,
+ EPOS::SHOES,
+ EPOS::GLOVES,
+ EPOS::LEGS,
+ EPOS::TORSO,
+ EPOS::HAT,
+ EPOS::MISC1,
+ EPOS::SHIELD,
+ EPOS::WEAPON,
+ EPOS::ARROW,
+}};
-int pc_isGM (struct map_session_data *sd)
+static
+struct gm_account *gm_account = NULL;
+static
+int GM_num = 0;
+
+static
+int pc_checkoverhp(struct map_session_data *sd);
+static
+int pc_checkoversp(struct map_session_data *sd);
+static
+int pc_nextbaseafter(struct map_session_data *sd);
+static
+int pc_nextjobafter(struct map_session_data *sd);
+static
+void pc_setdead(struct map_session_data *sd)
{
-// struct gm_account *p;
- int i;
+ sd->state.dead_sit = 1;
+}
- nullpo_retr (0, sd);
+int pc_isGM(struct map_session_data *sd)
+{
+ int i;
-/* p = numdb_search(gm_account_db, sd->status.account_id);
- if (p == NULL)
- return 0;
- return p->level;*/
+ nullpo_ret(sd);
for (i = 0; i < GM_num; i++)
if (gm_account[i].account_id == sd->status.account_id)
@@ -121,17 +248,17 @@ int pc_isGM (struct map_session_data *sd)
}
-int pc_iskiller (struct map_session_data *src,
+int pc_iskiller(struct map_session_data *src,
struct map_session_data *target)
{
- nullpo_retr (0, src);
+ nullpo_ret(src);
- if (src->bl.type != BL_PC)
+ if (src->bl.type != BL::PC)
return 0;
if (src->special_state.killer)
return 1;
- if (target->bl.type != BL_PC)
+ if (target->bl.type != BL::PC)
return 0;
if (target->special_state.killable)
return 1;
@@ -139,9 +266,9 @@ int pc_iskiller (struct map_session_data *src,
return 0;
}
-int pc_set_gm_level (int account_id, int level)
+int pc_set_gm_level(int account_id, int level)
{
- int i;
+ int i;
for (i = 0; i < GM_num; i++)
{
if (account_id == gm_account[i].account_id)
@@ -152,189 +279,56 @@ int pc_set_gm_level (int account_id, int level)
}
GM_num++;
- RECREATE (gm_account, struct gm_account, GM_num);
+ RECREATE(gm_account, struct gm_account, GM_num);
gm_account[GM_num - 1].account_id = account_id;
gm_account[GM_num - 1].level = level;
return 0;
}
-int pc_getrefinebonus (int lv, int type)
-{
- if (lv >= 0 && lv < 5 && type >= 0 && type < 3)
- return refinebonus[lv][type];
- return 0;
-}
-
-static int distance (int x0, int y0, int x1, int y1)
+static
+int distance(int x0, int y0, int x1, int y1)
{
- int dx, dy;
+ int dx, dy;
- dx = abs (x0 - x1);
- dy = abs (y0 - y1);
+ dx = abs(x0 - x1);
+ dy = abs(y0 - y1);
return dx > dy ? dx : dy;
}
-static void pc_invincible_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{
- struct map_session_data *sd;
-
- if ((sd = (struct map_session_data *) map_id2sd (id)) == NULL
- || sd->bl.type != BL_PC)
- return;
-
- if (sd->invincible_timer != tid)
- {
- if (battle_config.error_log)
- printf ("invincible_timer %d != %d\n", sd->invincible_timer, tid);
- return;
- }
- sd->invincible_timer = -1;
-}
-
-int pc_setinvincibletimer (struct map_session_data *sd, int val)
-{
- nullpo_retr (0, sd);
-
- if (sd->invincible_timer != -1)
- delete_timer (sd->invincible_timer, pc_invincible_timer);
- sd->invincible_timer =
- add_timer (gettick () + val, pc_invincible_timer, sd->bl.id, 0);
- return 0;
-}
-
-int pc_delinvincibletimer (struct map_session_data *sd)
-{
- nullpo_retr (0, sd);
-
- if (sd->invincible_timer != -1)
- {
- delete_timer (sd->invincible_timer, pc_invincible_timer);
- sd->invincible_timer = -1;
- }
- return 0;
-}
-
-static void pc_spiritball_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+static
+void pc_invincible_timer(TimerData *, tick_t, int id)
{
- struct map_session_data *sd;
- int i;
+ struct map_session_data *sd = map_id2sd(id);
- if ((sd = (struct map_session_data *) map_id2sd (id)) == NULL
- || sd->bl.type != BL_PC)
- return;
-
- if (sd->spirit_timer[0] != tid)
- {
- if (battle_config.error_log)
- printf ("spirit_timer %d != %d\n", sd->spirit_timer[0], tid);
- return;
- }
- sd->spirit_timer[0] = -1;
- for (i = 1; i < sd->spiritball; i++)
- {
- sd->spirit_timer[i - 1] = sd->spirit_timer[i];
- sd->spirit_timer[i] = -1;
- }
- sd->spiritball--;
- if (sd->spiritball < 0)
- sd->spiritball = 0;
- clif_spiritball (sd);
+ assert (sd != NULL);
+ assert (sd->bl.type == BL::PC);
}
-int pc_addspiritball (struct map_session_data *sd, int interval, int max)
+int pc_setinvincibletimer(struct map_session_data *sd, interval_t val)
{
- int i;
-
- nullpo_retr (0, sd);
-
- if (max > MAX_SKILL_LEVEL)
- max = MAX_SKILL_LEVEL;
- if (sd->spiritball < 0)
- sd->spiritball = 0;
-
- if (sd->spiritball >= max)
- {
- if (sd->spirit_timer[0] != -1)
- {
- delete_timer (sd->spirit_timer[0], pc_spiritball_timer);
- sd->spirit_timer[0] = -1;
- }
- for (i = 1; i < max; i++)
- {
- sd->spirit_timer[i - 1] = sd->spirit_timer[i];
- sd->spirit_timer[i] = -1;
- }
- }
- else
- sd->spiritball++;
-
- sd->spirit_timer[sd->spiritball - 1] =
- add_timer (gettick () + interval, pc_spiritball_timer, sd->bl.id, 0);
- clif_spiritball (sd);
+ nullpo_ret(sd);
+ sd->invincible_timer = Timer(gettick() + val,
+ std::bind(pc_invincible_timer, ph::_1, ph::_2,
+ sd->bl.id));
return 0;
}
-int pc_delspiritball (struct map_session_data *sd, int count, int type)
+int pc_delinvincibletimer(struct map_session_data *sd)
{
- int i;
-
- nullpo_retr (0, sd);
-
- if (sd->spiritball <= 0)
- {
- sd->spiritball = 0;
- return 0;
- }
-
- if (count > sd->spiritball)
- count = sd->spiritball;
- sd->spiritball -= count;
- if (count > MAX_SKILL_LEVEL)
- count = MAX_SKILL_LEVEL;
-
- for (i = 0; i < count; i++)
- {
- if (sd->spirit_timer[i] != -1)
- {
- delete_timer (sd->spirit_timer[i], pc_spiritball_timer);
- sd->spirit_timer[i] = -1;
- }
- }
- for (i = count; i < MAX_SKILL_LEVEL; i++)
- {
- sd->spirit_timer[i - count] = sd->spirit_timer[i];
- sd->spirit_timer[i] = -1;
- }
-
- if (!type)
- clif_spiritball (sd);
+ nullpo_ret(sd);
+ sd->invincible_timer.cancel();
return 0;
}
-int pc_setrestartvalue (struct map_session_data *sd, int type)
+int pc_setrestartvalue(struct map_session_data *sd, int type)
{
- //転生や養子の場合の元の職業を算出する
- struct pc_base_job s_class;
-
- nullpo_retr (0, sd);
-
- s_class = pc_calc_base_job (sd->status.pc_class);
+ nullpo_ret(sd);
- //-----------------------
- // 死亡した
- if (sd->special_state.restart_full_recover)
- { // オシリスカード
- sd->status.hp = sd->status.max_hp;
- sd->status.sp = sd->status.max_sp;
- }
- else
{
- if (s_class.job == 0 && battle_config.restart_hp_rate < 50)
- { //ノビは半分回復
+ if (battle_config.restart_hp_rate < 50)
sd->status.hp = (sd->status.max_hp) / 2;
- }
else
{
if (battle_config.restart_hp_rate <= 0)
@@ -349,31 +343,16 @@ int pc_setrestartvalue (struct map_session_data *sd, int type)
}
if (battle_config.restart_sp_rate > 0)
{
- int sp = sd->status.max_sp * battle_config.restart_sp_rate / 100;
+ int sp = sd->status.max_sp * battle_config.restart_sp_rate / 100;
if (sd->status.sp < sp)
sd->status.sp = sp;
}
}
if (type & 1)
- clif_updatestatus (sd, SP_HP);
+ clif_updatestatus(sd, SP::HP);
if (type & 1)
- clif_updatestatus (sd, SP_SP);
-
- /* removed exp penalty on spawn [Valaris] */
+ clif_updatestatus(sd, SP::SP);
- if (type & 2 && sd->status.pc_class != 0 && battle_config.zeny_penalty > 0
- && !map[sd->bl.m].flag.nozenypenalty)
- {
- int zeny =
- (int) ((double) sd->status.zeny *
- (double) battle_config.zeny_penalty / 10000.);
- if (zeny < 1)
- zeny = 1;
- sd->status.zeny -= zeny;
- if (sd->status.zeny < 0)
- sd->status.zeny = 0;
- clif_updatestatus (sd, SP_ZENY);
- }
sd->heal_xp = 0; // [Fate] Set gainable xp for healing this player to 0
return 0;
@@ -383,49 +362,38 @@ int pc_setrestartvalue (struct map_session_data *sd, int type)
* 自分をロックしているMOBの数を数える(foreachclient)
*------------------------------------------
*/
-static int pc_counttargeted_sub (struct block_list *bl, va_list ap)
+static
+void pc_counttargeted_sub(struct block_list *bl,
+ int id, int *c, struct block_list *src, ATK target_lv)
{
- int id, *c, target_lv;
- struct block_list *src;
+ nullpo_retv(bl);
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
-
- id = va_arg (ap, int);
-
- nullpo_retr (0, c = va_arg (ap, int *));
-
- src = va_arg (ap, struct block_list *);
- target_lv = va_arg (ap, int);
if (id == bl->id || (src && id == src->id))
- return 0;
- if (bl->type == BL_PC)
+ return;
+ if (bl->type == BL::PC)
{
struct map_session_data *sd = (struct map_session_data *) bl;
- if (sd && sd->attacktarget == id && sd->attacktimer != -1
+ if (sd->attacktarget == id && sd->attacktimer
&& sd->attacktarget_lv >= target_lv)
(*c)++;
}
- else if (bl->type == BL_MOB)
+ else if (bl->type == BL::MOB)
{
struct mob_data *md = (struct mob_data *) bl;
- if (md && md->target_id == id && md->timer != -1
- && md->state.state == MS_ATTACK && md->target_lv >= target_lv)
+ if (md->target_id == id && md->timer
+ && md->state.state == MS::ATTACK && md->target_lv >= target_lv)
(*c)++;
- //printf("md->target_lv:%d, target_lv:%d\n",((struct mob_data *)bl)->target_lv,target_lv);
}
- return 0;
}
-int pc_counttargeted (struct map_session_data *sd, struct block_list *src,
- int target_lv)
+int pc_counttargeted(struct map_session_data *sd, struct block_list *src,
+ ATK target_lv)
{
- int c = 0;
- map_foreachinarea (pc_counttargeted_sub, sd->bl.m,
- sd->bl.x - AREA_SIZE, sd->bl.y - AREA_SIZE,
- sd->bl.x + AREA_SIZE, sd->bl.y + AREA_SIZE, 0,
- sd->bl.id, &c, src, target_lv);
+ int c = 0;
+ map_foreachinarea(std::bind(pc_counttargeted_sub, ph::_1, sd->bl.id, &c, src, target_lv),
+ sd->bl.m, sd->bl.x - AREA_SIZE, sd->bl.y - AREA_SIZE,
+ sd->bl.x + AREA_SIZE, sd->bl.y + AREA_SIZE, BL::NUL);
return c;
}
@@ -433,30 +401,31 @@ int pc_counttargeted (struct map_session_data *sd, struct block_list *src,
* ローカルプロトタイプ宣言 (必要な物のみ)
*------------------------------------------
*/
-static int pc_walktoxy_sub (struct map_session_data *);
+static
+int pc_walktoxy_sub(struct map_session_data *);
/*==========================================
* saveに必要なステータス修正を行なう
*------------------------------------------
*/
-int pc_makesavestatus (struct map_session_data *sd)
+int pc_makesavestatus(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
// 服の色は色々弊害が多いので保存対象にはしない
if (!battle_config.save_clothcolor)
sd->status.clothes_color = 0;
// 死亡状態だったのでhpを1、位置をセーブ場所に変更
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
{
- pc_setrestartvalue (sd, 0);
- memcpy (&sd->status.last_point, &sd->status.save_point,
- sizeof (sd->status.last_point));
+ pc_setrestartvalue(sd, 0);
+ memcpy(&sd->status.last_point, &sd->status.save_point,
+ sizeof(sd->status.last_point));
}
else
{
- memcpy (sd->status.last_point.map, sd->mapname, 24);
+ memcpy(sd->status.last_point.map, sd->mapname, 24);
sd->status.last_point.x = sd->bl.x;
sd->status.last_point.y = sd->bl.y;
}
@@ -465,17 +434,14 @@ int pc_makesavestatus (struct map_session_data *sd)
if (map[sd->bl.m].flag.nosave)
{
struct map_data *m = &map[sd->bl.m];
- if (strcmp (m->save.map, "SavePoint") == 0)
- memcpy (&sd->status.last_point, &sd->status.save_point,
- sizeof (sd->status.last_point));
+ if (strcmp(m->save.map, "SavePoint") == 0)
+ memcpy(&sd->status.last_point, &sd->status.save_point,
+ sizeof(sd->status.last_point));
else
- memcpy (&sd->status.last_point, &m->save,
- sizeof (sd->status.last_point));
+ memcpy(&sd->status.last_point, &m->save,
+ sizeof(sd->status.last_point));
}
- //マナーポイントがプラスだった場合0に
- if (battle_config.muting_players && sd->status.manner > 0)
- sd->status.manner = 0;
return 0;
}
@@ -483,10 +449,10 @@ int pc_makesavestatus (struct map_session_data *sd)
* 接続時の初期化
*------------------------------------------
*/
-int pc_setnewpc (struct map_session_data *sd, int account_id, int char_id,
- int login_id1, int client_tick, int sex, int fd)
+int pc_setnewpc(struct map_session_data *sd, int account_id, int char_id,
+ int login_id1, tick_t client_tick, int sex)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
sd->bl.id = account_id;
sd->char_id = char_id;
@@ -495,76 +461,78 @@ int pc_setnewpc (struct map_session_data *sd, int account_id, int char_id,
sd->client_tick = client_tick;
sd->sex = sex;
sd->state.auth = 0;
- sd->bl.type = BL_PC;
- sd->canact_tick = sd->canmove_tick = gettick ();
- sd->canlog_tick = gettick ();
+ sd->bl.type = BL::PC;
+ sd->canact_tick = sd->canmove_tick = gettick();
+ sd->canlog_tick = gettick();
sd->state.waitingdisconnect = 0;
return 0;
}
-int pc_equippoint (struct map_session_data *sd, int n)
+EPOS pc_equippoint(struct map_session_data *sd, int n)
{
- int ep = 0;
- //転生や養子の場合の元の職業を算出する
- struct pc_base_job s_class;
-
- nullpo_retr (0, sd);
+ nullpo_retr(EPOS::ZERO, sd);
if (!sd->inventory_data[n])
- return 0;
+ return EPOS::ZERO;
- s_class = pc_calc_base_job (sd->status.pc_class);
-
- ep = sd->inventory_data[n]->equip;
- if ((sd->inventory_data[n]->look == 1 || sd->inventory_data[n]->look == 2
- || sd->inventory_data[n]->look == 6) && (ep == 2
- &&
- (pc_checkskill (sd, AS_LEFT)
- > 0 || s_class.job == 12)))
- {
- return 34;
- }
+ EPOS ep = sd->inventory_data[n]->equip;
return ep;
}
static
-int pc_setinventorydata (struct map_session_data *sd)
+int pc_setinventorydata(struct map_session_data *sd)
{
- int i, id;
+ int i, id;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0; i < MAX_INVENTORY; i++)
{
id = sd->status.inventory[i].nameid;
- sd->inventory_data[i] = itemdb_search (id);
+ sd->inventory_data[i] = itemdb_search(id);
}
return 0;
}
static
-int pc_calcweapontype (struct map_session_data *sd)
+int pc_calcweapontype(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (sd->weapontype1 != 0 && sd->weapontype2 == 0)
+ if (sd->weapontype1 != ItemLook::NONE
+ && sd->weapontype2 == ItemLook::NONE)
sd->status.weapon = sd->weapontype1;
- if (sd->weapontype1 == 0 && sd->weapontype2 != 0) // 左手武器 Only
+ if (sd->weapontype1 == ItemLook::NONE
+ && sd->weapontype2 != ItemLook::NONE)
sd->status.weapon = sd->weapontype2;
- else if (sd->weapontype1 == 1 && sd->weapontype2 == 1) // 双短剣
- sd->status.weapon = 0x11;
- else if (sd->weapontype1 == 2 && sd->weapontype2 == 2) // 双単手剣
- sd->status.weapon = 0x12;
- else if (sd->weapontype1 == 6 && sd->weapontype2 == 6) // 双単手斧
- sd->status.weapon = 0x13;
- else if ((sd->weapontype1 == 1 && sd->weapontype2 == 2) || (sd->weapontype1 == 2 && sd->weapontype2 == 1)) // 短剣 - 単手剣
- sd->status.weapon = 0x14;
- else if ((sd->weapontype1 == 1 && sd->weapontype2 == 6) || (sd->weapontype1 == 6 && sd->weapontype2 == 1)) // 短剣 - 斧
- sd->status.weapon = 0x15;
- else if ((sd->weapontype1 == 2 && sd->weapontype2 == 6) || (sd->weapontype1 == 6 && sd->weapontype2 == 2)) // 単手剣 - 斧
- sd->status.weapon = 0x16;
+ else if (sd->weapontype1 == ItemLook::BLADE
+ && sd->weapontype2 == ItemLook::BLADE)
+ sd->status.weapon = ItemLook::DUAL_BLADE;
+ else if (sd->weapontype1 == ItemLook::_2
+ && sd->weapontype2 == ItemLook::_2)
+ sd->status.weapon = ItemLook::DUAL_2;
+ else if (sd->weapontype1 == ItemLook::_6
+ && sd->weapontype2 == ItemLook::_6)
+ sd->status.weapon = ItemLook::DUAL_6;
+ else if ((sd->weapontype1 == ItemLook::BLADE
+ && sd->weapontype2 == ItemLook::_2)
+ || (sd->weapontype1 == ItemLook::_2
+ && sd->weapontype2 == ItemLook::BLADE))
+ sd->status.weapon = ItemLook::DUAL_12;
+ else if (
+ (sd->weapontype1 == ItemLook::BLADE
+ && sd->weapontype2 == ItemLook::_6)
+ || (sd->weapontype1 == ItemLook::_6
+ && sd->weapontype2 == ItemLook::BLADE))
+ sd->status.weapon = ItemLook::DUAL_16;
+ else if (
+ (sd->weapontype1 == ItemLook::_2
+ && sd->weapontype2 == ItemLook::_6)
+ || (sd->weapontype1 == ItemLook::_6
+ && sd->weapontype2 == ItemLook::_2))
+ sd->status.weapon = ItemLook::DUAL_26;
else
sd->status.weapon = sd->weapontype1;
@@ -572,69 +540,67 @@ int pc_calcweapontype (struct map_session_data *sd)
}
static
-int pc_setequipindex (struct map_session_data *sd)
+int pc_setequipindex(struct map_session_data *sd)
{
- int i, j;
+ nullpo_ret(sd);
- nullpo_retr (0, sd);
-
- for (i = 0; i < 11; i++)
+ for (EQUIP i : EQUIPs)
sd->equip_index[i] = -1;
- for (i = 0; i < MAX_INVENTORY; i++)
+ for (int i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].nameid <= 0)
continue;
- if (sd->status.inventory[i].equip)
+ if (bool(sd->status.inventory[i].equip))
{
- for (j = 0; j < 11; j++)
- if (sd->status.inventory[i].equip & equip_pos[j])
+ for (EQUIP j : EQUIPs)
+ if (bool(sd->status.inventory[i].equip & equip_pos[j]))
sd->equip_index[j] = i;
- if (sd->status.inventory[i].equip & 0x0002)
+ if (bool(sd->status.inventory[i].equip & EPOS::WEAPON))
{
if (sd->inventory_data[i])
sd->weapontype1 = sd->inventory_data[i]->look;
else
- sd->weapontype1 = 0;
+ sd->weapontype1 = ItemLook::NONE;
}
- if (sd->status.inventory[i].equip & 0x0020)
+ if (bool(sd->status.inventory[i].equip & EPOS::SHIELD))
{
if (sd->inventory_data[i])
{
- if (sd->inventory_data[i]->type == 4)
+ if (sd->inventory_data[i]->type == ItemType::WEAPON)
{
- if (sd->status.inventory[i].equip == 0x0020)
+ if (sd->status.inventory[i].equip == EPOS::SHIELD)
sd->weapontype2 = sd->inventory_data[i]->look;
else
- sd->weapontype2 = 0;
+ sd->weapontype2 = ItemLook::NONE;
}
else
- sd->weapontype2 = 0;
+ sd->weapontype2 = ItemLook::NONE;
}
else
- sd->weapontype2 = 0;
+ sd->weapontype2 = ItemLook::NONE;
}
}
}
- pc_calcweapontype (sd);
+ pc_calcweapontype(sd);
return 0;
}
-int pc_isequip (struct map_session_data *sd, int n)
+static
+int pc_isequip(struct map_session_data *sd, int n)
{
struct item_data *item;
- struct status_change *sc_data;
+ eptr<struct status_change, StatusChange> sc_data;
//転生や養子の場合の元の職業を算出する
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
item = sd->inventory_data[n];
- sc_data = battle_get_sc_data (&sd->bl);
- //s_class = pc_calc_base_job(sd->status.class);
+ sc_data = battle_get_sc_data(&sd->bl);
if (battle_config.gm_allequip > 0
- && pc_isGM (sd) >= battle_config.gm_allequip)
+ && pc_isGM(sd) >= battle_config.gm_allequip)
return 1;
if (item == NULL)
@@ -647,179 +613,69 @@ int pc_isequip (struct map_session_data *sd, int n)
if (map[sd->bl.m].flag.pvp
&& (item->flag.no_equip == 1 || item->flag.no_equip == 3))
return 0;
- if (map[sd->bl.m].flag.gvg
- && (item->flag.no_equip == 2 || item->flag.no_equip == 3))
- return 0;
- if (item->equip & 0x0002 && sc_data
- && sc_data[SC_STRIPWEAPON].timer != -1)
- return 0;
- if (item->equip & 0x0020 && sc_data
- && sc_data[SC_STRIPSHIELD].timer != -1)
- return 0;
- if (item->equip & 0x0010 && sc_data && sc_data[SC_STRIPARMOR].timer != -1)
- return 0;
- if (item->equip & 0x0100 && sc_data && sc_data[SC_STRIPHELM].timer != -1)
- return 0;
return 1;
}
/*==========================================
- * Weapon Breaking [Valaris]
- *------------------------------------------
- */
-int pc_breakweapon (struct map_session_data *sd)
-{
- struct item_data *item;
- char output[255];
- int i;
-
- if (sd == NULL)
- return -1;
- if (sd->unbreakable >= MRAND (100))
- return 0;
- if (sd->sc_data && sd->sc_data[SC_CP_WEAPON].timer != -1)
- return 0;
-
- for (i = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.inventory[i].equip
- && sd->status.inventory[i].equip & 0x0002
- && !sd->status.inventory[i].broken)
- {
- item = sd->inventory_data[i];
- sd->status.inventory[i].broken = 1;
- //pc_unequipitem(sd,i,0);
- if (sd->status.inventory[i].equip
- && sd->status.inventory[i].equip & 0x0002
- && sd->status.inventory[i].broken == 1)
- {
- sprintf (output, "%s has broken.", item->jname);
- clif_emotion (&sd->bl, 23);
- clif_displaymessage (sd->fd, output);
- clif_equiplist (sd);
- skill_status_change_start (&sd->bl, SC_BROKNWEAPON, 0, 0, 0,
- 0, 0, 0);
- }
- }
- if (sd->status.inventory[i].broken == 1)
- return 0;
- }
-
- return 0;
-}
-
-/*==========================================
- * Armor Breaking [Valaris]
- *------------------------------------------
- */
-int pc_breakarmor (struct map_session_data *sd)
-{
- struct item_data *item;
- char output[255];
- int i;
-
- if (sd == NULL)
- return -1;
- if (sd->unbreakable >= MRAND (100))
- return 0;
- if (sd->sc_data && sd->sc_data[SC_CP_ARMOR].timer != -1)
- return 0;
-
- for (i = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.inventory[i].equip
- && sd->status.inventory[i].equip & 0x0010
- && !sd->status.inventory[i].broken)
- {
- item = sd->inventory_data[i];
- sd->status.inventory[i].broken = 1;
- //pc_unequipitem(sd,i,0);
- if (sd->status.inventory[i].equip
- && sd->status.inventory[i].equip & 0x0010
- && sd->status.inventory[i].broken == 1)
- {
- sprintf (output, "%s has broken.", item->jname);
- clif_emotion (&sd->bl, 23);
- clif_displaymessage (sd->fd, output);
- clif_equiplist (sd);
- skill_status_change_start (&sd->bl, SC_BROKNARMOR, 0, 0, 0, 0,
- 0, 0);
- }
- }
- if (sd->status.inventory[i].broken == 1)
- return 0;
- }
- return 0;
-}
-
-/*==========================================
* session idに問題無し
* char鯖から送られてきたステータスを設定
*------------------------------------------
*/
-int pc_authok (int id, int login_id2, time_t connect_until_time,
- short tmw_version, struct mmo_charstatus *st)
+int pc_authok(int id, int login_id2, TimeT connect_until_time,
+ short tmw_version, const struct mmo_charstatus *st)
{
struct map_session_data *sd = NULL;
struct party *p;
- struct guild *g;
- unsigned long tick = gettick ();
+ tick_t tick = gettick();
struct sockaddr_in sai;
socklen_t sa_len = sizeof(struct sockaddr);
- sd = map_id2sd (id);
+ sd = map_id2sd(id);
if (sd == NULL)
return 1;
sd->login_id2 = login_id2;
sd->tmw_version = tmw_version;
- memcpy (&sd->status, st, sizeof (*st));
+ memcpy(&sd->status, st, sizeof(*st));
if (sd->status.sex != sd->sex)
{
- clif_authfail_fd (sd->fd, 0);
+ clif_authfail_fd(sd->fd, 0);
return 1;
}
- MAP_LOG_STATS (sd, "LOGIN");
- MAP_LOG_XP (sd, "LOGIN");
- MAP_LOG_MAGIC (sd, "LOGIN");
+ MAP_LOG_STATS(sd, "LOGIN");
+ MAP_LOG_XP(sd, "LOGIN");
+ MAP_LOG_MAGIC(sd, "LOGIN");
- memset (&sd->state, 0, sizeof (sd->state));
+ memset(&sd->state, 0, sizeof(sd->state));
// 基本的な初期化
sd->state.connect_new = 1;
sd->bl.prev = sd->bl.next = NULL;
- sd->weapontype1 = sd->weapontype2 = 0;
- sd->view_class = sd->status.pc_class;
+ sd->weapontype1 = sd->weapontype2 = ItemLook::NONE;
sd->speed = DEFAULT_WALK_SPEED;
sd->state.dead_sit = 0;
- sd->dir = 0;
- sd->head_dir = 0;
+ sd->dir = DIR::S;
+ sd->head_dir = DIR::S;
sd->state.auth = 1;
- sd->walktimer = -1;
- sd->attacktimer = -1;
- sd->followtimer = -1; // [MouseJstr]
- sd->skilltimer = -1;
- sd->skillitem = -1;
- sd->skillitemlv = -1;
- sd->invincible_timer = -1;
+ // sd->walktimer = nullptr;
+ // sd->attacktimer = nullptr;
+ // sd->invincible_timer = nullptr;
sd->sg_count = 0;
sd->deal_locked = 0;
sd->trade_partner = 0;
- sd->inchealhptick = 0;
- sd->inchealsptick = 0;
- sd->hp_sub = 0;
- sd->sp_sub = 0;
+ sd->inchealhptick = interval_t::zero();
+ sd->inchealsptick = interval_t::zero();
+ sd->hp_sub = interval_t::zero();
+ sd->sp_sub = interval_t::zero();
sd->quick_regeneration_hp.amount = 0;
sd->quick_regeneration_sp.amount = 0;
sd->heal_xp = 0;
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->attackabletime = tick;
@@ -827,17 +683,13 @@ int pc_authok (int id, int login_id2, time_t connect_until_time,
// Removed because it was buggy with the ~50 day wraparound,
// and there's already a limit on how fast you can log in and log out.
// -o11c
+ //
+ // The above is no longer accurate now that we use <chrono>, but
+ // I'm still not reverting this.
+ // -o11c
sd->cast_tick = tick; // + pc_readglobalreg (sd, "MAGIC_CAST_TICK");
- sd->doridori_counter = 0;
-
- sd->spiritball = 0;
- for (int i = 0; i < MAX_SKILL_LEVEL; i++)
- sd->spirit_timer[i] = -1;
- for (int i = 0; i < MAX_SKILLTIMERSKILL; i++)
- sd->skilltimerskill[i].timer = -1;
-
- memset (&sd->dev, 0, sizeof (struct square));
+ memset(&sd->dev, 0, sizeof(struct square));
for (int i = 0; i < 5; i++)
{
sd->dev.val1[i] = 0;
@@ -845,32 +697,23 @@ int pc_authok (int id, int login_id2, time_t connect_until_time,
}
// アカウント変数の送信要求
- intif_request_accountreg (sd);
+ intif_request_accountreg(sd);
// アイテムチェック
- pc_setinventorydata (sd);
- pc_checkitem (sd);
+ pc_setinventorydata(sd);
+ pc_checkitem(sd);
// ステータス異常の初期化
- for (int i = 0; i < MAX_STATUSCHANGE; i++)
+ for (StatusChange i : erange(StatusChange(), StatusChange::MAX_STATUSCHANGE))
{
- sd->sc_data[i].timer = -1;
- sd->sc_data[i].val1 = sd->sc_data[i].val2 = sd->sc_data[i].val3 =
- sd->sc_data[i].val4 = 0;
+ // sd->sc_data[i].timer = nullptr;
+ sd->sc_data[i].val1 = 0;
}
sd->sc_count = 0;
- if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) &&
- (pc_isGM (sd) >= get_atcommand_level (AtCommand_Hide)))
- sd->status.option &= (OPTION_MASK | OPTION_HIDE);
- else
- sd->status.option &= OPTION_MASK;
-
- // スキルユニット関係の初期化
- memset (sd->skillunit, 0, sizeof (sd->skillunit));
- memset (sd->skillunittick, 0, sizeof (sd->skillunittick));
+ sd->status.option = Option::ZERO;
// init ignore list
- memset (sd->ignore, 0, sizeof (sd->ignore));
+ memset(sd->ignore, 0, sizeof(sd->ignore));
// パーティー関係の初期化
sd->party_sended = 0;
@@ -879,73 +722,58 @@ int pc_authok (int id, int login_id2, time_t connect_until_time,
sd->party_y = -1;
sd->party_hp = -1;
- // ギルド関係の初期化
- sd->guild_sended = 0;
- sd->guild_invite = 0;
- sd->guild_alliance = 0;
-
// イベント関係の初期化
- memset (sd->eventqueue, 0, sizeof (sd->eventqueue));
+ memset(sd->eventqueue, 0, sizeof(sd->eventqueue));
for (int i = 0; i < MAX_EVENTTIMER; i++)
- sd->eventtimer[i] = -1;
+ {
+ // sd->eventtimer[i] = nullptr;
+ }
+
// 位置の設定
- pc_setpos (sd, sd->status.last_point.map, sd->status.last_point.x,
- sd->status.last_point.y, 0);
+ pc_setpos(sd, sd->status.last_point.map, sd->status.last_point.x,
+ sd->status.last_point.y, BeingRemoveWhy::GONE);
// パーティ、ギルドデータの要求
if (sd->status.party_id > 0
- && (p = party_search (sd->status.party_id)) == NULL)
- party_request_info (sd->status.party_id);
- if (sd->status.guild_id > 0
- && (g = guild_search (sd->status.guild_id)) == NULL)
- guild_request_info (sd->status.guild_id);
+ && (p = party_search(sd->status.party_id)) == NULL)
+ party_request_info(sd->status.party_id);
// pvpの設定
sd->pvp_rank = 0;
sd->pvp_point = 0;
- sd->pvp_timer = -1;
+ // sd->pvp_timer = nullptr;
// 通知
- clif_authok (sd);
- map_addnickdb (sd);
- if (map_charid2nick (sd->status.char_id) == NULL)
- map_addchariddb (sd->status.char_id, sd->status.name);
+ clif_authok(sd);
+ map_addnickdb(sd);
+ if (map_charid2nick(sd->status.char_id) == NULL)
+ map_addchariddb(sd->status.char_id, sd->status.name);
//スパノビ用死にカウンターのスクリプト変数からの読み出しとsdへのセット
- sd->die_counter = pc_readglobalreg (sd, "PC_DIE_COUNTER");
-
- if (night_flag == 1)
- {
- char tmpstr[1024];
- strcpy (tmpstr, "Actually, it's the night...");
- clif_wis_message (sd->fd, wisp_server_name, tmpstr,
- strlen (tmpstr) + 1);
- sd->opt2 |= STATE_BLIND;
- }
+ sd->die_counter = pc_readglobalreg(sd, "PC_DIE_COUNTER");
// ステータス初期計算など
- pc_calcstatus (sd, 1);
+ pc_calcstatus(sd, 1);
- if (pc_isGM (sd))
+ if (pc_isGM(sd))
{
- printf
- ("Connection accepted: character '%s' (account: %d; GM level %d).\n",
- sd->status.name, sd->status.account_id, pc_isGM (sd));
- clif_updatestatus (sd, SP_GM);
+ PRINTF("Connection accepted: character '%s' (account: %d; GM level %d).\n",
+ sd->status.name, sd->status.account_id, pc_isGM(sd));
+ clif_updatestatus(sd, SP::GM);
}
else
- printf ("Connection accepted: Character '%s' (account: %d).\n",
+ PRINTF("Connection accepted: Character '%s' (account: %d).\n",
sd->status.name, sd->status.account_id);
// Message of the Dayの送信
{
char buf[256];
FILE *fp;
- if ((fp = fopen_ (motd_txt, "r")) != NULL)
+ if ((fp = fopen_(motd_txt, "r")) != NULL)
{
- while (fgets (buf, sizeof (buf) - 1, fp) != NULL)
+ while (fgets(buf, sizeof(buf) - 1, fp) != NULL)
{
for (int i = 0; buf[i]; i++)
{
@@ -955,35 +783,38 @@ int pc_authok (int id, int login_id2, time_t connect_until_time,
break;
}
}
- clif_displaymessage (sd->fd, buf);
+ clif_displaymessage(sd->fd, buf);
}
- fclose_ (fp);
+ fclose_(fp);
}
}
sd->auto_ban_info.in_progress = 0;
// Initialize antispam vars
- sd->chat_reset_due = sd->chat_lines_in = sd->chat_total_repeats =
- sd->chat_repeat_reset_due = 0;
+ sd->chat_reset_due = TimeT();
+ sd->chat_lines_in = sd->chat_total_repeats = 0;
+ sd->chat_repeat_reset_due = TimeT();
sd->chat_lastmsg[0] = '\0';
memset(sd->flood_rates, 0, sizeof(sd->flood_rates));
- sd->packet_flood_reset_due = sd->packet_flood_in = 0;
+ sd->packet_flood_reset_due = TimeT();
+ sd->packet_flood_in = 0;
// Obtain IP address (if they are still connected)
if (!getpeername(sd->fd, (struct sockaddr *)&sai, &sa_len))
sd->ip = sai.sin_addr;
// message of the limited time of the account
- if (connect_until_time != 0)
- { // don't display if it's unlimited or unknow value
- char tmpstr[1024];
- strftime (tmpstr, sizeof (tmpstr) - 1, "Your account time limit is: %d-%m-%Y %H:%M:%S.", gmtime (&connect_until_time));
- clif_wis_message (sd->fd, wisp_server_name, tmpstr,
- strlen (tmpstr) + 1);
+ if (connect_until_time)
+ {
+ // don't display if it's unlimited or unknow value
+ char tmpstr[] = WITH_TIMESTAMP("Your account time limit is: ");
+ REPLACE_TIMESTAMP(tmpstr, connect_until_time);
+
+ clif_wis_message(sd->fd, wisp_server_name, tmpstr, sizeof(tmpstr));
}
- pc_calcstatus (sd, 1);
+ pc_calcstatus(sd, 1);
return 0;
}
@@ -992,24 +823,25 @@ int pc_authok (int id, int login_id2, time_t connect_until_time,
* session idに問題ありなので後始末
*------------------------------------------
*/
-int pc_authfail (int id)
+int pc_authfail(int id)
{
struct map_session_data *sd;
- sd = map_id2sd (id);
+ sd = map_id2sd(id);
if (sd == NULL)
return 1;
- clif_authfail_fd (sd->fd, 0);
+ clif_authfail_fd(sd->fd, 0);
return 0;
}
-static int pc_calc_skillpoint (struct map_session_data *sd)
+static
+int pc_calc_skillpoint(struct map_session_data *sd)
{
- int i, skill_points = 0;
+ int i, skill_points = 0;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0; i < skill_pool_skills_size; i++) {
int lv = sd->status.skill[skill_pool_skills[i]].lv;
@@ -1021,226 +853,52 @@ static int pc_calc_skillpoint (struct map_session_data *sd)
}
/*==========================================
- * 覚えられるスキルの計算
- *------------------------------------------
- */
-static
-int pc_calc_skilltree (struct map_session_data *sd)
-{
- int i, id = 0, flag;
- int c = 0, s = 0;
- //転生や養子の場合の元の職業を算出する
- struct pc_base_job s_class;
-
- nullpo_retr (0, sd);
-
- s_class = pc_calc_base_job (sd->status.pc_class);
- c = s_class.job;
- s = (s_class.upper == 1) ? 1 : 0; //ソ転生以外は通常のスキル?
-
- if ((battle_config.skillup_limit)
- && ((c >= 0 && c < 23) || (c >= 4001 && c < 4023)
- || (c >= 4023 && c < 4045)))
- {
- int skill_point = pc_calc_skillpoint (sd);
- if (skill_point < 9)
- c = 0;
- else if ((sd->status.skill_point >= sd->status.job_level
- && skill_point < 58) && ((c > 6 && c < 23) || (c > 4007
- && c < 4023)
- || (c > 4029 && c < 4045)))
- {
- switch (c)
- {
- case 7:
- case 14:
- c = 1;
- break;
- case 8:
- case 15:
- c = 4;
- break;
- case 9:
- case 16:
- c = 2;
- break;
- case 10:
- case 18:
- c = 5;
- break;
- case 11:
- case 19:
- case 20:
- c = 3;
- break;
- case 12:
- case 17:
- c = 6;
- break;
- case 4008:
- case 4015:
- c = 4002;
- break;
- case 4009:
- case 4016:
- c = 4005;
- break;
- case 4010:
- case 4017:
- c = 4003;
- break;
- case 4011:
- case 4019:
- c = 4006;
- break;
- case 4012:
- case 4020:
- case 4021:
- c = 4004;
- break;
- case 4013:
- case 4018:
- c = 4007;
- break;
- case 4030:
- case 4037:
- c = 4024;
- break;
- case 4031:
- case 4038:
- c = 4027;
- break;
- case 4032:
- case 4039:
- c = 4025;
- break;
- case 4033:
- case 4040:
- c = 4028;
- break;
- case 4034:
- case 4041:
- case 4042:
- c = 4026;
- break;
- case 4035:
- case 4043:
- c = 4029;
- break;
-
- }
- }
- }
-
- /*Comment this out for now, as we manage skills differently
- * for(i=0;i<MAX_SKILL;i++)
- * if (i < TMW_MAGIC || i > TMW_MAGIC_END){ // [Fate] This hack gets TMW magic working and persisted without bothering about the skill tree.
- * if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0;
- * if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardスキルなら、
- * sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // 本当のlvに
- * sd->status.skill[i].flag=0; // flagは0にしておく
- * }
- * }
- */
-
- if (battle_config.gm_allskill > 0
- && pc_isGM (sd) >= battle_config.gm_allskill)
- {
- // 全てのスキル
- for (i = 1; i < 158; i++)
- sd->status.skill[i].id = i;
- for (i = 210; i < 291; i++)
- sd->status.skill[i].id = i;
- for (i = 304; i < 337; i++)
- sd->status.skill[i].id = i;
- if (battle_config.enable_upper_class)
- { //confで無効でなければ読み込む
- for (i = 355; i < MAX_SKILL; i++)
- sd->status.skill[i].id = i;
- }
-
- }
- else
- {
- // 通常の計算
- do
- {
- flag = 0;
- for (i = 0; (id = skill_tree[s][c][i].id) > 0; i++)
- {
- int j, f = 1;
- if (!battle_config.skillfree)
- {
- for (j = 0; j < 5; j++)
- {
- if (skill_tree[s][c][i].need[j].id &&
- pc_checkskill (sd,
- skill_tree[s][c][i].need[j].id) <
- skill_tree[s][c][i].need[j].lv)
- f = 0;
- }
- }
- if (f && sd->status.skill[id].id == 0)
- {
- sd->status.skill[id].id = id;
- flag = 1;
- }
- }
- }
- while (flag);
- }
-// if(battle_config.etc_log)
-// printf("calc skill_tree\n");
- return 0;
-}
-
-/*==========================================
* 重量アイコンの確認
*------------------------------------------
*/
-int pc_checkweighticon (struct map_session_data *sd)
+int pc_checkweighticon(struct map_session_data *sd)
{
- int flag = 0;
+ int flag = 0;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->weight * 2 >= sd->max_weight
- && sd->sc_data[SC_FLYING_BACKPACK].timer == -1)
+ && !sd->sc_data[StatusChange::SC_FLYING_BACKPACK].timer)
flag = 1;
if (sd->weight * 10 >= sd->max_weight * 9)
flag = 2;
+ // this is horribly hackish and may have caused crashes
if (flag == 1)
{
- if (sd->sc_data[SC_WEIGHT50].timer == -1)
- skill_status_change_start (&sd->bl, SC_WEIGHT50, 0, 0, 0, 0, 0,
- 0);
+ if (!sd->sc_data[StatusChange::SC_WEIGHT50].timer)
+ skill_status_change_start(&sd->bl, StatusChange::SC_WEIGHT50, 0, interval_t::zero());
}
else
{
- skill_status_change_end (&sd->bl, SC_WEIGHT50, -1);
+ skill_status_change_end(&sd->bl, StatusChange::SC_WEIGHT50, nullptr);
}
if (flag == 2)
{
- if (sd->sc_data[SC_WEIGHT90].timer == -1)
- skill_status_change_start (&sd->bl, SC_WEIGHT90, 0, 0, 0, 0, 0,
- 0);
+ if (!sd->sc_data[StatusChange::SC_WEIGHT90].timer)
+ skill_status_change_start(&sd->bl, StatusChange::SC_WEIGHT90, 0, interval_t::zero());
}
else
{
- skill_status_change_end (&sd->bl, SC_WEIGHT90, -1);
+ skill_status_change_end(&sd->bl, StatusChange::SC_WEIGHT90, nullptr);
}
return 0;
}
static
-void pc_set_weapon_look (struct map_session_data *sd)
+void pc_set_weapon_look(struct map_session_data *sd)
{
if (sd->attack_spell_override)
- clif_changelook (&sd->bl, LOOK_WEAPON,
- sd->attack_spell_look_override);
+ clif_changelook(&sd->bl, LOOK::WEAPON,
+ sd->attack_spell_look_override);
else
- clif_changelook (&sd->bl, LOOK_WEAPON, sd->status.weapon);
+ clif_changelook(&sd->bl, LOOK::WEAPON,
+ static_cast<uint16_t>(sd->status.weapon));
}
/*==========================================
@@ -1250,37 +908,32 @@ void pc_set_weapon_look (struct map_session_data *sd)
* 能動的に変化させたパラメータは自前でsendするように
*------------------------------------------
*/
-int pc_calcstatus (struct map_session_data *sd, int first)
+int pc_calcstatus(struct map_session_data *sd, int first)
{
- int b_speed, b_max_hp, b_max_sp, b_hp, b_sp, b_weight, b_max_weight,
- b_paramb[6], b_parame[6], b_hit, b_flee;
- int b_aspd, b_watk, b_def, b_watk2, b_def2, b_flee2, b_critical,
- b_attackrange, b_matk1, b_matk2, b_mdef, b_mdef2, b_class;
- int b_base_atk;
- struct skill b_skill[MAX_SKILL];
- int i, bl, index;
- int skill, aspd_rate, wele, wele_, def_ele, refinedef = 0;
- int str, dstr, dex;
- struct pc_base_job s_class;
-
- nullpo_retr (0, sd);
+ int b_max_hp, b_max_sp, b_hp, b_sp, b_weight, b_max_weight,
+ b_hit, b_flee;
+ int b_watk, b_def, b_watk2, b_def2, b_flee2, b_critical,
+ b_attackrange, b_matk1, b_matk2, b_mdef, b_mdef2;
+ int b_base_atk;
+ int bl, index;
+ int aspd_rate, refinedef = 0;
+ int str, dstr, dex;
- //転生や養子の場合の元の職業を算出する
- s_class = pc_calc_base_job (sd->status.pc_class);
+ nullpo_ret(sd);
- b_speed = sd->speed;
+ interval_t b_speed = sd->speed;
b_max_hp = sd->status.max_hp;
b_max_sp = sd->status.max_sp;
b_hp = sd->status.hp;
b_sp = sd->status.sp;
b_weight = sd->weight;
b_max_weight = sd->max_weight;
- memcpy (b_paramb, &sd->paramb, sizeof (b_paramb));
- memcpy (b_parame, &sd->paramc, sizeof (b_parame));
- memcpy (b_skill, &sd->status.skill, sizeof (b_skill));
+ earray<int, ATTR, ATTR::COUNT> b_paramb = sd->paramb;
+ earray<int, ATTR, ATTR::COUNT> b_parame = sd->paramc;
+ earray<skill_value, SkillID, MAX_SKILL> b_skill = sd->status.skill;
b_hit = sd->hit;
b_flee = sd->flee;
- b_aspd = sd->aspd;
+ interval_t b_aspd = sd->aspd;
b_watk = sd->watk;
b_def = sd->def;
b_watk2 = sd->watk2;
@@ -1292,18 +945,14 @@ int pc_calcstatus (struct map_session_data *sd, int first)
b_matk2 = sd->matk2;
b_mdef = sd->mdef;
b_mdef2 = sd->mdef2;
- b_class = sd->view_class;
- sd->view_class = sd->status.pc_class;
b_base_atk = sd->base_atk;
- pc_calc_skilltree (sd); // スキルツリーの計算
-
- sd->max_weight = max_weight_base[s_class.job] + sd->status.str * 300;
+ sd->max_weight = max_weight_base_0 + sd->status.attrs[ATTR::STR] * 300;
if (first & 1)
{
sd->weight = 0;
- for (i = 0; i < MAX_INVENTORY; i++)
+ for (int i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].nameid == 0
|| sd->inventory_data[i] == NULL)
@@ -1316,24 +965,27 @@ int pc_calcstatus (struct map_session_data *sd, int first)
sd->cart_weight = 0;
sd->cart_max_num = MAX_CART;
sd->cart_num = 0;
- for (i = 0; i < MAX_CART; i++)
+ for (int i = 0; i < MAX_CART; i++)
{
if (sd->status.cart[i].nameid == 0)
continue;
sd->cart_weight +=
- itemdb_weight (sd->status.cart[i].nameid) *
+ itemdb_weight(sd->status.cart[i].nameid) *
sd->status.cart[i].amount;
sd->cart_num++;
}
}
- memset (sd->paramb, 0, sizeof (sd->paramb));
- memset (sd->parame, 0, sizeof (sd->parame));
+ for (auto& p : sd->paramb)
+ p = 0;
+ for (auto& p : sd->parame)
+ p = 0;
+
sd->hit = 0;
sd->flee = 0;
sd->flee2 = 0;
sd->critical = 0;
- sd->aspd = 0;
+ sd->aspd = interval_t::zero();
sd->watk = 0;
sd->def = 0;
sd->mdef = 0;
@@ -1344,8 +996,6 @@ int pc_calcstatus (struct map_session_data *sd, int first)
sd->status.max_sp = 0;
sd->attackrange = 0;
sd->attackrange_ = 0;
- sd->atk_ele = 0;
- sd->def_ele = 0;
sd->star = 0;
sd->overrefine = 0;
sd->matk1 = 0;
@@ -1353,33 +1003,17 @@ int pc_calcstatus (struct map_session_data *sd, int first)
sd->speed = DEFAULT_WALK_SPEED;
sd->hprate = 100;
sd->sprate = 100;
- sd->castrate = 100;
sd->dsprate = 100;
sd->base_atk = 0;
sd->arrow_atk = 0;
- sd->arrow_ele = 0;
sd->arrow_hit = 0;
sd->arrow_range = 0;
sd->nhealhp = sd->nhealsp = sd->nshealhp = sd->nshealsp = sd->nsshealhp =
sd->nsshealsp = 0;
- memset (sd->addele, 0, sizeof (sd->addele));
- memset (sd->addrace, 0, sizeof (sd->addrace));
- memset (sd->addsize, 0, sizeof (sd->addsize));
- memset (sd->addele_, 0, sizeof (sd->addele_));
- memset (sd->addrace_, 0, sizeof (sd->addrace_));
- memset (sd->addsize_, 0, sizeof (sd->addsize_));
- memset (sd->subele, 0, sizeof (sd->subele));
- memset (sd->subrace, 0, sizeof (sd->subrace));
- memset (sd->addeff, 0, sizeof (sd->addeff));
- memset (sd->addeff2, 0, sizeof (sd->addeff2));
- memset (sd->reseff, 0, sizeof (sd->reseff));
- memset (&sd->special_state, 0, sizeof (sd->special_state));
- memset (sd->weapon_coma_ele, 0, sizeof (sd->weapon_coma_ele));
- memset (sd->weapon_coma_race, 0, sizeof (sd->weapon_coma_race));
+ memset(&sd->special_state, 0, sizeof(sd->special_state));
sd->watk_ = 0; //二刀流用(仮)
sd->watk_2 = 0;
- sd->atk_ele_ = 0;
sd->star_ = 0;
sd->overrefine_ = 0;
@@ -1389,76 +1023,32 @@ int pc_calcstatus (struct map_session_data *sd, int first)
sd->sprecov_rate = 100;
sd->critical_def = 0;
sd->double_rate = 0;
- sd->near_attack_def_rate = sd->long_attack_def_rate = 0;
sd->atk_rate = sd->matk_rate = 100;
- sd->ignore_def_ele = sd->ignore_def_race = 0;
- sd->ignore_def_ele_ = sd->ignore_def_race_ = 0;
- sd->ignore_mdef_ele = sd->ignore_mdef_race = 0;
sd->arrow_cri = 0;
- sd->magic_def_rate = sd->misc_def_rate = 0;
- memset (sd->arrow_addele, 0, sizeof (sd->arrow_addele));
- memset (sd->arrow_addrace, 0, sizeof (sd->arrow_addrace));
- memset (sd->arrow_addsize, 0, sizeof (sd->arrow_addsize));
- memset (sd->arrow_addeff, 0, sizeof (sd->arrow_addeff));
- memset (sd->arrow_addeff2, 0, sizeof (sd->arrow_addeff2));
- memset (sd->magic_addele, 0, sizeof (sd->magic_addele));
- memset (sd->magic_addrace, 0, sizeof (sd->magic_addrace));
- memset (sd->magic_subrace, 0, sizeof (sd->magic_subrace));
sd->perfect_hit = 0;
sd->critical_rate = sd->hit_rate = sd->flee_rate = sd->flee2_rate = 100;
sd->def_rate = sd->def2_rate = sd->mdef_rate = sd->mdef2_rate = 100;
- sd->def_ratio_atk_ele = sd->def_ratio_atk_ele_ = 0;
- sd->def_ratio_atk_race = sd->def_ratio_atk_race_ = 0;
- sd->get_zeny_num = 0;
- sd->add_damage_class_count = sd->add_damage_class_count_ =
- sd->add_magic_damage_class_count = 0;
- sd->add_def_class_count = sd->add_mdef_class_count = 0;
- sd->monster_drop_item_count = 0;
- memset (sd->add_damage_classrate, 0, sizeof (sd->add_damage_classrate));
- memset (sd->add_damage_classrate_, 0, sizeof (sd->add_damage_classrate_));
- memset (sd->add_magic_damage_classrate, 0,
- sizeof (sd->add_magic_damage_classrate));
- memset (sd->add_def_classrate, 0, sizeof (sd->add_def_classrate));
- memset (sd->add_mdef_classrate, 0, sizeof (sd->add_mdef_classrate));
- memset (sd->monster_drop_race, 0, sizeof (sd->monster_drop_race));
- memset (sd->monster_drop_itemrate, 0, sizeof (sd->monster_drop_itemrate));
sd->speed_add_rate = sd->aspd_add_rate = 100;
- sd->double_add_rate = sd->perfect_hit_add = sd->get_zeny_add_num = 0;
- sd->splash_range = sd->splash_add_range = 0;
- sd->autospell_id = sd->autospell_lv = sd->autospell_rate = 0;
+ sd->double_add_rate = sd->perfect_hit_add = 0;
sd->hp_drain_rate = sd->hp_drain_per = sd->sp_drain_rate =
sd->sp_drain_per = 0;
sd->hp_drain_rate_ = sd->hp_drain_per_ = sd->sp_drain_rate_ =
sd->sp_drain_per_ = 0;
- sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0;
- sd->magic_damage_return = 0; //AppleGirl Was Here
- sd->random_attack_increase_add = sd->random_attack_increase_per = 0;
-
- if (!sd->disguiseflag && sd->disguise)
- {
- sd->disguise = 0;
- pc_set_weapon_look (sd);
- clif_changelook (&sd->bl, LOOK_SHIELD, sd->status.shield);
- clif_changelook (&sd->bl, LOOK_HEAD_BOTTOM, sd->status.head_bottom);
- clif_changelook (&sd->bl, LOOK_HEAD_TOP, sd->status.head_top);
- clif_changelook (&sd->bl, LOOK_HEAD_MID, sd->status.head_mid);
- clif_clearchar (&sd->bl, 9);
- pc_setpos (sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- }
sd->spellpower_bonus_target = 0;
- for (i = 0; i < 10; i++)
+ for (EQUIP i : EQUIPs_noarrow)
{
index = sd->equip_index[i];
if (index < 0)
continue;
- if (i == 9 && sd->equip_index[8] == index)
+ if (i == EQUIP::WEAPON && sd->equip_index[EQUIP::SHIELD] == index)
continue;
- if (i == 5 && sd->equip_index[4] == index)
+ if (i == EQUIP::TORSO && sd->equip_index[EQUIP::LEGS] == index)
continue;
- if (i == 6
- && (sd->equip_index[5] == index || sd->equip_index[4] == index))
+ if (i == EQUIP::HAT
+ && (sd->equip_index[EQUIP::TORSO] == index
+ || sd->equip_index[EQUIP::LEGS] == index))
continue;
if (sd->inventory_data[index])
@@ -1466,50 +1056,50 @@ int pc_calcstatus (struct map_session_data *sd, int first)
sd->spellpower_bonus_target +=
sd->inventory_data[index]->magic_bonus;
- if (sd->inventory_data[index]->type == 4)
+ if (sd->inventory_data[index]->type == ItemType::WEAPON)
{
if (sd->status.inventory[index].card[0] != 0x00ff
&& sd->status.inventory[index].card[0] != 0x00fe
&& sd->status.inventory[index].card[0] != (short) 0xff00)
{
- int j;
+ int j;
for (j = 0; j < sd->inventory_data[index]->slot; j++)
{ // カード
- int c = sd->status.inventory[index].card[j];
+ int c = sd->status.inventory[index].card[j];
if (c > 0)
{
argrec_t arg[2];
arg[0].name = "@slotId";
- arg[0].v.i = i;
+ arg[0].v.i = int(i);
arg[1].name = "@itemId";
arg[1].v.i = sd->inventory_data[index]->nameid;
- if (i == 8
- && sd->status.inventory[index].equip == 0x20)
+ if (i == EQUIP::SHIELD
+ && sd->status.inventory[index].equip == EPOS::SHIELD)
sd->state.lr_flag = 1;
- run_script_l (itemdb_equipscript (c), 0, sd->bl.id,
+ run_script_l(itemdb_equipscript(c), 0, sd->bl.id,
0, 2, arg);
sd->state.lr_flag = 0;
}
}
}
}
- else if (sd->inventory_data[index]->type == 5)
+ else if (sd->inventory_data[index]->type == ItemType::ARMOR)
{ // 防具
if (sd->status.inventory[index].card[0] != 0x00ff
&& sd->status.inventory[index].card[0] != 0x00fe
&& sd->status.inventory[index].card[0] != (short) 0xff00)
{
- int j;
+ int j;
for (j = 0; j < sd->inventory_data[index]->slot; j++)
{ // カード
- int c = sd->status.inventory[index].card[j];
+ int c = sd->status.inventory[index].card[j];
if (c > 0) {
argrec_t arg[2];
arg[0].name = "@slotId";
- arg[0].v.i = i;
+ arg[0].v.i = int(i);
arg[1].name = "@itemId";
arg[1].v.i = sd->inventory_data[index]->nameid;
- run_script_l (itemdb_equipscript (c), 0, sd->bl.id,
+ run_script_l(itemdb_equipscript(c), 0, sd->bl.id,
0, 2, arg);
}
}
@@ -1522,59 +1112,57 @@ int pc_calcstatus (struct map_session_data *sd, int first)
if (sd->spellpower_bonus_target < 0)
sd->spellpower_bonus_target =
(sd->spellpower_bonus_target * 256) /
- (MIN (128 + skill_power (sd, TMW_ASTRAL_SOUL), 256));
+ (min(128 + skill_power(sd, SkillID::TMW_ASTRAL_SOUL), 256));
#endif
if (sd->spellpower_bonus_target < sd->spellpower_bonus_current)
sd->spellpower_bonus_current = sd->spellpower_bonus_target;
- wele = sd->atk_ele;
- wele_ = sd->atk_ele_;
- def_ele = sd->def_ele;
- memcpy (sd->paramcard, sd->parame, sizeof (sd->paramcard));
+ sd->paramcard = sd->parame;
// 装備品によるステータス変化はここで実行
- for (i = 0; i < 10; i++)
+ for (EQUIP i : EQUIPs_noarrow)
{
index = sd->equip_index[i];
if (index < 0)
continue;
- if (i == 9 && sd->equip_index[8] == index)
+ if (i == EQUIP::WEAPON && sd->equip_index[EQUIP::SHIELD] == index)
continue;
- if (i == 5 && sd->equip_index[4] == index)
+ if (i == EQUIP::TORSO && sd->equip_index[EQUIP::LEGS] == index)
continue;
- if (i == 6
- && (sd->equip_index[5] == index || sd->equip_index[4] == index))
+ if (i == EQUIP::HAT
+ && (sd->equip_index[EQUIP::TORSO] == index
+ || sd->equip_index[EQUIP::LEGS] == index))
continue;
if (sd->inventory_data[index])
{
sd->def += sd->inventory_data[index]->def;
- if (sd->inventory_data[index]->type == 4)
+ if (sd->inventory_data[index]->type == ItemType::WEAPON)
{
- int r, wlv = sd->inventory_data[index]->wlv;
- if (i == 8 && sd->status.inventory[index].equip == 0x20)
+ int r;
+ if (i == EQUIP::SHIELD
+ && sd->status.inventory[index].equip == EPOS::SHIELD)
{
//二刀流用データ入力
sd->watk_ += sd->inventory_data[index]->atk;
sd->watk_2 = (r = sd->status.inventory[index].refine) * // 精錬攻撃力
- refinebonus[wlv][0];
- if ((r -= refinebonus[wlv][2]) > 0) // 過剰精錬ボーナス
- sd->overrefine_ = r * refinebonus[wlv][1];
+ 0;
+ if ((r -= 10) > 0) // 過剰精錬ボーナス
+ sd->overrefine_ = r * 0;
if (sd->status.inventory[index].card[0] == 0x00ff)
{ // 製造武器
sd->star_ = (sd->status.inventory[index].card[1] >> 8); // 星のかけら
- wele_ = (sd->status.inventory[index].card[1] & 0x0f); // 属 性
}
sd->attackrange_ += sd->inventory_data[index]->range;
sd->state.lr_flag = 1;
{
argrec_t arg[2];
arg[0].name = "@slotId";
- arg[0].v.i = i;
+ arg[0].v.i = int(i);
arg[1].name = "@itemId";
arg[1].v.i = sd->inventory_data[index]->nameid;
- run_script_l (sd->inventory_data[index]->equip_script, 0,
+ run_script_l(sd->inventory_data[index]->equip_script, 0,
sd->bl.id, 0, 2, arg);
}
sd->state.lr_flag = 0;
@@ -1583,61 +1171,60 @@ int pc_calcstatus (struct map_session_data *sd, int first)
{ //二刀流武器以外
argrec_t arg[2];
arg[0].name = "@slotId";
- arg[0].v.i = i;
+ arg[0].v.i = int(i);
arg[1].name = "@itemId";
arg[1].v.i = sd->inventory_data[index]->nameid;
sd->watk += sd->inventory_data[index]->atk;
sd->watk2 += (r = sd->status.inventory[index].refine) * // 精錬攻撃力
- refinebonus[wlv][0];
- if ((r -= refinebonus[wlv][2]) > 0) // 過剰精錬ボーナス
- sd->overrefine += r * refinebonus[wlv][1];
+ 0;
+ if ((r -= 10) > 0) // 過剰精錬ボーナス
+ sd->overrefine += r * 0;
if (sd->status.inventory[index].card[0] == 0x00ff)
{ // 製造武器
sd->star += (sd->status.inventory[index].card[1] >> 8); // 星のかけら
- wele = (sd->status.inventory[index].card[1] & 0x0f); // 属 性
}
sd->attackrange += sd->inventory_data[index]->range;
- run_script_l (sd->inventory_data[index]->equip_script, 0,
+ run_script_l(sd->inventory_data[index]->equip_script, 0,
sd->bl.id, 0, 2, arg);
}
}
- else if (sd->inventory_data[index]->type == 5)
+ else if (sd->inventory_data[index]->type == ItemType::ARMOR)
{
argrec_t arg[2];
arg[0].name = "@slotId";
- arg[0].v.i = i;
+ arg[0].v.i = int(i);
arg[1].name = "@itemId";
arg[1].v.i = sd->inventory_data[index]->nameid;
sd->watk += sd->inventory_data[index]->atk;
refinedef +=
- sd->status.inventory[index].refine * refinebonus[0][0];
- run_script_l (sd->inventory_data[index]->equip_script, 0,
+ sd->status.inventory[index].refine * 0;
+ run_script_l(sd->inventory_data[index]->equip_script, 0,
sd->bl.id, 0, 2, arg);
}
}
}
- if (battle_is_unarmed (&sd->bl))
+ if (battle_is_unarmed(&sd->bl))
{
- sd->watk += skill_power (sd, TMW_BRAWLING) / 3; // +66 for 200
- sd->watk2 += skill_power (sd, TMW_BRAWLING) >> 3; // +25 for 200
- sd->watk_ += skill_power (sd, TMW_BRAWLING) / 3; // +66 for 200
- sd->watk_2 += skill_power (sd, TMW_BRAWLING) >> 3; // +25 for 200
+ sd->watk += skill_power(sd, SkillID::TMW_BRAWLING) / 3; // +66 for 200
+ sd->watk2 += skill_power(sd, SkillID::TMW_BRAWLING) >> 3; // +25 for 200
+ sd->watk_ += skill_power(sd, SkillID::TMW_BRAWLING) / 3; // +66 for 200
+ sd->watk_2 += skill_power(sd, SkillID::TMW_BRAWLING) >> 3; // +25 for 200
}
- if (sd->equip_index[10] >= 0)
+ if (sd->equip_index[EQUIP::ARROW] >= 0)
{ // 矢
- index = sd->equip_index[10];
+ index = sd->equip_index[EQUIP::ARROW];
if (sd->inventory_data[index])
{ //まだ属性が入っていない
argrec_t arg[2];
arg[0].name = "@slotId";
- arg[0].v.i = i;
+ arg[0].v.i = int(EQUIP::ARROW);
arg[1].name = "@itemId";
arg[1].v.i = sd->inventory_data[index]->nameid;
sd->state.lr_flag = 2;
- run_script_l (sd->inventory_data[index]->equip_script, 0, sd->bl.id,
+ run_script_l(sd->inventory_data[index]->equip_script, 0, sd->bl.id,
0, 2, arg);
sd->state.lr_flag = 0;
sd->arrow_atk += sd->inventory_data[index]->atk;
@@ -1651,145 +1238,44 @@ int pc_calcstatus (struct map_session_data *sd, int first)
sd->attackrange_ = 1;
if (sd->attackrange < sd->attackrange_)
sd->attackrange = sd->attackrange_;
- if (sd->status.weapon == 11)
+ if (sd->status.weapon == ItemLook::BOW)
sd->attackrange += sd->arrow_range;
- if (wele > 0)
- sd->atk_ele = wele;
- if (wele_ > 0)
- sd->atk_ele_ = wele_;
- if (def_ele > 0)
- sd->def_ele = def_ele;
sd->double_rate += sd->double_add_rate;
sd->perfect_hit += sd->perfect_hit_add;
- sd->get_zeny_num += sd->get_zeny_add_num;
- sd->splash_range += sd->splash_add_range;
if (sd->speed_add_rate != 100)
sd->speed_rate += sd->speed_add_rate - 100;
if (sd->aspd_add_rate != 100)
sd->aspd_rate += sd->aspd_add_rate - 100;
- // 武器ATKサイズ補正 (右手)
- sd->atkmods[0] = atkmods[0][sd->weapontype1];
- sd->atkmods[1] = atkmods[1][sd->weapontype1];
- sd->atkmods[2] = atkmods[2][sd->weapontype1];
- //武器ATKサイズ補正 (左手)
- sd->atkmods_[0] = atkmods[0][sd->weapontype2];
- sd->atkmods_[1] = atkmods[1][sd->weapontype2];
- sd->atkmods_[2] = atkmods[2][sd->weapontype2];
-
-/*
- // jobボーナス分
- for(i=0;i<sd->status.job_level && i<MAX_LEVEL;i++){
- if(job_bonus[s_class.upper][s_class.job][i])
- sd->paramb[job_bonus[s_class.upper][s_class.job][i]-1]++;
- }
-*/
-
- if ((skill = pc_checkskill (sd, MC_INCCARRY)) > 0) // skill can be used with an item now, thanks to orn [Valaris]
- sd->max_weight += skill * 1000;
-
- // ステータス変化による基本パラメータ補正
- if (sd->sc_count)
- {
- if (sd->sc_data[SC_CONCENTRATE].timer != -1
- && sd->sc_data[SC_QUAGMIRE].timer == -1)
- { // 集中力向上
- sd->paramb[1] +=
- (sd->status.agi + sd->paramb[1] + sd->parame[1] -
- sd->paramcard[1]) * (2 +
- sd->sc_data[SC_CONCENTRATE].val1) / 100;
- sd->paramb[4] +=
- (sd->status.dex + sd->paramb[4] + sd->parame[4] -
- sd->paramcard[4]) * (2 +
- sd->sc_data[SC_CONCENTRATE].val1) / 100;
- }
- if (sd->sc_data[SC_INCREASEAGI].timer != -1
- && sd->sc_data[SC_QUAGMIRE].timer == -1
- && sd->sc_data[SC_DONTFORGETME].timer == -1)
- { // 速度増加
- sd->paramb[1] += 2 + sd->sc_data[SC_INCREASEAGI].val1;
- sd->speed -= sd->speed * 25 / 100;
- }
- if (sd->sc_data[SC_DECREASEAGI].timer != -1) // 速度減少(agiはbattle.cで)
- sd->speed = sd->speed * 125 / 100;
- if (sd->sc_data[SC_CLOAKING].timer != -1)
- sd->speed =
- (sd->speed * (76 + (sd->sc_data[SC_INCREASEAGI].val1 * 3))) /
- 100;
- if (sd->sc_data[SC_BLESSING].timer != -1)
- { // ブレッシング
- sd->paramb[0] += sd->sc_data[SC_BLESSING].val1;
- sd->paramb[3] += sd->sc_data[SC_BLESSING].val1;
- sd->paramb[4] += sd->sc_data[SC_BLESSING].val1;
- }
- if (sd->sc_data[SC_GLORIA].timer != -1) // グロリア
- sd->paramb[5] += 30;
- if (sd->sc_data[SC_LOUD].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1) // ラウドボイス
- sd->paramb[0] += 4;
- if (sd->sc_data[SC_QUAGMIRE].timer != -1)
- { // クァグマイア
- sd->speed = sd->speed * 3 / 2;
- sd->paramb[1] -=
- (sd->status.agi + sd->paramb[1] + sd->parame[1]) / 2;
- sd->paramb[4] -=
- (sd->status.dex + sd->paramb[4] + sd->parame[4]) / 2;
- }
- if (sd->sc_data[SC_TRUESIGHT].timer != -1)
- { // トゥルーサイト
- sd->paramb[0] += 5;
- sd->paramb[1] += 5;
- sd->paramb[2] += 5;
- sd->paramb[3] += 5;
- sd->paramb[4] += 5;
- sd->paramb[5] += 5;
- }
- }
- sd->speed -= skill_power (sd, TMW_SPEED) >> 3;
- sd->aspd_rate -= skill_power (sd, TMW_SPEED) / 10;
+ sd->speed -= std::chrono::milliseconds(skill_power(sd, SkillID::TMW_SPEED) / 8);
+ sd->aspd_rate -= skill_power(sd, SkillID::TMW_SPEED) / 10;
if (sd->aspd_rate < 20)
sd->aspd_rate = 20;
-/*
- //1度も死んでないJob70スパノビに+10
- if(s_class.job == 23 && sd->die_counter == 0 && sd->status.job_level >= 70){
- sd->paramb[0]+= 15;
- sd->paramb[1]+= 15;
- sd->paramb[2]+= 15;
- sd->paramb[3]+= 15;
- sd->paramb[4]+= 15;
- sd->paramb[5]+= 15;
- }
-*/
- sd->paramc[0] = sd->status.str + sd->paramb[0] + sd->parame[0];
- sd->paramc[1] = sd->status.agi + sd->paramb[1] + sd->parame[1];
- sd->paramc[2] = sd->status.vit + sd->paramb[2] + sd->parame[2];
- sd->paramc[3] = sd->status.int_ + sd->paramb[3] + sd->parame[3];
- sd->paramc[4] = sd->status.dex + sd->paramb[4] + sd->parame[4];
- sd->paramc[5] = sd->status.luk + sd->paramb[5] + sd->parame[5];
- for (i = 0; i < 6; i++)
- if (sd->paramc[i] < 0)
- sd->paramc[i] = 0;
-
- if (sd->status.weapon == 11 || sd->status.weapon == 13
- || sd->status.weapon == 14)
- {
- str = sd->paramc[4];
- dex = sd->paramc[0];
+ for (ATTR attr : ATTRs)
+ sd->paramc[attr] = max(0, sd->status.attrs[attr] + sd->paramb[attr] + sd->parame[attr]);
+
+ if (sd->status.weapon == ItemLook::BOW
+ || sd->status.weapon == ItemLook::_13
+ || sd->status.weapon == ItemLook::_14)
+ {
+ str = sd->paramc[ATTR::DEX];
+ dex = sd->paramc[ATTR::STR];
}
else
{
- str = sd->paramc[0];
- dex = sd->paramc[4];
+ str = sd->paramc[ATTR::STR];
+ dex = sd->paramc[ATTR::DEX];
sd->critical += ((dex * 3) >> 1);
}
dstr = str / 10;
- sd->base_atk += str + dstr * dstr + dex / 5 + sd->paramc[5] / 5;
-//fprintf(stderr, "baseatk = %d = x + %d + %d + %d + %d\n", sd->base_atk, str, dstr*dstr, dex/5, sd->paramc[5]/5);
- sd->matk1 += sd->paramc[3] + (sd->paramc[3] / 5) * (sd->paramc[3] / 5);
- sd->matk2 += sd->paramc[3] + (sd->paramc[3] / 7) * (sd->paramc[3] / 7);
+ sd->base_atk += str + dstr * dstr + dex / 5 + sd->paramc[ATTR::LUK] / 5;
+//FPRINTF(stderr, "baseatk = %d = x + %d + %d + %d + %d\n", sd->base_atk, str, dstr*dstr, dex/5, sd->paramc[ATTR::LUK]/5);
+ sd->matk1 += sd->paramc[ATTR::INT] + (sd->paramc[ATTR::INT] / 5) * (sd->paramc[ATTR::INT] / 5);
+ sd->matk2 += sd->paramc[ATTR::INT] + (sd->paramc[ATTR::INT] / 7) * (sd->paramc[ATTR::INT] / 7);
if (sd->matk1 < sd->matk2)
{
- int temp = sd->matk2;
+ int temp = sd->matk2;
sd->matk2 = sd->matk1;
sd->matk1 = temp;
}
@@ -1798,26 +1284,26 @@ int pc_calcstatus (struct map_session_data *sd, int first)
#ifdef USE_ASTRAL_SOUL_SKILL
if (sd->matk1 > MAGIC_SKILL_THRESHOLD)
{
- int bonus = sd->matk1 - MAGIC_SKILL_THRESHOLD;
+ int bonus = sd->matk1 - MAGIC_SKILL_THRESHOLD;
// Ok if you are above a certain threshold, you get only (1/8) of that matk1
// if you have Astral soul skill you can get the whole power again (and additionally the 1/8 added)
- sd->matk1 = MAGIC_SKILL_THRESHOLD + (bonus>>3) + ((3*bonus*skill_power(sd, TMW_ASTRAL_SOUL))>>9);
+ sd->matk1 = MAGIC_SKILL_THRESHOLD + (bonus>>3) + ((3*bonus*skill_power(sd, SkillID::TMW_ASTRAL_SOUL))>>9);
}
#endif
sd->matk2 = 0;
if (sd->matk1 < 0)
sd->matk1 = 0;
- sd->hit += sd->paramc[4] + sd->status.base_level;
- sd->flee += sd->paramc[1] + sd->status.base_level;
- sd->def2 += sd->paramc[2];
- sd->mdef2 += sd->paramc[3];
- sd->flee2 += sd->paramc[5] + 10;
- sd->critical += (sd->paramc[5] * 3) + 10;
+ sd->hit += sd->paramc[ATTR::DEX] + sd->status.base_level;
+ sd->flee += sd->paramc[ATTR::AGI] + sd->status.base_level;
+ sd->def2 += sd->paramc[ATTR::VIT];
+ sd->mdef2 += sd->paramc[ATTR::INT];
+ sd->flee2 += sd->paramc[ATTR::LUK] + 10;
+ sd->critical += (sd->paramc[ATTR::LUK] * 3) + 10;
// 200 is the maximum of the skill
// def2 is the defence gained by vit, whereas "def", which is gained by armor, stays as is
- int spbsk = skill_power (sd, TMW_RAGING);
+ int spbsk = skill_power(sd, SkillID::TMW_RAGING);
if (spbsk != 0 && sd->attackrange <= 2)
{
sd->critical += sd->critical * spbsk / 100;
@@ -1860,147 +1346,67 @@ int pc_calcstatus (struct map_session_data *sd, int first)
sd->mdef2 = 1;
// 二刀流 ASPD 修正
- if (sd->status.weapon <= 16)
- sd->aspd +=
- aspd_base[s_class.job][sd->status.weapon] - (sd->paramc[1] * 4 +
- sd->paramc[4]) *
- aspd_base[s_class.job][sd->status.weapon] / 1000;
+ if (sd->status.weapon < ItemLook::SINGLE_HANDED_COUNT)
+ sd->aspd += aspd_base_0[sd->status.weapon]
+ - (sd->paramc[ATTR::AGI] * 4 + sd->paramc[ATTR::DEX])
+ * aspd_base_0[sd->status.weapon] / 1000;
else
- sd->aspd += ((aspd_base[s_class.job][sd->weapontype1] -
- (sd->paramc[1] * 4 +
- sd->paramc[4]) *
- aspd_base[s_class.job][sd->weapontype1] / 1000) +
- (aspd_base[s_class.job][sd->weapontype2] -
- (sd->paramc[1] * 4 +
- sd->paramc[4]) *
- aspd_base[s_class.job][sd->weapontype2] / 1000)) * 140 /
- 200;
+ sd->aspd += (
+ (aspd_base_0[sd->weapontype1]
+ - (sd->paramc[ATTR::AGI] * 4 + sd->paramc[ATTR::DEX])
+ * aspd_base_0[sd->weapontype1] / 1000)
+ + (aspd_base_0[sd->weapontype2]
+ - (sd->paramc[ATTR::AGI] * 4 + sd->paramc[ATTR::DEX])
+ * aspd_base_0[sd->weapontype2] / 1000)
+ )
+ * 140 / 200;
aspd_rate = sd->aspd_rate;
//攻撃速度増加
- 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?
- 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 (sd->status.option & 2 && (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)
{
- if (sd->sc_data[SC_WINDWALK].timer != -1) //ウィンドウォーク時はLv*2%減算
- sd->speed -=
- sd->speed * (sd->sc_data[SC_WINDWALK].val1 * 2) / 100;
- if (sd->sc_data[SC_CARTBOOST].timer != -1) // カートブースト
- sd->speed -= (DEFAULT_WALK_SPEED * 20) / 100;
- if (sd->sc_data[SC_BERSERK].timer != -1) //バーサーク中はIAと同じぐらい速い?
- sd->speed -= sd->speed * 25 / 100;
- if (sd->sc_data[SC_WEDDING].timer != -1) //結婚中は歩くのが遅い
- sd->speed = 2 * DEFAULT_WALK_SPEED;
+ // [fate] ranged weapon?
+ sd->attackrange += min(skill_power(sd, SkillID::AC_OWL) / 60, 3);
+ sd->hit += skill_power(sd, SkillID::AC_OWL) / 10; // 20 for 200
}
- 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;
+ sd->max_weight += 1000;
bl = sd->status.base_level;
- sd->status.max_hp +=
- (3500 + bl * hp_coefficient2[s_class.job] +
- hp_sigma_val[s_class.job][(bl > 0) ? bl - 1 : 0]) / 100 * (100 +
- sd->paramc
- [2]) /
- 100 + (sd->parame[2] - sd->paramcard[2]);
- if (s_class.upper == 1) // [MouseJstr]
- sd->status.max_hp = sd->status.max_hp * 130 / 100;
+ sd->status.max_hp += (
+ 3500
+ + bl * hp_coefficient2_0
+ + hp_sigma_val_0[(bl > 0) ? bl - 1 : 0]
+ ) / 100 * (100 + sd->paramc[ATTR::VIT]) / 100
+ + (sd->parame[ATTR::VIT] - sd->paramcard[ATTR::VIT]);
if (sd->hprate != 100)
sd->status.max_hp = sd->status.max_hp * sd->hprate / 100;
- if (sd->sc_data && sd->sc_data[SC_BERSERK].timer != -1)
- { // バーサーク
- sd->status.max_hp = sd->status.max_hp * 3;
- sd->status.hp = sd->status.hp * 3;
- if (sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
- sd->status.max_hp = battle_config.max_hp;
- if (sd->status.hp > battle_config.max_hp) // removed negative max hp bug by Valaris
- sd->status.hp = battle_config.max_hp;
- }
- if (s_class.job == 23 && sd->status.base_level >= 99)
- {
- sd->status.max_hp = sd->status.max_hp + 2000;
- }
-
if (sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
sd->status.max_hp = battle_config.max_hp;
if (sd->status.max_hp <= 0)
sd->status.max_hp = 1; // end
// 最大SP計算
- sd->status.max_sp +=
- ((sp_coefficient[s_class.job] * bl) + 1000) / 100 * (100 +
- sd->paramc[3]) /
- 100 + (sd->parame[3] - sd->paramcard[3]);
- if (s_class.upper == 1) // [MouseJstr]
- sd->status.max_sp = sd->status.max_sp * 130 / 100;
+ sd->status.max_sp += ((sp_coefficient_0 * bl) + 1000)
+ / 100 * (100 + sd->paramc[ATTR::INT]) / 100
+ + (sd->parame[ATTR::INT] - sd->paramcard[ATTR::INT]);
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[2] / 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;
- }
+ sd->nhealhp = 1 + (sd->paramc[ATTR::VIT] / 5) + (sd->status.max_hp / 200);
//自然回復SP
- sd->nhealsp = 1 + (sd->paramc[3] / 6) + (sd->status.max_sp / 100);
- if (sd->paramc[3] >= 120)
- sd->nhealsp += ((sd->paramc[3] - 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;
- }
+ 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, 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;
@@ -2013,371 +1419,47 @@ 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)
{
// ATK/DEF変化形
- if (sd->sc_data[SC_ANGELUS].timer != -1) // エンジェラス
- sd->def2 =
- sd->def2 * (110 + 5 * sd->sc_data[SC_ANGELUS].val1) / 100;
- if (sd->sc_data[SC_IMPOSITIO].timer != -1)
- { // インポシティオマヌス
- sd->watk += sd->sc_data[SC_IMPOSITIO].val1 * 5;
- index = sd->equip_index[8];
- if (index >= 0 && sd->inventory_data[index]
- && sd->inventory_data[index]->type == 4)
- sd->watk_ += sd->sc_data[SC_IMPOSITIO].val1 * 5;
- }
- if (sd->sc_data[SC_PROVOKE].timer != -1)
- { // プロボック
- sd->def2 =
- sd->def2 * (100 - 6 * sd->sc_data[SC_PROVOKE].val1) / 100;
- sd->base_atk =
- sd->base_atk * (100 + 2 * sd->sc_data[SC_PROVOKE].val1) / 100;
- sd->watk =
- sd->watk * (100 + 2 * sd->sc_data[SC_PROVOKE].val1) / 100;
- index = sd->equip_index[8];
- if (index >= 0 && sd->inventory_data[index]
- && sd->inventory_data[index]->type == 4)
- sd->watk_ =
- sd->watk_ * (100 +
- 2 * sd->sc_data[SC_PROVOKE].val1) / 100;
- }
- if (sd->sc_data[SC_ENDURE].timer != -1)
- sd->mdef2 += sd->sc_data[SC_ENDURE].val1;
- if (sd->sc_data[SC_MINDBREAKER].timer != -1)
- { // プロボック
- sd->mdef2 =
- sd->mdef2 * (100 -
- 6 * sd->sc_data[SC_MINDBREAKER].val1) / 100;
- sd->matk1 =
- sd->matk1 * (100 +
- 2 * sd->sc_data[SC_MINDBREAKER].val1) / 100;
- sd->matk2 =
- sd->matk2 * (100 +
- 2 * sd->sc_data[SC_MINDBREAKER].val1) / 100;
- }
- if (sd->sc_data[SC_POISON].timer != -1) // 毒状態
+ if (sd->sc_data[StatusChange::SC_POISON].timer) // 毒状態
sd->def2 = sd->def2 * 75 / 100;
- if (sd->sc_data[SC_DRUMBATTLE].timer != -1)
- { // 戦太鼓の響き
- sd->watk += sd->sc_data[SC_DRUMBATTLE].val2;
- sd->def += sd->sc_data[SC_DRUMBATTLE].val3;
- index = sd->equip_index[8];
- if (index >= 0 && sd->inventory_data[index]
- && sd->inventory_data[index]->type == 4)
- sd->watk_ += sd->sc_data[SC_DRUMBATTLE].val2;
- }
- if (sd->sc_data[SC_NIBELUNGEN].timer != -1)
- { // ニーベルングの指輪
- index = sd->equip_index[9];
- if (index >= 0 && sd->inventory_data[index]
- && sd->inventory_data[index]->wlv == 3)
- sd->watk += sd->sc_data[SC_NIBELUNGEN].val3;
- index = sd->equip_index[8];
- if (index >= 0 && sd->inventory_data[index]
- && sd->inventory_data[index]->wlv == 3)
- sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val3;
- if (index >= 0 && sd->inventory_data[index]
- && sd->inventory_data[index]->wlv == 4)
- sd->watk += sd->sc_data[SC_NIBELUNGEN].val2;
- index = sd->equip_index[8];
- if (index >= 0 && sd->inventory_data[index]
- && sd->inventory_data[index]->wlv == 4)
- sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val2;
- }
-
- if (sd->sc_data[SC_VOLCANO].timer != -1 && sd->def_ele == 3)
- { // ボルケーノ
- sd->watk += sd->sc_data[SC_VIOLENTGALE].val3;
- }
-
- if (sd->sc_data[SC_SIGNUMCRUCIS].timer != -1)
- sd->def =
- sd->def * (100 - sd->sc_data[SC_SIGNUMCRUCIS].val2) / 100;
- if (sd->sc_data[SC_ETERNALCHAOS].timer != -1) // エターナルカオス
- sd->def = 0;
-
- if (sd->sc_data[SC_CONCENTRATION].timer != -1)
- { //コンセントレーション
- sd->watk =
- sd->watk * (100 +
- 5 * sd->sc_data[SC_CONCENTRATION].val1) / 100;
- index = sd->equip_index[8];
- if (index >= 0 && sd->inventory_data[index]
- && sd->inventory_data[index]->type == 4)
- sd->watk_ =
- sd->watk * (100 +
- 5 * sd->sc_data[SC_CONCENTRATION].val1) / 100;
- sd->def =
- sd->def * (100 -
- 5 * sd->sc_data[SC_CONCENTRATION].val1) / 100;
- }
- if (sd->sc_data[SC_MAGICPOWER].timer != -1)
- { //魔法力増幅
- sd->matk1 =
- sd->matk1 * (100 + 2 * sd->sc_data[SC_MAGICPOWER].val1) / 100;
- sd->matk2 =
- sd->matk2 * (100 + 2 * sd->sc_data[SC_MAGICPOWER].val1) / 100;
- }
- if (sd->sc_data[SC_ATKPOT].timer != -1)
- sd->watk += sd->sc_data[SC_ATKPOT].val1;
- if (sd->sc_data[SC_MATKPOT].timer != -1)
+ if (sd->sc_data[StatusChange::SC_ATKPOT].timer)
+ sd->watk += sd->sc_data[StatusChange::SC_ATKPOT].val1;
+ if (sd->sc_data[StatusChange::SC_MATKPOT].timer)
{
- sd->matk1 += sd->sc_data[SC_MATKPOT].val1;
- sd->matk2 += sd->sc_data[SC_MATKPOT].val1;
+ sd->matk1 += sd->sc_data[StatusChange::SC_MATKPOT].val1;
+ sd->matk2 += sd->sc_data[StatusChange::SC_MATKPOT].val1;
}
- // ASPD/移動速度変化系
- if (sd->sc_data[SC_TWOHANDQUICKEN].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
- aspd_rate -= 30;
- if (sd->sc_data[SC_ADRENALINE].timer != -1
- && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1
- && sd->sc_data[SC_QUAGMIRE].timer == -1
- && sd->sc_data[SC_DONTFORGETME].timer == -1)
- { // アドレナリンラッシュ
- if (sd->sc_data[SC_ADRENALINE].val2
- || !battle_config.party_skill_penaly)
- aspd_rate -= 30;
- else
- aspd_rate -= 25;
- }
- if (sd->sc_data[SC_SPEARSQUICKEN].timer != -1 && sd->sc_data[SC_ADRENALINE].timer == -1 && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン
- aspd_rate -= sd->sc_data[SC_SPEARSQUICKEN].val2;
- if (sd->sc_data[SC_ASSNCROS].timer != -1 && // 夕陽のアサシンクロス
- sd->sc_data[SC_TWOHANDQUICKEN].timer == -1
- && sd->sc_data[SC_ADRENALINE].timer == -1
- && sd->sc_data[SC_SPEARSQUICKEN].timer == -1
- && sd->sc_data[SC_DONTFORGETME].timer == -1)
- aspd_rate -=
- 5 + sd->sc_data[SC_ASSNCROS].val1 +
- sd->sc_data[SC_ASSNCROS].val2 + sd->sc_data[SC_ASSNCROS].val3;
- if (sd->sc_data[SC_DONTFORGETME].timer != -1)
- { // 私を忘れないで
- aspd_rate +=
- sd->sc_data[SC_DONTFORGETME].val1 * 3 +
- sd->sc_data[SC_DONTFORGETME].val2 +
- (sd->sc_data[SC_DONTFORGETME].val3 >> 16);
- sd->speed =
- sd->speed * (100 + sd->sc_data[SC_DONTFORGETME].val1 * 2 +
- sd->sc_data[SC_DONTFORGETME].val2 +
- (sd->sc_data[SC_DONTFORGETME].val3 & 0xffff)) /
- 100;
- }
- if (sd->sc_data[i = SC_SPEEDPOTION2].timer != -1 || sd->sc_data[i = SC_SPEEDPOTION1].timer != -1 || sd->sc_data[i = SC_SPEEDPOTION0].timer != -1) // 増 速ポーション
- aspd_rate -= sd->sc_data[i].val1;
+ if (sd->sc_data[StatusChange::SC_SPEEDPOTION0].timer)
+ aspd_rate -= sd->sc_data[StatusChange::SC_SPEEDPOTION0].val1;
- if (sd->sc_data[SC_HASTE].timer != -1)
- aspd_rate -= sd->sc_data[SC_HASTE].val1;
+ if (sd->sc_data[StatusChange::SC_HASTE].timer)
+ aspd_rate -= sd->sc_data[StatusChange::SC_HASTE].val1;
/* Slow down if protected */
- if (sd->sc_data[SC_PHYS_SHIELD].timer != -1)
- aspd_rate += sd->sc_data[SC_PHYS_SHIELD].val1;
-
- // HIT/FLEE変化系
- if (sd->sc_data[SC_WHISTLE].timer != -1)
- { // 口笛
- sd->flee += sd->flee * (sd->sc_data[SC_WHISTLE].val1
- + sd->sc_data[SC_WHISTLE].val2 +
- (sd->sc_data[SC_WHISTLE].val3 >> 16)) /
- 100;
- sd->flee2 +=
- (sd->sc_data[SC_WHISTLE].val1 + sd->sc_data[SC_WHISTLE].val2 +
- (sd->sc_data[SC_WHISTLE].val3 & 0xffff)) * 10;
- }
- if (sd->sc_data[SC_HUMMING].timer != -1) // ハミング
- sd->hit +=
- (sd->sc_data[SC_HUMMING].val1 * 2 +
- sd->sc_data[SC_HUMMING].val2 +
- sd->sc_data[SC_HUMMING].val3) * sd->hit / 100;
- if (sd->sc_data[SC_VIOLENTGALE].timer != -1 && sd->def_ele == 4)
- { // バイオレントゲイル
- sd->flee += sd->flee * sd->sc_data[SC_VIOLENTGALE].val3 / 100;
- }
- if (sd->sc_data[SC_BLIND].timer != -1)
- { // 暗黒
- sd->hit -= sd->hit * 25 / 100;
- sd->flee -= sd->flee * 25 / 100;
- }
- if (sd->sc_data[SC_WINDWALK].timer != -1) // ウィンドウォーク
- sd->flee += sd->flee * (sd->sc_data[SC_WINDWALK].val2) / 100;
- if (sd->sc_data[SC_SPIDERWEB].timer != -1) //スパイダーウェブ
- sd->flee -= sd->flee * 50 / 100;
- if (sd->sc_data[SC_TRUESIGHT].timer != -1) //トゥルーサイト
- sd->hit += 3 * (sd->sc_data[SC_TRUESIGHT].val1);
- if (sd->sc_data[SC_CONCENTRATION].timer != -1) //コンセントレーション
- sd->hit += (10 * (sd->sc_data[SC_CONCENTRATION].val1));
-
- // 耐性
- if (sd->sc_data[SC_SIEGFRIED].timer != -1)
- { // 不死身のジークフリード
- sd->subele[1] += sd->sc_data[SC_SIEGFRIED].val2; // 水
- sd->subele[2] += sd->sc_data[SC_SIEGFRIED].val2; // 水
- sd->subele[3] += sd->sc_data[SC_SIEGFRIED].val2; // 水
- sd->subele[4] += sd->sc_data[SC_SIEGFRIED].val2; // 水
- sd->subele[5] += sd->sc_data[SC_SIEGFRIED].val2; // 水
- sd->subele[6] += sd->sc_data[SC_SIEGFRIED].val2; // 水
- sd->subele[7] += sd->sc_data[SC_SIEGFRIED].val2; // 水
- sd->subele[8] += sd->sc_data[SC_SIEGFRIED].val2; // 水
- sd->subele[9] += sd->sc_data[SC_SIEGFRIED].val2; // 水
- }
- if (sd->sc_data[SC_PROVIDENCE].timer != -1)
- { // プロヴィデンス
- sd->subele[6] += sd->sc_data[SC_PROVIDENCE].val2; // 対 聖属性
- sd->subrace[6] += sd->sc_data[SC_PROVIDENCE].val2; // 対 悪魔
- }
-
- // その他
- if (sd->sc_data[SC_APPLEIDUN].timer != -1)
- { // イドゥンの林檎
- sd->status.max_hp +=
- ((5 + sd->sc_data[SC_APPLEIDUN].val1 * 2 +
- ((sd->sc_data[SC_APPLEIDUN].val2 + 1) >> 1) +
- sd->sc_data[SC_APPLEIDUN].val3 / 10) * sd->status.max_hp) /
- 100;
- if (sd->status.max_hp < 0
- || sd->status.max_hp > battle_config.max_hp)
- sd->status.max_hp = battle_config.max_hp;
- }
- if (sd->sc_data[SC_DELUGE].timer != -1 && sd->def_ele == 1)
- { // デリュージ
- sd->status.max_hp +=
- sd->status.max_hp * sd->sc_data[SC_DELUGE].val3 / 100;
- if (sd->status.max_hp < 0
- || sd->status.max_hp > battle_config.max_hp)
- sd->status.max_hp = battle_config.max_hp;
- }
- if (sd->sc_data[SC_SERVICE4U].timer != -1)
- { // サービスフォーユー
- sd->status.max_sp +=
- sd->status.max_sp * (10 + sd->sc_data[SC_SERVICE4U].val1 +
- sd->sc_data[SC_SERVICE4U].val2 +
- sd->sc_data[SC_SERVICE4U].val3) / 100;
- if (sd->status.max_sp < 0
- || sd->status.max_sp > battle_config.max_sp)
- sd->status.max_sp = battle_config.max_sp;
- sd->dsprate -=
- (10 + sd->sc_data[SC_SERVICE4U].val1 * 3 +
- sd->sc_data[SC_SERVICE4U].val2 +
- sd->sc_data[SC_SERVICE4U].val3);
- if (sd->dsprate < 0)
- sd->dsprate = 0;
- }
-
- if (sd->sc_data[SC_FORTUNE].timer != -1) // 幸運のキス
- sd->critical +=
- (10 + sd->sc_data[SC_FORTUNE].val1 +
- sd->sc_data[SC_FORTUNE].val2 +
- sd->sc_data[SC_FORTUNE].val3) * 10;
-
- if (sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1)
- { // 爆裂波動
- if (s_class.job == 23)
- sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val1 * 100;
- else
- sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val2;
- }
-
- if (sd->sc_data[SC_STEELBODY].timer != -1)
- { // 金剛
- sd->def = 90;
- sd->mdef = 90;
- aspd_rate += 25;
- sd->speed = (sd->speed * 125) / 100;
- }
- if (sd->sc_data[SC_DEFENDER].timer != -1)
- {
- sd->aspd += (550 - sd->sc_data[SC_DEFENDER].val1 * 50);
- sd->speed =
- (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1 * 5)) / 100;
- }
- if (sd->sc_data[SC_ENCPOISON].timer != -1)
- sd->addeff[4] += sd->sc_data[SC_ENCPOISON].val2;
-
- if (sd->sc_data[SC_DANCING].timer != -1)
- { // 演奏/ダンス使用中
- sd->speed *= 4;
- sd->nhealsp = 0;
- sd->nshealsp = 0;
- sd->nsshealsp = 0;
- }
- if (sd->sc_data[SC_CURSE].timer != -1)
- sd->speed += 450;
-
- if (sd->sc_data[SC_TRUESIGHT].timer != -1) //トゥルーサイト
- sd->critical +=
- sd->critical * (sd->sc_data[SC_TRUESIGHT].val1) / 100;
-
-/* if(sd->sc_data[SC_VOLCANO].timer!=-1) // エンチャントポイズン(属性はbattle.cで)
- sd->addeff[2]+=sd->sc_data[SC_VOLCANO].val2;//% of granting
- if(sd->sc_data[SC_DELUGE].timer!=-1) // エンチャントポイズン(属性はbattle.cで)
- sd->addeff[0]+=sd->sc_data[SC_DELUGE].val2;//% of granting
- */
+ if (sd->sc_data[StatusChange::SC_PHYS_SHIELD].timer)
+ aspd_rate += sd->sc_data[StatusChange::SC_PHYS_SHIELD].val1;
}
if (sd->speed_rate != 100)
sd->speed = sd->speed * sd->speed_rate / 100;
- if (sd->speed < 1)
- sd->speed = 1;
+ sd->speed = std::max(sd->speed, std::chrono::milliseconds(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;
- if (sd->aspd < battle_config.max_aspd)
- sd->aspd = battle_config.max_aspd;
+ sd->aspd = std::max(sd->aspd, static_cast<interval_t>(battle_config.max_aspd));
sd->amotion = sd->aspd;
- sd->dmotion = 800 - sd->paramc[1] * 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;
- }
+ sd->dmotion = std::chrono::milliseconds(800 - sd->paramc[ATTR::AGI] * 4);
+ sd->dmotion = std::max(sd->dmotion, std::chrono::milliseconds(400));
if (sd->status.hp > sd->status.max_hp)
sd->status.hp = sd->status.max_hp;
@@ -2388,86 +1470,69 @@ int pc_calcstatus (struct map_session_data *sd, int first)
return 0;
if (first & 3)
{
- clif_updatestatus (sd, SP_SPEED);
- clif_updatestatus (sd, SP_MAXHP);
- clif_updatestatus (sd, SP_MAXSP);
+ clif_updatestatus(sd, SP::SPEED);
+ clif_updatestatus(sd, SP::MAXHP);
+ clif_updatestatus(sd, SP::MAXSP);
if (first & 1)
{
- clif_updatestatus (sd, SP_HP);
- clif_updatestatus (sd, SP_SP);
+ clif_updatestatus(sd, SP::HP);
+ clif_updatestatus(sd, SP::SP);
}
return 0;
}
- if (b_class != sd->view_class)
- {
- clif_changelook (&sd->bl, LOOK_BASE, sd->view_class);
- clif_changelook (&sd->bl, LOOK_WEAPON, 0);
- }
-
- if (memcmp (b_skill, sd->status.skill, sizeof (sd->status.skill))
+ if (memcmp(&b_skill, &sd->status.skill, sizeof(sd->status.skill))
|| b_attackrange != sd->attackrange)
- clif_skillinfoblock (sd); // スキル送信
+ clif_skillinfoblock(sd); // スキル送信
if (b_speed != sd->speed)
- clif_updatestatus (sd, SP_SPEED);
+ clif_updatestatus(sd, SP::SPEED);
if (b_weight != sd->weight)
- clif_updatestatus (sd, SP_WEIGHT);
+ clif_updatestatus(sd, SP::WEIGHT);
if (b_max_weight != sd->max_weight)
{
- clif_updatestatus (sd, SP_MAXWEIGHT);
- pc_checkweighticon (sd);
+ clif_updatestatus(sd, SP::MAXWEIGHT);
+ pc_checkweighticon(sd);
}
- for (i = 0; i < 6; i++)
+ for (ATTR i : ATTRs)
if (b_paramb[i] + b_parame[i] != sd->paramb[i] + sd->parame[i])
- clif_updatestatus (sd, SP_STR + i);
+ clif_updatestatus(sd, attr_to_sp(i));
if (b_hit != sd->hit)
- clif_updatestatus (sd, SP_HIT);
+ clif_updatestatus(sd, SP::HIT);
if (b_flee != sd->flee)
- clif_updatestatus (sd, SP_FLEE1);
+ clif_updatestatus(sd, SP::FLEE1);
if (b_aspd != sd->aspd)
- clif_updatestatus (sd, SP_ASPD);
+ clif_updatestatus(sd, SP::ASPD);
if (b_watk != sd->watk || b_base_atk != sd->base_atk)
- clif_updatestatus (sd, SP_ATK1);
+ clif_updatestatus(sd, SP::ATK1);
if (b_def != sd->def)
- clif_updatestatus (sd, SP_DEF1);
+ clif_updatestatus(sd, SP::DEF1);
if (b_watk2 != sd->watk2)
- clif_updatestatus (sd, SP_ATK2);
+ clif_updatestatus(sd, SP::ATK2);
if (b_def2 != sd->def2)
- clif_updatestatus (sd, SP_DEF2);
+ clif_updatestatus(sd, SP::DEF2);
if (b_flee2 != sd->flee2)
- clif_updatestatus (sd, SP_FLEE2);
+ clif_updatestatus(sd, SP::FLEE2);
if (b_critical != sd->critical)
- clif_updatestatus (sd, SP_CRITICAL);
+ clif_updatestatus(sd, SP::CRITICAL);
if (b_matk1 != sd->matk1)
- clif_updatestatus (sd, SP_MATK1);
+ clif_updatestatus(sd, SP::MATK1);
if (b_matk2 != sd->matk2)
- clif_updatestatus (sd, SP_MATK2);
+ clif_updatestatus(sd, SP::MATK2);
if (b_mdef != sd->mdef)
- clif_updatestatus (sd, SP_MDEF1);
+ clif_updatestatus(sd, SP::MDEF1);
if (b_mdef2 != sd->mdef2)
- clif_updatestatus (sd, SP_MDEF2);
+ clif_updatestatus(sd, SP::MDEF2);
if (b_attackrange != sd->attackrange)
- clif_updatestatus (sd, SP_ATTACKRANGE);
+ clif_updatestatus(sd, SP::ATTACKRANGE);
if (b_max_hp != sd->status.max_hp)
- clif_updatestatus (sd, SP_MAXHP);
+ clif_updatestatus(sd, SP::MAXHP);
if (b_max_sp != sd->status.max_sp)
- clif_updatestatus (sd, SP_MAXSP);
+ clif_updatestatus(sd, SP::MAXSP);
if (b_hp != sd->status.hp)
- clif_updatestatus (sd, SP_HP);
+ clif_updatestatus(sd, SP::HP);
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);
+ clif_updatestatus(sd, SP::SP);
return 0;
}
@@ -2476,121 +1541,118 @@ int pc_calcstatus (struct map_session_data *sd, int first)
* 装 備品による能力等のボーナス設定
*------------------------------------------
*/
-int pc_bonus (struct map_session_data *sd, int type, int val)
+int pc_bonus(struct map_session_data *sd, SP type, int val)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
switch (type)
{
- case SP_STR:
- case SP_AGI:
- case SP_VIT:
- case SP_INT:
- case SP_DEX:
- case SP_LUK:
+ case SP::STR:
+ case SP::AGI:
+ case SP::VIT:
+ case SP::INT:
+ case SP::DEX:
+ case SP::LUK:
if (sd->state.lr_flag != 2)
- sd->parame[type - SP_STR] += val;
+ sd->parame[sp_to_attr(type)] += val;
break;
- case SP_ATK1:
+#if 0
+ case SP::ATK1:
if (!sd->state.lr_flag)
sd->watk += val;
else if (sd->state.lr_flag == 1)
sd->watk_ += val;
break;
- case SP_ATK2:
+#endif
+#if 0
+ case SP::ATK2:
if (!sd->state.lr_flag)
sd->watk2 += val;
else if (sd->state.lr_flag == 1)
sd->watk_2 += val;
break;
- case SP_BASE_ATK:
+#endif
+#if 0
+ case SP::BASE_ATK:
if (sd->state.lr_flag != 2)
sd->base_atk += val;
break;
- case SP_MATK1:
+#endif
+#if 0
+ case SP::MATK1:
if (sd->state.lr_flag != 2)
sd->matk1 += val;
break;
- case SP_MATK2:
- if (sd->state.lr_flag != 2)
- sd->matk2 += val;
- break;
- case SP_MATK:
+#endif
+#if 0
+ case SP::MATK2:
if (sd->state.lr_flag != 2)
- {
- sd->matk1 += val;
sd->matk2 += val;
- }
break;
- case SP_DEF1:
+#endif
+#if 0
+ case SP::DEF1:
if (sd->state.lr_flag != 2)
sd->def += val;
break;
- case SP_MDEF1:
+#endif
+ case SP::MDEF1:
if (sd->state.lr_flag != 2)
sd->mdef += val;
break;
- case SP_MDEF2:
+#if 0
+ case SP::MDEF2:
if (sd->state.lr_flag != 2)
sd->mdef += val;
break;
- case SP_HIT:
+#endif
+ case SP::HIT:
if (sd->state.lr_flag != 2)
sd->hit += val;
else
sd->arrow_hit += val;
break;
- case SP_FLEE1:
+ case SP::FLEE1:
if (sd->state.lr_flag != 2)
sd->flee += val;
break;
- case SP_FLEE2:
+#if 0
+ case SP::FLEE2:
if (sd->state.lr_flag != 2)
sd->flee2 += val * 10;
break;
- case SP_CRITICAL:
+#endif
+ case SP::CRITICAL:
if (sd->state.lr_flag != 2)
sd->critical += val * 10;
else
sd->arrow_cri += val * 10;
break;
- case SP_ATKELE:
- if (!sd->state.lr_flag)
- sd->atk_ele = val;
- else if (sd->state.lr_flag == 1)
- sd->atk_ele_ = val;
- else if (sd->state.lr_flag == 2)
- sd->arrow_ele = val;
- break;
- case SP_DEFELE:
- if (sd->state.lr_flag != 2)
- sd->def_ele = val;
- break;
- case SP_MAXHP:
+ case SP::MAXHP:
if (sd->state.lr_flag != 2)
sd->status.max_hp += val;
break;
- case SP_MAXSP:
+ case SP::MAXSP:
if (sd->state.lr_flag != 2)
sd->status.max_sp += val;
break;
- case SP_CASTRATE:
- if (sd->state.lr_flag != 2)
- sd->castrate += val;
- break;
- case SP_MAXHPRATE:
+ case SP::MAXHPRATE:
if (sd->state.lr_flag != 2)
sd->hprate += val;
break;
- case SP_MAXSPRATE:
+#if 0
+ case SP::MAXSPRATE:
if (sd->state.lr_flag != 2)
sd->sprate += val;
break;
- case SP_SPRATE:
+#endif
+#if 0
+ case SP::SPRATE:
if (sd->state.lr_flag != 2)
sd->dsprate += val;
break;
- case SP_ATTACKRANGE:
+#endif
+ case SP::ATTACKRANGE:
if (!sd->state.lr_flag)
sd->attackrange += val;
else if (sd->state.lr_flag == 1)
@@ -2598,281 +1660,143 @@ int pc_bonus (struct map_session_data *sd, int type, int val)
else if (sd->state.lr_flag == 2)
sd->arrow_range += val;
break;
- case SP_ADD_SPEED:
+#if 0
+ case SP::ADD_SPEED:
if (sd->state.lr_flag != 2)
sd->speed -= val;
break;
- case SP_SPEED_RATE:
+#endif
+#if 0
+ case SP::SPEED_RATE:
if (sd->state.lr_flag != 2)
{
if (sd->speed_rate > 100 - val)
sd->speed_rate = 100 - val;
}
break;
- case SP_SPEED_ADDRATE:
+#endif
+ case SP::SPEED_ADDRATE:
if (sd->state.lr_flag != 2)
sd->speed_add_rate = sd->speed_add_rate * (100 - val) / 100;
break;
- case SP_ASPD:
+#if 0
+ case SP::ASPD:
if (sd->state.lr_flag != 2)
sd->aspd -= val * 10;
break;
- case SP_ASPD_RATE:
+#endif
+ case SP::ASPD_RATE:
if (sd->state.lr_flag != 2)
{
if (sd->aspd_rate > 100 - val)
sd->aspd_rate = 100 - val;
}
break;
- case SP_ASPD_ADDRATE:
+#if 0
+ case SP::ASPD_ADDRATE:
if (sd->state.lr_flag != 2)
sd->aspd_add_rate = sd->aspd_add_rate * (100 - val) / 100;
break;
- case SP_HP_RECOV_RATE:
+#endif
+ case SP::HP_RECOV_RATE:
if (sd->state.lr_flag != 2)
sd->hprecov_rate += val;
break;
- case SP_SP_RECOV_RATE:
+#if 0
+ case SP::SP_RECOV_RATE:
if (sd->state.lr_flag != 2)
sd->sprecov_rate += val;
break;
- case SP_CRITICAL_DEF:
+#endif
+ case SP::CRITICAL_DEF:
if (sd->state.lr_flag != 2)
sd->critical_def += val;
break;
- case SP_NEAR_ATK_DEF:
- if (sd->state.lr_flag != 2)
- sd->near_attack_def_rate += val;
- break;
- case SP_LONG_ATK_DEF:
- if (sd->state.lr_flag != 2)
- sd->long_attack_def_rate += val;
- break;
- case SP_DOUBLE_RATE:
+#if 0
+ case SP::DOUBLE_RATE:
if (sd->state.lr_flag == 0 && sd->double_rate < val)
sd->double_rate = val;
break;
- case SP_DOUBLE_ADD_RATE:
+#endif
+ case SP::DOUBLE_ADD_RATE:
if (sd->state.lr_flag == 0)
sd->double_add_rate += val;
break;
- case SP_MATK_RATE:
+#if 0
+ case SP::MATK_RATE:
if (sd->state.lr_flag != 2)
sd->matk_rate += val;
break;
- case SP_IGNORE_DEF_ELE:
- if (!sd->state.lr_flag)
- sd->ignore_def_ele |= 1 << val;
- else if (sd->state.lr_flag == 1)
- sd->ignore_def_ele_ |= 1 << val;
- break;
- case SP_IGNORE_DEF_RACE:
- if (!sd->state.lr_flag)
- sd->ignore_def_race |= 1 << val;
- else if (sd->state.lr_flag == 1)
- sd->ignore_def_race_ |= 1 << val;
- break;
- case SP_ATK_RATE:
+#endif
+#if 0
+ case SP::ATK_RATE:
if (sd->state.lr_flag != 2)
sd->atk_rate += val;
break;
- case SP_MAGIC_ATK_DEF:
- if (sd->state.lr_flag != 2)
- sd->magic_def_rate += val;
- break;
- case SP_MISC_ATK_DEF:
- if (sd->state.lr_flag != 2)
- sd->misc_def_rate += val;
- break;
- case SP_IGNORE_MDEF_ELE:
- if (sd->state.lr_flag != 2)
- sd->ignore_mdef_ele |= 1 << val;
- break;
- case SP_IGNORE_MDEF_RACE:
- if (sd->state.lr_flag != 2)
- sd->ignore_mdef_race |= 1 << val;
- break;
- case SP_PERFECT_HIT_RATE:
+#endif
+#if 0
+ case SP::PERFECT_HIT_RATE:
if (sd->state.lr_flag != 2 && sd->perfect_hit < val)
sd->perfect_hit = val;
break;
- case SP_PERFECT_HIT_ADD_RATE:
+#endif
+#if 0
+ case SP::PERFECT_HIT_ADD_RATE:
if (sd->state.lr_flag != 2)
sd->perfect_hit_add += val;
break;
- case SP_CRITICAL_RATE:
+#endif
+#if 0
+ case SP::CRITICAL_RATE:
if (sd->state.lr_flag != 2)
sd->critical_rate += val;
break;
- case SP_GET_ZENY_NUM:
- if (sd->state.lr_flag != 2 && sd->get_zeny_num < val)
- sd->get_zeny_num = val;
- break;
- case SP_ADD_GET_ZENY_NUM:
- if (sd->state.lr_flag != 2)
- sd->get_zeny_add_num += val;
- break;
- case SP_DEF_RATIO_ATK_ELE:
- if (!sd->state.lr_flag)
- sd->def_ratio_atk_ele |= 1 << val;
- else if (sd->state.lr_flag == 1)
- sd->def_ratio_atk_ele_ |= 1 << val;
- break;
- case SP_DEF_RATIO_ATK_RACE:
- if (!sd->state.lr_flag)
- sd->def_ratio_atk_race |= 1 << val;
- else if (sd->state.lr_flag == 1)
- sd->def_ratio_atk_race_ |= 1 << val;
- break;
- case SP_HIT_RATE:
+#endif
+#if 0
+ case SP::HIT_RATE:
if (sd->state.lr_flag != 2)
sd->hit_rate += val;
break;
- case SP_FLEE_RATE:
+#endif
+#if 0
+ case SP::FLEE_RATE:
if (sd->state.lr_flag != 2)
sd->flee_rate += val;
break;
- case SP_FLEE2_RATE:
+#endif
+#if 0
+ case SP::FLEE2_RATE:
if (sd->state.lr_flag != 2)
sd->flee2_rate += val;
break;
- case SP_DEF_RATE:
+#endif
+ case SP::DEF_RATE:
if (sd->state.lr_flag != 2)
sd->def_rate += val;
break;
- case SP_DEF2_RATE:
+ case SP::DEF2_RATE:
if (sd->state.lr_flag != 2)
sd->def2_rate += val;
break;
- case SP_MDEF_RATE:
+#if 0
+ case SP::MDEF_RATE:
if (sd->state.lr_flag != 2)
sd->mdef_rate += val;
break;
- case SP_MDEF2_RATE:
+#endif
+#if 0
+ case SP::MDEF2_RATE:
if (sd->state.lr_flag != 2)
sd->mdef2_rate += val;
break;
- case SP_RESTART_FULL_RECORVER:
- if (sd->state.lr_flag != 2)
- sd->special_state.restart_full_recover = 1;
- break;
- case SP_NO_CASTCANCEL:
- if (sd->state.lr_flag != 2)
- sd->special_state.no_castcancel = 1;
- break;
- case SP_NO_CASTCANCEL2:
- if (sd->state.lr_flag != 2)
- sd->special_state.no_castcancel2 = 1;
- break;
- case SP_NO_SIZEFIX:
- if (sd->state.lr_flag != 2)
- sd->special_state.no_sizefix = 1;
- break;
- case SP_NO_MAGIC_DAMAGE:
- if (sd->state.lr_flag != 2)
- sd->special_state.no_magic_damage = 1;
- break;
- case SP_NO_WEAPON_DAMAGE:
- if (sd->state.lr_flag != 2)
- sd->special_state.no_weapon_damage = 1;
- break;
- case SP_NO_GEMSTONE:
- if (sd->state.lr_flag != 2)
- sd->special_state.no_gemstone = 1;
- break;
- case SP_INFINITE_ENDURE:
- if (sd->state.lr_flag != 2)
- sd->special_state.infinite_endure = 1;
- break;
- case SP_SPLASH_RANGE:
- if (sd->state.lr_flag != 2 && sd->splash_range < val)
- sd->splash_range = val;
- break;
- case SP_SPLASH_ADD_RANGE:
- if (sd->state.lr_flag != 2)
- sd->splash_add_range += val;
- break;
- case SP_SHORT_WEAPON_DAMAGE_RETURN:
- if (sd->state.lr_flag != 2)
- sd->short_weapon_damage_return += val;
- break;
- case SP_LONG_WEAPON_DAMAGE_RETURN:
- if (sd->state.lr_flag != 2)
- sd->long_weapon_damage_return += val;
- break;
- case SP_MAGIC_DAMAGE_RETURN: //AppleGirl Was Here
- if (sd->state.lr_flag != 2)
- sd->magic_damage_return += val;
- break;
- case SP_ALL_STATS: // [Valaris]
- if (sd->state.lr_flag != 2)
- {
- sd->parame[SP_STR - SP_STR] += val;
- sd->parame[SP_AGI - SP_STR] += val;
- sd->parame[SP_VIT - SP_STR] += val;
- sd->parame[SP_INT - SP_STR] += val;
- sd->parame[SP_DEX - SP_STR] += val;
- sd->parame[SP_LUK - SP_STR] += val;
- clif_updatestatus (sd, 13);
- clif_updatestatus (sd, 14);
- clif_updatestatus (sd, 15);
- clif_updatestatus (sd, 16);
- clif_updatestatus (sd, 17);
- clif_updatestatus (sd, 18);
- }
- break;
- case SP_AGI_VIT: // [Valaris]
- if (sd->state.lr_flag != 2)
- {
- sd->parame[SP_AGI - SP_STR] += val;
- sd->parame[SP_VIT - SP_STR] += val;
- clif_updatestatus (sd, 14);
- clif_updatestatus (sd, 15);
- }
- break;
- case SP_AGI_DEX_STR: // [Valaris]
- if (sd->state.lr_flag != 2)
- {
- sd->parame[SP_AGI - SP_STR] += val;
- sd->parame[SP_DEX - SP_STR] += val;
- sd->parame[SP_STR - SP_STR] += val;
- clif_updatestatus (sd, 14);
- clif_updatestatus (sd, 17);
- clif_updatestatus (sd, 13);
- }
- break;
- case SP_PERFECT_HIDE: // [Valaris]
- if (sd->state.lr_flag != 2)
- {
- sd->perfect_hiding = 1;
- }
- break;
- 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);
- }
- break;
- case SP_UNBREAKABLE:
- if (sd->state.lr_flag != 2)
- {
- sd->unbreakable += val;
- }
- break;
- case SP_DEAF:
+#endif
+ case SP::DEAF:
sd->special_state.deaf = 1;
break;
default:
if (battle_config.error_log)
- printf ("pc_bonus: unknown type %d %d !\n", type, val);
+ PRINTF("pc_bonus: unknown type %d %d !\n",
+ type, val);
break;
}
return 0;
@@ -2882,179 +1806,13 @@ int pc_bonus (struct map_session_data *sd, int type, int val)
* ソスソス ソスソスソスiソスノゑソスソスソスソス\ソスヘ難ソスソスフボソス[ソスiソスXソスン抵ソス
*------------------------------------------
*/
-int pc_bonus2 (struct map_session_data *sd, int type, int type2, int val)
+int pc_bonus2(struct map_session_data *sd, SP type, int type2, int val)
{
- int i;
-
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
switch (type)
{
- case SP_ADDELE:
- if (!sd->state.lr_flag)
- sd->addele[type2] += val;
- else if (sd->state.lr_flag == 1)
- sd->addele_[type2] += val;
- else if (sd->state.lr_flag == 2)
- sd->arrow_addele[type2] += val;
- break;
- case SP_ADDRACE:
- if (!sd->state.lr_flag)
- sd->addrace[type2] += val;
- else if (sd->state.lr_flag == 1)
- sd->addrace_[type2] += val;
- else if (sd->state.lr_flag == 2)
- sd->arrow_addrace[type2] += val;
- break;
- case SP_ADDSIZE:
- if (!sd->state.lr_flag)
- sd->addsize[type2] += val;
- else if (sd->state.lr_flag == 1)
- sd->addsize_[type2] += val;
- else if (sd->state.lr_flag == 2)
- sd->arrow_addsize[type2] += val;
- break;
- case SP_SUBELE:
- if (sd->state.lr_flag != 2)
- sd->subele[type2] += val;
- break;
- case SP_SUBRACE:
- if (sd->state.lr_flag != 2)
- sd->subrace[type2] += val;
- break;
- case SP_ADDEFF:
- if (sd->state.lr_flag != 2)
- sd->addeff[type2] += val;
- else
- sd->arrow_addeff[type2] += val;
- break;
- case SP_ADDEFF2:
- if (sd->state.lr_flag != 2)
- sd->addeff2[type2] += val;
- else
- sd->arrow_addeff2[type2] += val;
- break;
- case SP_RESEFF:
- if (sd->state.lr_flag != 2)
- sd->reseff[type2] += val;
- break;
- case SP_MAGIC_ADDELE:
- if (sd->state.lr_flag != 2)
- sd->magic_addele[type2] += val;
- break;
- case SP_MAGIC_ADDRACE:
- if (sd->state.lr_flag != 2)
- sd->magic_addrace[type2] += val;
- break;
- case SP_MAGIC_SUBRACE:
- if (sd->state.lr_flag != 2)
- sd->magic_subrace[type2] += val;
- break;
- case SP_ADD_DAMAGE_CLASS:
- if (!sd->state.lr_flag)
- {
- for (i = 0; i < sd->add_damage_class_count; i++)
- {
- if (sd->add_damage_classid[i] == type2)
- {
- sd->add_damage_classrate[i] += val;
- break;
- }
- }
- if (i >= sd->add_damage_class_count
- && sd->add_damage_class_count < 10)
- {
- sd->add_damage_classid[sd->add_damage_class_count] =
- type2;
- sd->add_damage_classrate[sd->add_damage_class_count] +=
- val;
- sd->add_damage_class_count++;
- }
- }
- else if (sd->state.lr_flag == 1)
- {
- for (i = 0; i < sd->add_damage_class_count_; i++)
- {
- if (sd->add_damage_classid_[i] == type2)
- {
- sd->add_damage_classrate_[i] += val;
- break;
- }
- }
- if (i >= sd->add_damage_class_count_
- && sd->add_damage_class_count_ < 10)
- {
- sd->add_damage_classid_[sd->add_damage_class_count_] =
- type2;
- sd->add_damage_classrate_[sd->add_damage_class_count_] +=
- val;
- sd->add_damage_class_count_++;
- }
- }
- break;
- case SP_ADD_MAGIC_DAMAGE_CLASS:
- if (sd->state.lr_flag != 2)
- {
- for (i = 0; i < sd->add_magic_damage_class_count; i++)
- {
- if (sd->add_magic_damage_classid[i] == type2)
- {
- sd->add_magic_damage_classrate[i] += val;
- break;
- }
- }
- if (i >= sd->add_magic_damage_class_count
- && sd->add_magic_damage_class_count < 10)
- {
- sd->add_magic_damage_classid
- [sd->add_magic_damage_class_count] = type2;
- sd->add_magic_damage_classrate
- [sd->add_magic_damage_class_count] += val;
- sd->add_magic_damage_class_count++;
- }
- }
- break;
- case SP_ADD_DEF_CLASS:
- if (sd->state.lr_flag != 2)
- {
- for (i = 0; i < sd->add_def_class_count; i++)
- {
- if (sd->add_def_classid[i] == type2)
- {
- sd->add_def_classrate[i] += val;
- break;
- }
- }
- if (i >= sd->add_def_class_count
- && sd->add_def_class_count < 10)
- {
- sd->add_def_classid[sd->add_def_class_count] = type2;
- sd->add_def_classrate[sd->add_def_class_count] += val;
- sd->add_def_class_count++;
- }
- }
- break;
- case SP_ADD_MDEF_CLASS:
- if (sd->state.lr_flag != 2)
- {
- for (i = 0; i < sd->add_mdef_class_count; i++)
- {
- if (sd->add_mdef_classid[i] == type2)
- {
- sd->add_mdef_classrate[i] += val;
- break;
- }
- }
- if (i >= sd->add_mdef_class_count
- && sd->add_mdef_class_count < 10)
- {
- sd->add_mdef_classid[sd->add_mdef_class_count] = type2;
- sd->add_mdef_classrate[sd->add_mdef_class_count] += val;
- sd->add_mdef_class_count++;
- }
- }
- break;
- case SP_HP_DRAIN_RATE:
+ case SP::HP_DRAIN_RATE:
if (!sd->state.lr_flag)
{
sd->hp_drain_rate += type2;
@@ -3066,7 +1824,8 @@ int pc_bonus2 (struct map_session_data *sd, int type, int type2, int val)
sd->hp_drain_per_ += val;
}
break;
- case SP_SP_DRAIN_RATE:
+#if 0
+ case SP::SP_DRAIN_RATE:
if (!sd->state.lr_flag)
{
sd->sp_drain_rate += type2;
@@ -3078,77 +1837,13 @@ int pc_bonus2 (struct map_session_data *sd, int type, int type2, int val)
sd->sp_drain_per_ += val;
}
break;
- case SP_WEAPON_COMA_ELE:
- if (sd->state.lr_flag != 2)
- sd->weapon_coma_ele[type2] += val;
- break;
- case SP_WEAPON_COMA_RACE:
- if (sd->state.lr_flag != 2)
- sd->weapon_coma_race[type2] += val;
- break;
- case SP_RANDOM_ATTACK_INCREASE: // [Valaris]
- if (sd->state.lr_flag != 2)
- {
- sd->random_attack_increase_add = type2;
- sd->random_attack_increase_per += val;
- break;
- } // end addition
- default:
- if (battle_config.error_log)
- printf ("pc_bonus2: unknown type %d %d %d!\n", type, type2,
- val);
- break;
- }
- return 0;
-}
-
-int pc_bonus3 (struct map_session_data *sd, int type, int type2, int type3,
- int val)
-{
- int i;
- switch (type)
- {
- case SP_ADD_MONSTER_DROP_ITEM:
- if (sd->state.lr_flag != 2)
- {
- for (i = 0; i < sd->monster_drop_item_count; i++)
- {
- if (sd->monster_drop_itemid[i] == type2)
- {
- sd->monster_drop_race[i] |= 1 << type3;
- if (sd->monster_drop_itemrate[i] < val)
- sd->monster_drop_itemrate[i] = val;
- break;
- }
- }
- if (i >= sd->monster_drop_item_count
- && sd->monster_drop_item_count < 10)
- {
- sd->monster_drop_itemid[sd->monster_drop_item_count] =
- type2;
- sd->monster_drop_race[sd->monster_drop_item_count] |=
- 1 << type3;
- sd->monster_drop_itemrate[sd->monster_drop_item_count] =
- val;
- sd->monster_drop_item_count++;
- }
- }
- break;
- case SP_AUTOSPELL:
- if (sd->state.lr_flag != 2)
- {
- sd->autospell_id = type2;
- sd->autospell_lv = type3;
- sd->autospell_rate = val;
- }
- break;
+#endif
default:
if (battle_config.error_log)
- printf ("pc_bonus3: unknown type %d %d %d %d!\n", type, type2,
- type3, val);
+ PRINTF("pc_bonus2: unknown type %d %d %d!\n",
+ type, type2, val);
break;
}
-
return 0;
}
@@ -3156,165 +1851,69 @@ int pc_bonus3 (struct map_session_data *sd, int type, int type2, int type3,
* スクリプトによるスキル所得
*------------------------------------------
*/
-int pc_skill (struct map_session_data *sd, int id, int level, int flag)
+int pc_skill(struct map_session_data *sd, SkillID id, int level, int flag)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (level > MAX_SKILL_LEVEL)
{
if (battle_config.error_log)
- printf ("support card skill only!\n");
+ PRINTF("support card skill only!\n");
return 0;
}
- if (!flag && (sd->status.skill[id].id == id || level == 0))
- { // クエスト所得ならここで条件を確認して送信する
+ if (!flag && (sd->status.skill[id].lv || level == 0))
+ {
sd->status.skill[id].lv = level;
- pc_calcstatus (sd, 0);
- clif_skillinfoblock (sd);
+ pc_calcstatus(sd, 0);
+ clif_skillinfoblock(sd);
}
else if (sd->status.skill[id].lv < level)
- { // 覚えられるがlvが小さいなら
- sd->status.skill[id].id = id;
+ {
sd->status.skill[id].lv = level;
}
return 0;
}
-/*==========================================
- * カード挿入
- *------------------------------------------
- */
-int pc_insert_card (struct map_session_data *sd, int idx_card, int idx_equip)
-{
- nullpo_retr (0, sd);
-
- if (idx_card >= 0 && idx_card < MAX_INVENTORY && idx_equip >= 0
- && idx_equip < MAX_INVENTORY && sd->inventory_data[idx_card])
- {
- int i;
- int nameid = sd->status.inventory[idx_equip].nameid;
- int cardid = sd->status.inventory[idx_card].nameid;
- int ep = sd->inventory_data[idx_card]->equip;
-
- if (nameid <= 0 || sd->inventory_data[idx_equip] == NULL ||
- (sd->inventory_data[idx_equip]->type != 4 && sd->inventory_data[idx_equip]->type != 5) || // 装 備じゃない
- (sd->status.inventory[idx_equip].identify == 0) || // 未鑑定
- (sd->status.inventory[idx_equip].card[0] == 0x00ff) || // 製造武器
- (sd->status.inventory[idx_equip].card[0] == 0x00fe) ||
- ((sd->inventory_data[idx_equip]->equip & ep) == 0) || // 装 備個所違い
- (sd->inventory_data[idx_equip]->type == 4 && ep == 32) || // 両 手武器と盾カード
- (sd->status.inventory[idx_equip].card[0] == (short) 0xff00)
- || sd->status.inventory[idx_equip].equip)
- {
-
- clif_insert_card (sd, idx_equip, idx_card, 1);
- return 0;
- }
- for (i = 0; i < sd->inventory_data[idx_equip]->slot; i++)
- {
- if (sd->status.inventory[idx_equip].card[i] == 0)
- {
- // 空きスロットがあったので差し込む
- sd->status.inventory[idx_equip].card[i] = cardid;
-
- // カードは減らす
- clif_insert_card (sd, idx_equip, idx_card, 0);
- pc_delitem (sd, idx_card, 1, 1);
- return 0;
- }
- }
- }
- else
- clif_insert_card (sd, idx_equip, idx_card, 1);
-
- 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;
-}
/*==========================================
* アイテムを買った時に、新しいアイテム欄を使うか、
* 3万個制限にかかるか確認
*------------------------------------------
*/
-int pc_checkadditem (struct map_session_data *sd, int nameid, int amount)
+ADDITEM pc_checkadditem(struct map_session_data *sd, int nameid, int amount)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_retr(ADDITEM::ZERO, sd);
- if (itemdb_isequip (nameid))
- return ADDITEM_NEW;
+ if (itemdb_isequip(nameid))
+ return ADDITEM::NEW;
for (i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].nameid == nameid)
{
if (sd->status.inventory[i].amount + amount > MAX_AMOUNT)
- return ADDITEM_OVERAMOUNT;
- return ADDITEM_EXIST;
+ return ADDITEM::OVERAMOUNT;
+ return ADDITEM::EXIST;
}
}
if (amount > MAX_AMOUNT)
- return ADDITEM_OVERAMOUNT;
- return ADDITEM_NEW;
+ return ADDITEM::OVERAMOUNT;
+ return ADDITEM::NEW;
}
/*==========================================
* 空きアイテム欄の個数
*------------------------------------------
*/
-int pc_inventoryblank (struct map_session_data *sd)
+int pc_inventoryblank(struct map_session_data *sd)
{
- int i, b;
+ int i, b;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0, b = 0; i < MAX_INVENTORY; i++)
{
@@ -3329,17 +1928,17 @@ int pc_inventoryblank (struct map_session_data *sd)
* お金を払う
*------------------------------------------
*/
-int pc_payzeny (struct map_session_data *sd, int zeny)
+int pc_payzeny(struct map_session_data *sd, int zeny)
{
double z;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
z = (double) sd->status.zeny;
if (sd->status.zeny < zeny || z - (double) zeny > MAX_ZENY)
return 1;
sd->status.zeny -= zeny;
- clif_updatestatus (sd, SP_ZENY);
+ clif_updatestatus(sd, SP::ZENY);
return 0;
}
@@ -3348,11 +1947,11 @@ int pc_payzeny (struct map_session_data *sd, int zeny)
* お金を得る
*------------------------------------------
*/
-int pc_getzeny (struct map_session_data *sd, int zeny)
+int pc_getzeny(struct map_session_data *sd, int zeny)
{
double z;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
z = (double) sd->status.zeny;
if (z + (double) zeny > MAX_ZENY)
@@ -3361,7 +1960,7 @@ int pc_getzeny (struct map_session_data *sd, int zeny)
sd->status.zeny = MAX_ZENY;
}
sd->status.zeny += zeny;
- clif_updatestatus (sd, SP_ZENY);
+ clif_updatestatus(sd, SP::ZENY);
return 0;
}
@@ -3370,11 +1969,11 @@ int pc_getzeny (struct map_session_data *sd, int zeny)
* アイテムを探して、インデックスを返す
*------------------------------------------
*/
-int pc_search_inventory (struct map_session_data *sd, int item_id)
+int pc_search_inventory(struct map_session_data *sd, int item_id)
{
- int i;
+ int i;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
for (i = 0; i < MAX_INVENTORY; i++)
{
@@ -3386,12 +1985,12 @@ int pc_search_inventory (struct map_session_data *sd, int item_id)
return -1;
}
-int pc_count_all_items (struct map_session_data *player, int item_id)
+int pc_count_all_items(struct map_session_data *player, int item_id)
{
- int i;
- int count = 0;
+ int i;
+ int count = 0;
- nullpo_retr (0, player);
+ nullpo_ret(player);
for (i = 0; i < MAX_INVENTORY; i++)
{
@@ -3402,24 +2001,24 @@ int pc_count_all_items (struct map_session_data *player, int item_id)
return count;
}
-int pc_remove_items (struct map_session_data *player, int item_id, int count)
+int pc_remove_items(struct map_session_data *player, int item_id, int count)
{
- int i;
+ int i;
- nullpo_retr (0, player);
+ nullpo_ret(player);
for (i = 0; i < MAX_INVENTORY && count; i++)
{
if (player->status.inventory[i].nameid == item_id)
{
- int to_delete = count;
+ int to_delete = count;
/* only delete as much as we have */
if (to_delete > player->status.inventory[i].amount)
to_delete = player->status.inventory[i].amount;
count -= to_delete;
- pc_delitem (player, i, to_delete,
+ pc_delitem(player, i, to_delete,
0 /* means `really delete and update status' */ );
if (!count)
@@ -3433,26 +2032,26 @@ int pc_remove_items (struct map_session_data *player, int item_id, int count)
* アイテム追加。個数のみitem構造体の数字を無視
*------------------------------------------
*/
-int pc_additem (struct map_session_data *sd, struct item *item_data,
+PickupFail pc_additem(struct map_session_data *sd, struct item *item_data,
int amount)
{
struct item_data *data;
- int i, w;
+ int i, w;
- MAP_LOG_PC (sd, "PICKUP %d %d", item_data->nameid, amount);
+ MAP_LOG_PC(sd, "PICKUP %d %d", item_data->nameid, amount);
- nullpo_retr (1, sd);
- nullpo_retr (1, item_data);
+ nullpo_retr(PickupFail::BAD_ITEM, sd);
+ nullpo_retr(PickupFail::BAD_ITEM, item_data);
if (item_data->nameid <= 0 || amount <= 0)
- return 1;
- data = itemdb_search (item_data->nameid);
+ return PickupFail::BAD_ITEM;
+ data = itemdb_search(item_data->nameid);
if ((w = data->weight * amount) + sd->weight > sd->max_weight)
- return 2;
+ return PickupFail::TOO_HEAVY;
i = MAX_INVENTORY;
- if (!itemdb_isequip2 (data))
+ if (!itemdb_isequip2(data))
{
// 装 備品ではないので、既所有品なら個数のみ変化させる
for (i = 0; i < MAX_INVENTORY; i++)
@@ -3463,47 +2062,47 @@ int pc_additem (struct map_session_data *sd, struct item *item_data,
&& sd->status.inventory[i].card[3] == item_data->card[3])
{
if (sd->status.inventory[i].amount + amount > MAX_AMOUNT)
- return 5;
+ return PickupFail::STACK_FULL;
sd->status.inventory[i].amount += amount;
- clif_additem (sd, i, amount, 0);
+ clif_additem(sd, i, amount, PickupFail::OKAY);
break;
}
}
if (i >= MAX_INVENTORY)
{
// 装 備品か未所有品だったので空き欄へ追加
- i = pc_search_inventory (sd, 0);
+ i = pc_search_inventory(sd, 0);
if (i >= 0)
{
- memcpy (&sd->status.inventory[i], item_data,
- sizeof (sd->status.inventory[0]));
+ memcpy(&sd->status.inventory[i], item_data,
+ sizeof(sd->status.inventory[0]));
- if (item_data->equip)
- sd->status.inventory[i].equip = 0;
+ if (bool(item_data->equip))
+ sd->status.inventory[i].equip = EPOS::ZERO;
sd->status.inventory[i].amount = amount;
sd->inventory_data[i] = data;
- clif_additem (sd, i, amount, 0);
+ clif_additem(sd, i, amount, PickupFail::OKAY);
}
else
- return 4;
+ return PickupFail::INV_FULL;
}
sd->weight += w;
- clif_updatestatus (sd, SP_WEIGHT);
+ clif_updatestatus(sd, SP::WEIGHT);
- return 0;
+ return PickupFail::OKAY;
}
/*==========================================
* アイテムを減らす
*------------------------------------------
*/
-int pc_delitem (struct map_session_data *sd, int n, int amount, int type)
+int pc_delitem(struct map_session_data *sd, int n, int amount, int type)
{
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
if (sd->trade_partner != 0)
- trade_tradecancel (sd);
+ trade_tradecancel(sd);
if (sd->status.inventory[n].nameid == 0 || amount <= 0
|| sd->status.inventory[n].amount < amount
@@ -3514,16 +2113,16 @@ int pc_delitem (struct map_session_data *sd, int n, int amount, int type)
sd->weight -= sd->inventory_data[n]->weight * amount;
if (sd->status.inventory[n].amount <= 0)
{
- if (sd->status.inventory[n].equip)
- pc_unequipitem (sd, n, 0);
- memset (&sd->status.inventory[n], 0,
- sizeof (sd->status.inventory[0]));
+ if (bool(sd->status.inventory[n].equip))
+ pc_unequipitem(sd, n, CalcStatus::NOW);
+ memset(&sd->status.inventory[n], 0,
+ sizeof(sd->status.inventory[0]));
sd->inventory_data[n] = NULL;
}
if (!(type & 1))
- clif_delitem (sd, n, amount);
+ clif_delitem(sd, n, amount);
if (!(type & 2))
- clif_updatestatus (sd, SP_WEIGHT);
+ clif_updatestatus(sd, SP::WEIGHT);
return 0;
}
@@ -3532,11 +2131,11 @@ int pc_delitem (struct map_session_data *sd, int n, int amount, int type)
* アイテムを落す
*------------------------------------------
*/
-int pc_dropitem (struct map_session_data *sd, int n, int amount)
+int pc_dropitem(struct map_session_data *sd, int n, int amount)
{
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
- if (sd->trade_partner != 0 || sd->npc_id != 0 || sd->state.storage_flag)
+ if (sd->trade_partner != 0 || sd->npc_id != 0 || sd->state.storage_open)
return 0; // no dropping while trading/npc/storage
if (n < 0 || n >= MAX_INVENTORY)
@@ -3545,15 +2144,16 @@ int pc_dropitem (struct map_session_data *sd, int n, int amount)
if (amount <= 0)
return 0;
- pc_unequipinvyitem (sd, n, 0);
+ pc_unequipinvyitem(sd, n, CalcStatus::NOW);
if (sd->status.inventory[n].nameid <= 0 ||
sd->status.inventory[n].amount < amount ||
sd->trade_partner != 0 || sd->status.inventory[n].amount <= 0)
return 1;
- map_addflooritem (&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x,
- sd->bl.y, NULL, NULL, NULL, 0);
- pc_delitem (sd, n, amount, 0);
+ map_addflooritem(&sd->status.inventory[n], amount,
+ sd->bl.m, sd->bl.x, sd->bl.y,
+ NULL, NULL, NULL);
+ pc_delitem(sd, n, amount, 0);
return 0;
}
@@ -3563,15 +2163,16 @@ int pc_dropitem (struct map_session_data *sd, int n, int amount)
*------------------------------------------
*/
-static int can_pick_item_up_from (struct map_session_data *self, int other_id)
+static
+int can_pick_item_up_from(struct map_session_data *self, int other_id)
{
- struct party *p = party_search (self->status.party_id);
+ struct party *p = party_search(self->status.party_id);
/* From ourselves or from no-one? */
if (!self || self->bl.id == other_id || !other_id)
return 1;
- struct map_session_data *other = map_id2sd (other_id);
+ struct map_session_data *other = map_id2sd(other_id);
/* Other no longer exists? */
if (!other)
@@ -3593,22 +2194,21 @@ static int can_pick_item_up_from (struct map_session_data *self, int other_id)
return 1;
else
{
- int distance_x = abs (other->bl.x - self->bl.x);
- int distance_y = abs (other->bl.y - self->bl.y);
- int distance = (distance_x > distance_y) ? distance_x : distance_y;
+ int distance_x = abs(other->bl.x - self->bl.x);
+ int distance_y = abs(other->bl.y - self->bl.y);
+ int distance = (distance_x > distance_y) ? distance_x : distance_y;
return distance > battle_config.drop_pickup_safety_zone;
}
}
-int pc_takeitem (struct map_session_data *sd, struct flooritem_data *fitem)
+int pc_takeitem(struct map_session_data *sd, struct flooritem_data *fitem)
{
- int flag;
- unsigned int tick = gettick ();
- int can_take;
+ tick_t tick = gettick();
+ int can_take;
- nullpo_retr (0, sd);
- nullpo_retr (0, fitem);
+ nullpo_ret(sd);
+ nullpo_ret(fitem);
/* Sometimes the owners reported to us are buggy: */
@@ -3622,14 +2222,14 @@ int pc_takeitem (struct map_session_data *sd, struct flooritem_data *fitem)
fitem->third_get_id = 0;
}
- can_take = can_pick_item_up_from (sd, fitem->first_get_id);
+ can_take = can_pick_item_up_from(sd, fitem->first_get_id);
if (!can_take)
can_take = fitem->first_get_tick <= tick
- && can_pick_item_up_from (sd, fitem->second_get_id);
+ && can_pick_item_up_from(sd, fitem->second_get_id);
if (!can_take)
can_take = fitem->second_get_tick <= tick
- && can_pick_item_up_from (sd, fitem->third_get_id);
+ && can_pick_item_up_from(sd, fitem->third_get_id);
if (!can_take)
can_take = fitem->third_get_tick <= tick;
@@ -3638,54 +2238,51 @@ int pc_takeitem (struct map_session_data *sd, struct flooritem_data *fitem)
{
/* Can pick up */
- if ((flag =
- pc_additem (sd, &fitem->item_data, fitem->item_data.amount)))
+ PickupFail flag = pc_additem(sd, &fitem->item_data, fitem->item_data.amount);
+ if (flag != PickupFail::OKAY)
// 重量overで取得失敗
- clif_additem (sd, 0, 0, flag);
+ clif_additem(sd, 0, 0, flag);
else
{
// 取得成功
- if (sd->attacktimer != -1)
- pc_stopattack (sd);
- clif_takeitem (&sd->bl, &fitem->bl);
- map_clearflooritem (fitem->bl.id);
+ if (sd->attacktimer)
+ pc_stopattack(sd);
+ clif_takeitem(&sd->bl, &fitem->bl);
+ map_clearflooritem(fitem->bl.id);
}
return 0;
}
/* Otherwise, we can't pick up */
- clif_additem (sd, 0, 0, 6);
+ clif_additem(sd, 0, 0, PickupFail::DROP_STEAL);
return 0;
}
static
-int pc_isUseitem (struct map_session_data *sd, int n)
+int pc_isUseitem(struct map_session_data *sd, int n)
{
struct item_data *item;
- int nameid;
+ int nameid;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
item = sd->inventory_data[n];
nameid = sd->status.inventory[n].nameid;
if (item == NULL)
return 0;
- if (itemdb_type (nameid) != 0)
- return 0;
- if ((nameid == 605) && map[sd->bl.m].flag.gvg)
+ if (itemdb_type(nameid) != ItemType::USE)
return 0;
if (nameid == 601
- && (map[sd->bl.m].flag.noteleport || map[sd->bl.m].flag.gvg))
+ && (map[sd->bl.m].flag.noteleport))
{
- clif_skill_teleportmessage (sd, 0);
return 0;
}
if (nameid == 602 && map[sd->bl.m].flag.noreturn)
return 0;
if (nameid == 604
- && (map[sd->bl.m].flag.nobranch || map[sd->bl.m].flag.gvg))
+ && (map[sd->bl.m].flag.nobranch))
return 0;
if (item->sex != 2 && sd->status.sex != item->sex)
return 0;
@@ -3699,362 +2296,51 @@ int pc_isUseitem (struct map_session_data *sd, int n)
* アイテムを使う
*------------------------------------------
*/
-int pc_useitem (struct map_session_data *sd, int n)
+int pc_useitem(struct map_session_data *sd, int n)
{
- int nameid, amount;
+ int amount;
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
if (n >= 0 && n < MAX_INVENTORY && sd->inventory_data[n])
{
- nameid = sd->status.inventory[n].nameid;
amount = sd->status.inventory[n].amount;
if (sd->status.inventory[n].nameid <= 0
|| sd->status.inventory[n].amount <= 0
- || sd->sc_data[SC_BERSERK].timer != -1 || !pc_isUseitem (sd, n))
+ || !pc_isUseitem(sd, n))
{
- clif_useitemack (sd, n, 0, 0);
+ clif_useitemack(sd, n, 0, 0);
return 1;
}
- run_script (sd->inventory_data[n]->use_script, 0, sd->bl.id, 0);
+ run_script(sd->inventory_data[n]->use_script, 0, sd->bl.id, 0);
- clif_useitemack (sd, n, amount - 1, 1);
- pc_delitem (sd, n, 1, 1);
+ clif_useitemack(sd, n, amount - 1, 1);
+ pc_delitem(sd, n, 1, 1);
}
return 0;
}
/*==========================================
- * カートアイテム追加。個数のみitem構造体の数字を無視
- *------------------------------------------
- */
-int pc_cart_additem (struct map_session_data *sd, struct item *item_data,
- int amount)
-{
- struct item_data *data;
- int i, w;
-
- nullpo_retr (1, sd);
- nullpo_retr (1, item_data);
-
- if (item_data->nameid <= 0 || amount <= 0)
- return 1;
- data = itemdb_search (item_data->nameid);
-
- if ((w = data->weight * amount) + sd->cart_weight > sd->cart_max_weight)
- return 1;
-
- i = MAX_CART;
- if (!itemdb_isequip2 (data))
- {
- // 装 備品ではないので、既所有品なら個数のみ変化させる
- for (i = 0; i < MAX_CART; i++)
- {
- if (sd->status.cart[i].nameid == item_data->nameid &&
- sd->status.cart[i].card[0] == item_data->card[0]
- && sd->status.cart[i].card[1] == item_data->card[1]
- && sd->status.cart[i].card[2] == item_data->card[2]
- && sd->status.cart[i].card[3] == item_data->card[3])
- {
- if (sd->status.cart[i].amount + amount > MAX_AMOUNT)
- return 1;
- sd->status.cart[i].amount += amount;
- clif_cart_additem (sd, i, amount, 0);
- break;
- }
- }
- }
- if (i >= MAX_CART)
- {
- // 装 備品か未所有品だったので空き欄へ追加
- for (i = 0; i < MAX_CART; i++)
- {
- if (sd->status.cart[i].nameid == 0)
- {
- memcpy (&sd->status.cart[i], item_data,
- sizeof (sd->status.cart[0]));
- sd->status.cart[i].amount = amount;
- sd->cart_num++;
- clif_cart_additem (sd, i, amount, 0);
- break;
- }
- }
- if (i >= MAX_CART)
- return 1;
- }
- sd->cart_weight += w;
- clif_updatestatus (sd, SP_CARTINFO);
-
- return 0;
-}
-
-/*==========================================
* カートアイテムを減らす
*------------------------------------------
*/
-int pc_cart_delitem (struct map_session_data *sd, int n, int amount, int type)
+static
+int pc_cart_delitem(struct map_session_data *sd, int n, int amount, int)
{
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
if (sd->status.cart[n].nameid == 0 || sd->status.cart[n].amount < amount)
return 1;
sd->status.cart[n].amount -= amount;
- sd->cart_weight -= itemdb_weight (sd->status.cart[n].nameid) * amount;
+ sd->cart_weight -= itemdb_weight(sd->status.cart[n].nameid) * amount;
if (sd->status.cart[n].amount <= 0)
{
- memset (&sd->status.cart[n], 0, sizeof (sd->status.cart[0]));
+ memset(&sd->status.cart[n], 0, sizeof(sd->status.cart[0]));
sd->cart_num--;
}
- if (!type)
- {
- clif_cart_delitem (sd, n, amount);
- clif_updatestatus (sd, SP_CARTINFO);
- }
-
- return 0;
-}
-
-/*==========================================
- * カートへアイテム移動
- *------------------------------------------
- */
-int pc_putitemtocart (struct map_session_data *sd, int idx, int amount)
-{
- struct item *item_data;
-
- nullpo_retr (0, sd);
-
- if (idx < 0 || idx >= MAX_INVENTORY)
- return 1;
-
- nullpo_retr (0, item_data = &sd->status.inventory[idx]);
-
- if (!pc_iscarton (sd))
- return 1;
- if (item_data->nameid == 0 || item_data->amount < amount)
- return 1;
- if (pc_cart_additem (sd, item_data, amount) == 0)
- return pc_delitem (sd, idx, amount, 0);
-
- return 1;
-}
-
-/*==========================================
- * カート内のアイテム数確認(個数の差分を返す)
- *------------------------------------------
- */
-int pc_cartitem_amount (struct map_session_data *sd, int idx, int amount)
-{
- struct item *item_data;
-
- nullpo_retr (-1, sd);
-
- if (idx < 0 || idx >= MAX_CART)
- return -1;
-
- nullpo_retr (-1, item_data = &sd->status.cart[idx]);
-
- if (!pc_iscarton (sd))
- return -1;
- if (item_data->nameid == 0 || !item_data->amount)
- return -1;
- return item_data->amount - amount;
-}
-
-/*==========================================
- * カートからアイテム移動
- *------------------------------------------
- */
-
-int pc_getitemfromcart (struct map_session_data *sd, int idx, int amount)
-{
- struct item *item_data;
- int flag;
-
- nullpo_retr (0, sd);
-
- if (idx < 0 || idx >= MAX_CART)
- return 1;
-
- nullpo_retr (0, item_data = &sd->status.cart[idx]);
-
- if (!pc_iscarton (sd))
- return 1;
- if (item_data->nameid == 0 || item_data->amount < amount)
- return 1;
- if ((flag = pc_additem (sd, item_data, amount)) == 0)
- return pc_cart_delitem (sd, idx, amount, 0);
-
- clif_additem (sd, 0, 0, flag);
- return 1;
-}
-
-/*==========================================
- * アイテム鑑定
- *------------------------------------------
- */
-int pc_item_identify (struct map_session_data *sd, int idx)
-{
- int flag = 1;
-
- nullpo_retr (0, sd);
-
- if (idx >= 0 && idx < MAX_INVENTORY)
- {
- if (sd->status.inventory[idx].nameid > 0
- && sd->status.inventory[idx].identify == 0)
- {
- flag = 0;
- sd->status.inventory[idx].identify = 1;
- }
- clif_item_identified (sd, idx, flag);
- }
- else
- clif_item_identified (sd, idx, flag);
-
- return !flag;
-}
-
-/*==========================================
- * スティル品公開
- *------------------------------------------
- */
-static
-int pc_show_steal (struct block_list *bl, va_list ap)
-{
- struct map_session_data *sd;
- int itemid;
- int type;
-
- struct item_data *item = NULL;
- char output[100];
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, sd = va_arg (ap, struct map_session_data *));
-
- itemid = va_arg (ap, int);
- type = va_arg (ap, int);
-
- if (!type)
- {
- if ((item = itemdb_exists (itemid)) == NULL)
- sprintf (output, "%s stole an Unknown_Item.", sd->status.name);
- else
- sprintf (output, "%s stole %s.", sd->status.name, item->jname);
- clif_displaymessage (((struct map_session_data *) bl)->fd, output);
- }
- else
- {
- sprintf (output,
- "%s has not stolen the item because of being overweight.",
- sd->status.name);
- clif_displaymessage (((struct map_session_data *) bl)->fd, output);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-//** pc.c: Small Steal Item fix by fritz
-int pc_steal_item (struct map_session_data *sd, struct block_list *bl)
-{
- if (sd != NULL && bl != NULL && bl->type == BL_MOB)
- {
- int i, skill, rate, itemid, flag, count;
- struct mob_data *md;
- md = (struct mob_data *) bl;
- if (!md->state.steal_flag && mob_db[md->mob_class].mexp <= 0 &&
- !(mob_db[md->mob_class].mode & 0x20) &&
- md->sc_data[SC_STONE].timer == -1 &&
- md->sc_data[SC_FREEZE].timer == -1 &&
- (!(md->mob_class > 1324 && md->mob_class < 1364))) // prevent stealing from treasure boxes [Valaris]
- {
- skill = sd->paramc[4] - mob_db[md->mob_class].dex
- + pc_checkskill (sd, TF_STEAL) + 10;
-
- if (0 < skill)
- {
- for (count = 8; count <= 8 && count != 0; count--)
- {
- i = rand () % 8;
- itemid = mob_db[md->mob_class].dropitem[i].nameid;
-
- if (itemid > 0 && itemdb_type (itemid) != 6)
- {
- rate =
- (mob_db[md->mob_class].dropitem[i].p /
- battle_config.item_rate_common * 100 * skill) /
- 100;
-
- if (rand () % 10000 < rate)
- {
- struct item tmp_item;
- memset (&tmp_item, 0, sizeof (tmp_item));
- tmp_item.nameid = itemid;
- tmp_item.amount = 1;
- tmp_item.identify = 1;
- flag = pc_additem (sd, &tmp_item, 1);
- if (battle_config.show_steal_in_same_party)
- {
- party_foreachsamemap (pc_show_steal, sd, 1,
- sd, tmp_item.nameid, 0);
- }
-
- if (flag)
- {
- if (battle_config.show_steal_in_same_party)
- {
- party_foreachsamemap (pc_show_steal, sd,
- 1, sd,
- tmp_item.nameid, 1);
- }
-
- clif_additem (sd, 0, 0, flag);
- }
- md->state.steal_flag = 1;
- return 1;
- }
- }
- }
- }
- }
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_steal_coin (struct map_session_data *sd, struct block_list *bl)
-{
- if (sd != NULL && bl != NULL && bl->type == BL_MOB)
- {
- int rate, skill;
- struct mob_data *md = (struct mob_data *) bl;
- if (md && !md->state.steal_coin_flag && md->sc_data
- && 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[4] * 2 + sd->paramc[5] * 2;
- if (MRAND (1000) < rate)
- {
- pc_getzeny (sd, mob_db[md->mob_class].lv * 10 + MRAND (100));
- md->state.steal_coin_flag = 1;
- return 1;
- }
- }
- }
return 0;
}
@@ -4066,135 +2352,103 @@ int pc_steal_coin (struct map_session_data *sd, struct block_list *bl)
* PCの位置設定
*------------------------------------------
*/
-int pc_setpos (struct map_session_data *sd, const char *mapname_org, int x, int y,
- int clrtype)
+int pc_setpos(struct map_session_data *sd, const char *mapname_org, int x, int y,
+ BeingRemoveWhy clrtype)
{
char mapname[24];
- int m = 0, c = 0, disguise = 0;
+ int m = 0;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->chatID) // チャットから出る
- chat_leavechat (sd);
+ chat_leavechat(sd);
if (sd->trade_partner) // 取引を中断する
- trade_tradecancel (sd);
- if (sd->state.storage_flag == 1)
- storage_storage_quit (sd); // 倉庫を開いてるなら保存する
- else if (sd->state.storage_flag == 2)
- storage_guild_storage_quit (sd, 0);
+ trade_tradecancel(sd);
+ if (sd->state.storage_open)
+ storage_storage_quit(sd); // 倉庫を開いてるなら保存する
if (sd->party_invite > 0) // パーティ勧誘を拒否する
- party_reply_invite (sd, sd->party_invite_account, 0);
- if (sd->guild_invite > 0) // ギルド勧誘を拒否する
- guild_reply_invite (sd, sd->guild_invite, 0);
- if (sd->guild_alliance > 0) // ギルド同盟勧誘を拒否する
- guild_reply_reqalliance (sd, sd->guild_alliance_account, 0);
+ party_reply_invite(sd, sd->party_invite_account, 0);
- skill_castcancel (&sd->bl, 0); // 詠唱中断
- pc_stop_walking (sd, 0); // 歩行中断
- pc_stopattack (sd); // 攻撃中断
+ skill_castcancel(&sd->bl, 0); // 詠唱中断
+ pc_stop_walking(sd, 0); // 歩行中断
+ pc_stopattack(sd); // 攻撃中断
- if (pc_issit (sd))
+ if (pc_issit(sd))
{
// pc_setstand (sd); // [fate] Nothing wrong with warping while sitting
- skill_gangsterparadise (sd, 0);
- }
-
- if (sd->sc_data[SC_TRICKDEAD].timer != -1)
- skill_status_change_end (&sd->bl, SC_TRICKDEAD, -1);
- if (sd->status.option & 2)
- skill_status_change_end (&sd->bl, SC_HIDING, -1);
- if (sd->status.option & 4)
- skill_status_change_end (&sd->bl, SC_CLOAKING, -1);
- if (sd->status.option & 16386)
- 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);
-
- if (sd->disguise)
- { // clear disguises when warping [Valaris]
- clif_clearchar (&sd->bl, 9);
- disguise = sd->disguise;
- sd->disguise = 0;
- }
-
- memcpy (mapname, mapname_org, 24);
+ skill_gangsterparadise(sd, 0);
+ }
+
+ memcpy(mapname, mapname_org, 24);
mapname[16] = 0;
- if (strstr (mapname, ".gat") == NULL && strlen (mapname) < 16)
+ if (strstr(mapname, ".gat") == NULL && strlen(mapname) < 16)
{
- strcat (mapname, ".gat");
+ strcat(mapname, ".gat");
}
- m = map_mapname2mapid (mapname);
+ m = map_mapname2mapid(mapname);
if (m < 0)
{
if (sd->mapname[0])
{
struct in_addr ip;
int port;
- if (map_mapname2ipport (mapname, &ip, &port) == 0)
+ if (map_mapname2ipport(mapname, &ip, &port) == 0)
{
- skill_stop_dancing (&sd->bl, 1);
- skill_unit_out_all (&sd->bl, gettick (), 1);
- clif_clearchar_area (&sd->bl, clrtype & 0xffff);
- skill_gangsterparadise (sd, 0);
- map_delblock (&sd->bl);
- memcpy (sd->mapname, mapname, 24);
+ skill_stop_dancing(&sd->bl, 1);
+ clif_clearchar(&sd->bl, clrtype);
+ skill_gangsterparadise(sd, 0);
+ map_delblock(&sd->bl);
+ memcpy(sd->mapname, mapname, 24);
sd->bl.x = x;
sd->bl.y = y;
sd->state.waitingdisconnect = 1;
- pc_makesavestatus (sd);
+ pc_makesavestatus(sd);
//The storage close routines save the char data. [Skotlex]
- if (!sd->state.storage_flag)
- chrif_save (sd);
- else if (sd->state.storage_flag == 1)
- storage_storage_quit (sd);
- else if (sd->state.storage_flag == 2)
- storage_guild_storage_quit (sd, 1);
-
- chrif_changemapserver (sd, mapname, x, y, ip, port);
+ if (!sd->state.storage_open)
+ chrif_save(sd);
+ else if (sd->state.storage_open)
+ storage_storage_quit(sd);
+
+ chrif_changemapserver(sd, mapname, x, y, ip, port);
return 0;
}
}
#if 0
- clif_authfail_fd (sd->fd, 0); // cancel
- clif_setwaitclose (sd->fd);
+ clif_authfail_fd(sd->fd, 0); // cancel
+ clif_setwaitclose(sd->fd);
#endif
return 1;
}
if (x < 0 || x >= map[m].xs || y < 0 || y >= map[m].ys)
x = y = 0;
- if ((x == 0 && y == 0) || (c = read_gat (m, x, y)) == 1 || c == 5)
+ if ((x == 0 && y == 0)
+ || bool(read_gat(m, x, y) & MapCell::UNWALKABLE))
{
if (x || y)
{
if (battle_config.error_log)
- printf ("stacked (%d,%d)\n", x, y);
+ PRINTF("stacked (%d,%d)\n", x, y);
}
do
{
- x = MRAND (map[m].xs - 2) + 1;
- y = MRAND (map[m].ys - 2) + 1;
+ x = random_::in(1, map[m].xs - 2);
+ y = random_::in(1, map[m].ys - 2);
}
- while ((c = read_gat (m, x, y)) == 1 || c == 5);
+ while (bool(read_gat(m, x, y) & MapCell::UNWALKABLE));
}
if (sd->mapname[0] && sd->bl.prev != NULL)
{
- skill_unit_out_all (&sd->bl, gettick (), 1);
- clif_clearchar_area (&sd->bl, clrtype & 0xffff);
- skill_gangsterparadise (sd, 0);
- map_delblock (&sd->bl);
- clif_changemap (sd, map[m].name, x, y); // [MouseJstr]
+ clif_clearchar(&sd->bl, clrtype);
+ skill_gangsterparadise(sd, 0);
+ map_delblock(&sd->bl);
+ clif_changemap(sd, map[m].name, x, y); // [MouseJstr]
}
- if (disguise) // disguise teleport fix [Valaris]
- sd->disguise = disguise;
-
- memcpy (sd->mapname, mapname, 24);
+ memcpy(sd->mapname, mapname, 24);
sd->bl.m = m;
sd->to_x = x;
sd->to_y = y;
@@ -4214,12 +2468,12 @@ int pc_setpos (struct map_session_data *sd, const char *mapname_org, int x, int
* PCのランダムワープ
*------------------------------------------
*/
-int pc_randomwarp (struct map_session_data *sd, int type)
+int pc_randomwarp(struct map_session_data *sd, BeingRemoveWhy type)
{
- int x, y, c, i = 0;
- int m;
+ int x, y, i = 0;
+ int m;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
m = sd->bl.m;
@@ -4228,87 +2482,28 @@ int pc_randomwarp (struct map_session_data *sd, int type)
do
{
- x = MRAND (map[m].xs - 2) + 1;
- y = MRAND (map[m].ys - 2) + 1;
+ x = random_::in(1, map[m].xs - 2);
+ y = random_::in(1, map[m].ys - 2);
}
- while (((c = read_gat (m, x, y)) == 1 || c == 5) && (i++) < 1000);
+ while (bool(read_gat(m, x, y) & MapCell::UNWALKABLE)
+ && (i++) < 1000);
if (i < 1000)
- pc_setpos (sd, map[m].name, x, y, type);
+ pc_setpos(sd, map[m].name, x, y, type);
return 0;
}
/*==========================================
- * 現在位置のメモ
- *------------------------------------------
- */
-int pc_memo (struct map_session_data *sd, int i)
-{
- int skill;
- int j;
-
- nullpo_retr (0, sd);
-
- skill = pc_checkskill (sd, AL_WARP);
-
- if (i >= MIN_PORTAL_MEMO)
- i -= MIN_PORTAL_MEMO;
- else if (map[sd->bl.m].flag.nomemo
- || (map[sd->bl.m].flag.nowarpto
- && battle_config.any_warp_GM_min_level > pc_isGM (sd)))
- {
- clif_skill_teleportmessage (sd, 1);
- return 0;
- }
-
- if (skill < 1)
- {
- clif_skill_memo (sd, 2);
- }
-
- if (skill < 2 || i < -1 || i > 2)
- {
- clif_skill_memo (sd, 1);
- return 0;
- }
-
- for (j = 0; j < 3; j++)
- {
- if (strcmp (sd->status.memo_point[j].map, map[sd->bl.m].name) == 0)
- {
- i = j;
- break;
- }
- }
-
- if (i == -1)
- {
- for (i = skill - 3; i >= 0; i--)
- {
- memcpy (&sd->status.memo_point[i + 1], &sd->status.memo_point[i],
- sizeof (struct point));
- }
- i = 0;
- }
- memcpy (sd->status.memo_point[i].map, map[sd->bl.m].name, 24);
- sd->status.memo_point[i].x = sd->bl.x;
- sd->status.memo_point[i].y = sd->bl.y;
-
- clif_skill_memo (sd, 0);
-
- return 1;
-}
-
-/*==========================================
*
*------------------------------------------
*/
-int pc_can_reach (struct map_session_data *sd, int x, int y)
+static
+int pc_can_reach(struct map_session_data *sd, int x, int y)
{
struct walkpath_data wpd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->bl.x == x && sd->bl.y == y) // 同じマス
return 1;
@@ -4317,7 +2512,7 @@ int pc_can_reach (struct map_session_data *sd, int x, int y)
wpd.path_len = 0;
wpd.path_pos = 0;
wpd.path_half = 0;
- return (path_search (&wpd, sd->bl.m, sd->bl.x, sd->bl.y, x, y, 0) !=
+ return (path_search(&wpd, sd->bl.m, sd->bl.x, sd->bl.y, x, y, 0) !=
-1) ? 1 : 0;
}
@@ -4328,13 +2523,14 @@ int pc_can_reach (struct map_session_data *sd, int x, int y)
* 次の1歩にかかる時間を計算
*------------------------------------------
*/
-static int calc_next_walk_step (struct map_session_data *sd)
+static
+interval_t calc_next_walk_step(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_retr(interval_t::zero(), sd);
if (sd->walkpath.path_pos >= sd->walkpath.path_len)
- return -1;
- if (sd->walkpath.path[sd->walkpath.path_pos] & 1)
+ return static_cast<interval_t>(-1);
+ if (dir_is_diagonal(sd->walkpath.path[sd->walkpath.path_pos]))
return sd->speed * 14 / 10;
return sd->speed;
@@ -4344,136 +2540,119 @@ static int calc_next_walk_step (struct map_session_data *sd)
* 半歩進む(timer関数)
*------------------------------------------
*/
-static void pc_walk (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+static
+void pc_walk(TimerData *, tick_t tick, int id, unsigned char data)
{
struct map_session_data *sd;
- int i, ctype;
- int moveblock;
- int x, y, dx, dy;
+ int moveblock;
+ int x, y, dx, dy;
- sd = map_id2sd (id);
+ sd = map_id2sd(id);
if (sd == NULL)
return;
- if (sd->walktimer != tid)
- {
- if (battle_config.error_log)
- printf ("pc_walk %d != %d\n", sd->walktimer, tid);
- return;
- }
- sd->walktimer = -1;
if (sd->walkpath.path_pos >= sd->walkpath.path_len
|| sd->walkpath.path_pos != data)
return;
- //歩いたので息吹のタイマーを初期化
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
-
sd->walkpath.path_half ^= 1;
if (sd->walkpath.path_half == 0)
{ // マス目中心へ到着
sd->walkpath.path_pos++;
if (sd->state.change_walk_target)
{
- pc_walktoxy_sub (sd);
+ pc_walktoxy_sub(sd);
return;
}
}
else
{ // マス目境界へ到着
- if (sd->walkpath.path[sd->walkpath.path_pos] >= 8)
+ if (sd->walkpath.path[sd->walkpath.path_pos] >= DIR::COUNT)
return;
x = sd->bl.x;
y = sd->bl.y;
- ctype = map_getcell (sd->bl.m, x, y);
- if (ctype == 1 || ctype == 5)
+ if (bool(map_getcell(sd->bl.m, x, y) & MapCell::UNWALKABLE))
{
- pc_stop_walking (sd, 1);
+ pc_stop_walking(sd, 1);
return;
}
sd->dir = sd->head_dir = sd->walkpath.path[sd->walkpath.path_pos];
- dx = dirx[(int) sd->dir];
- dy = diry[(int) sd->dir];
- ctype = map_getcell (sd->bl.m, x + dx, y + dy);
- if (ctype == 1 || ctype == 5)
+ dx = dirx[sd->dir];
+ dy = diry[sd->dir];
+ if (bool(map_getcell(sd->bl.m, x + dx, y + dy)
+ & MapCell::UNWALKABLE))
{
- pc_walktoxy_sub (sd);
+ pc_walktoxy_sub(sd);
return;
}
moveblock = (x / BLOCK_SIZE != (x + dx) / BLOCK_SIZE
|| y / BLOCK_SIZE != (y + dy) / BLOCK_SIZE);
- sd->walktimer = 1;
- map_foreachinmovearea (clif_pcoutsight, sd->bl.m, x - AREA_SIZE,
- y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE,
- dx, dy, 0, sd);
+ // sd->walktimer = dummy value that is not nullptr;
+ map_foreachinmovearea(std::bind(clif_pcoutsight, ph::_1, sd),
+ sd->bl.m, x - AREA_SIZE, y - AREA_SIZE,
+ x + AREA_SIZE, y + AREA_SIZE,
+ dx, dy,
+ BL::NUL);
x += dx;
y += dy;
if (moveblock)
- map_delblock (&sd->bl);
+ map_delblock(&sd->bl);
sd->bl.x = x;
sd->bl.y = y;
if (moveblock)
- map_addblock (&sd->bl);
+ map_addblock(&sd->bl);
- if (sd->sc_data[SC_DANCING].timer != -1)
- skill_unit_move_unit_group ((struct skill_unit_group *)
- sd->sc_data[SC_DANCING].val2,
- sd->bl.m, dx, dy);
-
- map_foreachinmovearea (clif_pcinsight, sd->bl.m, x - AREA_SIZE,
- y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE,
- -dx, -dy, 0, sd);
- sd->walktimer = -1;
+ map_foreachinmovearea(std::bind(clif_pcinsight, ph::_1, sd),
+ sd->bl.m, x - AREA_SIZE, y - AREA_SIZE,
+ x + AREA_SIZE, y + AREA_SIZE,
+ -dx, -dy,
+ BL::NUL);
+ // sd->walktimer = nullptr;
if (sd->status.party_id > 0)
{ // パーティのHP情報通知検査
- struct party *p = party_search (sd->status.party_id);
+ struct party *p = party_search(sd->status.party_id);
if (p != NULL)
{
- int p_flag = 0;
- map_foreachinmovearea (party_send_hp_check, sd->bl.m,
- x - AREA_SIZE, y - AREA_SIZE,
- x + AREA_SIZE, y + AREA_SIZE, -dx, -dy,
- BL_PC, sd->status.party_id, &p_flag);
+ int p_flag = 0;
+ map_foreachinmovearea(std::bind(party_send_hp_check, ph::_1, sd->status.party_id, &p_flag),
+ sd->bl.m, x - AREA_SIZE, y - AREA_SIZE,
+ x + AREA_SIZE, y + AREA_SIZE,
+ -dx, -dy,
+ BL::PC);
if (p_flag)
sd->party_hp = -1;
}
}
- if (sd->status.option & 4) // クローキングの消滅検査
- skill_check_cloaking (&sd->bl);
+
// ディボーション検査
- for (i = 0; i < 5; i++)
+ for (int i = 0; i < 5; i++)
if (sd->dev.val1[i])
{
- skill_devotion3 (&sd->bl, sd->dev.val1[i]);
+ skill_devotion3(&sd->bl, sd->dev.val1[i]);
break;
}
- // 被ディボーション検査
- if (sd->sc_data && sd->sc_data[SC_DEVOTION].val1)
- {
- skill_devotion2 (&sd->bl, sd->sc_data[SC_DEVOTION].val1);
- }
-
- skill_unit_move (&sd->bl, tick, 1); // スキルユニットの検査
- if (map_getcell (sd->bl.m, x, y) & 0x80)
- npc_touch_areanpc (sd, sd->bl.m, x, y);
+ if (bool(map_getcell(sd->bl.m, x, y) & MapCell::NPC_NEAR))
+ npc_touch_areanpc(sd, sd->bl.m, x, y);
else
sd->areanpc_id = 0;
}
- if ((i = calc_next_walk_step (sd)) > 0)
+ interval_t i = calc_next_walk_step(sd);
+ if (i > interval_t::zero())
{
- i = i >> 1;
- if (i < 1 && sd->walkpath.path_half == 0)
- i = 1;
- sd->walktimer =
- add_timer (tick + i, pc_walk, id, sd->walkpath.path_pos);
+ i = i / 2;
+ if (sd->walkpath.path_half == 0)
+ i = std::max(i, std::chrono::milliseconds(1));
+
+ sd->walktimer = Timer(tick + i,
+ std::bind(pc_walk, ph::_1, ph::_2,
+ id, sd->walkpath.path_pos));
}
}
@@ -4481,27 +2660,29 @@ static void pc_walk (timer_id tid, tick_t tick, custom_id_t id, custom_data_t da
* 移動可能か確認して、可能なら歩行開始
*------------------------------------------
*/
-static int pc_walktoxy_sub (struct map_session_data *sd)
+static
+int pc_walktoxy_sub(struct map_session_data *sd)
{
struct walkpath_data wpd;
- int i;
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
- if (path_search
- (&wpd, sd->bl.m, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y, 0))
+ if (path_search(&wpd, sd->bl.m, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y, 0))
return 1;
- memcpy (&sd->walkpath, &wpd, sizeof (wpd));
+ memcpy(&sd->walkpath, &wpd, sizeof(wpd));
- clif_walkok (sd);
+ clif_walkok(sd);
sd->state.change_walk_target = 0;
- if ((i = calc_next_walk_step (sd)) > 0)
+ interval_t i = calc_next_walk_step(sd);
+ if (i > interval_t::zero())
{
- i = i >> 2;
- sd->walktimer = add_timer (gettick () + i, pc_walk, sd->bl.id, 0);
+ i = i / 4;
+ sd->walktimer = Timer(gettick() + i,
+ std::bind(pc_walk, ph::_1, ph::_2,
+ sd->bl.id, 0));
}
- clif_movechar (sd);
+ clif_movechar(sd);
return 0;
}
@@ -4510,18 +2691,18 @@ static int pc_walktoxy_sub (struct map_session_data *sd)
* pc歩 行要求
*------------------------------------------
*/
-int pc_walktoxy (struct map_session_data *sd, int x, int y)
+int pc_walktoxy(struct map_session_data *sd, int x, int y)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
sd->to_x = x;
sd->to_y = y;
- if (pc_issit (sd))
- pc_setstand (sd);
+ if (pc_issit(sd))
+ pc_setstand(sd);
- if (sd->walktimer != -1 && sd->state.change_walk_target == 0)
+ if (sd->walktimer && sd->state.change_walk_target == 0)
{
// 現在歩いている最中の目的地変更なのでマス目の中心に来た時に
// timer関数からpc_walktoxy_subを呼ぶようにする
@@ -4529,7 +2710,7 @@ int pc_walktoxy (struct map_session_data *sd, int x, int y)
}
else
{
- pc_walktoxy_sub (sd);
+ pc_walktoxy_sub(sd);
}
return 0;
@@ -4539,24 +2720,21 @@ int pc_walktoxy (struct map_session_data *sd, int x, int y)
* 歩 行停止
*------------------------------------------
*/
-int pc_stop_walking (struct map_session_data *sd, int type)
+int pc_stop_walking(struct map_session_data *sd, int type)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
+
+ sd->walktimer.cancel();
- if (sd->walktimer != -1)
- {
- delete_timer (sd->walktimer, pc_walk);
- sd->walktimer = -1;
- }
sd->walkpath.path_len = 0;
sd->to_x = sd->bl.x;
sd->to_y = sd->bl.y;
if (type & 0x01)
- clif_fixpos (&sd->bl);
+ clif_fixpos(&sd->bl);
if (type & 0x02 && battle_config.pc_damage_delay)
{
- unsigned int tick = gettick ();
- int delay = battle_get_dmotion (&sd->bl);
+ tick_t tick = gettick();
+ interval_t delay = battle_get_dmotion(&sd->bl);
if (sd->canmove_tick < tick)
sd->canmove_tick = tick + delay;
}
@@ -4564,10 +2742,10 @@ int pc_stop_walking (struct map_session_data *sd, int type)
return 0;
}
-void pc_touch_all_relevant_npcs (struct map_session_data *sd)
+void pc_touch_all_relevant_npcs(struct map_session_data *sd)
{
- if (map_getcell (sd->bl.m, sd->bl.x, sd->bl.y) & 0x80)
- npc_touch_areanpc (sd, sd->bl.m, sd->bl.x, sd->bl.y);
+ if (bool(map_getcell(sd->bl.m, sd->bl.x, sd->bl.y) & MapCell::NPC_NEAR))
+ npc_touch_areanpc(sd, sd->bl.m, sd->bl.x, sd->bl.y);
else
sd->areanpc_id = 0;
}
@@ -4576,64 +2754,62 @@ void pc_touch_all_relevant_npcs (struct map_session_data *sd)
*
*------------------------------------------
*/
-int pc_movepos (struct map_session_data *sd, int dst_x, int dst_y)
+int pc_movepos(struct map_session_data *sd, int dst_x, int dst_y)
{
- int moveblock;
- int dx, dy, dist;
+ int moveblock;
+ int dx, dy;
struct walkpath_data wpd;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (path_search (&wpd, sd->bl.m, sd->bl.x, sd->bl.y, dst_x, dst_y, 0))
+ if (path_search(&wpd, sd->bl.m, sd->bl.x, sd->bl.y, dst_x, dst_y, 0))
return 1;
- sd->dir = sd->head_dir = map_calc_dir (&sd->bl, dst_x, dst_y);
+ sd->dir = sd->head_dir = map_calc_dir(&sd->bl, dst_x, dst_y);
dx = dst_x - sd->bl.x;
dy = dst_y - sd->bl.y;
- dist = distance (sd->bl.x, sd->bl.y, dst_x, dst_y);
moveblock = (sd->bl.x / BLOCK_SIZE != dst_x / BLOCK_SIZE
|| sd->bl.y / BLOCK_SIZE != dst_y / BLOCK_SIZE);
- map_foreachinmovearea (clif_pcoutsight, sd->bl.m, sd->bl.x - AREA_SIZE,
- sd->bl.y - AREA_SIZE, sd->bl.x + AREA_SIZE,
- sd->bl.y + AREA_SIZE, dx, dy, 0, sd);
+ map_foreachinmovearea(std::bind(clif_pcoutsight, ph::_1, sd),
+ sd->bl.m, sd->bl.x - AREA_SIZE, sd->bl.y - AREA_SIZE,
+ sd->bl.x + AREA_SIZE, sd->bl.y + AREA_SIZE,
+ dx, dy,
+ BL::NUL);
if (moveblock)
- map_delblock (&sd->bl);
+ map_delblock(&sd->bl);
sd->bl.x = dst_x;
sd->bl.y = dst_y;
if (moveblock)
- map_addblock (&sd->bl);
+ map_addblock(&sd->bl);
- map_foreachinmovearea (clif_pcinsight, sd->bl.m, sd->bl.x - AREA_SIZE,
- sd->bl.y - AREA_SIZE, sd->bl.x + AREA_SIZE,
- sd->bl.y + AREA_SIZE, -dx, -dy, 0, sd);
+ map_foreachinmovearea(std::bind(clif_pcinsight, ph::_1, sd),
+ sd->bl.m, sd->bl.x - AREA_SIZE, sd->bl.y - AREA_SIZE,
+ sd->bl.x + AREA_SIZE, sd->bl.y + AREA_SIZE,
+ -dx, -dy,
+ BL::NUL);
if (sd->status.party_id > 0)
{ // パーティのHP情報通知検査
- struct party *p = party_search (sd->status.party_id);
+ struct party *p = party_search(sd->status.party_id);
if (p != NULL)
{
- int flag = 0;
- map_foreachinmovearea (party_send_hp_check, sd->bl.m,
- sd->bl.x - AREA_SIZE, sd->bl.y - AREA_SIZE,
- sd->bl.x + AREA_SIZE, sd->bl.y + AREA_SIZE,
- -dx, -dy, BL_PC, sd->status.party_id,
- &flag);
+ int flag = 0;
+ map_foreachinmovearea(std::bind(party_send_hp_check, ph::_1, sd->status.party_id, &flag),
+ sd->bl.m, sd->bl.x - AREA_SIZE, sd->bl.y - AREA_SIZE,
+ sd->bl.x + AREA_SIZE, sd->bl.y + AREA_SIZE,
+ -dx, -dy,
+ BL::PC);
if (flag)
sd->party_hp = -1;
}
}
- if (sd->status.option & 4) // クローキングの消滅検査
- skill_check_cloaking (&sd->bl);
-
- skill_unit_move (&sd->bl, gettick (), dist + 7); // スキルユニットの検査
-
- pc_touch_all_relevant_npcs (sd);
+ pc_touch_all_relevant_npcs(sd);
return 0;
}
@@ -4644,114 +2820,25 @@ int pc_movepos (struct map_session_data *sd, int dst_x, int dst_y)
* スキルの検索 所有していた場合Lvが返る
*------------------------------------------
*/
-int pc_checkskill (struct map_session_data *sd, int skill_id)
+int pc_checkskill(struct map_session_data *sd, SkillID skill_id)
{
if (sd == NULL)
return 0;
- if (skill_id >= 10000)
- {
- struct guild *g;
- if (sd->status.guild_id > 0
- && (g = guild_search (sd->status.guild_id)) != NULL)
- return guild_checkskill (g, skill_id);
- return 0;
- }
- if (sd->status.skill[skill_id].id == skill_id)
- return (sd->status.skill[skill_id].lv);
-
- return 0;
-}
-
-/*==========================================
- * 武器変更によるスキルの継続チェック
- * 引数:
- * struct map_session_data *sd セッションデータ
- * int nameid 装備品ID
- * 返り値:
- * 0 変更なし
- * -1 スキルを解除
- *------------------------------------------
- */
-int pc_checkallowskill (struct map_session_data *sd)
-{
- nullpo_retr (0, sd);
-
- if (sd->sc_data == NULL)
- return 0;
-
- if (!(skill_get_weapontype (KN_TWOHANDQUICKEN) & (1 << sd->status.weapon))
- && 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)
- { // オーラブレード
- 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)
- { // パリイング
- 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)
- { // コンセントレーション
- 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)
- { // スピアクィッケン
- 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)
- { // アドレナリンラッシュ
- skill_status_change_end (&sd->bl, SC_ADRENALINE, -1); // アドレナリンラッシュを解除
- return -1;
- }
-
- if (sd->status.shield <= 0)
- {
- if (sd->sc_data[SC_AUTOGUARD].timer != -1)
- { // オートガード
- skill_status_change_end (&sd->bl, SC_AUTOGUARD, -1);
- return -1;
- }
- if (sd->sc_data[SC_DEFENDER].timer != -1)
- { // ディフェンダー
- skill_status_change_end (&sd->bl, SC_DEFENDER, -1);
- return -1;
- }
- if (sd->sc_data[SC_REFLECTSHIELD].timer != -1)
- { //リフレクトシールド
- skill_status_change_end (&sd->bl, SC_REFLECTSHIELD, -1);
- return -1;
- }
- }
-
- return 0;
+ return sd->status.skill[skill_id].lv;
}
/*==========================================
* 装 備品のチェック
*------------------------------------------
*/
-int pc_checkequip (struct map_session_data *sd, int pos)
+int pc_checkequip(struct map_session_data *sd, EPOS pos)
{
- int i;
-
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
- for (i = 0; i < 11; i++)
+ for (EQUIP i : EQUIPs)
{
- if (pos & equip_pos[i])
+ if (bool(pos & equip_pos[i]))
return sd->equip_index[i];
}
@@ -4759,120 +2846,49 @@ int pc_checkequip (struct map_session_data *sd, int pos)
}
/*==========================================
- * 転生職や養子職の元の職業を返す
- *------------------------------------------
- */
-struct pc_base_job pc_calc_base_job (int b_class)
-{
- struct pc_base_job bj;
- //転生や養子の場合の元の職業を算出する
- if (b_class < MAX_PC_CLASS)
- { //通常
- bj.job = b_class;
- bj.upper = 0;
- }
- else if (b_class >= 4001 && b_class < 4023)
- { //転生職
- bj.job = b_class - 4001;
- bj.upper = 1;
- }
- else if (b_class == 23 + 4023 - 1)
- { //養子スパノビ
- bj.job = b_class - (4023 - 1);
- bj.upper = 2;
- }
- else
- { //養子スパノビ以外の養子
- bj.job = b_class - 4023;
- bj.upper = 2;
- }
-
- if (battle_config.enable_upper_class == 0)
- { //confで無効になっていたらupper=0
- bj.upper = 0;
- }
-
- if (bj.job == 0)
- {
- bj.type = 0;
- }
- else if (bj.job < 7)
- {
- bj.type = 1;
- }
- else
- {
- bj.type = 2;
- }
-
- return bj;
-}
-
-/*==========================================
* PCの攻撃 (timer関数)
*------------------------------------------
*/
static
-void pc_attack_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void pc_attack_timer(TimerData *, tick_t tick, int id)
{
struct map_session_data *sd;
struct block_list *bl;
- struct status_change *sc_data;
- short *opt;
- int dist, skill, range;
- int attack_spell_delay;
+ eptr<struct status_change, StatusChange> sc_data;
+ int dist, range;
- sd = map_id2sd (id);
+ sd = map_id2sd(id);
if (sd == NULL)
return;
- if (sd->attacktimer != tid)
- {
- if (battle_config.error_log)
- printf ("pc_attack_timer %d != %d\n", sd->attacktimer, tid);
- return;
- }
- sd->attacktimer = -1;
if (sd->bl.prev == NULL)
return;
- bl = map_id2bl (sd->attacktarget);
+ bl = map_id2bl(sd->attacktarget);
if (bl == NULL || bl->prev == NULL)
return;
- if (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl))
+ if (bl->type == BL::PC && pc_isdead((struct map_session_data *) bl))
return;
// 同じmapでないなら攻撃しない
// PCが死んでても攻撃しない
- if (sd->bl.m != bl->m || pc_isdead (sd))
+ if (sd->bl.m != bl->m || pc_isdead(sd))
return;
- if (sd->opt1 > 0 || sd->status.option & 2 || sd->status.option & 16388) // 異常などで攻撃できない
+ // 異常などで攻撃できない
+ if (sd->opt1 != Opt1::ZERO)
return;
- if (sd->sc_data[SC_AUTOCOUNTER].timer != -1)
- return;
- if (sd->sc_data[SC_BLADESTOP].timer != -1)
+ Option *opt = battle_get_option(bl);
+ if (opt != NULL && bool(*opt & Option::REAL_ANY_HIDE))
return;
- if ((opt = battle_get_option (bl)) != NULL && *opt & 0x46)
- return;
- if (((sc_data = battle_get_sc_data (bl)) != NULL
- && sc_data[SC_TRICKDEAD].timer != -1)
- || ((sc_data = battle_get_sc_data (bl)) != NULL
- && sc_data[SC_BASILICA].timer != -1))
- return;
-
- if (sd->skilltimer != -1 && pc_checkskill (sd, SA_FREECAST) <= 0)
- 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)
+ if (tick < sd->canact_tick)
{
- clif_skill_fail (sd, 1, 4, 0);
+ clif_skill_fail(sd, SkillID::ONE, 4, 0);
return;
}
}
@@ -4880,9 +2896,9 @@ void pc_attack_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t d
if (sd->attackabletime > tick)
return; // cannot attack yet
- attack_spell_delay = sd->attack_spell_delay;
+ interval_t attack_spell_delay = sd->attack_spell_delay;
if (sd->attack_spell_override // [Fate] If we have an active attack spell, use that
- && spell_attack (id, sd->attacktarget))
+ && spell_attack(id, sd->attacktarget))
{
// Return if the spell succeeded. If the spell had disspiated, spell_attack() may fail.
sd->attackabletime = tick + attack_spell_delay;
@@ -4890,9 +2906,9 @@ void pc_attack_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t d
}
else
{
- dist = distance (sd->bl.x, sd->bl.y, bl->x, bl->y);
+ dist = distance(sd->bl.x, sd->bl.y, bl->x, bl->y);
range = sd->attackrange;
- if (sd->status.weapon != 11)
+ if (sd->status.weapon != ItemLook::BOW)
range++;
if (dist > range)
{ // 届 かないので移動
@@ -4901,57 +2917,40 @@ void pc_attack_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t d
return;
}
- if (dist <= range && !battle_check_range (&sd->bl, bl, range))
+ if (dist <= range && !battle_check_range(&sd->bl, bl, range))
{
- if (pc_can_reach (sd, bl->x, bl->y) && sd->canmove_tick < tick
- && (sd->sc_data[SC_ANKLE].timer == -1
- || sd->sc_data[SC_SPIDERWEB].timer == -1))
+ if (pc_can_reach(sd, bl->x, bl->y) && sd->canmove_tick < tick)
// TMW client doesn't support this
//pc_walktoxy(sd,bl->x,bl->y);
- clif_movetoattack (sd, bl);
- sd->attackabletime = tick + (sd->aspd << 1);
+ clif_movetoattack(sd, bl);
+ sd->attackabletime = tick + (sd->aspd * 2);
}
else
{
if (battle_config.pc_attack_direction_change)
- sd->dir = sd->head_dir = map_calc_dir (&sd->bl, bl->x, bl->y); // 向き設定
+ sd->dir = sd->head_dir = map_calc_dir(&sd->bl, bl->x, bl->y); // 向き設定
- if (sd->walktimer != -1)
- pc_stop_walking (sd, 1);
+ if (sd->walktimer)
+ pc_stop_walking(sd, 1);
- if (sd->sc_data[SC_COMBO].timer == -1)
{
- map_freeblock_lock ();
- pc_stop_walking (sd, 0);
+ map_freeblock_lock();
+ pc_stop_walking(sd, 0);
sd->attacktarget_lv =
- battle_weapon_attack (&sd->bl, bl, tick, 0);
- if (!(battle_config.pc_cloak_check_type & 2)
- && 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);
+ battle_weapon_attack(&sd->bl, bl, tick);
+ map_freeblock_unlock();
+ sd->attackabletime = tick + (sd->aspd * 2);
}
if (sd->attackabletime <= tick)
- sd->attackabletime = tick + (battle_config.max_aspd << 1);
+ sd->attackabletime = tick + static_cast<interval_t>(battle_config.max_aspd) * 2;
}
}
if (sd->state.attack_continue)
{
- sd->attacktimer =
- add_timer (sd->attackabletime, pc_attack_timer, sd->bl.id, 0);
+ sd->attacktimer = Timer(sd->attackabletime,
+ std::bind(pc_attack_timer, ph::_1, ph::_2,
+ sd->bl.id));
}
}
@@ -4960,40 +2959,40 @@ void pc_attack_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t d
* typeが1なら継続攻撃
*------------------------------------------
*/
-int pc_attack (struct map_session_data *sd, int target_id, int type)
+int pc_attack(struct map_session_data *sd, int target_id, int type)
{
struct block_list *bl;
- int d;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- bl = map_id2bl (target_id);
+ bl = map_id2bl(target_id);
if (bl == NULL)
return 1;
- if (bl->type == BL_NPC)
+ if (bl->type == BL::NPC)
{ // monster npcs [Valaris]
- npc_click (sd, RFIFOL (sd->fd, 2));
+ npc_click(sd, RFIFOL(sd->fd, 2));
return 0;
}
- if (!battle_check_target (&sd->bl, bl, BCT_ENEMY))
+ if (!battle_check_target(&sd->bl, bl, BCT_ENEMY))
return 1;
- if (sd->attacktimer != -1)
- pc_stopattack (sd);
+ if (sd->attacktimer)
+ pc_stopattack(sd);
sd->attacktarget = target_id;
sd->state.attack_continue = type;
- d = DIFF_TICK (sd->attackabletime, gettick ());
- if (d > 0 && d < 2000)
+ interval_t d = sd->attackabletime - gettick();
+ if (d > interval_t::zero() && d < std::chrono::seconds(2))
{ // 攻撃delay中
- sd->attacktimer =
- add_timer (sd->attackabletime, pc_attack_timer, sd->bl.id, 0);
+ sd->attacktimer = Timer(sd->attackabletime,
+ std::bind(pc_attack_timer, ph::_1, ph::_2,
+ sd->bl.id));
}
else
{
// 本来timer関数なので引数を合わせる
- pc_attack_timer (-1, gettick (), sd->bl.id, 0);
+ pc_attack_timer(nullptr, gettick(), sd->bl.id);
}
return 0;
@@ -5003,15 +3002,12 @@ int pc_attack (struct map_session_data *sd, int target_id, int type)
* 継続攻撃停止
*------------------------------------------
*/
-int pc_stopattack (struct map_session_data *sd)
+int pc_stopattack(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
+
+ sd->attacktimer.cancel();
- if (sd->attacktimer != -1)
- {
- delete_timer (sd->attacktimer, pc_attack_timer);
- sd->attacktimer = -1;
- }
sd->attacktarget = 0;
sd->state.attack_continue = 0;
@@ -5019,158 +3015,71 @@ int pc_stopattack (struct map_session_data *sd)
}
static
-void pc_follow_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+int pc_checkbaselevelup(struct map_session_data *sd)
{
- struct map_session_data *sd, *bl;
-
- sd = map_id2sd (id);
- if (sd == NULL || sd->followtimer != tid)
- return;
-
- sd->followtimer = -1;
-
- do
- {
- if (sd->bl.prev == NULL)
- break;
-
- bl = (struct map_session_data *) map_id2bl (sd->followtarget);
-
- if (bl == NULL)
- return;
+ int next = pc_nextbaseexp(sd);
- if (bl->bl.prev == NULL)
- break;
-
- if (bl->bl.type == BL_PC
- && pc_isdead ((struct map_session_data *) bl))
- return;
-
- if (sd->skilltimer == -1 && sd->attacktimer == -1
- && sd->walktimer == -1)
- {
- if ((sd->bl.m == bl->bl.m)
- && pc_can_reach (sd, bl->bl.x, bl->bl.y))
- {
- if (distance (sd->bl.x, sd->bl.y, bl->bl.x, bl->bl.y) > 5)
- pc_walktoxy (sd, bl->bl.x, bl->bl.y);
- }
- else
- pc_setpos ((struct map_session_data *) sd, bl->mapname,
- bl->bl.x, bl->bl.y, 3);
- }
- }
- while (0);
-
- sd->followtimer =
- add_timer (tick + sd->aspd, pc_follow_timer, sd->bl.id, 0);
-}
-
-int pc_follow (struct map_session_data *sd, int target_id)
-{
- struct block_list *bl;
-
- bl = map_id2bl (target_id);
- if (bl == NULL)
- return 1;
- sd->followtarget = target_id;
- if (sd->followtimer != -1)
- {
- delete_timer (sd->followtimer, pc_follow_timer);
- sd->followtimer = -1;
- }
-
- pc_follow_timer (-1, gettick (), sd->bl.id, 0);
-
- return 0;
-}
-
-int pc_checkbaselevelup (struct map_session_data *sd)
-{
- int next = pc_nextbaseexp (sd);
-
- nullpo_retr (0, sd);
+ nullpo_ret(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;
sd->status.base_level++;
sd->status.status_point += (sd->status.base_level + 14) / 4;
- clif_updatestatus (sd, SP_STATUSPOINT);
- clif_updatestatus (sd, SP_BASELEVEL);
- clif_updatestatus (sd, SP_NEXTBASEEXP);
- 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_updatestatus(sd, SP::STATUSPOINT);
+ clif_updatestatus(sd, SP::BASELEVEL);
+ clif_updatestatus(sd, SP::NEXTBASEEXP);
+ pc_calcstatus(sd, 0);
+ pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
- clif_misceffect (&sd->bl, 0);
+ clif_misceffect(&sd->bl, 0);
//レベルアップしたのでパーティー情報を更新する
//(公平範囲チェック)
- party_send_movemap (sd);
- MAP_LOG_XP (sd, "LEVELUP") return 1;
+ party_send_movemap(sd);
+ MAP_LOG_XP(sd, "LEVELUP");
+ return 1;
}
return 0;
}
+inline
+int RAISE_COST(int x)
+{
+ return (x * (x - 1)) / 2;
+}
+
/*========================================
* Compute the maximum for sd->skill_point, i.e., the max. number of skill points that can still be filled in
*----------------------------------------
*/
static
-int pc_skillpt_potential (struct map_session_data *sd)
+int pc_skillpt_potential(struct map_session_data *sd)
{
- int skill_id;
- int potential = 0;
-
-#define RAISE_COST(x) (((x)*((x)-1))>>1)
+ int potential = 0;
- for (skill_id = 0; skill_id < MAX_SKILL; skill_id++)
- if (sd->status.skill[skill_id].id != 0
+ for (SkillID skill_id = SkillID(); skill_id < MAX_SKILL;
+ skill_id = SkillID(uint16_t(skill_id) + 1))
+ if (sd->status.skill[skill_id].lv
&& sd->status.skill[skill_id].lv < skill_db[skill_id].max_raise)
- potential += RAISE_COST (skill_db[skill_id].max_raise)
- - RAISE_COST (sd->status.skill[skill_id].lv);
-#undef RAISE_COST
+ potential += RAISE_COST(skill_db[skill_id].max_raise)
+ - RAISE_COST(sd->status.skill[skill_id].lv);
return potential;
}
-int pc_checkjoblevelup (struct map_session_data *sd)
+static
+int pc_checkjoblevelup(struct map_session_data *sd)
{
- int next = pc_nextjobexp (sd);
+ int next = pc_nextjobexp(sd);
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->status.job_exp >= next && next > 0)
{
- if (pc_skillpt_potential (sd) < sd->status.skill_point)
+ if (pc_skillpt_potential(sd) < sd->status.skill_point)
{ // [Fate] Bah, this is is painful.
// But the alternative is quite error-prone, and eAthena has far worse performance issues...
sd->status.job_exp = next - 1;
@@ -5180,70 +3089,51 @@ int pc_checkjoblevelup (struct map_session_data *sd)
// job側レベルアップ処理
sd->status.job_exp -= next;
- clif_updatestatus (sd, SP_NEXTJOBEXP);
+ clif_updatestatus(sd, SP::NEXTJOBEXP);
sd->status.skill_point++;
- clif_updatestatus (sd, SP_SKILLPOINT);
- pc_calcstatus (sd, 0);
+ clif_updatestatus(sd, SP::SKILLPOINT);
+ pc_calcstatus(sd, 0);
- MAP_LOG_PC (sd, "SKILLPOINTS-UP %d", sd->status.skill_point);
+ MAP_LOG_PC(sd, "SKILLPOINTS-UP %d", sd->status.skill_point);
if (sd->status.job_level < 250
&& sd->status.job_level < sd->status.base_level * 2)
sd->status.job_level++; // Make levelling up a little harder
- clif_misceffect (&sd->bl, 1);
+ clif_misceffect(&sd->bl, 1);
return 1;
}
return 0;
}
-/*==========================================
- * 経験値取得
- *------------------------------------------
- */
-int pc_gainexp (struct map_session_data *sd, int base_exp, int job_exp)
-{
- return pc_gainexp_reason (sd, base_exp, job_exp,
- PC_GAINEXP_REASON_KILLING);
-}
-
-int pc_gainexp_reason (struct map_session_data *sd, int base_exp, int job_exp,
- int reason)
+int pc_gainexp_reason(struct map_session_data *sd, int base_exp, int job_exp,
+ PC_GAINEXP_REASON reason)
{
- char output[256];
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (sd->bl.prev == NULL || pc_isdead (sd))
+ if (sd->bl.prev == NULL || pc_isdead(sd))
return 0;
if ((battle_config.pvp_exp == 0) && map[sd->bl.m].flag.pvp) // [MouseJstr]
return 0; // no exp on pvp maps
- MAP_LOG_PC (sd, "GAINXP %d %d %s", base_exp, job_exp,
- ((reason ==
- 2) ? "SCRIPTXP" : ((reason == 1) ? "HEALXP" : "KILLXP")));
-
- if (sd->sc_data[SC_RICHMANKIM].timer != -1)
- { // added bounds checking [Vaalris]
- base_exp +=
- base_exp * (25 + sd->sc_data[SC_RICHMANKIM].val1 * 25) / 100;
- job_exp +=
- job_exp * (25 + sd->sc_data[SC_RICHMANKIM].val1 * 25) / 100;
- }
-
- if (sd->status.guild_id > 0)
- { // ギルドに上納
- base_exp -= guild_payexp (sd, base_exp);
- if (base_exp < 0)
- base_exp = 0;
- }
-
- if (!battle_config.multi_level_up && pc_nextbaseafter (sd))
- {
- while (sd->status.base_exp + base_exp >= pc_nextbaseafter (sd)
- && sd->status.base_exp <= pc_nextbaseexp (sd)
- && pc_nextbaseafter (sd) > 0)
+ earray<const char *, PC_GAINEXP_REASON, PC_GAINEXP_REASON::COUNT> reasons //=
+ {{
+ "KILLXP",
+ "HEALXP",
+ "SCRIPTXP",
+ "SHAREXP",
+ /* Insert new types here */
+ "UNKNOWNXP"
+ }};
+ MAP_LOG_PC(sd, "GAINXP %d %d %s", base_exp, job_exp, reasons[reason]);
+
+ if (!battle_config.multi_level_up && pc_nextbaseafter(sd))
+ {
+ while (sd->status.base_exp + base_exp >= pc_nextbaseafter(sd)
+ && sd->status.base_exp <= pc_nextbaseexp(sd)
+ && pc_nextbaseafter(sd) > 0)
{
base_exp *= .90;
}
@@ -5252,7 +3142,7 @@ int pc_gainexp_reason (struct map_session_data *sd, int base_exp, int job_exp,
sd->status.base_exp += base_exp;
// [Fate] Adjust experience points that healers can extract from this character
- if (reason != PC_GAINEXP_REASON_HEALING)
+ if (reason != PC_GAINEXP_REASON::HEALING)
{
const int max_heal_xp =
20 + (sd->status.base_level * sd->status.base_level);
@@ -5265,14 +3155,14 @@ int pc_gainexp_reason (struct map_session_data *sd, int base_exp, int job_exp,
if (sd->status.base_exp < 0)
sd->status.base_exp = 0;
- while (pc_checkbaselevelup (sd));
+ while (pc_checkbaselevelup(sd));
- clif_updatestatus (sd, SP_BASEEXP);
- if (!battle_config.multi_level_up && pc_nextjobafter (sd))
+ clif_updatestatus(sd, SP::BASEEXP);
+ if (!battle_config.multi_level_up && pc_nextjobafter(sd))
{
- while (sd->status.job_exp + job_exp >= pc_nextjobafter (sd)
- && sd->status.job_exp <= pc_nextjobexp (sd)
- && pc_nextjobafter (sd) > 0)
+ while (sd->status.job_exp + job_exp >= pc_nextjobafter(sd)
+ && sd->status.job_exp <= pc_nextjobexp(sd)
+ && pc_nextjobafter(sd) > 0)
{
job_exp *= .90;
}
@@ -5282,24 +3172,25 @@ int pc_gainexp_reason (struct map_session_data *sd, int base_exp, int job_exp,
if (sd->status.job_exp < 0)
sd->status.job_exp = 0;
- while (pc_checkjoblevelup (sd));
+ while (pc_checkjoblevelup(sd));
- clif_updatestatus (sd, SP_JOBEXP);
+ clif_updatestatus(sd, SP::JOBEXP);
if (battle_config.disp_experience)
{
- sprintf (output,
- "Experienced Gained Base:%d Job:%d", base_exp, job_exp);
- clif_disp_onlyself (sd, output, strlen (output));
+ std::string output = STRPRINTF(
+ "Experienced Gained Base:%d Job:%d",
+ base_exp, job_exp);
+ clif_displaymessage(sd->fd, output);
}
return 0;
}
-int pc_extract_healer_exp (struct map_session_data *sd, int max)
+int pc_extract_healer_exp(struct map_session_data *sd, int max)
{
- int amount;
- nullpo_retr (0, sd);
+ int amount;
+ nullpo_ret(sd);
amount = sd->heal_xp;
if (max < amount)
@@ -5313,38 +3204,21 @@ int pc_extract_healer_exp (struct map_session_data *sd, int max)
* base level側必要経験値計算
*------------------------------------------
*/
-int pc_nextbaseexp (struct map_session_data *sd)
+int pc_nextbaseexp(struct map_session_data *sd)
{
- int i;
-
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->status.base_level >= MAX_LEVEL || sd->status.base_level <= 0)
return 0;
- if (sd->status.pc_class == 0)
- i = 0;
- else if (sd->status.pc_class <= 6)
- i = 1;
- else if (sd->status.pc_class <= 22)
- i = 2;
- else if (sd->status.pc_class == 23)
- i = 3;
- else if (sd->status.pc_class == 4001)
- i = 4;
- else if (sd->status.pc_class <= 4007)
- i = 5;
- else
- i = 6;
-
- return exp_table[i][sd->status.base_level - 1];
+ return exp_table_0[sd->status.base_level - 1];
}
/*==========================================
* job level側必要経験値計算
*------------------------------------------
*/
-int pc_nextjobexp (struct map_session_data *sd)
+int pc_nextjobexp(struct map_session_data *sd)
{
// [fate] For normal levels, this ranges from 20k to 50k, depending on job level.
// Job level is at most twice the player's experience level (base_level). Levelling
@@ -5358,83 +3232,44 @@ int pc_nextjobexp (struct map_session_data *sd)
* base level after next [Valaris]
*------------------------------------------
*/
-int pc_nextbaseafter (struct map_session_data *sd)
+int pc_nextbaseafter(struct map_session_data *sd)
{
- int i;
-
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->status.base_level >= MAX_LEVEL || sd->status.base_level <= 0)
return 0;
- if (sd->status.pc_class == 0)
- i = 0;
- else if (sd->status.pc_class <= 6)
- i = 1;
- else if (sd->status.pc_class <= 22)
- i = 2;
- else if (sd->status.pc_class == 23)
- i = 3;
- else if (sd->status.pc_class == 4001)
- i = 4;
- else if (sd->status.pc_class <= 4007)
- i = 5;
- else
- i = 6;
-
- return exp_table[i][sd->status.base_level];
+ return exp_table_0[sd->status.base_level];
}
/*==========================================
* job level after next [Valaris]
*------------------------------------------
*/
-int pc_nextjobafter (struct map_session_data *sd)
+int pc_nextjobafter(struct map_session_data *sd)
{
- int i;
-
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->status.job_level >= MAX_LEVEL || sd->status.job_level <= 0)
return 0;
- if (sd->status.pc_class == 0)
- i = 7;
- else if (sd->status.pc_class <= 6)
- i = 8;
- else if (sd->status.pc_class <= 22)
- i = 9;
- else if (sd->status.pc_class == 23)
- i = 10;
- else if (sd->status.pc_class == 4001)
- i = 11;
- else if (sd->status.pc_class <= 4007)
- i = 12;
- else
- i = 13;
-
- return exp_table[i][sd->status.job_level];
+ return exp_table_7[sd->status.job_level];
}
/*==========================================
-
* 必要ステータスポイント計算
*------------------------------------------
*/
-int pc_need_status_point (struct map_session_data *sd, int type)
+// TODO: replace SP by ATTR
+int pc_need_status_point(struct map_session_data *sd, SP type)
{
- int val;
+ int val;
- nullpo_retr (-1, sd);
+ nullpo_retr(-1, sd);
- if (type < SP_STR || type > SP_LUK)
+ if (type < SP::STR || type > SP::LUK)
return -1;
- val =
- type == SP_STR ? sd->status.str :
- type == SP_AGI ? sd->status.agi :
- type == SP_VIT ? sd->status.vit :
- type == SP_INT ? sd->status.int_ :
- type == SP_DEX ? sd->status.dex : sd->status.luk;
+ val = sd->status.attrs[sp_to_attr(type)];
return (val + 9) / 10 + 1;
}
@@ -5443,75 +3278,36 @@ int pc_need_status_point (struct map_session_data *sd, int type)
* 能力値成長
*------------------------------------------
*/
-int pc_statusup (struct map_session_data *sd, int type)
+int pc_statusup(struct map_session_data *sd, SP type)
{
- int need, val = 0;
+ int need, val = 0;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- switch (type)
- {
- case SP_STR:
- val = sd->status.str;
- break;
- case SP_AGI:
- val = sd->status.agi;
- break;
- case SP_VIT:
- val = sd->status.vit;
- break;
- case SP_INT:
- val = sd->status.int_;
- break;
- case SP_DEX:
- val = sd->status.dex;
- break;
- case SP_LUK:
- val = sd->status.luk;
- break;
- }
+ if (SP::STR <= type && type <= SP::LUK)
+ val = sd->status.attrs[sp_to_attr(type)];
- need = pc_need_status_point (sd, type);
- if (type < SP_STR || type > SP_LUK || need < 0
+ need = pc_need_status_point(sd, type);
+ if (type < SP::STR || type > SP::LUK || need < 0
|| need > sd->status.status_point
|| val >= battle_config.max_parameter)
{
- clif_statusupack (sd, type, 0, val);
- clif_updatestatus (sd, SP_STATUSPOINT);
+ clif_statusupack(sd, type, 0, val);
+ clif_updatestatus(sd, SP::STATUSPOINT);
return 1;
}
- switch (type)
- {
- case SP_STR:
- val = ++sd->status.str;
- break;
- case SP_AGI:
- val = ++sd->status.agi;
- break;
- case SP_VIT:
- val = ++sd->status.vit;
- break;
- case SP_INT:
- val = ++sd->status.int_;
- break;
- case SP_DEX:
- val = ++sd->status.dex;
- break;
- case SP_LUK:
- val = ++sd->status.luk;
- break;
- }
+ val = ++sd->status.attrs[sp_to_attr(type)];
sd->status.status_point -= need;
- if (need != pc_need_status_point (sd, type))
+ if (need != pc_need_status_point(sd, type))
{
- clif_updatestatus (sd, type - SP_STR + SP_USTR);
+ clif_updatestatus(sd, sp_to_usp(type));
}
- clif_updatestatus (sd, SP_STATUSPOINT);
- clif_updatestatus (sd, type);
- pc_calcstatus (sd, 0);
- clif_statusupack (sd, type, 1, val);
+ clif_updatestatus(sd, SP::STATUSPOINT);
+ clif_updatestatus(sd, type);
+ pc_calcstatus(sd, 0);
+ clif_statusupack(sd, type, 1, val);
- MAP_LOG_STATS (sd, "STATUP");
+ MAP_LOG_STATS(sd, "STATUP");
return 0;
}
@@ -5520,77 +3316,24 @@ int pc_statusup (struct map_session_data *sd, int type)
* 能力値成長
*------------------------------------------
*/
-int pc_statusup2 (struct map_session_data *sd, int type, int val)
+int pc_statusup2(struct map_session_data *sd, SP type, int val)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (type < SP_STR || type > SP_LUK)
+ if (type < SP::STR || type > SP::LUK)
{
- clif_statusupack (sd, type, 0, 0);
+ clif_statusupack(sd, type, 0, 0);
return 1;
}
- switch (type)
- {
- case SP_STR:
- if (sd->status.str + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if (sd->status.str + val < 1)
- val = 1;
- else
- val += sd->status.str;
- sd->status.str = val;
- break;
- case SP_AGI:
- if (sd->status.agi + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if (sd->status.agi + val < 1)
- val = 1;
- else
- val += sd->status.agi;
- sd->status.agi = val;
- break;
- case SP_VIT:
- if (sd->status.vit + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if (sd->status.vit + val < 1)
- val = 1;
- else
- val += sd->status.vit;
- sd->status.vit = val;
- break;
- case SP_INT:
- if (sd->status.int_ + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if (sd->status.int_ + val < 1)
- val = 1;
- else
- val += sd->status.int_;
- sd->status.int_ = val;
- break;
- case SP_DEX:
- if (sd->status.dex + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if (sd->status.dex + val < 1)
- val = 1;
- else
- val += sd->status.dex;
- sd->status.dex = val;
- break;
- case SP_LUK:
- if (sd->status.luk + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if (sd->status.luk + val < 1)
- val = 1;
- else
- val = sd->status.luk + val;
- sd->status.luk = val;
- break;
- }
- clif_updatestatus (sd, type - SP_STR + SP_USTR);
- clif_updatestatus (sd, type);
- pc_calcstatus (sd, 0);
- clif_statusupack (sd, type, 1, val);
- MAP_LOG_STATS (sd, "STATUP2");
+ ATTR attr = sp_to_attr(type);
+ val = sd->status.attrs[attr] + val;
+ val = std::min(val, battle_config.max_parameter);
+ val = std::max(val, 1);
+ clif_updatestatus(sd, sp_to_usp(type));
+ clif_updatestatus(sd, type);
+ pc_calcstatus(sd, 0);
+ clif_statusupack(sd, type, 1, val);
+ MAP_LOG_STATS(sd, "STATUP2");
return 0;
}
@@ -5599,83 +3342,38 @@ int pc_statusup2 (struct map_session_data *sd, int type, int val)
* スキルポイント割り振り
*------------------------------------------
*/
-int pc_skillup (struct map_session_data *sd, int skill_num)
+int pc_skillup(struct map_session_data *sd, SkillID skill_num)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (sd->status.skill[skill_num].id != 0
+ if (sd->status.skill[skill_num].lv
&& sd->status.skill_point >= sd->status.skill[skill_num].lv
&& sd->status.skill[skill_num].lv < skill_db[skill_num].max_raise)
{
sd->status.skill_point -= sd->status.skill[skill_num].lv;
sd->status.skill[skill_num].lv++;
- pc_calcstatus (sd, 0);
- clif_skillup (sd, skill_num);
- clif_updatestatus (sd, SP_SKILLPOINT);
- clif_skillinfoblock (sd);
+ pc_calcstatus(sd, 0);
+ clif_skillup(sd, skill_num);
+ clif_updatestatus(sd, SP::SKILLPOINT);
+ clif_skillinfoblock(sd);
MAP_LOG_PC(sd, "SKILLUP %d %d %d",
- skill_num, sd->status.skill[skill_num].lv, skill_power(sd, skill_num));
+ skill_num, sd->status.skill[skill_num].lv,
+ skill_power(sd, skill_num));
}
return 0;
}
/*==========================================
- * /allskill
- *------------------------------------------
- */
-int pc_allskillup (struct map_session_data *sd)
-{
- int i, id;
- int c = 0, s = 0;
- //転生や養子の場合の元の職業を算出する
- struct pc_base_job s_class;
-
- nullpo_retr (0, sd);
-
- s_class = pc_calc_base_job (sd->status.pc_class);
- c = s_class.job;
- s = (s_class.upper == 1) ? 1 : 0; //転生以外は通常のスキル?
-
- for (i = 0; i < MAX_SKILL; i++)
- sd->status.skill[i].id = 0;
-
- if (battle_config.gm_allskill > 0
- && pc_isGM (sd) >= battle_config.gm_allskill)
- {
- // 全てのスキル
- for (i = 1; i < 158; i++)
- sd->status.skill[i].lv = skill_get_max (i);
- for (i = 210; i < 291; i++)
- sd->status.skill[i].lv = skill_get_max (i);
- for (i = 304; i < MAX_SKILL; i++)
- sd->status.skill[i].lv = skill_get_max (i);
- }
- else
- {
- for (i = 0; (id = skill_tree[s][c][i].id) > 0; i++)
- {
- if (sd->status.skill[id].id == 0 && skill_get_inf2 (id) & 0x01)
- sd->status.skill[id].lv = skill_get_max (id);
- }
- }
- pc_calcstatus (sd, 0);
-
- return 0;
-}
-
-/*==========================================
* /resetlvl
*------------------------------------------
*/
-int pc_resetlvl (struct map_session_data *sd, int type)
+int pc_resetlvl(struct map_session_data *sd, int type)
{
- int i;
-
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- for (i = 1; i < MAX_SKILL; i++)
+ for (SkillID i : erange(SkillID(1), MAX_SKILL))
{
sd->status.skill[i].lv = 0;
}
@@ -5687,17 +3385,10 @@ int pc_resetlvl (struct map_session_data *sd, int type)
sd->status.job_level = 1;
sd->status.base_exp = 0;
sd->status.job_exp = 0;
- if (sd->status.option != 0)
- sd->status.option = 0;
+ sd->status.option = Option::ZERO;
- sd->status.str = 1;
- sd->status.agi = 1;
- sd->status.vit = 1;
- sd->status.int_ = 1;
- sd->status.dex = 1;
- sd->status.luk = 1;
- if (sd->status.pc_class == 4001)
- sd->status.status_point = 100;
+ for (ATTR attr : ATTRs)
+ sd->status.attrs[attr] = 1;
}
if (type == 2)
@@ -5719,41 +3410,42 @@ int pc_resetlvl (struct map_session_data *sd, int type)
sd->status.job_exp = 0;
}
- clif_updatestatus (sd, SP_STATUSPOINT);
- clif_updatestatus (sd, SP_STR);
- clif_updatestatus (sd, SP_AGI);
- clif_updatestatus (sd, SP_VIT);
- clif_updatestatus (sd, SP_INT);
- clif_updatestatus (sd, SP_DEX);
- clif_updatestatus (sd, SP_LUK);
- clif_updatestatus (sd, SP_BASELEVEL);
- clif_updatestatus (sd, SP_JOBLEVEL);
- clif_updatestatus (sd, SP_STATUSPOINT);
- clif_updatestatus (sd, SP_NEXTBASEEXP);
- clif_updatestatus (sd, SP_NEXTJOBEXP);
- clif_updatestatus (sd, SP_SKILLPOINT);
-
- clif_updatestatus (sd, SP_USTR); // Updates needed stat points - Valaris
- clif_updatestatus (sd, SP_UAGI);
- clif_updatestatus (sd, SP_UVIT);
- clif_updatestatus (sd, SP_UINT);
- clif_updatestatus (sd, SP_UDEX);
- clif_updatestatus (sd, SP_ULUK); // End Addition
-
- for (i = 0; i < 11; i++)
- { // unequip items that can't be equipped by base 1 [Valaris]
+ clif_updatestatus(sd, SP::STATUSPOINT);
+ clif_updatestatus(sd, SP::STR);
+ clif_updatestatus(sd, SP::AGI);
+ clif_updatestatus(sd, SP::VIT);
+ clif_updatestatus(sd, SP::INT);
+ clif_updatestatus(sd, SP::DEX);
+ clif_updatestatus(sd, SP::LUK);
+ clif_updatestatus(sd, SP::BASELEVEL);
+ clif_updatestatus(sd, SP::JOBLEVEL);
+ clif_updatestatus(sd, SP::STATUSPOINT);
+ clif_updatestatus(sd, SP::NEXTBASEEXP);
+ clif_updatestatus(sd, SP::NEXTJOBEXP);
+ clif_updatestatus(sd, SP::SKILLPOINT);
+
+ clif_updatestatus(sd, SP::USTR); // Updates needed stat points - Valaris
+ clif_updatestatus(sd, SP::UAGI);
+ clif_updatestatus(sd, SP::UVIT);
+ clif_updatestatus(sd, SP::UINT);
+ clif_updatestatus(sd, SP::UDEX);
+ clif_updatestatus(sd, SP::ULUK); // End Addition
+
+ for (EQUIP i : EQUIPs)
+ {
+ // unequip items that can't be equipped by base 1 [Valaris]
if (sd->equip_index[i] >= 0)
- if (!pc_isequip (sd, sd->equip_index[i]))
+ if (!pc_isequip(sd, sd->equip_index[i]))
{
- pc_unequipitem (sd, sd->equip_index[i], 1);
+ pc_unequipitem(sd, sd->equip_index[i], CalcStatus::LATER);
sd->equip_index[i] = -1;
}
}
- clif_skillinfoblock (sd);
- pc_calcstatus (sd, 0);
+ clif_skillinfoblock(sd);
+ pc_calcstatus(sd, 0);
- MAP_LOG_STATS (sd, "STATRESET");
+ MAP_LOG_STATS(sd, "STATRESET");
return 0;
}
@@ -5762,50 +3454,23 @@ int pc_resetlvl (struct map_session_data *sd, int type)
* /resetstate
*------------------------------------------
*/
-int pc_resetstate (struct map_session_data *sd)
-{
-#define sumsp(a) ((a)*((a-2)/10+2) - 5*((a-2)/10)*((a-2)/10) - 6*((a-2)/10) -2)
-// int add=0; // Removed by Dexity
-
- nullpo_retr (0, sd);
-
-// New statpoint table used here - Dexity
- sd->status.status_point = atoi (statp[sd->status.base_level - 1]);
-// End addition
-
-// Removed by Dexity - old count
-// add += sumsp(sd->status.str);
-// add += sumsp(sd->status.agi);
-// add += sumsp(sd->status.vit);
-// add += sumsp(sd->status.int_);
-// add += sumsp(sd->status.dex);
-// add += sumsp(sd->status.luk);
-// sd->status.status_point+=add;
-
- clif_updatestatus (sd, SP_STATUSPOINT);
-
- sd->status.str = 1;
- sd->status.agi = 1;
- sd->status.vit = 1;
- sd->status.int_ = 1;
- sd->status.dex = 1;
- sd->status.luk = 1;
-
- clif_updatestatus (sd, SP_STR);
- clif_updatestatus (sd, SP_AGI);
- clif_updatestatus (sd, SP_VIT);
- clif_updatestatus (sd, SP_INT);
- clif_updatestatus (sd, SP_DEX);
- clif_updatestatus (sd, SP_LUK);
-
- clif_updatestatus (sd, SP_USTR); // Updates needed stat points - Valaris
- clif_updatestatus (sd, SP_UAGI);
- clif_updatestatus (sd, SP_UVIT);
- clif_updatestatus (sd, SP_UINT);
- clif_updatestatus (sd, SP_UDEX);
- clif_updatestatus (sd, SP_ULUK); // End Addition
-
- pc_calcstatus (sd, 0);
+int pc_resetstate(struct map_session_data *sd)
+{
+
+ nullpo_ret(sd);
+
+ sd->status.status_point = stat_p[sd->status.base_level - 1];
+
+ clif_updatestatus(sd, SP::STATUSPOINT);
+
+ for (ATTR attr : ATTRs)
+ sd->status.attrs[attr] = 1;
+ for (ATTR attr : ATTRs)
+ clif_updatestatus(sd, attr_to_sp(attr));
+ for (ATTR attr : ATTRs)
+ clif_updatestatus(sd, attr_to_usp(attr));
+
+ pc_calcstatus(sd, 0);
return 0;
}
@@ -5814,24 +3479,24 @@ int pc_resetstate (struct map_session_data *sd)
* /resetskill
*------------------------------------------
*/
-int pc_resetskill (struct map_session_data *sd)
+int pc_resetskill(struct map_session_data *sd)
{
- int i, skill;
+ int skill;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- sd->status.skill_point += pc_calc_skillpoint (sd);
+ sd->status.skill_point += pc_calc_skillpoint(sd);
- for (i = 1; i < MAX_SKILL; i++)
- if ((skill = pc_checkskill (sd, i)) > 0)
+ for (SkillID i : erange(SkillID(1), MAX_SKILL))
+ if ((skill = pc_checkskill(sd, i)) > 0)
{
sd->status.skill[i].lv = 0;
- sd->status.skill[i].flags = 0;
+ sd->status.skill[i].flags = SkillFlags::ZERO;
}
- clif_updatestatus (sd, SP_SKILLPOINT);
- clif_skillinfoblock (sd);
- pc_calcstatus (sd, 0);
+ clif_updatestatus(sd, SP::SKILLPOINT);
+ clif_skillinfoblock(sd);
+ pc_calcstatus(sd, 0);
return 0;
}
@@ -5840,87 +3505,64 @@ int pc_resetskill (struct map_session_data *sd)
* pcにダメージを与える
*------------------------------------------
*/
-int pc_damage (struct block_list *src, struct map_session_data *sd,
+int pc_damage(struct block_list *src, struct map_session_data *sd,
int damage)
{
- int i = 0, j = 0;
- struct pc_base_job s_class;
+ int i = 0;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- //転生や養子の場合の元の職業を算出する
- s_class = pc_calc_base_job (sd->status.pc_class);
// 既に死んでいたら無効
- if (pc_isdead (sd))
+ if (pc_isdead(sd))
return 0;
// 座ってたら立ち上がる
- if (pc_issit (sd))
+ if (pc_issit(sd))
{
- pc_setstand (sd);
- skill_gangsterparadise (sd, 0);
+ pc_setstand(sd);
+ skill_gangsterparadise(sd, 0);
}
if (src)
{
- if (src->type == BL_PC)
+ if (src->type == BL::PC)
{
- MAP_LOG_PC (sd, "INJURED-BY PC%d FOR %d",
+ MAP_LOG_PC(sd, "INJURED-BY PC%d FOR %d",
((struct map_session_data *) src)->status.char_id,
damage);
}
else
{
- MAP_LOG_PC (sd, "INJURED-BY MOB%d FOR %d", src->id, damage);
+ MAP_LOG_PC(sd, "INJURED-BY MOB%d FOR %d", src->id, damage);
}
}
else
- MAP_LOG_PC (sd, "INJURED-BY null FOR %d", damage);
+ MAP_LOG_PC(sd, "INJURED-BY null FOR %d", damage);
- // 歩 いていたら足を止める
- if (sd->sc_data[SC_ENDURE].timer == -1
- && !sd->special_state.infinite_endure)
- pc_stop_walking (sd, 3);
+ pc_stop_walking(sd, 3);
// 演奏/ダンスの中断
if (damage > sd->status.max_hp >> 2)
- skill_stop_dancing (&sd->bl, 0);
+ skill_stop_dancing(&sd->bl, 0);
sd->status.hp -= damage;
- if (sd->sc_data[SC_TRICKDEAD].timer != -1)
- skill_status_change_end (&sd->bl, SC_TRICKDEAD, -1);
- if (sd->status.option & 2)
- skill_status_change_end (&sd->bl, SC_HIDING, -1);
- if (sd->status.option & 4)
- skill_status_change_end (&sd->bl, SC_CLOAKING, -1);
- if (sd->status.option & 16386)
- skill_status_change_end (&sd->bl, SC_CHASEWALK, -1);
-
if (sd->status.hp > 0)
{
// まだ生きているなら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);
+ clif_updatestatus(sd, SP::HP);
- sd->canlog_tick = gettick ();
+ sd->canlog_tick = gettick();
if (sd->status.party_id > 0)
{ // on-the-fly party hp updates [Valaris]
- struct party *p = party_search (sd->status.party_id);
+ struct party *p = party_search(sd->status.party_id);
if (p != NULL)
- clif_party_hp (p, sd);
+ clif_party_hp(p, sd);
} // end addition [Valaris]
return 0;
}
- MAP_LOG_PC (sd, "DEAD%s", "");
+ MAP_LOG_PC(sd, "DEAD%s", "");
// Character is dead!
@@ -5928,151 +3570,83 @@ int pc_damage (struct block_list *src, struct map_session_data *sd,
// [Fate] Stop quickregen
sd->quick_regeneration_hp.amount = 0;
sd->quick_regeneration_sp.amount = 0;
- skill_update_heal_animation (sd);
-
- pc_setdead (sd);
-
- pc_stop_walking (sd, 0);
- 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);
- pc_calcstatus (sd, 0);
+ skill_update_heal_animation(sd);
+
+ pc_setdead(sd);
+
+ pc_stop_walking(sd, 0);
+ skill_castcancel(&sd->bl, 0); // 詠唱の中止
+ clif_clearchar(&sd->bl, BeingRemoveWhy::DEAD);
+ pc_setglobalreg(sd, "PC_DIE_COUNTER", ++sd->die_counter); //死にカウンター書き込み
+ skill_status_change_clear(&sd->bl, 0); // ステータス異常を解除する
+ clif_updatestatus(sd, SP::HP);
+ pc_calcstatus(sd, 0);
// [Fate] Reset magic
- sd->cast_tick = gettick ();
- magic_stop_completely (sd);
+ sd->cast_tick = gettick();
+ magic_stop_completely(sd);
for (i = 0; i < 5; i++)
if (sd->dev.val1[i])
{
- skill_status_change_end (&map_id2sd (sd->dev.val1[i])->bl,
- SC_DEVOTION, -1);
sd->dev.val1[i] = sd->dev.val2[i] = 0;
}
if (battle_config.death_penalty_type > 0 && sd->status.base_level >= 20)
{ // changed penalty options, added death by player if pk_mode [Valaris]
- if (!map[sd->bl.m].flag.nopenalty && !map[sd->bl.m].flag.gvg)
+ if (!map[sd->bl.m].flag.nopenalty)
{
if (battle_config.death_penalty_type == 1
&& battle_config.death_penalty_base > 0)
sd->status.base_exp -=
- (double) pc_nextbaseexp (sd) *
+ (double) pc_nextbaseexp(sd) *
(double) battle_config.death_penalty_base / 10000;
- if (battle_config.pk_mode && src && src->type == BL_PC)
+ if (battle_config.pk_mode && src && src->type == BL::PC)
sd->status.base_exp -=
- (double) pc_nextbaseexp (sd) *
+ (double) pc_nextbaseexp(sd) *
(double) battle_config.death_penalty_base / 10000;
else if (battle_config.death_penalty_type == 2
&& battle_config.death_penalty_base > 0)
{
- if (pc_nextbaseexp (sd) > 0)
+ if (pc_nextbaseexp(sd) > 0)
sd->status.base_exp -=
(double) sd->status.base_exp *
(double) battle_config.death_penalty_base / 10000;
- if (battle_config.pk_mode && src && src->type == BL_PC)
+ if (battle_config.pk_mode && src && src->type == BL::PC)
sd->status.base_exp -=
(double) sd->status.base_exp *
(double) battle_config.death_penalty_base / 10000;
}
if (sd->status.base_exp < 0)
sd->status.base_exp = 0;
- clif_updatestatus (sd, SP_BASEEXP);
+ clif_updatestatus(sd, SP::BASEEXP);
if (battle_config.death_penalty_type == 1
&& battle_config.death_penalty_job > 0)
sd->status.job_exp -=
- (double) pc_nextjobexp (sd) *
+ (double) pc_nextjobexp(sd) *
(double) battle_config.death_penalty_job / 10000;
- if (battle_config.pk_mode && src && src->type == BL_PC)
+ if (battle_config.pk_mode && src && src->type == BL::PC)
sd->status.job_exp -=
- (double) pc_nextjobexp (sd) *
+ (double) pc_nextjobexp(sd) *
(double) battle_config.death_penalty_job / 10000;
else if (battle_config.death_penalty_type == 2
&& battle_config.death_penalty_job > 0)
{
- if (pc_nextjobexp (sd) > 0)
+ if (pc_nextjobexp(sd) > 0)
sd->status.job_exp -=
(double) sd->status.job_exp *
(double) battle_config.death_penalty_job / 10000;
- if (battle_config.pk_mode && src && src->type == BL_PC)
+ if (battle_config.pk_mode && src && src->type == BL::PC)
sd->status.job_exp -=
(double) sd->status.job_exp *
(double) battle_config.death_penalty_job / 10000;
}
if (sd->status.job_exp < 0)
sd->status.job_exp = 0;
- clif_updatestatus (sd, SP_JOBEXP);
- }
- }
- //ナイトメアモードアイテムドロップ
- if (map[sd->bl.m].flag.pvp_nightmaredrop)
- { // Moved this outside so it works when PVP isnt enabled and during pk mode [Ancyker]
- for (j = 0; j < MAX_DROP_PER_MAP; j++)
- {
- int id = map[sd->bl.m].drop_list[j].drop_id;
- int type = map[sd->bl.m].drop_list[j].drop_type;
- int per = map[sd->bl.m].drop_list[j].drop_per;
- if (id == 0)
- continue;
- if (id == -1)
- { //ランダムドロップ
- int eq_num = 0, eq_n[MAX_INVENTORY];
- memset (eq_n, 0, sizeof (eq_n));
- //先ず装備しているアイテム数をカウント
- for (i = 0; i < MAX_INVENTORY; i++)
- {
- int k;
- if ((type == 1 && !sd->status.inventory[i].equip)
- || (type == 2 && sd->status.inventory[i].equip)
- || type == 3)
- {
- //InventoryIndexを格納
- for (k = 0; k < MAX_INVENTORY; k++)
- {
- if (eq_n[k] <= 0)
- {
- eq_n[k] = i;
- break;
- }
- }
- eq_num++;
- }
- }
- if (eq_num > 0)
- {
- int n = eq_n[MRAND (eq_num)]; //該当アイテムの中からランダム
- if (MRAND (10000) < per)
- {
- if (sd->status.inventory[n].equip)
- pc_unequipitem (sd, n, 0);
- pc_dropitem (sd, n, 1);
- }
- }
- }
- else if (id > 0)
- {
- for (i = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.inventory[i].nameid == id //ItemIDが一致していて
- && MRAND (10000) < per //ドロップ率判定もOKで
- && ((type == 1 && !sd->status.inventory[i].equip) //タイプ判定もOKならドロップ
- || (type == 2 && sd->status.inventory[i].equip)
- || type == 3))
- {
- if (sd->status.inventory[i].equip)
- pc_unequipitem (sd, i, 0);
- pc_dropitem (sd, i, 1);
- break;
- }
- }
- }
+ clif_updatestatus(sd, SP::JOBEXP);
}
}
+
// pvp
if (map[sd->bl.m].flag.pvp && !battle_config.pk_mode)
{ // disable certain pvp functions on pk_mode [Valaris]
@@ -6080,31 +3654,23 @@ int pc_damage (struct block_list *src, struct map_session_data *sd,
if (!map[sd->bl.m].flag.pvp_nocalcrank)
{
sd->pvp_point -= 5;
- if (src && src->type == BL_PC)
+ if (src && src->type == BL::PC)
((struct map_session_data *) src)->pvp_point++;
//} //fixed wrong '{' placement by Lupus
- pc_setdead (sd);
+ pc_setdead(sd);
}
// 強制送還
if (sd->pvp_point < 0)
{
sd->pvp_point = 0;
- pc_setstand (sd);
- pc_setrestartvalue (sd, 3);
- pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x,
- sd->status.save_point.y, 0);
+ pc_setstand(sd);
+ pc_setrestartvalue(sd, 3);
+ pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x,
+ sd->status.save_point.y, BeingRemoveWhy::GONE);
}
}
- //GvG
- if (map[sd->bl.m].flag.gvg)
- {
- pc_setstand (sd);
- pc_setrestartvalue (sd, 3);
- pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x,
- sd->status.save_point.y, 0);
- }
- if (src && src->type == BL_PC)
+ if (src && src->type == BL::PC)
{
// [Fate] PK death, trigger scripts
argrec_t arg[3];
@@ -6114,10 +3680,10 @@ int pc_damage (struct block_list *src, struct map_session_data *sd,
arg[1].v.i = sd->bl.id;
arg[2].name = "@victimlvl";
arg[2].v.i = sd->status.base_level;
- npc_event_doall_l ("OnPCKilledEvent", sd->bl.id, 3, arg);
- npc_event_doall_l ("OnPCKillEvent", src->id, 3, arg);
+ npc_event_doall_l("OnPCKilledEvent", sd->bl.id, 3, arg);
+ npc_event_doall_l("OnPCKillEvent", src->id, 3, arg);
}
- npc_event_doall_l ("OnPCDieEvent", sd->bl.id, 0, NULL);
+ npc_event_doall_l("OnPCDieEvent", sd->bl.id, 0, NULL);
return 0;
}
@@ -6129,94 +3695,72 @@ int pc_damage (struct block_list *src, struct map_session_data *sd,
* script用PCステータス読み出し
*------------------------------------------
*/
-int pc_readparam (struct map_session_data *sd, int type)
+int pc_readparam(struct map_session_data *sd, SP type)
{
- int val = 0;
- struct pc_base_job s_class;
+ int val = 0;
- s_class = pc_calc_base_job (sd->status.pc_class);
-
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
switch (type)
{
- case SP_SKILLPOINT:
+ case SP::SKILLPOINT:
val = sd->status.skill_point;
break;
- case SP_STATUSPOINT:
+ case SP::STATUSPOINT:
val = sd->status.status_point;
break;
- case SP_ZENY:
+ case SP::ZENY:
val = sd->status.zeny;
break;
- case SP_BASELEVEL:
+ case SP::BASELEVEL:
val = sd->status.base_level;
break;
- case SP_JOBLEVEL:
+ case SP::JOBLEVEL:
val = sd->status.job_level;
break;
- case SP_CLASS:
- if (val >= 24 && val < 45)
- val += 3978;
- else
- val = sd->status.pc_class;
- break;
- case SP_UPPER:
- val = s_class.upper;
+ case SP::CLASS:
+ val = sd->status.species;
break;
- case SP_SEX:
+ case SP::SEX:
val = sd->sex;
break;
- case SP_WEIGHT:
+ case SP::WEIGHT:
val = sd->weight;
break;
- case SP_MAXWEIGHT:
+ case SP::MAXWEIGHT:
val = sd->max_weight;
break;
- case SP_BASEEXP:
+ case SP::BASEEXP:
val = sd->status.base_exp;
break;
- case SP_JOBEXP:
+ case SP::JOBEXP:
val = sd->status.job_exp;
break;
- case SP_NEXTBASEEXP:
- val = pc_nextbaseexp (sd);
+ case SP::NEXTBASEEXP:
+ val = pc_nextbaseexp(sd);
break;
- case SP_NEXTJOBEXP:
- val = pc_nextjobexp (sd);
+ case SP::NEXTJOBEXP:
+ val = pc_nextjobexp(sd);
break;
- case SP_HP:
+ case SP::HP:
val = sd->status.hp;
break;
- case SP_MAXHP:
+ case SP::MAXHP:
val = sd->status.max_hp;
break;
- case SP_SP:
+ case SP::SP:
val = sd->status.sp;
break;
- case SP_MAXSP:
+ case SP::MAXSP:
val = sd->status.max_sp;
break;
- case SP_STR:
- val = sd->status.str;
- break;
- case SP_AGI:
- val = sd->status.agi;
- break;
- case SP_VIT:
- val = sd->status.vit;
- break;
- case SP_INT:
- val = sd->status.int_;
- break;
- case SP_DEX:
- val = sd->status.dex;
- break;
- case SP_LUK:
- val = sd->status.luk;
- break;
- case SP_FAME:
- val = sd->fame;
+ case SP::STR:
+ case SP::AGI:
+ case SP::VIT:
+ case SP::INT:
+ case SP::DEX:
+ case SP::LUK:
+ val = sd->status.attrs[sp_to_attr(type)];
break;
}
@@ -6227,18 +3771,15 @@ int pc_readparam (struct map_session_data *sd, int type)
* script用PCステータス設定
*------------------------------------------
*/
-int pc_setparam (struct map_session_data *sd, int type, int val)
+int pc_setparam(struct map_session_data *sd, SP type, int val)
{
- int i = 0, up_level = 50;
- struct pc_base_job s_class;
+ int i = 0, up_level = 50;
- nullpo_retr (0, sd);
-
- s_class = pc_calc_base_job (sd->status.pc_class);
+ nullpo_ret(sd);
switch (type)
{
- case SP_BASELEVEL:
+ case SP::BASELEVEL:
if (val > sd->status.base_level)
{
for (i = 1; i <= (val - sd->status.base_level); i++)
@@ -6247,19 +3788,15 @@ int pc_setparam (struct map_session_data *sd, int type, int val)
}
sd->status.base_level = val;
sd->status.base_exp = 0;
- clif_updatestatus (sd, SP_BASELEVEL);
- clif_updatestatus (sd, SP_NEXTBASEEXP);
- clif_updatestatus (sd, SP_STATUSPOINT);
- clif_updatestatus (sd, SP_BASEEXP);
- pc_calcstatus (sd, 0);
- pc_heal (sd, sd->status.max_hp, sd->status.max_sp);
- break;
- case SP_JOBLEVEL:
- if (sd->status.pc_class == 0)
- up_level -= 40;
- if ((sd->status.pc_class == 23)
- || (sd->status.pc_class >= 4001 && sd->status.pc_class <= 4022))
- up_level += 20;
+ clif_updatestatus(sd, SP::BASELEVEL);
+ clif_updatestatus(sd, SP::NEXTBASEEXP);
+ clif_updatestatus(sd, SP::STATUSPOINT);
+ clif_updatestatus(sd, SP::BASEEXP);
+ pc_calcstatus(sd, 0);
+ pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
+ break;
+ case SP::JOBLEVEL:
+ up_level -= 40;
if (val >= sd->status.job_level)
{
if (val > up_level)
@@ -6267,95 +3804,82 @@ int pc_setparam (struct map_session_data *sd, int type, int val)
sd->status.skill_point += (val - sd->status.job_level);
sd->status.job_level = val;
sd->status.job_exp = 0;
- clif_updatestatus (sd, SP_JOBLEVEL);
- clif_updatestatus (sd, SP_NEXTJOBEXP);
- clif_updatestatus (sd, SP_JOBEXP);
- clif_updatestatus (sd, SP_SKILLPOINT);
- pc_calcstatus (sd, 0);
- clif_misceffect (&sd->bl, 1);
+ clif_updatestatus(sd, SP::JOBLEVEL);
+ clif_updatestatus(sd, SP::NEXTJOBEXP);
+ clif_updatestatus(sd, SP::JOBEXP);
+ clif_updatestatus(sd, SP::SKILLPOINT);
+ pc_calcstatus(sd, 0);
+ clif_misceffect(&sd->bl, 1);
}
else
{
sd->status.job_level = val;
sd->status.job_exp = 0;
- clif_updatestatus (sd, SP_JOBLEVEL);
- clif_updatestatus (sd, SP_NEXTJOBEXP);
- clif_updatestatus (sd, SP_JOBEXP);
- pc_calcstatus (sd, 0);
+ clif_updatestatus(sd, SP::JOBLEVEL);
+ clif_updatestatus(sd, SP::NEXTJOBEXP);
+ clif_updatestatus(sd, SP::JOBEXP);
+ pc_calcstatus(sd, 0);
}
- clif_updatestatus (sd, type);
+ clif_updatestatus(sd, type);
break;
- case SP_SKILLPOINT:
+ case SP::SKILLPOINT:
sd->status.skill_point = val;
break;
- case SP_STATUSPOINT:
+ case SP::STATUSPOINT:
sd->status.status_point = val;
break;
- case SP_ZENY:
+ case SP::ZENY:
sd->status.zeny = val;
break;
- case SP_BASEEXP:
- if (pc_nextbaseexp (sd) > 0)
+ case SP::BASEEXP:
+ if (pc_nextbaseexp(sd) > 0)
{
sd->status.base_exp = val;
if (sd->status.base_exp < 0)
sd->status.base_exp = 0;
- pc_checkbaselevelup (sd);
+ pc_checkbaselevelup(sd);
}
break;
- case SP_JOBEXP:
- if (pc_nextjobexp (sd) > 0)
+ case SP::JOBEXP:
+ if (pc_nextjobexp(sd) > 0)
{
sd->status.job_exp = val;
if (sd->status.job_exp < 0)
sd->status.job_exp = 0;
- pc_checkjoblevelup (sd);
+ pc_checkjoblevelup(sd);
}
break;
- case SP_SEX:
+ case SP::SEX:
sd->sex = val;
break;
- case SP_WEIGHT:
+ case SP::WEIGHT:
sd->weight = val;
break;
- case SP_MAXWEIGHT:
+ case SP::MAXWEIGHT:
sd->max_weight = val;
break;
- case SP_HP:
+ case SP::HP:
sd->status.hp = val;
break;
- case SP_MAXHP:
+ case SP::MAXHP:
sd->status.max_hp = val;
break;
- case SP_SP:
+ case SP::SP:
sd->status.sp = val;
break;
- case SP_MAXSP:
+ case SP::MAXSP:
sd->status.max_sp = val;
break;
- case SP_STR:
- sd->status.str = val;
- break;
- case SP_AGI:
- sd->status.agi = val;
- break;
- case SP_VIT:
- sd->status.vit = val;
- break;
- case SP_INT:
- sd->status.int_ = val;
- break;
- case SP_DEX:
- sd->status.dex = val;
- break;
- case SP_LUK:
- sd->status.luk = val;
- break;
- case SP_FAME:
- sd->fame = val;
+ case SP::STR:
+ case SP::AGI:
+ case SP::VIT:
+ case SP::INT:
+ case SP::DEX:
+ case SP::LUK:
+ sd->status.attrs[sp_to_attr(type)] = val;
break;
}
- clif_updatestatus (sd, type);
+ clif_updatestatus(sd, type);
return 0;
}
@@ -6364,27 +3888,24 @@ int pc_setparam (struct map_session_data *sd, int type, int val)
* HP/SP回復
*------------------------------------------
*/
-int pc_heal (struct map_session_data *sd, int hp, int sp)
+int pc_heal(struct map_session_data *sd, int hp, int sp)
{
// if(battle_config.battle_log)
-// printf("heal %d %d\n",hp,sp);
+// PRINTF("heal %d %d\n",hp,sp);
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (pc_checkoverhp (sd))
+ if (pc_checkoverhp(sd))
{
if (hp > 0)
hp = 0;
}
- if (pc_checkoversp (sd))
+ if (pc_checkoversp(sd))
{
if (sp > 0)
sp = 0;
}
- if (sd->sc_data && sd->sc_data[SC_BERSERK].timer != -1) //バーサーク中は回復させないらしい
- return 0;
-
if (hp + sd->status.hp > sd->status.max_hp)
hp = sd->status.max_hp - sd->status.hp;
if (sp + sd->status.sp > sd->status.max_sp)
@@ -6393,22 +3914,22 @@ int pc_heal (struct map_session_data *sd, int hp, int sp)
if (sd->status.hp <= 0)
{
sd->status.hp = 0;
- pc_damage (NULL, sd, 1);
+ pc_damage(NULL, sd, 1);
hp = 0;
}
sd->status.sp += sp;
if (sd->status.sp <= 0)
sd->status.sp = 0;
if (hp)
- clif_updatestatus (sd, SP_HP);
+ clif_updatestatus(sd, SP::HP);
if (sp)
- clif_updatestatus (sd, SP_SP);
+ clif_updatestatus(sd, SP::SP);
if (sd->status.party_id > 0)
{ // on-the-fly party hp updates [Valaris]
- struct party *p = party_search (sd->status.party_id);
+ struct party *p = party_search(sd->status.party_id);
if (p != NULL)
- clif_party_hp (p, sd);
+ clif_party_hp(p, sd);
} // end addition [Valaris]
return hp + sp;
@@ -6418,10 +3939,12 @@ int pc_heal (struct map_session_data *sd, int hp, int sp)
* HP/SP回復
*------------------------------------------
*/
-static int pc_itemheal_effect (struct map_session_data *sd, int hp, int sp);
+static
+int pc_itemheal_effect(struct map_session_data *sd, int hp, int sp);
-static int // Compute how quickly we regenerate (less is faster) for that amount
-pc_heal_quick_speed (int amount)
+static
+int // Compute how quickly we regenerate (less is faster) for that amount
+pc_heal_quick_speed(int amount)
{
if (amount >= 100)
{
@@ -6441,35 +3964,35 @@ pc_heal_quick_speed (int amount)
}
}
-static void
-pc_heal_quick_accumulate (int new_amount,
+static
+void pc_heal_quick_accumulate(int new_amount,
struct quick_regeneration *quick_regen, int max)
{
- int current_amount = quick_regen->amount;
- int current_speed = quick_regen->speed;
- int new_speed = pc_heal_quick_speed (new_amount);
+ int current_amount = quick_regen->amount;
+ int current_speed = quick_regen->speed;
+ int new_speed = pc_heal_quick_speed(new_amount);
- int average_speed = ((new_speed * new_amount) + (current_speed * current_amount)) / (current_amount + new_amount); // new_amount > 0, current_amount >= 0
+ int average_speed = ((new_speed * new_amount) + (current_speed * current_amount)) / (current_amount + new_amount); // new_amount > 0, current_amount >= 0
quick_regen->speed = average_speed;
- quick_regen->amount = MIN (current_amount + new_amount, max);
+ quick_regen->amount = min(current_amount + new_amount, max);
- quick_regen->tickdelay = MIN (quick_regen->speed, quick_regen->tickdelay);
+ quick_regen->tickdelay = min(quick_regen->speed, quick_regen->tickdelay);
}
-int pc_itemheal (struct map_session_data *sd, int hp, int sp)
+int pc_itemheal(struct map_session_data *sd, int hp, int sp)
{
/* defer healing */
if (hp > 0)
{
- pc_heal_quick_accumulate (hp,
+ pc_heal_quick_accumulate(hp,
&sd->quick_regeneration_hp,
sd->status.max_hp - sd->status.hp);
hp = 0;
}
if (sp > 0)
{
- pc_heal_quick_accumulate (sp,
+ pc_heal_quick_accumulate(sp,
&sd->quick_regeneration_sp,
sd->status.max_sp - sd->status.sp);
@@ -6478,7 +4001,7 @@ int pc_itemheal (struct map_session_data *sd, int hp, int sp)
/* Hurt right away, if necessary */
if (hp < 0 || sp < 0)
- pc_itemheal_effect (sd, hp, sp);
+ pc_itemheal_effect(sd, hp, sp);
return 0;
}
@@ -6486,54 +4009,30 @@ int pc_itemheal (struct map_session_data *sd, int hp, int sp)
/* pc_itemheal_effect is invoked once every 0.5s whenever the pc
* has health recovery queued up (cf. pc_natural_heal_sub).
*/
-static int pc_itemheal_effect (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_retr (0, sd);
-
- if (sd->sc_data && sd->sc_data[SC_GOSPEL].timer != -1) //バーサーク中は回復させないらしい
- return 0;
+ nullpo_ret(sd);
- if (sd->state.potionpitcher_flag)
- {
- sd->potion_hp = hp;
- sd->potion_sp = sp;
- return 0;
- }
-
- if (pc_checkoverhp (sd))
+ if (pc_checkoverhp(sd))
{
if (hp > 0)
hp = 0;
}
- if (pc_checkoversp (sd))
+ if (pc_checkoversp(sd))
{
if (sp > 0)
sp = 0;
}
if (hp > 0)
{
- bonus =
- (sd->paramc[2] << 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[3] << 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;
@@ -6543,16 +4042,16 @@ static int pc_itemheal_effect (struct map_session_data *sd, int hp, int sp)
if (sd->status.hp <= 0)
{
sd->status.hp = 0;
- pc_damage (NULL, sd, 1);
+ pc_damage(NULL, sd, 1);
hp = 0;
}
sd->status.sp += sp;
if (sd->status.sp <= 0)
sd->status.sp = 0;
if (hp)
- clif_updatestatus (sd, SP_HP);
+ clif_updatestatus(sd, SP::HP);
if (sp)
- clif_updatestatus (sd, SP_SP);
+ clif_updatestatus(sd, SP::SP);
return 0;
}
@@ -6561,23 +4060,16 @@ static int pc_itemheal_effect (struct map_session_data *sd, int hp, int sp)
* HP/SP回復
*------------------------------------------
*/
-int pc_percentheal (struct map_session_data *sd, int hp, int sp)
+int pc_percentheal(struct map_session_data *sd, int hp, int sp)
{
- nullpo_retr (0, sd);
-
- if (sd->state.potionpitcher_flag)
- {
- sd->potion_per_hp = hp;
- sd->potion_per_sp = sp;
- return 0;
- }
+ nullpo_ret(sd);
- if (pc_checkoverhp (sd))
+ if (pc_checkoverhp(sd))
{
if (hp > 0)
hp = 0;
}
- if (pc_checkoversp (sd))
+ if (pc_checkoversp(sd))
{
if (sp > 0)
sp = 0;
@@ -6591,7 +4083,7 @@ int pc_percentheal (struct map_session_data *sd, int hp, int sp)
else if (hp <= -100)
{
sd->status.hp = 0;
- pc_damage (NULL, sd, 1);
+ pc_damage(NULL, sd, 1);
}
else
{
@@ -6601,7 +4093,7 @@ int pc_percentheal (struct map_session_data *sd, int hp, int sp)
if (sd->status.hp <= 0)
{
sd->status.hp = 0;
- pc_damage (NULL, sd, 1);
+ pc_damage(NULL, sd, 1);
hp = 0;
}
}
@@ -6626,119 +4118,9 @@ int pc_percentheal (struct map_session_data *sd, int hp, int sp)
}
}
if (hp)
- clif_updatestatus (sd, SP_HP);
+ clif_updatestatus(sd, SP::HP);
if (sp)
- clif_updatestatus (sd, SP_SP);
-
- return 0;
-}
-
-/*==========================================
- * 職変更
- * 引数 job 職業 0〜23
- * upper 通常 0, 転生 1, 養子 2, そのまま -1
- *------------------------------------------
- */
-int pc_jobchange (struct map_session_data *sd, int job, int upper)
-{
- int i;
- int b_class = 0;
- //転生や養子の場合の元の職業を算出する
- struct pc_base_job s_class = pc_calc_base_job (sd->status.pc_class);
-
- nullpo_retr (0, sd);
-
- if ((job > 23) && (job < 68))
- job += 3977;
-
- if ((job > 69) && (job < 4000))
- return 1;
-
- if (upper < 0) //現在転生かどうかを判断する
- upper = s_class.upper;
-
- if (upper == 0)
- { //通常職ならjobそのまんま
- b_class = job;
- }
- else if (upper == 1)
- {
- if (job == 23)
- { //転生にスパノビは存在しないのでお断り
- return 1;
- }
- else
- {
- b_class = job + 4001;
- }
- }
- else if (upper == 2)
- { //養子に結婚はないけどどうせ次で蹴られるからいいや
- b_class = (job == 23) ? job + 4022 : job + 4023;
- }
- else
- {
- return 1;
- }
-
- if ((sd->status.sex == 0 && job == 19) || (sd->status.sex == 1 && job == 20) ||
- (sd->status.sex == 0 && job == 4020) || (sd->status.sex == 1 && job == 4021) ||
- job == 22 || sd->status.pc_class == b_class) //♀はバードになれない、♂はダンサーになれない、結婚衣裳もお断り
- return 1;
-
- sd->status.pc_class = sd->view_class = b_class;
-
- sd->status.job_level = 1;
- sd->status.job_exp = 0;
- clif_updatestatus (sd, SP_JOBLEVEL);
- clif_updatestatus (sd, SP_JOBEXP);
- clif_updatestatus (sd, SP_NEXTJOBEXP);
-
- for (i = 0; i < 11; i++)
- {
- if (sd->equip_index[i] >= 0)
- if (!pc_isequip (sd, sd->equip_index[i]))
- pc_unequipitem (sd, sd->equip_index[i], 1); // 装備外し
- }
-
- clif_changelook (&sd->bl, LOOK_BASE, sd->view_class); // move sprite update to prevent client crashes with incompatible equipment [Valaris]
- if (sd->status.clothes_color > 0)
- clif_changelook (&sd->bl, LOOK_CLOTHES_COLOR,
- sd->status.clothes_color);
- if (battle_config.muting_players && sd->status.manner < 0)
- clif_changestatus (&sd->bl, SP_MANNER, sd->status.manner);
-
- pc_calcstatus (sd, 0);
- pc_checkallowskill (sd);
- 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 | -0x0000);
- if (pc_checkskill (sd, KN_RIDING) > 0)
- pc_setriding (sd);
- }
-
- return 0;
-}
-
-/*==========================================
- * 見た目変更
- *------------------------------------------
- */
-int pc_equiplookall (struct map_session_data *sd)
-{
- nullpo_retr (0, sd);
-
- clif_changelook (&sd->bl, LOOK_WEAPON, 0);
-// clif_changelook(&sd->bl,LOOK_SHOES,0);
- clif_changelook (&sd->bl, LOOK_HEAD_BOTTOM, sd->status.head_bottom);
- clif_changelook (&sd->bl, LOOK_HEAD_TOP, sd->status.head_top);
- clif_changelook (&sd->bl, LOOK_HEAD_MID, sd->status.head_mid);
-
- clif_changelook_accessories (&sd->bl, NULL);
+ clif_updatestatus(sd, SP::SP);
return 0;
}
@@ -6747,40 +4129,40 @@ int pc_equiplookall (struct map_session_data *sd)
* 見た目変更
*------------------------------------------
*/
-int pc_changelook (struct map_session_data *sd, int type, int val)
+int pc_changelook(struct map_session_data *sd, LOOK type, int val)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
switch (type)
{
- case LOOK_HAIR:
+ case LOOK::HAIR:
sd->status.hair = val;
break;
- case LOOK_WEAPON:
- sd->status.weapon = val;
+ case LOOK::WEAPON:
+ sd->status.weapon = static_cast<ItemLook>(static_cast<uint16_t>(val));
break;
- case LOOK_HEAD_BOTTOM:
+ case LOOK::HEAD_BOTTOM:
sd->status.head_bottom = val;
break;
- case LOOK_HEAD_TOP:
+ case LOOK::HEAD_TOP:
sd->status.head_top = val;
break;
- case LOOK_HEAD_MID:
+ case LOOK::HEAD_MID:
sd->status.head_mid = val;
break;
- case LOOK_HAIR_COLOR:
+ case LOOK::HAIR_COLOR:
sd->status.hair_color = val;
break;
- case LOOK_CLOTHES_COLOR:
+ case LOOK::CLOTHES_COLOR:
sd->status.clothes_color = val;
break;
- case LOOK_SHIELD:
+ case LOOK::SHIELD:
sd->status.shield = val;
break;
- case LOOK_SHOES:
+ case LOOK::SHOES:
break;
}
- clif_changelook (&sd->bl, type, val);
+ clif_changelook(&sd->bl, type, val);
return 0;
}
@@ -6789,89 +4171,13 @@ int pc_changelook (struct map_session_data *sd, int type, int val)
* 付属品(鷹,ペコ,カート)設定
*------------------------------------------
*/
-int pc_setoption (struct map_session_data *sd, int type)
+int pc_setoption(struct map_session_data *sd, Option type)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
sd->status.option = type;
- clif_changeoption (&sd->bl);
- pc_calcstatus (sd, 0);
-
- return 0;
-}
-
-/*==========================================
- * カート設定
- *------------------------------------------
- */
-int pc_setcart (struct map_session_data *sd, int type)
-{
- int cart[6] = { 0x0000, 0x0008, 0x0080, 0x0100, 0x0200, 0x0400 };
-
- nullpo_retr (0, sd);
-
- if (pc_checkskill (sd, MC_PUSHCART) > 0)
- { // プッシュカートスキル所持
- if (!pc_iscarton (sd))
- { // カートを付けていない
- pc_setoption (sd, cart[type]);
- clif_cart_itemlist (sd);
- clif_cart_equiplist (sd);
- clif_updatestatus (sd, SP_CARTINFO);
- clif_status_change (&sd->bl, 0x0c, 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 | 0x0010);
- }
-
- 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 | 0x0020);
-
- 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;
- }
+ clif_changeoption(&sd->bl);
+ pc_calcstatus(sd, 0);
return 0;
}
@@ -6880,11 +4186,11 @@ int pc_setriding (struct map_session_data *sd)
* script用変数の値を読む
*------------------------------------------
*/
-int pc_readreg (struct map_session_data *sd, int reg)
+int pc_readreg(struct map_session_data *sd, int reg)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0; i < sd->reg_num; i++)
if (sd->reg[i].index == reg)
@@ -6897,11 +4203,11 @@ int pc_readreg (struct map_session_data *sd, int reg)
* script用変数の値を設定
*------------------------------------------
*/
-int pc_setreg (struct map_session_data *sd, int reg, int val)
+int pc_setreg(struct map_session_data *sd, int reg, int val)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0; i < sd->reg_num; i++)
{
@@ -6912,7 +4218,7 @@ int pc_setreg (struct map_session_data *sd, int reg, int val)
}
}
sd->reg_num++;
- RECREATE (sd->reg, struct script_reg, sd->reg_num);
+ RECREATE(sd->reg, struct script_reg, sd->reg_num);
sd->reg[i].index = reg;
sd->reg[i].data = val;
@@ -6923,11 +4229,11 @@ int pc_setreg (struct map_session_data *sd, int reg, int val)
* script用文字列変数の値を読む
*------------------------------------------
*/
-char *pc_readregstr (struct map_session_data *sd, int reg)
+char *pc_readregstr(struct map_session_data *sd, int reg)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0; i < sd->regstr_num; i++)
if (sd->regstr[i].index == reg)
@@ -6940,28 +4246,28 @@ char *pc_readregstr (struct map_session_data *sd, int reg)
* script用文字列変数の値を設定
*------------------------------------------
*/
-int pc_setregstr (struct map_session_data *sd, int reg, const char *str)
+int pc_setregstr(struct map_session_data *sd, int reg, const char *str)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (strlen (str) + 1 > sizeof (sd->regstr[0].data))
+ if (strlen(str) + 1 > sizeof(sd->regstr[0].data))
{
- printf ("pc_setregstr(): String too long!\n");
+ PRINTF("pc_setregstr(): String too long!\n");
return 0;
}
for (i = 0; i < sd->regstr_num; i++)
if (sd->regstr[i].index == reg)
{
- strcpy (sd->regstr[i].data, str);
+ strcpy(sd->regstr[i].data, str);
return 0;
}
sd->regstr_num++;
- RECREATE (sd->regstr, struct script_regstr, sd->regstr_num);
+ RECREATE(sd->regstr, struct script_regstr, sd->regstr_num);
sd->regstr[i].index = reg;
- strcpy (sd->regstr[i].data, str);
+ strcpy(sd->regstr[i].data, str);
return 0;
}
@@ -6970,15 +4276,15 @@ int pc_setregstr (struct map_session_data *sd, int reg, const char *str)
* script用グローバル変数の値を読む
*------------------------------------------
*/
-int pc_readglobalreg (struct map_session_data *sd, const char *reg)
+int pc_readglobalreg(struct map_session_data *sd, const char *reg)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0; i < sd->status.global_reg_num; i++)
{
- if (strcmp (sd->status.global_reg[i].str, reg) == 0)
+ if (strcmp(sd->status.global_reg[i].str, reg) == 0)
return sd->status.global_reg[i].value;
}
@@ -6989,23 +4295,23 @@ int pc_readglobalreg (struct map_session_data *sd, const char *reg)
* script用グローバル変数の値を設定
*------------------------------------------
*/
-int pc_setglobalreg (struct map_session_data *sd, const char *reg, int val)
+int pc_setglobalreg(struct map_session_data *sd, const char *reg, int val)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
//PC_DIE_COUNTERがスクリプトなどで変更された時の処理
- if (strcmp (reg, "PC_DIE_COUNTER") == 0 && sd->die_counter != val)
+ if (strcmp(reg, "PC_DIE_COUNTER") == 0 && sd->die_counter != val)
{
sd->die_counter = val;
- pc_calcstatus (sd, 0);
+ pc_calcstatus(sd, 0);
}
if (val == 0)
{
for (i = 0; i < sd->status.global_reg_num; i++)
{
- if (strcmp (sd->status.global_reg[i].str, reg) == 0)
+ if (strcmp(sd->status.global_reg[i].str, reg) == 0)
{
sd->status.global_reg[i] =
sd->status.global_reg[sd->status.global_reg_num - 1];
@@ -7017,7 +4323,7 @@ int pc_setglobalreg (struct map_session_data *sd, const char *reg, int val)
}
for (i = 0; i < sd->status.global_reg_num; i++)
{
- if (strcmp (sd->status.global_reg[i].str, reg) == 0)
+ if (strcmp(sd->status.global_reg[i].str, reg) == 0)
{
sd->status.global_reg[i].value = val;
return 0;
@@ -7025,13 +4331,13 @@ int pc_setglobalreg (struct map_session_data *sd, const char *reg, int val)
}
if (sd->status.global_reg_num < GLOBAL_REG_NUM)
{
- strcpy (sd->status.global_reg[i].str, reg);
+ strcpy(sd->status.global_reg[i].str, reg);
sd->status.global_reg[i].value = val;
sd->status.global_reg_num++;
return 0;
}
if (battle_config.error_log)
- printf ("pc_setglobalreg : couldn't set %s (GLOBAL_REG_NUM = %d)\n",
+ PRINTF("pc_setglobalreg : couldn't set %s (GLOBAL_REG_NUM = %d)\n",
reg, GLOBAL_REG_NUM);
return 1;
@@ -7041,15 +4347,15 @@ int pc_setglobalreg (struct map_session_data *sd, const char *reg, int val)
* script用アカウント変数の値を読む
*------------------------------------------
*/
-int pc_readaccountreg (struct map_session_data *sd, const char *reg)
+int pc_readaccountreg(struct map_session_data *sd, const char *reg)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0; i < sd->status.account_reg_num; i++)
{
- if (strcmp (sd->status.account_reg[i].str, reg) == 0)
+ if (strcmp(sd->status.account_reg[i].str, reg) == 0)
return sd->status.account_reg[i].value;
}
@@ -7060,17 +4366,17 @@ int pc_readaccountreg (struct map_session_data *sd, const char *reg)
* script用アカウント変数の値を設定
*------------------------------------------
*/
-int pc_setaccountreg (struct map_session_data *sd, const char *reg, int val)
+int pc_setaccountreg(struct map_session_data *sd, const char *reg, int val)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (val == 0)
{
for (i = 0; i < sd->status.account_reg_num; i++)
{
- if (strcmp (sd->status.account_reg[i].str, reg) == 0)
+ if (strcmp(sd->status.account_reg[i].str, reg) == 0)
{
sd->status.account_reg[i] =
sd->status.account_reg[sd->status.account_reg_num - 1];
@@ -7078,28 +4384,28 @@ int pc_setaccountreg (struct map_session_data *sd, const char *reg, int val)
break;
}
}
- intif_saveaccountreg (sd);
+ intif_saveaccountreg(sd);
return 0;
}
for (i = 0; i < sd->status.account_reg_num; i++)
{
- if (strcmp (sd->status.account_reg[i].str, reg) == 0)
+ if (strcmp(sd->status.account_reg[i].str, reg) == 0)
{
sd->status.account_reg[i].value = val;
- intif_saveaccountreg (sd);
+ intif_saveaccountreg(sd);
return 0;
}
}
if (sd->status.account_reg_num < ACCOUNT_REG_NUM)
{
- strcpy (sd->status.account_reg[i].str, reg);
+ strcpy(sd->status.account_reg[i].str, reg);
sd->status.account_reg[i].value = val;
sd->status.account_reg_num++;
- intif_saveaccountreg (sd);
+ intif_saveaccountreg(sd);
return 0;
}
if (battle_config.error_log)
- printf ("pc_setaccountreg : couldn't set %s (ACCOUNT_REG_NUM = %d)\n",
+ PRINTF("pc_setaccountreg : couldn't set %s (ACCOUNT_REG_NUM = %d)\n",
reg, ACCOUNT_REG_NUM);
return 1;
@@ -7109,15 +4415,15 @@ int pc_setaccountreg (struct map_session_data *sd, const char *reg, int val)
* script用アカウント変数2の値を読む
*------------------------------------------
*/
-int pc_readaccountreg2 (struct map_session_data *sd, const char *reg)
+int pc_readaccountreg2(struct map_session_data *sd, const char *reg)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0; i < sd->status.account_reg2_num; i++)
{
- if (strcmp (sd->status.account_reg2[i].str, reg) == 0)
+ if (strcmp(sd->status.account_reg2[i].str, reg) == 0)
return sd->status.account_reg2[i].value;
}
@@ -7128,17 +4434,17 @@ int pc_readaccountreg2 (struct map_session_data *sd, const char *reg)
* script用アカウント変数2の値を設定
*------------------------------------------
*/
-int pc_setaccountreg2 (struct map_session_data *sd, const char *reg, int val)
+int pc_setaccountreg2(struct map_session_data *sd, const char *reg, int val)
{
- int i;
+ int i;
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
if (val == 0)
{
for (i = 0; i < sd->status.account_reg2_num; i++)
{
- if (strcmp (sd->status.account_reg2[i].str, reg) == 0)
+ if (strcmp(sd->status.account_reg2[i].str, reg) == 0)
{
sd->status.account_reg2[i] =
sd->status.account_reg2[sd->status.account_reg2_num - 1];
@@ -7146,111 +4452,69 @@ int pc_setaccountreg2 (struct map_session_data *sd, const char *reg, int val)
break;
}
}
- chrif_saveaccountreg2 (sd);
+ chrif_saveaccountreg2(sd);
return 0;
}
for (i = 0; i < sd->status.account_reg2_num; i++)
{
- if (strcmp (sd->status.account_reg2[i].str, reg) == 0)
+ if (strcmp(sd->status.account_reg2[i].str, reg) == 0)
{
sd->status.account_reg2[i].value = val;
- chrif_saveaccountreg2 (sd);
+ chrif_saveaccountreg2(sd);
return 0;
}
}
if (sd->status.account_reg2_num < ACCOUNT_REG2_NUM)
{
- strcpy (sd->status.account_reg2[i].str, reg);
+ strcpy(sd->status.account_reg2[i].str, reg);
sd->status.account_reg2[i].value = val;
sd->status.account_reg2_num++;
- chrif_saveaccountreg2 (sd);
+ chrif_saveaccountreg2(sd);
return 0;
}
if (battle_config.error_log)
- printf
- ("pc_setaccountreg2 : couldn't set %s (ACCOUNT_REG2_NUM = %d)\n",
+ PRINTF("pc_setaccountreg2 : couldn't set %s (ACCOUNT_REG2_NUM = %d)\n",
reg, ACCOUNT_REG2_NUM);
return 1;
}
/*==========================================
- * 精錬成功率
- *------------------------------------------
- */
-int pc_percentrefinery (struct map_session_data *sd, struct item *item)
-{
- int percent;
-
- nullpo_retr (0, item);
- percent = percentrefinery[itemdb_wlv (item->nameid)][(int) item->refine];
-
- percent += pc_checkskill (sd, BS_WEAPONRESEARCH); // 武器研究スキル所持
-
- // 確率の有効範囲チェック
- if (percent > 100)
- {
- percent = 100;
- }
- if (percent < 0)
- {
- percent = 0;
- }
-
- return percent;
-}
-
-/*==========================================
* イベントタイマー処理
*------------------------------------------
*/
static
-void pc_eventtimer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void pc_eventtimer(TimerData *, tick_t, int id, const char *data)
{
- struct map_session_data *sd = map_id2sd (id);
- int i;
- if (sd == NULL)
- return;
+ struct map_session_data *sd = map_id2sd(id);
+ assert (sd != NULL);
- for (i = 0; i < MAX_EVENTTIMER; i++)
- {
- if (sd->eventtimer[i] == tid)
- {
- sd->eventtimer[i] = -1;
- npc_event (sd, (const char *) data, 0);
- break;
- }
- }
- free ((void *) data);
- if (i == MAX_EVENTTIMER)
- {
- if (battle_config.error_log)
- printf ("pc_eventtimer: no such event timer\n");
- }
+ npc_event(sd, data, 0);
+
+ free(const_cast<char *>(data));
}
/*==========================================
* イベントタイマー追加
*------------------------------------------
*/
-int pc_addeventtimer (struct map_session_data *sd, int tick, const char *name)
+int pc_addeventtimer(struct map_session_data *sd, interval_t tick, const char *name)
{
- int i;
+ int i;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
for (i = 0; i < MAX_EVENTTIMER; i++)
- if (sd->eventtimer[i] == -1)
+ if (!sd->eventtimer[i])
break;
if (i < MAX_EVENTTIMER)
{
- char *evname = (char *) calloc (24, 1);
- strncpy (evname, name, 24);
- evname[23] = '\0';
- sd->eventtimer[i] = add_timer (gettick () + tick,
- pc_eventtimer, sd->bl.id,
- (int) evname);
+ char *evname = (char *) calloc(24, 1);
+ strzcpy(evname, name, 24);
+ sd->eventtimer[i] = Timer(gettick() + tick,
+ std::bind(pc_eventtimer, ph::_1, ph::_2,
+ sd->bl.id, evname));
return 1;
}
@@ -7258,69 +4522,15 @@ int pc_addeventtimer (struct map_session_data *sd, int tick, const char *name)
}
/*==========================================
- * イベントタイマー削除
- *------------------------------------------
- */
-int pc_deleventtimer (struct map_session_data *sd, const char *name)
-{
- int i;
-
- nullpo_retr (0, sd);
-
- for (i = 0; i < MAX_EVENTTIMER; i++)
- if (sd->eventtimer[i] != -1 && strcmp ((char
- *) (get_timer (sd->eventtimer
- [i])->data),
- name) == 0)
- {
- delete_timer (sd->eventtimer[i], pc_eventtimer);
- sd->eventtimer[i] = -1;
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * イベントタイマーカウント値追加
- *------------------------------------------
- */
-int pc_addeventtimercount (struct map_session_data *sd, const char *name,
- int tick)
-{
- int i;
-
- nullpo_retr (0, sd);
-
- for (i = 0; i < MAX_EVENTTIMER; i++)
- if (sd->eventtimer[i] != -1 && strcmp ((char
- *) (get_timer (sd->eventtimer
- [i])->data),
- name) == 0)
- {
- addtick_timer (sd->eventtimer[i], tick);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
* イベントタイマー全削除
*------------------------------------------
*/
-int pc_cleareventtimer (struct map_session_data *sd)
+int pc_cleareventtimer(struct map_session_data *sd)
{
- int i;
-
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- for (i = 0; i < MAX_EVENTTIMER; i++)
- if (sd->eventtimer[i] != -1)
- {
- delete_timer (sd->eventtimer[i], pc_eventtimer);
- sd->eventtimer[i] = -1;
- }
+ for (int i = 0; i < MAX_EVENTTIMER; i++)
+ sd->eventtimer[i].cancel();
return 0;
}
@@ -7332,191 +4542,157 @@ int pc_cleareventtimer (struct map_session_data *sd)
* アイテムを装備する
*------------------------------------------
*/
-static int
-pc_signal_advanced_equipment_change (struct map_session_data *sd, int n)
-{
- if (sd->status.inventory[n].equip & 0x0040)
- clif_changelook (&sd->bl, LOOK_SHOES, 0);
- if (sd->status.inventory[n].equip & 0x0004)
- clif_changelook (&sd->bl, LOOK_GLOVES, 0);
- if (sd->status.inventory[n].equip & 0x0008)
- clif_changelook (&sd->bl, LOOK_CAPE, 0);
- if (sd->status.inventory[n].equip & 0x0010)
- clif_changelook (&sd->bl, LOOK_MISC1, 0);
- if (sd->status.inventory[n].equip & 0x0080)
- clif_changelook (&sd->bl, LOOK_MISC2, 0);
+static
+int pc_signal_advanced_equipment_change(struct map_session_data *sd, int n)
+{
+ if (bool(sd->status.inventory[n].equip & EPOS::SHOES))
+ clif_changelook(&sd->bl, LOOK::SHOES, 0);
+ if (bool(sd->status.inventory[n].equip & EPOS::GLOVES))
+ clif_changelook(&sd->bl, LOOK::GLOVES, 0);
+ if (bool(sd->status.inventory[n].equip & EPOS::CAPE))
+ clif_changelook(&sd->bl, LOOK::CAPE, 0);
+ if (bool(sd->status.inventory[n].equip & EPOS::MISC1))
+ clif_changelook(&sd->bl, LOOK::MISC1, 0);
+ if (bool(sd->status.inventory[n].equip & EPOS::MISC2))
+ clif_changelook(&sd->bl, LOOK::MISC2, 0);
return 0;
}
-int pc_equipitem (struct map_session_data *sd, int n, int pos)
+int pc_equipitem(struct map_session_data *sd, int n, EPOS)
{
- int i, nameid, arrow, view;
+ int nameid;
struct item_data *id;
//ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (n < 0 || n >= MAX_INVENTORY)
{
- clif_equipitemack (sd, 0, 0, 0);
+ clif_equipitemack(sd, 0, EPOS::ZERO, 0);
return 0;
}
nameid = sd->status.inventory[n].nameid;
id = sd->inventory_data[n];
- pos = pc_equippoint (sd, n);
+ if (!id) // can't actually happen - the only caller checks this.
+ return 0;
+ EPOS pos = pc_equippoint(sd, n);
if (battle_config.battle_log)
- printf ("equip %d(%d) %x:%x\n", nameid, n, id->equip, pos);
- if (!pc_isequip (sd, n) || !pos || sd->status.inventory[n].broken == 1)
+ PRINTF("equip %d (%d) %x:%x\n",
+ nameid, n, id->equip, pos);
+ if (!pc_isequip(sd, n) || pos == EPOS::ZERO || sd->status.inventory[n].broken == 1)
{ // [Valaris]
- clif_equipitemack (sd, n, 0, 0); // fail
+ clif_equipitemack(sd, n, EPOS::ZERO, 0); // fail
return 0;
}
// -- moonsoul (if player is berserk then cannot equip)
//
- if (sd->sc_data[SC_BERSERK].timer != -1)
- {
- clif_equipitemack (sd, n, 0, 0); // fail
- return 0;
- }
-
- if (pos == 0x88)
- { // アクセサリ用例外処理
- int epor = 0;
- if (sd->equip_index[0] >= 0)
- epor |= sd->status.inventory[sd->equip_index[0]].equip;
- if (sd->equip_index[1] >= 0)
- epor |= sd->status.inventory[sd->equip_index[1]].equip;
- epor &= 0x88;
- pos = epor == 0x08 ? 0x80 : 0x08;
- }
-
- // 二刀流処理
- if ((pos == 0x22) // 一応、装備要求箇所が二刀流武器かチェックする
- && (id->equip == 2) // 単 手武器
- && (pc_checkskill (sd, AS_LEFT) > 0 || sd->status.pc_class == 12)) // 左手修錬有
+ if (pos == (EPOS::MISC2 | EPOS::CAPE))
{
- int tpos = 0;
- if (sd->equip_index[8] >= 0)
- tpos |= sd->status.inventory[sd->equip_index[8]].equip;
- if (sd->equip_index[9] >= 0)
- tpos |= sd->status.inventory[sd->equip_index[9]].equip;
- tpos &= 0x02;
- pos = tpos == 0x02 ? 0x20 : 0x02;
+ // アクセサリ用例外処理
+ EPOS epor = EPOS::ZERO;
+ if (sd->equip_index[EQUIP::MISC2] >= 0)
+ epor |= sd->status.inventory[sd->equip_index[EQUIP::MISC2]].equip;
+ if (sd->equip_index[EQUIP::CAPE] >= 0)
+ epor |= sd->status.inventory[sd->equip_index[EQUIP::CAPE]].equip;
+ epor &= (EPOS::MISC2 | EPOS::CAPE);
+ pos = (epor == EPOS::CAPE ? EPOS::MISC2 : EPOS::CAPE);
}
- arrow = pc_search_inventory (sd, pc_checkequip (sd, 9)); // Added by RoVeRT
- for (i = 0; i < 11; i++)
+ for (EQUIP i : EQUIPs)
{
- if (pos & equip_pos[i])
+ if (bool(pos & equip_pos[i]))
{
if (sd->equip_index[i] >= 0) //Slot taken, remove item from there.
- pc_unequipitem (sd, sd->equip_index[i], 1);
+ pc_unequipitem(sd, sd->equip_index[i], CalcStatus::LATER);
sd->equip_index[i] = n;
}
}
// 弓矢装備
- if (pos == 0x8000)
+ if (pos == EPOS::ARROW)
{
- clif_arrowequip (sd, n);
- clif_arrow_fail (sd, 3); // 3=矢が装備できました
+ clif_arrowequip(sd, n);
+ clif_arrow_fail(sd, 3); // 3=矢が装備できました
}
else
{
/* Don't update re-equipping if we're using a spell */
- if (!(pos == 4 && sd->attack_spell_override))
- clif_equipitemack (sd, n, pos, 1);
+ if (!(pos == EPOS::GLOVES && sd->attack_spell_override))
+ clif_equipitemack(sd, n, pos, 1);
}
- for (i = 0; i < 11; i++)
+ for (EQUIP i : EQUIPs)
{
- if (pos & equip_pos[i])
+ if (bool(pos & equip_pos[i]))
sd->equip_index[i] = n;
}
sd->status.inventory[n].equip = pos;
+ int view_i = 0;
+ ItemLook view_l = ItemLook::NONE;
+ // TODO: This is ugly.
if (sd->inventory_data[n])
{
- view = sd->inventory_data[n]->look;
- if (view == 0)
- view = sd->inventory_data[n]->nameid;
- }
- else
- {
- view = 0;
+ bool look_not_weapon = sd->inventory_data[n]->look == ItemLook::NONE;
+ bool equip_is_weapon = bool(sd->status.inventory[n].equip & EPOS::WEAPON);
+ assert (look_not_weapon != equip_is_weapon);
+
+ if (look_not_weapon)
+ view_i = sd->inventory_data[n]->nameid;
+ else
+ view_l = sd->inventory_data[n]->look;
}
- if (sd->status.inventory[n].equip & 0x0002)
+ if (bool(sd->status.inventory[n].equip & EPOS::WEAPON))
{
- sd->weapontype1 = view;
- pc_calcweapontype (sd);
- pc_set_weapon_look (sd);
+ sd->weapontype1 = view_l;
+ pc_calcweapontype(sd);
+ pc_set_weapon_look(sd);
}
- if (sd->status.inventory[n].equip & 0x0020)
+ if (bool(sd->status.inventory[n].equip & EPOS::SHIELD))
{
if (sd->inventory_data[n])
{
- if (sd->inventory_data[n]->type == 4)
+ if (sd->inventory_data[n]->type == ItemType::WEAPON)
{
sd->status.shield = 0;
- if (sd->status.inventory[n].equip == 0x0020)
- sd->weapontype2 = view;
+ if (sd->status.inventory[n].equip == EPOS::SHIELD)
+ sd->weapontype2 = view_l;
}
- else if (sd->inventory_data[n]->type == 5)
+ else if (sd->inventory_data[n]->type == ItemType::ARMOR)
{
- sd->status.shield = view;
- sd->weapontype2 = 0;
+ sd->status.shield = view_i;
+ sd->weapontype2 = ItemLook::NONE;
}
}
else
- sd->status.shield = sd->weapontype2 = 0;
- pc_calcweapontype (sd);
- clif_changelook (&sd->bl, LOOK_SHIELD, sd->status.shield);
- }
- if (sd->status.inventory[n].equip & 0x0001)
- {
- sd->status.head_bottom = view;
- clif_changelook (&sd->bl, LOOK_HEAD_BOTTOM, sd->status.head_bottom);
- }
- if (sd->status.inventory[n].equip & 0x0100)
- {
- sd->status.head_top = view;
- clif_changelook (&sd->bl, LOOK_HEAD_TOP, sd->status.head_top);
+ {
+ sd->status.shield = 0;
+ sd->weapontype2 = ItemLook::NONE;
+ }
+ pc_calcweapontype(sd);
+ clif_changelook(&sd->bl, LOOK::SHIELD, sd->status.shield);
}
- if (sd->status.inventory[n].equip & 0x0200)
+ if (bool(sd->status.inventory[n].equip & EPOS::LEGS))
{
- sd->status.head_mid = view;
- clif_changelook (&sd->bl, LOOK_HEAD_MID, sd->status.head_mid);
- }
- pc_signal_advanced_equipment_change (sd, n);
-
- pc_checkallowskill (sd); // 装備品でスキルか解除されるかチェック
- if (itemdb_look (sd->status.inventory[n].nameid) == 11 && arrow)
- { // Added by RoVeRT
- clif_arrowequip (sd, arrow);
- sd->status.inventory[arrow].equip = 32768;
+ sd->status.head_bottom = view_i;
+ clif_changelook(&sd->bl, LOOK::HEAD_BOTTOM, sd->status.head_bottom);
}
- pc_calcstatus (sd, 0);
-
- if (sd->special_state.infinite_endure)
+ if (bool(sd->status.inventory[n].equip & EPOS::HAT))
{
- if (sd->sc_data[SC_ENDURE].timer == -1)
- skill_status_change_start (&sd->bl, SC_ENDURE, 10, 1, 0, 0, 0, 0);
+ sd->status.head_top = view_i;
+ clif_changelook(&sd->bl, LOOK::HEAD_TOP, sd->status.head_top);
}
- else
+ if (bool(sd->status.inventory[n].equip & EPOS::TORSO))
{
- if (sd->sc_data[SC_ENDURE].timer != -1 && sd->sc_data[SC_ENDURE].val2)
- skill_status_change_end (&sd->bl, SC_ENDURE, -1);
+ sd->status.head_mid = view_i;
+ clif_changelook(&sd->bl, LOOK::HEAD_MID, sd->status.head_mid);
}
+ pc_signal_advanced_equipment_change(sd, n);
- if (sd->sc_data[SC_SIGNUMCRUCIS].timer != -1
- && !battle_check_undead (7, sd->def_ele))
- skill_status_change_end (&sd->bl, SC_SIGNUMCRUCIS, -1);
- if (sd->sc_data[SC_DANCING].timer != -1
- && (sd->status.weapon != 13 && sd->status.weapon != 14))
- skill_stop_dancing (&sd->bl, 0);
+ pc_calcstatus(sd, 0);
return 0;
}
@@ -7525,98 +4701,87 @@ int pc_equipitem (struct map_session_data *sd, int n, int pos)
* 装 備した物を外す
*------------------------------------------
*/
-int pc_unequipitem (struct map_session_data *sd, int n, int type)
+int pc_unequipitem(struct map_session_data *sd, int n, CalcStatus type)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
// -- moonsoul (if player is berserk then cannot unequip)
//
- if (sd->sc_data[SC_BERSERK].timer != -1)
- {
- clif_unequipitemack (sd, n, 0, 0);
- return 0;
- }
-
if (battle_config.battle_log)
- printf ("unequip %d %x:%x\n", n, pc_equippoint (sd, n),
+ PRINTF("unequip %d %x:%x\n",
+ n, pc_equippoint(sd, n),
sd->status.inventory[n].equip);
- if (sd->status.inventory[n].equip)
+ if (bool(sd->status.inventory[n].equip))
{
- int i;
- for (i = 0; i < 11; i++)
+ for (EQUIP i : EQUIPs)
{
- if (sd->status.inventory[n].equip & equip_pos[i])
+ if (bool(sd->status.inventory[n].equip & equip_pos[i]))
sd->equip_index[i] = -1;
}
- if (sd->status.inventory[n].equip & 0x0002)
+ if (bool(sd->status.inventory[n].equip & EPOS::WEAPON))
{
- sd->weapontype1 = 0;
+ sd->weapontype1 = ItemLook::NONE;
sd->status.weapon = sd->weapontype2;
- pc_calcweapontype (sd);
- pc_set_weapon_look (sd);
+ pc_calcweapontype(sd);
+ pc_set_weapon_look(sd);
}
- if (sd->status.inventory[n].equip & 0x0020)
+ if (bool(sd->status.inventory[n].equip & EPOS::SHIELD))
{
- sd->status.shield = sd->weapontype2 = 0;
- pc_calcweapontype (sd);
- clif_changelook (&sd->bl, LOOK_SHIELD, sd->status.shield);
+ sd->status.shield = 0;
+ sd->weapontype2 = ItemLook::NONE;
+ pc_calcweapontype(sd);
+ clif_changelook(&sd->bl, LOOK::SHIELD, sd->status.shield);
}
- if (sd->status.inventory[n].equip & 0x0001)
+ if (bool(sd->status.inventory[n].equip & EPOS::LEGS))
{
sd->status.head_bottom = 0;
- clif_changelook (&sd->bl, LOOK_HEAD_BOTTOM,
+ clif_changelook(&sd->bl, LOOK::HEAD_BOTTOM,
sd->status.head_bottom);
}
- if (sd->status.inventory[n].equip & 0x0100)
+ if (bool(sd->status.inventory[n].equip & EPOS::HAT))
{
sd->status.head_top = 0;
- clif_changelook (&sd->bl, LOOK_HEAD_TOP, sd->status.head_top);
+ clif_changelook(&sd->bl, LOOK::HEAD_TOP, sd->status.head_top);
}
- if (sd->status.inventory[n].equip & 0x0200)
+ if (bool(sd->status.inventory[n].equip & EPOS::TORSO))
{
sd->status.head_mid = 0;
- clif_changelook (&sd->bl, LOOK_HEAD_MID, sd->status.head_mid);
+ clif_changelook(&sd->bl, LOOK::HEAD_MID, sd->status.head_mid);
}
- pc_signal_advanced_equipment_change (sd, n);
+ pc_signal_advanced_equipment_change(sd, n);
- if (sd->sc_data[SC_BROKNWEAPON].timer != -1
- && sd->status.inventory[n].equip & 0x0002
- && sd->status.inventory[i].broken == 1)
- skill_status_change_end (&sd->bl, SC_BROKNWEAPON, -1);
+ if (sd->sc_data[StatusChange::SC_BROKNWEAPON].timer
+ && bool(sd->status.inventory[n].equip & EPOS::WEAPON)
+ && sd->status.inventory[n].broken == 1)
+ skill_status_change_end(&sd->bl, StatusChange::SC_BROKNWEAPON, nullptr);
- clif_unequipitemack (sd, n, sd->status.inventory[n].equip, 1);
- sd->status.inventory[n].equip = 0;
- if (!type)
- pc_checkallowskill (sd);
- if (sd->weapontype1 == 0 && sd->weapontype2 == 0)
- skill_encchant_eremental_end (&sd->bl, -1); //武器持ち誓えは無条件で属性付与解除
+ clif_unequipitemack(sd, n, sd->status.inventory[n].equip, 1);
+ sd->status.inventory[n].equip = EPOS::ZERO;
}
else
{
- clif_unequipitemack (sd, n, 0, 0);
+ clif_unequipitemack(sd, n, EPOS::ZERO, 0);
}
- if (!type)
+ if (type == CalcStatus::NOW)
{
- pc_calcstatus (sd, 0);
- if (sd->sc_data[SC_SIGNUMCRUCIS].timer != -1
- && !battle_check_undead (7, sd->def_ele))
- skill_status_change_end (&sd->bl, SC_SIGNUMCRUCIS, -1);
+ pc_calcstatus(sd, 0);
}
return 0;
}
-int pc_unequipinvyitem (struct map_session_data *sd, int n, int type)
+int pc_unequipinvyitem(struct map_session_data *sd, int n, CalcStatus type)
{
- int i;
-
- nullpo_retr (1, sd);
+ nullpo_retr(1, sd);
- for (i = 0; i < 11; i++)
+ for (EQUIP i : EQUIPs)
{
- if (equip_pos[i] > 0 && sd->equip_index[i] == n)
- { //Slot taken, remove item from there.
- pc_unequipitem (sd, sd->equip_index[i], type);
+ if (equip_pos[i] != EPOS::ZERO
+ && !bool(equip_pos[i] & EPOS::ARROW) // probably a bug
+ && sd->equip_index[i] == n)
+ {
+ //Slot taken, remove item from there.
+ pc_unequipitem(sd, sd->equip_index[i], type);
sd->equip_index[i] = -1;
}
}
@@ -7629,37 +4794,37 @@ int pc_unequipinvyitem (struct map_session_data *sd, int n, int type)
* 装 備品の装備可能チェックを行なう
*------------------------------------------
*/
-int pc_checkitem (struct map_session_data *sd)
+int pc_checkitem(struct map_session_data *sd)
{
- int i, j, k, id, calc_flag = 0;
+ int i, j, k, id, calc_flag = 0;
struct item_data *it = NULL;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
// 所持品空き詰め
for (i = j = 0; i < MAX_INVENTORY; i++)
{
if ((id = sd->status.inventory[i].nameid) == 0)
continue;
- if (battle_config.item_check && !itemdb_available (id))
+ if (battle_config.item_check && !itemdb_available(id))
{
if (battle_config.error_log)
- printf ("illeagal item id %d in %d[%s] inventory.\n", id,
+ PRINTF("illeagal item id %d in %d[%s] inventory.\n", id,
sd->bl.id, sd->status.name);
- pc_delitem (sd, i, sd->status.inventory[i].amount, 3);
+ pc_delitem(sd, i, sd->status.inventory[i].amount, 3);
continue;
}
if (i > j)
{
- memcpy (&sd->status.inventory[j], &sd->status.inventory[i],
- sizeof (struct item));
+ memcpy(&sd->status.inventory[j], &sd->status.inventory[i],
+ sizeof(struct item));
sd->inventory_data[j] = sd->inventory_data[i];
}
j++;
}
if (j < MAX_INVENTORY)
- memset (&sd->status.inventory[j], 0,
- sizeof (struct item) * (MAX_INVENTORY - j));
+ memset(&sd->status.inventory[j], 0,
+ sizeof(struct item) * (MAX_INVENTORY - j));
for (k = j; k < MAX_INVENTORY; k++)
sd->inventory_data[k] = NULL;
@@ -7668,24 +4833,24 @@ int pc_checkitem (struct map_session_data *sd)
{
if ((id = sd->status.cart[i].nameid) == 0)
continue;
- if (battle_config.item_check && !itemdb_available (id))
+ if (battle_config.item_check && !itemdb_available(id))
{
if (battle_config.error_log)
- printf ("illeagal item id %d in %d[%s] cart.\n", id,
+ PRINTF("illeagal item id %d in %d[%s] cart.\n", id,
sd->bl.id, sd->status.name);
- pc_cart_delitem (sd, i, sd->status.cart[i].amount, 1);
+ pc_cart_delitem(sd, i, sd->status.cart[i].amount, 1);
continue;
}
if (i > j)
{
- memcpy (&sd->status.cart[j], &sd->status.cart[i],
- sizeof (struct item));
+ memcpy(&sd->status.cart[j], &sd->status.cart[i],
+ sizeof(struct item));
}
j++;
}
if (j < MAX_CART)
- memset (&sd->status.cart[j], 0,
- sizeof (struct item) * (MAX_CART - j));
+ memset(&sd->status.cart[j], 0,
+ sizeof(struct item) * (MAX_CART - j));
// 装 備位置チェック
@@ -7696,59 +4861,54 @@ int pc_checkitem (struct map_session_data *sd)
if (sd->status.inventory[i].nameid == 0)
continue;
- if (sd->status.inventory[i].equip & ~pc_equippoint (sd, i))
+ if (bool(sd->status.inventory[i].equip & ~pc_equippoint(sd, i)))
{
- sd->status.inventory[i].equip = 0;
+ sd->status.inventory[i].equip = EPOS::ZERO;
calc_flag = 1;
}
//装備制限チェック
- if (sd->status.inventory[i].equip && map[sd->bl.m].flag.pvp
+ if (bool(sd->status.inventory[i].equip)
+ && map[sd->bl.m].flag.pvp
&& (it->flag.no_equip == 1 || it->flag.no_equip == 3))
{ //PvP制限
- sd->status.inventory[i].equip = 0;
- calc_flag = 1;
- }
- else if (sd->status.inventory[i].equip && map[sd->bl.m].flag.gvg
- && (it->flag.no_equip == 2 || it->flag.no_equip == 3))
- { //GvG制限
- sd->status.inventory[i].equip = 0;
+ sd->status.inventory[i].equip = EPOS::ZERO;
calc_flag = 1;
}
}
- pc_setequipindex (sd);
+ pc_setequipindex(sd);
if (calc_flag)
- pc_calcstatus (sd, 2);
+ pc_calcstatus(sd, 2);
return 0;
}
-int pc_checkoverhp (struct map_session_data *sd)
+int pc_checkoverhp(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->status.hp == sd->status.max_hp)
return 1;
if (sd->status.hp > sd->status.max_hp)
{
sd->status.hp = sd->status.max_hp;
- clif_updatestatus (sd, SP_HP);
+ clif_updatestatus(sd, SP::HP);
return 2;
}
return 0;
}
-int pc_checkoversp (struct map_session_data *sd)
+int pc_checkoversp(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
if (sd->status.sp == sd->status.max_sp)
return 1;
if (sd->status.sp > sd->status.max_sp)
{
sd->status.sp = sd->status.max_sp;
- clif_updatestatus (sd, SP_SP);
+ clif_updatestatus(sd, SP::SP);
return 2;
}
@@ -7760,41 +4920,36 @@ int pc_checkoversp (struct map_session_data *sd)
*------------------------------------------
*/
static
-int pc_calc_pvprank_sub (struct block_list *bl, va_list ap)
+void pc_calc_pvprank_sub(struct block_list *bl, struct map_session_data *sd2)
{
- struct map_session_data *sd1, *sd2 = NULL;
+ struct map_session_data *sd1;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, sd1 = (struct map_session_data *) bl);
- nullpo_retr (0, sd2 = va_arg (ap, struct map_session_data *));
+ nullpo_retv(bl);
+ sd1 = (struct map_session_data *) bl;
+ nullpo_retv(sd2);
if (sd1->pvp_point > sd2->pvp_point)
sd2->pvp_rank++;
- return 0;
}
/*==========================================
* PVP順位計算
*------------------------------------------
*/
-int pc_calc_pvprank (struct map_session_data *sd)
+int pc_calc_pvprank(struct map_session_data *sd)
{
- int old;
struct map_data *m;
- nullpo_retr (0, sd);
- nullpo_retr (0, m = &map[sd->bl.m]);
-
- old = sd->pvp_rank;
+ nullpo_ret(sd);
+ m = &map[sd->bl.m];
+ nullpo_ret(m);
if (!(m->flag.pvp))
return 0;
sd->pvp_rank = 1;
- map_foreachinarea (pc_calc_pvprank_sub, sd->bl.m, 0, 0, m->xs, m->ys,
- BL_PC, sd);
- if (old != sd->pvp_rank || sd->pvp_lastusers != m->users)
- clif_pvpset (sd, sd->pvp_rank, sd->pvp_lastusers = m->users, 0);
+ map_foreachinarea(std::bind(pc_calc_pvprank_sub, ph::_1, sd),
+ sd->bl.m, 0, 0, m->xs, m->ys,
+ BL::PC);
return sd->pvp_rank;
}
@@ -7802,26 +4957,28 @@ int pc_calc_pvprank (struct map_session_data *sd)
* PVP順位計算(timer)
*------------------------------------------
*/
-void pc_calc_pvprank_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void pc_calc_pvprank_timer(TimerData *, tick_t, int id)
{
struct map_session_data *sd = NULL;
if (battle_config.pk_mode) // disable pvp ranking if pk_mode on [Valaris]
return;
- sd = map_id2sd (id);
+ sd = map_id2sd(id);
if (sd == NULL)
return;
- sd->pvp_timer = -1;
- if (pc_calc_pvprank (sd) > 0)
- sd->pvp_timer = add_timer (gettick () + PVP_CALCRANK_INTERVAL,
- pc_calc_pvprank_timer, id, data);
+ sd->pvp_timer.cancel();
+ if (pc_calc_pvprank(sd) > 0)
+ sd->pvp_timer = Timer(gettick() + PVP_CALCRANK_INTERVAL,
+ std::bind(pc_calc_pvprank_timer, ph::_1, ph::_2,
+ id));
}
/*==========================================
* sdは結婚しているか(既婚の場合は相方のchar_idを返す)
*------------------------------------------
*/
-int pc_ismarried (struct map_session_data *sd)
+static
+int pc_ismarried(struct map_session_data *sd)
{
if (sd == NULL)
return -1;
@@ -7835,7 +4992,7 @@ int pc_ismarried (struct map_session_data *sd)
* sdがdstsdと結婚(dstsd→sdの結婚処理も同時に行う)
*------------------------------------------
*/
-int pc_marriage (struct map_session_data *sd, struct map_session_data *dstsd)
+int pc_marriage(struct map_session_data *sd, struct map_session_data *dstsd)
{
if (sd == NULL || dstsd == NULL || sd->status.partner_id > 0
|| dstsd->status.partner_id > 0)
@@ -7849,20 +5006,20 @@ int pc_marriage (struct map_session_data *sd, struct map_session_data *dstsd)
* sdが離婚(相手はsd->status.partner_idに依る)(相手も同時に離婚・結婚指輪自動剥奪)
*------------------------------------------
*/
-int pc_divorce (struct map_session_data *sd)
+int pc_divorce(struct map_session_data *sd)
{
struct map_session_data *p_sd = NULL;
- if (sd == NULL || !pc_ismarried (sd))
+ if (sd == NULL || !pc_ismarried(sd))
return -1;
// If both are on map server we don't need to bother the char server
if ((p_sd =
- map_nick2sd (map_charid2nick (sd->status.partner_id))) != NULL)
+ map_nick2sd(map_charid2nick(sd->status.partner_id))) != NULL)
{
if (p_sd->status.partner_id != sd->status.char_id
|| sd->status.partner_id != p_sd->status.char_id)
{
- printf ("pc_divorce: Illegal partner_id sd=%d p_sd=%d\n",
+ PRINTF("pc_divorce: Illegal partner_id sd=%d p_sd=%d\n",
sd->status.partner_id, p_sd->status.partner_id);
return -1;
}
@@ -7872,11 +5029,11 @@ int pc_divorce (struct map_session_data *sd)
if (sd->npc_flags.divorce)
{
sd->npc_flags.divorce = 0;
- map_scriptcont (sd, sd->npc_id);
+ map_scriptcont(sd, sd->npc_id);
}
}
else
- chrif_send_divorce (sd->status.char_id);
+ chrif_send_divorce(sd->status.char_id);
return 0;
}
@@ -7885,19 +5042,19 @@ int pc_divorce (struct map_session_data *sd)
* sdの相方のmap_session_dataを返す
*------------------------------------------
*/
-struct map_session_data *pc_get_partner (struct map_session_data *sd)
+struct map_session_data *pc_get_partner(struct map_session_data *sd)
{
struct map_session_data *p_sd = NULL;
char *nick;
- if (sd == NULL || !pc_ismarried (sd))
+ if (sd == NULL || !pc_ismarried(sd))
return NULL;
- nick = map_charid2nick (sd->status.partner_id);
+ nick = map_charid2nick(sd->status.partner_id);
if (nick == NULL)
return NULL;
- if ((p_sd = map_nick2sd (nick)) == NULL)
+ if ((p_sd = map_nick2sd(nick)) == NULL)
return NULL;
return p_sd;
@@ -7910,29 +5067,20 @@ struct map_session_data *pc_get_partner (struct map_session_data *sd)
* SP回復量計算
*------------------------------------------
*/
-static int natural_heal_tick, natural_heal_prev_tick, natural_heal_diff_tick;
-static int pc_spheal (struct map_session_data *sd)
-{
- int a;
- struct guild_castle *gc = NULL;
+static
+tick_t natural_heal_tick, natural_heal_prev_tick;
+static
+interval_t natural_heal_diff_tick;
- nullpo_retr (0, sd);
+static
+interval_t pc_spheal(struct map_session_data *sd)
+{
+ nullpo_retr(interval_t::zero(), sd);
- a = natural_heal_diff_tick;
- if (pc_issit (sd))
- a += a;
- if (sd->sc_data[SC_MAGNIFICAT].timer != -1) // マグニフィカート
+ interval_t a = natural_heal_diff_tick;
+ if (pc_issit(sd))
a += a;
- gc = guild_mapname2gc (sd->mapname); // Increased guild castle regen [Valaris]
- if (gc)
- {
- struct guild *g;
- g = guild_search (sd->status.guild_id);
- if (g && g->guild_id == gc->guild_id)
- a += a;
- } // end addition [Valaris]
-
return a;
}
@@ -7940,333 +5088,154 @@ static int pc_spheal (struct map_session_data *sd)
* HP回復量計算
*------------------------------------------
*/
-static int pc_hpheal (struct map_session_data *sd)
+static
+interval_t pc_hpheal(struct map_session_data *sd)
{
- int a;
- struct guild_castle *gc;
-
- nullpo_retr (0, sd);
+ nullpo_retr(interval_t::zero(), sd);
- a = natural_heal_diff_tick;
- if (pc_issit (sd))
+ interval_t a = natural_heal_diff_tick;
+ if (pc_issit(sd))
a += a;
- if (sd->sc_data[SC_MAGNIFICAT].timer != -1) // Modified by RoVeRT
- a += a;
-
- gc = guild_mapname2gc (sd->mapname); // Increased guild castle regen [Valaris]
- if (gc)
- {
- struct guild *g;
- g = guild_search (sd->status.guild_id);
- if (g && g->guild_id == gc->guild_id)
- a += a;
- } // end addition [Valaris]
return a;
}
-static int pc_natural_heal_hp (struct map_session_data *sd)
+static
+int pc_natural_heal_hp(struct map_session_data *sd)
{
- int bhp;
- int inc_num, bonus, skill, hp_flag;
-
- nullpo_retr (0, sd);
+ int bhp;
+ int bonus;
- if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT
- return 0;
+ nullpo_ret(sd);
- if (pc_checkoverhp (sd))
+ if (pc_checkoverhp(sd))
{
- sd->hp_sub = sd->inchealhptick = 0;
+ sd->hp_sub = sd->inchealhptick = interval_t::zero();
return 0;
}
bhp = sd->status.hp;
- hp_flag = (pc_checkskill (sd, SM_MOVINGRECOVERY) > 0
- && sd->walktimer != -1);
- if (sd->walktimer == -1)
+ if (!sd->walktimer)
{
- inc_num = pc_hpheal (sd);
- if (sd->sc_data[SC_TENSIONRELAX].timer != -1)
- { // テンションリラックス
- sd->hp_sub += 2 * inc_num;
- sd->inchealhptick += 3 * natural_heal_diff_tick;
- }
- else
- {
- sd->hp_sub += inc_num;
- sd->inchealhptick += natural_heal_diff_tick;
- }
- }
- else if (hp_flag)
- {
- inc_num = pc_hpheal (sd);
+ interval_t inc_num = pc_hpheal(sd);
sd->hp_sub += inc_num;
- sd->inchealhptick = 0;
+ sd->inchealhptick += natural_heal_diff_tick;
}
else
{
- sd->hp_sub = sd->inchealhptick = 0;
+ sd->hp_sub = sd->inchealhptick = interval_t::zero();
return 0;
}
- if (sd->hp_sub >= battle_config.natural_healhp_interval)
+ if (sd->hp_sub >= static_cast<interval_t>(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)
+ while (sd->hp_sub >= static_cast<interval_t>(battle_config.natural_healhp_interval))
{
- sd->hp_sub -= battle_config.natural_healhp_interval;
+ sd->hp_sub -= static_cast<interval_t>(battle_config.natural_healhp_interval);
if (sd->status.hp + bonus <= sd->status.max_hp)
sd->status.hp += bonus;
else
{
sd->status.hp = sd->status.max_hp;
- sd->hp_sub = sd->inchealhptick = 0;
+ sd->hp_sub = sd->inchealhptick = interval_t::zero();
}
}
}
if (bhp != sd->status.hp)
- clif_updatestatus (sd, SP_HP);
+ clif_updatestatus(sd, SP::HP);
if (sd->nshealhp > 0)
{
- if (sd->inchealhptick >= battle_config.natural_heal_skill_interval
+ if (sd->inchealhptick >= static_cast<interval_t>(battle_config.natural_heal_skill_interval)
&& sd->status.hp < sd->status.max_hp)
{
bonus = sd->nshealhp;
- while (sd->inchealhptick >=
- battle_config.natural_heal_skill_interval)
- {
- sd->inchealhptick -=
- battle_config.natural_heal_skill_interval;
- if (sd->status.hp + bonus <= sd->status.max_hp)
- sd->status.hp += bonus;
- else
- {
- bonus = sd->status.max_hp - sd->status.hp;
- sd->status.hp = sd->status.max_hp;
- sd->hp_sub = sd->inchealhptick = 0;
- }
- clif_heal (sd->fd, SP_HP, bonus);
- }
- }
- }
- else
- sd->inchealhptick = 0;
-
- return 0;
-
- if (sd->sc_data[SC_APPLEIDUN].timer != -1)
- { // Apple of Idun
- if (sd->inchealhptick >= 6000 && sd->status.hp < sd->status.max_hp)
- {
- bonus = skill * 20;
- while (sd->inchealhptick >= 6000)
+ while (sd->inchealhptick >= static_cast<interval_t>(battle_config.natural_heal_skill_interval))
{
- sd->inchealhptick -= 6000;
+ sd->inchealhptick -= static_cast<interval_t>(battle_config.natural_heal_skill_interval);
if (sd->status.hp + bonus <= sd->status.max_hp)
sd->status.hp += bonus;
else
{
bonus = sd->status.max_hp - sd->status.hp;
sd->status.hp = sd->status.max_hp;
- sd->hp_sub = sd->inchealhptick = 0;
+ sd->hp_sub = sd->inchealhptick = interval_t::zero();
}
- clif_heal (sd->fd, SP_HP, bonus);
}
}
}
else
- sd->inchealhptick = 0;
+ sd->inchealhptick = interval_t::zero();
return 0;
}
-static int pc_natural_heal_sp (struct map_session_data *sd)
+static
+int pc_natural_heal_sp(struct map_session_data *sd)
{
- int bsp;
- int inc_num, bonus;
+ int bsp;
+ int bonus;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT
- return 0;
-
- if (pc_checkoversp (sd))
+ if (pc_checkoversp(sd))
{
- sd->sp_sub = sd->inchealsptick = 0;
+ sd->sp_sub = sd->inchealsptick = interval_t::zero();
return 0;
}
bsp = sd->status.sp;
- inc_num = pc_spheal (sd);
- if (sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1)
- sd->sp_sub += inc_num;
- if (sd->walktimer == -1)
+ interval_t inc_num = pc_spheal(sd);
+ sd->sp_sub += inc_num;
+ if (!sd->walktimer)
sd->inchealsptick += natural_heal_diff_tick;
else
- sd->inchealsptick = 0;
+ sd->inchealsptick = interval_t::zero();
- if (sd->sp_sub >= battle_config.natural_healsp_interval)
+ if (sd->sp_sub >= static_cast<interval_t>(battle_config.natural_healsp_interval))
{
- bonus = sd->nhealsp;;
- while (sd->sp_sub >= battle_config.natural_healsp_interval)
+ bonus = sd->nhealsp;
+ while (sd->sp_sub >= static_cast<interval_t>(battle_config.natural_healsp_interval))
{
- sd->sp_sub -= battle_config.natural_healsp_interval;
+ sd->sp_sub -= static_cast<interval_t>(battle_config.natural_healsp_interval);
if (sd->status.sp + bonus <= sd->status.max_sp)
sd->status.sp += bonus;
else
{
sd->status.sp = sd->status.max_sp;
- sd->sp_sub = sd->inchealsptick = 0;
+ sd->sp_sub = sd->inchealsptick = interval_t::zero();
}
}
}
if (bsp != sd->status.sp)
- clif_updatestatus (sd, SP_SP);
+ clif_updatestatus(sd, SP::SP);
if (sd->nshealsp > 0)
{
- if (sd->inchealsptick >= battle_config.natural_heal_skill_interval
+ if (sd->inchealsptick >= static_cast<interval_t>(battle_config.natural_heal_skill_interval)
&& sd->status.sp < sd->status.max_sp)
{
- struct pc_base_job s_class = pc_calc_base_job (sd->status.pc_class);
- if (sd->doridori_counter && s_class.job == 23)
- bonus = sd->nshealsp * 2;
- else
- bonus = sd->nshealsp;
- sd->doridori_counter = 0;
- while (sd->inchealsptick >=
- battle_config.natural_heal_skill_interval)
+ bonus = sd->nshealsp;
+ while (sd->inchealsptick >= static_cast<interval_t>(battle_config.natural_heal_skill_interval))
{
- sd->inchealsptick -=
- battle_config.natural_heal_skill_interval;
+ sd->inchealsptick -= static_cast<interval_t>(battle_config.natural_heal_skill_interval);
if (sd->status.sp + bonus <= sd->status.max_sp)
sd->status.sp += bonus;
else
{
bonus = sd->status.max_sp - sd->status.sp;
sd->status.sp = sd->status.max_sp;
- sd->sp_sub = sd->inchealsptick = 0;
+ sd->sp_sub = sd->inchealsptick = interval_t::zero();
}
- clif_heal (sd->fd, SP_SP, bonus);
}
}
}
else
- sd->inchealsptick = 0;
-
- return 0;
-}
-
-static int pc_spirit_heal_hp (struct map_session_data *sd, int level)
-{
- int bonus_hp, interval = battle_config.natural_heal_skill_interval;
- struct status_change *sc_data = battle_get_sc_data (&sd->bl);
-
- nullpo_retr (0, 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;
- }
- clif_heal (sd->fd, SP_HP, bonus_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 level)
-{
- int bonus_sp, interval = battle_config.natural_heal_skill_interval;
-
- nullpo_retr (0, 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;
- }
- clif_heal (sd->fd, SP_SP, bonus_sp);
- sd->inchealspiritsptick = 0;
- }
- }
- else
- {
- sd->inchealspiritsptick -= natural_heal_diff_tick;
- break;
- }
- }
- }
-
+ sd->inchealsptick = interval_t::zero();
return 0;
}
@@ -8275,14 +5244,14 @@ static int pc_spirit_heal_sp (struct map_session_data *sd, int level)
*------------------------------------------
*/
-static int
-pc_quickregenerate_effect (struct quick_regeneration *quick_regen,
+static
+int pc_quickregenerate_effect(struct quick_regeneration *quick_regen,
int heal_speed)
{
if (!(quick_regen->tickdelay--))
{
- int bonus =
- MIN (heal_speed * battle_config.itemheal_regeneration_factor,
+ int bonus =
+ min(heal_speed * battle_config.itemheal_regeneration_factor,
quick_regen->amount);
quick_regen->amount -= bonus;
@@ -8295,11 +5264,10 @@ pc_quickregenerate_effect (struct quick_regeneration *quick_regen,
return 0;
}
-static int pc_natural_heal_sub (struct map_session_data *sd, va_list ap)
+static
+void pc_natural_heal_sub(struct map_session_data *sd)
{
- int skill;
-
- nullpo_retr (0, sd);
+ nullpo_retv(sd);
if (sd->heal_xp > 0)
{
@@ -8313,7 +5281,7 @@ static int pc_natural_heal_sub (struct map_session_data *sd, va_list ap)
if (sd->spellpower_bonus_target < sd->spellpower_bonus_current)
{
sd->spellpower_bonus_current = sd->spellpower_bonus_target;
- pc_calcstatus (sd, 0);
+ pc_calcstatus(sd, 0);
}
else if (sd->spellpower_bonus_target > sd->spellpower_bonus_current)
{
@@ -8321,55 +5289,40 @@ static int pc_natural_heal_sub (struct map_session_data *sd, va_list ap)
1 +
((sd->spellpower_bonus_target -
sd->spellpower_bonus_current) >> 5);
- pc_calcstatus (sd, 0);
+ pc_calcstatus(sd, 0);
}
- if (sd->sc_data[SC_HALT_REGENERATE].timer != -1)
- return 0;
+ if (sd->sc_data[StatusChange::SC_HALT_REGENERATE].timer)
+ return;
if (sd->quick_regeneration_hp.amount || sd->quick_regeneration_sp.amount)
{
- int hp_bonus = pc_quickregenerate_effect (&sd->quick_regeneration_hp,
- (sd->sc_data[SC_POISON].timer == -1 || sd->sc_data[SC_SLOWPOISON].timer != -1) ? sd->nhealhp : 1); // [fate] slow down when poisoned
- int sp_bonus = pc_quickregenerate_effect (&sd->quick_regeneration_sp,
+ int hp_bonus = pc_quickregenerate_effect(&sd->quick_regeneration_hp,
+ (!sd->sc_data[StatusChange::SC_POISON].timer
+ || sd->sc_data[StatusChange::SC_SLOWPOISON].timer)
+ ? sd->nhealhp
+ : 1); // [fate] slow down when poisoned
+ int sp_bonus = pc_quickregenerate_effect(&sd->quick_regeneration_sp,
sd->nhealsp);
- pc_itemheal_effect (sd, hp_bonus, sp_bonus);
+ pc_itemheal_effect(sd, hp_bonus, sp_bonus);
}
- skill_update_heal_animation (sd); // if needed.
+ skill_update_heal_animation(sd); // if needed.
-// -- moonsoul (if conditions below altered to disallow natural healing if under berserk status)
- if ((sd->sc_data[SC_FLYING_BACKPACK].timer != -1
- || battle_config.natural_heal_weight_rate > 100
- || sd->weight * 100 / sd->max_weight <
- battle_config.natural_heal_weight_rate) && !pc_isdead (sd)
- && !pc_ishiding (sd) && sd->sc_data[SC_POISON].timer == -1)
- {
- pc_natural_heal_hp (sd);
- if (sd->sc_data && sd->sc_data[SC_EXTREMITYFIST].timer == -1 && //阿修羅状態ではSPが回復しない
- sd->sc_data[SC_DANCING].timer == -1 && //ダンス状態ではSPが回復しない
- sd->sc_data[SC_BERSERK].timer == -1 //バーサーク状態ではSPが回復しない
- )
- pc_natural_heal_sp (sd);
- }
- else
+ if ((sd->sc_data[StatusChange::SC_FLYING_BACKPACK].timer
+ || battle_config.natural_heal_weight_rate > 100
+ || sd->weight * 100 / sd->max_weight < battle_config.natural_heal_weight_rate)
+ && !pc_isdead(sd)
+ && !sd->sc_data[StatusChange::SC_POISON].timer)
{
- 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);
+ pc_natural_heal_hp(sd);
+ pc_natural_heal_sp(sd);
}
else
{
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
+ sd->hp_sub = sd->inchealhptick = interval_t::zero();
+ sd->sp_sub = sd->inchealsptick = interval_t::zero();
}
- return 0;
}
/*==========================================
@@ -8377,12 +5330,11 @@ static int pc_natural_heal_sub (struct map_session_data *sd, va_list ap)
*------------------------------------------
*/
static
-void pc_natural_heal (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void pc_natural_heal(TimerData *, tick_t tick)
{
natural_heal_tick = tick;
- natural_heal_diff_tick =
- DIFF_TICK (natural_heal_tick, natural_heal_prev_tick);
- clif_foreachclient (pc_natural_heal_sub);
+ natural_heal_diff_tick = natural_heal_tick - natural_heal_prev_tick;
+ clif_foreachclient(pc_natural_heal_sub);
natural_heal_prev_tick = tick;
}
@@ -8391,11 +5343,11 @@ void pc_natural_heal (timer_id tid, tick_t tick, custom_id_t id, custom_data_t d
* セーブポイントの保存
*------------------------------------------
*/
-int pc_setsavepoint (struct map_session_data *sd, const char *mapname, int x, int y)
+int pc_setsavepoint(struct map_session_data *sd, const char *mapname, int x, int y)
{
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- strncpy (sd->status.save_point.map, mapname, 23);
+ strncpy(sd->status.save_point.map, mapname, 23);
sd->status.save_point.map[23] = '\0';
sd->status.save_point.x = x;
sd->status.save_point.y = y;
@@ -8407,47 +5359,21 @@ int pc_setsavepoint (struct map_session_data *sd, const char *mapname, int x, in
* 自動セーブ 各クライアント
*------------------------------------------
*/
-static int last_save_fd, save_flag;
-static int pc_autosave_sub (struct map_session_data *sd, va_list ap)
+static
+int last_save_fd, save_flag;
+static
+void pc_autosave_sub(struct map_session_data *sd)
{
- nullpo_retr (0, sd);
+ nullpo_retv(sd);
if (save_flag == 0 && sd->fd > last_save_fd)
{
- struct guild_castle *gc = NULL;
- int i;
-
- pc_makesavestatus (sd);
- chrif_save (sd);
-
- for (i = 0; i < MAX_GUILDCASTLE; i++)
- {
- gc = guild_castle_search (i);
- if (!gc)
- continue;
- if (gc->visibleG0 == 1)
- guild_castledatasave (gc->castle_id, 18, gc->Ghp0);
- if (gc->visibleG1 == 1)
- guild_castledatasave (gc->castle_id, 19, gc->Ghp1);
- if (gc->visibleG2 == 1)
- guild_castledatasave (gc->castle_id, 20, gc->Ghp2);
- if (gc->visibleG3 == 1)
- guild_castledatasave (gc->castle_id, 21, gc->Ghp3);
- if (gc->visibleG4 == 1)
- guild_castledatasave (gc->castle_id, 22, gc->Ghp4);
- if (gc->visibleG5 == 1)
- guild_castledatasave (gc->castle_id, 23, gc->Ghp5);
- if (gc->visibleG6 == 1)
- guild_castledatasave (gc->castle_id, 24, gc->Ghp6);
- if (gc->visibleG7 == 1)
- guild_castledatasave (gc->castle_id, 25, gc->Ghp7);
- }
+ pc_makesavestatus(sd);
+ chrif_save(sd);
save_flag = 1;
last_save_fd = sd->fd;
}
-
- return 0;
}
/*==========================================
@@ -8455,578 +5381,109 @@ static int pc_autosave_sub (struct map_session_data *sd, va_list ap)
*------------------------------------------
*/
static
-void pc_autosave (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void pc_autosave(TimerData *, tick_t)
{
- int interval;
-
save_flag = 0;
- clif_foreachclient (pc_autosave_sub);
+ clif_foreachclient(pc_autosave_sub);
if (save_flag == 0)
last_save_fd = 0;
- interval = autosave_interval / (clif_countusers () + 1);
- if (interval <= 0)
- interval = 1;
- add_timer (gettick () + interval, pc_autosave, 0, 0);
+ interval_t interval = autosave_interval / (clif_countusers() + 1);
+ if (interval <= interval_t::zero())
+ interval = std::chrono::milliseconds(1);
+ Timer(gettick() + interval,
+ pc_autosave
+ ).detach();
}
-int pc_read_gm_account (int fd)
+int pc_read_gm_account(int fd)
{
- int i = 0;
+ int i = 0;
if (gm_account != NULL)
- free (gm_account);
+ free(gm_account);
GM_num = 0;
- CREATE (gm_account, struct gm_account, (RFIFOW (fd, 2) - 4) / 5);
- for (i = 4; i < RFIFOW (fd, 2); i = i + 5)
+ CREATE(gm_account, struct gm_account, (RFIFOW(fd, 2) - 4) / 5);
+ for (i = 4; i < RFIFOW(fd, 2); i = i + 5)
{
- gm_account[GM_num].account_id = RFIFOL (fd, i);
- gm_account[GM_num].level = (int) RFIFOB (fd, i + 4);
- //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
+ gm_account[GM_num].account_id = RFIFOL(fd, i);
+ gm_account[GM_num].level = (int) RFIFOB(fd, i + 4);
+ //PRINTF("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
GM_num++;
}
return GM_num;
}
-/*==========================================
- * timer to do the day
- *------------------------------------------
- */
-void map_day_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{ // by [yor]
- struct map_session_data *pl_sd = NULL;
- int i;
- char tmpstr[1024];
-
- if (battle_config.day_duration > 0)
- { // if we want a day
- if (night_flag != 0)
- {
- strcpy (tmpstr, "The day has arrived!");
- night_flag = 0; // 0=day, 1=night [Yor]
- for (i = 0; i < fd_max; i++)
- {
- if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
- && pl_sd->state.auth)
- {
- pl_sd->opt2 &= ~STATE_BLIND;
- clif_changeoption (&pl_sd->bl);
- clif_wis_message (pl_sd->fd, wisp_server_name, tmpstr,
- strlen (tmpstr) + 1);
- }
- }
- }
- }
-}
-
-/*==========================================
- * timer to do the night
- *------------------------------------------
- */
-void map_night_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{ // by [yor]
- struct map_session_data *pl_sd = NULL;
- int i;
- char tmpstr[1024];
-
- if (battle_config.night_duration > 0)
- { // if we want a night
- if (night_flag == 0)
- {
- strcpy (tmpstr, "The night has fallen...");
- night_flag = 1; // 0=day, 1=night [Yor]
- for (i = 0; i < fd_max; i++)
- {
- if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
- && pl_sd->state.auth)
- {
- pl_sd->opt2 |= STATE_BLIND;
- clif_changeoption (&pl_sd->bl);
- clif_wis_message (pl_sd->fd, wisp_server_name, tmpstr,
- strlen (tmpstr) + 1);
- }
- }
- }
- }
-}
-
-void pc_setstand (struct map_session_data *sd)
+void pc_setstand(struct map_session_data *sd)
{
- nullpo_retv (sd);
-
- if (sd->sc_data && sd->sc_data[SC_TENSIONRELAX].timer != -1)
- skill_status_change_end (&sd->bl, SC_TENSIONRELAX, -1);
+ nullpo_retv(sd);
sd->state.dead_sit = 0;
}
-//
-// 初期化物
-//
-/*==========================================
- * 設定ファイル読み込む
- * exp.txt 必要経験値
- * job_db1.txt 重量,hp,sp,攻撃速度
- * job_db2.txt job能力値ボーナス
- * skill_tree.txt 各職毎のスキルツリー
- * attr_fix.txt 属性修正テーブル
- * size_fix.txt サイズ補正テーブル
- * refine_db.txt 精錬データテーブル
- *------------------------------------------
- */
static
-int pc_readdb (void)
+int pc_calc_sigma(void)
{
- int i, j, k;
- FILE *fp;
- char line[1024], *p;
-
- // 必要経験値読み込み
-
- fp = fopen_ ("db/exp.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/exp.txt\n");
- return 1;
- }
- i = 0;
- while (fgets (line, sizeof (line) - 1, fp))
- {
- int bn, b1, b2, b3, b4, b5, b6, jn, j1, j2, j3, j4, j5, j6;
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf
- (line, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", &bn, &b1, &b2,
- &b3, &b4, &b5, &b6, &jn, &j1, &j2, &j3, &j4, &j5, &j6) != 14)
- continue;
- exp_table[0][i] = bn;
- exp_table[1][i] = b1;
- exp_table[2][i] = b2;
- exp_table[3][i] = b3;
- exp_table[4][i] = b4;
- exp_table[5][i] = b5;
- exp_table[6][i] = b6;
- exp_table[7][i] = jn;
- exp_table[8][i] = j1;
- exp_table[9][i] = j2;
- exp_table[10][i] = j3;
- exp_table[11][i] = j4;
- exp_table[12][i] = j5;
- exp_table[13][i] = j6;
- i++;
- if (i >= battle_config.maximum_level)
- break;
- }
- fclose_ (fp);
- printf ("read db/exp.txt done\n");
-
- // JOB補正数値1
- fp = fopen_ ("db/job_db1.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/job_db1.txt\n");
- return 1;
- }
- i = 0;
- while (fgets (line, sizeof (line) - 1, fp))
- {
- char *split[50];
- if (line[0] == '/' && line[1] == '/')
- continue;
- for (j = 0, p = line; j < 21 && p; j++)
- {
- split[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
- if (j < 21)
- continue;
- max_weight_base[i] = atoi (split[0]);
- hp_coefficient[i] = atoi (split[1]);
- hp_coefficient2[i] = atoi (split[2]);
- sp_coefficient[i] = atoi (split[3]);
- for (j = 0; j < 17; j++)
- aspd_base[i][j] = atoi (split[j + 4]);
- i++;
-// -- moonsoul (below two lines added to accommodate high numbered new class ids)
- if (i == 24)
- i = 4001;
- if (i == MAX_PC_CLASS)
- break;
- }
- fclose_ (fp);
- printf ("read db/job_db1.txt done\n");
-
- // JOBボーナス
- fp = fopen_ ("db/job_db2.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/job_db2.txt\n");
- return 1;
- }
- i = 0;
- while (fgets (line, sizeof (line) - 1, fp))
- {
- if (line[0] == '/' && line[1] == '/')
- continue;
- for (j = 0, p = line; j < MAX_LEVEL && p; j++)
- {
- if (sscanf (p, "%d", &k) == 0)
- break;
- job_bonus[0][i][j] = k;
- job_bonus[2][i][j] = k; //養子職のボーナスは分からないので仮
- p = strchr (p, ',');
- if (p)
- p++;
- }
- i++;
-// -- moonsoul (below two lines added to accommodate high numbered new class ids)
- if (i == 24)
- i = 4001;
- if (i == MAX_PC_CLASS)
- break;
- }
- fclose_ (fp);
- printf ("read db/job_db2.txt done\n");
+ int j, k;
- // JOBボーナス2 転生職用
- fp = fopen_ ("db/job_db2-2.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/job_db2-2.txt\n");
- return 1;
- }
- i = 0;
- while (fgets (line, sizeof (line) - 1, fp))
{
- if (line[0] == '/' && line[1] == '/')
- continue;
- for (j = 0, p = line; j < MAX_LEVEL && p; j++)
- {
- if (sscanf (p, "%d", &k) == 0)
- break;
- job_bonus[1][i][j] = k;
- p = strchr (p, ',');
- if (p)
- p++;
- }
- i++;
- if (i == MAX_PC_CLASS)
- break;
- }
- fclose_ (fp);
- printf ("read db/job_db2-2.txt done\n");
-
- // スキルツリー
- memset (skill_tree, 0, sizeof (skill_tree));
- fp = fopen_ ("db/skill_tree.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/skill_tree.txt\n");
- return 1;
- }
- while (fgets (line, sizeof (line) - 1, fp))
- {
- char *split[50];
- if (line[0] == '/' && line[1] == '/')
- continue;
- for (j = 0, p = line; j < 13 && p; j++)
- {
- split[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
- if (j < 13)
- continue;
- i = atoi (split[0]);
- for (j = 0; skill_tree[0][i][j].id; j++);
- skill_tree[0][i][j].id = atoi (split[1]);
- skill_tree[0][i][j].max = atoi (split[2]);
- skill_tree[2][i][j].id = atoi (split[1]); //養子職は良く分からないので暫定
- skill_tree[2][i][j].max = atoi (split[2]); //養子職は良く分からないので暫定
- for (k = 0; k < 5; k++)
- {
- skill_tree[0][i][j].need[k].id = atoi (split[k * 2 + 3]);
- skill_tree[0][i][j].need[k].lv = atoi (split[k * 2 + 4]);
- skill_tree[2][i][j].need[k].id = atoi (split[k * 2 + 3]); //養子職は良く分からないので暫定
- skill_tree[2][i][j].need[k].lv = atoi (split[k * 2 + 4]); //養子職は良く分からないので暫定
- }
- }
- fclose_ (fp);
- printf ("read db/skill_tree.txt done\n");
-
- // 属性修正テーブル
- for (i = 0; i < 4; i++)
- for (j = 0; j < 10; j++)
- for (k = 0; k < 10; k++)
- attr_fix_table[i][j][k] = 100;
- fp = fopen_ ("db/attr_fix.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/attr_fix.txt\n");
- return 1;
- }
- while (fgets (line, sizeof (line) - 1, fp))
- {
- char *split[10];
- int lv, n;
- if (line[0] == '/' && line[1] == '/')
- continue;
- for (j = 0, p = line; j < 3 && p; j++)
- {
- split[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
- lv = atoi (split[0]);
- n = atoi (split[1]);
-// printf("%d %d\n",lv,n);
-
- for (i = 0; i < n;)
- {
- if (!fgets (line, sizeof (line) - 1, fp))
- break;
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- for (j = 0, p = line; j < n && p; j++)
- {
- while (*p == 32 && *p > 0)
- p++;
- attr_fix_table[lv - 1][i][j] = atoi (p);
- if (battle_config.attr_recover == 0
- && attr_fix_table[lv - 1][i][j] < 0)
- attr_fix_table[lv - 1][i][j] = 0;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
-
- i++;
- }
- }
- fclose_ (fp);
- printf ("read db/attr_fix.txt done\n");
-
- // サイズ補正テーブル
- for (i = 0; i < 3; i++)
- for (j = 0; j < 20; j++)
- atkmods[i][j] = 100;
- fp = fopen_ ("db/size_fix.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/size_fix.txt\n");
- return 1;
- }
- i = 0;
- while (fgets (line, sizeof (line) - 1, fp))
- {
- char *split[20];
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (atoi (line) <= 0)
- continue;
- memset (split, 0, sizeof (split));
- for (j = 0, p = line; j < 20 && p; j++)
- {
- split[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
- for (j = 0; j < 20 && split[j]; j++)
- atkmods[i][j] = atoi (split[j]);
- i++;
- }
- fclose_ (fp);
- printf ("read db/size_fix.txt done\n");
-
- // 精錬データテーブル
- for (i = 0; i < 5; i++)
- {
- for (j = 0; j < 10; j++)
- percentrefinery[i][j] = 100;
- refinebonus[i][0] = 0;
- refinebonus[i][1] = 0;
- refinebonus[i][2] = 10;
- }
- fp = fopen_ ("db/refine_db.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/refine_db.txt\n");
- return 1;
- }
- i = 0;
- while (fgets (line, sizeof (line) - 1, fp))
- {
- char *split[16];
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (atoi (line) <= 0)
- continue;
- memset (split, 0, sizeof (split));
- for (j = 0, p = line; j < 16 && p; j++)
- {
- split[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
- refinebonus[i][0] = atoi (split[0]); // 精錬ボーナス
- refinebonus[i][1] = atoi (split[1]); // 過剰精錬ボーナス
- refinebonus[i][2] = atoi (split[2]); // 安全精錬限界
- for (j = 0; j < 10 && split[j]; j++)
- percentrefinery[i][j] = atoi (split[j + 3]);
- i++;
- }
- fclose_ (fp); //Lupus. close this file!!!
- printf ("read db/refine_db.txt done\n");
-
- return 0;
-}
-
-static int pc_calc_sigma (void)
-{
- int i, j, k;
-
- for (i = 0; i < MAX_PC_CLASS; i++)
- {
- memset (hp_sigma_val[i], 0, sizeof (hp_sigma_val[i]));
+ memset(hp_sigma_val_0, 0, sizeof(hp_sigma_val_0));
for (k = 0, j = 2; j <= MAX_LEVEL; j++)
{
- k += hp_coefficient[i] * j + 50;
+ k += hp_coefficient_0 * j + 50;
k -= k % 100;
- hp_sigma_val[i][j - 1] = k;
+ hp_sigma_val_0[j - 1] = k;
}
}
return 0;
}
-static void pc_statpointdb (void)
-{
- char *buf_stat;
- int i = 0, j = 0, k = 0, l = 0, end = 0;
-
- FILE *stp;
-
- stp = fopen_ ("db/statpoint.txt", "r");
-
- if (stp == NULL)
- {
- printf ("can't read db/statpoint.txt\n");
- return;
- }
-
- fseek (stp, 0, SEEK_END);
- end = ftell (stp);
- rewind (stp);
-
- buf_stat = (char *) malloc (end + 1);
- l = fread (buf_stat, 1, end, stp);
- fclose_ (stp);
- printf ("read db/statpoint.txt done (size=%d)\n", l);
-
- for (i = 0; i < 255; i++)
- {
- j = 0;
- while (*(buf_stat + k) != '\n')
- {
- statp[i][j] = *(buf_stat + k);
- j++;
- k++;
- }
- statp[i][j + 1] = '\0';
- k++;
- }
-
- free (buf_stat);
-}
-
/*==========================================
* pc関 係初期化
*------------------------------------------
*/
-int do_init_pc (void)
-{
- pc_readdb ();
- pc_statpointdb ();
- pc_calc_sigma ();
-
-// gm_account_db = numdb_init();
-
- add_timer_interval ((natural_heal_prev_tick =
- gettick () + NATURAL_HEAL_INTERVAL), pc_natural_heal,
- 0, 0, NATURAL_HEAL_INTERVAL);
- add_timer (gettick () + autosave_interval, pc_autosave, 0, 0);
-
- {
- int day_duration = battle_config.day_duration;
- int night_duration = battle_config.night_duration;
- if (day_duration < 60000)
- day_duration = 60000;
- if (night_duration < 60000)
- night_duration = 60000;
- if (battle_config.night_at_start == 0)
- {
- night_flag = 0; // 0=day, 1=night [Yor]
- day_timer_tid =
- add_timer_interval (gettick () + day_duration +
- night_duration, map_day_timer, 0, 0,
- day_duration + night_duration);
- night_timer_tid =
- add_timer_interval (gettick () + day_duration,
- map_night_timer, 0, 0,
- day_duration + night_duration);
- }
- else
- {
- night_flag = 1; // 0=day, 1=night [Yor]
- day_timer_tid =
- add_timer_interval (gettick () + night_duration,
- map_day_timer, 0, 0,
- day_duration + night_duration);
- night_timer_tid =
- add_timer_interval (gettick () + day_duration +
- night_duration, map_night_timer, 0, 0,
- day_duration + night_duration);
- }
- }
+int do_init_pc(void)
+{
+ pc_calc_sigma();
+ natural_heal_prev_tick = gettick() + NATURAL_HEAL_INTERVAL;
+ Timer(natural_heal_prev_tick,
+ pc_natural_heal,
+ NATURAL_HEAL_INTERVAL
+ ).detach();
+ Timer(gettick() + autosave_interval,
+ pc_autosave
+ ).detach();
return 0;
}
-void pc_cleanup (struct map_session_data *sd)
+void pc_cleanup(struct map_session_data *sd)
{
- magic_stop_completely (sd);
+ magic_stop_completely(sd);
}
-void pc_invisibility (struct map_session_data *sd, int enabled)
+void pc_invisibility(struct map_session_data *sd, int enabled)
{
- if (enabled && !(sd->status.option & OPTION_INVISIBILITY))
+ if (enabled && !bool(sd->status.option & Option::INVISIBILITY))
{
- clif_clearchar_area (&sd->bl, 3);
- sd->status.option |= OPTION_INVISIBILITY;
- clif_status_change (&sd->bl, CLIF_OPTION_SC_INVISIBILITY, 1);
+ clif_clearchar(&sd->bl, BeingRemoveWhy::WARPED);
+ sd->status.option |= Option::INVISIBILITY;
+ clif_status_change(&sd->bl, StatusChange::CLIF_OPTION_SC_INVISIBILITY, 1);
}
else if (!enabled)
{
- sd->status.option &= ~OPTION_INVISIBILITY;
- clif_status_change (&sd->bl, CLIF_OPTION_SC_INVISIBILITY, 0);
- pc_setpos (sd, map[sd->bl.m].name, sd->bl.x, sd->bl.y, 3);
+ sd->status.option &= ~Option::INVISIBILITY;
+ clif_status_change(&sd->bl, StatusChange::CLIF_OPTION_SC_INVISIBILITY, 0);
+ pc_setpos(sd, map[sd->bl.m].name, sd->bl.x, sd->bl.y, BeingRemoveWhy::WARPED);
}
}
-int pc_logout (struct map_session_data *sd) // [fate] Player logs out
+int pc_logout(struct map_session_data *sd) // [fate] Player logs out
{
- unsigned int tick = gettick ();
-
if (!sd)
return 0;
- if (sd->sc_data[SC_POISON].timer != -1)
+ if (sd->sc_data[StatusChange::SC_POISON].timer)
sd->status.hp = 1; // Logging out while poisoned -> bad
/*
@@ -9037,12 +5494,13 @@ int pc_logout (struct map_session_data *sd) // [fate] Player logs out
// Removed because it's buggy, see above.
if (sd->cast_tick > tick)
{
- if (pc_setglobalreg (sd, "MAGIC_CAST_TICK", sd->cast_tick - tick))
+ if (pc_setglobalreg(sd, "MAGIC_CAST_TICK", sd->cast_tick - tick))
sd->status.sp = 1;
}
else
#endif
- pc_setglobalreg (sd, "MAGIC_CAST_TICK", 0);
+ pc_setglobalreg(sd, "MAGIC_CAST_TICK", 0);
- MAP_LOG_STATS (sd, "LOGOUT") return 0;
+ MAP_LOG_STATS(sd, "LOGOUT");
+ return 0;
}
diff --git a/src/map/pc.hpp b/src/map/pc.hpp
index cc433b8..baf1487 100644
--- a/src/map/pc.hpp
+++ b/src/map/pc.hpp
@@ -1,209 +1,159 @@
-// $Id: pc.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-
#ifndef PC_HPP
#define PC_HPP
+#include "pc.t.hpp"
+
+#include "clif.t.hpp"
#include "map.hpp"
-#define OPTION_MASK 0xd7b8
-#define CART_MASK 0x788
-
-#define pc_setdead(sd) ((sd)->state.dead_sit = 1)
-#define pc_setsit(sd) ((sd)->state.dead_sit = 2)
-//#define pc_setstand(sd) ((sd)->state.dead_sit = 0)
-#define pc_isdead(sd) ((sd)->state.dead_sit == 1)
-#define pc_issit(sd) ((sd)->state.dead_sit == 2)
-#define pc_setdir(sd,b) ((sd)->dir = (b))
-#define pc_setchatid(sd,n) ((sd)->chatID = n)
-#define pc_ishiding(sd) ((sd)->status.option&0x4006)
-#define pc_iscarton(sd) ((sd)->status.option&CART_MASK)
-#define pc_isfalcon(sd) ((sd)->status.option&0x0010)
-#define pc_isriding(sd) ((sd)->status.option&0x0020)
-#define pc_isinvisible(sd) ((sd)->status.option&0x0040)
-#define pc_is50overweight(sd) (sd->weight*2 >= sd->max_weight)
-#define pc_is90overweight(sd) (sd->weight*10 >= sd->max_weight*9)
-
-void pc_touch_all_relevant_npcs (struct map_session_data *sd); /* Checks all npcs/warps at the same location to see whether they
- ** should do something with the specified player. */
-
-int pc_isGM (struct map_session_data *sd);
-int pc_iskiller (struct map_session_data *src, struct map_session_data *target); // [MouseJstr]
-int pc_getrefinebonus (int lv, int type);
-
-void pc_invisibility (struct map_session_data *sd, int enabled); // [Fate]
-int pc_counttargeted (struct map_session_data *sd, struct block_list *src,
- int target_lv);
-int pc_setrestartvalue (struct map_session_data *sd, int type);
-int pc_makesavestatus (struct map_session_data *);
-int pc_setnewpc (struct map_session_data *, int, int, int, int, int, int);
-int pc_authok (int, int, time_t, short tmw_version, struct mmo_charstatus *);
-int pc_authfail (int);
-
-int pc_isequip (struct map_session_data *sd, int n);
-int pc_equippoint (struct map_session_data *sd, int n);
-
-int pc_breakweapon (struct map_session_data *sd); // weapon breaking [Valaris]
-int pc_breakarmor (struct map_session_data *sd); // armor breaking [Valaris]
-
-int pc_checkskill (struct map_session_data *sd, int skill_id);
-int pc_checkallowskill (struct map_session_data *sd);
-int pc_checkequip (struct map_session_data *sd, int pos);
-
-int pc_checkoverhp (struct map_session_data *);
-int pc_checkoversp (struct map_session_data *);
-
-int pc_can_reach (struct map_session_data *, int, int);
-int pc_walktoxy (struct map_session_data *, int, int);
-int pc_stop_walking (struct map_session_data *, int);
-int pc_movepos (struct map_session_data *, int, int);
-int pc_setpos (struct map_session_data *, const char *, int, int, int);
-int pc_setsavepoint (struct map_session_data *, const char *, int, int);
-int pc_randomwarp (struct map_session_data *sd, int type);
-int pc_memo (struct map_session_data *sd, int i);
-
-int pc_checkadditem (struct map_session_data *, int, int);
-int pc_inventoryblank (struct map_session_data *);
-int pc_search_inventory (struct map_session_data *sd, int item_id);
-int pc_payzeny (struct map_session_data *, int);
-int pc_additem (struct map_session_data *, struct item *, int);
-int pc_getzeny (struct map_session_data *, int);
-int pc_delitem (struct map_session_data *, int, int, int);
-int pc_checkitem (struct map_session_data *);
-int pc_count_all_items (struct map_session_data *player, int item_id);
-int pc_remove_items (struct map_session_data *player, int item_id,
- int count);
-
-int pc_cart_additem (struct map_session_data *sd, struct item *item_data,
- int amount);
-int pc_cart_delitem (struct map_session_data *sd, int n, int amount,
- int type);
-int pc_putitemtocart (struct map_session_data *sd, int idx, int amount);
-int pc_getitemfromcart (struct map_session_data *sd, int idx, int amount);
-int pc_cartitem_amount (struct map_session_data *sd, int idx, int amount);
-
-int pc_takeitem (struct map_session_data *, struct flooritem_data *);
-int pc_dropitem (struct map_session_data *, int, int);
-
-int pc_checkweighticon (struct map_session_data *sd);
-
-int pc_calcstatus (struct map_session_data *, int);
-int pc_bonus (struct map_session_data *, int, int);
-int pc_bonus2 (struct map_session_data *sd, int, int, int);
-int pc_bonus3 (struct map_session_data *sd, int, int, int, int);
-int pc_skill (struct map_session_data *, int, int, int);
-
-int pc_insert_card (struct map_session_data *sd, int idx_card,
- int idx_equip);
-
-int pc_item_identify (struct map_session_data *sd, int idx);
-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 *);
-
-int pc_follow (struct map_session_data *, int); // [MouseJstr]
-
-int pc_checkbaselevelup (struct map_session_data *sd);
-int pc_checkjoblevelup (struct map_session_data *sd);
-int pc_gainexp (struct map_session_data *, int, int);
-
-#define PC_GAINEXP_REASON_KILLING 0
-#define PC_GAINEXP_REASON_HEALING 1
-#define PC_GAINEXP_REASON_SCRIPT 2
-int pc_gainexp_reason (struct map_session_data *, int, int, int reason);
-int pc_extract_healer_exp (struct map_session_data *, int max); // [Fate] Used by healers: extract healer-xp from the target, return result (up to max)
-
-int pc_nextbaseexp (struct map_session_data *);
-int pc_nextbaseafter (struct map_session_data *); // [Valaris]
-int pc_nextjobexp (struct map_session_data *);
-int pc_nextjobafter (struct map_session_data *); // [Valaris]
-int pc_need_status_point (struct map_session_data *, int);
-int pc_statusup (struct map_session_data *, int);
-int pc_statusup2 (struct map_session_data *, int, int);
-int pc_skillup (struct map_session_data *, int);
-int pc_allskillup (struct map_session_data *);
-int pc_resetlvl (struct map_session_data *, int type);
-int pc_resetstate (struct map_session_data *);
-int pc_resetskill (struct map_session_data *);
-int pc_equipitem (struct map_session_data *, int, int);
-int pc_unequipitem (struct map_session_data *, int, int);
-int pc_unequipinvyitem (struct map_session_data *, int, int);
-int pc_useitem (struct map_session_data *, int);
-
-int pc_damage (struct block_list *, struct map_session_data *, int);
-int pc_heal (struct map_session_data *, int, int);
-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 *, int);
-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 *, int, int);
-int pc_equiplookall (struct map_session_data *sd);
-
-int pc_readparam (struct map_session_data *, int);
-int pc_setparam (struct map_session_data *, int, int);
-int pc_readreg (struct map_session_data *, int);
-int pc_setreg (struct map_session_data *, int, int);
-char *pc_readregstr (struct map_session_data *sd, int reg);
-int pc_setregstr (struct map_session_data *sd, int reg, const char *str);
-int pc_readglobalreg (struct map_session_data *, const char *);
-int pc_setglobalreg (struct map_session_data *, const char *, int);
-int pc_readaccountreg (struct map_session_data *, const char *);
-int pc_setaccountreg (struct map_session_data *, const char *, int);
-int pc_readaccountreg2 (struct map_session_data *, const char *);
-int pc_setaccountreg2 (struct map_session_data *, const char *, int);
-int pc_percentrefinery (struct map_session_data *sd, struct item *item);
-
-int pc_addeventtimer (struct map_session_data *sd, int tick,
- const char *name);
-int pc_deleventtimer (struct map_session_data *sd, const char *name);
-int pc_cleareventtimer (struct map_session_data *sd);
-int pc_addeventtimercount (struct map_session_data *sd, const char *name,
- int tick);
-
-int pc_calc_pvprank (struct map_session_data *sd);
-void pc_calc_pvprank_timer (timer_id, tick_t, custom_id_t, custom_data_t);
-
-int pc_ismarried (struct map_session_data *sd);
-int pc_marriage (struct map_session_data *sd,
- struct map_session_data *dstsd);
-int pc_divorce (struct map_session_data *sd);
-struct map_session_data *pc_get_partner (struct map_session_data *sd);
-int pc_set_gm_level (int account_id, int level);
-void pc_setstand (struct map_session_data *sd);
-void pc_cleanup (struct map_session_data *sd); // [Fate] Clean up after a logged-out PC
-
-struct pc_base_job
+inline
+void pc_setsit(struct map_session_data *sd)
{
- int job; //職業、ただし転生職や養子職の場合は元の職業を返す(廃プリ→プリ)
- int type; //ノビ 0, 一次職 1, 二次職 2, スパノビ 3
- int upper; //通常 0, 転生 1, 養子 2
-};
-
-struct pc_base_job pc_calc_base_job (int b_class); //転生や養子職の元の職業を返す
-
-int pc_read_gm_account (int fd);
-int pc_setinvincibletimer (struct map_session_data *sd, int);
-int pc_delinvincibletimer (struct map_session_data *sd);
-int pc_addspiritball (struct map_session_data *sd, int, int);
-int pc_delspiritball (struct map_session_data *sd, int, int);
-int pc_logout (struct map_session_data *sd); // [fate] Player logs out
-
-int do_init_pc (void);
-
-enum
-{ ADDITEM_EXIST, ADDITEM_NEW, ADDITEM_OVERAMOUNT };
-
-// timer for night.day
-extern timer_id day_timer_tid;
-extern timer_id night_timer_tid;
-void map_day_timer (timer_id, tick_t, custom_id_t, custom_data_t); // by [yor]
-void map_night_timer (timer_id, tick_t, custom_id_t, custom_data_t); // by [yor]
-
-#endif
+ sd->state.dead_sit = 2;
+}
+//pc_setstand(struct map_session_data *sd) is a normal function
+inline
+bool pc_isdead(struct map_session_data *sd)
+{
+ return sd->state.dead_sit == 1;
+}
+inline
+bool pc_issit(struct map_session_data *sd)
+{
+ return sd->state.dead_sit == 2;
+}
+inline
+void pc_setdir(struct map_session_data *sd, DIR b)
+{
+ sd->dir = (b);
+}
+inline
+void pc_setchatid(struct map_session_data *sd, int n)
+{
+ sd->chatID = n;
+}
+inline
+bool pc_isinvisible(struct map_session_data *sd)
+{
+ return bool(sd->status.option & Option::HIDE);
+}
+inline
+bool pc_is90overweight(struct map_session_data *sd)
+{
+ return sd->weight*10 >= sd->max_weight*9;
+}
+
+// Checks all npcs/warps at the same location to see whether they
+// should do something with the specified player.
+void pc_touch_all_relevant_npcs(struct map_session_data *sd);
+
+int pc_isGM(struct map_session_data *sd);
+int pc_iskiller(struct map_session_data *src, struct map_session_data *target); // [MouseJstr]
+
+void pc_invisibility(struct map_session_data *sd, int enabled); // [Fate]
+int pc_counttargeted(struct map_session_data *sd, struct block_list *src,
+ ATK target_lv);
+int pc_setrestartvalue(struct map_session_data *sd, int type);
+int pc_makesavestatus(struct map_session_data *);
+int pc_setnewpc(struct map_session_data *, int, int, int, tick_t, int);
+int pc_authok(int, int, TimeT, short tmw_version, const struct mmo_charstatus *);
+int pc_authfail(int);
+
+EPOS pc_equippoint(struct map_session_data *sd, int n);
+
+int pc_checkskill(struct map_session_data *sd, SkillID skill_id);
+int pc_checkequip(struct map_session_data *sd, EPOS pos);
+
+int pc_walktoxy(struct map_session_data *, int, int);
+int pc_stop_walking(struct map_session_data *, int);
+int pc_movepos(struct map_session_data *, int, int);
+int pc_setpos(struct map_session_data *, const char *, int, int, BeingRemoveWhy);
+int pc_setsavepoint(struct map_session_data *, const char *, int, int);
+int pc_randomwarp(struct map_session_data *sd, BeingRemoveWhy type);
+
+ADDITEM pc_checkadditem(struct map_session_data *, int, int);
+int pc_inventoryblank(struct map_session_data *);
+int pc_search_inventory(struct map_session_data *sd, int item_id);
+int pc_payzeny(struct map_session_data *, int);
+PickupFail pc_additem(struct map_session_data *, struct item *, int);
+int pc_getzeny(struct map_session_data *, int);
+int pc_delitem(struct map_session_data *, int, int, int);
+int pc_checkitem(struct map_session_data *);
+int pc_count_all_items(struct map_session_data *player, int item_id);
+int pc_remove_items(struct map_session_data *player,
+ int item_id, int count);
+
+int pc_takeitem(struct map_session_data *, struct flooritem_data *);
+int pc_dropitem(struct map_session_data *, int, int);
+
+int pc_checkweighticon(struct map_session_data *sd);
+
+int pc_calcstatus(struct map_session_data *, int);
+int pc_bonus(struct map_session_data *, SP, int);
+int pc_bonus2(struct map_session_data *sd, SP, int, int);
+int pc_skill(struct map_session_data *, SkillID, int, int);
+
+int pc_attack(struct map_session_data *, int, int);
+int pc_stopattack(struct map_session_data *);
+
+int pc_gainexp_reason(struct map_session_data *, int, int,
+ PC_GAINEXP_REASON reason);
+int pc_extract_healer_exp(struct map_session_data *, int max); // [Fate] Used by healers: extract healer-xp from the target, return result (up to max)
+
+int pc_nextbaseexp(struct map_session_data *);
+int pc_nextjobexp(struct map_session_data *);
+int pc_need_status_point(struct map_session_data *, SP);
+int pc_statusup(struct map_session_data *, SP);
+int pc_statusup2(struct map_session_data *, SP, int);
+int pc_skillup(struct map_session_data *, SkillID);
+int pc_resetlvl(struct map_session_data *, int type);
+int pc_resetstate(struct map_session_data *);
+int pc_resetskill(struct map_session_data *);
+int pc_equipitem(struct map_session_data *, int, EPOS);
+int pc_unequipitem(struct map_session_data *, int, CalcStatus);
+int pc_unequipinvyitem(struct map_session_data *, int, CalcStatus);
+int pc_useitem(struct map_session_data *, int);
+
+int pc_damage(struct block_list *, struct map_session_data *, int);
+int pc_heal(struct map_session_data *, int, int);
+int pc_itemheal(struct map_session_data *sd, int hp, int sp);
+int pc_percentheal(struct map_session_data *sd, int, int);
+int pc_setoption(struct map_session_data *, Option);
+int pc_changelook(struct map_session_data *, LOOK, int);
+
+int pc_readparam(struct map_session_data *, SP);
+int pc_setparam(struct map_session_data *, SP, int);
+int pc_readreg(struct map_session_data *, int);
+int pc_setreg(struct map_session_data *, int, int);
+char *pc_readregstr(struct map_session_data *sd, int reg);
+int pc_setregstr(struct map_session_data *sd, int reg, const char *str);
+int pc_readglobalreg(struct map_session_data *, const char *);
+int pc_setglobalreg(struct map_session_data *, const char *, int);
+int pc_readaccountreg(struct map_session_data *, const char *);
+int pc_setaccountreg(struct map_session_data *, const char *, int);
+int pc_readaccountreg2(struct map_session_data *, const char *);
+int pc_setaccountreg2(struct map_session_data *, const char *, int);
+
+int pc_addeventtimer(struct map_session_data *sd, interval_t tick,
+ const char *name);
+int pc_cleareventtimer(struct map_session_data *sd);
+
+int pc_calc_pvprank(struct map_session_data *sd);
+void pc_calc_pvprank_timer(TimerData *, tick_t, int);
+
+int pc_marriage(struct map_session_data *sd,
+ struct map_session_data *dstsd);
+int pc_divorce(struct map_session_data *sd);
+struct map_session_data *pc_get_partner(struct map_session_data *sd);
+int pc_set_gm_level(int account_id, int level);
+void pc_setstand(struct map_session_data *sd);
+void pc_cleanup(struct map_session_data *sd); // [Fate] Clean up after a logged-out PC
+
+int pc_read_gm_account(int fd);
+int pc_setinvincibletimer(struct map_session_data *sd, interval_t);
+int pc_delinvincibletimer(struct map_session_data *sd);
+int pc_logout(struct map_session_data *sd); // [fate] Player logs out
+
+int do_init_pc(void);
+
+#endif // PC_HPP
diff --git a/src/map/pc.t.hpp b/src/map/pc.t.hpp
new file mode 100644
index 0000000..feffd89
--- /dev/null
+++ b/src/map/pc.t.hpp
@@ -0,0 +1,44 @@
+#ifndef PC_T_HPP
+#define PC_T_HPP
+
+#include <cstdint>
+
+enum class PC_GAINEXP_REASON
+{
+ KILLING = 0,
+ HEALING = 1,
+ SCRIPT = 2,
+ SHARING = 3,
+
+ UNKNOWN,
+ COUNT,
+};
+
+enum class ADDITEM
+{
+ EXIST,
+ NEW,
+ OVERAMOUNT,
+
+ // when used as error in nullpo_retr
+ ZERO = 0,
+};
+
+enum class CalcStatus
+{
+ NOW,
+ LATER ,
+};
+
+enum class PickupFail : uint8_t
+{
+ OKAY = 0,
+ BAD_ITEM = 1,
+ TOO_HEAVY = 2,
+ TOO_FAR = 3,
+ INV_FULL = 4,
+ STACK_FULL = 5,
+ DROP_STEAL = 6,
+};
+
+#endif // PC_T_HPP
diff --git a/src/map/script.cpp b/src/map/script.cpp
index fac5ad5..b5e2aca 100644
--- a/src/map/script.cpp
+++ b/src/map/script.cpp
@@ -1,751 +1,143 @@
-// $Id: script.c 148 2004-09-30 14:05:37Z MouseJstr $
-//#define DEBUG_FUNCIN
-//#define DEBUG_DISP
-//#define DEBUG_RUN
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifndef LCCWIN32
-#include <sys/time.h>
-#endif
-
-#include <time.h>
-#include <math.h>
+#include "script.hpp"
#include <cassert>
+#include <cctype>
+#include <cmath>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
+#include <fstream>
+
+#include "../common/cxxstdio.hpp"
+#include "../common/db.hpp"
+#include "../common/extract.hpp"
+#include "../common/lock.hpp"
+#include "../common/random.hpp"
#include "../common/socket.hpp"
+#include "../common/utils.hpp"
#include "../common/timer.hpp"
-#include "../common/lock.hpp"
-#include "../common/mt_rand.hpp"
#include "atcommand.hpp"
#include "battle.hpp"
-#include "chat.hpp"
#include "chrif.hpp"
#include "clif.hpp"
-#include "../common/db.hpp"
-#include "guild.hpp"
#include "intif.hpp"
#include "itemdb.hpp"
-#include "../common/lock.hpp"
+#include "magic.hpp"
#include "map.hpp"
#include "mob.hpp"
#include "npc.hpp"
#include "party.hpp"
#include "pc.hpp"
-#include "script.hpp"
#include "skill.hpp"
#include "storage.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
+#include "../poison.hpp"
-#define SCRIPT_BLOCK_SIZE 256
+//#define DEBUG_FUNCIN
+//#define DEBUG_DISP
+//#define DEBUG_RUN
+
+constexpr int SCRIPT_BLOCK_SIZE = 256;
enum
{ LABEL_NEXTLINE = 1, LABEL_START };
-static ScriptCode *script_buf;
-static int script_pos, script_size;
+static
+ScriptCode *script_buf;
+static
+int script_pos, script_size;
+static
char *str_buf;
-int str_pos, str_size;
-static struct str_data_t
+static
+int str_pos, str_size;
+static
+struct str_data_t
{
ScriptCode type;
- int str;
- int backpatch;
- int label;
- int (*func) (struct script_state *);
- int val;
- int next;
+ int str;
+ int backpatch;
+ int label;
+ void(*func)(ScriptState *);
+ int val;
+ int next;
} *str_data;
-int str_num = LABEL_START, str_data_size;
-int str_hash[16];
+static
+int str_num = LABEL_START, str_data_size;
+static
+int str_hash[16];
-static struct dbt *mapreg_db = NULL;
-static struct dbt *mapregstr_db = NULL;
-static int mapreg_dirty = -1;
+static
+DMap<int, int> mapreg_db;
+static
+DMap<int, char *> mapregstr_db;
+static
+int mapreg_dirty = -1;
char mapreg_txt[256] = "save/mapreg.txt";
-#define MAPREG_AUTOSAVE_INTERVAL (10*1000)
-
-static struct dbt *scriptlabel_db = NULL;
-static struct dbt *userfunc_db = NULL;
+constexpr std::chrono::milliseconds MAPREG_AUTOSAVE_INTERVAL = std::chrono::seconds(10);
-struct dbt *script_get_label_db (void)
-{
- return scriptlabel_db;
-}
-
-struct dbt *script_get_userfunc_db (void)
-{
- if (!userfunc_db)
- userfunc_db = strdb_init (50);
- return userfunc_db;
-}
+Map<std::string, int> scriptlabel_db;
+DMap<std::string, const ScriptCode *> userfunc_db;
-static char pos[11][100] =
- { "頭", "体", "左手", "右手", "ローブ", "靴", "アクセサリー1",
- "アクセサリー2", "頭2", "頭3", "装着していない"
+static
+const char *pos[11] =
+{
+ "Head",
+ "Body",
+ "Left hand",
+ "Right hand",
+ "Robe",
+ "Shoes",
+ "Accessory 1",
+ "Accessory 2",
+ "Head 2",
+ "Head 3",
+ "Not Equipped",
};
-static struct Script_Config
-{
- int warn_func_no_comma;
- int warn_cmd_no_comma;
- int warn_func_mismatch_paramnum;
- int warn_cmd_mismatch_paramnum;
- int check_cmdcount;
- int check_gotocount;
+static
+struct Script_Config
+{
+ int warn_func_no_comma;
+ int warn_cmd_no_comma;
+ int warn_func_mismatch_paramnum;
+ int warn_cmd_mismatch_paramnum;
+ int check_cmdcount;
+ int check_gotocount;
} script_config;
-static int parse_cmd_if = 0;
-static int parse_cmd;
+static
+int parse_cmd_if = 0;
+static
+int parse_cmd;
/*==========================================
* ローカルプロトタイプ宣言 (必要な物のみ)
*------------------------------------------
*/
-const char *parse_subexpr (const char *, int);
-int buildin_mes (struct script_state *st);
-int buildin_goto (struct script_state *st);
-int buildin_callsub (struct script_state *st);
-int buildin_callfunc (struct script_state *st);
-int buildin_return (struct script_state *st);
-int buildin_getarg (struct script_state *st);
-int buildin_next (struct script_state *st);
-int buildin_close (struct script_state *st);
-int buildin_close2 (struct script_state *st);
-int buildin_menu (struct script_state *st);
-int buildin_rand (struct script_state *st);
-int buildin_pow (struct script_state *st);
-int buildin_warp (struct script_state *st);
-int buildin_isat (struct script_state *st);
-int buildin_areawarp (struct script_state *st);
-int buildin_heal (struct script_state *st);
-int buildin_itemheal (struct script_state *st);
-int buildin_percentheal (struct script_state *st);
-int buildin_jobchange (struct script_state *st);
-int buildin_input (struct script_state *st);
-int buildin_setlook (struct script_state *st);
-int buildin_set (struct script_state *st);
-int buildin_setarray (struct script_state *st);
-int buildin_cleararray (struct script_state *st);
-int buildin_copyarray (struct script_state *st);
-int buildin_getarraysize (struct script_state *st);
-int buildin_deletearray (struct script_state *st);
-int buildin_getelementofarray (struct script_state *st);
-int buildin_if (struct script_state *st);
-int buildin_getitem (struct script_state *st);
-int buildin_getitem2 (struct script_state *st);
-int buildin_makeitem (struct script_state *st);
-int buildin_delitem (struct script_state *st);
-int buildin_viewpoint (struct script_state *st);
-int buildin_countitem (struct script_state *st);
-int buildin_checkweight (struct script_state *st);
-int buildin_readparam (struct script_state *st);
-int buildin_getcharid (struct script_state *st);
-int buildin_getpartyname (struct script_state *st);
-int buildin_getpartymember (struct script_state *st);
-int buildin_getguildname (struct script_state *st);
-int buildin_getguildmaster (struct script_state *st);
-int buildin_getguildmasterid (struct script_state *st);
-int buildin_strcharinfo (struct script_state *st);
-int buildin_getequipid (struct script_state *st);
-int buildin_getequipname (struct script_state *st);
-int buildin_getbrokenid (struct script_state *st); // [Valaris]
-int buildin_repair (struct script_state *st); // [Valaris]
-int buildin_getequipisequiped (struct script_state *st);
-int buildin_getequipisenableref (struct script_state *st);
-int buildin_getequipisidentify (struct script_state *st);
-int buildin_getequiprefinerycnt (struct script_state *st);
-int buildin_getequipweaponlv (struct script_state *st);
-int buildin_getequippercentrefinery (struct script_state *st);
-int buildin_successrefitem (struct script_state *st);
-int buildin_failedrefitem (struct script_state *st);
-int buildin_cutin (struct script_state *st);
-int buildin_cutincard (struct script_state *st);
-int buildin_statusup (struct script_state *st);
-int buildin_statusup2 (struct script_state *st);
-int buildin_bonus (struct script_state *st);
-int buildin_bonus2 (struct script_state *st);
-int buildin_bonus3 (struct script_state *st);
-int buildin_skill (struct script_state *st);
-int buildin_setskill (struct script_state *st);
-int buildin_guildskill (struct script_state *st);
-int buildin_getskilllv (struct script_state *st);
-int buildin_getgdskilllv (struct script_state *st);
-int buildin_basicskillcheck (struct script_state *st);
-int buildin_getgmlevel (struct script_state *st);
-int buildin_end (struct script_state *st);
-int buildin_getopt2 (struct script_state *st);
-int buildin_setopt2 (struct script_state *st);
-int buildin_checkoption (struct script_state *st);
-int buildin_setoption (struct script_state *st);
-int buildin_setcart (struct script_state *st);
-int buildin_checkcart (struct script_state *st); // check cart [Valaris]
-int buildin_setfalcon (struct script_state *st);
-int buildin_checkfalcon (struct script_state *st); // check falcon [Valaris]
-int buildin_setriding (struct script_state *st);
-int buildin_checkriding (struct script_state *st); // check for pecopeco [Valaris]
-int buildin_savepoint (struct script_state *st);
-int buildin_gettimetick (struct script_state *st);
-int buildin_gettime (struct script_state *st);
-int buildin_gettimestr (struct script_state *st);
-int buildin_openstorage (struct script_state *st);
-int buildin_guildopenstorage (struct script_state *st);
-int buildin_itemskill (struct script_state *st);
-int buildin_monster (struct script_state *st);
-int buildin_areamonster (struct script_state *st);
-int buildin_killmonster (struct script_state *st);
-int buildin_killmonsterall (struct script_state *st);
-int buildin_doevent (struct script_state *st);
-int buildin_donpcevent (struct script_state *st);
-int buildin_addtimer (struct script_state *st);
-int buildin_deltimer (struct script_state *st);
-int buildin_addtimercount (struct script_state *st);
-int buildin_initnpctimer (struct script_state *st);
-int buildin_stopnpctimer (struct script_state *st);
-int buildin_startnpctimer (struct script_state *st);
-int buildin_setnpctimer (struct script_state *st);
-int buildin_getnpctimer (struct script_state *st);
-int buildin_announce (struct script_state *st);
-int buildin_mapannounce (struct script_state *st);
-int buildin_areaannounce (struct script_state *st);
-int buildin_getusers (struct script_state *st);
-int buildin_getmapusers (struct script_state *st);
-int buildin_getareausers (struct script_state *st);
-int buildin_getareadropitem (struct script_state *st);
-int buildin_enablenpc (struct script_state *st);
-int buildin_disablenpc (struct script_state *st);
-int buildin_enablearena (struct script_state *st); // Added by RoVeRT
-int buildin_disablearena (struct script_state *st); // Added by RoVeRT
-int buildin_hideoffnpc (struct script_state *st);
-int buildin_hideonnpc (struct script_state *st);
-int buildin_sc_start (struct script_state *st);
-int buildin_sc_start2 (struct script_state *st);
-int buildin_sc_end (struct script_state *st);
-int buildin_sc_check (struct script_state *st); // [Fate]
-int buildin_getscrate (struct script_state *st);
-int buildin_debugmes (struct script_state *st);
-int buildin_resetlvl (struct script_state *st);
-int buildin_resetstatus (struct script_state *st);
-int buildin_resetskill (struct script_state *st);
-int buildin_changebase (struct script_state *st);
-int buildin_changesex (struct script_state *st);
-int buildin_waitingroom (struct script_state *st);
-int buildin_delwaitingroom (struct script_state *st);
-int buildin_enablewaitingroomevent (struct script_state *st);
-int buildin_disablewaitingroomevent (struct script_state *st);
-int buildin_getwaitingroomstate (struct script_state *st);
-int buildin_warpwaitingpc (struct script_state *st);
-int buildin_attachrid (struct script_state *st);
-int buildin_detachrid (struct script_state *st);
-int buildin_isloggedin (struct script_state *st);
-int buildin_setmapflagnosave (struct script_state *st);
-int buildin_setmapflag (struct script_state *st);
-int buildin_removemapflag (struct script_state *st);
-int buildin_pvpon (struct script_state *st);
-int buildin_pvpoff (struct script_state *st);
-int buildin_gvgon (struct script_state *st);
-int buildin_gvgoff (struct script_state *st);
-int buildin_emotion (struct script_state *st);
-int buildin_maprespawnguildid (struct script_state *st);
-int buildin_agitstart (struct script_state *st); // <Agit>
-int buildin_agitend (struct script_state *st);
-int buildin_agitcheck (struct script_state *st); // <Agitcheck>
-int buildin_flagemblem (struct script_state *st); // Flag Emblem
-int buildin_getcastlename (struct script_state *st);
-int buildin_getcastledata (struct script_state *st);
-int buildin_setcastledata (struct script_state *st);
-int buildin_requestguildinfo (struct script_state *st);
-int buildin_getequipcardcnt (struct script_state *st);
-int buildin_successremovecards (struct script_state *st);
-int buildin_failedremovecards (struct script_state *st);
-int buildin_marriage (struct script_state *st);
-int buildin_wedding_effect (struct script_state *st);
-int buildin_divorce (struct script_state *st);
-int buildin_getitemname (struct script_state *st);
-int buildin_getspellinvocation (struct script_state *st); // [Fate]
-int buildin_getanchorinvocation (struct script_state *st); // [Fate]
-int buildin_getexp (struct script_state *st);
-int buildin_getinventorylist (struct script_state *st);
-int buildin_getskilllist (struct script_state *st);
-int buildin_get_pool_skills (struct script_state *st); // [fate]
-int buildin_get_activated_pool_skills (struct script_state *st); // [fate]
-int buildin_get_unactivated_pool_skills (struct script_state *st); // [PO]
-int buildin_activate_pool_skill (struct script_state *st); // [fate]
-int buildin_deactivate_pool_skill (struct script_state *st); // [fate]
-int buildin_check_pool_skill (struct script_state *st); // [fate]
-int buildin_clearitem (struct script_state *st);
-int buildin_classchange (struct script_state *st);
-int buildin_misceffect (struct script_state *st);
-int buildin_soundeffect (struct script_state *st);
-int buildin_mapwarp (struct script_state *st);
-int buildin_inittimer (struct script_state *st);
-int buildin_stoptimer (struct script_state *st);
-int buildin_cmdothernpc (struct script_state *st);
-int buildin_mobcount (struct script_state *st);
-int buildin_strmobinfo (struct script_state *st); // Script for displaying mob info [Valaris]
-int buildin_guardian (struct script_state *st); // Script for displaying mob info [Valaris]
-int buildin_guardianinfo (struct script_state *st); // Script for displaying mob info [Valaris]
-int buildin_npcskilleffect (struct script_state *st); // skill effects for npcs [Valaris]
-int buildin_specialeffect (struct script_state *st); // special effect script [Valaris]
-int buildin_specialeffect2 (struct script_state *st); // special effect script [Valaris]
-int buildin_nude (struct script_state *st); // nude [Valaris]
-int buildin_gmcommand (struct script_state *st); // [MouseJstr]
-int buildin_movenpc (struct script_state *st); // [MouseJstr]
-int buildin_npcwarp (struct script_state *st); // [remoitnane]
-int buildin_message (struct script_state *st); // [MouseJstr]
-int buildin_npctalk (struct script_state *st); // [Valaris]
-int buildin_hasitems (struct script_state *st); // [Valaris]
-int buildin_getlook (struct script_state *st); //Lorky [Lupus]
-int buildin_getsavepoint (struct script_state *st); //Lorky [Lupus]
-int buildin_getpartnerid (struct script_state *st); // [Fate]
-int buildin_areatimer (struct script_state *st); // [Jaxad0127]
-int buildin_isin (struct script_state *st); // [Jaxad0127]
-int buildin_shop (struct script_state *st); // [MadCamel]
-int buildin_isdead (struct script_state *st); // [Jaxad0127]
-int buildin_fakenpcname (struct script_state *st); //[Kage]
-int buildin_unequip_by_id (struct script_state *st); // [Freeyorp]
-int buildin_getx (struct script_state *st); // [Kage]
-int buildin_gety (struct script_state *st); // [Kage]
-
-
-void push_val (struct script_stack *stack, int type, int val);
-int run_func (struct script_state *st);
-
-int mapreg_setreg (int num, int val);
-int mapreg_setregstr (int num, const char *str);
-
-struct
-{
- int (*func) (struct script_state *);
+static
+const char *parse_subexpr(const char *, int);
+
+static
+void run_func(ScriptState *st);
+
+static
+void mapreg_setreg(int num, int val);
+static
+void mapreg_setregstr(int num, const char *str);
+
+struct BuiltinFunction
+{
+ void(*func)(ScriptState *);
const char *name;
const char *arg;
-} buildin_func[] =
-{
- {
- buildin_mes, "mes", "s"},
- {
- buildin_next, "next", ""},
- {
- buildin_close, "close", ""},
- {
- buildin_close2, "close2", ""},
- {
- buildin_menu, "menu", "sL*"},
- {
- buildin_goto, "goto", "L"},
- {
- buildin_callsub, "callsub", "L*"},
- {
- buildin_callfunc, "callfunc", "F*"},
- {
- buildin_return, "return", "*"},
- {
- buildin_getarg, "getarg", "i"},
- {
- buildin_jobchange, "jobchange", "i*"},
- {
- buildin_input, "input", "N"},
- {
- buildin_warp, "warp", "Mxy"},
- {
- buildin_isat, "isat", "Mxy"},
- {
- buildin_areawarp, "areawarp", "MxyxyMxy"},
- {
- buildin_setlook, "setlook", "ii"},
- {
- buildin_set, "set", "Ne"},
- {
- buildin_setarray, "setarray", "Ne*"},
- {
- buildin_cleararray, "cleararray", "Nei"},
- {
- buildin_copyarray, "copyarray", "NNi"},
- {
- buildin_getarraysize, "getarraysize", "N"},
- {
- buildin_deletearray, "deletearray", "N*"},
- {
- buildin_getelementofarray, "getelementofarray", "Ni"},
- {
- buildin_if, "if", "iF*"},
- {
- buildin_getitem, "getitem", "Ii**"},
- {
- buildin_getitem2, "getitem2", "iiiiiiiii*"},
- {
- buildin_makeitem, "makeitem", "IiMxy"},
- {
- buildin_delitem, "delitem", "Ii"},
- {
- buildin_cutin, "cutin", "si"},
- {
- buildin_cutincard, "cutincard", "i"},
- {
- buildin_viewpoint, "viewpoint", "iiiii"},
- {
- buildin_heal, "heal", "ii"},
- {
- buildin_itemheal, "itemheal", "ii"},
- {
- buildin_percentheal, "percentheal", "ii"},
- {
- buildin_rand, "rand", "i*"},
- {
- buildin_pow, "pow", "ii"},
- {
- buildin_countitem, "countitem", "I"},
- {
- buildin_checkweight, "checkweight", "Ii"},
- {
- buildin_readparam, "readparam", "i*"},
- {
- buildin_getcharid, "getcharid", "i*"},
- {
- buildin_getpartyname, "getpartyname", "i"},
- {
- buildin_getpartymember, "getpartymember", "i"},
- {
- buildin_getguildname, "getguildname", "i"},
- {
- buildin_getguildmaster, "getguildmaster", "i"},
- {
- buildin_getguildmasterid, "getguildmasterid", "i"},
- {
- buildin_strcharinfo, "strcharinfo", "i"},
- {
- buildin_getequipid, "getequipid", "i"},
- {
- buildin_getequipname, "getequipname", "i"},
- {
- buildin_getbrokenid, "getbrokenid", "i"}, // [Valaris]
- {
- buildin_repair, "repair", "i"}, // [Valaris]
- {
- buildin_getequipisequiped, "getequipisequiped", "i"},
- {
- buildin_getequipisenableref, "getequipisenableref", "i"},
- {
- buildin_getequipisidentify, "getequipisidentify", "i"},
- {
- buildin_getequiprefinerycnt, "getequiprefinerycnt", "i"},
- {
- buildin_getequipweaponlv, "getequipweaponlv", "i"},
- {
- buildin_getequippercentrefinery, "getequippercentrefinery", "i"},
- {
- buildin_successrefitem, "successrefitem", "i"},
- {
- buildin_failedrefitem, "failedrefitem", "i"},
- {
- buildin_statusup, "statusup", "i"},
- {
- buildin_statusup2, "statusup2", "ii"},
- {
- buildin_bonus, "bonus", "ii"},
- {
- buildin_bonus2, "bonus2", "iii"},
- {
- buildin_bonus3, "bonus3", "iiii"},
- {
- buildin_skill, "skill", "ii*"},
- {
- buildin_setskill, "setskill", "ii"}, // [Fate]
- {
- buildin_guildskill, "guildskill", "ii"},
- {
- buildin_getskilllv, "getskilllv", "i"},
- {
- buildin_getgdskilllv, "getgdskilllv", "ii"},
- {
- buildin_basicskillcheck, "basicskillcheck", "*"},
- {
- buildin_getgmlevel, "getgmlevel", ""},
- {
- buildin_end, "end", ""},
- {
- buildin_getopt2, "getopt2", ""},
- {
- buildin_setopt2, "setopt2", "i"},
- {
- buildin_end, "break", ""},
- {
- buildin_checkoption, "checkoption", "i"},
- {
- buildin_setoption, "setoption", "i"},
- {
- buildin_setcart, "setcart", ""},
- {
- buildin_checkcart, "checkcart", "*"}, //fixed by Lupus (added '*')
- {
- buildin_setfalcon, "setfalcon", ""},
- {
- buildin_checkfalcon, "checkfalcon", "*"}, //fixed by Lupus (fixed wrong pointer, added '*')
- {
- buildin_setriding, "setriding", ""},
- {
- buildin_checkriding, "checkriding", "*"}, //fixed by Lupus (fixed wrong pointer, added '*')
- {
- buildin_savepoint, "save", "sii"},
- {
- buildin_savepoint, "savepoint", "Mxy"},
- {
- buildin_gettimetick, "gettimetick", "i"},
- {
- buildin_gettime, "gettime", "i"},
- {
- buildin_gettimestr, "gettimestr", "si"},
- {
- buildin_openstorage, "openstorage", "*"},
- {
- buildin_guildopenstorage, "guildopenstorage", "*"},
- {
- buildin_itemskill, "itemskill", "iis"},
- {
- buildin_monster, "monster", "Mxysmi*"},
- {
- buildin_areamonster, "areamonster", "Mxyxysmi*"},
- {
- buildin_killmonster, "killmonster", "ME"},
- {
- buildin_killmonsterall, "killmonsterall", "M"},
- {
- buildin_doevent, "doevent", "E"},
- {
- buildin_donpcevent, "donpcevent", "E"},
- {
- buildin_addtimer, "addtimer", "tE"},
- {
- buildin_deltimer, "deltimer", "E"},
- {
- buildin_addtimercount, "addtimercount", "si"},
- {
- buildin_initnpctimer, "initnpctimer", ""},
- {
- buildin_stopnpctimer, "stopnpctimer", ""},
- {
- buildin_startnpctimer, "startnpctimer", "*"},
- {
- buildin_setnpctimer, "setnpctimer", "i"},
- {
- buildin_getnpctimer, "getnpctimer", "i"},
- {
- buildin_announce, "announce", "si"},
- {
- buildin_mapannounce, "mapannounce", "Msi"},
- {
- buildin_areaannounce, "areaannounce", "Mxyxysi"},
- {
- buildin_getusers, "getusers", "i"},
- {
- buildin_getmapusers, "getmapusers", "M"},
- {
- buildin_getareausers, "getareausers", "Mxyxy*"},
- {
- buildin_getareadropitem, "getareadropitem", "Mxyxyi*"},
- {
- buildin_enablenpc, "enablenpc", "s"},
- {
- buildin_disablenpc, "disablenpc", "s"},
- {
- buildin_enablearena, "enablearena", ""}, // Added by RoVeRT
- {
- buildin_disablearena, "disablearena", ""}, // Added by RoVeRT
- {
- buildin_hideoffnpc, "hideoffnpc", "s"},
- {
- buildin_hideonnpc, "hideonnpc", "s"},
- {
- buildin_sc_start, "sc_start", "iTi*"},
- {
- buildin_sc_start2, "sc_start2", "iTii*"},
- {
- buildin_sc_end, "sc_end", "i"},
- {
- buildin_sc_check, "sc_check", "i"},
- {
- buildin_getscrate, "getscrate", "ii*"},
- {
- buildin_debugmes, "debugmes", "s"},
- {
- buildin_resetlvl, "resetlvl", "i"},
- {
- buildin_resetstatus, "resetstatus", ""},
- {
- buildin_resetskill, "resetskill", ""},
- {
- buildin_changebase, "changebase", "i"},
- {
- buildin_changesex, "changesex", ""},
- {
- buildin_waitingroom, "waitingroom", "si*"},
- {
- buildin_warpwaitingpc, "warpwaitingpc", "sii"},
- {
- buildin_delwaitingroom, "delwaitingroom", "*"},
- {
- buildin_enablewaitingroomevent, "enablewaitingroomevent", "*"},
- {
- buildin_disablewaitingroomevent, "disablewaitingroomevent", "*"},
- {
- buildin_getwaitingroomstate, "getwaitingroomstate", "i*"},
- {
- buildin_warpwaitingpc, "warpwaitingpc", "sii*"},
- {
- buildin_attachrid, "attachrid", "i"},
- {
- buildin_detachrid, "detachrid", ""},
- {
- buildin_isloggedin, "isloggedin", "i"},
- {
- buildin_setmapflagnosave, "setmapflagnosave", "MMxy"},
- {
- buildin_setmapflag, "setmapflag", "Mi"},
- {
- buildin_removemapflag, "removemapflag", "Mi"},
- {
- buildin_pvpon, "pvpon", "M"},
- {
- buildin_pvpoff, "pvpoff", "M"},
- {
- buildin_gvgon, "gvgon", "s"},
- {
- buildin_gvgoff, "gvgoff", "s"},
- {
- buildin_emotion, "emotion", "i"},
- {
- buildin_maprespawnguildid, "maprespawnguildid", "sii"},
- {
- buildin_agitstart, "agitstart", ""}, // <Agit>
- {
- buildin_agitend, "agitend", ""},
- {
- buildin_agitcheck, "agitcheck", "i"}, // <Agitcheck>
- {
- buildin_flagemblem, "flagemblem", "i"}, // Flag Emblem
- {
- buildin_getcastlename, "getcastlename", "s"},
- {
- buildin_getcastledata, "getcastledata", "si*"},
- {
- buildin_setcastledata, "setcastledata", "sii"},
- {
- buildin_requestguildinfo, "requestguildinfo", "i*"},
- {
- buildin_getequipcardcnt, "getequipcardcnt", "i"},
- {
- buildin_successremovecards, "successremovecards", "i"},
- {
- buildin_failedremovecards, "failedremovecards", "ii"},
- {
- buildin_marriage, "marriage", "P"},
- {
- buildin_wedding_effect, "wedding", ""},
- {
- buildin_divorce, "divorce", ""},
- {
- buildin_getitemname, "getitemname", "I"},
- {
- buildin_getspellinvocation, "getspellinvocation", "s"},
- {
- buildin_getanchorinvocation, "getanchorinvocation", "s"},
- {
- buildin_getpartnerid, "getpartnerid2", ""},
- {
- buildin_getexp, "getexp", "ii"},
- {
- buildin_getinventorylist, "getinventorylist", ""},
- {
- buildin_getskilllist, "getskilllist", ""},
- {
- buildin_get_pool_skills, "getpoolskilllist", ""},
- {
- buildin_get_activated_pool_skills, "getactivatedpoolskilllist", ""},
- {
- buildin_get_unactivated_pool_skills, "getunactivatedpoolskilllist", ""},
- {
- buildin_activate_pool_skill, "poolskill", "i"},
- {
- buildin_deactivate_pool_skill, "unpoolskill", "i"},
- {
- buildin_check_pool_skill, "checkpoolskill", "i"},
- {
- buildin_clearitem, "clearitem", ""},
- {
- buildin_classchange, "classchange", "ii"},
- {
- buildin_misceffect, "misceffect", "i*"},
- {
- buildin_soundeffect, "soundeffect", "si"},
- {
- buildin_strmobinfo, "strmobinfo", "im"}, // display mob data [Valaris]
- {
- buildin_guardian, "guardian", "siisii*i"}, // summon guardians
- {
- buildin_guardianinfo, "guardianinfo", "i"}, // display guardian data [Valaris]
- {
- buildin_npcskilleffect, "npcskilleffect", "iiii"}, // npc skill effect [Valaris]
- {
- buildin_specialeffect, "specialeffect", "i"}, // npc skill effect [Valaris]
- {
- buildin_specialeffect2, "specialeffect2", "i"}, // skill effect on players[Valaris]
- {
- buildin_nude, "nude", ""}, // nude command [Valaris]
- {
- buildin_mapwarp, "mapwarp", "MMxy"}, // Added by RoVeRT
- {
- buildin_inittimer, "inittimer", ""},
- {
- buildin_stoptimer, "stoptimer", ""},
- {
- buildin_cmdothernpc, "cmdothernpc", "ss"},
- {
- buildin_gmcommand, "gmcommand", "s"}, // [MouseJstr]
-// {buildin_movenpc,"movenpc","siis"}, // [MouseJstr]
- {
- buildin_npcwarp, "npcwarp", "xys"}, // [remoitnane]
- {
- buildin_message, "message", "Ps"}, // [MouseJstr]
- {
- buildin_npctalk, "npctalk", "s"}, // [Valaris]
- {
- buildin_hasitems, "hasitems", ""}, // [Valaris]
- {
- buildin_mobcount, "mobcount", "ME"},
- {
- buildin_getlook, "getlook", "i"},
- {
- buildin_getsavepoint, "getsavepoint", "i"},
- {
- buildin_areatimer, "areatimer", "MxyxytE"},
- {
- buildin_isin, "isin", "Mxyxy"},
- {
- buildin_shop, "shop", "s"},
- {
- buildin_isdead, "isdead", ""},
- {
- buildin_fakenpcname, "fakenpcname", "ssi"},
- {
- buildin_unequip_by_id, "unequipbyid", "i"}, // [Freeyorp]
- {
- buildin_getx, "getx", ""}, // [Kage]
- {
- buildin_gety, "gety", ""}, // [Kage]
- // End Additions
- {
-NULL, NULL, NULL},};
+};
+// defined later
+extern BuiltinFunction builtin_functions[];
+
-#ifdef RECENT_GCC
enum class ScriptCode : uint8_t
{
- // tyoes and specials
+ // types and specials
NOP, POS, INT, PARAM, FUNC, STR, CONSTSTR, ARG,
NAME, EOL, RETINFO,
@@ -754,16 +146,16 @@ enum class ScriptCode : uint8_t
XOR, OR, AND, ADD, SUB, MUL, DIV, MOD, NEG, LNOT,
NOT, R_SHIFT, L_SHIFT
};
-#endif
/*==========================================
* 文字列のハッシュを計算
*------------------------------------------
*/
-static int calc_hash (const char *s)
+static
+int calc_hash(const char *s)
{
const unsigned char *p = (const unsigned char *)s;
- int h = 0;
+ int h = 0;
while (*p)
{
h = (h << 1) + (h >> 3) + (h >> 5) + (h >> 8);
@@ -777,13 +169,14 @@ static int calc_hash (const char *s)
*------------------------------------------
*/
// 既存のであれば番号、無ければ-1
-static int search_str (const char *p)
+static
+int search_str(const char *p)
{
- int i;
- i = str_hash[calc_hash (p)];
+ int i;
+ i = str_hash[calc_hash(p)];
while (i)
{
- if (strcmp (str_buf + str_data[i].str, p) == 0)
+ if (strcmp(str_buf + str_data[i].str, p) == 0)
{
return i;
}
@@ -797,22 +190,24 @@ static int search_str (const char *p)
*------------------------------------------
*/
// 既存のであれば番号、無ければ登録して新規番号
-static int add_str (const char *p)
+static
+int add_str(const char *p)
{
- int i;
+ int i;
char *lowcase;
- lowcase = strdup (p);
+ // TODO remove lowcase
+ lowcase = strdup(p);
for (i = 0; lowcase[i]; i++)
- lowcase[i] = tolower (lowcase[i]);
- if ((i = search_str (lowcase)) >= 0)
+ lowcase[i] = tolower(lowcase[i]);
+ if ((i = search_str(lowcase)) >= 0)
{
- free (lowcase);
+ free(lowcase);
return i;
}
- free (lowcase);
+ free(lowcase);
- i = calc_hash (p);
+ i = calc_hash(p);
if (str_hash[i] == 0)
{
str_hash[i] = str_num;
@@ -822,7 +217,7 @@ static int add_str (const char *p)
i = str_hash[i];
for (;;)
{
- if (strcmp (str_buf + str_data[i].str, p) == 0)
+ if (strcmp(str_buf + str_data[i].str, p) == 0)
{
return i;
}
@@ -835,23 +230,23 @@ static int add_str (const char *p)
if (str_num >= str_data_size)
{
str_data_size += 128;
- RECREATE (str_data, struct str_data_t, str_data_size);
- memset (str_data + (str_data_size - 128), '\0', 128);
+ RECREATE(str_data, struct str_data_t, str_data_size);
+ memset(str_data + (str_data_size - 128), '\0', 128);
}
- while (str_pos + strlen (p) + 1 >= str_size)
+ while (str_pos + strlen(p) + 1 >= str_size)
{
str_size += 256;
- str_buf = (char *) realloc (str_buf, str_size);
- memset (str_buf + (str_size - 256), '\0', 256);
+ str_buf = (char *) realloc(str_buf, str_size);
+ memset(str_buf + (str_size - 256), '\0', 256);
}
- strcpy (str_buf + str_pos, p);
+ strcpy(str_buf + str_pos, p);
str_data[str_num].type = ScriptCode::NOP;
str_data[str_num].str = str_pos;
str_data[str_num].next = 0;
str_data[str_num].func = NULL;
str_data[str_num].backpatch = -1;
str_data[str_num].label = -1;
- str_pos += strlen (p) + 1;
+ str_pos += strlen(p) + 1;
return str_num++;
}
@@ -859,13 +254,14 @@ static int add_str (const char *p)
* スクリプトバッファサイズの確認と拡張
*------------------------------------------
*/
-static void check_script_buf (int size)
+static
+void check_script_buf(int size)
{
if (script_pos + size >= script_size)
{
script_size += SCRIPT_BLOCK_SIZE;
- script_buf = (ScriptCode *) realloc (script_buf, script_size);
- memset (script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0',
+ script_buf = (ScriptCode *) realloc(script_buf, script_size);
+ memset(script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0',
SCRIPT_BLOCK_SIZE);
}
}
@@ -875,9 +271,9 @@ static void check_script_buf (int size)
*------------------------------------------
*/
static
-void add_scriptc (ScriptCode a)
+void add_scriptc(ScriptCode a)
{
- check_script_buf (1);
+ check_script_buf(1);
script_buf[script_pos++] = a;
}
@@ -886,7 +282,7 @@ void add_scriptc (ScriptCode a)
*------------------------------------------
*/
static
-void add_scriptb (uint8_t a)
+void add_scriptb(uint8_t a)
{
add_scriptc(static_cast<ScriptCode>(a));
}
@@ -895,14 +291,15 @@ void add_scriptb (uint8_t a)
* スクリプトバッファに整数を書き込む
*------------------------------------------
*/
-static void add_scripti (unsigned int a)
+static
+void add_scripti(unsigned int a)
{
while (a >= 0x40)
{
- add_scriptb (a | 0xc0);
+ add_scriptb(a | 0xc0);
a = (a - 0x40) >> 6;
}
- add_scriptb (a | 0x80);
+ add_scriptb(a | 0x80);
}
/*==========================================
@@ -910,35 +307,36 @@ static void add_scripti (unsigned int a)
*------------------------------------------
*/
// 最大16Mまで
-static void add_scriptl (int l)
+static
+void add_scriptl(int l)
{
- int backpatch = str_data[l].backpatch;
+ int backpatch = str_data[l].backpatch;
switch (str_data[l].type)
{
case ScriptCode::POS:
- add_scriptc (ScriptCode::POS);
- add_scriptb ({uint8_t(str_data[l].label)});
- add_scriptb ({uint8_t(str_data[l].label >> 8)});
- add_scriptb ({uint8_t(str_data[l].label >> 16)});
+ add_scriptc(ScriptCode::POS);
+ add_scriptb({uint8_t(str_data[l].label)});
+ add_scriptb({uint8_t(str_data[l].label >> 8)});
+ add_scriptb({uint8_t(str_data[l].label >> 16)});
break;
case ScriptCode::NOP:
// ラベルの可能性があるのでbackpatch用データ埋め込み
- add_scriptc (ScriptCode::NAME);
+ add_scriptc(ScriptCode::NAME);
str_data[l].backpatch = script_pos;
- add_scriptb ({uint8_t(backpatch)});
- add_scriptb ({uint8_t(backpatch >> 8)});
- add_scriptb ({uint8_t(backpatch >> 16)});
+ add_scriptb({uint8_t(backpatch)});
+ add_scriptb({uint8_t(backpatch >> 8)});
+ add_scriptb({uint8_t(backpatch >> 16)});
break;
case ScriptCode::INT:
- add_scripti (str_data[l].val);
+ add_scripti(str_data[l].val);
break;
default:
// もう他の用途と確定してるので数字をそのまま
- add_scriptc (ScriptCode::NAME);
- add_scriptb ({uint8_t(l)});
- add_scriptb ({uint8_t(l >> 8)});
- add_scriptb ({uint8_t(l >> 16)});
+ add_scriptc(ScriptCode::NAME);
+ add_scriptb({uint8_t(l)});
+ add_scriptb({uint8_t(l >> 8)});
+ add_scriptb({uint8_t(l >> 16)});
break;
}
}
@@ -948,15 +346,15 @@ static void add_scriptl (int l)
*------------------------------------------
*/
static
-void set_label (int l, int pos_)
+void set_label(int l, int pos_)
{
- int i, next;
+ int i, next;
str_data[l].type = ScriptCode::POS;
str_data[l].label = pos_;
for (i = str_data[l].backpatch; i >= 0 && i != 0x00ffffff;)
{
- next = (*(int *) (script_buf + i)) & 0x00ffffff;
+ next = (*(int *)(script_buf + i)) & 0x00ffffff;
script_buf[i - 1] = ScriptCode::POS;
script_buf[i] = static_cast<ScriptCode>(pos_);
script_buf[i + 1] = static_cast<ScriptCode>(pos_ >> 8);
@@ -969,11 +367,12 @@ void set_label (int l, int pos_)
* スペース/コメント読み飛ばし
*------------------------------------------
*/
-static const char *skip_space (const char *p)
+static
+const char *skip_space(const char *p)
{
while (1)
{
- while (isspace (*p))
+ while (isspace(*p))
p++;
if (p[0] == '/' && p[1] == '/')
{
@@ -999,7 +398,7 @@ static const char *skip_space (const char *p)
*------------------------------------------
*/
static
-const char *skip_word (const char *p)
+const char *skip_word(const char *p)
{
// prefix
if (*p == '$')
@@ -1013,7 +412,7 @@ const char *skip_word (const char *p)
if (*p == 'l')
p++; // 一時的変数用(like weiss)
- while (isalnum (*p) || *p == '_')
+ while (isalnum(*p) || *p == '_')
p++;
// postfix
@@ -1023,14 +422,17 @@ const char *skip_word (const char *p)
return p;
}
-static const char *startptr;
-static int startline;
+static
+const char *startptr;
+static
+int startline;
/*==========================================
* エラーメッセージ出力
*------------------------------------------
*/
-static void disp_error_message (const char *mes, const char *pos_)
+static
+void disp_error_message(const char *mes, const char *pos_)
{
int line;
const char *p;
@@ -1038,8 +440,9 @@ static void disp_error_message (const char *mes, const char *pos_)
for (line = startline, p = startptr; p && *p; line++)
{
const char *linestart = p;
- char *lineend = const_cast<char *>(strchr (p, '\n'));
- char c;
+ char *lineend = const_cast<char *>(strchr(p, '\n'));
+ // always initialized, but clang is not smart enough
+ char c = '\0';
if (lineend)
{
c = *lineend;
@@ -1047,17 +450,17 @@ static void disp_error_message (const char *mes, const char *pos_)
}
if (lineend == NULL || pos_ < lineend)
{
- printf ("%s line %d : ", mes, line);
+ PRINTF("%s line %d : ", mes, line);
for (int i = 0;
(linestart[i] != '\r') && (linestart[i] != '\n')
&& linestart[i]; i++)
{
if (linestart + i != pos_)
- printf ("%c", linestart[i]);
+ PRINTF("%c", linestart[i]);
else
- printf ("\'%c\'", linestart[i]);
+ PRINTF("\'%c\'", linestart[i]);
}
- printf ("\a\n");
+ PRINTF("\a\n");
if (lineend)
*lineend = c;
return;
@@ -1072,41 +475,41 @@ static void disp_error_message (const char *mes, const char *pos_)
*------------------------------------------
*/
static
-const char *parse_simpleexpr (const char *p)
+const char *parse_simpleexpr(const char *p)
{
- int i;
- p = skip_space (p);
+ int i;
+ p = skip_space(p);
#ifdef DEBUG_FUNCIN
if (battle_config.etc_log)
- printf ("parse_simpleexpr %s\n", p);
+ PRINTF("parse_simpleexpr %s\n", p);
#endif
if (*p == ';' || *p == ',')
{
- disp_error_message ("unexpected expr end", p);
- exit (1);
+ disp_error_message("unexpected expr end", p);
+ exit(1);
}
if (*p == '(')
{
- p = parse_subexpr (p + 1, -1);
- p = skip_space (p);
+ p = parse_subexpr(p + 1, -1);
+ p = skip_space(p);
if ((*p++) != ')')
{
- disp_error_message ("unmatch ')'", p);
- exit (1);
+ disp_error_message("unmatch ')'", p);
+ exit(1);
}
}
- else if (isdigit (*p) || ((*p == '-' || *p == '+') && isdigit (p[1])))
+ else if (isdigit(*p) || ((*p == '-' || *p == '+') && isdigit(p[1])))
{
char *np;
- i = strtoul (p, &np, 0);
- add_scripti (i);
+ i = strtoul(p, &np, 0);
+ add_scripti(i);
p = np;
}
else if (*p == '"')
{
- add_scriptc (ScriptCode::STR);
+ add_scriptc(ScriptCode::STR);
p++;
while (*p && *p != '"')
{
@@ -1114,44 +517,44 @@ const char *parse_simpleexpr (const char *p)
p++;
else if (*p == '\n')
{
- disp_error_message ("unexpected newline @ string", p);
- exit (1);
+ disp_error_message("unexpected newline @ string", p);
+ exit(1);
}
- add_scriptb (*p++);
+ add_scriptb(*p++);
}
if (!*p)
{
- disp_error_message ("unexpected eof @ string", p);
- exit (1);
+ disp_error_message("unexpected eof @ string", p);
+ exit(1);
}
- add_scriptb (0);
+ add_scriptb(0);
p++; //'"'
}
else
{
int l;
// label , register , function etc
- if (skip_word (p) == p)
+ if (skip_word(p) == p)
{
- disp_error_message ("unexpected character", p);
- exit (1);
+ disp_error_message("unexpected character", p);
+ exit(1);
}
char *p2 = const_cast<char *>(skip_word(p));
char c = *p2;
*p2 = 0; // 名前をadd_strする
- l = add_str (p);
+ l = add_str(p);
parse_cmd = l; // warn_*_mismatch_paramnumのために必要
- if (l == search_str ("if")) // warn_cmd_no_commaのために必要
+ if (l == search_str("if")) // warn_cmd_no_commaのために必要
parse_cmd_if++;
/*
- // 廃止予定のl14/l15,およびプレフィックスlの警告
- if( strcmp(str_buf+str_data[l].str,"l14")==0 ||
- strcmp(str_buf+str_data[l].str,"l15")==0 ){
- disp_error_message("l14 and l15 is DEPRECATED. use @menu instead of l15.",p);
- }else if(str_buf[str_data[l].str]=='l'){
- disp_error_message("prefix 'l' is DEPRECATED. use prefix '@' instead.",p2);
- }
+ // 廃止予定のl14/l15,およびプレフィックスlの警告
+ if ( strcmp(str_buf+str_data[l].str,"l14")==0 ||
+ strcmp(str_buf+str_data[l].str,"l15")==0 ){
+ disp_error_message("l14 and l15 is DEPRECATED. use @menu instead of l15.",p);
+ }else if (str_buf[str_data[l].str]=='l'){
+ disp_error_message("prefix 'l' is DEPRECATED. use prefix '@' instead.",p2);
+ }
*/
*p2 = c;
p = p2;
@@ -1159,26 +562,26 @@ const char *parse_simpleexpr (const char *p)
if (str_data[l].type != ScriptCode::FUNC && c == '[')
{
// array(name[i] => getelementofarray(name,i) )
- add_scriptl (search_str ("getelementofarray"));
- add_scriptc (ScriptCode::ARG);
- add_scriptl (l);
- p = parse_subexpr (p + 1, -1);
- p = skip_space (p);
+ add_scriptl(search_str("getelementofarray"));
+ add_scriptc(ScriptCode::ARG);
+ add_scriptl(l);
+ p = parse_subexpr(p + 1, -1);
+ p = skip_space(p);
if ((*p++) != ']')
{
- disp_error_message ("unmatch ']'", p);
- exit (1);
+ disp_error_message("unmatch ']'", p);
+ exit(1);
}
- add_scriptc (ScriptCode::FUNC);
+ add_scriptc(ScriptCode::FUNC);
}
else
- add_scriptl (l);
+ add_scriptl(l);
}
#ifdef DEBUG_FUNCIN
if (battle_config.etc_log)
- printf ("parse_simpleexpr end %s\n", p);
+ PRINTF("parse_simpleexpr end %s\n", p);
#endif
return p;
}
@@ -1187,23 +590,23 @@ const char *parse_simpleexpr (const char *p)
* 式の解析
*------------------------------------------
*/
-const char *parse_subexpr (const char *p, int limit)
+const char *parse_subexpr(const char *p, int limit)
{
ScriptCode op;
int opl, len;
#ifdef DEBUG_FUNCIN
if (battle_config.etc_log)
- printf ("parse_subexpr %s\n", p);
+ PRINTF("parse_subexpr %s\n", p);
#endif
- p = skip_space (p);
+ p = skip_space(p);
if (*p == '-')
{
- const char *tmpp = skip_space (p + 1);
+ const char *tmpp = skip_space(p + 1);
if (*tmpp == ';' || *tmpp == ',')
{
- add_scriptl (LABEL_NEXTLINE);
+ add_scriptl(LABEL_NEXTLINE);
p++;
return p;
}
@@ -1212,12 +615,12 @@ const char *parse_subexpr (const char *p, int limit)
if ((op = ScriptCode::NEG, *p == '-') || (op = ScriptCode::LNOT, *p == '!')
|| (op = ScriptCode::NOT, *p == '~'))
{
- p = parse_subexpr (p + 1, 100);
- add_scriptc (op);
+ p = parse_subexpr(p + 1, 100);
+ add_scriptc(op);
}
else
- p = parse_simpleexpr (p);
- p = skip_space (p);
+ p = parse_simpleexpr(p);
+ p = skip_space(p);
while (((op = ScriptCode::ADD, opl = 6, len = 1, *p == '+') ||
(op = ScriptCode::SUB, opl = 6, len = 1, *p == '-') ||
(op = ScriptCode::MUL, opl = 7, len = 1, *p == '*') ||
@@ -1241,63 +644,63 @@ const char *parse_subexpr (const char *p, int limit)
p += len;
if (op == ScriptCode::FUNC)
{
- int i = 0, func = parse_cmd;
+ int i = 0, func = parse_cmd;
const char *plist[128];
if (str_data[func].type != ScriptCode::FUNC)
{
- disp_error_message ("expect function", tmpp);
- exit (0);
+ disp_error_message("expect function", tmpp);
+ exit(0);
}
- add_scriptc (ScriptCode::ARG);
+ add_scriptc(ScriptCode::ARG);
while (*p && *p != ')' && i < 128)
{
plist[i] = p;
- p = parse_subexpr (p, -1);
- p = skip_space (p);
+ p = parse_subexpr(p, -1);
+ p = skip_space(p);
if (*p == ',')
p++;
else if (*p != ')' && script_config.warn_func_no_comma)
{
- disp_error_message ("expect ',' or ')' at func params",
+ disp_error_message("expect ',' or ')' at func params",
p);
}
- p = skip_space (p);
+ p = skip_space(p);
i++;
}
plist[i] = p;
if (*(p++) != ')')
{
- disp_error_message ("func request '(' ')'", p);
- exit (1);
+ disp_error_message("func request '(' ')'", p);
+ exit(1);
}
if (str_data[func].type == ScriptCode::FUNC
&& script_config.warn_func_mismatch_paramnum)
{
- const char *arg = buildin_func[str_data[func].val].arg;
- int j = 0;
+ const char *arg = builtin_functions[str_data[func].val].arg;
+ int j = 0;
for (j = 0; arg[j]; j++)
if (arg[j] == '*')
break;
if ((arg[j] == 0 && i != j) || (arg[j] == '*' && i < j))
{
- disp_error_message ("illegal number of parameters",
+ disp_error_message("illegal number of parameters",
plist[(i < j) ? i : j]);
}
}
}
else // not op == ScriptCode::FUNC
{
- p = parse_subexpr (p, opl);
+ p = parse_subexpr(p, opl);
}
- add_scriptc (op);
- p = skip_space (p);
+ add_scriptc(op);
+ p = skip_space(p);
}
#ifdef DEBUG_FUNCIN
if (battle_config.etc_log)
- printf ("parse_subexpr end %s\n", p);
+ PRINTF("parse_subexpr end %s\n", p);
#endif
return p; /* return first untreated operator */
}
@@ -1307,11 +710,11 @@ const char *parse_subexpr (const char *p, int limit)
*------------------------------------------
*/
static
-const char *parse_expr (const char *p)
+const char *parse_expr(const char *p)
{
#ifdef DEBUG_FUNCIN
if (battle_config.etc_log)
- printf ("parse_expr %s\n", p);
+ PRINTF("parse_expr %s\n", p);
#endif
switch (*p)
{
@@ -1321,13 +724,13 @@ const char *parse_expr (const char *p)
case '[':
case ']':
case '}':
- disp_error_message ("unexpected char", p);
- exit (1);
+ disp_error_message("unexpected char", p);
+ exit(1);
}
- p = parse_subexpr (p, -1);
+ p = parse_subexpr(p, -1);
#ifdef DEBUG_FUNCIN
if (battle_config.etc_log)
- printf ("parse_expr end %s\n", p);
+ PRINTF("parse_expr end %s\n", p);
#endif
return p;
}
@@ -1337,12 +740,12 @@ const char *parse_expr (const char *p)
*------------------------------------------
*/
static
-const char *parse_line (const char *p)
+const char *parse_line(const char *p)
{
- int i = 0, cmd;
+ int i = 0, cmd;
const char *plist[128];
- p = skip_space (p);
+ p = skip_space(p);
if (*p == ';')
return p;
@@ -1350,53 +753,53 @@ const char *parse_line (const char *p)
// 最初は関数名
const char *p2 = p;
- p = parse_simpleexpr (p);
- p = skip_space (p);
+ p = parse_simpleexpr(p);
+ p = skip_space(p);
cmd = parse_cmd;
if (str_data[cmd].type != ScriptCode::FUNC)
{
- disp_error_message ("expect command", p2);
+ disp_error_message("expect command", p2);
// exit(0);
}
- add_scriptc (ScriptCode::ARG);
+ add_scriptc(ScriptCode::ARG);
while (p && *p && *p != ';' && i < 128)
{
plist[i] = p;
- p = parse_expr (p);
- p = skip_space (p);
+ p = parse_expr(p);
+ p = skip_space(p);
// 引数区切りの,処理
if (*p == ',')
p++;
else if (*p != ';' && script_config.warn_cmd_no_comma
&& parse_cmd_if * 2 <= i)
{
- disp_error_message ("expect ',' or ';' at cmd params", p);
+ disp_error_message("expect ',' or ';' at cmd params", p);
}
- p = skip_space (p);
+ p = skip_space(p);
i++;
}
plist[i] = p;
if (!p || *(p++) != ';')
{
- disp_error_message ("need ';'", p);
- exit (1);
+ disp_error_message("need ';'", p);
+ exit(1);
}
- add_scriptc (ScriptCode::FUNC);
+ add_scriptc(ScriptCode::FUNC);
if (str_data[cmd].type == ScriptCode::FUNC
&& script_config.warn_cmd_mismatch_paramnum)
{
- const char *arg = buildin_func[str_data[cmd].val].arg;
- int j = 0;
+ const char *arg = builtin_functions[str_data[cmd].val].arg;
+ int j = 0;
for (j = 0; arg[j]; j++)
if (arg[j] == '*')
break;
if ((arg[j] == 0 && i != j) || (arg[j] == '*' && i < j))
{
- disp_error_message ("illegal number of parameters",
+ disp_error_message("illegal number of parameters",
plist[(i < j) ? i : j]);
}
}
@@ -1408,15 +811,16 @@ const char *parse_line (const char *p)
* 組み込み関数の追加
*------------------------------------------
*/
-static void add_buildin_func (void)
+static
+void add_builtin_functions(void)
{
- int i, n;
- for (i = 0; buildin_func[i].func; i++)
+ int i, n;
+ for (i = 0; builtin_functions[i].func; i++)
{
- n = add_str (buildin_func[i].name);
+ n = add_str(builtin_functions[i].name);
str_data[n].type = ScriptCode::FUNC;
str_data[n].val = i;
- str_data[n].func = buildin_func[i].func;
+ str_data[n].func = builtin_functions[i].func;
}
}
@@ -1424,56 +828,59 @@ static void add_buildin_func (void)
* 定数データベースの読み込み
*------------------------------------------
*/
-static void read_constdb (void)
+static
+void read_constdb(void)
{
- FILE *fp;
- char line[1024], name[1024];
- int val, n, i, type;
-
- fp = fopen_ ("db/const.txt", "r");
- if (fp == NULL)
+ std::ifstream in("db/const.txt");
+ if (!in.is_open())
{
- printf ("can't read db/const.txt\n");
+ PRINTF("can't read db/const.txt\n");
return;
}
- while (fgets (line, 1020, fp))
+
+ std::string line;
+ while (std::getline(in, line))
{
if (line[0] == '/' && line[1] == '/')
continue;
- type = 0;
- if (sscanf (line, "%[A-Za-z0-9_],%d,%d", name, &val, &type) >= 2 ||
- sscanf (line, "%[A-Za-z0-9_] %d %d", name, &val, &type) >= 2)
- {
- for (i = 0; name[i]; i++)
- name[i] = tolower (name[i]);
- n = add_str (name);
- if (type == 0)
- str_data[n].type = ScriptCode::INT;
- else
- str_data[n].type = ScriptCode::PARAM;
- str_data[n].val = val;
- }
+
+ char *name = nullptr;
+ int val;
+ int type = 0; // if not provided
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat"
+ if (sscanf(line.c_str(), "%m[A-Za-z0-9_] %i %i", &name, &val, &type) < 2)
+ {
+ free(name);
+ continue;
+ }
+#pragma GCC diagnostic pop
+ for (char *p = name; *p; ++p)
+ *p = tolower(*p);
+ int n = add_str(name);
+ free(name);
+ str_data[n].type = type ? ScriptCode::PARAM : ScriptCode::INT;
+ str_data[n].val = val;
}
- fclose_ (fp);
}
/*==========================================
* スクリプトの解析
*------------------------------------------
*/
-const ScriptCode *parse_script (const char *src, int line)
+const ScriptCode *parse_script(const char *src, int line)
{
const char *p;
- int i;
+ int i;
static int first = 1;
if (first)
{
- add_buildin_func ();
- read_constdb ();
+ add_builtin_functions();
+ read_constdb();
}
first = 0;
- script_buf = (ScriptCode *) calloc (SCRIPT_BLOCK_SIZE, 1);
+ script_buf = (ScriptCode *) calloc(SCRIPT_BLOCK_SIZE, 1);
script_pos = 0;
script_size = SCRIPT_BLOCK_SIZE;
str_data[LABEL_NEXTLINE].type = ScriptCode::NOP;
@@ -1490,71 +897,70 @@ const ScriptCode *parse_script (const char *src, int line)
}
// 外部用label dbの初期化
- if (scriptlabel_db != NULL)
- strdb_final (scriptlabel_db, NULL);
- scriptlabel_db = strdb_init (50);
+ scriptlabel_db.clear();
// for error message
startptr = src;
startline = line;
p = src;
- p = skip_space (p);
+ p = skip_space(p);
if (*p != '{')
{
- disp_error_message ("not found '{'", p);
+ disp_error_message("not found '{'", p);
return NULL;
}
for (p++; p && *p && *p != '}';)
{
- p = skip_space (p);
+ p = skip_space(p);
// labelだけ特殊処理
- if (*skip_space (skip_word (p)) == ':')
+ if (*skip_space(skip_word(p)) == ':')
{
char *tmpp = const_cast<char *>(skip_word(p));
char c = *tmpp;
*tmpp = '\0';
- int l = add_str (p);
+ int l = add_str(p);
if (str_data[l].label != -1)
{
*tmpp = c;
- disp_error_message ("dup label ", p);
- exit (1);
+ disp_error_message("dup label ", p);
+ exit(1);
}
- set_label (l, script_pos);
- strdb_insert (scriptlabel_db, (const char*)p, script_pos); // 外部用label db登録
+ set_label(l, script_pos);
+ std::string str(p, skip_word(p));
+ scriptlabel_db.insert(str, script_pos);
*tmpp = c;
p = tmpp + 1;
continue;
}
// 他は全部一緒くた
- p = parse_line (p);
- p = skip_space (p);
- add_scriptc (ScriptCode::EOL);
+ p = parse_line(p);
+ p = skip_space(p);
+ add_scriptc(ScriptCode::EOL);
- set_label (LABEL_NEXTLINE, script_pos);
+ set_label(LABEL_NEXTLINE, script_pos);
str_data[LABEL_NEXTLINE].type = ScriptCode::NOP;
str_data[LABEL_NEXTLINE].backpatch = -1;
str_data[LABEL_NEXTLINE].label = -1;
}
- add_scriptc (ScriptCode::NOP);
+ add_scriptc(ScriptCode::NOP);
script_size = script_pos;
- script_buf = (ScriptCode *) realloc (script_buf, script_pos + 1);
+ script_buf = (ScriptCode *) realloc(script_buf, script_pos + 1);
// 未解決のラベルを解決
for (i = LABEL_START; i < str_num; i++)
{
if (str_data[i].type == ScriptCode::NOP)
{
- int j, next;
+ int j, next;
str_data[i].type = ScriptCode::NAME;
str_data[i].label = i;
for (j = str_data[i].backpatch; j >= 0 && j != 0x00ffffff;)
{
- next = (*(int *) (script_buf + j)) & 0x00ffffff;
+ next = (*(int *)(script_buf + j)) & 0x00ffffff;
script_buf[j] = static_cast<ScriptCode>(i);
script_buf[j + 1] = static_cast<ScriptCode>(i >> 8);
script_buf[j + 2] = static_cast<ScriptCode>(i >> 16);
@@ -1567,12 +973,12 @@ const ScriptCode *parse_script (const char *src, int line)
for (i = 0; i < script_pos; i++)
{
if ((i & 15) == 0)
- printf ("%04x : ", i);
- printf ("%02x ", script_buf[i]);
+ PRINTF("%04x : ", i);
+ PRINTF("%02x ", script_buf[i]);
if ((i & 15) == 15)
- printf ("\n");
+ PRINTF("\n");
}
- printf ("\n");
+ PRINTF("\n");
#endif
return script_buf;
@@ -1589,12 +995,12 @@ enum
*------------------------------------------
*/
static
-struct map_session_data *script_rid2sd (struct script_state *st)
+struct map_session_data *script_rid2sd(ScriptState *st)
{
- struct map_session_data *sd = map_id2sd (st->rid);
+ struct map_session_data *sd = map_id2sd(st->rid);
if (!sd)
{
- printf ("script_rid2sd: fatal error ! player not attached!\n");
+ PRINTF("script_rid2sd: fatal error ! player not attached!\n");
}
return sd;
}
@@ -1604,19 +1010,19 @@ struct map_session_data *script_rid2sd (struct script_state *st)
*------------------------------------------
*/
static
-int get_val (struct script_state *st, struct script_data *data)
+void get_val(ScriptState *st, struct script_data *data)
{
struct map_session_data *sd = NULL;
if (data->type == ScriptCode::NAME)
{
char *name = str_buf + str_data[data->u.num & 0x00ffffff].str;
char prefix = *name;
- char postfix = name[strlen (name) - 1];
+ char postfix = name[strlen(name) - 1];
if (prefix != '$')
{
- if ((sd = script_rid2sd (st)) == NULL)
- printf ("get_val error name?:%s\n", name);
+ if ((sd = script_rid2sd(st)) == NULL)
+ PRINTF("get_val error name?:%s\n", name);
}
if (postfix == '$')
{
@@ -1625,16 +1031,15 @@ int get_val (struct script_state *st, struct script_data *data)
if (prefix == '@' || prefix == 'l')
{
if (sd)
- data->u.str = pc_readregstr (sd, data->u.num);
+ data->u.str = pc_readregstr(sd, data->u.num);
}
else if (prefix == '$')
{
- data->u.str =
- (char *) numdb_search (mapregstr_db, data->u.num);
+ data->u.str = mapregstr_db.get(data->u.num);
}
else
{
- printf ("script: get_val: illegal scope string variable.\n");
+ PRINTF("script: get_val: illegal scope string variable.\n");
data->u.str = "!!ERROR!!";
}
if (data->u.str == NULL)
@@ -1647,45 +1052,45 @@ int get_val (struct script_state *st, struct script_data *data)
data->type = ScriptCode::INT;
if (str_data[data->u.num & 0x00ffffff].type == ScriptCode::INT)
{
+ // unreachable
data->u.num = str_data[data->u.num & 0x00ffffff].val;
}
else if (str_data[data->u.num & 0x00ffffff].type == ScriptCode::PARAM)
{
if (sd)
data->u.num =
- pc_readparam (sd,
- str_data[data->u.num & 0x00ffffff].val);
+ pc_readparam(sd,
+ SP(str_data[data->u.num & 0x00ffffff].val));
}
else if (prefix == '@' || prefix == 'l')
{
if (sd)
- data->u.num = pc_readreg (sd, data->u.num);
+ data->u.num = pc_readreg(sd, data->u.num);
}
else if (prefix == '$')
{
- data->u.num = (int) numdb_search (mapreg_db, data->u.num);
+ data->u.num = mapreg_db.get(data->u.num);
}
else if (prefix == '#')
{
if (name[1] == '#')
{
if (sd)
- data->u.num = pc_readaccountreg2 (sd, name);
+ data->u.num = pc_readaccountreg2(sd, name);
}
else
{
if (sd)
- data->u.num = pc_readaccountreg (sd, name);
+ data->u.num = pc_readaccountreg(sd, name);
}
}
else
{
if (sd)
- data->u.num = pc_readglobalreg (sd, name);
+ data->u.num = pc_readglobalreg(sd, name);
}
}
}
- return 0;
}
/*==========================================
@@ -1693,12 +1098,12 @@ int get_val (struct script_state *st, struct script_data *data)
*------------------------------------------
*/
static
-struct script_data get_val2 (struct script_state *st, int num)
+struct script_data get_val2(ScriptState *st, int num)
{
struct script_data dat;
dat.type = ScriptCode::NAME;
dat.u.num = num;
- get_val (st, &dat);
+ get_val(st, &dat);
return dat;
}
@@ -1707,25 +1112,25 @@ struct script_data get_val2 (struct script_state *st, int num)
*------------------------------------------
*/
static
-int set_reg (struct map_session_data *sd, int num, const char *name, struct script_data vd)
+void set_reg(struct map_session_data *sd, int num, const char *name, struct script_data vd)
{
char prefix = *name;
- char postfix = name[strlen (name) - 1];
+ char postfix = name[strlen(name) - 1];
if (postfix == '$')
{
const char *str = vd.u.str;
if (prefix == '@' || prefix == 'l')
{
- pc_setregstr (sd, num, str);
+ pc_setregstr(sd, num, str);
}
else if (prefix == '$')
{
- mapreg_setregstr (num, str);
+ mapreg_setregstr(num, str);
}
else
{
- printf ("script: set_reg: illegal scope string variable !");
+ PRINTF("script: set_reg: illegal scope string variable !");
}
}
else
@@ -1734,45 +1139,44 @@ int set_reg (struct map_session_data *sd, int num, const char *name, struct scri
int val = vd.u.num;
if (str_data[num & 0x00ffffff].type == ScriptCode::PARAM)
{
- pc_setparam (sd, str_data[num & 0x00ffffff].val, val);
+ pc_setparam(sd, SP(str_data[num & 0x00ffffff].val), val);
}
else if (prefix == '@' || prefix == 'l')
{
- pc_setreg (sd, num, val);
+ pc_setreg(sd, num, val);
}
else if (prefix == '$')
{
- mapreg_setreg (num, val);
+ mapreg_setreg(num, val);
}
else if (prefix == '#')
{
if (name[1] == '#')
- pc_setaccountreg2 (sd, name, val);
+ pc_setaccountreg2(sd, name, val);
else
- pc_setaccountreg (sd, name, val);
+ pc_setaccountreg(sd, name, val);
}
else
{
- pc_setglobalreg (sd, name, val);
+ pc_setglobalreg(sd, name, val);
}
}
- return 0;
}
static
-int set_reg (struct map_session_data *sd, int num, const char *name, int id)
+void set_reg(struct map_session_data *sd, int num, const char *name, int id)
{
struct script_data vd;
vd.u.num = id;
- return set_reg(sd, num, name, vd);
+ set_reg(sd, num, name, vd);
}
static
-int set_reg (struct map_session_data *sd, int num, const char *name, const char *zd)
+void set_reg(struct map_session_data *sd, int num, const char *name, const char *zd)
{
struct script_data vd;
vd.u.str = zd;
- return set_reg(sd, num, name, vd);
+ set_reg(sd, num, name, vd);
}
/*==========================================
@@ -1780,25 +1184,26 @@ int set_reg (struct map_session_data *sd, int num, const char *name, const char
*------------------------------------------
*/
static
-const char *conv_str (struct script_state *st, struct script_data *data)
+const char *conv_str(ScriptState *st, struct script_data *data)
{
- get_val (st, data);
+ get_val(st, data);
+ assert (data->type != ScriptCode::RETINFO);
if (data->type == ScriptCode::INT)
{
char *buf;
- buf = (char *) calloc (16, 1);
- sprintf (buf, "%d", data->u.num);
+ buf = (char *) calloc(16, 1);
+ sprintf(buf, "%d", data->u.num);
data->type = ScriptCode::STR;
data->u.str = buf;
-#if 1
}
+#if 1
else if (data->type == ScriptCode::NAME)
{
// テンポラリ。本来無いはず
data->type = ScriptCode::CONSTSTR;
data->u.str = str_buf + str_data[data->u.num].str;
-#endif
}
+#endif
return data->u.str;
}
@@ -1807,13 +1212,14 @@ const char *conv_str (struct script_state *st, struct script_data *data)
*------------------------------------------
*/
static
-int conv_num (struct script_state *st, struct script_data *data)
+int conv_num(ScriptState *st, struct script_data *data)
{
- get_val (st, data);
+ get_val(st, data);
+ assert (data->type != ScriptCode::RETINFO);
if (data->type == ScriptCode::STR || data->type == ScriptCode::CONSTSTR)
{
const char *p = data->u.str;
- data->u.num = atoi (p);
+ data->u.num = atoi(p);
if (data->type == ScriptCode::STR)
free(const_cast<char *>(p));
data->type = ScriptCode::INT;
@@ -1821,46 +1227,79 @@ int conv_num (struct script_state *st, struct script_data *data)
return data->u.num;
}
+static
+const ScriptCode *conv_script(ScriptState *st, struct script_data *data)
+{
+ get_val(st, data);
+ assert (data->type == ScriptCode::RETINFO);
+ return data->u.script;
+}
+
/*==========================================
* スタックへ数値をプッシュ
*------------------------------------------
*/
-void push_val (struct script_stack *stack, ScriptCode type, int val)
+static
+void push_val(struct script_stack *stack, ScriptCode type, int val)
{
+ assert (type != ScriptCode::RETINFO);
+ assert (type != ScriptCode::STR);
+ assert (type != ScriptCode::CONSTSTR);
if (stack->sp >= stack->sp_max)
{
stack->sp_max += 64;
stack->stack_data = (struct script_data *)
- realloc (stack->stack_data, sizeof (stack->stack_data[0]) *
+ realloc(stack->stack_data, sizeof(stack->stack_data[0]) *
stack->sp_max);
- memset (stack->stack_data + (stack->sp_max - 64), 0,
- 64 * sizeof (*(stack->stack_data)));
+ memset(stack->stack_data + (stack->sp_max - 64), 0,
+ 64 * sizeof(*(stack->stack_data)));
}
// if(battle_config.etc_log)
-// printf("push (%d,%d)-> %d\n",type,val,stack->sp);
+// PRINTF("push (%d,%d)-> %d\n",type,val,stack->sp);
stack->stack_data[stack->sp].type = type;
stack->stack_data[stack->sp].u.num = val;
stack->sp++;
}
+static
+void push_script(struct script_stack *stack, ScriptCode type, const ScriptCode *code)
+{
+ assert (type == ScriptCode::RETINFO);
+ if (stack->sp >= stack->sp_max)
+ {
+ stack->sp_max += 64;
+ stack->stack_data = (struct script_data *)
+ realloc(stack->stack_data, sizeof(stack->stack_data[0]) *
+ stack->sp_max);
+ memset(stack->stack_data + (stack->sp_max - 64), 0,
+ 64 * sizeof(*(stack->stack_data)));
+ }
+// if(battle_config.etc_log)
+// PRINTF("push (%d,%d)-> %d\n",type,val,stack->sp);
+ stack->stack_data[stack->sp].type = type;
+ stack->stack_data[stack->sp].u.script = code;
+ stack->sp++;
+}
+
/*==========================================
* スタックへ文字列をプッシュ
*------------------------------------------
*/
static
-void push_str (struct script_stack *stack, ScriptCode type, const char *str)
+void push_str(struct script_stack *stack, ScriptCode type, const char *str)
{
+ assert (type == ScriptCode::STR || type == ScriptCode::CONSTSTR);
if (stack->sp >= stack->sp_max)
{
stack->sp_max += 64;
stack->stack_data = (struct script_data *)
- realloc (stack->stack_data, sizeof (stack->stack_data[0]) *
+ realloc(stack->stack_data, sizeof(stack->stack_data[0]) *
stack->sp_max);
- memset (stack->stack_data + (stack->sp_max - 64), '\0',
- 64 * sizeof (*(stack->stack_data)));
+ memset(stack->stack_data + (stack->sp_max - 64), '\0',
+ 64 * sizeof(*(stack->stack_data)));
}
// if(battle_config.etc_log)
-// printf("push (%d,%x)-> %d\n",type,str,stack->sp);
+// PRINTF("push (%d,%x)-> %d\n",type,str,stack->sp);
stack->stack_data[stack->sp].type = type;
stack->stack_data[stack->sp].u.str = str;
stack->sp++;
@@ -1871,18 +1310,18 @@ void push_str (struct script_stack *stack, ScriptCode type, const char *str)
*------------------------------------------
*/
static
-void push_copy (struct script_stack *stack, int pos_)
+void push_copy(struct script_stack *stack, int pos_)
{
switch (stack->stack_data[pos_].type)
{
case ScriptCode::CONSTSTR:
- push_str (stack, ScriptCode::CONSTSTR, stack->stack_data[pos_].u.str);
+ push_str(stack, ScriptCode::CONSTSTR, stack->stack_data[pos_].u.str);
break;
case ScriptCode::STR:
- push_str (stack, ScriptCode::STR, strdup (stack->stack_data[pos_].u.str));
+ push_str(stack, ScriptCode::STR, strdup(stack->stack_data[pos_].u.str));
break;
default:
- push_val (stack, stack->stack_data[pos_].type,
+ push_val(stack, stack->stack_data[pos_].type,
stack->stack_data[pos_].u.num);
break;
}
@@ -1893,20 +1332,20 @@ void push_copy (struct script_stack *stack, int pos_)
*------------------------------------------
*/
static
-void pop_stack (struct script_stack *stack, int start, int end)
+void pop_stack(struct script_stack *stack, int start, int end)
{
- int i;
+ int i;
for (i = start; i < end; i++)
{
if (stack->stack_data[i].type == ScriptCode::STR)
{
- free (const_cast<char *>(stack->stack_data[i].u.str));
+ free(const_cast<char *>(stack->stack_data[i].u.str));
}
}
if (stack->sp > end)
{
- memmove (&stack->stack_data[start], &stack->stack_data[end],
- sizeof (stack->stack_data[0]) * (stack->sp - end));
+ memmove(&stack->stack_data[start], &stack->stack_data[end],
+ sizeof(stack->stack_data[0]) * (stack->sp - end));
}
stack->sp -= end - start;
}
@@ -1918,51 +1357,55 @@ void pop_stack (struct script_stack *stack, int start, int end)
*
*------------------------------------------
*/
-int buildin_mes (struct script_state *st)
+static
+void builtin_mes(ScriptState *st)
{
- conv_str (st, &(st->stack->stack_data[st->start + 2]));
- clif_scriptmes (script_rid2sd (st), st->oid,
+ conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ clif_scriptmes(script_rid2sd(st), st->oid,
st->stack->stack_data[st->start + 2].u.str);
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_goto (struct script_state *st)
+static
+void builtin_goto(ScriptState *st)
{
if (st->stack->stack_data[st->start + 2].type != ScriptCode::POS)
{
- printf ("script: goto: not label !\n");
+ PRINTF("script: goto: not label !\n");
st->state = END;
- return 0;
+ return;
}
- st->pos = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ st->pos = conv_num(st, &(st->stack->stack_data[st->start + 2]));
st->state = GOTO;
- return 0;
}
/*==========================================
* ユーザー定義関数の呼び出し
*------------------------------------------
*/
-int buildin_callfunc (struct script_state *st)
+static
+void builtin_callfunc(ScriptState *st)
{
const ScriptCode *scr;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
- if ((scr = (const ScriptCode *)strdb_search (script_get_userfunc_db (), str)))
+ if ((scr = userfunc_db.get(str)))
{
- int i, j;
- for (i = st->start + 3, j = 0; i < st->end; i++, j++)
- push_copy (st->stack, i);
+ int j = 0;
+ assert (st->start + 3 == st->end);
+#if 0
+ for (int i = st->start + 3; i < st->end; i++, j++)
+ push_copy(st->stack, i);
+#endif
- push_val (st->stack, ScriptCode::INT, j); // 引数の数をプッシュ
- push_val (st->stack, ScriptCode::INT, st->defsp); // 現在の基準スタックポインタをプッシュ
- push_val (st->stack, ScriptCode::INT, (int) st->script); // 現在のスクリプトをプッシュ
- push_val (st->stack, ScriptCode::RETINFO, st->pos); // 現在のスクリプト位置をプッシュ
+ push_val(st->stack, ScriptCode::INT, j); // 引数の数をプッシュ
+ push_val(st->stack, ScriptCode::INT, st->defsp); // 現在の基準スタックポインタをプッシュ
+ push_val(st->stack, ScriptCode::INT, st->pos); // 現在のスクリプト位置をプッシュ
+ push_script(st->stack, ScriptCode::RETINFO, st->script); // 現在のスクリプトをプッシュ
st->pos = 0;
st->script = scr;
@@ -1971,125 +1414,103 @@ int buildin_callfunc (struct script_state *st)
}
else
{
- printf ("script:callfunc: function not found! [%s]\n", str);
+ PRINTF("script:callfunc: function not found! [%s]\n", str);
st->state = END;
}
- return 0;
}
/*==========================================
* サブルーティンの呼び出し
*------------------------------------------
*/
-int buildin_callsub (struct script_state *st)
-{
- int pos_ = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- int i, j;
- for (i = st->start + 3, j = 0; i < st->end; i++, j++)
- push_copy (st->stack, i);
+static
+void builtin_callsub(ScriptState *st)
+{
+ int pos_ = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ int j = 0;
+ assert (st->start + 3 == st->end);
+#if 0
+ for (int i = st->start + 3; i < st->end; i++, j++)
+ push_copy(st->stack, i);
+#endif
- push_val (st->stack, ScriptCode::INT, j); // 引数の数をプッシュ
- push_val (st->stack, ScriptCode::INT, st->defsp); // 現在の基準スタックポインタをプッシュ
- push_val (st->stack, ScriptCode::INT, (int) st->script); // 現在のスクリプトをプッシュ
- push_val (st->stack, ScriptCode::RETINFO, st->pos); // 現在のスクリプト位置をプッシュ
+ push_val(st->stack, ScriptCode::INT, j); // 引数の数をプッシュ
+ push_val(st->stack, ScriptCode::INT, st->defsp); // 現在の基準スタックポインタをプッシュ
+ push_val(st->stack, ScriptCode::INT, st->pos); // 現在のスクリプト位置をプッシュ
+ push_script(st->stack, ScriptCode::RETINFO, st->script); // 現在のスクリプトをプッシュ
st->pos = pos_;
st->defsp = st->start + 4 + j;
st->state = GOTO;
- return 0;
-}
-
-/*==========================================
- * 引数の所得
- *------------------------------------------
- */
-int buildin_getarg (struct script_state *st)
-{
- int num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- int max, stsp;
- if (st->defsp < 4
- || st->stack->stack_data[st->defsp - 1].type != ScriptCode::RETINFO)
- {
- printf ("script:getarg without callfunc or callsub!\n");
- st->state = END;
- return 0;
- }
- max = conv_num (st, &(st->stack->stack_data[st->defsp - 4]));
- stsp = st->defsp - max - 4;
- if (num >= max)
- {
- printf ("script:getarg arg1(%d) out of range(%d) !\n", num, max);
- st->state = END;
- return 0;
- }
- push_copy (st->stack, stsp + num);
- return 0;
}
/*==========================================
* サブルーチン/ユーザー定義関数の終了
*------------------------------------------
*/
-int buildin_return (struct script_state *st)
+static
+void builtin_return(ScriptState *st)
{
+#if 0
if (st->end > st->start + 2)
{ // 戻り値有り
- push_copy (st->stack, st->start + 2);
+ push_copy(st->stack, st->start + 2);
}
+#endif
st->state = RETFUNC;
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_next (struct script_state *st)
+static
+void builtin_next(ScriptState *st)
{
st->state = STOP;
- clif_scriptnext (script_rid2sd (st), st->oid);
- return 0;
+ clif_scriptnext(script_rid2sd(st), st->oid);
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_close (struct script_state *st)
+static
+void builtin_close(ScriptState *st)
{
st->state = END;
- clif_scriptclose (script_rid2sd (st), st->oid);
- return 0;
+ clif_scriptclose(script_rid2sd(st), st->oid);
}
-int buildin_close2 (struct script_state *st)
+static
+void builtin_close2(ScriptState *st)
{
st->state = STOP;
- clif_scriptclose (script_rid2sd (st), st->oid);
- return 0;
+ clif_scriptclose(script_rid2sd(st), st->oid);
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_menu (struct script_state *st)
+static
+void builtin_menu(ScriptState *st)
{
char *buf;
- int i, len = 0; // [fate] len is the total # of bytes we need to transmit the string choices
- int menu_choices = 0;
- int finished_menu_items = 0; // [fate] set to 1 after we hit the first empty string
+ int i, len = 0; // [fate] len is the total # of bytes we need to transmit the string choices
+ int menu_choices = 0;
+ int finished_menu_items = 0; // [fate] set to 1 after we hit the first empty string
struct map_session_data *sd;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
// We don't need to do this iteration if the player cancels, strictly speaking.
for (i = st->start + 2; i < st->end; i += 2)
{
- int choice_len;
- conv_str (st, &(st->stack->stack_data[i]));
- choice_len = strlen (st->stack->stack_data[i].u.str);
+ int choice_len;
+ conv_str(st, &(st->stack->stack_data[i]));
+ choice_len = strlen(st->stack->stack_data[i].u.str);
len += choice_len + 1; // count # of bytes we'll need for packet. Only used if menu_or_input = 0.
if (choice_len && !finished_menu_items)
@@ -2103,15 +1524,15 @@ int buildin_menu (struct script_state *st)
st->state = RERUNLINE;
sd->state.menu_or_input = 1;
- buf = (char *) calloc (len + 1, 1);
+ buf = (char *) calloc(len + 1, 1);
buf[0] = 0;
for (i = st->start + 2; menu_choices > 0; i += 2, --menu_choices)
{
- strcat (buf, st->stack->stack_data[i].u.str);
- strcat (buf, ":");
+ strcat(buf, st->stack->stack_data[i].u.str);
+ strcat(buf, ":");
}
- clif_scriptmenu (script_rid2sd (st), st->oid, buf);
- free (buf);
+ clif_scriptmenu(script_rid2sd(st), st->oid, buf);
+ free(buf);
}
else if (sd->npc_menu == 0xff)
{ // cansel
@@ -2121,8 +1542,8 @@ int buildin_menu (struct script_state *st)
else
{ // goto動作
// ragemu互換のため
- pc_setreg (sd, add_str ("l15"), sd->npc_menu);
- pc_setreg (sd, add_str ("@menu"), sd->npc_menu);
+ pc_setreg(sd, add_str("l15"), sd->npc_menu);
+ pc_setreg(sd, add_str("@menu"), sd->npc_menu);
sd->state.menu_or_input = 0;
if (sd->npc_menu > 0 && sd->npc_menu <= menu_choices)
{
@@ -2130,121 +1551,112 @@ int buildin_menu (struct script_state *st)
stack_data[st->start + sd->npc_menu * 2 + 1].type != ScriptCode::POS)
{
st->state = END;
- return 0;
+ return;
}
st->pos =
- conv_num (st,
+ conv_num(st,
&(st->
stack->stack_data[st->start + sd->npc_menu * 2 +
1]));
st->state = GOTO;
}
}
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_rand (struct script_state *st)
+static
+void builtin_rand(ScriptState *st)
{
- int range, min, max;
-
if (st->end > st->start + 3)
{
- min = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- max = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- if (max < min)
- {
- int tmp;
- tmp = min;
- min = max;
- max = tmp;
- }
- range = max - min + 1;
- push_val (st->stack, ScriptCode::INT, (range <= 0 ? 0 : MRAND (range)) + min);
+ int min = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ int max = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ if (min > max)
+ std::swap(max, min);
+ push_val(st->stack, ScriptCode::INT, random_::in(min, max));
}
else
{
- range = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- push_val (st->stack, ScriptCode::INT, range <= 0 ? 0 : MRAND (range));
+ int range = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ push_val(st->stack, ScriptCode::INT, range <= 0 ? 0 : random_::to(range));
}
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_pow (struct script_state *st)
+static
+void builtin_pow(ScriptState *st)
{
- int a, b;
+ int a, b;
- a = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- b = conv_num (st, &(st->stack->stack_data[st->start + 3]));
+ a = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ b = conv_num(st, &(st->stack->stack_data[st->start + 3]));
- push_val (st->stack, ScriptCode::INT, (int) pow (a * 0.001, b));
+ push_val(st->stack, ScriptCode::INT, (int) pow(a * 0.001, b));
- return 0;
}
/*==========================================
* Check whether the PC is at the specified location
*------------------------------------------
*/
-int buildin_isat (struct script_state *st)
+static
+void builtin_isat(ScriptState *st)
{
- int x, y;
- struct map_session_data *sd = script_rid2sd (st);
+ int x, y;
+ struct map_session_data *sd = script_rid2sd(st);
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 4]));
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y = conv_num(st, &(st->stack->stack_data[st->start + 4]));
if (!sd)
- return 1;
+ return;
- push_val (st->stack, ScriptCode::INT,
+ push_val(st->stack, ScriptCode::INT,
(x == sd->bl.x)
- && (y == sd->bl.y) && (!strcmp (str, map[sd->bl.m].name)));
+ && (y == sd->bl.y) && (!strcmp(str, map[sd->bl.m].name)));
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_warp (struct script_state *st)
+static
+void builtin_warp(ScriptState *st)
{
- int x, y;
- struct map_session_data *sd = script_rid2sd (st);
+ int x, y;
+ struct map_session_data *sd = script_rid2sd(st);
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- if (strcmp (str, "Random") == 0)
- pc_randomwarp (sd, 3);
- else if (strcmp (str, "SavePoint") == 0)
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ if (strcmp(str, "Random") == 0)
+ pc_randomwarp(sd, BeingRemoveWhy::WARPED);
+ else if (strcmp(str, "SavePoint") == 0)
{
if (map[sd->bl.m].flag.noreturn) // 蝶禁止
- return 0;
+ return;
- pc_setpos (sd, sd->status.save_point.map,
- sd->status.save_point.x, sd->status.save_point.y, 3);
+ pc_setpos(sd, sd->status.save_point.map,
+ sd->status.save_point.x, sd->status.save_point.y, BeingRemoveWhy::WARPED);
}
- else if (strcmp (str, "Save") == 0)
+ else if (strcmp(str, "Save") == 0)
{
if (map[sd->bl.m].flag.noreturn) // 蝶禁止
- return 0;
+ return;
- pc_setpos (sd, sd->status.save_point.map,
- sd->status.save_point.x, sd->status.save_point.y, 3);
+ pc_setpos(sd, sd->status.save_point.map,
+ sd->status.save_point.x, sd->status.save_point.y, BeingRemoveWhy::WARPED);
}
else
- pc_setpos (sd, str, x, y, 0);
- return 0;
+ pc_setpos(sd, str, x, y, BeingRemoveWhy::GONE);
}
/*==========================================
@@ -2252,118 +1664,96 @@ int buildin_warp (struct script_state *st)
*------------------------------------------
*/
static
-int buildin_areawarp_sub (struct block_list *bl, va_list ap)
+void builtin_areawarp_sub(struct block_list *bl, const char *mapname, int x, int y)
{
- int x, y;
- const char *mapname = va_arg (ap, const char *);
- x = va_arg (ap, int);
- y = va_arg (ap, int);
- if (strcmp (mapname, "Random") == 0)
- pc_randomwarp ((struct map_session_data *) bl, 3);
+ if (strcmp(mapname, "Random") == 0)
+ pc_randomwarp((struct map_session_data *) bl, BeingRemoveWhy::WARPED);
else
- pc_setpos ((struct map_session_data *) bl, mapname, x, y, 0);
- return 0;
+ pc_setpos((struct map_session_data *) bl, mapname, x, y, BeingRemoveWhy::GONE);
}
-int buildin_areawarp (struct script_state *st)
+static
+void builtin_areawarp(ScriptState *st)
{
- int x, y, m;
- int x0, y0, x1, y1;
+ int x, y, m;
+ int x0, y0, x1, y1;
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x0 = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y0 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- x1 = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- y1 = conv_num (st, &(st->stack->stack_data[st->start + 6]));
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 7]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 8]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 9]));
-
- if ((m = map_mapname2mapid (mapname)) < 0)
- return 0;
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x0 = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y0 = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ x1 = conv_num(st, &(st->stack->stack_data[st->start + 5]));
+ y1 = conv_num(st, &(st->stack->stack_data[st->start + 6]));
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 7]));
+ x = conv_num(st, &(st->stack->stack_data[st->start + 8]));
+ y = conv_num(st, &(st->stack->stack_data[st->start + 9]));
- map_foreachinarea (buildin_areawarp_sub,
- m, x0, y0, x1, y1, BL_PC, str, x, y);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_heal (struct script_state *st)
-{
- int hp, sp;
+ if ((m = map_mapname2mapid(mapname)) < 0)
+ return;
- hp = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sp = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- pc_heal (script_rid2sd (st), hp, sp);
- return 0;
+ map_foreachinarea(std::bind(builtin_areawarp_sub, ph::_1, str, x, y),
+ m, x0, y0, x1, y1, BL::PC);
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_itemheal (struct script_state *st)
+static
+void builtin_heal(ScriptState *st)
{
- int hp, sp;
+ int hp, sp;
- hp = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sp = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- pc_itemheal (script_rid2sd (st), hp, sp);
- return 0;
+ hp = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ sp = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ pc_heal(script_rid2sd(st), hp, sp);
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_percentheal (struct script_state *st)
+static
+void builtin_itemheal(ScriptState *st)
{
- int hp, sp;
+ int hp, sp;
- hp = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sp = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- pc_percentheal (script_rid2sd (st), hp, sp);
- return 0;
+ hp = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ sp = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ pc_itemheal(script_rid2sd(st), hp, sp);
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_jobchange (struct script_state *st)
+static
+void builtin_percentheal(ScriptState *st)
{
- int job, upper = -1;
+ int hp, sp;
- job = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- if (st->end > st->start + 3)
- upper = conv_num (st, &(st->stack->stack_data[st->start + 3]));
-
- if ((job >= 0 && job < MAX_PC_CLASS))
- pc_jobchange (script_rid2sd (st), job, upper);
-
- return 0;
+ hp = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ sp = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ pc_percentheal(script_rid2sd(st), hp, sp);
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_input (struct script_state *st)
+static
+void builtin_input(ScriptState *st)
{
struct map_session_data *sd = NULL;
- int num =
+ int num =
(st->end >
st->start + 2) ? st->stack->stack_data[st->start + 2].u.num : 0;
const char *name =
(st->end >
st->start + 2) ? str_buf + str_data[num & 0x00ffffff].str : "";
// char prefix=*name;
- char postfix = name[strlen (name) - 1];
+ char postfix = name[strlen(name) - 1];
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
if (sd->state.menu_or_input)
{
sd->state.menu_or_input = 0;
@@ -2372,11 +1762,11 @@ int buildin_input (struct script_state *st)
// 文字列
if (st->end > st->start + 2)
{ // 引数1個
- set_reg (sd, num, name, sd->npc_str);
+ set_reg(sd, num, name, sd->npc_str);
}
else
{
- printf ("buildin_input: string discarded !!\n");
+ PRINTF("builtin_input: string discarded !!\n");
}
}
else
@@ -2386,19 +1776,19 @@ int buildin_input (struct script_state *st)
//** Fix by fritz :X keeps people from abusing old input bugs
if (sd->npc_amount < 0) //** If input amount is less then 0
{
- clif_tradecancelled (sd); // added "Deal has been cancelled" message by Valaris
- buildin_close (st); //** close
+ clif_tradecancelled(sd); // added "Deal has been cancelled" message by Valaris
+ builtin_close(st); //** close
}
// 数値
if (st->end > st->start + 2)
{ // 引数1個
- set_reg (sd, num, name, sd->npc_amount);
+ set_reg(sd, num, name, sd->npc_amount);
}
else
{
// ragemu互換のため
- pc_setreg (sd, add_str ("l14"), sd->npc_amount);
+ pc_setreg(sd, add_str("l14"), sd->npc_amount);
}
}
}
@@ -2406,97 +1796,97 @@ int buildin_input (struct script_state *st)
{
st->state = RERUNLINE;
if (postfix == '$')
- clif_scriptinputstr (sd, st->oid);
+ clif_scriptinputstr(sd, st->oid);
else
- clif_scriptinput (sd, st->oid);
+ clif_scriptinput(sd, st->oid);
sd->state.menu_or_input = 1;
}
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_if (struct script_state *st)
+static
+void builtin_if (ScriptState *st)
{
- int sel, i;
+ int sel, i;
- sel = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ sel = conv_num(st, &(st->stack->stack_data[st->start + 2]));
if (!sel)
- return 0;
+ return;
// 関数名をコピー
- push_copy (st->stack, st->start + 3);
+ push_copy(st->stack, st->start + 3);
// 間に引数マーカを入れて
- push_val (st->stack, ScriptCode::ARG, 0);
+ push_val(st->stack, ScriptCode::ARG, 0);
// 残りの引数をコピー
for (i = st->start + 4; i < st->end; i++)
{
- push_copy (st->stack, i);
+ push_copy(st->stack, i);
}
- run_func (st);
+ run_func(st);
- return 0;
}
/*==========================================
* 変数設定
*------------------------------------------
*/
-int buildin_set (struct script_state *st)
+static
+void builtin_set(ScriptState *st)
{
struct map_session_data *sd = NULL;
- int num = st->stack->stack_data[st->start + 2].u.num;
+ int num = st->stack->stack_data[st->start + 2].u.num;
char *name = str_buf + str_data[num & 0x00ffffff].str;
char prefix = *name;
- char postfix = name[strlen (name) - 1];
+ char postfix = name[strlen(name) - 1];
if (st->stack->stack_data[st->start + 2].type != ScriptCode::NAME)
{
- printf ("script: buildin_set: not name\n");
- return 0;
+ PRINTF("script: builtin_set: not name\n");
+ return;
}
if (prefix != '$')
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
if (postfix == '$')
{
// 文字列
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 3]));
- set_reg (sd, num, name, str);
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 3]));
+ set_reg(sd, num, name, str);
}
else
{
// 数値
- int val = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- set_reg (sd, num, name, val);
+ int val = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ set_reg(sd, num, name, val);
}
- return 0;
}
/*==========================================
* 配列変数設定
*------------------------------------------
*/
-int buildin_setarray (struct script_state *st)
+static
+void builtin_setarray(ScriptState *st)
{
struct map_session_data *sd = NULL;
- int num = st->stack->stack_data[st->start + 2].u.num;
+ int num = st->stack->stack_data[st->start + 2].u.num;
char *name = str_buf + str_data[num & 0x00ffffff].str;
char prefix = *name;
- char postfix = name[strlen (name) - 1];
- int i, j;
+ char postfix = name[strlen(name) - 1];
+ int i, j;
if (prefix != '$' && prefix != '@')
{
- printf ("buildin_setarray: illegal scope !\n");
- return 0;
+ PRINTF("builtin_setarray: illegal scope !\n");
+ return;
}
if (prefix != '$')
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
for (j = 0, i = st->start + 3; i < st->end && j < 128; i++, j++)
{
@@ -2505,31 +1895,30 @@ int buildin_setarray (struct script_state *st)
else
set_reg(sd, num + (j << 24), name, conv_num(st, &(st->stack->stack_data[i])));
}
- return 0;
}
/*==========================================
* 配列変数クリア
*------------------------------------------
*/
-int buildin_cleararray (struct script_state *st)
+static
+void builtin_cleararray(ScriptState *st)
{
struct map_session_data *sd = NULL;
- int num = st->stack->stack_data[st->start + 2].u.num;
+ int num = st->stack->stack_data[st->start + 2].u.num;
char *name = str_buf + str_data[num & 0x00ffffff].str;
char prefix = *name;
- char postfix = name[strlen (name) - 1];
- int sz = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- int i;
- void *v;
+ char postfix = name[strlen(name) - 1];
+ int sz = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ int i;
if (prefix != '$' && prefix != '@')
{
- printf ("buildin_cleararray: illegal scope !\n");
- return 0;
+ PRINTF("builtin_cleararray: illegal scope !\n");
+ return;
}
if (prefix != '$')
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
if (postfix == '$')
for (i = 0; i < sz; i++)
@@ -2538,241 +1927,110 @@ int buildin_cleararray (struct script_state *st)
for (i = 0; i < sz; i++)
set_reg(sd, num + (i << 24), name, conv_num(st, &(st->stack->stack_data[st->start + 3])));
- return 0;
-}
-
-/*==========================================
- * 配列変数コピー
- *------------------------------------------
- */
-int buildin_copyarray (struct script_state *st)
-{
- struct map_session_data *sd = NULL;
- int num = st->stack->stack_data[st->start + 2].u.num;
- char *name = str_buf + str_data[num & 0x00ffffff].str;
- char prefix = *name;
- char postfix = name[strlen (name) - 1];
- int num2 = st->stack->stack_data[st->start + 3].u.num;
- char *name2 = str_buf + str_data[num2 & 0x00ffffff].str;
- char prefix2 = *name2;
- char postfix2 = name2[strlen (name2) - 1];
- int sz = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- int i;
-
- if (prefix != '$' && prefix != '@' && prefix2 != '$' && prefix2 != '@')
- {
- printf ("buildin_copyarray: illegal scope !\n");
- return 0;
- }
- if ((postfix == '$' || postfix2 == '$') && postfix != postfix2)
- {
- printf ("buildin_copyarray: type mismatch !\n");
- return 0;
- }
- if (prefix != '$' || prefix2 != '$')
- sd = script_rid2sd (st);
-
- for (i = 0; i < sz; i++)
- set_reg (sd, num + (i << 24), name, get_val2 (st, num2 + (i << 24)));
- return 0;
}
/*==========================================
* 配列変数のサイズ所得
*------------------------------------------
*/
-static int getarraysize (struct script_state *st, int num, int postfix)
+static
+int getarraysize(ScriptState *st, int num, int postfix)
{
- int i = (num >> 24), c = i;
+ int i = (num >> 24), c = i;
for (; i < 128; i++)
{
- struct script_data vd = get_val2 (st, num + (i << 24));
+ struct script_data vd = get_val2(st, num + (i << 24));
if (postfix == '$' ? bool(*vd.u.str) : bool(vd.u.num))
c = i;
}
return c + 1;
}
-int buildin_getarraysize (struct script_state *st)
-{
- int num = st->stack->stack_data[st->start + 2].u.num;
- char *name = str_buf + str_data[num & 0x00ffffff].str;
- char prefix = *name;
- char postfix = name[strlen (name) - 1];
-
- if (prefix != '$' && prefix != '@')
- {
- printf ("buildin_copyarray: illegal scope !\n");
- return 0;
- }
-
- push_val (st->stack, ScriptCode::INT, getarraysize (st, num, postfix));
- return 0;
-}
-
-/*==========================================
- * 配列変数から要素削除
- *------------------------------------------
- */
-int buildin_deletearray (struct script_state *st)
+static
+void builtin_getarraysize(ScriptState *st)
{
- struct map_session_data *sd = NULL;
- int num = st->stack->stack_data[st->start + 2].u.num;
+ int num = st->stack->stack_data[st->start + 2].u.num;
char *name = str_buf + str_data[num & 0x00ffffff].str;
char prefix = *name;
- char postfix = name[strlen (name) - 1];
- int count = 1;
- int i, sz = getarraysize (st, num, postfix) - (num >> 24) - count + 1;
-
- if ((st->end > st->start + 3))
- count = conv_num (st, &(st->stack->stack_data[st->start + 3]));
+ char postfix = name[strlen(name) - 1];
if (prefix != '$' && prefix != '@')
{
- printf ("buildin_deletearray: illegal scope !\n");
- return 0;
+ PRINTF("builtin_copyarray: illegal scope !\n");
+ return;
}
- if (prefix != '$')
- sd = script_rid2sd (st);
- for (i = 0; i < sz; i++)
- {
- set_reg (sd, num + (i << 24), name,
- get_val2 (st, num + ((i + count) << 24)));
- }
- for (; i < (128 - (num >> 24)); i++)
- {
- if (postfix != '$')
- set_reg (sd, num + (i << 24), name, 0);
- if (postfix == '$')
- set_reg (sd, num + (i << 24), name, "");
- }
- return 0;
+ push_val(st->stack, ScriptCode::INT, getarraysize(st, num, postfix));
}
/*==========================================
* 指定要素を表す値(キー)を所得する
*------------------------------------------
*/
-int buildin_getelementofarray (struct script_state *st)
+static
+void builtin_getelementofarray(ScriptState *st)
{
if (st->stack->stack_data[st->start + 2].type == ScriptCode::NAME)
{
- int i = conv_num (st, &(st->stack->stack_data[st->start + 3]));
+ int i = conv_num(st, &(st->stack->stack_data[st->start + 3]));
if (i > 127 || i < 0)
{
- printf
- ("script: getelementofarray (operator[]): param2 illegal number %d\n",
+ PRINTF("script: getelementofarray (operator[]): param2 illegal number %d\n",
i);
- push_val (st->stack, ScriptCode::INT, 0);
+ push_val(st->stack, ScriptCode::INT, 0);
}
else
{
- push_val (st->stack, ScriptCode::NAME,
+ push_val(st->stack, ScriptCode::NAME,
(i << 24) | st->stack->stack_data[st->start + 2].u.num);
}
}
else
{
- printf
- ("script: getelementofarray (operator[]): param1 not name !\n");
- push_val (st->stack, ScriptCode::INT, 0);
+ PRINTF("script: getelementofarray (operator[]): param1 not name !\n");
+ push_val(st->stack, ScriptCode::INT, 0);
}
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_setlook (struct script_state *st)
-{
- int type, val;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- val = conv_num (st, &(st->stack->stack_data[st->start + 3]));
-
- pc_changelook (script_rid2sd (st), type, val);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_cutin (struct script_state *st)
-{
- int type;
-
- conv_str (st, &(st->stack->stack_data[st->start + 2]));
- type = conv_num (st, &(st->stack->stack_data[st->start + 3]));
-
- clif_cutin (script_rid2sd (st),
- st->stack->stack_data[st->start + 2].u.str, type);
-
- return 0;
-}
-
-/*==========================================
- * カードのイラストを表示する
- *------------------------------------------
- */
-int buildin_cutincard (struct script_state *st)
-{
- int itemid;
-
- itemid = conv_num (st, &(st->stack->stack_data[st->start + 2]));
-
- clif_cutin (script_rid2sd (st), itemdb_search (itemid)->cardillustname,
- 4);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_viewpoint (struct script_state *st)
+static
+void builtin_setlook(ScriptState *st)
{
- int type, x, y, id, color;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- id = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- color = conv_num (st, &(st->stack->stack_data[st->start + 6]));
+ LOOK type = LOOK(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ int val = conv_num(st, &(st->stack->stack_data[st->start + 3]));
- clif_viewpoint (script_rid2sd (st), st->oid, type, x, y, id, color);
+ pc_changelook(script_rid2sd(st), type, val);
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_countitem (struct script_state *st)
+static
+void builtin_countitem(ScriptState *st)
{
- int nameid = 0, count = 0, i;
+ int nameid = 0, count = 0, i;
struct map_session_data *sd;
struct script_data *data;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
data = &(st->stack->stack_data[st->start + 2]);
- get_val (st, data);
+ get_val(st, data);
if (data->type == ScriptCode::STR || data->type == ScriptCode::CONSTSTR)
{
- const char *name = conv_str (st, data);
+ const char *name = conv_str(st, data);
struct item_data *item_data;
- if ((item_data = itemdb_searchname (name)) != NULL)
+ if ((item_data = itemdb_searchname(name)) != NULL)
nameid = item_data->nameid;
}
else
- nameid = conv_num (st, data);
+ nameid = conv_num(st, data);
if (nameid >= 500) //if no such ID then skip this iteration
for (i = 0; i < MAX_INVENTORY; i++)
@@ -2783,305 +2041,202 @@ int buildin_countitem (struct script_state *st)
else
{
if (battle_config.error_log)
- printf ("wrong item ID : countitem(%i)\n", nameid);
+ PRINTF("wrong item ID : countitem (%i)\n", nameid);
}
- push_val (st->stack, ScriptCode::INT, count);
+ push_val(st->stack, ScriptCode::INT, count);
- return 0;
}
/*==========================================
* 重量チェック
*------------------------------------------
*/
-int buildin_checkweight (struct script_state *st)
+static
+void builtin_checkweight(ScriptState *st)
{
- int nameid = 0, amount;
+ int nameid = 0, amount;
struct map_session_data *sd;
struct script_data *data;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
data = &(st->stack->stack_data[st->start + 2]);
- get_val (st, data);
+ get_val(st, data);
if (data->type == ScriptCode::STR || data->type == ScriptCode::CONSTSTR)
{
- const char *name = conv_str (st, data);
- struct item_data *item_data = itemdb_searchname (name);
+ const char *name = conv_str(st, data);
+ struct item_data *item_data = itemdb_searchname(name);
if (item_data)
nameid = item_data->nameid;
}
else
- nameid = conv_num (st, data);
+ nameid = conv_num(st, data);
- amount = conv_num (st, &(st->stack->stack_data[st->start + 3]));
+ amount = conv_num(st, &(st->stack->stack_data[st->start + 3]));
if (amount <= 0 || nameid < 500)
- { //if get wrong item ID or amount<=0, don't count weight of non existing items
- push_val (st->stack, ScriptCode::INT, 0);
+ {
+ //if get wrong item ID or amount<=0, don't count weight of non existing items
+ push_val(st->stack, ScriptCode::INT, 0);
+ return;
}
- sd = script_rid2sd (st);
- if (itemdb_weight (nameid) * amount + sd->weight > sd->max_weight)
+ if (itemdb_weight(nameid) * amount + sd->weight > sd->max_weight)
{
- push_val (st->stack, ScriptCode::INT, 0);
+ push_val(st->stack, ScriptCode::INT, 0);
}
else
{
- push_val (st->stack, ScriptCode::INT, 1);
+ push_val(st->stack, ScriptCode::INT, 1);
}
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_getitem (struct script_state *st)
+static
+void builtin_getitem(ScriptState *st)
{
- int nameid, amount, flag = 0;
+ int nameid, amount;
struct item item_tmp;
struct map_session_data *sd;
struct script_data *data;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
data = &(st->stack->stack_data[st->start + 2]);
- get_val (st, data);
+ get_val(st, data);
if (data->type == ScriptCode::STR || data->type == ScriptCode::CONSTSTR)
{
- const char *name = conv_str (st, data);
- struct item_data *item_data = itemdb_searchname (name);
+ const char *name = conv_str(st, data);
+ struct item_data *item_data = itemdb_searchname(name);
nameid = 727; //Default to iten
if (item_data != NULL)
nameid = item_data->nameid;
}
else
- nameid = conv_num (st, data);
+ nameid = conv_num(st, data);
if ((amount =
- conv_num (st, &(st->stack->stack_data[st->start + 3]))) <= 0)
+ conv_num(st, &(st->stack->stack_data[st->start + 3]))) <= 0)
{
- return 0; //return if amount <=0, skip the useles iteration
- }
- //Violet Box, Blue Box, etc - random item pick
- if (nameid < 0)
- { // ランダム
- nameid = itemdb_searchrandomid (-nameid);
- flag = 1;
+ return; //return if amount <=0, skip the useles iteration
}
if (nameid > 0)
{
- memset (&item_tmp, 0, sizeof (item_tmp));
+ memset(&item_tmp, 0, sizeof(item_tmp));
item_tmp.nameid = nameid;
- if (!flag)
- item_tmp.identify = 1;
- else
- item_tmp.identify = !itemdb_isequip3 (nameid);
+ item_tmp.identify = 1;
if (st->end > st->start + 5) //アイテムを指定したIDに渡す
- sd = map_id2sd (conv_num
- (st, &(st->stack->stack_data[st->start + 5])));
+ sd = map_id2sd(conv_num(st, &(st->stack->stack_data[st->start + 5])));
if (sd == NULL) //アイテムを渡す相手がいなかったらお帰り
- return 0;
- if ((flag = pc_additem (sd, &item_tmp, amount)))
- {
- clif_additem (sd, 0, 0, flag);
- map_addflooritem (&item_tmp, amount, sd->bl.m, sd->bl.x, sd->bl.y,
- NULL, NULL, NULL, 0);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_getitem2 (struct script_state *st)
-{
- int nameid, amount, flag = 0;
- int iden, ref, attr, c1, c2, c3, c4;
- struct item item_tmp;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd (st);
-
- data = &(st->stack->stack_data[st->start + 2]);
- get_val (st, data);
- if (data->type == ScriptCode::STR || data->type == ScriptCode::CONSTSTR)
- {
- const char *name = conv_str (st, data);
- struct item_data *item_data = itemdb_searchname (name);
- nameid = 512; //Apple item ID
- if (item_data)
- nameid = item_data->nameid;
- }
- else
- nameid = conv_num (st, data);
-
- amount = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- iden = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- ref = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- attr = conv_num (st, &(st->stack->stack_data[st->start + 6]));
- c1 = conv_num (st, &(st->stack->stack_data[st->start + 7]));
- c2 = conv_num (st, &(st->stack->stack_data[st->start + 8]));
- c3 = conv_num (st, &(st->stack->stack_data[st->start + 9]));
- c4 = conv_num (st, &(st->stack->stack_data[st->start + 10]));
- if (st->end > st->start + 11) //アイテムを指定したIDに渡す
- sd = map_id2sd (conv_num
- (st, &(st->stack->stack_data[st->start + 11])));
- if (sd == NULL) //アイテムを渡す相手がいなかったらお帰り
- return 0;
-
- if (nameid < 0)
- { // ランダム
- nameid = itemdb_searchrandomid (-nameid);
- flag = 1;
- }
-
- if (nameid > 0)
- {
- memset (&item_tmp, 0, sizeof (item_tmp));
- struct item_data *item_data = itemdb_search (nameid);
- if (item_data->type == 4 || item_data->type == 5)
- {
- if (ref > 10)
- ref = 10;
- }
- else if (item_data->type == 7)
- {
- iden = 1;
- ref = 0;
- }
- else
- {
- iden = 1;
- ref = attr = 0;
- }
-
- item_tmp.nameid = nameid;
- if (!flag)
- item_tmp.identify = iden;
- else if (item_data->type == 4 || item_data->type == 5)
- item_tmp.identify = 0;
- item_tmp.refine = ref;
- item_tmp.attribute = attr;
- item_tmp.card[0] = c1;
- item_tmp.card[1] = c2;
- item_tmp.card[2] = c3;
- item_tmp.card[3] = c4;
- if ((flag = pc_additem (sd, &item_tmp, amount)))
+ return;
+ PickupFail flag;
+ if ((flag = pc_additem(sd, &item_tmp, amount)) != PickupFail::OKAY)
{
- clif_additem (sd, 0, 0, flag);
- map_addflooritem (&item_tmp, amount, sd->bl.m, sd->bl.x, sd->bl.y,
- NULL, NULL, NULL, 0);
+ clif_additem(sd, 0, 0, flag);
+ map_addflooritem(&item_tmp, amount,
+ sd->bl.m, sd->bl.x, sd->bl.y,
+ NULL, NULL, NULL);
}
}
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_makeitem (struct script_state *st)
+static
+void builtin_makeitem(ScriptState *st)
{
- int nameid, amount, flag = 0;
- int x, y, m;
+ int nameid, amount, flag = 0;
+ int x, y, m;
struct item item_tmp;
struct map_session_data *sd;
struct script_data *data;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
data = &(st->stack->stack_data[st->start + 2]);
- get_val (st, data);
+ get_val(st, data);
if (data->type == ScriptCode::STR || data->type == ScriptCode::CONSTSTR)
{
- const char *name = conv_str (st, data);
- struct item_data *item_data = itemdb_searchname (name);
+ const char *name = conv_str(st, data);
+ struct item_data *item_data = itemdb_searchname(name);
nameid = 512; //Apple Item ID
if (item_data)
nameid = item_data->nameid;
}
else
- nameid = conv_num (st, data);
+ nameid = conv_num(st, data);
- amount = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 4]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 6]));
+ amount = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 4]));
+ x = conv_num(st, &(st->stack->stack_data[st->start + 5]));
+ y = conv_num(st, &(st->stack->stack_data[st->start + 6]));
- if (sd && strcmp (mapname, "this") == 0)
+ if (sd && strcmp(mapname, "this") == 0)
m = sd->bl.m;
else
- m = map_mapname2mapid (mapname);
-
- if (nameid < 0)
- { // ランダム
- nameid = itemdb_searchrandomid (-nameid);
- flag = 1;
- }
+ m = map_mapname2mapid(mapname);
if (nameid > 0)
{
- memset (&item_tmp, 0, sizeof (item_tmp));
+ memset(&item_tmp, 0, sizeof(item_tmp));
item_tmp.nameid = nameid;
if (!flag)
item_tmp.identify = 1;
else
- item_tmp.identify = !itemdb_isequip3 (nameid);
+ item_tmp.identify = !itemdb_isequip3(nameid);
-// clif_additem(sd,0,0,flag);
- map_addflooritem (&item_tmp, amount, m, x, y, NULL, NULL, NULL, 0);
+ map_addflooritem(&item_tmp, amount, m, x, y, NULL, NULL, NULL);
}
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_delitem (struct script_state *st)
+static
+void builtin_delitem(ScriptState *st)
{
- int nameid = 0, amount, i;
+ int nameid = 0, amount, i;
struct map_session_data *sd;
struct script_data *data;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
data = &(st->stack->stack_data[st->start + 2]);
- get_val (st, data);
+ get_val(st, data);
if (data->type == ScriptCode::STR || data->type == ScriptCode::CONSTSTR)
{
- const char *name = conv_str (st, data);
- struct item_data *item_data = itemdb_searchname (name);
+ const char *name = conv_str(st, data);
+ struct item_data *item_data = itemdb_searchname(name);
//nameid=512;
if (item_data)
nameid = item_data->nameid;
}
else
- nameid = conv_num (st, data);
+ nameid = conv_num(st, data);
- amount = conv_num (st, &(st->stack->stack_data[st->start + 3]));
+ amount = conv_num(st, &(st->stack->stack_data[st->start + 3]));
if (nameid < 500 || amount <= 0)
- { //by Lupus. Don't run FOR if u got wrong item ID or amount<=0
- //printf("wrong item ID or amount<=0 : delitem %i,\n",nameid,amount);
- return 0;
+ {
+ //by Lupus. Don't run FOR if u got wrong item ID or amount<=0
+ //PRINTF("wrong item ID or amount<=0 : delitem %i,\n",nameid,amount);
+ return;
}
- sd = script_rid2sd (st);
for (i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].nameid <= 0
|| sd->inventory_data[i] == NULL
- || sd->inventory_data[i]->type != 7
+ || sd->inventory_data[i]->type != ItemType::_7
|| sd->status.inventory[i].amount <= 0)
continue;
}
@@ -3091,7 +2246,7 @@ int buildin_delitem (struct script_state *st)
{
if (sd->status.inventory[i].amount >= amount)
{
- pc_delitem (sd, i, amount, 0);
+ pc_delitem(sd, i, amount, 0);
break;
}
else
@@ -3099,71 +2254,67 @@ int buildin_delitem (struct script_state *st)
amount -= sd->status.inventory[i].amount;
if (amount == 0)
amount = sd->status.inventory[i].amount;
- pc_delitem (sd, i, amount, 0);
+ pc_delitem(sd, i, amount, 0);
break;
}
}
}
- return 0;
}
/*==========================================
*キャラ関係のパラメータ取得
*------------------------------------------
*/
-int buildin_readparam (struct script_state *st)
+static
+void builtin_readparam(ScriptState *st)
{
- int type;
struct map_session_data *sd;
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ SP type = SP(conv_num(st, &(st->stack->stack_data[st->start + 2])));
if (st->end > st->start + 3)
- sd = map_nick2sd (conv_str
- (st, &(st->stack->stack_data[st->start + 3])));
+ sd = map_nick2sd(conv_str(st, &(st->stack->stack_data[st->start + 3])));
else
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
if (sd == NULL)
{
- push_val (st->stack, ScriptCode::INT, -1);
- return 0;
+ push_val(st->stack, ScriptCode::INT, -1);
+ return;
}
- push_val (st->stack, ScriptCode::INT, pc_readparam (sd, type));
+ push_val(st->stack, ScriptCode::INT, pc_readparam(sd, type));
- return 0;
}
/*==========================================
*キャラ関係のID取得
*------------------------------------------
*/
-int buildin_getcharid (struct script_state *st)
+static
+void builtin_getcharid(ScriptState *st)
{
- int num;
+ int num;
struct map_session_data *sd;
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ num = conv_num(st, &(st->stack->stack_data[st->start + 2]));
if (st->end > st->start + 3)
- sd = map_nick2sd (conv_str
- (st, &(st->stack->stack_data[st->start + 3])));
+ sd = map_nick2sd(conv_str(st, &(st->stack->stack_data[st->start + 3])));
else
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
if (sd == NULL)
{
- push_val (st->stack, ScriptCode::INT, -1);
- return 0;
+ push_val(st->stack, ScriptCode::INT, -1);
+ return;
}
if (num == 0)
- push_val (st->stack, ScriptCode::INT, sd->status.char_id);
+ push_val(st->stack, ScriptCode::INT, sd->status.char_id);
if (num == 1)
- push_val (st->stack, ScriptCode::INT, sd->status.party_id);
+ push_val(st->stack, ScriptCode::INT, sd->status.party_id);
if (num == 2)
- push_val (st->stack, ScriptCode::INT, sd->status.guild_id);
+ push_val(st->stack, ScriptCode::INT, 0/*guild_id*/);
if (num == 3)
- push_val (st->stack, ScriptCode::INT, sd->status.account_id);
- return 0;
+ push_val(st->stack, ScriptCode::INT, sd->status.account_id);
}
/*==========================================
@@ -3171,737 +2322,252 @@ int buildin_getcharid (struct script_state *st)
*------------------------------------------
*/
static
-char *buildin_getpartyname_sub (int party_id)
+char *builtin_getpartyname_sub(int party_id)
{
struct party *p;
p = NULL;
- p = party_search (party_id);
+ p = party_search(party_id);
if (p != NULL)
{
char *buf;
- buf = (char *) calloc (24, 1);
- strcpy (buf, p->name);
+ buf = (char *) calloc(24, 1);
+ strcpy(buf, p->name);
return buf;
}
return 0;
}
-int buildin_getpartyname (struct script_state *st)
-{
- char *name;
- int party_id;
-
- party_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- name = buildin_getpartyname_sub (party_id);
- if (name != 0)
- push_str (st->stack, ScriptCode::STR, name);
- else
- push_str (st->stack, ScriptCode::CONSTSTR, "null");
-
- return 0;
-}
-
-/*==========================================
- *指定IDのPT人数とメンバーID取得
- *------------------------------------------
- */
-int buildin_getpartymember (struct script_state *st)
-{
- struct party *p;
- int i, j = 0;
-
- p = NULL;
- p = party_search (conv_num (st, &(st->stack->stack_data[st->start + 2])));
-
- if (p != NULL)
- {
- for (i = 0; i < MAX_PARTY; i++)
- {
- if (p->member[i].account_id)
- {
-// printf("name:%s %d\n",p->member[i].name,i);
- mapreg_setregstr (add_str ("$@partymembername$") + (i << 24),
- p->member[i].name);
- j++;
- }
- }
- }
- mapreg_setreg (add_str ("$@partymembercount"), j);
-
- return 0;
-}
-
-/*==========================================
- *指定IDのギルド名取得
- *------------------------------------------
- */
-static
-char *buildin_getguildname_sub (int guild_id)
-{
- struct guild *g = NULL;
- g = guild_search (guild_id);
-
- if (g != NULL)
- {
- char *buf;
- buf = (char *) calloc (24, 1);
- strcpy (buf, g->name);
- return buf;
- }
- return 0;
-}
-
-int buildin_getguildname (struct script_state *st)
-{
- char *name;
- int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- name = buildin_getguildname_sub (guild_id);
- if (name != 0)
- push_str (st->stack, ScriptCode::STR, name);
- else
- push_str (st->stack, ScriptCode::CONSTSTR, "null");
- return 0;
-}
-
-/*==========================================
- *指定IDのGuildMaster名取得
- *------------------------------------------
- */
-static
-char *buildin_getguildmaster_sub (int guild_id)
-{
- struct guild *g = NULL;
- g = guild_search (guild_id);
-
- if (g != NULL)
- {
- char *buf;
- buf = (char *) calloc (24, 1);
- strncpy (buf, g->master, 23);
- return buf;
- }
-
- return 0;
-}
-
-int buildin_getguildmaster (struct script_state *st)
-{
- char *master;
- int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- master = buildin_getguildmaster_sub (guild_id);
- if (master != 0)
- push_str (st->stack, ScriptCode::STR, master);
- else
- push_str (st->stack, ScriptCode::CONSTSTR, "null");
- return 0;
-}
-
-int buildin_getguildmasterid (struct script_state *st)
-{
- char *master;
- struct map_session_data *sd = NULL;
- int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- master = buildin_getguildmaster_sub (guild_id);
- if (master != 0)
- {
- if ((sd = map_nick2sd (master)) == NULL)
- {
- push_val (st->stack, ScriptCode::INT, 0);
- return 0;
- }
- push_val (st->stack, ScriptCode::INT, sd->status.char_id);
- }
- else
- {
- push_val (st->stack, ScriptCode::INT, 0);
- }
- return 0;
-}
-
/*==========================================
* キャラクタの名前
*------------------------------------------
*/
-int buildin_strcharinfo (struct script_state *st)
+static
+void builtin_strcharinfo(ScriptState *st)
{
struct map_session_data *sd;
- int num;
+ int num;
- sd = script_rid2sd (st);
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ sd = script_rid2sd(st);
+ num = conv_num(st, &(st->stack->stack_data[st->start + 2]));
if (num == 0)
{
char *buf;
- buf = (char *) calloc (24, 1);
- strncpy (buf, sd->status.name, 23);
- push_str (st->stack, ScriptCode::STR, buf);
+ buf = (char *) calloc(24, 1);
+ strncpy(buf, sd->status.name, 23);
+ push_str(st->stack, ScriptCode::STR, buf);
}
if (num == 1)
{
char *buf;
- buf = buildin_getpartyname_sub (sd->status.party_id);
+ buf = builtin_getpartyname_sub(sd->status.party_id);
if (buf != 0)
- push_str (st->stack, ScriptCode::STR, buf);
+ push_str(st->stack, ScriptCode::STR, buf);
else
- push_str (st->stack, ScriptCode::CONSTSTR, "");
+ push_str(st->stack, ScriptCode::CONSTSTR, "");
}
if (num == 2)
{
- char *buf;
- buf = buildin_getguildname_sub (sd->status.guild_id);
- if (buf != 0)
- push_str (st->stack, ScriptCode::STR, buf);
- else
- push_str (st->stack, ScriptCode::CONSTSTR, "");
+ // was: guild name
+ push_str(st->stack, ScriptCode::CONSTSTR, "");
}
- return 0;
}
-unsigned int equip[10] =
- { 0x0100, 0x0010, 0x0020, 0x0002, 0x0004, 0x0040, 0x0008, 0x0080, 0x0200,
- 0x0001
+// indexed by the equip_* in db/const.txt
+// TODO change to use EQUIP
+static
+EPOS equip[10] =
+{
+ EPOS::HAT,
+ EPOS::MISC1,
+ EPOS::SHIELD,
+ EPOS::WEAPON,
+ EPOS::GLOVES,
+ EPOS::SHOES,
+ EPOS::CAPE,
+ EPOS::MISC2,
+ EPOS::TORSO,
+ EPOS::LEGS,
};
/*==========================================
* GetEquipID(Pos); Pos: 1-10
*------------------------------------------
*/
-int buildin_getequipid (struct script_state *st)
+static
+void builtin_getequipid(ScriptState *st)
{
- int i, num;
+ int i, num;
struct map_session_data *sd;
struct item_data *item;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
if (sd == NULL)
{
- printf ("getequipid: sd == NULL\n");
- return 0;
+ PRINTF("getequipid: sd == NULL\n");
+ return;
}
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- i = pc_checkequip (sd, equip[num - 1]);
+ num = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ i = pc_checkequip(sd, equip[num - 1]);
if (i >= 0)
{
item = sd->inventory_data[i];
if (item)
- push_val (st->stack, ScriptCode::INT, item->nameid);
+ push_val(st->stack, ScriptCode::INT, item->nameid);
else
- push_val (st->stack, ScriptCode::INT, 0);
+ push_val(st->stack, ScriptCode::INT, 0);
}
else
{
- push_val (st->stack, ScriptCode::INT, -1);
+ push_val(st->stack, ScriptCode::INT, -1);
}
- return 0;
}
/*==========================================
* 装備名文字列(精錬メニュー用)
*------------------------------------------
*/
-int buildin_getequipname (struct script_state *st)
+static
+void builtin_getequipname(ScriptState *st)
{
- int i, num;
+ int i, num;
struct map_session_data *sd;
struct item_data *item;
char *buf;
- buf = (char *) calloc (64, 1);
- sd = script_rid2sd (st);
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- i = pc_checkequip (sd, equip[num - 1]);
+ buf = (char *) calloc(64, 1);
+ sd = script_rid2sd(st);
+ num = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ i = pc_checkequip(sd, equip[num - 1]);
if (i >= 0)
{
item = sd->inventory_data[i];
if (item)
- sprintf (buf, "%s-[%s]", pos[num - 1], item->jname);
+ sprintf(buf, "%s-[%s]", pos[num - 1], item->jname);
else
- sprintf (buf, "%s-[%s]", pos[num - 1], pos[10]);
- }
- else
- {
- sprintf (buf, "%s-[%s]", pos[num - 1], pos[10]);
- }
- push_str (st->stack, ScriptCode::STR, buf);
-
- return 0;
-}
-
-/*==========================================
- * getbrokenid [Valaris]
- *------------------------------------------
- */
-int buildin_getbrokenid (struct script_state *st)
-{
- int i, num, id = 0, brokencounter = 0;
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- for (i = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.inventory[i].broken == 1)
- {
- brokencounter++;
- if (num == brokencounter)
- {
- id = sd->status.inventory[i].nameid;
- break;
- }
- }
+ sprintf(buf, "%s-[%s]", pos[num - 1], pos[10]);
}
-
- push_val (st->stack, ScriptCode::INT, id);
-
- return 0;
-}
-
-/*==========================================
- * repair [Valaris]
- *------------------------------------------
- */
-int buildin_repair (struct script_state *st)
-{
- int i, num;
- int repaircounter = 0;
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- for (i = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.inventory[i].broken == 1)
- {
- repaircounter++;
- if (num == repaircounter)
- {
- sd->status.inventory[i].broken = 0;
- clif_equiplist (sd);
- clif_produceeffect (sd, 0, sd->status.inventory[i].nameid);
- clif_misceffect (&sd->bl, 3);
- clif_displaymessage (sd->fd, "Item has been repaired.");
- break;
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * 装備チェック
- *------------------------------------------
- */
-int buildin_getequipisequiped (struct script_state *st)
-{
- int i, num;
- struct map_session_data *sd;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (i >= 0)
- {
- push_val (st->stack, ScriptCode::INT, 1);
- }
- else
- {
- push_val (st->stack, ScriptCode::INT, 0);
- }
-
- return 0;
-}
-
-/*==========================================
- * 装備品精錬可能チェック
- *------------------------------------------
- */
-int buildin_getequipisenableref (struct script_state *st)
-{
- int i, num;
- struct map_session_data *sd;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (i >= 0 && num < 7 && sd->inventory_data[i]
- && (num != 1 || sd->inventory_data[i]->def > 1
- || (sd->inventory_data[i]->def == 1
- && sd->inventory_data[i]->equip_script == NULL)
- || (sd->inventory_data[i]->def <= 0
- && sd->inventory_data[i]->equip_script != NULL)))
- {
- push_val (st->stack, ScriptCode::INT, 1);
- }
- else
- {
- push_val (st->stack, ScriptCode::INT, 0);
- }
-
- return 0;
-}
-
-/*==========================================
- * 装備品鑑定チェック
- *------------------------------------------
- */
-int buildin_getequipisidentify (struct script_state *st)
-{
- int i, num;
- struct map_session_data *sd;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (i >= 0)
- push_val (st->stack, ScriptCode::INT, sd->status.inventory[i].identify);
- else
- push_val (st->stack, ScriptCode::INT, 0);
-
- return 0;
-}
-
-/*==========================================
- * 装備品精錬度
- *------------------------------------------
- */
-int buildin_getequiprefinerycnt (struct script_state *st)
-{
- int i, num;
- struct map_session_data *sd;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (i >= 0)
- push_val (st->stack, ScriptCode::INT, sd->status.inventory[i].refine);
- else
- push_val (st->stack, ScriptCode::INT, 0);
-
- return 0;
-}
-
-/*==========================================
- * 装備品武器LV
- *------------------------------------------
- */
-int buildin_getequipweaponlv (struct script_state *st)
-{
- int i, num;
- struct map_session_data *sd;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (i >= 0 && sd->inventory_data[i])
- push_val (st->stack, ScriptCode::INT, sd->inventory_data[i]->wlv);
else
- push_val (st->stack, ScriptCode::INT, 0);
-
- return 0;
-}
-
-/*==========================================
- * 装備品精錬成功率
- *------------------------------------------
- */
-int buildin_getequippercentrefinery (struct script_state *st)
-{
- int i, num;
- struct map_session_data *sd;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (i >= 0)
- push_val (st->stack, ScriptCode::INT,
- pc_percentrefinery (sd, &sd->status.inventory[i]));
- else
- push_val (st->stack, ScriptCode::INT, 0);
-
- return 0;
-}
-
-/*==========================================
- * 精錬成功
- *------------------------------------------
- */
-int buildin_successrefitem (struct script_state *st)
-{
- int i, num, ep;
- struct map_session_data *sd;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (i >= 0)
- {
- ep = sd->status.inventory[i].equip;
-
- sd->status.inventory[i].refine++;
- pc_unequipitem (sd, i, 0);
- clif_refine (sd->fd, sd, 0, i, sd->status.inventory[i].refine);
- clif_delitem (sd, i, 1);
- clif_additem (sd, i, 1, 0);
- pc_equipitem (sd, i, ep);
- clif_misceffect (&sd->bl, 3);
- }
-
- return 0;
-}
-
-/*==========================================
- * 精錬失敗
- *------------------------------------------
- */
-int buildin_failedrefitem (struct script_state *st)
-{
- int i, num;
- struct map_session_data *sd;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (i >= 0)
{
- sd->status.inventory[i].refine = 0;
- pc_unequipitem (sd, i, 0);
- // 精錬失敗エフェクトのパケット
- clif_refine (sd->fd, sd, 1, i, sd->status.inventory[i].refine);
- pc_delitem (sd, i, 1, 0);
- // 他の人にも失敗を通知
- clif_misceffect (&sd->bl, 2);
+ sprintf(buf, "%s-[%s]", pos[num - 1], pos[10]);
}
+ push_str(st->stack, ScriptCode::STR, buf);
- return 0;
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_statusup (struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- pc_statusup (sd, type);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_statusup2 (struct script_state *st)
-{
- int type, val;
- struct map_session_data *sd;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- val = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- sd = script_rid2sd (st);
- pc_statusup2 (sd, type, val);
-
- return 0;
-}
-
-/*==========================================
- * 装備品による能力値ボーナス
- *------------------------------------------
- */
-int buildin_bonus (struct script_state *st)
+static
+void builtin_statusup2(ScriptState *st)
{
- int type, val;
- struct map_session_data *sd;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- val = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- sd = script_rid2sd (st);
- pc_bonus (sd, type, val);
+ SP type = SP(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ int val = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ struct map_session_data *sd = script_rid2sd(st);
+ pc_statusup2(sd, type, val);
- return 0;
}
/*==========================================
* 装備品による能力値ボーナス
*------------------------------------------
*/
-int buildin_bonus2 (struct script_state *st)
+static
+void builtin_bonus(ScriptState *st)
{
- int type, type2, val;
- struct map_session_data *sd;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- type2 = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- val = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- sd = script_rid2sd (st);
- pc_bonus2 (sd, type, type2, val);
+ SP type = SP(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ int val = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ struct map_session_data *sd = script_rid2sd(st);
+ pc_bonus(sd, type, val);
- return 0;
}
/*==========================================
* 装備品による能力値ボーナス
*------------------------------------------
*/
-int buildin_bonus3 (struct script_state *st)
+static
+void builtin_bonus2(ScriptState *st)
{
- int type, type2, type3, val;
- struct map_session_data *sd;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- type2 = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- type3 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- val = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- sd = script_rid2sd (st);
- pc_bonus3 (sd, type, type2, type3, val);
+ SP type = SP(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ int type2 = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ int val = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ struct map_session_data *sd = script_rid2sd(st);
+ pc_bonus2(sd, type, type2, val);
- return 0;
}
/*==========================================
* スキル所得
*------------------------------------------
*/
-int buildin_skill (struct script_state *st)
+static
+void builtin_skill(ScriptState *st)
{
- int id, level, flag = 1;
+ int level, flag = 1;
struct map_session_data *sd;
- id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- level = conv_num (st, &(st->stack->stack_data[st->start + 3]));
+ SkillID id = SkillID(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ level = conv_num(st, &(st->stack->stack_data[st->start + 3]));
if (st->end > st->start + 4)
- flag = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- sd = script_rid2sd (st);
- pc_skill (sd, id, level, flag);
- clif_skillinfoblock (sd);
+ flag = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ sd = script_rid2sd(st);
+ pc_skill(sd, id, level, flag);
+ clif_skillinfoblock(sd);
- return 0;
}
/*==========================================
* [Fate] Sets the skill level permanently
*------------------------------------------
*/
-int buildin_setskill (struct script_state *st)
+static
+void builtin_setskill(ScriptState *st)
{
- int id, level;
+ int level;
struct map_session_data *sd;
- id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- level = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- sd = script_rid2sd (st);
+ SkillID id = static_cast<SkillID>(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ level = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ sd = script_rid2sd(st);
- sd->status.skill[id].id = level ? id : 0;
sd->status.skill[id].lv = level;
- clif_skillinfoblock (sd);
- return 0;
-}
-
-/*==========================================
- * ギルドスキル取得
- *------------------------------------------
- */
-int buildin_guildskill (struct script_state *st)
-{
- int id, level;
- struct map_session_data *sd;
- int i = 0;
-
- id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- level = conv_num (st, &(st->stack->stack_data[st->start + 3]));
-// if( st->end>st->start+4 )
-// flag=conv_num(st,&(st->stack->stack_data[st->start+4]) );
- sd = script_rid2sd (st);
- for (i = 0; i < level; i++)
- guild_skillup (sd, id);
-
- return 0;
+ clif_skillinfoblock(sd);
}
/*==========================================
* スキルレベル所得
*------------------------------------------
*/
-int buildin_getskilllv (struct script_state *st)
-{
- int id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- push_val (st->stack, ScriptCode::INT, pc_checkskill (script_rid2sd (st), id));
- return 0;
-}
-
-/*==========================================
- * getgdskilllv(Guild_ID, Skill_ID);
- * skill_id = 10000 : GD_APPROVAL
- * 10001 : GD_KAFRACONTACT
- * 10002 : GD_GUARDIANRESEARCH
- * 10003 : GD_CHARISMA
- * 10004 : GD_EXTENSION
- *------------------------------------------
- */
-int buildin_getgdskilllv (struct script_state *st)
-{
- int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- int skill_id = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- struct guild *g = guild_search (guild_id);
- push_val (st->stack, ScriptCode::INT,
- (g == NULL) ? -1 : guild_checkskill (g, skill_id));
- return 0;
-/*
- struct map_session_data *sd=NULL;
- struct guild *g=NULL;
- int skill_id;
-
- skill_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- if(sd && sd->status.guild_id > 0) g=guild_search(sd->status.guild_id);
- if(sd && g) {
- push_val(st->stack,ScriptCode::INT, guild_checkskill(g,skill_id+9999) );
- } else {
- push_val(st->stack,ScriptCode::INT,-1);
- }
- return 0;
-*/
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_basicskillcheck (struct script_state *st)
+static
+void builtin_getskilllv(ScriptState *st)
{
- push_val (st->stack, ScriptCode::INT, battle_config.basic_skill_check);
- return 0;
+ SkillID id = SkillID(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ push_val(st->stack, ScriptCode::INT, pc_checkskill(script_rid2sd(st), id));
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_getgmlevel (struct script_state *st)
+static
+void builtin_getgmlevel(ScriptState *st)
{
- push_val (st->stack, ScriptCode::INT, pc_isGM (script_rid2sd (st)));
- return 0;
+ push_val(st->stack, ScriptCode::INT, pc_isGM(script_rid2sd(st)));
}
/*==========================================
*
*------------------------------------------
*/
-int buildin_end (struct script_state *st)
+static
+void builtin_end(ScriptState *st)
{
st->state = END;
- return 0;
}
/*==========================================
@@ -3909,15 +2575,15 @@ int buildin_end (struct script_state *st)
*------------------------------------------
*/
-int buildin_getopt2 (struct script_state *st)
+static
+void builtin_getopt2(ScriptState *st)
{
struct map_session_data *sd;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
- push_val (st->stack, ScriptCode::INT, sd->opt2);
+ push_val(st->stack, ScriptCode::INT, uint16_t(sd->opt2));
- return 0;
}
/*==========================================
@@ -3925,185 +2591,34 @@ int buildin_getopt2 (struct script_state *st)
*------------------------------------------
*/
-int buildin_setopt2 (struct script_state *st)
+static
+void builtin_setopt2(ScriptState *st)
{
- int new_opt2;
struct map_session_data *sd;
- new_opt2 = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
+ Opt2 new_opt2 = Opt2(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ sd = script_rid2sd(st);
if (new_opt2 == sd->opt2)
- return 0;
+ return;
sd->opt2 = new_opt2;
- clif_changeoption (&sd->bl);
- pc_calcstatus (sd, 0);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_checkoption (struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
-
- if (sd->status.option & type)
- {
- push_val (st->stack, ScriptCode::INT, 1);
- }
- else
- {
- push_val (st->stack, ScriptCode::INT, 0);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_setoption (struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- pc_setoption (sd, type);
-
- return 0;
-}
-
-/*==========================================
- * Checkcart [Valaris]
- *------------------------------------------
- */
-
-int buildin_checkcart (struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
+ clif_changeoption(&sd->bl);
+ pc_calcstatus(sd, 0);
- if (pc_iscarton (sd))
- {
- push_val (st->stack, ScriptCode::INT, 1);
- }
- else
- {
- push_val (st->stack, ScriptCode::INT, 0);
- }
- return 0;
}
/*==========================================
- * カートを付ける
+ * セーブポイントの保存
*------------------------------------------
*/
-int buildin_setcart (struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
- pc_setcart (sd, 1);
-
- return 0;
-}
-
-/*==========================================
- * checkfalcon [Valaris]
- *------------------------------------------
- */
-
-int buildin_checkfalcon (struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
-
- if (pc_isfalcon (sd))
- {
- push_val (st->stack, ScriptCode::INT, 1);
- }
- else
- {
- push_val (st->stack, ScriptCode::INT, 0);
- }
-
- return 0;
-}
-
-/*==========================================
- * 鷹を付ける
- *------------------------------------------
- */
-int buildin_setfalcon (struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
- pc_setfalcon (sd);
-
- return 0;
-}
-
-/*==========================================
- * Checkcart [Valaris]
- *------------------------------------------
- */
-
-int buildin_checkriding (struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
-
- if (pc_isriding (sd))
- {
- push_val (st->stack, ScriptCode::INT, 1);
- }
- else
- {
- push_val (st->stack, ScriptCode::INT, 0);
- }
-
- return 0;
-}
-
-/*==========================================
- * ペコペコ乗り
- *------------------------------------------
- */
-int buildin_setriding (struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
- pc_setriding (sd);
-
- return 0;
-}
-
-/*==========================================
- * セーブポイントの保存
- *------------------------------------------
- */
-int buildin_savepoint (struct script_state *st)
+static
+void builtin_savepoint(ScriptState *st)
{
- int x, y;
+ int x, y;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- pc_setsavepoint (script_rid2sd (st), str, x, y);
- return 0;
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ pc_setsavepoint(script_rid2sd(st), str, x, y);
}
/*==========================================
@@ -4116,36 +2631,32 @@ int buildin_savepoint (struct script_state *st)
* other value.
*------------------------------------------
*/
-int buildin_gettimetick (struct script_state *st) /* Asgard Version */
+static
+void builtin_gettimetick(ScriptState *st) /* Asgard Version */
{
- int type;
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ int type;
+ type = conv_num(st, &(st->stack->stack_data[st->start + 2]));
switch (type)
{
- /* Number of seconds elapsed today (0-86399, 00:00:00-23:59:59). */
+ /* Number of seconds elapsed today(0-86399, 00:00:00-23:59:59). */
case 1:
{
- time_t timer;
- struct tm *t;
-
- time (&timer);
- t = gmtime (&timer);
- push_val (st->stack, ScriptCode::INT,
- ((t->tm_hour) * 3600 + (t->tm_min) * 60 + t->tm_sec));
+ struct tm t = TimeT::now();
+ push_val(st->stack, ScriptCode::INT,
+ t.tm_hour * 3600 + t.tm_min * 60 + t.tm_sec);
break;
}
/* Seconds since Unix epoch. */
case 2:
- push_val (st->stack, ScriptCode::INT, (int) time (NULL));
+ push_val(st->stack, ScriptCode::INT, static_cast<time_t>(TimeT::now()));
break;
- /* System tick (unsigned int, and yes, it will wrap). */
+ /* System tick(unsigned int, and yes, it will wrap). */
case 0:
default:
- push_val (st->stack, ScriptCode::INT, gettick ());
+ push_val(st->stack, ScriptCode::INT, gettick().time_since_epoch().count());
break;
}
- return 0;
}
/*==========================================
@@ -4155,185 +2666,144 @@ int buildin_gettimetick (struct script_state *st) /* Asgard Version */
* 7: Year
*------------------------------------------
*/
-int buildin_gettime (struct script_state *st) /* Asgard Version */
+static
+void builtin_gettime(ScriptState *st) /* Asgard Version */
{
- int type;
- time_t timer;
- struct tm *t;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ int type = conv_num(st, &(st->stack->stack_data[st->start + 2]));
- time (&timer);
- t = gmtime (&timer);
+ struct tm t = TimeT::now();
switch (type)
{
case 1: //Sec(0~59)
- push_val (st->stack, ScriptCode::INT, t->tm_sec);
+ push_val(st->stack, ScriptCode::INT, t.tm_sec);
break;
case 2: //Min(0~59)
- push_val (st->stack, ScriptCode::INT, t->tm_min);
+ push_val(st->stack, ScriptCode::INT, t.tm_min);
break;
case 3: //Hour(0~23)
- push_val (st->stack, ScriptCode::INT, t->tm_hour);
+ push_val(st->stack, ScriptCode::INT, t.tm_hour);
break;
case 4: //WeekDay(0~6)
- push_val (st->stack, ScriptCode::INT, t->tm_wday);
+ push_val(st->stack, ScriptCode::INT, t.tm_wday);
break;
case 5: //MonthDay(01~31)
- push_val (st->stack, ScriptCode::INT, t->tm_mday);
+ push_val(st->stack, ScriptCode::INT, t.tm_mday);
break;
case 6: //Month(01~12)
- push_val (st->stack, ScriptCode::INT, t->tm_mon + 1);
+ push_val(st->stack, ScriptCode::INT, t.tm_mon + 1);
break;
case 7: //Year(20xx)
- push_val (st->stack, ScriptCode::INT, t->tm_year + 1900);
+ push_val(st->stack, ScriptCode::INT, t.tm_year + 1900);
break;
default: //(format error)
- push_val (st->stack, ScriptCode::INT, -1);
+ push_val(st->stack, ScriptCode::INT, -1);
break;
}
- return 0;
}
/*==========================================
* GetTimeStr("TimeFMT", Length);
*------------------------------------------
*/
-int buildin_gettimestr (struct script_state *st)
+static
+void builtin_gettimestr(ScriptState *st)
{
- char *tmpstr;
- int maxlen;
- time_t now = time (NULL);
+ struct tm now = TimeT::now();
- const char *fmtstr = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- maxlen = conv_num (st, &(st->stack->stack_data[st->start + 3]));
+ const char *fmtstr = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ int maxlen = conv_num(st, &(st->stack->stack_data[st->start + 3]));
- tmpstr = (char *) calloc (maxlen + 1, 1);
- strftime (tmpstr, maxlen, fmtstr, gmtime (&now));
- tmpstr[maxlen] = '\0';
+ char *tmpstr = (char *) calloc(maxlen + 1, 1);
+ strftime(tmpstr, maxlen, fmtstr, &now);
- push_str (st->stack, ScriptCode::STR, tmpstr);
- return 0;
+ push_str(st->stack, ScriptCode::STR, tmpstr);
}
/*==========================================
* カプラ倉庫を開く
*------------------------------------------
*/
-int buildin_openstorage (struct script_state *st)
+static
+void builtin_openstorage(ScriptState *st)
{
// int sync = 0;
// if (st->end >= 3) sync = conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
// if (sync) {
st->state = STOP;
sd->npc_flags.storage = 1;
// } else st->state = END;
- storage_storageopen (sd);
- return 0;
-}
-
-int buildin_guildopenstorage (struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd (st);
- int ret;
- st->state = STOP;
- ret = storage_guild_storageopen (sd);
- push_val (st->stack, ScriptCode::INT, ret);
- return 0;
-}
-
-/*==========================================
- * アイテムによるスキル発動
- *------------------------------------------
- */
-int buildin_itemskill (struct script_state *st)
-{
- int id, lv;
- struct map_session_data *sd = script_rid2sd (st);
-
- id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- lv = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 4]));
-
- // 詠唱中にスキルアイテムは使用できない
- if (sd->skilltimer != -1)
- return 0;
-
- sd->skillitem = id;
- sd->skillitemlv = lv;
- clif_item_skill (sd, id, lv, str);
- return 0;
+ storage_storageopen(sd);
}
/*==========================================
* NPCで経験値上げる
*------------------------------------------
*/
-int buildin_getexp (struct script_state *st)
+static
+void builtin_getexp(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
- int base = 0, job = 0;
+ struct map_session_data *sd = script_rid2sd(st);
+ int base = 0, job = 0;
- base = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- job = conv_num (st, &(st->stack->stack_data[st->start + 3]));
+ base = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ job = conv_num(st, &(st->stack->stack_data[st->start + 3]));
if (base < 0 || job < 0)
- return 0;
+ return;
if (sd)
- pc_gainexp_reason (sd, base, job, PC_GAINEXP_REASON_SCRIPT);
+ pc_gainexp_reason(sd, base, job, PC_GAINEXP_REASON::SCRIPT);
- return 0;
}
/*==========================================
* モンスター発生
*------------------------------------------
*/
-int buildin_monster (struct script_state *st)
+static
+void builtin_monster(ScriptState *st)
{
- int mob_class, amount, x, y;
+ int mob_class, amount, x, y;
const char *event = "";
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 5]));
- mob_class = conv_num (st, &(st->stack->stack_data[st->start + 6]));
- amount = conv_num (st, &(st->stack->stack_data[st->start + 7]));
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 5]));
+ mob_class = conv_num(st, &(st->stack->stack_data[st->start + 6]));
+ amount = conv_num(st, &(st->stack->stack_data[st->start + 7]));
if (st->end > st->start + 8)
- event = conv_str (st, &(st->stack->stack_data[st->start + 8]));
+ event = conv_str(st, &(st->stack->stack_data[st->start + 8]));
- mob_once_spawn (map_id2sd (st->rid), mapname, x, y, str, mob_class, amount,
+ mob_once_spawn(map_id2sd(st->rid), mapname, x, y, str, mob_class, amount,
event);
- return 0;
}
/*==========================================
* モンスター発生
*------------------------------------------
*/
-int buildin_areamonster (struct script_state *st)
+static
+void builtin_areamonster(ScriptState *st)
{
- int mob_class, amount, x0, y0, x1, y1;
+ int mob_class, amount, x0, y0, x1, y1;
const char *event = "";
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x0 = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y0 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- x1 = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- y1 = conv_num (st, &(st->stack->stack_data[st->start + 6]));
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 7]));
- mob_class = conv_num (st, &(st->stack->stack_data[st->start + 8]));
- amount = conv_num (st, &(st->stack->stack_data[st->start + 9]));
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x0 = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y0 = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ x1 = conv_num(st, &(st->stack->stack_data[st->start + 5]));
+ y1 = conv_num(st, &(st->stack->stack_data[st->start + 6]));
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 7]));
+ mob_class = conv_num(st, &(st->stack->stack_data[st->start + 8]));
+ amount = conv_num(st, &(st->stack->stack_data[st->start + 9]));
if (st->end > st->start + 10)
- event = conv_str (st, &(st->stack->stack_data[st->start + 10]));
+ event = conv_str(st, &(st->stack->stack_data[st->start + 10]));
- mob_once_spawn_area (map_id2sd (st->rid), mapname, x0, y0, x1, y1, str, mob_class,
+ mob_once_spawn_area(map_id2sd(st->rid), mapname, x0, y0, x1, y1, str, mob_class,
amount, event);
- return 0;
}
/*==========================================
@@ -4341,191 +2811,147 @@ int buildin_areamonster (struct script_state *st)
*------------------------------------------
*/
static
-int buildin_killmonster_sub (struct block_list *bl, va_list ap)
+void builtin_killmonster_sub(struct block_list *bl, const char *event, int allflag)
{
- char *event = va_arg (ap, char *);
- int allflag = va_arg (ap, int);
-
if (!allflag)
{
- if (strcmp (event, ((struct mob_data *) bl)->npc_event) == 0)
- mob_delete ((struct mob_data *) bl);
- return 0;
+ if (strcmp(event, ((struct mob_data *) bl)->npc_event) == 0)
+ mob_delete((struct mob_data *) bl);
+ return;
}
else if (allflag)
{
- if (((struct mob_data *) bl)->spawndelay1 == -1
- && ((struct mob_data *) bl)->spawndelay2 == -1)
- mob_delete ((struct mob_data *) bl);
- return 0;
+ if (((struct mob_data *) bl)->spawndelay1 == static_cast<interval_t>(-1)
+ && ((struct mob_data *) bl)->spawndelay2 == static_cast<interval_t>(-1))
+ mob_delete((struct mob_data *) bl);
+ return;
}
- return 0;
}
-int buildin_killmonster (struct script_state *st)
+static
+void builtin_killmonster(ScriptState *st)
{
- int m, allflag = 0;
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- const char *event = conv_str (st, &(st->stack->stack_data[st->start + 3]));
- if (strcmp (event, "All") == 0)
+ int m, allflag = 0;
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ const char *event = conv_str(st, &(st->stack->stack_data[st->start + 3]));
+ if (strcmp(event, "All") == 0)
allflag = 1;
- if ((m = map_mapname2mapid (mapname)) < 0)
- return 0;
- map_foreachinarea (buildin_killmonster_sub,
- m, 0, 0, map[m].xs, map[m].ys, BL_MOB, event, allflag);
- return 0;
+ if ((m = map_mapname2mapid(mapname)) < 0)
+ return;
+ map_foreachinarea(std::bind(builtin_killmonster_sub, ph::_1, event, allflag),
+ m, 0, 0, map[m].xs, map[m].ys, BL::MOB);
}
static
-int buildin_killmonsterall_sub (struct block_list *bl, va_list ap)
+void builtin_killmonsterall_sub(struct block_list *bl)
{
- mob_delete ((struct mob_data *) bl);
- return 0;
+ mob_delete((struct mob_data *) bl);
}
-int buildin_killmonsterall (struct script_state *st)
+static
+void builtin_killmonsterall(ScriptState *st)
{
- int m;
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
-
- if ((m = map_mapname2mapid (mapname)) < 0)
- return 0;
- map_foreachinarea (buildin_killmonsterall_sub,
- m, 0, 0, map[m].xs, map[m].ys, BL_MOB);
- return 0;
-}
+ int m;
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 2]));
-/*==========================================
- * イベント実行
- *------------------------------------------
- */
-int buildin_doevent (struct script_state *st)
-{
- const char *event = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- npc_event (map_id2sd (st->rid), event, 0);
- return 0;
+ if ((m = map_mapname2mapid(mapname)) < 0)
+ return;
+ map_foreachinarea(builtin_killmonsterall_sub,
+ m, 0, 0, map[m].xs, map[m].ys, BL::MOB);
}
/*==========================================
* NPC主体イベント実行
*------------------------------------------
*/
-int buildin_donpcevent (struct script_state *st)
+static
+void builtin_donpcevent(ScriptState *st)
{
- const char *event = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- npc_event_do (event);
- return 0;
+ const char *event = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ npc_event_do(event);
}
/*==========================================
* イベントタイマー追加
*------------------------------------------
*/
-int buildin_addtimer (struct script_state *st)
-{
- int tick;
- tick = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- const char *event = conv_str (st, &(st->stack->stack_data[st->start + 3]));
- pc_addeventtimer (script_rid2sd (st), tick, event);
- return 0;
-}
-
-/*==========================================
- * イベントタイマー削除
- *------------------------------------------
- */
-int buildin_deltimer (struct script_state *st)
-{
- const char *event = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- pc_deleventtimer (script_rid2sd (st), event);
- return 0;
-}
-
-/*==========================================
- * イベントタイマーのカウント値追加
- *------------------------------------------
- */
-int buildin_addtimercount (struct script_state *st)
+static
+void builtin_addtimer(ScriptState *st)
{
- int tick;
- const char *event = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- tick = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- pc_addeventtimercount (script_rid2sd (st), event, tick);
- return 0;
+ interval_t tick = static_cast<interval_t>(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ const char *event = conv_str(st, &(st->stack->stack_data[st->start + 3]));
+ pc_addeventtimer(script_rid2sd(st), tick, event);
}
/*==========================================
* NPCタイマー初期化
*------------------------------------------
*/
-int buildin_initnpctimer (struct script_state *st)
+static
+void builtin_initnpctimer(ScriptState *st)
{
struct npc_data *nd;
if (st->end > st->start + 2)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 2])));
+ nd = npc_name2id(conv_str(st, &(st->stack->stack_data[st->start + 2])));
else
- nd = (struct npc_data *) map_id2bl (st->oid);
+ nd = (struct npc_data *) map_id2bl(st->oid);
- npc_settimerevent_tick (nd, 0);
- npc_timerevent_start (nd);
- return 0;
+ npc_settimerevent_tick(nd, interval_t::zero());
+ npc_timerevent_start(nd);
}
/*==========================================
* NPCタイマー開始
*------------------------------------------
*/
-int buildin_startnpctimer (struct script_state *st)
+static
+void builtin_startnpctimer(ScriptState *st)
{
struct npc_data *nd;
if (st->end > st->start + 2)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 2])));
+ nd = npc_name2id(conv_str(st, &(st->stack->stack_data[st->start + 2])));
else
- nd = (struct npc_data *) map_id2bl (st->oid);
+ nd = (struct npc_data *) map_id2bl(st->oid);
- npc_timerevent_start (nd);
- return 0;
+ npc_timerevent_start(nd);
}
/*==========================================
* NPCタイマー停止
*------------------------------------------
*/
-int buildin_stopnpctimer (struct script_state *st)
+static
+void builtin_stopnpctimer(ScriptState *st)
{
struct npc_data *nd;
if (st->end > st->start + 2)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 2])));
+ nd = npc_name2id(conv_str(st, &(st->stack->stack_data[st->start + 2])));
else
- nd = (struct npc_data *) map_id2bl (st->oid);
+ nd = (struct npc_data *) map_id2bl(st->oid);
- npc_timerevent_stop (nd);
- return 0;
+ npc_timerevent_stop(nd);
}
/*==========================================
* NPCタイマー情報所得
*------------------------------------------
*/
-int buildin_getnpctimer (struct script_state *st)
+static
+void builtin_getnpctimer(ScriptState *st)
{
struct npc_data *nd;
- int type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- int val = 0;
+ int type = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ int val = 0;
if (st->end > st->start + 3)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 3])));
+ nd = npc_name2id(conv_str(st, &(st->stack->stack_data[st->start + 3])));
else
- nd = (struct npc_data *) map_id2bl (st->oid);
+ nd = (struct npc_data *) map_id2bl(st->oid);
switch (type)
{
case 0:
- val = npc_gettimerevent_tick (nd);
+ val = (int) npc_gettimerevent_tick(nd).count();
break;
case 1:
val = (nd->u.scr.nexttimer >= 0);
@@ -4534,48 +2960,45 @@ int buildin_getnpctimer (struct script_state *st)
val = nd->u.scr.timeramount;
break;
}
- push_val (st->stack, ScriptCode::INT, val);
- return 0;
+ push_val(st->stack, ScriptCode::INT, val);
}
/*==========================================
* NPCタイマー値設定
*------------------------------------------
*/
-int buildin_setnpctimer (struct script_state *st)
+static
+void builtin_setnpctimer(ScriptState *st)
{
- int tick;
struct npc_data *nd;
- tick = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ interval_t tick = static_cast<interval_t>(conv_num(st, &(st->stack->stack_data[st->start + 2])));
if (st->end > st->start + 3)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 3])));
+ nd = npc_name2id(conv_str(st, &(st->stack->stack_data[st->start + 3])));
else
- nd = (struct npc_data *) map_id2bl (st->oid);
+ nd = (struct npc_data *) map_id2bl(st->oid);
- npc_settimerevent_tick (nd, tick);
- return 0;
+ npc_settimerevent_tick(nd, tick);
}
/*==========================================
* 天の声アナウンス
*------------------------------------------
*/
-int buildin_announce (struct script_state *st)
+static
+void builtin_announce(ScriptState *st)
{
- int flag;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- flag = conv_num (st, &(st->stack->stack_data[st->start + 3]));
+ int flag;
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ flag = conv_num(st, &(st->stack->stack_data[st->start + 3]));
if (flag & 0x0f)
{
- struct block_list *bl = (flag & 0x08) ? map_id2bl (st->oid) :
- (struct block_list *) script_rid2sd (st);
- clif_GMmessage (bl, str, strlen (str) + 1, flag);
+ struct block_list *bl = (flag & 0x08) ? map_id2bl(st->oid) :
+ (struct block_list *) script_rid2sd(st);
+ clif_GMmessage(bl, str, flag);
}
else
- intif_GMmessage (str, strlen (str) + 1, flag);
- return 0;
+ intif_GMmessage(str, flag);
}
/*==========================================
@@ -4583,96 +3006,63 @@ int buildin_announce (struct script_state *st)
*------------------------------------------
*/
static
-int buildin_mapannounce_sub (struct block_list *bl, va_list ap)
+void builtin_mapannounce_sub(struct block_list *bl, const char *str, int flag)
{
- char *str;
- int len, flag;
- str = va_arg (ap, char *);
- len = va_arg (ap, int);
- flag = va_arg (ap, int);
- clif_GMmessage (bl, str, len, flag | 3);
- return 0;
+ clif_GMmessage(bl, str, flag | 3);
}
-int buildin_mapannounce (struct script_state *st)
-{
- int flag, m;
-
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 3]));
- flag = conv_num (st, &(st->stack->stack_data[st->start + 4]));
-
- if ((m = map_mapname2mapid (mapname)) < 0)
- return 0;
- map_foreachinarea (buildin_mapannounce_sub,
- m, 0, 0, map[m].xs, map[m].ys, BL_PC, str,
- strlen (str) + 1, flag & 0x10);
- return 0;
-}
-
-/*==========================================
- * 天の声アナウンス(特定エリア)
- *------------------------------------------
- */
-int buildin_areaannounce (struct script_state *st)
+static
+void builtin_mapannounce(ScriptState *st)
{
- int flag, m;
- int x0, y0, x1, y1;
+ int flag, m;
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x0 = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y0 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- x1 = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- y1 = conv_num (st, &(st->stack->stack_data[st->start + 6]));
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 7]));
- flag = conv_num (st, &(st->stack->stack_data[st->start + 8]));
-
- if ((m = map_mapname2mapid (mapname)) < 0)
- return 0;
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 3]));
+ flag = conv_num(st, &(st->stack->stack_data[st->start + 4]));
- map_foreachinarea (buildin_mapannounce_sub,
- m, x0, y0, x1, y1, BL_PC, str, strlen (str) + 1,
- flag & 0x10);
- return 0;
+ if ((m = map_mapname2mapid(mapname)) < 0)
+ return;
+ map_foreachinarea(std::bind(builtin_mapannounce_sub, ph::_1, str, flag & 0x10),
+ m, 0, 0, map[m].xs, map[m].ys, BL::PC);
}
/*==========================================
* ユーザー数所得
*------------------------------------------
*/
-int buildin_getusers (struct script_state *st)
+static
+void builtin_getusers(ScriptState *st)
{
- int flag = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- struct block_list *bl = map_id2bl ((flag & 0x08) ? st->oid : st->rid);
- int val = 0;
+ int flag = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ struct block_list *bl = map_id2bl((flag & 0x08) ? st->oid : st->rid);
+ int val = 0;
switch (flag & 0x07)
{
case 0:
val = map[bl->m].users;
break;
case 1:
- val = map_getusers ();
+ val = map_getusers();
break;
}
- push_val (st->stack, ScriptCode::INT, val);
- return 0;
+ push_val(st->stack, ScriptCode::INT, val);
}
/*==========================================
* マップ指定ユーザー数所得
*------------------------------------------
*/
-int buildin_getmapusers (struct script_state *st)
+static
+void builtin_getmapusers(ScriptState *st)
{
- int m;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- if ((m = map_mapname2mapid (str)) < 0)
+ int m;
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ if ((m = map_mapname2mapid(str)) < 0)
{
- push_val (st->stack, ScriptCode::INT, -1);
- return 0;
+ push_val(st->stack, ScriptCode::INT, -1);
+ return;
}
- push_val (st->stack, ScriptCode::INT, map[m].users);
- return 0;
+ push_val(st->stack, ScriptCode::INT, map[m].users);
}
/*==========================================
@@ -4680,45 +3070,41 @@ int buildin_getmapusers (struct script_state *st)
*------------------------------------------
*/
static
-int buildin_getareausers_sub (struct block_list *bl, va_list ap)
+void builtin_getareausers_sub(struct block_list *, int *users)
{
- int *users = va_arg (ap, int *);
(*users)++;
- return 0;
}
static
-int buildin_getareausers_living_sub (struct block_list *bl, va_list ap)
+void builtin_getareausers_living_sub(struct block_list *bl, int *users)
{
- int *users = va_arg (ap, int *);
if (!pc_isdead((struct map_session_data *)bl))
(*users)++;
- return 0;
}
-int buildin_getareausers (struct script_state *st)
+static
+void builtin_getareausers(ScriptState *st)
{
- int m, x0, y0, x1, y1, users = 0;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x0 = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y0 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- x1 = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- y1 = conv_num (st, &(st->stack->stack_data[st->start + 6]));
+ int m, x0, y0, x1, y1, users = 0;
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x0 = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y0 = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ x1 = conv_num(st, &(st->stack->stack_data[st->start + 5]));
+ y1 = conv_num(st, &(st->stack->stack_data[st->start + 6]));
int living = 0;
if (st->end > st->start + 7)
{
- living = conv_num (st, &(st->stack->stack_data[st->start + 7]));
+ living = conv_num(st, &(st->stack->stack_data[st->start + 7]));
}
- if ((m = map_mapname2mapid (str)) < 0)
+ if ((m = map_mapname2mapid(str)) < 0)
{
- push_val (st->stack, ScriptCode::INT, -1);
- return 0;
+ push_val(st->stack, ScriptCode::INT, -1);
+ return;
}
- map_foreachinarea (living ? buildin_getareausers_living_sub: buildin_getareausers_sub,
- m, x0, y0, x1, y1, BL_PC, &users);
- push_val (st->stack, ScriptCode::INT, users);
- return 0;
+ map_foreachinarea(std::bind(living ? builtin_getareausers_living_sub: builtin_getareausers_sub, ph::_1, &users),
+ m, x0, y0, x1, y1, BL::PC);
+ push_val(st->stack, ScriptCode::INT, users);
}
/*==========================================
@@ -4726,23 +3112,18 @@ int buildin_getareausers (struct script_state *st)
*------------------------------------------
*/
static
-int buildin_getareadropitem_sub (struct block_list *bl, va_list ap)
+void builtin_getareadropitem_sub(struct block_list *bl, int item, int *amount)
{
- int item = va_arg (ap, int);
- int *amount = va_arg (ap, int *);
struct flooritem_data *drop = (struct flooritem_data *) bl;
if (drop->item_data.nameid == item)
(*amount) += drop->item_data.amount;
- return 0;
}
static
-int buildin_getareadropitem_sub_anddelete (struct block_list *bl, va_list ap)
+void builtin_getareadropitem_sub_anddelete(struct block_list *bl, int item, int *amount)
{
- int item = va_arg (ap, int);
- int *amount = va_arg (ap, int *);
struct flooritem_data *drop = (struct flooritem_data *) bl;
if (drop->item_data.nameid == item) {
@@ -4750,241 +3131,122 @@ int buildin_getareadropitem_sub_anddelete (struct block_list *bl, va_list ap)
clif_clearflooritem(drop, 0);
map_delobject(drop->bl.id, drop->bl.type);
}
- return 0;
}
-int buildin_getareadropitem (struct script_state *st)
+static
+void builtin_getareadropitem(ScriptState *st)
{
- int m, x0, y0, x1, y1, item, amount = 0, delitems = 0;
+ int m, x0, y0, x1, y1, item, amount = 0, delitems = 0;
struct script_data *data;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x0 = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y0 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- x1 = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- y1 = conv_num (st, &(st->stack->stack_data[st->start + 6]));
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x0 = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y0 = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ x1 = conv_num(st, &(st->stack->stack_data[st->start + 5]));
+ y1 = conv_num(st, &(st->stack->stack_data[st->start + 6]));
data = &(st->stack->stack_data[st->start + 7]);
- get_val (st, data);
+ get_val(st, data);
if (data->type == ScriptCode::STR || data->type == ScriptCode::CONSTSTR)
{
- const char *name = conv_str (st, data);
- struct item_data *item_data = itemdb_searchname (name);
+ const char *name = conv_str(st, data);
+ struct item_data *item_data = itemdb_searchname(name);
item = 512;
if (item_data)
item = item_data->nameid;
}
else
- item = conv_num (st, data);
+ item = conv_num(st, data);
if (st->end > st->start + 8)
- delitems = conv_num (st, &(st->stack->stack_data[st->start + 8]));
+ delitems = conv_num(st, &(st->stack->stack_data[st->start + 8]));
- if ((m = map_mapname2mapid (str)) < 0)
+ if ((m = map_mapname2mapid(str)) < 0)
{
- push_val (st->stack, ScriptCode::INT, -1);
- return 0;
+ push_val(st->stack, ScriptCode::INT, -1);
+ return;
}
if (delitems)
- map_foreachinarea (buildin_getareadropitem_sub_anddelete,
- m, x0, y0, x1, y1, BL_ITEM, item, &amount);
+ map_foreachinarea(std::bind(builtin_getareadropitem_sub_anddelete, ph::_1, item, &amount),
+ m, x0, y0, x1, y1, BL::ITEM);
else
- map_foreachinarea (buildin_getareadropitem_sub,
- m, x0, y0, x1, y1, BL_ITEM, item, &amount);
+ map_foreachinarea(std::bind(builtin_getareadropitem_sub, ph::_1, item, &amount),
+ m, x0, y0, x1, y1, BL::ITEM);
- push_val (st->stack, ScriptCode::INT, amount);
- return 0;
+ push_val(st->stack, ScriptCode::INT, amount);
}
/*==========================================
* NPCの有効化
*------------------------------------------
*/
-int buildin_enablenpc (struct script_state *st)
+static
+void builtin_enablenpc(ScriptState *st)
{
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- npc_enable (str, 1);
- return 0;
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ npc_enable(str, 1);
}
/*==========================================
* NPCの無効化
*------------------------------------------
*/
-int buildin_disablenpc (struct script_state *st)
-{
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- npc_enable (str, 0);
- return 0;
-}
-
-int buildin_enablearena (struct script_state *st) // Added by RoVeRT
-{
- struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid);
- struct chat_data *cd;
-
- if (nd == NULL
- || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL)
- return 0;
-
- npc_enable (nd->name, 1);
- nd->arenaflag = 1;
-
- if (cd->users >= cd->trigger && cd->npc_event[0])
- npc_timer_event (cd->npc_event);
-
- return 0;
-}
-
-int buildin_disablearena (struct script_state *st) // Added by RoVeRT
-{
- struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid);
- nd->arenaflag = 0;
-
- return 0;
-}
-
-/*==========================================
- * 隠れているNPCの表示
- *------------------------------------------
- */
-int buildin_hideoffnpc (struct script_state *st)
-{
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- npc_enable (str, 2);
- return 0;
-}
-
-/*==========================================
- * NPCをハイディング
- *------------------------------------------
- */
-int buildin_hideonnpc (struct script_state *st)
+static
+void builtin_disablenpc(ScriptState *st)
{
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- npc_enable (str, 4);
- return 0;
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ npc_enable(str, 0);
}
/*==========================================
* 状態異常にかかる
*------------------------------------------
*/
-int buildin_sc_start (struct script_state *st)
+static
+void builtin_sc_start(ScriptState *st)
{
struct block_list *bl;
- int type, tick, val1;
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- tick = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- val1 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
+ int val1;
+ StatusChange type = static_cast<StatusChange>(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ interval_t tick = static_cast<interval_t>(conv_num(st, &(st->stack->stack_data[st->start + 3])));
+ if (tick < std::chrono::seconds(1))
+ // work around old behaviour of:
+ // speed potion
+ // atk potion
+ // matk potion
+ //
+ // which used to use seconds
+ // all others used milliseconds
+ tick *= 1000;
+ val1 = conv_num(st, &(st->stack->stack_data[st->start + 4]));
if (st->end > st->start + 5) //指定したキャラを状態異常にする
- bl = map_id2bl (conv_num
- (st, &(st->stack->stack_data[st->start + 5])));
+ bl = map_id2bl(conv_num(st, &(st->stack->stack_data[st->start + 5])));
else
- bl = map_id2bl (st->rid);
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->state.potionpitcher_flag)
- bl = map_id2bl (((struct map_session_data *) bl)->skilltarget);
- skill_status_change_start (bl, type, val1, 0, 0, 0, tick, 0);
- return 0;
-}
-
-/*==========================================
- * 状態異常にかかる(確率指定)
- *------------------------------------------
- */
-int buildin_sc_start2 (struct script_state *st)
-{
- struct block_list *bl;
- int type, tick, val1, per;
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- tick = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- val1 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- per = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- if (st->end > st->start + 6) //指定したキャラを状態異常にする
- bl = map_id2bl (conv_num
- (st, &(st->stack->stack_data[st->start + 6])));
- else
- bl = map_id2bl (st->rid);
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->state.potionpitcher_flag)
- bl = map_id2bl (((struct map_session_data *) bl)->skilltarget);
- if (MRAND (10000) < per)
- skill_status_change_start (bl, type, val1, 0, 0, 0, tick, 0);
- return 0;
+ bl = map_id2bl(st->rid);
+ skill_status_change_start(bl, type, val1, tick);
}
/*==========================================
* 状態異常が直る
*------------------------------------------
*/
-int buildin_sc_end (struct script_state *st)
-{
- struct block_list *bl;
- int type;
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- bl = map_id2bl (st->rid);
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->state.potionpitcher_flag)
- bl = map_id2bl (((struct map_session_data *) bl)->skilltarget);
- skill_status_change_end (bl, type, -1);
-// if(battle_config.etc_log)
-// printf("sc_end : %d %d\n",st->rid,type);
- return 0;
-}
-
-int buildin_sc_check (struct script_state *st)
+static
+void builtin_sc_end(ScriptState *st)
{
struct block_list *bl;
- int type;
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- bl = map_id2bl (st->rid);
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->state.potionpitcher_flag)
- bl = map_id2bl (((struct map_session_data *) bl)->skilltarget);
-
- push_val (st->stack, ScriptCode::INT, skill_status_change_active (bl, type));
-
- return 0;
+ StatusChange type = StatusChange(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ bl = map_id2bl(st->rid);
+ skill_status_change_end(bl, type, nullptr);
}
-/*==========================================
- * 状態異常耐性を計算した確率を返す
- *------------------------------------------
- */
-int buildin_getscrate (struct script_state *st)
+static
+void builtin_sc_check(ScriptState *st)
{
struct block_list *bl;
- int sc_def = 100, sc_def_mdef2, sc_def_vit2, sc_def_int2, sc_def_luk2;
- int type, rate, luk;
-
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- rate = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- if (st->end > st->start + 4) //指定したキャラの耐性を計算する
- bl = map_id2bl (conv_num
- (st, &(st->stack->stack_data[st->start + 6])));
- else
- bl = map_id2bl (st->rid);
-
- luk = battle_get_luk (bl);
- sc_def_mdef2 = 100 - (3 + battle_get_mdef (bl) + luk / 3);
- sc_def_vit2 = 100 - (3 + battle_get_vit (bl) + luk / 3);
- sc_def_int2 = 100 - (3 + battle_get_int (bl) + luk / 3);
- sc_def_luk2 = 100 - (3 + luk);
-
- if (type == SC_STONE || type == SC_FREEZE)
- sc_def = sc_def_mdef2;
- else if (type == SC_STAN || type == SC_POISON || type == SC_SILENCE)
- sc_def = sc_def_vit2;
- else if (type == SC_SLEEP || type == SC_CONFUSION || type == SC_BLIND)
- sc_def = sc_def_int2;
- else if (type == SC_CURSE)
- sc_def = sc_def_luk2;
-
- rate = rate * sc_def / 100;
- push_val (st->stack, ScriptCode::INT, rate);
+ StatusChange type = StatusChange(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ bl = map_id2bl(st->rid);
- return 0;
+ push_val(st->stack, ScriptCode::INT, skill_status_change_active(bl, type));
}
@@ -4992,371 +3254,81 @@ int buildin_getscrate (struct script_state *st)
*
*------------------------------------------
*/
-int buildin_debugmes (struct script_state *st)
+static
+void builtin_debugmes(ScriptState *st)
{
- conv_str (st, &(st->stack->stack_data[st->start + 2]));
- printf ("script debug : %d %d : %s\n", st->rid, st->oid,
+ conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ PRINTF("script debug : %d %d : %s\n", st->rid, st->oid,
st->stack->stack_data[st->start + 2].u.str);
- return 0;
-}
-
-/*==========================================
- * Added - AppleGirl For Advanced Classes, (Updated for Cleaner Script Purposes)
- *------------------------------------------
- */
-int buildin_resetlvl (struct script_state *st)
-{
- struct map_session_data *sd;
-
- int type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
-
- sd = script_rid2sd (st);
- pc_resetlvl (sd, type);
- return 0;
}
/*==========================================
* ステータスリセット
*------------------------------------------
*/
-int buildin_resetstatus (struct script_state *st)
+static
+void builtin_resetstatus(ScriptState *st)
{
struct map_session_data *sd;
- sd = script_rid2sd (st);
- pc_resetstate (sd);
- return 0;
-}
-
-/*==========================================
- * スキルリセット
- *------------------------------------------
- */
-int buildin_resetskill (struct script_state *st)
-{
- struct map_session_data *sd;
- sd = script_rid2sd (st);
- pc_resetskill (sd);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_changebase (struct script_state *st)
-{
- struct map_session_data *sd = NULL;
- int vclass;
-
- if (st->end > st->start + 3)
- sd = map_id2sd (conv_num
- (st, &(st->stack->stack_data[st->start + 3])));
- else
- sd = script_rid2sd (st);
-
- if (sd == NULL)
- return 0;
-
- vclass = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- if (vclass == 22 && !battle_config.wedding_modifydisplay)
- return 0;
-
-// if(vclass==22) {
-// pc_unequipitem(sd,sd->equip_index[9],0); // 装備外
-// }
-
- sd->view_class = vclass;
-
- return 0;
+ sd = script_rid2sd(st);
+ pc_resetstate(sd);
}
/*==========================================
* 性別変換
*------------------------------------------
*/
-int buildin_changesex (struct script_state *st)
+static
+void builtin_changesex(ScriptState *st)
{
struct map_session_data *sd = NULL;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
if (sd->status.sex == 0)
{
sd->status.sex = 1;
sd->sex = 1;
- if (sd->status.pc_class == 20 || sd->status.pc_class == 4021)
- sd->status.pc_class -= 1;
}
else if (sd->status.sex == 1)
{
sd->status.sex = 0;
sd->sex = 0;
- if (sd->status.pc_class == 19 || sd->status.pc_class == 4020)
- sd->status.pc_class += 1;
}
- chrif_char_ask_name (-1, sd->status.name, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
- chrif_save (sd);
- return 0;
-}
-
-/*==========================================
- * npcチャット作成
- *------------------------------------------
- */
-int buildin_waitingroom (struct script_state *st)
-{
- const char *name, *ev = "";
- int limit, trigger = 0, pub = 1;
- name = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- limit = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- if (limit == 0)
- pub = 3;
-
- if ((st->end > st->start + 5))
- {
- struct script_data *data = &(st->stack->stack_data[st->start + 5]);
- get_val (st, data);
- if (data->type == ScriptCode::INT)
- {
- // 新Athena仕様(旧Athena仕様と互換性あり)
- ev = conv_str (st, &(st->stack->stack_data[st->start + 4]));
- trigger = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- }
- else
- {
- // eathena仕様
- trigger = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- ev = conv_str (st, &(st->stack->stack_data[st->start + 5]));
- }
- }
- else
- {
- // 旧Athena仕様
- if (st->end > st->start + 4)
- ev = conv_str (st, &(st->stack->stack_data[st->start + 4]));
- }
- chat_createnpcchat ((struct npc_data *) map_id2bl (st->oid),
- limit, pub, trigger, name, strlen (name) + 1, ev);
- return 0;
-}
-
-/*==========================================
- * npcチャット削除
- *------------------------------------------
- */
-int buildin_delwaitingroom (struct script_state *st)
-{
- struct npc_data *nd;
- if (st->end > st->start + 2)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 2])));
- else
- nd = (struct npc_data *) map_id2bl (st->oid);
- chat_deletenpcchat (nd);
- return 0;
-}
-
-/*==========================================
- * npcチャット全員蹴り出す
- *------------------------------------------
- */
-static
-int buildin_waitingroomkickall (struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
-
- if (st->end > st->start + 2)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 2])));
- else
- nd = (struct npc_data *) map_id2bl (st->oid);
-
- if (nd == NULL
- || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL)
- return 0;
- chat_npckickall (cd);
- return 0;
-}
-
-/*==========================================
- * npcチャットイベント有効化
- *------------------------------------------
- */
-int buildin_enablewaitingroomevent (struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
-
- if (st->end > st->start + 2)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 2])));
- else
- nd = (struct npc_data *) map_id2bl (st->oid);
-
- if (nd == NULL
- || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL)
- return 0;
- chat_enableevent (cd);
- return 0;
-}
-
-/*==========================================
- * npcチャットイベント無効化
- *------------------------------------------
- */
-int buildin_disablewaitingroomevent (struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
-
- if (st->end > st->start + 2)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 2])));
- else
- nd = (struct npc_data *) map_id2bl (st->oid);
-
- if (nd == NULL
- || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL)
- return 0;
- chat_disableevent (cd);
- return 0;
-}
-
-/*==========================================
- * npcチャット状態所得
- *------------------------------------------
- */
-int buildin_getwaitingroomstate (struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
- int val = 0, type;
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- if (st->end > st->start + 3)
- nd = npc_name2id (conv_str
- (st, &(st->stack->stack_data[st->start + 3])));
- else
- nd = (struct npc_data *) map_id2bl (st->oid);
-
- if (nd == NULL
- || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL)
- {
- push_val (st->stack, ScriptCode::INT, -1);
- return 0;
- }
-
- switch (type)
- {
- case 0:
- val = cd->users;
- break;
- case 1:
- val = cd->limit;
- break;
- case 2:
- val = cd->trigger & 0x7f;
- break;
- case 3:
- val = ((cd->trigger & 0x80) > 0);
- break;
- case 32:
- val = (cd->users >= cd->limit);
- break;
- case 33:
- val = (cd->users >= cd->trigger);
- break;
-
- case 4:
- push_str (st->stack, ScriptCode::CONSTSTR, cd->title);
- return 0;
- case 5:
- push_str (st->stack, ScriptCode::CONSTSTR, cd->pass);
- return 0;
- case 16:
- push_str (st->stack, ScriptCode::CONSTSTR, cd->npc_event);
- return 0;
- }
- push_val (st->stack, ScriptCode::INT, val);
- return 0;
-}
-
-/*==========================================
- * チャットメンバー(規定人数)ワープ
- *------------------------------------------
- */
-int buildin_warpwaitingpc (struct script_state *st)
-{
- int x, y, i, n;
- struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid);
- struct chat_data *cd;
-
- if (nd == NULL
- || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL)
- return 0;
-
- n = cd->trigger & 0x7f;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 4]));
-
- if (st->end > st->start + 5)
- n = conv_num (st, &(st->stack->stack_data[st->start + 5]));
-
- for (i = 0; i < n; i++)
- {
- struct map_session_data *sd = cd->usersd[0]; // リスト先頭のPCを次々に。
-
- mapreg_setreg (add_str ("$@warpwaitingpc") + (i << 24), sd->bl.id);
-
- if (strcmp (str, "Random") == 0)
- pc_randomwarp (sd, 3);
- else if (strcmp (str, "SavePoint") == 0)
- {
- if (map[sd->bl.m].flag.noteleport) // テレポ禁止
- return 0;
-
- pc_setpos (sd, sd->status.save_point.map,
- sd->status.save_point.x, sd->status.save_point.y, 3);
- }
- else
- pc_setpos (sd, str, x, y, 0);
- }
- mapreg_setreg (add_str ("$@warpwaitingpcnum"), n);
- return 0;
+ chrif_char_ask_name(-1, sd->status.name, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
+ chrif_save(sd);
}
/*==========================================
* RIDのアタッチ
*------------------------------------------
*/
-int buildin_attachrid (struct script_state *st)
+static
+void builtin_attachrid(ScriptState *st)
{
- st->rid = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- push_val (st->stack, ScriptCode::INT, (map_id2sd (st->rid) != NULL));
- return 0;
+ st->rid = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ push_val(st->stack, ScriptCode::INT, (map_id2sd(st->rid) != NULL));
}
/*==========================================
* RIDのデタッチ
*------------------------------------------
*/
-int buildin_detachrid (struct script_state *st)
+static
+void builtin_detachrid(ScriptState *st)
{
st->rid = 0;
- return 0;
}
/*==========================================
* 存在チェック
*------------------------------------------
*/
-int buildin_isloggedin (struct script_state *st)
+static
+void builtin_isloggedin(ScriptState *st)
{
- push_val (st->stack, ScriptCode::INT,
- map_id2sd (conv_num
- (st,
+ push_val(st->stack, ScriptCode::INT,
+ map_id2sd(conv_num(st,
&(st->stack->stack_data[st->start + 2]))) != NULL);
- return 0;
}
/*==========================================
@@ -5364,40 +3336,38 @@ int buildin_isloggedin (struct script_state *st)
*------------------------------------------
*/
enum
-{ MF_NOMEMO, MF_NOTELEPORT, MF_NOSAVE, MF_NOBRANCH, MF_NOPENALTY,
- MF_NOZENYPENALTY, MF_PVP, MF_PVP_NOPARTY, MF_PVP_NOGUILD, MF_GVG,
- MF_GVG_NOPARTY, MF_NOTRADE, MF_NOSKILL, MF_NOWARP, MF_NOPVP,
- MF_NOICEWALL,
- MF_SNOW, MF_FOG, MF_SAKURA, MF_LEAVES, MF_RAIN
-};
-
-int buildin_setmapflagnosave (struct script_state *st)
{
- int m, x, y;
-
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- const char *str2 = conv_str (st, &(st->stack->stack_data[st->start + 3]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- m = map_mapname2mapid (str);
- if (m >= 0)
- {
- map[m].flag.nosave = 1;
- memcpy (map[m].save.map, str2, 16);
- map[m].save.x = x;
- map[m].save.y = y;
- }
-
- return 0;
-}
+ MF_NOMEMO = 0,
+ MF_NOTELEPORT = 1,
+ MF_NOSAVE = 2,
+ MF_NOBRANCH = 3,
+ MF_NOPENALTY = 4,
+ MF_NOZENYPENALTY = 5,
+ MF_PVP = 6,
+ MF_PVP_NOPARTY = 7,
+ //MF_PVP_NOGUILD = 8,
+ //MF_GVG = 9,
+ //MF_GVG_NOPARTY = 10,
+ MF_NOTRADE = 11,
+ //MF_NOSKILL = 12,
+ MF_NOWARP = 13,
+ MF_NOPVP = 14,
+ MF_NOICEWALL = 15,
+ MF_SNOW = 16,
+ MF_FOG = 17,
+ MF_SAKURA = 18,
+ MF_LEAVES = 19,
+ MF_RAIN = 20,
+};
-int buildin_setmapflag (struct script_state *st)
+static
+void builtin_setmapflag(ScriptState *st)
{
- int m, i;
+ int m, i;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- i = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- m = map_mapname2mapid (str);
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ i = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ m = map_mapname2mapid(str);
if (m >= 0)
{
switch (i)
@@ -5417,21 +3387,12 @@ int buildin_setmapflag (struct script_state *st)
case MF_PVP_NOPARTY:
map[m].flag.pvp_noparty = 1;
break;
- case MF_PVP_NOGUILD:
- map[m].flag.pvp_noguild = 1;
- break;
- case MF_GVG_NOPARTY:
- map[m].flag.gvg_noparty = 1;
- break;
case MF_NOZENYPENALTY:
map[m].flag.nozenypenalty = 1;
break;
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;
@@ -5459,16 +3420,16 @@ int buildin_setmapflag (struct script_state *st)
}
}
- return 0;
}
-int buildin_removemapflag (struct script_state *st)
+static
+void builtin_removemapflag(ScriptState *st)
{
- int m, i;
+ int m, i;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- i = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- m = map_mapname2mapid (str);
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ i = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ m = map_mapname2mapid(str);
if (m >= 0)
{
switch (i)
@@ -5491,18 +3452,9 @@ int buildin_removemapflag (struct script_state *st)
case MF_PVP_NOPARTY:
map[m].flag.pvp_noparty = 0;
break;
- case MF_PVP_NOGUILD:
- map[m].flag.pvp_noguild = 0;
- break;
- case MF_GVG_NOPARTY:
- map[m].flag.gvg_noparty = 0;
- break;
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;
@@ -5531,34 +3483,96 @@ int buildin_removemapflag (struct script_state *st)
}
}
- return 0;
}
-int buildin_pvpon (struct script_state *st)
+static
+void builtin_getmapflag(ScriptState *st)
+{
+ int m, i, r = -1;
+
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ i = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ m = map_mapname2mapid(str);
+ if (m >= 0)
+ {
+ switch (i)
+ {
+ case MF_NOMEMO:
+ r = map[m].flag.nomemo;
+ break;
+ case MF_NOTELEPORT:
+ r = map[m].flag.noteleport;
+ break;
+ case MF_NOSAVE:
+ r = map[m].flag.nosave;
+ break;
+ case MF_NOBRANCH:
+ r = map[m].flag.nobranch;
+ break;
+ case MF_NOPENALTY:
+ r = map[m].flag.nopenalty;
+ break;
+ case MF_PVP_NOPARTY:
+ r = map[m].flag.pvp_noparty;
+ break;
+ case MF_NOZENYPENALTY:
+ r = map[m].flag.nozenypenalty;
+ break;
+ case MF_NOWARP:
+ r = map[m].flag.nowarp;
+ break;
+ case MF_NOPVP:
+ r = map[m].flag.nopvp;
+ break;
+ case MF_NOICEWALL: // [Valaris]
+ r = map[m].flag.noicewall;
+ break;
+ case MF_SNOW: // [Valaris]
+ r = map[m].flag.snow;
+ break;
+ case MF_FOG: // [Valaris]
+ r = map[m].flag.fog;
+ break;
+ case MF_SAKURA: // [Valaris]
+ r = map[m].flag.sakura;
+ break;
+ case MF_LEAVES: // [Valaris]
+ r = map[m].flag.leaves;
+ break;
+ case MF_RAIN: // [Valaris]
+ r = map[m].flag.rain;
+ break;
+ }
+ }
+
+ push_val(st->stack, ScriptCode::INT, r);
+}
+
+static
+void builtin_pvpon(ScriptState *st)
{
- int m, i;
+ int m, i;
struct map_session_data *pl_sd = NULL;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- m = map_mapname2mapid (str);
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ m = map_mapname2mapid(str);
if (m >= 0 && !map[m].flag.pvp && !map[m].flag.nopvp)
{
map[m].flag.pvp = 1;
- clif_send0199 (m, 1);
if (battle_config.pk_mode) // disable ranking functions if pk_mode is on [Valaris]
- return 0;
+ return;
for (i = 0; i < fd_max; i++)
{ //人数分ループ
if (session[i] && (pl_sd = (struct map_session_data *)session[i]->session_data)
&& pl_sd->state.auth)
{
- if (m == pl_sd->bl.m && pl_sd->pvp_timer == -1)
+ if (m == pl_sd->bl.m && !pl_sd->pvp_timer)
{
- pl_sd->pvp_timer =
- add_timer (gettick () + 200, pc_calc_pvprank_timer,
- pl_sd->bl.id, 0);
+ pl_sd->pvp_timer = Timer(gettick() + std::chrono::milliseconds(200),
+ std::bind(pc_calc_pvprank_timer, ph::_1, ph::_2,
+ pl_sd->bl.id));
pl_sd->pvp_rank = 0;
pl_sd->pvp_lastusers = 0;
pl_sd->pvp_point = 5;
@@ -5567,23 +3581,22 @@ int buildin_pvpon (struct script_state *st)
}
}
- return 0;
}
-int buildin_pvpoff (struct script_state *st)
+static
+void builtin_pvpoff(ScriptState *st)
{
- int m, i;
+ int m, i;
struct map_session_data *pl_sd = NULL;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- m = map_mapname2mapid (str);
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ m = map_mapname2mapid(str);
if (m >= 0 && map[m].flag.pvp && map[m].flag.nopvp)
{
map[m].flag.pvp = 0;
- clif_send0199 (m, 0);
if (battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris]
- return 0;
+ return;
for (i = 0; i < fd_max; i++)
{ //人数分ループ
@@ -5592,1124 +3605,297 @@ int buildin_pvpoff (struct script_state *st)
{
if (m == pl_sd->bl.m)
{
- clif_pvpset (pl_sd, 0, 0, 2);
- if (pl_sd->pvp_timer != -1)
- {
- delete_timer (pl_sd->pvp_timer,
- pc_calc_pvprank_timer);
- pl_sd->pvp_timer = -1;
- }
+ pl_sd->pvp_timer.cancel();
}
}
}
}
- return 0;
-}
-
-int buildin_gvgon (struct script_state *st)
-{
- int m;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- m = map_mapname2mapid (str);
- if (m >= 0 && !map[m].flag.gvg)
- {
- map[m].flag.gvg = 1;
- clif_send0199 (m, 3);
- }
-
- return 0;
-}
-
-int buildin_gvgoff (struct script_state *st)
-{
- int m;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- m = map_mapname2mapid (str);
- if (m >= 0 && map[m].flag.gvg)
- {
- map[m].flag.gvg = 0;
- clif_send0199 (m, 0);
- }
-
- return 0;
}
/*==========================================
- * NPCエモーション
+ * NPCエモーション
*------------------------------------------
*/
-int buildin_emotion (struct script_state *st)
+static
+void builtin_emotion(ScriptState *st)
{
- int type;
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ int type;
+ type = conv_num(st, &(st->stack->stack_data[st->start + 2]));
if (type < 0 || type > 100)
- return 0;
- clif_emotion (map_id2bl (st->oid), type);
- return 0;
+ return;
+ clif_emotion(map_id2bl(st->oid), type);
}
static
-int buildin_maprespawnguildid_sub (struct block_list *bl, va_list ap)
+void builtin_mapwarp(ScriptState *st) // Added by RoVeRT
{
- int g_id = va_arg (ap, int);
- int flag = va_arg (ap, int);
- struct map_session_data *sd = NULL;
- struct mob_data *md = NULL;
+ int x, y, m;
+ int x0, y0, x1, y1;
- if (bl->type == BL_PC)
- sd = (struct map_session_data *) bl;
- if (bl->type == BL_MOB)
- md = (struct mob_data *) bl;
-
- if (sd)
- {
- if ((sd->status.guild_id == g_id) && (flag & 1))
- pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x,
- sd->status.save_point.y, 3);
- else if ((sd->status.guild_id != g_id) && (flag & 2))
- pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x,
- sd->status.save_point.y, 3);
- else if (sd->status.guild_id == 0) // Warp out players not in guild [Valaris]
- pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 3); // end addition [Valaris]
- }
- if (md && flag & 4)
- {
- if (md->mob_class < 1285 || md->mob_class > 1288)
- mob_delete (md);
- }
- return 0;
-}
-
-int buildin_maprespawnguildid (struct script_state *st)
-{
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- int g_id = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- int flag = conv_num (st, &(st->stack->stack_data[st->start + 4]));
-
- int m = map_mapname2mapid (mapname);
-
- if (m)
- map_foreachinarea (buildin_maprespawnguildid_sub, m, 0, 0,
- map[m].xs - 1, map[m].ys - 1, BL_NUL, g_id, flag);
- return 0;
-}
-
-int buildin_agitstart (struct script_state *st)
-{
- if (agit_flag == 1)
- return 1; // Agit already Start.
- agit_flag = 1;
- guild_agit_start ();
- return 0;
-}
-
-int buildin_agitend (struct script_state *st)
-{
- if (agit_flag == 0)
- return 1; // Agit already End.
- agit_flag = 0;
- guild_agit_end ();
- return 0;
-}
-
-/*==========================================
- * agitcheck 1; // choice script
- * if(@agit_flag == 1) goto agit;
- * if(agitcheck(0) == 1) goto agit;
- *------------------------------------------
- */
-int buildin_agitcheck (struct script_state *st)
-{
- struct map_session_data *sd;
- int cond;
-
- sd = script_rid2sd (st);
- cond = conv_num (st, &(st->stack->stack_data[st->start + 2]));
-
- if (cond == 0)
- {
- if (agit_flag == 1)
- push_val (st->stack, ScriptCode::INT, 1);
- if (agit_flag == 0)
- push_val (st->stack, ScriptCode::INT, 0);
- }
- else
- {
- if (agit_flag == 1)
- pc_setreg (sd, add_str ("@agit_flag"), 1);
- if (agit_flag == 0)
- pc_setreg (sd, add_str ("@agit_flag"), 0);
- }
- return 0;
-}
-
-int buildin_flagemblem (struct script_state *st)
-{
- int g_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
-
- if (g_id < 0)
- return 0;
-
-// printf("Script.c: [FlagEmblem] GuildID=%d, Emblem=%d.\n", g->guild_id, g->emblem_id);
- ((struct npc_data *) map_id2bl (st->oid))->u.scr.guild_id = g_id;
- return 1;
-}
-
-int buildin_getcastlename (struct script_state *st)
-{
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- struct guild_castle *gc;
- int i;
- char *buf = NULL;
- for (i = 0; i < MAX_GUILDCASTLE; i++)
- {
- if ((gc = guild_castle_search (i)) != NULL)
- {
- if (strcmp (mapname, gc->map_name) == 0)
- {
- buf = (char *) calloc (24, 1);
- strncpy (buf, gc->castle_name, 23);
- break;
- }
- }
- }
- if (buf)
- push_str (st->stack, ScriptCode::STR, buf);
- else
- push_str (st->stack, ScriptCode::CONSTSTR, "");
- return 0;
-}
-
-int buildin_getcastledata (struct script_state *st)
-{
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- int index = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- const char *event = NULL;
- struct guild_castle *gc;
- int i, j;
-
- if (st->end > st->start + 4 && index == 0)
- {
- for (i = 0, j = -1; i < MAX_GUILDCASTLE; i++)
- if ((gc = guild_castle_search (i)) != NULL &&
- strcmp (mapname, gc->map_name) == 0)
- j = i;
- if (j >= 0)
- {
- event = conv_str (st, &(st->stack->stack_data[st->start + 4]));
- guild_addcastleinfoevent (j, 17, event);
- }
- }
-
- for (i = 0; i < MAX_GUILDCASTLE; i++)
- {
- if ((gc = guild_castle_search (i)) != NULL)
- {
- if (strcmp (mapname, gc->map_name) == 0)
- {
- switch (index)
- {
- case 0:
- for (j = 1; j < 26; j++)
- guild_castledataload (gc->castle_id, j);
- break; // Initialize[AgitInit]
- case 1:
- push_val (st->stack, ScriptCode::INT, gc->guild_id);
- break;
- case 2:
- push_val (st->stack, ScriptCode::INT, gc->economy);
- break;
- case 3:
- push_val (st->stack, ScriptCode::INT, gc->defense);
- break;
- case 4:
- push_val (st->stack, ScriptCode::INT, gc->triggerE);
- break;
- case 5:
- push_val (st->stack, ScriptCode::INT, gc->triggerD);
- break;
- case 6:
- push_val (st->stack, ScriptCode::INT, gc->nextTime);
- break;
- case 7:
- push_val (st->stack, ScriptCode::INT, gc->payTime);
- break;
- case 8:
- push_val (st->stack, ScriptCode::INT, gc->createTime);
- break;
- case 9:
- push_val (st->stack, ScriptCode::INT, gc->visibleC);
- break;
- case 10:
- push_val (st->stack, ScriptCode::INT, gc->visibleG0);
- break;
- case 11:
- push_val (st->stack, ScriptCode::INT, gc->visibleG1);
- break;
- case 12:
- push_val (st->stack, ScriptCode::INT, gc->visibleG2);
- break;
- case 13:
- push_val (st->stack, ScriptCode::INT, gc->visibleG3);
- break;
- case 14:
- push_val (st->stack, ScriptCode::INT, gc->visibleG4);
- break;
- case 15:
- push_val (st->stack, ScriptCode::INT, gc->visibleG5);
- break;
- case 16:
- push_val (st->stack, ScriptCode::INT, gc->visibleG6);
- break;
- case 17:
- push_val (st->stack, ScriptCode::INT, gc->visibleG7);
- break;
- case 18:
- push_val (st->stack, ScriptCode::INT, gc->Ghp0);
- break;
- case 19:
- push_val (st->stack, ScriptCode::INT, gc->Ghp1);
- break;
- case 20:
- push_val (st->stack, ScriptCode::INT, gc->Ghp2);
- break;
- case 21:
- push_val (st->stack, ScriptCode::INT, gc->Ghp3);
- break;
- case 22:
- push_val (st->stack, ScriptCode::INT, gc->Ghp4);
- break;
- case 23:
- push_val (st->stack, ScriptCode::INT, gc->Ghp5);
- break;
- case 24:
- push_val (st->stack, ScriptCode::INT, gc->Ghp6);
- break;
- case 25:
- push_val (st->stack, ScriptCode::INT, gc->Ghp7);
- break;
- default:
- push_val (st->stack, ScriptCode::INT, 0);
- break;
- }
- return 0;
- }
- }
- }
- push_val (st->stack, ScriptCode::INT, 0);
- return 0;
-}
-
-int buildin_setcastledata (struct script_state *st)
-{
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- int index = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- int value = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- struct guild_castle *gc;
- int i;
-
- for (i = 0; i < MAX_GUILDCASTLE; i++)
- {
- if ((gc = guild_castle_search (i)) != NULL)
- {
- if (strcmp (mapname, gc->map_name) == 0)
- {
- // Save Data byself First
- switch (index)
- {
- case 1:
- gc->guild_id = value;
- break;
- case 2:
- gc->economy = value;
- break;
- case 3:
- gc->defense = value;
- break;
- case 4:
- gc->triggerE = value;
- break;
- case 5:
- gc->triggerD = value;
- break;
- case 6:
- gc->nextTime = value;
- break;
- case 7:
- gc->payTime = value;
- break;
- case 8:
- gc->createTime = value;
- break;
- case 9:
- gc->visibleC = value;
- break;
- case 10:
- gc->visibleG0 = value;
- break;
- case 11:
- gc->visibleG1 = value;
- break;
- case 12:
- gc->visibleG2 = value;
- break;
- case 13:
- gc->visibleG3 = value;
- break;
- case 14:
- gc->visibleG4 = value;
- break;
- case 15:
- gc->visibleG5 = value;
- break;
- case 16:
- gc->visibleG6 = value;
- break;
- case 17:
- gc->visibleG7 = value;
- break;
- case 18:
- gc->Ghp0 = value;
- break;
- case 19:
- gc->Ghp1 = value;
- break;
- case 20:
- gc->Ghp2 = value;
- break;
- case 21:
- gc->Ghp3 = value;
- break;
- case 22:
- gc->Ghp4 = value;
- break;
- case 23:
- gc->Ghp5 = value;
- break;
- case 24:
- gc->Ghp6 = value;
- break;
- case 25:
- gc->Ghp7 = value;
- break;
- default:
- return 0;
- }
- guild_castledatasave (gc->castle_id, index, value);
- return 0;
- }
- }
- }
- return 0;
-}
-
-/* =====================================================================
- * ギルド情報を要求する
- * ---------------------------------------------------------------------
- */
-int buildin_requestguildinfo (struct script_state *st)
-{
- int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- const char *event = NULL;
-
- if (st->end > st->start + 3)
- event = conv_str (st, &(st->stack->stack_data[st->start + 3]));
-
- if (guild_id > 0)
- guild_npc_request_info (guild_id, event);
- return 0;
-}
-
-/* =====================================================================
- * カードの数を得る
- * ---------------------------------------------------------------------
- */
-int buildin_getequipcardcnt (struct script_state *st)
-{
- int i, num;
- struct map_session_data *sd;
- int c = 4;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (sd->status.inventory[i].card[0] == 0x00ff)
- { // 製造武器はカードなし
- push_val (st->stack, ScriptCode::INT, 0);
- return 0;
- }
- do
- {
- if ((sd->status.inventory[i].card[c - 1] > 4000) &&
- (sd->status.inventory[i].card[c - 1] < 5000))
- {
-
- push_val (st->stack, ScriptCode::INT, (c));
- return 0;
- }
- }
- while (c--);
- push_val (st->stack, ScriptCode::INT, 0);
- return 0;
-}
-
-/* ================================================================
- * カード取り外し成功
- * ----------------------------------------------------------------
- */
-int buildin_successremovecards (struct script_state *st)
-{
- int i, num, cardflag = 0, flag;
- struct map_session_data *sd;
- struct item item_tmp;
- int c = 4;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (sd->status.inventory[i].card[0] == 0x00ff)
- { // 製造武器は処理しない
- return 0;
- }
- do
- {
- if ((sd->status.inventory[i].card[c - 1] > 4000) &&
- (sd->status.inventory[i].card[c - 1] < 5000))
- {
-
- cardflag = 1;
- item_tmp.id = 0, item_tmp.nameid =
- sd->status.inventory[i].card[c - 1];
- item_tmp.equip = 0, item_tmp.identify = 1, item_tmp.refine = 0;
- item_tmp.attribute = 0;
- item_tmp.card[0] = 0, item_tmp.card[1] = 0, item_tmp.card[2] =
- 0, item_tmp.card[3] = 0;
-
- if ((flag = pc_additem (sd, &item_tmp, 1)))
- { // 持てないならドロップ
- clif_additem (sd, 0, 0, flag);
- map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y,
- NULL, NULL, NULL, 0);
- }
- }
- }
- while (c--);
-
- if (cardflag == 1)
- { // カードを取り除いたアイテム所得
- flag = 0;
- item_tmp.id = 0, item_tmp.nameid = sd->status.inventory[i].nameid;
- item_tmp.equip = 0, item_tmp.identify = 1, item_tmp.refine =
- sd->status.inventory[i].refine;
- item_tmp.attribute = sd->status.inventory[i].attribute;
- item_tmp.card[0] = 0, item_tmp.card[1] = 0, item_tmp.card[2] =
- 0, item_tmp.card[3] = 0;
- pc_delitem (sd, i, 1, 0);
- if ((flag = pc_additem (sd, &item_tmp, 1)))
- { // もてないならドロップ
- clif_additem (sd, 0, 0, flag);
- map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y,
- NULL, NULL, NULL, 0);
- }
- clif_misceffect (&sd->bl, 3);
- return 0;
- }
- return 0;
-}
-
-/* ================================================================
- * カード取り外し失敗 slot,type
- * type=0: 両方損失、1:カード損失、2:武具損失、3:損失無し
- * ----------------------------------------------------------------
- */
-int buildin_failedremovecards (struct script_state *st)
-{
- int i, num, cardflag = 0, flag, typefail;
- struct map_session_data *sd;
- struct item item_tmp;
- int c = 4;
-
- num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- typefail = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- sd = script_rid2sd (st);
- i = pc_checkequip (sd, equip[num - 1]);
- if (sd->status.inventory[i].card[0] == 0x00ff)
- { // 製造武器は処理しない
- return 0;
- }
- do
- {
- if ((sd->status.inventory[i].card[c - 1] > 4000) &&
- (sd->status.inventory[i].card[c - 1] < 5000))
- {
-
- cardflag = 1;
-
- if (typefail == 2)
- { // 武具のみ損失なら、カードは受け取らせる
- item_tmp.id = 0, item_tmp.nameid =
- sd->status.inventory[i].card[c - 1];
- item_tmp.equip = 0, item_tmp.identify = 1, item_tmp.refine =
- 0;
- item_tmp.attribute = 0;
- item_tmp.card[0] = 0, item_tmp.card[1] = 0, item_tmp.card[2] =
- 0, item_tmp.card[3] = 0;
- if ((flag = pc_additem (sd, &item_tmp, 1)))
- {
- clif_additem (sd, 0, 0, flag);
- map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x,
- sd->bl.y, NULL, NULL, NULL, 0);
- }
- }
- }
- }
- while (c--);
-
- if (cardflag == 1)
- {
-
- if (typefail == 0 || typefail == 2)
- { // 武具損失
- pc_delitem (sd, i, 1, 0);
- clif_misceffect (&sd->bl, 2);
- return 0;
- }
- if (typefail == 1)
- { // カードのみ損失(武具を返す)
- flag = 0;
- item_tmp.id = 0, item_tmp.nameid = sd->status.inventory[i].nameid;
- item_tmp.equip = 0, item_tmp.identify = 1, item_tmp.refine =
- sd->status.inventory[i].refine;
- item_tmp.attribute = sd->status.inventory[i].attribute;
- item_tmp.card[0] = 0, item_tmp.card[1] = 0, item_tmp.card[2] =
- 0, item_tmp.card[3] = 0;
- pc_delitem (sd, i, 1, 0);
- if ((flag = pc_additem (sd, &item_tmp, 1)))
- {
- clif_additem (sd, 0, 0, flag);
- map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y,
- NULL, NULL, NULL, 0);
- }
- }
- clif_misceffect (&sd->bl, 2);
- return 0;
- }
- return 0;
-}
-
-int buildin_mapwarp (struct script_state *st) // Added by RoVeRT
-{
- int x, y, m;
- int x0, y0, x1, y1;
-
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 2]));
x0 = 0;
y0 = 0;
- x1 = map[map_mapname2mapid (mapname)].xs;
- y1 = map[map_mapname2mapid (mapname)].ys;
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 3]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 5]));
-
- if ((m = map_mapname2mapid (mapname)) < 0)
- return 0;
-
- map_foreachinarea (buildin_areawarp_sub,
- m, x0, y0, x1, y1, BL_PC, str, x, y);
- return 0;
-}
-
-int buildin_cmdothernpc (struct script_state *st) // Added by RoVeRT
-{
- const char *npc = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- const char *command = conv_str (st, &(st->stack->stack_data[st->start + 3]));
+ x1 = map[map_mapname2mapid(mapname)].xs;
+ y1 = map[map_mapname2mapid(mapname)].ys;
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 3]));
+ x = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ y = conv_num(st, &(st->stack->stack_data[st->start + 5]));
- npc_command (map_id2sd (st->rid), npc, command);
- return 0;
-}
-
-int buildin_inittimer (struct script_state *st) // Added by RoVeRT
-{
-// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid);
-
-// nd->lastaction=nd->timer=gettick();
- npc_do_ontimer (st->oid, map_id2sd (st->rid), 1);
+ if ((m = map_mapname2mapid(mapname)) < 0)
+ return;
- return 0;
+ map_foreachinarea(std::bind(builtin_areawarp_sub, ph::_1, str, x, y),
+ m, x0, y0, x1, y1, BL::PC);
}
-int buildin_stoptimer (struct script_state *st) // Added by RoVeRT
+static
+void builtin_cmdothernpc(ScriptState *st) // Added by RoVeRT
{
-// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid);
+ const char *npc = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ const char *command = conv_str(st, &(st->stack->stack_data[st->start + 3]));
-// nd->lastaction=nd->timer=-1;
- npc_do_ontimer (st->oid, map_id2sd (st->rid), 0);
-
- return 0;
+ npc_command(map_id2sd(st->rid), npc, command);
}
static
-int buildin_mobcount_sub (struct block_list *bl, va_list ap) // Added by RoVeRT
+void builtin_mobcount_sub(struct block_list *bl, const char *event, int *c)
{
- char *event = va_arg (ap, char *);
- int *c = va_arg (ap, int *);
-
- if (strcmp (event, ((struct mob_data *) bl)->npc_event) == 0)
+ if (strcmp(event, ((struct mob_data *) bl)->npc_event) == 0)
(*c)++;
- return 0;
}
-int buildin_mobcount (struct script_state *st) // Added by RoVeRT
+static
+void builtin_mobcount(ScriptState *st) // Added by RoVeRT
{
- int m, c = 0;
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- const char *event = conv_str (st, &(st->stack->stack_data[st->start + 3]));
+ int m, c = 0;
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ const char *event = conv_str(st, &(st->stack->stack_data[st->start + 3]));
- if ((m = map_mapname2mapid (mapname)) < 0)
+ if ((m = map_mapname2mapid(mapname)) < 0)
{
- push_val (st->stack, ScriptCode::INT, -1);
- return 0;
+ push_val(st->stack, ScriptCode::INT, -1);
+ return;
}
- map_foreachinarea (buildin_mobcount_sub,
- m, 0, 0, map[m].xs, map[m].ys, BL_MOB, event, &c);
+ map_foreachinarea(std::bind(builtin_mobcount_sub, ph::_1, event, &c),
+ m, 0, 0, map[m].xs, map[m].ys, BL::MOB);
- push_val (st->stack, ScriptCode::INT, (c - 1));
+ push_val(st->stack, ScriptCode::INT, (c - 1));
- return 0;
}
-int buildin_marriage (struct script_state *st)
+static
+void builtin_marriage(ScriptState *st)
{
- const char *partner = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- struct map_session_data *sd = script_rid2sd (st);
- struct map_session_data *p_sd = map_nick2sd (partner);
+ const char *partner = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ struct map_session_data *sd = script_rid2sd(st);
+ struct map_session_data *p_sd = map_nick2sd(partner);
- if (sd == NULL || p_sd == NULL || pc_marriage (sd, p_sd) < 0)
+ if (sd == NULL || p_sd == NULL || pc_marriage(sd, p_sd) < 0)
{
- push_val (st->stack, ScriptCode::INT, 0);
- return 0;
+ push_val(st->stack, ScriptCode::INT, 0);
+ return;
}
- push_val (st->stack, ScriptCode::INT, 1);
- return 0;
-}
-
-int buildin_wedding_effect (struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd (st);
-
- if (sd == NULL)
- return 0;
- clif_wedding_effect (&sd->bl);
- return 0;
+ push_val(st->stack, ScriptCode::INT, 1);
}
-int buildin_divorce (struct script_state *st)
+static
+void builtin_divorce(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
st->state = STOP; // rely on pc_divorce to restart
sd->npc_flags.divorce = 1;
- if (sd == NULL || pc_divorce (sd) < 0)
- {
- push_val (st->stack, ScriptCode::INT, 0);
- return 0;
- }
-
- push_val (st->stack, ScriptCode::INT, 1);
- return 0;
-}
-
-/*================================================
- * Script for Displaying MOB Information [Valaris]
- *------------------------------------------------
- */
-int buildin_strmobinfo (struct script_state *st)
-{
-
- int num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- int mob_class = conv_num (st, &(st->stack->stack_data[st->start + 3]));
-
- if (num <= 0 || num >= 8 || (mob_class >= 0 && mob_class <= 1000) || mob_class > 2000)
- return 0;
-
- if (num == 1)
- {
- char *buf;
- buf = mob_db[mob_class].name;
- push_str (st->stack, ScriptCode::STR, buf);
- return 0;
- }
- else if (num == 2)
+ if (sd == NULL || pc_divorce(sd) < 0)
{
- char *buf;
- buf = mob_db[mob_class].jname;
- push_str (st->stack, ScriptCode::STR, buf);
- return 0;
+ push_val(st->stack, ScriptCode::INT, 0);
+ return;
}
- else if (num == 3)
- push_val (st->stack, ScriptCode::INT, mob_db[mob_class].lv);
- else if (num == 4)
- push_val (st->stack, ScriptCode::INT, mob_db[mob_class].max_hp);
- else if (num == 5)
- push_val (st->stack, ScriptCode::INT, mob_db[mob_class].max_sp);
- else if (num == 6)
- push_val (st->stack, ScriptCode::INT, mob_db[mob_class].base_exp);
- else if (num == 7)
- push_val (st->stack, ScriptCode::INT, mob_db[mob_class].job_exp);
- return 0;
-}
-
-/*==========================================
- * Summon guardians [Valaris]
- *------------------------------------------
- */
-int buildin_guardian (struct script_state *st)
-{
- int mob_class = 0, amount = 1, x = 0, y = 0, guardian = 0;
- const char *event = "";
-
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 5]));
- mob_class = conv_num (st, &(st->stack->stack_data[st->start + 6]));
- amount = conv_num (st, &(st->stack->stack_data[st->start + 7]));
- event = conv_str (st, &(st->stack->stack_data[st->start + 8]));
- if (st->end > st->start + 9)
- guardian = conv_num (st, &(st->stack->stack_data[st->start + 9]));
- mob_spawn_guardian (map_id2sd (st->rid), mapname, x, y, str, mob_class, amount,
- event, guardian);
-
- return 0;
-}
-
-/*================================================
- * Script for Displaying Guardian Info [Valaris]
- *------------------------------------------------
- */
-int buildin_guardianinfo (struct script_state *st)
-{
- int guardian = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- struct map_session_data *sd = script_rid2sd (st);
- struct guild_castle *gc = guild_mapname2gc (map[sd->bl.m].name);
-
- if (guardian == 0 && gc->visibleG0 == 1)
- push_val (st->stack, ScriptCode::INT, gc->Ghp0);
- if (guardian == 1 && gc->visibleG1 == 1)
- push_val (st->stack, ScriptCode::INT, gc->Ghp1);
- if (guardian == 2 && gc->visibleG2 == 1)
- push_val (st->stack, ScriptCode::INT, gc->Ghp2);
- if (guardian == 3 && gc->visibleG3 == 1)
- push_val (st->stack, ScriptCode::INT, gc->Ghp3);
- if (guardian == 4 && gc->visibleG4 == 1)
- push_val (st->stack, ScriptCode::INT, gc->Ghp4);
- if (guardian == 5 && gc->visibleG5 == 1)
- push_val (st->stack, ScriptCode::INT, gc->Ghp5);
- if (guardian == 6 && gc->visibleG6 == 1)
- push_val (st->stack, ScriptCode::INT, gc->Ghp6);
- if (guardian == 7 && gc->visibleG7 == 1)
- push_val (st->stack, ScriptCode::INT, gc->Ghp7);
- else
- push_val (st->stack, ScriptCode::INT, -1);
-
- return 0;
+ push_val(st->stack, ScriptCode::INT, 1);
}
/*==========================================
* IDからItem名
*------------------------------------------
*/
-int buildin_getitemname (struct script_state *st)
+static
+void builtin_getitemname(ScriptState *st)
{
struct item_data *i_data;
char *item_name;
struct script_data *data;
data = &(st->stack->stack_data[st->start + 2]);
- get_val (st, data);
+ get_val(st, data);
if (data->type == ScriptCode::STR || data->type == ScriptCode::CONSTSTR)
{
- const char *name = conv_str (st, data);
- i_data = itemdb_searchname (name);
+ const char *name = conv_str(st, data);
+ i_data = itemdb_searchname(name);
}
else
{
- int item_id = conv_num (st, data);
- i_data = itemdb_search (item_id);
+ int item_id = conv_num(st, data);
+ i_data = itemdb_search(item_id);
}
- item_name = (char *) calloc (24, 1);
+ item_name = (char *) calloc(24, 1);
if (i_data)
- strncpy (item_name, i_data->jname, 23);
+ strncpy(item_name, i_data->jname, 23);
else
- strncpy (item_name, "Unknown Item", 23);
+ strncpy(item_name, "Unknown Item", 23);
- push_str (st->stack, ScriptCode::STR, item_name);
+ push_str(st->stack, ScriptCode::STR, item_name);
- return 0;
}
-int buildin_getspellinvocation (struct script_state *st)
-{
- const char *name = conv_str (st, &(st->stack->stack_data[st->start + 2]));
-
- const char *invocation = magic_find_invocation (name);
- if (!invocation)
- invocation = "...";
-
- push_str (st->stack, ScriptCode::STR, strdup (invocation));
- return 0;
-}
-
-int buildin_getanchorinvocation (struct script_state *st)
+static
+void builtin_getspellinvocation(ScriptState *st)
{
- const char *name = conv_str (st, &(st->stack->stack_data[st->start + 2]));
+ const char *name = conv_str(st, &(st->stack->stack_data[st->start + 2]));
- const char *invocation = magic_find_anchor_invocation (name);
+ const char *invocation = magic_find_invocation(name);
if (!invocation)
invocation = "...";
- push_str (st->stack, ScriptCode::STR, strdup (invocation));
- return 0;
+ push_str(st->stack, ScriptCode::STR, strdup(invocation));
}
-int buildin_getpartnerid (struct script_state *st)
+static
+void builtin_getpartnerid2(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
- push_val (st->stack, ScriptCode::INT, sd->status.partner_id);
- return 0;
+ push_val(st->stack, ScriptCode::INT, sd->status.partner_id);
}
/*==========================================
* PCの所持品情報読み取り
*------------------------------------------
*/
-int buildin_getinventorylist (struct script_state *st)
+static
+void builtin_getinventorylist(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
- int i, j = 0;
+ struct map_session_data *sd = script_rid2sd(st);
+ int i, j = 0;
if (!sd)
- return 0;
+ return;
for (i = 0; i < MAX_INVENTORY; i++)
{
if (sd->status.inventory[i].nameid > 0
&& sd->status.inventory[i].amount > 0)
{
- pc_setreg (sd, add_str ("@inventorylist_id") + (j << 24),
+ pc_setreg(sd, add_str("@inventorylist_id") + (j << 24),
sd->status.inventory[i].nameid);
- pc_setreg (sd, add_str ("@inventorylist_amount") + (j << 24),
+ pc_setreg(sd, add_str("@inventorylist_amount") + (j << 24),
sd->status.inventory[i].amount);
- pc_setreg (sd, add_str ("@inventorylist_equip") + (j << 24),
- sd->status.inventory[i].equip);
- pc_setreg (sd, add_str ("@inventorylist_refine") + (j << 24),
+ pc_setreg(sd, add_str("@inventorylist_equip") + (j << 24),
+ uint16_t(sd->status.inventory[i].equip));
+ pc_setreg(sd, add_str("@inventorylist_refine") + (j << 24),
sd->status.inventory[i].refine);
- pc_setreg (sd, add_str ("@inventorylist_identify") + (j << 24),
+ pc_setreg(sd, add_str("@inventorylist_identify") + (j << 24),
sd->status.inventory[i].identify);
- pc_setreg (sd, add_str ("@inventorylist_attribute") + (j << 24),
+ pc_setreg(sd, add_str("@inventorylist_attribute") + (j << 24),
sd->status.inventory[i].attribute);
- pc_setreg (sd, add_str ("@inventorylist_card1") + (j << 24),
+ pc_setreg(sd, add_str("@inventorylist_card1") + (j << 24),
sd->status.inventory[i].card[0]);
- pc_setreg (sd, add_str ("@inventorylist_card2") + (j << 24),
+ pc_setreg(sd, add_str("@inventorylist_card2") + (j << 24),
sd->status.inventory[i].card[1]);
- pc_setreg (sd, add_str ("@inventorylist_card3") + (j << 24),
+ pc_setreg(sd, add_str("@inventorylist_card3") + (j << 24),
sd->status.inventory[i].card[2]);
- pc_setreg (sd, add_str ("@inventorylist_card4") + (j << 24),
+ pc_setreg(sd, add_str("@inventorylist_card4") + (j << 24),
sd->status.inventory[i].card[3]);
j++;
}
}
- pc_setreg (sd, add_str ("@inventorylist_count"), j);
- return 0;
-}
-
-int buildin_getskilllist (struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd (st);
- int i, j = 0;
- if (!sd)
- return 0;
- for (i = 0; i < MAX_SKILL; i++)
- {
- if (sd->status.skill[i].id > 0 && sd->status.skill[i].lv > 0)
- {
- pc_setreg (sd, add_str ("@skilllist_id") + (j << 24),
- sd->status.skill[i].id);
- pc_setreg (sd, add_str ("@skilllist_lv") + (j << 24),
- sd->status.skill[i].lv);
- pc_setreg (sd, add_str ("@skilllist_flag") + (j << 24),
- sd->status.skill[i].flags);
- j++;
- }
- }
- pc_setreg (sd, add_str ("@skilllist_count"), j);
- return 0;
+ pc_setreg(sd, add_str("@inventorylist_count"), j);
}
-int buildin_get_activated_pool_skills (struct script_state *st)
+static
+void builtin_getactivatedpoolskilllist(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
- int pool_skills[MAX_SKILL_POOL];
- int skill_pool_size = skill_pool (sd, pool_skills);
- int i, count = 0;
+ struct map_session_data *sd = script_rid2sd(st);
+ SkillID pool_skills[MAX_SKILL_POOL];
+ int skill_pool_size = skill_pool(sd, pool_skills);
+ int i, count = 0;
if (!sd)
- return 0;
+ return;
for (i = 0; i < skill_pool_size; i++)
{
- int skill_id = pool_skills[i];
-
- if (sd->status.skill[skill_id].id == skill_id)
- {
- pc_setreg (sd, add_str ("@skilllist_id") + (count << 24),
- sd->status.skill[skill_id].id);
- pc_setreg (sd, add_str ("@skilllist_lv") + (count << 24),
- sd->status.skill[skill_id].lv);
- pc_setreg (sd, add_str ("@skilllist_flag") + (count << 24),
- sd->status.skill[skill_id].flags);
- pc_setregstr (sd, add_str ("@skilllist_name$") + (count << 24),
- skill_name (skill_id));
- ++count;
- }
- }
- pc_setreg (sd, add_str ("@skilllist_count"), count);
-
- return 0;
-}
-
-extern int skill_pool_skills[];
-extern int skill_pool_skills_size;
-
-int buildin_get_unactivated_pool_skills (struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd (st);
- int i, count = 0;
-
- if (!sd)
- return 0;
-
- for (i = 0; i < skill_pool_skills_size; i++)
- {
- int skill_id = skill_pool_skills[i];
+ SkillID skill_id = pool_skills[i];
- if (sd->status.skill[skill_id].id == skill_id && !(sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED))
+ if (sd->status.skill[skill_id].lv)
{
- pc_setreg (sd, add_str ("@skilllist_id") + (count << 24),
- sd->status.skill[skill_id].id);
- pc_setreg (sd, add_str ("@skilllist_lv") + (count << 24),
- sd->status.skill[skill_id].lv);
- pc_setreg (sd, add_str ("@skilllist_flag") + (count << 24),
- sd->status.skill[skill_id].flags);
- pc_setregstr (sd, add_str ("@skilllist_name$") + (count << 24),
- skill_name (skill_id));
+ pc_setreg(sd, add_str("@skilllist_id") + (count << 24),
+ static_cast<uint16_t>(skill_id));
+ pc_setreg(sd, add_str("@skilllist_lv") + (count << 24),
+ sd->status.skill[skill_id].lv);
+ pc_setreg(sd, add_str("@skilllist_flag") + (count << 24),
+ static_cast<uint16_t>(sd->status.skill[skill_id].flags));
+ pc_setregstr(sd, add_str("@skilllist_name$") + (count << 24),
+ skill_name(skill_id));
++count;
}
}
- pc_setreg (sd, add_str ("@skilllist_count"), count);
+ pc_setreg(sd, add_str("@skilllist_count"), count);
- return 0;
}
-int buildin_get_pool_skills (struct script_state *st)
+static
+void builtin_getunactivatedpoolskilllist(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
- int i, count = 0;
+ struct map_session_data *sd = script_rid2sd(st);
+ int i, count = 0;
if (!sd)
- return 0;
+ return;
for (i = 0; i < skill_pool_skills_size; i++)
{
- int skill_id = skill_pool_skills[i];
+ SkillID skill_id = skill_pool_skills[i];
- if (sd->status.skill[skill_id].id == skill_id)
+ if (sd->status.skill[skill_id].lv
+ && !bool(sd->status.skill[skill_id].flags & SkillFlags::POOL_ACTIVATED))
{
- pc_setreg (sd, add_str ("@skilllist_id") + (count << 24),
- sd->status.skill[skill_id].id);
- pc_setreg (sd, add_str ("@skilllist_lv") + (count << 24),
- sd->status.skill[skill_id].lv);
- pc_setreg (sd, add_str ("@skilllist_flag") + (count << 24),
- sd->status.skill[skill_id].flags);
- pc_setregstr (sd, add_str ("@skilllist_name$") + (count << 24),
- skill_name (skill_id));
+ pc_setreg(sd, add_str("@skilllist_id") + (count << 24),
+ static_cast<uint16_t>(skill_id));
+ pc_setreg(sd, add_str("@skilllist_lv") + (count << 24),
+ sd->status.skill[skill_id].lv);
+ pc_setreg(sd, add_str("@skilllist_flag") + (count << 24),
+ static_cast<uint16_t>(sd->status.skill[skill_id].flags));
+ pc_setregstr(sd, add_str("@skilllist_name$") + (count << 24),
+ skill_name(skill_id));
++count;
}
}
- pc_setreg (sd, add_str ("@skilllist_count"), count);
-
- return 0;
+ pc_setreg(sd, add_str("@skilllist_count"), count);
}
-int buildin_activate_pool_skill (struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd (st);
- int skill_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
-
- skill_pool_activate (sd, skill_id);
- clif_skillinfoblock (sd);
-
- return 0;
-}
-
-int buildin_deactivate_pool_skill (struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd (st);
- int skill_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
-
- skill_pool_deactivate (sd, skill_id);
- clif_skillinfoblock (sd);
-
- return 0;
-}
-
-int buildin_check_pool_skill (struct script_state *st)
+static
+void builtin_poolskill(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
- int skill_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ struct map_session_data *sd = script_rid2sd(st);
+ SkillID skill_id = SkillID(conv_num(st, &(st->stack->stack_data[st->start + 2])));
- push_val (st->stack, ScriptCode::INT, skill_pool_is_activated (sd, skill_id));
+ skill_pool_activate(sd, skill_id);
+ clif_skillinfoblock(sd);
- return 0;
-}
-
-int buildin_clearitem (struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd (st);
- int i;
- if (sd == NULL)
- return 0;
- for (i = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.inventory[i].amount)
- pc_delitem (sd, i, sd->status.inventory[i].amount, 0);
- }
- return 0;
}
-/*==========================================
- * NPCクラスチェンジ
- * classは変わりたいclass
- * typeは通常0なのかな?
- *------------------------------------------
- */
-int buildin_classchange (struct script_state *st)
+static
+void builtin_unpoolskill(ScriptState *st)
{
- int npc_class, type;
- struct block_list *bl = map_id2bl (st->oid);
+ struct map_session_data *sd = script_rid2sd(st);
+ SkillID skill_id = SkillID(conv_num(st, &(st->stack->stack_data[st->start + 2])));
- if (bl == NULL)
- return 0;
+ skill_pool_deactivate(sd, skill_id);
+ clif_skillinfoblock(sd);
- npc_class = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- type = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- clif_npc_class_change (bl, npc_class, type);
- return 0;
}
/*==========================================
@@ -6723,123 +3909,82 @@ int buildin_classchange (struct script_state *st)
* the current NPC or invoking PC.
*------------------------------------------
*/
-int buildin_misceffect (struct script_state *st)
+static
+void builtin_misceffect(ScriptState *st)
{
- int type;
- int id = 0;
+ int type;
+ int id = 0;
const char *name = NULL;
struct block_list *bl = NULL;
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ type = conv_num(st, &(st->stack->stack_data[st->start + 2]));
if (st->end > st->start + 3)
{
struct script_data *sdata = &(st->stack->stack_data[st->start + 3]);
- get_val (st, sdata);
+ get_val(st, sdata);
if (sdata->type == ScriptCode::STR || sdata->type == ScriptCode::CONSTSTR)
- name = conv_str (st, sdata);
+ name = conv_str(st, sdata);
else
- id = conv_num (st, sdata);
+ id = conv_num(st, sdata);
}
if (name)
{
- struct map_session_data *sd = map_nick2sd (name);
+ struct map_session_data *sd = map_nick2sd(name);
if (sd)
bl = &sd->bl;
}
else if (id)
- bl = map_id2bl (id);
+ bl = map_id2bl(id);
else if (st->oid)
- bl = map_id2bl (st->oid);
+ bl = map_id2bl(st->oid);
else
{
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
if (sd)
bl = &sd->bl;
}
if (bl)
- clif_misceffect (bl, type);
+ clif_misceffect(bl, type);
- return 0;
-}
-
-/*==========================================
- * サウンドエフェクト
- *------------------------------------------
- */
-int buildin_soundeffect (struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd (st);
- int type = 0;
-
- const char *name = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- type = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- if (sd)
- {
- if (st->oid)
- clif_soundeffect (sd, map_id2bl (st->oid), name, type);
- else
- {
- clif_soundeffect (sd, &sd->bl, name, type);
- }
- }
- return 0;
-}
-
-/*==========================================
- * NPC skill effects [Valaris]
- *------------------------------------------
- */
-int buildin_npcskilleffect (struct script_state *st)
-{
- struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid);
-
- int skillid = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- int skilllv = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- int x = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- int y = conv_num (st, &(st->stack->stack_data[st->start + 5]));
-
- clif_skill_poseffect (&nd->bl, skillid, skilllv, x, y, gettick ());
-
- return 0;
}
/*==========================================
* Special effects [Valaris]
*------------------------------------------
*/
-int buildin_specialeffect (struct script_state *st)
+static
+void builtin_specialeffect(ScriptState *st)
{
- struct block_list *bl = map_id2bl (st->oid);
+ struct block_list *bl = map_id2bl(st->oid);
if (bl == NULL)
- return 0;
+ return;
- clif_specialeffect (bl,
- conv_num (st,
+ clif_specialeffect(bl,
+ conv_num(st,
&(st->stack->stack_data[st->start + 2])),
0);
- return 0;
}
-int buildin_specialeffect2 (struct script_state *st)
+static
+void builtin_specialeffect2(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
if (sd == NULL)
- return 0;
+ return;
- clif_specialeffect (&sd->bl,
- conv_num (st,
+ clif_specialeffect(&sd->bl,
+ conv_num(st,
&(st->stack->stack_data[st->start + 2])),
0);
- return 0;
}
/*==========================================
@@ -6847,20 +3992,19 @@ int buildin_specialeffect2 (struct script_state *st)
*------------------------------------------
*/
-int buildin_nude (struct script_state *st)
+static
+void builtin_nude(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
- int i;
+ struct map_session_data *sd = script_rid2sd(st);
if (sd == NULL)
- return 0;
+ return;
- for (i = 0; i < 11; i++)
+ for (EQUIP i : EQUIPs)
if (sd->equip_index[i] >= 0)
- pc_unequipitem (sd, sd->equip_index[i], i);
- pc_calcstatus (sd, 0);
+ pc_unequipitem(sd, sd->equip_index[i], CalcStatus::LATER);
+ pc_calcstatus(sd, 0);
- return 0;
}
/*==========================================
@@ -6868,20 +4012,21 @@ int buildin_nude (struct script_state *st)
*------------------------------------------
*/
-int buildin_unequip_by_id (struct script_state *st)
+static
+void builtin_unequipbyid(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
if (sd == NULL)
- return 0;
+ return;
- int slot_id = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ EQUIP slot_id = EQUIP(conv_num(st, &(st->stack->stack_data[st->start + 2])));
- if (slot_id >= 0 && slot_id < 11 && sd->equip_index[slot_id] >= 0)
- pc_unequipitem (sd, sd->equip_index[slot_id], slot_id);
+ if (slot_id >= EQUIP() && slot_id < EQUIP::COUNT
+ && sd->equip_index[slot_id] >= 0)
+ pc_unequipitem(sd, sd->equip_index[slot_id], CalcStatus::LATER);
- pc_calcstatus (sd, 0);
+ pc_calcstatus(sd, 0);
- return 0;
}
/*==========================================
@@ -6891,36 +4036,16 @@ int buildin_unequip_by_id (struct script_state *st)
*------------------------------------------
*/
-int buildin_gmcommand (struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
- const char *cmd = conv_str (st, &(st->stack->stack_data[st->start + 2]));
-
- is_atcommand (sd->fd, sd, cmd, 99);
-
- return 0;
-}
-
-/*==========================================
- * movenpc [MouseJstr]
- *------------------------------------------
- */
-
-int buildin_movenpc (struct script_state *st)
+static
+void builtin_gmcommand(ScriptState *st)
{
struct map_session_data *sd;
- int x, y;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
+ const char *cmd = conv_str(st, &(st->stack->stack_data[st->start + 2]));
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- const char *npc = conv_str (st, &(st->stack->stack_data[st->start + 5]));
+ is_atcommand(sd->fd, sd, cmd, 99);
- return 0;
}
/*==========================================
@@ -6928,18 +4053,19 @@ int buildin_movenpc (struct script_state *st)
* Move NPC to a new position on the same map.
*------------------------------------------
*/
-int buildin_npcwarp (struct script_state *st)
+static
+void builtin_npcwarp(ScriptState *st)
{
- int x, y;
+ int x, y;
struct npc_data *nd = NULL;
- x = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- y = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- const char *npc = conv_str (st, &(st->stack->stack_data[st->start + 4]));
- nd = npc_name2id (npc);
+ x = conv_num(st, &(st->stack->stack_data[st->start + 2]));
+ y = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ const char *npc = conv_str(st, &(st->stack->stack_data[st->start + 4]));
+ nd = npc_name2id(npc);
if (!nd)
- return -1;
+ return;
short m = nd->bl.m;
@@ -6947,16 +4073,15 @@ int buildin_npcwarp (struct script_state *st)
if (m < 0 || !nd->bl.prev
|| x < 0 || x > map[m].xs -1
|| y < 0 || y > map[m].ys - 1)
- return -1;
+ return;
- npc_enable (npc, 0);
+ npc_enable(npc, 0);
map_delblock(&nd->bl); /* [Freeyorp] */
nd->bl.x = x;
nd->bl.y = y;
map_addblock(&nd->bl);
- npc_enable (npc, 1);
+ npc_enable(npc, 1);
- return 0;
}
/*==========================================
@@ -6964,18 +4089,18 @@ int buildin_npcwarp (struct script_state *st)
*------------------------------------------
*/
-int buildin_message (struct script_state *st)
+static
+void builtin_message(ScriptState *st)
{
struct map_session_data *pl_sd = NULL;
- const char *player = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- const char *msg = conv_str (st, &(st->stack->stack_data[st->start + 3]));
+ const char *player = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ const char *msg = conv_str(st, &(st->stack->stack_data[st->start + 3]));
- if ((pl_sd = map_nick2sd ((char *) player)) == NULL)
- return 1;
- clif_displaymessage (pl_sd->fd, msg);
+ if ((pl_sd = map_nick2sd(player)) == NULL)
+ return;
+ clif_displaymessage(pl_sd->fd, msg);
- return 0;
}
/*==========================================
@@ -6984,129 +4109,99 @@ int buildin_message (struct script_state *st)
*------------------------------------------
*/
-int buildin_npctalk (struct script_state *st)
+static
+void builtin_npctalk(ScriptState *st)
{
char message[255];
- struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid);
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
+ struct npc_data *nd = (struct npc_data *) map_id2bl(st->oid);
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
if (nd)
{
- memcpy (message, nd->name, 24);
- strcat (message, " : ");
- strcat (message, str);
- clif_message (&(nd->bl), message);
- }
-
- return 0;
-}
-
-/*==========================================
- * hasitems (checks to see if player has any
- * items on them, if so will return a 1)
- * [Valaris]
- *------------------------------------------
- */
-
-int buildin_hasitems (struct script_state *st)
-{
- int i;
- struct map_session_data *sd;
-
- sd = script_rid2sd (st);
-
- for (i = 0; i < MAX_INVENTORY; i++)
- {
- if (sd->status.inventory[i].amount)
- {
- push_val (st->stack, ScriptCode::INT, 1);
- return 0;
- }
+ memcpy(message, nd->name, 24);
+ strcat(message, " : ");
+ strcat(message, str);
+ clif_message(&nd->bl, message);
}
- push_val (st->stack, ScriptCode::INT, 0);
-
- return 0;
}
/*==========================================
* getlook char info. getlook(arg)
*------------------------------------------
*/
-int buildin_getlook (struct script_state *st)
+static
+void builtin_getlook(ScriptState *st)
{
- int type, val;
- struct map_session_data *sd;
- sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
- val = -1;
+ LOOK type = LOOK(conv_num(st, &(st->stack->stack_data[st->start + 2])));
+ int val = -1;
switch (type)
{
- case LOOK_HAIR: //1
+ case LOOK::HAIR: //1
val = sd->status.hair;
break;
- case LOOK_WEAPON: //2
- val = sd->status.weapon;
+ case LOOK::WEAPON: //2
+ val = static_cast<uint16_t>(sd->status.weapon);
break;
- case LOOK_HEAD_BOTTOM: //3
+ case LOOK::HEAD_BOTTOM: //3
val = sd->status.head_bottom;
break;
- case LOOK_HEAD_TOP: //4
+ case LOOK::HEAD_TOP: //4
val = sd->status.head_top;
break;
- case LOOK_HEAD_MID: //5
+ case LOOK::HEAD_MID: //5
val = sd->status.head_mid;
break;
- case LOOK_HAIR_COLOR: //6
+ case LOOK::HAIR_COLOR: //6
val = sd->status.hair_color;
break;
- case LOOK_CLOTHES_COLOR: //7
+ case LOOK::CLOTHES_COLOR: //7
val = sd->status.clothes_color;
break;
- case LOOK_SHIELD: //8
+ case LOOK::SHIELD: //8
val = sd->status.shield;
break;
- case LOOK_SHOES: //9
+ case LOOK::SHOES: //9
break;
}
- push_val (st->stack, ScriptCode::INT, val);
- return 0;
+ push_val(st->stack, ScriptCode::INT, val);
}
/*==========================================
* get char save point. argument: 0- map name, 1- x, 2- y
*------------------------------------------
*/
-int buildin_getsavepoint (struct script_state *st)
+static
+void builtin_getsavepoint(ScriptState *st)
{
- int x, y, type;
+ int x, y, type;
char *mapname;
struct map_session_data *sd;
- sd = script_rid2sd (st);
+ sd = script_rid2sd(st);
- type = conv_num (st, &(st->stack->stack_data[st->start + 2]));
+ type = conv_num(st, &(st->stack->stack_data[st->start + 2]));
x = sd->status.save_point.x;
y = sd->status.save_point.y;
switch (type)
{
case 0:
- mapname = (char*)calloc (24, 1);
- strncpy (mapname, sd->status.save_point.map, 23);
- push_str (st->stack, ScriptCode::STR, mapname);
+ mapname = (char*)calloc(24, 1);
+ strncpy(mapname, sd->status.save_point.map, 23);
+ push_str(st->stack, ScriptCode::STR, mapname);
break;
case 1:
- push_val (st->stack, ScriptCode::INT, x);
+ push_val(st->stack, ScriptCode::INT, x);
break;
case 2:
- push_val (st->stack, ScriptCode::INT, y);
+ push_val(st->stack, ScriptCode::INT, y);
break;
}
- return 0;
}
/*==========================================
@@ -7114,142 +4209,144 @@ int buildin_getsavepoint (struct script_state *st)
*------------------------------------------
*/
static
-int buildin_areatimer_sub (struct block_list *bl, va_list ap)
+void builtin_areatimer_sub(struct block_list *bl, interval_t tick, const char *event)
{
- int tick;
- char *event;
- tick = va_arg (ap, int);
- event = va_arg (ap, char *);
- pc_addeventtimer ((struct map_session_data *) bl, tick, event);
- return 0;
+ pc_addeventtimer((struct map_session_data *) bl, tick, event);
}
-int buildin_areatimer (struct script_state *st)
+static
+void builtin_areatimer(ScriptState *st)
{
- int tick, m;
- int x0, y0, x1, y1;
+ int m;
+ int x0, y0, x1, y1;
- const char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x0 = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y0 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- x1 = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- y1 = conv_num (st, &(st->stack->stack_data[st->start + 6]));
- tick = conv_num (st, &(st->stack->stack_data[st->start + 7]));
- const char *event = conv_str (st, &(st->stack->stack_data[st->start + 8]));
+ const char *mapname = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x0 = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y0 = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ x1 = conv_num(st, &(st->stack->stack_data[st->start + 5]));
+ y1 = conv_num(st, &(st->stack->stack_data[st->start + 6]));
+ interval_t tick = static_cast<interval_t>(conv_num(st, &(st->stack->stack_data[st->start + 7])));
+ const char *event = conv_str(st, &(st->stack->stack_data[st->start + 8]));
- if ((m = map_mapname2mapid (mapname)) < 0)
- return 0;
+ if ((m = map_mapname2mapid(mapname)) < 0)
+ return;
- map_foreachinarea (buildin_areatimer_sub,
- m, x0, y0, x1, y1, BL_PC, tick, event);
- return 0;
+ map_foreachinarea(std::bind(builtin_areatimer_sub, ph::_1, tick, event),
+ m, x0, y0, x1, y1, BL::PC);
}
/*==========================================
* Check whether the PC is in the specified rectangle
*------------------------------------------
*/
-int buildin_isin (struct script_state *st)
+static
+void builtin_isin(ScriptState *st)
{
- int x1, y1, x2, y2;
- struct map_session_data *sd = script_rid2sd (st);
+ int x1, y1, x2, y2;
+ struct map_session_data *sd = script_rid2sd(st);
- const char *str = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- x1 = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- y1 = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- x2 = conv_num (st, &(st->stack->stack_data[st->start + 5]));
- y2 = conv_num (st, &(st->stack->stack_data[st->start + 6]));
+ const char *str = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ x1 = conv_num(st, &(st->stack->stack_data[st->start + 3]));
+ y1 = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ x2 = conv_num(st, &(st->stack->stack_data[st->start + 5]));
+ y2 = conv_num(st, &(st->stack->stack_data[st->start + 6]));
if (!sd)
- return 1;
+ return;
- push_val (st->stack, ScriptCode::INT,
+ push_val(st->stack, ScriptCode::INT,
(sd->bl.x >= x1 && sd->bl.x <= x2)
&& (sd->bl.y >= y1 && sd->bl.y <= y2)
- && (!strcmp (str, map[sd->bl.m].name)));
+ && (!strcmp(str, map[sd->bl.m].name)));
- return 0;
}
// Trigger the shop on a (hopefully) nearby shop NPC
-int buildin_shop (struct script_state *st)
+static
+void builtin_shop(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
struct npc_data *nd;
if (!sd)
- return 1;
+ return;
- nd = npc_name2id (conv_str (st, &(st->stack->stack_data[st->start + 2])));
+ nd = npc_name2id(conv_str(st, &(st->stack->stack_data[st->start + 2])));
if (!nd)
- return 1;
+ return;
- buildin_close (st);
- clif_npcbuysell (sd, nd->bl.id);
- return 0;
+ builtin_close(st);
+ clif_npcbuysell(sd, nd->bl.id);
}
/*==========================================
* Check whether the PC is dead
*------------------------------------------
*/
-int buildin_isdead (struct script_state *st)
+static
+void builtin_isdead(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
- push_val (st->stack, ScriptCode::INT, pc_isdead (sd));
- return 0;
+ push_val(st->stack, ScriptCode::INT, pc_isdead(sd));
}
/*========================================
* Changes a NPC name, and sprite
*----------------------------------------
*/
-int buildin_fakenpcname (struct script_state *st)
+static
+void builtin_fakenpcname(ScriptState *st)
{
- int newsprite;
- struct npc_data *nd;
-
- const char *name = conv_str (st, &(st->stack->stack_data[st->start + 2]));
- const char *newname = conv_str (st, &(st->stack->stack_data[st->start + 3]));
- newsprite = conv_num (st, &(st->stack->stack_data[st->start + 4]));
- nd = npc_name2id (name);
+ const char *name = conv_str(st, &(st->stack->stack_data[st->start + 2]));
+ const char *newname = conv_str(st, &(st->stack->stack_data[st->start + 3]));
+ int newsprite = conv_num(st, &(st->stack->stack_data[st->start + 4]));
+ struct npc_data *nd = npc_name2id(name);
if (!nd)
- return 1;
- strncpy (nd->name, newname, sizeof(nd->name)-1);
- nd->name[sizeof(nd->name)-1] = '\0';
+ return;
+ strzcpy(nd->name, newname, sizeof(nd->name));
nd->npc_class = newsprite;
// Refresh this npc
- npc_enable (name, 0);
- npc_enable (name, 1);
+ npc_enable(name, 0);
+ npc_enable(name, 1);
- return 0;
}
/*============================
* Gets the PC's x pos
*----------------------------
*/
-
-int buildin_getx (struct script_state *st)
+static
+void builtin_getx(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
- push_val (st->stack, ScriptCode::INT, sd->bl.x);
- return 0;
+ push_val(st->stack, ScriptCode::INT, sd->bl.x);
}
/*============================
* Gets the PC's y pos
*----------------------------
*/
-int buildin_gety (struct script_state *st)
+static
+void builtin_gety(ScriptState *st)
{
- struct map_session_data *sd = script_rid2sd (st);
+ struct map_session_data *sd = script_rid2sd(st);
- push_val (st->stack, ScriptCode::INT, sd->bl.y);
- return 0;
+ push_val(st->stack, ScriptCode::INT, sd->bl.y);
+}
+
+/*
+ * Get the PC's current map's name
+ */
+static
+void builtin_getmap(ScriptState *st)
+{
+ struct map_session_data *sd = script_rid2sd(st);
+
+ // A map_data lives essentially forever.
+ push_str(st->stack, ScriptCode::CONSTSTR, map[sd->bl.m].name);
}
//
@@ -7260,7 +4357,7 @@ int buildin_gety (struct script_state *st)
*------------------------------------------
*/
static
-ScriptCode get_com (const ScriptCode *script, int *pos_)
+ScriptCode get_com(const ScriptCode *script, int *pos_)
{
if (static_cast<uint8_t>(script[*pos_]) >= 0x80)
{
@@ -7274,10 +4371,10 @@ ScriptCode get_com (const ScriptCode *script, int *pos_)
*------------------------------------------
*/
static
-int get_num (const ScriptCode *scr, int *pos_)
+int get_num(const ScriptCode *scr, int *pos_)
{
const uint8_t *script = reinterpret_cast<const uint8_t *>(scr);
- int i, j;
+ int i, j;
i = 0;
j = 0;
while (script[*pos_] >= 0xc0)
@@ -7293,35 +4390,40 @@ int get_num (const ScriptCode *scr, int *pos_)
*------------------------------------------
*/
static
-int pop_val (struct script_state *st)
+int pop_val(ScriptState *st)
{
if (st->stack->sp <= 0)
return 0;
st->stack->sp--;
- get_val (st, &(st->stack->stack_data[st->stack->sp]));
+ get_val(st, &(st->stack->stack_data[st->stack->sp]));
if (st->stack->stack_data[st->stack->sp].type == ScriptCode::INT)
return st->stack->stack_data[st->stack->sp].u.num;
return 0;
}
-#define isstr(c) ((c).type==ScriptCode::STR || (c).type==ScriptCode::CONSTSTR)
+static
+bool isstr(struct script_data& c)
+{
+ return c.type == ScriptCode::STR
+ || c.type == ScriptCode::CONSTSTR;
+}
/*==========================================
* 加算演算子
*------------------------------------------
*/
static
-void op_add (struct script_state *st)
+void op_add(ScriptState *st)
{
st->stack->sp--;
- get_val (st, &(st->stack->stack_data[st->stack->sp]));
- get_val (st, &(st->stack->stack_data[st->stack->sp - 1]));
+ get_val(st, &(st->stack->stack_data[st->stack->sp]));
+ get_val(st, &(st->stack->stack_data[st->stack->sp - 1]));
- if (isstr (st->stack->stack_data[st->stack->sp])
- || isstr (st->stack->stack_data[st->stack->sp - 1]))
+ if (isstr(st->stack->stack_data[st->stack->sp])
+ || isstr(st->stack->stack_data[st->stack->sp - 1]))
{
- conv_str (st, &(st->stack->stack_data[st->stack->sp]));
- conv_str (st, &(st->stack->stack_data[st->stack->sp - 1]));
+ conv_str(st, &(st->stack->stack_data[st->stack->sp]));
+ conv_str(st, &(st->stack->stack_data[st->stack->sp - 1]));
}
if (st->stack->stack_data[st->stack->sp].type == ScriptCode::INT)
{ // ii
@@ -7332,11 +4434,11 @@ void op_add (struct script_state *st)
{ // ssの予定
char *buf;
buf = (char *)
- calloc (strlen (st->stack->stack_data[st->stack->sp - 1].u.str) +
- strlen (st->stack->stack_data[st->stack->sp].u.str) + 1,
+ calloc(strlen(st->stack->stack_data[st->stack->sp - 1].u.str) +
+ strlen(st->stack->stack_data[st->stack->sp].u.str) + 1,
1);
- strcpy (buf, st->stack->stack_data[st->stack->sp - 1].u.str);
- strcat (buf, st->stack->stack_data[st->stack->sp].u.str);
+ strcpy(buf, st->stack->stack_data[st->stack->sp - 1].u.str);
+ strcat(buf, st->stack->stack_data[st->stack->sp].u.str);
if (st->stack->stack_data[st->stack->sp - 1].type == ScriptCode::STR)
free(const_cast<char *>(st->stack->stack_data[st->stack->sp - 1].u.str));
if (st->stack->stack_data[st->stack->sp].type == ScriptCode::STR)
@@ -7351,38 +4453,38 @@ void op_add (struct script_state *st)
*------------------------------------------
*/
static
-void op_2str (struct script_state *st, ScriptCode op, int sp1, int sp2)
+void op_2str(ScriptState *st, ScriptCode op, int sp1, int sp2)
{
const char *s1 = st->stack->stack_data[sp1].u.str;
const char *s2 = st->stack->stack_data[sp2].u.str;
- int a = 0;
+ int a = 0;
switch (op)
{
case ScriptCode::EQ:
- a = (strcmp (s1, s2) == 0);
+ a = (strcmp(s1, s2) == 0);
break;
case ScriptCode::NE:
- a = (strcmp (s1, s2) != 0);
+ a = (strcmp(s1, s2) != 0);
break;
case ScriptCode::GT:
- a = (strcmp (s1, s2) > 0);
+ a = (strcmp(s1, s2) > 0);
break;
case ScriptCode::GE:
- a = (strcmp (s1, s2) >= 0);
+ a = (strcmp(s1, s2) >= 0);
break;
case ScriptCode::LT:
- a = (strcmp (s1, s2) < 0);
+ a = (strcmp(s1, s2) < 0);
break;
case ScriptCode::LE:
- a = (strcmp (s1, s2) <= 0);
+ a = (strcmp(s1, s2) <= 0);
break;
default:
- printf ("illegal string operater\n");
+ PRINTF("illegal string operater\n");
break;
}
- push_val (st->stack, ScriptCode::INT, a);
+ push_val(st->stack, ScriptCode::INT, a);
if (st->stack->stack_data[sp1].type == ScriptCode::STR)
free(const_cast<char *>(s1));
@@ -7395,7 +4497,7 @@ void op_2str (struct script_state *st, ScriptCode op, int sp1, int sp2)
*------------------------------------------
*/
static
-void op_2num (struct script_state *st, ScriptCode op, int i1, int i2)
+void op_2num(ScriptState *st, ScriptCode op, int i1, int i2)
{
switch (op)
{
@@ -7451,7 +4553,7 @@ void op_2num (struct script_state *st, ScriptCode op, int i1, int i2)
i1 = i1 << i2;
break;
}
- push_val (st->stack, ScriptCode::INT, i1);
+ push_val(st->stack, ScriptCode::INT, i1);
}
/*==========================================
@@ -7459,34 +4561,34 @@ void op_2num (struct script_state *st, ScriptCode op, int i1, int i2)
*------------------------------------------
*/
static
-void op_2 (struct script_state *st, ScriptCode op)
+void op_2(ScriptState *st, ScriptCode op)
{
- int i1, i2;
+ int i1, i2;
const char *s1 = NULL, *s2 = NULL;
- i2 = pop_val (st);
- if (isstr (st->stack->stack_data[st->stack->sp]))
+ i2 = pop_val(st);
+ if (isstr(st->stack->stack_data[st->stack->sp]))
s2 = st->stack->stack_data[st->stack->sp].u.str;
- i1 = pop_val (st);
- if (isstr (st->stack->stack_data[st->stack->sp]))
+ i1 = pop_val(st);
+ if (isstr(st->stack->stack_data[st->stack->sp]))
s1 = st->stack->stack_data[st->stack->sp].u.str;
if (s1 != NULL && s2 != NULL)
{
// ss => op_2str
- op_2str (st, op, st->stack->sp, st->stack->sp + 1);
+ op_2str(st, op, st->stack->sp, st->stack->sp + 1);
}
else if (s1 == NULL && s2 == NULL)
{
// ii => op_2num
- op_2num (st, op, i1, i2);
+ op_2num(st, op, i1, i2);
}
else
{
// si,is => error
- printf ("script: op_2: int&str, str&int not allow.");
- push_val (st->stack, ScriptCode::INT, 0);
+ PRINTF("script: op_2: int&str, str&int not allow.");
+ push_val(st->stack, ScriptCode::INT, 0);
}
}
@@ -7495,10 +4597,10 @@ void op_2 (struct script_state *st, ScriptCode op)
*------------------------------------------
*/
static
-void op_1num (struct script_state *st, ScriptCode op)
+void op_1num(ScriptState *st, ScriptCode op)
{
- int i1;
- i1 = pop_val (st);
+ int i1;
+ i1 = pop_val(st);
switch (op)
{
case ScriptCode::NEG:
@@ -7511,16 +4613,16 @@ void op_1num (struct script_state *st, ScriptCode op)
i1 = !i1;
break;
}
- push_val (st->stack, ScriptCode::INT, i1);
+ push_val(st->stack, ScriptCode::INT, i1);
}
/*==========================================
* 関数の実行
*------------------------------------------
*/
-int run_func (struct script_state *st)
+void run_func(ScriptState *st)
{
- int i, start_sp, end_sp, func;
+ int i, start_sp, end_sp, func;
end_sp = st->stack->sp;
for (i = end_sp - 1; i >= 0 && st->stack->stack_data[i].type != ScriptCode::ARG;
@@ -7528,10 +4630,10 @@ int run_func (struct script_state *st)
if (i == 0)
{
if (battle_config.error_log)
- printf ("function not found\n");
+ PRINTF("function not found\n");
// st->stack->sp=0;
st->state = END;
- return 0;
+ return;
}
start_sp = i - 1;
st->start = i - 1;
@@ -7541,82 +4643,82 @@ int run_func (struct script_state *st)
if (st->stack->stack_data[st->start].type != ScriptCode::NAME
|| str_data[func].type != ScriptCode::FUNC)
{
- printf ("run_func: not function and command! \n");
+ PRINTF("run_func: not function and command! \n");
// st->stack->sp=0;
st->state = END;
- return 0;
+ return;
}
#ifdef DEBUG_RUN
if (battle_config.etc_log)
{
- printf ("run_func : %s? (%d(%d))\n", str_buf + str_data[func].str,
+ PRINTF("run_func : %s? (%d(%d))\n", str_buf + str_data[func].str,
func, str_data[func].type);
- printf ("stack dump :");
+ PRINTF("stack dump :");
for (i = 0; i < end_sp; i++)
{
switch (st->stack->stack_data[i].type)
{
case ScriptCode::INT:
- printf (" int(%d)", st->stack->stack_data[i].u.num);
+ PRINTF(" int(%d)", st->stack->stack_data[i].u.num);
break;
case ScriptCode::NAME:
- printf (" name(%s)",
+ PRINTF(" name(%s)",
str_buf +
str_data[st->stack->stack_data[i].u.num].str);
break;
case ScriptCode::ARG:
- printf (" arg");
+ PRINTF(" arg");
break;
case ScriptCode::POS:
- printf (" pos(%d)", st->stack->stack_data[i].u.num);
+ PRINTF(" pos(%d)", st->stack->stack_data[i].u.num);
break;
default:
- printf (" %d,%d", st->stack->stack_data[i].type,
+ PRINTF(" %d,%d", st->stack->stack_data[i].type,
st->stack->stack_data[i].u.num);
}
}
- printf ("\n");
+ PRINTF("\n");
}
#endif
if (str_data[func].func)
{
- str_data[func].func (st);
+ str_data[func].func(st);
}
else
{
if (battle_config.error_log)
- printf ("run_func : %s? (%d(%d))\n", str_buf + str_data[func].str,
+ PRINTF("run_func : %s? (%d(%d))\n", str_buf + str_data[func].str,
func, str_data[func].type);
- push_val (st->stack, ScriptCode::INT, 0);
+ push_val(st->stack, ScriptCode::INT, 0);
}
- pop_stack (st->stack, start_sp, end_sp);
+ pop_stack(st->stack, start_sp, end_sp);
if (st->state == RETFUNC)
{
// ユーザー定義関数からの復帰
- int olddefsp = st->defsp;
+ int olddefsp = st->defsp;
- pop_stack (st->stack, st->defsp, start_sp); // 復帰に邪魔なスタック削除
+ pop_stack(st->stack, st->defsp, start_sp); // 復帰に邪魔なスタック削除
if (st->defsp < 4
|| st->stack->stack_data[st->defsp - 1].type != ScriptCode::RETINFO)
{
- printf
- ("script:run_func(return) return without callfunc or callsub!\n");
+ PRINTF("script:run_func (return) return without callfunc or callsub!\n");
st->state = END;
- return 0;
+ return;
}
- i = conv_num (st, &(st->stack->stack_data[st->defsp - 4])); // 引数の数所得
- st->pos = conv_num (st, &(st->stack->stack_data[st->defsp - 1])); // スクリプト位置の復元
- st->script = (ScriptCode *) conv_num (st, &(st->stack->stack_data[st->defsp - 2])); // スクリプトを復元
- st->defsp = conv_num (st, &(st->stack->stack_data[st->defsp - 3])); // 基準スタックポインタを復元
+ assert (olddefsp == st->defsp); // pretty sure it hasn't changed yet
+ st->script = conv_script(st, &(st->stack->stack_data[olddefsp - 1])); // スクリプトを復元
+ st->pos = conv_num(st, &(st->stack->stack_data[olddefsp - 2])); // スクリプト位置の復元
+ st->defsp = conv_num(st, &(st->stack->stack_data[olddefsp - 3])); // 基準スタックポインタを復元
+ // Number of arguments.
+ i = conv_num(st, &(st->stack->stack_data[olddefsp - 4])); // 引数の数所得
+ assert (i == 0);
- pop_stack (st->stack, olddefsp - 4 - i, olddefsp); // 要らなくなったスタック(引数と復帰用データ)削除
+ pop_stack(st->stack, olddefsp - 4 - i, olddefsp); // 要らなくなったスタック(引数と復帰用データ)削除
st->state = GOTO;
}
-
- return 0;
}
/*==========================================
@@ -7624,12 +4726,12 @@ int run_func (struct script_state *st)
*------------------------------------------
*/
static
-int run_script_main (const ScriptCode *script, int pos_, int rid, int oid,
- struct script_state *st, const ScriptCode *rootscript)
+void run_script_main(const ScriptCode *script, int pos_, int, int,
+ ScriptState *st, const ScriptCode *rootscript)
{
int rerun_pos;
- int cmdcount = script_config.check_cmdcount;
- int gotocount = script_config.check_gotocount;
+ int cmdcount = script_config.check_cmdcount;
+ int gotocount = script_config.check_gotocount;
struct script_stack *stack = st->stack;
st->defsp = stack->sp;
@@ -7638,35 +4740,35 @@ int run_script_main (const ScriptCode *script, int pos_, int rid, int oid,
rerun_pos = st->pos;
for (st->state = 0; st->state == 0;)
{
- switch (ScriptCode c = get_com (script, &st->pos))
+ switch (ScriptCode c = get_com(script, &st->pos))
{
case ScriptCode::EOL:
if (stack->sp != st->defsp)
{
if (battle_config.error_log)
- printf ("stack.sp(%d) != default(%d)\n", stack->sp,
+ PRINTF("stack.sp (%d) != default (%d)\n", stack->sp,
st->defsp);
stack->sp = st->defsp;
}
rerun_pos = st->pos;
break;
case ScriptCode::INT:
- push_val (stack, ScriptCode::INT, get_num (script, &st->pos));
+ push_val(stack, ScriptCode::INT, get_num(script, &st->pos));
break;
case ScriptCode::POS:
case ScriptCode::NAME:
- push_val (stack, c, (*(int *) (script + st->pos)) & 0xffffff);
+ push_val(stack, c, (*(const int *)(script + st->pos)) & 0xffffff);
st->pos += 3;
break;
case ScriptCode::ARG:
- push_val (stack, c, 0);
+ push_val(stack, c, 0);
break;
case ScriptCode::STR:
- push_str (stack, ScriptCode::CONSTSTR, reinterpret_cast<const char *>(script + st->pos));
+ push_str(stack, ScriptCode::CONSTSTR, reinterpret_cast<const char *>(script + st->pos));
while (script[st->pos++] != ScriptCode::NOP);
break;
case ScriptCode::FUNC:
- run_func (st);
+ run_func(st);
if (st->state == GOTO)
{
rerun_pos = st->pos;
@@ -7674,14 +4776,14 @@ int run_script_main (const ScriptCode *script, int pos_, int rid, int oid,
st->state = 0;
if (gotocount > 0 && (--gotocount) <= 0)
{
- printf ("run_script: infinity loop !\n");
+ PRINTF("run_script: infinity loop !\n");
st->state = END;
}
}
break;
case ScriptCode::ADD:
- op_add (st);
+ op_add(st);
break;
case ScriptCode::SUB:
@@ -7701,13 +4803,13 @@ int run_script_main (const ScriptCode *script, int pos_, int rid, int oid,
case ScriptCode::LOR:
case ScriptCode::R_SHIFT:
case ScriptCode::L_SHIFT:
- op_2 (st, c);
+ op_2(st, c);
break;
case ScriptCode::NEG:
case ScriptCode::NOT:
case ScriptCode::LNOT:
- op_1num (st, c);
+ op_1num(st, c);
break;
case ScriptCode::NOP:
@@ -7716,13 +4818,13 @@ int run_script_main (const ScriptCode *script, int pos_, int rid, int oid,
default:
if (battle_config.error_log)
- printf ("unknown command : %d @ %d\n", c, pos_);
+ PRINTF("unknown command : %d @ %d\n", c, pos_);
st->state = END;
break;
}
if (cmdcount > 0 && (--cmdcount) <= 0)
{
- printf ("run_script: infinity loop !\n");
+ PRINTF("run_script: infinity loop !\n");
st->state = END;
}
}
@@ -7732,10 +4834,10 @@ int run_script_main (const ScriptCode *script, int pos_, int rid, int oid,
break;
case END:
{
- struct map_session_data *sd = map_id2sd (st->rid);
+ struct map_session_data *sd = map_id2sd(st->rid);
st->pos = -1;
if (sd && sd->npc_id == st->oid)
- npc_event_dequeue (sd);
+ npc_event_dequeue(sd);
}
break;
case RERUNLINE:
@@ -7748,15 +4850,15 @@ int run_script_main (const ScriptCode *script, int pos_, int rid, int oid,
if (st->state != END)
{
// 再開するためにスタック情報を保存
- struct map_session_data *sd = map_id2sd (st->rid);
+ struct map_session_data *sd = map_id2sd(st->rid);
if (sd /* && sd->npc_stackbuf==NULL */ )
{
if (sd->npc_stackbuf)
- free (sd->npc_stackbuf);
- sd->npc_stackbuf = (char *)
- calloc (sizeof (stack->stack_data[0]) * stack->sp_max, 1);
- memcpy (sd->npc_stackbuf, stack->stack_data,
- sizeof (stack->stack_data[0]) * stack->sp_max);
+ free(sd->npc_stackbuf);
+ sd->npc_stackbuf = (struct script_data *)
+ calloc(sizeof(stack->stack_data[0]) * stack->sp_max, 1);
+ memcpy(sd->npc_stackbuf, stack->stack_data,
+ sizeof(stack->stack_data[0]) * stack->sp_max);
sd->npc_stack = stack->sp;
sd->npc_stackmax = stack->sp_max;
sd->npc_script = script;
@@ -7764,26 +4866,25 @@ int run_script_main (const ScriptCode *script, int pos_, int rid, int oid,
}
}
- return 0;
}
/*==========================================
* スクリプトの実行
*------------------------------------------
*/
-int run_script (const ScriptCode *script, int pos_, int rid, int oid)
+int run_script(const ScriptCode *script, int pos_, int rid, int oid)
{
- return run_script_l (script, pos_, rid, oid, 0, NULL);
+ return run_script_l(script, pos_, rid, oid, 0, NULL);
}
-int run_script_l (const ScriptCode *script, int pos_, int rid, int oid,
- int args_nr, argrec_t * args)
+int run_script_l(const ScriptCode *script, int pos_, int rid, int oid,
+ int args_nr, argrec_t *args)
{
struct script_stack stack;
- struct script_state st;
- struct map_session_data *sd = map_id2sd (rid);
+ ScriptState st;
+ struct map_session_data *sd = map_id2sd(rid);
const ScriptCode *rootscript = script;
- int i;
+ int i;
if (script == NULL || pos_ < 0)
return -1;
@@ -7794,10 +4895,10 @@ int run_script_l (const ScriptCode *script, int pos_, int rid, int oid,
stack.sp = sd->npc_stack;
stack.sp_max = sd->npc_stackmax;
stack.stack_data = (struct script_data *)
- calloc (stack.sp_max, sizeof (stack.stack_data[0]));
- memcpy (stack.stack_data, sd->npc_stackbuf,
- sizeof (stack.stack_data[0]) * stack.sp_max);
- free (sd->npc_stackbuf);
+ calloc(stack.sp_max, sizeof(stack.stack_data[0]));
+ memcpy(stack.stack_data, sd->npc_stackbuf,
+ sizeof(stack.stack_data[0]) * stack.sp_max);
+ free(sd->npc_stackbuf);
sd->npc_stackbuf = NULL;
}
else
@@ -7806,7 +4907,7 @@ int run_script_l (const ScriptCode *script, int pos_, int rid, int oid,
stack.sp = 0;
stack.sp_max = 64;
stack.stack_data = (struct script_data *)
- calloc (stack.sp_max, sizeof (stack.stack_data[0]));
+ calloc(stack.sp_max, sizeof(stack.stack_data[0]));
}
st.stack = &stack;
st.pos = pos_;
@@ -7814,14 +4915,14 @@ int run_script_l (const ScriptCode *script, int pos_, int rid, int oid,
st.oid = oid;
for (i = 0; i < args_nr; i++)
{
- if (args[i].name[strlen (args[i].name) - 1] == '$')
- pc_setregstr (sd, add_str (args[i].name), args[i].v.s);
+ if (args[i].name[strlen(args[i].name) - 1] == '$')
+ pc_setregstr(sd, add_str(args[i].name), args[i].v.s);
else
- pc_setreg (sd, add_str (args[i].name), args[i].v.i);
+ pc_setreg(sd, add_str(args[i].name), args[i].v.i);
}
- run_script_main (script, pos_, rid, oid, &st, rootscript);
+ run_script_main(script, pos_, rid, oid, &st, rootscript);
- free (stack.stack_data);
+ free(stack.stack_data);
stack.stack_data = NULL;
return st.pos;
}
@@ -7830,206 +4931,146 @@ int run_script_l (const ScriptCode *script, int pos_, int rid, int oid,
* マップ変数の変更
*------------------------------------------
*/
-int mapreg_setreg (int num, int val)
+void mapreg_setreg(int num, int val)
{
- if (val != 0)
- numdb_insert (mapreg_db, num, val);
- else
- numdb_erase (mapreg_db, num);
+ mapreg_db.put(num, val);
mapreg_dirty = 1;
- return 0;
}
/*==========================================
* 文字列型マップ変数の変更
*------------------------------------------
*/
-int mapreg_setregstr (int num, const char *str)
+void mapreg_setregstr(int num, const char *str)
{
- char *p;
+ char *p = mapregstr_db.get(num);
+ if (p)
+ free(p);
- if ((p = (char *)numdb_search (mapregstr_db, num)) != NULL)
- free (p);
+ if (!str || !*str)
+ p = NULL;
+ else
+ p = strdup(str);
- if (str == NULL || *str == 0)
- {
- numdb_erase (mapregstr_db, num);
- mapreg_dirty = 1;
- return 0;
- }
- p = (char *) calloc (strlen (str) + 1, 1);
- strcpy (p, str);
- numdb_insert (mapregstr_db, num, p);
+ mapregstr_db.put(num, p);
mapreg_dirty = 1;
- return 0;
}
/*==========================================
* 永続的マップ変数の読み込み
*------------------------------------------
*/
-static int script_load_mapreg (void)
+static
+void script_load_mapreg(void)
{
- FILE *fp;
- char line[1024];
+ std::ifstream in(mapreg_txt);
- if ((fp = fopen_ (mapreg_txt, "rt")) == NULL)
- return -1;
+ if (!in.is_open())
+ return;
- while (fgets (line, sizeof (line), fp))
- {
- char buf1[256], buf2[1024], *p;
- int n, v, s, i;
- if (sscanf (line, "%255[^,],%d\t%n", buf1, &i, &n) != 2 &&
- (i = 0, sscanf (line, "%[^\t]\t%n", buf1, &n) != 1))
- continue;
- if (buf1[strlen (buf1) - 1] == '$')
+ std::string line;
+ while (std::getline(in, line))
+ {
+ std::string buf1, buf2;
+ int index = 0;
+ if (extract(line,
+ record<'\t'>(
+ record<','>(&buf1, &index),
+ &buf2))
+ || extract(line,
+ record<'\t'>(
+ record<','>(&buf1),
+ &buf2)))
{
- if (sscanf (line + n, "%[^\n\r]", buf2) != 1)
+ int s = add_str(buf1.c_str());
+ int key = (index << 24) | s;
+ if (buf1.back() == '$')
{
- printf ("%s: %s broken data !\n", mapreg_txt, buf1);
- continue;
+ char *p = strdup(buf2.c_str());
+ mapregstr_db.put(key, p);
+ }
+ else
+ {
+ int v;
+ if (!extract(buf2, &v))
+ goto borken;
+ mapreg_db.put(key, v);
}
- p = (char *) calloc (strlen (buf2) + 1, 1);
- strcpy (p, buf2);
- s = add_str (buf1);
- numdb_insert (mapregstr_db, (i << 24) | s, p);
}
else
{
- if (sscanf (line + n, "%d", &v) != 1)
- {
- printf ("%s: %s broken data !\n", mapreg_txt, buf1);
- continue;
- }
- s = add_str (buf1);
- numdb_insert (mapreg_db, (i << 24) | s, v);
+ borken:
+ PRINTF("%s: %s broken data !\n", mapreg_txt, buf1);
+ continue;
}
}
- fclose_ (fp);
mapreg_dirty = 0;
- return 0;
}
/*==========================================
* 永続的マップ変数の書き込み
*------------------------------------------
*/
-static void script_save_mapreg_intsub (db_key_t key, db_val_t data, va_list ap)
+static
+void script_save_mapreg_intsub(int key, int data, FILE *fp)
{
- FILE *fp = va_arg (ap, FILE *);
- int num = key.i & 0x00ffffff, i = key.i >> 24;
+ int num = key & 0x00ffffff, i = key >> 24;
char *name = str_buf + str_data[num].str;
if (name[1] != '@')
{
if (i == 0)
- fprintf (fp, "%s\t%d\n", name, (int) data);
+ FPRINTF(fp, "%s\t%d\n", name, data);
else
- fprintf (fp, "%s,%d\t%d\n", name, i, (int) data);
+ FPRINTF(fp, "%s,%d\t%d\n", name, i, data);
}
}
-static void script_save_mapreg_strsub (db_key_t key, db_val_t data, va_list ap)
+static
+void script_save_mapreg_strsub(int key, char *data, FILE *fp)
{
- FILE *fp = va_arg (ap, FILE *);
- int num = key.i & 0x00ffffff, i = key.i >> 24;
+ int num = key & 0x00ffffff, i = key >> 24;
char *name = str_buf + str_data[num].str;
if (name[1] != '@')
{
if (i == 0)
- fprintf (fp, "%s\t%s\n", name, (char *) data);
+ FPRINTF(fp, "%s\t%s\n", name, data);
else
- fprintf (fp, "%s,%d\t%s\n", name, i, (char *) data);
+ FPRINTF(fp, "%s,%d\t%s\n", name, i, data);
}
}
-static int script_save_mapreg (void)
+static
+void script_save_mapreg(void)
{
FILE *fp;
- int lock;
+ int lock;
- if ((fp = lock_fopen (mapreg_txt, &lock)) == NULL)
- return -1;
- numdb_foreach (mapreg_db, script_save_mapreg_intsub, fp);
- numdb_foreach (mapregstr_db, script_save_mapreg_strsub, fp);
- lock_fclose (fp, mapreg_txt, &lock);
+ if ((fp = lock_fopen(mapreg_txt, &lock)) == NULL)
+ return;
+ for (auto& pair : mapreg_db)
+ script_save_mapreg_intsub(pair.first, pair.second, fp);
+ for (auto& pair : mapregstr_db)
+ script_save_mapreg_strsub(pair.first, pair.second, fp);
+ lock_fclose(fp, mapreg_txt, &lock);
mapreg_dirty = 0;
- return 0;
}
-static void script_autosave_mapreg (timer_id tid, tick_t tick, custom_id_t id,
- custom_data_t data)
+static
+void script_autosave_mapreg(TimerData *, tick_t)
{
if (mapreg_dirty)
- script_save_mapreg ();
+ script_save_mapreg();
}
-/*==========================================
- *
- *------------------------------------------
- */
-static int set_posword (char *p)
+void script_config_read()
{
- char *np, *str[15];
- int i = 0;
- for (i = 0; i < 11; i++)
- {
- if ((np = strchr (p, ',')) != NULL)
- {
- str[i] = p;
- *np = 0;
- p = np + 1;
- }
- else
- {
- str[i] = p;
- p += strlen (p);
- }
- if (str[i])
- strcpy (pos[i], str[i]);
- }
- return 0;
-}
-
-int script_config_read (const char *cfgName)
-{
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
script_config.warn_func_no_comma = 1;
script_config.warn_cmd_no_comma = 1;
script_config.warn_func_mismatch_paramnum = 1;
script_config.warn_cmd_mismatch_paramnum = 1;
script_config.check_cmdcount = 8192;
script_config.check_gotocount = 512;
-
- fp = fopen_ (cfgName, "r");
- if (fp == NULL)
- {
- printf ("file not found: %s\n", cfgName);
- return 1;
- }
- while (fgets (line, 1020, fp))
- {
- if (line[0] == '/' && line[1] == '/')
- continue;
- i = sscanf (line, "%[^:]: %[^\r\n]", w1, w2);
- if (i != 2)
- continue;
- if (strcasecmp (w1, "refine_posword") == 0)
- {
- set_posword (w2);
- }
- if (strcasecmp (w1, "import") == 0)
- {
- script_config_read (w2);
- }
- }
- fclose_ (fp);
-
- return 0;
}
/*==========================================
@@ -8037,55 +5078,181 @@ int script_config_read (const char *cfgName)
*------------------------------------------
*/
-static void mapregstr_db_final (db_key_t key, db_val_t data, va_list ap)
+static
+void mapregstr_db_final(char *data)
{
- free (data);
+ free(data);
}
-static void userfunc_db_final (db_key_t key, db_val_t data, va_list ap)
+static
+void userfunc_db_final(const ScriptCode *data)
{
- free ((char*)key.s);
- free (data);
+ free(const_cast<ScriptCode *>(data));
}
-int do_final_script (void)
+void do_final_script(void)
{
if (mapreg_dirty >= 0)
- script_save_mapreg ();
+ script_save_mapreg();
+#if 0
+ // labels are allocated just out of this
+ // (so it's a leak ...)
+ // this is disabled because it leads to a crash
+ // due to double-free
if (script_buf)
- free (script_buf);
+ free(script_buf);
+#endif
- if (mapreg_db)
- numdb_final (mapreg_db, NULL);
- if (mapregstr_db)
- strdb_final (mapregstr_db, mapregstr_db_final);
- if (scriptlabel_db)
- strdb_final (scriptlabel_db, NULL);
- if (userfunc_db)
- strdb_final (userfunc_db, userfunc_db_final);
+ mapreg_db.clear();
+ for (auto& pair : mapregstr_db)
+ mapregstr_db_final(pair.second);
+ mapregstr_db.clear();
+ scriptlabel_db.clear();
+ for (auto& pair : userfunc_db)
+ userfunc_db_final(pair.second);
+ userfunc_db.clear();
if (str_data)
- free (str_data);
+ free(str_data);
if (str_buf)
- free (str_buf);
-
- return 0;
+ free(str_buf);
}
/*==========================================
* 初期化
*------------------------------------------
*/
-int do_init_script (void)
-{
- mapreg_db = numdb_init ();
- mapregstr_db = numdb_init ();
- script_load_mapreg ();
-
- add_timer_interval (gettick () + MAPREG_AUTOSAVE_INTERVAL,
- script_autosave_mapreg, 0, 0,
- MAPREG_AUTOSAVE_INTERVAL);
-
- scriptlabel_db = strdb_init (50);
- return 0;
-}
+void do_init_script(void)
+{
+ script_load_mapreg();
+
+ Timer(gettick() + MAPREG_AUTOSAVE_INTERVAL,
+ script_autosave_mapreg,
+ MAPREG_AUTOSAVE_INTERVAL
+ ).detach();
+}
+
+#define BUILTIN(func, args) \
+{builtin_##func, #func, args}
+
+BuiltinFunction builtin_functions[] =
+{
+ BUILTIN(mes, "s"),
+ BUILTIN(next, ""),
+ BUILTIN(close, ""),
+ BUILTIN(close2, ""),
+ BUILTIN(menu, "sL*"),
+ BUILTIN(goto, "L"),
+ BUILTIN(callsub, "L"),
+ BUILTIN(callfunc, "F"),
+ BUILTIN(return, ""),
+ BUILTIN(input, "N"),
+ BUILTIN(warp, "Mxy"),
+ BUILTIN(isat, "Mxy"),
+ BUILTIN(areawarp, "MxyxyMxy"),
+ BUILTIN(setlook, "ii"),
+ BUILTIN(set, "Ne"),
+ BUILTIN(setarray, "Ne*"),
+ BUILTIN(cleararray, "Nei"),
+ BUILTIN(getarraysize, "N"),
+ BUILTIN(getelementofarray, "Ni"),
+ BUILTIN(if, "iF*"),
+ BUILTIN(getitem, "Ii**"),
+ BUILTIN(makeitem, "IiMxy"),
+ BUILTIN(delitem, "Ii"),
+ BUILTIN(heal, "ii"),
+ BUILTIN(itemheal, "ii"),
+ BUILTIN(percentheal, "ii"),
+ BUILTIN(rand, "i*"),
+ BUILTIN(pow, "ii"),
+ BUILTIN(countitem, "I"),
+ BUILTIN(checkweight, "Ii"),
+ BUILTIN(readparam, "i*"),
+ BUILTIN(getcharid, "i*"),
+ BUILTIN(strcharinfo, "i"),
+ BUILTIN(getequipid, "i"),
+ BUILTIN(getequipname, "i"),
+ BUILTIN(statusup2, "ii"),
+ BUILTIN(bonus, "ii"),
+ BUILTIN(bonus2, "iii"),
+ BUILTIN(skill, "ii*"),
+ BUILTIN(setskill, "ii"),
+ BUILTIN(getskilllv, "i"),
+ BUILTIN(getgmlevel, ""),
+ BUILTIN(end, ""),
+ BUILTIN(getopt2, ""),
+ BUILTIN(setopt2, "i"),
+ BUILTIN(savepoint, "Mxy"),
+ BUILTIN(gettimetick, "i"),
+ BUILTIN(gettime, "i"),
+ BUILTIN(gettimestr, "si"),
+ BUILTIN(openstorage, "*"),
+ BUILTIN(monster, "Mxysmi*"),
+ BUILTIN(areamonster, "Mxyxysmi*"),
+ BUILTIN(killmonster, "ME"),
+ BUILTIN(killmonsterall, "M"),
+ BUILTIN(donpcevent, "E"),
+ BUILTIN(addtimer, "tE"),
+ BUILTIN(initnpctimer, ""),
+ BUILTIN(stopnpctimer, ""),
+ BUILTIN(startnpctimer, "*"),
+ BUILTIN(setnpctimer, "i"),
+ BUILTIN(getnpctimer, "i"),
+ BUILTIN(announce, "si"),
+ BUILTIN(mapannounce, "Msi"),
+ BUILTIN(getusers, "i"),
+ BUILTIN(getmapusers, "M"),
+ BUILTIN(getareausers, "Mxyxy*"),
+ BUILTIN(getareadropitem, "Mxyxyi*"),
+ BUILTIN(enablenpc, "s"),
+ BUILTIN(disablenpc, "s"),
+ BUILTIN(sc_start, "iTi*"),
+ BUILTIN(sc_end, "i"),
+ BUILTIN(sc_check, "i"),
+ BUILTIN(debugmes, "s"),
+ BUILTIN(resetstatus, ""),
+ BUILTIN(changesex, ""),
+ BUILTIN(attachrid, "i"),
+ BUILTIN(detachrid, ""),
+ BUILTIN(isloggedin, "i"),
+ BUILTIN(setmapflag, "Mi"),
+ BUILTIN(removemapflag, "Mi"),
+ BUILTIN(getmapflag, "Mi"),
+ BUILTIN(pvpon, "M"),
+ BUILTIN(pvpoff, "M"),
+ BUILTIN(emotion, "i"),
+ BUILTIN(marriage, "P"),
+ BUILTIN(divorce, ""),
+ BUILTIN(getitemname, "I"),
+ BUILTIN(getspellinvocation, "s"),
+ BUILTIN(getpartnerid2, ""),
+ BUILTIN(getexp, "ii"),
+ BUILTIN(getinventorylist, ""),
+ BUILTIN(getactivatedpoolskilllist, ""),
+ BUILTIN(getunactivatedpoolskilllist, ""),
+ BUILTIN(poolskill, "i"),
+ BUILTIN(unpoolskill, "i"),
+ BUILTIN(misceffect, "i*"),
+ BUILTIN(specialeffect, "i"),
+ BUILTIN(specialeffect2, "i"),
+ BUILTIN(nude, ""),
+ BUILTIN(mapwarp, "MMxy"),
+ BUILTIN(cmdothernpc, "ss"),
+ BUILTIN(gmcommand, "s"),
+ BUILTIN(npcwarp, "xys"),
+ BUILTIN(message, "Ps"),
+ BUILTIN(npctalk, "s"),
+ BUILTIN(mobcount, "ME"),
+ BUILTIN(getlook, "i"),
+ BUILTIN(getsavepoint, "i"),
+ BUILTIN(areatimer, "MxyxytE"),
+ BUILTIN(isin, "Mxyxy"),
+ BUILTIN(shop, "s"),
+ BUILTIN(isdead, ""),
+ BUILTIN(unequipbyid, "i"),
+ BUILTIN(fakenpcname, "ssi"),
+ BUILTIN(getx, ""),
+ BUILTIN(gety, ""),
+ BUILTIN(getmap, ""),
+ {NULL, NULL, NULL},
+};
diff --git a/src/map/script.hpp b/src/map/script.hpp
index 6b345c4..4caf58e 100644
--- a/src/map/script.hpp
+++ b/src/map/script.hpp
@@ -1,75 +1,50 @@
-// $Id: script.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
#ifndef SCRIPT_HPP
#define SCRIPT_HPP
-// values are private, but gcc < 4.6 doesn't
-// support forward-declared enums
-enum class ScriptCode : uint8_t
-#ifdef RECENT_GCC
-;
-#else
-{
- // types and specials
- NOP, POS, INT, PARAM, FUNC, STR, CONSTSTR, ARG,
- NAME, EOL, RETINFO,
+#include <cstdint>
- // unary and binary operators
- LOR, LAND, LE, LT, GE, GT, EQ, NE,
- XOR, OR, AND, ADD, SUB, MUL, DIV, MOD, NEG, LNOT,
- NOT, R_SHIFT, L_SHIFT,
+#include <string>
- // really nasty workaround for gcc < 4.6
+#include "../common/db.hpp"
- x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x2a, x2b, x2c, x2d, x2e, x2f,
- x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x3a, x3b, x3c, x3d, x3e, x3f,
- x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x4a, x4b, x4c, x4d, x4e, x4f,
- x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x5a, x5b, x5c, x5d, x5e, x5f,
- x60, x61, x62, x63, x64, x65, x66, x67, x68, x69, x6a, x6b, x6c, x6d, x6e, x6f,
- x70, x71, x72, x73, x74, x75, x76, x77, x78, x79, x7a, x7b, x7c, x7d, x7e, x7f,
- x80, x81, x82, x83, x84, x85, x86, x87, x88, x89, x8a, x8b, x8c, x8d, x8e, x8f,
- x90, x91, x92, x93, x94, x95, x96, x97, x98, x99, x9a, x9b, x9c, x9d, x9e, x9f,
- xa0, xa1, xa2, xa3, xa4, xa5, xa6, xa7, xa8, xa9, xaa, xab, xac, xad, xae, xaf,
- xb0, xb1, xb2, xb3, xb4, xb5, xb6, xb7, xb8, xb9, xba, xbb, xbc, xbd, xbe, xbf,
- xc0, xc1, xc2, xc3, xc4, xc5, xc6, xc7, xc8, xc9, xca, xcb, xcc, xcd, xce, xcf,
- xd0, xd1, xd2, xd3, xd4, xd5, xd6, xd7, xd8, xd9, xda, xdb, xdc, xdd, xde, xdf,
- xe0, xe1, xe2, xe3, xe4, xe5, xe6, xe7, xe8, xe9, xea, xeb, xec, xed, xee, xef,
- xf0, xf1, xf2, xf3, xf4, xf5, xf6, xf7, xf8, xf9, xfa, xfb, xfc, xfd, xfe, xff,
-};
-#endif
+enum class ScriptCode : uint8_t;
struct script_data
{
ScriptCode type;
union
{
- int num;
+ int num;
const char *str;
+ const ScriptCode *script;
} u;
};
struct script_stack
{
- int sp, sp_max;
+ int sp, sp_max;
struct script_data *stack_data;
};
-struct script_state
+// future improvements coming!
+class ScriptState
{
+public:
struct script_stack *stack;
- int start, end;
- int pos, state;
- int rid, oid;
+ int start, end;
+ int pos, state;
+ int rid, oid;
const ScriptCode *script, *new_script;
- int defsp, new_pos, new_defsp;
+ int defsp, new_pos, new_defsp;
};
-const ScriptCode *parse_script (const char *, int);
+const ScriptCode *parse_script(const char *, int);
typedef struct argrec
{
const char *name;
union _aru
{
- int i;
+ int i;
const char *s;
_aru() = default;
@@ -77,16 +52,18 @@ typedef struct argrec
_aru(const char *z) : s(z) {}
} v;
} argrec_t;
-int run_script_l (const ScriptCode *, int, int, int, int, argrec_t * args);
-int run_script (const ScriptCode *, int, int, int);
+int run_script_l(const ScriptCode *, int, int, int, int, argrec_t *args);
+int run_script(const ScriptCode *, int, int, int);
-struct dbt *script_get_label_db (void);
-struct dbt *script_get_userfunc_db (void);
+extern
+Map<std::string, int> scriptlabel_db;
+extern
+DMap<std::string, const ScriptCode *> userfunc_db;
-int script_config_read (const char *cfgName);
-int do_init_script (void);
-int do_final_script (void);
+void script_config_read();
+void do_init_script(void);
+void do_final_script(void);
-extern char mapreg_txt[];
+extern char mapreg_txt[256];
-#endif
+#endif // SCRIPT_HPP
diff --git a/src/map/skill-pools.cpp b/src/map/skill-pools.cpp
index 204036d..c225ebe 100644
--- a/src/map/skill-pools.cpp
+++ b/src/map/skill-pools.cpp
@@ -1,37 +1,20 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
+#include "skill.hpp"
-#include "../common/timer.hpp"
-#include "../common/nullpo.hpp"
-#include "../common/mt_rand.hpp"
-#include "magic.hpp"
+#include "../common/cxxstdio.hpp"
#include "battle.hpp"
-#include "clif.hpp"
-#include "intif.hpp"
-#include "itemdb.hpp"
-#include "map.hpp"
-#include "mob.hpp"
-#include "party.hpp"
#include "pc.hpp"
-#include "script.hpp"
-#include "skill.hpp"
-#include "../common/socket.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
+#include "../poison.hpp"
-int skill_pool_skills[MAX_POOL_SKILLS];
-int skill_pool_skills_size = 0;
+SkillID skill_pool_skills[MAX_POOL_SKILLS];
+int skill_pool_skills_size = 0;
-void skill_pool_register(int id)
+void skill_pool_register(SkillID id)
{
if (skill_pool_skills_size + 1 >= MAX_POOL_SKILLS)
{
- fprintf (stderr,
+ FPRINTF(stderr,
"Too many pool skills! Increase MAX_POOL_SKILLS and recompile.");
return;
}
@@ -39,22 +22,14 @@ void skill_pool_register(int id)
skill_pool_skills[skill_pool_skills_size++] = id;
}
-const char *skill_name (int skill)
-{
- if (skill > 0 && skill < MAX_SKILL_DB)
- return skill_names[skill].desc;
- else
- return NULL;
-}
-
-int skill_pool (struct map_session_data *sd, int *skills)
+int skill_pool(struct map_session_data *sd, SkillID *skills)
{
- int i, count = 0;
+ int i, count = 0;
for (i = 0; count < MAX_SKILL_POOL && i < skill_pool_skills_size; i++)
{
- int skill_id = skill_pool_skills[i];
- if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED)
+ SkillID skill_id = skill_pool_skills[i];
+ if (bool(sd->status.skill[skill_id].flags & SkillFlags::POOL_ACTIVATED))
{
if (skills)
skills[count] = skill_id;
@@ -65,78 +40,70 @@ int skill_pool (struct map_session_data *sd, int *skills)
return count;
}
-void skill_pool_empty (struct map_session_data *sd)
-{
- int i;
-
- for (i = 0; i < skill_pool_skills_size; i++)
- {
- int skill_id = skill_pool_skills[i];
- sd->status.skill[skill_id].flags = 0;
- }
-}
-
-int skill_pool_size (struct map_session_data *sd)
+int skill_pool_size(struct map_session_data *sd)
{
- return skill_pool (sd, NULL);
+ return skill_pool(sd, NULL);
}
-int skill_pool_max (struct map_session_data *sd)
+int skill_pool_max(struct map_session_data *sd)
{
- return sd->status.skill[TMW_SKILLPOOL].lv;
+ return sd->status.skill[SkillID::TMW_SKILLPOOL].lv;
}
-int skill_pool_activate (struct map_session_data *sd, int skill_id)
+int skill_pool_activate(struct map_session_data *sd, SkillID skill_id)
{
- if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED)
+ if (bool(sd->status.skill[skill_id].flags & SkillFlags::POOL_ACTIVATED))
return 0; // Already there
- else if (sd->status.skill[skill_id].id == skill_id // knows the skill
- && (skill_pool_size (sd) < skill_pool_max (sd)))
+ else if (sd->status.skill[skill_id].lv
+ && (skill_pool_size(sd) < skill_pool_max(sd)))
{
- sd->status.skill[skill_id].flags |= SKILL_POOL_ACTIVATED;
- pc_calcstatus (sd, 0);
- MAP_LOG_PC (sd, "SKILL-ACTIVATE %d %d %d", skill_id,
- sd->status.skill[skill_id].lv, skill_power (sd,
- skill_id));
+ sd->status.skill[skill_id].flags |= SkillFlags::POOL_ACTIVATED;
+ pc_calcstatus(sd, 0);
+ MAP_LOG_PC(sd, "SKILL-ACTIVATE %d %d %d",
+ skill_id, sd->status.skill[skill_id].lv,
+ skill_power(sd, skill_id));
return 0;
}
return 1; // failed
}
-int skill_pool_is_activated (struct map_session_data *sd, int skill_id)
+bool skill_pool_is_activated(struct map_session_data *sd, SkillID skill_id)
{
- return sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED;
+ return bool(sd->status.skill[skill_id].flags & SkillFlags::POOL_ACTIVATED);
}
-int skill_pool_deactivate (struct map_session_data *sd, int skill_id)
+int skill_pool_deactivate(struct map_session_data *sd, SkillID skill_id)
{
- if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED)
+ if (bool(sd->status.skill[skill_id].flags & SkillFlags::POOL_ACTIVATED))
{
- sd->status.skill[skill_id].flags &= ~SKILL_POOL_ACTIVATED;
- MAP_LOG_PC (sd, "SKILL-DEACTIVATE %d", skill_id);
- pc_calcstatus (sd, 0);
+ sd->status.skill[skill_id].flags &= ~SkillFlags::POOL_ACTIVATED;
+ MAP_LOG_PC(sd, "SKILL-DEACTIVATE %d", skill_id);
+ pc_calcstatus(sd, 0);
return 0;
}
return 1;
}
-int skill_stat (int skill_id)
+// Yields the stat associated with a skill.
+// Returns zero if none, or SP::STR, SP::VIT, ... otherwise
+static
+SP skill_stat(SkillID skill_id)
{
return skill_db[skill_id].stat;
}
-int skill_power (struct map_session_data *sd, int skill_id)
+int skill_power(struct map_session_data *sd, SkillID skill_id)
{
- int stat = skill_stat (skill_id);
- int stat_value, skill_value;
- int result;
+ SP stat = skill_stat(skill_id);
+ int stat_value, skill_value;
+ int result;
- if (stat == 0 || !skill_pool_is_activated (sd, skill_id))
+ if (stat == SP::ZERO || !skill_pool_is_activated(sd, skill_id))
return 0;
- stat_value = battle_get_stat (stat, &(sd->bl));
+ stat_value = battle_get_stat(stat, &(sd->bl));
skill_value = sd->status.skill[skill_id].lv;
if ((skill_value * 10) - 1 > stat_value)
@@ -149,10 +116,10 @@ int skill_power (struct map_session_data *sd, int skill_id)
return result;
}
-int skill_power_bl (struct block_list *bl, int skill)
+int skill_power_bl(struct block_list *bl, SkillID skill)
{
- if (bl->type == BL_PC)
- return skill_power ((struct map_session_data *) bl, skill);
+ if (bl->type == BL::PC)
+ return skill_power((struct map_session_data *) bl, skill);
else
return 0;
}
diff --git a/src/map/skill.cpp b/src/map/skill.cpp
index c7ef9fd..47a2e5c 100644
--- a/src/map/skill.cpp
+++ b/src/map/skill.cpp
@@ -1,1091 +1,195 @@
-// $Id: skill.c,v 1.8 2004/09/25 05:32:19 MouseJstr Exp $
-/* スキル関係 */
+#include "skill.hpp"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
-#include "../common/timer.hpp"
+#include "../common/cxxstdio.hpp"
+#include "../common/random.hpp"
#include "../common/nullpo.hpp"
-#include "../common/mt_rand.hpp"
-#include "magic.hpp"
+#include "../common/socket.hpp"
+#include "../common/timer.hpp"
#include "battle.hpp"
#include "clif.hpp"
-#include "intif.hpp"
-#include "itemdb.hpp"
+#include "magic.hpp"
#include "map.hpp"
#include "mob.hpp"
-#include "party.hpp"
#include "pc.hpp"
-#include "script.hpp"
-#include "skill.hpp"
-#include "../common/socket.hpp"
-#ifdef MEMWATCH
-#include "memwatch.hpp"
-#endif
-
-#define SKILLUNITTIMER_INVERVAL 100
-
-#define STATE_BLIND 0x10
-
-/* スキル番号=>ステータス異常番号変換テーブル */
-int SkillStatusChangeTable[] = { /* skill.hのenumのSC_***とあわせること */
-/* 0- */
- -1, -1, -1, -1, -1, -1,
- SC_PROVOKE, /* プロボック */
- -1, 1, -1,
-/* 10- */
- SC_SIGHT, /* サイト */
- -1, -1, -1, -1,
- SC_FREEZE, /* フロストダイバー */
- SC_STONE, /* ストーンカース */
- -1, -1, -1,
-/* 20- */
- -1, -1, -1, -1,
- SC_RUWACH, /* ルアフ */
- -1, -1, -1, -1,
- SC_INCREASEAGI, /* 速度増加 */
-/* 30- */
- SC_DECREASEAGI, /* 速度減少 */
- -1,
- SC_SIGNUMCRUCIS, /* シグナムクルシス */
- SC_ANGELUS, /* エンジェラス */
- SC_BLESSING, /* ブレッシング */
- -1, -1, -1, -1, -1,
-/* 40- */
- -1, -1, -1, -1, -1,
- SC_CONCENTRATE, /* 集中力向上 */
- -1, -1, -1, -1,
-/* 50- */
- -1,
- SC_HIDING, /* ハイディング */
- -1, -1, -1, -1, -1, -1, -1, -1,
-/* 60- */
- SC_TWOHANDQUICKEN, /* 2HQ */
- SC_AUTOCOUNTER,
- -1, -1, -1, -1,
- SC_IMPOSITIO, /* インポシティオマヌス */
- SC_SUFFRAGIUM, /* サフラギウム */
- SC_ASPERSIO, /* アスペルシオ */
- SC_BENEDICTIO, /* 聖体降福 */
-/* 70- */
- -1,
- SC_SLOWPOISON,
- -1,
- SC_KYRIE, /* キリエエレイソン */
- SC_MAGNIFICAT, /* マグニフィカート */
- SC_GLORIA, /* グロリア */
- SC_DIVINA, /* レックスディビーナ */
- -1,
- SC_AETERNA, /* レックスエーテルナ */
- -1,
-/* 80- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-/* 90- */
- -1, -1,
- SC_QUAGMIRE, /* クァグマイア */
- -1, -1, -1, -1, -1, -1, -1,
-/* 100- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-/* 110- */
- -1,
- SC_ADRENALINE, /* アドレナリンラッシュ */
- SC_WEAPONPERFECTION, /* ウェポンパーフェクション */
- SC_OVERTHRUST, /* オーバートラスト */
- SC_MAXIMIZEPOWER, /* マキシマイズパワー */
- -1, -1, -1, -1, -1,
-/* 120- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-/* 130- */
- -1, -1, -1, -1, -1,
- SC_CLOAKING, /* クローキング */
- SC_STAN, /* ソニックブロー */
- -1,
- SC_ENCPOISON, /* エンチャントポイズン */
- SC_POISONREACT, /* ポイズンリアクト */
-/* 140- */
- SC_POISON, /* ベノムダスト */
- SC_SPLASHER, /* ベナムスプラッシャー */
- -1,
- SC_TRICKDEAD, /* 死んだふり */
- -1, -1, -1, -1, -1, -1,
-/* 150- */
- -1, -1, -1, -1, -1,
- SC_LOUD, /* ラウドボイス */
- -1,
- SC_ENERGYCOAT, /* エナジーコート */
- -1, -1,
-/* 160- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1,
- SC_SELFDESTRUCTION,
- -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1,
- SC_KEEPING,
- -1, -1,
- SC_BARRIER,
- -1, -1,
- SC_HALLUCINATION,
- -1, -1,
-/* 210- */
- -1, -1, -1, -1, -1,
- SC_STRIPWEAPON,
- SC_STRIPSHIELD,
- SC_STRIPARMOR,
- SC_STRIPHELM,
- -1,
-/* 220- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-/* 230- */
- -1, -1, -1, -1,
- SC_CP_WEAPON,
- SC_CP_SHIELD,
- SC_CP_ARMOR,
- SC_CP_HELM,
- -1, -1,
-/* 240- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1,
- SC_AUTOGUARD,
-/* 250- */
- -1, -1,
- SC_REFLECTSHIELD,
- -1, -1,
- SC_DEVOTION,
- SC_PROVIDENCE,
- SC_DEFENDER,
- SC_SPEARSQUICKEN,
- -1,
-/* 260- */
- -1, -1, -1, -1, -1, -1, -1, -1,
- SC_STEELBODY,
- SC_BLADESTOP_WAIT,
-/* 270- */
- SC_EXPLOSIONSPIRITS,
- SC_EXTREMITYFIST,
- -1, -1, -1, -1,
- SC_MAGICROD,
- -1, -1, -1,
-/* 280- */
- SC_FLAMELAUNCHER,
- SC_FROSTWEAPON,
- SC_LIGHTNINGLOADER,
- SC_SEISMICWEAPON,
- -1,
- SC_VOLCANO,
- SC_DELUGE,
- SC_VIOLENTGALE,
- SC_LANDPROTECTOR,
- -1,
-/* 290- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-/* 300- */
- -1, -1, -1, -1, -1, -1,
- SC_LULLABY,
- SC_RICHMANKIM,
- SC_ETERNALCHAOS,
- SC_DRUMBATTLE,
-/* 310- */
- SC_NIBELUNGEN,
- SC_ROKISWEIL,
- SC_INTOABYSS,
- SC_SIEGFRIED,
- -1, -1, -1,
- SC_DISSONANCE,
- -1,
- SC_WHISTLE,
-/* 320- */
- SC_ASSNCROS,
- SC_POEMBRAGI,
- SC_APPLEIDUN,
- -1, -1,
- SC_UGLYDANCE,
- -1,
- SC_HUMMING,
- SC_DONTFORGETME,
- SC_FORTUNE,
-/* 330- */
- SC_SERVICE4U,
- SC_SELFDESTRUCTION,
- -1, -1, -1, -1, -1, -1, -1, -1,
-/* 340- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-/* 350- */
- -1, -1, -1, -1, -1,
- SC_AURABLADE,
- SC_PARRYING,
- SC_CONCENTRATION,
- SC_TENSIONRELAX,
- SC_BERSERK,
-/* 360- */
- SC_BERSERK,
- SC_ASSUMPTIO,
- SC_BASILICA,
- -1, -1, -1,
- SC_MAGICPOWER,
- -1, -1,
- SC_GOSPEL,
-/* 370- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-/* 380- */
- SC_TRUESIGHT,
- -1, -1,
- SC_WINDWALK,
- SC_MELTDOWN,
- -1, -1,
- SC_CARTBOOST,
- -1,
- SC_CHASEWALK,
-/* 390- */
- SC_REJECTSWORD,
- -1, -1, -1, -1, -1,
- SC_MARIONETTE,
- -1,
- SC_HEADCRUSH,
- SC_JOINTBEAT,
-/* 400 */
- -1, -1,
- SC_MINDBREAKER,
- SC_MEMORIZE,
- SC_FOGWALL,
- SC_SPIDERWEB,
- -1, -1, -1, -1,
-/* 410- */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-};
+#include "../poison.hpp"
-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"},
- {NPC_BLOODDRAIN, "BLOODDRAIN", "NPC_BLOODDRAIN"},
- {NPC_CHANGEDARKNESS, "CHANGEDARKNESS", "NPC_CHANGEDARKNESS"},
- {NPC_CHANGEFIRE, "CHANGEFIRE", "NPC_CHANGEFIRE"},
- {NPC_CHANGEGROUND, "CHANGEGROUND", "NPC_CHANGEGROUND"},
- {NPC_CHANGEHOLY, "CHANGEHOLY", "NPC_CHANGEHOLY"},
- {NPC_CHANGEPOISON, "CHANGEPOISON", "NPC_CHANGEPOISON"},
- {NPC_CHANGETELEKINESIS, "CHANGETELEKINESIS", "NPC_CHANGETELEKINESIS"},
- {NPC_CHANGEWATER, "CHANGEWATER", "NPC_CHANGEWATER"},
- {NPC_CHANGEWIND, "CHANGEWIND", "NPC_CHANGEWIND"},
- {NPC_COMBOATTACK, "COMBOATTACK", "NPC_COMBOATTACK"},
- {NPC_CRITICALSLASH, "CRITICALSLASH", "NPC_CRITICALSLASH"},
- {NPC_CURSEATTACK, "CURSEATTACK", "NPC_CURSEATTACK"},
- {NPC_DARKBLESSING, "DARKBLESSING", "NPC_DARKBLESSING"},
- {NPC_DARKBREATH, "DARKBREATH", "NPC_DARKBREATH"},
- {NPC_DARKCROSS, "DARKCROSS", "NPC_DARKCROSS"},
- {NPC_DARKNESSATTACK, "DARKNESSATTACK", "NPC_DARKNESSATTACK"},
- {NPC_DEFENDER, "DEFENDER", "NPC_DEFENDER"},
- {NPC_EMOTION, "EMOTION", "NPC_EMOTION"},
- {NPC_ENERGYDRAIN, "ENERGYDRAIN", "NPC_ENERGYDRAIN"},
- {NPC_FIREATTACK, "FIREATTACK", "NPC_FIREATTACK"},
- {NPC_GROUNDATTACK, "GROUNDATTACK", "NPC_GROUNDATTACK"},
- {NPC_GUIDEDATTACK, "GUIDEDATTACK", "NPC_GUIDEDATTACK"},
- {NPC_HALLUCINATION, "HALLUCINATION", "NPC_HALLUCINATION"},
- {NPC_HOLYATTACK, "HOLYATTACK", "NPC_HOLYATTACK"},
- {NPC_KEEPING, "KEEPING", "NPC_KEEPING"},
- {NPC_LICK, "LICK", "NPC_LICK"},
- {NPC_MAGICALATTACK, "MAGICALATTACK", "NPC_MAGICALATTACK"},
- {NPC_MENTALBREAKER, "MENTALBREAKER", "NPC_MENTALBREAKER"},
- {NPC_METAMORPHOSIS, "METAMORPHOSIS", "NPC_METAMORPHOSIS"},
- {NPC_PETRIFYATTACK, "PETRIFYATTACK", "NPC_PETRIFYATTACK"},
- {NPC_PIERCINGATT, "PIERCINGATT", "NPC_PIERCINGATT"},
- {NPC_POISON, "POISON", "NPC_POISON"},
- {NPC_POISONATTACK, "POISONATTACK", "NPC_POISONATTACK"},
- {NPC_RANDOMATTACK, "RANDOMATTACK", "NPC_RANDOMATTACK"},
- {NPC_RANGEATTACK, "RANGEATTACK", "NPC_RANGEATTACK"},
- {NPC_REBIRTH, "REBIRTH", "NPC_REBIRTH"},
- {NPC_SELFDESTRUCTION, "SELFDESTRUCTION", "Kabooooom!"},
- {NPC_SELFDESTRUCTION2, "SELFDESTRUCTION2", "NPC_SELFDESTRUCTION2"},
- {NPC_SILENCEATTACK, "SILENCEATTACK", "NPC_SILENCEATTACK"},
- {NPC_SLEEPATTACK, "SLEEPATTACK", "NPC_SLEEPATTACK"},
- {NPC_SMOKING, "SMOKING", "NPC_SMOKING"},
- {NPC_SPLASHATTACK, "SPLASHATTACK", "NPC_SPLASHATTACK"},
- {NPC_STUNATTACK, "STUNATTACK", "NPC_STUNATTACK"},
- {NPC_SUICIDE, "SUICIDE", "NPC_SUICIDE"},
- {NPC_SUMMONMONSTER, "SUMMONMONSTER", "NPC_SUMMONMONSTER"},
- {NPC_SUMMONSLAVE, "SUMMONSLAVE", "NPC_SUMMONSLAVE"},
- {NPC_TELEKINESISATTACK, "TELEKINESISATTACK", "NPC_TELEKINESISATTACK"},
- {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"},
- {0, 0, 0}
-};
+struct skill_name_db skill_names[] =
+{
+ {SkillID::AC_OWL, "OWL", "Owl's_Eye"},
-static const int dirx[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
-static const int diry[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
+ {SkillID::NPC_EMOTION, "EMOTION", "NPC_EMOTION"},
+ {SkillID::NPC_POISON, "POISON", "NPC_POISON"},
+ {SkillID::NPC_SELFDESTRUCTION, "SELFDESTRUCTION", "Kabooooom!"},
+ {SkillID::NPC_SUMMONSLAVE, "SUMMONSLAVE", "NPC_SUMMONSLAVE"},
-static int rdamage;
+ {SkillID::NV_EMOTE, "EMOTE", "Emote_Skill"},
+ {SkillID::NV_TRADE, "TRADE", "Trade_Skill"},
+ {SkillID::NV_PARTY, "PARTY", "Party_Skill"},
-/* スキルデータベース */
-struct skill_db skill_db[MAX_SKILL_DB];
+ {SkillID::TMW_MAGIC, "MAGIC", "General Magic"},
+ {SkillID::TMW_MAGIC_LIFE, "MAGIC_LIFE", "Life Magic"},
+ {SkillID::TMW_MAGIC_WAR, "MAGIC_WAR", "War Magic"},
+ {SkillID::TMW_MAGIC_TRANSMUTE, "MAGIC_TRANSMUTE", "Transmutation Magic"},
+ {SkillID::TMW_MAGIC_NATURE, "MAGIC_NATURE", "Nature Magic"},
+ {SkillID::TMW_MAGIC_ETHER, "MAGIC_ETHER", "Astral Magic"},
+ {SkillID::TMW_MAGIC_DARK, "MAGIC_DARK", "Dark Magic"},
+ {SkillID::TMW_MAGIC_LIGHT, "MAGIC_LIGHT", "Light Magic"},
+
+ {SkillID::TMW_BRAWLING, "BRAWLING", "Brawling"},
+ {SkillID::TMW_LUCKY_COUNTER, "LUCKY_COUNTER", "Lucky Counter"},
+ {SkillID::TMW_SPEED, "SPEED", "Speed"},
+ {SkillID::TMW_RESIST_POISON, "RESIST_POISON", "Resist Poison"},
+ {SkillID::TMW_ASTRAL_SOUL, "ASTRAL_SOUL", "Astral Soul"},
+ {SkillID::TMW_RAGING, "RAGING", "Raging"},
+
+ {SkillID::ZERO, nullptr, nullptr}
+};
-#define UNARMED_PLAYER_DAMAGE_MIN(bl) (skill_power_bl((bl), TMW_BRAWLING) >> 4) // +50 for 200
-#define UNARMED_PLAYER_DAMAGE_MAX(bl) (skill_power_bl((bl), TMW_BRAWLING)) // +200 for 200
+earray<struct skill_db, SkillID, SkillID::MAX_SKILL_DB> skill_db;
-int skill_get_hit (int id)
+
+static
+int skill_attack(BF attack_type, struct block_list *src,
+ struct block_list *dsrc, struct block_list *bl,
+ SkillID skillid, int skilllv, tick_t tick, BCT flag);
+static
+void skill_devotion_end(struct map_session_data *md,
+ struct map_session_data *sd, int target);
+static
+void skill_status_change_timer(TimerData *tid, tick_t tick,
+ int id, StatusChange type);
+
+int skill_get_hit(SkillID id)
{
return skill_db[id].hit;
}
-int skill_get_inf (int id)
+int skill_get_inf(SkillID id)
{
return skill_db[id].inf;
}
-int skill_get_pl (int id)
-{
- return skill_db[id].pl;
-}
-
-int skill_get_nk (int id)
+int skill_get_nk(SkillID id)
{
return skill_db[id].nk;
}
-int skill_get_max (int id)
+int skill_get_max(SkillID id)
{
return skill_db[id].max;
}
-int skill_get_max_raise (int id)
+int skill_get_max_raise(SkillID id)
{
return skill_db[id].max_raise;
}
-int skill_get_range (int id, int lv)
+int skill_get_range(SkillID id, int lv)
{
return (lv <= 0) ? 0 : skill_db[id].range[lv - 1];
}
-int skill_get_hp (int id, int lv)
-{
- return (lv <= 0) ? 0 : skill_db[id].hp[lv - 1];
-}
-
-int skill_get_sp (int id, int lv)
+int skill_get_sp(SkillID id, int lv)
{
return (lv <= 0) ? 0 : skill_db[id].sp[lv - 1];
}
-int skill_get_zeny (int id, int lv)
-{
- return (lv <= 0) ? 0 : skill_db[id].zeny[lv - 1];
-}
-
-int skill_get_num (int id, int lv)
+int skill_get_num(SkillID id, int lv)
{
return (lv <= 0) ? 0 : skill_db[id].num[lv - 1];
}
-int skill_get_cast (int id, int lv)
+int skill_get_cast(SkillID id, int lv)
{
return (lv <= 0) ? 0 : skill_db[id].cast[lv - 1];
}
-int skill_get_delay (int id, int lv)
+int skill_get_delay(SkillID id, int lv)
{
return (lv <= 0) ? 0 : skill_db[id].delay[lv - 1];
}
-int skill_get_time (int id, int lv)
-{
- return (lv <= 0) ? 0 : skill_db[id].upkeep_time[lv - 1];
-}
-
-int skill_get_time2 (int id, int lv)
-{
- return (lv <= 0) ? 0 : skill_db[id].upkeep_time2[lv - 1];
-}
-
-int skill_get_castdef (int id)
-{
- return skill_db[id].cast_def_rate;
-}
-
-int skill_get_weapontype (int id)
-{
- return skill_db[id].weapon;
-}
-
-int skill_get_inf2 (int id)
+int skill_get_inf2(SkillID id)
{
return skill_db[id].inf2;
}
-int skill_get_maxcount (int id)
+int skill_get_maxcount(SkillID id)
{
return skill_db[id].maxcount;
}
-int skill_get_blewcount (int id, int lv)
-{
- return (lv <= 0) ? 0 : skill_db[id].blewcount[lv - 1];
-}
-
-int skill_get_mhp (int id, int lv)
-{
- return (lv <= 0) ? 0 : skill_db[id].mhp[lv - 1];
-}
-
static
-int skill_get_castnodex (int id, int lv)
+int skill_get_castnodex(SkillID id, int lv)
{
return (lv <= 0) ? 0 : skill_db[id].castnodex[lv - 1];
}
-/* プロトタイプ */
-struct skill_unit_group *skill_unitsetting (struct block_list *src,
- int skillid, int skilllv, int x,
- int y, int flag);
-int skill_check_condition (struct map_session_data *sd, int type);
-int skill_frostjoke_scream (struct block_list *bl, va_list ap);
-int skill_status_change_timer_sub (struct block_list *bl, va_list ap);
-int skill_attack_area (struct block_list *bl, va_list ap);
-int skill_clear_element_field (struct block_list *bl);
-int skill_landprotector (struct block_list *bl, va_list ap);
-int skill_trap_splash (struct block_list *bl, va_list ap);
-int skill_count_target (struct block_list *bl, va_list ap);
-
-// [MouseJstr] - skill ok to cast? and when?
-static int skillnotok (int 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)
+static
+int distance(int x0, int y0, int x1, int y1)
{
- int dx, dy;
+ int dx, dy;
- dx = abs (x0 - x1);
- dy = abs (y0 - y1);
+ dx = abs(x0 - x1);
+ dy = abs(y0 - y1);
return dx > dy ? dx : dy;
}
-/* スキルユニットIDを返す(これもデータベースに入れたいな) */
-int skill_get_unit_id (int 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,
- int skillid, int skilllv, int attack_type,
- unsigned int tick)
+int skill_additional_effect(struct block_list *src, struct block_list *bl,
+ SkillID skillid, int skilllv)
{
- /* MOB追加効果スキル用 */
- const int sc[] = {
- SC_POISON, SC_BLIND, SC_SILENCE, SC_STAN,
- SC_STONE, SC_CURSE, SC_SLEEP
- };
- const int sc2[] = {
- MG_STONECURSE, MG_FROSTDIVER, NPC_STUNATTACK,
- NPC_SLEEPATTACK, TF_POISON, NPC_CURSEATTACK,
- NPC_SILENCEATTACK, 0, NPC_BLINDATTACK
- };
-
struct map_session_data *sd = NULL;
- struct map_session_data *dstsd = NULL;
struct mob_data *md = NULL;
- struct mob_data *dstmd = 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;
- int sc_def_phys_shield_spell;
+ int sc_def_mdef, sc_def_vit, sc_def_int, sc_def_luk;
+ int sc_def_phys_shield_spell;
- nullpo_retr (0, src);
- nullpo_retr (0, bl);
+ nullpo_ret(src);
+ nullpo_ret(bl);
if (skilllv < 0)
return 0;
- if (src->type == BL_PC)
+ if (src->type == BL::PC)
{
- nullpo_retr (0, sd = (struct map_session_data *) src);
+ sd = (struct map_session_data *) src;
+ nullpo_ret(sd);
}
- else if (src->type == BL_MOB)
+ else if (src->type == BL::MOB)
{
- nullpo_retr (0, md = (struct mob_data *) src); //未使用?
+ md = (struct mob_data *) src;
+ nullpo_ret(md); //未使用?
}
sc_def_phys_shield_spell = 0;
- if (battle_get_sc_data (bl)[SC_PHYS_SHIELD].timer != -1)
+ if (battle_get_sc_data(bl)[StatusChange::SC_PHYS_SHIELD].timer)
sc_def_phys_shield_spell =
- battle_get_sc_data (bl)[SC_PHYS_SHIELD].val1;
+ battle_get_sc_data(bl)[StatusChange::SC_PHYS_SHIELD].val1;
//対象の耐性
- luk = battle_get_luk (bl);
- sc_def_mdef = 100 - (3 + battle_get_mdef (bl) + luk / 3);
- sc_def_vit = 100 - (3 + battle_get_vit (bl) + luk / 3);
- sc_def_int = 100 - (3 + battle_get_int (bl) + luk / 3);
+ luk = battle_get_luk(bl);
+ sc_def_mdef = 100 - (3 + battle_get_mdef(bl) + luk / 3);
+ sc_def_vit = 100 - (3 + battle_get_vit(bl) + luk / 3);
+ sc_def_int = 100 - (3 + battle_get_int(bl) + luk / 3);
sc_def_luk = 100 - (3 + luk);
//自分の耐性
- luk = battle_get_luk (src);
- sc_def_mdef2 = 100 - (3 + battle_get_mdef (src) + luk / 3);
- sc_def_vit2 = 100 - (3 + battle_get_vit (src) + luk / 3);
- sc_def_int2 = 100 - (3 + battle_get_int (src) + luk / 3);
- sc_def_luk2 = 100 - (3 + luk);
- if (bl->type == BL_PC)
- dstsd = (struct map_session_data *) bl;
- else if (bl->type == BL_MOB)
+ luk = battle_get_luk(src);
+
+ if (bl->type == BL::MOB)
{
- dstmd = (struct mob_data *) bl; //未使用?
if (sc_def_mdef > 50)
sc_def_mdef = 50;
if (sc_def_vit > 50)
@@ -1104,561 +208,13 @@ int skill_additional_effect (struct block_list *src, struct block_list *bl,
switch (skillid)
{
- case 0: /* 通常攻撃 */
- /* 自動鷹 */
- if (sd && pc_isfalcon (sd) && sd->status.weapon == 11
- && (skill = pc_checkskill (sd, HT_BLITZBEAT)) > 0
- && MRAND (1000) <= sd->paramc[5] * 10 / 3 + 1)
- {
- int lv = (sd->status.job_level + 9) / 10;
- skill_castend_damage_id (src, bl, HT_BLITZBEAT,
- (skill < lv) ? skill : lv, tick,
- 0xf00000);
- }
- // スナッチャー
- 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))
- clif_skill_nodamage (src, bl, TF_STEAL, skill2, 1);
- else
- clif_skill_fail (sd, skillid, 0, 0);
- }
+ case SkillID::NPC_POISON:
+ // blame Fate for this
+ if (random_::chance({50 - (sc_def_vit >> 2) - (sc_def_phys_shield_spell) + (skilllv >> 2), 100}))
+ skill_status_change_start(bl, StatusChange::SC_POISON, skilllv, static_cast<interval_t>(skilllv));
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: /* ストームガスト */
- {
- struct status_change *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:
- if (MRAND (100) < sc_def_mdef)
- skill_status_change_start (bl, sc[skillid - NPC_POISON],
- skilllv, 0, 0, 0,
- skill_get_time2 (skillid, skilllv),
- 0);
- break;
- case NPC_POISON:
- case NPC_SILENCEATTACK:
- case NPC_STUNATTACK:
- if (MRAND (100) <
- 50 - (sc_def_vit >> 2) - (sc_def_phys_shield_spell) +
- (skilllv >> 2))
- skill_status_change_start (bl, sc[skillid - NPC_POISON],
- skilllv, 0, 0, 0, skilllv, 0);
- break;
- case NPC_CURSEATTACK:
- if (MRAND (100) < sc_def_luk)
- skill_status_change_start (bl, sc[skillid - NPC_POISON],
- skilllv, 0, 0, 0,
- skill_get_time2 (skillid, skilllv),
- 0);
- break;
- case NPC_SLEEPATTACK:
- case NPC_BLINDATTACK:
- if (MRAND (100) < sc_def_int)
- skill_status_change_start (bl, sc[skillid - NPC_POISON],
- skilllv, 0, 0, 0,
- skill_get_time2 (skillid, skilllv),
- 0);
- break;
- case NPC_MENTALBREAKER:
- if (dstsd)
- {
- int sp = dstsd->status.max_sp * (10 + skilllv) / 100;
- if (sp < 1)
- sp = 1;
- 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 (sd && skillid != MC_CARTREVOLUTION && attack_type & BF_WEAPON)
- { /* カードによる追加効果 */
- int i;
- int sc_def_card = 100;
-
- for (i = SC_STONE; i <= SC_BLIND; i++)
- {
- //対象に状態異常
- if (i == SC_STONE || i == SC_FREEZE)
- sc_def_card = sc_def_mdef;
- else if (i == SC_STAN || i == SC_POISON || i == SC_SILENCE)
- sc_def_card = sc_def_vit;
- else if (i == SC_SLEEP || i == SC_CONFUSION || i == SC_BLIND)
- sc_def_card = sc_def_int;
- else if (i == SC_CURSE)
- sc_def_card = sc_def_luk;
-
- if (!sd->state.arrow_atk)
- {
- if (MRAND (10000) <
- (sd->addeff[i - SC_STONE]) * sc_def_card / 100)
- {
- if (battle_config.battle_log)
- printf
- ("PC %d skill_addeff: cardによる異常発動 %d %d\n",
- sd->bl.id, i, sd->addeff[i - SC_STONE]);
- skill_status_change_start (bl, i, 7, 0, 0, 0,
- (i ==
- SC_CONFUSION) ? 10000 +
- 7000 :
- skill_get_time2 (sc2
- [i -
- SC_STONE],
- 7), 0);
- }
- }
- else
- {
- if (MRAND (10000) <
- (sd->addeff[i - SC_STONE] +
- sd->arrow_addeff[i - SC_STONE]) * sc_def_card / 100)
- {
- if (battle_config.battle_log)
- printf
- ("PC %d skill_addeff: cardによる異常発動 %d %d\n",
- sd->bl.id, i, sd->addeff[i - SC_STONE]);
- skill_status_change_start (bl, i, 7, 0, 0, 0,
- (i ==
- SC_CONFUSION) ? 10000 +
- 7000 :
- skill_get_time2 (sc2
- [i -
- SC_STONE],
- 7), 0);
- }
- }
- //自分に状態異常
- if (i == SC_STONE || i == SC_FREEZE)
- sc_def_card = sc_def_mdef2;
- else if (i == SC_STAN || i == SC_POISON || i == SC_SILENCE)
- sc_def_card = sc_def_vit2;
- else if (i == SC_SLEEP || i == SC_CONFUSION || i == SC_BLIND)
- sc_def_card = sc_def_int2;
- else if (i == SC_CURSE)
- sc_def_card = sc_def_luk2;
-
- if (!sd->state.arrow_atk)
- {
- if (MRAND (10000) <
- (sd->addeff2[i - SC_STONE]) * sc_def_card / 100)
- {
- if (battle_config.battle_log)
- printf
- ("PC %d skill_addeff: cardによる異常発動 %d %d\n",
- src->id, i, sd->addeff2[i - SC_STONE]);
- skill_status_change_start (src, i, 7, 0, 0, 0,
- (i ==
- SC_CONFUSION) ? 10000 +
- 7000 :
- skill_get_time2 (sc2
- [i -
- SC_STONE],
- 7), 0);
- }
- }
- else
- {
- if (MRAND (10000) <
- (sd->addeff2[i - SC_STONE] +
- sd->arrow_addeff2[i - SC_STONE]) * sc_def_card / 100)
- {
- if (battle_config.battle_log)
- printf
- ("PC %d skill_addeff: cardによる異常発動 %d %d\n",
- src->id, i, sd->addeff2[i - SC_STONE]);
- skill_status_change_start (src, i, 7, 0, 0, 0,
- (i ==
- SC_CONFUSION) ? 10000 +
- 7000 :
- skill_get_time2 (sc2
- [i -
- SC_STONE],
- 7), 0);
- }
- }
- }
- }
- return 0;
-}
-
-/*=========================================================================
- スキル攻撃吹き飛ばし処理
--------------------------------------------------------------------------*/
-static
-int skill_blown (struct block_list *src, struct block_list *target, int count)
-{
- int dx = 0, dy = 0, nx, ny;
- int x = target->x, y = target->y;
- int ret, prev_state = MS_IDLE;
- int moveblock;
- struct map_session_data *sd = NULL;
- struct mob_data *md = NULL;
- struct skill_unit *su = NULL;
-
- nullpo_retr (0, src);
- nullpo_retr (0, target);
-
- if (target->type == BL_PC)
- {
- nullpo_retr (0, sd = (struct map_session_data *) target);
- }
- else if (target->type == BL_MOB)
- {
- nullpo_retr (0, md = (struct mob_data *) target);
- }
- else if (target->type == BL_SKILL)
- {
- nullpo_retr (0, su = (struct skill_unit *) target);
- }
- else
- return 0;
-
- if (!(count & 0x10000 && (sd || md || su)))
- { /* 指定なしなら位置関係から方向を求める */
- dx = target->x - src->x;
- dx = (dx > 0) ? 1 : ((dx < 0) ? -1 : 0);
- dy = target->y - src->y;
- dy = (dy > 0) ? 1 : ((dy < 0) ? -1 : 0);
- }
- if (dx == 0 && dy == 0)
- {
- int dir = battle_get_dir (target);
- if (dir >= 0 && dir < 8)
- {
- dx = -dirx[dir];
- dy = -diry[dir];
- }
- }
-
- ret = path_blownpos (target->m, x, y, dx, dy, count & 0xffff);
- nx = ret >> 16;
- ny = ret & 0xffff;
- moveblock = (x / BLOCK_SIZE != nx / BLOCK_SIZE
- || y / BLOCK_SIZE != ny / BLOCK_SIZE);
-
- if (count & 0x20000)
- {
- battle_stopwalking (target, 1);
- if (sd)
- {
- sd->to_x = nx;
- sd->to_y = ny;
- sd->walktimer = 1;
- clif_walkok (sd);
- clif_movechar (sd);
- }
- else if (md)
- {
- md->to_x = nx;
- md->to_y = ny;
- prev_state = md->state.state;
- md->state.state = MS_WALK;
- clif_fixmobpos (md);
- }
- }
- else
- battle_stopwalking (target, 2);
-
- dx = nx - x;
- dy = ny - y;
-
- if (sd) /* 画面外に出たので消去 */
- map_foreachinmovearea (clif_pcoutsight, target->m, x - AREA_SIZE,
- y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE,
- dx, dy, 0, sd);
- else if (md)
- map_foreachinmovearea (clif_moboutsight, target->m, x - AREA_SIZE,
- y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE,
- dx, dy, BL_PC, md);
-
- if (su)
- {
- skill_unit_move_unit_group (su->group, target->m, dx, dy);
- }
- else
- {
-// struct status_change *sc_data=battle_get_sc_data(target);
- if (moveblock)
- map_delblock (target);
- target->x = nx;
- target->y = ny;
- if (moveblock)
- map_addblock (target);
-/*ダンス中にエフェクトは移動しないらしい
- if(sc_data && sc_data[SC_DANCING].timer!=-1){ //対象がダンス中なのでエフェクトも移動
- struct skill_unit_group *sg=(struct skill_unit_group *)sc_data[SC_DANCING].val2;
- if(sg)
- skill_unit_move_unit_group(sg,target->m,dx,dy);
- }
-*/
- }
-
- if (sd)
- { /* 画面内に入ってきたので表示 */
- map_foreachinmovearea (clif_pcinsight, target->m, nx - AREA_SIZE,
- ny - AREA_SIZE, nx + AREA_SIZE, ny + AREA_SIZE,
- -dx, -dy, 0, sd);
- if (count & 0x20000)
- sd->walktimer = -1;
- }
- else if (md)
- {
- map_foreachinmovearea (clif_mobinsight, target->m, nx - AREA_SIZE,
- ny - AREA_SIZE, nx + AREA_SIZE, ny + AREA_SIZE,
- -dx, -dy, BL_PC, md);
- if (count & 0x20000)
- md->state.state = prev_state;
}
- skill_unit_move (target, gettick (), (count & 0xffff) + 7); /* スキルユニットの判定 */
-
return 0;
}
@@ -1666,1409 +222,210 @@ int skill_blown (struct block_list *src, struct block_list *target, int count)
* =========================================================================
* スキル攻撃効果処理まとめ
* flagの説明。16進図
- * 00XRTTff
- * ff = magicで計算に渡される)
- * TT = パケットのtype部分(0でデフォルト)
+ * 00XRTTff
+ * ff = magicで計算に渡される)
+ * TT = パケットのtype部分(0でデフォルト)
* X = パケットのスキルLv
- * R = 予約(skill_area_subで使用する)
+ * R = 予約(skill_area_subで使用する)
*-------------------------------------------------------------------------
*/
-int skill_attack (int attack_type, struct block_list *src,
- struct block_list *dsrc, struct block_list *bl, int skillid,
- int skilllv, unsigned int tick, int flag)
+int skill_attack(BF attack_type, struct block_list *src,
+ struct block_list *dsrc, struct block_list *bl,
+ SkillID skillid, int skilllv, tick_t tick, BCT flag)
{
struct Damage dmg;
- struct status_change *sc_data;
- int type, lv, damage;
+ eptr<struct status_change, StatusChange> sc_data;
+ int type, lv, damage;
- rdamage = 0;
- nullpo_retr (0, src);
- nullpo_retr (0, dsrc);
- nullpo_retr (0, bl);
+ nullpo_ret(src);
+ nullpo_ret(dsrc);
+ nullpo_ret(bl);
- sc_data = battle_get_sc_data (bl);
+ sc_data = battle_get_sc_data(bl);
//何もしない判定ここから
if (dsrc->m != bl->m) //対象が同じマップにいなければ何もしない
return 0;
if (src->prev == NULL || dsrc->prev == NULL || bl->prev == NULL) //prevよくわからない※
return 0;
- if (src->type == BL_PC && pc_isdead ((struct map_session_data *) src)) //術者?がPCですでに死んでいたら何もしない
- return 0;
- if (dsrc->type == BL_PC && pc_isdead ((struct map_session_data *) dsrc)) //術者?がPCですでに死んでいたら何もしない
- 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) //スキルの属性が地属性でなければ何もしない
- return 0;
- }
- if (sc_data && sc_data[SC_TRICKDEAD].timer != -1) //死んだふり中は何もしない
+ if (src->type == BL::PC && pc_isdead((struct map_session_data *) src)) //術者?がPCですでに死んでいたら何もしない
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が同じ場所なら何もしない
+ if (dsrc->type == BL::PC && pc_isdead((struct map_session_data *) dsrc)) //術者?がPCですでに死んでいたら何もしない
return 0;
- if (src->type == BL_PC && ((struct map_session_data *) src)->chatID) //術者がPCでチャット中なら何もしない
+ if (bl->type == BL::PC && pc_isdead((struct map_session_data *) bl)) //対象がPCですでに死んでいたら何もしない
return 0;
- if (dsrc->type == BL_PC && ((struct map_session_data *) dsrc)->chatID) //術者がPCでチャット中なら何もしない
+ if (src->type == BL::PC && ((struct map_session_data *) src)->chatID) //術者がPCでチャット中なら何もしない
return 0;
- if (src->type == BL_PC && bl
- && mob_gvmobcheck (((struct map_session_data *) src), bl) == 0)
+ if (dsrc->type == BL::PC && ((struct map_session_data *) dsrc)->chatID) //術者がPCでチャット中なら何もしない
return 0;
//何もしない判定ここまで
type = -1;
- lv = (flag >> 20) & 0xf;
- dmg = battle_calc_attack (attack_type, src, bl, skillid, skilllv, flag & 0xff); //ダメージ計算
-
-//マジックロッド処理ここから
- if (attack_type & BF_MAGIC && sc_data && sc_data[SC_MAGICROD].timer != -1
- && src == dsrc)
- { //魔法攻撃でマジックロッド状態でsrc=dsrcなら
- dmg.damage = dmg.damage2 = 0; //ダメージ0
- if (bl->type == BL_PC)
- { //対象が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)
- sp = 1; //1以下の場合は1
- if (((struct map_session_data *) bl)->status.sp + sp >
- ((struct map_session_data *) bl)->status.max_sp)
- { //回復SP+現在のSPがMSPより大きい場合
- sp = ((struct map_session_data *) bl)->status.max_sp - ((struct map_session_data *) bl)->status.sp; //SPをMSP-現在SPにする
- ((struct map_session_data *) bl)->status.sp = ((struct map_session_data *) bl)->status.max_sp; //現在のSPにMSPを代入
- }
- else //回復SP+現在のSPがMSPより小さい場合は回復SPを加算
- ((struct map_session_data *) bl)->status.sp += sp;
- clif_heal (((struct map_session_data *) bl)->fd, SP_SP, sp); //SP回復エフェクトの表示
- ((struct map_session_data *) bl)->canact_tick = tick + skill_delayfix (bl, skill_get_delay (SA_MAGICROD, sc_data[SC_MAGICROD].val1)); //
- }
- clif_skill_nodamage (bl, bl, SA_MAGICROD, sc_data[SC_MAGICROD].val1, 1); //マジックロッドエフェクトを表示
- }
-//マジックロッド処理ここまで
+ lv = flag.level;
+ dmg = battle_calc_attack(attack_type, src, bl, skillid, skilllv, flag.lo); //ダメージ計算
damage = dmg.damage + dmg.damage2;
if (lv == 15)
lv = -1;
- if (flag & 0xff00)
- type = (flag & 0xff00) >> 8;
-
- 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_retr (0, 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, MO_CHAINCOMBO, skilllv, 0, 0, delay, 0); //コンボ状態に
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay (src, 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, MO_COMBOFINISH, skilllv, 0, 0, delay, 0); //コンボ状態に
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay (src, 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, CH_TIGERFIST, skilllv, 0, 0, delay, 0); //コンボ状態に
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay (src, 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, CH_CHAINCRUSH, skilllv, 0, 0, delay, 0); //コンボ状態に
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay (src, delay); //コンボディレイパケットの送信
- }
-//連柱崩撃(CH_CHAINCRUSH)ここまで
- }
-//使用者がPCの場合の処理ここまで
-//武器スキル?ここから
- //AppleGirl Was Here
- if (attack_type & BF_MAGIC && damage > 0 && src != bl && src == dsrc)
- { //Blah Blah
- if (bl->type == BL_PC)
- { //Blah Blah
- struct map_session_data *tsd = (struct map_session_data *) bl;
- if (tsd->magic_damage_return > 0)
- { //More Blah
- rdamage += damage * tsd->magic_damage_return / 100;
- if (rdamage < 1)
- rdamage = 1;
- }
- }
- }
- //Stop Here
- if (attack_type & BF_WEAPON && damage > 0 && src != bl && src == dsrc)
- { //武器スキル&ダメージあり&使用者と対象者が違う&src=dsrc
- if (dmg.flag & BF_SHORT)
- { //近距離攻撃時?※
- if (bl->type == BL_PC)
- { //対象がPCの時
- struct map_session_data *tsd = (struct map_session_data *) bl;
- nullpo_retr (0, tsd);
- if (tsd->short_weapon_damage_return > 0)
- { //近距離攻撃跳ね返し?※
- rdamage += damage * tsd->short_weapon_damage_return / 100;
- if (rdamage < 1)
- rdamage = 1;
- }
- }
- if (sc_data && sc_data[SC_REFLECTSHIELD].timer != -1)
- { //リフレクトシールド時
- rdamage += damage * sc_data[SC_REFLECTSHIELD].val2 / 100; //跳ね返し計算
- if (rdamage < 1)
- rdamage = 1;
- }
- }
- else if (dmg.flag & BF_LONG)
- { //遠距離攻撃時?※
- if (bl->type == BL_PC)
- { //対象がPCの時
- struct map_session_data *tsd = (struct map_session_data *) bl;
- nullpo_retr (0, tsd);
- if (tsd->long_weapon_damage_return > 0)
- { //遠距離攻撃跳ね返し?※
- rdamage += damage * tsd->long_weapon_damage_return / 100;
- if (rdamage < 1)
- rdamage = 1;
- }
- }
- }
- if (rdamage > 0)
- clif_damage (src, src, tick, dmg.amotion, 0, rdamage, 1, 4, 0);
- }
-//武器スキル?ここまで
+ if (flag.mid)
+ type = flag.mid;
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:
+ case SkillID::NPC_SELFDESTRUCTION:
break;
default:
- clif_skill_damage (dsrc, bl, tick, dmg.amotion, dmg.dmotion,
+ clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion,
damage, dmg.div_, skillid,
(lv != 0) ? lv : skilllv,
- (skillid == 0) ? 5 : type);
- }
- if (dmg.blewcount > 0 && !map[src->m].flag.gvg)
- { /* 吹き飛ばし処理とそのパケット */
- if (skillid == WZ_SIGHTRASHER)
- skill_blown (src, bl, dmg.blewcount);
- else
- skill_blown (dsrc, bl, dmg.blewcount);
- if (bl->type == BL_MOB)
- clif_fixmobpos ((struct mob_data *) bl);
- else
- clif_fixpos (bl);
+ (skillid == SkillID::ZERO) ? 5 : type);
}
- map_freeblock_lock ();
+ 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) && !map[src->m].flag.gvg)
- {
- 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, 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_retr(0, 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)
{
struct map_session_data *sd = (struct map_session_data *) bl;
- nullpo_retr (0, sd);
- if (bl->type != BL_PC || (sd && !pc_isdead (sd)))
+ nullpo_ret(sd);
+ if (bl->type != BL::PC || (sd && !pc_isdead(sd)))
{
if (damage > 0)
- skill_additional_effect (src, bl, skillid, skilllv,
- attack_type, tick);
- if (bl->type == BL_MOB && src != bl) /* スキル使用条件のMOBスキル */
+ skill_additional_effect(src, bl, skillid, skilllv);
+ if (bl->type == BL::MOB && src != bl) /* スキル使用条件のMOBスキル */
{
struct mob_data *md = (struct mob_data *) bl;
- nullpo_retr (0, md);
+ nullpo_ret(md);
if (battle_config.mob_changetarget_byskill == 1)
{
- int target;
+ int target;
target = md->target_id;
- if (src->type == BL_PC)
+ if (src->type == BL::PC)
md->target_id = src->id;
- mobskill_use (md, tick, MSC_SKILLUSED | (skillid << 16));
+ mobskill_use(md, tick, MobSkillCondition::ANY);
md->target_id = target;
}
else
- mobskill_use (md, tick, MSC_SKILLUSED | (skillid << 16));
+ mobskill_use(md, tick, MobSkillCondition::ANY);
}
}
}
- if (src->type == BL_PC && dmg.flag & BF_WEAPON && src != bl && src == dsrc
+ if (src->type == BL::PC
+ && bool(dmg.flag & BF::WEAPON)
+ && src != bl
+ && src == dsrc
&& damage > 0)
{
struct map_session_data *sd = (struct map_session_data *) src;
- int hp = 0, sp = 0;
- nullpo_retr (0, sd);
+ int hp = 0, sp = 0;
+ nullpo_ret(sd);
if (sd->hp_drain_rate && dmg.damage > 0
- && MRAND (100) < sd->hp_drain_rate)
+ && random_::chance({sd->hp_drain_rate, 100}))
{
hp += (dmg.damage * sd->hp_drain_per) / 100;
}
if (sd->hp_drain_rate_ && dmg.damage2 > 0
- && MRAND (100) < sd->hp_drain_rate_)
+ && random_::chance({sd->hp_drain_rate_, 100}))
{
hp += (dmg.damage2 * sd->hp_drain_per_) / 100;
}
if (sd->sp_drain_rate > 0 && dmg.damage > 0
- && MRAND (100) < sd->sp_drain_rate)
+ && random_::chance({sd->sp_drain_rate, 100}))
{
sp += (dmg.damage * sd->sp_drain_per) / 100;
}
if (sd->sp_drain_rate_ > 0 && dmg.damage2 > 0
- && MRAND (100) < sd->sp_drain_rate_)
+ && random_::chance({sd->sp_drain_rate_, 100}))
{
sp += (dmg.damage2 * sd->sp_drain_per_) / 100;
}
if (hp || sp)
- pc_heal (sd, hp, sp);
- }
-
- if ((skillid != KN_BOWLINGBASH || flag) && rdamage > 0)
- battle_damage (bl, src, rdamage, 0);
-
- if (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,
- 0x8000 | sc_data[SC_AUTOCOUNTER].val1);
- skill_status_change_end (bl, SC_AUTOCOUNTER, -1);
+ pc_heal(sd, hp, sp);
}
- map_freeblock_unlock ();
+ map_freeblock_unlock();
return (dmg.damage + dmg.damage2); /* 与ダメを返す */
}
-/*==========================================
- * スキル範囲攻撃用(map_foreachinareaから呼ばれる)
- * flagについて:16進図を確認
- * MSB <- 00fTffff ->LSB
- * T =ターゲット選択用(BCT_*)
- * ffff=自由に使用可能
- * 0 =予約。0に固定
- *------------------------------------------
- */
-static int skill_area_temp[8]; /* 一時変数。必要なら使う。 */
-typedef int (*SkillFunc) (struct block_list *, struct block_list *, int, int,
- unsigned int, int);
-static
-int skill_area_sub (struct block_list *bl, va_list ap)
-{
- struct block_list *src;
- int skill_id, skill_lv, flag;
- unsigned int tick;
- SkillFunc func;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
-
- if (bl->type != BL_PC && bl->type != BL_MOB && bl->type != BL_SKILL)
- return 0;
-
- src = va_arg (ap, struct block_list *); //ここではsrcの値を参照していないのでNULLチェックはしない
- skill_id = va_arg (ap, int);
- skill_lv = va_arg (ap, int);
- tick = va_arg (ap, unsigned int);
- flag = va_arg (ap, int);
- func = va_arg (ap, SkillFunc);
-
- if (battle_check_target (src, bl, flag) > 0)
- func (src, bl, skill_id, skill_lv, tick, flag);
- return 0;
-}
-
-static int skill_check_unit_range_sub (struct block_list *bl, va_list ap)
-{
- struct skill_unit *unit;
- int *c, x, y, range, sx[4], sy[4];
- int t_range, tx[4], ty[4];
- int i, r_flag, skillid;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, unit = (struct skill_unit *) bl);
- nullpo_retr (0, c = va_arg (ap, int *));
-
- if (bl->prev == NULL || bl->type != BL_SKILL)
- return 0;
-
- if (!unit->alive)
- return 0;
+typedef int(*SkillFunc)(struct block_list *, struct block_list *,
+ SkillID, int,
+ tick_t, BCT);
- x = va_arg (ap, int);
- y = va_arg (ap, int);
- range = va_arg (ap, int);
- skillid = va_arg (ap, int);
-
- if (skillid == MG_SAFETYWALL || skillid == AL_PNEUMA)
- {
- if (unit->group->unit_id != 0x7e && unit->group->unit_id != 0x85)
- return 0;
- }
- else if (skillid == AL_WARP)
- {
- if ((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99)
- && unit->group->unit_id != 0x92)
- return 0;
- }
- 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 0;
- }
- else if (skillid == WZ_FIREPILLAR)
- {
- if (unit->group->unit_id != 0x87)
- return 0;
- }
- else
- return 0;
- 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)++;
-
- return 0;
-}
-
-int skill_check_unit_range (int m, int x, int y, int range, int skillid)
-{
- int c = 0;
-
- map_foreachinarea (skill_check_unit_range_sub, m, x - 10, y - 10, x + 10,
- y + 10, BL_SKILL, &c, x, y, range, skillid);
-
- return c;
-}
-
-static int skill_check_unit_range2_sub (struct block_list *bl, va_list ap)
-{
- int *c;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, c = va_arg (ap, int *));
-
- if (bl->prev == NULL || (bl->type != BL_PC && bl->type != BL_MOB))
- return 0;
-
- if (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl))
- return 0;
-
- (*c)++;
-
- return 0;
-}
-
-int skill_check_unit_range2 (int m, int x, int y, int range)
-{
- int c = 0;
-
- map_foreachinarea (skill_check_unit_range2_sub, m, x - range, y - range,
- x + range, y + range, 0, &c);
-
- return c;
-}
-
-/*=========================================================================
- * 範囲スキル使用処理小分けここから
- */
-/* 対象の数をカウントする。(skill_area_temp[0]を初期化しておくこと) */
static
-int skill_area_sub_count (struct block_list *src, struct block_list *target,
- int skillid, int skilllv, unsigned int tick,
- int flag)
+void skill_area_sub(struct block_list *bl,
+ struct block_list *src, SkillID skill_id, int skill_lv,
+ tick_t tick, BCT flag, SkillFunc func)
{
- if (skill_area_temp[0] < 0xffff)
- skill_area_temp[0]++;
- return 0;
-}
+ nullpo_retv(bl);
-/*==========================================
- *
- *------------------------------------------
- */
-static void skill_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{
- struct map_session_data *sd = NULL;
- struct mob_data *md = NULL;
- struct block_list *src = map_id2bl (id), *target;
- struct skill_timerskill *skl = NULL;
- int range;
-
- nullpo_retv (src);
-
- if (src->prev == NULL)
- return;
-
- if (src->type == BL_PC)
- {
- nullpo_retv (sd = (struct map_session_data *) src);
- skl = &sd->skilltimerskill[data];
- }
- else if (src->type == BL_MOB)
- {
- nullpo_retv (md = (struct mob_data *) src);
- skl = &md->skilltimerskill[data];
- }
-
- else
+ if (bl->type != BL::PC && bl->type != BL::MOB)
return;
- nullpo_retv (skl);
-
- 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)
- 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)
- return;
-
- switch (skl->skill_id)
- {
- case TF_BACKSLIDING:
- clif_skill_nodamage (src, src, skl->skill_id, skl->skill_lv,
- 1);
- break;
- case RG_INTIMIDATE:
- if (sd && !map[src->m].flag.noteleport)
- {
- int x, y, 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)
- {
- int x, y, 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 (skill_frostjoke_scream, src->m,
- src->x - range, src->y - range,
- src->x + range, src->y + range, 0, src,
- skl->skill_id, skl->skill_lv, tick);
- break;
-
- default:
- skill_attack (skl->type, 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 >= 0)
- {
- skill_unitsetting (src, skl->skill_id, skl->skill_lv,
- skl->type >> 16, skl->type & 0xFFFF,
- 0);
- clif_skill_poseffect (src, skl->skill_id, skl->skill_lv,
- skl->x, skl->y, tick);
- }
- else
- skill_unitsetting (src, skl->skill_id, skl->skill_lv,
- skl->x, skl->y, 0);
- break;
- }
- }
+ if (battle_check_target(src, bl, flag) > 0)
+ func(src, bl, skill_id, skill_lv, tick, flag);
}
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_addtimerskill (struct block_list *src, unsigned int tick,
- int target, int x, int y, int skill_id, int skill_lv,
- int type, int 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_cleartimerskill (struct block_list *src)
-{
- int i;
-
- nullpo_retr (0, src);
-
- if (src->type == BL_PC)
- {
- struct map_session_data *sd = (struct map_session_data *) src;
- nullpo_retr (0, sd);
- for (i = 0; i < MAX_SKILLTIMERSKILL; i++)
- {
- if (sd->skilltimerskill[i].timer != -1)
- {
- delete_timer (sd->skilltimerskill[i].timer, skill_timer);
- sd->skilltimerskill[i].timer = -1;
- }
- }
- }
- else if (src->type == BL_MOB)
- {
- struct mob_data *md = (struct mob_data *) src;
- nullpo_retr (0, md);
- for (i = 0; i < MAX_MOBSKILLTIMERSKILL; i++)
- {
- if (md->skilltimerskill[i].timer != -1)
- {
- delete_timer (md->skilltimerskill[i].timer, skill_timer);
- md->skilltimerskill[i].timer = -1;
- }
- }
- }
-
- return 0;
-}
/* 範囲スキル使用処理小分けここまで
* -------------------------------------------------------------------------
*/
+// these variables are set in the 'else' branches,
+// and used in the (recursive) 'if' branch
+static int skill_area_temp_id, skill_area_temp_hp;
+
+
/*==========================================
* スキル使用(詠唱完了、ID指定攻撃系)
* (スパゲッティに向けて1歩前進!(ダメポ))
*------------------------------------------
*/
-int skill_castend_damage_id (struct block_list *src, struct block_list *bl,
- int skillid, int skilllv, unsigned int tick,
- int flag)
+int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
+ SkillID skillid, int skilllv,
+ tick_t tick, BCT flag)
{
struct map_session_data *sd = NULL;
- nullpo_retr (1, src);
- nullpo_retr (1, bl);
+ nullpo_retr(1, src);
+ nullpo_retr(1, bl);
- if (src->type == BL_PC)
+ if (src->type == BL::PC)
sd = (struct map_session_data *) src;
- if (sd && pc_isdead (sd))
+ 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))
+ if (bl->type == BL::PC && pc_isdead((struct map_session_data *) bl))
return 1;
- map_freeblock_lock ();
+ 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:
- case NPC_MENTALBREAKER:
- case NPC_RANGEATTACK:
- case NPC_CRITICALSLASH:
- case NPC_COMBOATTACK:
- /* 必中攻撃、毒攻撃、暗黒攻撃、沈黙攻撃、スタン攻撃 */
- case NPC_GUIDEDATTACK:
- case NPC_POISON:
- case NPC_BLINDATTACK:
- case NPC_SILENCEATTACK:
- case NPC_STUNATTACK:
- /* 石化攻撃、呪い攻撃、睡眠攻撃、ランダムATK攻撃 */
- case NPC_PETRIFYATTACK:
- case NPC_CURSEATTACK:
- case NPC_SLEEPATTACK:
- case NPC_RANDOMATTACK:
- /* 水属性攻撃、地属性攻撃、火属性攻撃、風属性攻撃 */
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- /* 毒属性攻撃、聖属性攻撃、闇属性攻撃、念属性攻撃、SP減少攻撃 */
- case NPC_POISONATTACK:
- 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;
- case NPC_DARKBREATH:
- clif_emotion (src, 7);
- skill_attack (BF_MISC, src, src, bl, skillid, skilllv, tick,
- flag);
- break;
- case MO_INVESTIGATE: /* 発勁 */
- {
- struct status_change *sc_data = battle_get_sc_data (src);
- skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick,
+ case SkillID::NPC_POISON:
+ 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)
- {
- struct status_change *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: /* 指弾 */
- {
- struct status_change *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, 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: /* 連打掌 */
- {
- struct status_change *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: /* 阿修羅覇鳳拳 */
- {
- struct status_change *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 & 1)
+ case SkillID::NPC_SELFDESTRUCTION: /* 自爆 */
+ if (flag.lo & 1)
{
/* 個別にダメージを与える */
- if (bl->id != skill_area_temp[1])
- {
- int dist = 0;
- if (skillid == SM_MAGNUM)
- { /* マグナムブレイクなら中心からの距離を計算 */
- int dx = abs (bl->x - skill_area_temp[2]);
- int dy = abs (bl->y - skill_area_temp[3]);
- dist = ((dx > dy) ? dx : dy);
- }
- skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv,
- tick, 0x0500 | dist);
- }
- }
- else
- {
- 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 */
- ar = 3;
- skill_area_temp[1] = bl->id;
- skill_area_temp[2] = x;
- skill_area_temp[3] = y;
- /* まずターゲットに攻撃を加える */
- skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick,
- 0);
- /* その後ターゲット以外の範囲内の敵全体に処理を行う */
- map_foreachinarea (skill_area_sub,
- bl->m, x - ar, y - ar, x + ar, y + ar, 0,
- src, skillid, skilllv, tick,
- flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- }
- break;
-
- case KN_BOWLINGBASH: /* ボウリングバッシュ */
- if (flag & 1)
- {
- /* 個別にダメージを与える */
- if (bl->id != skill_area_temp[1])
- skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv,
- tick, 0x0500);
- }
- else
- {
- int damage;
- map_freeblock_lock ();
- damage =
- skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv,
- tick, 0);
- if (damage > 0)
- {
- int i, c; /* 他人から聞いた動きなので間違ってる可能性大&効率が悪いっす>< */
- c = skill_get_blewcount (skillid, skilllv);
- if (map[bl->m].flag.gvg)
- c = 0;
- 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[0] = 0;
- map_foreachinarea (skill_area_sub,
- bl->m, bl->x - 1, bl->y - 1,
- bl->x + 1, bl->y + 1, 0, src,
- skillid, skilllv, tick,
- flag | BCT_ENEMY,
- skill_area_sub_count);
- if (skill_area_temp[0] > 1)
- break;
- }
- skill_area_temp[1] = bl->id;
- skill_area_temp[2] = bl->x;
- skill_area_temp[3] = bl->y;
- /* その後ターゲット以外の範囲内の敵全体に処理を行う */
- map_foreachinarea (skill_area_sub,
- bl->m, bl->x - 1, bl->y - 1, bl->x + 1,
- bl->y + 1, 0, src, skillid, skilllv,
- tick, flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- battle_damage (src, bl, damage, 1);
- if (rdamage > 0)
- battle_damage (bl, src, rdamage, 0);
- }
- map_freeblock_unlock ();
- }
- break;
-
- case ALL_RESURRECTION: /* リザレクション */
- case PR_TURNUNDEAD: /* ターンアンデッド */
- if (bl->type != BL_PC
- && battle_check_undead (battle_get_race (bl),
- battle_get_elem_type (bl)))
- skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- flag);
- else
- {
- map_freeblock_unlock ();
- return 1;
- }
- break;
-
- /* 魔法系スキル */
- case MG_SOULSTRIKE: /* ソウルストライク */
- case MG_COLDBOLT: /* コールドボルト */
- case MG_FIREBOLT: /* ファイアーボルト */
- case MG_LIGHTNINGBOLT: /* ライトニングボルト */
- case WZ_EARTHSPIKE: /* アーススパイク */
- case AL_HEAL: /* ヒール */
- case AL_HOLYLIGHT: /* ホーリーライト */
- case MG_FROSTDIVER: /* フロストダイバー */
- case WZ_JUPITEL: /* ユピテルサンダー */
- case NPC_MAGICALATTACK: /* MOB:魔法打撃攻撃 */
- case PR_ASPERSIO: /* アスペルシオ */
- skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- flag);
- break;
-
- case WZ_WATERBALL: /* ウォーターボール */
- skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- flag);
- if (skilllv > 1)
- skill_status_change_start (src, SC_WATERBALL, skilllv, bl->id,
- 0, 0, 0, 0);
- break;
-
- case PR_BENEDICTIO: /* 聖体降福 */
- if (battle_get_race (bl) == 1 || battle_get_race (bl) == 6)
- skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- flag);
- break;
-
- /* 魔法系範囲攻撃スキル */
- case MG_NAPALMBEAT: /* ナパームビート */
- case MG_FIREBALL: /* ファイヤーボール */
- if (flag & 1)
- {
- /* 個別にダメージを与える */
- if (bl->id != skill_area_temp[1])
- {
- if (skillid == MG_FIREBALL)
- { /* ファイヤーボールなら中心からの距離を計算 */
- int dx = abs (bl->x - skill_area_temp[2]);
- int dy = abs (bl->y - skill_area_temp[3]);
- skill_area_temp[0] = ((dx > dy) ? dx : dy);
- }
- skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv,
- tick, skill_area_temp[0] | 0x0500);
- }
- }
- else
- {
- int ar = (skillid == MG_NAPALMBEAT) ? 1 : 2;
- skill_area_temp[1] = bl->id;
- if (skillid == MG_NAPALMBEAT)
- { /* ナパームでは先に数える */
- skill_area_temp[0] = 0;
- map_foreachinarea (skill_area_sub,
- bl->m, bl->x - 1, bl->y - 1, bl->x + 1,
- bl->y + 1, 0, src, skillid, skilllv,
- tick, flag | BCT_ENEMY,
- skill_area_sub_count);
- }
- else
- {
- skill_area_temp[0] = 0;
- skill_area_temp[2] = bl->x;
- skill_area_temp[3] = bl->y;
- }
- /* まずターゲットに攻撃を加える */
- skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- skill_area_temp[0]);
- /* その後ターゲット以外の範囲内の敵全体に処理を行う */
- map_foreachinarea (skill_area_sub,
- bl->m, bl->x - ar, bl->y - ar, bl->x + ar,
- bl->y + ar, 0, src, skillid, skilllv, tick,
- flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- }
- break;
-
- case HW_NAPALMVULCAN: // Fixed By SteelViruZ
- if (flag & 1)
- {
- if (bl->id != skill_area_temp[1])
- {
- skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv,
- tick, skill_area_temp[0]);
- }
- }
- else
- {
- int ar = (skillid == HW_NAPALMVULCAN) ? 1 : 2;
- skill_area_temp[1] = bl->id;
- if (skillid == HW_NAPALMVULCAN)
- {
- skill_area_temp[0] = 0;
- map_foreachinarea (skill_area_sub,
- bl->m, bl->x - 1, bl->y - 1, bl->x + 1,
- bl->y + 1, 0, src, skillid, skilllv,
- tick, flag | BCT_ENEMY,
- skill_area_sub_count);
- }
- else
- {
- skill_area_temp[0] = 0;
- skill_area_temp[2] = bl->x;
- skill_area_temp[3] = bl->y;
- }
- skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- skill_area_temp[0]);
- map_foreachinarea (skill_area_sub,
- bl->m, bl->x - ar, bl->y - ar, bl->x + ar,
- bl->y + ar, 0, src, skillid, skilllv, tick,
- flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- }
- break;
-
- case WZ_FROSTNOVA: /* フロストノヴァ */
- skill_castend_pos2 (src, bl->x, bl->y, skillid, skilllv, tick, 0);
- skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick,
- flag);
- break;
-
- case WZ_SIGHTRASHER:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- skill_castend_pos2 (src, bl->x, bl->y, skillid, skilllv, tick, 0);
- skill_status_change_end (src, SC_SIGHT, -1);
- break;
-
- /* その他 */
- case HT_BLITZBEAT: /* ブリッツビート */
- if (flag & 1)
- {
- /* 個別にダメージを与える */
- if (bl->id != skill_area_temp[1])
- skill_attack (BF_MISC, src, src, bl, skillid, skilllv,
- tick,
- skill_area_temp[0] | (flag & 0xf00000));
- }
- else
- {
- skill_area_temp[0] = 0;
- skill_area_temp[1] = bl->id;
- if (flag & 0xf00000)
- map_foreachinarea (skill_area_sub, bl->m, bl->x - 1,
- bl->y - 1, bl->x + 1, bl->y + 1, 0,
- src, skillid, skilllv, tick,
- flag | BCT_ENEMY,
- skill_area_sub_count);
- /* まずターゲットに攻撃を加える */
- skill_attack (BF_MISC, src, src, bl, skillid, skilllv, tick,
- skill_area_temp[0] | (flag & 0xf00000));
- /* その後ターゲット以外の範囲内の敵全体に処理を行う */
- map_foreachinarea (skill_area_sub,
- bl->m, bl->x - 1, bl->y - 1, bl->x + 1,
- bl->y + 1, 0, src, skillid, skilllv, tick,
- flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- }
- break;
-
- case CR_GRANDCROSS: /* グランドクロス */
- /* スキルユニット配置 */
- skill_castend_pos2 (src, bl->x, bl->y, skillid, skilllv, tick, 0);
- 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, 0);
- break;
-
- case NPC_SELFDESTRUCTION: /* 自爆 */
- case NPC_SELFDESTRUCTION2: /* 自爆2 */
- if (flag & 1)
- {
- /* 個別にダメージを与える */
- if (src->type == BL_MOB)
+ if (src->type == BL::MOB)
{
struct mob_data *mb = (struct mob_data *) src;
- nullpo_retr (1, mb);
- mb->hp = skill_area_temp[2];
- if (bl->id != skill_area_temp[1])
- skill_attack (BF_MISC, src, src, bl,
- NPC_SELFDESTRUCTION, skilllv, tick,
+ nullpo_retr(1, mb);
+ mb->hp = skill_area_temp_hp;
+ if (bl->id != skill_area_temp_id)
+ skill_attack(BF::MISC, src, src, bl,
+ SkillID::NPC_SELFDESTRUCTION, skilllv, tick,
flag);
mb->hp = 1;
}
@@ -3078,69 +435,44 @@ int skill_castend_damage_id (struct block_list *src, struct block_list *bl,
struct mob_data *md;
if ((md = (struct mob_data *) src))
{
- skill_area_temp[1] = bl->id;
- skill_area_temp[2] = battle_get_hp (src);
- clif_skill_nodamage (src, src, NPC_SELFDESTRUCTION, -1,
- 1);
- map_foreachinarea (skill_area_sub, bl->m, bl->x - 5,
- bl->y - 5, bl->x + 5, bl->y + 5, 0,
- src, skillid, skilllv, tick,
- flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- battle_damage (src, src, md->hp, 0);
+ 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)
- {
- struct block_list tbl;
- tbl.id = 0;
- tbl.m = src->m;
- tbl.x = src->x;
- tbl.y = src->y;
- clif_skill_nodamage (&tbl, src, AL_HEAL, heal, 1);
- battle_heal (NULL, src, heal, 0, 0);
- }
- }
- break;
- case 0:
+ case SkillID::ZERO:
if (sd)
{
- if (flag & 3)
+ if (flag.lo & 3)
{
- if (bl->id != skill_area_temp[1])
- skill_attack (BF_WEAPON, src, src, bl, skillid,
- skilllv, tick, 0x0500);
+ if (bl->id != skill_area_temp_id)
+ skill_attack(BF::WEAPON, src, src, bl, skillid,
+ skilllv, tick, BCT_mid_x05);
}
else
{
- int ar = sd->splash_range;
- skill_area_temp[1] = bl->id;
- map_foreachinarea (skill_area_sub,
- bl->m, bl->x - ar, bl->y - ar,
- bl->x + ar, bl->y + ar, 0, src,
- skillid, skilllv, tick,
- flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
+ // TODO does this happen?
+ skill_area_temp_id = bl->id;
+ 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 - 0, bl->y - 0,
+ bl->x + 0, bl->y + 0, BL::NUL);
}
}
break;
default:
- map_freeblock_unlock ();
+ map_freeblock_unlock();
return 1;
}
- map_freeblock_unlock ();
+ map_freeblock_unlock();
return 0;
}
@@ -3149,45 +481,39 @@ int skill_castend_damage_id (struct block_list *src, struct block_list *bl,
* スキル使用(詠唱完了、ID指定支援系)
*------------------------------------------
*/
-int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl,
- int skillid, int skilllv, unsigned int tick,
- int flag)
+// skillid.nk == 1
+// so skillid in (SkillID::NPC_SUMMONSLAVE, SkillID::NPC_EMOTION)
+int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl,
+ SkillID skillid, int skilllv)
{
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;
- int sc_dex, sc_luk;
- //クラスチェンジ用ボスモンスターID
- int changeclass[] =
- { 1038, 1039, 1046, 1059, 1086, 1087, 1112, 1115, 1157, 1159, 1190,
- 1272, 1312, 1373, 1492
- };
- int poringclass[] = { 1002 };
-
- nullpo_retr (1, src);
- nullpo_retr (1, bl);
-
- if (src->type == BL_PC)
+ int sc_def_vit, sc_def_mdef, strip_fix;
+
+ nullpo_retr(1, src);
+ nullpo_retr(1, bl);
+
+ if (src->type == BL::PC)
sd = (struct map_session_data *) src;
- else if (src->type == BL_MOB)
+ else if (src->type == BL::MOB)
md = (struct mob_data *) src;
- sc_dex = battle_get_mdef (bl);
- sc_luk = battle_get_luk (bl);
- sc_def_vit = 100 - (3 + battle_get_vit (bl) + battle_get_luk (bl) / 3);
- sc_def_vit = 100 - (3 + battle_get_vit (bl) + battle_get_luk (bl) / 3);
- sc_def_mdef = 100 - (3 + battle_get_mdef (bl) + battle_get_luk (bl) / 3);
- strip_fix = battle_get_dex (src) - battle_get_dex (bl);
+ sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl) / 3);
+ sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl) / 3);
+ sc_def_mdef = 100 - (3 + battle_get_mdef(bl) + battle_get_luk(bl) / 3);
+ strip_fix = battle_get_dex(src) - battle_get_dex(bl);
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
{
- nullpo_retr (1, dstsd = (struct map_session_data *) bl);
+ dstsd = (struct map_session_data *) bl;
+ nullpo_retr(1, dstsd);
}
- else if (bl->type == BL_MOB)
+ else if (bl->type == BL::MOB)
{
- nullpo_retr (1, dstmd = (struct mob_data *) bl);
+ dstmd = (struct mob_data *) bl;
+ nullpo_retr(1, dstmd);
if (sc_def_vit > 50)
sc_def_vit = 50;
if (sc_def_mdef > 50)
@@ -3202,6260 +528,346 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl,
if (bl == NULL || bl->prev == NULL)
return 1;
- if (sd && pc_isdead (sd))
- return 1;
- if (dstsd && pc_isdead (dstsd) && skillid != ALL_RESURRECTION)
+ if (sd && pc_isdead(sd))
return 1;
- if (battle_get_class (bl) == 1288)
+ if (dstsd && pc_isdead(dstsd))
return 1;
- if (skillnotok (skillid, (struct map_session_data *) bl)) // [MouseJstr]
- return 0;
- map_freeblock_lock ();
+ map_freeblock_lock();
switch (skillid)
{
- case AL_HEAL: /* ヒール */
- {
- 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)
- heal = 0; /* 黄金蟲カード(ヒール量0) */
- 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倍になる
- }
-
- clif_skill_nodamage (src, bl, skillid, heal, 1);
- heal_get_jobexp = battle_heal (NULL, bl, heal, 0, 0);
-
- // JOB経験値獲得
- if (src->type == BL_PC && bl->type == BL_PC && heal > 0
- && src != bl && battle_config.heal_exp > 0)
- {
- heal_get_jobexp =
- heal_get_jobexp * battle_config.heal_exp / 100;
- if (heal_get_jobexp <= 0)
- heal_get_jobexp = 1;
- pc_gainexp ((struct map_session_data *) src, 0,
- heal_get_jobexp);
- }
- }
- break;
-
- case ALL_RESURRECTION: /* リザレクション */
- if (bl->type == BL_PC)
- {
- int per = 0;
- struct map_session_data *tsd = (struct map_session_data *) bl;
- nullpo_retr (1, tsd);
- if ((map[bl->m].flag.pvp) && tsd->pvp_point < 0)
- break; /* PVPで復活不可能状態 */
-
- if (pc_isdead (tsd))
- { /* 死亡判定 */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- switch (skilllv)
- {
- case 1:
- per = 10;
- break;
- case 2:
- per = 30;
- break;
- case 3:
- per = 50;
- break;
- case 4:
- per = 80;
- break;
- }
- tsd->status.hp = tsd->status.max_hp * per / 100;
- if (tsd->status.hp <= 0)
- tsd->status.hp = 1;
- if (tsd->special_state.restart_full_recover)
- { /* オシリスカード */
- tsd->status.hp = tsd->status.max_hp;
- tsd->status.sp = tsd->status.max_sp;
- }
- pc_setstand (tsd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer (tsd,
- battle_config.pc_invincible_time);
- clif_updatestatus (tsd, SP_HP);
- clif_resurrection (&tsd->bl, 1);
- if (src != bl && sd && battle_config.resurrection_exp > 0)
- {
- int exp = 0, jexp = 0;
- int lv =
- tsd->status.base_level - sd->status.base_level,
- jlv =
- tsd->status.job_level - sd->status.job_level;
- if (lv > 0)
- {
- exp =
- (int) ((double) tsd->status.base_exp *
- (double) lv *
- (double) battle_config.resurrection_exp
- / 1000000.);
- if (exp < 1)
- exp = 1;
- }
- if (jlv > 0)
- {
- jexp =
- (int) ((double) tsd->status.job_exp *
- (double) lv *
- (double) battle_config.resurrection_exp
- / 1000000.);
- if (jexp < 1)
- jexp = 1;
- }
- if (exp > 0 || jexp > 0)
- pc_gainexp (sd, exp, jexp);
- }
- }
- }
- break;
-
- case AL_DECAGI: /* 速度減少 */
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (MRAND (100) <
- (50 + skilllv * 3 +
- (battle_get_lv (src) + battle_get_int (src) / 5) -
- sc_def_mdef))
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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;
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- map_foreachinarea (skill_area_sub,
- src->m, src->x - range, src->y - range,
- src->x + range, src->y + range, 0, src,
- skillid, skilllv, tick,
- flag | BCT_ENEMY | 1,
- skill_castend_nodamage_id);
- }
- break;
-
- case PR_LEXDIVINA: /* レックスディビーナ */
- {
- struct status_change *sc_data = battle_get_sc_data (bl);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (sc_data && sc_data[SC_DIVINA].timer != -1)
- skill_status_change_end (bl, SC_DIVINA, -1);
- else if (MRAND (100) < sc_def_vit)
- {
- skill_status_change_start (bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time (skillid, skilllv),
- 0);
- }
- }
- break;
- case SA_ABRACADABRA:
- break;
- case SA_COMA:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (dstsd)
- {
- dstsd->status.hp = 1;
- dstsd->status.sp = 1;
- clif_updatestatus (dstsd, SP_HP);
- clif_updatestatus (dstsd, SP_SP);
- }
- if (dstmd)
- dstmd->hp = 1;
- break;
- case SA_FULLRECOVERY:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (dstsd)
- pc_heal (dstsd, dstsd->status.max_hp, dstsd->status.max_sp);
- if (dstmd)
- dstmd->hp = battle_get_max_hp (&dstmd->bl);
- break;
- case SA_SUMMONMONSTER:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (sd)
- mob_once_spawn (sd, map[sd->bl.m].name, sd->bl.x, sd->bl.y,
- "--ja--", -1, 1, "");
- break;
- case SA_LEVELUP:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (sd && pc_nextbaseexp (sd))
- pc_gainexp (sd, pc_nextbaseexp (sd) * 10 / 100, 0);
- break;
-
- case SA_INSTANTDEATH:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (sd)
- pc_damage (NULL, sd, sd->status.max_hp);
- break;
-
- case SA_QUESTION:
- case SA_GRAVITY:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- break;
- case SA_CLASSCHANGE:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (dstmd)
- mob_class_change (dstmd, changeclass);
- break;
- case SA_MONOCELL:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (dstmd)
- mob_class_change (dstmd, poringclass);
- break;
- case SA_DEATH:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (dstsd)
- pc_damage (NULL, dstsd, dstsd->status.max_hp);
- if (dstmd)
- mob_damage (NULL, dstmd, dstmd->hp, 1);
- break;
- case SA_REVERSEORCISH:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (dstsd)
- pc_setoption (dstsd, dstsd->status.option | 0x0800);
- break;
- case SA_FORTUNE:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- }
- else
- {
- skill_status_change_start (bl,
- SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time (skillid, skilllv),
- 0);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- }
- 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)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 0);
- 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);
- clif_skill_nodamage (src, bl, skillid, skilllv, 0);
- break;
- }
- }
- if (MRAND (100) > (75 + skilllv * 1) && (skilllv != 5))
- {
- clif_skill_fail (sd, skillid, 0, 0);
- clif_skill_nodamage (src, bl, skillid, skilllv, 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);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- }
- break;
-
- case PR_ASPERSIO: /* アスペルシオ */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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: /* キリエエレイソン */
- clif_skill_nodamage (bl, bl, skillid, skilllv, 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);
- 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: /* メモライズ */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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_nodamage (src, bl, skillid, skilllv, 0);
- clif_skill_fail (sd, skillid, 0, 0);
- break;
- }
- }
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- skill_status_change_start (bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time (skillid, skilllv), 0);
- break;
- case LK_TENSIONRELAX: /* テンションリラックス */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- break;
- case AC_CONCENTRATION: /* 集中力向上 */
- {
- int range = 1;
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- skill_status_change_start (bl, SkillStatusChangeTable[skillid],
- skilllv, 0, 0, 0,
- skill_get_time (skillid, skilllv), 0);
- map_foreachinarea (skill_status_change_timer_sub, src->m,
- src->x - range, src->y - range, src->x + range,
- src->y + range, 0, src,
- SkillStatusChangeTable[skillid], tick);
- }
- break;
- case SM_PROVOKE: /* プロボック */
- {
- struct status_change *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;
- }
-
- clif_skill_nodamage (src, bl, skillid, skilllv, 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
- || map[bl->m].flag.gvg) && 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 && !sd->status.guild_id) // PTにもギルドにも所属無しはだめ
- || ((sd->status.party_id != dstsd->status.party_id) // 同じパーティーか、
- || (sd->status.guild_id != dstsd->status.guild_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;
- }
- }
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- clif_devotion (sd, bl->id);
- 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)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- pc_addspiritball (sd, skill_get_time (skillid, skilllv),
- skilllv);
- }
- break;
- case CH_SOULCOLLECT: // 狂気功
- if (sd)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- for (int i = 0; i < 5; i++)
- pc_addspiritball (sd, skill_get_time (skillid, skilllv),
- 5);
- }
- break;
- case MO_BLADESTOP: // 白刃取り
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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
- || map[sd->bl.m].flag.gvg)
- {
- if (dstsd->spiritball > 0)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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;
- clif_heal (sd->fd, SP_SP, i);
- }
- else
- clif_skill_nodamage (src, bl, skillid, skilllv, 0);
- break;
- }
-
- case AC_MAKINGARROW: /* 矢作成 */
-/* if(sd) {
- clif_arrow_create_list(sd);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }*/
- break;
-
- case AM_PHARMACY: /* ポーション作成 */
-/* if(sd) {
- clif_skill_produce_mix_list(sd,32);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }*/
- break;
- case WS_CREATECOIN: /* クリエイトコイン */
-/* if(sd) {
- clif_skill_produce_mix_list(sd,64);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }*/
- break;
- case WS_CREATENUGGET: /* 塊製造 */
-/* if(sd) {
- clif_skill_produce_mix_list(sd,128);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }*/
- break;
- case BS_HAMMERFALL: /* ハンマーフォール */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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: /* サプライズアタック */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- {
- int x = bl->x, y = bl->y;
- skill_area_temp[1] = bl->id;
- skill_area_temp[2] = x;
- skill_area_temp[3] = y;
- map_foreachinarea (skill_area_sub,
- bl->m, x - 1, y - 1, x + 1, y + 1, 0,
- src, skillid, skilllv, tick,
- flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- }
- skill_status_change_end (src, SC_HIDING, -1); // ハイディング解除
- break;
-
- case KN_BRANDISHSPEAR: /*ブランディッシュスピア */
- {
- int c, n = 4, ar;
- int dir = map_calc_dir (src, bl->x, bl->y);
- struct square tc;
- int x = bl->x, y = bl->y;
- ar = skilllv / 3;
- 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 (skill_area_sub,
- bl->m, tc.val1[c], tc.val2[c],
- tc.val1[c], tc.val2[c], 0, src,
- skillid, skilllv, tick,
- flag | BCT_ENEMY | n,
- skill_castend_damage_id);
- }
- }
- /* 範囲BA */
- if (skilllv > 6)
- {
- skill_brandishspear_dir (&tc, dir, -1);
- n--;
- }
- else
- {
- skill_brandishspear_dir (&tc, dir, -2);
- n -= 2;
- }
-
- if (skilllv > 3)
- {
- for (c = 0; c < 5; c++)
- {
- map_foreachinarea (skill_area_sub,
- bl->m, tc.val1[c], tc.val2[c],
- tc.val1[c], tc.val2[c], 0, src,
- skillid, skilllv, tick,
- flag | BCT_ENEMY | n,
- skill_castend_damage_id);
- if (skilllv > 6 && n == 3 && c == 4)
- {
- skill_brandishspear_dir (&tc, dir, -1);
- n--;
- c = -1;
- }
- }
- }
- /* 範囲@ */
- for (c = 0; c < 10; c++)
- {
- if (c == 0 || c == 5)
- skill_brandishspear_dir (&tc, dir, -1);
- map_foreachinarea (skill_area_sub,
- bl->m, tc.val1[c % 5], tc.val2[c % 5],
- tc.val1[c % 5], tc.val2[c % 5], 0, src,
- skillid, skilllv, tick,
- flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- }
- }
- break;
-
- /* パーティスキル */
- case AL_ANGELUS: /* エンジェラス */
- case PR_MAGNIFICAT: /* マグニフィカート */
- case PR_GLORIA: /* グロリア */
- case SN_WINDWALK: /* ウインドウォーク */
- if (sd == NULL || sd->status.party_id == 0 || (flag & 1))
- {
- /* 個別の処理 */
- clif_skill_nodamage (bl, bl, skillid, skilllv, 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 (skill_area_sub,
- sd, 1,
- src, skillid, skilllv, tick,
- flag | BCT_PARTY | 1,
- skill_castend_nodamage_id);
- }
- break;
- case BS_ADRENALINE: /* アドレナリンラッシュ */
- case BS_WEAPONPERFECT: /* ウェポンパーフェクション */
- case BS_OVERTHRUST: /* オーバートラスト */
- if (sd == NULL || sd->status.party_id == 0 || (flag & 1))
- {
- /* 個別の処理 */
- clif_skill_nodamage (bl, bl, skillid, skilllv, 1);
- skill_status_change_start (bl,
- SkillStatusChangeTable[skillid],
- skilllv, (src == bl) ? 1 : 0, 0, 0,
- skill_get_time (skillid, skilllv),
- 0);
- }
- else
- {
- /* パーティ全体への処理 */
- party_foreachsamemap (skill_area_sub,
- sd, 1,
- src, skillid, skilllv, tick,
- flag | BCT_PARTY | 1,
- skill_castend_nodamage_id);
- }
- break;
-
- /*(付加と解除が必要) */
- case BS_MAXIMIZE: /* マキシマイズパワー */
- case NV_TRICKDEAD: /* 死んだふり */
- case CR_DEFENDER: /* ディフェンダー */
- case CR_AUTOGUARD: /* オートガード */
- {
- struct status_change *tsc_data = battle_get_sc_data (bl);
- int sc = SkillStatusChangeTable[skillid];
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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: /* ハイディング */
- {
- struct status_change *tsc_data = battle_get_sc_data (bl);
- int sc = SkillStatusChangeTable[skillid];
- clif_skill_nodamage (src, bl, skillid, -1, 1);
- 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: /* クローキング */
- {
- struct status_change *tsc_data = battle_get_sc_data (bl);
- int sc = SkillStatusChangeTable[skillid];
- clif_skill_nodamage (src, bl, skillid, -1, 1);
- 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: /* ハイディング */
- {
- struct status_change *tsc_data = battle_get_sc_data (bl);
- int sc = SkillStatusChangeTable[skillid];
- clif_skill_nodamage (src, bl, skillid, -1, 1);
- 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: /* 月明りの泉に落ちる花びら */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- skill_unitsetting (src, skillid, skilllv, src->x, src->y, 0);
- break;
-
- case HP_BASILICA: /* バジリカ */
- case PA_GOSPEL: /* ゴスペル */
- skill_clear_unitgroup (src);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- skill_unitsetting (src, skillid, skilllv, src->x, src->y, 0);
- break;
-
- case BD_ADAPTATION: /* アドリブ */
- {
- struct status_change *sc_data = battle_get_sc_data (src);
- if (sc_data && sc_data[SC_DANCING].timer != -1)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- skill_stop_dancing (src, 0);
- }
- }
- break;
-
- case BA_FROSTJOKE: /* 寒いジョーク */
- case DC_SCREAM: /* スクリーム */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- skill_addtimerskill (src, tick + 3000, bl->id, 0, 0, skillid,
- skilllv, 0, flag);
- break;
-
- case TF_STEAL: // スティール
- if (sd)
- {
- if (pc_steal_item (sd, bl))
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- else
- clif_skill_nodamage (src, bl, skillid, skilllv, 0);
- }
- 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);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- mob_target ((struct mob_data *) bl, src, range);
- }
- else
- clif_skill_nodamage (src, bl, skillid, skilllv, 0);
- }
- break;
-
- case MG_STONECURSE: /* ストーンカース */
- if (bl->type == BL_MOB && battle_get_mode (bl) & 0x20)
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- break;
- }
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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: /* 応急手当 */
- clif_skill_nodamage (src, bl, skillid, 5, 1);
- battle_heal (NULL, bl, 5, 0, 0);
- break;
-
- case AL_CURE: /* キュアー */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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: /* 解毒 */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- skill_status_change_end (bl, SC_POISON, -1);
- break;
-
- case PR_STRECOVERY: /* リカバリー */
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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.targettype = NONE_ATTACKABLE;
- dstmd->state.skillstate = MSS_IDLE;
- dstmd->next_walktime = tick + MRAND (3000) + 3000;
- }
- }
- break;
-
- case WZ_ESTIMATION: /* モンスター情報 */
- if (src->type == BL_PC)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- clif_skill_estimation ((struct map_session_data *) src, bl);
- }
- break;
-
- case MC_IDENTIFY: /* アイテム鑑定 */
- if (sd)
- clif_item_identify_list (sd);
- break;
-
- case BS_REPAIRWEAPON: /* 武器修理 */
- if (sd)
-//動作しないのでとりあえずコメントアウト
-// clif_item_repair_list(sd);
- break;
-
- case AL_TELEPORT: /* テレポート */
- if (sd)
- {
- if (map[sd->bl.m].flag.noteleport)
- { /* テレポ禁止 */
- clif_skill_teleportmessage (sd, 0);
- break;
- }
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (sd->skilllv == 1)
- clif_skill_warppoint (sd, sd->skillid, "Random", "", "",
- "");
- else
- {
- clif_skill_warppoint (sd, sd->skillid, "Random",
- sd->status.save_point.map, "", "");
- }
- }
- else if (bl->type == BL_MOB)
- mob_warp ((struct mob_data *) bl, -1, -1, -1, 3);
- break;
-
- case AL_HOLYWATER: /* アクアベネディクタ */
- if (sd)
- {
- int eflag;
- struct item item_tmp;
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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 */
- }
- eflag = pc_additem (sd, &item_tmp, 1);
- if (eflag)
- {
- 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)
- {
- int eflag;
- struct item item_tmp;
- struct block_list tbl;
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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);
- eflag = pc_additem (sd, &item_tmp, 1);
- if (eflag)
- {
- 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: /* ストリップウェポン */
- {
- struct status_change *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)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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 (dstsd->status.inventory[i].equip
- && dstsd->status.inventory[i].equip & 0x0002)
- {
- pc_unequipitem (dstsd, i, 0);
- break;
- }
- }
- }
- }
- }
- break;
-
- case RG_STRIPSHIELD: /* ストリップシールド */
- {
- struct status_change *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)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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 (dstsd->status.inventory[i].equip
- && dstsd->status.inventory[i].equip & 0x0020)
- {
- pc_unequipitem (dstsd, i, 0);
- break;
- }
- }
- }
- }
- }
- break;
-
- case RG_STRIPARMOR: /* ストリップアーマー */
- {
- struct status_change *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)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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 (dstsd->status.inventory[i].equip
- && dstsd->status.inventory[i].equip & 0x0010)
- {
- pc_unequipitem (dstsd, i, 0);
- break;
- }
- }
- }
- }
- }
- break;
- case RG_STRIPHELM: /* ストリップヘルム */
- {
- struct status_change *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)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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 (dstsd->status.inventory[i].equip
- && dstsd->status.inventory[i].equip & 0x0100)
- {
- pc_unequipitem (dstsd, i, 0);
- break;
- }
- }
- }
- }
- }
- break;
- /* PotionPitcher */
- case AM_POTIONPITCHER: /* ポーションピッチャー */
- {
- struct block_list tbl;
- 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;
- }
- tbl.id = 0;
- tbl.m = src->m;
- tbl.x = src->x;
- tbl.y = src->y;
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (hp > 0 || (hp <= 0 && sp <= 0))
- clif_skill_nodamage (&tbl, bl, AL_HEAL, hp, 1);
- if (sp > 0)
- clif_skill_nodamage (&tbl, bl, MG_SRECOVERY, sp, 1);
- battle_heal (src, bl, hp, sp, 0);
- }
- break;
- case AM_CP_WEAPON:
- {
- struct status_change *tsc_data = battle_get_sc_data (bl);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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:
- {
- struct status_change *tsc_data = battle_get_sc_data (bl);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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:
- {
- struct status_change *tsc_data = battle_get_sc_data (bl);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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:
- {
- struct status_change *tsc_data = battle_get_sc_data (bl);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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: /* ディスペル */
- {
- int i;
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- for (i = 0; i < 136; i++)
- {
- 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, 0, flag);
- break;
-
- case SA_CASTCANCEL:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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: // スペルブレイカー
- {
- struct status_change *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;
- clif_heal (dstsd->fd, SP_SP, sp);
- }
- clif_skill_nodamage (bl, bl, SA_MAGICROD,
- sc_data[SC_MAGICROD].val1, 1);
- if (sd)
- {
- sp = sd->status.max_sp / 5;
- if (sp < 1)
- sp = 1;
- pc_heal (sd, 0, -sp);
- }
- }
- else
- {
- int bl_skillid = 0, 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 > 0
- && skill_db[bl_skillid].skill_type == BF_MAGIC)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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;
- clif_heal (sd->fd, SP_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: /* オートスペル */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (sd)
- clif_autospell (sd, skilllv);
- else
- {
- int maxlv = 1, spellid = 0;
- static const int 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 > 0)
- skill_status_change_start (src, SC_AUTOSPELL, skilllv,
- 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)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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:
- clif_skill_nodamage (src, bl, skillid, skilllv, 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);
- break;
-
- case NPC_KEEPING:
- case NPC_BARRIER:
- {
- int skill_time = skill_get_time (skillid, skilllv);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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, skillid, 0, 0,
- skill_get_time (skillid, skilllv), 0);
- break;
- case NPC_LICK:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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)
- {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- mob_damage (NULL, md, md->hp, 0);
- }
- break;
-
- case NPC_SUMMONSLAVE: /* 手下召喚 */
- case NPC_SUMMONMONSTER: /* MOB召喚 */
+ case SkillID::NPC_SUMMONSLAVE:
if (md && !md->master_id)
{
- mob_summonslave (md,
- mob_db[md->mob_class].skill[md->skillidx].val,
- skilllv,
- (skillid == NPC_SUMMONSLAVE) ? 1 : 0);
+ mob_summonslave(md,
+ mob_db[md->mob_class].skill[md->skillidx].val,
+ skilllv,
+ 1);
}
break;
- 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: /* エモーション */
+ case SkillID::NPC_EMOTION:
if (md)
- clif_emotion (&md->bl,
- mob_db[md->mob_class].skill[md->skillidx].val[0]);
- break;
-
- case NPC_DEFENDER:
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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%
- clif_skill_nodamage (src, bl, skillid, gain_hp, 1);
- 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%
- clif_skill_nodamage (src, bl, skillid, gain_sp, 1);
- battle_heal (NULL, bl, 0, gain_sp, 0);
- }
- break;
-
- case WE_CALLPARTNER: /* あなたに会いたい */
- if (sd && dstsd)
- {
- if (map[sd->bl.m].flag.nomemo)
- {
- clif_skill_teleportmessage (sd, 1);
- 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: /* ライフ置き換え */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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);
- clif_heal (sd->fd, SP_SP, conv_sp);
- }
- break;
- case HT_REMOVETRAP: /* リムーブトラップ */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- {
- 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
- || map[bl->m].flag.gvg) && (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;
- int item_flag;
- if (item_tmp.nameid
- && (item_flag =
- pc_additem (sd, &item_tmp,
- skill_db[su->
- group->skill_id].amount
- [i])))
- {
- 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;
- int item_flag;
- if (item_tmp.nameid
- && (item_flag = pc_additem (sd, &item_tmp, 1)))
- {
- 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: /* スプリングトラップ */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- {
- 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: /* アンコール */
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- 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;
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- skill_status_change_start (bl, SkillStatusChangeTable[skillid],
- skilllv, skillid, src->id, 0,
- skill_get_time (skillid, skilllv), 0);
- break;
- case PF_MINDBREAKER: /* プロボック */
- {
- struct status_change *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;
- }
-
- clif_skill_nodamage (src, bl, skillid, skilllv, 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
- || map[bl->m].flag.gvg) && 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
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- {
- 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
- || map[bl->m].flag.gvg) && (su->group->unit_id == 0xb0))
- { //罠を取り返す
- if (sd)
- skill_delunit (su);
- }
- }
- break;
- default:
- printf ("Unknown skill used:%d\n", skillid);
- map_freeblock_unlock ();
- return 1;
- }
-
- map_freeblock_unlock ();
- return 0;
-}
-
-/*==========================================
- * スキル使用(詠唱完了、ID指定)
- *------------------------------------------
- */
-static
-void skill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{
- struct map_session_data *sd = map_id2sd (id) /*,*target_sd=NULL */ ;
- struct block_list *bl;
- int range, inf2;
-
- nullpo_retv ( sd);
-
- if (sd->bl.prev == NULL) //prevが無いのはありなの?
- return;
-
- if (sd->skillid != SA_CASTCANCEL && 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;
-
- if ((bl = map_id2bl (sd->skilltarget)) == NULL || bl->prev == NULL)
- {
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
- if (sd->bl.m != bl->m || pc_isdead (sd))
- { //マップが違うか自分が死んでいる
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
-
- if (sd->skillid == PR_LEXAETERNA)
- {
- struct status_change *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 = 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 = 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)
- {
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
- if (inf2 & 0xC00 && sd->bl.id != bl->id)
- {
- int fail_flag = 1;
- if (inf2 & 0x400 && battle_check_target (&sd->bl, bl, BCT_PARTY) > 0)
- fail_flag = 0;
- if (inf2 & 0x800 && sd->status.guild_id > 0
- && sd->status.guild_id == battle_get_guild_id (bl))
- fail_flag = 0;
- if (fail_flag)
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
- }
-
- 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;
- if ((sd->skillid == MO_EXTREMITYFIST && sd->sc_data[SC_COMBO].timer != -1
- && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH)
- || (sd->skillid == CH_TIGERFIST && sd->sc_data[SC_COMBO].timer != -1
- && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH)
- || (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1
- && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH)
- || (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1
- && 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]
- if (range < distance (sd->bl.x, sd->bl.y, bl->x, bl->y))
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
- }
- if (!skill_check_condition (sd, 1))
- { /* 使用条件チェック */
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
- sd->skillitem = sd->skillitemlv = -1;
- if (battle_config.skill_out_range_consume)
- {
- if (range < distance (sd->bl.x, sd->bl.y, bl->x, bl->y))
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- return;
- }
- }
-
- if (battle_config.pc_skill_log)
- printf ("PC %d skill castend skill=%d\n", sd->bl.id, sd->skillid);
- pc_stop_walking (sd, 0);
-
- switch (skill_get_nk (sd->skillid))
- {
- /* 攻撃系/吹き飛ばし系 */
- case 0:
- case 2:
- skill_castend_damage_id (&sd->bl, bl, sd->skillid, sd->skilllv,
- tick, 0);
- break;
- case 1: /* 支援系 */
- if ((sd->skillid == AL_HEAL
- || (sd->skillid == ALL_RESURRECTION && bl->type != BL_PC)
- || sd->skillid == PR_ASPERSIO)
- && battle_check_undead (battle_get_race (bl),
- battle_get_elem_type (bl)))
- skill_castend_damage_id (&sd->bl, bl, sd->skillid,
- sd->skilllv, tick, 0);
- else
- skill_castend_nodamage_id (&sd->bl, bl, sd->skillid,
- sd->skilllv, tick, 0);
- break;
- }
-}
-
-/*==========================================
- * スキル使用(詠唱完了、場所指定の実際の処理)
- *------------------------------------------
- */
-int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid,
- int skilllv, unsigned int tick, int flag)
-{
- struct map_session_data *sd = NULL;
- int i, tmpx = 0, tmpy = 0, x1 = 0, y1 = 0;
-
- nullpo_retr (0, src);
-
- if (src->type == BL_PC)
- {
- nullpo_retr (0, sd = (struct map_session_data *) src);
- }
- if (skillid != WZ_METEOR &&
- skillid != WZ_SIGHTRASHER &&
- skillid != AM_CANNIBALIZE && skillid != AM_SPHEREMINE)
- clif_skill_poseffect (src, skillid, skilllv, x, y, tick);
-
- if (skillnotok (skillid, sd)) // [MouseJstr]
- return 0;
-
- switch (skillid)
- {
- case PR_BENEDICTIO: /* 聖体降福 */
- skill_area_temp[1] = src->id;
- map_foreachinarea (skill_area_sub,
- src->m, x - 1, y - 1, x + 1, y + 1, 0,
- src, skillid, skilllv, tick,
- flag | BCT_NOENEMY | 1,
- skill_castend_nodamage_id);
- map_foreachinarea (skill_area_sub, src->m, x - 1, y - 1, x + 1,
- y + 1, 0, src, skillid, skilllv, tick,
- flag | BCT_ENEMY | 1, skill_castend_damage_id);
- break;
-
- case BS_HAMMERFALL: /* ハンマーフォール */
- skill_area_temp[1] = src->id;
- skill_area_temp[2] = x;
- skill_area_temp[3] = y;
- map_foreachinarea (skill_area_sub,
- src->m, x - 2, y - 2, x + 2, y + 2, 0,
- src, skillid, skilllv, tick,
- flag | BCT_ENEMY | 2,
- skill_castend_nodamage_id);
- break;
-
- case HT_DETECTING: /* ディテクティング */
- {
- const int range = 7;
- map_foreachinarea (skill_status_change_timer_sub,
- src->m, src->x - range, src->y - range,
- src->x + range, src->y + range, 0, src,
- SC_SIGHT, tick);
- }
- 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: //メテオストーム
- {
- int flag_ = 0;
- 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_ == 0)
- {
- clif_skill_poseffect (src, skillid, skilllv, tmpx, tmpy,
- tick);
- flag_ = 1;
- }
- if (i > 0)
- skill_addtimerskill (src, tick + i * 1000, 0, tmpx, tmpy,
- skillid, skilllv, (x1 << 16) | y1,
- flag_);
- x1 = tmpx;
- y1 = tmpy;
- }
- skill_addtimerskill (src, tick + i * 1000, 0, tmpx, tmpy, skillid,
- skilllv, -1, flag_);
- }
- break;
-
- case AL_WARP: /* ワープポータル */
- if (sd)
- {
- if (map[sd->bl.m].flag.noteleport) /* テレポ禁止 */
- break;
- clif_skill_warppoint (sd, sd->skillid,
- sd->status.save_point.map,
- (sd->skilllv >
- 1) ? sd->status.memo_point[0].map : "",
- (sd->skilllv >
- 2) ? sd->status.memo_point[1].map : "",
- (sd->skilllv >
- 3) ? sd->status.
- memo_point[2].map : "");
- }
- 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);
- }
- clif_skill_poseffect (src, skillid, skilllv, x, y, tick);
- }
- 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);
- }
- clif_skill_poseffect (src, skillid, skilllv, x, y, tick);
- }
+ clif_emotion(&md->bl,
+ mob_db[md->mob_class].skill[md->skillidx].val[0]);
break;
}
+ map_freeblock_unlock();
return 0;
}
/*==========================================
- * スキル使用(詠唱完了、map指定)
- *------------------------------------------
- */
-int skill_castend_map (struct map_session_data *sd, int skill_num,
- const char *mapname)
-{
- int x = 0, y = 0;
-
- nullpo_retr (0, sd);
- if (sd->bl.prev == NULL || pc_isdead (sd))
- return 0;
-
- if (sd->opt1 > 0 || sd->status.option & 2)
- return 0;
- //スキルが使えない状態異常中
- if (sd->sc_data)
- {
- 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)
- return 0;
- }
-
- if (skill_num != sd->skillid) /* 不正パケットらしい */
- return 0;
-
- pc_stopattack (sd);
-
- if (battle_config.pc_skill_log)
- printf ("PC %d skill castend skill =%d map=%s\n", sd->bl.id,
- skill_num, mapname);
- pc_stop_walking (sd, 0);
-
- if (strcmp (mapname, "cancel") == 0)
- return 0;
-
- switch (skill_num)
- {
- case AL_TELEPORT: /* テレポート */
- if (strcmp (mapname, "Random") == 0)
- pc_randomwarp (sd, 3);
- else
- pc_setpos (sd, sd->status.save_point.map,
- sd->status.save_point.x, sd->status.save_point.y,
- 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 = 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;
-}
-
-/*==========================================
- * スキルユニット設定処理
- *------------------------------------------
- */
-struct skill_unit_group *skill_unitsetting (struct block_list *src,
- int skillid, int skilllv, int x,
- int y, int flag)
-{
- struct skill_unit_group *group;
- int i, count = 1, limit_ = 10000, val1_ = 0, val2_ = 0;
- int target = BCT_ENEMY, interval = 1000, range_ = 0;
- int dir = 0, aoe_diameter = 0; // -- aoe_diameter (moonsoul) added for sage Area Of Effect skills
-
- nullpo_retr (0, 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)));
- 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 (skill_landprotector, src->m, ux, uy, ux, uy,
- BL_SKILL, skillid, &alive);
-
- 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);
- clif_changemapcell (src->m, ux, uy, 5, 0);
- }
- }
-
- if (alive)
- {
- nullpo_retr (NULL, unit = skill_initunit (group, i, ux, uy));
- unit->val1 = val1;
- unit->val2 = val2;
- unit->limit = limit;
- unit->range = range;
- }
- }
- return group;
-}
-
-/*==========================================
- * スキルユニットの発動イベント
- *------------------------------------------
- */
-static
-int skill_unit_onplace (struct skill_unit *src, struct block_list *bl,
- unsigned int tick)
-{
- struct skill_unit_group *sg;
- struct block_list *ss;
- struct skill_unit_group_tickset *ts;
- struct map_session_data *srcsd = NULL;
- int diff, goflag, splash_count = 0;
-
- nullpo_retr (0, src);
- nullpo_retr (0, bl);
-
- if (bl->prev == NULL || !src->alive
- || (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl)))
- return 0;
-
- nullpo_retr (0, sg = src->group);
- nullpo_retr (0, ss = map_id2bl (sg->src_id));
-
- if (ss->type == BL_PC)
- nullpo_retr (0, srcsd = (struct map_session_data *) ss);
- if (srcsd && srcsd->chatID)
- return 0;
-
- if (bl->type != BL_PC && bl->type != BL_MOB)
- return 0;
- nullpo_retr (0, 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 (skill_landprotector, bl->m, bl->x, bl->y, bl->x, bl->y,
- BL_SKILL, 0, &goflag);
-
- if (!goflag)
- return 0;
- ts->tick = tick;
- ts->group_id = sg->group_id;
-
- switch (sg->unit_id)
- {
- case 0x83: /* サンクチュアリ */
- {
- int race = battle_get_race (bl);
- int damage_flag =
- (battle_check_undead (race, battle_get_elem_type (bl))
- || race == 6) ? 1 : 0;
-
- if (battle_get_hp (bl) >= battle_get_max_hp (bl) && !damage_flag)
- break;
-
- if ((sg->val1--) <= 0)
- {
- skill_delunitgroup (sg);
- return 0;
- }
- if (!damage_flag)
- {
- int heal = sg->val2;
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- heal = 0; /* 黄金蟲カード(ヒール量0) */
- clif_skill_nodamage (&src->bl, bl, AL_HEAL, heal, 1);
- battle_heal (NULL, bl, heal, 0, 0);
- }
- else
- skill_attack (BF_MAGIC, ss, &src->bl, bl, sg->skill_id,
- sg->skill_lv, tick, 0);
- }
- break;
-
- case 0x84: /* マグヌスエクソシズム */
- {
- int race = battle_get_race (bl);
- int damage_flag =
- (battle_check_undead (race, battle_get_elem_type (bl))
- || race == 6) ? 1 : 0;
-
- if (!damage_flag)
- return 0;
- skill_attack (BF_MAGIC, ss, &src->bl, bl, sg->skill_id,
- sg->skill_lv, tick, 0);
- }
- break;
-
- case 0x85: /* ニューマ */
- {
- struct skill_unit *unit2;
- struct status_change *sc_data = battle_get_sc_data (bl);
- int type = SC_PNEUMA;
- if (sc_data && sc_data[type].timer == -1)
- skill_status_change_start (bl, type, sg->skill_lv, (int) src,
- 0, 0, 0, 0);
- else if ((unit2 = (struct skill_unit *) sc_data[type].val2)
- && unit2 != src)
- {
- if (DIFF_TICK (sg->tick, unit2->group->tick) > 0)
- skill_status_change_start (bl, type, sg->skill_lv,
- (int) src, 0, 0, 0, 0);
- ts->tick -= sg->interval;
- }
- }
- break;
- case 0x7e: /* セイフティウォール */
- {
- struct skill_unit *unit2;
- struct status_change *sc_data = battle_get_sc_data (bl);
- int type = SC_SAFETYWALL;
- if (sc_data && sc_data[type].timer == -1)
- skill_status_change_start (bl, type, sg->skill_lv, (int) src,
- 0, 0, 0, 0);
- else if ((unit2 = (struct skill_unit *) sc_data[type].val2)
- && unit2 != src)
- {
- if (sg->val1 < unit2->group->val1)
- skill_status_change_start (bl, type, sg->skill_lv,
- (int) src, 0, 0, 0, 0);
- ts->tick -= sg->interval;
- }
- }
- break;
-
- case 0x86: /* ロードオブヴァーミリオン(&ストームガスト &グランドクロス) */
- skill_attack (BF_MAGIC, ss, &src->bl, bl, sg->skill_id,
- sg->skill_lv, tick, 0);
- break;
-
- case 0x7f: /* ファイヤーウォール */
- if ((src->val2--) > 0)
- skill_attack (BF_MAGIC, ss, &src->bl, bl,
- sg->skill_id, sg->skill_lv, tick, 0);
- if (src->val2 <= 0)
- skill_delunit (src);
- break;
-
- case 0x87: /* ファイアーピラー(発動前) */
- skill_delunit (src);
- skill_unitsetting (ss, sg->skill_id, sg->skill_lv, src->bl.x,
- src->bl.y, 1);
- break;
-
- case 0x88: /* ファイアーピラー(発動後) */
- if (DIFF_TICK (tick, sg->tick) < 150)
- skill_attack (BF_MAGIC, ss, &src->bl, bl, sg->skill_id,
- sg->skill_lv, tick, 0);
- break;
-
- case 0x90: /* スキッドトラップ */
- {
- int i, c = skill_get_blewcount (sg->skill_id, sg->skill_lv);
- if (map[bl->m].flag.gvg)
- c = 0;
- for (i = 0; i < c; i++)
- skill_blown (&src->bl, bl, 1 | 0x30000);
- sg->unit_id = 0x8c;
- clif_changelook (&src->bl, LOOK_BASE, sg->unit_id);
- sg->limit = DIFF_TICK (tick, sg->tick) + 1500;
- }
- break;
-
- case 0x93: /* ランドマイン */
- skill_attack (BF_MISC, ss, &src->bl, bl, sg->skill_id,
- sg->skill_lv, tick, 0);
- sg->unit_id = 0x8c;
- clif_changelook (&src->bl, LOOK_BASE, 0x88);
- sg->limit = DIFF_TICK (tick, sg->tick) + 1500;
- break;
-
- case 0x8f: /* ブラストマイン */
- case 0x94: /* ショックウェーブトラップ */
- case 0x95: /* サンドマン */
- case 0x96: /* フラッシャー */
- case 0x97: /* フリージングトラップ */
- case 0x98: /* クレイモアートラップ */
- map_foreachinarea (skill_count_target, src->bl.m,
- src->bl.x - src->range, src->bl.y - src->range,
- src->bl.x + src->range, src->bl.y + src->range,
- 0, &src->bl, &splash_count);
- map_foreachinarea (skill_trap_splash, src->bl.m,
- src->bl.x - src->range, src->bl.y - src->range,
- src->bl.x + src->range, src->bl.y + src->range,
- 0, &src->bl, tick, splash_count);
- sg->unit_id = 0x8c;
- clif_changelook (&src->bl, LOOK_BASE, sg->unit_id);
- sg->limit = DIFF_TICK (tick, sg->tick) + 1500;
- break;
-
- case 0x91: /* アンクルスネア */
- {
- struct status_change *sc_data = battle_get_sc_data (bl);
- if (sg->val2 == 0 && sc_data && sc_data[SC_ANKLE].timer == -1)
- {
- int moveblock = (bl->x / BLOCK_SIZE != src->bl.x / BLOCK_SIZE
- || bl->y / BLOCK_SIZE !=
- src->bl.y / BLOCK_SIZE);
- int sec = skill_get_time2 (sg->skill_id,
- sg->skill_lv) -
- (double) battle_get_agi (bl) * 0.1;
- if (battle_get_mode (bl) & 0x20)
- sec = sec / 5;
- battle_stopwalking (bl, 1);
- skill_status_change_start (bl, SC_ANKLE, sg->skill_lv, 0, 0,
- 0, sec, 0);
-
- if (moveblock)
- map_delblock (bl);
- bl->x = src->bl.x;
- bl->y = src->bl.y;
- if (moveblock)
- map_addblock (bl);
- if (bl->type == BL_MOB)
- clif_fixmobpos ((struct mob_data *) bl);
- else
- clif_fixpos (bl);
- clif_01ac (&src->bl);
- sg->limit = DIFF_TICK (tick, sg->tick) + sec;
- sg->val2 = bl->id;
- }
- }
- break;
-
- case 0x80: /* ワープポータル(発動後) */
- if (bl->type == BL_PC)
- {
- struct map_session_data *sd = (struct map_session_data *) bl;
- if (sd && src->bl.m == bl->m && src->bl.x == bl->x
- && src->bl.y == bl->y && src->bl.x == sd->to_x
- && src->bl.y == sd->to_y)
- {
- if (battle_config.chat_warpportal || !sd->chatID)
- {
- if ((sg->val1--) > 0)
- {
- pc_setpos (sd, sg->valstr, sg->val2 >> 16,
- sg->val2 & 0xffff, 3);
- if (sg->src_id == bl->id
- || (strcmp (map[src->bl.m].name, sg->valstr)
- == 0 && src->bl.x == (sg->val2 >> 16)
- && src->bl.y == (sg->val2 & 0xffff)))
- skill_delunitgroup (sg);
- }
- else
- skill_delunitgroup (sg);
- }
- }
- }
- else if (bl->type == BL_MOB && battle_config.mob_warpportal)
- {
- int m = map_mapname2mapid (sg->valstr);
- struct mob_data *md;
- md = (struct mob_data *) bl;
- mob_warp ((struct mob_data *) bl, m, sg->val2 >> 16,
- sg->val2 & 0xffff, 3);
- }
- break;
-
- case 0x8e: /* クァグマイア */
- {
- int type = SkillStatusChangeTable[sg->skill_id];
- if (bl->type == BL_PC
- && ((struct map_session_data *) bl)->
- special_state.no_magic_damage)
- break;
- if (battle_get_sc_data (bl)[type].timer == -1)
- skill_status_change_start (bl, type, sg->skill_lv, (int) src,
- 0, 0,
- skill_get_time2 (sg->skill_id,
- sg->skill_lv), 0);
- }
- break;
- case 0x92: /* ベノムダスト */
- {
- struct status_change *sc_data = battle_get_sc_data (bl);
- int type = SkillStatusChangeTable[sg->skill_id];
- if (sc_data && sc_data[type].timer == -1)
- skill_status_change_start (bl, type, sg->skill_lv, (int) src,
- 0, 0,
- skill_get_time2 (sg->skill_id,
- sg->skill_lv), 0);
- }
- break;
- case 0x9a: /* ボルケーノ */
- case 0x9b: /* デリュージ */
- case 0x9c: /* バイオレントゲイル */
- {
- struct skill_unit *unit2;
- struct status_change *sc_data = battle_get_sc_data (bl);
- int type = SkillStatusChangeTable[sg->skill_id];
- if (sc_data && sc_data[type].timer == -1)
- skill_status_change_start (bl, type, sg->skill_lv, (int) src,
- 0, 0,
- skill_get_time2 (sg->skill_id,
- sg->skill_lv), 0);
- else if ((unit2 = (struct skill_unit *) sc_data[type].val2)
- && unit2 != src)
- {
- if (DIFF_TICK (sg->tick, unit2->group->tick) > 0)
- skill_status_change_start (bl, type, sg->skill_lv,
- (int) src, 0, 0,
- skill_get_time2 (sg->skill_id,
- sg->skill_lv),
- 0);
- ts->tick -= sg->interval;
- }
- } break;
-
- case 0x9e: /* 子守唄 */
- case 0x9f: /* ニヨルドの宴 */
- case 0xa0: /* 永遠の混沌 */
- case 0xa1: /* 戦太鼓の響き */
- case 0xa2: /* ニーベルングの指輪 */
- case 0xa3: /* ロキの叫び */
- case 0xa4: /* 深淵の中に */
- case 0xa5: /* 不死身のジークフリード */
- case 0xa6: /* 不協和音 */
- case 0xa7: /* 口笛 */
- case 0xa8: /* 夕陽のアサシンクロス */
- case 0xa9: /* ブラギの詩 */
- case 0xab: /* 自分勝手なダンス */
- case 0xac: /* ハミング */
- case 0xad: /* 私を忘れないで… */
- case 0xae: /* 幸運のキス */
- case 0xaf: /* サービスフォーユー */
- case 0xb4:
- {
- struct skill_unit *unit2;
- struct status_change *sc_data = battle_get_sc_data (bl);
- int type = SkillStatusChangeTable[sg->skill_id];
- if (sg->src_id == bl->id)
- break;
- if (sc_data && sc_data[type].timer == -1)
- skill_status_change_start (bl, type, sg->skill_lv, sg->val1,
- sg->val2, (int) src,
- skill_get_time2 (sg->skill_id,
- sg->skill_lv), 0);
- else if ((unit2 = (struct skill_unit *) sc_data[type].val4)
- && unit2 != src)
- {
- if (unit2->group
- && DIFF_TICK (sg->tick, unit2->group->tick) > 0)
- skill_status_change_start (bl, type, sg->skill_lv,
- sg->val1, sg->val2, (int) src,
- skill_get_time2 (sg->skill_id,
- sg->skill_lv),
- 0);
- ts->tick -= sg->interval;
- }
- } break;
-
- case 0xaa: /* イドゥンの林檎 */
- {
- struct skill_unit *unit2;
- struct status_change *sc_data = battle_get_sc_data (bl);
- int type = SkillStatusChangeTable[sg->skill_id];
- if (sg->src_id == bl->id)
- break;
- if (sc_data && sc_data[type].timer == -1)
- skill_status_change_start (bl, type, sg->skill_lv,
- (sg->val1) >> 16,
- (sg->val1) & 0xffff, (int) src,
- skill_get_time2 (sg->skill_id,
- sg->skill_lv), 0);
- else if ((unit2 = (struct skill_unit *) sc_data[type].val4)
- && unit2 != src)
- {
- if (DIFF_TICK (sg->tick, unit2->group->tick) > 0)
- skill_status_change_start (bl, type, sg->skill_lv,
- (sg->val1) >> 16,
- (sg->val1) & 0xffff, (int) src,
- skill_get_time2 (sg->skill_id,
- sg->skill_lv),
- 0);
- ts->tick -= sg->interval;
- }
- } break;
-
- case 0xb1: /* デモンストレーション */
- skill_attack (BF_WEAPON, ss, &src->bl, bl, sg->skill_id,
- sg->skill_lv, tick, 0);
- if (bl->type == BL_PC && MRAND (100) < sg->skill_lv
- && battle_config.equipment_breaking)
- pc_breakweapon ((struct map_session_data *) bl);
- break;
- case 0x99: /* トーキーボックス */
- if (sg->src_id == bl->id) //自分が踏んでも発動しない
- break;
- if (sg->val2 == 0)
- {
- clif_talkiebox (&src->bl, sg->valstr);
- sg->unit_id = 0x8c;
- clif_changelook (&src->bl, LOOK_BASE, sg->unit_id);
- sg->limit = DIFF_TICK (tick, sg->tick) + 5000;
- sg->val2 = -1; //踏んだ
- }
- break;
- case 0xb2: /* あなたを_会いたいです */
- case 0xb3: /* ゴスペル */
- case 0xb6: /* フォグウォール */
- //とりあえず何もしない
- break;
-
- case 0xb7: /* スパイダーウェッブ */
- if (sg->val2 == 0)
- {
- int moveblock = (bl->x / BLOCK_SIZE != src->bl.x / BLOCK_SIZE
- || bl->y / BLOCK_SIZE !=
- src->bl.y / BLOCK_SIZE);
- skill_additional_effect (ss, bl, sg->skill_id, sg->skill_lv,
- BF_MISC, tick);
- if (moveblock)
- map_delblock (bl);
- bl->x = (&src->bl)->x;
- bl->y = (&src->bl)->y;
- if (moveblock)
- map_addblock (bl);
- if (bl->type == BL_MOB)
- clif_fixmobpos ((struct mob_data *) bl);
- else
- clif_fixpos (bl);
- clif_01ac (&src->bl);
- sg->limit =
- DIFF_TICK (tick,
- sg->tick) + skill_get_time2 (sg->skill_id,
- sg->skill_lv);
- sg->val2 = bl->id;
- }
- break;
-
-/* default:
- if(battle_config.error_log)
- printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
- break;*/
- }
- if (bl->type == BL_MOB && ss != bl) /* スキル使用条件のMOBスキル */
- {
- if (battle_config.mob_changetarget_byskill == 1)
- {
- int target = ((struct mob_data *) bl)->target_id;
- if (ss->type == BL_PC)
- ((struct mob_data *) bl)->target_id = ss->id;
- mobskill_use ((struct mob_data *) bl, tick,
- MSC_SKILLUSED | (sg->skill_id << 16));
- ((struct mob_data *) bl)->target_id = target;
- }
- else
- mobskill_use ((struct mob_data *) bl, tick,
- MSC_SKILLUSED | (sg->skill_id << 16));
- }
-
- return 0;
-}
-
-/*==========================================
- * スキルユニットから離脱する(もしくはしている)場合
- *------------------------------------------
- */
-static
-int skill_unit_onout (struct skill_unit *src, struct block_list *bl,
- unsigned int tick)
-{
- struct skill_unit_group *sg;
-
- nullpo_retr (0, src);
- nullpo_retr (0, bl);
- nullpo_retr (0, sg = src->group);
-
- if (bl->prev == NULL || !src->alive)
- return 0;
-
- if (bl->type != BL_PC && bl->type != BL_MOB)
- return 0;
-
- switch (sg->unit_id)
- {
- case 0x7e: /* セイフティウォール */
- case 0x85: /* ニューマ */
- case 0x8e: /* クァグマイア */
- {
- struct status_change *sc_data = battle_get_sc_data (bl);
- int type =
- (sg->unit_id == 0x85) ? SC_PNEUMA :
- ((sg->unit_id == 0x7e) ? SC_SAFETYWALL : SC_QUAGMIRE);
- if ((type != SC_QUAGMIRE || bl->type != BL_MOB) &&
- sc_data && sc_data[type].timer != -1
- && ((struct skill_unit *) sc_data[type].val2) == src)
- {
- skill_status_change_end (bl, type, -1);
- }
- } break;
-
- case 0x91: /* アンクルスネア */
- {
- struct block_list *target = map_id2bl (sg->val2);
- if (target && target == bl)
- {
- skill_status_change_end (bl, SC_ANKLE, -1);
- sg->limit = DIFF_TICK (tick, sg->tick) + 1000;
- }
- }
- break;
- case 0xb5:
- case 0xb8:
- {
- struct block_list *target = map_id2bl (sg->val2);
- if (target == bl)
- skill_status_change_end (bl, SC_SPIDERWEB, -1);
- sg->limit = DIFF_TICK (tick, sg->tick) + 1000;
- }
- break;
- case 0xb6:
- {
- struct block_list *target = map_id2bl (sg->val2);
- if (target == bl)
- skill_status_change_end (bl, SC_FOGWALL, -1);
- sg->limit = DIFF_TICK (tick, sg->tick) + 1000;
- }
- break;
- case 0x9a: /* ボルケーノ */
- case 0x9b: /* デリュージ */
- case 0x9c: /* バイオレントゲイル */
- {
- struct status_change *sc_data = battle_get_sc_data (bl);
- struct skill_unit *su;
- int type = SkillStatusChangeTable[sg->skill_id];
- if (sc_data && sc_data[type].timer != -1
- && (su = ((struct skill_unit *) sc_data[type].val2))
- && su == src)
- {
- skill_status_change_end (bl, type, -1);
- }
- }
- break;
-
- case 0x9e: /* 子守唄 */
- case 0x9f: /* ニヨルドの宴 */
- case 0xa0: /* 永遠の混沌 */
- case 0xa1: /* 戦太鼓の響き */
- case 0xa2: /* ニーベルングの指輪 */
- case 0xa3: /* ロキの叫び */
- case 0xa4: /* 深淵の中に */
- case 0xa5: /* 不死身のジークフリード */
- case 0xa6: /* 不協和音 */
- case 0xa7: /* 口笛 */
- case 0xa8: /* 夕陽のアサシンクロス */
- case 0xa9: /* ブラギの詩 */
- case 0xaa: /* イドゥンの林檎 */
- case 0xab: /* 自分勝手なダンス */
- case 0xac: /* ハミング */
- case 0xad: /* 私を忘れないで… */
- case 0xae: /* 幸運のキス */
- case 0xaf: /* サービスフォーユー */
- case 0xb4:
- {
- struct status_change *sc_data = battle_get_sc_data (bl);
- struct skill_unit *su;
- int type = SkillStatusChangeTable[sg->skill_id];
- if (sc_data && sc_data[type].timer != -1
- && (su = ((struct skill_unit *) sc_data[type].val4))
- && su == src)
- {
- skill_status_change_end (bl, type, -1);
- }
- }
- break;
- case 0xb7: /* スパイダーウェッブ */
- {
- struct block_list *target = map_id2bl (sg->val2);
- if (target && target == bl)
- skill_status_change_end (bl, SC_SPIDERWEB, -1);
- sg->limit = DIFF_TICK (tick, sg->tick) + 1000;
- }
- break;
-
-/* default:
- if(battle_config.error_log)
- printf("skill_unit_onout: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
- break;*/
- }
- skill_unitgrouptickset_delete (bl, sg->group_id);
- return 0;
-}
-
-/*==========================================
- * スキルユニットの削除イベント
- *------------------------------------------
- */
-static
-int skill_unit_ondelete (struct skill_unit *src, struct block_list *bl,
- unsigned int tick)
-{
- struct skill_unit_group *sg;
-
- nullpo_retr (0, src);
- nullpo_retr (0, bl);
- nullpo_retr (0, sg = src->group);
-
- if (bl->prev == NULL || !src->alive)
- return 0;
-
- if (bl->type != BL_PC && bl->type != BL_MOB)
- return 0;
-
- switch (sg->unit_id)
- {
- case 0x85: /* ニューマ */
- case 0x7e: /* セイフティウォール */
- case 0x8e: /* クァグマイヤ */
- case 0x9a: /* ボルケーノ */
- case 0x9b: /* デリュージ */
- case 0x9c: /* バイオレントゲイル */
- case 0x9e: /* 子守唄 */
- case 0x9f: /* ニヨルドの宴 */
- case 0xa0: /* 永遠の混沌 */
- case 0xa1: /* 戦太鼓の響き */
- case 0xa2: /* ニーベルングの指輪 */
- case 0xa3: /* ロキの叫び */
- case 0xa4: /* 深淵の中に */
- case 0xa5: /* 不死身のジークフリード */
- case 0xa6: /* 不協和音 */
- case 0xa7: /* 口笛 */
- case 0xa8: /* 夕陽のアサシンクロス */
- case 0xa9: /* ブラギの詩 */
- case 0xaa: /* イドゥンの林檎 */
- case 0xab: /* 自分勝手なダンス */
- case 0xac: /* ハミング */
- case 0xad: /* 私を忘れないで… */
- case 0xae: /* 幸運のキス */
- case 0xaf: /* サービスフォーユー */
- case 0xb4:
- return skill_unit_onout (src, bl, tick);
-
-/* default:
- if(battle_config.error_log)
- printf("skill_unit_ondelete: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
- break;*/
- }
- skill_unitgrouptickset_delete (bl, sg->group_id);
- return 0;
-}
-
-/*==========================================
- * スキルユニットの限界イベント
- *------------------------------------------
- */
-static
-int skill_unit_onlimit (struct skill_unit *src, unsigned int tick)
-{
- struct skill_unit_group *sg;
-
- nullpo_retr (0, src);
- nullpo_retr (0, sg = src->group);
-
- switch (sg->unit_id)
- {
- case 0x81: /* ワープポータル(発動前) */
- {
- struct skill_unit_group *group =
- skill_unitsetting (map_id2bl (sg->src_id), sg->skill_id,
- sg->skill_lv,
- src->bl.x, src->bl.y, 1);
- if (group == NULL)
- return 0;
- CREATE (group->valstr, char, 24);
- memcpy (group->valstr, sg->valstr, 24);
- group->val2 = sg->val2;
- }
- break;
-
- case 0x8d: /* アイスウォール */
- map_setcell (src->bl.m, src->bl.x, src->bl.y, src->val2);
- clif_changemapcell (src->bl.m, src->bl.x, src->bl.y, src->val2,
- 1);
- break;
- case 0xb2: /* あなたに会いたい */
- {
- struct map_session_data *sd = NULL;
- struct map_session_data *p_sd = NULL;
- if ((sd =
- (struct map_session_data *) (map_id2bl (sg->src_id))) ==
- NULL)
- return 0;
- if ((p_sd = pc_get_partner (sd)) == NULL)
- return 0;
-
- pc_setpos (p_sd, map[src->bl.m].name, src->bl.x, src->bl.y, 3);
- }
- break;
- }
- return 0;
-}
-
-/*==========================================
- * スキルユニットのダメージイベント
- *------------------------------------------
- */
-int skill_unit_ondamaged (struct skill_unit *src, struct block_list *bl,
- int damage, unsigned int tick)
-{
- struct skill_unit_group *sg;
-
- nullpo_retr (0, src);
- nullpo_retr (0, sg = src->group);
-
- switch (sg->unit_id)
- {
- case 0x8d: /* アイスウォール */
- src->val1 -= damage;
- break;
- case 0x8f: /* ブラストマイン */
- case 0x98: /* クレイモアートラップ */
- skill_blown (bl, &src->bl, 2); //吹き飛ばしてみる
- break;
- default:
- damage = 0;
- break;
- }
- return damage;
-}
-
-/*---------------------------------------------------------------------------- */
-
-/*==========================================
- * スキル使用(詠唱完了、場所指定)
- *------------------------------------------
- */
-static
-void skill_castend_pos (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{
- struct map_session_data *sd = map_id2sd (id) /*,*target_sd=NULL */ ;
- int range, maxcount;
-
- nullpo_retv (sd);
-
- if (sd->bl.prev == NULL)
- 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 = 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 = sd->skillitemlv = -1;
- return;
- }
- }
- }
- if (battle_config.pc_skill_nofootset)
- {
- range = -1;
- switch (sd->skillid)
- {
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case HT_TALKIEBOX:
- case PF_SPIDERWEB: /* スパイダーウェッブ */
- case WZ_ICEWALL:
- range = 1;
- break;
- case AL_WARP:
- range = 0;
- break;
- }
- if (range >= 0)
- {
- if (skill_check_unit_range2
- (sd->bl.m, sd->skillx, sd->skilly, range) > 0)
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
- }
- }
-
- if (battle_config.pc_land_skill_limit)
- {
- maxcount = skill_get_maxcount (sd->skillid);
- 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 == sd->skillid)
- c++;
- }
- if (c >= maxcount)
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
- }
- }
-
- 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;
- if (battle_config.skill_out_range_consume)
- { // changed to allow casting when target walks out of range [Valaris]
- if (range < distance (sd->bl.x, sd->bl.y, sd->skillx, sd->skilly))
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
- }
- if (!skill_check_condition (sd, 1))
- { /* 使用条件チェック */
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return;
- }
- sd->skillitem = sd->skillitemlv = -1;
- if (battle_config.skill_out_range_consume)
- {
- if (range < distance (sd->bl.x, sd->bl.y, sd->skillx, sd->skilly))
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- return;
- }
- }
-
- if (battle_config.pc_skill_log)
- 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, 0);
-}
-
-/*==========================================
- * 範囲内キャラ存在確認判定処理(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_check_condition_char_sub (struct block_list *bl, va_list ap)
-{
- int *c;
- struct block_list *src;
- struct map_session_data *sd;
- struct map_session_data *ssd;
- struct pc_base_job s_class;
- struct pc_base_job ss_class;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, sd = (struct map_session_data *) bl);
- nullpo_retr (0, src = va_arg (ap, struct block_list *));
- nullpo_retr (0, c = va_arg (ap, int *));
- nullpo_retr (0, 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 0;
- }
-
- ;
- 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 0;
-}
-
-/*==========================================
- * 範囲内キャラ存在確認判定後スキル使用処理(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_check_condition_use_sub (struct block_list *bl, va_list ap)
-{
- int *c;
- struct block_list *src;
- struct map_session_data *sd;
- struct map_session_data *ssd;
- struct pc_base_job s_class;
- struct pc_base_job ss_class;
- int skillid, skilllv;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, sd = (struct map_session_data *) bl);
- nullpo_retr (0, src = va_arg (ap, struct block_list *));
- nullpo_retr (0, c = va_arg (ap, int *));
- nullpo_retr (0, 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 0;
- }
-
- ss_class = pc_calc_base_job (ssd->status.pc_class);
- 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;
- clif_skill_nodamage (bl, src, skillid, skilllv, 1);
- skill_status_change_start (bl, SC_DANCING, 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;
- }
- return 0;
-}
-
-/*==========================================
- * 範囲内バイオプラント、スフィアマイン用Mob存在確認判定処理(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_check_condition_mob_master_sub (struct block_list *bl,
- va_list ap)
-{
- int *c, src_id = 0, mob_class = 0;
- struct mob_data *md;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, md = (struct mob_data *) bl);
-
- if (!(src_id = va_arg (ap, int)))
- return 0;
- if (!(mob_class = va_arg (ap, int)))
- return 0;
- nullpo_retr (0, c = va_arg (ap, int *));
-
- if (md->mob_class == mob_class && md->master_id == src_id)
- (*c)++;
- return 0;
-}
-
-/*==========================================
- * スキル使用条件(偽で使用失敗)
- *------------------------------------------
- */
-int skill_check_condition (struct map_session_data *sd, int type)
-{
- int hp, sp, hp_rate, sp_rate, zeny, weapon, state, spiritball, skill,
- lv, mhp;
- int index[10], itemid[10], amount[10];
-
- nullpo_retr (0, sd);
-
- if (battle_config.gm_skilluncond > 0
- && pc_isGM (sd) >= battle_config.gm_skilluncond)
- {
- sd->skillitem = sd->skillitemlv = -1;
- return 1;
- }
-
- if (sd->opt1 > 0)
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if (pc_is90overweight (sd))
- {
- clif_skill_fail (sd, sd->skillid, 9, 0);
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
-
- if (sd->skillid == AC_MAKINGARROW && sd->state.make_arrow_flag == 1)
- {
- sd->skillitem = 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)
- sd->skillitem = sd->skillitemlv = -1;
- return 1;
- }
- if (sd->opt1 > 0)
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- return 0;
- }
- if (sd->sc_data)
- {
- 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)
- || sd->sc_data[SC_STEELBODY].timer != -1
- || sd->sc_data[SC_BERSERK].timer != -1)
- {
- clif_skill_fail (sd, sd->skillid, 0, 0);
- return 0; /* 状態異常や沈黙など */
- }
- }
- skill = sd->skillid;
- 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);
- weapon = skill_db[skill].weapon;
- state = skill_db[skill].state;
- spiritball = (lv <= 0) ? 0 : skill_db[skill].spiritball[lv - 1];
- mhp = skill_get_mhp (skill, lv); /* 消費HP */
- for (int i = 0; i < 10; i++)
- {
- itemid[i] = skill_db[skill].itemid[i];
- amount[i] = skill_db[skill].amount[i];
- }
- if (mhp > 0)
- hp += (sd->status.max_hp * mhp) / 100;
- if (hp_rate > 0)
- hp += (sd->status.hp * hp_rate) / 100;
- else
- hp += (sd->status.max_hp * abs (hp_rate)) / 100;
- if (sp_rate > 0)
- sp += (sd->status.sp * sp_rate) / 100;
- else
- sp += (sd->status.max_sp * abs (sp_rate)) / 100;
- if (sd->dsprate != 100)
- sp = sp * sd->dsprate / 100; /* 消費SP修正 */
-
- 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)
- {
- clif_skill_teleportmessage (sd, 0);
- 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
- || sd->sc_data[SC_COMBO].val1 != MO_TRIPLEATTACK)
- return 0;
- }
- break;
- case MO_COMBOFINISH: //猛龍拳
- if (sd->sc_data[SC_COMBO].timer == -1
- || sd->sc_data[SC_COMBO].val1 != MO_CHAINCOMBO)
- return 0;
- break;
- case CH_TIGERFIST: //伏虎拳
- if (sd->sc_data[SC_COMBO].timer == -1
- || 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 (sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH
- && sd->sc_data[SC_COMBO].val1 != CH_TIGERFIST)
- return 0;
- break;
- case MO_EXTREMITYFIST: // 阿修羅覇鳳拳
- if ((sd->sc_data[SC_COMBO].timer != -1
- && (sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH
- || 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
- (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 (skill_check_condition_char_sub, sd->bl.m,
- sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC,
- &sd->bl, &c);
- if (c < 2)
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- }
- else
- {
- map_foreachinarea (skill_check_condition_use_sub, sd->bl.m,
- sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC,
- &sd->bl, &c);
- }
- }
- 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 (skill_check_condition_mob_master_sub,
- sd->bl.m, 0, 0, map[sd->bl.m].xs,
- map[sd->bl.m].ys, BL_MOB, sd->bl.id,
- mob_class, &c);
- 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))
- {
- if (hp > 0 && sd->status.hp < hp)
- { /* HPチェック */
- clif_skill_fail (sd, skill, 2, 0); /* HP不足:失敗通知 */
- return 0;
- }
- if (sp > 0 && sd->status.sp < sp)
- { /* SPチェック */
- clif_skill_fail (sd, skill, 1, 0); /* SP不足:失敗通知 */
- return 0;
- }
- if (zeny > 0 && sd->status.zeny < zeny)
- {
- clif_skill_fail (sd, skill, 5, 0);
- return 0;
- }
- if (!(weapon & (1 << sd->status.weapon)))
- {
- clif_skill_fail (sd, skill, 6, 0);
- return 0;
- }
- if (spiritball > 0 && sd->spiritball < spiritball)
- {
- clif_skill_fail (sd, skill, 0, 0); // 氣球不足
- return 0;
- }
- }
-
- switch (state)
- {
- case ST_HIDING:
- if (!(sd->status.option & 2))
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_CLOAKING:
- if (!(sd->status.option & 4))
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_HIDDEN:
- if (!pc_ishiding (sd))
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_RIDING:
- if (!pc_isriding (sd))
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_FALCON:
- if (!pc_isfalcon (sd))
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_CART:
- if (!pc_iscarton (sd))
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_SHIELD:
- if (sd->status.shield <= 0)
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_SIGHT:
- if (sd->sc_data[SC_SIGHT].timer == -1 && type & 1)
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_EXPLOSIONSPIRITS:
- if (sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1)
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_RECOV_WEIGHT_RATE:
- if (battle_config.natural_heal_weight_rate <= 100
- && sd->weight * 100 / sd->max_weight >=
- battle_config.natural_heal_weight_rate)
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- case ST_MOVE_ENABLE:
- {
- struct walkpath_data wpd;
- if (path_search
- (&wpd, sd->bl.m, sd->bl.x, sd->bl.y, sd->skillx, sd->skilly,
- 1) == -1)
- {
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- }
- break;
- case ST_WATER:
- if (map_getcell (sd->bl.m, sd->bl.x, sd->bl.y) != 3
- && (sd->sc_data[SC_DELUGE].timer == -1))
- { //水場判定
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- break;
- }
-
- for (int i = 0; i < 10; i++)
- {
- int x = lv % 11 - 1;
- index[i] = -1;
- if (itemid[i] <= 0)
- continue;
- if (itemid[i] >= 715 && itemid[i] <= 717
- && sd->special_state.no_gemstone)
- continue;
- 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])
- {
- if (itemid[i] == 716 || itemid[i] == 717)
- clif_skill_fail (sd, skill, (7 + (itemid[i] - 716)), 0);
- else
- clif_skill_fail (sd, skill, 0, 0);
- return 0;
- }
- }
-
- 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)
- pc_delitem (sd, index[i], amount[i], 0); // アイテム消費
- }
- }
-
- if (type & 2)
- return 1;
-
- 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) // 氣球消費
- pc_delspiritball (sd, spiritball, 0);
-
- return 1;
-}
-
-/*==========================================
* 詠唱時間計算
*------------------------------------------
*/
-int skill_castfix (struct block_list *bl, int time)
+interval_t skill_castfix(struct block_list *bl, interval_t interval)
{
- struct map_session_data *sd;
struct mob_data *md; // [Valaris]
- struct status_change *sc_data;
- int dex;
- int castrate = 100;
- int skill, lv, castnodex;
+ eptr<struct status_change, StatusChange> sc_data;
+ int dex;
+ int castrate = 100;
+ SkillID skill;
+ int lv, castnodex;
- nullpo_retr (0, bl);
+ nullpo_retr(interval_t::zero(), bl);
- if (bl->type == BL_MOB)
+ if (bl->type == BL::MOB)
{ // Crash fix [Valaris]
md = (struct mob_data *) bl;
skill = md->skillid;
lv = md->skilllv;
}
-
else
{
- sd = (struct map_session_data *) bl;
- skill = sd->skillid;
- lv = sd->skilllv;
+ skill = SkillID::ZERO;
+ lv = 0;
}
- sc_data = battle_get_sc_data (bl);
- dex = battle_get_dex (bl);
+ sc_data = battle_get_sc_data(bl);
+ dex = battle_get_dex(bl);
- if (skill > MAX_SKILL_DB || skill < 0)
- return 0;
+ if (skill > SkillID::MAX_SKILL_DB /*|| skill < SkillID()*/)
+ return interval_t::zero();
- castnodex = skill_get_castnodex (skill, lv);
+ castnodex = skill_get_castnodex(skill, lv);
- if (time == 0)
- return 0;
- if (castnodex > 0 && bl->type == BL_PC)
- castrate = ((struct map_session_data *) bl)->castrate;
- else if (castnodex <= 0 && bl->type == BL_PC)
+ if (interval == interval_t::zero())
+ return interval_t::zero();
+ if (castnodex > 0 && bl->type == BL::PC)
+ castrate = 100;
+ else if (castnodex <= 0 && bl->type == BL::PC)
{
- castrate = ((struct map_session_data *) bl)->castrate;
- time =
- time * castrate * (battle_config.castrate_dex_scale -
+ castrate = 100;
+ interval =
+ interval * castrate * (battle_config.castrate_dex_scale -
dex) / (battle_config.castrate_dex_scale *
100);
- time = time * battle_config.cast_rate / 100;
+ interval = interval * battle_config.cast_rate / 100;
}
- /* サフラギウム */
- if (sc_data && sc_data[SC_SUFFRAGIUM].timer != -1)
- {
- time = time * (100 - sc_data[SC_SUFFRAGIUM].val1 * 15) / 100;
- skill_status_change_end (bl, SC_SUFFRAGIUM, -1);
- }
- /* ブラギの詩 */
- if (sc_data && sc_data[SC_POEMBRAGI].timer != -1)
- time =
- time * (100 -
- (sc_data[SC_POEMBRAGI].val1 * 3 +
- sc_data[SC_POEMBRAGI].val2 +
- (sc_data[SC_POEMBRAGI].val3 >> 16))) / 100;
-
- return (time > 0) ? time : 0;
+ return std::max(interval, interval_t::zero());
}
/*==========================================
* ディレイ計算
*------------------------------------------
*/
-int skill_delayfix (struct block_list *bl, int time)
+interval_t skill_delayfix(struct block_list *bl, interval_t interval)
{
- struct status_change *sc_data;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (0, bl);
+ nullpo_retr(interval_t::zero(), bl);
- sc_data = battle_get_sc_data (bl);
- if (time <= 0)
- return 0;
+ sc_data = battle_get_sc_data(bl);
+ if (interval <= interval_t::zero())
+ return interval_t::zero();
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
{
if (battle_config.delay_dependon_dex) /* dexの影響を計算する */
- time =
- time * (battle_config.castrate_dex_scale -
- battle_get_dex (bl)) /
+ interval =
+ interval * (battle_config.castrate_dex_scale -
+ battle_get_dex(bl)) /
battle_config.castrate_dex_scale;
- time = time * battle_config.delay_rate / 100;
- }
-
- /* ブラギの詩 */
- if (sc_data && sc_data[SC_POEMBRAGI].timer != -1)
- time =
- time * (100 -
- (sc_data[SC_POEMBRAGI].val1 * 3 +
- sc_data[SC_POEMBRAGI].val2 +
- (sc_data[SC_POEMBRAGI].val3 & 0xffff))) / 100;
-
- return (time > 0) ? time : 0;
-}
-
-/*==========================================
- * スキル使用(ID指定)
- *------------------------------------------
- */
-int skill_use_id (struct map_session_data *sd, int target_id,
- int skill_num, int skill_lv)
-{
- unsigned int tick;
- int casttime = 0, delay = 0, skill, range_;
- struct map_session_data *target_sd = NULL;
- int forcecast = 0;
- struct block_list *bl;
- struct status_change *sc_data;
- tick = gettick ();
-
- nullpo_retr (0, sd);
-
- if ((bl = map_id2bl (target_id)) == NULL)
- {
-/* if(battle_config.error_log)
- printf("skill target not found %d\n",target_id); */
- return 0;
- }
- 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;
-
- /* 沈黙や異常(ただし、グリムなどの判定をする) */
- if (sd->opt1 > 0)
- return 0;
- if (sd->sc_data)
- {
- if (sc_data[SC_CHASEWALK].timer != -1)
- 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)
- || 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 (sd->status.option & 4 && skill_num == TF_HIDING)
- return 0;
- if (sd->status.option & 2 && skill_num != TF_HIDING
- && skill_num != AS_GRIMTOOTH && skill_num != RG_BACKSTAP
- && skill_num != RG_RAID)
- return 0;
-
- if (map[sd->bl.m].flag.gvg)
- { //GvGで使用できないスキル
- switch (skill_num)
- {
- case SM_ENDURE:
- case AL_TELEPORT:
- case AL_WARP:
- case WZ_ICEWALL:
- case TF_BACKSLIDING:
- case LK_BERSERK:
- case HP_BASILICA:
- case ST_CHASEWALK:
- 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;
- }
- }
-
- 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;
- }
- case BD_ENCORE: /* アンコール */
- if (!sd->skillid_dance)
- { //前回使用した踊りがないとだめ
- 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 (skill_check_condition_char_sub, sd->bl.m,
- sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC,
- &sd->bl, &c);
- 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
- && (sc_data[SC_COMBO].val1 == MO_COMBOFINISH
- || 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: /* ベナムスプラッシャー */
- {
- struct status_change *t_sc_data = battle_get_sc_data (bl);
- if (t_sc_data && t_sc_data[SC_POISON].timer == -1)
- {
- clif_skill_fail (sd, skill_num, 0, 10);
- return 0;
- }
- }
- break;
- case PF_MEMORIZE: /* メモライズ */
- casttime = 12000;
- break;
-
- }
-
- //メモライズ状態ならキャストタイムが1/3
- if (sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0)
- {
- casttime = casttime / 3;
- if ((--sc_data[SC_MEMORIZE].val2) <= 0)
- skill_status_change_end (&sd->bl, SC_MEMORIZE, -1);
- }
-
- if (battle_config.pc_skill_log)
- printf ("PC %d skill use target_id=%d skill=%d lv=%d cast=%d\n",
- sd->bl.id, target_id, skill_num, skill_lv, casttime);
-
-// if(sd->skillitem == skill_num)
-// casttime = delay = 0;
-
- if (casttime > 0 || forcecast)
- { /* 詠唱が必要 */
- struct mob_data *md;
- clif_skillcasting (&sd->bl,
- sd->bl.id, target_id, 0, 0, skill_num, casttime);
-
- /* 詠唱反応モンスター */
- if (bl->type == BL_MOB && (md = (struct mob_data *) bl)
- && mob_db[md->mob_class].mode & 0x10 && md->state.state != MS_ATTACK
- && sd->invincible_timer == -1)
- {
- md->target_id = sd->bl.id;
- md->state.targettype = ATTACKABLE;
- md->min_chase = 13;
- }
- }
-
- if (casttime <= 0) /* 詠唱の無いものはキャンセルされない */
- sd->state.skillcastcancel = 0;
-
- sd->skilltarget = target_id;
-/* sd->cast_target_bl = bl; */
- sd->skillx = 0;
- sd->skilly = 0;
- 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)
- 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);
+ interval = interval * battle_config.delay_rate / 100;
}
- else
- {
- if (skill_num != SA_CASTCANCEL)
- 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)
- skill_status_change_end (&sd->bl, SC_MAGICPOWER, -1);
- return 0;
-}
-
-/*==========================================
- * スキル使用(場所指定)
- *------------------------------------------
- */
-int skill_use_pos (struct map_session_data *sd,
- int skill_x, int skill_y, int skill_num, int skill_lv)
-{
- struct block_list bl;
- struct status_change *sc_data;
- unsigned int tick;
- int casttime = 0, delay = 0, skill, range;
-
- nullpo_retr (0, sd);
-
- if (pc_isdead (sd))
- return 0;
-
- if (skillnotok (skill_num, sd)) // [MoueJstr]
- return 0;
-
- sc_data = sd->sc_data;
-
- if (sd->opt1 > 0)
- return 0;
- if (sc_data)
- {
- 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)
- return 0; /* 状態異常や沈黙など */
- }
-
- if (sd->status.option & 2)
- return 0;
-
- if (map[sd->bl.m].flag.gvg
- && (skill_num == SM_ENDURE || skill_num == AL_TELEPORT
- || skill_num == AL_WARP || skill_num == WZ_ICEWALL
- || skill_num == TF_BACKSLIDING))
- return 0;
-
- sd->skillid = skill_num;
- sd->skilllv = skill_lv;
- sd->skillx = skill_x;
- sd->skilly = skill_y;
- if (!skill_check_condition (sd, 0))
- return 0;
-
- /* 射程と障害物チェック */
- bl.type = BL_NUL;
- bl.m = sd->bl.m;
- bl.x = skill_x;
- bl.y = skill_y;
- 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;
-
- if (battle_config.pc_skill_log)
- printf ("PC %d skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d\n",
- sd->bl.id, skill_x, skill_y, skill_num, skill_lv, casttime);
-
-// if(sd->skillitem == skill_num)
-// casttime = delay = 0;
- //メモライズ状態ならキャストタイムが1/3
- if (sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0)
- {
- casttime = casttime / 3;
- if ((--sc_data[SC_MEMORIZE].val2) <= 0)
- skill_status_change_end (&sd->bl, SC_MEMORIZE, -1);
- }
-
- if (casttime > 0) /* 詠唱が必要 */
- clif_skillcasting (&sd->bl,
- sd->bl.id, 0, skill_x, skill_y, skill_num,
- casttime);
-
- if (casttime <= 0) /* 詠唱の無いものはキャンセルされない */
- sd->state.skillcastcancel = 0;
-
- sd->skilltarget = 0;
-/* sd->cast_target_bl = NULL; */
- tick = gettick ();
- 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)
- 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);
- }
- else
- {
- sd->skilltimer = -1;
- skill_castend_pos (sd->skilltimer, tick, sd->bl.id, 0);
- }
- //マジックパワーの効果終了
- if (sc_data && sc_data[SC_MAGICPOWER].timer != -1
- && skill_num != HW_MAGICPOWER)
- skill_status_change_end (&sd->bl, SC_MAGICPOWER, -1);
-
- return 0;
+ return std::max(interval, interval_t::zero());
}
/*==========================================
* スキル詠唱キャンセル
*------------------------------------------
*/
-int skill_castcancel (struct block_list *bl, int type)
+int skill_castcancel(struct block_list *bl, int)
{
- int inf;
+ nullpo_ret(bl);
- nullpo_retr (0, bl);
-
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
{
struct map_session_data *sd = (struct map_session_data *) bl;
- unsigned long tick = gettick ();
- nullpo_retr (0, sd);
+ tick_t tick = gettick();
sd->canact_tick = tick;
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)
- delete_timer (sd->skilltimer, skill_castend_pos);
- else
- delete_timer (sd->skilltimer, skill_castend_id);
- }
- else
- {
- if ((inf = skill_get_inf (sd->skillid_old)) == 2 || inf == 32)
- delete_timer (sd->skilltimer, skill_castend_pos);
- else
- delete_timer (sd->skilltimer, skill_castend_id);
- }
- sd->skilltimer = -1;
- clif_skillcastcancel (bl);
- }
return 0;
}
- else if (bl->type == BL_MOB)
+ else if (bl->type == BL::MOB)
{
struct mob_data *md = (struct mob_data *) bl;
- nullpo_retr (0, md);
- if (md->skilltimer != -1)
+ if (md->skilltimer)
{
- if ((inf = skill_get_inf (md->skillid)) == 2 || inf == 32)
- delete_timer (md->skilltimer, mobskill_castend_pos);
- else
- delete_timer (md->skilltimer, mobskill_castend_id);
- md->skilltimer = -1;
- clif_skillcastcancel (bl);
+ md->skilltimer.cancel();
+ clif_skillcastcancel(bl);
}
return 0;
}
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;
- }
- }
-}
-
/*==========================================
* ディボーション 有効確認
*------------------------------------------
*/
-void skill_devotion (struct map_session_data *md, int target)
+void skill_devotion(struct map_session_data *md, int)
{
// 総確認
- int n;
+ int n;
- nullpo_retv (md);
+ nullpo_retv(md);
for (n = 0; n < 5; n++)
{
if (md->dev.val1[n])
{
- struct map_session_data *sd = map_id2sd (md->dev.val1[n]);
+ struct map_session_data *sd = map_id2sd(md->dev.val1[n]);
// 相手が見つからない // 相手をディボしてるのが自分じゃない // 距離が離れてる
if (sd == NULL
- || (sd->sc_data
- && (md->bl.id != sd->sc_data[SC_DEVOTION].val1))
- || skill_devotion3 (&md->bl, md->dev.val1[n]))
+ || (md->bl.id != 0/* was something else - TODO remove this */)
+ || skill_devotion3(&md->bl, md->dev.val1[n]))
{
- skill_devotion_end (md, sd, n);
+ skill_devotion_end(md, sd, n);
}
}
}
}
-void skill_devotion2 (struct block_list *bl, int crusader)
-{
- // 被ディボーションが歩いた時の距離チェック
- struct map_session_data *sd = map_id2sd (crusader);
-
- nullpo_retv (bl);
-
- if (sd)
- skill_devotion3 (&sd->bl, bl->id);
-}
-
-int skill_devotion3 (struct block_list *bl, int target)
+int skill_devotion3(struct block_list *bl, int target)
{
// クルセが歩いた時の距離チェック
struct map_session_data *md;
struct map_session_data *sd;
- int n, r = 0;
+ int n, r = 0;
- nullpo_retr (1, bl);
+ nullpo_retr(1, bl);
if ((md = (struct map_session_data *) bl) == NULL
- || (sd = map_id2sd (target)) == NULL)
+ || (sd = map_id2sd(target)) == NULL)
return 1;
else
- r = distance (bl->x, bl->y, sd->bl.x, sd->bl.y);
+ 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)
md->dev.val2[n] = 0; // 離れた時は、糸を切るだけ
- clif_devotion (md, sd->bl.id);
return 1;
}
return 0;
}
-void skill_devotion_end (struct map_session_data *md,
- struct map_session_data *sd, int target)
+void skill_devotion_end(struct map_session_data *md,
+ struct map_session_data *, int target)
{
// クルセと被ディボキャラのリセット
- nullpo_retv (md);
- nullpo_retv (sd);
+ nullpo_retv(md);
md->dev.val1[target] = md->dev.val2[target] = 0;
- if (sd && sd->sc_data)
- {
- // skill_status_change_end(sd->bl,SC_DEVOTION,-1);
- sd->sc_data[SC_DEVOTION].val1 = 0;
- sd->sc_data[SC_DEVOTION].val2 = 0;
- clif_status_change (&sd->bl, SC_DEVOTION, 0);
- clif_devotion (md, sd->bl.id);
- }
}
-/*==========================================
- * オートスペル
- *------------------------------------------
- */
-int skill_autospell (struct map_session_data *sd, int skillid)
+int skill_gangsterparadise(struct map_session_data *, int)
{
- int skilllv;
- int maxlv = 1, lv;
-
- nullpo_retr (0, sd);
-
- skilllv = pc_checkskill (sd, SA_AUTOSPELL);
-
- if (skillid == MG_NAPALMBEAT)
- maxlv = 3;
- else if (skillid == MG_COLDBOLT || skillid == MG_FIREBOLT
- || skillid == MG_LIGHTNINGBOLT)
- {
- if (skilllv == 2)
- maxlv = 1;
- else if (skilllv == 3)
- maxlv = 2;
- else if (skilllv >= 4)
- maxlv = 3;
- }
- else if (skillid == MG_SOULSTRIKE)
- {
- if (skilllv == 5)
- maxlv = 1;
- else if (skilllv == 6)
- maxlv = 2;
- else if (skilllv >= 7)
- maxlv = 3;
- }
- else if (skillid == MG_FIREBALL)
- {
- if (skilllv == 8)
- maxlv = 1;
- else if (skilllv >= 9)
- maxlv = 2;
- }
- else if (skillid == MG_FROSTDIVER)
- maxlv = 1;
- else
- return 0;
-
- if (maxlv > (lv = pc_checkskill (sd, skillid)))
- maxlv = lv;
-
- skill_status_change_start (&sd->bl, SC_AUTOSPELL, skilllv, skillid, maxlv, 0, // val1:スキルID val2:使用最大Lv
- skill_get_time (SA_AUTOSPELL, skilllv), 0); // にしてみたけどbscriptが書き易い・・・?
return 0;
}
-/*==========================================
- * ギャングスターパラダイス判定処理(foreachinarea)
- *------------------------------------------
+/*----------------------------------------------------------------------------
+ * ステータス異常
+ *----------------------------------------------------------------------------
*/
-static int skill_gangster_count (struct block_list *bl, va_list ap)
-{
- int *c;
- struct map_session_data *sd;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
-
- sd = (struct map_session_data *) bl;
- c = va_arg (ap, int *);
-
- if (sd && c && pc_issit (sd) && pc_checkskill (sd, RG_GANGSTER) > 0)
- (*c)++;
- return 0;
-}
-
-static int skill_gangster_in (struct block_list *bl, va_list ap)
-{
- struct map_session_data *sd;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
-
- sd = (struct map_session_data *) bl;
- if (sd && pc_issit (sd) && pc_checkskill (sd, RG_GANGSTER) > 0)
- sd->state.gangsterparadise = 1;
- return 0;
-}
-
-static int skill_gangster_out (struct block_list *bl, va_list ap)
-{
- struct map_session_data *sd;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
-
- sd = (struct map_session_data *) bl;
- if (sd && sd->state.gangsterparadise)
- sd->state.gangsterparadise = 0;
- return 0;
-}
-
-int skill_gangsterparadise (struct map_session_data *sd, int type)
-{
- int range = 1;
- int c = 0;
-
- nullpo_retr (0, sd);
-
- if (pc_checkskill (sd, RG_GANGSTER) <= 0)
- return 0;
-
- if (type == 1)
- { /* 座った時の処理 */
- map_foreachinarea (skill_gangster_count, sd->bl.m,
- sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC, &c);
- 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 (skill_gangster_count, sd->bl.m,
- sd->bl.x - range, sd->bl.y - range,
- sd->bl.x + range, sd->bl.y + range, BL_PC, &c);
- 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)
+ * ステータス異常終了
*------------------------------------------
*/
-int skill_frostjoke_scream (struct block_list *bl, va_list ap)
+int skill_status_change_active(struct block_list *bl, StatusChange type)
{
- struct block_list *src;
- int skillnum, skilllv;
- unsigned int tick;
+ eptr<struct status_change, StatusChange> sc_data;
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, src = va_arg (ap, struct block_list *));
-
- skillnum = va_arg (ap, int);
- skilllv = va_arg (ap, int);
- tick = va_arg (ap, unsigned int);
-
- if (src == bl) //自分には効かない
- return 0;
-
- 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)
+ nullpo_ret(bl);
+ if (bl->type != BL::PC && bl->type != BL::MOB)
{
- if (MRAND (100) < 10) //PTメンバにも低確率でかかる(とりあえず10%)
- skill_additional_effect (src, bl, skillnum, skilllv, BF_MISC,
- tick);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_attack_area (struct block_list *bl, va_list ap)
-{
- struct block_list *src, *dsrc;
- int atk_type, skillid, skilllv, flag, type;
- unsigned int tick;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
-
- atk_type = va_arg (ap, int);
- if ((src = va_arg (ap, struct block_list *)) == NULL)
- return 0;
- if ((dsrc = va_arg (ap, struct block_list *)) == NULL)
+ if (battle_config.error_log)
+ PRINTF("skill_status_change_active: neither MOB nor PC !\n");
return 0;
- skillid = va_arg (ap, int);
- skilllv = va_arg (ap, int);
- tick = va_arg (ap, unsigned int);
- flag = va_arg (ap, int);
- type = va_arg (ap, int);
-
- if (battle_check_target (dsrc, bl, type) > 0)
- skill_attack (atk_type, src, dsrc, bl, skillid, skilllv, tick, flag);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_clear_element_field (struct block_list *bl)
-{
- struct mob_data *md = NULL;
- struct map_session_data *sd = NULL;
- int i, skillid;
-
- nullpo_retr (0, 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 = 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 = md->skillunit[i].skill_id;
- if (skillid == SA_DELUGE || skillid == SA_VOLCANO
- || skillid == SA_VIOLENTGALE || skillid == SA_LANDPROTECTOR)
- skill_delunitgroup (&md->skillunit[i]);
- }
}
- return 0;
-}
-/*==========================================
- * ランドプロテクターチェック(foreachinarea)
- *------------------------------------------
- */
-int skill_landprotector (struct block_list *bl, va_list ap)
-{
- int skillid;
- int *alive;
- struct skill_unit *unit;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
-
- skillid = va_arg (ap, int);
- alive = va_arg (ap, int *);
- if ((unit = (struct skill_unit *) bl) == NULL)
+ sc_data = battle_get_sc_data(bl);
+ if (not sc_data)
return 0;
- if (skillid == SA_LANDPROTECTOR)
- {
- skill_delunit (unit);
- }
- else
- {
- if (alive && unit->group->skill_id == SA_LANDPROTECTOR)
- (*alive) = 0;
- }
- return 0;
+ return bool(sc_data[type].timer);
}
-/*==========================================
- * イドゥンの林檎の回復処理(foreachinarea)
- *------------------------------------------
- */
-static
-int skill_idun_heal (struct block_list *bl, va_list ap)
+void skill_status_change_end(struct block_list *bl, StatusChange type, TimerData *tid)
{
- struct skill_unit *unit;
- struct skill_unit_group *sg;
- int heal;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, unit = va_arg (ap, struct skill_unit *));
- nullpo_retr (0, sg = unit->group);
+ eptr<struct status_change, StatusChange> sc_data;
+ int opt_flag = 0, calc_flag = 0;
+ short *sc_count;
+ Option *option;
+ Opt1 *opt1;
+ Opt2 *opt2;
+ Opt3 *opt3;
- heal =
- 30 + sg->skill_lv * 5 + ((sg->val1) >> 16) * 5 +
- ((sg->val1) & 0xfff) / 2;
-
- if (bl->type == BL_SKILL || bl->id == sg->src_id)
- return 0;
-
- if (bl->type == BL_PC || bl->type == BL_MOB)
+ nullpo_retv(bl);
+ if (bl->type != BL::PC && bl->type != BL::MOB)
{
- clif_skill_nodamage (&unit->bl, bl, AL_HEAL, heal, 1);
- battle_heal (NULL, bl, heal, 0, 0);
+ if (battle_config.error_log)
+ PRINTF("skill_status_change_end: neither MOB nor PC !\n");
+ return;
}
- return 0;
-}
-
-/*==========================================
- * 指定範囲内でsrcに対して有効なターゲットのblの数を数える(foreachinarea)
- *------------------------------------------
- */
-int skill_count_target (struct block_list *bl, va_list ap)
-{
- struct block_list *src;
- int *c;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
-
- if ((src = va_arg (ap, struct block_list *)) == NULL)
- return 0;
- if ((c = va_arg (ap, int *)) == NULL)
- return 0;
- if (battle_check_target (src, bl, BCT_ENEMY) > 0)
- (*c)++;
- return 0;
-}
-
-/*==========================================
- * トラップ範囲処理(foreachinarea)
- *------------------------------------------
- */
-int skill_trap_splash (struct block_list *bl, va_list ap)
-{
- struct block_list *src;
- int tick;
- int splash_count;
- struct skill_unit *unit;
- struct skill_unit_group *sg;
- struct block_list *ss;
- int i;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, src = va_arg (ap, struct block_list *));
- nullpo_retr (0, unit = (struct skill_unit *) src);
- nullpo_retr (0, sg = unit->group);
- nullpo_retr (0, ss = map_id2bl (sg->src_id));
-
- tick = va_arg (ap, int);
- splash_count = va_arg (ap, int);
-
- if (battle_check_target (src, bl, BCT_ENEMY) > 0)
- {
- switch (sg->unit_id)
- {
- case 0x95: /* サンドマン */
- case 0x96: /* フラッシャー */
- case 0x94: /* ショックウェーブトラップ */
- skill_additional_effect (ss, bl, sg->skill_id, sg->skill_lv,
- BF_MISC, tick);
- break;
- case 0x8f: /* ブラストマイン */
- case 0x98: /* クレイモアートラップ */
- for (i = 0; i < splash_count; i++)
- {
- skill_attack (BF_MISC, ss, src, bl, sg->skill_id,
- sg->skill_lv, tick,
- (sg->val2) ? 0x0500 : 0);
- }
- case 0x97: /* フリージングトラップ */
- skill_attack (BF_WEAPON, ss, src, bl, sg->skill_id,
- sg->skill_lv, tick, (sg->val2) ? 0x0500 : 0);
- break;
- default:
- break;
- }
+ sc_data = battle_get_sc_data(bl);
+ if (not sc_data)
+ return;
+ sc_count = battle_get_sc_count(bl);
+ nullpo_retv(sc_count);
+ option = battle_get_option(bl);
+ nullpo_retv(option);
+ opt1 = battle_get_opt1(bl);
+ nullpo_retv(opt1);
+ opt2 = battle_get_opt2(bl);
+ nullpo_retv(opt2);
+ opt3 = battle_get_opt3(bl);
+ nullpo_retv(opt3);
+
+ // status_change_end can be called 2 ways: automatically by a timer,
+ // or manually to cancel it.
+ if (!tid) // if this is a cancel
+ {
+ // and it was not active
+ if (!sc_data[type].timer)
+ // there's nothing to do
+ return;
+ // if it was active, cancel it
+ sc_data[type].timer.cancel();
}
+ // whether we are the timer or a cancel no longer matters
- return 0;
-}
-
-/*----------------------------------------------------------------------------
- * ステータス異常
- *----------------------------------------------------------------------------
- */
-
-/*==========================================
- * ステータス異常タイマー範囲処理
- *------------------------------------------
- */
-int skill_status_change_timer_sub (struct block_list *bl, va_list ap)
-{
- struct block_list *src;
- int type;
- unsigned int tick;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, src = va_arg (ap, struct block_list *));
- type = va_arg (ap, int);
- tick = va_arg (ap, unsigned int);
-
- if (bl->type != BL_PC && bl->type != BL_MOB)
- return 0;
+ assert (!sc_data[type].timer);
+ assert ((*sc_count) > 0);
+ (*sc_count)--;
switch (type)
- {
- case SC_SIGHT: /* サイト */
- case SC_CONCENTRATE:
- if ((*battle_get_option (bl)) & 6)
- {
- skill_status_change_end (bl, SC_HIDING, -1);
- skill_status_change_end (bl, SC_CLOAKING, -1);
- }
+ { /* 異常の種類ごとの処理 */
+ case StatusChange::SC_SPEEDPOTION0: /* 増速ポーション */
+ case StatusChange::SC_ATKPOT: /* attack potion [Valaris] */
+ case StatusChange::SC_MATKPOT: /* magic attack potion [Valaris] */
+ case StatusChange::SC_PHYS_SHIELD:
+ case StatusChange::SC_HASTE:
+ calc_flag = 1;
break;
- case SC_RUWACH: /* ルアフ */
- if ((*battle_get_option (bl)) & 6)
- {
- 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)
- {
- struct status_change *sc_data = battle_get_sc_data (bl);
- skill_attack (BF_MAGIC, src, src, bl, AL_RUWACH,
- sc_data[type].val1, tick, 0);
- }
- }
+
+ /* option2 */
+ case StatusChange::SC_POISON: /* 毒 */
+ calc_flag = 1;
break;
}
- return 0;
-}
-/*==========================================
- * ステータス異常終了
- *------------------------------------------
- */
-int skill_status_change_active (struct block_list *bl, int type)
-{
- struct status_change *sc_data;
+ if (bl->type == BL::PC && type < StatusChange::SC_SENDMAX)
+ clif_status_change(bl, type, 0); /* アイコン消去 */
- nullpo_retr (0, bl);
- if (bl->type != BL_PC && bl->type != BL_MOB)
+ switch (type)
{
- if (battle_config.error_log)
- printf ("skill_status_change_active: neither MOB nor PC !\n");
- return 0;
- }
-
- nullpo_retr (0, sc_data = battle_get_sc_data (bl));
+ case StatusChange::SC_POISON:
+ *opt2 &= ~Opt2::_poison;
+ opt_flag = 1;
+ break;
- return sc_data[type].timer != -1;
-}
+ case StatusChange::SC_SLOWPOISON:
+ if (sc_data[StatusChange::SC_POISON].timer)
+ *opt2 |= Opt2::_poison;
+ *opt2 &= ~Opt2::_slowpoison;
+ opt_flag = 1;
+ break;
-int skill_status_change_end (struct block_list *bl, int type, int tid)
-{
- struct status_change *sc_data;
- int opt_flag = 0, calc_flag = 0;
- short *sc_count, *option, *opt1, *opt2, *opt3;
+ case StatusChange::SC_SPEEDPOTION0:
+ *opt2 &= ~Opt2::_speedpotion0;
+ opt_flag = 1;
+ break;
- nullpo_retr (0, bl);
- if (bl->type != BL_PC && bl->type != BL_MOB)
- {
- if (battle_config.error_log)
- printf ("skill_status_change_end: neither MOB nor PC !\n");
- return 0;
+ case StatusChange::SC_ATKPOT:
+ *opt2 &= ~Opt2::_atkpot;
+ opt_flag = 1;
+ break;
}
- nullpo_retr (0, sc_data = battle_get_sc_data (bl));
- nullpo_retr (0, sc_count = battle_get_sc_count (bl));
- nullpo_retr (0, option = battle_get_option (bl));
- nullpo_retr (0, opt1 = battle_get_opt1 (bl));
- nullpo_retr (0, opt2 = battle_get_opt2 (bl));
- nullpo_retr (0, opt3 = battle_get_opt3 (bl));
-
- if ((*sc_count) > 0 && sc_data[type].timer != -1
- && (sc_data[type].timer == tid || tid == -1))
- {
-
- if (tid == -1) // タイマから呼ばれていないならタイマ削除をする
- delete_timer (sc_data[type].timer, skill_status_change_timer);
-
- /* 該当の異常を正常に戻す */
- sc_data[type].timer = -1;
- (*sc_count)--;
-
- switch (type)
- { /* 異常の種類ごとの処理 */
- case SC_PROVOKE: /* プロボック */
- case SC_CONCENTRATE: /* 集中力向上 */
- case SC_BLESSING: /* ブレッシング */
- case SC_ANGELUS: /* アンゼルス */
- case SC_INCREASEAGI: /* 速度上昇 */
- case SC_DECREASEAGI: /* 速度減少 */
- case SC_SIGNUMCRUCIS: /* シグナムクルシス */
- case SC_HIDING:
- case SC_TWOHANDQUICKEN: /* 2HQ */
- case SC_ADRENALINE: /* アドレナリンラッシュ */
- case SC_ENCPOISON: /* エンチャントポイズン */
- case SC_IMPOSITIO: /* インポシティオマヌス */
- case SC_GLORIA: /* グロリア */
- case SC_LOUD: /* ラウドボイス */
- case SC_QUAGMIRE: /* クァグマイア */
- case SC_PROVIDENCE: /* プロヴィデンス */
- case SC_SPEARSQUICKEN: /* スピアクイッケン */
- case SC_VOLCANO:
- case SC_DELUGE:
- case SC_VIOLENTGALE:
- case SC_ETERNALCHAOS: /* エターナルカオス */
- case SC_DRUMBATTLE: /* 戦太鼓の響き */
- case SC_NIBELUNGEN: /* ニーベルングの指輪 */
- case SC_SIEGFRIED: /* 不死身のジークフリード */
- case SC_WHISTLE: /* 口笛 */
- case SC_ASSNCROS: /* 夕陽のアサシンクロス */
- case SC_HUMMING: /* ハミング */
- case SC_DONTFORGETME: /* 私を忘れないで */
- case SC_FORTUNE: /* 幸運のキス */
- case SC_SERVICE4U: /* サービスフォーユー */
- case SC_EXPLOSIONSPIRITS: // 爆裂波動
- case SC_STEELBODY: // 金剛
- case SC_DEFENDER:
- case SC_SPEEDPOTION0: /* 増速ポーション */
- case SC_SPEEDPOTION1:
- case SC_SPEEDPOTION2:
- case SC_APPLEIDUN: /* イドゥンの林檎 */
- case SC_RIDING:
- case SC_BLADESTOP_WAIT:
- case SC_AURABLADE: /* オーラブレード */
- case SC_PARRYING: /* パリイング */
- case SC_CONCENTRATION: /* コンセントレーション */
- case SC_TENSIONRELAX: /* テンションリラックス */
- case SC_ASSUMPTIO: /* アシャンプティオ */
- case SC_WINDWALK: /* ウインドウォーク */
- case SC_TRUESIGHT: /* トゥルーサイト */
- case SC_SPIDERWEB: /* スパイダーウェッブ */
- case SC_MAGICPOWER: /* 魔法力増幅 */
- case SC_CHASEWALK:
- case SC_ATKPOT: /* attack potion [Valaris] */
- case SC_MATKPOT: /* magic attack potion [Valaris] */
- case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか)
- case SC_MELTDOWN: /* メルトダウン */
- case SC_PHYS_SHIELD:
- case SC_HASTE:
- calc_flag = 1;
- break;
- case SC_BERSERK: /* バーサーク */
- calc_flag = 1;
- clif_status_change (bl, SC_INCREASEAGI, 0); /* アイコン消去 */
- break;
- case SC_DEVOTION: /* ディボーション */
- {
- struct map_session_data *md = map_id2sd (sc_data[type].val1);
- sc_data[type].val1 = sc_data[type].val2 = 0;
- skill_devotion (md, bl->id);
- calc_flag = 1;
- }
- break;
- case SC_BLADESTOP:
- {
- struct status_change *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);
-
- if (sc_data[type].val2 == 2)
- clif_bladestop ((struct block_list *) sc_data[type].val3,
- (struct block_list *) sc_data[type].val4,
- 0);
- }
- break;
- case SC_DANCING:
- {
- struct map_session_data *dsd;
- struct status_change *d_sc_data;
- if (sc_data[type].val4
- && (dsd = map_id2sd (sc_data[type].val4)))
- {
- d_sc_data = dsd->sc_data;
- //合奏で相手がいる場合相手のval4を0にする
- if (d_sc_data && d_sc_data[type].timer != -1)
- d_sc_data[type].val4 = 0;
- }
- }
- 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: //チャット禁止状態
- {
- struct map_session_data *sd = NULL;
- if (bl->type == BL_PC
- && (sd = (struct map_session_data *) bl))
- {
- sd->status.manner = 0;
- clif_updatestatus (sd, SP_MANNER);
- }
- }
- break;
- case SC_SPLASHER: /* ベナムスプラッシャー */
- {
- struct block_list *src = map_id2bl (sc_data[type].val3);
- if (src && tid != -1)
- {
- //自分にダメージ&周囲3*3にダメージ
- skill_castend_damage_id (src, bl, sc_data[type].val2,
- sc_data[type].val1, gettick (),
- 0);
- }
- }
- break;
- case SC_SELFDESTRUCTION: /* 自爆 */
- {
- //自分のダメージは0にして
- struct mob_data *md = NULL;
- if (bl->type == BL_MOB && (md = (struct mob_data *) bl))
- skill_castend_damage_id (bl, bl, sc_data[type].val2,
- sc_data[type].val1, gettick (),
- 0);
- }
- break;
- /* option1 */
- case SC_FREEZE:
- sc_data[type].val3 = 0;
- break;
-
- /* option2 */
- case SC_POISON: /* 毒 */
- case SC_BLIND: /* 暗黒 */
- case SC_CURSE:
- calc_flag = 1;
- break;
- }
-
- if (bl->type == BL_PC && type < SC_SENDMAX)
- clif_status_change (bl, type, 0); /* アイコン消去 */
- switch (type)
- { /* 正常に戻るときなにか処理が必要 */
- case SC_STONE:
- case SC_FREEZE:
- case SC_STAN:
- case SC_SLEEP:
- *opt1 = 0;
- opt_flag = 1;
- break;
-
- case SC_POISON:
- case SC_CURSE:
- case SC_SILENCE:
- case SC_BLIND:
- *opt2 &= ~(1 << (type - SC_POISON));
- opt_flag = 1;
- break;
-
- case SC_SLOWPOISON:
- if (sc_data[SC_POISON].timer != -1)
- *opt2 |= 0x1;
- *opt2 &= ~0x200;
- opt_flag = 1;
- break;
-
- case SC_SIGNUMCRUCIS:
- *opt2 &= ~0x40;
- opt_flag = 1;
- break;
-
- case SC_SPEEDPOTION0:
- *opt2 &= ~0x20;
- opt_flag = 1;
- break;
+ if (opt_flag) /* optionの変更を伝える */
+ clif_changeoption(bl);
- case SC_ATKPOT:
- *opt2 &= ~0x80;
- opt_flag = 1;
- break;
-
- case SC_HIDING:
- case SC_CLOAKING:
- *option &= ~((type == SC_HIDING) ? 2 : 4);
- opt_flag = 1;
- break;
-
- case SC_CHASEWALK:
- *option &= ~16388;
- opt_flag = 1;
- break;
-
- case SC_SIGHT:
- *option &= ~1;
- opt_flag = 1;
- break;
- case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか)
- *option &= ~4096;
- opt_flag = 1;
- break;
- case SC_RUWACH:
- *option &= ~8192;
- opt_flag = 1;
- break;
-
- //opt3
- case SC_TWOHANDQUICKEN: /* 2HQ */
- case SC_SPEARSQUICKEN: /* スピアクイッケン */
- case SC_CONCENTRATION: /* コンセントレーション */
- *opt3 &= ~1;
- break;
- case SC_OVERTHRUST: /* オーバースラスト */
- *opt3 &= ~2;
- break;
- case SC_ENERGYCOAT: /* エナジーコート */
- *opt3 &= ~4;
- break;
- case SC_EXPLOSIONSPIRITS: // 爆裂波動
- *opt3 &= ~8;
- break;
- case SC_STEELBODY: // 金剛
- *opt3 &= ~16;
- break;
- case SC_BLADESTOP: /* 白刃取り */
- *opt3 &= ~32;
- break;
- case SC_BERSERK: /* バーサーク */
- *opt3 &= ~128;
- break;
- case SC_MARIONETTE: /* マリオネットコントロール */
- *opt3 &= ~1024;
- break;
- case SC_ASSUMPTIO: /* アスムプティオ */
- *opt3 &= ~2048;
- break;
- }
-
- if (night_flag == 1 && (*opt2 & STATE_BLIND) == 0
- && bl->type == BL_PC)
- { // by [Yor]
- *opt2 |= STATE_BLIND;
- opt_flag = 1;
- }
-
- if (opt_flag) /* optionの変更を伝える */
- clif_changeoption (bl);
-
- if (bl->type == BL_PC && calc_flag)
- pc_calcstatus ((struct map_session_data *) bl, 0); /* ステータス再計算 */
- }
-
- return 0;
+ if (bl->type == BL::PC && calc_flag)
+ pc_calcstatus((struct map_session_data *) bl, 0); /* ステータス再計算 */
}
-int skill_update_heal_animation (struct map_session_data *sd)
+int skill_update_heal_animation(struct map_session_data *sd)
{
- const int mask = 0x100;
- int was_active;
- int is_active;
+ const Opt2 mask = Opt2::_heal;
- nullpo_retr (0, sd);
- was_active = sd->opt2 & mask;
- is_active = sd->quick_regeneration_hp.amount > 0;
+ nullpo_ret(sd);
+ bool was_active = bool(sd->opt2 & mask);
+ bool is_active = sd->quick_regeneration_hp.amount > 0;
- if ((was_active && is_active) || (!was_active && !is_active))
+ if (was_active == is_active)
return 0; // no update
if (is_active)
@@ -9463,280 +875,61 @@ int skill_update_heal_animation (struct map_session_data *sd)
else
sd->opt2 &= ~mask;
- return clif_changeoption (&sd->bl);
+ return clif_changeoption(&sd->bl);
}
/*==========================================
* ステータス異常終了タイマー
*------------------------------------------
*/
-void skill_status_change_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
+void skill_status_change_timer(TimerData *tid, tick_t tick, int id, StatusChange type)
{
- int type = data;
struct block_list *bl;
struct map_session_data *sd = NULL;
- struct status_change *sc_data;
+ eptr<struct status_change, StatusChange> sc_data;
//short *sc_count; //使ってない?
- if ((bl = map_id2bl (id)) == NULL)
- return; //該当IDがすでに消滅しているというのはいかにもありそうなのでスルーしてみる
- nullpo_retv (sc_data = battle_get_sc_data (bl));
+ if ((bl = map_id2bl(id)) == NULL)
+ return;
+ //該当IDがすでに消滅しているというのはいかにもありそうなのでスルーしてみる
+ sc_data = battle_get_sc_data(bl);
+ if (not sc_data)
+ return;
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
sd = (struct map_session_data *) bl;
//sc_count=battle_get_sc_count(bl); //使ってない?
- if (sc_data[type].timer != tid)
- {
- if (battle_config.error_log)
- printf ("skill_status_change_timer %d != %d\n", tid,
- sc_data[type].timer);
- }
-
if (sc_data[type].spell_invocation)
{ // Must report termination
- spell_effect_report_termination (sc_data[type].spell_invocation,
+ spell_effect_report_termination(sc_data[type].spell_invocation,
bl->id, type, 0);
sc_data[type].spell_invocation = 0;
}
switch (type)
- { /* 特殊な処理になる場合 */
- case SC_MAXIMIZEPOWER: /* マキシマイズパワー */
- case SC_CLOAKING: /* クローキング */
- case SC_CHASEWALK:
- if (sd)
- {
- if (sd->status.sp > 0)
- { /* SP切れるまで持続 */
- sd->status.sp--;
- clif_updatestatus (sd, SP_SP);
- sc_data[type].timer = add_timer ( /* タイマー再設定 */
- sc_data[type].val2 +
- tick,
- skill_status_change_timer,
- bl->id, data);
- return;
- }
- }
- break;
-
- case SC_HIDING: /* ハイディング */
- if (sd)
- { /* SPがあって、時間制限の間は持続 */
- if (sd->status.sp > 0 && (--sc_data[type].val2) > 0)
- {
- if (sc_data[type].val2 % (sc_data[type].val1 + 3) == 0)
- {
- sd->status.sp--;
- clif_updatestatus (sd, SP_SP);
- }
- sc_data[type].timer = add_timer ( /* タイマー再設定 */
- 1000 + tick,
- skill_status_change_timer,
- bl->id, data);
- return;
- }
- }
- break;
-
- case SC_SIGHT: /* サイト */
- {
- const int range = 7;
- map_foreachinarea (skill_status_change_timer_sub,
- bl->m, bl->x - range, bl->y - range,
- bl->x + range, bl->y + range, 0, bl, type,
- tick);
-
- 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_RUWACH: /* ルアフ */
- {
- const int range = 5;
- map_foreachinarea (skill_status_change_timer_sub,
- bl->m, bl->x - range, bl->y - range,
- bl->x + range, bl->y + range, 0, bl, type,
- tick);
-
- 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: /* シグナムクルシス */
- {
- int race = battle_get_race (bl);
- if (race == 6
- || battle_check_undead (race, battle_get_elem_type (bl)))
- {
- sc_data[type].timer =
- add_timer (1000 * 600 + tick, skill_status_change_timer,
- bl->id, data);
- return;
- }
- }
- break;
-
- case SC_PROVOKE: /* プロボック/オートバーサーク */
- if (sc_data[type].val2 != 0)
- { /* オートバーサーク(1秒ごとにHPチェック) */
- if (sd && sd->status.hp > sd->status.max_hp >> 2) /* 停止 */
- break;
- sc_data[type].timer =
- add_timer (1000 + tick, skill_status_change_timer, bl->id,
- data);
- return;
- }
- 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, 0);
- 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)
- {
- sc_data[type].timer =
- add_timer (1000 * 600 + tick, skill_status_change_timer,
- bl->id, data);
- sc_data[type].val2 = 1;
- return;
- }
- break;
-
- case SC_DISSONANCE: /* 不協和音 */
- if ((--sc_data[type].val2) > 0)
- {
- struct skill_unit *unit =
- (struct skill_unit *) sc_data[type].val4;
- struct block_list *src;
-
- if (!unit || !unit->group)
- break;
- src = map_id2bl (unit->group->src_id);
- if (!src)
- break;
- skill_attack (BF_MISC, src, &unit->bl, bl,
- unit->group->skill_id, sc_data[type].val1, tick,
- 0);
- sc_data[type].timer =
- add_timer (skill_get_time2
- (unit->group->skill_id,
- unit->group->skill_lv) + tick,
- skill_status_change_timer, bl->id, data);
- return;
- }
- break;
-
- case SC_LULLABY: /* 子守唄 */
- if ((--sc_data[type].val2) > 0)
- {
- struct skill_unit *unit =
- (struct skill_unit *) sc_data[type].val4;
- if (!unit || !unit->group || unit->group->src_id == bl->id)
- break;
- skill_additional_effect (bl, bl, unit->group->skill_id,
- sc_data[type].val1,
- BF_LONG | BF_SKILL | BF_MISC, tick);
- sc_data[type].timer =
- add_timer (skill_get_time
- (unit->group->skill_id,
- unit->group->skill_lv) / 10 + tick,
- skill_status_change_timer, bl->id, data);
- return;
- }
- break;
-
- case SC_STONE:
- if (sc_data[type].val2 != 0)
- {
- short *opt1 = battle_get_opt1 (bl);
- sc_data[type].val2 = 0;
- sc_data[type].val4 = 0;
- battle_stopwalking (bl, 1);
- if (opt1)
- {
- *opt1 = 1;
- clif_changeoption (bl);
- }
- sc_data[type].timer =
- add_timer (1000 + tick, skill_status_change_timer, bl->id,
- data);
- return;
- }
- else if ((--sc_data[type].val3) > 0)
- {
- int hp = battle_get_max_hp (bl);
- if ((++sc_data[type].val4) % 5 == 0
- && battle_get_hp (bl) > hp >> 2)
- {
- hp = hp / 100;
- if (hp < 1)
- hp = 1;
- if (bl->type == BL_PC)
- pc_heal ((struct map_session_data *) bl, -hp, 0);
- else if (bl->type == BL_MOB)
- {
- struct mob_data *md;
- if ((md = ((struct mob_data *) bl)) == NULL)
- break;
- md->hp -= hp;
- }
- }
- sc_data[type].timer =
- add_timer (1000 + tick, skill_status_change_timer, bl->id,
- data);
- return;
- }
- break;
- case SC_POISON:
- if (sc_data[SC_SLOWPOISON].timer == -1)
+ {
+ case StatusChange::SC_POISON:
+ if (!sc_data[StatusChange::SC_SLOWPOISON].timer)
{
const int resist_poison =
- skill_power_bl (bl, TMW_RESIST_POISON) >> 3;
+ skill_power_bl(bl, SkillID::TMW_RESIST_POISON) >> 3;
if (resist_poison)
- sc_data[type].val1 -= MRAND (resist_poison + 1);
+ sc_data[type].val1 -= random_::in(0, resist_poison);
if ((--sc_data[type].val1) > 0)
{
- int hp = battle_get_max_hp (bl);
- if (battle_get_hp (bl) > hp >> 4)
+ int hp = battle_get_max_hp(bl);
+ if (battle_get_hp(bl) > hp >> 4)
{
- if (bl->type == BL_PC)
+ if (bl->type == BL::PC)
{
hp = 3 + hp * 3 / 200;
- pc_heal ((struct map_session_data *) bl, -hp, 0);
+ pc_heal((struct map_session_data *) bl, -hp, 0);
}
- else if (bl->type == BL_MOB)
+ else if (bl->type == BL::MOB)
{
struct mob_data *md;
if ((md = ((struct mob_data *) bl)) == NULL)
@@ -9745,1064 +938,224 @@ void skill_status_change_timer (timer_id tid, tick_t tick, custom_id_t id, custo
md->hp -= hp;
}
}
- sc_data[type].timer =
- add_timer (1000 + tick, skill_status_change_timer,
- bl->id, data);
+ sc_data[type].timer = Timer(tick + std::chrono::seconds(1),
+ std::bind(skill_status_change_timer, ph::_1, ph::_2,
+ bl->id, type));
+ return;
}
}
else
- sc_data[type].timer =
- add_timer (2000 + tick, skill_status_change_timer, bl->id,
- data);
- break;
-
- case SC_TENSIONRELAX: /* テンションリラックス */
- if (sd)
- { /* SPがあって、HPが満タンでなければ継続 */
- if (sd->status.sp > 12 && sd->status.max_hp > sd->status.hp)
- {
- if (sc_data[type].val2 % (sc_data[type].val1 + 3) == 0)
- {
- sd->status.sp -= 12;
- clif_updatestatus (sd, SP_SP);
- }
- sc_data[type].timer = add_timer ( /* タイマー再設定 */
- 10000 + tick,
- skill_status_change_timer,
- bl->id, data);
- return;
- }
- if (sd->status.max_hp <= sd->status.hp)
- skill_status_change_end (&sd->bl, SC_TENSIONRELAX, -1);
+ {
+ sc_data[type].timer = Timer(tick + std::chrono::seconds(2),
+ std::bind(skill_status_change_timer, ph::_1, ph::_2,
+ bl->id, type));
+ return;
}
break;
+ // If you manually reschedule the timer, you MUST skip the
+ // call to skill_status_change_end below.
/* 時間切れ無し?? */
- case SC_AETERNA:
- case SC_TRICKDEAD:
- case SC_RIDING:
- case SC_FALCON:
- case SC_WEIGHT50:
- case SC_WEIGHT90:
- case SC_MAGICPOWER: /* 魔法力増幅 */
- case SC_REJECTSWORD: /* リジェクトソード */
- case SC_MEMORIZE: /* メモライズ */
- case SC_BROKNWEAPON:
- case SC_BROKNARMOR:
- if (sc_data[type].timer == tid)
- sc_data[type].timer =
- add_timer (1000 * 600 + tick, skill_status_change_timer,
- bl->id, data);
+ case StatusChange::SC_WEIGHT50:
+ case StatusChange::SC_WEIGHT90:
+ case StatusChange::SC_BROKNWEAPON:
+ case StatusChange::SC_BROKNARMOR:
+ sc_data[type].timer = Timer(tick + std::chrono::minutes(10),
+ std::bind(skill_status_change_timer, ph::_1, ph::_2,
+ bl->id, type));
return;
- case SC_DANCING: //ダンススキルの時間SP消費
- {
- int s = 0;
- if (sd)
- {
- if (sd->status.sp > 0 && (--sc_data[type].val3) > 0)
- {
- switch (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--;
- clif_updatestatus (sd, SP_SP);
- }
- sc_data[type].timer = add_timer ( /* タイマー再設定 */
- 1000 + tick,
- skill_status_change_timer,
- bl->id, data);
- return;
- }
- }
- }
- break;
- case SC_BERSERK: /* バーサーク */
- if (sd)
- { /* HPが100以上なら継続 */
- if ((sd->status.hp - sd->status.hp / 100) > 100)
- {
- sd->status.hp -= sd->status.hp / 100;
- clif_updatestatus (sd, SP_HP);
- sc_data[type].timer = add_timer ( /* タイマー再設定 */
- 15000 + tick,
- skill_status_change_timer,
- bl->id, data);
- return;
- }
- }
- break;
- case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか)
- if (sd)
- {
- time_t timer;
- if (time (&timer) < ((sc_data[type].val2) + 3600))
- { //1時間たっていないので継続
- sc_data[type].timer = add_timer ( /* タイマー再設定 */
- 10000 + tick,
- skill_status_change_timer,
- bl->id, data);
- return;
- }
- }
- break;
- case SC_NOCHAT: //チャット禁止状態
- if (sd && battle_config.muting_players)
- {
- time_t timer;
- if ((++sd->status.manner)
- && time (&timer) <
- ((sc_data[type].val2) + 60 * (0 - sd->status.manner)))
- { //開始からstatus.manner分経ってないので継続
- clif_updatestatus (sd, SP_MANNER);
- sc_data[type].timer = add_timer ( /* タイマー再設定(60秒) */
- 60000 + tick,
- skill_status_change_timer,
- bl->id, data);
- return;
- }
- }
- break;
- case SC_SELFDESTRUCTION: /* 自爆 */
- if (--sc_data[type].val3 > 0)
- {
- struct mob_data *md;
- if (bl->type == BL_MOB && (md = (struct mob_data *) bl)
- && md->stats[MOB_SPEED] > 250)
- {
- md->stats[MOB_SPEED] -= 250;
- md->next_walktime = tick;
- }
- sc_data[type].timer = add_timer ( /* タイマー再設定 */
- 1000 + tick,
- skill_status_change_timer,
- bl->id, data);
- return;
- }
- break;
-
- case SC_FLYING_BACKPACK:
- clif_updatestatus (sd, SP_WEIGHT);
+ case StatusChange::SC_FLYING_BACKPACK:
+ clif_updatestatus(sd, SP::WEIGHT);
break;
}
- skill_status_change_end (bl, type, tid);
-}
-
-/*==========================================
- * ステータス異常終了
- *------------------------------------------
- */
-int skill_encchant_eremental_end (struct block_list *bl, int type)
-{
- struct status_change *sc_data;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, sc_data = battle_get_sc_data (bl));
-
- if (type != SC_ENCPOISON && sc_data[SC_ENCPOISON].timer != -1) /* エンチャントポイズン解除 */
- skill_status_change_end (bl, SC_ENCPOISON, -1);
- if (type != SC_ASPERSIO && sc_data[SC_ASPERSIO].timer != -1) /* アスペルシオ解除 */
- skill_status_change_end (bl, SC_ASPERSIO, -1);
- if (type != SC_FLAMELAUNCHER && sc_data[SC_FLAMELAUNCHER].timer != -1) /* フレイムランチャ解除 */
- skill_status_change_end (bl, SC_FLAMELAUNCHER, -1);
- if (type != SC_FROSTWEAPON && sc_data[SC_FROSTWEAPON].timer != -1) /* フロストウェポン解除 */
- skill_status_change_end (bl, SC_FROSTWEAPON, -1);
- if (type != SC_LIGHTNINGLOADER && sc_data[SC_LIGHTNINGLOADER].timer != -1) /* ライトニングローダー解除 */
- skill_status_change_end (bl, SC_LIGHTNINGLOADER, -1);
- if (type != SC_SEISMICWEAPON && sc_data[SC_SEISMICWEAPON].timer != -1) /* サイスミックウェポン解除 */
- skill_status_change_end (bl, SC_SEISMICWEAPON, -1);
-
- return 0;
+ skill_status_change_end(bl, type, tid);
}
/*==========================================
* ステータス異常開始
*------------------------------------------
*/
-int skill_status_change_start (struct block_list *bl, int type, int val1,
- int val2, int val3, int val4, int tick,
- int flag)
+int skill_status_change_start(struct block_list *bl, StatusChange type,
+ int val1,
+ interval_t tick)
{
- return skill_status_effect (bl, type, val1, val2, val3, val4, tick, flag,
- 0);
+ return skill_status_effect(bl, type, val1, tick, 0);
}
-int skill_status_effect (struct block_list *bl, int type, int val1, int val2,
- int val3, int val4, int tick, int flag,
- int spell_invocation)
+int skill_status_effect(struct block_list *bl, StatusChange type,
+ int val1,
+ interval_t tick, int spell_invocation)
{
struct map_session_data *sd = NULL;
- struct status_change *sc_data;
- short *sc_count, *option, *opt1, *opt2, *opt3;
- int opt_flag = 0, calc_flag = 0, updateflag =
- 0, race, mode, elem, undead_flag;
- int scdef = 0;
-
- nullpo_retr (0, bl);
- if (bl->type == BL_SKILL)
- return 0;
- nullpo_retr (0, sc_data = battle_get_sc_data (bl));
- nullpo_retr (0, sc_count = battle_get_sc_count (bl));
- nullpo_retr (0, option = battle_get_option (bl));
- nullpo_retr (0, opt1 = battle_get_opt1 (bl));
- nullpo_retr (0, opt2 = battle_get_opt2 (bl));
- nullpo_retr (0, opt3 = battle_get_opt3 (bl));
-
- race = battle_get_race (bl);
- mode = battle_get_mode (bl);
- elem = battle_get_elem_type (bl);
- undead_flag = battle_check_undead (race, elem);
-
- if (type == SC_AETERNA
- && (sc_data[SC_STONE].timer != -1 || sc_data[SC_FREEZE].timer != -1))
- return 0;
+ eptr<struct status_change, StatusChange> sc_data;
+ short *sc_count;
+ Option *option;
+ Opt1 *opt1;
+ Opt2 *opt2;
+ Opt3 *opt3;
+ int opt_flag = 0, calc_flag = 0;
+ SP updateflag = SP::ZERO;
+ int scdef = 0;
+
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (not sc_data)
+ return 0;
+ sc_count = battle_get_sc_count(bl);
+ nullpo_ret(sc_count);
+ option = battle_get_option(bl);
+ nullpo_ret(option);
+ opt1 = battle_get_opt1(bl);
+ nullpo_ret(opt1);
+ opt2 = battle_get_opt2(bl);
+ nullpo_ret(opt2);
+ opt3 = battle_get_opt3(bl);
+ nullpo_ret(opt3);
switch (type)
{
- case SC_STONE:
- case SC_FREEZE:
- scdef = 3 + battle_get_mdef (bl) + battle_get_luk (bl) / 3;
- break;
- case SC_STAN:
- case SC_SILENCE:
- case SC_POISON:
- scdef = 3 + battle_get_vit (bl) + battle_get_luk (bl) / 3;
- break;
- case SC_SLEEP:
- case SC_BLIND:
- scdef = 3 + battle_get_int (bl) + battle_get_luk (bl) / 3;
+ case StatusChange::SC_POISON:
+ scdef = 3 + battle_get_vit(bl) + battle_get_luk(bl) / 3;
break;
- case SC_CURSE:
- scdef = 3 + battle_get_luk (bl);
- break;
-
-// case SC_CONFUSION:
- default:
- scdef = 0;
}
if (scdef >= 100)
return 0;
- if (bl->type == BL_PC)
+ 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)))
- return 0;
-
- if (SC_STONE <= type && type <= SC_BLIND)
- { /* カードによる耐性 */
- if (sd && sd->reseff[type - SC_STONE] > 0
- && MRAND (10000) < sd->reseff[type - SC_STONE])
- {
- if (battle_config.battle_log)
- printf ("PC %d skill_sc_start: cardによる異常耐性発動\n",
- sd->bl.id);
- return 0;
- }
- }
}
- else if (bl->type == BL_MOB)
+ else if (bl->type == BL::MOB)
{
}
else
{
if (battle_config.error_log)
- printf ("skill_status_change_start: neither MOB nor PC !\n");
+ PRINTF("skill_status_change_start: neither MOB nor PC !\n");
return 0;
}
- if (type == SC_FREEZE && undead_flag && !(flag & 1))
- return 0;
-
- if ((type == SC_ADRENALINE || type == SC_WEAPONPERFECTION
- || type == SC_OVERTHRUST) && sc_data[type].timer != -1
- && sc_data[type].val2 && !val2)
- return 0;
-
- if (mode & 0x20 && (type == SC_STONE || type == SC_FREEZE ||
- type == SC_STAN || type == SC_SLEEP
- || type == SC_SILENCE || type == SC_QUAGMIRE
- || type == SC_DECREASEAGI || type == SC_SIGNUMCRUCIS
- || type == SC_PROVOKE || (type == SC_BLESSING
- && (undead_flag
- || race == 6)))
- && !(flag & 1))
- {
- /* ボスには効かない(ただしカードによる効果は適用される) */
- return 0;
- }
- if (type == SC_FREEZE || type == SC_STAN || type == SC_SLEEP)
- battle_stopwalking (bl, 1);
-
- if (sc_data[type].timer != -1)
+ if (sc_data[type].timer)
{ /* すでに同じ異常になっている場合タイマ解除 */
- 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 != StatusChange::SC_SPEEDPOTION0
+ && type != StatusChange::SC_ATKPOT
+ && type != StatusChange::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
+ if (type == StatusChange::SC_POISON)
+ return 0;
+
+ /* 継ぎ足しができない状態異常である時は状態異常を行わない */
{
(*sc_count)--;
- delete_timer (sc_data[type].timer, skill_status_change_timer);
- sc_data[type].timer = -1;
+ sc_data[type].timer.cancel();
}
}
switch (type)
- { /* 異常の種類ごとの処理 */
- case SC_PROVOKE: /* プロボック */
- calc_flag = 1;
- if (tick <= 0)
- tick = 1000; /* (オートバーサーク) */
- break;
- case SC_ENDURE: /* インデュア */
- if (tick <= 0)
- tick = 1000 * 60;
- break;
- case SC_CONCENTRATE: /* 集中力向上 */
- calc_flag = 1;
- break;
- case SC_BLESSING: /* ブレッシング */
- {
- if (bl->type == BL_PC || (!undead_flag && race != 6))
- {
- if (sc_data[SC_CURSE].timer != -1)
- skill_status_change_end (bl, SC_CURSE, -1);
- if (sc_data[SC_STONE].timer != -1
- && sc_data[SC_STONE].val2 == 0)
- skill_status_change_end (bl, SC_STONE, -1);
- }
- calc_flag = 1;
- }
- break;
- case SC_ANGELUS: /* アンゼルス */
- calc_flag = 1;
- break;
- case SC_INCREASEAGI: /* 速度上昇 */
- calc_flag = 1;
- if (sc_data[SC_DECREASEAGI].timer != -1)
- skill_status_change_end (bl, SC_DECREASEAGI, -1);
- if (sc_data[SC_WINDWALK].timer != -1) /* ウインドウォーク */
- skill_status_change_end (bl, SC_WINDWALK, -1);
- break;
- case SC_DECREASEAGI: /* 速度減少 */
- calc_flag = 1;
- if (sc_data[SC_INCREASEAGI].timer != -1)
- skill_status_change_end (bl, SC_INCREASEAGI, -1);
- break;
- case SC_SIGNUMCRUCIS: /* シグナムクルシス */
- calc_flag = 1;
-// val2 = 14 + val1;
- val2 = 10 + val1 * 2;
- tick = 600 * 1000;
- clif_emotion (bl, 4);
- break;
- case SC_SLOWPOISON:
- if (sc_data[SC_POISON].timer == -1)
+ {
+ /* 異常の種類ごとの処理 */
+ case StatusChange::SC_SLOWPOISON:
+ if (!sc_data[StatusChange::SC_POISON].timer)
return 0;
break;
- case SC_TWOHANDQUICKEN: /* 2HQ */
- *opt3 |= 1;
- calc_flag = 1;
- break;
- case SC_ADRENALINE: /* アドレナリンラッシュ */
- calc_flag = 1;
- break;
- case SC_WEAPONPERFECTION: /* ウェポンパーフェクション */
- if (battle_config.party_skill_penaly && !val2)
- tick /= 5;
- break;
- case SC_OVERTHRUST: /* オーバースラスト */
- *opt3 |= 2;
- if (battle_config.party_skill_penaly && !val2)
- tick /= 10;
- break;
- case SC_MAXIMIZEPOWER: /* マキシマイズパワー(SPが1減る時間,val2にも) */
- if (bl->type == BL_PC)
- val2 = tick;
- else
- tick = 5000 * val1;
- break;
- case SC_ENCPOISON: /* エンチャントポイズン */
- calc_flag = 1;
- val2 = (((val1 - 1) / 2) + 3) * 100; /* 毒付与確率 */
- skill_encchant_eremental_end (bl, SC_ENCPOISON);
- break;
- case SC_POISONREACT: /* ポイズンリアクト */
- break;
- case SC_IMPOSITIO: /* インポシティオマヌス */
- calc_flag = 1;
- break;
- case SC_ASPERSIO: /* アスペルシオ */
- skill_encchant_eremental_end (bl, SC_ASPERSIO);
- break;
- case SC_SUFFRAGIUM: /* サフラギム */
- case SC_BENEDICTIO: /* 聖体 */
- case SC_MAGNIFICAT: /* マグニフィカート */
- case SC_AETERNA: /* エーテルナ */
- break;
- case SC_ENERGYCOAT: /* エナジーコート */
- *opt3 |= 4;
- break;
- case SC_MAGICROD:
- val2 = val1 * 20;
- break;
- case SC_KYRIE: /* キリエエレイソン */
- val2 = battle_get_max_hp (bl) * (val1 * 2 + 10) / 100; /* 耐久度 */
- val3 = (val1 / 2 + 5); /* 回数 */
-// -- moonsoul (added to undo assumptio status if target has it)
- if (sc_data[SC_ASSUMPTIO].timer != -1)
- skill_status_change_end (bl, SC_ASSUMPTIO, -1);
- break;
- case SC_MINDBREAKER:
- calc_flag = 1;
- if (tick <= 0)
- tick = 1000; /* (オートバーサーク) */
- case SC_GLORIA: /* グロリア */
- calc_flag = 1;
- break;
- case SC_LOUD: /* ラウドボイス */
- calc_flag = 1;
- break;
- case SC_TRICKDEAD: /* 死んだふり */
- break;
- case SC_QUAGMIRE: /* クァグマイア */
- calc_flag = 1;
- if (sc_data[SC_CONCENTRATE].timer != -1) /* 集中力向上解除 */
- skill_status_change_end (bl, SC_CONCENTRATE, -1);
- if (sc_data[SC_INCREASEAGI].timer != -1) /* 速度上昇解除 */
- skill_status_change_end (bl, SC_INCREASEAGI, -1);
- if (sc_data[SC_TWOHANDQUICKEN].timer != -1)
- skill_status_change_end (bl, SC_TWOHANDQUICKEN, -1);
- if (sc_data[SC_SPEARSQUICKEN].timer != -1)
- skill_status_change_end (bl, SC_SPEARSQUICKEN, -1);
- if (sc_data[SC_ADRENALINE].timer != -1)
- skill_status_change_end (bl, SC_ADRENALINE, -1);
- if (sc_data[SC_LOUD].timer != -1)
- skill_status_change_end (bl, SC_LOUD, -1);
- if (sc_data[SC_TRUESIGHT].timer != -1) /* トゥルーサイト */
- skill_status_change_end (bl, SC_TRUESIGHT, -1);
- if (sc_data[SC_WINDWALK].timer != -1) /* ウインドウォーク */
- skill_status_change_end (bl, SC_WINDWALK, -1);
- if (sc_data[SC_CARTBOOST].timer != -1) /* カートブースト */
- skill_status_change_end (bl, SC_CARTBOOST, -1);
- break;
- case SC_FLAMELAUNCHER: /* フレームランチャー */
- skill_encchant_eremental_end (bl, SC_FLAMELAUNCHER);
- break;
- case SC_FROSTWEAPON: /* フロストウェポン */
- skill_encchant_eremental_end (bl, SC_FROSTWEAPON);
- break;
- case SC_LIGHTNINGLOADER: /* ライトニングローダー */
- skill_encchant_eremental_end (bl, SC_LIGHTNINGLOADER);
- break;
- case SC_SEISMICWEAPON: /* サイズミックウェポン */
- skill_encchant_eremental_end (bl, SC_SEISMICWEAPON);
- break;
- case SC_DEVOTION: /* ディボーション */
- calc_flag = 1;
- break;
- case SC_PROVIDENCE: /* プロヴィデンス */
- calc_flag = 1;
- val2 = val1 * 5;
- break;
- case SC_REFLECTSHIELD:
- val2 = 10 + val1 * 3;
- break;
- case SC_STRIPWEAPON:
- case SC_STRIPSHIELD:
- case SC_STRIPARMOR:
- case SC_STRIPHELM:
- case SC_CP_WEAPON:
- case SC_CP_SHIELD:
- case SC_CP_ARMOR:
- case SC_CP_HELM:
- break;
-
- case SC_AUTOSPELL: /* オートスペル */
- val4 = 5 + val1 * 2;
- break;
-
- case SC_VOLCANO:
- calc_flag = 1;
- val3 = val1 * 10;
- val4 =
- val1 >= 5 ? 20 : (val1 ==
- 4 ? 19 : (val1 ==
- 3 ? 17 : (val1 == 2 ? 14 : 10)));
- break;
- case SC_DELUGE:
- calc_flag = 1;
- val3 =
- val1 >= 5 ? 15 : (val1 ==
- 4 ? 14 : (val1 ==
- 3 ? 12 : (val1 == 2 ? 9 : 5)));
- val4 =
- val1 >= 5 ? 20 : (val1 ==
- 4 ? 19 : (val1 ==
- 3 ? 17 : (val1 == 2 ? 14 : 10)));
- break;
- case SC_VIOLENTGALE:
- calc_flag = 1;
- val3 = val1 * 3;
- val4 =
- val1 >= 5 ? 20 : (val1 ==
- 4 ? 19 : (val1 ==
- 3 ? 17 : (val1 == 2 ? 14 : 10)));
- break;
- case SC_SPEARSQUICKEN: /* スピアクイッケン */
- calc_flag = 1;
- val2 = 20 + val1;
- *opt3 |= 1;
- break;
- case SC_COMBO:
- break;
- case SC_BLADESTOP_WAIT: /* 白刃取り(待ち) */
- break;
- case SC_BLADESTOP: /* 白刃取り */
- if (val2 == 2)
- clif_bladestop ((struct block_list *) val3,
- (struct block_list *) val4, 1);
- *opt3 |= 32;
- break;
-
- case SC_LULLABY: /* 子守唄 */
- val2 = 11;
- break;
- case SC_RICHMANKIM:
- break;
- case SC_ETERNALCHAOS: /* エターナルカオス */
- calc_flag = 1;
- break;
- case SC_DRUMBATTLE: /* 戦太鼓の響き */
- calc_flag = 1;
- val2 = (val1 + 1) * 25;
- val3 = (val1 + 1) * 2;
- break;
- case SC_NIBELUNGEN: /* ニーベルングの指輪 */
- calc_flag = 1;
- val2 = (val1 + 2) * 50;
- val3 = (val1 + 2) * 25;
- break;
- case SC_ROKISWEIL: /* ロキの叫び */
- break;
- case SC_INTOABYSS: /* 深淵の中に */
- break;
- case SC_SIEGFRIED: /* 不死身のジークフリード */
+ case StatusChange::SC_SPEEDPOTION0: /* 増速ポーション */
+ *opt2 |= Opt2::_speedpotion0;
calc_flag = 1;
- val2 = 40 + val1 * 5;
- val3 = val1 * 10;
- break;
- case SC_DISSONANCE: /* 不協和音 */
- val2 = 10;
- break;
- case SC_WHISTLE: /* 口笛 */
- calc_flag = 1;
- break;
- case SC_ASSNCROS: /* 夕陽のアサシンクロス */
- calc_flag = 1;
- break;
- case SC_POEMBRAGI: /* ブラギの詩 */
- break;
- case SC_APPLEIDUN: /* イドゥンの林檎 */
- calc_flag = 1;
- break;
- case SC_UGLYDANCE: /* 自分勝手なダンス */
- val2 = 10;
- break;
- case SC_HUMMING: /* ハミング */
- calc_flag = 1;
- break;
- case SC_DONTFORGETME: /* 私を忘れないで */
- calc_flag = 1;
- if (sc_data[SC_INCREASEAGI].timer != -1) /* 速度上昇解除 */
- skill_status_change_end (bl, SC_INCREASEAGI, -1);
- if (sc_data[SC_TWOHANDQUICKEN].timer != -1)
- skill_status_change_end (bl, SC_TWOHANDQUICKEN, -1);
- if (sc_data[SC_SPEARSQUICKEN].timer != -1)
- skill_status_change_end (bl, SC_SPEARSQUICKEN, -1);
- if (sc_data[SC_ADRENALINE].timer != -1)
- skill_status_change_end (bl, SC_ADRENALINE, -1);
- if (sc_data[SC_ASSNCROS].timer != -1)
- skill_status_change_end (bl, SC_ASSNCROS, -1);
- if (sc_data[SC_TRUESIGHT].timer != -1) /* トゥルーサイト */
- skill_status_change_end (bl, SC_TRUESIGHT, -1);
- if (sc_data[SC_WINDWALK].timer != -1) /* ウインドウォーク */
- skill_status_change_end (bl, SC_WINDWALK, -1);
- if (sc_data[SC_CARTBOOST].timer != -1) /* カートブースト */
- skill_status_change_end (bl, SC_CARTBOOST, -1);
- break;
- case SC_FORTUNE: /* 幸運のキス */
- calc_flag = 1;
- break;
- case SC_SERVICE4U: /* サービスフォーユー */
- calc_flag = 1;
- break;
- case SC_DANCING: /* ダンス/演奏中 */
- calc_flag = 1;
- val3 = tick / 1000;
- tick = 1000;
- break;
-
- case SC_EXPLOSIONSPIRITS: // 爆裂波動
- calc_flag = 1;
- val2 = 75 + 25 * val1;
- *opt3 |= 8;
- break;
- case SC_STEELBODY: // 金剛
- calc_flag = 1;
- *opt3 |= 16;
- break;
- case SC_EXTREMITYFIST: /* 阿修羅覇凰拳 */
- break;
- case SC_AUTOCOUNTER:
- val3 = val4 = 0;
- break;
-
- case SC_SPEEDPOTION0: /* 増速ポーション */
- *opt2 |= 0x20;
- case SC_SPEEDPOTION1:
- case SC_SPEEDPOTION2:
- calc_flag = 1;
- tick = 1000 * tick;
-// val2 = 5*(2+type-SC_SPEEDPOTION0);
+// val2 = 5*(2+type-StatusChange::SC_SPEEDPOTION0);
break;
/* atk & matk potions [Valaris] */
- case SC_ATKPOT:
- *opt2 |= 0x80;
- case SC_MATKPOT:
- calc_flag = 1;
- tick = 1000 * tick;
- break;
- case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか)
- {
- time_t timer;
-
+ case StatusChange::SC_ATKPOT:
+ *opt2 |= Opt2::_atkpot;
+ FALLTHROUGH;
+ case StatusChange::SC_MATKPOT:
calc_flag = 1;
- tick = 10000;
- if (!val2)
- val2 = time (&timer);
- }
- break;
- case SC_NOCHAT: //チャット禁止状態
- {
- time_t timer;
-
- if (!battle_config.muting_players)
- break;
-
- tick = 60000;
- if (!val2)
- val2 = time (&timer);
- updateflag = SP_MANNER;
- }
- break;
- case SC_SELFDESTRUCTION: //自爆
- clif_skillcasting (bl, bl->id, bl->id, 0, 0, 331,
- skill_get_time (val2, val1));
- val3 = tick / 1000;
- tick = 1000;
- break;
-
- /* option1 */
- case SC_STONE: /* 石化 */
- if (!(flag & 2))
- {
- int sc_def = battle_get_mdef (bl) * 200;
- tick = tick - sc_def;
- }
- val3 = tick / 1000;
- if (val3 < 1)
- val3 = 1;
- tick = 5000;
- val2 = 1;
- break;
- case SC_SLEEP: /* 睡眠 */
- if (!(flag & 2))
- {
-// int sc_def = 100 - (battle_get_int(bl) + battle_get_luk(bl)/3);
-// tick = tick * sc_def / 100;
-// if(tick < 1000) tick = 1000;
- tick = 30000; //睡眠はステータス耐性に関わらず30秒
- }
- break;
- case SC_FREEZE: /* 凍結 */
- if (!(flag & 2))
- {
- int sc_def = 100 - battle_get_mdef (bl);
- tick = tick * sc_def / 100;
- }
- break;
- case SC_STAN: /* スタン(val2にミリ秒セット) */
- if (!(flag & 2))
- {
- int sc_def =
- 100 - (battle_get_vit (bl) + battle_get_luk (bl) / 3);
- tick = tick * sc_def / 100;
- }
break;
/* option2 */
- case SC_POISON: /* 毒 */
- calc_flag = 1;
- if (!(flag & 2))
- {
- int sc_def =
- 100 - (battle_get_vit (bl) + battle_get_luk (bl) / 5);
- tick = tick * sc_def / 100;
- }
- val3 = tick / 1000;
- if (val3 < 1)
- val3 = 1;
- tick = 1000;
- break;
- case SC_SILENCE: /* 沈黙(レックスデビーナ) */
- if (!(flag & 2))
- {
- int sc_def = 100 - battle_get_vit (bl);
- tick = tick * sc_def / 100;
- }
- break;
- case SC_BLIND: /* 暗黒 */
- calc_flag = 1;
- if (!(flag & 2))
- {
- int sc_def =
- battle_get_lv (bl) / 10 + battle_get_int (bl) / 15;
- tick = 30000 - sc_def;
- }
- break;
- case SC_CURSE:
+ case StatusChange::SC_POISON: /* 毒 */
calc_flag = 1;
- if (!(flag & 2))
{
- int sc_def = 100 - battle_get_vit (bl);
+ int sc_def =
+ 100 - (battle_get_vit(bl) + battle_get_luk(bl) / 5);
tick = tick * sc_def / 100;
}
- break;
-
- /* option */
- case SC_HIDING: /* ハイディング */
- calc_flag = 1;
- if (bl->type == BL_PC)
- {
- val2 = tick / 1000; /* 持続時間 */
- tick = 1000;
- }
- break;
- case SC_CHASEWALK:
- case SC_CLOAKING: /* クローキング */
- if (bl->type == BL_PC)
- val2 = tick;
- else
- tick = 5000 * val1;
- break;
- case SC_SIGHT: /* サイト/ルアフ */
- case SC_RUWACH:
- val2 = tick / 250;
- tick = 10;
- break;
-
- /* セーフティウォール、ニューマ */
- case SC_SAFETYWALL:
- case SC_PNEUMA:
- tick = ((struct skill_unit *) val2)->group->limit;
- break;
-
- /* アンクル */
- 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;
- tick = 600 * 1000;
- break;
- case SC_FALCON:
- case SC_WEIGHT50:
- case SC_WEIGHT90:
- case SC_BROKNWEAPON:
- case SC_BROKNARMOR:
- tick = 600 * 1000;
- break;
-
- case SC_AUTOGUARD:
- {
- int i, t;
- for (i = val2 = 0; i < val1; i++)
- {
- t = 5 - (i >> 1);
- val2 += (t < 0) ? 1 : t;
- }
- }
- break;
- case SC_DEFENDER:
- calc_flag = 1;
- val2 = 5 + val1 * 15;
+ // huh?
+ tick = std::chrono::seconds(1);
break;
- case SC_KEEPING:
- case SC_BARRIER:
- case SC_HALLUCINATION:
- break;
- case SC_CONCENTRATION: /* コンセントレーション */
- *opt3 |= 1;
- calc_flag = 1;
- break;
- case SC_TENSIONRELAX: /* テンションリラックス */
- calc_flag = 1;
- if (bl->type == BL_PC)
- {
- tick = 10000;
- }
- break;
- case SC_AURABLADE: /* オーラブレード */
- case SC_PARRYING: /* パリイング */
-// case SC_ASSUMPTIO: /* */
- case SC_HEADCRUSH: /* ヘッドクラッシュ */
- case SC_JOINTBEAT: /* ジョイントビート */
-// case SC_MARIONETTE: /* マリオネットコントロール */
-
- //とりあえず手抜き
+ case StatusChange::SC_WEIGHT50:
+ case StatusChange::SC_WEIGHT90:
+ case StatusChange::SC_BROKNWEAPON:
+ case StatusChange::SC_BROKNARMOR:
+ tick = std::chrono::minutes(10);
break;
-// -- moonsoul (for new upper class related skill status effects)
-/*
- case SC_AURABLADE:
- val2 = val1*10;
- break;
- case SC_PARRYING:
- val2=val1*3;
- break;
- case SC_CONCENTRATION:
- calc_flag=1;
- val2=val1*10;
- val3=val1*5;
- break;
- case SC_TENSIONRELAX:
-// val2 = 10;
-// val3 = 15;
- break;
- case SC_BERSERK:
- calc_flag=1;
- break;
- case SC_ASSUMPTIO:
- if(sc_data[SC_KYRIE].timer!=-1 )
- skill_status_change_end(bl,SC_KYRIE,-1);
- break;
-*/
- case SC_WINDWALK: /* ウインドウォーク */
+ case StatusChange::SC_HASTE:
calc_flag = 1;
- val2 = (val1 / 2); //Flee上昇率
break;
- case SC_BERSERK: /* バーサーク */
- if (sd)
- {
- sd->status.sp = 0;
- clif_updatestatus (sd, SP_SP);
- clif_status_change (bl, SC_INCREASEAGI, 1); /* アイコン表示 */
- }
- *opt3 |= 128;
- tick = 1000;
- calc_flag = 1;
- break;
- case SC_ASSUMPTIO: /* アスムプティオ */
- *opt3 |= 2048;
+ case StatusChange::SC_PHYS_SHIELD:
+ case StatusChange::SC_MBARRIER:
+ case StatusChange::SC_HALT_REGENERATE:
+ case StatusChange::SC_HIDE:
break;
- case SC_MARIONETTE: /* マリオネットコントロール */
- *opt3 |= 1024;
- break;
- case SC_MELTDOWN: /* メルトダウン */
- case SC_CARTBOOST: /* カートブースト */
- case SC_TRUESIGHT: /* トゥルーサイト */
- case SC_SPIDERWEB: /* スパイダーウェッブ */
- case SC_MAGICPOWER: /* 魔法力増幅 */
- calc_flag = 1;
- break;
- case SC_REJECTSWORD: /* リジェクトソード */
- val2 = 3; //3回攻撃を跳ね返す
- break;
- 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;
- case SC_SPLASHER: /* ベナムスプラッシャー */
- case SC_PHYS_SHIELD:
- case SC_MBARRIER:
- case SC_HALT_REGENERATE:
- case SC_HIDE:
- break;
- case SC_FLYING_BACKPACK:
- updateflag = SP_WEIGHT;
+ case StatusChange::SC_FLYING_BACKPACK:
+ updateflag = SP::WEIGHT;
break;
default:
if (battle_config.error_log)
- printf ("UnknownStatusChange [%d]\n", type);
+ PRINTF("UnknownStatusChange [%d]\n", type);
return 0;
}
- if (bl->type == BL_PC && type < SC_SENDMAX)
- clif_status_change (bl, type, 1); /* アイコン表示 */
+ if (bl->type == BL::PC && type < StatusChange::SC_SENDMAX)
+ clif_status_change(bl, type, 1); /* アイコン表示 */
/* optionの変更 */
switch (type)
{
- case SC_STONE:
- case SC_FREEZE:
- case SC_STAN:
- case SC_SLEEP:
- battle_stopattack (bl); /* 攻撃停止 */
- skill_stop_dancing (bl, 0); /* 演奏/ダンスの中断 */
- { /* 同時に掛からないステータス異常を解除 */
- int i;
- for (i = SC_STONE; i <= SC_SLEEP; i++)
- {
- if (sc_data[i].timer != -1)
- {
- (*sc_count)--;
- delete_timer (sc_data[i].timer,
- skill_status_change_timer);
- sc_data[i].timer = -1;
- }
- }
- }
- if (type == SC_STONE)
- *opt1 = 6;
- else
- *opt1 = type - SC_STONE + 1;
- opt_flag = 1;
- break;
- case SC_POISON:
- if (sc_data[SC_SLOWPOISON].timer == -1)
+ case StatusChange::SC_POISON:
+ if (!sc_data[StatusChange::SC_SLOWPOISON].timer)
{
- *opt2 |= 0x1;
+ *opt2 |= Opt2::_poison;
opt_flag = 1;
}
break;
- case SC_CURSE:
- case SC_SILENCE:
- case SC_BLIND:
- *opt2 |= 1 << (type - SC_POISON);
- opt_flag = 1;
- break;
- case SC_SLOWPOISON:
- *opt2 &= ~0x1;
- *opt2 |= 0x200;
- opt_flag = 1;
- break;
- case SC_SIGNUMCRUCIS:
- *opt2 |= 0x40;
- opt_flag = 1;
- break;
- case SC_HIDING:
- case SC_CLOAKING:
- battle_stopattack (bl); /* 攻撃停止 */
- *option |= ((type == SC_HIDING) ? 2 : 4);
+ case StatusChange::SC_SLOWPOISON:
+ *opt2 &= ~Opt2::_poison;
+ *opt2 |= Opt2::_slowpoison;
opt_flag = 1;
break;
- case SC_CHASEWALK:
- battle_stopattack (bl); /* 攻撃停止 */
- *option |= 16388;
- opt_flag = 1;
- break;
- case SC_SIGHT:
- *option |= 1;
- opt_flag = 1;
- break;
- case SC_RUWACH:
- *option |= 8192;
- opt_flag = 1;
- break;
- case SC_WEDDING:
- *option |= 4096;
- opt_flag = 1;
}
if (opt_flag) /* optionの変更 */
- clif_changeoption (bl);
+ clif_changeoption(bl);
(*sc_count)++; /* ステータス異常の数 */
sc_data[type].val1 = val1;
- sc_data[type].val2 = val2;
- sc_data[type].val3 = val3;
- sc_data[type].val4 = val4;
if (sc_data[type].spell_invocation) // Supplant by newer spell
- spell_effect_report_termination (sc_data[type].spell_invocation,
+ spell_effect_report_termination(sc_data[type].spell_invocation,
bl->id, type, 1);
sc_data[type].spell_invocation = spell_invocation;
/* タイマー設定 */
- sc_data[type].timer =
- add_timer (gettick () + tick, skill_status_change_timer, bl->id,
- type);
+ sc_data[type].timer = Timer(gettick() + tick,
+ std::bind(skill_status_change_timer, ph::_1, ph::_2,
+ bl->id, type));
- if (bl->type == BL_PC && calc_flag)
- pc_calcstatus (sd, 0); /* ステータス再計算 */
+ if (bl->type == BL::PC && calc_flag)
+ pc_calcstatus(sd, 0); /* ステータス再計算 */
- if (bl->type == BL_PC && updateflag)
- clif_updatestatus (sd, updateflag); /* ステータスをクライアントに送る */
+ if (bl->type == BL::PC && updateflag != SP::ZERO)
+ clif_updatestatus(sd, updateflag); /* ステータスをクライアントに送る */
return 0;
}
@@ -10811,82 +1164,49 @@ int skill_status_effect (struct block_list *bl, int type, int val1, int val2,
* ステータス異常全解除
*------------------------------------------
*/
-int skill_status_change_clear (struct block_list *bl, int type)
-{
- struct status_change *sc_data;
- short *sc_count, *option, *opt1, *opt2, *opt3;
- int i;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, sc_data = battle_get_sc_data (bl));
- nullpo_retr (0, sc_count = battle_get_sc_count (bl));
- nullpo_retr (0, option = battle_get_option (bl));
- nullpo_retr (0, opt1 = battle_get_opt1 (bl));
- nullpo_retr (0, opt2 = battle_get_opt2 (bl));
- nullpo_retr (0, opt3 = battle_get_opt3 (bl));
+int skill_status_change_clear(struct block_list *bl, int type)
+{
+ eptr<struct status_change, StatusChange> sc_data;
+ short *sc_count;
+ Option *option;
+ Opt1 *opt1;
+ Opt2 *opt2;
+ Opt3 *opt3;
+
+ nullpo_ret(bl);
+ sc_data = battle_get_sc_data(bl);
+ if (not sc_data)
+ return 0;
+ sc_count = battle_get_sc_count(bl);
+ nullpo_ret(sc_count);
+ option = battle_get_option(bl);
+ nullpo_ret(option);
+ opt1 = battle_get_opt1(bl);
+ nullpo_ret(opt1);
+ opt2 = battle_get_opt2(bl);
+ nullpo_ret(opt2);
+ opt3 = battle_get_opt3(bl);
+ nullpo_ret(opt3);
if (*sc_count == 0)
return 0;
- for (i = 0; i < MAX_STATUSCHANGE; i++)
+ for (StatusChange i : erange(StatusChange(), 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);
- }
+ if (sc_data[i].timer)
+ skill_status_change_end(bl, i, nullptr);
}
*sc_count = 0;
- *opt1 = 0;
- *opt2 = 0;
- *opt3 = 0;
- *option &= OPTION_MASK;
-
- if (night_flag == 1 && type == BL_PC) // by [Yor]
- *opt2 |= STATE_BLIND;
+ *opt1 = Opt1::ZERO;
+ *opt2 = Opt2::ZERO;
+ *opt3 = Opt3::ZERO;
+ *option = Option::ZERO;
- if (!type || type & 2)
- clif_changeoption (bl);
+ if (type == 0 || type & 2)
+ clif_changeoption(bl);
return 0;
}
-/* クローキング検査(周りに移動不可能地帯があるか) */
-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_retr (0, 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)
- return 0;
- for (i = 0; i < sizeof (dx) / sizeof (dx[0]); i++)
- {
- int c = map_getcell (bl->m, bl->x + dx[i], bl->y + dy[i]);
- if (c == 1 || c == 5)
- end = 0;
- }
- if (end)
- {
- skill_status_change_end (bl, SC_CLOAKING, -1);
- *battle_get_option (bl) &= ~4; /* 念のための処理 */
- }
- return end;
-}
-
/*
*----------------------------------------------------------------------------
* スキルユニット
@@ -10894,891 +1214,18 @@ int skill_check_cloaking (struct block_list *bl)
*/
/*==========================================
- * 演奏/ダンススキルかどうか判定
- * 引数 スキルID
- * 戻り ダンスじゃない=0 合奏=2 それ以外のダンス=1
- *------------------------------------------
- */
-int skill_is_danceskill (int id)
-{
- int i;
- 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: /* 月明りの泉に落ちる花びら */
- i = 2;
- break;
- 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: /* サービスフォーユー */
- i = 1;
- break;
- default:
- i = 0;
- }
- return i;
-}
-
-/*==========================================
* 演奏/ダンスをやめる
* flag 1で合奏中なら相方にユニットを任せる
*
*------------------------------------------
*/
-void skill_stop_dancing (struct block_list *src, int flag)
-{
- struct status_change *sc_data;
- struct skill_unit_group *group;
-
- nullpo_retv (src);
-
- sc_data = battle_get_sc_data (src);
- if (sc_data && sc_data[SC_DANCING].timer == -1)
- return;
- group = (struct skill_unit_group *) sc_data[SC_DANCING].val2; //ダンスのスキルユニットIDはval2に入ってる
- if (group && src->type == BL_PC && sc_data && sc_data[SC_DANCING].val4)
- { //合奏中断
- struct map_session_data *dsd = map_id2sd (sc_data[SC_DANCING].val4); //相方のsd取得
- if (flag)
- { //ログアウトなど片方が落ちても演奏が継続される
- if (dsd && src->id == group->src_id)
- { //グループを持ってるPCが落ちる
- group->src_id = sc_data[SC_DANCING].val4; //相方にグループを任せる
- if (flag & 1) //ログアウト
- dsd->sc_data[SC_DANCING].val4 = 0; //相方の相方を0にして合奏終了→通常のダンス状態
- if (flag & 2) //ハエ飛びなど
- return; //合奏もダンス状態も終了させない&スキルユニットは置いてけぼり
- }
- else if (dsd && dsd->bl.id == group->src_id)
- { //相方がグループを持っているPCが落ちる(自分はグループを持っていない)
- if (flag & 1) //ログアウト
- dsd->sc_data[SC_DANCING].val4 = 0; //相方の相方を0にして合奏終了→通常のダンス状態
- if (flag & 2) //ハエ飛びなど
- return; //合奏もダンス状態も終了させない&スキルユニットは置いてけぼり
- }
- skill_status_change_end (src, SC_DANCING, -1); //自分のステータスを終了させる
- //そしてグループは消さない&消さないのでステータス計算もいらない?
- return;
- }
- else
- {
- if (dsd && src->id == group->src_id)
- { //グループを持ってるPCが止める
- skill_status_change_end ((struct block_list *) dsd, SC_DANCING, -1); //相手のステータスを終了させる
- }
- if (dsd && dsd->bl.id == group->src_id)
- { //相方がグループを持っているPCが止める(自分はグループを持っていない)
- skill_status_change_end (src, SC_DANCING, -1); //自分のステータスを終了させる
- }
- }
- }
- if (flag & 2 && group && src->type == BL_PC)
- { //ハエで飛んだときとかはユニットも飛ぶ
- struct map_session_data *sd = (struct map_session_data *) src;
- skill_unit_move_unit_group (group, sd->bl.m, (sd->to_x - sd->bl.x),
- (sd->to_y - sd->bl.y));
- return;
- }
- skill_delunitgroup (group);
- if (src->type == BL_PC)
- pc_calcstatus ((struct map_session_data *) src, 0);
-}
-
-/*==========================================
- * スキルユニット初期化
- *------------------------------------------
- */
-struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx,
- int x, int y)
-{
- struct skill_unit *unit;
-
- nullpo_retr (NULL, group);
- nullpo_retr (NULL, unit = &group->unit[idx]);
-
- if (!unit->alive)
- group->alive_count++;
-
- unit->bl.id = map_addobject (&unit->bl);
- unit->bl.type = BL_SKILL;
- unit->bl.m = group->map;
- unit->bl.x = x;
- unit->bl.y = y;
- unit->group = group;
- unit->val1 = unit->val2 = 0;
- unit->alive = 1;
-
- map_addblock (&unit->bl);
- clif_skill_setunit (unit);
- return unit;
-}
-
-int skill_unit_timer_sub_ondelete (struct block_list *bl, va_list ap);
-/*==========================================
- * スキルユニット削除
- *------------------------------------------
- */
-int skill_delunit (struct skill_unit *unit)
-{
- struct skill_unit_group *group;
- int range;
-
- nullpo_retr (0, unit);
- if (!unit->alive)
- return 0;
- nullpo_retr (0, group = unit->group);
-
- /* onlimitイベント呼び出し */
- skill_unit_onlimit (unit, gettick ());
-
- /* ondeleteイベント呼び出し */
- range = group->range;
- map_foreachinarea (skill_unit_timer_sub_ondelete, unit->bl.m,
- unit->bl.x - range, unit->bl.y - range,
- unit->bl.x + range, unit->bl.y + range, 0, &unit->bl,
- gettick ());
-
- clif_skill_delunit (unit);
-
- unit->group = NULL;
- unit->alive = 0;
- map_delobjectnofree (unit->bl.id, BL_SKILL);
- if (group->alive_count > 0 && (--group->alive_count) <= 0)
- skill_delunitgroup (group);
-
- return 0;
-}
-
-/*==========================================
- * スキルユニットグループ初期化
- *------------------------------------------
- */
-static int skill_unit_group_newid = 10;
-struct skill_unit_group *skill_initunitgroup (struct block_list *src,
- int count, int skillid,
- int skilllv, int unit_id)
-{
- int i;
- struct skill_unit_group *group = NULL, *list = NULL;
- int maxsug = 0;
-
- nullpo_retr (NULL, src);
-
- if (src->type == BL_PC)
- {
- list = ((struct map_session_data *) src)->skillunit;
- maxsug = MAX_SKILLUNITGROUP;
- }
- else if (src->type == BL_MOB)
- {
- list = ((struct mob_data *) src)->skillunit;
- maxsug = MAX_MOBSKILLUNITGROUP;
- }
- if (list)
- {
- for (i = 0; i < maxsug; i++) /* 空いているもの検索 */
- if (list[i].group_id == 0)
- {
- group = &list[i];
- break;
- }
-
- if (group == NULL)
- { /* 空いてないので古いもの検索 */
- int j = 0;
- unsigned maxdiff = 0, x, tick = gettick ();
- for (i = 0; i < maxsug; i++)
- if ((x = DIFF_TICK (tick, list[i].tick)) > maxdiff)
- {
- maxdiff = x;
- j = i;
- }
- skill_delunitgroup (&list[j]);
- group = &list[j];
- }
- }
-
- if (group == NULL)
- {
- printf ("skill_initunitgroup: error unit group !\n");
- exit (1);
- }
-
- group->src_id = src->id;
- group->party_id = battle_get_party_id (src);
- group->guild_id = battle_get_guild_id (src);
- group->group_id = skill_unit_group_newid++;
- if (skill_unit_group_newid <= 0)
- skill_unit_group_newid = 10;
- CREATE (group->unit, struct skill_unit, count);
- group->unit_count = count;
- group->val1 = group->val2 = 0;
- group->skill_id = skillid;
- group->skill_lv = skilllv;
- group->unit_id = unit_id;
- group->map = src->m;
- group->range = 0;
- group->limit = 10000;
- group->interval = 1000;
- 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, 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 (skill_check_condition_use_sub,
- sd->bl.m, sd->bl.x - range,
- sd->bl.y - range, sd->bl.x + range,
- sd->bl.y + range, BL_PC, &sd->bl, &c);
- }
- }
- }
- }
- return group;
-}
-
-/*==========================================
- * スキルユニットグループ削除
- *------------------------------------------
- */
-int skill_delunitgroup (struct skill_unit_group *group)
-{
- struct block_list *src;
- int i;
-
- nullpo_retr (0, 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)
- {
- for (i = 0; i < group->unit_count; i++)
- if (group->unit[i].alive)
- skill_delunit (&group->unit[i]);
- }
- if (group->valstr != NULL)
- {
- map_freeblock (group->valstr);
- group->valstr = NULL;
- }
-
- map_freeblock (group->unit); /* free()の替わり */
- group->unit = NULL;
- group->src_id = 0;
- group->group_id = 0;
- group->unit_count = 0;
- return 0;
-}
-
-/*==========================================
- * スキルユニットグループ全削除
- *------------------------------------------
- */
-int skill_clear_unitgroup (struct block_list *src)
-{
- struct skill_unit_group *group = NULL;
- int maxsug = 0;
-
- nullpo_retr (0, src);
-
- if (src->type == BL_PC)
- {
- group = ((struct map_session_data *) src)->skillunit;
- maxsug = MAX_SKILLUNITGROUP;
- }
- else if (src->type == BL_MOB)
- {
- group = ((struct mob_data *) src)->skillunit;
- maxsug = MAX_MOBSKILLUNITGROUP;
- }
- if (group)
- {
- int i;
- for (i = 0; i < maxsug; i++)
- if (group[i].group_id > 0 && group[i].src_id == src->id)
- skill_delunitgroup (&group[i]);
- }
- return 0;
-}
-
-/*==========================================
- * スキルユニットグループの被影響tick検索
- *------------------------------------------
- */
-struct skill_unit_group_tickset *skill_unitgrouptickset_search (struct
- block_list
- *bl,
- int group_id)
+void skill_stop_dancing(struct block_list *, int)
{
- int i, j = 0, k, s = group_id % MAX_SKILLUNITGROUPTICKSET;
- struct skill_unit_group_tickset *set = NULL;
-
- nullpo_retr (0, bl);
-
- if (bl->type == BL_PC)
- {
- set = ((struct map_session_data *) bl)->skillunittick;
- }
- else
- {
- set = ((struct mob_data *) bl)->skillunittick;
- }
- if (set == NULL)
- return 0;
- for (i = 0; i < MAX_SKILLUNITGROUPTICKSET; i++)
- if (set[(k = (i + s) % MAX_SKILLUNITGROUPTICKSET)].group_id ==
- group_id)
- return &set[k];
- else if (set[k].group_id == 0)
- j = k;
-
- return &set[j];
+ // TODO remove this
}
-/*==========================================
- * スキルユニットグループの被影響tick削除
- *------------------------------------------
- */
-int skill_unitgrouptickset_delete (struct block_list *bl, int group_id)
-{
- int i, s = group_id % MAX_SKILLUNITGROUPTICKSET;
- struct skill_unit_group_tickset *set = NULL, *ts;
-
- nullpo_retr (0, bl);
-
- if (bl->type == BL_PC)
- {
- set = ((struct map_session_data *) bl)->skillunittick;
- }
- else
- {
- set = ((struct mob_data *) bl)->skillunittick;
- }
-
- if (set != NULL)
- {
-
- for (i = 0; i < MAX_SKILLUNITGROUPTICKSET; i++)
- if ((ts =
- &set[(i + s) % MAX_SKILLUNITGROUPTICKSET])->group_id ==
- group_id)
- ts->group_id = 0;
-
- }
- return 0;
-}
-
-/*==========================================
- * スキルユニットタイマー発動処理用(foreachinarea)
- *------------------------------------------
- */
-static
-int skill_unit_timer_sub_onplace (struct block_list *bl, va_list ap)
-{
- struct block_list *src;
- struct skill_unit *su;
- unsigned int tick;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- src = va_arg (ap, struct block_list *);
-
- tick = va_arg (ap, unsigned int);
- su = (struct skill_unit *) src;
-
- if (su && su->alive)
- {
- struct skill_unit_group *sg;
- sg = su->group;
- if (sg && battle_check_target (src, bl, sg->target_flag) > 0)
- skill_unit_onplace (su, bl, tick);
- }
- return 0;
-}
-
-/*==========================================
- * スキルユニットタイマー削除処理用(foreachinarea)
- *------------------------------------------
- */
-int skill_unit_timer_sub_ondelete (struct block_list *bl, va_list ap)
-{
- struct block_list *src;
- struct skill_unit *su;
- unsigned int tick;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- src = va_arg (ap, struct block_list *);
-
- tick = va_arg (ap, unsigned int);
- su = (struct skill_unit *) src;
-
- if (su && su->alive)
- {
- struct skill_unit_group *sg;
- sg = su->group;
- if (sg && battle_check_target (src, bl, sg->target_flag) > 0)
- skill_unit_ondelete (su, bl, tick);
- }
- return 0;
-}
-
-/*==========================================
- * スキルユニットタイマー処理用(foreachobject)
- *------------------------------------------
- */
-static
-int skill_unit_timer_sub (struct block_list *bl, va_list ap)
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- int range;
- unsigned int tick;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, unit = (struct skill_unit *) bl);
- nullpo_retr (0, group = unit->group);
- tick = va_arg (ap, unsigned int);
-
- if (!unit->alive)
- return 0;
-
- range = (unit->range != 0) ? unit->range : group->range;
-
- /* onplaceイベント呼び出し */
- if (unit->alive && unit->range >= 0)
- {
- map_foreachinarea (skill_unit_timer_sub_onplace, bl->m,
- bl->x - range, bl->y - range, bl->x + range,
- bl->y + range, 0, bl, tick);
- if (group->unit_id == 0xaa
- && DIFF_TICK (tick, group->tick) >= 6000 * group->val2)
- {
- map_foreachinarea (skill_idun_heal, bl->m,
- bl->x - range, bl->y - range, bl->x + range,
- bl->y + range, 0, unit);
- group->val2++;
- }
- }
- /* 時間切れ削除 */
- if (unit->alive &&
- (DIFF_TICK (tick, group->tick) >= group->limit
- || DIFF_TICK (tick, group->tick) >= unit->limit))
- {
- switch (group->unit_id)
- {
-
- case 0x8f: /* ブラストマイン */
- group->unit_id = 0x8c;
- clif_changelook (bl, LOOK_BASE, group->unit_id);
- group->limit = DIFF_TICK (tick + 1500, group->tick);
- unit->limit = DIFF_TICK (tick + 1500, group->tick);
- break;
- case 0x90: /* スキッドトラップ */
- case 0x91: /* アンクルスネア */
- case 0x93: /* ランドマイン */
- case 0x94: /* ショックウェーブトラップ */
- case 0x95: /* サンドマン */
- case 0x96: /* フラッシャー */
- case 0x97: /* フリージングトラップ */
- case 0x98: /* クレイモアートラップ */
- case 0x99: /* トーキーボックス */
- {
- struct block_list *src = map_id2bl (group->src_id);
- if (group->unit_id == 0x91 && group->val2);
- else
- {
- if (src && src->type == BL_PC)
- {
- struct item item_tmp;
- memset (&item_tmp, 0, sizeof (item_tmp));
- item_tmp.nameid = 1065;
- item_tmp.identify = 1;
- map_addflooritem (&item_tmp, 1, bl->m, bl->x, bl->y, NULL, NULL, NULL, 0); // 罠返還
- }
- }
- }
- default:
- skill_delunit (unit);
- }
- }
-
- if (group->unit_id == 0x8d)
- {
- unit->val1 -= 5;
- if (unit->val1 <= 0 && unit->limit + group->tick > tick + 700)
- unit->limit = DIFF_TICK (tick + 700, group->tick);
- }
-
- return 0;
-}
-
-/*==========================================
- * スキルユニットタイマー処理
- *------------------------------------------
- */
-static
-void skill_unit_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
-{
- map_freeblock_lock ();
-
- map_foreachobject (skill_unit_timer_sub, BL_SKILL, tick);
-
- map_freeblock_unlock ();
-}
-
-/*==========================================
- * スキルユニット移動時処理用(foreachinarea)
- *------------------------------------------
- */
-static
-int skill_unit_out_all_sub (struct block_list *bl, va_list ap)
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- struct block_list *src;
- int range;
- unsigned int tick;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, src = va_arg (ap, struct block_list *));
- nullpo_retr (0, unit = (struct skill_unit *) bl);
- nullpo_retr (0, group = unit->group);
-
- tick = va_arg (ap, unsigned int);
-
- if (!unit->alive || src->prev == NULL)
- return 0;
-
- range = (unit->range != 0) ? unit->range : group->range;
-
- if (range < 0 || battle_check_target (bl, src, group->target_flag) <= 0)
- return 0;
-
- if (src->x >= bl->x - range && src->x <= bl->x + range &&
- src->y >= bl->y - range && src->y <= bl->y + range)
- skill_unit_onout (unit, src, tick);
-
- return 0;
-}
-
-/*==========================================
- * スキルユニット移動時処理
- *------------------------------------------
- */
-int skill_unit_out_all (struct block_list *bl, unsigned int tick, int range)
-{
- nullpo_retr (0, bl);
-
- if (bl->prev == NULL)
- return 0;
-
- if (range < 7)
- range = 7;
- map_foreachinarea (skill_unit_out_all_sub,
- bl->m, bl->x - range, bl->y - range, bl->x + range,
- bl->y + range, BL_SKILL, bl, tick);
-
- return 0;
-}
-
-/*==========================================
- * スキルユニット移動時処理用(foreachinarea)
- *------------------------------------------
- */
-static
-int skill_unit_move_sub (struct block_list *bl, va_list ap)
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- struct block_list *src;
- int range;
- unsigned int tick;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, unit = (struct skill_unit *) bl);
- nullpo_retr (0, src = va_arg (ap, struct block_list *));
-
- tick = va_arg (ap, unsigned int);
-
- if (!unit->alive || src->prev == NULL)
- return 0;
-
- if ((group = unit->group) == NULL)
- return 0;
- range = (unit->range != 0) ? unit->range : group->range;
-
- if (range < 0 || battle_check_target (bl, src, group->target_flag) <= 0)
- return 0;
-
- if (src->x >= bl->x - range && src->x <= bl->x + range &&
- src->y >= bl->y - range && src->y <= bl->y + range)
- skill_unit_onplace (unit, src, tick);
- else
- skill_unit_onout (unit, src, tick);
-
- return 0;
-}
-
-/*==========================================
- * スキルユニット移動時処理
- *------------------------------------------
- */
-int skill_unit_move (struct block_list *bl, unsigned int tick, int range)
-{
- nullpo_retr (0, bl);
-
- if (bl->prev == NULL)
- return 0;
-
- if (range < 7)
- range = 7;
- map_foreachinarea (skill_unit_move_sub,
- bl->m, bl->x - range, bl->y - range, bl->x + range,
- bl->y + range, BL_SKILL, bl, tick);
-
- return 0;
-}
-
-/*==========================================
- * スキルユニット自体の移動時処理(foreachinarea)
- *------------------------------------------
- */
-static
-int skill_unit_move_unit_group_sub (struct block_list *bl, va_list ap)
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- struct block_list *src;
- int range;
- unsigned int tick;
-
- nullpo_retr (0, bl);
- nullpo_retr (0, ap);
- nullpo_retr (0, src = va_arg (ap, struct block_list *));
- nullpo_retr (0, unit = (struct skill_unit *) src);
- nullpo_retr (0, group = unit->group);
-
- tick = va_arg (ap, unsigned int);
-
- if (!unit->alive || bl->prev == NULL)
- return 0;
-
- range = (unit->range != 0) ? unit->range : group->range;
-
- if (range < 0 || battle_check_target (src, bl, group->target_flag) <= 0)
- return 0;
- if (bl->x >= src->x - range && bl->x <= src->x + range &&
- bl->y >= src->y - range && bl->y <= src->y + range)
- skill_unit_onplace (unit, bl, tick);
- else
- skill_unit_onout (unit, bl, tick);
- return 0;
-}
-
-/*==========================================
- * スキルユニット自体の移動時処理
- * 引数はグループと移動量
- *------------------------------------------
- */
-int skill_unit_move_unit_group (struct skill_unit_group *group, int m, int dx,
- int dy)
-{
- nullpo_retr (0, group);
-
- if (group->unit_count <= 0)
- return 0;
-
- if (group->unit != NULL)
- {
- if (!battle_config.unit_movement_type)
- {
- int i;
- for (i = 0; i < group->unit_count; i++)
- {
- struct skill_unit *unit = &group->unit[i];
- if (unit->alive && !(m == unit->bl.m && dx == 0 && dy == 0))
- {
- int range = unit->range;
- map_delblock (&unit->bl);
- unit->bl.m = m;
- unit->bl.x += dx;
- unit->bl.y += dy;
- map_addblock (&unit->bl);
- clif_skill_setunit (unit);
- if (range > 0)
- {
- if (range < 7)
- range = 7;
- map_foreachinarea (skill_unit_move_unit_group_sub,
- unit->bl.m, unit->bl.x - range,
- unit->bl.y - range,
- unit->bl.x + range,
- unit->bl.y + range, 0, &unit->bl,
- gettick ());
- }
- }
- }
- }
- else
- {
- int i, j, *r_flag, *s_flag, *m_flag;
- struct skill_unit *unit1;
- struct skill_unit *unit2;
- r_flag = (int *) malloc (sizeof (int) * group->unit_count);
- s_flag = (int *) malloc (sizeof (int) * group->unit_count);
- m_flag = (int *) malloc (sizeof (int) * group->unit_count);
- memset (r_flag, 0, sizeof (int) * group->unit_count); // 継承フラグ
- memset (s_flag, 0, sizeof (int) * group->unit_count); // 継承フラグ
- memset (m_flag, 0, sizeof (int) * group->unit_count); // 継承フラグ
-
- //先にフラグを全部決める
- for (i = 0; i < group->unit_count; i++)
- {
- int move_check = 0; // かぶりフラグ
- unit1 = &group->unit[i];
- for (j = 0; j < group->unit_count; j++)
- {
- unit2 = &group->unit[j];
- if (unit1->bl.m == m && unit1->bl.x + dx == unit2->bl.x
- && unit1->bl.y + dy == unit2->bl.y)
- {
- //移動先にユニットがかぶってたら
- s_flag[i] = 1; // 移動前のユニットナンバーの継承フラグon
- r_flag[j] = 1; // かぶるユニットナンバーの残留フラグon
- move_check = 1; //ユニットがかぶった。
- break;
- }
- }
- if (!move_check) // ユニットがかぶってなかったら
- m_flag[i] = 1; // 移動前ユニットナンバーの移動フラグon
- }
-
- //フラグに基づいてユニット移動
- for (i = 0; i < group->unit_count; i++)
- {
- unit1 = &group->unit[i];
- if (m_flag[i])
- { // 移動フラグがonで
- if (!r_flag[i])
- { // 残留フラグがoffなら
- //単純移動(rangeも継承の必要無し)
- int range = unit1->range;
- map_delblock (&unit1->bl);
- unit1->bl.m = m;
- unit1->bl.x += dx;
- unit1->bl.y += dy;
- map_addblock (&unit1->bl);
- clif_skill_setunit (unit1);
- if (range > 0)
- {
- if (range < 7)
- range = 7;
- map_foreachinarea (skill_unit_move_unit_group_sub,
- unit1->bl.m,
- unit1->bl.x - range,
- unit1->bl.y - range,
- unit1->bl.x + range,
- unit1->bl.y + range, 0,
- &unit1->bl, gettick ());
- }
- }
- else
- { // 残留フラグがonなら
- //空ユニットになるので、継承可能なユニットを探す
- for (j = 0; j < group->unit_count; j++)
- {
- unit2 = &group->unit[j];
- if (s_flag[j] && !r_flag[j])
- {
- // 継承移動(range継承付き)
- int range = unit1->range;
- map_delblock (&unit2->bl);
- unit2->bl.m = m;
- unit2->bl.x = unit1->bl.x + dx;
- unit2->bl.y = unit1->bl.y + dy;
- unit2->range = unit1->range;
- map_addblock (&unit2->bl);
- clif_skill_setunit (unit2);
- if (range > 0)
- {
- if (range < 7)
- range = 7;
- map_foreachinarea
- (skill_unit_move_unit_group_sub,
- unit2->bl.m, unit2->bl.x - range,
- unit2->bl.y - range,
- unit2->bl.x + range,
- unit2->bl.y + range, 0, &unit2->bl,
- gettick ());
- }
- s_flag[j] = 0; // 継承完了したのでoff
- break;
- }
- }
- }
- }
- }
- free (r_flag);
- free (s_flag);
- free (m_flag);
- }
- }
- return 0;
-}
+void skill_unit_timer_sub_ondelete(struct block_list *bl,
+ struct block_list *src, unsigned int tick);
/*----------------------------------------------------------------------------
* アイテム合成
@@ -11789,26 +1236,26 @@ int skill_unit_move_unit_group (struct skill_unit_group *group, int m, int dx,
* 初期化系
*/
-static int scan_stat (char *statname)
-{
- if (!strcasecmp (statname, "str"))
- return SP_STR;
- if (!strcasecmp (statname, "dex"))
- return SP_DEX;
- if (!strcasecmp (statname, "agi"))
- return SP_AGI;
- if (!strcasecmp (statname, "vit"))
- return SP_VIT;
- if (!strcasecmp (statname, "int"))
- return SP_INT;
- if (!strcasecmp (statname, "luk"))
- return SP_LUK;
- if (!strcasecmp (statname, "none"))
- return 0;
-
- else
- fprintf (stderr, "Unknown stat `%s'\n", statname);
- return 0;
+static
+SP scan_stat(char *statname)
+{
+ if (!strcasecmp(statname, "str"))
+ return SP::STR;
+ if (!strcasecmp(statname, "dex"))
+ return SP::DEX;
+ if (!strcasecmp(statname, "agi"))
+ return SP::AGI;
+ if (!strcasecmp(statname, "vit"))
+ return SP::VIT;
+ if (!strcasecmp(statname, "int"))
+ return SP::INT;
+ if (!strcasecmp(statname, "luk"))
+ return SP::LUK;
+ if (!strcasecmp(statname, "none"))
+ return SP::ZERO;
+
+ FPRINTF(stderr, "Unknown stat `%s'\n", statname);
+ return SP::ZERO;
}
/*==========================================
@@ -11818,21 +1265,21 @@ static int scan_stat (char *statname)
*------------------------------------------
*/
static
-int skill_readdb (void)
+int skill_readdb(void)
{
- int i, j, k, l;
+ int j, k;
FILE *fp;
char line[1024], *p;
/* The main skill database */
- memset (skill_db, 0, sizeof (skill_db));
- fp = fopen_ ("db/skill_db.txt", "r");
+ memset(&skill_db, 0, sizeof(skill_db));
+ fp = fopen_("db/skill_db.txt", "r");
if (fp == NULL)
{
- printf ("can't read db/skill_db.txt\n");
+ PRINTF("can't read db/skill_db.txt\n");
return 1;
}
- while (fgets (line, 1020, fp))
+ while (fgets(line, 1020, fp))
{
char *split[50], *split2[MAX_SKILL_LEVEL];
if (line[0] == '/' && line[1] == '/')
@@ -11842,414 +1289,97 @@ int skill_readdb (void)
while (*p == '\t' || *p == ' ')
p++;
split[j] = p;
- p = strchr (p, ',');
+ p = strchr(p, ',');
if (p)
*p++ = 0;
}
if (split[17] == NULL || j < 18)
{
- fprintf (stderr, "Incomplete skill db data online (%d entries)\n",
+ FPRINTF(stderr, "Incomplete skill db data online (%d entries)\n",
j);
continue;
}
- i = atoi (split[0]);
- if (i < 0 || i > MAX_SKILL_DB)
+ SkillID i = SkillID(atoi(split[0]));
+ if (/*i < SkillID() ||*/ i > SkillID::MAX_SKILL_DB)
continue;
- memset (split2, 0, sizeof (split2));
+ memset(split2, 0, sizeof(split2));
for (j = 0, p = split[1]; j < MAX_SKILL_LEVEL && p; j++)
{
split2[j] = p;
- p = strchr (p, ':');
+ p = strchr(p, ':');
if (p)
*p++ = 0;
}
for (k = 0; k < MAX_SKILL_LEVEL; k++)
skill_db[i].range[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
- skill_db[i].hit = atoi (split[2]);
- skill_db[i].inf = atoi (split[3]);
- skill_db[i].pl = atoi (split[4]);
- skill_db[i].nk = atoi (split[5]);
- skill_db[i].max_raise = atoi (split[6]);
- skill_db[i].max = atoi (split[7]);
-
- memset (split2, 0, sizeof (split2));
+ (split2[k]) ? atoi(split2[k]) : atoi(split2[0]);
+ skill_db[i].hit = atoi(split[2]);
+ skill_db[i].inf = atoi(split[3]);
+ skill_db[i].pl = atoi(split[4]);
+ skill_db[i].nk = atoi(split[5]);
+ skill_db[i].max_raise = atoi(split[6]);
+ skill_db[i].max = atoi(split[7]);
+
+ memset(split2, 0, sizeof(split2));
for (j = 0, p = split[8]; j < MAX_SKILL_LEVEL && p; j++)
{
split2[j] = p;
- p = strchr (p, ':');
+ p = strchr(p, ':');
if (p)
*p++ = 0;
}
for (k = 0; k < MAX_SKILL_LEVEL; k++)
skill_db[i].num[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
+ (split2[k]) ? atoi(split2[k]) : atoi(split2[0]);
- if (strcasecmp (split[9], "yes") == 0)
+ if (strcasecmp(split[9], "yes") == 0)
skill_db[i].castcancel = 1;
else
skill_db[i].castcancel = 0;
- skill_db[i].cast_def_rate = atoi (split[9]);
- skill_db[i].inf2 = atoi (split[10]);
- skill_db[i].maxcount = atoi (split[11]);
- if (strcasecmp (split[13], "weapon") == 0)
- skill_db[i].skill_type = BF_WEAPON;
- else if (strcasecmp (split[12], "magic") == 0)
- skill_db[i].skill_type = BF_MAGIC;
- else if (strcasecmp (split[12], "misc") == 0)
- skill_db[i].skill_type = BF_MISC;
- else
- skill_db[i].skill_type = 0;
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[14]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].blewcount[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
+ skill_db[i].cast_def_rate = atoi(split[10]);
+ skill_db[i].inf2 = atoi(split[11]);
+ skill_db[i].maxcount = atoi(split[12]);
+ // split[13] was one of: BF::WEAPON, BF::MAGIC, BF::MISC, BF::ZERO
+ memset(split2, 0, sizeof(split2));
+ // split[14] was colon-separated blow counts.
- if (!strcasecmp (split[15], "passive"))
+ if (!strcasecmp(split[15], "passive"))
{
- skill_pool_register (i);
- skill_db[i].poolflags = SKILL_POOL_FLAG;
+ skill_pool_register(i);
+ skill_db[i].poolflags = SkillFlags::POOL_FLAG;
}
- else if (!strcasecmp (split[15], "active"))
+ else if (!strcasecmp(split[15], "active"))
{
- skill_pool_register (i);
- skill_db[i].poolflags = SKILL_POOL_FLAG | SKILL_POOL_ACTIVE;
+ skill_pool_register(i);
+ skill_db[i].poolflags = SkillFlags::POOL_FLAG | SkillFlags::POOL_ACTIVE;
}
else
- skill_db[i].poolflags = 0;
+ skill_db[i].poolflags = SkillFlags::ZERO;
- skill_db[i].stat = scan_stat (split[16]);
+ skill_db[i].stat = scan_stat(split[16]);
- char *tmp = strdup (split[17]);
- skill_names[i].desc = tmp;
- { // replace "_" by " "
+ char *tmp = strdup(split[17]);
+ {
+ // replace "_" by " "
char *s = tmp;
- while ((s = strchr (s, '_')))
+ while ((s = strchr(s, '_')))
*s = ' ';
- if ((s = strchr (tmp, '\t'))
- || (s = strchr (tmp, ' '))
- || (s = strchr (tmp, '\n')))
+ if ((s = strchr(tmp, '\t'))
+ || (s = strchr(tmp, ' '))
+ || (s = strchr(tmp, '\n')))
*s = '\000';
}
+ skill_lookup_by_id(i).desc = tmp;
}
- fclose_ (fp);
- printf ("read db/skill_db.txt done\n");
-
- fp = fopen_ ("db/skill_require_db.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/skill_require_db.txt\n");
- return 1;
- }
- while (fgets (line, 1020, fp))
- {
- char *split[51], *split2[MAX_SKILL_LEVEL];
- if (line[0] == '/' && line[1] == '/')
- continue;
- for (j = 0, p = line; j < 30 && p; j++)
- {
- while (*p == '\t' || *p == ' ')
- p++;
- split[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
- if (split[29] == NULL || j < 30)
- continue;
-
- i = atoi (split[0]);
- if (i < 0 || i > MAX_SKILL_DB)
- continue;
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[1]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].hp[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[2]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].mhp[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[3]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].sp[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[4]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].hp_rate[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[5]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].sp_rate[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[6]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].zeny[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[7]; j < 32 && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < 32 && split2[k]; k++)
- {
- l = atoi (split2[k]);
- if (l == 99)
- {
- skill_db[i].weapon = 0xffffffff;
- break;
- }
- else
- skill_db[i].weapon |= 1 << l;
- }
-
- if (strcasecmp (split[8], "hiding") == 0)
- skill_db[i].state = ST_HIDING;
- else if (strcasecmp (split[8], "cloaking") == 0)
- skill_db[i].state = ST_CLOAKING;
- else if (strcasecmp (split[8], "hidden") == 0)
- skill_db[i].state = ST_HIDDEN;
- else if (strcasecmp (split[8], "riding") == 0)
- skill_db[i].state = ST_RIDING;
- else if (strcasecmp (split[8], "falcon") == 0)
- skill_db[i].state = ST_FALCON;
- else if (strcasecmp (split[8], "cart") == 0)
- skill_db[i].state = ST_CART;
- else if (strcasecmp (split[8], "shield") == 0)
- skill_db[i].state = ST_SHIELD;
- else if (strcasecmp (split[8], "sight") == 0)
- skill_db[i].state = ST_SIGHT;
- else if (strcasecmp (split[8], "explosionspirits") == 0)
- skill_db[i].state = ST_EXPLOSIONSPIRITS;
- else if (strcasecmp (split[8], "recover_weight_rate") == 0)
- skill_db[i].state = ST_RECOV_WEIGHT_RATE;
- else if (strcasecmp (split[8], "move_enable") == 0)
- skill_db[i].state = ST_MOVE_ENABLE;
- else if (strcasecmp (split[8], "water") == 0)
- skill_db[i].state = ST_WATER;
- else
- skill_db[i].state = ST_NONE;
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[9]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].spiritball[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
- skill_db[i].itemid[0] = atoi (split[10]);
- skill_db[i].amount[0] = atoi (split[11]);
- skill_db[i].itemid[1] = atoi (split[12]);
- skill_db[i].amount[1] = atoi (split[13]);
- skill_db[i].itemid[2] = atoi (split[14]);
- skill_db[i].amount[2] = atoi (split[15]);
- skill_db[i].itemid[3] = atoi (split[16]);
- skill_db[i].amount[3] = atoi (split[17]);
- skill_db[i].itemid[4] = atoi (split[18]);
- skill_db[i].amount[4] = atoi (split[19]);
- skill_db[i].itemid[5] = atoi (split[20]);
- skill_db[i].amount[5] = atoi (split[21]);
- skill_db[i].itemid[6] = atoi (split[22]);
- skill_db[i].amount[6] = atoi (split[23]);
- skill_db[i].itemid[7] = atoi (split[24]);
- skill_db[i].amount[7] = atoi (split[25]);
- skill_db[i].itemid[8] = atoi (split[26]);
- skill_db[i].amount[8] = atoi (split[27]);
- skill_db[i].itemid[9] = atoi (split[28]);
- skill_db[i].amount[9] = atoi (split[29]);
- }
- fclose_ (fp);
- printf ("read db/skill_require_db.txt done\n");
-
- /* ? */
- fp = fopen_ ("db/skill_cast_db.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/skill_cast_db.txt\n");
- return 1;
- }
- while (fgets (line, 1020, fp))
- {
- char *split[50], *split2[MAX_SKILL_LEVEL];
- memset (split, 0, sizeof (split)); // [Valaris] thanks to fov
- if (line[0] == '/' && line[1] == '/')
- continue;
- for (j = 0, p = line; j < 5 && p; j++)
- {
- while (*p == '\t' || *p == ' ')
- p++;
- split[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
- if (split[4] == NULL || j < 5)
- continue;
-
- i = atoi (split[0]);
- if (i < 0 || i > MAX_SKILL_DB)
- continue;
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[1]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].cast[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[2]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].delay[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[3]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].upkeep_time[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[4]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].upkeep_time2[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
- }
- fclose_ (fp);
- printf ("read db/skill_cast_db.txt done\n");
-
- fp = fopen_ ("db/skill_castnodex_db.txt", "r");
- if (fp == NULL)
- {
- printf ("can't read db/skill_castnodex_db.txt\n");
- return 1;
- }
- while (fgets (line, 1020, fp))
- {
- char *split[50], *split2[MAX_SKILL_LEVEL];
- memset (split, 0, sizeof (split));
- if (line[0] == '/' && line[1] == '/')
- continue;
- for (j = 0, p = line; j < 2 && p; j++)
- {
- while (*p == '\t' || *p == ' ')
- p++;
- split[j] = p;
- p = strchr (p, ',');
- if (p)
- *p++ = 0;
- }
-
- i = atoi (split[0]);
- if (i < 0 || i > MAX_SKILL_DB)
- continue;
-
- memset (split2, 0, sizeof (split2));
- for (j = 0, p = split[1]; j < MAX_SKILL_LEVEL && p; j++)
- {
- split2[j] = p;
- p = strchr (p, ':');
- if (p)
- *p++ = 0;
- }
- for (k = 0; k < MAX_SKILL_LEVEL; k++)
- skill_db[i].castnodex[k] =
- (split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
- }
- fclose_ (fp);
- printf ("read db/skill_castnodex_db.txt done\n");
+ fclose_(fp);
+ PRINTF("read db/skill_db.txt done\n");
return 0;
}
-void skill_reload (void)
+void skill_reload(void)
{
/*
*
@@ -12258,19 +1388,34 @@ void skill_reload (void)
*
*/
- do_init_skill ();
+ do_init_skill();
}
/*==========================================
* スキル関係初期化処理
*------------------------------------------
*/
-int do_init_skill (void)
+int do_init_skill(void)
{
- skill_readdb ();
-
- add_timer_interval (gettick () + SKILLUNITTIMER_INVERVAL,
- skill_unit_timer, 0, 0, SKILLUNITTIMER_INVERVAL);
+ skill_readdb();
return 0;
}
+
+constexpr size_t num_names = sizeof(skill_names) / sizeof(skill_names[0]);
+
+skill_name_db& skill_lookup_by_id(SkillID id)
+{
+ for (skill_name_db& ner : skill_names)
+ if (ner.id == id)
+ return ner;
+ return skill_names[num_names - 1];
+}
+
+skill_name_db& skill_lookup_by_name(const char *name)
+{
+ for (skill_name_db& ner : skill_names)
+ if (!strcasecmp(name, ner.name) || !strcasecmp(name, ner.desc))
+ return ner;
+ return skill_names[num_names - 1];
+}
diff --git a/src/map/skill.hpp b/src/map/skill.hpp
index 3dea4d3..a724781 100644
--- a/src/map/skill.hpp
+++ b/src/map/skill.hpp
@@ -1,892 +1,138 @@
-// $Id: skill.h,v 1.5 2004/09/25 05:32:19 MouseJstr Exp $
#ifndef SKILL_HPP
#define SKILL_HPP
-#include "../common/timer.hpp"
+#include "skill.t.hpp"
#include "map.hpp"
-#include "magic.hpp"
-#define MAX_SKILL_DB 450
-#define MAX_SKILL_PRODUCE_DB 150
-#define MAX_SKILL_ARROW_DB 150
-#define MAX_SKILL_ABRA_DB 350
-
-#define SKILL_POOL_FLAG 0x1 // is a pool skill
-#define SKILL_POOL_ACTIVE 0x2 // is an active pool skill
-#define SKILL_POOL_ACTIVATED 0x4 // pool skill has been activated (used for clif)
+constexpr int MAX_SKILL_PRODUCE_DB = 150;
+constexpr int MAX_SKILL_ARROW_DB = 150;
+constexpr int MAX_SKILL_ABRA_DB = 350;
// スキルデータベース
struct skill_db
{
- int range[MAX_SKILL_LEVEL], hit, inf, pl, nk, max, stat, poolflags, max_raise; // `max' is the global max, `max_raise' is the maximum attainable via skill-ups
- int num[MAX_SKILL_LEVEL];
- int cast[MAX_SKILL_LEVEL], delay[MAX_SKILL_LEVEL];
- int upkeep_time[MAX_SKILL_LEVEL], upkeep_time2[MAX_SKILL_LEVEL];
- int castcancel, cast_def_rate;
- int inf2, maxcount, skill_type;
- int blewcount[MAX_SKILL_LEVEL];
- int hp[MAX_SKILL_LEVEL], sp[MAX_SKILL_LEVEL], mhp[MAX_SKILL_LEVEL],
+ int range[MAX_SKILL_LEVEL], hit, inf, pl, nk, max;
+ SP stat;
+ SkillFlags poolflags;
+ int max_raise; // `max' is the global max, `max_raise' is the maximum attainable via skill-ups
+ int num[MAX_SKILL_LEVEL];
+ int cast[MAX_SKILL_LEVEL], delay[MAX_SKILL_LEVEL];
+ int upkeep_time[MAX_SKILL_LEVEL], upkeep_time2[MAX_SKILL_LEVEL];
+ int castcancel, cast_def_rate;
+ int inf2, maxcount;
+ int hp[MAX_SKILL_LEVEL], sp[MAX_SKILL_LEVEL], mhp[MAX_SKILL_LEVEL],
hp_rate[MAX_SKILL_LEVEL], sp_rate[MAX_SKILL_LEVEL],
zeny[MAX_SKILL_LEVEL];
- int weapon, state, spiritball[MAX_SKILL_LEVEL];
- int itemid[10], amount[10];
- int castnodex[MAX_SKILL_LEVEL];
+ int weapon;
+ int itemid[10], amount[10];
+ int castnodex[MAX_SKILL_LEVEL];
};
-extern struct skill_db skill_db[MAX_SKILL_DB];
+extern earray<struct skill_db, SkillID, SkillID::MAX_SKILL_DB> skill_db;
struct skill_name_db
{
- int id; // skill id
+ SkillID id; // skill id
const char *name; // search strings
const char *desc; // description that shows up for search's
};
+
+// used only by @skillid for iteration - should be depublicized
extern struct skill_name_db skill_names[];
+skill_name_db& skill_lookup_by_id(SkillID id);
+skill_name_db& skill_lookup_by_name(const char *name);
+
struct block_list;
struct map_session_data;
-struct skill_unit;
-struct skill_unit_group;
-int do_init_skill (void);
+int do_init_skill(void);
// スキルデータベースへのアクセサ
-int skill_get_hit (int id);
-int skill_get_inf (int id);
-int skill_get_pl (int id);
-int skill_get_nk (int id);
-int skill_get_max (int id);
-int skill_get_max_raise (int id);
-int skill_get_range (int id, int lv);
-int skill_get_hp (int id, int lv);
-int skill_get_mhp (int id, int lv);
-int skill_get_sp (int id, int lv);
-int skill_get_zeny (int id, int lv);
-int skill_get_num (int id, int lv);
-int skill_get_cast (int id, int lv);
-int skill_get_delay (int id, int lv);
-int skill_get_time (int id, int lv);
-int skill_get_time2 (int id, int lv);
-int skill_get_castdef (int id);
-int skill_get_weapontype (int id);
-int skill_get_unit_id (int id, int flag);
-int skill_get_inf2 (int id);
-int skill_get_maxcount (int id);
-int skill_get_blewcount (int id, int lv);
-
-// スキルの使用
-int skill_use_id (struct map_session_data *sd, int target_id,
- int skill_num, int skill_lv);
-int skill_use_pos (struct map_session_data *sd,
- int skill_x, int skill_y, int skill_num, int skill_lv);
-
-int skill_castend_map (struct map_session_data *sd, int skill_num,
- const char *map);
-
-int skill_cleartimerskill (struct block_list *src);
-int skill_addtimerskill (struct block_list *src, unsigned int tick,
- int target, int x, int y, int skill_id,
- int skill_lv, int type, int flag);
+int skill_get_hit(SkillID id);
+int skill_get_inf(SkillID id);
+int skill_get_nk(SkillID id);
+int skill_get_max(SkillID id);
+int skill_get_max_raise(SkillID id);
+int skill_get_range(SkillID id, int lv);
+int skill_get_sp(SkillID id, int lv);
+int skill_get_num(SkillID id, int lv);
+int skill_get_cast(SkillID id, int lv);
+int skill_get_delay(SkillID id, int lv);
+int skill_get_inf2(SkillID id);
+int skill_get_maxcount(SkillID id);
// 追加効果
-int skill_additional_effect (struct block_list *src, struct block_list *bl,
- int skillid, int skilllv, int attack_type,
- unsigned int tick);
-
-// ユニットスキル
-struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx,
- int x, int y);
-int skill_delunit (struct skill_unit *unit);
-struct skill_unit_group *skill_initunitgroup (struct block_list *src,
- int count, int skillid,
- int skilllv, int unit_id);
-int skill_delunitgroup (struct skill_unit_group *group);
-struct skill_unit_group_tickset *skill_unitgrouptickset_search (struct
- block_list
- *bl,
- int group_id);
-int skill_unitgrouptickset_delete (struct block_list *bl, int group_id);
-int skill_clear_unitgroup (struct block_list *src);
+int skill_additional_effect(struct block_list *src, struct block_list *bl,
+ SkillID skillid, int skilllv);
-int skill_unit_ondamaged (struct skill_unit *src, struct block_list *bl,
- int damage, unsigned int tick);
+interval_t skill_castfix(struct block_list *bl, interval_t time);
+interval_t skill_delayfix(struct block_list *bl, interval_t time);
-int skill_castfix (struct block_list *bl, int time);
-int skill_delayfix (struct block_list *bl, int time);
-int skill_check_unit_range (int m, int x, int y, int range, int skillid);
-int skill_check_unit_range2 (int m, int x, int y, int range);
-// -- moonsoul (added skill_check_unit_cell)
-int skill_check_unit_cell (int skillid, int m, int x, int y, int unit_id);
-int skill_unit_out_all (struct block_list *bl, unsigned int tick, int range);
-int skill_unit_move (struct block_list *bl, unsigned int tick, int range);
-int skill_unit_move_unit_group (struct skill_unit_group *group, int m,
- int dx, int dy);
-
-struct skill_unit_group *skill_check_dancing (struct block_list *src);
-void skill_stop_dancing (struct block_list *src, int flag);
+void skill_stop_dancing(struct block_list *src, int flag);
// 詠唱キャンセル
-int skill_castcancel (struct block_list *bl, int type);
-
-int skill_gangsterparadise (struct map_session_data *sd, int type);
-void skill_brandishspear_first (struct square *tc, int dir, int x, int y);
-void skill_brandishspear_dir (struct square *tc, int dir, int are);
-int skill_autospell (struct map_session_data *md, int skillid);
-void skill_devotion (struct map_session_data *md, int target);
-void skill_devotion2 (struct block_list *bl, int crusader);
-int skill_devotion3 (struct block_list *bl, int target);
-void skill_devotion_end (struct map_session_data *md,
- struct map_session_data *sd, int target);
+int skill_castcancel(struct block_list *bl, int type);
-#define skill_calc_heal(bl,skill_lv) (( battle_get_lv(bl)+battle_get_int(bl) )/8 *(4+ skill_lv*8))
-
-// その他
-int skill_check_cloaking (struct block_list *bl);
-int skill_is_danceskill (int id);
+int skill_gangsterparadise(struct map_session_data *sd, int type);
+void skill_devotion(struct map_session_data *md, int target);
+int skill_devotion3(struct block_list *bl, int target);
// ステータス異常
-int skill_status_effect (struct block_list *bl, int type, int val1, int val2,
- int val3, int val4, int tick, int flag,
- int spell_invocation);
-int skill_status_change_start (struct block_list *bl, int type, int val1,
- int val2, int val3, int val4, int tick,
- int flag);
-void skill_status_change_timer (timer_id, tick_t, custom_id_t, custom_data_t);
-int skill_status_change_active (struct block_list *bl, int type); // [fate]
-int skill_encchant_eremental_end (struct block_list *bl, int type);
-int skill_status_change_end (struct block_list *bl, int type, int tid);
-int skill_status_change_clear (struct block_list *bl, int type);
+int skill_status_effect(struct block_list *bl, StatusChange type,
+ int val1,
+ interval_t tick, int spell_invocation);
+int skill_status_change_start(struct block_list *bl, StatusChange type,
+ int val1,
+ interval_t tick);
+int skill_status_change_active(struct block_list *bl, StatusChange type); // [fate]
+void skill_status_change_end(struct block_list *bl, StatusChange type, TimerData *tid);
+int skill_status_change_clear(struct block_list *bl, int type);
// mobスキルのため
-int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl,
- int skillid, int skilllv, unsigned int tick,
- int flag);
-int skill_castend_damage_id (struct block_list *src, struct block_list *bl,
- int skillid, int skilllv, unsigned int tick,
- int flag);
-int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid,
- int skilllv, unsigned int tick, int flag);
-
-// スキル攻撃一括処理
-int skill_attack (int attack_type, struct block_list *src,
- struct block_list *dsrc, struct block_list *bl,
- int skillid, int skilllv, unsigned int tick, int flag);
-
-int skill_update_heal_animation (struct map_session_data *sd); // [Fate] Check whether the healing flag must be updated, do so if needed
-
-void skill_reload (void);
-
-enum
-{
- ST_NONE, ST_HIDING, ST_CLOAKING, ST_HIDDEN, ST_RIDING, ST_FALCON, ST_CART,
- ST_SHIELD, ST_SIGHT, ST_EXPLOSIONSPIRITS,
- ST_RECOV_WEIGHT_RATE, ST_MOVE_ENABLE, ST_WATER,
-};
-
-enum
-{ // struct map_session_data の status_changeの番号テーブル
- SC_SENDMAX = 256,
- SC_PROVOKE = 0,
- SC_ENDURE = 1,
- SC_TWOHANDQUICKEN = 2,
- SC_CONCENTRATE = 3,
- SC_HIDING = 4,
- SC_CLOAKING = 5,
- SC_ENCPOISON = 6,
- SC_POISONREACT = 7,
- SC_QUAGMIRE = 8,
- SC_ANGELUS = 9,
- SC_BLESSING = 10,
- SC_SIGNUMCRUCIS = 11,
- SC_INCREASEAGI = 12,
- SC_DECREASEAGI = 13,
- SC_SLOWPOISON = 14,
- SC_IMPOSITIO = 15,
- SC_SUFFRAGIUM = 16,
- SC_ASPERSIO = 17,
- SC_BENEDICTIO = 18,
- SC_KYRIE = 19,
- SC_MAGNIFICAT = 20,
- SC_GLORIA = 21,
- SC_AETERNA = 22,
- SC_ADRENALINE = 23,
- SC_WEAPONPERFECTION = 24,
- SC_OVERTHRUST = 25,
- SC_MAXIMIZEPOWER = 26,
- SC_RIDING = 27,
- SC_FALCON = 28,
- SC_TRICKDEAD = 29,
- SC_LOUD = 30,
- SC_ENERGYCOAT = 31,
- SC_BROKNARMOR = 32,
- SC_BROKNWEAPON = 33,
- SC_HALLUCINATION = 34,
- SC_WEIGHT50 = 35,
- SC_WEIGHT90 = 36,
- SC_SPEEDPOTION0 = 37,
- SC_SPEEDPOTION1 = 38,
- SC_SPEEDPOTION2 = 39,
-
- SC_STRIPWEAPON = 50,
- SC_STRIPSHIELD = 51,
- SC_STRIPARMOR = 52,
- SC_STRIPHELM = 53,
- SC_CP_WEAPON = 54,
- SC_CP_SHIELD = 55,
- SC_CP_ARMOR = 56,
- SC_CP_HELM = 57,
- SC_AUTOGUARD = 58,
- SC_REFLECTSHIELD = 59,
- SC_DEVOTION = 60,
- SC_PROVIDENCE = 61,
- SC_DEFENDER = 62,
- SC_AUTOSPELL = 65,
- SC_EXPLOSIONSPIRITS = 86,
- SC_STEELBODY = 87,
- SC_SPEARSQUICKEN = 68,
-
- SC_HEALING = 70,
-
- SC_SIGHTTRASHER = 73,
-
- SC_COMBO = 89,
- SC_FLAMELAUNCHER = 90,
- SC_FROSTWEAPON = 91,
- SC_LIGHTNINGLOADER = 92,
- SC_SEISMICWEAPON = 93,
-
- SC_AURABLADE = 103,
- SC_PARRYING = 104,
- SC_CONCENTRATION = 105,
- SC_TENSIONRELAX = 106,
- SC_BERSERK = 107,
-
- SC_ASSUMPTIO = 110,
-
- SC_MAGICPOWER = 113,
-
- SC_TRUESIGHT = 115,
- SC_WINDWALK = 116,
- SC_MELTDOWN = 117,
- SC_CARTBOOST = 118,
-
- SC_REJECTSWORD = 120,
- SC_MARIONETTE = 121,
-
- SC_HEADCRUSH = 124,
- SC_JOINTBEAT = 125,
- SC_BASILICA = 125,
-
- SC_STONE = 128,
- SC_FREEZE = 129,
- SC_STAN = 130,
- SC_SLEEP = 131,
- SC_POISON = 132,
- SC_CURSE = 133,
- SC_SILENCE = 134,
- SC_CONFUSION = 135,
- SC_BLIND = 136,
-
- SC_SAFETYWALL = 140,
- SC_PNEUMA = 141,
- SC_WATERBALL = 142,
- SC_ANKLE = 143,
- SC_DANCING = 144,
- SC_KEEPING = 145,
- SC_BARRIER = 146,
-
- SC_MAGICROD = 149,
- SC_SIGHT = 150,
- SC_RUWACH = 151,
- SC_AUTOCOUNTER = 152,
- SC_VOLCANO = 153,
- SC_DELUGE = 154,
- SC_VIOLENTGALE = 155,
- SC_BLADESTOP_WAIT = 156,
- SC_BLADESTOP = 157,
- SC_EXTREMITYFIST = 158,
- SC_GRAFFITI = 159,
- SC_ENSEMBLE = 159,
-
- SC_LULLABY = 160,
- SC_RICHMANKIM = 161,
- SC_ETERNALCHAOS = 162,
- SC_DRUMBATTLE = 163,
- SC_NIBELUNGEN = 164,
- SC_ROKISWEIL = 165,
- SC_INTOABYSS = 166,
- SC_SIEGFRIED = 167,
- SC_DISSONANCE = 168,
- SC_WHISTLE = 169,
- SC_ASSNCROS = 170,
- SC_POEMBRAGI = 171,
- SC_APPLEIDUN = 172,
- SC_UGLYDANCE = 173,
- SC_HUMMING = 174,
- SC_DONTFORGETME = 175,
- SC_FORTUNE = 176,
- SC_SERVICE4U = 177,
- SC_FOGWALL = 178,
- SC_GOSPEL = 179,
- SC_SPIDERWEB = 180,
- SC_MEMORIZE = 181,
- SC_LANDPROTECTOR = 182,
- SC_ADAPTATION = 183,
- SC_CHASEWALK = 184,
- SC_ATKPOT = 185,
- SC_MATKPOT = 186,
- SC_WEDDING = 187,
- SC_NOCHAT = 188,
- SC_SPLASHER = 189,
- SC_SELFDESTRUCTION = 190,
- SC_MINDBREAKER = 191,
- SC_SPELLBREAKER = 192,
-
-// Added for Fate's spells
- SC_HIDE = 194, // Hide from `detect' magic
- SC_HALT_REGENERATE = 195, // Suspend regeneration
- SC_FLYING_BACKPACK = 196, // Flying backpack
- SC_MBARRIER = 197, // Magical barrier, magic resistance (val1 : power (%))
- SC_HASTE = 198, // `Haste' spell (val1 : power)
- SC_PHYS_SHIELD = 199, // `Protect' spell, reduce damage (val1: power)
-
- SC_DIVINA = SC_SILENCE,
-};
-extern int SkillStatusChangeTable[];
+int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl,
+ SkillID skillid, int skilllv);
+int skill_castend_damage_id(struct block_list *src, struct block_list *bl,
+ SkillID skillid, int skilllv, tick_t tick,
+ BCT flag);
-enum
-{
- NV_EMOTE = 1,
- NV_TRADE,
- NV_PARTY,
-
- SM_SWORD,
- SM_TWOHAND,
- SM_RECOVERY,
- SM_BASH,
- SM_PROVOKE,
- SM_MAGNUM,
- SM_ENDURE,
-
- MG_SRECOVERY,
- MG_SIGHT,
- MG_NAPALMBEAT,
- MG_SAFETYWALL,
- MG_SOULSTRIKE,
- MG_COLDBOLT,
- MG_FROSTDIVER,
- MG_STONECURSE,
- MG_FIREBALL,
- MG_FIREWALL,
- MG_FIREBOLT,
- MG_LIGHTNINGBOLT,
- MG_THUNDERSTORM,
-
- AL_DP,
- AL_DEMONBANE,
- AL_RUWACH,
- AL_PNEUMA,
- AL_TELEPORT,
- AL_WARP,
- AL_HEAL,
- AL_INCAGI,
- AL_DECAGI,
- AL_HOLYWATER,
- AL_CRUCIS,
- AL_ANGELUS,
- AL_BLESSING,
- AL_CURE,
-
- MC_INCCARRY,
- MC_DISCOUNT,
- MC_OVERCHARGE,
- MC_PUSHCART,
- MC_IDENTIFY,
- MC_VENDING,
- MC_MAMMONITE,
-
- AC_OWL = 45,
- AC_VULTURE,
- AC_CONCENTRATION,
- AC_DOUBLE,
- AC_SHOWER,
-
- TF_DOUBLE,
- TF_MISS,
- TF_STEAL,
- TF_HIDING,
- TF_POISON,
- TF_DETOXIFY,
-
- ALL_RESURRECTION,
-
- KN_SPEARMASTERY,
- KN_PIERCE,
- KN_BRANDISHSPEAR,
- KN_SPEARSTAB,
- KN_SPEARBOOMERANG,
- KN_TWOHANDQUICKEN,
- KN_AUTOCOUNTER,
- KN_BOWLINGBASH,
- KN_RIDING,
- KN_CAVALIERMASTERY,
-
- PR_MACEMASTERY,
- PR_IMPOSITIO,
- PR_SUFFRAGIUM,
- PR_ASPERSIO,
- PR_BENEDICTIO,
- PR_SANCTUARY,
- PR_SLOWPOISON,
- PR_STRECOVERY,
- PR_KYRIE,
- PR_MAGNIFICAT,
- PR_GLORIA,
- PR_LEXDIVINA,
- PR_TURNUNDEAD,
- PR_LEXAETERNA,
- PR_MAGNUS,
-
- WZ_FIREPILLAR,
- WZ_SIGHTRASHER,
- WZ_FIREIVY,
- WZ_METEOR,
- WZ_JUPITEL,
- WZ_VERMILION,
- WZ_WATERBALL,
- WZ_ICEWALL,
- WZ_FROSTNOVA,
- WZ_STORMGUST,
- WZ_EARTHSPIKE,
- WZ_HEAVENDRIVE,
- WZ_QUAGMIRE,
- WZ_ESTIMATION,
-
- BS_IRON,
- BS_STEEL,
- BS_ENCHANTEDSTONE,
- BS_ORIDEOCON,
- BS_DAGGER,
- BS_SWORD,
- BS_TWOHANDSWORD,
- BS_AXE,
- BS_MACE,
- BS_KNUCKLE,
- BS_SPEAR,
- BS_HILTBINDING,
- BS_FINDINGORE,
- BS_WEAPONRESEARCH,
- BS_REPAIRWEAPON,
- BS_SKINTEMPER,
- BS_HAMMERFALL,
- BS_ADRENALINE,
- BS_WEAPONPERFECT,
- BS_OVERTHRUST,
- BS_MAXIMIZE,
-
- HT_SKIDTRAP,
- HT_LANDMINE,
- HT_ANKLESNARE,
- HT_SHOCKWAVE,
- HT_SANDMAN,
- HT_FLASHER,
- HT_FREEZINGTRAP,
- HT_BLASTMINE,
- HT_CLAYMORETRAP,
- HT_REMOVETRAP,
- HT_TALKIEBOX,
- HT_BEASTBANE,
- HT_FALCON,
- HT_STEELCROW,
- HT_BLITZBEAT,
- HT_DETECTING,
- HT_SPRINGTRAP,
-
- AS_RIGHT,
- AS_LEFT,
- AS_KATAR,
- AS_CLOAKING,
- AS_SONICBLOW,
- AS_GRIMTOOTH,
- AS_ENCHANTPOISON,
- AS_POISONREACT,
- AS_VENOMDUST,
- AS_SPLASHER,
-
- NV_FIRSTAID,
- NV_TRICKDEAD,
- SM_MOVINGRECOVERY,
- SM_FATALBLOW,
- SM_AUTOBERSERK,
- AC_MAKINGARROW,
- AC_CHARGEARROW,
- TF_SPRINKLESAND,
- TF_BACKSLIDING,
- TF_PICKSTONE,
- TF_THROWSTONE,
- MC_CARTREVOLUTION,
- MC_CHANGECART,
- MC_LOUD,
- AL_HOLYLIGHT,
- MG_ENERGYCOAT,
-
- NPC_PIERCINGATT,
- NPC_MENTALBREAKER,
- NPC_RANGEATTACK,
- NPC_ATTRICHANGE,
- NPC_CHANGEWATER,
- NPC_CHANGEGROUND,
- NPC_CHANGEFIRE,
- NPC_CHANGEWIND,
- NPC_CHANGEPOISON,
- NPC_CHANGEHOLY,
- NPC_CHANGEDARKNESS,
- NPC_CHANGETELEKINESIS,
- NPC_CRITICALSLASH,
- NPC_COMBOATTACK,
- NPC_GUIDEDATTACK,
- NPC_SELFDESTRUCTION,
- NPC_SPLASHATTACK,
- NPC_SUICIDE,
- NPC_POISON,
- NPC_BLINDATTACK,
- NPC_SILENCEATTACK,
- NPC_STUNATTACK,
- NPC_PETRIFYATTACK,
- NPC_CURSEATTACK,
- NPC_SLEEPATTACK,
- NPC_RANDOMATTACK,
- NPC_WATERATTACK,
- NPC_GROUNDATTACK,
- NPC_FIREATTACK,
- NPC_WINDATTACK,
- NPC_POISONATTACK,
- NPC_HOLYATTACK,
- NPC_DARKNESSATTACK,
- NPC_TELEKINESISATTACK,
- NPC_MAGICALATTACK,
- NPC_METAMORPHOSIS,
- NPC_PROVOCATION,
- NPC_SMOKING,
- NPC_SUMMONSLAVE,
- NPC_EMOTION,
- NPC_TRANSFORMATION,
- NPC_BLOODDRAIN,
- NPC_ENERGYDRAIN,
- NPC_KEEPING,
- NPC_DARKBREATH,
- NPC_DARKBLESSING,
- NPC_BARRIER,
- NPC_DEFENDER,
- NPC_LICK,
- NPC_HALLUCINATION,
- NPC_REBIRTH,
- NPC_SUMMONMONSTER,
-
- RG_SNATCHER,
- RG_STEALCOIN,
- RG_BACKSTAP,
- RG_TUNNELDRIVE,
- RG_RAID,
- RG_STRIPWEAPON,
- RG_STRIPSHIELD,
- RG_STRIPARMOR,
- RG_STRIPHELM,
- RG_INTIMIDATE,
- RG_GRAFFITI,
- RG_FLAGGRAFFITI,
- RG_CLEANER,
- RG_GANGSTER,
- RG_COMPULSION,
- RG_PLAGIARISM,
+int skill_update_heal_animation(struct map_session_data *sd); // [Fate] Check whether the healing flag must be updated, do so if needed
- AM_AXEMASTERY,
- AM_LEARNINGPOTION,
- AM_PHARMACY,
- AM_DEMONSTRATION,
- AM_ACIDTERROR,
- AM_POTIONPITCHER,
- AM_CANNIBALIZE,
- AM_SPHEREMINE,
- AM_CP_WEAPON,
- AM_CP_SHIELD,
- AM_CP_ARMOR,
- AM_CP_HELM,
- AM_BIOETHICS,
- AM_BIOTECHNOLOGY,
- AM_CREATECREATURE,
- AM_CULTIVATION,
- AM_FLAMECONTROL,
- AM_CALLHOMUN,
- AM_REST,
- AM_DRILLMASTER,
- AM_HEALHOMUN,
- AM_RESURRECTHOMUN,
-
- CR_TRUST,
- CR_AUTOGUARD,
- CR_SHIELDCHARGE,
- CR_SHIELDBOOMERANG,
- CR_REFLECTSHIELD,
- CR_HOLYCROSS,
- CR_GRANDCROSS,
- CR_DEVOTION,
- CR_PROVIDENCE,
- CR_DEFENDER,
- CR_SPEARQUICKEN,
-
- MO_IRONHAND,
- MO_SPIRITSRECOVERY,
- MO_CALLSPIRITS,
- MO_ABSORBSPIRITS,
- MO_TRIPLEATTACK,
- MO_BODYRELOCATION,
- MO_DODGE,
- MO_INVESTIGATE,
- MO_FINGEROFFENSIVE,
- MO_STEELBODY,
- MO_BLADESTOP,
- MO_EXPLOSIONSPIRITS,
- MO_EXTREMITYFIST,
- MO_CHAINCOMBO,
- MO_COMBOFINISH,
-
- SA_ADVANCEDBOOK,
- SA_CASTCANCEL,
- SA_MAGICROD,
- SA_SPELLBREAKER,
- SA_FREECAST,
- SA_AUTOSPELL,
- SA_FLAMELAUNCHER,
- SA_FROSTWEAPON,
- SA_LIGHTNINGLOADER,
- SA_SEISMICWEAPON,
- SA_DRAGONOLOGY,
- SA_VOLCANO,
- SA_DELUGE,
- SA_VIOLENTGALE,
- SA_LANDPROTECTOR,
- SA_DISPELL,
- SA_ABRACADABRA,
- SA_MONOCELL,
- SA_CLASSCHANGE,
- SA_SUMMONMONSTER,
- SA_REVERSEORCISH,
- SA_DEATH,
- SA_FORTUNE,
- SA_TAMINGMONSTER,
- SA_QUESTION,
- SA_GRAVITY,
- SA_LEVELUP,
- SA_INSTANTDEATH,
- SA_FULLRECOVERY,
- SA_COMA,
-
- BD_ADAPTATION,
- BD_ENCORE,
- BD_LULLABY,
- BD_RICHMANKIM,
- BD_ETERNALCHAOS,
- BD_DRUMBATTLEFIELD,
- BD_RINGNIBELUNGEN,
- BD_ROKISWEIL,
- BD_INTOABYSS,
- BD_SIEGFRIED,
- BD_RAGNAROK,
-
- BA_MUSICALLESSON,
- BA_MUSICALSTRIKE,
- BA_DISSONANCE,
- BA_FROSTJOKE,
- BA_WHISTLE,
- BA_ASSASSINCROSS,
- BA_POEMBRAGI,
- BA_APPLEIDUN,
-
- DC_DANCINGLESSON,
- DC_THROWARROW,
- DC_UGLYDANCE,
- DC_SCREAM,
- DC_HUMMING,
- DC_DONTFORGETME,
- DC_FORTUNEKISS,
- DC_SERVICEFORYOU,
-
- NPC_SELFDESTRUCTION2 = 333,
-
- WE_MALE = 334,
- WE_FEMALE,
- WE_CALLPARTNER,
-
- NPC_DARKCROSS = 338,
-
- TMW_SKILLPOOL = 339, // skill pool size
-
- TMW_MAGIC = 340,
- TMW_MAGIC_LIFE = 341,
- TMW_MAGIC_WAR = 342,
- TMW_MAGIC_TRANSMUTE = 343,
- TMW_MAGIC_NATURE = 344,
- TMW_MAGIC_ETHER = 345,
- TMW_MAGIC_DARK = 346,
- TMW_MAGIC_LIGHT = 347,
-
- TMW_BRAWLING = 350,
- TMW_LUCKY_COUNTER = 351,
- TMW_SPEED = 352,
- TMW_RESIST_POISON = 353,
- TMW_ASTRAL_SOUL = 354,
- TMW_RAGING = 355,
-
- LK_AURABLADE = 356,
- LK_PARRYING,
- LK_CONCENTRATION,
- LK_TENSIONRELAX,
- LK_BERSERK,
- LK_FURY,
- HP_ASSUMPTIO,
- HP_BASILICA,
- HP_MEDITATIO,
- HW_SOULDRAIN,
- HW_MAGICCRASHER,
- HW_MAGICPOWER,
- PA_PRESSURE,
- PA_SACRIFICE,
- PA_GOSPEL,
- CH_PALMSTRIKE,
- CH_TIGERFIST,
- CH_CHAINCRUSH,
- PF_HPCONVERSION,
- PF_SOULCHANGE,
- PF_SOULBURN,
- ASC_KATAR,
- ASC_HALLUCINATION,
- ASC_EDP,
- ASC_BREAKER,
- SN_SIGHT,
- SN_FALCONASSAULT,
- SN_SHARPSHOOTING,
- SN_WINDWALK,
- WS_MELTDOWN,
- WS_CREATECOIN,
- WS_CREATENUGGET,
- WS_CARTBOOST,
- WS_SYSTEMCREATE,
- ST_CHASEWALK,
- ST_REJECTSWORD,
- ST_STEALBACKPACK,
- CR_ALCHEMY,
- CR_SYNTHESISPOTION,
- CG_ARROWVULCAN,
- CG_MOONLIT,
- CG_MARIONETTE,
- LK_SPIRALPIERCE,
- LK_HEADCRUSH,
- LK_JOINTBEAT,
- HW_NAPALMVULCAN,
- CH_SOULCOLLECT,
- PF_MINDBREAKER,
- PF_MEMORIZE,
- PF_FOGWALL,
- PF_SPIDERWEB,
- ASC_METEORASSAULT,
- ASC_CDP,
- WE_BABY,
- WE_CALLPARENT,
- WE_CALLBABY,
- TK_RUN,
- TK_READYSTORM,
- TK_STORMKICK,
- TK_READYDOWN,
- TK_DOWNKICK,
- TK_READYTURN,
- TK_TURNKICK,
- TK_READYCOUNTER,
- TK_COUNTER,
- TK_DODGE,
- TK_JUMPKICK,
- TK_HPTIME,
- TK_SPTIME,
- TK_POWER,
- TK_SEVENWIND,
- TK_HIGHJUMP,
- SG_FEEL,
- SG_SUN_WARM,
- SG_MOON_WARM,
- SG_STAR_WARM,
- SG_SUN_COMFORT,
- SG_MOON_COMFORT,
- SG_STAR_COMFORT,
- SG_HATE,
- SG_SUN_ANGER,
- SG_MOON_ANGER,
- SG_STAR_ANGER,
- SG_SUN_BLESS,
- SG_MOON_BLESS,
- SG_STAR_BLESS,
- SG_DEVIL,
- SG_FRIEND,
- SG_KNOWLEDGE,
- SG_FUSION,
- SL_ALCHEMIST,
- AM_BERSERKPITCHER,
- SL_MONK,
- SL_STAR,
- SL_SAGE,
- SL_CRUSADER,
- SL_SUPERNOVICE,
- SL_KNIGHT,
- SL_WIZARD,
- SL_PRIEST,
- SL_BARDDANCER,
- SL_ROGUE,
- SL_ASSASIN,
- SL_BLACKSMITH,
- BS_ADRENALINE2,
- SL_HUNTER,
- SL_SOULLINKER,
- SL_KAIZEL,
- SL_KAAHI,
- SL_KAUPE,
- SL_KAITE,
- SL_KAINA,
- SL_STIN,
- SL_STUN,
- SL_SMA,
- SL_SWOO,
- SL_SKE,
- SL_SKA,
-
- GD_APPROVAL = 10000,
- GD_KAFRACONTACT,
- GD_GUARDIANRESEARCH,
- GD_CHARISMA,
- GD_EXTENSION,
-};
+void skill_reload(void);
// [Fate] Skill pools API
// Max. # of active entries in the skill pool
-#define MAX_SKILL_POOL 3
+constexpr int MAX_SKILL_POOL = 3;
// Max. # of skills that may be classified as pool skills in db/skill_db.txt
-#define MAX_POOL_SKILLS 128
+constexpr int MAX_POOL_SKILLS = 128;
-extern int skill_pool_skills[MAX_POOL_SKILLS]; // All pool skills
+extern SkillID skill_pool_skills[MAX_POOL_SKILLS]; // All pool skills
extern int skill_pool_skills_size; // Number of entries in skill_pool_skills
-int skill_pool (struct map_session_data *sd, int *skills); // Yields all active skills in the skill pool; no more than MAX_SKILL_POOL. Return is number of skills.
-int skill_pool_size (struct map_session_data *sd);
-int skill_pool_max (struct map_session_data *sd); // Max. number of pool skills
-void skill_pool_empty (struct map_session_data *sd); // Deactivate all pool skills
-int skill_pool_activate (struct map_session_data *sd, int skill); // Skill into skill pool. Return is zero iff okay.
-int skill_pool_is_activated (struct map_session_data *sd, int skill); // Skill into skill pool. Return is zero when activated.
-int skill_pool_deactivate (struct map_session_data *sd, int skill); // Skill out of skill pool. Return is zero iff okay.
-const char *skill_name(int skill); // Yield configurable skill name
-int skill_stat (int skill); // Yields the stat associated with a skill. Returns zero if none, or SP_STR, SP_VIT, ... otherwise
-int skill_power (struct map_session_data *sd, int skill); // Yields the power of a skill. This is zero if the skill is unknown or if it's a pool skill that is outside of the skill pool,
- // otherwise a value from 0 to 255 (with 200 being the `normal maximum')
-int skill_power_bl (struct block_list *bl, int skill); // Yields the power of a skill. This is zero if the skill is unknown or if it's a pool skill that is outside of the skill pool,
- // otherwise a value from 0 to 255 (with 200 being the `normal maximum')
-
-void skill_pool_register (int id); // [Fate] Remember that a certain skill ID belongs to a pool skill
-#endif
+// Yields all active skills in the skill pool; no more than MAX_SKILL_POOL. Return is number of skills.
+int skill_pool(struct map_session_data *sd, SkillID *skills);
+int skill_pool_size(struct map_session_data *sd);
+int skill_pool_max(struct map_session_data *sd); // Max. number of pool skills
+// Skill into skill pool. Return is zero iff okay.
+int skill_pool_activate(struct map_session_data *sd, SkillID skill);
+// Skill into skill pool. Return is zero when activated.
+bool skill_pool_is_activated(struct map_session_data *sd, SkillID skill);
+// Skill out of skill pool. Return is zero iff okay.
+int skill_pool_deactivate(struct map_session_data *sd, SkillID skill);
+// Yield configurable skill name
+inline
+const char *skill_name(SkillID skill)
+{
+ return skill_lookup_by_id(skill).desc;
+}
+// Yields the power of a skill.
+// This is zero if the skill is unknown
+// or if it's a pool skill that is outside of the skill pool,
+// otherwise a value from 0 to 255 (with 200 being the `normal maximum')
+int skill_power(struct map_session_data *sd, SkillID skill);
+int skill_power_bl(struct block_list *bl, SkillID skill);
+
+// [Fate] Remember that a certain skill ID belongs to a pool skill
+void skill_pool_register(SkillID id);
+#endif // SKILL_HPP
diff --git a/src/map/skill.t.hpp b/src/map/skill.t.hpp
new file mode 100644
index 0000000..3214062
--- /dev/null
+++ b/src/map/skill.t.hpp
@@ -0,0 +1,116 @@
+#ifndef SKILL_T_HPP
+#define SKILL_T_HPP
+
+#include <cstdint>
+
+#include "../common/utils2.hpp"
+
+// TODO remove most of these as their corresponding SkillIDs get deleted.
+enum class StatusChange : uint16_t
+{
+ // indices into (map_session_data).status_change
+ SC_SENDMAX = 256,
+
+ // sometimes means "none", sometimes not
+ NEGATIVE1 = 0xffff,
+
+ // these ones are used by clif_status_change,
+ // e.g. by the magic system
+ ZERO = 0,
+ ATTACK_ICON_GENERIC = 2000,
+ ATTACK_ICON_SHEARING = 2001,
+ CART = 0x0c,
+ CLIF_OPTION_SC_INVISIBILITY = 0x1000,
+ CLIF_OPTION_SC_SCRIBE = 0x1001,
+
+ // the rest are the normal effects
+ SC_SLOWPOISON = 14, // item script
+
+ SC_BROKNARMOR = 32, // ?
+ SC_BROKNWEAPON = 33, // ?
+
+ SC_WEIGHT50 = 35, // ? sort of used
+ SC_WEIGHT90 = 36, // definitely used
+ SC_SPEEDPOTION0 = 37, // item script
+
+ SC_HEALING = 70, // item script
+
+ SC_POISON = 132, // bad; actually used
+
+ SC_ATKPOT = 185, // item script
+ SC_MATKPOT = 186, // unused, but kept for parallel
+
+// Added for Fate's spells
+ SC_HIDE = 194, // Hide from `detect' magic (PCs only)
+ SC_SHEARED = 194, // Has been sheared (mobs only)
+ SC_HALT_REGENERATE = 195, // Suspend regeneration
+ SC_FLYING_BACKPACK = 196, // Flying backpack
+ SC_MBARRIER = 197, // Magical barrier, magic resistance (val1 : power (%))
+ SC_HASTE = 198, // `Haste' spell (val1 : power)
+ SC_PHYS_SHIELD = 199, // `Protect' spell, reduce damage (val1: power)
+ MAX_STATUSCHANGE = 200,
+};
+
+enum class SkillID : uint16_t
+{
+ // TODO: Remove these!
+ NEGATIVE = 0xffff,
+ ZERO = 0x0000,
+ ONE = 0x0001,
+
+ // Basic skills.
+ // These should probably be made unconditional.
+ NV_EMOTE = 1, //
+ NV_TRADE = 2, //
+ NV_PARTY = 3, //
+
+ AC_OWL = 45, // Mallard's Eye
+
+ NPC_SELFDESTRUCTION = 175, //
+
+ NPC_POISON = 178, //
+
+ NPC_SUMMONSLAVE = 198, //
+ NPC_EMOTION = 199, //
+
+ TMW_SKILLPOOL = 339, // skill pool size
+
+ // magic skills
+ TMW_MAGIC = 340, //
+ TMW_MAGIC_LIFE = 341, //
+ TMW_MAGIC_WAR = 342, //
+ TMW_MAGIC_TRANSMUTE = 343, //
+ TMW_MAGIC_NATURE = 344, //
+ TMW_MAGIC_ETHER = 345, //
+ TMW_MAGIC_DARK = 346, //
+ TMW_MAGIC_LIGHT = 347, //
+
+ // focusable skills
+ TMW_BRAWLING = 350, //
+ TMW_LUCKY_COUNTER = 351, //
+ TMW_SPEED = 352, //
+ TMW_RESIST_POISON = 353, //
+ TMW_ASTRAL_SOUL = 354, //
+ TMW_RAGING = 355, //
+
+ // Note: this value is also hard-coded in common/mmo.hpp
+ MAX_SKILL_DB = 474, // not 450
+};
+
+namespace e
+{
+enum class SkillFlags : uint16_t
+{
+ ZERO = 0x00,
+ // is a pool skill
+ POOL_FLAG = 0x01,
+ // is an active pool skill
+ POOL_ACTIVE = 0x02,
+ // pool skill has been activated (used for clif)
+ POOL_ACTIVATED = 0x04,
+};
+ENUM_BITWISE_OPERATORS(SkillFlags)
+}
+using e::SkillFlags;
+
+#endif // SKILL_T_HPP
diff --git a/src/map/storage.cpp b/src/map/storage.cpp
index 7d54343..dcd0dd7 100644
--- a/src/map/storage.cpp
+++ b/src/map/storage.cpp
@@ -1,34 +1,35 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
+// For more information, see COPYING in the main folder
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include "storage.hpp"
+
+#include <cstdlib>
+#include <cstring>
#include "../common/db.hpp"
#include "../common/nullpo.hpp"
-#include "storage.hpp"
#include "chrif.hpp"
-#include "itemdb.hpp"
#include "clif.hpp"
#include "intif.hpp"
+#include "itemdb.hpp"
+#include "map.hpp"
#include "pc.hpp"
-#include "guild.hpp"
-#include "battle.hpp"
-#include "atcommand.hpp"
-static struct dbt *storage_db;
-static struct dbt *guild_storage_db;
+#include "../poison.hpp"
+
+static
+Map<int, struct storage> storage_db;
/*==========================================
* 倉庫内アイテムソート
*------------------------------------------
*/
-int storage_comp_item (const void *_i1, const void *_i2)
+static
+int storage_comp_item(const void *_i1, const void *_i2)
{
- struct item *i1 = (struct item *) _i1;
- struct item *i2 = (struct item *) _i2;
+ const struct item *i1 = (const struct item *) _i1;
+ const struct item *i2 = (const struct item *) _i2;
if (i1->nameid == i2->nameid)
return 0;
@@ -39,123 +40,61 @@ int storage_comp_item (const void *_i1, const void *_i2)
return i1->nameid - i2->nameid;
}
-static void guild_storage_db_final (db_key_t key, db_val_t data, va_list ap)
-{
- struct guild_storage *gstor = (struct guild_storage *) data;
- free (gstor);
-}
-
-static void storage_db_final (db_key_t key, db_val_t data, va_list ap)
-{
- struct storage *stor = (struct storage *) data;
- free (stor);
-}
-
-void sortage_sortitem (struct storage *stor)
-{
- nullpo_retv (stor);
- qsort (stor->storage_, MAX_STORAGE, sizeof (struct item),
- storage_comp_item);
-}
-
-void sortage_gsortitem (struct guild_storage *gstor)
+static
+void sortage_sortitem(struct storage *stor)
{
- nullpo_retv (gstor);
- qsort (gstor->storage_, MAX_GUILD_STORAGE, sizeof (struct item),
+ nullpo_retv(stor);
+ qsort(stor->storage_, MAX_STORAGE, sizeof(struct item),
storage_comp_item);
}
-/*==========================================
- * 初期化とか
- *------------------------------------------
- */
-int do_init_storage (void) // map.c::do_init()から呼ばれる
+void do_init_storage(void)
{
- storage_db = numdb_init ();
- guild_storage_db = numdb_init ();
- return 1;
}
-void do_final_storage (void) // by [MC Cameri]
+void do_final_storage(void)
{
- if (storage_db)
- numdb_final (storage_db, storage_db_final);
- if (guild_storage_db)
- numdb_final (guild_storage_db, guild_storage_db_final);
+ storage_db.clear();
}
-static void storage_reconnect_sub (db_key_t key, db_val_t data, va_list ap)
-{ //Parses storage and saves 'dirty' ones upon reconnect. [Skotlex]
- int type = va_arg (ap, int);
- if (type)
- { //Guild Storage
- struct guild_storage *stor = (struct guild_storage *) data;
- if (stor->dirty && stor->storage_status == 0) //Save closed storages.
- storage_guild_storagesave (0, stor->guild_id, 0);
- }
- else
- { //Account Storage
- struct storage *stor = (struct storage *) data;
- if (stor->dirty && stor->storage_status == 0) //Save closed storages.
- storage_storage_save (stor->account_id, stor->dirty == 2 ? 1 : 0);
- }
-}
-
-//Function to be invoked upon server reconnection to char. To save all 'dirty' storages [Skotlex
-void do_reconnect_storage (void)
-{
- numdb_foreach (storage_db, storage_reconnect_sub, 0);
- numdb_foreach (guild_storage_db, storage_reconnect_sub, 1);
-}
-
-struct storage *account2storage (int account_id)
+struct storage *account2storage(int account_id)
{
- struct storage *stor =
- (struct storage *) numdb_search (storage_db, account_id);
+ struct storage *stor = storage_db.search(account_id);
if (stor == NULL)
{
- CREATE (stor, struct storage, 1);
+ stor = storage_db.init(account_id);
stor->account_id = account_id;
- numdb_insert (storage_db, stor->account_id, stor);
}
return stor;
}
// Just to ask storage, without creation
-struct storage *account2storage2 (int account_id)
+struct storage *account2storage2(int account_id)
{
- return (struct storage *) numdb_search (storage_db, account_id);
+ return storage_db.search(account_id);
}
-int storage_delete (int account_id)
+static
+void storage_delete(int account_id)
{
- struct storage *stor =
- (struct storage *) numdb_search (storage_db, account_id);
- if (stor)
- {
- numdb_erase (storage_db, account_id);
- free (stor);
- }
- return 0;
+ storage_db.erase(account_id);
}
/*==========================================
* カプラ倉庫を開く
*------------------------------------------
*/
-int storage_storageopen (struct map_session_data *sd)
+int storage_storageopen(struct map_session_data *sd)
{
- struct storage *stor;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- if (sd->state.storage_flag)
+ if (sd->state.storage_open)
return 1; //Already open?
- if ((stor =
- (struct storage *) numdb_search (storage_db,
- sd->status.account_id)) == NULL)
+ struct storage *stor = storage_db.search(sd->status.account_id);
+ if (stor == NULL)
{ //Request storage.
- intif_request_storage (sd->status.account_id);
+ intif_request_storage(sd->status.account_id);
return 1;
}
@@ -163,10 +102,10 @@ int storage_storageopen (struct map_session_data *sd)
return 1; //Already open/player already has it open...
stor->storage_status = 1;
- sd->state.storage_flag = 1;
- clif_storageitemlist (sd, stor);
- clif_storageequiplist (sd, stor);
- clif_updatestorageamount (sd, stor);
+ sd->state.storage_open = 1;
+ clif_storageitemlist(sd, stor);
+ clif_storageequiplist(sd, stor);
+ clif_updatestorageamount(sd, stor);
return 0;
}
@@ -174,27 +113,28 @@ int storage_storageopen (struct map_session_data *sd)
* Internal add-item function.
*------------------------------------------
*/
-static int storage_additem (struct map_session_data *sd, struct storage *stor,
+static
+int storage_additem(struct map_session_data *sd, struct storage *stor,
struct item *item_data, int amount)
{
struct item_data *data;
- int i;
+ int i;
if (item_data->nameid <= 0 || amount <= 0)
return 1;
- data = itemdb_search (item_data->nameid);
+ data = itemdb_search(item_data->nameid);
- if (!itemdb_isequip2 (data))
+ if (!itemdb_isequip2(data))
{ //Stackable
for (i = 0; i < MAX_STORAGE; i++)
{
- if (compare_item (&stor->storage_[i], item_data))
+ if (compare_item(&stor->storage_[i], item_data))
{
if (amount > MAX_AMOUNT - stor->storage_[i].amount)
return 1;
stor->storage_[i].amount += amount;
- clif_storageitemadded (sd, stor, i, amount);
+ clif_storageitemadded(sd, stor, i, amount);
stor->dirty = 1;
return 0;
}
@@ -206,11 +146,11 @@ static int storage_additem (struct map_session_data *sd, struct storage *stor,
if (i >= MAX_STORAGE)
return 1;
- memcpy (&stor->storage_[i], item_data, sizeof (stor->storage_[0]));
+ memcpy(&stor->storage_[i], item_data, sizeof(stor->storage_[0]));
stor->storage_[i].amount = amount;
stor->storage_amount++;
- clif_storageitemadded (sd, stor, i, amount);
- clif_updatestorageamount (sd, stor);
+ clif_storageitemadded(sd, stor, i, amount);
+ clif_updatestorageamount(sd, stor);
stor->dirty = 1;
return 0;
}
@@ -219,7 +159,8 @@ static int storage_additem (struct map_session_data *sd, struct storage *stor,
* Internal del-item function
*------------------------------------------
*/
-static int storage_delitem (struct map_session_data *sd, struct storage *stor,
+static
+int storage_delitem(struct map_session_data *sd, struct storage *stor,
int n, int amount)
{
@@ -229,11 +170,11 @@ static int storage_delitem (struct map_session_data *sd, struct storage *stor,
stor->storage_[n].amount -= amount;
if (stor->storage_[n].amount == 0)
{
- memset (&stor->storage_[n], 0, sizeof (stor->storage_[0]));
+ memset(&stor->storage_[n], 0, sizeof(stor->storage_[0]));
stor->storage_amount--;
- clif_updatestorageamount (sd, stor);
+ clif_updatestorageamount(sd, stor);
}
- clif_storageitemremoved (sd, n, amount);
+ clif_storageitemremoved(sd, n, amount);
stor->dirty = 1;
return 0;
@@ -243,12 +184,13 @@ static int storage_delitem (struct map_session_data *sd, struct storage *stor,
* Add an item to the storage from the inventory.
*------------------------------------------
*/
-int storage_storageadd (struct map_session_data *sd, int index, int amount)
+int storage_storageadd(struct map_session_data *sd, int index, int amount)
{
struct storage *stor;
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = account2storage2 (sd->status.account_id));
+ nullpo_ret(sd);
+ stor = account2storage2(sd->status.account_id);
+ nullpo_ret(stor);
if ((stor->storage_amount > MAX_STORAGE) || !stor->storage_status)
return 0; // storage full / storage closed
@@ -263,11 +205,11 @@ int storage_storageadd (struct map_session_data *sd, int index, int amount)
return 0;
// log_tostorage(sd, index, 0);
- if (storage_additem (sd, stor, &sd->status.inventory[index], amount) == 0)
+ if (storage_additem(sd, stor, &sd->status.inventory[index], amount) == 0)
{
// remove item from inventory
- pc_unequipinvyitem (sd, index, 0);
- pc_delitem (sd, index, amount, 0);
+ pc_unequipinvyitem(sd, index, CalcStatus::NOW);
+ pc_delitem(sd, index, amount, 0);
}
return 1;
@@ -277,13 +219,14 @@ int storage_storageadd (struct map_session_data *sd, int index, int amount)
* Retrieve an item from the storage.
*------------------------------------------
*/
-int storage_storageget (struct map_session_data *sd, int index, int amount)
+int storage_storageget(struct map_session_data *sd, int index, int amount)
{
struct storage *stor;
- int flag;
+ PickupFail flag;
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = account2storage2 (sd->status.account_id));
+ nullpo_ret(sd);
+ stor = account2storage2(sd->status.account_id);
+ nullpo_ret(stor);
if (index < 0 || index >= MAX_STORAGE)
return 0;
@@ -294,100 +237,41 @@ int storage_storageget (struct map_session_data *sd, int index, int amount)
if (amount < 1 || amount > stor->storage_[index].amount)
return 0;
- if ((flag = pc_additem (sd, &stor->storage_[index], amount)) == 0)
- storage_delitem (sd, stor, index, amount);
+ if ((flag = pc_additem(sd, &stor->storage_[index], amount)) == PickupFail::OKAY)
+ storage_delitem(sd, stor, index, amount);
else
- clif_additem (sd, 0, 0, flag);
+ clif_additem(sd, 0, 0, flag);
// log_fromstorage(sd, index, 0);
return 1;
}
/*==========================================
- * Move an item from cart to storage.
- *------------------------------------------
- */
-int storage_storageaddfromcart (struct map_session_data *sd, int index,
- int amount)
-{
- struct storage *stor;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = account2storage2 (sd->status.account_id));
-
- if (stor->storage_amount > MAX_STORAGE || !stor->storage_status)
- return 0; // storage full / storage closed
-
- if (index < 0 || index >= MAX_CART)
- return 0;
-
- if (sd->status.cart[index].nameid <= 0)
- return 0; //No item there.
-
- if (amount < 1 || amount > sd->status.cart[index].amount)
- return 0;
-
- if (storage_additem (sd, stor, &sd->status.cart[index], amount) == 0)
- pc_cart_delitem (sd, index, amount, 0);
-
- return 1;
-}
-
-/*==========================================
- * Get from Storage to the Cart
- *------------------------------------------
- */
-int storage_storagegettocart (struct map_session_data *sd, int index,
- int amount)
-{
- struct storage *stor;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = account2storage2 (sd->status.account_id));
-
- if (!stor->storage_status)
- return 0;
-
- if (index < 0 || index >= MAX_STORAGE)
- return 0;
-
- if (stor->storage_[index].nameid <= 0)
- return 0; //Nothing there.
-
- if (amount < 1 || amount > stor->storage_[index].amount)
- return 0;
-
- if (pc_cart_additem (sd, &stor->storage_[index], amount) == 0)
- storage_delitem (sd, stor, index, amount);
-
- return 1;
-}
-
-/*==========================================
* Modified By Valaris to save upon closing [massdriller]
*------------------------------------------
*/
-int storage_storageclose (struct map_session_data *sd)
+int storage_storageclose(struct map_session_data *sd)
{
struct storage *stor;
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = account2storage2 (sd->status.account_id));
+ nullpo_ret(sd);
+ stor = account2storage2(sd->status.account_id);
+ nullpo_ret(stor);
- clif_storageclose (sd);
+ clif_storageclose(sd);
if (stor->storage_status)
{
if (save_settings & 4)
- chrif_save (sd); //Invokes the storage saving as well.
+ chrif_save(sd); //Invokes the storage saving as well.
else
- storage_storage_save (sd->status.account_id, 0);
+ storage_storage_save(sd->status.account_id, 0);
}
stor->storage_status = 0;
- sd->state.storage_flag = 0;
+ sd->state.storage_open = 0;
if (sd->npc_flags.storage)
{
sd->npc_flags.storage = 0;
- map_scriptcont (sd, sd->npc_id);
+ map_scriptcont(sd, sd->npc_id);
}
return 0;
@@ -397,38 +281,28 @@ int storage_storageclose (struct map_session_data *sd)
* When quitting the game.
*------------------------------------------
*/
-int storage_storage_quit (struct map_session_data *sd)
+int storage_storage_quit(struct map_session_data *sd)
{
struct storage *stor;
- nullpo_retr (0, sd);
+ nullpo_ret(sd);
- stor = account2storage2 (sd->status.account_id);
+ stor = account2storage2(sd->status.account_id);
if (stor)
{
- chrif_save (sd); //Invokes the storage saving as well.
+ chrif_save(sd); //Invokes the storage saving as well.
stor->storage_status = 0;
- sd->state.storage_flag = 0;
+ sd->state.storage_open = 0;
}
return 0;
}
-void storage_storage_dirty (struct map_session_data *sd)
-{
- struct storage *stor;
-
- stor = account2storage2 (sd->status.account_id);
-
- if (stor)
- stor->dirty = 1;
-}
-
-int storage_storage_save (int account_id, int final)
+int storage_storage_save(int account_id, int final)
{
struct storage *stor;
- stor = account2storage2 (account_id);
+ stor = account2storage2(account_id);
if (!stor)
return 0;
@@ -439,12 +313,12 @@ int storage_storage_save (int account_id, int final)
stor->dirty = 2;
stor->storage_status = 0; //To prevent further manipulation of it.
}
- intif_send_storage (stor);
+ intif_send_storage(stor);
return 1;
}
if (final)
{ //Clear storage from memory. Nothing to save.
- storage_delete (account_id);
+ storage_delete(account_id);
return 1;
}
@@ -452,337 +326,18 @@ int storage_storage_save (int account_id, int final)
}
//Ack from Char-server indicating the storage was saved. [Skotlex]
-int storage_storage_saved (int account_id)
+int storage_storage_saved(int account_id)
{
struct storage *stor;
- if ((stor = account2storage2 (account_id)) != NULL)
+ if ((stor = account2storage2(account_id)) != NULL)
{ //Only mark it clean if it's not in use. [Skotlex]
if (stor->dirty && stor->storage_status == 0)
{
stor->dirty = 0;
- sortage_sortitem (stor);
+ sortage_sortitem(stor);
}
return 1;
}
return 0;
}
-
-struct guild_storage *guild2storage (int guild_id)
-{
- struct guild_storage *gs = NULL;
- if (guild_search (guild_id) != NULL)
- {
- gs = (struct guild_storage *) numdb_search (guild_storage_db,
- guild_id);
- if (gs == NULL)
- {
- CREATE (gs, struct guild_storage, 1);
- gs->guild_id = guild_id;
- numdb_insert (guild_storage_db, gs->guild_id, gs);
- }
- }
- return gs;
-}
-
-static
-struct guild_storage *guild2storage2 (int guild_id)
-{ //For just locating a storage without creating one. [Skotlex]
- return (struct guild_storage *) numdb_search (guild_storage_db, guild_id);
-}
-
-int guild_storage_delete (int guild_id)
-{
- struct guild_storage *gstor =
- (struct guild_storage *) numdb_search (guild_storage_db, guild_id);
- if (gstor)
- {
- numdb_erase (guild_storage_db, guild_id);
- free (gstor);
- }
- return 0;
-}
-
-int storage_guild_storageopen (struct map_session_data *sd)
-{
- struct guild_storage *gstor;
-
- nullpo_retr (0, sd);
-
- if (sd->status.guild_id <= 0)
- return 2;
-
- if (sd->state.storage_flag)
- return 1; //Can't open both storages at a time.
-
- if ((gstor = guild2storage2 (sd->status.guild_id)) == NULL)
- {
- intif_request_guild_storage (sd->status.account_id,
- sd->status.guild_id);
- return 0;
- }
- if (gstor->storage_status)
- return 1;
-
- gstor->storage_status = 1;
- sd->state.storage_flag = 2;
- clif_guildstorageitemlist (sd, gstor);
- clif_guildstorageequiplist (sd, gstor);
- clif_updateguildstorageamount (sd, gstor);
- return 0;
-}
-
-int guild_storage_additem (struct map_session_data *sd,
- struct guild_storage *stor, struct item *item_data,
- int amount)
-{
- struct item_data *data;
- int i;
-
- nullpo_retr (1, sd);
- nullpo_retr (1, stor);
- nullpo_retr (1, item_data);
- nullpo_retr (1, data = itemdb_search (item_data->nameid));
-
- if (item_data->nameid <= 0 || amount <= 0)
- return 1;
-
- if (!itemdb_isequip2 (data))
- { //Stackable
- for (i = 0; i < MAX_GUILD_STORAGE; i++)
- {
- if (compare_item (&stor->storage_[i], item_data))
- {
- if (stor->storage_[i].amount + amount > MAX_AMOUNT)
- return 1;
- stor->storage_[i].amount += amount;
- clif_guildstorageitemadded (sd, stor, i, amount);
- stor->dirty = 1;
- return 0;
- }
- }
- }
- //Add item
- for (i = 0; i < MAX_GUILD_STORAGE && stor->storage_[i].nameid; i++);
-
- if (i >= MAX_GUILD_STORAGE)
- return 1;
-
- memcpy (&stor->storage_[i], item_data, sizeof (stor->storage_[0]));
- stor->storage_[i].amount = amount;
- stor->storage_amount++;
- clif_guildstorageitemadded (sd, stor, i, amount);
- clif_updateguildstorageamount (sd, stor);
- stor->dirty = 1;
- return 0;
-}
-
-int guild_storage_delitem (struct map_session_data *sd,
- struct guild_storage *stor, int n, int amount)
-{
- nullpo_retr (1, sd);
- nullpo_retr (1, stor);
-
- if (stor->storage_[n].nameid == 0 || stor->storage_[n].amount < amount)
- return 1;
-
- stor->storage_[n].amount -= amount;
- if (stor->storage_[n].amount == 0)
- {
- memset (&stor->storage_[n], 0, sizeof (stor->storage_[0]));
- stor->storage_amount--;
- clif_updateguildstorageamount (sd, stor);
- }
- clif_storageitemremoved (sd, n, amount);
- stor->dirty = 1;
- return 0;
-}
-
-int storage_guild_storageadd (struct map_session_data *sd, int index,
- int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id));
-
- if (!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE)
- return 0;
-
- if (index < 0 || index >= MAX_INVENTORY)
- return 0;
-
- if (sd->status.inventory[index].nameid <= 0)
- return 0;
-
- if (amount < 1 || amount > sd->status.inventory[index].amount)
- return 0;
-
-// log_tostorage(sd, index, 1);
- if (guild_storage_additem (sd, stor, &sd->status.inventory[index], amount)
- == 0)
- pc_delitem (sd, index, amount, 0);
-
- return 1;
-}
-
-int storage_guild_storageget (struct map_session_data *sd, int index,
- int amount)
-{
- struct guild_storage *stor;
- int flag;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id));
-
- if (!stor->storage_status)
- return 0;
-
- if (index < 0 || index >= MAX_GUILD_STORAGE)
- return 0;
-
- if (stor->storage_[index].nameid <= 0)
- return 0;
-
- if (amount < 1 || amount > stor->storage_[index].amount)
- return 0;
-
- if ((flag = pc_additem (sd, &stor->storage_[index], amount)) == 0)
- guild_storage_delitem (sd, stor, index, amount);
- else
- clif_additem (sd, 0, 0, flag);
-// log_fromstorage(sd, index, 1);
-
- return 0;
-}
-
-int storage_guild_storageaddfromcart (struct map_session_data *sd, int index,
- int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id));
-
- if (!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE)
- return 0;
-
- if (index < 0 || index >= MAX_CART)
- return 0;
-
- if (sd->status.cart[index].nameid <= 0)
- return 0;
-
- if (amount < 1 || amount > sd->status.cart[index].amount)
- return 0;
-
- if (guild_storage_additem (sd, stor, &sd->status.cart[index], amount) ==
- 0)
- pc_cart_delitem (sd, index, amount, 0);
-
- return 1;
-}
-
-int storage_guild_storagegettocart (struct map_session_data *sd, int index,
- int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id));
-
- if (!stor->storage_status)
- return 0;
-
- if (index < 0 || index >= MAX_GUILD_STORAGE)
- return 0;
-
- if (stor->storage_[index].nameid <= 0)
- return 0;
-
- if (amount < 1 || amount > stor->storage_[index].amount)
- return 0;
-
- if (pc_cart_additem (sd, &stor->storage_[index], amount) == 0)
- guild_storage_delitem (sd, stor, index, amount);
-
- return 1;
-}
-
-int storage_guild_storagesave (int account_id, int guild_id, int flag)
-{
- struct guild_storage *stor = guild2storage2 (guild_id);
-
- if (stor)
- {
- if (flag) //Char quitting, close it.
- stor->storage_status = 0;
- if (stor->dirty)
- intif_send_guild_storage (account_id, stor);
- return 1;
- }
- return 0;
-}
-
-int storage_guild_storagesaved (int guild_id)
-{
- struct guild_storage *stor;
-
- if ((stor = guild2storage2 (guild_id)) != NULL)
- {
- if (stor->dirty && stor->storage_status == 0)
- { //Storage has been correctly saved.
- stor->dirty = 0;
- sortage_gsortitem (stor);
- }
- return 1;
- }
- return 0;
-}
-
-int storage_guild_storageclose (struct map_session_data *sd)
-{
- struct guild_storage *stor;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id));
-
- clif_storageclose (sd);
- chrif_save (sd); //This one also saves the storage. [Skotlex]
-
- stor->storage_status = 0;
- sd->state.storage_flag = 0;
-
- return 0;
-}
-
-int storage_guild_storage_quit (struct map_session_data *sd, int flag)
-{
- struct guild_storage *stor;
-
- nullpo_retr (0, sd);
- nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id));
-
- if (flag)
- { //Only during a guild break flag is 1 (don't save storage)
- sd->state.storage_flag = 0;
- stor->storage_status = 0;
- clif_storageclose (sd);
- if (save_settings & 4)
- chrif_save (sd);
- return 0;
- }
-
- if (stor->storage_status)
- {
- if (save_settings & 4)
- chrif_save (sd);
- else
- storage_guild_storagesave (sd->status.account_id,
- sd->status.guild_id, 1);
- }
- sd->state.storage_flag = 0;
- stor->storage_status = 0;
-
- return 0;
-}
diff --git a/src/map/storage.hpp b/src/map/storage.hpp
index 22625df..1974efb 100644
--- a/src/map/storage.hpp
+++ b/src/map/storage.hpp
@@ -1,54 +1,19 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
+// For more information, see COPYING in the main folder
#ifndef STORAGE_HPP
#define STORAGE_HPP
-#include "../common/mmo.hpp"
+int storage_storageopen(struct map_session_data *sd);
+int storage_storageadd(struct map_session_data *sd, int index, int amount);
+int storage_storageget(struct map_session_data *sd, int index, int amount);
+int storage_storageclose(struct map_session_data *sd);
+void do_init_storage(void);
+void do_final_storage(void);
+struct storage *account2storage(int account_id);
+struct storage *account2storage2(int account_id);
+int storage_storage_quit(struct map_session_data *sd);
+int storage_storage_save(int account_id, int final);
+int storage_storage_saved(int account_id);
-int storage_storageopen (struct map_session_data *sd);
-int storage_storageadd (struct map_session_data *sd, int index, int amount);
-int storage_storageget (struct map_session_data *sd, int index, int amount);
-int storage_storageaddfromcart (struct map_session_data *sd, int index,
- int amount);
-int storage_storagegettocart (struct map_session_data *sd, int index,
- int amount);
-int storage_storageclose (struct map_session_data *sd);
-int do_init_storage (void);
-void do_final_storage (void);
-void do_reconnect_storage (void);
-struct storage *account2storage (int account_id);
-struct storage *account2storage2 (int account_id);
-int storage_delete (int account_id);
-int storage_storage_quit (struct map_session_data *sd);
-int storage_storage_save (int account_id, int final);
-int storage_storage_saved (int account_id); //Ack from char server that guild store was saved.
-void storage_storage_dirty (struct map_session_data *sd);
-
-struct guild_storage *guild2storage (int guild_id);
-int guild_storage_delete (int guild_id);
-int storage_guild_storageopen (struct map_session_data *sd);
-int guild_storage_additem (struct map_session_data *sd,
- struct guild_storage *stor,
- struct item *item_data, int amount);
-int guild_storage_delitem (struct map_session_data *sd,
- struct guild_storage *stor, int n, int amount);
-int storage_guild_storageadd (struct map_session_data *sd, int index,
- int amount);
-int storage_guild_storageget (struct map_session_data *sd, int index,
- int amount);
-int storage_guild_storageaddfromcart (struct map_session_data *sd, int index,
- int amount);
-int storage_guild_storagegettocart (struct map_session_data *sd, int index,
- int amount);
-int storage_guild_storageclose (struct map_session_data *sd);
-int storage_guild_storage_quit (struct map_session_data *sd, int flag);
-int storage_guild_storagesave (int account_id, int guild_id, int flag);
-int storage_guild_storagesaved (int guild_id); //Ack from char server that guild store was saved.
-
-int storage_comp_item (const void *_i1, const void *_i2);
-//int storage_comp_item(const struct item* i1, const struct item* i2);
-void sortage_sortitem (struct storage *stor);
-void sortage_gsortitem (struct guild_storage *gstor);
-
-#endif
+#endif // STORAGE_HPP
diff --git a/src/map/tmw.cpp b/src/map/tmw.cpp
index 4b1831b..66b8bb9 100644
--- a/src/map/tmw.cpp
+++ b/src/map/tmw.cpp
@@ -1,62 +1,55 @@
-//
-
-#include <string.h>
-#include <ctype.h>
-#include <stdarg.h>
-
#include "tmw.hpp"
-#include "../common/socket.hpp"
-#include "../common/timer.hpp"
-#include "../common/version.hpp"
+#include <cctype>
+#include <cstring>
+
+#include "../common/cxxstdio.hpp"
#include "../common/nullpo.hpp"
#include "atcommand.hpp"
#include "battle.hpp"
-#include "chat.hpp"
#include "chrif.hpp"
#include "clif.hpp"
-#include "guild.hpp"
#include "intif.hpp"
-#include "itemdb.hpp"
-#include "magic.hpp"
#include "map.hpp"
-#include "mob.hpp"
-#include "npc.hpp"
-#include "party.hpp"
#include "pc.hpp"
-#include "script.hpp"
-#include "skill.hpp"
-#include "storage.hpp"
-#include "trade.hpp"
-int tmw_CheckChatSpam (struct map_session_data *sd, const char *message)
+#include "../poison.hpp"
+
+static
+void tmw_AutoBan(struct map_session_data *sd, const char *reason, int length);
+static
+int tmw_CheckChatLameness(struct map_session_data *sd, const char *message);
+static
+int tmw_ShorterStrlen(const char *s1, const char *s2);
+
+
+int tmw_CheckChatSpam(struct map_session_data *sd, const char *message)
{
- nullpo_retr (1, sd);
- time_t now = time (NULL);
+ nullpo_retr(1, sd);
+ TimeT now = TimeT::now();
- if (pc_isGM (sd))
+ if (pc_isGM(sd))
return 0;
if (now > sd->chat_reset_due)
{
- sd->chat_reset_due = now + battle_config.chat_spam_threshold;
+ sd->chat_reset_due = static_cast<time_t>(now) + battle_config.chat_spam_threshold;
sd->chat_lines_in = 0;
}
if (now > sd->chat_repeat_reset_due)
{
sd->chat_repeat_reset_due =
- now + (battle_config.chat_spam_threshold * 60);
+ static_cast<time_t>(now) + (battle_config.chat_spam_threshold * 60);
sd->chat_total_repeats = 0;
}
sd->chat_lines_in++;
// Penalty for repeats.
- if (strncmp
- (sd->chat_lastmsg, message,
- tmw_ShorterStrlen (sd->chat_lastmsg, message)) == 0)
+ if (strncmp(sd->chat_lastmsg, message,
+ tmw_ShorterStrlen(sd->chat_lastmsg, message)) == 0)
{
sd->chat_lines_in += battle_config.chat_lame_penalty;
sd->chat_total_repeats++;
@@ -67,17 +60,17 @@ int tmw_CheckChatSpam (struct map_session_data *sd, const char *message)
}
// Penalty for lame, it can stack on top of the repeat penalty.
- if (tmw_CheckChatLameness (sd, message))
+ if (tmw_CheckChatLameness(sd, message))
sd->chat_lines_in += battle_config.chat_lame_penalty;
- strncpy ((char *) sd->chat_lastmsg, message, battle_config.chat_maxline);
+ strncpy((char *) sd->chat_lastmsg, message, battle_config.chat_maxline);
if (sd->chat_lines_in >= battle_config.chat_spam_flood
|| sd->chat_total_repeats >= battle_config.chat_spam_flood)
{
sd->chat_lines_in = sd->chat_total_repeats = 0;
- tmw_AutoBan (sd, "chat", battle_config.chat_spam_ban);
+ tmw_AutoBan(sd, "chat", battle_config.chat_spam_ban);
return 1;
}
@@ -86,8 +79,8 @@ int tmw_CheckChatSpam (struct map_session_data *sd, const char *message)
(sd->chat_lines_in >= battle_config.chat_spam_warn
|| sd->chat_total_repeats >= battle_config.chat_spam_warn))
{
- clif_displaymessage (sd->fd, "WARNING: You are about to be automatically banned for spam!");
- clif_displaymessage (sd->fd, "WARNING: Please slow down, do not repeat, and do not SHOUT!");
+ clif_displaymessage(sd->fd, "WARNING: You are about to be automatically banned for spam!");
+ clif_displaymessage(sd->fd, "WARNING: Please slow down, do not repeat, and do not SHOUT!");
}
return 0;
@@ -95,43 +88,44 @@ int tmw_CheckChatSpam (struct map_session_data *sd, const char *message)
void tmw_AutoBan(struct map_session_data *sd, const char *reason, int length)
{
- char anotherbuf[512];
-
if (length == 0 || sd->auto_ban_info.in_progress)
return;
sd->auto_ban_info.in_progress = 1;
- tmw_GmHackMsg ("%s has been autobanned for %s spam",
- sd->status.name, reason);
+ std::string hack_msg = STRPRINTF("[GM] %s has been autobanned for %s spam",
+ sd->status.name,
+ reason);
+ tmw_GmHackMsg(hack_msg);
- gm_log ("%s(%d,%d) Server : @autoban %s %dh (%s spam)",
- map[sd->bl.m].name, sd->bl.x, sd->bl.y,
+ std::string fake_command = STRPRINTF("@autoban %s %dh (%s spam)",
sd->status.name, length, reason);
+ log_atcommand(sd, fake_command);
- snprintf (anotherbuf, 511, "You have been banned for %s spamming. Please do not spam.", reason);
+ std::string anotherbuf = STRPRINTF("You have been banned for %s spamming. Please do not spam.",
+ reason);
- clif_displaymessage (sd->fd, anotherbuf);
- /* type: 2 - ban (year, month, day, hour, minute, second) */
- chrif_char_ask_name (-1, sd->status.name, 2, 0, 0, 0, length, 0, 0);
- clif_setwaitclose (sd->fd);
+ clif_displaymessage(sd->fd, anotherbuf);
+ /* type: 2 - ban(year, month, day, hour, minute, second) */
+ chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, length, 0, 0);
+ clif_setwaitclose(sd->fd);
}
// Compares the length of two strings and returns that of the shorter
-int tmw_ShorterStrlen (const char *s1, const char *s2)
+int tmw_ShorterStrlen(const char *s1, const char *s2)
{
- int s1_len = strlen (s1);
- int s2_len = strlen (s2);
+ int s1_len = strlen(s1);
+ int s2_len = strlen(s2);
return (s2_len >= s1_len ? s1_len : s2_len);
}
// Returns true if more than 50% of input message is caps or punctuation
-int tmw_CheckChatLameness (struct map_session_data *sd, const char *message)
+int tmw_CheckChatLameness(struct map_session_data *, const char *message)
{
- int count, lame;
+ int count, lame;
for (count = lame = 0; *message; message++, count++)
- if (isupper (*message) || ispunct (*message))
+ if (isupper(*message) || ispunct(*message))
lame++;
if (count > 7 && lame > count / 2)
@@ -141,26 +135,15 @@ int tmw_CheckChatLameness (struct map_session_data *sd, const char *message)
}
// Sends a whisper to all GMs
-void tmw_GmHackMsg (const char *fmt, ...)
+void tmw_GmHackMsg(const_string line)
{
- char buf[512];
- va_list ap;
-
- va_start (ap, fmt);
- vsnprintf (buf, 511, fmt, ap);
- va_end (ap);
-
- char outbuf[512 + 5];
- strcpy (outbuf, "[GM] ");
- strcat (outbuf, buf);
-
- intif_wis_message_to_gm (wisp_server_name,
- battle_config.hack_info_GM_level, outbuf,
- strlen (outbuf) + 1);
+ intif_wis_message_to_gm(wisp_server_name,
+ battle_config.hack_info_GM_level,
+ line.data(), line.size() + 1);
}
/* Remove leading and trailing spaces from a string, modifying in place. */
-void tmw_TrimStr (char *str)
+void tmw_TrimStr(char *str)
{
char *l;
char *a;
@@ -169,16 +152,16 @@ void tmw_TrimStr (char *str)
if (!*str)
return;
- e = str + strlen (str) - 1;
+ e = str + strlen(str) - 1;
/* Skip all leading spaces. */
- for (l = str; *l && isspace (*l); ++l)
+ for (l = str; *l && isspace(*l); ++l)
;
/* Find the end of the string, or the start of trailing spaces. */
- for (a = e; *a && a > l && isspace (*a); --a)
+ for (a = e; *a && a > l && isspace(*a); --a)
;
- memmove (str, l, a - l + 1);
+ memmove(str, l, a - l + 1);
str[a - l + 1] = '\0';
}
diff --git a/src/map/tmw.hpp b/src/map/tmw.hpp
index 71de462..d64f45e 100644
--- a/src/map/tmw.hpp
+++ b/src/map/tmw.hpp
@@ -1,15 +1,10 @@
-//
#ifndef TMW_HPP
#define TMW_HPP
-#include "map.hpp"
+#include "../common/const_array.hpp"
-int tmw_CheckChatSpam (struct map_session_data *sd, const char *message);
-int tmw_ShorterStrlen (const char *s1, const char *s2);
-int tmw_CheckChatLameness (struct map_session_data *sd, const char *message);
-__attribute__((format(printf, 1, 2)))
-void tmw_GmHackMsg (const char *fmt, ...);
-void tmw_AutoBan (struct map_session_data *sd, const char *reason, int length);
-void tmw_TrimStr (char *str);
+int tmw_CheckChatSpam(struct map_session_data *sd, const char *message);
+void tmw_GmHackMsg(const_string line);
+void tmw_TrimStr(char *str);
-#endif /* TMW_H_ */
+#endif // TMW_HPP
diff --git a/src/map/trade.cpp b/src/map/trade.cpp
index 147db1b..6e81602 100644
--- a/src/map/trade.cpp
+++ b/src/map/trade.cpp
@@ -1,45 +1,47 @@
-#include <stdio.h>
-#include <string.h>
+#include "trade.hpp"
+
+#include "../common/cxxstdio.hpp"
+#include "../common/nullpo.hpp"
+#include "battle.hpp"
#include "clif.hpp"
#include "itemdb.hpp"
#include "map.hpp"
-#include "trade.hpp"
-#include "pc.hpp"
#include "npc.hpp"
-#include "battle.hpp"
+#include "pc.hpp"
#include "storage.hpp"
-#include "../common/nullpo.hpp"
+
+#include "../poison.hpp"
/*==========================================
* 取引要請を相手に送る
*------------------------------------------
*/
-void trade_traderequest (struct map_session_data *sd, int target_id)
+void trade_traderequest(struct map_session_data *sd, int target_id)
{
struct map_session_data *target_sd;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if ((target_sd = map_id2sd (target_id)) != NULL)
+ if ((target_sd = map_id2sd(target_id)) != NULL)
{
if (!battle_config.invite_request_check)
{
- if (target_sd->guild_invite > 0 || target_sd->party_invite > 0)
+ if (target_sd->party_invite > 0)
{
- clif_tradestart (sd, 2); // 相手はPT要請中かGuild要請中
+ clif_tradestart(sd, 2); // 相手はPT要請中かGuild要請中
return;
}
}
if (target_sd->npc_id)
{
//Trade fails if you are using an NPC.
- clif_tradestart (sd, 2);
+ clif_tradestart(sd, 2);
return;
}
if ((target_sd->trade_partner != 0) || (sd->trade_partner != 0))
{
- trade_tradecancel (sd); //person is in another trade
+ trade_tradecancel(sd); //person is in another trade
}
else
{
@@ -49,19 +51,19 @@ void trade_traderequest (struct map_session_data *sd, int target_id)
|| (sd->bl.y - target_sd->bl.y <= -5
|| sd->bl.y - target_sd->bl.y >= 5))
{
- clif_tradestart (sd, 0); //too far
+ clif_tradestart(sd, 0); //too far
}
else if (sd != target_sd)
{
target_sd->trade_partner = sd->status.account_id;
sd->trade_partner = target_sd->status.account_id;
- clif_traderequest (target_sd, sd->status.name);
+ clif_traderequest(target_sd, sd->status.name);
}
}
}
else
{
- clif_tradestart (sd, 1); //character does not exist
+ clif_tradestart(sd, 1); //character does not exist
}
}
@@ -69,15 +71,15 @@ void trade_traderequest (struct map_session_data *sd, int target_id)
* 取引要請
*------------------------------------------
*/
-void trade_tradeack (struct map_session_data *sd, int type)
+void trade_tradeack(struct map_session_data *sd, int type)
{
struct map_session_data *target_sd;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if ((target_sd = map_id2sd (sd->trade_partner)) != NULL)
+ if ((target_sd = map_id2sd(sd->trade_partner)) != NULL)
{
- clif_tradestart (target_sd, type);
- clif_tradestart (sd, type);
+ clif_tradestart(target_sd, type);
+ clif_tradestart(sd, type);
if (type == 4)
{ // Cancel
sd->deal_locked = 0;
@@ -86,15 +88,13 @@ void trade_tradeack (struct map_session_data *sd, int type)
target_sd->trade_partner = 0;
}
if (sd->npc_id != 0)
- npc_event_dequeue (sd);
+ npc_event_dequeue(sd);
if (target_sd->npc_id != 0)
- npc_event_dequeue (target_sd);
+ npc_event_dequeue(target_sd);
//close STORAGE window if it's open. It protects from spooffing packets [Lupus]
- if (sd->state.storage_flag == 1)
- storage_storageclose (sd);
- else if (sd->state.storage_flag == 2)
- storage_guild_storageclose (sd);
+ if (sd->state.storage_open)
+ storage_storageclose(sd);
}
}
@@ -102,19 +102,19 @@ void trade_tradeack (struct map_session_data *sd, int type)
* アイテム追加
*------------------------------------------
*/
-void trade_tradeadditem (struct map_session_data *sd, int index, int amount)
+void trade_tradeadditem(struct map_session_data *sd, int index, int amount)
{
struct map_session_data *target_sd;
struct item_data *id;
- int trade_i;
- int trade_weight = 0;
- int free = 0;
- int c;
- int i;
+ int trade_i;
+ int trade_weight = 0;
+ int free = 0;
+ int c;
+ int i;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if (((target_sd = map_id2sd (sd->trade_partner)) != NULL)
+ if (((target_sd = map_id2sd(sd->trade_partner)) != NULL)
&& (sd->deal_locked < 1))
{
if (index < 2 || index >= MAX_INVENTORY + 2)
@@ -122,7 +122,7 @@ void trade_tradeadditem (struct map_session_data *sd, int index, int amount)
if (index == 0 && amount > 0 && amount <= sd->status.zeny)
{
sd->deal_zeny = amount;
- clif_tradeadditem (sd, target_sd, 0, amount);
+ clif_tradeadditem(sd, target_sd, 0, amount);
}
}
else if (amount <= sd->status.inventory[index - 2].amount
@@ -151,8 +151,10 @@ void trade_tradeadditem (struct map_session_data *sd, int index, int amount)
&& target_sd->inventory_data[i] != NULL)
{
id = target_sd->inventory_data[i];
- if (id->type != 4 && id->type != 5
- && id->type != 7 && id->type != 8)
+ if (id->type != ItemType::WEAPON
+ && id->type != ItemType::ARMOR
+ && id->type != ItemType::_7
+ && id->type != ItemType::_8)
{
free++;
break;
@@ -163,13 +165,11 @@ void trade_tradeadditem (struct map_session_data *sd, int index, int amount)
if (target_sd->weight + trade_weight >
target_sd->max_weight)
{
- clif_tradeitemok (sd, index, 0, 1); //fail to add item -- the player was over weighted.
- amount = 0; // [MouseJstr]
+ clif_tradeitemok(sd, index, 0, 1); //fail to add item -- the player was over weighted.
}
else if (free <= 0)
{
- clif_tradeitemok (sd, index, 0, 2); //fail to add item -- no free slots at receiver
- amount = 0; // peavey
+ clif_tradeitemok(sd, index, 0, 2); //fail to add item -- no free slots at receiver
}
else
{
@@ -177,15 +177,15 @@ void trade_tradeadditem (struct map_session_data *sd, int index, int amount)
{ // re-deal exploit protection [Valaris]
if (sd->deal_item_index[c] == index)
{
- trade_tradecancel (sd);
+ trade_tradecancel(sd);
return;
}
}
- pc_unequipinvyitem (sd, index - 2, 0);
+ pc_unequipinvyitem(sd, index - 2, CalcStatus::NOW);
sd->deal_item_index[trade_i] = index;
sd->deal_item_amount[trade_i] += amount;
- clif_tradeitemok (sd, index, amount, 0); //success to add item
- clif_tradeadditem (sd, target_sd, index, amount);
+ clif_tradeitemok(sd, index, amount, 0); //success to add item
+ clif_tradeadditem(sd, target_sd, index, amount);
}
break;
}
@@ -205,8 +205,10 @@ void trade_tradeadditem (struct map_session_data *sd, int index, int amount)
&& target_sd->inventory_data[i] != NULL)
{
id = target_sd->inventory_data[i];
- if (id->type != 4 && id->type != 5
- && id->type != 7 && id->type != 8)
+ if (id->type != ItemType::WEAPON
+ && id->type != ItemType::ARMOR
+ && id->type != ItemType::_7
+ && id->type != ItemType::_8)
{
free++;
break;
@@ -225,12 +227,12 @@ void trade_tradeadditem (struct map_session_data *sd, int index, int amount)
* アイテム追加完了(ok押し)
*------------------------------------------
*/
-void trade_tradeok (struct map_session_data *sd)
+void trade_tradeok(struct map_session_data *sd)
{
struct map_session_data *target_sd;
- int trade_i;
+ int trade_i;
- nullpo_retv (sd);
+ nullpo_retv(sd);
for (trade_i = 0; trade_i < 10; trade_i++)
{
@@ -238,18 +240,18 @@ void trade_tradeok (struct map_session_data *sd)
sd->status.inventory[sd->deal_item_index[trade_i] - 2].amount
|| sd->deal_item_amount[trade_i] < 0)
{
- trade_tradecancel (sd);
+ trade_tradecancel(sd);
return;
}
}
- if ((target_sd = map_id2sd (sd->trade_partner)) != NULL)
+ if ((target_sd = map_id2sd(sd->trade_partner)) != NULL)
{
sd->deal_locked = 1;
- clif_tradeitemok (sd, 0, 0, 0);
- clif_tradedeal_lock (sd, 0);
- clif_tradedeal_lock (target_sd, 1);
+ clif_tradeitemok(sd, 0, 0, 0);
+ clif_tradedeal_lock(sd, 0);
+ clif_tradedeal_lock(target_sd, 1);
}
}
@@ -257,29 +259,32 @@ void trade_tradeok (struct map_session_data *sd)
* 取引キャンセル
*------------------------------------------
*/
-void trade_tradecancel (struct map_session_data *sd)
+void trade_tradecancel(struct map_session_data *sd)
{
struct map_session_data *target_sd;
- int trade_i;
+ int trade_i;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if ((target_sd = map_id2sd (sd->trade_partner)) != NULL)
+ if ((target_sd = map_id2sd(sd->trade_partner)) != NULL)
{
for (trade_i = 0; trade_i < 10; trade_i++)
{ //give items back (only virtual)
if (sd->deal_item_amount[trade_i] != 0)
{
- clif_additem (sd, sd->deal_item_index[trade_i] - 2,
- sd->deal_item_amount[trade_i], 0);
+ clif_additem(sd,
+ sd->deal_item_index[trade_i] - 2,
+ sd->deal_item_amount[trade_i],
+ PickupFail::OKAY);
sd->deal_item_index[trade_i] = 0;
sd->deal_item_amount[trade_i] = 0;
}
if (target_sd->deal_item_amount[trade_i] != 0)
{
- clif_additem (target_sd,
- target_sd->deal_item_index[trade_i] - 2,
- target_sd->deal_item_amount[trade_i], 0);
+ clif_additem(target_sd,
+ target_sd->deal_item_index[trade_i] - 2,
+ target_sd->deal_item_amount[trade_i],
+ PickupFail::OKAY);
target_sd->deal_item_index[trade_i] = 0;
target_sd->deal_item_amount[trade_i] = 0;
}
@@ -287,38 +292,36 @@ void trade_tradecancel (struct map_session_data *sd)
if (sd->deal_zeny)
{
sd->deal_zeny = 0;
- clif_updatestatus (sd, SP_ZENY);
+ clif_updatestatus(sd, SP::ZENY);
}
if (target_sd->deal_zeny)
{
- clif_updatestatus (target_sd, SP_ZENY);
+ clif_updatestatus(target_sd, SP::ZENY);
target_sd->deal_zeny = 0;
}
sd->deal_locked = 0;
sd->trade_partner = 0;
target_sd->deal_locked = 0;
target_sd->trade_partner = 0;
- clif_tradecancelled (sd);
- clif_tradecancelled (target_sd);
+ clif_tradecancelled(sd);
+ clif_tradecancelled(target_sd);
}
}
-#define MAP_LOG_PC(sd, fmt, args...) MAP_LOG("PC%d %d:%d,%d " fmt, sd->status.char_id, sd->bl.m, sd->bl.x, sd->bl.y, ## args)
-
/*==========================================
* 取引許諾(trade押し)
*------------------------------------------
*/
-void trade_tradecommit (struct map_session_data *sd)
+void trade_tradecommit(struct map_session_data *sd)
{
struct map_session_data *target_sd;
- int trade_i;
+ int trade_i;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if ((target_sd = map_id2sd (sd->trade_partner)) != NULL)
+ if ((target_sd = map_id2sd(sd->trade_partner)) != NULL)
{
- MAP_LOG_PC (sd, " TRADECOMMIT WITH %d GIVE %d GET %d",
+ MAP_LOG_PC(sd, " TRADECOMMIT WITH %d GIVE %d GET %d",
target_sd->status.char_id, sd->deal_zeny,
target_sd->deal_zeny);
if ((sd->deal_locked >= 1) && (target_sd->deal_locked >= 1))
@@ -332,15 +335,15 @@ void trade_tradecommit (struct map_session_data *sd)
if (sd->deal_zeny > sd->status.zeny)
{
sd->deal_zeny = 0;
- trade_tradecancel (sd);
- MAP_LOG_PC (sd, " TRADECANCEL");
+ trade_tradecancel(sd);
+ MAP_LOG_PC(sd, " TRADECANCEL");
return;
}
if (target_sd->deal_zeny > target_sd->status.zeny)
{
target_sd->deal_zeny = 0;
- trade_tradecancel (sd);
- MAP_LOG_PC (sd, " TRADECANCEL");
+ trade_tradecancel(sd);
+ MAP_LOG_PC(sd, " TRADECANCEL");
return;
}
sd->trade_partner = 0;
@@ -349,62 +352,62 @@ void trade_tradecommit (struct map_session_data *sd)
{
if (sd->deal_item_amount[trade_i] != 0)
{
- int n = sd->deal_item_index[trade_i] - 2;
- int flag;
- flag =
- pc_additem (target_sd, &sd->status.inventory[n],
- sd->deal_item_amount[trade_i]);
- if (flag == 0)
- pc_delitem (sd, n, sd->deal_item_amount[trade_i],
+ int n = sd->deal_item_index[trade_i] - 2;
+ PickupFail flag = pc_additem(target_sd,
+ &sd->status.inventory[n],
+ sd->deal_item_amount[trade_i]);
+ if (flag == PickupFail::OKAY)
+ pc_delitem(sd, n, sd->deal_item_amount[trade_i],
1);
else
- clif_additem (sd, n,
- sd->deal_item_amount[trade_i], 0);
+ clif_additem(sd, n,
+ sd->deal_item_amount[trade_i],
+ PickupFail::OKAY);
sd->deal_item_index[trade_i] = 0;
sd->deal_item_amount[trade_i] = 0;
}
if (target_sd->deal_item_amount[trade_i] != 0)
{
- int n = target_sd->deal_item_index[trade_i] - 2;
- int flag;
- flag =
- pc_additem (sd, &target_sd->status.inventory[n],
- target_sd->deal_item_amount[trade_i]);
- if (flag == 0)
- pc_delitem (target_sd, n,
+ int n = target_sd->deal_item_index[trade_i] - 2;
+ PickupFail flag = pc_additem(sd,
+ &target_sd->status.inventory[n],
+ target_sd->deal_item_amount[trade_i]);
+ if (flag == PickupFail::OKAY)
+ pc_delitem(target_sd, n,
target_sd->deal_item_amount[trade_i],
1);
else
- clif_additem (target_sd, n,
- target_sd->deal_item_amount
- [trade_i], 0);
+ clif_additem(target_sd, n,
+
+ target_sd->deal_item_amount[trade_i],
+ PickupFail::OKAY);
target_sd->deal_item_index[trade_i] = 0;
target_sd->deal_item_amount[trade_i] = 0;
}
}
if (sd->deal_zeny)
{
- int deal = sd->deal_zeny;
+ int deal = sd->deal_zeny;
sd->deal_zeny = 0;
sd->status.zeny -= deal;
- clif_updatestatus (sd, SP_ZENY);
+ clif_updatestatus(sd, SP::ZENY);
target_sd->status.zeny += deal;
- clif_updatestatus (target_sd, SP_ZENY);
+ clif_updatestatus(target_sd, SP::ZENY);
}
if (target_sd->deal_zeny)
{
- int deal = target_sd->deal_zeny;
+ int deal = target_sd->deal_zeny;
target_sd->deal_zeny = 0;
target_sd->status.zeny -= deal;
- clif_updatestatus (target_sd, SP_ZENY);
+ clif_updatestatus(target_sd, SP::ZENY);
sd->status.zeny += deal;
- clif_updatestatus (sd, SP_ZENY);
+ clif_updatestatus(sd, SP::ZENY);
}
sd->deal_locked = 0;
target_sd->deal_locked = 0;
- clif_tradecompleted (sd, 0);
- clif_tradecompleted (target_sd, 0);
- MAP_LOG_PC (sd, " TRADEOK");
+ clif_tradecompleted(sd, 0);
+ clif_tradecompleted(target_sd, 0);
+ MAP_LOG_PC(sd, " TRADEOK");
}
}
}
@@ -413,20 +416,20 @@ void trade_tradecommit (struct map_session_data *sd)
// This is called when a char's zeny is changed
// This helps prevent money duplication and other problems
// [Jaxad0127]
-void trade_verifyzeny (struct map_session_data *sd)
+void trade_verifyzeny(struct map_session_data *sd)
{
struct map_session_data *target_sd;
- nullpo_retv (sd);
+ nullpo_retv(sd);
- if ((target_sd = map_id2sd (sd->trade_partner)) != NULL)
+ if ((target_sd = map_id2sd(sd->trade_partner)) != NULL)
{
if (sd->deal_zeny > sd->status.zeny)
{
if (sd->deal_locked < 1)
- trade_tradeadditem (sd, 0, sd->status.zeny); // Fix money ammount
+ trade_tradeadditem(sd, 0, sd->status.zeny); // Fix money ammount
else
- trade_tradecancel (sd); // Or cancel the trade if we can't fix it
+ trade_tradecancel(sd); // Or cancel the trade if we can't fix it
}
}
}
diff --git a/src/map/trade.hpp b/src/map/trade.hpp
index 1e885f4..0edca9c 100644
--- a/src/map/trade.hpp
+++ b/src/map/trade.hpp
@@ -1,14 +1,12 @@
-// $Id: trade.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
#ifndef TRADE_HPP
#define TRADE_HPP
-#include "map.hpp"
-void trade_traderequest (struct map_session_data *sd, int target_id);
-void trade_tradeack (struct map_session_data *sd, int type);
-void trade_tradeadditem (struct map_session_data *sd, int index, int amount);
-void trade_tradeok (struct map_session_data *sd);
-void trade_tradecancel (struct map_session_data *sd);
-void trade_tradecommit (struct map_session_data *sd);
-void trade_verifyzeny (struct map_session_data *sd);
+void trade_traderequest(struct map_session_data *sd, int target_id);
+void trade_tradeack(struct map_session_data *sd, int type);
+void trade_tradeadditem(struct map_session_data *sd, int index, int amount);
+void trade_tradeok(struct map_session_data *sd);
+void trade_tradecancel(struct map_session_data *sd);
+void trade_tradecommit(struct map_session_data *sd);
+void trade_verifyzeny(struct map_session_data *sd);
#endif // TRADE_HPP