/**
*
*/
package com.javaxyq.core;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.SwingUtilities;
import com.javaxyq.action.Actions;
import com.javaxyq.action.BaseAction;
import com.javaxyq.battle.BattleCanvas;
import com.javaxyq.config.ConfigManager;
import com.javaxyq.config.impl.ConfigManagerImpl;
import com.javaxyq.data.ItemInstance;
import com.javaxyq.data.WeaponItem;
import com.javaxyq.event.ActionEvent;
import com.javaxyq.model.ItemTypes;
import com.javaxyq.model.Option;
import com.javaxyq.model.PlayerVO;
import com.javaxyq.model.Task;
import com.javaxyq.profile.Profile;
import com.javaxyq.profile.ProfileException;
import com.javaxyq.profile.ProfileManager;
import com.javaxyq.profile.impl.ProfileManagerImpl;
import com.javaxyq.task.TaskManager;
import com.javaxyq.ui.JEXLTooltipTemplate;
import com.javaxyq.ui.NullRepaintManager;
import com.javaxyq.ui.TalkPanel;
import com.javaxyq.ui.UIFactory;
import com.javaxyq.ui.UIHelper;
import com.javaxyq.util.DBToolkit;
import com.javaxyq.widget.Player;
import com.javaxyq.widget.TileMap;
public abstract class BaseApplication implements Application {
protected Context context;
private DataManager dataManager;
private ItemManager itemManager;
private ProfileManager profileManager;
private TaskManager taskManager;
private ConfigManager configManager;
private int state = STATE_NORMAL;
private ScriptEngine scriptEngine;
private boolean debug = false;//DEBUG
protected SceneCanvas sceneCanvas;
private GameWindow window;
private Thread dataloadingThread;
private Profile profile;
public BaseApplication() {
ApplicationHelper.setApplication(this);
}
//TODO ���������ļ����Σ�����ά��֮�����ϵ
public final void startup() {
//�����ػ������
NullRepaintManager.install();
long startTime = System.currentTimeMillis();
System.out.println("starting at: "+new java.util.Date());
//��ʼ��DB����
new Thread(new Runnable() {
public void run() {
//DEBUG
// if(debug) {
// DBToolkit.setForceInit(true);
// }
DBToolkit.prepareDatabase();
}
}).start();
//����������
context = createContext();
dataloadingThread = new Thread(new Runnable() {
public void run() {
loadData();
}
});
dataloadingThread.start();
//��������
window = createWindow();
window.installWindowListeners();
prepareShow();
System.out.println("prepareShow at: "+new java.util.Date());
show(window);
prepareStartup();
System.out.println("prepareStartup at: "+new java.util.Date());
loadResources();
System.out.println("loadResources at: "+new java.util.Date());
try {
dataloadingThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
finish();
System.out.println("finish at: "+new java.util.Date());
long endTime = System.currentTimeMillis();
System.out.printf("total cost: %ss\n", (endTime - startTime) / 1000.0);
}
protected void prepareShow() {
// TODO Auto-generated method stub
}
/**
* ������ϣ�������Ϸ
*/
protected void finish() {
promptMsg("starting game ...");
}
protected void prepareStartup() {
scriptEngine = DefaultScript.getInstance();
try {
scriptEngine.clearCache();
} catch (Exception e) {
e.printStackTrace();
}
//ע��Tooltip���
JEXLTooltipTemplate tooltipTemplate = new JEXLTooltipTemplate(context);
UIFactory.put(UIFactory.TOOLTIP_TEMPLATE, tooltipTemplate);
//NullRepaintManager.install();
}
public void shutdown() {
try {
saveProfile();
} catch (ProfileException e) {
e.printStackTrace();
}
System.exit(0);
}
protected void show(final GameWindow window) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
window.show();
}
});
}
public Context getContext() {
return context;
}
protected abstract GameWindow createWindow();
public java.net.URL getResource(String name){
;
return null;
}
public InputStream getResourceAsStream(String name) {
;
return null;
}
protected Context createContext() {
Context context = new Context();
return context;
}
protected void promptMsg(String text) {
//TODO
System.out.println(text);
}
protected void loadResources() {
promptMsg("loading resourcess ...");
}
protected void loadData() {
promptMsg("loading data ...");
configManager = new ConfigManagerImpl("javaxyq.properties");
try {
configManager.loadConfigs();
} catch (Exception e) {
System.err.println("load configs failure! ");
e.printStackTrace();
}
taskManager = new TaskManager();
dataManager = new DataStore(context);
// dataManager.loadData();
itemManager = new ItemManagerImpl(dataManager);
profileManager = new ProfileManagerImpl();
}
public DataManager getDataManager() {
return dataManager;
}
public ItemManager getItemManager() {
return itemManager;
}
public TaskManager getTaskManager() {
return taskManager;
}
public ProfileManager getProfileManager() {
return profileManager;
}
public ConfigManager getConfigManager() {
return configManager;
}
public ScriptEngine getScriptEngine() {
return scriptEngine;
}
/**
* ִ��ָ��ActionCommand��Action
*
* @param source
* ����Action��Դ����
* @param cmd������actiomCommand
* ,��������
*/
public void doAction(Object source, String actionId, Object[] args) {
if(Actions.ENTER_BATTLE.equals(actionId)) {
enterBattle((List)args[0], (List)args[1]);
return ;
}else if(Actions.QUIT_BATTLE.equals(actionId)) {
quitBattle();
return ;
}
ActionMap actionMap = context.getWindow().getActionMap();
Action action = actionMap.get(actionId);
if (action == null && actionId.startsWith("com.javaxyq.action.dialog")) {
action = actionMap.get("com.javaxyq.action.dialog");
}
if (action == null) {
String wildcard = actionId.substring(0, actionId.lastIndexOf('.')) + ".*";
action = actionMap.get(wildcard);
}
if (action == null) {
return;
}
ActionEvent e = new ActionEvent(source, actionId, args);
if (action instanceof BaseAction) {
BaseAction a = (BaseAction) action;
a.doAction(e);
} else {
action.actionPerformed(e);
}
}
/**
* ������npc�ĶԻ�
*
* @param npc
*/
public void doTalk(Player p,String chat) {
doTalk(p, chat, null);
}
/**
* ������npc�ĶԻ�
* @param options TODO
* @param npc
*/
public Option doTalk(Player talker,String chat, Option[] options) {
context.setTalker(talker);
TalkPanel dlg0 = (TalkPanel) DialogFactory.getDialog("npctalk", true);
//make a copy
TalkPanel dlg = new TalkPanel(dlg0.getWidth(),dlg0.getHeight());
dlg.setLocation(dlg0.getX(), dlg0.getY());
dlg.setBgImage(dlg0.getBgImage());
dlg.setClosable(dlg0.isClosable());
dlg.setMovable(dlg0.isMovable());
dlg.setName(dlg0.getName());
dlg.initTalk(chat,options);
dlg.setTalker(talker.getCharacter());
context.getWindow().getHelper().showModalDialog(dlg);
return dlg.getResult();
}
public void doAction(Object source, String actionId) {
doAction(source, actionId, null);
}
/**
* ����ս��ģʽ
*/
public void enterBattle(List team1,List team2) {
state = STATE_BATTLE;
GameWindow window = context.getWindow();
SceneCanvas canvas = (SceneCanvas) window.getCanvas();
sceneCanvas = canvas;
//background
Dimension size = canvas.getSize();
BufferedImage bg = new BufferedImage(size.width, size.height, BufferedImage.TYPE_USHORT_565_RGB);
TileMap map = canvas.getMap();
Point viewPosition = canvas.getViewPosition();
map.draw(bg.getGraphics(), viewPosition.x,viewPosition.y,size.width,size.height);
BattleCanvas battleCanvas = new BattleCanvas(size.width, size.height);
battleCanvas.setBattleBackground(bg);
battleCanvas.setOwnsideTeam(team1);
battleCanvas.setAdversaryTeam(team2);
battleCanvas.fadeIn(500);
window.setCanvas(battleCanvas);
//installUI();
//UIHelper.showUIComponents();
//installListener();
battleCanvas.init();
//battleCanvas.setLastMagic(lastMagic);
battleCanvas.playMusic();
}
/**
* �˳�ս��ģʽ
*/
public void quitBattle() {
SceneCanvas canvas = this.sceneCanvas;
GameWindow window = context.getWindow();
canvas.setPlayerSceneLocation(context.getPlayer().getSceneLocation());
canvas.fadeIn(500);
window.setCanvas(canvas);
canvas.playMusic();
//lastMagic = UIHelper.getBattleCanvas().getLastMagic();
//UIHelper.getBattleCanvas().dispose();
state = STATE_NORMAL;
//window.updateUI();
//TODO
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean debug) {
this.debug = debug;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public GameWindow getWindow() {
return window;
}
@Override
public GameCanvas getCanvas() {
return window.getCanvas();
}
@Override
public UIHelper getUIHelper() {
return window.getHelper();
}
/**
* ���ش浵
* @throws ProfileException
*/
public void loadProfile(String profileName) throws ProfileException {
if(profileName == null) {
throw new IllegalArgumentException("profileName ������");
}
Profile profile = profileManager.loadProfile(profileName);
//��ʼ��
Player player = dataManager.createPlayer(profile.getPlayerData());
context.setPlayer(player);
context.setScene(profile.getSceneId());
dataManager.setItems(player, profile.getItems());
//װ������
ItemInstance[] items = dataManager.getItems(context.getPlayer());
ItemInstance item = items[2];
if(item != null) {
if(ItemTypes.isWeapon(item.getItem())){
player.takeupWeapon((WeaponItem) item.getItem());
System.out.println("takeup weapon: "+item.getItem());
}
}
Task[] tasks = profile.getTasks();
if(tasks!=null) {
for (int i = 0; i < tasks.length; i++) {
getTaskManager().add(tasks[i]);
}
}
this.profile = profile;
try {
configManager.put("lastprofile", profile.getName());
configManager.saveConfigs();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* ����浵
* @throws ProfileException
*/
public void saveProfile() throws ProfileException {
try {
Player player = context.getPlayer();
if(player == null) {
return;
}
PlayerVO data = player.getData();
profile.setPlayerData(data);
profile.setCreateDate(new java.util.Date());
profile.setItems(dataManager.getItems(player));
profile.setSceneId(context.getScene());
List<Task> tasklist = getTaskManager().getTaskList();
Task[] tasks = new Task[tasklist.size()];
tasklist.toArray(tasks);
profile.setTasks(tasks);
profileManager.saveProfile(profile);
} catch (Exception e) {
System.err.println("��Ϸ�浵ʧ�ܣ�");
e.printStackTrace();
}
}
public void saveProfileAs(String newname) throws ProfileException{
profile = new Profile();
profile.setName(newname);
saveProfile();
}
public Profile getProfile() {
return profile;
}
/**
* ��ȡ��ǰ��Ϸ�浵����
* @return
*/
public String getProfileName() {
if(profile != null) {
return profile.getName();
}
return null;
}
@Override
public void endGame() {
try {
saveProfile();
} catch (Exception e) {
e.printStackTrace();
}
//���ص���ӭ����
}
@Override
public SceneCanvas getSceneCanvas() {
return sceneCanvas;
}
}