From 15bd95b3dc1ce95a6afb982d932a0784942a54e7 Mon Sep 17 00:00:00 2001 From: Oskar Wiksten Date: Wed, 1 Aug 2012 22:16:32 +0200 Subject: [PATCH] Persist inventories of vendors in savegame. Reset them when the map respawns. --- .../src/com/gpl/rpg/AndorsTrail/Dialogs.java | 36 +++++++++++------- .../activity/ConversationActivity.java | 38 +++++++++---------- .../AndorsTrail/activity/DebugInterface.java | 11 ++++++ .../activity/MonsterEncounterActivity.java | 7 +--- .../activity/MonsterInfoActivity.java | 14 ++----- .../AndorsTrail/activity/ShopActivity.java | 13 ++----- .../rpg/AndorsTrail/model/actor/Monster.java | 24 ++++++++++++ .../model/map/MonsterSpawnArea.java | 6 +++ .../AndorsTrail/model/map/PredefinedMap.java | 3 +- 9 files changed, 91 insertions(+), 61 deletions(-) diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java index bb71957b8..8bac9935f 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java @@ -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); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java index 2d5e26828..ed6232af1 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java @@ -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; } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/DebugInterface.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/DebugInterface.java index c64cf8bea..0a41f6673 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/DebugInterface.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/DebugInterface.java @@ -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) { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterEncounterActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterEncounterActivity.java index 474282d67..4bad549d0 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterEncounterActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterEncounterActivity.java @@ -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; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java index f75fd98e3..e67c98738 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java @@ -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; } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ShopActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ShopActivity.java index 8952f6879..49c61185e 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ShopActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ShopActivity.java @@ -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 diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java index 901f1df75..06d2143e9 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java @@ -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); + } } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/MonsterSpawnArea.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/MonsterSpawnArea.java index 668a9bdd1..741188962 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/MonsterSpawnArea.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/MonsterSpawnArea.java @@ -83,6 +83,12 @@ public final class MonsterSpawnArea { monsters.clear(); quantity.current = 0; } + + public void resetShops() { + for (Monster m : monsters) { + m.resetShopItems(); + } + } // ====== PARCELABLE =================================================================== diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/PredefinedMap.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/PredefinedMap.java index 599df6bc5..8198198e8 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/PredefinedMap.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/PredefinedMap.java @@ -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; }