diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java index 4fb2b0dc3..b66da7262 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java @@ -1,71 +1,71 @@ -package com.gpl.rpg.AndorsTrail; - -import android.app.Activity; -import android.app.Application; -import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.view.Window; -import android.view.WindowManager; -import com.gpl.rpg.AndorsTrail.context.ControllerContext; -import com.gpl.rpg.AndorsTrail.context.WorldContext; - -import java.util.Locale; - -public final class AndorsTrailApplication extends Application { - - public static final boolean DEVELOPMENT_DEBUGRESOURCES = false; - public static final boolean DEVELOPMENT_FORCE_STARTNEWGAME = false; - public static final boolean DEVELOPMENT_FORCE_CONTINUEGAME = false; - public static final boolean DEVELOPMENT_DEBUGBUTTONS = true; - public static final boolean DEVELOPMENT_FASTSPEED = true; - public static final boolean DEVELOPMENT_VALIDATEDATA = true; - public static final boolean DEVELOPMENT_DEBUGMESSAGES = false; - public static final boolean DEVELOPMENT_INCOMPATIBLE_SAVEGAMES = DEVELOPMENT_DEBUGRESOURCES || DEVELOPMENT_DEBUGBUTTONS || DEVELOPMENT_FASTSPEED; - public static final int CURRENT_VERSION = DEVELOPMENT_INCOMPATIBLE_SAVEGAMES ? 999 : 43; - public static final String CURRENT_VERSION_DISPLAY = "0.7.2dev"; - public static final boolean IS_RELEASE_VERSION = !CURRENT_VERSION_DISPLAY.matches(".*[a-d].*"); - - private final AndorsTrailPreferences preferences = new AndorsTrailPreferences(); - private final WorldContext world = new WorldContext(); - private final ControllerContext controllers = new ControllerContext(this, world); - private final WorldSetup setup = new WorldSetup(world, controllers, this); - public WorldContext getWorld() { return world; } - public WorldSetup getWorldSetup() { return setup; } - public AndorsTrailPreferences getPreferences() { return preferences; } - public ControllerContext getControllerContext() { return controllers; } - - public static AndorsTrailApplication getApplicationFromActivity(Activity activity) { - return ((AndorsTrailApplication) activity.getApplication()); - } - public static AndorsTrailApplication getApplicationFromActivityContext(Context context) { - return getApplicationFromActivity(getActivityFromActivityContext(context)); - } - private static Activity getActivityFromActivityContext(Context context) { - return (Activity) context; - } - - public boolean isInitialized() { return world.model != null; } - - public void setWindowParameters(Activity activity) { - activity.requestWindowFeature(Window.FEATURE_NO_TITLE); - if (preferences.fullscreen) { - activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - } else { - activity.getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - setLocale(activity); - } - - public boolean setLocale(Activity context) { - Resources res = context.getResources(); - Configuration conf = res.getConfiguration(); - final Locale targetLocale = preferences.useLocalizedResources ? Locale.getDefault() : Locale.US; - if (targetLocale.equals(conf.locale)) return false; - - conf.locale = targetLocale; - res.updateConfiguration(conf, res.getDisplayMetrics()); - this.getResources().updateConfiguration(conf, res.getDisplayMetrics()); - return true; - } -} +package com.gpl.rpg.AndorsTrail; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.view.Window; +import android.view.WindowManager; +import com.gpl.rpg.AndorsTrail.context.ControllerContext; +import com.gpl.rpg.AndorsTrail.context.WorldContext; + +import java.util.Locale; + +public final class AndorsTrailApplication extends Application { + + public static final boolean DEVELOPMENT_DEBUGRESOURCES = false; + public static final boolean DEVELOPMENT_FORCE_STARTNEWGAME = false; + public static final boolean DEVELOPMENT_FORCE_CONTINUEGAME = false; + public static final boolean DEVELOPMENT_DEBUGBUTTONS = true; + public static final boolean DEVELOPMENT_FASTSPEED = true; + public static final boolean DEVELOPMENT_VALIDATEDATA = true; + public static final boolean DEVELOPMENT_DEBUGMESSAGES = false; + public static final boolean DEVELOPMENT_INCOMPATIBLE_SAVEGAMES = DEVELOPMENT_DEBUGRESOURCES || DEVELOPMENT_DEBUGBUTTONS || DEVELOPMENT_FASTSPEED; + public static final int CURRENT_VERSION = DEVELOPMENT_INCOMPATIBLE_SAVEGAMES ? 999 : 43; + public static final String CURRENT_VERSION_DISPLAY = "0.7.2dev"; + public static final boolean IS_RELEASE_VERSION = !CURRENT_VERSION_DISPLAY.matches(".*[a-d].*"); + + private final AndorsTrailPreferences preferences = new AndorsTrailPreferences(); + private final WorldContext world = new WorldContext(); + private final ControllerContext controllers = new ControllerContext(this, world); + private final WorldSetup setup = new WorldSetup(world, controllers, this); + public WorldContext getWorld() { return world; } + public WorldSetup getWorldSetup() { return setup; } + public AndorsTrailPreferences getPreferences() { return preferences; } + public ControllerContext getControllerContext() { return controllers; } + + public static AndorsTrailApplication getApplicationFromActivity(Activity activity) { + return ((AndorsTrailApplication) activity.getApplication()); + } + public static AndorsTrailApplication getApplicationFromActivityContext(Context context) { + return getApplicationFromActivity(getActivityFromActivityContext(context)); + } + private static Activity getActivityFromActivityContext(Context context) { + return (Activity) context; + } + + public boolean isInitialized() { return world.model != null; } + + public void setWindowParameters(Activity activity) { + activity.requestWindowFeature(Window.FEATURE_NO_TITLE); + if (preferences.fullscreen) { + activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + } else { + activity.getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + setLocale(activity); + } + + public boolean setLocale(Activity context) { + Resources res = context.getResources(); + Configuration conf = res.getConfiguration(); + final Locale targetLocale = preferences.useLocalizedResources ? Locale.getDefault() : Locale.US; + if (targetLocale.equals(conf.locale)) return false; + + conf.locale = targetLocale; + res.updateConfiguration(conf, res.getDisplayMetrics()); + this.getResources().updateConfiguration(conf, res.getDisplayMetrics()); + return true; + } +} diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java index c44a95e3b..cf6306240 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java @@ -1,497 +1,497 @@ -package com.gpl.rpg.AndorsTrail.activity; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Intent; -import android.os.Bundle; -import android.view.*; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.View.OnClickListener; -import android.view.View.OnLongClickListener; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.Button; -import android.widget.ListView; -import android.widget.RelativeLayout; -import android.widget.TextView; -import android.widget.Toast; - -import com.gpl.rpg.AndorsTrail.AndorsTrailApplication; -import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences; -import com.gpl.rpg.AndorsTrail.Dialogs; -import com.gpl.rpg.AndorsTrail.R; -import com.gpl.rpg.AndorsTrail.context.ControllerContext; -import com.gpl.rpg.AndorsTrail.context.WorldContext; -import com.gpl.rpg.AndorsTrail.controller.AttackResult; -import com.gpl.rpg.AndorsTrail.controller.CombatController; -import com.gpl.rpg.AndorsTrail.controller.listeners.CombatActionListener; -import com.gpl.rpg.AndorsTrail.controller.listeners.CombatTurnListener; -import com.gpl.rpg.AndorsTrail.controller.listeners.PlayerMovementListener; -import com.gpl.rpg.AndorsTrail.controller.listeners.WorldEventListener; -import com.gpl.rpg.AndorsTrail.model.actor.Monster; -import com.gpl.rpg.AndorsTrail.model.actor.Player; -import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry; -import com.gpl.rpg.AndorsTrail.model.item.Loot; -import com.gpl.rpg.AndorsTrail.model.map.MapObject; -import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap; -import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection; -import com.gpl.rpg.AndorsTrail.savegames.Savegames; -import com.gpl.rpg.AndorsTrail.util.Coord; -import com.gpl.rpg.AndorsTrail.view.*; -import com.gpl.rpg.AndorsTrail.view.QuickButton.QuickButtonContextMenuInfo; - -import java.lang.ref.WeakReference; -import java.util.Collection; - -public final class MainActivity - extends Activity - implements - PlayerMovementListener - , CombatActionListener - , CombatTurnListener - , WorldEventListener { - - public static final int INTENTREQUEST_MONSTERENCOUNTER = 2; - public static final int INTENTREQUEST_CONVERSATION = 4; - public static final int INTENTREQUEST_SAVEGAME = 8; - - private ControllerContext controllers; - private WorldContext world; - - private MainView mainview; - private StatusView statusview; - private CombatView combatview; - private QuickitemView quickitemview; - private DisplayActiveActorConditionIcons activeConditions; - private ToolboxView toolboxview; - - private TextView statusText; - private WeakReference lastToast = null; - //private ContextMenuInfo lastSelectedMenu = null; - private OnLongClickListener quickButtonLongClickListener = null; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this); - if (!app.isInitialized()) { finish(); return; } - AndorsTrailPreferences preferences = app.getPreferences(); - this.world = app.getWorld(); - this.controllers = app.getControllerContext(); - app.setWindowParameters(this); - - setContentView(R.layout.main); - mainview = (MainView) findViewById(R.id.main_mainview); - statusview = (StatusView) findViewById(R.id.main_statusview); - combatview = (CombatView) findViewById(R.id.main_combatview); - quickitemview = (QuickitemView) findViewById(R.id.main_quickitemview); - activeConditions = new DisplayActiveActorConditionIcons(controllers, world, this, (RelativeLayout) findViewById(R.id.statusview_activeconditions)); - VirtualDpadView dpad = (VirtualDpadView) findViewById(R.id.main_virtual_dpad); - toolboxview = (ToolboxView) findViewById(R.id.main_toolboxview); - statusview.registerToolboxViews(toolboxview, quickitemview); - - statusText = (TextView) findViewById(R.id.statusview_statustext); - statusText.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - statusText.setVisibility(View.GONE); - } - }); - clearMessages(); - - if (AndorsTrailApplication.DEVELOPMENT_DEBUGBUTTONS) - new DebugInterface(controllers, world, this).addDebugButtons(); - - quickitemview.setVisibility(View.GONE); - createLongClickListener(); - quickitemview.registerForContextMenu(this); - - dpad.updateVisibility(preferences); - quickitemview.setPosition(preferences); - - // Define which views are in front of each other. - dpad.bringToFront(); - quickitemview.bringToFront(); - toolboxview.bringToFront(); - combatview.bringToFront(); - statusview.bringToFront(); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - switch (requestCode) { - case INTENTREQUEST_MONSTERENCOUNTER: - if (resultCode == Activity.RESULT_OK) { - controllers.combatController.enterCombat(CombatController.BeginTurnAs.player); - } else { - controllers.combatController.exitCombat(false); - } - break; - case INTENTREQUEST_CONVERSATION: - controllers.mapController.applyCurrentMapReplacements(getResources(), true); - break; - case INTENTREQUEST_SAVEGAME: - if (resultCode != Activity.RESULT_OK) break; - final int slot = data.getIntExtra("slot", 1); - if (save(slot)) { - Toast.makeText(this, getResources().getString(R.string.menu_save_gamesaved, slot), Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(this, R.string.menu_save_failed, Toast.LENGTH_LONG).show(); - } - break; - } - } - - private boolean save(int slot) { - final Player player = world.model.player; - return Savegames.saveWorld(world, this, slot, getString(R.string.savegame_currenthero_displayinfo, player.getLevel(), player.getTotalExperience(), player.getGold())); - } - - @Override - protected void onStart() { - super.onStart(); - if (!AndorsTrailApplication.getApplicationFromActivity(this).getWorldSetup().isSceneReady) return; - subscribeToModelChanges(); - } - - @Override - protected void onStop() { - super.onStop(); - unsubscribeFromModel(); - } - - @Override - protected void onPause() { - super.onPause(); - controllers.gameRoundController.pause(); - controllers.movementController.stopMovement(); - - save(Savegames.SLOT_QUICKSAVE); - } - - @Override - protected void onResume() { - super.onResume(); - if (!AndorsTrailApplication.getApplicationFromActivity(this).getWorldSetup().isSceneReady) return; - - controllers.gameRoundController.resume(); - - updateStatus(); - } - - private void unsubscribeFromModel() { - activeConditions.unsubscribe(); - combatview.unsubscribe(); - mainview.unsubscribe(); - quickitemview.unsubscribe(); - statusview.unsubscribe(); - controllers.movementController.playerMovementListeners.remove(this); - controllers.combatController.combatActionListeners.remove(this); - controllers.combatController.combatTurnListeners.remove(this); - controllers.mapController.worldEventListeners.remove(this); - } - - private void subscribeToModelChanges() { - controllers.mapController.worldEventListeners.add(this); - controllers.combatController.combatTurnListeners.add(this); - controllers.combatController.combatActionListeners.add(this); - controllers.movementController.playerMovementListeners.add(this); - statusview.subscribe(); - quickitemview.subscribe(); - mainview.subscribe(); - combatview.subscribe(); - activeConditions.subscribe(); - } - - - public void registerForLongClick(QuickButton item) { - item.setOnLongClickListener(quickButtonLongClickListener); - } - - public void createLongClickListener() { - if (quickButtonLongClickListener != null) return; - quickButtonLongClickListener = new OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - if (v instanceof QuickButton) { - - final int buttonId = ((QuickButton)v).getIndex(); - - final AlertDialog dialog = new AlertDialog.Builder(v.getContext()).create(); - View view = getLayoutInflater().inflate(R.layout.quickbuttons_usable_inventory, null); - ListView lv = (ListView) view.findViewById(R.id.quickbuttons_assignlist); - - TileCollection wornTiles = world.tileManager.loadTilesFor(world.model.player.inventory, getResources()); - final ItemContainerAdapter inventoryListAdapter = new QuickslotsItemContainerAdapter(lv.getContext(), world.tileManager, world.model.player.inventory.usableItems(), world.model.player, wornTiles); - lv.setAdapter(inventoryListAdapter); - - lv.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - controllers.itemController.setQuickItem(inventoryListAdapter.getItem(position).itemType, buttonId); - dialog.dismiss(); - } - }); - -// Button b = (Button) view.findViewById(R.id.quickbuttons_unassign); -// b.setOnClickListener(new OnClickListener() { -// @Override -// public void onClick(View v) { -// controllers.itemController.setQuickItem(null, buttonId); -// dialog.dismiss(); -// } -// }); - - dialog.setView(view); - dialog.setCancelable(true); - dialog.show(); - } - return true; - } - }; - } - -// @Override -// public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { -// -// super.onCreateContextMenu(menu, v, menuInfo); -// if(quickitemview.isQuickButtonId(v.getId())){ -// createQuickButtonMenu(menu); -// } -// lastSelectedMenu = null; -// } -// -// private void createQuickButtonMenu(ContextMenu menu){ -// menu.add(Menu.NONE, R.id.quick_menu_unassign, Menu.NONE, R.string.inventory_unassign); -// SubMenu assignMenu = menu.addSubMenu(Menu.NONE, R.id.quick_menu_assign, Menu.NONE, R.string.inventory_assign); -// for(int i=0; i(t); - } else { - t.setText(msg); - t.setDuration(duration); - } - t.show(); - } - - - @Override - public void onPlayerMoved(Coord newPosition, Coord previousPosition) { } - - @Override - public void onPlayerEnteredNewMap(PredefinedMap map, Coord p) { } - - @Override - public void onCombatStarted() { - clearMessages(); - } - - @Override - public void onCombatEnded() { - clearMessages(); - } - - @Override - public void onPlayerAttackMissed(Monster target, AttackResult attackResult) { - message(getString(R.string.combat_result_heromiss)); - } - - @Override - public void onPlayerAttackSuccess(Monster target, AttackResult attackResult) { - final String monsterName = target.getName(); - if (attackResult.isCriticalHit) { - message(getString(R.string.combat_result_herohitcritical, monsterName, attackResult.damage)); - } else { - message(getString(R.string.combat_result_herohit, monsterName, attackResult.damage)); - } - if (attackResult.targetDied) { - message(getString(R.string.combat_result_herokillsmonster, monsterName, attackResult.damage)); - } - } - - @Override - public void onMonsterAttackMissed(Monster attacker, AttackResult attackResult) { - message(getString(R.string.combat_result_monstermiss, attacker.getName())); - } - - @Override - public void onMonsterAttackSuccess(Monster attacker, AttackResult attackResult) { - final String monsterName = attacker.getName(); - if (attackResult.isCriticalHit) { - message(getString(R.string.combat_result_monsterhitcritical, monsterName, attackResult.damage)); - } else { - message(getString(R.string.combat_result_monsterhit, monsterName, attackResult.damage)); - } - } - - @Override - public void onMonsterMovedDuringCombat(Monster m) { - String monsterName = m.getName(); - message(getString(R.string.combat_result_monstermoved, monsterName)); - } - - @Override - public void onPlayerKilledMonster(Monster target) { } - - @Override - public void onNewPlayerTurn() { } - - @Override - public void onMonsterIsAttacking(Monster m) { } - - @Override - public void onPlayerStartedConversation(Monster m, String phraseID) { - Dialogs.showConversation(this, controllers, phraseID, m); - } - - @Override - public void onScriptAreaStartedConversation(String phraseID) { - Dialogs.showMapScriptMessage(this, controllers, phraseID); - } - - @Override - public void onPlayerSteppedOnMonster(Monster m) { - Dialogs.showMonsterEncounter(this, controllers, m); - } - - @Override - public void onPlayerSteppedOnMapSignArea(MapObject area) { - Dialogs.showMapSign(this, controllers, area.id); - } - - @Override - public void onPlayerSteppedOnKeyArea(MapObject area) { - Dialogs.showKeyArea(this, controllers, area.id); - } - - @Override - public void onPlayerSteppedOnRestArea(MapObject area) { - Dialogs.showConfirmRest(this, controllers, area); - } - - @Override - public void onPlayerSteppedOnGroundLoot(Loot loot) { - final String msg = Dialogs.getGroundLootFoundMessage(this, loot); - Dialogs.showGroundLoot(this, controllers, world, loot, msg); - } - - @Override - public void onPlayerPickedUpGroundLoot(Loot loot) { - if (controllers.preferences.displayLoot == AndorsTrailPreferences.DISPLAYLOOT_NONE) return; - if (!showToastForPickedUpItems(loot)) return; - - final String msg = Dialogs.getGroundLootPickedUpMessage(this, loot); - showToast(msg, Toast.LENGTH_LONG); - } - - private boolean showToastForPickedUpItems(Loot loot) { - switch (controllers.preferences.displayLoot) { - case AndorsTrailPreferences.DISPLAYLOOT_TOAST: - case AndorsTrailPreferences.DISPLAYLOOT_DIALOG_FOR_ITEMS_ELSE_TOAST: - return true; - case AndorsTrailPreferences.DISPLAYLOOT_TOAST_FOR_ITEMS: - return loot.hasItems(); - } - return false; - } - - @Override - public void onPlayerFoundMonsterLoot(Collection loot, int exp) { - final Loot combinedLoot = Loot.combine(loot); - final String msg = Dialogs.getMonsterLootFoundMessage(this, combinedLoot, exp); - Dialogs.showMonsterLoot(this, controllers, world, loot, combinedLoot, msg); - } - - @Override - public void onPlayerPickedUpMonsterLoot(Collection loot, int exp) { - if (controllers.preferences.displayLoot == AndorsTrailPreferences.DISPLAYLOOT_NONE) return; - - final Loot combinedLoot = Loot.combine(loot); - if (!showToastForPickedUpItems(combinedLoot)) return; - - final String msg = Dialogs.getMonsterLootPickedUpMessage(this, combinedLoot, exp); - showToast(msg, Toast.LENGTH_LONG); - } - - @Override - public void onPlayerRested() { - Dialogs.showRested(this, controllers); - } - - @Override - public void onPlayerDied(int lostExp) { - message(getString(R.string.combat_hero_dies, lostExp)); - } - - @Override - public void onPlayerStartedFleeing() { - message(getString(R.string.combat_begin_flee)); - } - - @Override - public void onPlayerFailedFleeing() { - message(getString(R.string.combat_flee_failed)); - } - - @Override - public void onPlayerDoesNotHaveEnoughAP() { - message(getString(R.string.combat_not_enough_ap)); - } - -} +package com.gpl.rpg.AndorsTrail.activity; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.Intent; +import android.os.Bundle; +import android.view.*; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View.OnClickListener; +import android.view.View.OnLongClickListener; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.Button; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.gpl.rpg.AndorsTrail.AndorsTrailApplication; +import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences; +import com.gpl.rpg.AndorsTrail.Dialogs; +import com.gpl.rpg.AndorsTrail.R; +import com.gpl.rpg.AndorsTrail.context.ControllerContext; +import com.gpl.rpg.AndorsTrail.context.WorldContext; +import com.gpl.rpg.AndorsTrail.controller.AttackResult; +import com.gpl.rpg.AndorsTrail.controller.CombatController; +import com.gpl.rpg.AndorsTrail.controller.listeners.CombatActionListener; +import com.gpl.rpg.AndorsTrail.controller.listeners.CombatTurnListener; +import com.gpl.rpg.AndorsTrail.controller.listeners.PlayerMovementListener; +import com.gpl.rpg.AndorsTrail.controller.listeners.WorldEventListener; +import com.gpl.rpg.AndorsTrail.model.actor.Monster; +import com.gpl.rpg.AndorsTrail.model.actor.Player; +import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry; +import com.gpl.rpg.AndorsTrail.model.item.Loot; +import com.gpl.rpg.AndorsTrail.model.map.MapObject; +import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap; +import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection; +import com.gpl.rpg.AndorsTrail.savegames.Savegames; +import com.gpl.rpg.AndorsTrail.util.Coord; +import com.gpl.rpg.AndorsTrail.view.*; +import com.gpl.rpg.AndorsTrail.view.QuickButton.QuickButtonContextMenuInfo; + +import java.lang.ref.WeakReference; +import java.util.Collection; + +public final class MainActivity + extends Activity + implements + PlayerMovementListener + , CombatActionListener + , CombatTurnListener + , WorldEventListener { + + public static final int INTENTREQUEST_MONSTERENCOUNTER = 2; + public static final int INTENTREQUEST_CONVERSATION = 4; + public static final int INTENTREQUEST_SAVEGAME = 8; + + private ControllerContext controllers; + private WorldContext world; + + private MainView mainview; + private StatusView statusview; + private CombatView combatview; + private QuickitemView quickitemview; + private DisplayActiveActorConditionIcons activeConditions; + private ToolboxView toolboxview; + + private TextView statusText; + private WeakReference lastToast = null; + //private ContextMenuInfo lastSelectedMenu = null; + private OnLongClickListener quickButtonLongClickListener = null; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this); + if (!app.isInitialized()) { finish(); return; } + AndorsTrailPreferences preferences = app.getPreferences(); + this.world = app.getWorld(); + this.controllers = app.getControllerContext(); + app.setWindowParameters(this); + + setContentView(R.layout.main); + mainview = (MainView) findViewById(R.id.main_mainview); + statusview = (StatusView) findViewById(R.id.main_statusview); + combatview = (CombatView) findViewById(R.id.main_combatview); + quickitemview = (QuickitemView) findViewById(R.id.main_quickitemview); + activeConditions = new DisplayActiveActorConditionIcons(controllers, world, this, (RelativeLayout) findViewById(R.id.statusview_activeconditions)); + VirtualDpadView dpad = (VirtualDpadView) findViewById(R.id.main_virtual_dpad); + toolboxview = (ToolboxView) findViewById(R.id.main_toolboxview); + statusview.registerToolboxViews(toolboxview, quickitemview); + + statusText = (TextView) findViewById(R.id.statusview_statustext); + statusText.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + statusText.setVisibility(View.GONE); + } + }); + clearMessages(); + + if (AndorsTrailApplication.DEVELOPMENT_DEBUGBUTTONS) + new DebugInterface(controllers, world, this).addDebugButtons(); + + quickitemview.setVisibility(View.GONE); + createLongClickListener(); + quickitemview.registerForContextMenu(this); + + dpad.updateVisibility(preferences); + quickitemview.setPosition(preferences); + + // Define which views are in front of each other. + dpad.bringToFront(); + quickitemview.bringToFront(); + toolboxview.bringToFront(); + combatview.bringToFront(); + statusview.bringToFront(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + case INTENTREQUEST_MONSTERENCOUNTER: + if (resultCode == Activity.RESULT_OK) { + controllers.combatController.enterCombat(CombatController.BeginTurnAs.player); + } else { + controllers.combatController.exitCombat(false); + } + break; + case INTENTREQUEST_CONVERSATION: + controllers.mapController.applyCurrentMapReplacements(getResources(), true); + break; + case INTENTREQUEST_SAVEGAME: + if (resultCode != Activity.RESULT_OK) break; + final int slot = data.getIntExtra("slot", 1); + if (save(slot)) { + Toast.makeText(this, getResources().getString(R.string.menu_save_gamesaved, slot), Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, R.string.menu_save_failed, Toast.LENGTH_LONG).show(); + } + break; + } + } + + private boolean save(int slot) { + final Player player = world.model.player; + return Savegames.saveWorld(world, this, slot, getString(R.string.savegame_currenthero_displayinfo, player.getLevel(), player.getTotalExperience(), player.getGold())); + } + + @Override + protected void onStart() { + super.onStart(); + if (!AndorsTrailApplication.getApplicationFromActivity(this).getWorldSetup().isSceneReady) return; + subscribeToModelChanges(); + } + + @Override + protected void onStop() { + super.onStop(); + unsubscribeFromModel(); + } + + @Override + protected void onPause() { + super.onPause(); + controllers.gameRoundController.pause(); + controllers.movementController.stopMovement(); + + save(Savegames.SLOT_QUICKSAVE); + } + + @Override + protected void onResume() { + super.onResume(); + if (!AndorsTrailApplication.getApplicationFromActivity(this).getWorldSetup().isSceneReady) return; + + controllers.gameRoundController.resume(); + + updateStatus(); + } + + private void unsubscribeFromModel() { + activeConditions.unsubscribe(); + combatview.unsubscribe(); + mainview.unsubscribe(); + quickitemview.unsubscribe(); + statusview.unsubscribe(); + controllers.movementController.playerMovementListeners.remove(this); + controllers.combatController.combatActionListeners.remove(this); + controllers.combatController.combatTurnListeners.remove(this); + controllers.mapController.worldEventListeners.remove(this); + } + + private void subscribeToModelChanges() { + controllers.mapController.worldEventListeners.add(this); + controllers.combatController.combatTurnListeners.add(this); + controllers.combatController.combatActionListeners.add(this); + controllers.movementController.playerMovementListeners.add(this); + statusview.subscribe(); + quickitemview.subscribe(); + mainview.subscribe(); + combatview.subscribe(); + activeConditions.subscribe(); + } + + + public void registerForLongClick(QuickButton item) { + item.setOnLongClickListener(quickButtonLongClickListener); + } + + public void createLongClickListener() { + if (quickButtonLongClickListener != null) return; + quickButtonLongClickListener = new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (v instanceof QuickButton) { + + final int buttonId = ((QuickButton)v).getIndex(); + + final AlertDialog dialog = new AlertDialog.Builder(v.getContext()).create(); + View view = getLayoutInflater().inflate(R.layout.quickbuttons_usable_inventory, null); + ListView lv = (ListView) view.findViewById(R.id.quickbuttons_assignlist); + + TileCollection wornTiles = world.tileManager.loadTilesFor(world.model.player.inventory, getResources()); + final ItemContainerAdapter inventoryListAdapter = new QuickslotsItemContainerAdapter(lv.getContext(), world.tileManager, world.model.player.inventory.usableItems(), world.model.player, wornTiles); + lv.setAdapter(inventoryListAdapter); + + lv.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + controllers.itemController.setQuickItem(inventoryListAdapter.getItem(position).itemType, buttonId); + dialog.dismiss(); + } + }); + +// Button b = (Button) view.findViewById(R.id.quickbuttons_unassign); +// b.setOnClickListener(new OnClickListener() { +// @Override +// public void onClick(View v) { +// controllers.itemController.setQuickItem(null, buttonId); +// dialog.dismiss(); +// } +// }); + + dialog.setView(view); + dialog.setCancelable(true); + dialog.show(); + } + return true; + } + }; + } + +// @Override +// public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { +// +// super.onCreateContextMenu(menu, v, menuInfo); +// if(quickitemview.isQuickButtonId(v.getId())){ +// createQuickButtonMenu(menu); +// } +// lastSelectedMenu = null; +// } +// +// private void createQuickButtonMenu(ContextMenu menu){ +// menu.add(Menu.NONE, R.id.quick_menu_unassign, Menu.NONE, R.string.inventory_unassign); +// SubMenu assignMenu = menu.addSubMenu(Menu.NONE, R.id.quick_menu_assign, Menu.NONE, R.string.inventory_assign); +// for(int i=0; i(t); + } else { + t.setText(msg); + t.setDuration(duration); + } + t.show(); + } + + + @Override + public void onPlayerMoved(Coord newPosition, Coord previousPosition) { } + + @Override + public void onPlayerEnteredNewMap(PredefinedMap map, Coord p) { } + + @Override + public void onCombatStarted() { + clearMessages(); + } + + @Override + public void onCombatEnded() { + clearMessages(); + } + + @Override + public void onPlayerAttackMissed(Monster target, AttackResult attackResult) { + message(getString(R.string.combat_result_heromiss)); + } + + @Override + public void onPlayerAttackSuccess(Monster target, AttackResult attackResult) { + final String monsterName = target.getName(); + if (attackResult.isCriticalHit) { + message(getString(R.string.combat_result_herohitcritical, monsterName, attackResult.damage)); + } else { + message(getString(R.string.combat_result_herohit, monsterName, attackResult.damage)); + } + if (attackResult.targetDied) { + message(getString(R.string.combat_result_herokillsmonster, monsterName, attackResult.damage)); + } + } + + @Override + public void onMonsterAttackMissed(Monster attacker, AttackResult attackResult) { + message(getString(R.string.combat_result_monstermiss, attacker.getName())); + } + + @Override + public void onMonsterAttackSuccess(Monster attacker, AttackResult attackResult) { + final String monsterName = attacker.getName(); + if (attackResult.isCriticalHit) { + message(getString(R.string.combat_result_monsterhitcritical, monsterName, attackResult.damage)); + } else { + message(getString(R.string.combat_result_monsterhit, monsterName, attackResult.damage)); + } + } + + @Override + public void onMonsterMovedDuringCombat(Monster m) { + String monsterName = m.getName(); + message(getString(R.string.combat_result_monstermoved, monsterName)); + } + + @Override + public void onPlayerKilledMonster(Monster target) { } + + @Override + public void onNewPlayerTurn() { } + + @Override + public void onMonsterIsAttacking(Monster m) { } + + @Override + public void onPlayerStartedConversation(Monster m, String phraseID) { + Dialogs.showConversation(this, controllers, phraseID, m); + } + + @Override + public void onScriptAreaStartedConversation(String phraseID) { + Dialogs.showMapScriptMessage(this, controllers, phraseID); + } + + @Override + public void onPlayerSteppedOnMonster(Monster m) { + Dialogs.showMonsterEncounter(this, controllers, m); + } + + @Override + public void onPlayerSteppedOnMapSignArea(MapObject area) { + Dialogs.showMapSign(this, controllers, area.id); + } + + @Override + public void onPlayerSteppedOnKeyArea(MapObject area) { + Dialogs.showKeyArea(this, controllers, area.id); + } + + @Override + public void onPlayerSteppedOnRestArea(MapObject area) { + Dialogs.showConfirmRest(this, controllers, area); + } + + @Override + public void onPlayerSteppedOnGroundLoot(Loot loot) { + final String msg = Dialogs.getGroundLootFoundMessage(this, loot); + Dialogs.showGroundLoot(this, controllers, world, loot, msg); + } + + @Override + public void onPlayerPickedUpGroundLoot(Loot loot) { + if (controllers.preferences.displayLoot == AndorsTrailPreferences.DISPLAYLOOT_NONE) return; + if (!showToastForPickedUpItems(loot)) return; + + final String msg = Dialogs.getGroundLootPickedUpMessage(this, loot); + showToast(msg, Toast.LENGTH_LONG); + } + + private boolean showToastForPickedUpItems(Loot loot) { + switch (controllers.preferences.displayLoot) { + case AndorsTrailPreferences.DISPLAYLOOT_TOAST: + case AndorsTrailPreferences.DISPLAYLOOT_DIALOG_FOR_ITEMS_ELSE_TOAST: + return true; + case AndorsTrailPreferences.DISPLAYLOOT_TOAST_FOR_ITEMS: + return loot.hasItems(); + } + return false; + } + + @Override + public void onPlayerFoundMonsterLoot(Collection loot, int exp) { + final Loot combinedLoot = Loot.combine(loot); + final String msg = Dialogs.getMonsterLootFoundMessage(this, combinedLoot, exp); + Dialogs.showMonsterLoot(this, controllers, world, loot, combinedLoot, msg); + } + + @Override + public void onPlayerPickedUpMonsterLoot(Collection loot, int exp) { + if (controllers.preferences.displayLoot == AndorsTrailPreferences.DISPLAYLOOT_NONE) return; + + final Loot combinedLoot = Loot.combine(loot); + if (!showToastForPickedUpItems(combinedLoot)) return; + + final String msg = Dialogs.getMonsterLootPickedUpMessage(this, combinedLoot, exp); + showToast(msg, Toast.LENGTH_LONG); + } + + @Override + public void onPlayerRested() { + Dialogs.showRested(this, controllers); + } + + @Override + public void onPlayerDied(int lostExp) { + message(getString(R.string.combat_hero_dies, lostExp)); + } + + @Override + public void onPlayerStartedFleeing() { + message(getString(R.string.combat_begin_flee)); + } + + @Override + public void onPlayerFailedFleeing() { + message(getString(R.string.combat_flee_failed)); + } + + @Override + public void onPlayerDoesNotHaveEnoughAP() { + message(getString(R.string.combat_not_enough_ap)); + } + +} diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/QuickslotsItemContainerAdapter.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/QuickslotsItemContainerAdapter.java index d357fc355..1c43dbfed 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/QuickslotsItemContainerAdapter.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/QuickslotsItemContainerAdapter.java @@ -1,62 +1,62 @@ -package com.gpl.rpg.AndorsTrail.view; - -import com.gpl.rpg.AndorsTrail.R; -import com.gpl.rpg.AndorsTrail.model.actor.Player; -import com.gpl.rpg.AndorsTrail.model.item.ItemContainer; -import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry; -import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection; -import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager; - -import android.content.Context; -import android.graphics.ColorMatrix; -import android.graphics.ColorMatrixColorFilter; -import android.graphics.drawable.Drawable; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -public class QuickslotsItemContainerAdapter extends ItemContainerAdapter { - - public static final ItemEntry EMPTY_ENTRY = new ItemEntry(null, 0); - public static Drawable EMPTY_DRAWABLE = null; - - public QuickslotsItemContainerAdapter(Context context, TileManager tileManager, ItemContainer items, Player player, TileCollection tileCollection) { - super(context, tileManager, items, player, tileCollection); - insert(EMPTY_ENTRY, 0); - if (EMPTY_DRAWABLE == null) { - - ColorMatrix matrix = new ColorMatrix(); - matrix.setSaturation(0); - ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); - EMPTY_DRAWABLE = context.getResources().getDrawable(R.drawable.ui_icon_equipment).mutate(); - EMPTY_DRAWABLE.setColorFilter(filter); - } - } - - public QuickslotsItemContainerAdapter(Context context, TileManager tileManager, ItemContainer items, Player player) { - this(context, tileManager, items, player, tileManager.loadTilesFor(items, context.getResources())); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (getItem(position) == EMPTY_ENTRY) { - View result = convertView; - if (result == null) { - result = View.inflate(getContext(), R.layout.inventoryitemview, null); - } - TextView tv = (TextView) result; - - tv.setCompoundDrawablesWithIntrinsicBounds(EMPTY_DRAWABLE, null, null, null); - tv.setText(R.string.inventory_unassign); - return result; - } - return super.getView(position, convertView, parent); - } - - @Override - public long getItemId(int position) { - if (getItem(position) == EMPTY_ENTRY) return EMPTY_ENTRY.hashCode(); - return super.getItemId(position); - } - -} +package com.gpl.rpg.AndorsTrail.view; + +import com.gpl.rpg.AndorsTrail.R; +import com.gpl.rpg.AndorsTrail.model.actor.Player; +import com.gpl.rpg.AndorsTrail.model.item.ItemContainer; +import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry; +import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection; +import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager; + +import android.content.Context; +import android.graphics.ColorMatrix; +import android.graphics.ColorMatrixColorFilter; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +public class QuickslotsItemContainerAdapter extends ItemContainerAdapter { + + public static final ItemEntry EMPTY_ENTRY = new ItemEntry(null, 0); + public static Drawable EMPTY_DRAWABLE = null; + + public QuickslotsItemContainerAdapter(Context context, TileManager tileManager, ItemContainer items, Player player, TileCollection tileCollection) { + super(context, tileManager, items, player, tileCollection); + insert(EMPTY_ENTRY, 0); + if (EMPTY_DRAWABLE == null) { + + ColorMatrix matrix = new ColorMatrix(); + matrix.setSaturation(0); + ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); + EMPTY_DRAWABLE = context.getResources().getDrawable(R.drawable.ui_icon_equipment).mutate(); + EMPTY_DRAWABLE.setColorFilter(filter); + } + } + + public QuickslotsItemContainerAdapter(Context context, TileManager tileManager, ItemContainer items, Player player) { + this(context, tileManager, items, player, tileManager.loadTilesFor(items, context.getResources())); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (getItem(position) == EMPTY_ENTRY) { + View result = convertView; + if (result == null) { + result = View.inflate(getContext(), R.layout.inventoryitemview, null); + } + TextView tv = (TextView) result; + + tv.setCompoundDrawablesWithIntrinsicBounds(EMPTY_DRAWABLE, null, null, null); + tv.setText(R.string.inventory_unassign); + return result; + } + return super.getView(position, convertView, parent); + } + + @Override + public long getItemId(int position) { + if (getItem(position) == EMPTY_ENTRY) return EMPTY_ENTRY.hashCode(); + return super.getItemId(position); + } + +}