ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/bin/gce
Revision: 1.16
Committed: Wed Mar 22 03:32:20 2006 UTC (18 years, 2 months ago) by root
Branch: MAIN
Changes since 1.15: +3 -0 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #!/opt/bin/perl
2
3 our $VERSION = '0.9';
4
5 BEGIN {
6 if (%PAR::LibCache) {
7 @INC = grep ref, @INC; # weed out all paths except pars loader refs
8
9 while (my ($filename, $zip) = each %PAR::LibCache) {
10 for ($zip->memberNames) {
11 next unless /^\/root\/(.*)/;
12 $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1")
13 unless -e "$ENV{PAR_TEMP}/$1";
14 }
15 }
16
17 $ENV{CROSSFIRE_LIBDIR} ||= $ENV{PAR_TEMP};
18
19 if ($^O eq "MSWin32") {
20 $ENV{GTK_RC_FILES} = "$ENV{PAR_TEMP}/share/themes/MS-Windows/gtk-2.0/gtkrc";
21 }
22 }
23 }
24
25 use Gtk2 -init;
26
27 use Data::Dumper;
28 use File::Spec;
29
30 use Crossfire;
31
32 use GCE::MainWindow;
33
34 our $CFG;
35 our $MAINWIN;
36
37 our $DOCUMENTATION = join ("\n", do { local $/; <DATA> });
38
39 sub read_cfg {
40 my ($file) = @_;
41
42 open CFG, $file
43 or return;
44
45 $CFG = eval join '', <CFG>;
46
47 close CFG;
48 }
49
50 sub write_cfg {
51 my ($file) = @_;
52
53 open CFG, ">$file"
54 or return;
55
56 {
57 local $Data::Dumper::Purity = 1;
58 print CFG Data::Dumper->Dump ([$CFG], [qw/CFG/]);
59 }
60
61 close CFG;
62 }
63
64 # following 2 functions are taken from CV :)
65 sub find_rcfile($) {
66 my $path;
67
68 for (@INC) {
69
70 $path = "$_/GCE/$_[0]";
71 return $path if -r $path;
72 }
73
74 die "FATAL: can't find required file $_[0]\n";
75 }
76
77 sub require_image($) {
78 new_from_file Gtk2::Gdk::Pixbuf find_rcfile "images/$_[0]";
79 }
80
81 sub get_pos_and_size {
82 my ($window) = @_;
83
84 my ($x, $y) = $window->get_position;
85 my ($w, $h) = $window->get_size;
86
87 return [$x, $y, $w, $h];
88 }
89
90 sub set_pos_and_size {
91 my ($window, $p_and_s, $default_w, $default_h, $default_x, $default_y) = @_;
92
93 $window->set_default_size ($p_and_s->[2] || $default_w, $p_and_s->[3] || $default_h);
94
95 # FIXME: This sucks, moving it after showing it can't be a good thing.
96 $window->show_all;
97 $window->move ($p_and_s->[0] || $default_x, $p_and_s->[1] || $default_y);
98 }
99
100 read_cfg "$Crossfire::VARDIR/gceconfig";
101
102 $CFG->{LIBDIR} ||= $ENV{CROSSFIRE_LIBDIR};
103 $CFG->{MAPDIR} ||= File::Spec->catfile ($CFG->{LIBDIR}, 'maps');
104
105 # must be done after changing the libdir path:
106 Crossfire::set_libdir ($CFG->{LIBDIR});
107 Crossfire::load_archetypes;
108 Crossfire::load_tilecache;
109
110 my $w = GCE::MainWindow->new;
111
112 $w->load_layout;
113
114 $w->show_all;
115
116 Gtk2->main;
117
118 __DATA__
119
120 =head1 NAME
121
122 gce - gtk (perl) crossfire editor
123
124 =head1 SYNOPSIS
125
126 gce [<map-filename>...]
127
128 =head1 FEATURES
129
130 gce is a map editor for crossfire.
131
132 Its main features are:
133
134 - higher map editing comfort
135 - intelligent placement tool
136 - intelligent connection tool
137 - intelligent erase tool
138 - faster and smaller than the java editor
139 - map normalizing (removal of old deprecated attributes)
140 - exit following
141 - world map navigation
142 - easier installation (on windows)
143
144 =head1 DESCRIPTION
145
146 =head2 THE TOOLBOX WINDOW
147
148 The toolbox window is the main window of gce. It provides the display of
149 the currently selected object and the tools. The buttons select of the
150 editing tool:
151
152 =over 4
153
154 =item * Pick
155
156 This tool is the simplest of all. It lets the user select the topmost
157 object of a map cell in the map window and updates the stack view for the
158 current space.
159
160 If the pick attr flag is set only the attribute editor and the stack
161 view are updated. This is useful when you want to put an object in the
162 attribute editor and want to place an object from the map, you picked
163 before, in an inventory of a different object (you just picked). This is a
164 very special thing. It will propably go away.
165
166 Shortcut-key in map editor: i
167
168 =item * Place
169
170 This is the intelligent placement tool. It has many modes:
171
172 =over 4
173
174 =item auto
175
176 This mode implements DWIM (do-what-I-mean) by trying to do the the right
177 thing(tm) with the selected object:
178
179 If you place a floor arch, it will try to replace the existing floor or
180 set the floor below all items. If you place a monster or other arch, it
181 will place it on top. If you place a wall, it will put the wall above the
182 floor and propably replace other walls.
183
184 =item top
185
186 Places the arch on the top of the stack of the map cell.
187
188 =item above floor
189
190 Places the arch just right above the floor (or the bottom of the stack).
191
192 =item below floor
193
194 Places the arch just right below the floor (or the bottom of the stack).
195
196 =item bottom
197
198 Places the arch on the bottom of the stack.
199
200 =item place clean (checkbox)
201
202 Setting this is a flag lets the placement tool place an unmodified object
203 on the map only. This is useful when you have modified the currently
204 selected object in the attribute editor (e.g. a special monster with
205 modified hp) but your want to place an unmodified monster.
206
207 =back
208
209 Shortcut-key in map editor: p
210
211 =item * Erase
212
213 This is the tool that lets you erase an arch.
214
215 It has following modes:
216
217 =over 4
218
219 =item top
220
221 Erases the topmost object on the stack.
222
223 =item walls
224
225 Erases all walls in the stack (and only walls).
226
227 =item above floor
228
229 Erases the first object above the floor.
230
231 =item floor
232
233 Erases all floor from the stack (and only the floor).
234
235 =item below floor
236
237 Erases the first object below the floor.
238
239 =item bottom
240
241 Erases the first object on the bottom of the stack.
242
243 =item pick match
244
245 This erases all objects from the stack that match the currently selected
246 object.
247
248 =item protect walls (checkbox)
249
250 This protects walls from being erased (except when erasing walls).
251
252 =item protect monsters (checkbox)
253
254 This protects monsters from being erased.
255
256 =back
257
258 Shortcut-key in map editor: e
259
260 =item * Select
261
262 This is the selection tool. It can be used to select rectangular areas and
263 operate on that area in various ways:
264
265 =over 4
266
267 =item copy
268
269 This just copies all objects from the selected area into an internal
270 buffer for later paste operations.
271
272 Shortcut-key in map editor: c
273
274 =item paste
275
276 This function pastes the internal buffer into the map, beginning in the
277 top left corner of the selected area. The size of the selection has no
278 relevance to the result: IT always places the whole internal buffer onto
279 the map.
280
281 Shortcut-key in map editor: p
282
283 =item invoke
284
285 This function is a very powerful one. It can apply another tool (such as
286 the place tool) on all spaces of the selected area.
287
288 It can, for example, be used to fill a map with floor tiles or erase
289 everything.
290
291 Shortcut-key in map editor: n
292
293 =back
294
295 Shortcut-key in map editor: s
296
297 =item * Eval
298
299 This is a very special tool which isn't finished yet. It lets you specify
300 a perl snippet that can manipulate the stack.
301
302 Shortcut-key in map editor: l
303
304 =item * Connect Exit
305
306 This tool connects two exits or teleporters.
307
308 You can either connect two exits to each other, or just point an exit to
309 a certain location on a map.
310
311 Shortcut-key in map editor: x
312
313 =item * Follow Exit
314
315 With this tool you can follow exits and teleporters by opening the target
316 map in a new window (or presents an existing window).
317
318 Shortcut-key in map editor: f
319
320 =back
321
322 =head2 THE STACK VIEW
323
324 This window displays the stack of a map space/coordinate.
325
326 You can swap two objects on the stack and delete a object from the stack
327 by dragging one object over another.
328
329 By clicking on an item on the stack you can make it the currently selected
330 object.
331
332 =head2 THE MAP EDITOR
333
334 This window just displays the map and lets you use the tools. The shortcuts are
335 documented above in the tool descriptions.
336
337 You can pan the map using the middle mouse button and use the tool with
338 the left mouse button.
339
340 There are two modifiers: Holding down the Meta/Alt-key temporarily
341 switches to the pick tool. Holding down the Ctrl-key temporarily switched
342 to the erase tool. Both will use their current settings. To change them,
343 you need to select the tools using the toolbox first.
344
345 =head2 THE ATTRIBUTE EDITOR
346
347 The attribute editor display the archetype name followed by the object
348 name and the type of the object in parentheses.
349
350 Since there are often many attributes for a given object, they are sorted
351 into different categories/tabs.
352
353 The lore and msg tabs let you edit the text attributes of the object.
354
355 The inventory tab lets you add stuff to the inventory by dragging them
356 from the selected object in the toolbox to the top most button with the
357 image in the inventory (the inventory editor is subject to change and
358 improvement).
359
360 Both field labels and value widgets have tool tips enabled. Tool tips on
361 the labels explain the attribute in more detail. The tool tips on the
362 value widgets show the default value from the archetype.
363
364
365 =head2 THE PICK WINDOW
366
367 Pick windows are used to quickly pick archetypes from specific categories.
368
369 Left click creates an object from the archetype and makes it the currently
370 selected object for the tools and the attribute editor.
371
372 You can change the attributes of the currently selected object in the
373 attribute editor.
374
375 You can open multiple pick windows.
376
377 =head1 AUTHOR
378
379 All of the editor GUI:
380
381 Robin Redeker <elmex@ta-sa.org>
382 http://www.ta-sa.org/
383
384 The Crossfire map handling module and map widget:
385
386 Marc Lehmann <schmorp@schmorp.de>
387 http://home.schmorp.de/
388
389 =cut