// // CPT operator / SondeerGame // This source file is (c) by Deltares. // - October 2014 // /// jln - 08-08-2008 /// Feedback / end game dialog class MenuEndGame extends GeoGUIPage; #exec OBJ LOAD FILE=Geodelft.utx var automated GeoFrame DialogBackground; var automated GeoTitle Title; var automated GeoButton CloseButton; var automated GeoLabel Phase1; var automated GeoMultiLineLabel TextPhase1; var automated GeoLabel Phase1Eval; var automated GeoLabel Phase1Score; var automated GeoLabel Phase2; var automated GeoMultiLineLabel TextPhase2; var automated GeoLabel Phase2Eval; var automated GeoLabel Phase2Score; var automated GeoLabel Phase3; var automated GeoMultiLineLabel TextPhase3; var automated GeoLabel Phase3Eval; var automated GeoLabel Phase3Score; var automated GeoLabel Beoordeling; var automated GeoLabel Resultaat; /// L = localized: var string L_Voldoende, L_Onvoldoende; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); /// Calculate the player score: CalculatePlayerScore(); L_Voldoende = IL8N("voldoende"); L_Onvoldoende = IL8N("onvoldoende"); /* TextPhase1.SetContent( "Text phase 1"); TextPhase2.SetContent( "Text phase 2"); TextPhase3.SetContent( "Text phase 3"); */ /* Phase1Eval.Caption = ( "voldoende"); Phase2Eval.Caption = ( "voldoende"); Phase3Eval.Caption = ( "voldoende"); Phase1Score.Caption = ( "20/20"); Phase2Score.Caption = ( "10/30"); Phase3Score.Caption = ( "45/50"); */ } /// jln - 27-10-2008 Calculate player score and give function CalculatePlayerScore() { local int points1, points2, points3, maxpoints1, maxpoints2, maxpoints3, preparationpoints, maxpreparationpoints; local GeoLabel feedback1, feedback2, feedback3; local string f1, f2, f3, f2temp, s; local float percentage; local float speedlimit, minmanual, maxmanual; local bool crossedlimit; s = "GeoInterface.MenuEndGame"; // count points per game phase points1 = 0; points2 = 0; points3 = 0; // the maxpoints are just starting values, more points might add to it maxpoints1 = 20; // plus optional scenario-dependent points and KLIC maxpoints2 = 12; // plus optional scenario-dependent points (a.o. preparation) maxpoints3 = 100; // plus optional scenario-dependent points and broken cable feedback1 = Phase1; feedback2 = Phase2; feedback3 = Phase3; /// FeedBack (fase 1 temp); /// Score (fase 2 temp); /// AankomstLocatie (fase 3 temp); log(""); log("MenuEndGame: === SCORE ==="); /// PHASE 1 log(""); log("Phase 1"); /// how many errors in the opdrachtbon checks (5 per correct answer) log("nrErrorsinChecks = " $ GeoPC.playeractions.nrErrorsinChecks); points1 += (4 - GeoPC.playeractions.nrErrorsinChecks) * 5; if(GeoPC.playeractions.nrErrorsinChecks == 0) { f1 = f1 $ GeoPC.IL8N("no_errors", s, false); } else if(GeoPC.playeractions.nrErrorsinChecks < 3) { f1 = f1 $ GeoPC.IL8N("some_errors", s, false); } else { f1 = f1 $ GeoPC.IL8N("many_errors", s, false); } if(GeoPC.bKLIC) { maxpoints1 += 5; log("ConsultedKLIC = " $ GeoPC.playeractions.ConsultedKLIC); if (GeoPC.playeractions.ConsultedKLIC) { points1 += 5; } else { f1 = f1 @ GeoPC.IL8N("klic_notchecked", s, false); } } /// PHASE 2 log(""); log("Phase 2"); /// Player hit more than five times an object: log("nrObjectsHit = " $ GeoPC.playeractions.nrObjectsHit); if (GeoPC.playeractions.nrObjectsHit == 0) { /// (comment) f2 = f2 $ GeoPC.IL8N("no_hits", s, false); points2 += 8; } else if (GeoPC.playeractions.nrObjectsHit < 4) { /// (comment) f2 = f2 $ GeoPC.IL8N("some_hits", s, false); points2 += 4; } else { f2 = f2 $ GeoPC.IL8N("many_hits", s, false); } log("nrTimesTractor = " $ GeoPC.playeractions.nrTimesTractor); if(GeoPC.playeractions.nrTimesTractor == 0) { points2 += 4; } else if(GeoPC.playeractions.nrTimesTractor == 1) { f2 = f2 @ GeoPC.IL8N("one_tractor", s, false); } else { f2 = f2 @ GeoPC.IL8N("multiple_tractors", s, false); } /// PHASE 2 - 2 points per correct preparation measure if(GeoPC.ScenarioNumber == 1) { maxpreparationpoints = 5 * 2; log("ClosedGates = " $ GeoPC.playeractions.ClosedGates); if (GeoPC.playeractions.ClosedGates) { preparationpoints += 2; } else { f2temp = f2temp @ GeoPC.IL8N("no_gates_closed", s, false); } log("PerformedPreDig = " $ GeoPC.playeractions.PerformedPreDig); if (GeoPC.playeractions.PerformedPreDig) { /// (comment) preparationpoints += 2; log("ReturnedSand = " $ GeoPC.playeractions.ReturnedSand); if (GeoPC.playeractions.ReturnedSand) { preparationpoints += 2; } else { f2temp = f2temp @ GeoPC.IL8N("not_returned_sand", s, false); } log("AskedForBoorBeschrijving = " $ GeoPC.playeractions.AskedForBoorBeschrijving); if (GeoPC.playeractions.AskedForBoorBeschrijving) { preparationpoints += 2; } else { /// Not asked for a boorbeschrijving f2temp = f2temp @ GeoPC.IL8N("no_grounddesc", s, false); } } else { /// Not predigged: f2temp = f2temp @ GeoPC.IL8N("no_predig", s, false); } } else if(GeoPC.ScenarioNumber == 2) { maxpreparationpoints = 2 + 5; // hood raise plus no predigging (Predig is NOT necessary in level 2) if (!GeoPC.playeractions.PerformedPreDig) { preparationpoints += 5; } else { f2temp = f2temp @ GeoPC.IL8N("no_predig_needed", s, false); } } else if(GeoPC.ScenarioNumber == 3) { maxpreparationpoints = 3 * 2 + 5; log("PutOnClothes = " $ GeoPC.playeractions.PutOnClothes); if (GeoPC.playeractions.PutOnClothes) { preparationpoints += 2; } else { f2temp = f2temp @ GeoPC.IL8N("no_clothes", s, true); } log("PerformedPreDig = " $ GeoPC.playeractions.PerformedPreDig); if (!GeoPC.playeractions.PerformedPreDig) { preparationpoints += 5; } else { f2temp = f2temp @ GeoPC.IL8N("no_predig_needed", s, false); } log("ReturnedSand = " $ GeoPC.playeractions.ReturnedSand); if (GeoPC.playeractions.ReturnedSand && !GeoPC.playeractions.OnlyReturnedSand) { preparationpoints += 2; } else { f2temp = f2temp @ GeoPC.IL8N("not_returned_excavated_material", s, false); } } else if(GeoPC.ScenarioNumber == 4) { maxpreparationpoints = 4 * 2; log("PerformedPreDig = " $ GeoPC.playeractions.PerformedPreDig); if (GeoPC.playeractions.PerformedPreDig) { /// (comment) preparationpoints += 2; log("ReturnedSand = " $ GeoPC.playeractions.ReturnedSand); if (GeoPC.playeractions.ReturnedSand && !GeoPC.playeractions.OnlyReturnedSand) { preparationpoints += 2; } else { f2temp = f2temp @ GeoPC.IL8N("not_returned_excavated_material", s, false); } log("AskedForBoorBeschrijving = " $ GeoPC.playeractions.AskedForBoorBeschrijving); if (GeoPC.playeractions.AskedForBoorBeschrijving) { preparationpoints += 2; } else { /// Not asked for a boorbeschrijving f2temp = f2temp @ GeoPC.IL8N("no_grounddesc", s, false); } } else { /// Not predigged: /// While player should have: f2temp = f2temp @ GeoPC.IL8N("no_predig", s, false); } } // independent of scenario log("RaisedHood = " $ GeoPC.playeractions.RaisedHood); if (GeoPC.playeractions.RaisedHood) { preparationpoints += 2; } else { f2temp = f2temp @ GeoPC.IL8N("no_hood", s, false); } if(preparationpoints == maxpreparationpoints) { f2 = f2 @ GeoPC.IL8N("perfect_preparation", s, false); } else if(preparationpoints <= maxpreparationpoints / 2) { f2 = f2 @ GeoPC.IL8N("bad_preparation", s, false); } else { // show preparation corrective comments only when there's more than one, less than 'a lot' f2 = f2 @ f2temp; } maxpoints2 = maxpoints2 + maxpreparationpoints; points2 += preparationpoints; log("maxpreparationpoints = "$maxpreparationpoints$" en preparationpoints = "$preparationpoints); /// PHASE 3 - Sonderen log(""); log("Phase 3"); if (GeoPC.playeractions.SondeerDepth == 0) { Log("player had sondeer distance: " @ GeoPC.playeractions.SondeerDepth); points3 = 0; f3 = f3 @ GeoPC.IL8N("no_sondering", s, false); } else { log("ForgotStempels = " $ GeoPC.playeractions.ForgotStempels); if (!GeoPC.playeractions.ForgotStempels) { points3 += 5; } else { f3 = f3 @ GeoPC.IL8N("forgot_stempels", s, false); } log("HasCorrectCone = " $ GeoPC.playeractions.HasCorrectCone); if (GeoPC.playeractions.HasCorrectCone) { points3 += 5; } else { f3 = f3 @ GeoPC.IL8N("incorrect_cone", s, false); } log("CheckedForAir = " $ GeoPC.playeractions.CheckedForAir); if (GeoPC.playeractions.CheckedForAir) { points3 += 5; } else { f3 = f3 @ GeoPC.IL8N("forgot_aircheck", s, false); } if(GeoPC.bCableBroken) { log("ReplacedCable = " $ GeoPC.playeractions.ReplacedCable); maxpoints3 += 5; if (GeoPC.playeractions.ReplacedCable) { points3 += 5; f3 = f3 @ GeoPC.IL8N("replaced_cable", s, false); } else { f3 = f3 @ GeoPC.IL8N("not_replaced_cable", s, false); } } // test for maximal sondeer speed (limit is company-dependent) log("MaxSondeerSpeed = " $ GeoPC.playeractions.MaxSondeerSpeed); if(GeoPC.GetCompany() == "deltares") { speedlimit = 2.2; } else { speedlimit = 2.5; } if (GeoPC.playeractions.MaxSondeerSpeed > speedlimit) { f3 = f3 @ GeoPC.IL8N("too_fast", s, false); crossedlimit = true; } else { points3 += 15; } // test for average sondeer speed // currently, same value for all scenarios log("AverageSondeerSpeed = " $ GeoPC.playeractions.AverageSondeerSpeed); if (GeoPC.playeractions.AverageSondeerSpeed > 2.4) { if(crossedlimit) { f3 = f3 @ GeoPC.IL8N("too_fast_average_also", s, false); } else { f3 = f3 @ GeoPC.IL8N("too_fast_average", s, false); } } else { points3 += 15; } minmanual = float(Localize("Assignment", "MinManual", GeoPC.GetScenarioFile())); maxmanual = float(Localize("Assignment", "MaxManual", GeoPC.GetScenarioFile())); /// Player did not do enough manual meters: log("ManualDepth = " $ GeoPC.playeractions.ManualDepth); if (GeoPC.playeractions.ManualDepth < minmanual) { f3 = f3 @ GeoPC.IL8N("manual_shallow", s, false); } else if (GeoPC.playeractions.ManualDepth > maxmanual) { /// Player did too many manual meters f3 = f3 @ GeoPC.IL8N("manual_deep", s, false); } else { points3 += 10; } /// Player dug deep enough, but not too deep: log("SondeerDepth = " $ GeoPC.playeractions.SondeerDepth); if (GeoPC.playeractions.SondeerDepth < int(Localize("Assignment", "minimumdepth", GeoPC.GetScenarioFile()))) { f3 = f3 @ GeoPC.IL8N("too_shallow", s, false); } else if (GeoPC.playeractions.SondeerDepth > int(Localize("Assignment", "maximumdepth", GeoPC.GetScenarioFile()))) { f3 = f3 @ GeoPC.IL8N("too_deep", s, false); } else { points3 += 40; } /// Player correct assessment of errors in zerovalues log("ZeroValuesErrorBefore = " $ GeoPC.playeractions.ZeroValuesErrorBefore $ ", ZeroValuesErrorAfter = "$GeoPC.playeractions.ZeroValuesErrorAfter); if (!GeoPC.playeractions.ZeroValuesErrorBefore && GeoPC.NulMetingErrorBefore) { f3 = f3 @ GeoPC.IL8N("zerovalues_correct_wrong", s, false); } else if (!GeoPC.playeractions.ZeroValuesErrorAfter && GeoPC.NulMetingErrorAfter) { f3 = f3 @ GeoPC.IL8N("zerovalues_correct_wrong", s, false); } else if (GeoPC.playeractions.ZeroValuesErrorBefore && !GeoPC.NulMetingErrorBefore) { f3 = f3 @ GeoPC.IL8N("zerovalues_incorrect_wrong", s, false); } else if (GeoPC.playeractions.ZeroValuesErrorAfter && !GeoPC.NulMetingErrorAfter) { f3 = f3 @ GeoPC.IL8N("zerovalues_incorrect_wrong", s, false); } else if (GeoPC.playeractions.ZeroValuesErrorBefore && GeoPC.NulMetingErrorBefore) { f3 = f3 @ GeoPC.IL8N("zerovalues_incorrect_right", s, false); points3 += 5; } else if (GeoPC.playeractions.ZeroValuesErrorAfter && GeoPC.NulMetingErrorAfter) { f3 = f3 @ GeoPC.IL8N("zerovalues_incorrect_right", s, false); points3 += 5; } else if (!GeoPC.playeractions.ZeroValuesErrorBefore && !GeoPC.NulMetingErrorBefore) { points3 += 5; } else if (!GeoPC.playeractions.ZeroValuesErrorAfter && !GeoPC.NulMetingErrorAfter) { points3 += 5; } /// EXTRA SCENARIO-SPECIFIC POINTS log(""); log("EXTRA SCENARIO-SPECIFIC POINTS; scenario = " $ GeoPC.ScenarioNumber); // should you get points for calling to change location? if(GeoPC.ScenarioNumber == 1) { maxpoints2 += 10; log("CalledForLocation = " $ GeoPC.playeractions.CalledForLocation); if (GeoPC.playeractions.CalledForLocation) { points2 += 5; } log("AskedPermission = " $ GeoPC.playeractions.AskedPermission); if (GeoPC.playeractions.AskedPermission) { points2 += 5; f2 = f2 @ GeoPC.IL8N("asked_landowner", s, true); } else { f2 = f2 @ GeoPC.IL8N("did_not_ask_landowner", s, true); } if (GeoPC.playeractions.Level1HitCable == true) { f3 = f3 @ GeoPC.IL8N("hit_cable_level1", s, false); } } else if(GeoPC.ScenarioNumber == 2) { } else if(GeoPC.ScenarioNumber == 3) { maxpoints1 += 5; maxpoints2 += 5; log("DidBringPermit = " $ GeoPC.playeractions.DidBringPermit); if (GeoPC.playeractions.DidBringPermit) { points1 += 5; } else { f1 = f1 @ GeoPC.IL8N("forgot_permit", s, true); } log("TalkedToDoorkeeper = " $ GeoPC.playeractions.TalkedToDoorkeeper); if(GeoPC.playeractions.TalkedToDoorkeeper) { points2 += 5; } else { f2 = f2 @ GeoPC.IL8N("forgot_doorkeeper", s, true); } if(GeoPC.playeractions.DidBringPermit && GeoPC.playeractions.TalkedToDoorkeeper) { f2 = f2 @ GeoPC.IL8N("good_procedures", s, true); } maxpoints3 += 5; log("UsingCasing = " $ GeoPC.playeractions.UsingCasing); if (GeoPC.playeractions.UsingCasing) { /// Check if casing is at the correct level: if ( (GeoPC.playeractions.CasingDepth >= 130 && GeoPC.playeractions.CasingDepth <= 150) || (GeoPC.playeractions.CasingDepth >= 170 && GeoPC.playeractions.CasingDepth <= 190) || (GeoPC.playeractions.CasingDepth >= 210 && GeoPC.playeractions.CasingDepth <= 230) ) { points3 += 5; f3 = f3 @ GeoPC.IL8N("casing_ok", s, false); } else { f3 = f3 @ GeoPC.IL8N("casing_incorrect_depth", s, false); } } else { f3 = f3 @ GeoPC.IL8N("forgot_casing", s, false); } } else if(GeoPC.ScenarioNumber == 4) { maxpoints1 += 5; log("DidBringClayColumn = " $ GeoPC.playeractions.DidBringClayColumn); if (GeoPC.playeractions.DidBringClayColumn) { points1 += 5; } else { f1 = f1 @ GeoPC.IL8N("forgot_claycolumn", s, true); } } } if(GeoPC.playeractions.ConusBroken) { log("conus broken = " $ GeoPC.playeractions.ConusBroken); points3 = 0; f3 = f3 @ GeoPC.IL8N("conus_broken", s, false); } log(""); if(points3 >= (maxpoints3 - 10)) { f3 = GeoPC.IL8N("excellent_sondering", s, false) @ f3; } /// Check for scores under zero or above maximum if (points1 < 0) points1 = 0; if (points2 < 0) points2 = 0; if (points3 < 0) points3 = 0; if (points1 > maxpoints1) points1 = maxpoints1; if (points2 > maxpoints2) points2 = maxpoints2; if (points3 > maxpoints3) points3 = maxpoints3; Phase1Score.Caption = points1 $ "/" $ maxpoints1; Phase2Score.Caption = points2 $ "/" $ maxpoints2; Phase3Score.Caption = points3 $ "/" $ maxpoints3; percentage = float(points1 + points2 + points3) / float(maxpoints1 + maxpoints2 + maxpoints3) * 100.0; Resultaat.Caption = int(percentage) $ "%"; if (points1 > 15) Phase1Eval.Caption = L_Voldoende; else Phase1Eval.Caption = L_Onvoldoende; if (points2 > 16) Phase2Eval.Caption = L_Voldoende; else Phase2Eval.Caption = L_Onvoldoende; if (points3 > 45) Phase3Eval.Caption = L_Voldoende; else Phase3Eval.Caption = L_Onvoldoende; // remove first space from third feedback message if(Left(f3, 1) == " ") { f3 = Right(f3, Len(f3) - 1); } TextPhase1.SetContent( f1 ); TextPhase2.SetContent( f2 ); TextPhase3.SetContent( f3 ); } function bool ButtonClick(GUIComponent Sender) { if (Sender != None) { switch(Sender) { case CloseButton: GeoPC.GameOver(true); GeoPC.ClientCloseMenu(true); /// Start end animation: GeoPC.EndGameAnimation(); //GeoPC.GotoState('EndScene'); //Controller.OpenMenu("GeoInterface.MenuMainMenu"); break; } return true; } return false; } function bool OnDraw(Canvas MyCanvas) { local float x; local float y; Super.OnDraw(MyCanvas); return true; /// Draw line grid: /// To assist in button placement. for (y = 0; y <= 1.0; y = y + 0.1) { /// Horizontal line MyCanvas.SetPos(0, y * MyCanvas.SizeY); MyCanvas.DrawHorizontal( y * MyCanvas.SizeY, MyCanvas.SizeX ); for (x = 0; x <= 1.0; x = x + 0.1) { /// Vertical line; MyCanvas.SetPos(x * MyCanvas.SizeX, 0); MyCanvas.DrawVertical( x * MyCanvas.SizeX, MyCanvas.SizeX ) ; /// Draw text: MyCanvas.SetPos((x * MyCanvas.SizeX) + 4, (y * MyCanvas.SizeY) + 10); MyCanvas.DrawText("x: " $ x); MyCanvas.SetPos((x * MyCanvas.SizeX) + 4, (y * MyCanvas.SizeY) + 18); MyCanvas.DrawText("y: " $ y); } } return true; } defaultproperties { AllowSelect = false bAllowedAsLast=true bDisconnectOnOpen=false Begin Object Class=GeoFrame name=TDialogBackground WinWidth=0.8 WinHeight=0.88 WinLeft=0.1 WinTop=0.06 End Object Begin Object Class=GeoTitle name=TTitle OnClick=ButtonClick IniOption="TTitle" WinLeft=0.16 WinTop=0.13 WinWidth=0.65 End Object Begin Object Class=GeoButton name=TCloseButton OnClick=ButtonClick IniOption="TExitButton" WinLeft=0.67 WinTop=0.82 End Object Begin Object class=GeoLabel Name=TPhase1 IniOption="TPhase1" WinLeft=0.16 WinTop=0.27 WinHeight=0.05 WinWidth=0.3 TextFont="GeoNormalFont" End Object Begin Object class=GeoLabel Name=TPhase1Score IniOption="" WinLeft=0.75 WinTop=0.27 WinHeight=0.05 TextFont="GeoNormalFont" End Object Begin Object class=GeoLabel Name=TPhase1Eval IniOption="" WinLeft=0.65 WinTop=0.27 WinHeight=0.05 TextFont="GeoNormalFont" End Object Begin Object class=GeoMultiLineLabel name=TTextPhase1 WinWidth=0.58 WinLeft=0.16 WinTop=0.32 End Object Begin Object class=GeoLabel Name=TPhase2 IniOption="TPhase2" WinLeft=0.16 WinTop=0.41 WinHeight=0.05 WinWidth=0.6 TextFont="GeoNormalFont" End Object Begin Object class=GeoLabel Name=TPhase2Score IniOption="" WinLeft=0.75 WinTop=0.41 WinHeight=0.05 TextFont="GeoNormalFont" End Object Begin Object class=GeoLabel Name=TPhase2Eval IniOption="" WinLeft=0.65 WinTop=0.41 WinHeight=0.06 TextFont="GeoNormalFont" End Object Begin Object class=GeoMultiLineLabel name=TTextPhase2 WinWidth=0.58 WinLeft=0.16 WinTop=0.46 End Object Begin Object class=GeoLabel Name=TPhase3 IniOption="TPhase3" WinLeft=0.16 WinTop=0.57 WinHeight=0.05 WinWidth=0.6 TextFont="GeoNormalFont" End Object Begin Object class=GeoLabel Name=TPhase3Score IniOption="" WinLeft=0.75 WinTop=0.57 WinHeight=0.05 TextFont="GeoNormalFont" End Object Begin Object class=GeoLabel Name=TPhase3Eval IniOption="" WinLeft=0.65 WinTop=0.57 WinHeight=0.05 TextFont="GeoNormalFont" End Object Begin Object class=GeoMultiLineLabel name=TTextPhase3 WinWidth=0.58 WinLeft=0.16 WinTop=0.62 End Object Begin Object class=GeoLabel Name=TBeoordeling IniOption="TBeoordeling" WinLeft=0.16 WinTop=0.82 WinHeight=0.05 TextFont="GeoNormalFont" End Object Begin Object class=GeoLabel Name=TResultaat WinLeft=0.4 WinTop=0.82 WinHeight=0.05 TextFont="GeoNormalFont" End Object WinWidth=1 WinHeight=1 WinLeft=0 WinTop=0 Background=Texture'GeoDelft.BackGround0' DialogBackground = TDialogBackground Title = TTitle Phase1 = TPhase1 Phase2 = TPhase2 Phase3 = TPhase3 Phase1Score = TPhase1Score Phase2Score = TPhase2Score Phase3Score = TPhase3Score Phase1Eval = TPhase1Eval Phase2Eval = TPhase2Eval Phase3Eval = TPhase3Eval TextPhase1 = TTextPhase1 TextPhase2 = TTextPhase2 TextPhase3 = TTextPhase3 CloseButton = TCloseButton Beoordeling = TBeoordeling Resultaat = TResultaat }