summaryrefslogtreecommitdiff
path: root/src/map/script-call-internal.hpp
blob: da6c08287f74ddac4b87aac5ed1f1fb32ff7c1b1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#pragma once
//    script-call-internal.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 "script-call.hpp"
#include "fwd.hpp"

#include "../mmo/ids.hpp"

#include "../strings/rstring.hpp"
#include "../generic/db.hpp"
#include "script-persist.hpp"


namespace tmwa
{
namespace map
{
enum class VariableCode : uint8_t
{
    PARAM,
    VARIABLE,
};

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, freeloop;
    int is_true = 0;

    // register keys are ints (interned)
    // Not anymore! Well, sort of.
    DMap<SIR, int> regm;
    // can't be DMap because we want predictable .c_str()s
    // TODO this can change now
    Map<SIR, RString> regstrm;
};

void run_func(ScriptState *st);

enum class ScriptEndState
{
    ZERO,
    STOP,
    END,
    RERUNLINE,
    GOTO,
    RETFUNC,
};

dumb_ptr<map_session_data> script_rid2sd(ScriptState *st);
void get_val(dumb_ptr<block_list> sd, struct script_data *data);
__attribute__((deprecated))
void get_val(ScriptState *st, struct script_data *data);
struct script_data get_val2(ScriptState *st, SIR reg);
void set_scope_reg(ScriptState *, SIR, struct script_data *);
void set_reg(dumb_ptr<block_list> sd, VariableCode type, SIR reg, struct script_data vd);
void set_reg(dumb_ptr<block_list> sd, VariableCode type, SIR reg, int id);
void set_reg(dumb_ptr<block_list> sd, VariableCode type, SIR reg, RString zd);
__attribute__((warn_unused_result))
RString conv_str(ScriptState *st, struct script_data *data);
__attribute__((warn_unused_result))
int conv_num(ScriptState *st, struct script_data *data);
__attribute__((warn_unused_result))
Borrowed<const ScriptBuffer> conv_script(ScriptState *st, struct script_data *data);

template<class T>
void push_int(struct script_stack *stack, int val);
template<class T>
void push_reg(struct script_stack *stack, SIR reg);
template<class T>
void push_script(struct script_stack *stack, Borrowed<const ScriptBuffer> code);
template<class T>
void push_str(struct script_stack *stack, RString str);

void push_copy(struct script_stack *stack, int pos_);
void pop_stack(struct script_stack *stack, int start, int end);
} // namespace map
} // namespace tmwa

#include "script-call-internal.tcc"