## XIII
Class XIIISaveGameTrigger

source: C:\XIII\XIII\Classes\XIIISaveGameTrigger.uc

    Core.Object
       |
       +--Engine.Actor
          |
          +--Engine.Triggers
             |
             +--XIII.XIIISaveGameTrigger

Direct Known Subclasses:None

class XIIISaveGameTrigger
extends Engine.Triggers

    //-----------------------------------------------------------
    //
    //-----------------------------------------------------------

Variables
`array` | `ActorsToDestroy`
`string` | `Description`
`int` | `IsEmpty`
`XIIIPlayerPawn` | `P`
`array` | `ProfileList`
`int` | `ReturnCode`
`string` | `SaveDescription`
`sound` | `SoundToLaunch`
`string` | `TeleporterName`
`int` | `i`

States
GoSaving, WaitingForColl

Function Summary
`void` | `CleanMap()`
    //____________________________________________________________________
    // Get rid of all actors in my list ActorsToDestroy, meant to optimize (for checkpoints we are sure are no-return)

State GoSaving Function Summary
`void` | `DoSave()`
    // Save Game upon touch by pawn if context-ok.
`bool` | `PrepareSave()`

State WaitingForColl Function Summary

Source Code

    00001	//-----------------------------------------------------------
    00002	//
    00003	//-----------------------------------------------------------
    00004	class XIIISaveGameTrigger extends Triggers;
    00005
    00006	var() /*localized*/ string SaveDescription;
    00007	var() string TeleporterName;
    00008	var XIIIPlayerPawn P;
    00009	var() array<Actor> ActorsToDestroy;
    00010	var() sound SoundToLaunch;
    00011	var transient int ReturnCode;
    00012	var transient array<string> ProfileList;
    00013	var transient int i;
    00014	var transient int IsEmpty;
    00015	var transient string Description;
    00016
    00017	//____________________________________________________________________
    00018	// Get rid of all actors in my list ActorsToDestroy, meant to optimize (for checkpoints we are sure are no-return)
    00019	function CleanMap()
    00020	{
    00021	    local int i;
    00022
    00023	    for (i=0; i<ActorsToDestroy.Length; i++)
    00024	    {
    00025	/*
    00026	      if ( ActorsToDestroy[i] != none ) // may be already destroyed
    00027	        ActorsToDestroy[i].Destroy();
    00028	*/
    00029	      if (ActorsToDestroy[i] != none)
    00030	      {
    00031	        if ( XIIIPawn(ActorsToDestroy[i]) == none )
    00032	          ActorsToDestroy[i].Destroy();
    00033	        else
    00034	        { // destroy only if not visible and not in player's hand
    00035	          if ( !P.Controller.CanSee(Pawn(ActorsToDestroy[i]))
    00036	          && ( XIIIPawn(ActorsToDestroy[i]) != P.LHand.pOnShoulder ) )
    00037	            ActorsToDestroy[i].Destroy();
    00038	        }
    00039	      }
    00040	    }
    00041	}
    00042
    00043	//____________________________________________________________________
    00044	auto state WaitingForColl
    00045	{
    00046	    event Touch(actor other) // should happen for checkpoints
    00047	    {
    00048	      P = XIIIPlayerPawn(Other);
    00049	      if ( (P != none) && !P.bIsDead )
    00050	        GotoState('GoSaving');
    00051	    }
    00052	    event Trigger( Actor Other, Pawn EventInstigator ) // should happen when entering map
    00053	    {
    00054	      P = XIIIPlayerPawn(EventInstigator);
    00055	      if ( (P != none) && !P.bIsDead )
    00056	        GotoState('GoSaving');
    00057	    }
    00058	}
    00059
    00060	//____________________________________________________________________
    00061	state GoSaving
    00062	{
    00063	    function bool PrepareSave()
    00064	    {
    00065	      local XIIIThingsToSave S;
    00066	      local Array<string> Profile;
    00067	      local int i;
    00068
    00069	      S = XIIIThingsToSave(P.FindInventoryType(class'XIIIThingsToSave'));
    00070	      if ( S!=none && (S.XIIISaveGameTriggerTag==Tag) )
    00071	      {
    00072	        log("SAVE: "$self$" Destroying because XIIIThingsToSave exists in pawn inventory and Tag matches our");
    00073	        Destroy();
    00074	        return false;
    00075	      }
    00076	      return true;
    00077	    }
    00078	    // Save Game upon touch by pawn if context-ok.
    00079	    function DoSave()
    00080	    {
    00081	        local int MaxSlot, i;
    00082	        local NavigationPoint T;
    00083	        local XIIIThingsToSave S;
    00084	        local string St;
    00085	        local mapinfo MI;
    00086	        local XIIIGameInfo GI;
    00087
    00088	        log(":SAVE: "$self);
    00089
    00090	        S = XIIIThingsToSave(P.FindInventoryType(class'XIIIThingsToSave'));
    00091	        if ( S != none )
    00092	            S.Destroy();
    00093
    00094	        S = Spawn(class'XIIIThingsToSave',,,P.Location);
    00095	        if ( S == none )
    00096	        {
    00097	            Log(" ---: Pb, couldn't create XIIIThingsToSave...");
    00098	            return;
    00099	        }
    00100	        MI = XIIIGameInfo(Level.Game).MapInfo;
    00101	        if ( MI == none )
    00102	        {
    00103	            ForEach AllActors(class'MapInfo', MI)
    00104	                Break;
    00105	        }
    00106	        GI = XIIIGameInfo(Level.Game);
    00107
    00108	        S.GiveTo(P);
    00109	        S.XIIISaveGameTriggerTag = Tag;
    00110	        S.Health = P.Health;
    00111	        S.SpeedFactorLimit = P.SpeedFactorLimit;
    00112	        S.SoundToLaunch = SoundToLaunch;
    00113	        if (GI == none)
    00114	        {
    00115	            S.CheckpointNumber = 0;
    00116	        }
    00117	        else
    00118	        {
    00119	            GI.CheckpointNumber++;
    00120	            S.CheckpointNumber = GI.CheckpointNumber;
    00121	        }
    00122
    00123	        for ( i=0; i<MI.Objectif.Length ; i++ )
    00124	        {
    00125	            S.ObjectivesState.Length = S.ObjectivesState.Length + 1;
    00126	            S.ObjectivesState[i].bCompleted = MI.Objectif[i].bCompleted;
    00127	            S.ObjectivesState[i].bPrimary = MI.Objectif[i].bPrimary;
    00128	            S.ObjectivesState[i].bAntiGoal = MI.Objectif[i].bAntiGoal;
    00129	        }
    00130
    00131	        /* ELR No use as dialogs will not be saved between maps
    00132	        // MLK: Saving dialog states
    00133	        for ( i=0; i<MI.DialogToSave.Length ; i++ )
    00134	        {
    00135	        S.DialogToSave.Length++;
    00136	        S.DialogToSave[i].Lineind = MI.DialogToSave[i].Lineind;
    00137	        S.DialogToSave[i].Speakerind = MI.DialogToSave[i].Speakerind;
    00138	        }
    00139	        */
    00140
    00141	        Log("   -: XIIIThingsToSave have tag "$S.XIIISaveGameTriggerTag);
    00142
    00143	        if ( TeleporterName != "" )
    00144	        {
    00145	            foreach allactors(class'NavigationPoint', T, name(TeleporterName))
    00146	                break;
    00147	            if (T == none)
    00148	                Log(" ---: Beware, var TeleporterName ("$TeleporterName$") don't match any NavigationPoint Tag");
    00149	        }
    00150	        else
    00151	            Log(" ---: Beware, var TeleporterName ("$TeleporterName$") empty");
    00152
    00153	        //        St = P.Controller.PlayerReplicationInfo.PlayerName$"-"$Level.Title$"-"$SaveDescription;
    00154	        St = /*Level.Title$"-"$*/SaveDescription;
    00155	        XIIICheatManager(PlayerController(P.Controller).CheatManager).LogInventory();
    00156
    00157	        if ( SaveAtCheckpoint(TeleporterName, St) )
    00158	        {
    00159	            Log(" ---: Game Saved at checkpoint, TeleporterName="$TeleporterName$" & SaveDescription="$St);
    00160	            //P.ReceiveLocalizedMessage( class'XIIISaveMessage', 3, P.Controller.PlayerReplicationInfo, none, self );
    00161	        }
    00162	        else
    00163	        {
    00164	            Log(" ---: ERROR Unable to save game at checkpoint, TeleporterName="$TeleporterName$" & SaveDescription="$St);
    00165	            //P.ReceiveLocalizedMessage( class'XIIISaveMessage', 5, P.Controller.PlayerReplicationInfo, none, self );
    00166	        }
    00167
    00168	        S.Destroy();
    00169	        log(":ENDSAVE:");
    00170	        //Destroy();      // for the test, it was moved at the end of the state code
    00171	    }
    00172	Begin:
    00173	  if ( PrepareSave() )
    00174	  {
    00175	    P.ReceiveLocalizedMessage( class'XIIISaveMessage', 1, P.Controller.PlayerReplicationInfo, none, self );
    00176	    CleanMap();
    00177	    DoSave();
    00178	    //Sleep(1.0);
    00179	    //P.ReceiveLocalizedMessage( class'XIIISaveMessage', 2, P.Controller.PlayerReplicationInfo, none, self );
    00180	  }
    00181
    00182
    00183	  // TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
    00184	  /*
    00185	  if (!RequestGetProfileList())
    00186	  {
    00187	      log("Unable to get profile list");
    00188	  }
    00189	  else
    00190	  {
    00191	      log ("GetProfileList requested. Waiting for completion");
    00192	      while (!IsGetProfileListFinished(ReturnCode,ProfileList))
    00193	      {
    00194	          Sleep(0.1);
    00195	      }
    00196	      if (ReturnCode<0) log ("Failure: Profile list not obtained");
    00197	      else
    00198	      {
    00199	          log ("List of Profiles:");
    00200	          for (ReturnCode=0; ReturnCode<ProfileList.Length; ReturnCode++)
    00201	          {
    00202	              log("    "$ProfileList[ReturnCode]);
    00203	          }
    00204	      }
    00205	  }*/
    00206
    00207	    /*
    00208	  if (!RequestCreateProfile("Tata"))
    00209	  {
    00210	      log ("Unable to Create profile for Tata");
    00211	  }
    00212	  else
    00213	  {
    00214	      log ("CreateProfile requested for Tata. Waiting for completion");
    00215	      while (!IsCreateProfileFinished(ReturnCode))
    00216	      {
    00217	          Sleep(0.1);
    00218	      }
    00219	      if (ReturnCode<0) log ("Failure: Profile not created for Tata");
    00220	      else log ("Profile created successfully for Tata");
    00221	  }
    00222	  */
    00223
    00224	  /*
    00225	  if (!RequestGetProfileList())
    00226	  {
    00227	      log("Unable to get profile list");
    00228	  }
    00229	  else
    00230	  {
    00231	      log ("GetProfileList requested. Waiting for completion");
    00232	      while (!IsGetProfileListFinished(ReturnCode,ProfileList))
    00233	      {
    00234	          Sleep(0.1);
    00235	      }
    00236	      if (ReturnCode<0) log ("Failure: Profile list not obtained");
    00237	      else
    00238	      {
    00239
log ("List of Profiles:"); 00240 for (ReturnCode=0; ReturnCode<ProfileList.Length; ReturnCode++) 00241 { 00242 log(" "$ProfileList[ReturnCode]); 00243 } 00244 } 00245 } 00246 */ 00247 00248 /* 00249 if (!RequestUseProfile("Tata")) 00250 { 00251 log ("Unable to use profile Tata"); 00252 } 00253 else 00254 { 00255 log ("UseProfile requested for Tata. Waiting for completion"); 00256 while (!IsUseProfileFinished(ReturnCode)) 00257 { 00258 Sleep(0.1); 00259 } 00260 if (ReturnCode<0) log ("Failure: Profile Tata cannot be used"); 00261 else log ("Profile Tata is beeing used"); 00262 } 00263 00264 00265 for (i=0; i<GetMaxNumberOfSavingSlots(); i++) 00266 { 00267 if (!RequestIsSlotEmpty(i)) 00268 { 00269 log("Slot "$i$": Error: unable to access"); 00270 } 00271 else 00272 { 00273 while (!IsSlotEmptyFinished(ReturnCode, IsEmpty)) 00274 { 00275 Sleep(0.1); 00276 } 00277 if (ReturnCode < 0) 00278 { 00279 log("Slot "$i$": Error2: access failed"); 00280 } 00281 else 00282 { 00283 if (bool(IsEmpty)) 00284 { 00285 log("Slot "$i$": <EMPTY>"); 00286 } 00287 else 00288 { 00289 if (!RequestGetSlotContentDescription(i)) 00290 { 00291 log("Slot "$i$": Error3: not empty, but unable to get the description"); 00292 } 00293 else 00294 { 00295 while (!IsGetSlotContentDescriptionFinished(ReturnCode, Description)) 00296 { 00297 Sleep(0.1); 00298 } 00299 if (ReturnCode < 0) 00300 { 00301 log("Slot "$i$": Error4: get description failed"); 00302 } 00303 else 00304 { 00305 log("Slot "$i$": "$Description); 00306 } 00307 } 00308 } 00309 } 00310 } 00311 } 00312 */ 00313 00314 /* 00315 if (!RequestWriteSlot(5, "Test 2 SauvegardE")) 00316 { 00317 log("Unable to save in slot 5"); 00318 } 00319 else 00320 { 00321 while (!IsWriteSlotFinished(ReturnCode)) 00322 { 00323 Sleep(0.1); 00324 } 00325 if (ReturnCode < 0) 00326 { 00327 log("FAILED to save in slot 5"); 00328 } 00329 else 00330 { 00331 log("Game successfully saved in slot 5"); 00332 } 00333 } 00334 */ 00335 00336 //if (!ReadSlot(5)) 00337 //{ 00338 // log("Unable to load game in slot 5"); 00339 //} 00340 00341 /* 00342 if (!RequestWriteUserConfig()) 00343 { 00344 log("Unable to write use config !"); 00345 } 00346 else 00347 { 00348 while (!IsWriteUserConfigFinished(ReturnCode)) 00349 { 00350 Sleep(0.1); 00351 } 00352 if (ReturnCode < 0) 00353 { 00354 log("Failed to write user config !"); 00355 } 00356 else 00357 { 00358 log("user config successfull written"); 00359 } 00360 } 00361 */ 00362 00363 /* 00364 if (!RequestReadUserConfig()) 00365 { 00366 log("Unable to read use config !"); 00367 } 00368 else 00369 { 00370 while (!IsReadUserConfigFinished(ReturnCode)) 00371 { 00372 Sleep(0.1); 00373 } 00374 if (ReturnCode < 0) 00375 { 00376 log("Failed to read user config !"); 00377 } 00378 else 00379 { 00380 log("user config successfull read"); 00381 } 00382 } 00383 */ 00384 00385 00386 Destroy(); 00387 } 00388 00389 defaultproperties 00390 { 00391 TeleporterName="PlayerStart" 00392 }

End Source Code