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.

372 lines
5.6KB

  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 = "A"; # Apprentice
  19. my $MG_I = "I"; # Iron Maiden
  20. my $MG_N = "N"; # Nekomata
  21. my $MG_IT = "It"; # Ittan-Momen
  22. my $MG_H = "H"; # Harpy
  23. my $MG_S = "S"; # Slime
  24. my $MG_RC = "Rc"; # Redcap
  25. my $MG_RO = "Hs"; # Red Oni
  26. my $MG_HS = "Ro"; # Holstaur
  27. my $MG_B = "B"; # Blue Oni
  28. my $MG_P = "P"; # Preistess
  29. my $MG_IM = "Im"; # Imp
  30. my $MG_F = "F"; # False Angel
  31. my $MG_QS = "Qs"; # Queen slime
  32. my $MG_AU = "Au"; # Automaton
  33. my $MG_SY = "Sy"; # Sylph
  34. my $MG_Q = "Q"; # 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. # Display lines
  193. #==================================================
  194. sub disp_1($$){
  195. my ($r0, $c0) = (shift, shift);
  196. return $HEX_1;
  197. }
  198. sub disp_2($$){
  199. my ($r0, $c0) = (shift, shift);
  200. return $HEX_2;
  201. }
  202. sub disp_3($$){
  203. my ($r0, $c0) = (shift, shift);
  204. return $HEX_3;
  205. }
  206. sub disp_y_axis($$$$){
  207. my ($s0, $s1, $s2, $r0) = @_;
  208. my $n0;
  209. $n0 = length($r0);
  210. $s0 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_1;
  211. $s1 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_2;
  212. $s1 =~ s/^ {$n0}/$r0/;
  213. $s2 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_3;
  214. return ($s0, $s1, $s2);
  215. }
  216. # Display cell
  217. #==================================================
  218. sub add_cell($$$$$){
  219. my ($s0, $s1, $s2, $r0, $c0) = @_;
  220. $s0 .= disp_1($r0, $c0);
  221. $s1 .= disp_2($r0, $c0);
  222. $s2 .= disp_3($r0, $c0);
  223. return ($s0, $s1, $s2);
  224. }
  225. sub disp_0($){
  226. my $r0;
  227. my ($s0, $s1, $s2);
  228. $r0 = shift;
  229. # Append the y axis
  230. ($s0, $s1, $s2) = disp_y_axis($s0, $s1, $s2, $r0);
  231. # Iterate through the cells
  232. for my $i (1..11){
  233. ($s0, $s1, $s2) = add_cell($s0, $s1, $s2, $r0, $i);
  234. }
  235. return $s0."\n".$s1."\n".$s2."\n";
  236. }
  237. # Display row
  238. #==================================================
  239. sub disp_row($){
  240. my $row;
  241. my $r0;
  242. $r0 = shift;
  243. $row = disp_0($r0);
  244. # Handle trailing characters
  245. if($r0 % 2 == 1){
  246. # Trim the start of the first line
  247. $row =~ s/$TRAIL_1/ /;
  248. # Trim the end of the first line
  249. $row =~ s/\n/$TRAIL_3\n/
  250. }else{
  251. # Trim the end of the last line
  252. $row =~ s/$TRAIL_2\n/ \n/m;
  253. }
  254. return $row;
  255. }
  256. sub disp_trailing_row(){
  257. my $s0;
  258. my $s1;
  259. $s0 = $PAD_EVEN.$PREF_1;
  260. # Clear some chars from
  261. # our hex patterns
  262. $s1 = $HEX_1;
  263. substr($s1, 2,2) = " ";
  264. # Append hex pattern to
  265. # trailing row
  266. for my $i (1..11){
  267. $s0 .= $s1;
  268. }
  269. # Clear one last pair of
  270. # chrs
  271. substr($s0, -2,2) = " ";
  272. $s0 .= "\n";
  273. return $s0;
  274. }
  275. sub disp_x_axis(){
  276. my $s0;
  277. $s0 = $PAD_AXIS;
  278. $s0 .= join(
  279. $PAD_AXIS, map{
  280. $AXIS_RV{$_}
  281. }(1..11));
  282. $s0 .= "\n";
  283. return $s0
  284. }
  285. # Display board
  286. #==================================================
  287. sub disp_board(){
  288. my $b;
  289. for my $i (map {11-$_+1} (1..11)) {
  290. $b .= disp_row($i);
  291. }
  292. $b .= disp_trailing_row();
  293. $b .= disp_x_axis();
  294. $b =~ s/$TRAIL_1$TRAIL_3\n/\n/m;
  295. for my $i (1..11-1){
  296. substr($b, 2+6*$i, 2) = " ";
  297. }
  298. printf("%s", $b);
  299. }
  300. sub cell_index($){
  301. my ($chr1, $chr2) = (split(//, $_[0]));
  302. return ($AXIS{$chr1}, $chr2);
  303. }
  304. %board = map {
  305. $_ => $EMPTY_CELL
  306. } map {
  307. my $l0;
  308. $l0 = $_;
  309. (map {$l0.$_} ("1".."11"))
  310. } map{
  311. $AXIS_RV{$_}
  312. }(1...11);
  313. disp_board();
  314. # disp_0("C1");
  315. # printf(">>%s, %s\n", cell_index("C1"));