/*
* 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 war;
import java.util.HashMap;
import java.util.Map;
import org.skfiy.typhon.domain.item.IFightItem.Shot;
import org.skfiy.typhon.script.Script;
import org.skfiy.typhon.session.Session;
import org.skfiy.typhon.spi.war.BufferSkill;
import org.skfiy.typhon.spi.war.Direction;
import org.skfiy.typhon.spi.war.FightObject;
import org.skfiy.typhon.spi.war.Q7ComboWapper;
import org.skfiy.typhon.spi.war.WarInfo;
/**
*
* @author Kevin Zou <kevinz@skfiy.org>
*/
public class Q7ComboScript implements Script {
@Override
public Object invoke(Session session, Object obj) {
Q7ComboWapper qcw = (Q7ComboWapper) obj;
WarInfo.Entity attackerEntity = qcw.getAttackerEntity();
BufferSkill bs;
for (FightObject fobj : attackerEntity.getFightObjects()) {
if (qcw.getWarCombo().getComboCount() == 2) {
bs = new TwoCombo(qcw.getWarInfo(), attackerEntity, fobj);
} else {
bs = new ThreeCombo(qcw.getWarInfo(), attackerEntity, fobj);
}
bs.onBefore();
}
return null;
}
private static class TwoCombo implements BufferSkill {
private static final Shot[] QXI_SHOTS = {Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi,
Shot.QXi};
private final Map<FightObject, Shot[]> shotMap = new HashMap<>();
private final WarInfo warInfo;
private final WarInfo.Entity attackerEntity;
private final FightObject fobj;
private int atkCount;
public TwoCombo(WarInfo warInfo, WarInfo.Entity attackerEntity, FightObject fobj) {
this.warInfo = warInfo;
this.attackerEntity = attackerEntity;
this.fobj = fobj;
}
@Override
public String getName() {
return "Q7";
}
@Override
public Type getType() {
return Type.BUFF;
}
@Override
public Object onBefore() {
atkCount = attackerEntity.getAtkCount();
// 缓存原先的拉霸项
shotMap.put(fobj, fobj.getShots());
fobj.setShots(getShots());
fobj.addBufferSkill(this);
// 继续攻击
warInfo.setNextDire(attackerEntity.getDire());
return null;
}
@Override
public Object onAfter() {
if ((attackerEntity.getAtkCount() - atkCount) >= 3) {
fobj.setShots(shotMap.get(fobj));
fobj.removeBufferSkill(this);
}
return null;
}
Shot[] getShots() {
return QXI_SHOTS;
}
@Override
public Object onFinish() {
throw new UnsupportedOperationException("Not supported yet.");
}
}
private static class ThreeCombo extends TwoCombo {
private static final Shot[] BSA_SHOTS = {Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa,
Shot.BSa};
public ThreeCombo(WarInfo warInfo, WarInfo.Entity attackerEntity, FightObject fobj) {
super(warInfo, attackerEntity, fobj);
}
@Override
Shot[] getShots() {
return BSA_SHOTS;
}
}
}