EOL restoration

This commit is contained in:
Zukero
2017-01-23 16:44:26 +01:00
parent ef2af81e87
commit e8ace3666d
3 changed files with 630 additions and 630 deletions

View File

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

View File

@@ -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<Toast> 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<world.model.player.inventory.items.size(); ++i){
// ItemEntry itemEntry = world.model.player.inventory.items.get(i);
// if(itemEntry.itemType.isUsable())
// assignMenu.add(R.id.quick_menu_assign_group, i, Menu.NONE, itemEntry.itemType.getName(world.model.player));
// }
// }
//
// @Override
// public boolean onContextItemSelected(MenuItem item) {
// QuickButtonContextMenuInfo menuInfo;
// if(item.getGroupId() == R.id.quick_menu_assign_group){
// menuInfo = (QuickButtonContextMenuInfo) lastSelectedMenu;
// controllers.itemController.setQuickItem(world.model.player.inventory.items.get(item.getItemId()).itemType, menuInfo.index);
// return true;
// }
// switch(item.getItemId()){
// case R.id.quick_menu_unassign:
// menuInfo = (QuickButtonContextMenuInfo) item.getMenuInfo();
// controllers.itemController.setQuickItem(null, menuInfo.index);
// break;
// case R.id.quick_menu_assign:
// menuInfo = (QuickButtonContextMenuInfo) item.getMenuInfo();
// lastSelectedMenu = menuInfo;
// break;
// default:
// return super.onContextItemSelected(item);
// }
// return true;
// }
private void updateStatus() {
statusview.updateStatus();
quickitemview.refreshQuickitems();
combatview.updateStatus();
toolboxview.updateIcons();
}
private void message(String msg) {
world.model.combatLog.append(msg);
statusText.setText(world.model.combatLog.getLastMessages());
statusText.setVisibility(View.VISIBLE);
}
private void clearMessages() {
world.model.combatLog.appendCombatEnded();
statusText.setVisibility(View.GONE);
}
private void showToast(String msg, int duration) {
if (msg == null) return;
if (msg.length() == 0) return;
Toast t = null;
if (lastToast != null) t = lastToast.get();
if (t == null) {
t = Toast.makeText(this, msg, duration);
lastToast = new WeakReference<Toast>(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> 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> 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<Toast> 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<world.model.player.inventory.items.size(); ++i){
// ItemEntry itemEntry = world.model.player.inventory.items.get(i);
// if(itemEntry.itemType.isUsable())
// assignMenu.add(R.id.quick_menu_assign_group, i, Menu.NONE, itemEntry.itemType.getName(world.model.player));
// }
// }
//
// @Override
// public boolean onContextItemSelected(MenuItem item) {
// QuickButtonContextMenuInfo menuInfo;
// if(item.getGroupId() == R.id.quick_menu_assign_group){
// menuInfo = (QuickButtonContextMenuInfo) lastSelectedMenu;
// controllers.itemController.setQuickItem(world.model.player.inventory.items.get(item.getItemId()).itemType, menuInfo.index);
// return true;
// }
// switch(item.getItemId()){
// case R.id.quick_menu_unassign:
// menuInfo = (QuickButtonContextMenuInfo) item.getMenuInfo();
// controllers.itemController.setQuickItem(null, menuInfo.index);
// break;
// case R.id.quick_menu_assign:
// menuInfo = (QuickButtonContextMenuInfo) item.getMenuInfo();
// lastSelectedMenu = menuInfo;
// break;
// default:
// return super.onContextItemSelected(item);
// }
// return true;
// }
private void updateStatus() {
statusview.updateStatus();
quickitemview.refreshQuickitems();
combatview.updateStatus();
toolboxview.updateIcons();
}
private void message(String msg) {
world.model.combatLog.append(msg);
statusText.setText(world.model.combatLog.getLastMessages());
statusText.setVisibility(View.VISIBLE);
}
private void clearMessages() {
world.model.combatLog.appendCombatEnded();
statusText.setVisibility(View.GONE);
}
private void showToast(String msg, int duration) {
if (msg == null) return;
if (msg.length() == 0) return;
Toast t = null;
if (lastToast != null) t = lastToast.get();
if (t == null) {
t = Toast.makeText(this, msg, duration);
lastToast = new WeakReference<Toast>(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> 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> 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));
}
}

View File

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