]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/ufoaiplug/ufoai.cpp
reformat code! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / contrib / ufoaiplug / ufoai.cpp
1 /*
2    This file is part of GtkRadiant.
3
4    GtkRadiant is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2 of the License, or
7    (at your option) any later version.
8
9    GtkRadiant is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with GtkRadiant; if not, write to the Free Software
16    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "ufoai.h"
20 #include "ufoai_level.h"
21 #include "ufoai_gtk.h"
22 #include "ufoai_filters.h"
23
24 #include "debugging/debugging.h"
25
26 #include "iplugin.h"
27
28 #include "version.h"
29
30 #include "string/string.h"
31 #include "modulesystem/singletonmodule.h"
32
33 #include <gtk/gtk.h>
34
35 #define PLUGIN_VERSION "0.4"
36
37 #include "ifilter.h"
38 #include "ibrush.h"
39 #include "iundo.h"       // declaration of undo system
40 #include "ientity.h"     // declaration of entity system
41 #include "iscenegraph.h" // declaration of datastructure of the map
42 #include "scenelib.h"    // declaration of datastructure of the map
43 #include "qerplugin.h"   // declaration to use other interfaces as a plugin
44 #include "ieclass.h"
45
46 class UFOAIPluginDependencies :
47         public GlobalRadiantModuleRef,  // basic class for all other module refs
48         public GlobalUndoModuleRef,     // used to say radiant that something has changed and to undo that
49         public GlobalSceneGraphModuleRef, // necessary to handle data in the mapfile (change, retrieve data)
50         public GlobalEntityModuleRef,   // to access and modify the entities
51         public GlobalEntityClassManagerModuleRef {
52 public:
53     UFOAIPluginDependencies(void) :
54             GlobalEntityModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("entities")),
55             GlobalEntityClassManagerModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("entityclass"))
56     {
57     }
58 };
59
60 namespace UFOAI {
61     ui::Window g_mainwnd{ui::null};
62
63     const char *init(void *hApp, void *pMainWidget)
64     {
65         g_mainwnd = ui::Window::from(pMainWidget);
66         return "Initializing GTKRadiant UFOAI plugin";
67     }
68
69     const char *getName()
70     {
71         return "UFO:AI";
72     }
73
74     const char *getCommandList()
75     {
76         /*GlobalRadiant().getGameName()*/
77         return "About;-;Worldspawn reset;Worldspawn;Perform check;-;Level 1;Level 2;Level 3;Level 4;Level 5;Level 6;Level 7;Level 8;-;StepOn;ActorClip;WeaponClip;Nodraw";
78     }
79
80     const char *getCommandTitleList()
81     {
82         return "";
83     }
84
85     void dispatch(const char *command, float *vMin, float *vMax, bool bSingleBrush)
86     {
87         char const *message = NULL;
88         if (string_equal(command, "About")) {
89             char const *version_string = "UFO:AI Plugin (http://ufoai.sf.net)\nBuild: " __DATE__
90                     "\nRadiant version: " RADIANT_VERSION
91                     "\nPlugin version: " PLUGIN_VERSION
92                     "\nAuthor: Martin Gerhardy (tlh2000/mattn)\n";
93             GlobalRadiant().m_pfnMessageBox(g_mainwnd,
94                                             version_string, "About",
95                                             eMB_OK, eMB_ICONDEFAULT);
96         } else if (string_equal(command, "Level 1")) {
97             filter_level(CONTENTS_LEVEL1);
98         } else if (string_equal(command, "Level 2")) {
99             filter_level(CONTENTS_LEVEL2);
100         } else if (string_equal(command, "Level 3")) {
101             filter_level(CONTENTS_LEVEL3);
102         } else if (string_equal(command, "Worldspawn")) {
103             assign_default_values_to_worldspawn(false, &message);
104         } else if (string_equal(command, "Worldspawn reset")) {
105             assign_default_values_to_worldspawn(true, &message);
106         } else if (string_equal(command, "Perform check")) {
107             check_map_values(&message);
108         } else if (string_equal(command, "Level 4")) {
109             filter_level(CONTENTS_LEVEL4);
110         } else if (string_equal(command, "Level 5")) {
111             filter_level(CONTENTS_LEVEL5);
112         } else if (string_equal(command, "Level 6")) {
113             filter_level(CONTENTS_LEVEL6);
114         } else if (string_equal(command, "Level 7")) {
115             filter_level(CONTENTS_LEVEL7);
116         } else if (string_equal(command, "Level 8")) {
117             filter_level(CONTENTS_LEVEL8);
118         } else if (string_equal(command, "StepOn")) {
119             filter_stepon();
120         } else if (string_equal(command, "ActorClip")) {
121             filter_actorclip();
122         } else if (string_equal(command, "WeaponClip")) {
123             filter_weaponclip();
124         } else if (string_equal(command, "NoDraw")) {
125             filter_nodraw();
126         }
127
128         if (message != NULL) {
129             GlobalRadiant().m_pfnMessageBox(g_mainwnd,
130                                             message, "Note",
131                                             eMB_OK, eMB_ICONDEFAULT);
132         }
133         SceneChangeNotify();
134     }
135 } // namespace
136
137
138 class UFOAIModule : public TypeSystemRef {
139     _QERPluginTable m_plugin;
140 public:
141     typedef _QERPluginTable Type;
142
143     STRING_CONSTANT(Name, "UFO:AI");
144
145     UFOAIModule()
146     {
147         m_plugin.m_pfnQERPlug_Init = &UFOAI::init;
148         m_plugin.m_pfnQERPlug_GetName = &UFOAI::getName;
149         m_plugin.m_pfnQERPlug_GetCommandList = &UFOAI::getCommandList;
150         m_plugin.m_pfnQERPlug_GetCommandTitleList = &UFOAI::getCommandTitleList;
151         m_plugin.m_pfnQERPlug_Dispatch = &UFOAI::dispatch;
152     }
153
154     _QERPluginTable *getTable()
155     {
156         return &m_plugin;
157     }
158 };
159
160 typedef SingletonModule<UFOAIModule, UFOAIPluginDependencies> SingletonUFOAIModule;
161
162 SingletonUFOAIModule g_UFOAIModule;
163
164
165 class UFOAIToolbarDependencies : public ModuleRef<_QERPluginTable> {
166 public:
167     UFOAIToolbarDependencies() : ModuleRef<_QERPluginTable>("UFO:AI")
168     {
169     }
170 };
171
172 class UFOAIToolbarModule : public TypeSystemRef {
173     _QERPlugToolbarTable m_table;
174 public:
175     typedef _QERPlugToolbarTable Type;
176
177     STRING_CONSTANT(Name, "UFO:AI");
178
179     UFOAIToolbarModule()
180     {
181         if (!strcmp(GlobalRadiant().getGameDescriptionKeyValue("name"), "UFO:Alien Invasion")) {
182             m_table.m_pfnToolbarButtonCount = ToolbarButtonCount;
183             m_table.m_pfnGetToolbarButton = GetToolbarButton;
184         } else {
185             m_table.m_pfnToolbarButtonCount = ToolbarNoButtons;
186             m_table.m_pfnGetToolbarButton = GetToolbarNoButton;
187         }
188     }
189
190     _QERPlugToolbarTable *getTable()
191     {
192         return &m_table;
193     }
194 };
195
196 typedef SingletonModule<UFOAIToolbarModule, UFOAIToolbarDependencies> SingletonUFOAIToolbarModule;
197
198 SingletonUFOAIToolbarModule g_UFOAIToolbarModule;
199
200
201 extern "C" void RADIANT_DLLEXPORT Radiant_RegisterModules(ModuleServer &server)
202 {
203     initialiseModule(server);
204
205     g_UFOAIModule.selfRegister();
206     g_UFOAIToolbarModule.selfRegister();
207 }