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.

412 lines
6.2KB

  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. # Players
  36. my $P1 = "P1";
  37. my $P2 = "P2";
  38. my $DIV = ":";
  39. my %AXIS = (
  40. "A" => 1,
  41. "B" => 2,
  42. "C" => 3,
  43. "D" => 4,
  44. "E" => 5,
  45. "F" => 6,
  46. "G" => 7,
  47. "H" => 8,
  48. "I" => 9,
  49. "J" => 10,
  50. "K" => 11
  51. );
  52. my %AXIS_RV = map {
  53. $AXIS{$_} => $_
  54. } keys(%AXIS);
  55. #
  56. # /--\ +1
  57. # | __ |
  58. # | |+1
  59. # \--/
  60. # -1 -1
  61. #
  62. # [Row mvoe, Diag move]
  63. my %MOVE = (
  64. $MG_A => [
  65. [-1, 1],
  66. [ 0, 1]
  67. ],
  68. $MG_Q => [
  69. [ 0, 1],
  70. [ 1, 0],
  71. [-1, 0],
  72. [ 0,-1],
  73. ],
  74. $MG_I => [
  75. [0,0]
  76. ],
  77. $MG_IT => [
  78. [ 0,-1],
  79. [ 1,-1]
  80. ],
  81. $MG_N => [
  82. [-1, 2],
  83. [ 1,-2]
  84. ],
  85. $MG_H => [
  86. [-3, 2],
  87. [-1,-2],
  88. [ 1, 2],
  89. [ 3,-2]
  90. ],
  91. $MG_RC => [
  92. [-1, 0],
  93. [-2, 0],
  94. [ 0, 1],
  95. [ 0, 2]
  96. ],
  97. $MG_S => [
  98. [-1, 1],
  99. [-2, 2],
  100. [ 0, 1],
  101. [ 0, 2],
  102. [ 0,-1],
  103. [ 0,-2],
  104. [ 1,-1],
  105. [ 2,-2],
  106. ],
  107. $MG_HS => [
  108. [-3, 1],
  109. [-2,-1],
  110. [ 2, 1],
  111. [ 3,-1]
  112. ],
  113. $MG_RO => [
  114. [-1, 1],
  115. [ 0, 1],
  116. [ 1, 1],
  117. [ 1,-2]
  118. ],
  119. $MG_B => [
  120. [-1, 1],
  121. [ 0, 1],
  122. [ 0,-2],
  123. [ 1,-2]
  124. ],
  125. $MG_P => [
  126. [-4, 2],
  127. [-2, 1],
  128. [-2,-2],
  129. [-1,-1],
  130. [ 1, 1],
  131. [ 2,-1],
  132. [ 2, 2],
  133. [ 4,-2]
  134. ],
  135. $MG_IM => [
  136. [-2, 1],
  137. [-1,-1],
  138. [-1, 2],
  139. [ 1, 1],
  140. [ 1,-1],
  141. [ 1,-2],
  142. [ 2,-1]
  143. ],
  144. $MG_F => [
  145. [-1, 0],
  146. [-1, 1],
  147. [ 0, 1],
  148. [ 0,-1],
  149. [ 1, 0],
  150. [ 1,-1]
  151. ],
  152. $MG_QS => [
  153. [-3, 3],
  154. [-2, 2],
  155. [-2, 0],
  156. [-1, 0],
  157. [-1, 1],
  158. [ 0, 1],
  159. [ 0, 2],
  160. [ 0, 3],
  161. [ 0,-1],
  162. [ 0,-2],
  163. [ 0,-3],
  164. [ 1, 0],
  165. [ 1,-1],
  166. [ 2, 0],
  167. [ 2,-2],
  168. [ 3,-3],
  169. ],
  170. $MG_AU => [
  171. [-1, 0],
  172. [-1, 1],
  173. [ 0, 1],
  174. [ 0,-1],
  175. [ 1, 0],
  176. [ 1,-1]
  177. ],
  178. $MG_SY => [
  179. [-4, 4],
  180. [-3, 3],
  181. [-3, 2],
  182. [-1,-2],
  183. [ 0,-2],
  184. [ 0,-3],
  185. [ 0, 3],
  186. [ 0, 4],
  187. [ 1, 2],
  188. [ 3,-2],
  189. [ 3,-3],
  190. [ 4,-4]
  191. ]
  192. );
  193. # Special cells
  194. my $EMPTY_CELL = "_";
  195. my %board;
  196. # Display pieces
  197. #==================================================
  198. sub f_1($){
  199. my $p = shift;
  200. my $s0;
  201. $p =~ s/($P1|$P2)$DIV//;
  202. $p .= "_" if length($p) < 2;
  203. $s0 = $HEX_2;
  204. $s0 =~ s/$SUB_CHR{1,2}/$p/;
  205. return $s0;
  206. }
  207. # Display lines
  208. #==================================================
  209. sub disp_1($$){
  210. my ($r0, $c0) = (shift, shift);
  211. return $HEX_1;
  212. }
  213. sub disp_2($$){
  214. my ($r0, $c0) = (shift, shift);
  215. my $p;
  216. # Cell notation
  217. my $not;
  218. $not = cell_index_rev($c0, $r0);
  219. $p = $board{$not};
  220. return f_1($p);
  221. # my ($r0, $c0) = (shift, shift);
  222. # return $HEX_2;
  223. }
  224. sub disp_3($$){
  225. my ($r0, $c0) = (shift, shift);
  226. return $HEX_3;
  227. }
  228. sub disp_y_axis($$$$){
  229. my ($s0, $s1, $s2, $r0) = @_;
  230. my $n0;
  231. $n0 = length($r0);
  232. $s0 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_1;
  233. $s1 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_2;
  234. $s1 =~ s/^ {$n0}/$r0/;
  235. $s2 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_3;
  236. return ($s0, $s1, $s2);
  237. }
  238. # Display cell
  239. #==================================================
  240. sub add_cell($$$$$){
  241. my ($s0, $s1, $s2, $r0, $c0) = @_;
  242. $s0 .= disp_1($r0, $c0);
  243. $s1 .= disp_2($r0, $c0);
  244. $s2 .= disp_3($r0, $c0);
  245. return ($s0, $s1, $s2);
  246. }
  247. sub disp_0($){
  248. my $r0;
  249. my ($s0, $s1, $s2);
  250. $r0 = shift;
  251. # Append the y axis
  252. ($s0, $s1, $s2) = disp_y_axis($s0, $s1, $s2, $r0);
  253. # Iterate through the cells
  254. for my $i (1..11){
  255. ($s0, $s1, $s2) = add_cell($s0, $s1, $s2, $r0, $i);
  256. }
  257. return $s0."\n".$s1."\n".$s2."\n";
  258. }
  259. # Display row
  260. #==================================================
  261. sub disp_row($){
  262. my $row;
  263. my $r0;
  264. $r0 = shift;
  265. $row = disp_0($r0);
  266. # Handle trailing characters
  267. if($r0 % 2 == 1){
  268. # Trim the start of the first line
  269. $row =~ s/$TRAIL_1/ /;
  270. # Trim the end of the first line
  271. $row =~ s/\n/$TRAIL_3\n/
  272. }else{
  273. # Trim the end of the last line
  274. $row =~ s/$TRAIL_2\n/ \n/m;
  275. }
  276. return $row;
  277. }
  278. sub disp_trailing_row(){
  279. my $s0;
  280. my $s1;
  281. $s0 = $PAD_EVEN.$PREF_1;
  282. # Clear some chars from
  283. # our hex patterns
  284. $s1 = $HEX_1;
  285. substr($s1, 2,2) = " ";
  286. # Append hex pattern to
  287. # trailing row
  288. for my $i (1..11){
  289. $s0 .= $s1;
  290. }
  291. # Clear one last pair of
  292. # chrs
  293. substr($s0, -2,2) = " ";
  294. $s0 .= "\n";
  295. return $s0;
  296. }
  297. sub disp_x_axis(){
  298. my $s0;
  299. $s0 = $PAD_AXIS;
  300. $s0 .= join(
  301. $PAD_AXIS, map{
  302. $AXIS_RV{$_}
  303. }(1..11));
  304. $s0 .= "\n";
  305. return $s0
  306. }
  307. # Display board
  308. #==================================================
  309. sub disp_board(){
  310. my $b;
  311. for my $i (map {11-$_+1} (1..11)) {
  312. $b .= disp_row($i);
  313. }
  314. $b .= disp_trailing_row();
  315. $b .= disp_x_axis();
  316. $b =~ s/$TRAIL_1$TRAIL_3\n/\n/m;
  317. for my $i (1..11-1){
  318. substr($b, 2+6*$i, 2) = " ";
  319. }
  320. printf("%s", $b);
  321. }
  322. sub cell_index_rev($$){
  323. return $AXIS_RV{$_[0]}.$_[1];
  324. }
  325. sub cell_index($){
  326. my ($chr1, $chr2) = (split(//, $_[0]));
  327. return ($AXIS{$chr1}, $chr2);
  328. }
  329. # Creates a hash of the the form
  330. # $board{cell_notation} = piece_enum
  331. %board = map {
  332. $_ => $EMPTY_CELL
  333. } map {
  334. my $l0;
  335. $l0 = $_;
  336. (map {$l0.$_} ("1".."11"))
  337. } map {
  338. $AXIS_RV{$_}
  339. }(1...11);
  340. $board{"D2"} = $P1.$DIV.$MG_A;
  341. disp_board();
  342. # disp_0("C1");
  343. # printf(">>%s, %s\n", cell_index("C1"));