mirror of
https://github.com/OMGeeky/andors-trail.git
synced 2026-02-23 15:38:29 +01:00
Persist inventories of vendors in savegame. Reset them when the map respawns.
This commit is contained in:
@@ -12,6 +12,7 @@ import android.content.Intent;
|
||||
import android.content.DialogInterface.OnDismissListener;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
@@ -37,6 +38,7 @@ import com.gpl.rpg.AndorsTrail.activity.ShopActivity;
|
||||
import com.gpl.rpg.AndorsTrail.activity.SkillInfoActivity;
|
||||
import com.gpl.rpg.AndorsTrail.activity.StartScreenActivity;
|
||||
import com.gpl.rpg.AndorsTrail.context.ViewContext;
|
||||
import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
import com.gpl.rpg.AndorsTrail.controller.Controller;
|
||||
import com.gpl.rpg.AndorsTrail.controller.ItemController;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType;
|
||||
@@ -71,40 +73,48 @@ public final class Dialogs {
|
||||
*/
|
||||
|
||||
public static void showKeyArea(final MainActivity currentActivity, final ViewContext context, String phraseID) {
|
||||
showConversation(currentActivity, context, phraseID, "");
|
||||
showConversation(currentActivity, context, phraseID, null);
|
||||
}
|
||||
|
||||
public static void showMapSign(final MainActivity currentActivity, final ViewContext context, String phraseID) {
|
||||
showConversation(currentActivity, context, phraseID, "");
|
||||
showConversation(currentActivity, context, phraseID, null);
|
||||
}
|
||||
|
||||
public static void showConversation(final MainActivity currentActivity, final ViewContext context, final String phraseID, final Monster npc) {
|
||||
showConversation(currentActivity, context, phraseID, npc.monsterTypeID);
|
||||
}
|
||||
|
||||
private static void showConversation(final MainActivity currentActivity, final ViewContext context, final String phraseID, String monsterTypeID) {
|
||||
context.gameRoundController.pause();
|
||||
Intent intent = new Intent(currentActivity, ConversationActivity.class);
|
||||
Uri.Builder b = Uri.parse("content://com.gpl.rpg.AndorsTrail/conversation/" + phraseID).buildUpon();
|
||||
b.appendQueryParameter("monsterTypeID", monsterTypeID);
|
||||
intent.setData(b.build());
|
||||
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/conversation/" + phraseID));
|
||||
addMonsterIdentifiers(intent, npc);
|
||||
currentActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_CONVERSATION);
|
||||
}
|
||||
|
||||
public static void addMonsterIdentifiers(Intent intent, Monster monster) {
|
||||
if (monster == null) return;
|
||||
intent.putExtra("x", monster.position.x);
|
||||
intent.putExtra("y", monster.position.y);
|
||||
}
|
||||
|
||||
public static Monster getMonsterFromIntent(Intent intent, final WorldContext world) {
|
||||
Bundle params = intent.getExtras();
|
||||
if (params == null) return null;
|
||||
if (!params.containsKey("x")) return null;
|
||||
int x = params.getInt("x");
|
||||
int y = params.getInt("y");
|
||||
return world.model.currentMap.getMonsterAt(x, y);
|
||||
}
|
||||
|
||||
public static void showMonsterEncounter(final MainActivity currentActivity, final ViewContext context, final Monster monster) {
|
||||
context.gameRoundController.pause();
|
||||
Intent intent = new Intent(currentActivity, MonsterEncounterActivity.class);
|
||||
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/monsterencounter"));
|
||||
intent.putExtra("x", monster.position.x);
|
||||
intent.putExtra("y", monster.position.y);
|
||||
addMonsterIdentifiers(intent, monster);
|
||||
currentActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_MONSTERENCOUNTER);
|
||||
}
|
||||
|
||||
public static void showMonsterInfo(final Activity currentActivity, final Monster monster) {
|
||||
Intent intent = new Intent(currentActivity, MonsterInfoActivity.class);
|
||||
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/monsterinfo"));
|
||||
intent.putExtra("x", monster.position.x);
|
||||
intent.putExtra("y", monster.position.y);
|
||||
addMonsterIdentifiers(intent, monster);
|
||||
currentActivity.startActivity(intent);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,14 +26,15 @@ import android.widget.TextView;
|
||||
import android.widget.TextView.BufferType;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
|
||||
import com.gpl.rpg.AndorsTrail.Dialogs;
|
||||
import com.gpl.rpg.AndorsTrail.R;
|
||||
import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
import com.gpl.rpg.AndorsTrail.controller.ConversationController;
|
||||
import com.gpl.rpg.AndorsTrail.conversation.ConversationCollection;
|
||||
import com.gpl.rpg.AndorsTrail.conversation.Phrase;
|
||||
import com.gpl.rpg.AndorsTrail.conversation.Phrase.Reply;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.ActorTraits;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.MonsterType;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Actor;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Player;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.Loot;
|
||||
import com.gpl.rpg.AndorsTrail.resource.TileStore;
|
||||
@@ -53,7 +54,7 @@ public final class ConversationActivity extends Activity {
|
||||
private Button nextButton;
|
||||
private Button leaveButton;
|
||||
private ListView statementList;
|
||||
private MonsterType monsterType;
|
||||
private Monster npc;
|
||||
private RadioGroup replyGroup;
|
||||
private OnClickListener radioButtonListener;
|
||||
private boolean displayActors = true;
|
||||
@@ -68,15 +69,9 @@ public final class ConversationActivity extends Activity {
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
|
||||
Uri uri = getIntent().getData();
|
||||
final String monsterTypeID = uri.getQueryParameter("monsterTypeID");
|
||||
if (monsterTypeID != null && monsterTypeID.length() > 0) {
|
||||
displayActors = true;
|
||||
monsterType = world.monsterTypes.getMonsterType(monsterTypeID);
|
||||
assert(monsterType != null);
|
||||
} else {
|
||||
displayActors = false;
|
||||
monsterType = null;
|
||||
}
|
||||
this.npc = Dialogs.getMonsterFromIntent(getIntent(), world);
|
||||
displayActors = (npc != null);
|
||||
|
||||
String phraseID = uri.getLastPathSegment().toString();
|
||||
if (savedInstanceState != null) {
|
||||
phraseID = savedInstanceState.getString("phraseID");
|
||||
@@ -132,10 +127,11 @@ public final class ConversationActivity extends Activity {
|
||||
ConversationActivity.this.finish();
|
||||
return;
|
||||
} else if (phraseID.equalsIgnoreCase(ConversationCollection.PHRASE_SHOP)) {
|
||||
assert(monsterType != null);
|
||||
assert(monsterType.dropList != null);
|
||||
assert(npc != null);
|
||||
assert(npc.dropList != null);
|
||||
Intent intent = new Intent(this, ShopActivity.class);
|
||||
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/shop/" + monsterType.id));
|
||||
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/shop"));
|
||||
Dialogs.addMonsterIdentifiers(intent, npc);
|
||||
startActivityForResult(intent, MainActivity.INTENTREQUEST_SHOP);
|
||||
return;
|
||||
} else if (phraseID.equalsIgnoreCase(ConversationCollection.PHRASE_ATTACK)) {
|
||||
@@ -183,7 +179,7 @@ public final class ConversationActivity extends Activity {
|
||||
}
|
||||
}
|
||||
|
||||
addConversationStatement(monsterType, message, NPCConversationColor);
|
||||
addConversationStatement(npc, message, NPCConversationColor);
|
||||
|
||||
if (isPhraseOnlyNextReply(phrase)) {
|
||||
nextButton.setEnabled(true);
|
||||
@@ -234,7 +230,7 @@ public final class ConversationActivity extends Activity {
|
||||
} else {
|
||||
r = getSelectedReply();
|
||||
if (r == null) return;
|
||||
addConversationStatement(player.traits, r.text, playerConversationColor);
|
||||
addConversationStatement(player, r.text, playerConversationColor);
|
||||
}
|
||||
replyGroup.removeAllViews();
|
||||
|
||||
@@ -242,12 +238,12 @@ public final class ConversationActivity extends Activity {
|
||||
setPhrase(r.nextPhrase);
|
||||
}
|
||||
|
||||
private void addConversationStatement(ActorTraits traits, String text, int color) {
|
||||
private void addConversationStatement(Actor actor, String text, int color) {
|
||||
ConversationStatement s = new ConversationStatement();
|
||||
if (displayActors) {
|
||||
assert(traits != null);
|
||||
s.iconID = traits.iconID;
|
||||
s.actorName = traits.name;
|
||||
assert(actor != null);
|
||||
s.iconID = actor.traits.iconID;
|
||||
s.actorName = actor.traits.name;
|
||||
} else {
|
||||
s.iconID = ConversationStatement.NO_ICON;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
|
||||
import com.gpl.rpg.AndorsTrail.R;
|
||||
import com.gpl.rpg.AndorsTrail.context.ViewContext;
|
||||
import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
|
||||
|
||||
public final class DebugInterface {
|
||||
//private final ViewContext viewContext;
|
||||
@@ -148,6 +149,16 @@ public final class DebugInterface {
|
||||
mainActivity.showToast("DEBUG: given 10000 exp", Toast.LENGTH_SHORT);
|
||||
}
|
||||
})*/
|
||||
,new DebugButton("reset", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
for(PredefinedMap map : world.maps.predefinedMaps) {
|
||||
map.lastVisitTime = 1;
|
||||
map.resetIfNotRecentlyVisited();
|
||||
}
|
||||
mainActivity.showToast("DEBUG: maps respawned", Toast.LENGTH_SHORT);
|
||||
}
|
||||
})
|
||||
,new DebugButton("hp=max", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.gpl.rpg.AndorsTrail.activity;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
@@ -27,11 +26,7 @@ public final class MonsterEncounterActivity extends Activity {
|
||||
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
|
||||
final Intent intent = getIntent();
|
||||
final Bundle params = intent.getExtras();
|
||||
int x = params.getInt("x");
|
||||
int y = params.getInt("y");
|
||||
final Monster monster = world.model.currentMap.getMonsterAt(x, y);
|
||||
final Monster monster = Dialogs.getMonsterFromIntent(getIntent(), world);
|
||||
if (monster == null) {
|
||||
finish();
|
||||
return;
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.gpl.rpg.AndorsTrail.activity;
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
|
||||
import com.gpl.rpg.AndorsTrail.Dialogs;
|
||||
import com.gpl.rpg.AndorsTrail.R;
|
||||
import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
import com.gpl.rpg.AndorsTrail.controller.CombatController;
|
||||
@@ -12,7 +13,6 @@ import com.gpl.rpg.AndorsTrail.view.RangeBar;
|
||||
import com.gpl.rpg.AndorsTrail.view.TraitsInfoView;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
@@ -22,22 +22,16 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
public final class MonsterInfoActivity extends Activity {
|
||||
private WorldContext world;
|
||||
private Monster monster;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
|
||||
this.world = app.world;
|
||||
final WorldContext world = app.world;
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
|
||||
final Intent intent = getIntent();
|
||||
final Bundle params = intent.getExtras();
|
||||
int x = params.getInt("x");
|
||||
int y = params.getInt("y");
|
||||
this.monster = world.model.currentMap.getMonsterAt(x, y);
|
||||
if (this.monster == null) {
|
||||
final Monster monster = Dialogs.getMonsterFromIntent(getIntent(), world);
|
||||
if (monster == null) {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import android.app.Activity;
|
||||
import android.app.TabActivity;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TabHost;
|
||||
@@ -16,11 +15,10 @@ import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
|
||||
import com.gpl.rpg.AndorsTrail.R;
|
||||
import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
import com.gpl.rpg.AndorsTrail.controller.ItemController;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.MonsterType;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Player;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.Loot;
|
||||
import com.gpl.rpg.AndorsTrail.view.ShopItemContainerAdapter;
|
||||
import com.gpl.rpg.AndorsTrail.view.ShopItemContainerAdapter.OnContainerItemClickedListener;
|
||||
|
||||
@@ -44,10 +42,7 @@ public final class ShopActivity extends TabActivity implements OnContainerItemCl
|
||||
|
||||
AndorsTrailApplication.setWindowParameters(this, app.preferences);
|
||||
|
||||
Uri uri = getIntent().getData();
|
||||
String monsterTypeID = uri.getLastPathSegment().toString();
|
||||
final MonsterType npcType = world.monsterTypes.getMonsterType(monsterTypeID);
|
||||
|
||||
final Monster npc = Dialogs.getMonsterFromIntent(getIntent(), world);
|
||||
final Player player = world.model.player;
|
||||
|
||||
setContentView(R.layout.shop);
|
||||
@@ -68,9 +63,7 @@ public final class ShopActivity extends TabActivity implements OnContainerItemCl
|
||||
shoplist_buy = (ListView) h.findViewById(R.id.shop_buy_list);
|
||||
shoplist_sell = (ListView) h.findViewById(R.id.shop_sell_list);
|
||||
|
||||
Loot merchantLoot = new Loot();
|
||||
npcType.dropList.createRandomLoot(merchantLoot, player);
|
||||
container_buy = merchantLoot.items;
|
||||
container_buy = npc.getShopItems(player);
|
||||
|
||||
shoplist_buy.setAdapter(new ShopItemContainerAdapter(
|
||||
this
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
import com.gpl.rpg.AndorsTrail.controller.Constants;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.DropList;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.Loot;
|
||||
import com.gpl.rpg.AndorsTrail.util.Coord;
|
||||
import com.gpl.rpg.AndorsTrail.util.CoordRect;
|
||||
@@ -24,6 +25,7 @@ public final class Monster extends Actor {
|
||||
public final String phraseID;
|
||||
public final int exp;
|
||||
public final DropList dropList;
|
||||
private ItemContainer shopItems = null;
|
||||
|
||||
public Monster(MonsterType monsterType, Coord position) {
|
||||
super(monsterType, false);
|
||||
@@ -43,6 +45,16 @@ public final class Monster extends Actor {
|
||||
if (this.dropList == null) return;
|
||||
this.dropList.createRandomLoot(container, player);
|
||||
}
|
||||
public ItemContainer getShopItems(Player player) {
|
||||
if (shopItems != null) return shopItems;
|
||||
Loot loot = new Loot();
|
||||
shopItems = loot.items;
|
||||
this.dropList.createRandomLoot(loot, player);
|
||||
return shopItems;
|
||||
}
|
||||
public void resetShopItems() {
|
||||
this.shopItems = null;
|
||||
}
|
||||
|
||||
public boolean isAgressive() {
|
||||
return phraseID == null || forceAggressive;
|
||||
@@ -64,6 +76,12 @@ public final class Monster extends Actor {
|
||||
if (fileversion >= 12) {
|
||||
m.forceAggressive = src.readBoolean();
|
||||
}
|
||||
|
||||
if (fileversion >= 25) {
|
||||
if (src.readBoolean()) {
|
||||
m.shopItems = new ItemContainer(src, world, fileversion);
|
||||
}
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
@@ -73,5 +91,11 @@ public final class Monster extends Actor {
|
||||
dest.writeInt(ap.current);
|
||||
dest.writeInt(health.current);
|
||||
dest.writeBoolean(forceAggressive);
|
||||
if (shopItems != null) {
|
||||
dest.writeBoolean(true);
|
||||
shopItems.writeToParcel(dest, flags);
|
||||
} else {
|
||||
dest.writeBoolean(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,6 +83,12 @@ public final class MonsterSpawnArea {
|
||||
monsters.clear();
|
||||
quantity.current = 0;
|
||||
}
|
||||
|
||||
public void resetShops() {
|
||||
for (Monster m : monsters) {
|
||||
m.resetShopItems();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ====== PARCELABLE ===================================================================
|
||||
|
||||
@@ -223,7 +223,8 @@ public final class PredefinedMap {
|
||||
|
||||
// We reset all non-unique spawn areas. This keeps the savegame file smaller, thus reducing load and save times. Also keeps the running memory usage slightly lower.
|
||||
for(MonsterSpawnArea a : spawnAreas) {
|
||||
if (!a.isUnique) a.reset();
|
||||
if (a.isUnique) a.resetShops();
|
||||
else a.reset();
|
||||
}
|
||||
lastVisitTime = VISIT_RESET;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user