Implementation of Lucifers Pastime
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

352 lines
5.0KB

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. my $PAD_AXIS = " ";
  5. my $PAD_EVEN = " ";
  6. my $PAD_ODD = " ";
  7. my $HEX_1 = '-/--\-';
  8. my $HEX_2 = '| __ |';
  9. my $HEX_3 = '| |';
  10. my $SUB_CHR = "_";
  11. my $PREF_1 = substr($HEX_1, -2, 2);
  12. my $PREF_2 = ' ';
  13. my $PREF_3 = ' ';
  14. my $TRAIL_1 = substr($HEX_1, 0, 1);
  15. my $TRAIL_2 = substr($HEX_1, -1, 1);
  16. my $TRAIL_3 = substr($HEX_1, 0, 2);
  17. # Pieces
  18. my $MG_A = 0; # Apprentice
  19. my $MG_I = 1; # Iron Maiden
  20. my $MG_N = 2; # Nekomata
  21. my $MG_IT = 3; # Ittan-Momen
  22. my $MG_H = 4; # Harpy
  23. my $MG_S = 5; # Slime
  24. my $MG_RC = 6; # Redcap
  25. my $MG_RO = 7; # Red Oni
  26. my $MG_HS = 8; # Holstaur
  27. my $MG_B = 9; # Blue Oni
  28. my $MG_P = 10; # Preistess
  29. my $MG_IM = 11; # Imp
  30. my $MG_F = 12; # False Angel
  31. my $MG_QS = 13; # Queen slime
  32. my $MG_AU = 14; # Automaton
  33. my $MG_SY = 15; # Sylph
  34. my $MG_Q = 16; # Queen
  35. my %AXIS = (
  36. "A" => 1,
  37. "B" => 2,
  38. "C" => 3,
  39. "D" => 4,
  40. "E" => 5,
  41. "F" => 6,
  42. "G" => 7,
  43. "H" => 8,
  44. "I" => 9,
  45. "J" => 10,
  46. "K" => 11
  47. );
  48. my %AXIS_RV = map {
  49. $AXIS{$_} => $_
  50. } keys(%AXIS);
  51. #
  52. # /--\ +1
  53. # | __ |
  54. # | |+1
  55. # \--/
  56. # -1 -1
  57. #
  58. # [Row mvoe, Diag move]
  59. my %MOVE = (
  60. $MG_A => [
  61. [-1, 1],
  62. [ 0, 1]
  63. ],
  64. $MG_Q => [
  65. [ 0, 1],
  66. [ 1, 0],
  67. [-1, 0],
  68. [ 0,-1],
  69. ],
  70. $MG_I => [
  71. [0,0]
  72. ],
  73. $MG_IT => [
  74. [ 0,-1],
  75. [ 1,-1]
  76. ],
  77. $MG_N => [
  78. [-1, 2],
  79. [ 1,-2]
  80. ],
  81. $MG_H => [
  82. [-3, 2],
  83. [-1,-2],
  84. [ 1, 2],
  85. [ 3,-2]
  86. ],
  87. $MG_RC => [
  88. [-1, 0],
  89. [-2, 0],
  90. [ 0, 1],
  91. [ 0, 2]
  92. ],
  93. $MG_S => [
  94. [-1, 1],
  95. [-2, 2],
  96. [ 0, 1],
  97. [ 0, 2],
  98. [ 0,-1],
  99. [ 0,-2],
  100. [ 1,-1],
  101. [ 2,-2],
  102. ],
  103. $MG_HS => [
  104. [-3, 1],
  105. [-2,-1],
  106. [ 2, 1],
  107. [ 3,-1]
  108. ],
  109. $MG_RO => [
  110. [-1, 1],
  111. [ 0, 1],
  112. [ 1, 1],
  113. [ 1,-2]
  114. ],
  115. $MG_B => [
  116. [-1, 1],
  117. [ 0, 1],
  118. [ 0,-2],
  119. [ 1,-2]
  120. ],
  121. $MG_P => [
  122. [-4, 2],
  123. [-2, 1],
  124. [-2,-2],
  125. [-1,-1],
  126. [ 1, 1],
  127. [ 2,-1],
  128. [ 2, 2],
  129. [ 4,-2]
  130. ],
  131. $MG_IM => [
  132. [-2, 1],
  133. [-1,-1],
  134. [-1, 2],
  135. [ 1, 1],
  136. [ 1,-1],
  137. [ 1,-2],
  138. [ 2,-1]
  139. ],
  140. $MG_F => [
  141. [-1, 0],
  142. [-1, 1],
  143. [ 0, 1],
  144. [ 0,-1],
  145. [ 1, 0],
  146. [ 1,-1]
  147. ],
  148. $MG_QS => [
  149. [-3, 3],
  150. [-2, 2],
  151. [-2, 0],
  152. [-1, 0],
  153. [-1, 1],
  154. [ 0, 1],
  155. [ 0, 2],
  156. [ 0, 3],
  157. [ 0,-1],
  158. [ 0,-2],
  159. [ 0,-3],
  160. [ 1, 0],
  161. [ 1,-1],
  162. [ 2, 0],
  163. [ 2,-2],
  164. [ 3,-3],
  165. ],
  166. $MG_AU => [
  167. [-1, 0],
  168. [-1, 1],
  169. [ 0, 1],
  170. [ 0,-1],
  171. [ 1, 0],
  172. [ 1,-1]
  173. ],
  174. $MG_SY => [
  175. [-4, 4],
  176. [-3, 3],
  177. [-3, 2],
  178. [-1,-2],
  179. [ 0,-2],
  180. [ 0,-3],
  181. [ 0, 3],
  182. [ 0, 4],
  183. [ 1, 2],
  184. [ 3,-2],
  185. [ 3,-3],
  186. [ 4,-4]
  187. ]
  188. );
  189. # Special cells
  190. my $EMPTY_CELL = 900;
  191. my %board;
  192. sub disp_1(){
  193. return $HEX_1
  194. }
  195. sub disp_2(){
  196. return $HEX_2
  197. }
  198. sub disp_3(){
  199. return $HEX_3;
  200. }
  201. sub disp_y_axis($$$$){
  202. my ($s0, $s1, $s2, $r0) = @_;
  203. my $n0;
  204. $n0 = length($r0);
  205. $s0 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_1;
  206. $s1 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_2;
  207. $s1 =~ s/^ {$n0}/$r0/;
  208. $s2 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_3;
  209. return ($s0, $s1, $s2);
  210. }
  211. sub add_cell($$$$$){
  212. my ($s0, $s1, $s2, $r0, $c0) = @_;
  213. $s0 .= disp_1();
  214. $s1 .= disp_2();
  215. $s2 .= disp_3();
  216. return ($s0, $s1, $s2);
  217. }
  218. sub disp_0($){
  219. my $r0;
  220. my ($s0, $s1, $s2);
  221. $r0 = shift;
  222. ($s0, $s1, $s2) = disp_y_axis($s0, $s1, $s2, $r0);
  223. for my $i (1..11){
  224. ($s0, $s1, $s2) = add_cell($s0, $s1, $s2, $r0, $i);
  225. }
  226. return $s0."\n".$s1."\n".$s2."\n";
  227. }
  228. sub disp_row($){
  229. my $row;
  230. my $r0;
  231. $r0 = shift;
  232. $row = disp_0($r0);
  233. if($r0 % 2 == 1){
  234. # Trim the start of the first line
  235. $row =~ s/$TRAIL_1/ /;
  236. # Trim the end of the first line
  237. $row =~ s/\n/$TRAIL_3\n/
  238. }else{
  239. # Trim the end of the last line
  240. $row =~ s/$TRAIL_2\n/ \n/m;
  241. }
  242. return $row;
  243. }
  244. sub disp_x_axis(){
  245. my $s0;
  246. $s0 = $PAD_AXIS;
  247. $s0 .= join(
  248. $PAD_AXIS, map{
  249. $AXIS_RV{$_}
  250. }(1..11));
  251. $s0 .= "\n";
  252. return $s0
  253. }
  254. sub disp_trailing_row(){
  255. my $s0;
  256. my $s1;
  257. $s0 = $PAD_EVEN.$PREF_1;
  258. # Clear some chars from
  259. # our hex patterns
  260. $s1 = $HEX_1;
  261. substr($s1, 2,2) = " ";
  262. # Append hex pattern to
  263. # trailing row
  264. for my $i (1..11){
  265. $s0 .= $s1;
  266. }
  267. # Clear one last pair of
  268. # chrs
  269. substr($s0, -2,2) = " ";
  270. $s0 .= "\n";
  271. return $s0;
  272. }
  273. sub disp_board(){
  274. my $b;
  275. for my $i (map {11-$_+1} (1..11)) {
  276. $b .= disp_row($i);
  277. }
  278. $b .= disp_trailing_row();
  279. $b .= disp_x_axis();
  280. $b =~ s/$TRAIL_1$TRAIL_3\n/\n/m;
  281. for my $i (1..11-1){
  282. substr($b, 2+6*$i, 2) = " ";
  283. }
  284. printf("%s", $b);
  285. }
  286. sub cell_index($){
  287. my ($chr1, $chr2) = (split(//, $_[0]));
  288. return ($AXIS{$chr1}, $chr2);
  289. }
  290. %board = map {
  291. $_ => $EMPTY_CELL
  292. } map {
  293. my $l0;
  294. $l0 = $_;
  295. (map {$l0.$_} ("1".."11"))
  296. } map{
  297. $AXIS_RV{$_}
  298. }(1...11);
  299. disp_board();
  300. # disp_0("C1");
  301. # printf(">>%s, %s\n", cell_index("C1"));