summaryrefslogtreecommitdiff
path: root/src/map/magic-interpreter.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/magic-interpreter.hpp')
-rw-r--r--src/map/magic-interpreter.hpp630
1 files changed, 0 insertions, 630 deletions
diff --git a/src/map/magic-interpreter.hpp b/src/map/magic-interpreter.hpp
deleted file mode 100644
index cbd92a9..0000000
--- a/src/map/magic-interpreter.hpp
+++ /dev/null
@@ -1,630 +0,0 @@
-#pragma once
-// magic-interpreter.hpp - Old magic.
-//
-// 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 "magic-interpreter.t.hpp"
-
-#include "fwd.hpp"
-
-#include <cassert>
-
-#include <memory>
-
-#include "../strings/rstring.hpp"
-
-#include "../sexpr/variant.hpp"
-
-#include "../net/timer.t.hpp"
-
-#include "../mmo/ids.hpp"
-
-#include "map.hpp"
-#include "script-buffer.hpp"
-#include "../mmo/skill.t.hpp"
-
-
-namespace tmwa
-{
-namespace map
-{
-namespace magic
-{
-struct location_t
-{
- Borrowed<map_local> m;
- int x, y;
-
- // This constructor exists solely to work around the design constraints
- // of sexpr::Variant<>. See comments in variant.tcc for future plans.
- __attribute__((deprecated))
- location_t() noexcept : m(borrow(undefined_gat)), x(), y() {}
- location_t(Borrowed<map_local> m_, int x_, int y_) : m(m_), x(x_), y(y_) {}
-};
-
-struct AreaUnion
-{
- dumb_ptr<area_t> a_union[2];
-};
-struct AreaRect
-{
- location_t loc;
- int width, height;
-};
-struct AreaBar
-{
- location_t loc;
- int width, depth;
- DIR dir;
-};
-
-using AreaVariantBase = Variant<
- location_t,
- AreaUnion,
- AreaRect,
- AreaBar
->;
-
-struct area_t : AreaVariantBase
-{
- int size;
-
- area_t() = delete;
- area_t(area_t&&) = default;
- area_t(const area_t&) = delete;
- area_t& operator = (area_t&&) = default;
- area_t& operator = (const area_t&) = delete;
-
- area_t(location_t v) : AreaVariantBase(std::move(v)), size(1) {}
- area_t(AreaUnion v) : AreaVariantBase(std::move(v)), size(v.a_union[0]->size + v.a_union[1]->size) {}
- area_t(AreaRect v) : AreaVariantBase(std::move(v)), size(v.width * v.height) {}
- area_t(AreaBar v) : AreaVariantBase(std::move(v)), size((v.width * 2 + 1) * v.depth) {}
-};
-
-struct ValUndef
-{
-};
-struct ValInt
-{
- int v_int;
-};
-struct ValDir
-{
- DIR v_dir;
-};
-struct ValString
-{
- RString v_string;
-};
-struct ValEntityInt
-{
- BlockId v_eid;
-};
-struct ValEntityPtr
-{
- dumb_ptr<block_list> v_entity;
-};
-struct ValLocation
-{
- location_t v_location;
-};
-struct ValArea
-{
- dumb_ptr<area_t> v_area;
-};
-struct ValSpell
-{
- dumb_ptr<spell_t> v_spell;
-};
-struct ValInvocationInt
-{
- BlockId v_iid;
-};
-struct ValInvocationPtr
-{
- dumb_ptr<invocation> v_invocation;
-};
-struct ValFail
-{
-};
-struct ValNegative1
-{
-};
-
-using ValVariantBase = Variant<
- ValUndef,
- ValInt,
- ValDir,
- ValString,
- ValEntityInt,
- ValEntityPtr,
- ValLocation,
- ValArea,
- ValSpell,
- ValInvocationInt,
- ValInvocationPtr,
- ValFail,
- ValNegative1
->;
-struct val_t : ValVariantBase
-{
- val_t() noexcept : ValVariantBase(ValUndef{}) {}
- val_t(val_t&&) = default;
- val_t(const val_t&) = delete;
- val_t& operator = (val_t&&) = default;
- val_t& operator = (const val_t&) = delete;
-
- val_t(ValUndef v) : ValVariantBase(std::move(v)) {}
- val_t(ValInt v) : ValVariantBase(std::move(v)) {}
- val_t(ValDir v) : ValVariantBase(std::move(v)) {}
- val_t(ValString v) : ValVariantBase(std::move(v)) {}
- val_t(ValEntityInt v) : ValVariantBase(std::move(v)) {}
- val_t(ValEntityPtr v) : ValVariantBase(std::move(v)) {}
- val_t(ValLocation v) : ValVariantBase(std::move(v)) {}
- val_t(ValArea v) : ValVariantBase(std::move(v)) {}
- val_t(ValSpell v) : ValVariantBase(std::move(v)) {}
- val_t(ValInvocationInt v) : ValVariantBase(std::move(v)) {}
- val_t(ValInvocationPtr v) : ValVariantBase(std::move(v)) {}
- val_t(ValFail v) : ValVariantBase(std::move(v)) {}
- val_t(ValNegative1 v) : ValVariantBase(std::move(v)) {}
-};
-
-
-/* ----------- */
-/* Expressions */
-/* ----------- */
-
-#define MAX_ARGS 7 /* Max. # of args used in builtin primitive functions */
-
-struct e_area_t;
-
-struct e_location_t
-{
- dumb_ptr<expr_t> m, x, y;
-
- e_location_t() noexcept : m(), x(), y() {}
-};
-struct ExprAreaUnion
-{
- dumb_ptr<e_area_t> a_union[2];
-};
-struct ExprAreaRect
-{
- e_location_t loc;
- dumb_ptr<expr_t> width, height;
-};
-struct ExprAreaBar
-{
- e_location_t loc;
- dumb_ptr<expr_t> width, depth, dir;
-};
-
-using ExprAreaVariantBase = Variant<
- e_location_t,
- ExprAreaUnion,
- ExprAreaRect,
- ExprAreaBar
->;
-
-struct e_area_t : ExprAreaVariantBase
-{
- e_area_t() = delete;
- e_area_t(e_area_t&&) = default;
- e_area_t(const e_area_t&) = delete;
- e_area_t& operator = (e_area_t&&) = default;
- e_area_t& operator = (const e_area_t&) = delete;
-
- e_area_t(e_location_t v) : ExprAreaVariantBase(std::move(v)) {}
- e_area_t(ExprAreaUnion v) : ExprAreaVariantBase(std::move(v)) {}
- e_area_t(ExprAreaRect v) : ExprAreaVariantBase(std::move(v)) {}
- e_area_t(ExprAreaBar v) : ExprAreaVariantBase(std::move(v)) {}
-};
-
-struct ExprFunApp
-{
- fun_t *funp;
- int line_nr, column;
- int args_nr;
- dumb_ptr<expr_t> args[MAX_ARGS];
-};
-struct ExprId
-{
- int e_id;
-};
-struct ExprField
-{
- dumb_ptr<expr_t> expr;
- int id;
-};
-
-using ExprVariantBase = Variant<
- val_t,
- e_location_t,
- e_area_t,
- ExprFunApp,
- ExprId,
- ExprField
->;
-struct expr_t : ExprVariantBase
-{
- expr_t() = delete;
- expr_t(expr_t&&) = default;
- expr_t(const expr_t&) = delete;
- expr_t& operator = (expr_t&&) = default;
- expr_t& operator = (const expr_t&) = delete;
-
- expr_t(val_t v) : ExprVariantBase(std::move(v)) {}
- expr_t(e_location_t v) : ExprVariantBase(std::move(v)) {}
- expr_t(e_area_t v) : ExprVariantBase(std::move(v)) {}
- expr_t(ExprFunApp v) : ExprVariantBase(std::move(v)) {}
- expr_t(ExprId v) : ExprVariantBase(std::move(v)) {}
- expr_t(ExprField v) : ExprVariantBase(std::move(v)) {}
-};
-
-
-struct effect_t;
-
-struct EffectSkip
-{
-};
-struct EffectAbort
-{
-};
-struct EffectAssign
-{
- int id;
- dumb_ptr<expr_t> expr;
-};
-struct EffectForEach
-{
- int id;
- dumb_ptr<expr_t> area;
- dumb_ptr<effect_t> body;
- FOREACH_FILTER filter;
-};
-struct EffectFor
-{
- int id;
- dumb_ptr<expr_t> start, stop;
- dumb_ptr<effect_t> body;
-};
-struct EffectIf
-{
- dumb_ptr<expr_t> cond;
- dumb_ptr<effect_t> true_branch, false_branch;
-};
-struct EffectSleep
-{
- dumb_ptr<expr_t> e_sleep; /* sleep time */
-};
-struct EffectScript
-{
- dumb_ptr<const ScriptBuffer> e_script;
-};
-struct EffectBreak
-{
-};
-struct EffectOp
-{
- op_t *opp;
- int args_nr;
- int line_nr, column;
- dumb_ptr<expr_t> args[MAX_ARGS];
-};
-struct EffectEnd
-{
-};
-struct EffectCall
-{
- std::vector<int> *formalv;
- dumb_ptr<std::vector<dumb_ptr<expr_t>>> actualvp;
- dumb_ptr<effect_t> body;
-};
-
-using EffectVariantBase = Variant<
- EffectSkip,
- EffectAbort,
- EffectAssign,
- EffectForEach,
- EffectFor,
- EffectIf,
- EffectSleep,
- EffectScript,
- EffectBreak,
- EffectOp,
- EffectEnd,
- EffectCall
->;
-struct effect_t : EffectVariantBase
-{
- dumb_ptr<effect_t> next;
-
- effect_t() = delete;
- effect_t(effect_t&&) = default;
- effect_t(const effect_t&) = delete;
- effect_t& operator = (effect_t&&) = default;
- effect_t& operator = (const effect_t&) = delete;
-
- effect_t(EffectSkip v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectAbort v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectAssign v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectForEach v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectFor v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectIf v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectSleep v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectScript v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectBreak v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectOp v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectEnd v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
- effect_t(EffectCall v, dumb_ptr<effect_t> n) : EffectVariantBase(std::move(v)), next(n) {}
-};
-
-/* ---------- */
-/* Components */
-/* ---------- */
-
-struct component_t
-{
- dumb_ptr<component_t> next;
- ItemNameId item_id;
- int count;
-};
-
-
-struct spellguard_t;
-struct GuardCondition
-{
- dumb_ptr<expr_t> s_condition;
-};
-struct GuardMana
-{
- dumb_ptr<expr_t> s_mana;
-};
-struct GuardCastTime
-{
- dumb_ptr<expr_t> s_casttime;
-};
-struct GuardComponents
-{
- dumb_ptr<component_t> s_components;
-};
-struct GuardCatalysts
-{
- dumb_ptr<component_t> s_catalysts;
-};
-struct GuardChoice
-{
- dumb_ptr<spellguard_t> s_alt; /* either `next' or `s.s_alt' */
-};
-struct effect_set_t
-{
- dumb_ptr<effect_t> effect, at_trigger, at_end;
-};
-
-using SpellGuardVariantBase = Variant<
- GuardCondition,
- GuardMana,
- GuardCastTime,
- GuardComponents,
- GuardCatalysts,
- GuardChoice,
- effect_set_t
->;
-struct spellguard_t : SpellGuardVariantBase
-{
- dumb_ptr<spellguard_t> next;
-
- spellguard_t() = delete;
- spellguard_t(spellguard_t&&) = default;
- spellguard_t(const spellguard_t&) = delete;
- spellguard_t& operator = (spellguard_t&&) = default;
- spellguard_t& operator = (const spellguard_t&) = delete;
-
- spellguard_t(GuardCondition v, dumb_ptr<spellguard_t> n) : SpellGuardVariantBase(std::move(v)), next(n) {}
- spellguard_t(GuardMana v, dumb_ptr<spellguard_t> n) : SpellGuardVariantBase(std::move(v)), next(n) {}
- spellguard_t(GuardCastTime v, dumb_ptr<spellguard_t> n) : SpellGuardVariantBase(std::move(v)), next(n) {}
- spellguard_t(GuardComponents v, dumb_ptr<spellguard_t> n) : SpellGuardVariantBase(std::move(v)), next(n) {}
- spellguard_t(GuardCatalysts v, dumb_ptr<spellguard_t> n) : SpellGuardVariantBase(std::move(v)), next(n) {}
- spellguard_t(GuardChoice v, dumb_ptr<spellguard_t> n) : SpellGuardVariantBase(std::move(v)), next(n) {}
- spellguard_t(effect_set_t v, dumb_ptr<spellguard_t> n) : SpellGuardVariantBase(std::move(v)), next(n) {}
-};
-
-/* ------ */
-/* Spells */
-/* ------ */
-
-struct letdef_t
-{
- int id;
- dumb_ptr<expr_t> expr;
-};
-
-struct spell_t
-{
- RString name;
- RString invocation;
- SPELL_FLAG flags;
- int arg;
- SPELLARG spellarg_ty;
-
- std::vector<letdef_t> letdefv;
-
- dumb_ptr<spellguard_t> spellguard;
-};
-
-/* ------- */
-/* Anchors */
-/* ------- */
-
-struct teleport_anchor_t
-{
- RString name;
- RString invocation;
- dumb_ptr<expr_t> location;
-};
-
-/* ------------------- */
-/* The big config blob */
-/* ------------------- */
-
-struct magic_conf_t
-{
- struct mcvar
- {
- RString name;
- val_t val;
- };
- // This should probably be done by a dedicated "intern pool" class
- std::vector<mcvar> varv;
-
- std::map<RString, dumb_ptr<spell_t>> spells_by_name, spells_by_invocation;
-
- std::map<RString, dumb_ptr<teleport_anchor_t>> anchors_by_name, anchors_by_invocation;
-};
-
-/* Execution environment */
-
-// 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 env_t
-{
- magic_conf_t *base_env;
- std::unique_ptr<val_t[]> varu;
-
- val_t& VAR(size_t i)
- {
- assert (varu);
- if (varu[i].is<ValUndef>())
- return base_env->varv[i].val;
- else
- return varu[i];
- }
-
-};
-
-struct CarForEach
-{
- int id;
- bool ty_is_spell_not_entity;
- dumb_ptr<effect_t> body;
- dumb_ptr<std::vector<BlockId>> entities_vp;
- int index;
-};
-struct CarFor
-{
- int id;
- dumb_ptr<effect_t> body;
- int current;
- int stop;
-};
-struct CarProc
-{
- int args_nr;
- int *formalap;
- dumb_ptr<val_t[]> old_actualpa;
-};
-
-using CarVariantBase = Variant<
- CarForEach,
- CarFor,
- CarProc
->;
-
-struct cont_activation_record_t : CarVariantBase
-{
- dumb_ptr<effect_t> return_location;
-
- cont_activation_record_t() = delete;
- cont_activation_record_t(cont_activation_record_t&&) = default;
- cont_activation_record_t(const cont_activation_record_t&) = delete;
- cont_activation_record_t& operator = (cont_activation_record_t&&) = default;
- cont_activation_record_t& operator = (const cont_activation_record_t&) = delete;
-
- cont_activation_record_t(CarForEach v, dumb_ptr<effect_t> rl) : CarVariantBase(std::move(v)), return_location(rl) {}
- cont_activation_record_t(CarFor v, dumb_ptr<effect_t> rl) : CarVariantBase(std::move(v)), return_location(rl) {}
- cont_activation_record_t(CarProc v, dumb_ptr<effect_t> rl) : CarVariantBase(std::move(v)), return_location(rl) {}
-};
-
-struct status_change_ref_t
-{
- StatusChange sc_type;
- BlockId bl_id;
-};
-
-struct invocation : block_list
-{
- dumb_ptr<invocation> next_invocation; /* used for spells directly associated with a caster: they form a singly-linked list */
- INVOCATION_FLAG flags;
-
- dumb_ptr<env_t> env;
- dumb_ptr<spell_t> spell;
- BlockId caster; /* this is the person who originally invoked the spell */
- BlockId subject; /* when this person dies, the spell dies with it */
-
- Timer timer; /* spell timer, if any */
-
- std::vector<cont_activation_record_t> stack;
-
- int script_pos; /* Script position; if nonzero, resume the script we were running. */
- dumb_ptr<effect_t> current_effect;
- dumb_ptr<effect_t> trigger_effect; /* If non-nullptr, this is used to spawn a cloned effect based on the same environment */
- dumb_ptr<effect_t> end_effect; /* If non-nullptr, 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 */
- std::vector<status_change_ref_t> status_change_refv;
-
-};
-} // namespace magic
-
-// inlines for map.hpp
-inline dumb_ptr<magic::invocation> block_list::as_spell() { return dumb_ptr<magic::invocation>(static_cast<magic::invocation *>(this)); }
-inline dumb_ptr<magic::invocation> block_list::is_spell() { return bl_type == BL::SPELL ? as_spell() : nullptr; }
-
-namespace magic
-{
-/* The following is used only by the parser: */
-struct args_rec_t
-{
- dumb_ptr<std::vector<dumb_ptr<expr_t>>> argvp;
-};
-
-struct proc_t
-{
- RString name;
- std::vector<int> argv;
- dumb_ptr<effect_t> body;
-
- proc_t()
- : name()
- , argv()
- , body()
- {}
-};
-} // namespace magic
-} // namespace map
-} // namespace tmwa