#!/usr/bin/env perl
no warnings 'experimental::smartmatch';
my $r = {};
my $ih = do 'hero_id.ini';
my $iz = do 'target_types.ini';
my $il = do 'ability_levels.ini';
my $ii = do 'icons.ini';
my $ia = do 'ability_data.ini';
my $cfg = do 'convert.cfg';
my $ability_regex = $cfg->{ability_regex};
#
# Take these lines from war3map.j
#
open FILE, "<ability_init_calls.txt" or die;
while (<FILE>) {
s/[\(|\)]//g;
s/$ability_regex//;
my $t = $1;
my $f = [ grep { s/\'//g; 1 } split ',' ];
if ( $t eq $cfg->{basic_ability_function_name} ) {
$r->{$ih->{$f->[0]}}->{$il->{$f->[6]}}->{$f->[5]} = {
cd => $f->[8],
st => $f->[9],
tp => $iz->{$f->[10]},
};
} else {
$r->{$ih->{$f->[0]}}->{$il->{$f->[4]}}->{$f->[3]} = {
cd => $f->[6],
st => $f->[7],
tp => $iz->{$f->[8]},
};
}
}
close FILE;
my $dic = {};
my $cur = '';
open FILE, "<CampaignAbilityFunc.txt" or die;
while (<FILE>) {
s/\|c..(......)/[COLOR=#$1\]/g;
s/\|r/[\/COLOR\]/g;
/^\[(.*)\]$/;
if ( $1 ) {
$cur = $1;
next;
}
/^(.+?)=(.+)$/;
my $nam = $1;
my $val = $2;
/()/;
$val =~ s/\|n/\n/g;
$val =~ s/^"|"$//g;
my $n;
for ( split '","', $val ) {
$dic->{$cur}->{$nam}->{++$n} = $_;
}
}
close FILE;
my $slk = {};
$cur = '';
open FILE, "<AbilityData.slk" or die;
while (<FILE>) {
/^C;X.*?;Y.*?;K"(.*)"$/;
if ( $1 ) {
$cur = $1;
next;
}
/^C;X(.*?);K(.*)$/;
my $id = $1;
my $val = $2;
if ( $cur eq 'alias' ) {
$val =~ s/"//g;
$val =~ s/(\d*)$//;
$slk->{$id} = {
v => $val,
n => $1,
};
} else {
$dic->{$cur}->{$slk->{$id}->{v}}->{$slk->{$id}->{n} || 1} = $2;
}
/()()/;
}
close FILE;
open FILE, ">guide.txt" or die;
print FILE '[point]Top[/point][CENTER][SIZE=3]Jump to: '.(join ' | ', map { sprintf "[goto=%s]%s[/goto]", $_, $_ } ( @{$cfg->{linked}}, 'Bottom' ) )."[/SIZE]\n";
print FILE $cfg->{header};
for my $hero ( qw/ Squire Berserker Crusader Ranger Hunter Druid Thief Assassin Bard Cleric Bishop Monk Magician Necromancer Sorcerer Mystic Hexblade Psion / ) {
if ( $hero ~~ @{$cfg->{linked}} ) {
print FILE $cfg->{line};
printf FILE "[point]%s[/point]", $hero;
}
printf FILE "[INVTABLE][tr][td][IMG]%s[/IMG][/td][td][keepspace][SIZE=5] %s[/SIZE][/keepspace][/td][/tr][/INVTABLE]",($cfg->{url}.$ii->{h}->{$hero}),$hero;
print FILE '
[TABLE]
[tr]
[TD][CENTER]BTN[/CENTER][/TD]
[TD][CENTER]Icon[/CENTER][/TD]
[TD][CENTER]Name[/CENTER][/TD]
[TD][CENTER]Description[/CENTER][/TD]
[TD][CENTER]Mana[/CENTER][/TD]
[TD][CENTER]Casttime[/CENTER][/TD]
[TD][CENTER]Cooldown[/CENTER][/TD]
[TD][CENTER]Talents[/CENTER][/TD]
[/tr]
';
for my $order ( sort {$a <=> $b} keys %{$r->{$hero}} ) {
for my $ability ( sort keys %{$r->{$hero}->{$order}} ) {
print FILE "[tr]\n";
printf FILE "[td][CENTER][COLOR=Yellow][SIZE=5][B]%s[/B][/SIZE]\n\n[COLOR=White][SIZE=2][B]%s[/B][/SIZE][/COLOR][/COLOR][/CENTER][/td]\n",$dic->{$ability}->{Hotkey}->{1},$order;
printf FILE "[td][IMG]%s[/IMG][/td]\n",($cfg->{url}.$ii->{a}->{$dic->{$ability}->{Name}->{1}});
printf FILE "[td]%s[/td]\n",$dic->{$ability}->{Name}->{1};
my $desc = $dic->{$ability}->{Ubertip}->{1};
$desc =~ s/\[COLOR=#ccccff\]Cooldown:.*//s;
printf FILE "[td]%s[/td]\n",$desc;
printf FILE "[td][CENTER][COLOR=RoyalBlue]%s[/COLOR][/CENTER][/td]\n",($dic->{$ability}->{Cost}->{1} || '-');
printf FILE "[td][CENTER]%s[/CENTER][/td]\n",
$ia->{$dic->{$ability}->{Name}->{1}}->{cast}
? $ia->{$dic->{$ability}->{Name}->{1}}->{cast} < 0
? '[COLOR=Gray]-[/COLOR]'
: $ia->{$dic->{$ability}->{Name}->{1}}->{cast} > 9000
? '[COLOR=Magenta]Channel[/COLOR]'
: $ia->{$dic->{$ability}->{Name}->{1}}->{cast} > 3
? sprintf '[COLOR=Orange]%s sec[/COLOR]', $ia->{$dic->{$ability}->{Name}->{1}}->{cast}
: sprintf '[COLOR=Yellow]%s sec[/COLOR]', $ia->{$dic->{$ability}->{Name}->{1}}->{cast}
: '[COLOR=White]Instant[/COLOR]'
;
printf FILE "[td][CENTER]%s%s[/CENTER][/td]\n",
$ia->{$dic->{$ability}->{Name}->{1}}->{cool} ? sprintf "[COLOR=Gray]%s[/COLOR]\n\n", $ia->{$dic->{$ability}->{Name}->{1}}->{cool} : '',
$dic->{$ability}->{Cool}->{1}
? $dic->{$ability}->{Cool}->{1} < 1
? sprintf '[COLOR=White]%s sec[/COLOR]', $dic->{$ability}->{Cool}->{1}
: $dic->{$ability}->{Cool}->{1} < 30
? sprintf '[COLOR=Yellow]%s sec[/COLOR]', $dic->{$ability}->{Cool}->{1}
: sprintf '[COLOR=Orange]%s sec[/COLOR]', $dic->{$ability}->{Cool}->{1}
: '[COLOR=Gray]Passive[/COLOR]'
;
printf FILE "[td]";
for my $thero ( sort keys %{$ia->{$dic->{$ability}->{Name}->{1}}->{tals}} ) {
printf FILE '[INVTABLE][tr][td][IMG]%s[/IMG][/td][td]',($cfg->{url}.$ii->{h}->{$thero});
printf FILE "[B]%s:[/B] %s\n", $_->[0], $_->[1] for @{$ia->{$dic->{$ability}->{Name}->{1}}->{tals}->{$thero}};
print FILE "[/td][/tr][/INVTABLE]";
}
printf FILE "[/td]\n";
print FILE "[/tr]\n";
}
}
print FILE '
[/TABLE]
';
}
print FILE $cfg->{line};
print FILE '[point]Bottom[/point][CENTER][SIZE=3]Jump to: '.(join ' | ', map { sprintf "[goto=%s]%s[/goto]", $_, $_ } ( 'Top', @{$cfg->{linked}} ) )."[/SIZE]\n";
print FILE $cfg->{attachments};
close FILE;