package Roguelike.Save; import java.util.HashMap; import Roguelike.Ability.AbilityTree; import Roguelike.Ability.IAbility; import Roguelike.Dialogue.Dialogue; import Roguelike.Dialogue.DialogueManager; import Roguelike.Entity.GameEntity; import Roguelike.Global; import Roguelike.Items.Inventory; import Roguelike.StatusEffect.StatusEffect; import Roguelike.Tiles.Point; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.XmlReader; public final class SaveGameEntity extends SaveableObject<GameEntity> { public String fileName; public Array<XmlReader.Element> xmlData; public int hp; public int essence; public Point pos = new Point(); public boolean isPlayer = false; public int quality = 1; public Array<StatusEffect> statuses = new Array<StatusEffect>(); public Array<SaveAbilityTree> slottedAbilities = new Array<SaveAbilityTree>(); public Inventory inventory; public String UID; public Point spawnPoint; public HashMap<String, Integer> dialogueData; @Override public void store( GameEntity obj ) { fileName = obj.fileName; xmlData = obj.xmlData; hp = obj.HP; essence = obj.essence; pos.set( obj.tile[0][0].x, obj.tile[0][0].y ); for ( StatusEffect status : obj.statusEffects ) { statuses.add( status ); } inventory = obj.inventory; if (obj.dialogue != null) { dialogueData = obj.dialogue.data; } for ( AbilityTree a : obj.slottedAbilities ) { if (a != null) { SaveAbilityTree saveTree = new SaveAbilityTree(); saveTree.store( a ); slottedAbilities.add( saveTree ); } else { slottedAbilities.add( null ); } } UID = obj.UID; spawnPoint = obj.spawnPos; quality = obj.quality; } @Override public GameEntity create() { GameEntity entity = fileName != null ? GameEntity.load( fileName ) : GameEntity.load( xmlData ); entity.spawnPos = spawnPoint; entity.essence = essence; entity.HP = hp; entity.statusEffects.clear(); for ( StatusEffect saveStatus : statuses ) { entity.addStatusEffect( saveStatus ); } entity.processStatuses(); entity.inventory = inventory; for ( int i = 0; i < slottedAbilities.size; i++ ) { SaveAbilityTree saveTree = slottedAbilities.get( i ); if (entity.slottedAbilities.size <= i) { if (saveTree == null) { entity.slottedAbilities.add( null ); } else { entity.slottedAbilities.add( saveTree.create() ); entity.slottedAbilities.get( i ).current.current.setCaster( entity ); } } else { AbilityTree tree = entity.slottedAbilities.get( i ); if (tree == null) { if (saveTree != null) { entity.slottedAbilities.removeIndex( i ); entity.slottedAbilities.insert( i, saveTree.create() ); } } else { saveTree.writeData( tree ); } if (entity.slottedAbilities.get( i ) != null) { entity.slottedAbilities.get( i ).current.current.setCaster( entity ); } } } entity.UID = UID; if (entity.dialogue != null && dialogueData != null) { entity.dialogue.data = dialogueData; } entity.quality = quality; if (!isPlayer) { entity.applyDepthScaling(); } entity.isVariableMapDirty = true; return entity; } }