diff options
Diffstat (limited to 'src/map/script.hpp')
-rw-r--r-- | src/map/script.hpp | 277 |
1 files changed, 0 insertions, 277 deletions
diff --git a/src/map/script.hpp b/src/map/script.hpp deleted file mode 100644 index d5200a6..0000000 --- a/src/map/script.hpp +++ /dev/null @@ -1,277 +0,0 @@ -#pragma once -// script.hpp - EAthena script frontend, engine, and library. -// -// Copyright © ????-2004 Athena Dev Teams -// Copyright © 2004-2011 The Mana World Development Team -// Copyright © 2011-2014 Ben Longbons <b.r.longbons@gmail.com> -// -// This file is part of The Mana World (Athena server) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#include "fwd.hpp" - -#include <cstdint> - -#include <vector> - -#include "../range/slice.hpp" - -#include "../strings/zstring.hpp" - -#include "../generic/db.hpp" -#include "../generic/dumb_ptr.hpp" - -#include "../sexpr/variant.hpp" - -#include "../mmo/ids.hpp" - -#include "clif.t.hpp" -#include "map.t.hpp" - - -namespace tmwa -{ -enum class VariableCode : uint8_t -{ - PARAM, - VARIABLE, -}; - -enum class StringCode : uint8_t -{ - NOP, POS, INT, PARAM, FUNC, - VARIABLE, -}; - -enum class ByteCode : uint8_t -{ - // types and specials - // Note that 'INT' is synthetic, and does not occur in the data stream - NOP, POS, INT, PARAM, FUNC, STR, ARG, - VARIABLE, EOL, - - // 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, - - // additions - // needed because FUNC is used for the actual call - FUNC_REF, -}; - -struct str_data_t; - -class ScriptBuffer -{ - typedef ZString::iterator ZSit; - - std::vector<ByteCode> script_buf; -public: - // construction methods used only by script.cpp - void add_scriptc(ByteCode a); - void add_scriptb(uint8_t a); - void add_scripti(uint32_t a); - void add_scriptl(str_data_t *a); - void set_label(str_data_t *ld, int pos_); - ZSit parse_simpleexpr(ZSit p); - ZSit parse_subexpr(ZSit p, int limit); - ZSit parse_expr(ZSit p); - ZSit parse_line(ZSit p, bool *canstep); - void parse_script(ZString src, int line, bool implicit_end); - - // consumption methods used only by script.cpp - ByteCode operator[](size_t i) const { return script_buf[i]; } - ZString get_str(size_t i) const - { - return ZString(strings::really_construct_from_a_pointer, reinterpret_cast<const char *>(&script_buf[i]), nullptr); - } - - // method used elsewhere -}; - -struct ScriptPointer -{ - const ScriptBuffer *code; - size_t pos; - - ScriptPointer() - : code() - , pos() - {} - - ScriptPointer(const ScriptBuffer *c, size_t p) - : code(c) - , pos(p) - {} - - ByteCode peek() const { return (*code)[pos]; } - ByteCode pop() { return (*code)[pos++]; } - ZString pops() - { - ZString rv = code->get_str(pos); - pos += rv.size(); - ++pos; - return rv; - } -}; - -// internal -class SIR -{ - uint32_t impl; - SIR(SP v) - : impl(static_cast<uint32_t>(v)) - {} - SIR(unsigned v, uint8_t i) - : impl((i << 24) | v) - {} -public: - SIR() : impl() {} - - unsigned base() const { return impl & 0x00ffffff; } - uint8_t index() const { return impl >> 24; } - SIR iplus(uint8_t i) const { return SIR(base(), index() + i); } - static SIR from(unsigned v, uint8_t i=0) { return SIR(v, i); } - - SP sp() const { return static_cast<SP>(impl); } - static SIR from(SP v) { return SIR(v); } - - friend bool operator == (SIR l, SIR r) { return l.impl == r.impl; } - friend bool operator < (SIR l, SIR r) { return l.impl < r.impl; } -}; - -struct ScriptDataPos -{ - int numi; -}; -struct ScriptDataInt -{ - int numi; -}; -struct ScriptDataParam -{ - SIR reg; -}; -struct ScriptDataStr -{ - RString str; -}; -struct ScriptDataArg -{ - int numi; -}; -struct ScriptDataVariable -{ - SIR reg; -}; -struct ScriptDataRetInfo -{ - // Not a ScriptPointer - pos is stored in a separate slot, - // to avoid exploding the struct for everyone. - const ScriptBuffer *script; -}; -struct ScriptDataFuncRef -{ - int numi; -}; - -using ScriptDataVariantBase = Variant< - ScriptDataPos, - ScriptDataInt, - ScriptDataParam, - ScriptDataStr, - ScriptDataArg, - ScriptDataVariable, - ScriptDataRetInfo, - ScriptDataFuncRef ->; -struct script_data : ScriptDataVariantBase -{ - script_data() = delete; - // TODO see if I can delete the copy ctor/assign instead of defaulting - script_data(script_data&&) = default; - script_data(const script_data&) = default /*delete*/; - script_data& operator = (script_data&&) = default; - script_data& operator = (const script_data&) = default /*delete*/; - - script_data(ScriptDataPos v) : ScriptDataVariantBase(std::move(v)) {} - script_data(ScriptDataInt v) : ScriptDataVariantBase(std::move(v)) {} - script_data(ScriptDataParam v) : ScriptDataVariantBase(std::move(v)) {} - script_data(ScriptDataStr v) : ScriptDataVariantBase(std::move(v)) {} - script_data(ScriptDataArg v) : ScriptDataVariantBase(std::move(v)) {} - script_data(ScriptDataVariable v) : ScriptDataVariantBase(std::move(v)) {} - script_data(ScriptDataRetInfo v) : ScriptDataVariantBase(std::move(v)) {} - script_data(ScriptDataFuncRef v) : ScriptDataVariantBase(std::move(v)) {} -}; - -struct script_stack -{ - std::vector<struct script_data> stack_datav; -}; - -enum class ScriptEndState; -// future improvements coming! -class ScriptState -{ -public: - struct script_stack *stack; - int start, end; - ScriptEndState state; - BlockId rid, oid; - ScriptPointer scriptp, new_scriptp; - int defsp, new_defsp; -}; - -std::unique_ptr<const ScriptBuffer> parse_script(ZString, int, bool implicit_end); - -struct argrec_t -{ - ZString name; - union _aru - { - int i; - ZString s; - - _aru(int n) : i(n) {} - _aru(ZString z) : s(z) {} - } v; - - argrec_t(ZString n, int i) : name(n), v(i) {} - argrec_t(ZString n, ZString z) : name(n), v(z) {} -}; -int run_script_l(ScriptPointer, BlockId, BlockId, Slice<argrec_t> args); -int run_script(ScriptPointer, BlockId, BlockId); - -extern -Map<ScriptLabel, int> scriptlabel_db; -extern -UPMap<RString, const ScriptBuffer> userfunc_db; - -void do_init_script(void); -void do_final_script(void); - -extern AString mapreg_txt; - -extern int script_errors; - -bool read_constdb(ZString filename); - -void set_script_var_i(dumb_ptr<map_session_data> sd, VarName var, int e, int val); -void set_script_var_s(dumb_ptr<map_session_data> sd, VarName var, int e, XString val); - -int get_script_var_i(dumb_ptr<map_session_data> sd, VarName var, int e); -ZString get_script_var_s(dumb_ptr<map_session_data> sd, VarName var, int e); -} // namespace tmwa |