mirror of
https://github.com/2009scape/2009scape.github.io.git
synced 2024-11-04 10:02:36 +01:00
477 lines
19 KiB
JavaScript
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;
|
|
}
|
|
|
|
};
|