ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra/bin/cfmap-plushify
Revision: 1.4
Committed: Fri Aug 11 09:25:29 2006 UTC (17 years, 9 months ago) by elmex
Branch: MAIN
Changes since 1.3: +2 -2 lines
Log Message:
Fixed perl plugin patcher to remove the banksay events

File Contents

# User Rev Content
1 elmex 1.1 #!/opt/bin/perl
2    
3     # this script checks, fixes and simplifies @match expressions in a map
4    
5     use Crossfire::Map;
6    
7     sub fix($) {
8     my ($msg) = @_;
9    
10     local $_ = $msg;
11    
12     # fx pretty common error of having "* First line of response"
13     my $response = s/^\* (.*)/*/ ? "\n$1" : "";
14    
15     warn "$path ($_) unexpected characters in match \n" if !/^[a-zA-Z\[\]\|\*\!\' 0-9\-\?]+$/;
16    
17     s/\[(.)(.)\]/(lc $1) eq (lc $2) ? lc $1 : "[$1$2]"/ge;
18    
19     my %alt;
20    
21     for my $kw (split /\|/) {
22     $kw =~ s/^\s+//;
23     $kw =~ s/\s+$//;
24    
25     $alt{lc $kw} = $kw;
26     }
27    
28     $_ = join "|", sort keys %alt;
29    
30     $_ .= $response;
31    
32     warn "$path <$msg><$_>\n" if $_ ne $msg;
33     warn "$path ($_) unexpected characters in match\n" if /[\[\]]/;
34    
35     $_
36     }
37    
38 elmex 1.3 sub patch_perl {
39 elmex 1.1 my ($arch) = @_;
40     my $patched = 0;
41    
42     my @appendinv;
43    
44     for (@{$arch->{inventory} || []}) {
45     if ($_->{slaying} eq '/python/IPO/send.py') {
46     $_->{title} = 'perl';
47     $_->{slaying} = 'ipo';
48     $patched++
49     } elsif ($_->{slaying} eq '/python/IPO/receive.py') {
50     $_->{title} = 'perl';
51     $_->{slaying} = 'ipo';
52     $patched++
53     } elsif ($_->{slaying} eq '/python/IPO/board.py') {
54     push @appendinv, { _name => 'event_apply', title => 'perl', slaying => 'board' };
55     $arch->{msg} = '@match *'."\n".'@eval board::command $who, $msg, $npc'."\n";
56     $patched++
57     } elsif ($_->{slaying} eq '/python/IPO/say.py') {
58     $arch->{msg} = '@match *'."\n".'@eval ipo::command $who, $msg, $npc'."\n";
59     $patched++
60 elmex 1.3 } elsif ($_->{slaying} eq '/python/IPO/banksay.py') {
61     $arch->{msg} = '@match *'."\n".'@eval bank::command $who, $msg, $npc'."\n";
62     $patched++
63 elmex 1.1 }
64     }
65 elmex 1.2
66 elmex 1.1 if ($arch->{inventory}) {
67 elmex 1.2 my @oinv =
68 elmex 1.1 grep {
69 elmex 1.4 not grep { $_->{slaying} ne $_ }
70     ('/python/IPO/board.py', '/python/IPO/say.py', '/python/IPO/banksay.py')
71 elmex 1.1 } @{$arch->{inventory}};
72 elmex 1.2 $patched++ if @oinv < @{$arch->{inventory}};
73     @{$arch->{inventory}} = @oinv;
74 elmex 1.1 }
75    
76     if (@appendinv) {
77     $arch->{inventory} = [@{$arch->{inventory} || []}, @appendinv];
78 elmex 1.2 $patched++
79 elmex 1.1 }
80    
81     $patched
82     }
83    
84     for $path (@ARGV) {
85     eval {
86     open my $fh, "<:raw:perlio:utf8", $path
87     or die "$path: $!\n";
88    
89     <$fh> =~ /^arch map$/
90     or die "$path: not a crossfire map file\n";
91    
92     my $map = new_from_file Crossfire::Map $path
93     or die "$path: file load error\n";
94    
95     my $dirty;
96    
97     for my $a (map @$_, grep $_, map @$_, grep $_, @{ $map->{map} }) {
98 elmex 1.3 if ($a->{inventory} and patch_perl ($a)) {
99 elmex 1.1 $dirty = 1;
100     next;
101     }
102    
103     next unless $a->{msg} =~ /^\@match /;
104    
105     my $old = $a->{msg};
106    
107     $a->{msg} =~ s/^(\@match\s+)(.*)$/$1 . fix $2/gme;
108    
109     $dirty ||= $old ne $a->{msg};
110     }
111    
112     $map->write_file ($path)
113     if $dirty;
114    
115     1
116     } or $@ =~ /not a crossfire map/ or warn $@;
117     }
118