summary refs log tree commit diff stats
path: root/tools/mapedit/src
diff options
context:
space:
mode:
Diffstat (limited to 'tools/mapedit/src')
-rw-r--r--tools/mapedit/src/main.cpp54
-rw-r--r--tools/mapedit/src/map.cpp94
-rw-r--r--tools/mapedit/src/map.h44
3 files changed, 192 insertions, 0 deletions
diff --git a/tools/mapedit/src/main.cpp b/tools/mapedit/src/main.cpp new file mode 100644 index 0000000..09be151 --- /dev/null +++ b/tools/mapedit/src/main.cpp
@@ -0,0 +1,54 @@
1#include <wx/wxprec.h>
2
3#ifndef WX_PRECOMP
4#include <wx/wx.h>
5#endif
6
7#include "map.h"
8
9class MapeditApp : public wxApp {
10 public:
11 virtual bool OnInit();
12};
13
14class MapeditFrame : public wxFrame {
15 public:
16 MapeditFrame() : MapeditFrame(Map()) {}
17 MapeditFrame(Map map);
18
19 private:
20 void OnExit(wxCommandEvent& event);
21
22 Map map;
23
24 wxDECLARE_EVENT_TABLE();
25};
26
27wxBEGIN_EVENT_TABLE(MapeditFrame, wxFrame)
28 EVT_MENU(wxID_EXIT, MapeditFrame::OnExit)
29wxEND_EVENT_TABLE()
30
31wxIMPLEMENT_APP(MapeditApp);
32
33bool MapeditApp::OnInit()
34{
35 MapeditFrame* frame = new MapeditFrame();
36 frame->Show(true);
37 return true;
38}
39
40MapeditFrame::MapeditFrame(Map map) : wxFrame(NULL, wxID_ANY, "Map Editor", wxPoint(50, 50), wxSize(450, 340)), map(map)
41{
42 wxMenu* menuFile = new wxMenu;
43 menuFile->Append(wxID_EXIT);
44
45 wxMenuBar* menuBar = new wxMenuBar;
46 menuBar->Append(menuFile, "&File");
47
48 SetMenuBar(menuBar);
49}
50
51void MapeditFrame::OnExit(wxCommandEvent& event)
52{
53 Close(true);
54}
diff --git a/tools/mapedit/src/map.cpp b/tools/mapedit/src/map.cpp new file mode 100644 index 0000000..52a2096 --- /dev/null +++ b/tools/mapedit/src/map.cpp
@@ -0,0 +1,94 @@
1#include "map.h"
2#include <libxml/parser.h>
3
4Map::Map()
5{
6 mapdata = (int*) calloc(MAP_WIDTH * MAP_HEIGHT, sizeof(int));
7}
8
9Map::Map(const std::string filename)
10{
11 xmlDocPtr doc = xmlParseFile(filename.c_str());
12 if (doc == nullptr)
13 {
14 throw MapLoadException(filename);
15 }
16
17 xmlNodePtr top = xmlDocGetRootElement(doc);
18 if (top == nullptr)
19 {
20 throw MapLoadException(filename);
21 }
22
23 if (xmlStrcmp(top->name, (const xmlChar*) "map-def"))
24 {
25 throw MapLoadException(filename);
26 }
27
28 for (xmlNodePtr node = top->xmlChildrenNode; node != NULL; node = node->next)
29 {
30 if (!xmlStrcmp(node->name, (const xmlChar*) "name"))
31 {
32 xmlChar* key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
33 title = (char*) key;
34 xmlFree(key);
35 } else if (!xmlStrcmp(node->name, (const xmlChar*) "environment"))
36 {
37 xmlChar* key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
38 mapdata = (int*) malloc(MAP_WIDTH*MAP_HEIGHT*sizeof(int));
39 mapdata[0] = atoi(strtok((char*) key, ",\n"));
40 for (int i=1; i<(MAP_WIDTH*MAP_HEIGHT); i++)
41 {
42 mapdata[i] = atoi(strtok(NULL, ",\n"));
43 }
44 xmlFree(key);
45 } else if (!xmlStrcmp(node->name, (const xmlChar*) "leftmap"))
46 {
47 xmlChar* key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
48 leftmap = (char*) key;
49 xmlFree(key);
50 } else if (!xmlStrcmp(node->name, (const xmlChar*) "rightmap"))
51 {
52 xmlChar* key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
53 rightmap = (char*) key;
54 xmlFree(key);
55 }
56 }
57
58 xmlFreeDoc(doc);
59}
60
61Map::Map(const Map& map)
62{
63 mapdata = (int*) malloc(MAP_WIDTH*MAP_HEIGHT*sizeof(int));
64 memcpy(mapdata, map.mapdata, MAP_WIDTH*MAP_HEIGHT*sizeof(int));
65
66 title = map.title;
67 leftmap = map.leftmap;
68 rightmap = map.rightmap;
69}
70
71Map::Map(Map&& map) : Map()
72{
73 swap(*this, map);
74}
75
76Map::~Map()
77{
78 free(mapdata);
79}
80
81Map& Map::operator= (Map map)
82{
83 swap(*this, map);
84
85 return *this;
86}
87
88void swap(Map& first, Map& second)
89{
90 std::swap(first.mapdata, second.mapdata);
91 std::swap(first.title, second.title);
92 std::swap(first.leftmap, second.leftmap);
93 std::swap(first.rightmap, second.rightmap);
94} \ No newline at end of file
diff --git a/tools/mapedit/src/map.h b/tools/mapedit/src/map.h new file mode 100644 index 0000000..83244f3 --- /dev/null +++ b/tools/mapedit/src/map.h
@@ -0,0 +1,44 @@
1#ifndef MAP_H
2#define MAP_H
3
4#include <string>
5#include <exception>
6
7const int TILE_WIDTH = 8;
8const int TILE_HEIGHT = 8;
9const int GAME_WIDTH = 320;
10const int GAME_HEIGHT = 200;
11const int MAP_WIDTH = GAME_WIDTH/TILE_WIDTH;
12const int MAP_HEIGHT = GAME_HEIGHT/TILE_HEIGHT - 1;
13
14class MapLoadException: public std::exception
15{
16 public:
17 MapLoadException(std::string mapname) : mapname(mapname) {}
18
19 virtual const char* what() const throw()
20 {
21 return ("An error occured loading map " + mapname).c_str();
22 }
23
24 private:
25 std::string mapname;
26};
27
28class Map {
29 public:
30 Map();
31 Map(const std::string name);
32 Map(const Map& map);
33 Map(Map&& map);
34 ~Map();
35 Map& operator= (Map other);
36 friend void swap(Map& first, Map& second);
37
38 int* mapdata;
39 std::string title;
40 std::string leftmap;
41 std::string rightmap;
42};
43
44#endif