/*
* Copyright 2014 The Skfiy Open Association.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.skfiy.typhon.spi.atlasloot;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.skfiy.typhon.AbstractComponent;
import org.skfiy.typhon.ComponentException;
import org.skfiy.typhon.domain.Lootable;
import org.skfiy.typhon.session.Session;
import org.skfiy.typhon.spi.ItemProvider;
import org.skfiy.typhon.util.ComponentUtils;
/**
*
* @author Kevin
*/
@Singleton
public class AtlaslootProvider extends AbstractComponent {
private final Map<String, RandomAtlaslootBean> allAtlasloots;
@Inject
private ItemProvider itemProvider;
public AtlaslootProvider() {
allAtlasloots = new HashMap<>();
}
@Override
protected void doInit() {
loadDatas();
}
@Override
protected void doReload() {
loadDatas();
}
@Override
protected void doDestroy() {
}
/**
*
* @param session
* @param lootable
* @param atlasloots
* @param ids
*/
public void calculateAtlasloot(Session session, Lootable lootable,
List<AtlaslootBean> atlasloots, String... ids) {
RandomAtlaslootBean randomAtlaslootBean;
AtlaslootBean atlaslootBean;
for (String id : ids) {
randomAtlaslootBean = allAtlasloots.get(id);
if (randomAtlaslootBean == null) {
throw new ComponentException("Not found atlasloot[" + id + "]");
}
atlaslootBean = randomAtlaslootBean.calculate(session, lootable);
if (atlaslootBean != null) {
atlasloots.add(atlaslootBean);
}
}
}
private void loadDatas() {
JSONArray jsonArray = JSON.parseArray(ComponentUtils.readDataFile("single_atlasloot.json"));
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
SingleAtlasloot atlasloot = new SingleAtlasloot();
atlasloot.setId(jsonObject.getString("id"));
atlasloot.setItem(itemProvider.getItem(jsonObject.getString("#item.id")));
atlasloot.setCount(jsonObject.getIntValue("count"));
atlasloot.setProb(jsonObject.getDoubleValue("prob"));
atlasloot.setFactor(jsonObject.getIntValue("factor"));
atlasloot.prepare();
allAtlasloots.put(atlasloot.getId(), atlasloot);
}
jsonArray = JSON.parseArray(ComponentUtils.readDataFile("multiple_atlasloot.json"));
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
MultipleAtlasloot atlasloot = new MultipleAtlasloot();
atlasloot.setId(jsonObject.getString("id"));
JSONArray lootArray = jsonObject.getJSONArray("loots");
AtlaslootBean[] atlaslootBeans = new AtlaslootBean[lootArray.size()];
for (int j = 0; j < atlaslootBeans.length; j++) {
JSONObject lootObject = lootArray.getJSONObject(j);
AtlaslootBean bean = new AtlaslootBean();
bean.setItem(itemProvider.getItem(lootObject.getString("#item.id")));
bean.setCount(lootObject.getIntValue("count"));
bean.setProb(lootObject.getDoubleValue("prob"));
atlaslootBeans[j] = bean;
}
double prevProb = 0;
for (AtlaslootBean ab : atlaslootBeans) {
ab.setProb(prevProb + ab.getProb());
prevProb = ab.getProb();
}
atlasloot.setAtlasloots(atlaslootBeans);
allAtlasloots.put(atlasloot.getId(), atlasloot);
}
}
}