Mercurial > eagle-eye
diff warfare.pl @ 101:592d3b3b7898
implemented the WAR robot
author | "Rex Tsai <chihchun@kalug.linux.org.tw>" |
---|---|
date | Wed, 29 Oct 2008 12:05:36 +0800 |
parents | |
children | b369fe3c1992 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/warfare.pl Wed Oct 29 12:05:36 2008 +0800 @@ -0,0 +1,136 @@ +#!/usr/bin/perl +use strict; +use Ikariam; +use Data::Dumper; +use Decision::ParseTree q{ParseTree}; +use YAML qw/LoadFile Dump DumpFile/; + +package Ikariam::Warfare::Rules; +use strict; +use Data::Dumper; + +Ikariam::User->has_many(cities => 'Ikariam::Cities'); +Ikariam::User->has_a(ally => 'Ikariam::Ally'); +Ikariam::Cities->has_a(user => 'Ikariam::User'); +Ikariam::Cities->has_a(island => 'Ikariam::Island'); +Ikariam::Cities->set_sql(sheeps => qq { + SELECT cities.cityId + FROM user, cities + WHERE user.id == cities.user + AND user.army_score_main == 0 + AND cities.island IN (SELECT island.id FROM island WHERE island.x <= ? AND island.x >= ? AND island.y <= ? AND island.y >= ? ) + ORDER BY cities.citylevel * (cities.citylevel - 1) * user.trader_score_secondary / 10000 DESC LIMIT 10 + } +); +Ikariam::Report->set_sql(attack => qq { + SELECT report.id + FROM report + WHERE report.city = ? + AND report.date >= ? + } +); + +sub new { + my ( $class, $i ) = @_; + my $self = { + ikariam => $i, + }; + return bless $self, $class; +} + +sub is_attacked { + my ($self, $city) = @_; + return ($self->{'ikariam'}->{'military'}->{attacks} > 0 ) ? 1 : 0; +} + +sub is_actionPoint_enough { + my ($self, $city) = @_; + return ($city->{actionPoints} > ($city->{maxActionPoints}/2) ) ? 1 : 0; +} + +sub is_army_available { + my ($self, $city) = @_; + return ($city->{army}->{Swordsman} > 2 ) ? 1 : 0; +} + + +sub locateVictim { + my ($self, $city, $x, $y) = @_; + my @cities = Ikariam::Cities->search_sheeps(($x + 6), ($x - 6), ($y + 6), ($y - 6)); + + foreach my $city (@cities) { + my $sheep = $city->user; + my $island = $city->island; + + # Ignore 假期模式 + next if($city->status eq 'v'); + unless ($city->status eq 'i') { + unless ($sheep->allyId == '0') { + my $ally = $sheep->ally; + # Ignore 聯盟人數大於10 + next if(defined($ally) && $ally->members > 10); + } + } + + # check if we over-attacked + my $c = Ikariam::Report->search_attack($city->cityId, time - 24*60*60 - 7*60*60)->count(); + # check the current plunders + foreach ($self->{ikariam}->{'military'}->{'homeland'}) { + $c++ if($_{to} eq $city->cityId); + } + next if($c >= 4); + + # { + # if(1) { + my $capture = $city->citylevel * ($city->citylevel - 1) * $sheep->trader_score_secondary / 10000; + my $line = sprintf("%d %s [%d,%d] %s %s/%s", + $capture, $city->status, + $island->x, $island->y, + $city->cityname, + $sheep->name, $sheep->ally); + printf("%s\n", $line); + # } + return $city->cityId; + } + return undef; +} + +sub engagement { + my ($self, $cityId, $x, $y) = @_; + my $victim = $self->locateVictim($cityId, $x, $y); + if(defined($victim)) { + $self->{ikariam}->changeCity($cityId); + $self->{ikariam}->plunderCity($victim); + } +} + +1; + +package main; + +if($#ARGV != 1) { die("Usage: $0 x y\n"); } +my ($x, $y) = @ARGV; + +our $i = new Ikariam($::server, $::user, $::pass); +our $rules = Ikariam::Warfare::Rules->new($i); + +$i->login; +my $cities = $i->check; +$i->checkMilitaryAdvisorCombatReports(); +print Dump($i->{'military'}); + +foreach my $cityId (keys(%$cities)) { + # build and upgrade for cities + my $tree = LoadFile('warfare.yaml'); + $cities->{$cityId}->{parse_path} = []; + $cities->{$cityId}->{parse_answer} = undef; + if(ParseTree($tree, $rules, $cities->{$cityId}) eq 'engagement') { + $rules->engagement($cityId, $x, $y); + sleep(30); + $i->checkMilitaryAdvisorMilitaryMovements(); + } + print Dump($cities->{$cityId}->{parse_path}); +} +DumpFile("warfare-dump.yaml", $cities); + +$i->logout;