view planner.pl @ 279:a9847bf80058

refined coding style
author "Rex Tsai <chihchun@kalug.linux.org.tw>"
date Tue, 02 Dec 2008 17:13:36 +0800
parents 8355ec8514f9
children c864134ebe3e
line wrap: on
line source

#!/usr/bin/perl
use Ikariam;
use Data::Dumper;
use Decision::ParseTree q{ParseTree};
use YAML qw/LoadFile Dump DumpFile/;

Ikariam::Cities->has_a(island => 'Ikariam::Island');

my $army = {
    "Slinger" => 301,
    "Swordsman" => 302,
    "Phalanx" => 303,
    "Ram" => 307,
    "Archer" => 313,
    "Catapult" => 306,
    "Gunsman" => 304,
    "Mortar" => 305,
    "SteamGiant" => 308,
    "Gyrocopter" => 312,
    "Bombardier" => 309,
    "Doctor" => 311,
    "Cook" => 310,
};

my $fleet = {
    "CargoShip" => 201,
    "Ram-Ship" => 210,
    "BallistaShip" => 213,
    "Flamethrower" => 211,
    "CatapultShip" => 214,
    "MortarShip" => 215,
    "PaddleWheel Ram" => 216,
    "DivingBoat" => 212,
};

# return minutes.
sub travelTime {
    my ($x1, $y1, $x2, $y2, $speed) = @_;
    $speed = 20 unless(defined($speed));
    return int( (sqrt((abs($x1 - $x2) * abs($x1 - $x2)) + (abs($y1 - $y2) * abs($y1 - $y2)))+1) * (400/$speed));
}

package main;
if($#ARGV < 2) {
    die("Usage: %s targetCity navyCity armyCity wingman1.. wingman2..\n");
}
my $targetCityId = shift(@ARGV);
my $navyCity = shift(@ARGV);
my $armyCity = shift(@ARGV);
my @wingman = @ARGV;

my $targetCity = Ikariam::Cities->retrieve($targetCityId);


# NAVY
my $city = LoadFile(sprintf("city-%s-dump.yaml", $navyCity));
$city->{distance} = travelTime($targetCity->island->x, $targetCity->island->y, $city->{island}->{x}, $city->{island}->{y}, 8) + 45;
$city->{type} = "navy";
push (@cities, $city);

# ARMY
my $city = LoadFile(sprintf("city-%s-dump.yaml", $armyCity));
$city->{distance} = travelTime($targetCity->island->x, $targetCity->island->y, $city->{island}->{x}, $city->{island}->{y}, 20) + 5;
$city->{type} = "army";
push (@cities, $city);

# wingman, army
foreach my $cityId (@wingman) {
    my $city = LoadFile(sprintf("city-%s-dump.yaml", $cityId));
    $city->{distance} = travelTime($targetCity->island->x, $targetCity->island->y, $city->{island}->{x}, $city->{island}->{y}, 20);
    push (@cities, $city);
}

@cities = sort { $a->{distance} <=> $b->{distance}; } (@cities);


# print the code.
print <<EOF;
#!/usr/bin/perl
use strict;
use Ikariam;
use Data::Dumper;
package main;
my \$ikariam = new Ikariam(\$::server, \$::user, \$::pass);
EOF

printf ("# %s %s [%s:%s]\n", $targetCity->owner, $targetCity->cityname, $targetCity->island->x, $targetCity->island->y);
printf ("# http://%s/index.php?view=island&id=%d&selectCity=%d\n", $::server, $targetCity->island->id, $targetCity->id);

for(my $i = ($#cities + 1) ; $i-- ; $i < 0 ) {

    if($i ne $#cities) {
        # TODO, 計算港口速度
        # 減掉 cities[$i+1]->buliding->port 的速度
        printf("sleep(%d*60);\n",
                ($cities[$i+1]->{distance} - $cities[$i]->{distance}));
    }
    printf("\n# %s %s %dm\n", $cities[$i]->{name}, $cities[$i]->{type}, $cities[$i]->{distance});

    printf('$ikariam->login;' . "\n");
    if($cities[$i]->{type} eq "navy") {
        printf('$ikariam->changeCity(%d);' . "\n", $cities[$i]->{id});
        printf('$ikariam->blockadeCity(%d, {' . "\n", $targetCity->id);
        printf('blockadeDuration => 8*60*60,' . "\n");
        while (my ($k, $v) = each(%{$cities[$i]->{fleet}})) {
            if($v > 0) {
                printf("cargo_fleet_%s => %s, # %s \n", $fleet->{$k}, $v, $k);
            }
        }
        printf('});' . "\n", $cities[$i]->{id});
    } else {
        printf('$ikariam->changeCity(%d);' . "\n", $cities[$i]->{id});
        printf('$ikariam->plunderCity(%d, {' . "\n", $targetCity->id);
        while (my ($k, $v) = each(%{$cities[$i]->{army}})) {
            if($v > 0) {
                printf("cargo_army_%s => %s, # %s \n", $army->{$k}, $v, $k);
            }
        }
        printf('});' . "\n", $cities[$i]->{id});
    }
    printf('$ikariam->logout;' . "\n");
}