ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cf.schmorp.de/maps/Info/update_apart.pl
Revision: 1.1
Committed: Sat Feb 4 23:55:29 2006 UTC (18 years, 10 months ago) by root
Content type: text/plain
Branch point for: UPSTREAM, MAIN
Log Message:
Initial revision

File Contents

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