diff --git a/lua/random_player.lua b/lua/random_player.lua deleted file mode 100755 index 134290e..0000000 --- a/lua/random_player.lua +++ /dev/null @@ -1,50 +0,0 @@ -#! /usr/bin/lua - --- use socket to communicate with the server directly -ttrts = require "ttrts" - --- usage text -local USAGE = [[ -NAME - random_player.lua - -USAGE - random_player.lua --host=HOSTNAME - -SUMMARY - Random ttrts player using lua Connects directly to ttrts server - -OPTIONS - HOSTNAME - host to connect to -]] - --- [[ Get our options and set up state ]] -local opts = ttrts.getopt(arg, "host") - --- if no host or host not set -if not opts.host or opts.host == true then - print(USAGE) return -end - --- [[ Connect to the host ]] -print( "Connecting to " .. opts.host ) -local player, name = ttrts.ConnectToHost(opts.host) - -print( "Player: " .. player ) -print( "Name: " .. name ) - ---[[ Main Loop ]] -while true do - - -- Grab the current gamestate - local gamestate = ttrts.GetStateFromHost() - - print("TURN " .. gamestate.turn ) - - -- get the orders - local orders = ttrts.GetRandomOrders( player, gamestate ) - - -- send the orders - ttrts.SendOrdersToHost( orders ) - -end \ No newline at end of file diff --git a/perl/randomPlayer.pl b/perl/randomPlayer.pl index a8362aa..b24beb8 100755 --- a/perl/randomPlayer.pl +++ b/perl/randomPlayer.pl @@ -3,10 +3,13 @@ use strict; use warnings; use Term::ANSIColor; -our $VERBOSE = $ENV{"VERBOSE"}; +# From http://perlmaven.com/how-to-create-a-perl-module-for-code-reuse +# expect ttrts perl module in cwd +use File::Basename qw(dirname); +use Cwd qw(abs_path); +use lib dirname(abs_path($0)); # Use our ttrts perl library -# located within the main https://github.com/mdiluz/ttrts repository use ttrts; our $usage_text=< =~ /~~~~/ ) ) + { + $num++; + $num > 20 and die "gamestate file did not reach ~~~~ line within 10 lines"; + } + + my @units; + while( my $unitLine = <$TURNHANDLE> ) + { + chomp $unitLine; + if( !($unitLine eq "END") ) + { + push(@units,$unitLine); + } + } + + close $TURNHANDLE; + + return @units; +} + +# Check version numbers against ttrts.pm version +sub checkVersion +{ + my $version_major = shift; + my $version_minor = shift; + if( ($version_major != $ttrts_perlai_versioncompat_major) + or ($version_minor != $ttrts_perlai_versioncompat_minor) ) + { + printf "ttrts.pm version does not match with this ttrts version\n"; + die "ttrts.pm = v$ttrts_perlai_versioncompat_minor.$ttrts_perlai_versioncompat_major ttrts = v$version_major.$version_minor"; + } +} + +# Get information from the header for this turn +sub GetHeaderForTurn +{ + my $turnFile = shift; + + # Open the turn file + open (my $TURNHANDLE, '<', $turnFile) or die "Could not open '$turnFile' $!"; + + # Pull in the header information + my $headerLine = <$TURNHANDLE>; + chomp $headerLine; + my $nameLine = <$TURNHANDLE>; + chomp $nameLine; + my $sizeLine = <$TURNHANDLE>; + chomp $sizeLine; + my $turnLine = <$TURNHANDLE>; + chomp $turnLine; + + my ($version_major,$version_minor) = ( $headerLine =~ /==== ttrts v(\d+)\.(\d+)\.\d+ ====/ ); + checkVersion $version_major,$version_minor; + + my ($gameName) = ( $nameLine =~ /NAME:(.+)/ ); + my ($gameX,$gameY) = ( $sizeLine =~ /SIZE:\[(\d+),(\d+)\]/ ); + + close $TURNHANDLE; + + return ($gameName,$gameX,$gameY); +} + +# Get units from a specific player +sub getUnitsOnPlayer +{ + my $thePlayer = shift; + my @allUnits = @_; + my @myUnits; + + for my $unit (@allUnits) + { + my ($unitplayer) = $unit =~ /pl:(\d+)/; + if ( $unitplayer == $thePlayer ) + { + push(@myUnits,$unit); + } + } + + return @myUnits; +} + +sub GetTurnFile +{ + my $turn = shift; + my $turnFile = "Turn_TURN.txt"; + $turnFile =~ s/TURN/$turn/; + return $turnFile; +} + +sub GetCommandFile +{ + my $turn = shift; + my $player = shift; + my $cmdFileName = "Player_PLAYER_Turn_TURN.txt"; + $cmdFileName =~ s/TURN/$turn/; + $cmdFileName =~ s/PLAYER/$player/; + return $cmdFileName; +} + +# Output the commands file +sub OutputCommandsFile +{ + my $turn = shift; + my $player = shift; + my $commands = shift; + + # Get output file + our $cmdFileName = GetCommandFile($turn,$player); + + if (! -e $cmdFileName) + { + open(my $cmdFile, '>', $cmdFileName) or die "Couldn't open '$cmdFileName' $!"; + print $cmdFile $commands; + print $cmdFile "END"; + close $cmdFile; + + printf "Outputted $cmdFileName\n"; + printf "$commands"; + } + else + { + open(my $cmdFile, '<', $cmdFileName) or die "Couldn't open '$cmdFileName' $!"; + my $old_commands = do { <$cmdFile> }; + + printf "Replaying $cmdFileName\n"; + printf "$old_commands"; + } +} + +# Print a game map +sub PrintGameMap +{ + my $gameX = shift; + my $gameY = shift; + my @units = @_; + + my @map; + + # Fill with blanks + for my $x (0 .. $gameX-1) + { + for my $y (0 .. $gameY-1) + { + $map[$x][$y] = "-"; + } + } + + # Fill with units + for my $unit (@units) + { + my ($id,$pl,$vs,$dr,$psx,$psy) = getUnit($unit); + + $pl += 31; + $vs = "\e[".$pl."m".$vs."\e[0m"; + + $map[$psx][$psy] = $vs; + } + + # Print whole map bottom left is 0,0 + for my $y ( reverse 0 .. $gameY-1 ) + { + for my $x (0 .. $gameX-1) + { + printf($map[$x][$y]); + } + printf("\n"); + } +} + +# Wait for a file to exist +sub WaitForFile +{ + my $file = $_[0]; + while( ! -e $file ) + { + select(undef, undef, undef, 0.01); + } +} + +return 1; \ No newline at end of file