diff --git a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java
index aa56d5009..5c20a2b36 100644
--- a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java
+++ b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java
@@ -32,7 +32,7 @@ public final class AndorsTrailApplication extends Application {
public static final boolean IS_RELEASE_VERSION = !CURRENT_VERSION_DISPLAY.matches(".*[a-d].*");
public static final boolean DEVELOPMENT_INCOMPATIBLE_SAVEGAMES = DEVELOPMENT_DEBUGRESOURCES || DEVELOPMENT_DEBUGBUTTONS || DEVELOPMENT_FASTSPEED || !IS_RELEASE_VERSION;
public static final int DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION = 999;
- public static final int CURRENT_VERSION = DEVELOPMENT_INCOMPATIBLE_SAVEGAMES ? DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION : 74;
+ public static final int CURRENT_VERSION = DEVELOPMENT_INCOMPATIBLE_SAVEGAMES ? DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION : 75;
private final AndorsTrailPreferences preferences = new AndorsTrailPreferences();
private WorldContext world = new WorldContext();
diff --git a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/activity/LoadSaveActivity.java b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/activity/LoadSaveActivity.java
index e2fb26f3d..2eb364bed 100644
--- a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/activity/LoadSaveActivity.java
+++ b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/activity/LoadSaveActivity.java
@@ -22,11 +22,15 @@ import android.os.Build;
import android.os.Bundle;
import androidx.annotation.RequiresApi;
import androidx.documentfile.provider.DocumentFile;
+
+import android.text.InputType;
+import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
+import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
@@ -55,6 +59,8 @@ public final class LoadSaveActivity extends AndorsTrailBaseActivity implements O
private ModelContainer model;
private TileManager tileManager;
private AndorsTrailPreferences preferences;
+ private String newSaveName;
+ private LayoutParams save_name_inputParams;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -85,6 +91,9 @@ public final class LoadSaveActivity extends AndorsTrailBaseActivity implements O
Button slotTemplateButton = (Button) findViewById(R.id.loadsave_slot_n);
LayoutParams params = slotTemplateButton.getLayoutParams();
slotList.removeView(slotTemplateButton);
+ EditText save_name_inputTemplateEditText = (EditText) findViewById(R.id.save_name_input);
+ save_name_inputParams = slotTemplateButton.getLayoutParams();
+ slotList.removeView(save_name_inputTemplateEditText);
ViewGroup newSlotContainer = (ViewGroup) findViewById(R.id.loadsave_save_to_new_slot_container);
Button createNewSlot = (Button) findViewById(R.id.loadsave_save_to_new_slot);
@@ -216,9 +225,9 @@ public final class LoadSaveActivity extends AndorsTrailBaseActivity implements O
} else if (slot < SLOT_NUMBER_FIRST_SLOT) {
slot = SLOT_NUMBER_FIRST_SLOT;
}
-
i.putExtra("slot", slot);
if (success) {
+ i.putExtra(Constants.SAVEGAME_NAME_INTENT_EXTRA, newSaveName);
setResult(Activity.RESULT_OK, i);
} else {
setResult(Activity.RESULT_CANCELED, i);
@@ -312,7 +321,7 @@ public final class LoadSaveActivity extends AndorsTrailBaseActivity implements O
if (message != null) {
showConfirmOverwriteQuestion(slot, message);
} else {
- completeLoadSaveActivity(slot);
+ showNameSaveQuestion(slot);
}
}
@@ -866,7 +875,33 @@ public final class LoadSaveActivity extends AndorsTrailBaseActivity implements O
null,
true);
- CustomDialogFactory.addButton(d, android.R.string.yes, v -> completeLoadSaveActivity(slot));
+ CustomDialogFactory.addButton(d, android.R.string.ok, v -> showNameSaveQuestion(slot));
+ CustomDialogFactory.addDismissButton(d, android.R.string.no);
+ CustomDialogFactory.show(d);
+ }
+
+ private void showNameSaveQuestion(final int slot) {
+ final String title = getString(R.string.loadsave_save_name_question);
+ final EditText input = new EditText(this);
+ input.setLayoutParams(save_name_inputParams);
+ input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
+ final CustomDialog d = CustomDialogFactory.createDialog(this,
+ title,
+ getResources().getDrawable(android.R.drawable.ic_menu_save),
+ null,
+ input,
+ true);
+
+ CustomDialogFactory.addButton(d, android.R.string.ok, v -> {
+ final String name = input.getText().toString();
+ Log.d("com.gpl.rpg.AndorsTrail.beta2", "showNameSaveQuestion: ");
+ if (name.length() == 0) {
+ Toast.makeText(this, getString(R.string.loadsave_save_name_empty), Toast.LENGTH_SHORT).show();
+ }else {
+ Toast.makeText(this, getString(R.string.loadsave_save_name_filled, name), Toast.LENGTH_SHORT).show();
+ }
+ newSaveName = name;
+ completeLoadSaveActivity(slot);});
CustomDialogFactory.addDismissButton(d, android.R.string.no);
CustomDialogFactory.show(d);
}
diff --git a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/activity/MainActivity.java b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/activity/MainActivity.java
index 17bb2c7dc..a02694479 100644
--- a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/activity/MainActivity.java
+++ b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/activity/MainActivity.java
@@ -148,7 +148,8 @@ public final class MainActivity
case INTENTREQUEST_SAVEGAME:
if (resultCode != Activity.RESULT_OK) break;
final int slot = data.getIntExtra("slot", 1);
- if (save(slot)) {
+ final String saveName = data.getStringExtra(Constants.SAVEGAME_NAME_INTENT_EXTRA);
+ if (save(slot, saveName)) {
Toast.makeText(this, getResources().getString(R.string.menu_save_gamesaved, slot), Toast.LENGTH_SHORT).show();
if (!world.model.statistics.hasUnlimitedSaves()) {
finish();
@@ -161,7 +162,10 @@ public final class MainActivity
}
private boolean save(int slot) {
- return Savegames.saveWorld(world, this, slot);
+ return save(slot, null);
+ }
+ private boolean save(int slot, String saveName) {
+ return Savegames.saveWorld(world, this, slot, saveName);
}
@Override
diff --git a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/controller/Constants.java b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/controller/Constants.java
index 6e0fe9287..03a7f310c 100644
--- a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/controller/Constants.java
+++ b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/controller/Constants.java
@@ -42,6 +42,7 @@ public final class Constants {
public static final String PREFERENCE_MODEL_LASTRUNVERSION = "lastversion";
public static final String FILENAME_SAVEGAME_QUICKSAVE = "savegame";
+ public static final String SAVEGAME_NAME_INTENT_EXTRA = "savegame_name";
public static final String FILENAME_SAVEGAME_DIRECTORY = "andors-trail";
public static final String FILENAME_WORLDMAP_DIRECTORY = "worldmap";
public static final String FILENAME_WORLDMAP_HTMLFILE_PREFIX = "worldmap_";
diff --git a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/savegames/Savegames.java b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/savegames/Savegames.java
index caf3567cd..60685426f 100644
--- a/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/savegames/Savegames.java
+++ b/AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/savegames/Savegames.java
@@ -47,7 +47,7 @@ public final class Savegames {
, cheatingDetected
}
- public static boolean saveWorld(WorldContext world, Context androidContext, int slot) {
+ public static boolean saveWorld(WorldContext world, Context androidContext, int slot, String saveName) {
try {
final String displayInfo = androidContext.getString(R.string.savegame_currenthero_displayinfo, world.model.player.getLevel(), world.model.player.getTotalExperience(), world.model.player.getGold());
if (slot != SLOT_QUICKSAVE && !world.model.statistics.hasUnlimitedSaves()) {
@@ -59,7 +59,7 @@ public final class Savegames {
// Create the savegame in a temporary memorystream first to ensure that the savegame can
// be created correctly. We don't want to trash the user's file unneccessarily if there is an error.
ByteArrayOutputStream bos = new ByteArrayOutputStream();
- saveWorld(world, bos, displayInfo);
+ saveWorld(world, bos, displayInfo, saveName);
byte[] savegame = bos.toByteArray();
bos.close();
@@ -108,7 +108,7 @@ public final class Savegames {
fos.close();
if (result == LoadSavegameResult.success && slot != SLOT_QUICKSAVE && !world.model.statistics.hasUnlimitedSaves()) {
// save to the quicksave slot before deleting the file
- if (!saveWorld(world, androidContext, SLOT_QUICKSAVE)) {
+ if (!saveWorld(world, androidContext, SLOT_QUICKSAVE, fh.saveName)) {
return LoadSavegameResult.unknownError;
}
getSlotFile(slot, androidContext).delete();
@@ -210,14 +210,16 @@ public final class Savegames {
}
- public static void saveWorld(WorldContext world, OutputStream outStream, String displayInfo) throws IOException {
+ public static void saveWorld(WorldContext world, OutputStream outStream, String displayInfo, String saveName) throws IOException {
DataOutputStream dest = new DataOutputStream(outStream);
+ final String savegameName = saveName == null ? "" : saveName;
FileHeader.writeToParcel(dest, world.model.player.getName(),
displayInfo, world.model.player.iconID,
world.model.statistics.isDead(),
world.model.statistics.hasUnlimitedSaves(),
world.model.player.id,
- world.model.player.savedVersion);
+ world.model.player.savedVersion,
+ savegameName);
world.maps.writeToParcel(dest, world);
world.model.writeToParcel(dest);
dest.close();
@@ -334,9 +336,10 @@ public final class Savegames {
public final boolean hasUnlimitedSaves;
public final String playerId;
public final long savedVersion;
+ public final String saveName;
public String describe() {
- return (fileversion == AndorsTrailApplication.DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION ? "(D) " : "") + playerName + ", " + displayInfo;
+ return (fileversion == AndorsTrailApplication.DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION ? "(D) " : "") + (saveName == null || saveName.equals("") ? "" : "[" + saveName + "] ") + playerName + ", " + displayInfo;
}
@@ -378,9 +381,14 @@ public final class Savegames {
this.playerId = "";
this.savedVersion = 0;
}
+ if(fileversion >= 75) {
+ this.saveName = src.readUTF();
+ } else {
+ this.saveName = "";
+ }
}
- public static void writeToParcel(DataOutputStream dest, String playerName, String displayInfo, int iconID, boolean isDead, boolean hasUnlimitedSaves, String playerId, long savedVersion) throws IOException {
+ public static void writeToParcel(DataOutputStream dest, String playerName, String displayInfo, int iconID, boolean isDead, boolean hasUnlimitedSaves, String playerId, long savedVersion, String saveName) throws IOException {
dest.writeInt(AndorsTrailApplication.CURRENT_VERSION);
dest.writeUTF(playerName);
dest.writeUTF(displayInfo);
@@ -389,6 +397,7 @@ public final class Savegames {
dest.writeBoolean(hasUnlimitedSaves);
dest.writeUTF(playerId);
dest.writeLong(savedVersion);
+ dest.writeUTF(saveName);
}
}
}
diff --git a/AndorsTrail/res/layout/loadsave.xml b/AndorsTrail/res/layout/loadsave.xml
index cdb154754..29d7b8fcc 100644
--- a/AndorsTrail/res/layout/loadsave.xml
+++ b/AndorsTrail/res/layout/loadsave.xml
@@ -46,6 +46,13 @@
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
/>
+
diff --git a/AndorsTrail/res/values/strings.xml b/AndorsTrail/res/values/strings.xml
index dc2f28116..7db9ae41d 100644
--- a/AndorsTrail/res/values/strings.xml
+++ b/AndorsTrail/res/values/strings.xml
@@ -13,6 +13,9 @@
Save game
Load saved game
Select slot
+ The entered name was empty
+ Saving under name: \'%1$s\'
+ Input save name (or leave empty)
level %1$d, %2$d exp, %3$d gold
Loading resources…