ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/maps/Info/update_exits.pl
Revision: 1.1.1.1 (vendor branch)
Committed: Sat Feb 4 23:55:19 2006 UTC (18 years, 3 months ago) by root
Content type: text/plain
Branch: UPSTREAM, MAIN
CVS Tags: post_fixaltar, last_stable, post_fixaltar2, rel-2_82, rel-2_81, rel-2_80, pre_coinconvert, UPSTREAM_2006_03_15, rel-3_0, rel-2_6, rel-2_7, rel-2_4, rel-2_5, rel-2_2, rel-2_0, rel-2_1, rel-2_72, rel-2_73, rel-2_71, rel-2_76, rel-2_77, rel-2_74, rel-2_75, rel-2_54, rel-2_55, rel-2_56, rel-2_79, UPSTREAM_2006_02_01, rel-2_53, pre_material_cfarch_normalize_run, rel-2_32, pre_fixconverter, post_coinconvert, pre_fixaltar2, pre_map_rename, UPSTREAM_2006_02_22, rel-2_90, rel-2_92, rel-2_93, rel-2_78, post_fixconverter, pre_fixaltar, rel-2_61, rel-2_43, rel-2_42, rel-2_41, HEAD
Changes since 1.1: +0 -0 lines
Log Message:
Initial Import

File Contents

# Content
1 #!/usr/bin/perl
2 #
3 # This script goes through and updates the exits for maps.
4 # First pass, so a lot of the options need to be set in this
5 # script. It will search all directories in and below your current
6 # working directory, so run from the directory you want to update.
7
8 # Written by Mark Wedel (mwedel@sonic.net)
9 # This borrows some amount of code from the map_info script written
10 # by Tero Haatanen <Tero.Haatanen@lut.fi>
11
12 # Name of the old map that we update exits on
13 # Note that this can be a regexp.
14
15 # OLD_MAP_STARTX/Y and OLD_MAP_ENDX/Y determine the range for the
16 # updates. For example, scorn/city was broken up on two of the
17 # map tiles, so this gets used to correspond that properly.
18 # you can use very large END values just to make sure the entire
19 # map is covered
20
21 # The list of values here are locations to update to and
22 # from. I set it up this way with explicity value settings
23 # instead of initializing each as an array - I think this format
24 # makes it easier to see how everything relates.
25 #
26 # OLD_MAP_NAME: This is the path it tries to match in the slaying field.
27 # It can be a regexp. When updating within a specific directory of
28 # a town, including the relative entries is possible.
29 # OLD_MAP_STARTX/Y and OLD_MAP_ENDX/Y is the range of spaces
30 # that we process. If the location is not in this range, it is unchanged.
31 # Note that you can have multiple entries with the same OLD_MAP_NAME
32 # value as long as they have different START and END coordinates.
33 # NEW_MAP_NAME is the name that will be put into the slaying field.
34 # NEW_MAP_OFFX/Y is the modification to the target location in
35 # the exit.
36
37 $OLD_MAP_NAME[0]=".*/santo_dominion/town";
38 # Many maps are just called 'town', so this is only useful if you know
39 # 'town' is really referring to santo dominion.
40 #$OLD_MAP_NAME[0]="(/santo_dominion/town|town|.+/town)";
41 $OLD_MAP_STARTX[0]=3;
42 $OLD_MAP_STARTY[0]=12;
43 $OLD_MAP_ENDX[0]=27;
44 $OLD_MAP_ENDY[0]=100;
45 $NEW_MAP_NAME[0]="/world/world_102_108";
46 $NEW_MAP_OFFX[0]=0;
47 $NEW_MAP_OFFY[0]=-9;
48
49 # Start of scorn updates
50 $OLD_MAP_NAME[1]=".*/city/city";
51 $OLD_MAP_STARTX[1]=10;
52 $OLD_MAP_STARTY[1]=0;
53 $OLD_MAP_ENDX[1]=100;
54 $OLD_MAP_ENDY[1]=100;
55 $NEW_MAP_NAME[1]="/world/world_105_115";
56 $NEW_MAP_OFFX[1]=-10;
57 $NEW_MAP_OFFY[1]=18;
58
59 # Start of scorn updates
60 $OLD_MAP_NAME[2]=".*/city/city";
61 $OLD_MAP_STARTX[2]=0;
62 $OLD_MAP_STARTY[2]=0;
63 $OLD_MAP_ENDX[2]=9;
64 $OLD_MAP_ENDY[2]=100;
65 $NEW_MAP_NAME[2]="/world/world_104_115";
66 $NEW_MAP_OFFX[2]=40;
67 $NEW_MAP_OFFY[2]=18;
68
69 # brest updates
70 $OLD_MAP_NAME[3]='(.+/brest|brest)';
71 $OLD_MAP_STARTX[3]=0;
72 $OLD_MAP_STARTY[3]=0;
73 $OLD_MAP_ENDX[3]=100;
74 $OLD_MAP_ENDY[3]=100;
75 $NEW_MAP_NAME[3]="/world/world_107_123";
76 $NEW_MAP_OFFX[3]=17;
77 $NEW_MAP_OFFY[3]=16;
78
79 # Start of navar city - bunch of these as navar city is actually
80 # spread across 4 world maps. Only navar city uses the 'city1'
81 # name, so the regex is safe.
82 $OLD_MAP_NAME[4]='(.+/city1|city1)';
83 $OLD_MAP_STARTX[4]=15;
84 $OLD_MAP_STARTY[4]=13;
85 $OLD_MAP_ENDX[4]=100;
86 $OLD_MAP_ENDY[4]=100;
87 $NEW_MAP_NAME[4]="/world/world_122_117";
88 $NEW_MAP_OFFX[4]=-15;
89 $NEW_MAP_OFFY[4]=-13;
90
91 $OLD_MAP_NAME[5]='(.+/city1|city1)';
92 $OLD_MAP_STARTX[5]=15;
93 $OLD_MAP_STARTY[5]=0;
94 $OLD_MAP_ENDX[5]=100;
95 $OLD_MAP_ENDY[5]=12;
96 $NEW_MAP_NAME[5]="/world/world_122_116";
97 $NEW_MAP_OFFX[5]=-15;
98 $NEW_MAP_OFFY[5]=37;
99
100 $OLD_MAP_NAME[6]='(.+/city1|city1)';
101 $OLD_MAP_STARTX[6]=0;
102 $OLD_MAP_STARTY[6]=0;
103 $OLD_MAP_ENDX[6]=14;
104 $OLD_MAP_ENDY[6]=12;
105 $NEW_MAP_NAME[6]="/world/world_121_116";
106 $NEW_MAP_OFFX[6]=35;
107 $NEW_MAP_OFFY[6]=37;
108
109 $OLD_MAP_NAME[7]='(.+/city1|city1)';
110 $OLD_MAP_STARTX[7]=0;
111 $OLD_MAP_STARTY[7]=13;
112 $OLD_MAP_ENDX[7]=14;
113 $OLD_MAP_ENDY[7]=100;
114 $NEW_MAP_NAME[7]="/world/world_121_117";
115 $NEW_MAP_OFFX[7]=35;
116 $NEW_MAP_OFFY[7]=-13;
117
118 $OLD_MAP_NAME[8]='(.+/kundi_area|kundi_area)';
119 $OLD_MAP_STARTX[8]=0;
120 $OLD_MAP_STARTY[8]=0;
121 $OLD_MAP_ENDX[8]=100;
122 $OLD_MAP_ENDY[8]=100;
123 $NEW_MAP_NAME[8]="/world/world_109_126";
124 $NEW_MAP_OFFX[8]=13;
125 $NEW_MAP_OFFY[8]=17;
126
127 $OLD_MAP_NAME[9]='(.+/stoneville|stoneville)';
128 $OLD_MAP_STARTX[9]=0;
129 $OLD_MAP_STARTY[9]=0;
130 $OLD_MAP_ENDX[9]=13;
131 $OLD_MAP_ENDY[9]=100;
132 $NEW_MAP_NAME[9]="/world/world_102_127";
133 $NEW_MAP_OFFX[9]=36;
134 $NEW_MAP_OFFY[9]=1;
135
136 $OLD_MAP_NAME[10]='(.+/stoneville|stoneville)';
137 $OLD_MAP_STARTX[10]=14;
138 $OLD_MAP_STARTY[10]=0;
139 $OLD_MAP_ENDX[10]=100;
140 $OLD_MAP_ENDY[10]=100;
141 $NEW_MAP_NAME[10]="/world/world_103_127";
142 $NEW_MAP_OFFX[10]=-14;
143 $NEW_MAP_OFFY[10]=1;
144
145 $OLD_MAP_NAME[11]='(.+/darcap|darcap)';
146 $OLD_MAP_STARTX[11]=0;
147 $OLD_MAP_STARTY[11]=0;
148 $OLD_MAP_ENDX[11]=100;
149 $OLD_MAP_ENDY[11]=100;
150 $NEW_MAP_NAME[11]="/world/world_116_102";
151 $NEW_MAP_OFFX[11]=18;
152 $NEW_MAP_OFFY[11]=26;
153
154 $OLD_MAP_NAME[12]='(.+/piratetown|piratetown)';
155 $OLD_MAP_STARTX[12]=0;
156 $OLD_MAP_STARTY[12]=0;
157 $OLD_MAP_ENDX[12]=100;
158 $OLD_MAP_ENDY[12]=100;
159 $NEW_MAP_NAME[12]="/world/world_128_109";
160 $NEW_MAP_OFFX[12]=12;
161 $NEW_MAP_OFFY[12]=0;
162
163 $OLD_MAP_NAME[13]='(.+/portjoseph|portjoseph)';
164 $OLD_MAP_STARTX[13]=0;
165 $OLD_MAP_STARTY[13]=0;
166 $OLD_MAP_ENDX[13]=100;
167 $OLD_MAP_ENDY[13]=100;
168 $NEW_MAP_NAME[13]="/world/world_101_114";
169 $NEW_MAP_OFFX[13]=7;
170 $NEW_MAP_OFFY[13]=22;
171
172 $OLD_MAP_NAME[14]='(.+/tortola|tortola)';
173 $OLD_MAP_STARTX[14]=0;
174 $OLD_MAP_STARTY[14]=0;
175 $OLD_MAP_ENDX[14]=100;
176 $OLD_MAP_ENDY[14]=100;
177 $NEW_MAP_NAME[14]="/world/world_100_116";
178 $NEW_MAP_OFFX[14]=16;
179 $NEW_MAP_OFFY[14]=6;
180
181 $VERBOSE=0;
182 $error=0;
183 for ($i=0; $i<=$#OLD_MAP_NAME; $i++) {
184 if ((($OLD_MAP_STARTX[$i] + $NEW_MAP_OFFX[$i]) < 0) ||
185 (($OLD_MAP_STARTY[$i] + $NEW_MAP_OFFY[$i]) < 0 )) {
186 print "oldmap $OLD_MAP_NAME[$i] ($OLD_MAP_STARTX[$i], $OLD_MAP_STARTX[$i] will result in negative destination coordinates.\n";
187 $error=1;
188 }
189 }
190 # Basically, we want to check all the values and then exit.
191 exit(1) if ($error);
192
193 &maplist(".");
194
195 while ($file = shift (@maps)) {
196 &updatemap;
197 }
198
199
200 exit;
201
202 # return table containing all objects in the map
203 sub updatemap {
204 local ($m, $made_change=0);
205 $last = "";
206 $parent = "";
207
208 # Note that $/ is the input record seperator. By changing
209 # this to \nend\n, it means that when we read from the file,
210 # we basically read an entire arch at the same time. Note that
211 # given this, $ in regexps matches this value below, and not
212 # a newline. \n should generally be used instead of $ in
213 # regexps if you really want the end of line.
214 # Similary, ^ matches start of record, which means the arch line.
215
216 $/ = "\nend\n";
217 if (! open (IN, $file)) {
218 print "Can't open map file $file\n";
219 return;
220 }
221 $_ = <IN>;
222 if (! /^arch map\n/) {
223 print "Error: file $file isn't mapfile.\n";
224 return;
225 }
226 if (! open(OUT, ">$file.new")) {
227 print "Can't open output file $file.new\n";
228 return;
229 }
230 print OUT $_;
231 if ($VERBOSE) {
232 print "Testing $file, ";
233 print /^name (.+)$/ ? $1 : "No mapname";
234 print ", size [", /^x (\d+)$/ ? $1 : 16;
235 print ",", /^y (\d+)/ ? $1 : 16, "]";
236
237 if (! /^msg$/) {
238 print ", No message\n";
239 } elsif (/(\w+@\S+)/) {
240 print ", $1\n";
241 } else {
242 print ", Unknown\n";
243 }
244 $printmap=0;
245 }
246 else {
247 $name= /^name (.+)$/ ? $1 : "No mapname";
248 $x= /^x (\d+)$/ ? $1 : 16;
249 $y= /^y (\d+)/ ? $1 : 16;
250 $mapname="Map $file, $name, size [$x, $y]\n" ;
251 $printmap=1;
252 }
253
254 while (<IN>) {
255 if (($m = (@_ = /^arch \S+\s*$/g)) > 1) {
256 $parent = /^arch (\S+)\s*$/;
257 print OUT $_;
258
259 # Object has an inventory. Just read through until we get
260 # an end
261 while (<IN>) {
262 last if (/((.|\n)*end\n)(arch (.|\n)*\nend\n)/);
263 print OUT $_;
264 }
265 $parent="";
266 # Objects with inventory should not contain exits, so
267 # do not need to try and process them. Likewise, the objects
268 # in the inventory should not contain exits.
269 } else {
270 for ($i=0; $i<=$#OLD_MAP_NAME; $i++) {
271 if (m#\nslaying $OLD_MAP_NAME[$i]\n#) {
272 $destx = /\nhp (\d+)\n/ ? $1 : 0;
273 $desty = /\nsp (\d+)\n/ ? $1 : 0;
274 if ($destx >= $OLD_MAP_STARTX[$i] && $destx <= $OLD_MAP_ENDX[$i] &&
275 $desty >= $OLD_MAP_STARTY[$i] && $desty <= $OLD_MAP_ENDY[$i]) {
276 # Ok. This exit matches our criteria. Substitute in
277 # the new values
278 s/slaying $OLD_MAP_NAME[$i]\n/slaying $NEW_MAP_NAME[$i]\n/;
279 $destx += $NEW_MAP_OFFX[$i];
280 $desty += $NEW_MAP_OFFY[$i];
281 s/\nhp \d+\n/\nhp $destx\n/;
282 s/\nsp \d+\n/\nsp $desty\n/;
283 $made_change=1;
284 }
285 }
286 }
287 print OUT $_;
288 } # else not an object with inventory
289 } # while <IN> LOOP
290 close (IN);
291 close(OUT);
292 if ($made_change) {
293 print "$file has changed\n";
294 unlink($file);
295 rename("$file.new", $file);
296 }
297 else {
298 unlink("$file.new");
299 }
300 }
301
302 # @maps contains all filenames
303 sub maplist {
304 local ($dir, $file, @dirs) = shift;
305
306 opendir (DIR , $dir) || die "Can't open directory : $dir\n";
307 while ($file = readdir (DIR)) {
308 next if ($file eq "." || $file eq ".." || $file eq "CVS");
309
310 $file = "$dir/$file";
311 next if (-l $file); # don't process symbolic links
312 push (@dirs, $file) if (-d $file);
313 push (@maps, $file) if (-f $file);
314 }
315 closedir (DIR);
316
317 # recursive handle sub-dirs too
318 while ($_ = shift @dirs) {
319 &maplist ($_);
320 }
321 }
322