]> www.infradead.org Git - users/mchehab/andors-trail.git/commitdiff
Persist inventories of vendors in savegame. Reset them when the map respawns.
authorOskar Wiksten <oskar.wiksten@gmail.com>
Wed, 1 Aug 2012 20:16:32 +0000 (22:16 +0200)
committerOskar Wiksten <oskar.wiksten@gmail.com>
Wed, 1 Aug 2012 20:16:32 +0000 (22:16 +0200)
AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/DebugInterface.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterEncounterActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ShopActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/MonsterSpawnArea.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/PredefinedMap.java

index bb71957b8882f8b0a9d055794c42f76dd580cfdc..8bac9935fa75379b020b5306ac3bd2cf713ed9be 100644 (file)
@@ -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);
        }
        
index 2d5e26828fff9485a0ad36fcdeeedeb8e8391cc2..ed6232af19df4ae6006c40f79c2d01edb009ca6e 100644 (file)
@@ -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;
        }
index c64cf8bea75473f911dd8dda6a9995f4aeacdfcd..0a41f667315eb97511a77bfadbc7b662ce7237b4 100644 (file)
@@ -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) {
index 474282d678afb9c5999fe842a43d71b344fb542e..4bad549d0e2c2503516a66126925212091ad130b 100644 (file)
@@ -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;
index f75fd98e3c8be905129de3ac6fb745f498d41879..e67c987387a5d17ea5770e7be9ed232b209a8659 100644 (file)
@@ -3,6 +3,7 @@ package com.gpl.rpg.AndorsTrail.activity;
 import java.util.Arrays;\r
 \r
 import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;\r
+import com.gpl.rpg.AndorsTrail.Dialogs;\r
 import com.gpl.rpg.AndorsTrail.R;\r
 import com.gpl.rpg.AndorsTrail.context.WorldContext;\r
 import com.gpl.rpg.AndorsTrail.controller.CombatController;\r
@@ -12,7 +13,6 @@ import com.gpl.rpg.AndorsTrail.view.RangeBar;
 import com.gpl.rpg.AndorsTrail.view.TraitsInfoView;\r
 \r
 import android.app.Activity;\r
-import android.content.Intent;\r
 import android.os.Bundle;\r
 import android.view.View;\r
 import android.view.Window;\r
@@ -22,22 +22,16 @@ import android.widget.ImageView;
 import android.widget.TextView;\r
 \r
 public final class MonsterInfoActivity extends Activity {\r
-       private WorldContext world;\r
-       private Monster monster;\r
        \r
     @Override\r
     public void onCreate(Bundle savedInstanceState) {\r
         super.onCreate(savedInstanceState);\r
         AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);\r
-        this.world = app.world;\r
+        final WorldContext world = app.world;\r
         requestWindowFeature(Window.FEATURE_NO_TITLE);\r
         \r
-        final Intent intent = getIntent();\r
-        final Bundle params = intent.getExtras();\r
-        int x = params.getInt("x");\r
-        int y = params.getInt("y");\r
-        this.monster = world.model.currentMap.getMonsterAt(x, y);\r
-        if (this.monster == null) {\r
+        final Monster monster = Dialogs.getMonsterFromIntent(getIntent(), world);\r
+        if (monster == null) {\r
                finish();\r
                return;\r
         }                          \r
index 8952f687985a7bece8fee612b68c268b0009c62d..49c61185e2bcfc69bfc172aa0dfbaf4285808e28 100644 (file)
@@ -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
index 901f1df752529fd9d70dd60311a8d46d85fb5f95..06d2143e9197038e6511a73221e485f6d0043cb7 100644 (file)
@@ -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);
+               }
        }
 }
index 668a9bdd18fe269d0820096e51d667c0d0bb5985..741188962997c538cb89eb0f48819e8e0e146af2 100644 (file)
@@ -83,6 +83,12 @@ public final class MonsterSpawnArea {
                monsters.clear();
                quantity.current = 0;
        }
+
+       public void resetShops() {
+               for (Monster m : monsters) {
+                       m.resetShopItems();
+               }
+       }
        
        
        // ====== PARCELABLE ===================================================================
index 599df6bc5655aa3ed526effebeffe1e6c9450bf2..8198198e83801318a18e6a75a88f79962514f002 100644 (file)
@@ -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;
        }