-
Notifications
You must be signed in to change notification settings - Fork 224
/
editor.h
154 lines (131 loc) · 5.54 KB
/
editor.h
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//////////////////////////////////////////////////////////////////////
// This file is part of Remere's Map Editor
//////////////////////////////////////////////////////////////////////
// Remere's Map Editor 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.
//
// Remere's Map Editor 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/>.
//////////////////////////////////////////////////////////////////////
#ifndef RME_EDITOR_H
#define RME_EDITOR_H
#include "item.h"
#include "tile.h"
#include "iomap.h"
#include "map.h"
#include "action.h"
#include "selection.h"
class BaseMap;
class CopyBuffer;
class LiveClient;
class LiveServer;
class LiveSocket;
class Editor
{
public:
Editor(CopyBuffer& copybuffer, LiveClient* client);
Editor(CopyBuffer& copybuffer, const FileName& fn);
Editor(CopyBuffer& copybuffer);
~Editor();
protected:
// Live Server
LiveServer* live_server;
LiveClient* live_client;
public:
// Public members
CopyBuffer& copybuffer;
GroundBrush* replace_brush;
public: // Functions
// Live Server handling
LiveClient* GetLiveClient() const;
LiveServer* GetLiveServer() const;
LiveSocket& GetLive() const;
bool CanEdit() const noexcept { return true; }
bool IsLocal() const;
bool IsLive() const;
bool IsLiveServer() const;
bool IsLiveClient() const;
// Server side
LiveServer* StartLiveServer();
void CloseLiveServer();
void BroadcastNodes(DirtyList& dirty_list);
// Client side
void QueryNode(int ndx, int ndy, bool underground);
void SendNodeRequests();
bool hasChanges() const;
void clearChanges();
// Map handling
void saveMap(FileName filename, bool showdialog); // "" means default filename
Map& getMap() noexcept { return map; }
const Map& getMap() const noexcept { return map; }
uint16_t getMapWidth() const noexcept { return map.width; }
uint16_t getMapHeight() const noexcept { return map.height; }
wxString getLoaderError() const { return map.getError(); }
bool importMap(FileName filename, int import_x_offset, int import_y_offset, int import_z_offset, ImportType house_import_type, ImportType spawn_import_type);
bool importMiniMap(FileName filename, int import, int import_x_offset, int import_y_offset, int import_z_offset);
ActionQueue* getHistoryActions() const noexcept { return actionQueue; }
Action* createAction(ActionIdentifier type);
Action* createAction(BatchAction* parent);
BatchAction* createBatch(ActionIdentifier type);
void addBatch(BatchAction* action, int stacking_delay = 0);
void addAction(Action* action, int stacking_delay = 0);
bool canUndo() const;
bool canRedo() const;
void undo(int indexes = 1);
void redo(int indexes = 1);
void updateActions();
void resetActionsTimer();
void clearActions();
// Selection
Selection& getSelection() noexcept { return selection; }
const Selection& getSelection() const noexcept { return selection; }
bool hasSelection() const noexcept { return selection.size() != 0; }
// Some simple actions that work on the map (these will work through the undo queue)
// Moves the selected area by the offset
void moveSelection(const Position& offset);
// Deletes all selected items
void destroySelection();
// Borderizes the selected region
void borderizeSelection();
// Randomizes the ground in the selected region
void randomizeSelection();
// Same as above although it applies to the entire map
// action queue is flushed when these functions are called
// showdialog is whether a progress bar should be shown
void borderizeMap(bool showdialog);
void randomizeMap(bool showdialog);
void clearInvalidHouseTiles(bool showdialog);
void clearModifiedTileState(bool showdialog);
// Draw using the current brush to the target position
// alt is whether the ALT key is pressed
void draw(const Position& offset, bool alt);
void undraw(const Position& offset, bool alt);
void draw(const PositionVector& posvec, bool alt);
void draw(const PositionVector& todraw, PositionVector& toborder, bool alt);
void undraw(const PositionVector& posvec, bool alt);
void undraw(const PositionVector& todraw, PositionVector& toborder, bool alt);
protected:
void drawInternal(const Position offset, bool alt, bool dodraw);
void drawInternal(const PositionVector& posvec, bool alt, bool dodraw);
void drawInternal(const PositionVector& todraw, PositionVector& toborder, bool alt, bool dodraw);
Editor(const Editor&);
Editor& operator=(const Editor&);
private:
Map map;
Selection selection;
ActionQueue* actionQueue;
};
inline void Editor::draw(const Position& offset, bool alt) { drawInternal(offset, alt, true); }
inline void Editor::undraw(const Position& offset, bool alt) { drawInternal(offset, alt, false); }
inline void Editor::draw(const PositionVector& posvec, bool alt) { drawInternal(posvec, alt, true); }
inline void Editor::draw(const PositionVector& todraw, PositionVector& toborder, bool alt) { drawInternal(todraw, toborder, alt, true); }
inline void Editor::undraw(const PositionVector& posvec, bool alt) { drawInternal(posvec, alt, false); }
inline void Editor::undraw(const PositionVector& todraw, PositionVector& toborder, bool alt) { drawInternal(todraw, toborder, alt, false); }
#endif