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

352 lines
14 KiB
JavaScript

var castleKeep = {
// Variables
size : 30, // The size here must be higher than the size of the biggest room
realSize : 0, // This is the real size of the current room, in term of things
roomSize : 0, // Real size of the room in term of ascii
floorPosition : 0, // Where the floor is located in the current room
firstCharacterPosition : 0, // Where the character is located when he enters the room
lastCharacterPosition : 0, // Where the character can exit the room
text : [],
roomNumber : 0, // The current room number. Increase by one each room.
mobsAreMoving : false, // If true, in the current room, mobs should move toward the player
maxRoom : 6,
// Functions
onload : function(){
land.addLand("Castle's keep", this.size, 5, this.load.bind(this), this.getText.bind(this), this.move.bind(this));
},
move : function(){
// We get the character's index
var index = quest.getCharacterIndex();
var characterThing = quest.things[index];
// If the mobs should move, we make them move
if(this.mobsAreMoving){
for(var i = 0; i < quest.things.length; i++){
if(quest.things[i].type == "mob" && quest.things[i-1].type == "none"){
quest.things[i-1] = quest.things[i];
quest.things[i] = quest.makeNoneThing();
}
}
}
// If the character is just after the exit of the room, we create a new room and put him in it
if(index == this.lastCharacterPosition - this.firstCharacterPosition + 1){
this.roomNumber += 1; // We increment the room number
// If we aren't yet arrived at the room x
if(this.roomNumber <= this.maxRoom){
quest.things = quest.fillWithNoneThings(); // Remove all the things
this.createNewRoom(); // Create a new room
quest.things[0] = characterThing; // Put the character at the beginning of the room
}
// Else, we end the quest
else{
quest.things[this.size-1] = quest.things[index];
quest.things[index] = quest.makeFakeCharacter();
}
}
// If we just killed the dragon
if(this.roomNumber == 6 && index == 16 && quest.things[17].type == "none"){
// We reload the room without the dragon
this.text = [];
this.createRoomStructure();
this.createDoorHere(this.firstCharacterPosition);
}
},
load : function(){
this.roomNumber = 0; // We reset the room number
this.createNewRoom();
},
getText : function(){
var lines = [];
lines = this.text.slice(0); // It will store the lines of the castle keep
// We add things
for(var i = 0; i < this.realSize; i++){
if(quest.things[i].type != "none"){
lines[this.floorPosition] = lines[this.floorPosition].replaceAt(1 + this.firstCharacterPosition*3 + i*3, quest.things[i].text);
}
}
// We return the lines around the player
return lines.join("");
},
createRoomStructure : function(){
var line;
// Create the roof
line = "__";
for(var i = 0; i < this.roomSize; i++){
line += "___";
}
line += "\n";
this.text.push(line);
// Create the inside
line = "|";
for(var i = 0; i < this.roomSize; i++){
line += " ";
}
line += "|\n";
for(var i = 0; i < this.floorPosition - 1; i++){
this.text.push(line);
}
// Create the floor
line = "|";
for(var i = 0; i < this.roomSize; i++){
line += "___";
}
line += "|\n";
this.text.push(line);
},
addDragonInRoom : function(){
var line = "";
// Add a line (to store the tail of the dragon)
for(var i = 0; i < this.roomSize; i++){
line += " ";
}
this.text.push(line);
for(var i = 0; i < this.asciiDragon.length; i++){
this.text[i + 1] = this.text[i + 1].replaceAt(54, this.asciiDragon[i]);
}
},
createNewRoom : function(){
this.text = [];
// If we're not yet at the boss room, we make a random-sized room
if(this.roomNumber < this.maxRoom){
// Set the size and stuff
this.realSize = 16 + random.getRandomIntUpTo(10);
this.firstCharacterPosition = random.getRandomIntUpTo(2);
this.lastCharacterPosition = this.firstCharacterPosition + this.realSize - 1;
this.floorPosition = 5 + random.getRandomIntUpTo(6);
this.roomSize = this.realSize + this.firstCharacterPosition + random.getRandomIntUpTo(2);
this.createRoomStructure();
// We add the doors at the character's first and last position
this.createDoorHere(this.firstCharacterPosition);
this.createDoorHere(this.lastCharacterPosition);
}
// Else, it's the boss room
else{
// Set the size and stuff
this.realSize = 26;
this.firstCharacterPosition = 1;
this.lastCharacterPosition = 21;
this.floorPosition = 16;
this.roomSize = this.realSize + this.firstCharacterPosition + 1;
this.createRoomStructure();
this.addDragonInRoom();
// We add the doors at the character's first and last position
this.createDoorHere(this.firstCharacterPosition);
}
// By default, mobs are not moving
this.mobsAreMoving = false;
// We add roomNumber specific stuff
switch(this.roomNumber){
// Room 0 : we put some guards
case 0:
for(var i = 2; i < this.realSize - 1; i+=3){
quest.things[i] = castleEntrance.makeGuard();
}
this.mobsAreMoving = true;
break;
// Rooms 1 to 4 : we put some random ennemies
case 1: case 2: case 3: case 4:
switch(random.getRandomIntUpTo(7)){
// Knights room
case 0:
for(var i = 2; i < this.realSize - 1; i++){
if(random.oneChanceOutOf(4)){
quest.things[i] = castleEntrance.makeKnight();
}
}
this.mobsAreMoving = true;
break;
// Animals room
case 1:
for(var i = 2; i < this.realSize - 1; i++){
if(random.oneChanceOutOf(4)){
switch(random.getRandomIntUpTo(6)){
case 0: quest.things[i] = castleKeep.makeKomodoDragon(); break;
case 1: quest.things[i] = castleKeep.makeRhinoceros(); break;
case 2: quest.things[i] = castleKeep.makeGaur(); break;
case 3: quest.things[i] = castleKeep.makeDromornisStirtoni(); break;
case 4: quest.things[i] = castleKeep.makeGorilla(); break;
case 5: quest.things[i] = castleKeep.makeCapybara(); break;
case 6: quest.things[i] = castleKeep.makeDoedicurus(); break;
}
}
}
break;
// Ghosts room
case 2:
for(var i = 4; i < this.realSize - 1; i++){
if(random.oneChanceOutOf(5)){
quest.things[i] = castleStairs.makeGhost();
}
}
this.mobsAreMoving = true;
break;
// Walled off zombie warrior room
case 3:
// We add the walls
for(var i = 1; i < this.floorPosition; i++){
this.text[i] = this.text[i].replaceAt(1 + this.firstCharacterPosition*3 + 7*3, "WAL");
this.text[i] = this.text[i].replaceAt(1 + this.firstCharacterPosition*3 + 9*3, "WAL");
}
// We add the mobs (walls and walled off zombie warrior)
quest.things[7] = this.makeStoneWall();
quest.things[9] = this.makeStoneWall();
quest.things[8] = this.makeWalledOffZombieWarrior();
break;
// Fireball room
case 4:
for(var i = this.realSize - 8; i < this.realSize - 1; i++){
if(random.flipACoin()){
quest.things[i] = this.makeFireball();
}
}
this.mobsAreMoving = true;
break;
// Fake door room
case 5:
this.createDoorHere(this.firstCharacterPosition + 8);
quest.things[8] = this.makeFakeDoorMonster();
break;
// Unicorn room
case 6:
quest.things[2 + random.getRandomIntUpTo(this.realSize - 4)] = this.makeCharlieTheUnicorn();
quest.things[2 + random.getRandomIntUpTo(this.realSize - 4)] = this.makeUnicorn();
quest.things[2 + random.getRandomIntUpTo(this.realSize - 4)] = this.makeUnicorn();
this.mobsAreMoving = true;
break;
// Troll room
case 7:
quest.things[6 + random.getRandomIntUpTo(this.realSize - 8)] = this.makeTroll();
this.mobsAreMoving = true;
break;
}
break;
// The chests room
case 5:
for(var i = 1; i < this.realSize - 1; i++){
if(random.oneChanceOutOf(3)){
quest.things[i] = quest.makeOpenChest();
}
}
this.mobsAreMoving = false;
break;
// Boss room
case 6:
quest.things[17] = this.makeDragon();
break;
}
},
createDoorHere : function(position){
this.text[this.floorPosition-2] = this.text[this.floorPosition-2].replaceAt(1 + position*3, " _ ");
this.text[this.floorPosition-1] = this.text[this.floorPosition-1].replaceAt(1 + position*3, "|.|");
this.text[this.floorPosition] = this.text[this.floorPosition].replaceAt(1 + position*3, "| |");
},
makeKomodoDragon : function(){
return land.createMob("KOM", 5, 5, "foots and tail", "A Komodo dragon. Did you heard about island gigantism ?", []);
},
makeRhinoceros : function(){
return land.createMob("RHI", 160, 160, "horn", "A " + random.pickRandomly(["white", "black", "indian", "javan", "sumatran"]) + " rhinoceros. Watch out for his horn !", []);
},
makeGaur : function(){
return land.createMob("GAU", 80, 80, "horns", "A Gaur. This large bovine looks like a bison.", []);
},
makeDromornisStirtoni : function(){
return land.createMob("DST", 70, 70, "giant beak", "A Dromornis Stirtoni ! A 400kg flightless bird !", []);
},
makeGorilla : function(){
return land.createMob("GOR", 50, 50, "its fists", "A Gorilla. Gorillas occasionally engage in homosexual interactions.", []);
},
makeCapybara : function(){
return land.createMob("CPY", 20, 20, "its teeth", "A capybara : the largest rodent in the world !", []);
},
makeDoedicurus : function(){
return land.createMob("DOE", 120, 120, "spiky tail", "A Doedicurus : your favorite glyptodont !", []);
},
makeStoneWall : function(){
return land.createMob("WAL", 300, 300, "stone", "A stone wall.", []);
},
makeWalledOffZombieWarrior : function(){
var hp = 150 + random.getRandomIntUpTo(10) * 10;
return land.createMob("WZW", hp, hp, "cursed sword", "A walled off zombie warrior. He probably did something bad to end up here.", [drops.createDrop("candies", random.getRandomIntUpTo(1) * 4000), drops.createDrop("object", "oldAmulet", true)]);
},
makeFireball : function(){
return land.createMob("FBL", 1, 1, "itself", "A fireball !! Watch out !", []);
},
makeFakeDoorMonster : function(){
return land.createMob("| |", 70, 70, "sharp teeth", "It's not a door ! It's a monster ! (an ugly one)", []);
},
makeUnicorn : function(){
return land.createMob("UNI", 100, 100, "magical horn", "A unicorn !! They exist !", []);
},
makeCharlieTheUnicorn : function(){
return land.createMob("UNI", 100, 100, "magical horn", "A unicorn !! It has no kidney.", [drops.createDrop("object", "magicalHorn", true)]);
},
makeTroll : function(){
return land.createMob("TRL", 250, 250, "enormous fist", "A troll. It is huge, but it lacks precision.", []);
},
makeDragon : function(){
return land.createMob(",((", 1000, 1000, "flames", "A dragon !! Kill him and the castle will be yours.", []);
},
asciiDragon :
[
" _///_,",
" / ` \' \'>",
" o\' __/_\'>",
" / _/ )_\\\'>",
"\"__/ /_/\\_>",
" ____/_/_/_/",
" /,---, _/ /",
"\"\" /_/_/_/",
" /_(_(_(_ \\",
" ( \\_\\_\\\\_ )\\",
" \\\'__\\_\\_\\_\\__ ).\\",
" //____|___\\__) )_/",
" | _ \\\'___\'_( /\'",
" \\_ (-\'\\\'___\'_\\ __,\'_\'",
" __) \\ \\\\___(_ __/.__,\'",
"_,((,-,__\\__\'\", __\\_/. __,\'",
" \'\"./_._._-\'"
]
};