Mercurial > eagle-eye
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"); +}