From dd7def55f3c637cd25629c1b810935a9ade97303 Mon Sep 17 00:00:00 2001 From: Flavio Poletti Date: Fri, 7 Jan 2022 03:11:52 +0100 Subject: [PATCH] Add 12_Bombs_Away in Perl --- 12_Bombs_Away/perl/bombsaway.pl | 140 ++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 12_Bombs_Away/perl/bombsaway.pl diff --git a/12_Bombs_Away/perl/bombsaway.pl b/12_Bombs_Away/perl/bombsaway.pl new file mode 100644 index 00000000..dd4c4674 --- /dev/null +++ b/12_Bombs_Away/perl/bombsaway.pl @@ -0,0 +1,140 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; + +exit main(@ARGV); + +sub main { + $|++; + my $mission = 'y'; + + my @choices = ( + { # 1 - Italy + ask => 'YOUR TARGET -- ALBANIA(1), GREECE(2), NORTH AFRICA(3)', + comments => [ + q{SHOULD BE EASY -- YOU'RE FLYING A NAZI-MADE PLANE.}, + 'BE CAREFUL!!!', + q{YOU'RE GOING FOR THE OIL, EH?}, + ], + }, + { # 2 - Allies + ask => 'AIRCRAFT -- LIBERATOR(1), B-29(2), B-17(3), LANCASTER(4)', + comments => [ + q{YOU'VE GOT 2 TONS OF BOMBS FLYING FOR PLOESTI.}, + q{YOU'RE DUMPING THE A-BOMB ON HIROSHIMA.}, + q{YOU'RE CHASING THE BISMARK IN THE NORTH SEA.}, + q{YOU'RE BUSTING A GERMAN HEAVY WATER PLANT IN THE RUHR.}, + ], + }, + \&japan, + { # 4 - Germany + ask => "A NAZI, EH? OH WELL. ARE YOU GOING FOR RUSSIA(1),\n" + . 'ENGLAND(2), OR FRANCE(3)', + comments => [ + q{YOU'RE NEARING STALINGRAD.}, + q{NEARING LONDON. BE CAREFUL, THEY'VE GOT RADAR.}, + q{NEARING VERSAILLES. DUCK SOUP. THEY'RE NEARLY DEFENSELESS.}, + ], + }, + ); + + while (fc($mission // 'n') eq fc('y')) { + say 'YOU ARE A PILOT IN A WORLD WAR II BOMBER.'; + + my $side = choose( + 'WHAT SIDE -- ITALY(1), ALLIES(2), JAPAN(3), GERMANY(4)? ', 4); + my $choice = $choices[$side - 1]; + ref($choice) eq 'HASH' ? multiple($choice) : $choice->(); + + print "\n\n\nANOTHER MISSION (Y OR N)? "; + chomp($mission = ); + } + say "CHICKEN !!!\n"; + return 0; +} + +sub choose ($prompt, $n_max) { + while ('necessary') { + print "$prompt? "; + chomp(my $side = ); + return $side if $side =~ m{\A [1-9]\d* \z}mxs && $side <= $n_max; + say 'TRY AGAIN...'; + } +} + +sub multiple ($spec) { + my $target = choose("$spec->{ask}? ", scalar $spec->{comments}->@*); + say $spec->{comments}->[$target - 1]; + say ''; + + my $missions; + while ('necessary') { + print 'HOW MANY MISSIONS HAVE YOU FLOWN? '; + chomp($missions = ); + last if $missions < 160; + print 'MISSIONS, NOT MILES... +150 MISSIONS IS HIGH EVEN FOR OLD-TIMERS. +NOW THEN, '; + } + if ($missions < 25) { say 'FRESH OUT OF TRANING, EH?' } + elsif ($missions >= 100) { say q{THAT'S PUSHING THE ODDS!} } + + return direct_hit() if $missions >= rand(160); + + my $miss = 2 + int rand(30); + say "MISSED TARGET BY $miss MILES!"; + say "NOW YOU'RE REALLY IN FOR IT !!\n"; + our $double_fire = 0; + my $response = choose( + 'DOES THE ENEMY HAVE GUNS(1), MISSILES(2), OR BOTH(3)', 3); + if ($response < 2) { + print q{WHAT'S THE PERCENT HIT RATE OF ENEMY GUNNERS (10 TO 50)? }; + chomp (our $hit_rate = ); + if ($hit_rate < 10) { + say q{YOU LIE, BUT YOU'LL PAY...}; + return endgame('fail'); # sure failure + } + say ''; + } + else { + $double_fire = 35; + } + return endgame(); +} + +sub direct_hit { + my $killed = int rand(100); + say "DIRECT HIT!!!! $killed KILLED.\nMISSION SUCCESSFUL"; + return; +} + +sub endgame ($fail = 0) { + our $double_fire //= 0; + our $hit_rate //= 0; + $fail ||= ($double_fire + $hit_rate) > rand(100); + if ($fail) { + say '* * * * BOOM * * * * +YOU HAVE BEEN SHOT DOWN..... +DEARLY BELOVED, WE ARE GATHERED HERE TODAY TO PAY OUR +LAST TRIBUTE...'; + } + else { + say 'YOU MADE IT THROUGH TREMENDOUS FLAK!!'; + } + return; +} + +sub japan { + say q{YOU'RE FLYING A KAMIKAZE MISSION OVER THE USS LEXINGTON.}; + print q{YOUR FIRST KAMIKAZE MISSION(Y OR N)? }; + chomp(my $is_first_kamikaze = ); + if (fc($is_first_kamikaze) eq fc('n')) { + our $hit_rate = 0; + say ''; + return endgame(); + } + return direct_hit() if rand(1) > 0.65; + return endgame('fail'); +}