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.

116 lines
1.9KB

  1. #!/usr/bin/perl
  2. package MNU;
  3. use warnings;
  4. use strict;
  5. use lib "./";
  6. use NTVL;
  7. use LPST;
  8. use Try::Tiny;
  9. my $SAVE_FN = "save.txt";
  10. sub roll_back($){
  11. my @arr;
  12. my $game_str = shift;
  13. @arr = split(/\n/, $game_str);
  14. if(scalar @arr == 1){
  15. return "";
  16. }
  17. return join("\n", splice(@arr, 0, -1))."\n";
  18. }
  19. sub eval_game_str($$){
  20. my ($b, $game_str) = (shift, shift);
  21. try {
  22. NTVL->f1($b, $game_str);
  23. disp_board($b);
  24. } catch {
  25. warn "invalid move: $_";
  26. $game_str = roll_back($game_str);
  27. };
  28. return $game_str;
  29. }
  30. sub disp_board($){
  31. my $b = shift;
  32. $b->disp_board();
  33. }
  34. sub load(){
  35. my $game_str;
  36. $game_str = "";
  37. open FILE, "<".$SAVE_FN or die "couldn't open save file";
  38. while(<FILE>){
  39. $game_str .= $_;
  40. }
  41. close FILE;
  42. return $game_str;
  43. }
  44. sub save($){
  45. my $game_str = shift;
  46. open FILE, ">".$SAVE_FN or die "couldn't open save file";
  47. printf FILE "%s", $game_str;
  48. close FILE;
  49. return $game_str;
  50. }
  51. sub parse_cmd($){
  52. my $in = shift;
  53. return -1 if $in =~ /^q(uit)?$/i;
  54. return 1 if($in =~ /^save$/i);
  55. return 2 if($in =~ /^load$/i);
  56. return 3 if($in =~ /^show$/i);
  57. return 0;
  58. }
  59. sub show($$){
  60. my ($b, $game_str) = (shift, shift);
  61. $b->shade_all_p1_mvmt();
  62. disp_board($b);
  63. return prompt($b, $game_str);
  64. }
  65. sub prompt($$){
  66. my ($b, $game_str) = (shift, shift);
  67. printf("> ");
  68. my $in;
  69. $in = <STDIN>;
  70. chomp $in;
  71. return "QUIT" if(parse_cmd($in) == -1);
  72. return save($game_str) if parse_cmd($in) == 1;
  73. return load() if parse_cmd($in) == 2;
  74. return show($b, $game_str) if parse_cmd($in) == 3;
  75. $game_str .= $in."\n";
  76. return $game_str;
  77. }
  78. sub loop($$){
  79. my ($class, $game_str) = (shift, shift);
  80. my $in;
  81. my $b;
  82. $b = LPST->new();
  83. $game_str = eval_game_str($b, $game_str);
  84. printf("%s\n", $game_str);
  85. $game_str = prompt($b, $game_str);
  86. return $game_str;
  87. }
  88. return 1;