#!usr/bin/perl use Tk; use strict; no strict "refs"; require "core.pl"; #Style Globals my @FramePad=qw/-pady 4 -padx 4/; our @FrameStyle = qw/-background black -foreground #FF5511/; our @HeadingStyle = qw/-background black -foreground aquamarine/; our @DataStyle = qw/-background black -foreground green/; our @EntryStyle = qw/-background #FFFFAF -foreground black/; our @ActiveMenu = qw/-activebackground aquamarine -activeforeground black/; #F0A245 #Game Globals our @City=("None", "1-6 with Walls", "7-12", "13+"); our @Terrain=("Plains/Grassland/Any Other", "Jungle/Forest/Marsh", "Hill","Mountain","Volcano"); our $mw=new MainWindow(-title => 'Civilization III : Battle Calculator', @FrameStyle); my $ad = $mw->Frame(-padx => 5, -pady => 4,@FrameStyle);$ad->pack(-side=>'top'); my $ad2 = $mw->Frame(-padx => 5, -pady => 4,@FrameStyle);$ad2->pack(-side=>'top'); my $attacker = $ad->Labelframe(-borderwidth => 1, -padx => 5, -pady => 4, -text => 'Attacker', @FrameStyle); my $defender = $ad->Labelframe(-borderwidth => 1, -padx => 5, -pady => 4, -text => 'Defender', @FrameStyle); my $terrain = $ad2->Labelframe(-borderwidth => 1, -padx => 5, -pady => 4, -text => 'Defender\'s Terrain', @FrameStyle); my $title = $ad->Frame(-borderwidth => 1, -padx => 5, -pady => 4, @FrameStyle); my $display = $mw->Frame(@FrameStyle); our ($hash); $title->pack(-side => 'top', -fill=>'both', -expand=>1, @FramePad); $attacker->pack(-side => 'left',-fill=>'both', -expand=>1, @FramePad); $defender->pack(-side => 'right', -fill=>'both', -expand=>1, @FramePad); $terrain->pack(-side => 'bottom', -fill=> 'both', @FramePad); $display->pack(-side => 'bottom', -fill=> 'x', @FramePad); &set_title($title) &set_display($display); &set_attacker($attacker); &set_attacker($defender, "Defense"); #Set Defender; &set_terrain($terrain); MainLoop; sub set_title { $_[0]->Label(-text => "Civlization III : Battle Calculator", -font=>"Impact",@HeadingStyle)->pack(-side=>'top', -pady=>5); $_[0]->Label(-text=> "Made by The Raven", @HeadingStyle)->pack(-side => 'top', -pady=>5); } sub set_display { my ($display, $text,$output) = @_; $output = $display->Frame(@FrameStyle); $output->pack(-fill=>'y' , -padx => 10, -pady => 5, -expand => 1, -fill => 'x'); $text = $output->Label(-text => '**Random Seed**'); $text->pack(-fill => 'y', -padx => 5, -pady => 10, -side => 'left', -expand => 1); $text->configure(-relief => 'raised' , @FrameStyle); $display->Button( -text => 'Calculate', #-activeforeground => "\#0ccadf", #-activebackground => "\#8d5cc0", -activebackground => "\#F0F0AA", -activeforeground => "\#011010", -background => "\#011010", -foreground => "\#F0F0AA", -width => '15', -borderwidth => '5', -command => sub{$text->configure(-text => &calculate($hash));} )->pack(-anchor => 'se', -padx => 4, -pady=> 4); return $text; } sub set_terrain { my ($entry2,$entry,$entry3) = @_; my @LBLS=("City Size", "Terrain", "Other Options"); my @Other=("River", "Fortified"); my @DataPad=qw/-pady 3 -padx 0 -expand 1 -fill x/; my (@Blank, $TEMP); my (@EntryStyle)=@HeadingStyle; my @Opt=("City","Terrain"); &ref(my $lbl, 'left', $entry2); &ref(my $entry, 'right', $entry2); for (0..2) { $TEMP = (($_==0) ? \@City : \@Terrain); #The Globals. $lbl->Label(-text => $LBLS[$_], @DataStyle)->pack(-side => 'top', @DataPad); last if $_==2; $entry->Optionmenu( -options => $TEMP, -variable => \$hash->{$Opt[$_]}, @EntryStyle, @ActiveMenu )->pack(@DataPad); #-side => 'top', -pady=>3, -fill=>'x'); } &ref(my $entry3, 'bottom', $entry); for (0..1) { $entry3->Checkbutton(-text => $Other[$_], -variable => \$hash->{$Other[$_]}, @EntryStyle, @ActiveMenu )->pack(-side=>'left', @DataPad); } return 1; } sub set_attacker { my ($att,$string) = @_; my $string = $string || "Attack"; my @DataPad=qw/-pady 0 -padx 0 -expand 1/; my @LBLS = ("Hitpoints",$string); my $r; &ref(my $lbl, 'left', $att); &ref(my $entry, 'right', $att); foreach (@LBLS) { $lbl->Label(-text => $_, @DataStyle)->pack(@DataPad); $r->{$_}=$entry->Entry(-width => 3, -text => 3, @EntryStyle); $r->{$_}->pack(@DataPad); } ($hash->{HP}->{$string}, $hash->{$string}) = ($r->{$LBLS[0]}, $r->{$LBLS[1]}); return ($lbl, $entry); } sub calculate { my ($def, $off, $Defense, $Offense); $hash->{Bonus}=&calculate_bonus(); my ($A,$D,$DH,$AH) = ($hash->{Attack}->get, $hash->{Defense}->get, $hash->{HP}->{Defense}->get,$hash->{HP}->{Attack}->get); print "$A vs $D along with HP $AH vs $DH and terrain $hash->{Bonus}\n"; my @ARGS = ($D,$A, $hash->{Bonus}, $DH, $AH); ($def, $Defense)= &core(@ARGS, 1); ($off, $Offense)= &core(@ARGS); my $string="$A/$AH Attacks $D/$DH on $hash->{Bonus}"; &display($off,$def, $Offense, $Defense, $string); return rand; } sub calculate_bonus { my ($hashref, $y); for (my $x=0; $x{$City[$x]}=.5*$x; } for (my $x=1; $x{$Terrain[$x]}= (.25)*(2**($x-1)); } $hashref->{$Terrain[0]}=.1; return ($hashref->{$hash->{Terrain}} + $hashref->{$hash->{City}} + .5*$hash->{Fortified} + .25 * $hash->{River} + 1); } sub display { my @HeadingPad = qw/-pady 0 -padx 0/; my @DataPad = qw/-pady 2 -padx 5/; my @Top = qw/-side top -fill both -expand 1/; my @A = ("Attacker", "Defender"); my $display = $mw->Toplevel( -title => "Calculations", @FrameStyle); $display->configure(-height => 1000 , -width => 200); &ref(my $d1, 'left', $display); &ref(my $d2, 'right', $display); $d1->Label(-text => "Outcome", -relief =>'raised', @HeadingStyle, -borderwidth=>5)->pack(@Top, @HeadingPad); $d2->Label(-text => "% Probability", -relief =>'raised', @HeadingStyle, -borderwidth =>5)->pack(@Top, @HeadingPad); for (2..3) { $d1->Label(-text => "$A[$_-2] Wins", -relief =>'ridge', @HeadingStyle, -borderwidth => 4)->pack(@Top, @DataPad); $d2->Label(-text => $_[$_-2], -relief =>'groove', @DataStyle, -highlightcolor => 'blue', -borderwidth => 2)->pack(@Top, @DataPad); for (my $x=0; $xLabel(-text => ($x)." HP Lost", @DataStyle)->pack(@Top, @DataPad); $d2->Label(-text => $_[$_]->[$x], @DataStyle)->pack(@Top, @DataPad); } } } sub ref { $_[0]=$_[2]->Frame(@FrameStyle); $_[0]->pack(-side => $_[1], -fill => 'both', -expand=>1, @FramePad); return $_[0]; }