# Example p6s50e1.pl # # Mission Parameters $MisCountry = "Brazil"; $MisPayback = 1000; $MisTraj = 0; $MisMarsDur = 25; # # Resources - must increase these -- just examples $TotalFood = 4000.0; $TotalWater = 4000.0; $TotalOxygen = 4000.0; if ($MisTraj == 0) { # # Direct Trajectory $MisMbMonths = 8; $MisEbMonths = 5; $MisGravity = 0; if ($MisMarsDur < 20) {$MisMarsDur = 20}; if ($MisMarsDur > 30) {$MisMarsDur = 30}; } elsif ($MisTraj == 1) { # # Slingshot Trajectory $MisMbMonths = 11; $MisEbMonths = 8; $MisGravity = 1; $MisMarsDur = 40; } else { print ("Improper Trajectory Value $MisTraj"); } # end if ($MisTraj) ###10 # # Site Parameters and Preferences $Site = 0; $Wind = 2; $Firm = 2; $Terr = 2; $Comp = 0; # # People $SciName = "Mary Smith"; $SciMW = "W"; $SciH = 100; $SciEF = 1; $Sci2Name = "Jeff Slattery"; $Sci2MW = "M"; $Sci2H = 100; $Sci2EF = 1; $MedName = "James Roberts"; $MedMW = "M"; $MedH = 100; $MedEF = 1; $MilName = "Susan Limon"; $MilMW = "W"; $MilH = 100; $MilEF = 1; $Mil2Name = "Reggie DeBates"; $Mil2MW = "M"; $Mil2H = 100; $Mil2EF = 5; $MisName = "Kenneth Bates"; $MisMW = "M"; $MisH = 100; $MisEF = 1; 11 # # say how much a woman crew member needs each day $DailyFoodW = 2.55; $DailyWaterW = 4.25; $DailyOxygenW = 1.70; # # say how much a man crew member needs each day $DailyFoodM = 3.00; $DailyWaterM = 5.00; $DailyOxygenM = 2.00; # # an array with the name of the possible sites @SiteNames = ('Anywhere', 'Rim of Polar Ice Cap', 'Volcanic Region', 'Area: Long 250° Lat 55° N.', 'Area: Long 103° Lat 8° N - Tharsis', 'Area: Long 345° Lat 50° N - Cydonia', 'Volcano Olympus Mons', 'Mariner Valley'); @WindNames = ('low','medium','high'); @FirmNames = ('soft','medium','hard'); @TerrNames = ('Canyons','Plains','Mountains'); @CompNames = ('Sand','Water','Frozen CO2', 'Water and Frozen CO2'); # Discovery Probabilities Initial $MisFosDiscProb = 0.01; $MisAnyDiscProb = 0.01; $MisLifeDiscProb = 0.01; $MisDiscLife = 0; # some places to hold current exercise counts $SciEFc = $SciEF; $Sci2EFc = $Sci2EF; $MedEFc = $MedEF; $MilEFc = $MilEF; $Mil2EFc = $Mil2EF; $MisEFc = $MisEF; ###12 # # compute things about mission $MisMbDays = $MisMbMonths * 30; $MisEbDays = $MisEbMonths * 30; # # distribute the food, water, oxy between ships # compute total available quantities at start of mission if ($MisTraj == 0 ) { # # Direct Trajectory $Ship1Food = $MisMbMonths/($MisMbMonths + $MisEbMonths) * $TotalFood; $Ship2Food = $TotalFood - $Ship1Food; $Ship1Water = $MisMbMonths/($MisMbMonths + $MisEbMonths) * $TotalWater; $Ship2Water = $TotalWater - $Ship1Water; $Ship1Oxygen = $MisMbMonths/($MisMbMonths + $MisEbMonths) * $TotalOxygen; $Ship2Oxygen = $TotalOxygen - $Ship1Oxygen; $TotalAvailFood = $Ship1Food; $TotalAvailWater = $Ship1Water; $TotalAvailOxygen = $Ship1Oxygen; } elsif ($MisTraj == 1 ) { $Ship1Food = 0.5 * $TotalFood; $Ship2Food = $TotalFood - $Ship1Food; $Ship1Water = 0.5 * $TotalFood; $Ship2Water = $TotalWater - $Ship1Water; $Ship1Oxygen = 0.5 * $TotalOxygen; $Ship2Oxygen = $TotalOxygen - $Ship1Oxygen; $TotalAvailFood = $Ship1Food + $Ship2Food; $TotalAvailWater = $Ship1Water + $Ship2Water; $TotalAvailOxygen = $Ship1Oxygen + $Ship2Oxygen; } else { print ("Improper Trajectory Value $MisTraj"); } # end if ($MisTraj) ###13 #--------------------------------------------------- # Beginning the Simulation print ("Beginning Simulation\n"); print ("----Mission for $MisCountry----\n"); print ("Mission Commander $MisName\n"); print ("Scientist $SciName\n"); print ("Scientist $Sci2Name\n") if ($Sci2Name); print ("Military Officer $MilName\n"); print ("Military Officer $Mil2Name\n") if ($Mil2Name); print ("Medical Officer $MedName\n"); #---------------------------------------------------- # for each day of the Mars bound mission # exercise, deal with gravity # eat, drink, breathe and do Mars things foreach $SegDay (1..$MisMbDays) { $Day = $SegDay; Exercise(); HandleGravity(); EatFood(); DrinkWater(); BreatheOxygen(); # # print the day every 30 days to show we're working if ($Day%30 == 0) { print ("Day: $Day\n"); } } # end foreach $Day # # Ship Problem - see if the ship survives if (rand(100.0) > 0.1) { # # ship survived - if the Direct Traj, move the cargo # nothing to do in Slingshot Trajectory if ($MisTraj == 0) { $TotalAvailFood += $Ship2Food; $TotalAvailWater += $Ship2Water; $TotalAvailOxygen += $Ship2Oxygen; } ###14 # # Do Mars Landing or Flyby $MarsDay = 1; $MisAnyDiscProb = 0.1; $Day = $MisMbDays + $MarsDay; $MisGravitySave = $MisGravity; $MisGravity = 1; PickSite(); print ("Day: $Day. Landing on Mars...\n"); print (" Site is $SiteNames[$Site]\n"); print ("Wind is $WindNames[$RealWind]\n", "Firmness is $FirmNames[$RealFirm]\n", "Terrain is $TerrNames[$RealTerr]\n", "Composition is $CompNames[$RealComp]\n"); # # Do consequences of landing # Low Winds Soft or Medium Plain if ($RealWind == 0 && $RealFirm < 2 && $RealTerr ==1) {$MisAnyDiscProb = 0.02}; # Hard Mountains if ($RealTerr == 2 && $RealFirm == 2) {$MisFosDiscProb = 0.3}; # Medium or High Wind and neither CO2 nor Water if ($RealWind >= 1 && $RealComp == 0) {$MisAnyDiscProb = 0.01}; # High Winds on a Soft Mountain if ($RealWind == 2 && $RealFirm == 0 && $RealTerr == 2 ) { if (rand(1.0) > 0.5) { print ("Day: $Day. Your lander tipped.\n", " Plan on another 5 months!\n"); $MisMarsDur += 5*30; $MisPayback = $MisPayback * 0.5; } # end if (rand(1.0) > 0.5) } # end if ($RealWind, etc.) # Soft Canyon with CO2 if ($RealFirm == 0 && $RealTerr == 0 ###15 && $RealComp == 3) { $MisLifeDiscProb = 0.4; print ("You're in a soft canyon site", " with water and Frozen CO2!", " Discovery chances are good!\n"); } # end if ($RealFirm... } else { # else if the ship did not survive $MisAnyDiscProb = 0.01; $MisPayback = $MisPayback * 0.3; print ("Your second ship was lost. ", "People are safe but the supplies", "are gone. Your mission commander, \n", "$MisName, has decided to scrub the mission", "and go back to Earth on the supplies you", "have left. Unfortunately, Payback\n", "is now $MisPayback. Good Luck!\n"); # # if it is the slingshot approach, we lose half # our supplies - direct approach simply does nothing # as there is nothing to transfer. if ($MisTraj == 1) { $TotalAvailFood = $TotalAvailFood/2.0; $TotalAvailWater = $TotalAvailWater/2.0; $TotalAvailOxygen = $TotalAvailOxygen/2.0; } } # # for each day we are on Mars foreach $SegDay (1..$MisMarsDur) { $Day = $MisMbDays + $SegDay; DoMarsDay(); } # # do take off day $SegDay = $MisMarsDur; $Day = $MisMbDays + $SegDay; print ("Day: $Day. Taking off from Mars...\n"); # ###16 # restore gravity flag $MisGravity = $MisGravitySave; # # for each day of the Earth bound mission # exercise, deal with gravity # eat, drink, breathe and do Mars things foreach $SegDay (1..$MisEbDays) { $Day = $MisMbDays + $MisMarsDur + $SegDay; Exercise(); HandleGravity(); EatFood(); DrinkWater(); BreatheOxygen(); # # print the day every 30 days to show we're working if ($Day%30 == 0) { print ("Day: $Day\n"); } } # end foreach $Day $MisDays = $Day; ###17 # # print status at the end of mission # resources left printf ("---------Status At End of Mission---------\n"); printf (" Time: %18.1f (days)\n",$MisDays); printf (" Food Left: %18.1f\n Water Left: %18.1f\n Oxy Left: %18.1f\n", $TotalAvailFood, $TotalAvailWater, $TotalAvailOxygen); printf (" Payback: %18.1f \n",$MisPayback); # # print status of people printf ("Scientist: %18.18s Health: %18.1f\n", $SciName, $SciH); printf ("Scientist: %18.18s Health: %18.1f\n", $Sci2Name,$Sci2H) if ($Sci2Name); printf ("Med. Off.: %18.18s Health: %18.1f\n", $MedName,$MedH); printf ("Mil. Off.: %18.18s Health: %18.1f\n", $MilName,$MilH); printf ("Mil. Off.: %18.18s Health: %18.1f\n", $Mil2Name,$Mil2H) if ($Mil2Name); printf ("Mis. Cmd.: %18.18s Health: %18.1f\n", $MisName,$MisH); exit; ###18 ############ Beginning of all our subroutines########## sub PickSite { if ($Site == 0) { $Site = rand(6.0) + 1.0; } # get four random numbers to help pick $PickWind = rand(10.0); $PickFirm = rand(10.0); $PickTerr = rand(10.0); $PickComp = rand(10.0); # # Now pick team's preference 70 percent of the time if ($PickWind > 3.0 ) { $RealWind = $Wind ; } else { $RealWind = rand(3)%3; } if ($PickFirm > 3.0 ) { $RealFirm = $Firm ; } else { $RealFirm = rand(3)%3; } if ($PickTerr > 3.0 ) { $RealTerr = $Terr ; } else { $RealTerr = rand(3)%3; } if ($PickComp > 3.0 ) { $RealComp = $Comp ; } else { $RealComp = rand(4)%4; } return; } ###19 sub DoMarsDay { # # Increase the probability of discovery every day # as we are learning about the place $MisAnyDiscProb += 0.05; # # Life if (rand() > $MisLifeDiscProb) { if ($MisDiscLife == 0) { print ("The $MisCountry mission has", "found a primitive form of life!!!!\n"); $MisPayback = $MisPayback * 2; $MisDiscLife = 1; } else { print ("Additional life species discovered.\n"); $MisPayback += $MisPayback * 0.1; } } # Fossils if (rand() > $MisFosDiscProb) { print ("The $MisCountry mission has", "found some unusual fossils.\n"); $MisPayback += $MisPayback * 0.07; } # Any if (rand() > $MisAnyDiscProb) { print ("The $MisCountry mission has", "made some puzzling discoveries.\n"); $MisPayback += $MisPayback * 0.03; } return; } ###20 sub HandleGravity { # # if no gravity then adjust health down if ($MisGravity == 0) { $SciH = $SciH - 0.075; $Sci2H = $Sci2H - 0.075 if ($Sci2Name ne ""); $MedH = $MedH - 0.075; $MilH = $MilH - 0.075; $Mil2H = $Mil2H - 0.075 if ($Mil2Name ne ""); $MisH = $MisH - 0.075; } return; } ###21 sub Exercise { # # Scientist: Count down exercise frequency # when get to 0, add 0.1 to health and reset exer freq cnt $SciEFc = $SciEFc - 1; $SciH = $SciH + 0.1 if ($SciEFc == 0); $SciEFc = $SciEF if ($SciEFc == 0); # Second Scientist if ($Sci2Name ne "") { $Sci2EFc = $Sci2EFc - 1; $Sci2H = $Sci2H + 0.1 if ($Sci2EFc == 0); $Sci2EFc = $Sci2EF if ($Sci2EFc == 0); } # Medical Officer $MedEFc = $MedEFc - 1; $MedH = $MedH + 0.1 if ($MedEFc == 0); $MedEFc = $MedEF if ($MedEFc == 0); # Military Officer $MilEFc = $MilEFc - 1; $MilH = $MilH + 0.1 if ($MilEFc == 0); $MilEFc = $MilEF if ($MilEFc == 0); # Second Military Officer if ($Mil2Name ne "") { $Mil2EFc = $Mil2EFc - 1; $Mil2H = $Mil2H + 0.1 if ($Mil2EFc == 0); $Mil2EFc = $Mil2EF if ($Mil2EFc == 0); } # Mission Commander $MisEFc = $MisEFc - 1; $MisH = $MisH + 0.1 if ($MisEFc == 0); $MisEFc = $MisEF if ($MisEFc == 0); return; } ###22 sub EatFood { # # Initialize Daily Food Usage $DailyFood = 0.0; # # Assume Scientist is just regularly hungry # and then see if Scientist just finished exercising # and increase hunger accordingly $Hungry = 1.00; if ($SciEF eq $SciEFc) {$Hungry = 1.05;} if ($SciMW eq "M") { $DailyFood += $DailyFoodM*$Hungry;} else { $DailyFood += $DailyFoodW*$Hungry;} if (!$Sci2Name) { $Hungry = 1.00; if ($Sci2EF eq $Sci2EFc) {$Hungry = 1.05;} if ($Sci2MW eq "M") {$DailyFood += $DailyFoodM*$Hungry;} else {$DailyFood += $DailyFoodW*$Hungry;} } $Hungry = 1.00; if ($MedEF eq $MedEFc) {$Hungry = 1.05;} if ($MedMW eq "M") {$DailyFood += $DailyFoodM*$Hungry;} else {$DailyFood += $DailyFoodW*$Hungry;} $Hungry = 1.00; if ($MilEF eq $MilEFc) {$Hungry = 1.05;} if ($MilMW eq "M") {$DailyFood += $DailyFoodM*$Hungry;} else {$DailyFood += $DailyFoodW*$Hungry;} if (!$Mil2Name) { $Hungry = 1.00; if ($Mil2EF eq $Mil2EFc) {$Hungry = 1.05;} if ($Mil2MW eq "M") {$DailyFood += $DailyFoodM*$Hungry;} else {$DailyFood += $DailyFoodW*$Hungry;} } $Hungry = 1.00; if ($MisEF eq $MisEFc) {$Hungry = 1.05;} if ($MisMW eq "M") {$DailyFood += $DailyFoodM*$Hungry;} ###23 else {$DailyFood += $DailyFoodW*$Hungry;} $TotalAvailFood = $TotalAvailFood - $DailyFood; if ($TotalAvailFood <= 0 ) { print ("Day $Day: No food available!\a\n", " TF: $TotalFood TAF $TotalAvailFood\n"); exit; } return; } ###24 # Subroutine DrinkWater sub DrinkWater { # # Get total daily water according to man or woman $DailyWater = 0.0; $Thirsty = 1.00; if ($SciEF eq $SciEFc) {$Thirsty = 1.05;} if ($SciMW eq "M") { $DailyWater += $DailyWaterM*$Thirsty;} else { $DailyWater += $DailyWaterW*$Thirsty;} if (!$Sci2Name) { $Thirsty = 1.00; if ($Sci2EF eq $Sci2EFc) {$Thirsty = 1.05;} if ($Sci2MW eq "M") {$DailyWater += $DailyWaterM*$Thirsty;} else {$DailyWater += $DailyWaterW*$Thirsty;} } $Thirsty = 1.00; if ($MedEF eq $MedEFc) {$Thirsty = 1.05;} if ($MedMW eq "M") {$DailyWater += $DailyWaterM*$Thirsty;} else {$DailyWater += $DailyWaterW*$Thirsty;} $Thirsty = 1.00; if ($MilEF eq $MilEFc) {$Thirsty = 1.05;} if ($MilMW eq "M") {$DailyWater += $DailyWaterM*$Thirsty;} else {$DailyWater += $DailyWaterW*$Thirsty;} if (!$Mil2Name) { $Thirsty = 1.00; if ($Mil2EF eq $Mil2EFc) {$Thirsty = 1.05;} if ($Mil2MW eq "M") {$DailyWater += $DailyWaterM*$Thirsty;} else {$DailyWater += $DailyWaterW*$Thirsty;} } ###25 $Thirsty = 1.00; if ($MisEF eq $MisEFc) {$Thirsty = 1.05;} if ($MisMW eq "M") {$DailyWater += $DailyWaterM*$Thirsty;} else {$DailyWater += $DailyWaterW*$Thirsty;} $TotalAvailWater = $TotalAvailWater - $DailyWater; # # if we have drunk all the water, print out day and exit if ($TotalAvailWater <= 0 ) { print ("Day $Day: No water available!\a\n", " TW: $TotalFood TAW $TotalAvailFood\n"); exit; } return; } ###26 # Subroutine BreatheOxygen sub BreatheOxygen { # # Get total daily oxygen according to man or woman $DailyOxygen = 0.0; $Huff = 1.00; if ($SciEF eq $SciEFc) {$Huff = 1.05;} if ($SciMW eq "M") { $DailyOxygen += $DailyOxygenM*$Huff;} else { $DailyOxygen += $DailyOxygenW*$Huff;} if (!$Sci2Name) { $Huff = 1.00; if ($Sci2EF eq $Sci2EFc) {$Huff = 1.05;} if ($Sci2MW eq "M") {$DailyOxygen += $DailyOxygenM*$Huff;} else {$DailyOxygen += $DailyOxygenW*$Huff;} } $Huff = 1.00; if ($MedEF eq $MedEFc) {$Huff = 1.05;} if ($MedMW eq "M") {$DailyOxygen += $DailyOxygenM*$Huff;} else {$DailyOxygen += $DailyOxygenW*$Huff;} $Huff = 1.00; if ($MilEF eq $MilEFc) {$Huff = 1.05;} if ($MilMW eq "M") {$DailyOxygen += $DailyOxygenM*$Huff;} else {$DailyOxygen += $DailyOxygenW*$Huff;} if (!$Mil2Name) { $Huff = 1.00; if ($Mil2EF eq $Mil2EFc) {$Huff = 1.05;} if ($Mil2MW eq "M") {$DailyOxygen += $DailyOxygenM*$Huff;} else {$DailyOxygen += $DailyOxygenW*$Huff;} } ###27 $Huff = 1.00; if ($MisEF eq $MisEFc) {$Huff = 1.05;} if ($MisMW eq "M") {$DailyOxygen += $DailyOxygenM*$Huff;} else {$DailyOxygen += $DailyOxygenW*$Huff;} $TotalAvailOxygen = $TotalAvailOxygen - $DailyOxygen; # # if we have breathed the oxygen, print out day and exit if ($TotalAvailOxygen <= 0 ) { print ("Day $Day: No oxygen available!\a\n", " TO: $TotalOxygen TAO $TotalAvailOxygen\n"); exit; } return; } ###28