I am not sure what you mean by "triangulation".  There is no such thing here.  It's just reading values from static memory addresses.
It's too much messing to say how the savestate works - but suffice to say, I backup the Savemap and temp map 
SaveMapArray: Array [0..$10F6] of byte;
LastSaveMapArray: Array [0..$10F6] of byte;
TempBankArray: Array [0..$FF] of byte;
LastTempBankArray: Array [0..$FF] of byte;
SaveMap = $DBFD38;  //Save map ends DC0E2C /Bank1/2 starts  DC08DC
TempBank = $CC14D0;
and then restore it before calling the operation that initiates a field / wm jump. The game engine does the rest.  This will never be fool proof, because the game engine was never designed to be loaded in-between scenes and so on.  It can break the game in certain places, but generally it works very well - especially for debugging purposes.  There is no easy method for "save state saving".  I invented my own format and procedure for doing it.
   Case TargetModule Of
        1: begin // Field to Field
           Wword($CC0D8A,pWord(@FieldArray[254]) ^); //Screen ID
           Wsint($CC0D8C,pLongint(@FieldArray[0 + (15 * CharacterID)])^ div 4096); //X
           Wsint($CC0D8E,pLongint(@FieldArray[4 + (15 * CharacterID)])^ div 4096); //Y
           Wword($CC0DAA,pWord(@FieldArray[12 + (15 * CharacterID)])^ );           //T
           Wbyte($CC0DAC,pByte(@FieldArray[14 + (15 * CharacterID)])^ );           //D
           end;
        3: Wword($CC0D8A, 45); // Set jump to World Map
        4: Wword($CC0D8A, 30); // Set jump to Submarine
        5: Wword($CC0D8A, 60); // Set jump to Snowfield
          else
        End;
      Wbyte($CC0D89, 1); // Initiate Field jump
      
      end else // Current location is world map
           if TargetModule = 1 then // World Map to Field
           begin
           Wword($CC0D8A,pWord(@FieldArray[254]) ^); //Screen ID
           Wsint($CC0D8C,pLongint(@FieldArray[0 + (15 * CharacterID)])^ div 4096); //X
           Wsint($CC0D8E,pLongint(@FieldArray[4 + (15 * CharacterID)])^ div 4096); //Y
           Wword($CC0DAA,pWord(@FieldArray[12 + (15 * CharacterID)])^ );           //T
           Wbyte($CC0DAC,pByte(@FieldArray[14 + (15 * CharacterID)])^ );           //D
           Wbyte($CC1644, 0); //may not be needed, but setting to 0 just in case.
           Wbyte($E3A884, 0); //This decides the type of jump. 00 = field/normal world map jump. 01 = Battle. 02 = fmv.
                               //Battle ID is set at E3A88C
           Wbyte($E045E4, 3); //Initiate wm jump - Wbyte($E045F0, 1);
                               // 03 = jump to field. 04 = jump to submerged submarine. 05 = Jump to World map. 
           end;
I'd help more but I am really busy with The Reunion.