#!/usr/bin/perl package MNU; use warnings; use strict; use lib "./"; use NTVL; use LPST; use Try::Tiny; my $SAVE_FN = "save.txt"; sub roll_back($){ my @arr; my $game_str = shift; @arr = split(/\n/, $game_str); if(scalar @arr == 1){ return ""; } return join("\n", splice(@arr, 0, -1))."\n"; } sub eval_game_str($$){ my ($b, $game_str) = (shift, shift); try { NTVL->f1($b, $game_str); disp_board($b); } catch { warn "invalid move: $_"; $game_str = roll_back($game_str); }; return $game_str; } sub disp_board($){ my $b = shift; $b->disp_board(); } sub load(){ my $game_str; $game_str = ""; open FILE, "<".$SAVE_FN or die "couldn't open save file"; while(){ $game_str .= $_; } close FILE; return $game_str; } sub save($){ my $game_str = shift; open FILE, ">".$SAVE_FN or die "couldn't open save file"; printf FILE "%s", $game_str; close FILE; return $game_str; } sub parse_cmd($){ my $in = shift; return -1 if $in =~ /^q(uit)?$/i; return 1 if($in =~ /^save$/i); return 2 if($in =~ /^load$/i); return 3 if($in =~ /^show$/i); return 0; } sub show($$){ my ($b, $game_str) = (shift, shift); $b->shade_all_p1_mvmt(); disp_board($b); return prompt($b, $game_str); } sub prompt($$){ my ($b, $game_str) = (shift, shift); printf("> "); my $in; $in = ; chomp $in; return "QUIT" if(parse_cmd($in) == -1); return save($game_str) if parse_cmd($in) == 1; return load() if parse_cmd($in) == 2; return show($b, $game_str) if parse_cmd($in) == 3; $game_str .= $in."\n"; return $game_str; } sub loop($$){ my ($class, $game_str) = (shift, shift); my $in; my $b; $b = LPST->new(); $game_str = eval_game_str($b, $game_str); printf("%s\n", $game_str); $game_str = prompt($b, $game_str); return $game_str; } return 1;