/*
OrpheusMS: MapleStory Private Server based on OdinMS
Copyright (C) 2012 Aaron Weiss <aaron@deviant-core.net>
Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package server.partyquest;
import client.MapleCharacter;
import java.util.concurrent.ScheduledFuture;
import net.server.MapleParty;
import server.MapleItemInformationProvider;
import server.TimerManager;
import tools.MaplePacketCreator;
/**
*
* @author kevintjuh93
*/
public class Pyramid extends PartyQuest {
public enum PyramidMode {
EASY(0), NORMAL(1), HARD(2), HELL(3);
int mode;
PyramidMode(int mode) {
this.mode = mode;
}
public int getMode() {
return mode;
}
}
int kill = 0, miss = 0, cool = 0, exp = 0, map, count;
byte coolAdd = 5, missSub = 4, decrease = 1;// hmmm
short gauge;
byte rank, skill = 0, stage = 0, buffcount = 0;// buffcount includes buffs +
// skills
PyramidMode mode;
ScheduledFuture<?> timer = null;
ScheduledFuture<?> gaugeSchedule = null;
public Pyramid(MapleParty party, PyramidMode mode, int mapid) {
super(party);
this.mode = mode;
this.map = mapid;
byte plus = (byte) mode.getMode();
coolAdd += plus;
missSub += plus;
switch (plus) {
case 0:
decrease = 1;
case 1:
case 2:
decrease = 2;
case 3:
decrease = 3;
}
}
public void startGaugeSchedule() {
if (gaugeSchedule == null) {
gauge = 100;
count = 0;
gaugeSchedule = TimerManager.getInstance().register(new Runnable() {
@Override
public void run() {
gauge -= decrease;
if (gauge <= 0)
warp(926010001);
}
}, 1000);
}
}
public void kill() {
kill++;
if (gauge < 100)
count++;
gauge++;
broadcastInfo("hit", kill);
if (gauge >= 100)
gauge = 100;
checkBuffs();
}
public void cool() {
cool++;
int plus = coolAdd;
if ((gauge + coolAdd) > 100)
plus -= ((gauge + coolAdd) - 100);
gauge += plus;
count += plus;
if (gauge >= 100)
gauge = 100;
broadcastInfo("cool", cool);
checkBuffs();
}
public void miss() {
miss++;
count -= missSub;
gauge -= missSub;
broadcastInfo("miss", miss);
}
public int timer() {
int value;
if (stage > 0)
value = 180;
else
value = 120;
timer = TimerManager.getInstance().schedule(new Runnable() {
@Override
public void run() {
stage++;
warp(map + (stage * 100));// Should work :D
}
}, value * 1000);// , 4000
broadcastInfo("party", getParticipants().size() > 1 ? 1 : 0);
broadcastInfo("hit", kill);
broadcastInfo("miss", miss);
broadcastInfo("cool", cool);
broadcastInfo("skill", skill);
broadcastInfo("laststage", stage);
startGaugeSchedule();
return value;
}
public void warp(int mapid) {
for (MapleCharacter chr : getParticipants()) {
chr.changeMap(mapid);
}
if (stage > -1) {
gaugeSchedule.cancel(false);
gaugeSchedule = null;
timer.cancel(false);
timer = null;
} else
stage = 0;
}
public void broadcastInfo(String info, int amount) {
for (MapleCharacter chr : getParticipants()) {
chr.announce(MaplePacketCreator.getEnergy("massacre_" + info, amount));
chr.announce(MaplePacketCreator.pyramidGauge(count));
}
}
public boolean useSkill() {
if (skill < 1)
return false;
skill--;
broadcastInfo("skill", skill);
return true;
}
public void checkBuffs() {
int total = (kill + cool);
if (buffcount == 0 && total >= 250) {
buffcount++;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (MapleCharacter chr : getParticipants())
ii.getItemEffect(2022585).applyTo(chr);
} else if (buffcount == 1 && total >= 500) {
buffcount++;
skill++;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (MapleCharacter chr : getParticipants()) {
chr.announce(MaplePacketCreator.getEnergy("massacre_skill", skill));
ii.getItemEffect(2022586).applyTo(chr);
}
} else if (buffcount == 2 && total >= 1000) {
buffcount++;
skill++;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (MapleCharacter chr : getParticipants()) {
chr.announce(MaplePacketCreator.getEnergy("massacre_skill", skill));
ii.getItemEffect(2022587).applyTo(chr);
}
} else if (buffcount == 3 && total >= 1500) {
skill++;
broadcastInfo("skill", skill);
} else if (buffcount == 4 && total >= 2000) {
buffcount++;
skill++;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (MapleCharacter chr : getParticipants()) {
chr.announce(MaplePacketCreator.getEnergy("massacre_skill", skill));
ii.getItemEffect(2022588).applyTo(chr);
}
} else if (buffcount == 5 && total >= 2500) {
skill++;
broadcastInfo("skill", skill);
} else if (buffcount == 6 && total >= 3000) {
skill++;
broadcastInfo("skill", skill);
}
}
public void sendScore(MapleCharacter chr) {
if (exp == 0) {
int totalkills = (kill + cool);
if (stage == 5) {
if (totalkills >= 3000)
rank = 0;
else if (totalkills >= 2000)
rank = 1;
else if (totalkills >= 1500)
rank = 2;
else if (totalkills >= 500)
rank = 3;
else
rank = 4;
} else {
if (totalkills >= 2000)
rank = 3;
else
rank = 4;
}
if (rank == 0)
exp = (60500 + (5500 * mode.getMode()));
else if (rank == 1)
exp = (55000 + (5000 * mode.getMode()));
else if (rank == 2)
exp = (46750 + (4250 * mode.getMode()));
else if (rank == 3)
exp = (22000 + (2000 * mode.getMode()));
exp += ((kill * 2) + (cool * 10));
}
chr.announce(MaplePacketCreator.pyramidScore(rank, exp));
chr.gainExp(exp, true, true);
}
}