package com.rpsg.rpg.controller;
import java.util.List;
import com.badlogic.gdx.utils.GdxRuntimeException;
import com.badlogic.gdx.utils.JsonValue;
import com.rpsg.rpg.core.File;
import com.rpsg.rpg.core.Game;
import com.rpsg.rpg.core.Log;
import com.rpsg.rpg.core.Path;
import com.rpsg.rpg.object.item.BaseItem;
import com.rpsg.rpg.object.item.Item;
import com.rpsg.rpg.util.Stream;
import java8.util.stream.Collectors;
/**
* GDX-RPG 道具控制器
*/
public class ItemController {
/** 获取背包里所有的道具 */
public List<BaseItem> list() {
if (Game.view == null)
throw new GdxRuntimeException("must in the game when call ItemController.list()");
return Game.archive.get().items;
}
/**
* 给当前游戏存档放入一个道具
* @param id 道具ID
*/
public void put(int id) {
BaseItem baseItem = search(id);
if (baseItem == null)
put(get(id));
else
// 如果可叠加的,则数量+1,否则新建实例_(:3
if (baseItem.packable)
baseItem.count++;
else
put(get(id));
}
public void put(int id, int count) {
for (int i = count; i < 0; i--)
put(id);
}
/***
* 原始put,将保留装备属性,原汁原味=。=
*/
public void put(BaseItem baseItem) {
list().add(baseItem);
}
/**
* 根据ID从文件里读取出一个Item
*
* @param id id键
* @return
*/
public BaseItem get(int id) {
return get(id, BaseItem.class);
}
/**
* 根据ID从文件里读取出一个Item,并且造型
*
* @param id id键
* @param _cType 转型
* @return
*/
@SuppressWarnings("unchecked")
public <T extends BaseItem> T get(int id, Class<T> _cType) {
JsonValue value = File.readJSON(Path.SCRIPT_DATA_ITEM + id + ".grd");
String type = value.getString("type");
try {
BaseItem baseItem = (BaseItem) Class.forName(Item.class.getPackage().getName() + "." + type)
.getConstructor(Integer.class, JsonValue.class).newInstance(id, value);
return (T) baseItem;
} catch (Exception e) {
Log.e("无法读取物品:" + id, e);
e.printStackTrace();
return null;
}
}
/** 移除1个 <b><i>当前背包</i></b> 里的某个道具(根据ID) **/
public boolean remove(int id) {
return remove(search(id), 1);
}
/**
* 移除数个 <b><i>当前背包</i></b> 里的某个道具
*
* @param baseItem 道具实体类
* @param count 数量
* @return 操作是否成功
*/
public boolean remove(BaseItem baseItem, int count) {
if (baseItem == null)
return false;
if(!list().contains(baseItem))
return false;
if (baseItem.count - count < 0)
return false;
baseItem.count -= count;
if (baseItem.count <= 0)
list().remove(baseItem);
return true;
}
/** 移除1个 <b><i>当前背包</i></b> 里的某个道具(根据实体类) **/
public boolean remove(BaseItem baseItem) {
return remove(baseItem, 1);
}
/** 移除数个 <b><i>当前背包</i></b> 里的某个道具(根据ID) **/
public boolean remove(int id, int count) {
return remove(search(id), count);
}
public synchronized BaseItem search(int id) {
return Stream.of(list()).filter(i -> i.id == id).findAny().orElse(null);
}
/**
* 根据道具类型搜索出<b><i>当前背包</i></b> 里的一个或道具
*
* @param type 类型
*/
public List<BaseItem> search(String type) {
return Stream.of(list()).filter(i -> i.type.equalsIgnoreCase(type)).collect(Collectors.toList());
}
}