From eb6d8530fa2c81a3b90fca916e9c3c22ed3ff78b Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 3 Dec 2017 17:25:43 -0500 Subject: add atcommand_getvar & atcommand_setvar --- src/map/atcommand.cpp | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) (limited to 'src') diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index 15943a7..ad3529d 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -27,6 +27,9 @@ #include "../compat/nullpo.hpp" #include "../compat/fun.hpp" +#include "script-call-internal.hpp" +#include "../generic/intern-pool.hpp" + #include "../strings/mstring.hpp" #include "../strings/astring.hpp" #include "../strings/zstring.hpp" @@ -4664,6 +4667,112 @@ ATCE atcommand_set_magic(Session *s, dumb_ptr, return ATCE::EXIST; } +static +ATCE atcommand_set_var(Session *s, dumb_ptr sd, + ZString message) +{ + CharName character; + XString vname; + XString value; + XString vindex; + char prefix; + char postfix; + + if (!asplit(message, &vname, &vindex, &value, &character)) + { + clif_displaymessage(s, + "Usage: @set "_s); + return ATCE::USAGE; + } + + dumb_ptr pl_sd = map_nick2sd(character); + prefix = vname.front(); + postfix = vname.back(); + SIR reg = SIR::from(variable_names.intern(vname), atoi((RString(vindex)).c_str())); + + if (prefix != '.' && prefix != '$') + { + if (pl_sd == nullptr) + { + clif_displaymessage(s, "Character not found."_s); + return ATCE::EXIST; + } + } + + if (postfix == '$') + { + set_reg(pl_sd, VariableCode::VARIABLE, reg, value); + } + else + { + int val = atoi((RString(value)).c_str()); + set_reg(pl_sd, VariableCode::VARIABLE, reg, val); + } + + AString output = STRPRINTF("variable %s[%s] = `%s`."_fmt, + RString(vname), RString(vindex), RString(value)); + + if (pl_sd != nullptr) + { + output = STRPRINTF("variable %s[%s] = `%s` for player %s."_fmt, + RString(vname), RString(vindex), RString(value), character); + + if (pl_sd->sess != sd->sess) + { + clif_displaymessage(pl_sd->sess, output); + } + } + + clif_displaymessage(sd->sess, output); + return ATCE::OKAY; +} + +static +ATCE atcommand_get_var(Session *s, dumb_ptr sd, + ZString message) +{ + CharName character; + XString vname; + XString vindex; + char prefix; + char postfix; + + if (!asplit(message, &vname, &vindex, &character)) + { + clif_displaymessage(s, + "Usage: @get "_s); + return ATCE::USAGE; + } + + dumb_ptr pl_sd = map_nick2sd(character); + prefix = vname.front(); + postfix = vname.back(); + SIR reg = SIR::from(variable_names.intern(vname), atoi((RString(vindex)).c_str())); + + struct script_data dat = ScriptDataVariable{reg}; + get_val(pl_sd, &dat); + + RString rval; + MATCH_BEGIN (dat) + { + MATCH_CASE (const ScriptDataStr&, u) + { + rval = u.str; + } + MATCH_CASE (const ScriptDataInt&, u) + { + rval = STRPRINTF("%i"_fmt, u.numi); + } + } + MATCH_END (); + + AString output = STRPRINTF("variable %s[%s] == `%s` for player %s."_fmt, + RString(vname), RString(vindex), rval, character); + + clif_displaymessage(sd->sess, output); + return ATCE::OKAY; +} + static ATCE atcommand_log(Session *, dumb_ptr, ZString) @@ -5351,6 +5460,12 @@ Map atcommand_info = {"setmagic"_s, {" "_s, 80, atcommand_set_magic, "Force magic skill level"_s}}, + {"setvar"_s, {" "_s, + 40, atcommand_set_var, + "Sets an arbitrary variable."_s}}, + {"getvar"_s, {" "_s, + 40, atcommand_get_var, + "Gets the value of an arbitrary variable."_s}}, {"magicinfo"_s, {""_s, 80, atcommand_magic_info, "Show magic skills of a palyer"_s}}, -- cgit v1.2.3-60-g2f50