summaryrefslogtreecommitdiff
path: root/src/ast/npc.hpp
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2014-11-03 13:35:54 -0800
committerBen Longbons <b.r.longbons@gmail.com>2014-11-04 20:10:50 -0800
commit1853e964e96c41e762ca0ab97259ee4e79d86ec7 (patch)
treeedc76f58ed786263a28da79564786f4d75400092 /src/ast/npc.hpp
parent1a00fe4ea75924bfe594c4d92073cc95eaa2f32d (diff)
downloadtmwa-1853e964e96c41e762ca0ab97259ee4e79d86ec7.tar.gz
tmwa-1853e964e96c41e762ca0ab97259ee4e79d86ec7.tar.bz2
tmwa-1853e964e96c41e762ca0ab97259ee4e79d86ec7.tar.xz
tmwa-1853e964e96c41e762ca0ab97259ee4e79d86ec7.zip
Use the new ASTs
Diffstat (limited to 'src/ast/npc.hpp')
-rw-r--r--src/ast/npc.hpp69
1 files changed, 40 insertions, 29 deletions
diff --git a/src/ast/npc.hpp b/src/ast/npc.hpp
index dd323b6..a51acd3 100644
--- a/src/ast/npc.hpp
+++ b/src/ast/npc.hpp
@@ -20,18 +20,18 @@
#include "fwd.hpp"
-#include <memory>
-
#include "../compat/result.hpp"
#include "../io/span.hpp"
+#include "../net/timer.t.hpp"
+
+#include "../sexpr/variant.hpp"
+
#include "../mmo/clif.t.hpp"
#include "../mmo/ids.hpp"
#include "../mmo/strs.hpp"
-#include "../net/timer.t.hpp"
-
#include "script.hpp"
@@ -43,17 +43,11 @@ namespace npc
{
using io::Spanned;
- struct TopLevel
- {
- io::LineSpan span;
-
- virtual ~TopLevel();
- };
- struct Comment : TopLevel
+ struct Comment
{
RString comment;
};
- struct Warp : TopLevel
+ struct Warp
{
Spanned<MapName> m;
Spanned<unsigned> x, y;
@@ -66,9 +60,10 @@ namespace npc
struct ShopItem
{
Spanned<ItemName> name;
+ bool value_multiply;
Spanned<int> value;
};
- struct Shop : TopLevel
+ struct Shop
{
Spanned<MapName> m;
Spanned<unsigned> x, y;
@@ -78,7 +73,7 @@ namespace npc
Spanned<Species> npc_class;
Spanned<std::vector<Spanned<ShopItem>>> items;
};
- struct Monster : TopLevel
+ struct Monster
{
Spanned<MapName> m;
Spanned<unsigned> x, y;
@@ -90,32 +85,25 @@ namespace npc
Spanned<interval_t> delay1, delay2;
Spanned<NpcEvent> event;
};
- struct MapFlag : TopLevel
+ struct MapFlag
{
Spanned<MapName> m;
io::LineSpan key_span;
- // TODO should this extract all the way?
Spanned<RString> name;
- Spanned<RString> opt_extra;
- };
- struct Script : TopLevel
- {
- io::LineSpan key_span;
- // see src/script/parser.hpp
- ast::script::ScriptBody body;
+ Spanned<std::vector<Spanned<RString>>> vec_extra;
};
- struct ScriptFunction : Script
+ struct ScriptFunction
{
io::LineSpan key1_span;
Spanned<RString> name;
};
- struct ScriptNone : Script
+ struct ScriptNone
{
io::LineSpan key1_span;
Spanned<NpcName> name;
io::LineSpan key4_span;
};
- struct ScriptMapNone : Script
+ struct ScriptMapNone
{
Spanned<MapName> m;
Spanned<unsigned> x, y;
@@ -123,7 +111,7 @@ namespace npc
Spanned<NpcName> name;
io::LineSpan key4_span;
};
- struct ScriptMap : Script
+ struct ScriptMap
{
Spanned<MapName> m;
Spanned<unsigned> x, y;
@@ -132,9 +120,32 @@ namespace npc
Spanned<Species> npc_class;
Spanned<unsigned> xs, ys;
};
- // other Script subclasses elsewhere? (for item and magic scripts)
+ using ScriptBase = Variant<ScriptFunction, ScriptNone, ScriptMapNone, ScriptMap>;
+ struct Script : ScriptBase
+ {
+ Script() = default;
+ Script(ScriptFunction s) : ScriptBase(std::move(s)) {}
+ Script(ScriptNone s) : ScriptBase(std::move(s)) {}
+ Script(ScriptMapNone s) : ScriptBase(std::move(s)) {}
+ Script(ScriptMap s) : ScriptBase(std::move(s)) {}
+
+ io::LineSpan key_span;
+ ast::script::ScriptBody body;
+ };
+ using TopLevelBase = Variant<Comment, Warp, Shop, Monster, MapFlag, Script>;
+ struct TopLevel : TopLevelBase
+ {
+ TopLevel() = default;
+ TopLevel(Comment t) : TopLevelBase(std::move(t)) {}
+ TopLevel(Warp t) : TopLevelBase(std::move(t)) {}
+ TopLevel(Shop t) : TopLevelBase(std::move(t)) {}
+ TopLevel(Monster t) : TopLevelBase(std::move(t)) {}
+ TopLevel(MapFlag t) : TopLevelBase(std::move(t)) {}
+ TopLevel(Script t) : TopLevelBase(std::move(t)) {}
+ io::LineSpan span;
+ };
- Result<std::unique_ptr<TopLevel>> parse_top(io::LineCharReader& in);
+ Option<Result<TopLevel>> parse_top(io::LineCharReader& in);
} // namespace npc
} // namespace ast
} // namespace tmwa