Guild PQ + fixed negative EXP error

Implemented Guild PQ. Fixed a problem introduced earlier where negative
EXP would be deemed as "integer overflow", provoking many game breaking
issues as result.
This commit is contained in:
ronancpl
2017-06-18 03:19:53 -03:00
parent 81f9226286
commit 42fe74955d
135 changed files with 822 additions and 564 deletions

View File

@@ -1,254 +1,209 @@
/* @Author Lerk
/* @Author Lerk, Ronan
*
* Guardian Statue - Sharenian: Fountain of the Wiseman (990000500)
*
* Guild Quest Stage 3
*/
importPackage(Packages.tools);
function clearStage(stage, eim) {
eim.setProperty("stage" + stage + "clear", "true");
eim.showClearEffect(true);
eim.giveEventPlayersStageReward(stage);
}
function start() {
//everything can be done in one status, so let's do it here.
if (cm.getPlayer().getMap().getReactorByName("watergate").getState() > 0){
cm.sendOk("Excellent work. You may proceed to the next stage.");
cm.dispose();
return;
}
var eim = cm.getPlayer().getEventInstance();
if (eim == null) {
cm.warp(990001100);
} else {
if (eim.getProperty("leader").equals(cm.getName())) {
if (cm.getPlayer().getMap().getReactorByName("watergate").getState() > 0){
cm.sendOk("You may proceed.");
} else {
var currentCombo = eim.getProperty("stage3combo");
if (currentCombo == null || currentCombo.equals("reset")) {
var newCombo = makeCombo();
eim.setProperty("stage3combo",newCombo);
//cm.playerMessage("Debug: " + newCombo);
eim.setProperty("stage3attempt","1");
cm.sendOk("This fountain guards the secret passage to the throne room. Offer items in the area to the vassals to proceed. The vassals shall tell you whether your offerings are accepted, and if not, which vassals are displeased. You have seven attempts. Good luck.")
} else {
var attempt = parseInt(eim.getProperty("stage3attempt"));
var combo = parseInt(currentCombo);
var guess = getGroundItems();
if (guess != null) {
if (combo == guess) {
cm.getPlayer().getMap().getReactorByName("watergate").hitReactor(cm.getClient());
cm.sendOk("You may proceed.");
cm.getPlayer().getMap().broadcastMessage(MaplePacketCreator.showEffect("quest/party/clear"));
cm.getPlayer().getMap().broadcastMessage(MaplePacketCreator.playSound("Party1/Clear"));
var prev = eim.getProperty("stage3clear");
eim.setProperty("stage3clear","true");
if (prev == null) {
cm.getPlayer().getGuild().gainGP(100);
}
} else {
if (attempt < 7) {
//cm.playerMessage("Combo : " + combo);
//cm.playerMessage("Guess : " + guess);
var parsedCombo = parsePattern(combo);
var parsedGuess = parsePattern(guess);
var results = compare(parsedCombo, parsedGuess);
var string = "";
//cm.playerMessage("Results - Correct: " + results[0] + " | Incorrect: " + results[1] + " | Unknown: " + results[2]);
if (results[0] != 0) {
if (results[0] == 1) {
string += "1 vassal is pleased with their offering.\r\n";
} else {
string += results[0] + " vassals are pleased with their offerings.\r\n";
}
}
if (results[1] != 0) {
if (results[1] == 1) {
string += "1 vassal has recieved an incorrect offering.\r\n";
} else {
string += results[1] + " vassals have recieved incorrect offerings.\r\n";
}
}
if (results[2] != 0) {
if (results[2] == 1) {
string += "1 vassal has recieved an unknown offering.\r\n";
} else {
string += results[2] + " vassals have recieved unknown offerings.\r\n";
}
}
string += "This is your ";
switch (attempt) {
case 1:
string += "1st";
break;
case 2:
string += "2nd";
break;
case 3:
string += "3rd";
break;
default:
string += attempt + "th";
break;
}
string += " attempt.";
if (cm.isEventLeader()) {
var currentCombo = eim.getProperty("stage3combo");
if (currentCombo == null || currentCombo.equals("reset")) {
var newCombo = makeCombo();
eim.setProperty("stage3combo",newCombo);
//cm.playerMessage("Debug: " + newCombo);
eim.setProperty("stage3attempt","1");
cm.sendOk("This fountain guards the secret passage to the throne room. Offer items in the area to the vassals to proceed. The vassals shall tell you whether your offerings are accepted, and if not, which vassals are displeased. You have seven attempts. Good luck.");
} else {
var attempt = parseInt(eim.getProperty("stage3attempt"));
var combo = parseInt(currentCombo);
var guess = getGroundItems();
if (guess != null) {
if (combo == guess) {
cm.getPlayer().getMap().getReactorByName("watergate").forceHitReactor(1);
clearStage(3, eim);
cm.getGuild().gainGP(25);
removeGroundItems();
cm.sendOk("Excellent work. You may proceed to the next stage.");
} else {
if (attempt < 7) {
var comboItems = [0, 0, 0, 0];
var guessItems = [0, 0, 0, 0];
var correct = 0, incorrect, unknown = 0;
for(var i = 0; i < 4; i++) {
var guessIdx = Math.floor(guess / Math.pow(10, i)) % 10;
var comboIdx = Math.floor(combo / Math.pow(10, i)) % 10;
if(guessIdx == comboIdx) correct++;
else {
(guessItems[guessIdx])++;
(comboItems[comboIdx])++;
}
}
for(var i = 0; i < 4; i++) {
var diff = guessItems[i] - comboItems[i];
if(diff > 0) unknown += diff;
}
incorrect = 4 - correct - unknown;
var string = "";
//cm.playerMessage("Results - Correct: " + results[0] + " | Incorrect: " + results[1] + " | Unknown: " + results[2]);
if (correct != 0) {
if (correct == 1) {
string += "1 vassal is pleased with their offering.\r\n";
} else {
string += correct + " vassals are pleased with their offerings.\r\n";
}
}
if (incorrect != 0) {
if (incorrect == 1) {
string += "1 vassal has received an incorrect offering.\r\n";
} else {
string += incorrect + " vassals have received incorrect offerings.\r\n";
}
}
if (unknown != 0) {
if (unknown == 1) {
string += "1 vassal has received an unknown offering.\r\n";
} else {
string += unknown + " vassals have received unknown offerings.\r\n";
}
}
string += "This is your ";
switch (attempt) {
case 1:
string += "1st";
break;
case 2:
string += "2nd";
break;
case 3:
string += "3rd";
break;
default:
string += attempt + "th";
break;
}
string += " attempt.";
//spawn one black and one myst knight
spawnMob(9300036, -350, 150, cm.getPlayer().getMap());
spawnMob(9300037, 400, 150, cm.getPlayer().getMap());
//spawn one black and one myst knight
spawnMob(9300036, -350, 150, cm.getPlayer().getMap());
spawnMob(9300037, 400, 150, cm.getPlayer().getMap());
cm.sendOk(string);
eim.setProperty("stage3attempt",attempt + 1);
} else {
//reset the combo and mass spawn monsters
eim.setProperty("stage3combo","reset");
cm.sendOk("You have failed the test. Please compose yourselves and try again later.");
cm.sendOk(string);
eim.setProperty("stage3attempt",attempt + 1);
} else {
//reset the combo and mass spawn monsters
eim.setProperty("stage3combo","reset");
cm.sendOk("You have failed the test. Please compose yourselves and try again later.");
for (var i = 0; i < 6; i++) {
//keep getting new monsters, lest we spawn the same monster five times o.o!
spawnMob(9300036, randX(), 150, cm.getPlayer().getMap());
spawnMob(9300037, randX(), 150, cm.getPlayer().getMap());
}
}
}
} else {
cm.sendOk("Please make sure your attempt is properly set in front of the vassals and talk to me again.");
}
}
}
} else {
cm.sendOk("Please have your leader speak to me.");
}
for (var i = 0; i < 6; i++) {
//keep getting new monsters, lest we spawn the same monster five times o.o!
spawnMob(9300036, randX(), 150, cm.getPlayer().getMap());
spawnMob(9300037, randX(), 150, cm.getPlayer().getMap());
}
}
eim.showWrongEffect();
}
} else {
cm.sendOk("Please make sure your attempt is properly set in front of the vassals and talk to me again.");
}
}
} else {
cm.sendOk("Please have your leader speak to me.");
}
}
cm.dispose();
}
function action(mode, type, selection) {
}
function action(mode, type, selection) {}
function makeCombo() {
var combo = 0;
for (var i = 0; i < 4; i++) {
combo += Math.floor(Math.random() * 4) * Math.pow(10, i);
combo += (Math.floor(Math.random() * 4) * Math.pow(10, i));
}
return combo;
}
//check the items on ground and convert into an applicable string; null if items aren't proper
function getGroundItems() {
var items = cm.getPlayer().getMap().getMapObjectsInRange(cm.getPlayer().getPosition(), Packages.java.lang.Double.POSITIVE_INFINITY, Packages.java.util.Arrays.asList([Packages.server.maps.MapleMapObjectType.ITEM]));
var itemInArea = new Array(-1, -1, -1, -1);
if (items.size() != 4) {
cm.getPlayer().dropMessage("There are too many items in the map. Please remove some");
return null;
}
var iter = items.iterator();
function getRawItems() {
var mapItems = cm.getPlayer().getMap().getItems();
var rawItems = new Array();
var iter = mapItems.iterator();
while (iter.hasNext()) {
var item = iter.next();
var id = item.getItem().getItemId();
if (id < 4001027 || id > 4001030) {
cm.getPlayer().dropMessage("Some items in the map are not part of the 4 items needed");
return null;
continue;
} else {
//check item location
for (var i = 0; i < 4; i++) {
if (cm.getPlayer().getMap().getArea(i).contains(item.getPosition())) {
itemInArea[i] = id - 4001027;
//cm.getPlayer().dropMessage("Item in area "+i+": " + id);
break;
}
}
rawItems.push(item);
}
}
return rawItems;
}
//check the items on ground and convert into an applicable string; null if items aren't proper
function getGroundItems() {
var itemInArea = new Array(-1, -1, -1, -1);
var rawItems = getRawItems();
if (rawItems.length != 4) return null;
for(var j = 0; j < rawItems.length; j++) {
var item = rawItems[j];
var id = item.getItem().getItemId();
//check item location
for (var i = 0; i < 4; i++) {
if (cm.getPlayer().getMap().getArea(i).contains(item.getPosition())) {
itemInArea[i] = id - 4001027;
break;
}
}
}
//guaranteed four items that are part of the stage 3 item set by this point, check to see if each area has an item
if (itemInArea[0] == -1 || itemInArea[1] == -1 || itemInArea[2] == -1 || itemInArea[3] == -1) {
cm.getPlayer().dropMessage("Please place these in correct positions: " + (itemInArea[0] == -1 ? "Statue 1, " : "") + (itemInArea[1] == -1 ? "Statue 2, " : "") + (itemInArea[2] == -1 ? "Statue 3, " : "") + (itemInArea[3] == -1 ? "Statue 4. " : ""));
/* for (var i = 0; i < 4; i++) {
cm.getPlayer().dropMessage("Item in area "+i+": " + itemInArea[i]);
}*/
if (itemInArea[0] == -1 || itemInArea[1] == -1 || itemInArea[2] == -1 || itemInArea[3] == -1)
return null;
}
return (itemInArea[0] * 1000 + itemInArea[1] * 100 + itemInArea[2] * 10 + itemInArea[3]);
return ((itemInArea[0] * 1000) + (itemInArea[1] * 100) + (itemInArea[2] * 10) + itemInArea[3]);
}
//convert an integer for answer or guess into int array for comparison
function parsePattern(pattern) {
var tempPattern = pattern;
var items = new Array(-1, -1, -1, -1);
for (var i = 0; i < 4; i++) {
items[i] = Math.floor(tempPattern / Math.pow(10, 3-i));
tempPattern = tempPattern % Math.pow(10, 3-i);
function removeGroundItems() {
var map = cm.getMap();
var rawItems = getRawItems();
for(var j = 0; j < rawItems.length; j++) {
map.makeDisappearItemFromMap(rawItems[j]);
}
return items;
}
// compare two int arrays for the puzzle
function compare(answer, guess) {
var correct = 0;
var incorrect = 0;
/*var debugAnswer = "Combo : ";
var debugGuess = "Guess : ";
for (var d = 0; d < answer.length; d++) {
debugAnswer += answer[d] + " ";
debugGuess += guess[d] + " ";
}
cm.getPlayer().dropMessage(debugAnswer);
cm.getPlayer().dropMessage(debugGuess);*/
for (var i = 0; i < answer.length; i) {
if (answer[i] == guess[i]) {
correct++;
//cm.getPlayer().dropMessage("Item match : " + answer[i]);
//pop the answer/guess at i
if (i != answer.length - 1) {
answer[i] = answer[answer.length - 1];
guess[i] = guess[guess.length - 1];
}
answer.pop();
guess.pop();
/*/debugAnswer = "Combo : ";
debugGuess = "Guess : ";
for (var d = 0; d < answer.length; d++) {
debugAnswer += answer[d] + " ";
debugGuess += guess[d] + " ";
}
cm.getPlayer().dropMessage(debugAnswer);
cm.getPlayer().dropMessage(debugGuess);*/
}
else {
i++;
}
}
//check remaining answers for "incorrect": correct item in incorrect position
var answerItems = new Array(0, 0, 0, 0);
var guessItems = new Array(0, 0, 0, 0);
for (var j = 0; j < answer.length; j++) {
var aItem = answer[j];
var gItem = guess[j]
answerItems[aItem]++;
guessItems[gItem]++;
}
/*for (var d = 0; d < answer.length; d++) {
cm.getPlayer().dropMessage("Item " + d + " in combo: " + answerItems[d] + " | in guess: " + guessItems[d]);
}*/
for (var k = 0; k < answerItems.length; k++) {
var inc = Math.min(answerItems[k], guessItems[k]);
//cm.getPlayer().dropMessage("Incorrect for item " + k + ": " + inc);
incorrect += inc;
}
return new Array(correct, incorrect, (4 - correct - incorrect));
}
//for mass spawn