2009scape-website/site/candybox/scripts/quest.js
2020-11-29 20:55:42 -05:00

477 lines
19 KiB
JavaScript

var quest = {
// Variables
currentLandIndex : 0, // Index of the current land in land.list
maxLandOrder : -1, // Max land order we achieved for the moment
candiesFound : 0, // Number of candies found during a quest
speed : 0, // Speed of the character during a quest
things : [], // Array containing all the things present in a quest
tiredTime : 0, // Number of seconds we need to spend before doing another quest
tiredFound : 0, // Number of seconds we will need to wait after finishing the current quest
potionUseCountdown : 0, // Number of movements we have to wait before using another potion
scrollUseCountdown : 0, // Same thing for scrolls
escaping : false, // If true, it means we are escaping from the quest
gmooh : false,
berserk : false, // If true, we're in berserk mode
berserkCountdown : 0, // Number of cycles we still have to stay in berserk mode
invulnerability : false, // If true, we're invincible
invulnerabilityCountdown : 0, // Number of cycles we still have to stay as invincible
turtle : false, // If true, we're a turtle
turtleCountdown : 0, // Number of cycles we still have to stay as a turtle
weAreQuestingRightNow : false, // True if we're making a quest right now
characterSpeed : 1, // Speed of the character : if = 2 for example, the character will take two cycles to move. This variable can be reduce by being a turtle
characterSpeedStep : 1, // Used to apply the characterSpeed var
onloadAfter : function(){
this.setMaxLandOrder(0);
},
setMaxLandOrder : function(value){
if(value > this.maxLandOrder){
this.maxLandOrder = value; // We change the value
land.updateListOnPage(quest.maxLandOrder); // And we try to update the quest list on the html page, in case a new quest was unlocked
}
},
begin : function(getLandFromList, landIndex){
// Disable button
htmlInteraction.disableButton("quest_button");
// First thing to do !
this.weAreQuestingRightNow = true;
// If we have to get the land index from the list on the html page
if(getLandFromList == true){
// We get the index in land.list of the current land selected in the html list
var landNameInHtmlList = htmlInteraction.getElement("quest_destination").options[htmlInteraction.getElement("quest_destination").selectedIndex].text;
this.currentLandIndex = land.getLandIndexFromName(landNameInHtmlList);
}
// Else, we use the index given in the parameters
else{
this.currentLandIndex = landIndex;
}
// We show the quest panel
htmlInteraction.setElementVisibility("quest", true);
htmlInteraction.setElementVisibility("quest_potions_countdowns", true);
// We empty the things array and put none things in it
this.things = this.fillWithNoneThings();
// We add the character
if(land.ponyTime == false)
this.things[0] = {type:"character", text:"\\o/", max_hp:this.getCharacterMaxHp(), hp:this.getCharacterMaxHp(), weapon:(sword.name), description:"You"};
else
this.things[0] = {type:"character", text:"PON", max_hp:this.getCharacterMaxHp(), hp:this.getCharacterMaxHp(), weapon:(sword.name), description:"You"};
// We set the speed
this.speed = this.getSpeed();
// We set the potion & scroll use countdown
this.potionUseCountdown = 0;
this.scrollUseCountdown = 0;
// Not escaping at first
this.escaping = false;
// Not using gmooh potion at first
this.gmooh = false;
// Not in berserk mode at first
this.berserk = false;
this.berserkCountdown = 0;
this.speed = this.getSpeed();
// Not invincible at first
this.invulnerability = false;
this.invulnerabilityCountdown = 0;
// Not turtle at first
this.turtle = false;
this.turtleCountdown = 0;
// Speed = 1 at first and the step = 1 too
this.characterSpeed = 1;
this.characterSpeedStep = 1;
// Load the current land
land.load();
// Update the quest and the potions on page
this.updateOnPage();
potions.updateOnPage();
// Set a timeout for the next quest movement
window.setTimeout(this.move.bind(this), this.speed);
},
updateOnPage : function(){
// Variables declaration
var text;
// Land
text = land.getText();
text += "\n";
// Status
text += status2.getText();
text += "\n";
// Drops
text += drops.getText();
// Draw text
htmlInteraction.setInnerHtml("quest", text);
},
getCharacterMaxHp : function(){
return 100 + Math.floor(Math.pow(candies.nbrEaten, 0.4)*2.1); // This function means ~ one day of candies eaten at 1cnd/s = +200 hp
},
getSpeed : function(){
if(objects.list.boots.have && this.berserk) return 125;
if(objects.list.boots.have || this.berserk) return 250;
return 500;
},
getCharacterIndex : function(){
for(i = 0; i < this.things.length; i++){
if(this.things[i].type == "character") return i;
}
},
move : function(){
// If we're not escaping, we don't stop the quest
if(this.escaping == false && this.gmooh == false){
for(var index = 0; index < this.things.length; index++){
if(this.things[index].type == "character" || this.things[index].type == "ally" || this.things[index].type == "trap"){
// If we are at the end of the quest
if(index + 1 == this.things.length){
// If we're the character
if(this.things[index].type == "character"){
// We set a timeout to the winning function and we return
window.setTimeout(this.won.bind(this), 3000);
return;
}
// Else, we're just an ally or a trap
else{
// We disappear
quest.things[index] = quest.makeNoneThing();
}
}
// Else, we move ourselves
else{
// If there's nothing in front of us and we're not a trap, we just move
if(this.things[index].type != "trap" && this.things[index + 1].type == "none"){
if(this.characterSpeedStep >= this.characterSpeed){
this.characterSpeedStep = 1; // We set the step back to 1
this.things[index + 1] = this.things[index];
this.things[index] = this.makeNoneThing();
index += 1; // We increment the index to avoid re evaluating the same thing just after
}
else{
this.characterSpeedStep += 1; // We increment the step
}
}
// Else, we try to fight
else{
// If the thing in front of us is a mob or a trap (and we're not one..), we fight
if(this.things[index + 1].type == "mob" || (this.things[index + 1].type == "trap" && this.things[index].type != "trap")){
if(this.fight(index, index + 1) == true) return;
}
}
}
}
}
// We set the timeout to move again
window.setTimeout(this.move.bind(this), this.speed);
// We decrement the potion use countdown
if(this.potionUseCountdown > 0){
this.potionUseCountdown -= 1;
if(this.potionUseCountdown == 0){
potions.updateOnPage();
}
else potions.updateCountdownOnPage();
}
// Same thing for the scroll use countdown
if(this.scrollUseCountdown > 0){
this.scrollUseCountdown -= 1;
if(this.scrollUseCountdown == 0){
potions.updateOnPage();
}
else potions.updateCountdownOnPage();
}
// We decrement the berserk mode countdown
if(this.berserkCountdown > 0){
this.berserkCountdown -= 1;
if(this.berserkCountdown == 0) this.stopBerserk();
potions.updateCountdownOnPage();
}
// We decrement the invulnerability mode countdown
if(this.invulnerabilityCountdown > 0){
this.invulnerabilityCountdown -= 1;
if(this.invulnerabilityCountdown == 0) this.stopInvulnerability();
potions.updateCountdownOnPage();
}
// We decrement the turtle mode countdown
if(this.turtleCountdown > 0){
this.turtleCountdown -= 1;
if(this.turtleCountdown == 0) this.stopTurtle();
potions.updateCountdownOnPage();
}
// We make the land move too
if(land.list[this.currentLandIndex].moveFunction != undefined){
land.list[this.currentLandIndex].moveFunction();
}
// Horn bonus
if(objects.list.magicalHorn.have){
this.applyMagicalHornBonus();
}
// We update on page
this.updateOnPage();
}
// Else we're escaping : we stop the quest
else if(this.escaping){
this.stop();
}
// Else if we're using a gmooh potion
else if(this.gmooh){
this.stop();
potions.gmoohEffect();
}
},
applyMagicalHornBonus : function(){
var index = this.getCharacterIndex();
// If we're not dead
if(this.things[index].hp > 0){
this.things[index].hp += 3;
if(this.things[index].hp > this.things[index].max_hp) this.things[index].hp = this.things[index].max_hp;
}
},
fight : function(index1, index2){
// We launch a fight between us and the mob if the mob still have some hp (he may lose its hp because of a scroll)
if(this.things[index2].hp > 0) damage.makeTwoQuestThingsFighting(index1, index2);
// Check for deads
if(this.checkIfDead(index1, index2) == true) return true;
if(this.checkIfDead(index2, index1) == true) return true;
return false;
},
checkIfDead : function(index, indexKiller){
// If we're dead
if(this.things[index].hp <= 0){
// If we're the character
if(this.things[index].type == "character"){
this.updateOnPage(); // We update on page
window.setTimeout(this.stop.bind(this), 5000); // We set the timeout to stop the quest
return true; // We quit
}
// Else, we're just an ally or a trap
else if(this.things[index].type == "ally" || this.things[index].type == "trap"){
// We disappear
if(this.things[index].drops != []) drops.getAllDropsFromList(this.things[index].drops); // We gain the drops of the defeated ally or trap
quest.things[index] = quest.makeNoneThing();
}
// Else, we're a mob
else if(this.things[index].type == "mob" && (this.things[index].text != "\\o/" || yourself.canSurpass == true)){
drops.getAllDropsFromList(this.things[index].drops); // We gain the drops of the defeated mob
this.things[index] = this.makeNoneThing(); // We remove the mob
// If we we were killed by the character
if(this.things[indexKiller].type == "character"){
// Sword of Summoning bonus : we may spawn something here
if(sword.name == "Sword of Summoning" || sword.name == "Sword of Liflamesummoning"){
sword.summonHere(index);
}
// Sword of Life : we gain life
if(sword.name == "Sword of Life" || sword.name == "Sword of Liflamesummoning"){
this.things[indexKiller].hp += sword.specialPower + 1;
if(this.things[indexKiller].hp > this.things[indexKiller].max_hp) this.things[indexKiller].hp = this.things[indexKiller].max_hp;
}
}
}
}
return false;
},
beginBerserk : function(){
this.berserk = true;
this.berserkCountdown = 25 + random.getRandomIntUpTo(10);
this.speed = this.getSpeed();
this.things[this.getCharacterIndex()].text = "O_O";
},
stopBerserk : function(){
this.berserk = false;
this.speed = this.getSpeed();
this.things[this.getCharacterIndex()].text = "\\o/";
},
beginInvulnerability : function(){
this.invulnerability = true;
this.invulnerabilityCountdown = 15;
this.things[this.getCharacterIndex()].text = "GOD";
},
stopInvulnerability : function(){
this.invulnerability = false;
this.things[this.getCharacterIndex()].text = "\\o/";
},
beginTurtle : function(){
this.turtle = true;
this.turtleCountdown = 30;
this.things[this.getCharacterIndex()].text = "TUR";
this.characterSpeed = 3; // We reduce the speed !
},
stopTurtle : function(){
this.turtle = false;
this.things[this.getCharacterIndex()].text = "\\o/";
this.characterSpeed = 1; // The speed goes back to its normal state !
},
won : function(){
// won ?
if(land.getLandIndexFromName("Developper's computer") == quest.currentLandIndex){
developperComputer.setWon(true);
inventory.updateOnPage();
}
// Drops
drops.gainDrops();
// We may enable a new destination, we store the drop-down list
var list = htmlInteraction.getElement("quest_destination");
// We change the max land order : it's the order of the just finnished quest + 1
this.setMaxLandOrder(land.list[this.currentLandIndex].order + 1);
// We stop the quest
this.stop();
},
stop : function(){
// Enable button
htmlInteraction.enableButton("quest_button");
// First thing to do !
this.weAreQuestingRightNow = false;
// Get the character index
var index = this.getCharacterIndex();
// No more quest panel or potions shown
htmlInteraction.setInnerHtml("quest", "");
htmlInteraction.setInnerHtml("quest_potions_countdowns", "");
// We re-enable home buttons
//buttons.enableHomeButtons();
// We update the potions on page
potions.updateOnPage();
// We're tired after this quest
if(this.things[index].hp < this.things[index].max_hp) this.setTiredFound(this.tiredFound + 200 * (1 - (this.things[index].hp / this.things[index].max_hp)));
if(this.escaping == false) this.setTiredTime(Math.floor(this.tiredFound));
// Nothing found anymore
this.setCandiesFound(0);
this.setTiredFound(0);
for(obj in objects.list) objects.list[obj].found = false;
},
defineMood : function(){
if(this.tiredTime == 0) htmlInteraction.setInnerHtml("mood", "You're in the pink! Ready for fighting!");
else htmlInteraction.setInnerHtml("mood", "You're tired. You have to wait before doing another quest. Waiting time : " + this.tiredTime);
htmlInteraction.setElementVisibility("mood", true);
},
setCandiesFound : function(value){
this.candiesFound = value;
},
setTiredTime : function(value){
if(value < 0) value = 0;
this.tiredTime = value;
this.defineMood();
buttons.checkQuestTiredTime();
},
setTiredFound : function(value){
this.tiredFound = value;
},
makeNoneThing : function(){
return {type:"none", text:"___"};
},
makeBasicChest : function(){
return land.createMob("CHS", 80, 80, "none", "A chest !! Very rare.", [drops.createDrop("candies", 300 + random.getRandomIntUpTo(500)), drops.createDrop("object", "key", true), drops.createDrop("object", "boots", random.oneChanceOutOf(3)), drops.createDrop("object", "swampMap", random.oneChanceOutOf(3)), drops.createDrop("object", "hutMap", random.oneChanceOutOf(3))]);
},
makeOpenChest : function(){
return land.createMob("CHS", 1, 1, "none", "An open chest, full of candies !", [drops.createDrop("candies", 6000 + random.getRandomIntUpTo(2000))]);
},
makeImp : function(){
var hp = 15 + random.getRandomIntUpTo(10);
return land.createAlly("IMP", hp, hp, "its whole body", "An imp.", []);
},
makeOrc : function(){
return land.createAlly("ORC", 30, 30, "bludgeon", "An orc. It looks stupid.", []);
},
makeDraugr : function(){
return land.createAlly("DRG", 35, 35, "various bones", "A draugr. It seems to be dead, but it's still moving..", []);
},
makeChupacabra : function(){
return land.createAlly("CBA", 30, 30, "fangs", "A chupacabra. A real goat sucker !", []);
},
makeGolem : function(){
return land.createAlly("GOL", 100, 100, "rock", "A golem. Solid, solid golem.", []);
},
makeChimera : function(){
var hp = 50 + random.getRandomIntUpTo(7);
return land.createAlly("CHI", hp, hp, "fire", "A chimera : lion, serpent and goat at the same time.", []);
},
makeCandyMonster : function(){
var hp = 80 + 5*sword.specialPower;
return land.createAlly("CND", hp, hp, "exploding candies", "A candy monster. He throws candies on his ennemies.", []);
},
makeFakeCharacter : function(){
return land.createFakeCharacter();
},
fillWithNoneThings : function(){
var things = [];
for(var i = 0; i < land.list[this.currentLandIndex].size; i++) things.push(this.makeNoneThing());
return things;
}
};