Persist inventories of vendors in savegame. Reset them when the map respawns.

This commit is contained in:
Oskar Wiksten
2012-08-01 22:16:32 +02:00
parent bedc7df087
commit 15bd95b3dc
9 changed files with 91 additions and 61 deletions

View 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);
}

View 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;
}

View 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) {

View 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;

View File

@@ -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;
}

View 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

View 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);
}
}
}

View File

@@ -83,6 +83,12 @@ public final class MonsterSpawnArea {
monsters.clear();
quantity.current = 0;
}
public void resetShops() {
for (Monster m : monsters) {
m.resetShopItems();
}
}
// ====== PARCELABLE ===================================================================

View 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;
}