diff planner.pl @ 271:0ed1b3e72e65

new campaign planner
author "Rex Tsai <chihchun@kalug.linux.org.tw>"
date Mon, 01 Dec 2008 01:02:36 +0800
parents
children 8355ec8514f9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/planner.pl	Mon Dec 01 01:02:36 2008 +0800
@@ -0,0 +1,119 @@
+#!/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->cityname, $targetCity->owner, $targetCity->island->x, $targetCity->island->y);
+
+for(my $i = ($#cities + 1) ; $i-- ; $i < 0 ) {
+
+    if($i ne $#cities){
+        printf("sleep(%d*60);\n",
+                ($cities[$i+1]->{distance} - $cities[$i]->{distance}));
+    }
+    printf("\n\n\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");
+}