lpst/lpst.pl

507 lines
7.8 KiB
Perl
Raw Normal View History

2021-04-03 17:33:59 -04:00
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
2021-04-03 17:33:59 -04:00
2021-04-03 20:39:52 -04:00
my $PAD_AXIS = " ";
2021-04-03 17:33:59 -04:00
my $PAD_EVEN = " ";
my $PAD_ODD = " ";
my $HEX_1 = '-/--\-';
my $HEX_2 = '| __ |';
my $HEX_3 = '| |';
my $XBOX_CHR = chr(0x2573);
my $SHADE_CHR = chr(0x2591);
my $ALT_US = chr(0x2017);
my $ALT_PIPE = chr(0x2016);
my $HL_1 = "|_____";
my $HL_2 = $ALT_PIPE.$ALT_US.$ALT_US.$ALT_US.$ALT_US.$ALT_US;
2021-04-03 20:39:52 -04:00
my $SUB_CHR = "_";
my $ALT_SUB_CHR = $ALT_US;
2021-04-03 20:39:52 -04:00
my $PREF_1 = substr($HEX_1, -2, 2);
2021-04-03 17:33:59 -04:00
my $PREF_2 = ' ';
my $PREF_3 = ' ';
my $TRAIL_1 = substr($HEX_1, 0, 1);
my $TRAIL_2 = substr($HEX_1, -1, 1);
my $TRAIL_3 = substr($HEX_1, 0, 2);
2021-04-03 17:33:59 -04:00
# Pieces
2021-04-03 21:20:45 -04:00
my $MG_A = "A"; # Apprentice
my $MG_I = "I"; # Iron Maiden
my $MG_N = "N"; # Nekomata
my $MG_IT = "It"; # Ittan-Momen
my $MG_H = "H"; # Harpy
my $MG_S = "S"; # Slime
my $MG_RC = "Rc"; # Redcap
my $MG_RO = "Hs"; # Red Oni
my $MG_HS = "Ro"; # Holstaur
my $MG_B = "B"; # Blue Oni
my $MG_P = "P"; # Preistess
my $MG_IM = "Im"; # Imp
my $MG_F = "F"; # False Angel
my $MG_QS = "Qs"; # Queen slime
my $MG_AU = "Au"; # Automaton
my $MG_SY = "Sy"; # Sylph
my $MG_Q = "Q"; # Queen
2021-04-03 17:33:59 -04:00
# Players
my $P1 = "P1";
my $P2 = "P2";
my $DIV = ":";
2021-04-03 17:33:59 -04:00
my %AXIS = (
"A" => 1,
"B" => 2,
"C" => 3,
"D" => 4,
"E" => 5,
"F" => 6,
"G" => 7,
"H" => 8,
"I" => 9,
"J" => 10,
"K" => 11
);
2021-04-03 20:39:52 -04:00
my %AXIS_RV = map {
$AXIS{$_} => $_
} keys(%AXIS);
2021-04-03 17:33:59 -04:00
#
# /--\ +1
# | __ |
# | |+1
# \--/
# -1 -1
#
# ODD
# UP: 0, +1
# DOWN: -1, -1
# EVEN
# UP: +1, +1
# DOWN: +0, -1
# [Row move, Diag move]
2021-04-03 17:33:59 -04:00
my %MOVE = (
$MG_A => [
[-1, 1],
[ 0, 1]
],
$MG_Q => [
[ 0, 1],
[ 1, 0],
[-1, 0],
[ 0,-1],
],
$MG_I => [
[0,0]
],
$MG_IT => [
[ 0,-1],
[ 1,-1]
],
$MG_N => [
[-1, 2],
[ 1,-2]
],
$MG_H => [
[-3, 2],
[-1,-2],
[ 1, 2],
[ 3,-2]
],
$MG_RC => [
[-1, 0],
[-2, 0],
[ 0, 1],
[ 0, 2]
],
$MG_S => [
[-1, 1],
[-2, 2],
[ 0, 1],
[ 0, 2],
[ 0,-1],
[ 0,-2],
[ 1,-1],
[ 2,-2],
],
$MG_HS => [
[-3, 1],
[-2,-1],
[ 2, 1],
[ 3,-1]
],
$MG_RO => [
[-1, 1],
[ 0, 1],
[ 1, 1],
[ 1,-2]
],
$MG_B => [
[-1, 1],
[ 0, 1],
[ 0,-2],
[ 1,-2]
],
$MG_P => [
[-4, 2],
[-2, 1],
[-2,-2],
[-1,-1],
[ 1, 1],
[ 2,-1],
[ 2, 2],
[ 4,-2]
],
$MG_IM => [
[-2, 1],
[-1,-1],
[-1, 2],
[ 1, 1],
[ 1,-1],
[ 1,-2],
[ 2,-1]
],
$MG_F => [
[-1, 0],
[-1, 1],
[ 0, 1],
[ 0,-1],
[ 1, 0],
[ 1,-1]
],
$MG_QS => [
[-3, 3],
[-2, 2],
[-2, 0],
[-1, 0],
[-1, 1],
[ 0, 1],
[ 0, 2],
[ 0, 3],
[ 0,-1],
[ 0,-2],
[ 0,-3],
[ 1, 0],
[ 1,-1],
[ 2, 0],
[ 2,-2],
[ 3,-3],
],
$MG_AU => [
[-1, 0],
[-1, 1],
[ 0, 1],
[ 0,-1],
[ 1, 0],
[ 1,-1]
],
$MG_SY => [
[-4, 4],
[-3, 3],
[-3, 2],
[-1,-2],
[ 0,-2],
[ 0,-3],
[ 0, 3],
[ 0, 4],
[ 1, 2],
[ 3,-2],
[ 3,-3],
[ 4,-4]
]
);
# Special cells
my $EMPTY_CELL = "_";
2021-04-03 17:33:59 -04:00
my %board;
# Display pieces
#==================================================
sub f_1($$){
my $p = shift;
my $c0 = shift;
my $s0;
$p =~ s/($P1|$P2)$DIV//;
$p .= "_" if length($p) < 2;
$s0 = $HEX_2;
$s0 =~ s/$SUB_CHR{1,2}/$p/;
if($c0 % 2 == 0){
$s0 =~ s/$SUB_CHR/$ALT_SUB_CHR/g;
}
return $s0;
}
2021-04-03 17:33:59 -04:00
# Display lines
#==================================================
sub disp_1($$){
my ($r0, $c0) = (shift, shift);
return $HEX_1;
2021-04-03 17:33:59 -04:00
}
sub disp_2($$){
my ($r0, $c0) = (shift, shift);
my $p;
# Cell notation
my $not;
$not = cell_index_rev($c0, $r0);
$p = $board{$not};
return f_1($p, $c0);
# my ($r0, $c0) = (shift, shift);
# return $HEX_2;
2021-04-03 17:33:59 -04:00
}
sub disp_3($$){
my ($r0, $c0) = (shift, shift);
2021-04-03 17:33:59 -04:00
return $HEX_3;
}
sub disp_y_axis($$$$){
2021-04-03 17:33:59 -04:00
my ($s0, $s1, $s2, $r0) = @_;
my $n0;
$n0 = length($r0);
$s0 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_1;
$s1 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_2;
$s1 =~ s/^ {$n0}/$r0/;
$s2 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_3;
return ($s0, $s1, $s2);
}
# Display cell
#==================================================
2021-04-03 17:33:59 -04:00
sub add_cell($$$$$){
my ($s0, $s1, $s2, $r0, $c0) = @_;
$s0 .= disp_1($r0, $c0);
$s1 .= disp_2($r0, $c0);
$s2 .= disp_3($r0, $c0);
2021-04-03 17:33:59 -04:00
# if($c0 % 2 == 0){
# $s0 =~ s/ /$SHADE_CHR/g;
# $s1 =~ s/ /$SHADE_CHR/g;
# $s2 =~ s/ /$SHADE_CHR/g;
# }
2021-04-03 17:33:59 -04:00
return ($s0, $s1, $s2);
}
sub disp_0($){
my $r0;
my ($s0, $s1, $s2);
$r0 = shift;
# Append the y axis
($s0, $s1, $s2) = disp_y_axis($s0, $s1, $s2, $r0);
# Iterate through the cells
2021-04-03 17:33:59 -04:00
for my $i (1..11){
($s0, $s1, $s2) = add_cell($s0, $s1, $s2, $r0, $i);
}
return $s0."\n".$s1."\n".$s2."\n";
}
# Display row
#==================================================
2021-04-03 17:33:59 -04:00
sub disp_row($){
my $row;
my $r0;
$r0 = shift;
$row = disp_0($r0);
# Handle trailing characters
if($r0 % 2 == 1){
# Trim the start of the first line
$row =~ s/$TRAIL_1/ /;
# Trim the end of the first line
$row =~ s/\n/$TRAIL_3\n/
}else{
# Trim the end of the last line
$row =~ s/$TRAIL_2\n/ \n/m;
}
return $row;
2021-04-03 17:33:59 -04:00
}
2021-04-03 20:39:52 -04:00
sub disp_trailing_row(){
my $s0;
my $s1;
$s0 = $PAD_EVEN.$PREF_1;
# Clear some chars from
# our hex patterns
$s1 = $HEX_1;
substr($s1, 2,2) = " ";
# Append hex pattern to
# trailing row
for my $i (1..11){
$s0 .= $s1;
}
# Clear one last pair of
# chrs
substr($s0, -2,2) = " ";
$s0 .= "\n";
return $s0;
}
sub disp_x_axis(){
my $s0;
$s0 = $PAD_AXIS;
$s0 .= join(
$PAD_AXIS, map{
$AXIS_RV{$_}
}(1..11));
$s0 .= "\n";
$s0 .= $PAD_AXIS;
$s0 .= join(
"", map{
$_ % 2 == 1 ? $HL_1 : $HL_2
}(1..11));
$s0 .= "\n";
return $s0
}
# Display board
#==================================================
2021-04-03 17:33:59 -04:00
sub disp_board(){
my $b;
2021-04-03 17:33:59 -04:00
for my $i (map {11-$_+1} (1..11)) {
$b .= disp_row($i);
2021-04-03 17:33:59 -04:00
}
2021-04-03 20:39:52 -04:00
$b .= disp_trailing_row();
$b .= disp_x_axis();
$b =~ s/$TRAIL_1$TRAIL_3\n/\n/m;
for my $i (1..11-1){
substr($b, 2+6*$i, 2) = " ";
}
printf("%s", $b);
}
2021-04-03 17:33:59 -04:00
sub cell_index_rev($$){
return $AXIS_RV{$_[0]}.$_[1];
}
2021-04-03 17:33:59 -04:00
sub cell_index($){
my ($chr1, $chr2) = (split(//, $_[0]));
return ($AXIS{$chr1}, $chr2);
}
sub apply_shift($$){
my ($not, $my_shift) = (shift, shift);
my $r0;
my $c0;
($r0, $c0) = cell_index($not);
$r0 += $my_shift->[0];
$c0 += $my_shift->[1];
die "cell index [$r0, $c0]: out of bound exception" if $r0 > 11 or $c0 > 11 or $r0 < 1 or $c0 < 1;
return cell_index_rev($r0, $c0);
}
sub calc_move($$){
my ($not, $mov) = (shift, shift);
my $r0;
my $c0;
my $x_shift;
my $y_shift;
my $n0;
my $ni;
($r0, $c0) = cell_index($not);
# Calc y_shift
$y_shift = $mov->[1];
# Calc x_shift
$x_shift = $mov->[0];
# make adjustment
2021-04-04 01:31:12 -04:00
$ni = $y_shift != 0 ? ($y_shift / ($y_shift * -1)) : -1;
$ni *= -1;
$n0 = ($r0 + 1) % 2;
$x_shift += int(($y_shift + ($n0 * $ni)) / 2);
return apply_shift($not, [$x_shift, $y_shift]);
}
# Main starts here!
binmode(STDOUT, ":utf8");
# Creates a hash of the the form
# $board{cell_notation} = piece_enum
2021-04-03 17:33:59 -04:00
%board = map {
$_ => $EMPTY_CELL
} map {
my $l0;
$l0 = $_;
(map {$l0.$_} ("1".."11"))
} map {
2021-04-03 20:39:52 -04:00
$AXIS_RV{$_}
}(1...11);
2021-04-03 17:33:59 -04:00
my $m1 = "F4";
2021-04-04 01:31:12 -04:00
my $c1 = $MG_QS;
2021-04-04 01:31:12 -04:00
$board{$m1} = $P1.$DIV.$c1;
2021-04-04 01:31:12 -04:00
for my $mv (@{$MOVE{$c1}}){
printf("%s\n", calc_move($m1, $mv));
}
disp_board();
2021-04-03 17:33:59 -04:00