diff --git a/AndorsTrail/res/drawable/ui_blue_submenu_indicator.9.png b/AndorsTrail/res/drawable/ui_blue_submenu_indicator.9.png
new file mode 100644
index 000000000..8d78372fc
Binary files /dev/null and b/AndorsTrail/res/drawable/ui_blue_submenu_indicator.9.png differ
diff --git a/AndorsTrail/res/layout/custom_menu_item_layout.xml b/AndorsTrail/res/layout/custom_menu_item_layout.xml
new file mode 100644
index 000000000..ac1b75a17
--- /dev/null
+++ b/AndorsTrail/res/layout/custom_menu_item_layout.xml
@@ -0,0 +1,8 @@
+
+
diff --git a/AndorsTrail/res/layout/custom_menu_layout.xml b/AndorsTrail/res/layout/custom_menu_layout.xml
new file mode 100644
index 000000000..44f0066ef
--- /dev/null
+++ b/AndorsTrail/res/layout/custom_menu_layout.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
diff --git a/AndorsTrail/res/layout/custom_menu_submenu_layout.xml b/AndorsTrail/res/layout/custom_menu_submenu_layout.xml
new file mode 100644
index 000000000..0bad016c8
--- /dev/null
+++ b/AndorsTrail/res/layout/custom_menu_submenu_layout.xml
@@ -0,0 +1,9 @@
+
+
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/fragment/HeroinfoActivity_Inventory.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/fragment/HeroinfoActivity_Inventory.java
index 27ef7591d..6233337ea 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/fragment/HeroinfoActivity_Inventory.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/fragment/HeroinfoActivity_Inventory.java
@@ -1,463 +1,468 @@
-package com.gpl.rpg.AndorsTrail.activity.fragment;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.LayoutInflater;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.AdapterContextMenuInfo;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
-import com.gpl.rpg.AndorsTrail.Dialogs;
-import com.gpl.rpg.AndorsTrail.R;
-import com.gpl.rpg.AndorsTrail.activity.ItemInfoActivity;
-import com.gpl.rpg.AndorsTrail.context.ControllerContext;
-import com.gpl.rpg.AndorsTrail.context.WorldContext;
-import com.gpl.rpg.AndorsTrail.controller.ItemController;
-import com.gpl.rpg.AndorsTrail.model.actor.HeroCollection;
-import com.gpl.rpg.AndorsTrail.model.actor.Player;
-import com.gpl.rpg.AndorsTrail.model.item.Inventory;
-import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
-import com.gpl.rpg.AndorsTrail.model.item.ItemType;
-import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
-import com.gpl.rpg.AndorsTrail.view.ItemContainerAdapter;
-import com.gpl.rpg.AndorsTrail.view.SpinnerEmulator;
-
-public final class HeroinfoActivity_Inventory extends Fragment {
-
- private static final int INTENTREQUEST_ITEMINFO = 3;
- private static final int INTENTREQUEST_BULKSELECT_DROP = 11;
-
- private WorldContext world;
- private ControllerContext controllers;
- private TileCollection wornTiles;
-
- private Player player;
- private ListView inventoryList;
- private ItemContainerAdapter inventoryListAdapter;
- private ItemContainerAdapter inventoryWeaponsListAdapter;
- private ItemContainerAdapter inventoryArmorListAdapter;
- private ItemContainerAdapter inventoryUsableListAdapter;
- private ItemContainerAdapter inventoryQuestListAdapter;
- private ItemContainerAdapter inventoryOtherListAdapter;
-
- private TextView heroinfo_stats_gold;
- private TextView heroinfo_stats_attack;
- private TextView heroinfo_stats_defense;
-
- private ItemType lastSelectedItem; // Workaround android bug #7139
-
- private final ImageView[] wornItemImage = new ImageView[Inventory.WearSlot.values().length];
- private final int[] defaultWornItemImageResourceIDs = new int[Inventory.WearSlot.values().length];
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this.getActivity());
- if (!app.isInitialized()) return;
- this.world = app.getWorld();
- this.controllers = app.getControllerContext();
- this.player = world.model.player;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- final View v = inflater.inflate(R.layout.heroinfo_inventory, container, false);
-
- inventoryList = (ListView) v.findViewById(R.id.inventorylist_root);
- ImageView heroicon = (ImageView) v.findViewById(R.id.heroinfo_inventory_heroicon);
- heroinfo_stats_gold = (TextView) v.findViewById(R.id.heroinfo_stats_gold);
- heroinfo_stats_attack = (TextView) v.findViewById(R.id.heroinfo_stats_attack);
- heroinfo_stats_defense = (TextView) v.findViewById(R.id.heroinfo_stats_defense);
-
- registerForContextMenu(inventoryList);
- inventoryList.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView> parent, View v, int position, long id) {
- // Move this code to separate function? -- Done
- ItemType itemType = getSelectedItemType(position);
- showInventoryItemInfo(itemType.id);
- }
- });
-
- new SpinnerEmulator(v, R.id.inventorylist_category_filters_button, R.array.inventorylist_category_filters, R.string.heroinfo_inventory_categories) {
- @Override
- public void setValue(int value) {
- world.model.uiSelections.selectedInventoryCategory = value;
- }
- @Override
- public void selectionChanged(int value) {
- reloadShownCategory(value);
- }
- @Override
- public int getValue() {
- return world.model.uiSelections.selectedInventoryCategory;
- }
- };
- new SpinnerEmulator(v, R.id.inventorylist_sort_filters_button, R.array.inventorylist_sort_filters, R.string.heroinfo_inventory_sort) {
- @Override
- public void setValue(int value) {
- world.model.uiSelections.selectedInventorySort = value;
- }
- @Override
- public void selectionChanged(int value) {
- reloadShownSort(player.inventory);
- }
- @Override
- public int getValue() {
- return world.model.uiSelections.selectedInventorySort;
- }
- };
-
- ItemContainer inv = player.inventory;
- wornTiles = world.tileManager.loadTilesFor(player.inventory, getResources());
- inventoryListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, inv, player, wornTiles);
- inventoryList.setAdapter(inventoryListAdapter);
-
-
- heroicon.setImageResource(HeroCollection.getHeroLargeSprite(player.iconID));
-
- setWearSlot(v, Inventory.WearSlot.weapon, R.id.heroinfo_worn_weapon, R.drawable.equip_weapon);
- setWearSlot(v, Inventory.WearSlot.shield, R.id.heroinfo_worn_shield, R.drawable.equip_shield);
- setWearSlot(v, Inventory.WearSlot.head, R.id.heroinfo_worn_head, R.drawable.equip_head);
- setWearSlot(v, Inventory.WearSlot.body, R.id.heroinfo_worn_body, R.drawable.equip_body);
- setWearSlot(v, Inventory.WearSlot.feet, R.id.heroinfo_worn_feet, R.drawable.equip_feet);
- setWearSlot(v, Inventory.WearSlot.neck, R.id.heroinfo_worn_neck, R.drawable.equip_neck);
- setWearSlot(v, Inventory.WearSlot.hand, R.id.heroinfo_worn_hand, R.drawable.equip_hand);
- setWearSlot(v, Inventory.WearSlot.leftring, R.id.heroinfo_worn_ringleft, R.drawable.equip_ring);
- setWearSlot(v, Inventory.WearSlot.rightring, R.id.heroinfo_worn_ringright, R.drawable.equip_ring);
-
- return v;
- }
-
- @Override
- public void onStart() {
- super.onStart();
- update();
- }
-
- private void setWearSlot(final View v, final Inventory.WearSlot inventorySlot, int viewId, int resourceId) {
- final ImageView imageView = (ImageView) v.findViewById(viewId);
- wornItemImage[inventorySlot.ordinal()] = imageView;
- defaultWornItemImageResourceIDs[inventorySlot.ordinal()] = resourceId;
- imageView.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (player.inventory.isEmptySlot(inventorySlot)) return;
- imageView.setClickable(false); // Will be enabled again on update()
- showEquippedItemInfo(player.inventory.getItemTypeInWearSlot(inventorySlot), inventorySlot);
- }
- });
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- switch (requestCode) {
- case INTENTREQUEST_ITEMINFO:
- if (resultCode != Activity.RESULT_OK) break;
-
- ItemType itemType = world.itemTypes.getItemType(data.getExtras().getString("itemTypeID"));
- ItemInfoActivity.ItemInfoAction actionType = ItemInfoActivity.ItemInfoAction.valueOf(data.getExtras().getString("actionType"));
- if (actionType == ItemInfoActivity.ItemInfoAction.unequip) {
- Inventory.WearSlot slot = Inventory.WearSlot.valueOf(data.getExtras().getString("inventorySlot"));
- controllers.itemController.unequipSlot(itemType, slot);
- } else if (actionType == ItemInfoActivity.ItemInfoAction.equip) {
- Inventory.WearSlot slot = suggestInventorySlot(itemType);
- controllers.itemController.equipItem(itemType, slot);
- } else if (actionType == ItemInfoActivity.ItemInfoAction.use) {
- controllers.itemController.useItem(itemType);
- }
- break;
- case INTENTREQUEST_BULKSELECT_DROP:
- if (resultCode != Activity.RESULT_OK) break;
-
- int quantity = data.getExtras().getInt("selectedAmount");
- String itemTypeID = data.getExtras().getString("itemTypeID");
- dropItem(itemTypeID, quantity);
- break;
- }
- update();
- }
-
- private Inventory.WearSlot suggestInventorySlot(ItemType itemType) {
- Inventory.WearSlot slot = itemType.category.inventorySlot;
- if (player.inventory.isEmptySlot(slot)) return slot;
-
- if (slot == Inventory.WearSlot.leftring) return Inventory.WearSlot.rightring;
- if (itemType.isOffhandCapableWeapon()) {
- ItemType mainWeapon = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
- if (mainWeapon != null && mainWeapon.isTwohandWeapon()) return slot;
- else if (player.inventory.isEmptySlot(Inventory.WearSlot.shield)) return Inventory.WearSlot.shield;
- }
- return slot;
- }
-
- private void dropItem(String itemTypeID, int quantity) {
- ItemType itemType = world.itemTypes.getItemType(itemTypeID);
- controllers.itemController.dropItem(itemType, quantity);
- }
-
- private void update() {
- updateTraits();
- updateWorn();
- updateItemList();
- }
-
- private void updateTraits() {
- heroinfo_stats_gold.setText(getResources().getString(R.string.heroinfo_gold, player.inventory.gold));
-
- StringBuilder sb = new StringBuilder(10);
- ItemController.describeAttackEffect(
- player.getAttackChance(),
- player.getDamagePotential().current,
- player.getDamagePotential().max,
- player.getCriticalSkill(),
- player.getCriticalMultiplier(),
- sb);
- heroinfo_stats_attack.setText(sb.toString());
-
- sb = new StringBuilder(10);
- ItemController.describeBlockEffect(player.getBlockChance(), player.getDamageResistance(), sb);
- heroinfo_stats_defense.setText(sb.toString());
- }
-
- private void updateWorn() {
- for(Inventory.WearSlot slot : Inventory.WearSlot.values()) {
- updateWornImage(wornItemImage[slot.ordinal()], defaultWornItemImageResourceIDs[slot.ordinal()], player.inventory.getItemTypeInWearSlot(slot));
- }
- }
-
- private void updateWornImage(ImageView imageView, int resourceIDEmptyImage, ItemType type) {
- if (type != null) {
- world.tileManager.setImageViewTile(getResources(), imageView, type, wornTiles);
- } else {
- imageView.setImageResource(resourceIDEmptyImage);
- }
- imageView.setClickable(true);
- }
-
- private void updateItemList() {
- int currentScreen = world.model.uiSelections.selectedInventoryCategory;
- if (currentScreen == 0)
- inventoryListAdapter.notifyDataSetChanged();
- else
- reloadShownCategory(world.model.uiSelections.selectedInventoryCategory);
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- super.onCreateContextMenu(menu, v, menuInfo);
- ItemType type = getSelectedItemType((AdapterContextMenuInfo) menuInfo);
- MenuInflater inflater = getActivity().getMenuInflater();
- switch (v.getId()) {
- case R.id.inventorylist_root:
- inflater.inflate(R.menu.inventoryitem, menu);
- if (type.isUsable()){
- menu.findItem(R.id.inv_menu_use).setVisible(true);
- menu.findItem(R.id.inv_menu_assign).setVisible(true);
- }
- if (type.isEquippable()) {
- menu.findItem(R.id.inv_menu_equip).setVisible(true);
- if (type.isOffhandCapableWeapon()) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true);
- else if (type.category.inventorySlot == Inventory.WearSlot.leftring) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true);
- }
- break;
- }
- lastSelectedItem = null;
- }
-
- private ItemType getSelectedItemType(int position) {
- int v = world.model.uiSelections.selectedInventoryCategory;
-
- if (v == 0) { //All items
- return inventoryListAdapter.getItem(position).itemType;
- }else if (v == 1) { //Weapon items
- return inventoryWeaponsListAdapter.getItem(position).itemType;
- } else if (v == 2) { //Armor items
- return inventoryArmorListAdapter.getItem(position).itemType;
- } else if (v == 3) { //Usable items
- return inventoryUsableListAdapter.getItem(position).itemType;
- } else if (v == 4) { //Quest items
- return inventoryQuestListAdapter.getItem(position).itemType;
- } else if (v == 5) { //Other items
- return inventoryOtherListAdapter.getItem(position).itemType;
- }
-
- // Better than crashing...
- return inventoryListAdapter.getItem(position).itemType;
-
- }
-
-
- private ItemType getSelectedItemType(AdapterContextMenuInfo info) {
- return getSelectedItemType(info.position);
- }
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- ItemType itemType;
- AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
- switch (item.getItemId()) {
- case R.id.inv_menu_info:
- showInventoryItemInfo(getSelectedItemType(info));
- //context.mapController.itemInfo(this, getSelectedItemType(info));
- break;
- case R.id.inv_menu_drop:
- String itemTypeID = getSelectedItemType(info).id;
- int quantity = player.inventory.getItemQuantity(itemTypeID);
- if (quantity > 1) {
- Intent intent = Dialogs.getIntentForBulkDroppingInterface(getActivity(), itemTypeID, quantity);
- startActivityForResult(intent, INTENTREQUEST_BULKSELECT_DROP);
- } else {
- dropItem(itemTypeID, quantity);
- }
- break;
- case R.id.inv_menu_equip:
- itemType = getSelectedItemType(info);
- controllers.itemController.equipItem(itemType, itemType.category.inventorySlot);
- break;
- case R.id.inv_menu_equip_offhand:
- itemType = getSelectedItemType(info);
- if (itemType.category.inventorySlot == Inventory.WearSlot.weapon) {
- controllers.itemController.equipItem(itemType, Inventory.WearSlot.shield);
- } else if (itemType.category.inventorySlot == Inventory.WearSlot.leftring) {
- controllers.itemController.equipItem(itemType, Inventory.WearSlot.rightring);
- }
- break;
- /*case R.id.inv_menu_unequip:
- context.mapController.unequipItem(this, getSelectedItemType(info));
- break;*/
- case R.id.inv_menu_use:
- controllers.itemController.useItem(getSelectedItemType(info));
- break;
- case R.id.inv_menu_assign:
- lastSelectedItem = getSelectedItemType(info);
- break;
- case R.id.inv_assign_slot1:
- controllers.itemController.setQuickItem(lastSelectedItem, 0);
- break;
- case R.id.inv_assign_slot2:
- controllers.itemController.setQuickItem(lastSelectedItem, 1);
- break;
- case R.id.inv_assign_slot3:
- controllers.itemController.setQuickItem(lastSelectedItem, 2);
- break;
- case R.id.inv_menu_movetop:
- player.inventory.sortToTop(getSelectedItemType(info).id);
- break;
- case R.id.inv_menu_movebottom:
- player.inventory.sortToBottom(getSelectedItemType(info).id);
- break;
- default:
- return super.onContextItemSelected(item);
- }
- update();
- return true;
- }
-
- private void showEquippedItemInfo(ItemType itemType, Inventory.WearSlot inventorySlot) {
- String text;
- boolean enabled = true;
-
- if (world.model.uiSelections.isInCombat) {
- int ap = world.model.player.getReequipCost();
- text = getResources().getString(R.string.iteminfo_action_unequip_ap, ap);
- if (ap > 0) {
- enabled = world.model.player.hasAPs(ap);
- }
- } else {
- text = getResources().getString(R.string.iteminfo_action_unequip);
- }
- Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, ItemInfoActivity.ItemInfoAction.unequip, text, enabled, inventorySlot);
- startActivityForResult(intent, INTENTREQUEST_ITEMINFO);
- }
- private void showInventoryItemInfo(String itemTypeID) {
- showInventoryItemInfo(world.itemTypes.getItemType(itemTypeID));
- }
- private void showInventoryItemInfo(ItemType itemType) {
- String text = "";
- int ap = 0;
- boolean enabled = true;
- ItemInfoActivity.ItemInfoAction action = ItemInfoActivity.ItemInfoAction.none;
- final boolean isInCombat = world.model.uiSelections.isInCombat;
- if (itemType.isEquippable()) {
- if (isInCombat) {
- ap = world.model.player.getReequipCost();
- text = getResources().getString(R.string.iteminfo_action_equip_ap, ap);
- } else {
- text = getResources().getString(R.string.iteminfo_action_equip);
- }
- action = ItemInfoActivity.ItemInfoAction.equip;
- } else if (itemType.isUsable()) {
- if (isInCombat) {
- ap = world.model.player.getUseItemCost();
- text = getResources().getString(R.string.iteminfo_action_use_ap, ap);
- } else {
- text = getResources().getString(R.string.iteminfo_action_use);
- }
- action = ItemInfoActivity.ItemInfoAction.use;
- }
- if (isInCombat && ap > 0) {
- enabled = world.model.player.hasAPs(ap);
- }
-
- Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, action, text, enabled, null);
- startActivityForResult(intent, INTENTREQUEST_ITEMINFO);
- }
-
- private void reloadShownCategory(int v) { // Apologies about the code duplication,
- // just didn't seem to make sense as an array, although I did create a nice array for skill category adapters.
-
- // Decide which category to show
- if (v == 0) { //All items
- inventoryList.setAdapter(inventoryListAdapter);
- inventoryListAdapter.notifyDataSetChanged();
- } else if (v == 1) { //Weapon items
- inventoryWeaponsListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildWeaponItems(), player, wornTiles);
- inventoryList.setAdapter(inventoryWeaponsListAdapter);
- inventoryWeaponsListAdapter.notifyDataSetChanged();
- } else if (v == 2) { //Armor items
- inventoryArmorListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildArmorItems(), player, wornTiles);
- inventoryList.setAdapter(inventoryArmorListAdapter);
- inventoryArmorListAdapter.notifyDataSetChanged();
- } else if (v == 3) { //Usable items
- inventoryUsableListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildUsableItems(), player, wornTiles);
- inventoryList.setAdapter(inventoryUsableListAdapter);
- inventoryUsableListAdapter.notifyDataSetChanged();
- } else if (v == 4) { //Quest items
- inventoryQuestListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildQuestItems(), player, wornTiles);
- inventoryList.setAdapter(inventoryQuestListAdapter);
- inventoryQuestListAdapter.notifyDataSetChanged();
- } else if (v == 5) { //Other items
- inventoryOtherListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildOtherItems(), player, wornTiles);
- inventoryList.setAdapter(inventoryOtherListAdapter);
- inventoryOtherListAdapter.notifyDataSetChanged();
- }
- //updateItemList();
- }
-
- private void reloadShownSort(Inventory inv) {
- int selected = world.model.uiSelections.selectedInventorySort;
-
- inventoryListAdapter.reloadShownSort(selected, world.model.uiSelections.oldSortSelection, player.inventory, player);
-
- // Currently not functional, perhaps because selection only updates when changed.
- if (world.model.uiSelections.oldSortSelection == selected)
- world.model.uiSelections.oldSortSelection = 0;
- else world.model.uiSelections.oldSortSelection = selected;
- updateItemList();
- }
-
-}
+package com.gpl.rpg.AndorsTrail.activity.fragment;
+
+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.activity.ItemInfoActivity;
+import com.gpl.rpg.AndorsTrail.context.ControllerContext;
+import com.gpl.rpg.AndorsTrail.context.WorldContext;
+import com.gpl.rpg.AndorsTrail.controller.ItemController;
+import com.gpl.rpg.AndorsTrail.model.actor.HeroCollection;
+import com.gpl.rpg.AndorsTrail.model.actor.Player;
+import com.gpl.rpg.AndorsTrail.model.item.Inventory;
+import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
+import com.gpl.rpg.AndorsTrail.model.item.ItemType;
+import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
+import com.gpl.rpg.AndorsTrail.view.CustomMenuInflater;
+import com.gpl.rpg.AndorsTrail.view.ItemContainerAdapter;
+import com.gpl.rpg.AndorsTrail.view.SpinnerEmulator;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+public final class HeroinfoActivity_Inventory extends Fragment implements CustomMenuInflater.MenuItemSelectedListener {
+
+ private static final int INTENTREQUEST_ITEMINFO = 3;
+ private static final int INTENTREQUEST_BULKSELECT_DROP = 11;
+
+ private WorldContext world;
+ private ControllerContext controllers;
+ private TileCollection wornTiles;
+
+ private Player player;
+ private ListView inventoryList;
+ private ItemContainerAdapter inventoryListAdapter;
+ private ItemContainerAdapter inventoryWeaponsListAdapter;
+ private ItemContainerAdapter inventoryArmorListAdapter;
+ private ItemContainerAdapter inventoryUsableListAdapter;
+ private ItemContainerAdapter inventoryQuestListAdapter;
+ private ItemContainerAdapter inventoryOtherListAdapter;
+
+ private TextView heroinfo_stats_gold;
+ private TextView heroinfo_stats_attack;
+ private TextView heroinfo_stats_defense;
+
+ private ItemType lastSelectedItem; // Workaround android bug #7139
+
+ private final ImageView[] wornItemImage = new ImageView[Inventory.WearSlot.values().length];
+ private final int[] defaultWornItemImageResourceIDs = new int[Inventory.WearSlot.values().length];
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this.getActivity());
+ if (!app.isInitialized()) return;
+ this.world = app.getWorld();
+ this.controllers = app.getControllerContext();
+ this.player = world.model.player;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ final View v = inflater.inflate(R.layout.heroinfo_inventory, container, false);
+
+ inventoryList = (ListView) v.findViewById(R.id.inventorylist_root);
+ ImageView heroicon = (ImageView) v.findViewById(R.id.heroinfo_inventory_heroicon);
+ heroinfo_stats_gold = (TextView) v.findViewById(R.id.heroinfo_stats_gold);
+ heroinfo_stats_attack = (TextView) v.findViewById(R.id.heroinfo_stats_attack);
+ heroinfo_stats_defense = (TextView) v.findViewById(R.id.heroinfo_stats_defense);
+
+ registerForContextMenu(inventoryList);
+ inventoryList.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View v, int position, long id) {
+ // Move this code to separate function? -- Done
+ ItemType itemType = getSelectedItemType(position);
+ showInventoryItemInfo(itemType.id);
+ }
+ });
+ inventoryList.setOnItemLongClickListener(new OnItemLongClickListener() {
+
+ @Override
+ public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
+ showContextMenuForItem(getSelectedItemType(position));
+ return true;
+ }
+ });
+
+ new SpinnerEmulator(v, R.id.inventorylist_category_filters_button, R.array.inventorylist_category_filters, R.string.heroinfo_inventory_categories) {
+ @Override
+ public void setValue(int value) {
+ world.model.uiSelections.selectedInventoryCategory = value;
+ }
+ @Override
+ public void selectionChanged(int value) {
+ reloadShownCategory(value);
+ }
+ @Override
+ public int getValue() {
+ return world.model.uiSelections.selectedInventoryCategory;
+ }
+ };
+ new SpinnerEmulator(v, R.id.inventorylist_sort_filters_button, R.array.inventorylist_sort_filters, R.string.heroinfo_inventory_sort) {
+ @Override
+ public void setValue(int value) {
+ world.model.uiSelections.selectedInventorySort = value;
+ }
+ @Override
+ public void selectionChanged(int value) {
+ reloadShownSort(player.inventory);
+ }
+ @Override
+ public int getValue() {
+ return world.model.uiSelections.selectedInventorySort;
+ }
+ };
+
+ ItemContainer inv = player.inventory;
+ wornTiles = world.tileManager.loadTilesFor(player.inventory, getResources());
+ inventoryListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, inv, player, wornTiles);
+ inventoryList.setAdapter(inventoryListAdapter);
+
+
+ heroicon.setImageResource(HeroCollection.getHeroLargeSprite(player.iconID));
+
+ setWearSlot(v, Inventory.WearSlot.weapon, R.id.heroinfo_worn_weapon, R.drawable.equip_weapon);
+ setWearSlot(v, Inventory.WearSlot.shield, R.id.heroinfo_worn_shield, R.drawable.equip_shield);
+ setWearSlot(v, Inventory.WearSlot.head, R.id.heroinfo_worn_head, R.drawable.equip_head);
+ setWearSlot(v, Inventory.WearSlot.body, R.id.heroinfo_worn_body, R.drawable.equip_body);
+ setWearSlot(v, Inventory.WearSlot.feet, R.id.heroinfo_worn_feet, R.drawable.equip_feet);
+ setWearSlot(v, Inventory.WearSlot.neck, R.id.heroinfo_worn_neck, R.drawable.equip_neck);
+ setWearSlot(v, Inventory.WearSlot.hand, R.id.heroinfo_worn_hand, R.drawable.equip_hand);
+ setWearSlot(v, Inventory.WearSlot.leftring, R.id.heroinfo_worn_ringleft, R.drawable.equip_ring);
+ setWearSlot(v, Inventory.WearSlot.rightring, R.id.heroinfo_worn_ringright, R.drawable.equip_ring);
+
+ return v;
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ update();
+ }
+
+ private void setWearSlot(final View v, final Inventory.WearSlot inventorySlot, int viewId, int resourceId) {
+ final ImageView imageView = (ImageView) v.findViewById(viewId);
+ wornItemImage[inventorySlot.ordinal()] = imageView;
+ defaultWornItemImageResourceIDs[inventorySlot.ordinal()] = resourceId;
+ imageView.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (player.inventory.isEmptySlot(inventorySlot)) return;
+ imageView.setClickable(false); // Will be enabled again on update()
+ showEquippedItemInfo(player.inventory.getItemTypeInWearSlot(inventorySlot), inventorySlot);
+ }
+ });
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ switch (requestCode) {
+ case INTENTREQUEST_ITEMINFO:
+ if (resultCode != Activity.RESULT_OK) break;
+
+ ItemType itemType = world.itemTypes.getItemType(data.getExtras().getString("itemTypeID"));
+ ItemInfoActivity.ItemInfoAction actionType = ItemInfoActivity.ItemInfoAction.valueOf(data.getExtras().getString("actionType"));
+ if (actionType == ItemInfoActivity.ItemInfoAction.unequip) {
+ Inventory.WearSlot slot = Inventory.WearSlot.valueOf(data.getExtras().getString("inventorySlot"));
+ controllers.itemController.unequipSlot(itemType, slot);
+ } else if (actionType == ItemInfoActivity.ItemInfoAction.equip) {
+ Inventory.WearSlot slot = suggestInventorySlot(itemType);
+ controllers.itemController.equipItem(itemType, slot);
+ } else if (actionType == ItemInfoActivity.ItemInfoAction.use) {
+ controllers.itemController.useItem(itemType);
+ }
+ break;
+ case INTENTREQUEST_BULKSELECT_DROP:
+ if (resultCode != Activity.RESULT_OK) break;
+
+ int quantity = data.getExtras().getInt("selectedAmount");
+ String itemTypeID = data.getExtras().getString("itemTypeID");
+ dropItem(itemTypeID, quantity);
+ break;
+ }
+ update();
+ }
+
+ private Inventory.WearSlot suggestInventorySlot(ItemType itemType) {
+ Inventory.WearSlot slot = itemType.category.inventorySlot;
+ if (player.inventory.isEmptySlot(slot)) return slot;
+
+ if (slot == Inventory.WearSlot.leftring) return Inventory.WearSlot.rightring;
+ if (itemType.isOffhandCapableWeapon()) {
+ ItemType mainWeapon = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
+ if (mainWeapon != null && mainWeapon.isTwohandWeapon()) return slot;
+ else if (player.inventory.isEmptySlot(Inventory.WearSlot.shield)) return Inventory.WearSlot.shield;
+ }
+ return slot;
+ }
+
+ private void dropItem(String itemTypeID, int quantity) {
+ ItemType itemType = world.itemTypes.getItemType(itemTypeID);
+ controllers.itemController.dropItem(itemType, quantity);
+ }
+
+ private void update() {
+ updateTraits();
+ updateWorn();
+ updateItemList();
+ }
+
+ private void updateTraits() {
+ heroinfo_stats_gold.setText(getResources().getString(R.string.heroinfo_gold, player.inventory.gold));
+
+ StringBuilder sb = new StringBuilder(10);
+ ItemController.describeAttackEffect(
+ player.getAttackChance(),
+ player.getDamagePotential().current,
+ player.getDamagePotential().max,
+ player.getCriticalSkill(),
+ player.getCriticalMultiplier(),
+ sb);
+ heroinfo_stats_attack.setText(sb.toString());
+
+ sb = new StringBuilder(10);
+ ItemController.describeBlockEffect(player.getBlockChance(), player.getDamageResistance(), sb);
+ heroinfo_stats_defense.setText(sb.toString());
+ }
+
+ private void updateWorn() {
+ for(Inventory.WearSlot slot : Inventory.WearSlot.values()) {
+ updateWornImage(wornItemImage[slot.ordinal()], defaultWornItemImageResourceIDs[slot.ordinal()], player.inventory.getItemTypeInWearSlot(slot));
+ }
+ }
+
+ private void updateWornImage(ImageView imageView, int resourceIDEmptyImage, ItemType type) {
+ if (type != null) {
+ world.tileManager.setImageViewTile(getResources(), imageView, type, wornTiles);
+ } else {
+ imageView.setImageResource(resourceIDEmptyImage);
+ }
+ imageView.setClickable(true);
+ }
+
+ private void updateItemList() {
+ int currentScreen = world.model.uiSelections.selectedInventoryCategory;
+ if (currentScreen == 0)
+ inventoryListAdapter.notifyDataSetChanged();
+ else
+ reloadShownCategory(world.model.uiSelections.selectedInventoryCategory);
+ }
+
+// @Override
+// public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {}
+// ItemType type = getSelectedItemType((AdapterContextMenuInfo) menuInfo);
+
+ public void showContextMenuForItem(ItemType type) {
+ MenuInflater inflater = getActivity().getMenuInflater();
+ Menu menu = CustomMenuInflater.newMenuInstance(getActivity());
+ inflater.inflate(R.menu.inventoryitem, menu);
+ if (type.isUsable()){
+ menu.findItem(R.id.inv_menu_use).setVisible(true);
+ menu.findItem(R.id.inv_menu_assign).setVisible(true);
+ }
+ if (type.isEquippable()) {
+ menu.findItem(R.id.inv_menu_equip).setVisible(true);
+ if (type.isOffhandCapableWeapon()) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true);
+ else if (type.category.inventorySlot == Inventory.WearSlot.leftring) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true);
+ }
+ lastSelectedItem = null;
+ CustomMenuInflater.showMenuInDialog(getActivity(), menu, world.tileManager.getDrawableForItem(getResources(), type.iconID, world.tileManager.loadTilesFor(Arrays.asList(new Integer[] { type.iconID}), getResources())), type.getName(player), type, this);
+ }
+
+ private ItemType getSelectedItemType(int position) {
+ int v = world.model.uiSelections.selectedInventoryCategory;
+
+ if (v == 0) { //All items
+ return inventoryListAdapter.getItem(position).itemType;
+ }else if (v == 1) { //Weapon items
+ return inventoryWeaponsListAdapter.getItem(position).itemType;
+ } else if (v == 2) { //Armor items
+ return inventoryArmorListAdapter.getItem(position).itemType;
+ } else if (v == 3) { //Usable items
+ return inventoryUsableListAdapter.getItem(position).itemType;
+ } else if (v == 4) { //Quest items
+ return inventoryQuestListAdapter.getItem(position).itemType;
+ } else if (v == 5) { //Other items
+ return inventoryOtherListAdapter.getItem(position).itemType;
+ }
+
+ // Better than crashing...
+ return inventoryListAdapter.getItem(position).itemType;
+
+ }
+
+
+ private ItemType getSelectedItemType(AdapterContextMenuInfo info) {
+ return getSelectedItemType(info.position);
+ }
+
+ @Override
+ public void onMenuItemSelected(MenuItem item, Object data) {
+ ItemType itemType = (ItemType) data;
+ switch (item.getItemId()) {
+ case R.id.inv_menu_info:
+ showInventoryItemInfo(itemType);
+ //context.mapController.itemInfo(this, getSelectedItemType(info));
+ break;
+ case R.id.inv_menu_drop:
+ String itemTypeID = itemType.id;
+ int quantity = player.inventory.getItemQuantity(itemTypeID);
+ if (quantity > 1) {
+ Intent intent = Dialogs.getIntentForBulkDroppingInterface(getActivity(), itemTypeID, quantity);
+ startActivityForResult(intent, INTENTREQUEST_BULKSELECT_DROP);
+ } else {
+ dropItem(itemTypeID, quantity);
+ }
+ break;
+ case R.id.inv_menu_equip:
+ controllers.itemController.equipItem(itemType, itemType.category.inventorySlot);
+ break;
+ case R.id.inv_menu_equip_offhand:
+ if (itemType.category.inventorySlot == Inventory.WearSlot.weapon) {
+ controllers.itemController.equipItem(itemType, Inventory.WearSlot.shield);
+ } else if (itemType.category.inventorySlot == Inventory.WearSlot.leftring) {
+ controllers.itemController.equipItem(itemType, Inventory.WearSlot.rightring);
+ }
+ break;
+ /*case R.id.inv_menu_unequip:
+ context.mapController.unequipItem(this, getSelectedItemType(info));
+ break;*/
+ case R.id.inv_menu_use:
+ controllers.itemController.useItem(itemType);
+ break;
+ case R.id.inv_menu_assign:
+ //lastSelectedItem = itemType;
+ break;
+ case R.id.inv_assign_slot1:
+ controllers.itemController.setQuickItem(itemType, 0);
+ break;
+ case R.id.inv_assign_slot2:
+ controllers.itemController.setQuickItem(itemType, 1);
+ break;
+ case R.id.inv_assign_slot3:
+ controllers.itemController.setQuickItem(itemType, 2);
+ break;
+ case R.id.inv_menu_movetop:
+ player.inventory.sortToTop(itemType.id);
+ break;
+ case R.id.inv_menu_movebottom:
+ player.inventory.sortToBottom(itemType.id);
+ break;
+ }
+ update();
+ }
+
+ private void showEquippedItemInfo(ItemType itemType, Inventory.WearSlot inventorySlot) {
+ String text;
+ boolean enabled = true;
+
+ if (world.model.uiSelections.isInCombat) {
+ int ap = world.model.player.getReequipCost();
+ text = getResources().getString(R.string.iteminfo_action_unequip_ap, ap);
+ if (ap > 0) {
+ enabled = world.model.player.hasAPs(ap);
+ }
+ } else {
+ text = getResources().getString(R.string.iteminfo_action_unequip);
+ }
+ Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, ItemInfoActivity.ItemInfoAction.unequip, text, enabled, inventorySlot);
+ startActivityForResult(intent, INTENTREQUEST_ITEMINFO);
+ }
+ private void showInventoryItemInfo(String itemTypeID) {
+ showInventoryItemInfo(world.itemTypes.getItemType(itemTypeID));
+ }
+ private void showInventoryItemInfo(ItemType itemType) {
+ String text = "";
+ int ap = 0;
+ boolean enabled = true;
+ ItemInfoActivity.ItemInfoAction action = ItemInfoActivity.ItemInfoAction.none;
+ final boolean isInCombat = world.model.uiSelections.isInCombat;
+ if (itemType.isEquippable()) {
+ if (isInCombat) {
+ ap = world.model.player.getReequipCost();
+ text = getResources().getString(R.string.iteminfo_action_equip_ap, ap);
+ } else {
+ text = getResources().getString(R.string.iteminfo_action_equip);
+ }
+ action = ItemInfoActivity.ItemInfoAction.equip;
+ } else if (itemType.isUsable()) {
+ if (isInCombat) {
+ ap = world.model.player.getUseItemCost();
+ text = getResources().getString(R.string.iteminfo_action_use_ap, ap);
+ } else {
+ text = getResources().getString(R.string.iteminfo_action_use);
+ }
+ action = ItemInfoActivity.ItemInfoAction.use;
+ }
+ if (isInCombat && ap > 0) {
+ enabled = world.model.player.hasAPs(ap);
+ }
+
+ Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, action, text, enabled, null);
+ startActivityForResult(intent, INTENTREQUEST_ITEMINFO);
+ }
+
+ private void reloadShownCategory(int v) { // Apologies about the code duplication,
+ // just didn't seem to make sense as an array, although I did create a nice array for skill category adapters.
+
+ // Decide which category to show
+ if (v == 0) { //All items
+ inventoryList.setAdapter(inventoryListAdapter);
+ inventoryListAdapter.notifyDataSetChanged();
+ } else if (v == 1) { //Weapon items
+ inventoryWeaponsListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildWeaponItems(), player, wornTiles);
+ inventoryList.setAdapter(inventoryWeaponsListAdapter);
+ inventoryWeaponsListAdapter.notifyDataSetChanged();
+ } else if (v == 2) { //Armor items
+ inventoryArmorListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildArmorItems(), player, wornTiles);
+ inventoryList.setAdapter(inventoryArmorListAdapter);
+ inventoryArmorListAdapter.notifyDataSetChanged();
+ } else if (v == 3) { //Usable items
+ inventoryUsableListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildUsableItems(), player, wornTiles);
+ inventoryList.setAdapter(inventoryUsableListAdapter);
+ inventoryUsableListAdapter.notifyDataSetChanged();
+ } else if (v == 4) { //Quest items
+ inventoryQuestListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildQuestItems(), player, wornTiles);
+ inventoryList.setAdapter(inventoryQuestListAdapter);
+ inventoryQuestListAdapter.notifyDataSetChanged();
+ } else if (v == 5) { //Other items
+ inventoryOtherListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildOtherItems(), player, wornTiles);
+ inventoryList.setAdapter(inventoryOtherListAdapter);
+ inventoryOtherListAdapter.notifyDataSetChanged();
+ }
+ //updateItemList();
+ }
+
+ private void reloadShownSort(Inventory inv) {
+ int selected = world.model.uiSelections.selectedInventorySort;
+
+ inventoryListAdapter.reloadShownSort(selected, world.model.uiSelections.oldSortSelection, player.inventory, player);
+
+ // Currently not functional, perhaps because selection only updates when changed.
+ if (world.model.uiSelections.oldSortSelection == selected)
+ world.model.uiSelections.oldSortSelection = 0;
+ else world.model.uiSelections.oldSortSelection = selected;
+ updateItemList();
+ }
+
+}
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java
index aa7cd8efd..70b6fe9e0 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java
@@ -1,525 +1,537 @@
-package com.gpl.rpg.AndorsTrail.resource.tiles;
-
-import java.util.HashMap;
-import java.util.HashSet;
-
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.os.AsyncTask;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
-import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
-import com.gpl.rpg.AndorsTrail.R;
-import com.gpl.rpg.AndorsTrail.context.WorldContext;
-import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType;
-import com.gpl.rpg.AndorsTrail.model.actor.Monster;
-import com.gpl.rpg.AndorsTrail.model.actor.Player;
-import com.gpl.rpg.AndorsTrail.model.item.Inventory;
-import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
-import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry;
-import com.gpl.rpg.AndorsTrail.model.item.ItemType;
-import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap;
-import com.gpl.rpg.AndorsTrail.model.map.MapObject;
-import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea;
-import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
-import com.gpl.rpg.AndorsTrail.model.map.TMXMapTranslator;
-import com.gpl.rpg.AndorsTrail.util.L;
-
-public final class TileManager {
-
- public static final int BEGIN_ID = 1;
-
- public static final int CHAR_HERO_0 = BEGIN_ID;
- public static final int CHAR_HERO_1 = CHAR_HERO_0+1;
- public static final int CHAR_HERO_2 = CHAR_HERO_1+1;
- //Default hero
- public static final int CHAR_HERO = CHAR_HERO_0;
- //Max hero icon ID in this version.
- public static final int LAST_HERO = CHAR_HERO_2;
-
- public static final int iconID_selection_red = CHAR_HERO_2+1;
- public static final int iconID_selection_yellow = iconID_selection_red+1;
- public static final int iconID_attackselect = iconID_selection_red;
- public static final int iconID_moveselect = iconID_selection_yellow;
- public static final int iconID_groundbag = iconID_moveselect+1;
- public static final int iconID_boxopened = iconID_groundbag+1;
- public static final int iconID_boxclosed = iconID_boxopened+1;
- public static final int iconID_shop = iconID_groundbag;
- public static final int iconID_unassigned_quickslot = iconID_groundbag;
- public static final int iconID_selection_blue = iconID_boxclosed+1;
- public static final int iconID_selection_purple = iconID_selection_blue+1;
- public static final int iconID_selection_green = iconID_selection_purple+1;
-
- public static final int iconID_splatter_red_1a = iconID_selection_green+1;
- public static final int iconID_splatter_red_1b = iconID_splatter_red_1a+1;
- public static final int iconID_splatter_red_2a = iconID_splatter_red_1b+1;
- public static final int iconID_splatter_red_2b = iconID_splatter_red_2a+1;
- public static final int iconID_splatter_brown_1a = iconID_splatter_red_2b+1;
- public static final int iconID_splatter_brown_1b = iconID_splatter_brown_1a+1;
- public static final int iconID_splatter_brown_2a = iconID_splatter_brown_1b+1;
- public static final int iconID_splatter_brown_2b = iconID_splatter_brown_2a+1;
- public static final int iconID_splatter_white_1a = iconID_splatter_brown_2b+1;
- public static final int iconID_splatter_white_1b = iconID_splatter_white_1a+1;
-
- public static final int iconID_immunity_overlay = iconID_splatter_white_1b+1;
-
-
- public int tileSize;
- public float density;
- public float uiIconScale;
-
- public int viewTileSize;
- public float scale;
-
-
- public final TileCache tileCache = new TileCache();
- public final TileCollection preloadedTiles = new TileCollection(116);
- public TileCollection currentMapTiles;
- public TileCollection adjacentMapTiles;
- private final HashSet preloadedTileIDs = new HashSet();
-
-
- public TileCollection loadTilesFor(HashSet tileIDs, Resources r) {
- return tileCache.loadTilesFor(tileIDs, r);
- }
-
- public TileCollection loadTilesFor(ItemContainer container, Resources r) {
- return tileCache.loadTilesFor(getTileIDsFor(container), r);
- }
-
- public HashSet getTileIDsFor(ItemContainer container) {
- HashSet iconIDs = new HashSet();
- for(ItemEntry i : container.items) {
- iconIDs.add(i.itemType.iconID);
- }
- return iconIDs;
- }
-
- public TileCollection loadTilesFor(Inventory inventory, Resources r) {
- HashSet iconIDs = getTileIDsFor(inventory);
- for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
- ItemType t = inventory.getItemTypeInWearSlot(slot);
- if (t != null) iconIDs.add(t.iconID);
- }
- return tileCache.loadTilesFor(iconIDs, r);
- }
-
- public TileCollection loadTilesFor(PredefinedMap map, LayeredTileMap tileMap, WorldContext world, Resources r) {
- HashSet iconIDs = getTileIDsFor(map, tileMap, world);
- TileCollection result = tileCache.loadTilesFor(iconIDs, r);
- for(int i : preloadedTileIDs) {
- result.setBitmap(i, preloadedTiles.getBitmap(i));
- }
- return result;
- }
-
- public HashSet getTileIDsFor(PredefinedMap map, LayeredTileMap tileMap, WorldContext world) {
- HashSet iconIDs = new HashSet();
- for (MonsterSpawnArea a : map.spawnAreas) {
- for (String monsterTypeID : a.monsterTypeIDs) {
- iconIDs.add(world.monsterTypes.getMonsterType(monsterTypeID).iconID);
- }
- // Add icons for monsters that are already spawned, but that do not belong to the group of
- // monsters that usually spawn here. This could happen if we change the contents of spawn-
- // areas in a later release,
- for (Monster m : a.monsters) {
- iconIDs.add(m.iconID);
- }
- }
- iconIDs.addAll(tileMap.usedTileIDs);
- return iconIDs;
- }
-
- public void setDensity(Resources r) {
- density = r.getDisplayMetrics().density;
- uiIconScale = 100 * density;
-// tileSize = (int) (32 * density);
- if (density < 1) tileSize = (int) (32 * density);
- else tileSize = 32;
- }
-
- public void updatePreferences(AndorsTrailPreferences prefs) {
- float densityScaler = 1;
- if (density > 1) densityScaler = density;
- scale = prefs.scalingFactor * densityScaler;
- viewTileSize = (int) (tileSize * prefs.scalingFactor * densityScaler);
- }
-
-
-
- public void setImageViewTile(Resources res, TextView textView, Monster monster) { setImageViewTileForMonster(res, textView, monster.iconID); }
- public void setImageViewTile(Resources res, TextView textView, Player player) { setImageViewTileForPlayer(res, textView, player.iconID); }
- public void setImageViewTileForMonster(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, currentMapTiles.getBitmap(iconID)); }
- public void setImageViewTileForPlayer(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, preloadedTiles.getBitmap(iconID)); }
- public void setImageViewTile(Resources res, TextView textView, ActorConditionType conditionType) { setImageViewTile(res, textView, preloadedTiles.getBitmap(conditionType.iconID)); }
- public void setImageViewTile(Resources res, TextView textView, ActorConditionType conditionType, boolean immunityOverlay) { setImageViewTile(res, textView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay); }
- public void setImageViewTileForUIIcon(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, preloadedTiles.getBitmap(iconID)); }
- private void setImageViewTile(Resources res, TextView textView, Bitmap b) {
- if (density > 1) {
- setImageViewTile(textView, new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true)));
- } else {
- setImageViewTile(textView, new BitmapDrawable(res, b));
- }
- }
- public void setImageViewTile(Resources res, TextView textView, Bitmap b, boolean immunityOverlay) {
- if (!immunityOverlay) setImageViewTile(res, textView, b);
- else {
- Drawable[] layers = new Drawable[2];
- if (density > 1) {
- layers[0] = new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true));
- layers[1] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay));
- } else {
- layers[0] = new BitmapDrawable(res, b);
- layers[1] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay));
- }
- LayerDrawable layered = new LayerDrawable(layers);
- setImageViewTile(textView, layered);
- }
- }
- private void setImageViewTile(TextView textView, Drawable d) {
- /*if (density > 1) {
- ScaleDrawable sd = new ScaleDrawable(d, 0, uiIconScale, uiIconScale);
- sd.setLevel(8000);
- d.setBounds(0, 0, (int)(tileSize * density), (int)(tileSize * density));
- textView.setCompoundDrawables(sd, null, null, null);
- }
- else */textView.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null);
- }
-
- public void setImageViewTileForSingleItemType(Resources res, TextView textView, ItemType itemType) {
- final Bitmap icon = tileCache.loadSingleTile(itemType.iconID, res);
- setImageViewTile(res, textView, itemType, icon);
- }
- public void setImageViewTile(Resources res, TextView textView, ItemType itemType, TileCollection itemTileCollection) {
- final Bitmap icon = itemTileCollection.getBitmap(itemType.iconID);
- setImageViewTile(res, textView, itemType, icon);
- }
- private void setImageViewTile(Resources res, TextView textView, ItemType itemType, Bitmap icon) {
- final int overlayIconID = itemType.getOverlayTileID();
- if (overlayIconID != -1) {
-
- if (density > 1) {
-
- setImageViewTile(textView,
- new LayerDrawable(new Drawable[] {
- new BitmapDrawable(res, Bitmap.createScaledBitmap(preloadedTiles.getBitmap(overlayIconID), (int)(tileSize*density), (int)(tileSize*density), true))
- ,new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true))
- })
- );
- } else {
- setImageViewTile(textView,
- new LayerDrawable(new Drawable[] {
- new BitmapDrawable(res, preloadedTiles.getBitmap(overlayIconID))
- ,new BitmapDrawable(res, icon)
- })
- );
- }
- } else {
- setImageViewTile(res, textView, icon);
- }
- }
-
- public void setImageViewTile(Resources res, ImageView imageView, Monster monster) { setImageViewTileForMonster(res, imageView, monster.iconID); }
- public void setImageViewTile(Resources res, ImageView imageView, Player player) { setImageViewTileForPlayer(res, imageView, player.iconID); }
- public void setImageViewTileForMonster(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, currentMapTiles.getBitmap(iconID)); }
- public void setImageViewTileForPlayer(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(iconID)); }
-// public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID)); }
- public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType, boolean immunityOverlay) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay); }
- public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType, boolean immunityOverlay, String exponent, String index) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay, exponent, index); }
- public void setImageViewTileForUIIcon(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(iconID)); }
- public void setImageViewTile(Resources res, ImageView imageView, Bitmap b) {
- if (density > 1) {
- setImageViewTile(imageView, new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true)));
- } else {
- setImageViewTile(imageView, new BitmapDrawable(res, b));
- }
- }
- public void setImageViewTile(Resources res, ImageView imageView, Bitmap b, boolean immunityOverlay) {
- setImageViewTile(res, imageView, b, immunityOverlay, null, null);
- }
- public void setImageViewTile(Resources res, ImageView imageView, Bitmap b, boolean immunityOverlay, String exponent, String index) {
- if (!immunityOverlay && exponent == null && index == null) setImageViewTile(res, imageView, b);
- else {
- Drawable[] layers = new Drawable[1+
- (immunityOverlay ? 1 : 0)+
- (exponent != null ? 1 : 0)+
- (index != null ? 1 : 0)];
- int tileWidth;
- if (density > 1) {
- tileWidth = (int)(tileSize*density);
- layers[0] = new BitmapDrawable(res, Bitmap.createScaledBitmap(b, tileWidth, tileWidth, true));
- } else {
- tileWidth = tileSize;
- layers[0] = new BitmapDrawable(res, b);
- }
- int nextIndex = 1;
- if (immunityOverlay) {
- layers[nextIndex] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay));
- nextIndex++;
- }
- if (exponent != null) {
- layers[nextIndex] = new TextDrawable(res, tileWidth, tileWidth, exponent, TextDrawable.Align.TOP_RIGHT);
- nextIndex++;
- }
- if (index != null) {
- layers[nextIndex] = new TextDrawable(res, tileWidth, tileWidth, index, TextDrawable.Align.BOTTOM_RIGHT);
- nextIndex++;
- }
- LayerDrawable layered = new LayerDrawable(layers);
- setImageViewTile(imageView, layered);
- }
- }
-
- public void setImageViewTile(ImageView imageView, Drawable d) {
- imageView.setImageDrawable(d);
- }
-
- public void setImageViewTile(Resources res, ImageView imageView, ItemType itemType, TileCollection itemTileCollection) {
- final Bitmap icon = itemTileCollection.getBitmap(itemType.iconID);
- setImageViewTile(res, imageView, itemType, icon);
- }
- public void setImageViewTileWithOverlay(Resources res, ImageView imageView, int overlayIconID, Bitmap icon, boolean overlayAbove) {
- if (overlayIconID != -1) {
- Drawable overlayDrawable, iconDrawable;
- if (density > 1) {
- overlayDrawable = new BitmapDrawable(res, Bitmap.createScaledBitmap(preloadedTiles.getBitmap(overlayIconID), (int)(tileSize*density), (int)(tileSize*density), true));
- iconDrawable = new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true));
- } else {
- overlayDrawable = new BitmapDrawable(res, preloadedTiles.getBitmap(overlayIconID));
- iconDrawable = new BitmapDrawable(res, icon);
- }
-
- if (overlayAbove) {
- LayerDrawable layered = new LayerDrawable(new Drawable[] {
- iconDrawable
- ,overlayDrawable
- });
- setImageViewTile(imageView, layered);
- } else {
- LayerDrawable layered = new LayerDrawable(new Drawable[] {
- overlayDrawable
- ,iconDrawable
- });
- setImageViewTile(imageView, layered);
- }
- } else {
- setImageViewTile(res, imageView, icon);
- }
- }
- private void setImageViewTile(Resources res, ImageView imageView, ItemType itemType, Bitmap icon) {
- final int overlayIconID = itemType.getOverlayTileID();
- setImageViewTileWithOverlay(res, imageView, overlayIconID, icon, false);
- }
-
- public void loadPreloadedTiles(Resources r) {
- int maxTileID = tileCache.getMaxTileID();
- if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
- if (maxTileID > preloadedTiles.maxTileID) {
- L.log("ERROR: TileManager.preloadedTiles needs to be initialized with at least " + maxTileID + " slots. Application will crash now.");
- throw new IndexOutOfBoundsException("ERROR: TileManager.preloadedTiles needs to be initialized with at least " + maxTileID + " slots. Application will crash now.");
- }
- }
- for(int i = TileManager.BEGIN_ID; i <= maxTileID; ++i) {
- preloadedTileIDs.add(i);
- }
- tileCache.loadTilesFor(preloadedTileIDs, r, preloadedTiles);
- }
-
- private final HashMap> tileIDsPerMap = new HashMap>();
- private void addTileIDsFor(HashSet dest, String mapName, final Resources res, final WorldContext world) {
- HashSet cachedTileIDs = tileIDsPerMap.get(mapName);
- if (cachedTileIDs == null) {
- PredefinedMap adjacentMap = world.maps.findPredefinedMap(mapName);
- if (adjacentMap == null) return;
- LayeredTileMap adjacentMapTiles = TMXMapTranslator.readLayeredTileMap(res, tileCache, adjacentMap);
- cachedTileIDs = getTileIDsFor(adjacentMap, adjacentMapTiles, world);
- tileIDsPerMap.put(mapName, cachedTileIDs);
- }
- dest.addAll(cachedTileIDs);
- }
- public void cacheAdjacentMaps(final Resources res, final WorldContext world, final PredefinedMap nextMap) {
- (new AsyncTask() {
- @Override
- protected Void doInBackground(Void... arg0) {
- adjacentMapTiles = null;
-
- HashSet adjacentMapNames = new HashSet();
- for (MapObject o : nextMap.eventObjects) {
- if (o.type != MapObject.MapObjectType.newmap) continue;
- if (o.map == null) continue;
- adjacentMapNames.add(o.map);
- }
-
- HashSet tileIDs = new HashSet();
- for (String mapName : adjacentMapNames) {
- addTileIDsFor(tileIDs, mapName, res, world);
- }
-
- long freeMemRequired = tileSize * tileSize * tileIDs.size() * 4 /*RGBA_8888*/ * 2 /*Require twice the needed size, to leave room for others*/;
- Runtime r = Runtime.getRuntime();
-
- if (r.maxMemory() - r.totalMemory() > freeMemRequired) {
- adjacentMapTiles = tileCache.loadTilesFor(tileIDs, res);
- }
- return null;
- }
- }).execute();
- }
-
- private static class TextDrawable extends Drawable {
-
- private String text;
- private int size = 15;
- private Align align = Align.CENTER;
- private Paint mFillPaint;
- private Paint mStrokePaint;
- private Rect textBounds;
- private int cHeight;
- private int cWidth;
-
- public enum Align {
- TOP,
- TOP_LEFT,
- TOP_RIGHT,
- CENTER,
- LEFT,
- RIGHT,
- BOTTOM,
- BOTTOM_LEFT,
- BOTTOM_RIGHT
- }
-
- public TextDrawable(Resources res, int cWidth, int cHeight, String text, Align align, int size) {
- this.text= text;
- this.align = align;
- this.size = size;
- this.cWidth = cWidth;
- this.cHeight = cHeight;
- init(res);
- }
-
- public TextDrawable(Resources res, int cWidth, int cHeight, String text, Align align) {
- this.text= text;
- this.align = align;
- this.cWidth = cWidth;
- this.cHeight = cHeight;
- init(res);
- }
-
- public TextDrawable(Resources res, int cWidth, int cHeight, String text) {
- this.text= text;
- this.cWidth = cWidth;
- this.cHeight = cHeight;
- init(res);
- }
-
- public void init(Resources res) {
- mFillPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-
- mFillPaint.setColor(res.getColor(R.color.ui_blue_palette_text_gray_light));
-// mFillPaint.setShadowLayer(5f * res.getDisplayMetrics().scaledDensity, 1, 1, res.getColor(android.R.color.black));
- mFillPaint.setStyle(Paint.Style.FILL);
- mFillPaint.setTextSize(size * res.getDisplayMetrics().scaledDensity);
- textBounds = new Rect();
- mFillPaint.getTextBounds(text, 0, text.length(), textBounds);
- mStrokePaint=new Paint(mFillPaint);
-// mStrokePaint.setStyle(Paint.Style.FILL);
-// mStrokePaint.setStrokeWidth(1f * res.getDisplayMetrics().scaledDensity);
- mStrokePaint.setColor(res.getColor(R.color.ui_blue_palette_blue_mid));
- }
-
-
-
- @Override
- public void draw(Canvas canvas) {
- float x,y;
- switch (align) {
- case BOTTOM:
- case BOTTOM_LEFT:
- case BOTTOM_RIGHT:
- y = cHeight - textBounds.bottom;
- break;
- case CENTER:
- case LEFT:
- case RIGHT:
- y = (cHeight - textBounds.height()) / 2;
- break;
- case TOP:
- case TOP_LEFT:
- case TOP_RIGHT:
- default:
- y = 0 - textBounds.top;
- break;
- }
-
- switch (align) {
- case BOTTOM:
- case CENTER:
- case TOP:
- x = (cWidth - textBounds.width()) / 2;
- break;
- case BOTTOM_LEFT:
- case LEFT:
- case TOP_LEFT:
- default:
- x = 0 - textBounds.left;
- break;
- case BOTTOM_RIGHT:
- case RIGHT:
- case TOP_RIGHT:
- x = cWidth - textBounds.right;
- break;
-
- }
- canvas.drawRect(x, y - textBounds.height(), x + textBounds.width(), y, mStrokePaint);
- canvas.drawText(text, x, y, mFillPaint);
-// canvas.drawText(text, x, y, mStrokePaint);
- }
-
- @Override
- public void setAlpha(int alpha) {
- mFillPaint.setAlpha(alpha);
-// mStrokePaint.setAlpha(alpha);
- }
-
- @Override
- public void setColorFilter(ColorFilter cf) {
- mFillPaint.setColorFilter(cf);
-// mStrokePaint.setColorFilter(cf);
- }
-
- @Override
- public int getOpacity() {
- return mFillPaint.getAlpha();
- }
-
- @Override
- public int getIntrinsicWidth() {
- return cWidth;
- }
-
- @Override
- public int getIntrinsicHeight() {
- return cHeight;
- }
-
- @Override
- public boolean getPadding(Rect padding) {
- padding.bottom = 0;
- padding.top = 0;
- padding.left = 0;
- padding.right = 0;
- return false;
- }
-
- }
-}
+package com.gpl.rpg.AndorsTrail.resource.tiles;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.os.AsyncTask;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
+import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
+import com.gpl.rpg.AndorsTrail.R;
+import com.gpl.rpg.AndorsTrail.context.WorldContext;
+import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType;
+import com.gpl.rpg.AndorsTrail.model.actor.Monster;
+import com.gpl.rpg.AndorsTrail.model.actor.Player;
+import com.gpl.rpg.AndorsTrail.model.item.Inventory;
+import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
+import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry;
+import com.gpl.rpg.AndorsTrail.model.item.ItemType;
+import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap;
+import com.gpl.rpg.AndorsTrail.model.map.MapObject;
+import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea;
+import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
+import com.gpl.rpg.AndorsTrail.model.map.TMXMapTranslator;
+import com.gpl.rpg.AndorsTrail.util.L;
+
+public final class TileManager {
+
+ public static final int BEGIN_ID = 1;
+
+ public static final int CHAR_HERO_0 = BEGIN_ID;
+ public static final int CHAR_HERO_1 = CHAR_HERO_0+1;
+ public static final int CHAR_HERO_2 = CHAR_HERO_1+1;
+ //Default hero
+ public static final int CHAR_HERO = CHAR_HERO_0;
+ //Max hero icon ID in this version.
+ public static final int LAST_HERO = CHAR_HERO_2;
+
+ public static final int iconID_selection_red = CHAR_HERO_2+1;
+ public static final int iconID_selection_yellow = iconID_selection_red+1;
+ public static final int iconID_attackselect = iconID_selection_red;
+ public static final int iconID_moveselect = iconID_selection_yellow;
+ public static final int iconID_groundbag = iconID_moveselect+1;
+ public static final int iconID_boxopened = iconID_groundbag+1;
+ public static final int iconID_boxclosed = iconID_boxopened+1;
+ public static final int iconID_shop = iconID_groundbag;
+ public static final int iconID_unassigned_quickslot = iconID_groundbag;
+ public static final int iconID_selection_blue = iconID_boxclosed+1;
+ public static final int iconID_selection_purple = iconID_selection_blue+1;
+ public static final int iconID_selection_green = iconID_selection_purple+1;
+
+ public static final int iconID_splatter_red_1a = iconID_selection_green+1;
+ public static final int iconID_splatter_red_1b = iconID_splatter_red_1a+1;
+ public static final int iconID_splatter_red_2a = iconID_splatter_red_1b+1;
+ public static final int iconID_splatter_red_2b = iconID_splatter_red_2a+1;
+ public static final int iconID_splatter_brown_1a = iconID_splatter_red_2b+1;
+ public static final int iconID_splatter_brown_1b = iconID_splatter_brown_1a+1;
+ public static final int iconID_splatter_brown_2a = iconID_splatter_brown_1b+1;
+ public static final int iconID_splatter_brown_2b = iconID_splatter_brown_2a+1;
+ public static final int iconID_splatter_white_1a = iconID_splatter_brown_2b+1;
+ public static final int iconID_splatter_white_1b = iconID_splatter_white_1a+1;
+
+ public static final int iconID_immunity_overlay = iconID_splatter_white_1b+1;
+
+
+ public int tileSize;
+ public float density;
+ public float uiIconScale;
+
+ public int viewTileSize;
+ public float scale;
+
+
+ public final TileCache tileCache = new TileCache();
+ public final TileCollection preloadedTiles = new TileCollection(116);
+ public TileCollection currentMapTiles;
+ public TileCollection adjacentMapTiles;
+ private final HashSet preloadedTileIDs = new HashSet();
+
+
+ public TileCollection loadTilesFor(Collection tileIDs, Resources r) {
+ return tileCache.loadTilesFor(tileIDs, r);
+ }
+
+ public TileCollection loadTilesFor(ItemContainer container, Resources r) {
+ return tileCache.loadTilesFor(getTileIDsFor(container), r);
+ }
+
+ public HashSet getTileIDsFor(ItemContainer container) {
+ HashSet iconIDs = new HashSet();
+ for(ItemEntry i : container.items) {
+ iconIDs.add(i.itemType.iconID);
+ }
+ return iconIDs;
+ }
+
+ public TileCollection loadTilesFor(Inventory inventory, Resources r) {
+ HashSet iconIDs = getTileIDsFor(inventory);
+ for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
+ ItemType t = inventory.getItemTypeInWearSlot(slot);
+ if (t != null) iconIDs.add(t.iconID);
+ }
+ return tileCache.loadTilesFor(iconIDs, r);
+ }
+
+ public TileCollection loadTilesFor(PredefinedMap map, LayeredTileMap tileMap, WorldContext world, Resources r) {
+ HashSet iconIDs = getTileIDsFor(map, tileMap, world);
+ TileCollection result = tileCache.loadTilesFor(iconIDs, r);
+ for(int i : preloadedTileIDs) {
+ result.setBitmap(i, preloadedTiles.getBitmap(i));
+ }
+ return result;
+ }
+
+ public HashSet getTileIDsFor(PredefinedMap map, LayeredTileMap tileMap, WorldContext world) {
+ HashSet iconIDs = new HashSet();
+ for (MonsterSpawnArea a : map.spawnAreas) {
+ for (String monsterTypeID : a.monsterTypeIDs) {
+ iconIDs.add(world.monsterTypes.getMonsterType(monsterTypeID).iconID);
+ }
+ // Add icons for monsters that are already spawned, but that do not belong to the group of
+ // monsters that usually spawn here. This could happen if we change the contents of spawn-
+ // areas in a later release,
+ for (Monster m : a.monsters) {
+ iconIDs.add(m.iconID);
+ }
+ }
+ iconIDs.addAll(tileMap.usedTileIDs);
+ return iconIDs;
+ }
+
+ public void setDensity(Resources r) {
+ density = r.getDisplayMetrics().density;
+ uiIconScale = 100 * density;
+// tileSize = (int) (32 * density);
+ if (density < 1) tileSize = (int) (32 * density);
+ else tileSize = 32;
+ }
+
+ public void updatePreferences(AndorsTrailPreferences prefs) {
+ float densityScaler = 1;
+ if (density > 1) densityScaler = density;
+ scale = prefs.scalingFactor * densityScaler;
+ viewTileSize = (int) (tileSize * prefs.scalingFactor * densityScaler);
+ }
+
+
+
+ public void setImageViewTile(Resources res, TextView textView, Monster monster) { setImageViewTileForMonster(res, textView, monster.iconID); }
+ public void setImageViewTile(Resources res, TextView textView, Player player) { setImageViewTileForPlayer(res, textView, player.iconID); }
+ public void setImageViewTileForMonster(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, currentMapTiles.getBitmap(iconID)); }
+ public void setImageViewTileForPlayer(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, preloadedTiles.getBitmap(iconID)); }
+ public void setImageViewTile(Resources res, TextView textView, ActorConditionType conditionType) { setImageViewTile(res, textView, preloadedTiles.getBitmap(conditionType.iconID)); }
+ public void setImageViewTile(Resources res, TextView textView, ActorConditionType conditionType, boolean immunityOverlay) { setImageViewTile(res, textView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay); }
+ public void setImageViewTileForUIIcon(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, preloadedTiles.getBitmap(iconID)); }
+ private void setImageViewTile(Resources res, TextView textView, Bitmap b) {
+ if (density > 1) {
+ setImageViewTile(textView, new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true)));
+ } else {
+ setImageViewTile(textView, new BitmapDrawable(res, b));
+ }
+ }
+ public void setImageViewTile(Resources res, TextView textView, Bitmap b, boolean immunityOverlay) {
+ if (!immunityOverlay) setImageViewTile(res, textView, b);
+ else {
+ Drawable[] layers = new Drawable[2];
+ if (density > 1) {
+ layers[0] = new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true));
+ layers[1] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay));
+ } else {
+ layers[0] = new BitmapDrawable(res, b);
+ layers[1] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay));
+ }
+ LayerDrawable layered = new LayerDrawable(layers);
+ setImageViewTile(textView, layered);
+ }
+ }
+ private void setImageViewTile(TextView textView, Drawable d) {
+ /*if (density > 1) {
+ ScaleDrawable sd = new ScaleDrawable(d, 0, uiIconScale, uiIconScale);
+ sd.setLevel(8000);
+ d.setBounds(0, 0, (int)(tileSize * density), (int)(tileSize * density));
+ textView.setCompoundDrawables(sd, null, null, null);
+ }
+ else */textView.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null);
+ }
+
+ public void setImageViewTileForSingleItemType(Resources res, TextView textView, ItemType itemType) {
+ final Bitmap icon = tileCache.loadSingleTile(itemType.iconID, res);
+ setImageViewTile(res, textView, itemType, icon);
+ }
+ public void setImageViewTile(Resources res, TextView textView, ItemType itemType, TileCollection itemTileCollection) {
+ final Bitmap icon = itemTileCollection.getBitmap(itemType.iconID);
+ setImageViewTile(res, textView, itemType, icon);
+ }
+ private void setImageViewTile(Resources res, TextView textView, ItemType itemType, Bitmap icon) {
+ final int overlayIconID = itemType.getOverlayTileID();
+ if (overlayIconID != -1) {
+
+ if (density > 1) {
+
+ setImageViewTile(textView,
+ new LayerDrawable(new Drawable[] {
+ new BitmapDrawable(res, Bitmap.createScaledBitmap(preloadedTiles.getBitmap(overlayIconID), (int)(tileSize*density), (int)(tileSize*density), true))
+ ,new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true))
+ })
+ );
+ } else {
+ setImageViewTile(textView,
+ new LayerDrawable(new Drawable[] {
+ new BitmapDrawable(res, preloadedTiles.getBitmap(overlayIconID))
+ ,new BitmapDrawable(res, icon)
+ })
+ );
+ }
+ } else {
+ setImageViewTile(res, textView, icon);
+ }
+ }
+
+ public void setImageViewTile(Resources res, ImageView imageView, Monster monster) { setImageViewTileForMonster(res, imageView, monster.iconID); }
+ public void setImageViewTile(Resources res, ImageView imageView, Player player) { setImageViewTileForPlayer(res, imageView, player.iconID); }
+ public void setImageViewTileForMonster(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, currentMapTiles.getBitmap(iconID)); }
+ public void setImageViewTileForPlayer(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(iconID)); }
+// public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID)); }
+ public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType, boolean immunityOverlay) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay); }
+ public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType, boolean immunityOverlay, String exponent, String index) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay, exponent, index); }
+ public void setImageViewTileForUIIcon(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(iconID)); }
+ public void setImageViewTile(Resources res, ImageView imageView, Bitmap b) {
+ if (density > 1) {
+ setImageViewTile(imageView, new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true)));
+ } else {
+ setImageViewTile(imageView, new BitmapDrawable(res, b));
+ }
+ }
+ public void setImageViewTile(Resources res, ImageView imageView, Bitmap b, boolean immunityOverlay) {
+ setImageViewTile(res, imageView, b, immunityOverlay, null, null);
+ }
+ public void setImageViewTile(Resources res, ImageView imageView, Bitmap b, boolean immunityOverlay, String exponent, String index) {
+ if (!immunityOverlay && exponent == null && index == null) setImageViewTile(res, imageView, b);
+ else {
+ Drawable[] layers = new Drawable[1+
+ (immunityOverlay ? 1 : 0)+
+ (exponent != null ? 1 : 0)+
+ (index != null ? 1 : 0)];
+ int tileWidth;
+ if (density > 1) {
+ tileWidth = (int)(tileSize*density);
+ layers[0] = new BitmapDrawable(res, Bitmap.createScaledBitmap(b, tileWidth, tileWidth, true));
+ } else {
+ tileWidth = tileSize;
+ layers[0] = new BitmapDrawable(res, b);
+ }
+ int nextIndex = 1;
+ if (immunityOverlay) {
+ layers[nextIndex] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay));
+ nextIndex++;
+ }
+ if (exponent != null) {
+ layers[nextIndex] = new TextDrawable(res, tileWidth, tileWidth, exponent, TextDrawable.Align.TOP_RIGHT);
+ nextIndex++;
+ }
+ if (index != null) {
+ layers[nextIndex] = new TextDrawable(res, tileWidth, tileWidth, index, TextDrawable.Align.BOTTOM_RIGHT);
+ nextIndex++;
+ }
+ LayerDrawable layered = new LayerDrawable(layers);
+ setImageViewTile(imageView, layered);
+ }
+ }
+
+ public void setImageViewTile(ImageView imageView, Drawable d) {
+ imageView.setImageDrawable(d);
+ }
+
+ public void setImageViewTile(Resources res, ImageView imageView, ItemType itemType, TileCollection itemTileCollection) {
+ final Bitmap icon = itemTileCollection.getBitmap(itemType.iconID);
+ setImageViewTile(res, imageView, itemType, icon);
+ }
+ public void setImageViewTileWithOverlay(Resources res, ImageView imageView, int overlayIconID, Bitmap icon, boolean overlayAbove) {
+ if (overlayIconID != -1) {
+ Drawable overlayDrawable, iconDrawable;
+ if (density > 1) {
+ overlayDrawable = new BitmapDrawable(res, Bitmap.createScaledBitmap(preloadedTiles.getBitmap(overlayIconID), (int)(tileSize*density), (int)(tileSize*density), true));
+ iconDrawable = new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true));
+ } else {
+ overlayDrawable = new BitmapDrawable(res, preloadedTiles.getBitmap(overlayIconID));
+ iconDrawable = new BitmapDrawable(res, icon);
+ }
+
+ if (overlayAbove) {
+ LayerDrawable layered = new LayerDrawable(new Drawable[] {
+ iconDrawable
+ ,overlayDrawable
+ });
+ setImageViewTile(imageView, layered);
+ } else {
+ LayerDrawable layered = new LayerDrawable(new Drawable[] {
+ overlayDrawable
+ ,iconDrawable
+ });
+ setImageViewTile(imageView, layered);
+ }
+ } else {
+ setImageViewTile(res, imageView, icon);
+ }
+ }
+ private void setImageViewTile(Resources res, ImageView imageView, ItemType itemType, Bitmap icon) {
+ final int overlayIconID = itemType.getOverlayTileID();
+ setImageViewTileWithOverlay(res, imageView, overlayIconID, icon, false);
+ }
+
+
+
+ public Drawable getDrawableForItem(Resources res, int iconID, TileCollection itemTileCollection) {
+ final Bitmap icon = itemTileCollection.getBitmap(iconID);
+ if (density > 1) {
+ return new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true));
+ } else {
+ return new BitmapDrawable(res, icon);
+ }
+ }
+
+ public void loadPreloadedTiles(Resources r) {
+ int maxTileID = tileCache.getMaxTileID();
+ if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
+ if (maxTileID > preloadedTiles.maxTileID) {
+ L.log("ERROR: TileManager.preloadedTiles needs to be initialized with at least " + maxTileID + " slots. Application will crash now.");
+ throw new IndexOutOfBoundsException("ERROR: TileManager.preloadedTiles needs to be initialized with at least " + maxTileID + " slots. Application will crash now.");
+ }
+ }
+ for(int i = TileManager.BEGIN_ID; i <= maxTileID; ++i) {
+ preloadedTileIDs.add(i);
+ }
+ tileCache.loadTilesFor(preloadedTileIDs, r, preloadedTiles);
+ }
+
+ private final HashMap> tileIDsPerMap = new HashMap>();
+ private void addTileIDsFor(HashSet dest, String mapName, final Resources res, final WorldContext world) {
+ HashSet cachedTileIDs = tileIDsPerMap.get(mapName);
+ if (cachedTileIDs == null) {
+ PredefinedMap adjacentMap = world.maps.findPredefinedMap(mapName);
+ if (adjacentMap == null) return;
+ LayeredTileMap adjacentMapTiles = TMXMapTranslator.readLayeredTileMap(res, tileCache, adjacentMap);
+ cachedTileIDs = getTileIDsFor(adjacentMap, adjacentMapTiles, world);
+ tileIDsPerMap.put(mapName, cachedTileIDs);
+ }
+ dest.addAll(cachedTileIDs);
+ }
+ public void cacheAdjacentMaps(final Resources res, final WorldContext world, final PredefinedMap nextMap) {
+ (new AsyncTask() {
+ @Override
+ protected Void doInBackground(Void... arg0) {
+ adjacentMapTiles = null;
+
+ HashSet adjacentMapNames = new HashSet();
+ for (MapObject o : nextMap.eventObjects) {
+ if (o.type != MapObject.MapObjectType.newmap) continue;
+ if (o.map == null) continue;
+ adjacentMapNames.add(o.map);
+ }
+
+ HashSet tileIDs = new HashSet();
+ for (String mapName : adjacentMapNames) {
+ addTileIDsFor(tileIDs, mapName, res, world);
+ }
+
+ long freeMemRequired = tileSize * tileSize * tileIDs.size() * 4 /*RGBA_8888*/ * 2 /*Require twice the needed size, to leave room for others*/;
+ Runtime r = Runtime.getRuntime();
+
+ if (r.maxMemory() - r.totalMemory() > freeMemRequired) {
+ adjacentMapTiles = tileCache.loadTilesFor(tileIDs, res);
+ }
+ return null;
+ }
+ }).execute();
+ }
+
+ private static class TextDrawable extends Drawable {
+
+ private String text;
+ private int size = 15;
+ private Align align = Align.CENTER;
+ private Paint mFillPaint;
+ private Paint mStrokePaint;
+ private Rect textBounds;
+ private int cHeight;
+ private int cWidth;
+
+ public enum Align {
+ TOP,
+ TOP_LEFT,
+ TOP_RIGHT,
+ CENTER,
+ LEFT,
+ RIGHT,
+ BOTTOM,
+ BOTTOM_LEFT,
+ BOTTOM_RIGHT
+ }
+
+ public TextDrawable(Resources res, int cWidth, int cHeight, String text, Align align, int size) {
+ this.text= text;
+ this.align = align;
+ this.size = size;
+ this.cWidth = cWidth;
+ this.cHeight = cHeight;
+ init(res);
+ }
+
+ public TextDrawable(Resources res, int cWidth, int cHeight, String text, Align align) {
+ this.text= text;
+ this.align = align;
+ this.cWidth = cWidth;
+ this.cHeight = cHeight;
+ init(res);
+ }
+
+ public TextDrawable(Resources res, int cWidth, int cHeight, String text) {
+ this.text= text;
+ this.cWidth = cWidth;
+ this.cHeight = cHeight;
+ init(res);
+ }
+
+ public void init(Resources res) {
+ mFillPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
+ mFillPaint.setColor(res.getColor(R.color.ui_blue_palette_text_gray_light));
+// mFillPaint.setShadowLayer(5f * res.getDisplayMetrics().scaledDensity, 1, 1, res.getColor(android.R.color.black));
+ mFillPaint.setStyle(Paint.Style.FILL);
+ mFillPaint.setTextSize(size * res.getDisplayMetrics().scaledDensity);
+ textBounds = new Rect();
+ mFillPaint.getTextBounds(text, 0, text.length(), textBounds);
+ mStrokePaint=new Paint(mFillPaint);
+// mStrokePaint.setStyle(Paint.Style.FILL);
+// mStrokePaint.setStrokeWidth(1f * res.getDisplayMetrics().scaledDensity);
+ mStrokePaint.setColor(res.getColor(R.color.ui_blue_palette_blue_mid));
+ }
+
+
+
+ @Override
+ public void draw(Canvas canvas) {
+ float x,y;
+ switch (align) {
+ case BOTTOM:
+ case BOTTOM_LEFT:
+ case BOTTOM_RIGHT:
+ y = cHeight - textBounds.bottom;
+ break;
+ case CENTER:
+ case LEFT:
+ case RIGHT:
+ y = (cHeight - textBounds.height()) / 2;
+ break;
+ case TOP:
+ case TOP_LEFT:
+ case TOP_RIGHT:
+ default:
+ y = 0 - textBounds.top;
+ break;
+ }
+
+ switch (align) {
+ case BOTTOM:
+ case CENTER:
+ case TOP:
+ x = (cWidth - textBounds.width()) / 2;
+ break;
+ case BOTTOM_LEFT:
+ case LEFT:
+ case TOP_LEFT:
+ default:
+ x = 0 - textBounds.left;
+ break;
+ case BOTTOM_RIGHT:
+ case RIGHT:
+ case TOP_RIGHT:
+ x = cWidth - textBounds.right;
+ break;
+
+ }
+ canvas.drawRect(x, y - textBounds.height(), x + textBounds.width(), y, mStrokePaint);
+ canvas.drawText(text, x, y, mFillPaint);
+// canvas.drawText(text, x, y, mStrokePaint);
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ mFillPaint.setAlpha(alpha);
+// mStrokePaint.setAlpha(alpha);
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ mFillPaint.setColorFilter(cf);
+// mStrokePaint.setColorFilter(cf);
+ }
+
+ @Override
+ public int getOpacity() {
+ return mFillPaint.getAlpha();
+ }
+
+ @Override
+ public int getIntrinsicWidth() {
+ return cWidth;
+ }
+
+ @Override
+ public int getIntrinsicHeight() {
+ return cHeight;
+ }
+
+ @Override
+ public boolean getPadding(Rect padding) {
+ padding.bottom = 0;
+ padding.top = 0;
+ padding.left = 0;
+ padding.right = 0;
+ return false;
+ }
+
+ }
+}
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CustomMenuInflater.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CustomMenuInflater.java
new file mode 100644
index 000000000..b8ae3ddab
--- /dev/null
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CustomMenuInflater.java
@@ -0,0 +1,554 @@
+package com.gpl.rpg.AndorsTrail.view;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.gpl.rpg.AndorsTrail.R;
+import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory.CustomDialog;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.view.ActionProvider;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.SubMenu;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class CustomMenuInflater {
+
+ public interface MenuItemSelectedListener {
+ public void onMenuItemSelected(MenuItem item, Object data);
+ }
+
+ public static void showMenuInDialog(Activity activity, Menu menu, Drawable icon, String title, Object data, MenuItemSelectedListener listener ) {
+ getMenuDialog(activity, menu, icon, title, data, listener).show();
+ }
+
+ public static Dialog getMenuDialog(Activity activity, Menu menu, Drawable icon, String title, Object data, MenuItemSelectedListener listener ) {
+ View v = getMenuView(activity, menu, icon, title, data, listener);
+ final CustomDialog dialog = CustomDialogFactory.createDialog(activity, title, icon, null, v, false);
+ v.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dialog.dismiss();
+ }
+ });
+
+ return dialog;
+ }
+
+ public static View getMenuView(Activity activity, Menu menu, Drawable icon, String title, Object data, MenuItemSelectedListener listener ) {
+ ViewGroup vg = (ViewGroup) activity.getLayoutInflater().inflate(R.layout.custom_menu_layout, null);
+ MenuItem item;
+ for (int i = 0; i < menu.size(); i++) {
+ item = menu.getItem(i);
+ if (item.isVisible()) {
+ if (item.hasSubMenu()) {
+ addMenuItemView(activity, vg, item, data, listener);
+ } else {
+ addSubMenuItemView(activity, vg, icon, title, item, data, listener);
+ }
+ }
+ }
+ return vg;
+ }
+
+ private static void addMenuItemView(Activity activity, ViewGroup vg, final MenuItem item, final Object data, final MenuItemSelectedListener listener) {
+ ViewGroup shell = (ViewGroup) activity.getLayoutInflater().inflate(R.layout.custom_menu_item_layout, vg);
+ TextView tv = (TextView) shell.findViewById(R.id.custom_menu_item_template);
+ shell.removeView(tv);
+ tv.setText(item.getTitle());
+ tv.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onMenuItemSelected(item, data);
+ }
+ });
+ vg.addView(tv);
+ }
+
+
+
+ private static void addSubMenuItemView(final Activity activity, ViewGroup vg, final Drawable icon, final String title, final MenuItem item, final Object data, final MenuItemSelectedListener listener) {
+ ViewGroup shell = (ViewGroup) activity.getLayoutInflater().inflate(R.layout.custom_menu_submenu_layout, vg);
+ TextView tv = (TextView) shell.findViewById(R.id.custom_submenu_item_template);
+ shell.removeView(tv);
+ tv.setText(item.getTitle());
+ tv.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showMenuInDialog(activity, item.getSubMenu(), icon, title, data, listener);
+ }
+ });
+ vg.addView(tv);
+ }
+
+
+ public static Menu newMenuInstance(Context context) {
+ return new DummyMenu(context);
+ }
+
+ private static class DummyMenu implements Menu {
+
+ Context context;
+ List