package Ġcom . ly ee ed ar . Game Ċ Ċ import Ġcom . badlogic . gdx . G dx Ċ import Ġcom . es ot eric software . k ry o . K ry o Ċ import Ġcom . es ot eric software . k ry o . io . Input Ċ import Ġcom . es ot eric software . k ry o . io . Output Ċ import Ġcom . ly ee ed ar . Card . Card Ċ import Ġcom . ly ee ed ar . Card . Card Content . Card Content Ċ import Ġcom . ly ee ed ar . Screen Enum Ċ import Ġcom . ly ee ed ar . Scre ens .* Ċ import Ġcom . ly ee ed ar . Util . Settings Ċ import Ġcom . ly ee ed ar . Util . Statics Ċ import Ġcom . ly ee ed ar . Util . register G dx Serial is ers Ċ import Ġcom . ly ee ed ar . Util . register Ly ee ed ar Serial is ers Ċ import Ġjava . util . zip . GZIP InputStream Ċ import Ġjava . util . zip . GZIP OutputStream Ċ Ċ class ĠSave Ċ { Ċ ĉ comp anion Ġobject Ċ ĉ { Ċĉ ĉ val Ġk ry o : ĠK ry o Ġby Ġlazy Ġ{ Ġinit K ry o () Ġ} Ċĉ ĉ fun Ġinit K ry o (): ĠK ry o Ċĉ ĉ { Ċĉĉ ĉ val Ġk ry o Ġ= ĠK ry o () Ċĉĉ ĉ k ry o . is Registration Required Ġ= Ġfalse ĊĊĉĉ ĉ k ry o . register G dx Serial is ers () Ċĉĉ ĉ k ry o . register Ly ee ed ar Serial is ers () ĊĊĉĉ ĉ return Ġk ry o Ċĉ ĉ } ĊĊĉ ĉ fun Ġsave () Ċĉ ĉ { Ċĉĉ ĉ if Ġ( Global . resolve Instant ly ) Ġreturn Ċĉĉ ĉ if Ġ( do ing Load ) Ġreturn ĊĊĉĉ ĉ Statics . logger . log Debug (" Saving ") ĊĊĉĉ ĉ val Ġoutput TempFile Ġ= ĠG dx . files . local (" save . dat . temp ") ĊĊĉĉ ĉ val Ġoutput : ĠOutput Ċĉĉ ĉ try Ċĉĉ ĉ { Ċĉĉĉ ĉ output Ġ= ĠOutput ( GZIP OutputStream ( output TempFile . write ( false ))) Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠException ) Ċĉĉ ĉ { Ċĉĉĉ ĉ e . printStackTrace () Ċĉĉĉ ĉ output TempFile . delete () Ċĉĉĉ ĉ return Ċĉĉ ĉ } ĊĊĉĉ ĉ // ĠObtain Ġall Ġdata ĊĊĉĉ ĉ try Ċĉĉ ĉ { Ċĉĉĉ ĉ // ĠSave Ġall Ġdata Ċĉĉĉ ĉ output . writeString ( Statics . language ) Ċĉĉĉ ĉ Global . deck . save ( output ) Ċĉĉĉ ĉ Global . player . save ( k ry o , Ġoutput ) Ċĉĉĉ ĉ Global . global flags . save ( k ry o , Ġoutput ) Ċĉĉĉ ĉ Global . quest flags . save ( k ry o , Ġoutput ) Ċĉĉĉ ĉ Global . card flags . save ( k ry o , Ġoutput ) Ċĉĉĉ ĉ Statics . settings . save ( k ry o , Ġoutput ) ĊĊĉĉĉ ĉ val Ġcurrent Screen Ġ= ĠStatic s . game . current Screen Enum Ċĉĉĉ ĉ output . writeInt ( current Screen . ordinal ) ĊĊĉĉĉ ĉ if Ġ( current Screen Ġ== ĠScreen Enum . QUEST SELECTION ) Ċĉĉĉ ĉ { ĊĊĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġif Ġ( current Screen Ġ== ĠScreen Enum . DE CK ) Ċĉĉĉ ĉ { ĊĊĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġif Ġ( current Screen Ġ== ĠScreen Enum . NEW USER ) Ċĉĉĉ ĉ { ĊĊĉĉĉ ĉ } Ċĉĉĉ ĉ else Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ val Ġquest Screen Ġ= ĠStatic s . game . get Typed Screen < Quest Screen >() !! Ċĉĉĉĉ ĉ quest Screen . current Quest . save ( output ) ĊĊĉĉĉĉ ĉ if Ġ( current Screen Ġ== ĠScreen Enum . QUEST ) Ċĉĉĉĉ ĉ { ĊĊĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ val Ġcard Screen Ġ= ĠStatic s . game . get Typed Screen < Card Screen >() !! Ċĉĉĉĉĉ ĉ output . writeString ( card Screen . current Card . path ) ĊĊĉĉĉĉĉ ĉ card Screen . current Content . save ( k ry o , Ġoutput ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ output . close () ĊĊĉĉĉ ĉ val Ġcontents Ġ= Ġoutput TempFile . read Bytes () Ċĉĉĉ ĉ val ĠoutputFile Ġ= ĠG dx . files . local (" save . dat ") Ċĉĉĉ ĉ outputFile . write Bytes ( contents , Ġfalse ) Ċĉĉĉ ĉ output TempFile . delete () Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠException ) Ċĉĉ ĉ { Ċĉĉĉ ĉ output TempFile . delete () Ċĉĉĉ ĉ throw Ġe Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ var Ġdoing Load Ġ= Ġfalse Ċĉ ĉ fun Ġload (): ĠBoolean Ċĉ ĉ { Ċĉĉ ĉ do ing Load Ġ= Ġtrue Ċĉĉ ĉ var Ġinput : ĠInput ? Ġ= Ġnull ĊĊĉĉ ĉ try Ċĉĉ ĉ { Ċĉĉĉ ĉ val Ġsave File Handle Ġ= ĠG dx . files . local (" save . dat ") Ċĉĉĉ ĉ if Ġ(! save File Handle . exists ()) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ do ing Load Ġ= Ġfalse Ċĉĉĉĉ ĉ return Ġfalse Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ input Ġ= ĠInput ( GZIP InputStream ( save File Handle . read ())) ĊĊĉĉĉ ĉ // ĠLoad Ġall Ġdata Ċĉĉĉ ĉ val Ġlanguage Ġ= Ġinput . readString () Ċĉĉĉ ĉ val Ġdeck Ġ= ĠGlobal Deck . load ( input ) Ċĉĉĉ ĉ val Ġplayer Ġ= ĠPlayer . load ( k ry o , Ġinput , Ġdeck ) Ċĉĉĉ ĉ val Ġglobal Flags Ġ= ĠGameState Flags . load ( k ry o , Ġinput ) Ċĉĉĉ ĉ val Ġquest Flags Ġ= ĠGameState Flags . load ( k ry o , Ġinput ) Ċĉĉĉ ĉ val Ġcard Flags Ġ= ĠGameState Flags . load ( k ry o , Ġinput ) Ċĉĉĉ ĉ val Ġsettings Ġ= ĠSettings . load ( k ry o , Ġinput ) ĊĊĉĉĉ ĉ val Ġcurrent Screen Ġ= ĠScreen Enum . values ()[ input . readInt ()] ĊĊĉĉĉ ĉ // ĠIf Ġsuccessful Ġset Ġdata Ġto Ġactive Ġobjects Ċĉĉĉ ĉ Statics . language Ġ= Ġlanguage Ċĉĉĉ ĉ Global . deck Ġ= Ġdeck Ċĉĉĉ ĉ Global . player Ġ= Ġplayer Ċĉĉĉ ĉ Global . global flags Ġ= Ġglobal Flags Ċĉĉĉ ĉ Global . quest flags Ġ= Ġquest Flags Ċĉĉĉ ĉ Global . card flags Ġ= Ġcard Flags Ċĉĉĉ ĉ Statics . settings Ġ= Ġsettings ĊĊĉĉĉ ĉ if Ġ( current Screen Ġ== ĠScreen Enum . QUEST SELECTION ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ val Ġscreen Ġ= ĠStatic s . game . get Typed Screen < Quest Selection Screen >() !! Ċĉĉĉĉ ĉ screen . swap To () Ċĉĉĉĉ ĉ screen . setup () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġif Ġ( current Screen Ġ== ĠScreen Enum . DE CK ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ val Ġscreen Ġ= ĠStatic s . game . get Typed Screen < Deck Screen >() !! Ċĉĉĉĉ ĉ screen . swap To () Ċĉĉĉĉ ĉ screen . setup () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġif Ġ( current Screen Ġ== ĠScreen Enum . NEW USER ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ val Ġscreen Ġ= ĠStatic s . game . get Typed Screen < New User Screen >() !! Ċĉĉĉĉ ĉ screen . swap To () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ val Ġcurrent Quest Ġ= ĠQuest . load ( input ) Ċĉĉĉĉ ĉ Global . deck . quest s . replace ( current Quest ) ĊĊĉĉĉĉ ĉ val Ġquest Screen Ġ= ĠStatic s . game . get Typed Screen < Quest Screen >() !! Ċĉĉĉĉ ĉ quest Screen . setup ( current Quest ) ĊĊĉĉĉĉ ĉ if Ġ( current Screen Ġ== ĠScreen Enum . QUEST ) Ċĉĉĉĉ ĉ { ĊĊĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ val Ġcurrent Card Path Ġ= Ġinput . readString () Ċĉĉĉĉĉ ĉ val Ġcurrent Card Ġ= ĠCard . Companion . load ( current Card Path ) Ċĉĉĉĉĉ ĉ Global . deck . en counters . replace ( current Card ) ĊĊĉĉĉĉĉ ĉ val Ġcontent Ġ= ĠCard Content . load ( k ry o , Ġinput ) ĊĊĉĉĉĉĉ ĉ val Ġcard Screen Ġ= ĠStatic s . game . get Typed Screen < Card Screen >() !! Ċĉĉĉĉĉ ĉ card Screen . swap To () Ċĉĉĉĉĉ ĉ card Screen . setup ( current Card , Ġcurrent Quest , Ġfalse , Ġcontent ) Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ // Ġtry Ġsw apping Ġto Ġthe Ġdesired Ġscreen Ċĉĉĉĉ ĉ val Ġscreens Ġ= ĠarrayOf ( Screen Enum . GRID , ĠScreen Enum . CARD , ĠScreen Enum . QUEST , ĠScreen Enum . QUEST SELECTION ) Ċĉĉĉĉ ĉ val Ġcurrent Ġ= Ġscreens . indexOf ( current Screen ) ĊĊĉĉĉĉ ĉ for Ġ( i Ġin Ġcurrent Ġuntil Ġscreens . size ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ try Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ Statics . game . switch Screen ( screens [ i ]) Ċĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ catch Ġ( ex : ĠException ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ(! Statics . release ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ throw Ġex Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( ex : ĠException ) Ċĉĉ ĉ { Ċĉĉĉ ĉ if Ġ(! Statics . release ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ throw Ġex Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ do ing Load Ġ= Ġfalse Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ } Ċĉĉ ĉ finally Ċĉĉ ĉ { Ċĉĉĉ ĉ input ?. close () Ċĉĉ ĉ } ĊĊĉĉ ĉ do ing Load Ġ= Ġfalse Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } Ċ ĉ } Ċ }