package com.javaxyq.core;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Random;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import com.javaxyq.config.PlayerConfig;
import com.javaxyq.data.BaseItemDAO;
import com.javaxyq.data.ItemInstance;
import com.javaxyq.data.MedicineItem;
import com.javaxyq.data.Scene;
import com.javaxyq.data.SceneDAO;
import com.javaxyq.data.SceneNpc;
import com.javaxyq.data.SceneNpcDAO;
import com.javaxyq.data.SceneTeleporter;
import com.javaxyq.data.SceneTeleporterDAO;
import com.javaxyq.data.SkillMagic;
import com.javaxyq.data.SkillMain;
import com.javaxyq.data.impl.MedicineItemDAOImpl;
import com.javaxyq.data.impl.SceneDAOImpl;
import com.javaxyq.data.impl.SceneNpcDAOImpl;
import com.javaxyq.data.impl.SceneTeleporterDAOImpl;
import com.javaxyq.data.impl.SkillMagicDAOImpl;
import com.javaxyq.data.impl.SkillMainDAOImpl;
import com.javaxyq.data.impl.WeaponItemDAOImpl;
import com.javaxyq.io.CacheManager;
import com.javaxyq.model.Item;
import com.javaxyq.model.ItemTypes;
import com.javaxyq.model.PlayerVO;
import com.javaxyq.model.Skill;
import com.javaxyq.model.Task;
import com.javaxyq.task.TaskManager;
import com.javaxyq.util.StringUtils;
import com.javaxyq.util.UIUtils;
import com.javaxyq.widget.Player;
/**
* ���ݷ�����
*
* @author ����ΰ
* @history 2008-6-8 ����ΰ �½�
*/
public class DataStore implements DataManager {
private static int elfId;
/**
* �������������
*/
private static final int [] levelExpTable =
{40,110,237,450,779,1252,1898,2745,3822,5159,6784,8726,11013,13674,16739,20236,24194,28641,330606,39119,
45208,51902,59229,67218,75899,85300,95450,106377,118110,130679,144112,158438,173685,189882,207059,
225244,244466,264753,286134,308639,332296,357134,383181,410466,439019,468868,500042,532569,566478,
601799,638560,676790,716517,757770,800579,844972,890978,938625,987942,1038959,1091704,1146206,1202493,
1260594,1320539,1382356,1446074,1511721,1579326,1648919,1720528,1794182,1869909,1947738,2027699,
2109820,2194130,2280657,2369430,2460479,2553832,2649518,2747565,2848002,2950859,3056164,3163946,
3274233,3387054,3502439,3620416,3741014,3864261,3990186,4118819,4250188,4384322,4521249,4660998,4803599};
private static final int [] mskillslevelExpTable =
{16,32,52,75,103,136,179,231,295,372,466,578,711,867,1049,1260,1503,1780,2096,2452,2854,3304,3807,4364,4983,5664,
6415,7238,8138,9120,10188,11347,12602,13959,15423,16998,18692,20508,22452,24532,26753,29121,31642,34323,37169,40188,
43388,46773,50352,54132,58120,62324,66750,71407,76303,81444,86840,92500,98430,104640,111136,117931,125031,132444,
140183,148253,156666,165430,174556,184052,193930,204198,214868,225948,237449,249383,261760,274589,287884,301652,
315908,330662,345924,361708,378023,394882,412297,430280,448844,468000,487760,508137,529145,550796,573103,596078,
619735,644088,669149,694932,721452,748722,776755,805566,835169,865579,896809,928876,961792,995572,1030234,1065190,
1102256,1139649,1177983,1217273,1256104,1298787,1341043,1384320,1428632,1473999,1520435,1567957,1616583,1666328,
1717211,1769248,1822456,1876852,1932456,1989284,2047353,2106682,2167289,2229192,2292410,2356960,2422861,2490132,
2558792,2628860,2700356,2773296,2847703,2923593,3000989,3079908,3160372,3242400,6652022,6822452,6996132,7173104,
7353406,11305620,11586254,11872072,12163140,12459518,15033471,15315219,15600468,15889236,16181550,16477425,16776885,
17079954,17386650,17697000,24014692,24438308,24866880,25300432,25739000,32728255,33289095,33856310,34492930,40842000
};
private static final int [] mskillslevelSpendTable =
{6,12,19,28,38,51,67,86,110,139,174,216,266,325,393,472,563,667,786,919,1070,1238,1426,1636,1868,2124,2404,2714,3050,
3420,3820,4255,4725,5234,5783,6374,7009,7690,8419,9199,10032,10920,11865,12871,13938,15070,16270,17540,18882,20299,
21795,23371,25031,26777,28613,30541,32565,34687,36911,39240,41676,44224,46886,49666,52568,55595,58749,62036,65458,
69019,72723,76574,80575,84730,89043,93518,98160,102971,107956,113119,118465,123998,129721,135640,141758,148080,154611,
161355,168316,175500,182910,190551,198429,206548,214913,223529,232400,241533,250931,260599,270544,280770,291283,302087,
313188,324592,336303,348328,360672,373339,386337,399671,413346,427368,441743,456477,471576,487045,502891,519120,535737,
552749,570163,587984,606218,624873,643954,663468,683421,703819,724671,745981,767757,790005,812733,835947,859653,883860,
908573,933799,959547,985822,1012633,1039986,1067888,1096347,1125371,1154965,1185139,1215900,2494508,2558419,2623549,
2689914,2757527,4239607,4344845,4452027,4561177,4672319,4510041,4594563,4680138,4766769,4854465,4943226,5033064,5123985,
5215995,5309100,7204407,7331490,7460064,7590129,7721700,9818475,9986727,10156893,10328979,12252600
};
public static String[] �����б� = { "���ƹٸ�", "����ɽ" ,"������", "Ů����", "���ܵظ�", "ħ��կ", "ʨ����", "��˿��","�칬" ,
"����", "��ׯ��", "����ɽ"};
public static String[] basic_skill ={"Ϊ��֮��","��ͥ��","С�˷�","����","��ͨ��","ţ����","ħ����","��˿��",
"�����","������","����ѧ","����"};
public static final String[] ħ������ = { "���ܵظ�", "ħ��կ", "ʨ����", "��˿�� "};
public static final String[] �������� = { "���ƹٸ�", "����ɽ" ,"������", "Ů����"};
public static final String[] �������� = {"�칬" ,"����", "��ׯ��", "����ɽ"};
/**
* �ж�����array�Ƿ����ֵvalue
* @return
*/
private static boolean inArray(String[] array, String value) {
for (int i = 0; i < array.length; i++) {
if(array[i].equals(value))return true;
}
return false;
}
/**
* @param config
* @return
*/
private static Properties parseConfig(String str) {
Properties configs = new Properties();
try {
if(str!=null) {
String[] entrys = str.split(";");
for (int i = 0; i < entrys.length; i++) {
String[] keyvalue = entrys[i].split("=");
configs.setProperty(keyvalue[0], keyvalue[1]);
}
}
} catch (Exception e) {
System.out.println("����Configʧ�ܣ�"+str);
e.printStackTrace();
}
return configs;
}
private Context context;
private Map<String,Integer> devilData = new HashMap<String, Integer>();
/**
* �ɳ��ʱ�
*/
private Map<String,Double> growthRateTable = new HashMap<String, Double>();
private Map<String,Integer> humanData = new HashMap<String, Integer>();
private Map<String,Integer> immortalData = new HashMap<String, Integer>();
private Map<Player,ItemInstance[]> itemsMap = new HashMap<Player, ItemInstance[]>();
private List<BaseItemDAO> itemDAOs = new ArrayList<BaseItemDAO>();
private String lastchat = "";
private MedicineItemDAOImpl medicineDAO;
private Random rand = new Random();
private SceneDAO sceneDAO;
private SceneNpcDAO sceneNpcDAO;
private SceneTeleporterDAO sceneTeleporterDAO;
private SkillMainDAOImpl skillMain;
private SkillMagicDAOImpl skillMagic;
private String[] ħ�� = {"0005","0006","0007","0008"};
private WeaponItemDAOImpl weaponDAO;
/**
* (һ)�������ʼ����
1)ħ��
��12-ħ��11-����11-����8-��8
Ѫ172-ħ��ֵ107-����55-�˺�43-����11-�ٶ�8-����18-����17
2)����
��10-ħ��10-����10-����10-��10
Ѫ150-ħ��ֵ110-����50-�˺�41-����15-�ٶ�10-����30-����16
3)����
��12-ħ��5-����11-����12-��10
Ѫ154-ħ��ֵ97-����48-�˺�46-����19-�ٶ�10-����20-����13
*/
private String[] ���� = {"0001","0002","0003","0004"};
private String[] ���� = {"0009","0010","0011","0012"};
public DataStore(Context context) {
this.context = context;
init();
//�����ʼ����
humanData.put("����", 10);
humanData.put("ħ��", 10);
humanData.put("����", 10);
humanData.put("durability", 10);
humanData.put("����", 10);
humanData.put("����", 50);
humanData.put("�˺�", 41);
humanData.put("����", 15);
humanData.put("�ٶ�", 10);
humanData.put("���", 20);
humanData.put("����", 16);
humanData.put("hp", 150);
humanData.put("mp", 110);
//ħ���ʼ����
devilData.put("����", 12);
devilData.put("ħ��", 11);
devilData.put("����", 11);
devilData.put("durability", 8);
devilData.put("����", 8);
devilData.put("����", 55);
devilData.put("�˺�", 43);
devilData.put("����", 11);
devilData.put("�ٶ�", 8);
devilData.put("���", 18);
devilData.put("����", 17);
devilData.put("hp", 172);
devilData.put("mp", 107);
//�����ʼ����
immortalData.put("����", 12);
immortalData.put("ħ��", 5);
immortalData.put("����", 11);
immortalData.put("durability", 12);
immortalData.put("����", 10);
immortalData.put("����", 48);
immortalData.put("�˺�", 46);
immortalData.put("����", 19);
immortalData.put("�ٶ�", 10);
immortalData.put("���", 20);
immortalData.put("����", 13);
immortalData.put("hp", 154);
immortalData.put("mp", 97);
//�ɳ���
growthRateTable.put("2009", 1.5);
growthRateTable.put("2010", 0.9);
growthRateTable.put("2011", 1.0);
growthRateTable.put("2012", 1.2);
growthRateTable.put("2036", 0.8);
growthRateTable.put("2037", 0.8);
}
public void addExp(Player player,int exp) {
PlayerVO vo = player.getData();
vo.exp += exp;
}
public void addHp(Player player,int hp) {
PlayerVO vo = player.getData();
vo.hp = Math.min(vo.hp+hp,vo.maxHp);
if(vo.hp < 0) {
vo.hp = 0;
}
}
/**
* ��������ij��Ʒ
* @return ����ɹ�����true
*/
public boolean addItemToPlayerBag(Player player,ItemInstance item) {
//TODO �����Ʒ
synchronized(player) {
ItemInstance[] items = getItems(player);
int index = 6;//������6��ʼ��ǰ����װ����
for(;index < items.length;index++) {
if(items[index] == null) {
items[index] = item;
return true;
}else if(overlayItems(item, items[index])) {//���Ե���
if(item.getAmount() ==0)return true;//�������
}
}
return false;
}
}
public void addMoney(Player player,int money) {
PlayerVO vo = player.getData();
vo.money += money;
}
public void addMp(Player player,int mp) {
PlayerVO vo = player.getData();
vo.mp = Math.min(vo.mp+mp,vo.maxMp);
if(vo.mp < 0) {
vo.mp = 0;
}
}
/**
* ����ij���Ե�ֵ
* @param player
* @param prop
* @param val
*/
public void addProp(Player player,String prop,int val) {
PlayerVO vo = player.getData();
//���ܸ�����������ֵ
String maxProp = "max"+prop;
//if()
}
/**
* ������ͨ��С�֣�����������
* @param type
* @param name
* @param level
* @return
*/
public Player createElf(String type,String name,int level) {
Player player = createPlayer(type,(int[])null);
player.setName(name);
//��ʼ����������
PlayerVO data = new PlayerVO("elf-"+(++elfId),name,type);
data.level = level;
//��ʼ���������������
initElf(data);
player.setData(data);
//player.setNameForeground(GameMain.TEXT_NAME_NPC_COLOR);
System.out.println("create elf: "+data);
return player;
}
public ItemInstance createItem(String name) {
return this.createItem(name, 1);
}
@Override
public ItemInstance createItem(String name, int amount) {
if(name == null || name.isEmpty()) return null;
name = name.trim();
Item item = this.findItemByName(name);
if(item != null) {
return new ItemInstance(item, amount);
}
System.err.println("createItem failed: "+name);
return null;
}
public Item findItemByName(String name) {
for(BaseItemDAO itemDao: itemDAOs){
try {
Item item = itemDao.findItemByName(name);
if(item != null){
return item;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
/**
* ����NPCʵ��
* @param cfg
* @return
*/
public Player createNPC(PlayerConfig cfg) {
Player p = this.createPlayer(cfg);
p.setNameForeground(UIUtils.TEXT_NAME_NPC_COLOR);
return p;
}
/**
* ����NPCʵ��
* @param sceneNpc
* @return
*/
public Player createNPC(SceneNpc _npc) {
Player player = new Player(String.valueOf(_npc.getId()), _npc.getName(), _npc.getCharacterId());
player.setSceneLocation(_npc.getSceneX(), _npc.getSceneY());
//String strColorations = cfg.getColorations();
// if (strColorations != null) {// Ⱦɫ
// String[] colors = strColorations.split(",");
// int[] colorations = new int[colors.length];
// for (int i = 0; i < colors.length; i++) {
// colorations[i] = colors[i].charAt(0) - '0';
// }
// player.setColorations(colorations, false);//��setState֮ǰ
// }
Properties configs = parseConfig(_npc.getConfig());
player.setState(configs.getProperty("state","stand"));
player.setDirection(Integer.parseInt(configs.getProperty("direction","0")));
//String mAction = cfg.getMovement();
// if (mAction != null) {
// MovementManager.put(player, mAction, cfg.getPeriod());
// }
player.setNameForeground(UIUtils.TEXT_NAME_NPC_COLOR);
return player;
}
//FIXME �ظ�����ͬһ����ɫʱ���������������⣨������ͬһ��Sprite����
public Player createPlayer(PlayerConfig cfg) {
Player player = new Player(cfg.getId(), cfg.getName(), cfg.getCharacter());
player.setSceneLocation(cfg.getX(), cfg.getY());
String strColorations = cfg.getColorations();
if (strColorations != null) {// Ⱦɫ
String[] colors = strColorations.split(",");
int[] colorations = new int[colors.length];
for (int i = 0; i < colors.length; i++) {
colorations[i] = colors[i].charAt(0) - '0';
}
player.setColorations(colorations, false);//��setState֮ǰ
}
player.setState(cfg.getState());
player.setDirection(cfg.getDirection());
String mAction = cfg.getMovement();
// if (mAction != null) {
// MovementManager.put(player, mAction, cfg.getPeriod());
// }
return player;
}
public Player createPlayer(PlayerVO data) {
Player player = new Player(data.id, data.name, data.character);
player.setData(data);
return player;
}
public Player createPlayer(String character, int[] colorations) {
Player player = new Player(null, "���", character);
player.setColorations(colorations, true);
player.setState(Player.STATE_STAND);
player.setDirection(0);
return player;
}
public Player createPlayer(String character,Map<String,Object> cfg) {
Player player = createPlayer(character,(int[]) cfg.get("colorations"));
PlayerVO data = new PlayerVO((String)cfg.get("id"),(String)cfg.get("name"),character);
try {
BeanUtils.populate(player, cfg);
BeanUtils.populate(data, cfg);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//FIXME ��ʼ������
//data.level = cfg.level;
this.initPlayerData(data);
this.recalcProperties(data);
System.out.println("create player: "+data);
player.setData(data);
return player;
}
public boolean existItem(String name,int amount) {
return false;
}
/**
* ����NPC��������
* @param npcId
* @return
*/
public String findChat(String npcId) {
File file = CacheManager.getInstance().getFile("chat/"+npcId+".txt");
if(file!=null && file.exists()) {
List<String> chats = new ArrayList<String>();
try {
String str = null;
BufferedReader br= new BufferedReader(new InputStreamReader(new FileInputStream(file)));
while((str=br.readLine())!=null) {
if(StringUtils.isNotBlank(str) && !"P N".equals(str.trim())) {
chats.add(str);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
int index = rand.nextInt(chats.size());
if(lastchat!=null && lastchat.startsWith(npcId)) {
int lastindex = Integer.valueOf(lastchat.substring(npcId.length()+1));
index = (lastindex+1)%chats.size();
}
if(chats.size()>index) {
String chat = chats.get(index);
lastchat = npcId+"_"+index;
return chat;
}
}
return null;
}
/**
* ����ij���͵���Ʒ
* @param player
* @param type ��Ʒ���ͣ��ο�ItemTypes
* @return
*/
public ItemInstance[] findItems(Player player,int type) {
ItemInstance[] allitems = getItems(player);
List<ItemInstance> results = new ArrayList<ItemInstance>();
for (int i = 0; i < allitems.length; i++) {
ItemInstance item = allitems[i];
if(item!=null && ItemTypes.isType(item.getItem(), type)) {
results.add(item);
}
}
return results.toArray(new ItemInstance[results.size()]);
}
public List<SceneNpc> findNpcsBySceneId(int sceneId) {
try {
return sceneNpcDAO.findNpcsBySceneId(sceneId);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* @return
*
*/
public Scene findScene(int sceneId) {
try {
return sceneDAO.findScene(sceneId);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public SceneNpc findSceneNpc(Integer id) {
try {
return sceneNpcDAO.findSceneNpc(id);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public SceneTeleporter findSceneTeleporter(Integer id) {
try {
return sceneTeleporterDAO.findSceneTeleporter(id);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public List<SkillMain> findMainSkill(String school){
try {
return skillMain.findSkillBySchool(school);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public Skill findSkillByName(String name) {
try {
Skill magic = skillMagic.findSkillByName(name);
return magic;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public List<SceneTeleporter> findTeleportersBySceneId(int sceneId) {
try {
return sceneTeleporterDAO.findTeleportersBySceneId(sceneId);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public ItemInstance getItemAt(Player player,int index) {
ItemInstance[] list = itemsMap.get(player);
return list!=null?list[index]: null;
}
/**
* ��ȡ��Ϸ��������б�
*/
public ItemInstance[] getItems(Player player) {
ItemInstance[] items = itemsMap.get(player);
if(items == null) {
items = new ItemInstance[26];
itemsMap.put(player, items);
}
return items;
}
public String getBasicSkillName (String school){
for(int i=0; i<�����б�.length; i++){
if(StringUtils.equals(�����б�[i], school)){
return basic_skill[i];
}
}
return null;
}
public long getLevelExp(int level) {
return levelExpTable[level];
}
public long getMSkillsLevelExp(int level){
return mskillslevelExpTable[level];
}
public long getMSkillsLevelSpend(int level){
return mskillslevelSpendTable[level];
}
/**
* ��Ʒ���Ե��ӵ��������
* @param item
* @return
*/
public int getOverlayAmount(Item item) {
int amount = 1;
if (item instanceof MedicineItem) {
MedicineItem mitem = (MedicineItem) item;
switch (mitem.getLevel()) {
case 1:
amount = 99;
break;
case 2:
amount = 30;
break;
case 3:
amount = 10;
break;
default:
break;
}
}
return amount;
}
/**
* ��ȡ������ݼ�ֵ��
* @param player
* @return
*/
public Map<String, Object> getProperties(Player player) {
try {
Map props = PropertyUtils.describe(player.getData());
props.put("levelExp", getLevelExp(player.getData().level));
return props;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}
/**
* ��ʼ����������
*/
private void init() {
String cacheBase = CacheManager.getInstance().getCacheBase();
System.setProperty("derby.system.home", cacheBase);
System.out.println("initializing datastore: "+new java.util.Date()+", dbDir: "+cacheBase);
weaponDAO = new WeaponItemDAOImpl();
medicineDAO = new MedicineItemDAOImpl();
sceneDAO = new SceneDAOImpl();
sceneNpcDAO = new SceneNpcDAOImpl();
sceneTeleporterDAO = new SceneTeleporterDAOImpl();
skillMain = new SkillMainDAOImpl();
skillMagic = new SkillMagicDAOImpl();
itemDAOs.add(weaponDAO);
itemDAOs.add(medicineDAO);
/*try {
Skill skill = skillMain.findSkillByName("����ѧ˵");
System.out.println("skill's description is:"+skill.getDescription());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
System.out.println("initialized datastore: "+new java.util.Date());
}
/**
* ��ʼ������
*/
private void initData() {
System.out.println("creating game data: "+new java.util.Date());
int[] colorations = new int[3];
colorations[0] = 2;
colorations[1] = 4;
colorations[2] = 3;
Map<String, Object> data = new HashMap<String, Object>();
data.put("name","��ң��«" );
data.put("level", 5);
data.put("school", "��ׯ��");
data.put("direction",0 );
data.put("state","stand" );
data.put("colorations", colorations);
Player p = this.createPlayer("0010",data);
context.setPlayer(p);
p.setSceneLocation(52,32);
context.setScene("1146");//��ׯ��
ItemInstance item = createItem("��Ҷ��");
item.setAmount(99);
addItemToPlayerBag(p,item);
item = createItem("����");
item.setAmount(99);
addItemToPlayerBag(p,item);
item = createItem("Ѫɫ�軨");
item.setAmount(30);
item = createItem("�����");
addItemToPlayerBag(p,item);
int money = 50000;
addMoney(p, money);
System.out.println("create game data: "+new java.util.Date());
}
private void initElf(PlayerVO elf) {
//TODO �������Ե�������
Random random = new Random();
//��ʼ������5�㣬ÿ�ȼ�����1��
int base = elf.level *1 +5;
//Ұ����������������25����ʼ50���һ�룩+ �ȼ�*3��ÿ�ȼ�3�㣩
int toAssign = 25 + elf.level * 3;
int[] assigns = new int[5];
//����������
for(int i=0;i<toAssign;i++) {
assigns[random.nextInt(5)] ++;
}
elf.physique = base + assigns[0];
elf.magic = base + assigns[1];
elf.strength = base + assigns[2];
elf.defense = base + assigns[3];
elf.agility = base + assigns[4];
//�������
elf.school = �����б�[random.nextInt(12)];
//���¼�������
this.recalcElfProps(elf);
}
/**
* ��ʼ��npc���ԣ����
* @param vo
*/
public void initNPC(Player player) {
//TODO
}
public void initPlayerData(PlayerVO vo) {
try {
if(inArray(����, vo.character)) {
BeanUtils.populate(vo, humanData);
}else if(inArray(ħ��, vo.character)) {
BeanUtils.populate(vo, devilData);
}else if(inArray(����, vo.character)) {
BeanUtils.populate(vo, immortalData);
}
vo.maxHp = vo.hp;
vo.maxMp = vo.mp;
vo.tmpMaxHp = vo.maxHp;
vo.potentiality = 5 + 5*vo.level;
vo.physique += vo.level;
vo.magic+= vo.level;
vo.strength+= vo.level;
vo.durability+= vo.level;
vo.agility+= vo.level;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public PlayerVO createPlayerData(String character) {
try {
PlayerVO vo = new PlayerVO();
if(inArray(����, character)) {
BeanUtils.populate(vo, humanData);
}else if(inArray(ħ��, character)) {
BeanUtils.populate(vo, devilData);
}else if(inArray(����, character)) {
BeanUtils.populate(vo, immortalData);
}
vo.character = character;
vo.createDate = new java.util.Date();
vo.maxHp = vo.hp;
vo.maxMp = vo.mp;
vo.tmpMaxHp = vo.maxHp;
vo.potentiality = 5 + 5*vo.level;
vo.physique += vo.level;
vo.magic+= vo.level;
vo.strength+= vo.level;
vo.durability+= vo.level;
vo.agility+= vo.level;
return vo;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
/**
* ����Ĭ�ϴ浵
*/
public void loadData() {
System.out.println("loading game data: "+new java.util.Date());
File file = CacheManager.getInstance().getFile("save/0.jxd");
if(file==null || !file.exists() || file.length()==0) {
initData();
return ;
}
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
System.out.printf("��ȡ��Ϸ�浵��������%s��...\n",ois.readObject());
//����ID
String sceneId = ois.readUTF();
//��������
PlayerVO playerData = (PlayerVO) ois.readObject();
//��Ʒ����
ItemInstance[] items = new ItemInstance[ois.readInt()];
for(int i=0;i<items.length;i++) {
ItemInstance _inst = (ItemInstance) ois.readObject();
items[i] = _inst;
//read item
if(_inst!=null) {
_inst.setItem((MedicineItem)medicineDAO.findItem(_inst.getItemId()));
}
}
//��������
Task[] tasks = new Task[ois.readInt()];
for(int i=0;i<tasks.length;i++) {
tasks[i] = (Task) ois.readObject();
}
ois.close();
//��ʼ��
Map<String, Object> data = new HashMap<String, Object>();
data.put("name",playerData.name );
data.put("level", playerData.level);
data.put("school", playerData.school);
data.put("direction",playerData.direction );
data.put("state",playerData.state );
data.put("colorations", playerData.colorations);
data.put("sceneLocation", playerData.sceneLocation);
Player player = this.createPlayer(playerData.character,data);
player.setData(playerData);
context.setPlayer(player);
context.setScene(sceneId);
for(int i=0;i<items.length;i++) {
setItem(player,i,items[i]);
}
if(tasks!=null) {
TaskManager taskManager = ApplicationHelper.getApplication().getTaskManager();
for (int i = 0; i < tasks.length; i++) {
taskManager.add(tasks[i]);
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("loaded game data: "+new java.util.Date());
}
/**
* ������Ʒ
* @param srcItem Դ��Ʒ
* @param destItem Ŀ����Ʒ
* @return ���ӳɹ�����true
*/
public boolean overlayItems(ItemInstance srcItem,ItemInstance destItem) {
if(srcItem.equals(destItem)) {
int maxAmount = getOverlayAmount(srcItem.getItem());
if(maxAmount > destItem.getAmount()) {
int total = srcItem.getAmount() + destItem.getAmount();
destItem.setAmount( Math.min(total,maxAmount));
srcItem.setAmount(total - destItem.getAmount());
return true;
}
}
return false;
}
/**
* ������������ֵ
*
* @param vo
*/
public void recalcElfProps(PlayerVO vo) {
//TODO ���Ƴɳ���
Double rate = growthRateTable.get(vo.character);
if(rate == null) {
rate = 1.0;
}
int maxhp0 = vo.maxHp;
int maxmp0 = vo.maxMp;
vo.maxHp = vo.physique*5 + 100;
vo.maxMp = vo.magic*3+80;
vo.hitrate = (int) (rate*(vo.strength*2+30));
vo.harm = (int) (rate*(vo.strength*0.7+34));
vo.defense = (int) (rate*(vo.durability*1.5 ));
vo.speed = (int) (0.8 * rate*(vo.physique*0.1 + vo.durability*0.1 + vo.strength*0.1 + vo.agility*0.7 + vo.magic*0));
vo.wakan = (int) (rate*(vo.physique*0.3 + vo.magic*0.7 + vo.durability*0.2 + vo.strength*0.4 + vo.agility*0 ));
vo.shun = (int) (rate*(vo.agility*1 + 10));
}
/**
* �������������ֵ
* @param vo
*/
public void recalcProperties(PlayerVO vo) {
String[] attrs = {"hitrate","speed","wakan","shun","harm","defense","stamina","energy"};
try {
for(String attr : attrs) {
Object value = PlayerPropertyCalculator.invokeMethod("calc_"+attr, vo);
BeanUtils.copyProperty(vo, attr, value);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//,"��Ѫ","ħ��"
int maxHp0 = vo.maxHp;
int maxMp0 = vo.maxMp;
vo.maxHp = vo.tmpMaxHp = PlayerPropertyCalculator.calc_��Ѫ(vo);
vo.maxMp = PlayerPropertyCalculator.calc_ħ��(vo);
vo.hp += vo.maxHp-maxHp0;
vo.mp += vo.maxMp-maxMp0;
}
public boolean removeItemFromPlayer(Player player,int index) {
ItemInstance[] items = getItems(player);
if(items[index]!=null) {
System.out.println("remove item: "+items[index]);
items[index] = null;
return true;
}
return false;
}
public void removeItemFromPlayer(Player player,ItemInstance item) {
if(item == null) return;
ItemInstance[] items = getItems(player);
for (int i = 0; i < items.length; i++) {
if(items[i] == item) {
items[i] = null;
break;
}
}
System.out.println("remove item: "+item );
}
/**
* ������Ϸ���ݵ��浵
*/
public void saveData() {
try {
File file = CacheManager.getInstance().createFile("save/tmp.jxd");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
//����ʱ��
oos.writeObject(new java.util.Date());
//����
oos.writeUTF(context.getScene());
//��������
Player player = context.getPlayer();
PlayerVO playerData = player.getData();
playerData.state = "stand";
playerData.direction = player.getDirection();
playerData.colorations = player.getColorations();
playerData.sceneLocation = player.getSceneLocation();
oos.writeObject(playerData);
//��Ʒ����
ItemInstance[] items = getItems(player);
oos.writeInt(items.length);
for (int i = 0; i < items.length; i++) {
oos.writeObject(items[i]);
}
//��������
TaskManager taskManager = ApplicationHelper.getApplication().getTaskManager();
List tasks = taskManager.getTaskList();
oos.writeInt(tasks.size());
for (int i = 0; i < tasks.size(); i++) {
oos.writeObject(tasks.get(i));
}
oos.close();
//�滻Ĭ�ϴ浵
File defaultfile = CacheManager.getInstance().createFile("save/0.jxd");
// if(defaultfile!=null && defaultfile.exists()) {
// GameMain.deleteFile("save/1.jxd");
// defaultfile.renameTo(new File(defaultfile.getAbsolutePath().replaceFirst("0\\.jxd", "1.jxd")));
// }
if(defaultfile!=null && defaultfile.exists()) {
defaultfile.delete();
}
file.renameTo(defaultfile);
System.out.println("��Ϸ�浵���");
} catch (FileNotFoundException e) {
System.out.println("��Ϸ�浵ʧ��,�Ҳ����ļ���");
e.printStackTrace();
} catch (IOException e) {
System.out.println("��Ϸ�浵ʧ�ܣ�IO����"+e.getMessage());
e.printStackTrace();
} catch (Exception e) {
System.out.println("��Ϸ�浵ʧ�ܣ�"+e.getMessage());
e.printStackTrace();
}
}
/**
* ��������ĵ���
* @param index ����λ����ţ����϶��£������������� in 5*4 = [0,20)
*/
public void setItem(Player player,int index,ItemInstance item_inst) {
ItemInstance[] items_inst = getItems(player);
items_inst[index] = item_inst;
if(item_inst != null && item_inst.getItem() == null) {
if(item_inst.getName() != null) {
Item item = this.findItemByName(item_inst.getName());
if(item != null) {
item_inst.setItem(item);
}else {
items_inst[index] = null;
}
}
}
}
public void setItemByName(Player player,int index,String itemName) {
setItem(player,index,createItem(itemName));
}
public void setItems(Player player, ItemInstance[] items_inst) {
//TODO �Ľ���ʼ����Ʒ���㷨
if(items_inst != null) {
ItemInstance[] _items = getItems(player);
for (int i = 0; i < _items.length; i++) {
ItemInstance _inst = items_inst[i];
_items[i] = _inst;
try {
if(_inst!=null && _inst.getItem() == null) {
if(_inst.getName() != null) {
Item item = this.findItemByName(_inst.getName());
if(item != null) {
_inst.setItem(item);
}else {
_items[i] = null;
}
}
}
} catch (Exception e) {
_items[i] = null;
e.printStackTrace();
}
}
}
}
public void swapItem(Player player, int srcIndex, int destIndex){
synchronized(player) {
ItemInstance[] items = getItems(player);
ItemInstance temp = items[srcIndex];
items[srcIndex] = items[destIndex];
items[destIndex] = temp;
}
}
}