view enemy.pl @ 370:ba1643654e6d

added locking for avoid duplicated instance.
author "Rex Tsai <chihchun@kalug.linux.org.tw>"
date Tue, 14 Apr 2009 16:57:51 +0800
parents 2cfa03edc22e
children 6ca0677a361e
line wrap: on
line source

#!/usr/bin/perl
use strict;
use Ikariam;
use Data::Dumper;
use YAML qw/Dump LoadFile/;
use POSIX qw(strftime);

package main;
my @tradegoodText = qw/NULL 葡萄酒 大理石 水晶 硫磺/;
my @wonderText = qw/NULL 赫菲斯拓斯的熔爐 蓋亞的神殿 狄奧尼索斯的花園 雅典娜的神殿 赫秘士的神殿 阿瑞斯的要塞 波賽頓的神殿 克羅瑟斯的神殿/;

Ikariam::User->has_many(cities => 'Ikariam::Cities');

sub travelTime {
    my ($x1, $y1, $x2, $y2, $speed) = @_;
    $speed = 60 unless(defined($speed));
    if($x1 == $x2 && $y1 == $y2) {
        return 600/$speed;
    } else {
        return int( (sqrt((abs($x1 - $x2) * abs($x1 - $x2)) + (abs($y1 - $y2) * abs($y1 - $y2)))) * (1200/$speed));
    }
}

sub travelMatrix {
    my $userName = shift;
    my @cities = ();
    if(my $user = Ikariam::User->retrieve(name => $userName)) {

        foreach my $target ($user->cities) {
            my $island = Ikariam::Island->retrieve($target->island);
            my $city;
            $city->{id} = $target->id;
            $city->{name} = $target->cityname;
            if(defined($island)) {
                $city->{island}->{id} = $island->id;
                $city->{island}->{x} = $island->x;
                $city->{island}->{y} = $island->y;
            }
            push (@cities, $city);
        }
    }

    my $n = $#cities;

    # Print them out.
    # header
    printf("Defence\n");
    printf(" %5s ", undef);
    for my $y (0..$n) {
        printf ("%5s ", $cities[$y]->{id});
    }
    print "\n";

    # body
    for my $x (0..$n) {
        printf(" %5s ", $cities[$x]->{id});
        my $total = 0;
        for my $y (0..$n) {
            my $t = travelTime($cities[$x]->{island}->{x}, $cities[$x]->{island}->{y}, $cities[$y]->{island}->{x}, $cities[$y]->{island}->{y});
            printf("%5s ", $t);
            $total += $t;
        }
        printf(" %s", $cities[$x]->{name});
        printf("\n");
    }
    printf("\n");
}

sub myTownToVicim {
    my $islandId = shift;

    if(my $island = Ikariam::Island->retrieve($islandId)) {
        my @cities = ();
        foreach (glob("city-*-dump.yaml")) {
            my $city = LoadFile($_);
            $city->{distance} = travelTime($island->x, $island->y, $city->{island}->{x}, $city->{island}->{y}, 60);
            push (@cities, $city);
        }
        @cities = sort { $a->{distance} <=> $b->{distance}; } (@cities);

        my $n = $#cities;
        for my $x (0..$n) {
            printf("%s (%d)\t- ", $cities[$x]->{name}, $cities[$x]->{id});
            printf("Land %3d Ship %3d Catapult %3d Ram %3d\n", 
                    travelTime($cities[$x]->{island}->{x}, $cities[$x]->{island}->{y}, $island->x, $island->y, 60),
                    travelTime($cities[$x]->{island}->{x}, $cities[$x]->{island}->{y}, $island->x, $island->y, 33),
                    travelTime($cities[$x]->{island}->{x}, $cities[$x]->{island}->{y}, $island->x, $island->y, 26),
                    travelTime($cities[$x]->{island}->{x}, $cities[$x]->{island}->{y}, $island->x, $island->y, 40),
                  );
        }
    }
}

package main;

if($#ARGV != 0) {
    die("Usage: $0 nickname\n");
}

my ($u) = Ikariam::User->search('name' => $ARGV[0]);
if(defined($u)) {
    foreach my $i (qw/name score trader_score_secondary army_score_main ally/) {
        printf("%s: %s\n", $i, $u->get($i));
    }
    printf("time: %s\n",  strftime ("%Y-%m-%d %H:%M", localtime($u->get('time'))));

    travelMatrix($ARGV[0]);

    printf("\nCities\n");
    foreach my $city ($u->cities) {
        my $island = Ikariam::Island->retrieve($city->island);
        next if(!defined($island));

        printf("Name: %s [%s:%s]\n", $city->cityname,  $island->x, $island->y);
        if(defined($city->status)) {
            printf("Status: <<<%s>>>\n", $city->status);
        }
        printf("Location: [%s:%s] http://%s/index.php?view=island&id=%s&selectCity=%d\n", 
                $island->x, $island->y, $::server, $island->id, $city->cityId);
        if(-f sprintf("spy-%d-dump.yaml", $city->cityId)) {
            my $spydata = LoadFile(sprintf("spy-%d-dump.yaml", $city->cityId));
            if($spydata->{city}->{buildings}->{townHall} ne $city->citylevel) {
                printf("Hall: %s", $city->citylevel);
                printf("\n*OUTDATED* ");
            }
            printf("Hall: %s, Wall: %s, Port: %s, Safehouse: %s, Risk: %s\n", 
                    $spydata->{city}->{buildings}->{townHall}, 
                    $spydata->{city}->{buildings}->{wall}, 
                    $spydata->{city}->{buildings}->{port}, 
                    $spydata->{city}->{buildings}->{safehouse}, 
                    $spydata->{risks}[4]);
        } else {
            printf("Level: %s, Rsik %d\n", $city->citylevel, $city->risk);
        }

        printf("Tradegood: %s, Wonder: %s\n", 
                $tradegoodText[$island->tradegood], $wonderText[$island->wonder]);
        # printf("Island: %s\n", $island->name);

        myTownToVicim($island->id);
        printf("\n");
    }
    print "-"x80 . "\n";
}