288 lines
7.2 KiB
JavaScript
288 lines
7.2 KiB
JavaScript
let xp = 0;
|
|
let health = 100;
|
|
let gold = 50;
|
|
let currentWeapon = 0;
|
|
let fighting;
|
|
let monsterHealth;
|
|
let inventory = ["stick"];
|
|
|
|
const button1 = document.querySelector('#button1');
|
|
const button2 = document.querySelector("#button2");
|
|
const button3 = document.querySelector("#button3");
|
|
const text = document.querySelector("#text");
|
|
const xpText = document.querySelector("#xpText");
|
|
const healthText = document.querySelector("#healthText");
|
|
const goldText = document.querySelector("#goldText");
|
|
const monsterStats = document.querySelector("#monsterStats");
|
|
const monsterName = document.querySelector("#monsterName");
|
|
const monsterHealthText = document.querySelector("#monsterHealth");
|
|
const weapons = [
|
|
{ name: 'stick', power: 5 },
|
|
{ name: ' dagger', power: 30 },
|
|
{ name: ' claw hammer', power: 50 },
|
|
{ name: ' sword', power: 100 }
|
|
];
|
|
const monsters = [
|
|
{
|
|
name: "slime",
|
|
level: 2,
|
|
health: 15
|
|
},
|
|
{
|
|
name: "fanged beast",
|
|
level: 8,
|
|
health: 60
|
|
},
|
|
{
|
|
name: "dragon",
|
|
level: 20,
|
|
health: 300
|
|
}
|
|
]
|
|
const locations = [
|
|
{
|
|
name: "town square",
|
|
"button text": ["Go to store", "Go to cave", "Fight dragon"],
|
|
"button functions": [goStore, goCave, fightDragon],
|
|
text: "You are in the town square. You see a sign that says \"Store\"."
|
|
},
|
|
{
|
|
name: "store",
|
|
"button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
|
|
"button functions": [buyHealth, buyWeapon, goTown],
|
|
text: "You enter the store."
|
|
},
|
|
{
|
|
name: "cave",
|
|
"button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
|
|
"button functions": [fightSlime, fightBeast, goTown],
|
|
text: "You enter the cave. You see some monsters."
|
|
},
|
|
{
|
|
name: "fight",
|
|
"button text": ["Attack", "Dodge", "Run"],
|
|
"button functions": [attack, dodge, goTown],
|
|
text: "You are fighting a monster."
|
|
},
|
|
{
|
|
name: "kill monster",
|
|
"button text": ["Go to town square", "Go to town square", "Go to town square"],
|
|
"button functions": [goTown, goTown, easterEgg],
|
|
text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
|
|
},
|
|
{
|
|
name: "lose",
|
|
"button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
|
|
"button functions": [restart, restart, restart],
|
|
text: "You die. ☠️"
|
|
},
|
|
{
|
|
name: "win",
|
|
"button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
|
|
"button functions": [restart, restart, restart],
|
|
text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
|
|
},
|
|
{
|
|
name: "easter egg",
|
|
"button text": ["2", "8", "Go to town square?"],
|
|
"button functions": [pickTwo, pickEight, goTown],
|
|
text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
|
|
}
|
|
];
|
|
|
|
// initialize buttons
|
|
button1.onclick = goStore;
|
|
button2.onclick = goCave;
|
|
button3.onclick = fightDragon;
|
|
|
|
function update(location) {
|
|
monsterStats.style.display = "none";
|
|
button1.innerText = location["button text"][0];
|
|
button2.innerText = location["button text"][1];
|
|
button3.innerText = location["button text"][2];
|
|
button1.onclick = location["button functions"][0];
|
|
button2.onclick = location["button functions"][1];
|
|
button3.onclick = location["button functions"][2];
|
|
text.innerText = location.text;
|
|
}
|
|
|
|
function goTown() {
|
|
update(locations[0]);
|
|
}
|
|
|
|
function goStore() {
|
|
update(locations[1]);
|
|
}
|
|
|
|
function goCave() {
|
|
update(locations[2]);
|
|
}
|
|
|
|
function buyHealth() {
|
|
if (gold >= 10) {
|
|
gold -= 10;
|
|
health += 10;
|
|
goldText.innerText = gold;
|
|
healthText.innerText = health;
|
|
} else {
|
|
text.innerText = "You do not have enough gold to buy health.";
|
|
}
|
|
}
|
|
|
|
function buyWeapon() {
|
|
if (currentWeapon < weapons.length - 1) {
|
|
if (gold >= 30) {
|
|
gold -= 30;
|
|
currentWeapon++;
|
|
goldText.innerText = gold;
|
|
let newWeapon = weapons[currentWeapon].name;
|
|
text.innerText = "You now have a " + newWeapon + ".";
|
|
inventory.push(newWeapon);
|
|
text.innerText += " In your inventory you have: " + inventory;
|
|
} else {
|
|
text.innerText = "You do not have enough gold to buy a weapon.";
|
|
}
|
|
} else {
|
|
text.innerText = "You already have the most powerful weapon!";
|
|
button2.innerText = "Sell weapon for 15 gold";
|
|
button2.onclick = sellWeapon;
|
|
}
|
|
}
|
|
|
|
function sellWeapon() {
|
|
if (inventory.length > 1) {
|
|
gold += 15;
|
|
goldText.innerText = gold;
|
|
let currentWeapon = inventory.shift();
|
|
text.innerText = "You sold a " + currentWeapon + ".";
|
|
text.innerText += " In your inventory you have: " + inventory;
|
|
} else {
|
|
text.innerText = "Don't sell your only weapon!";
|
|
}
|
|
}
|
|
|
|
function fightSlime() {
|
|
fighting = 0;
|
|
goFight();
|
|
}
|
|
|
|
function fightBeast() {
|
|
fighting = 1;
|
|
goFight();
|
|
}
|
|
|
|
function fightDragon() {
|
|
fighting = 2;
|
|
goFight();
|
|
}
|
|
|
|
function goFight() {
|
|
update(locations[3]);
|
|
monsterHealth = monsters[fighting].health;
|
|
monsterStats.style.display = "block";
|
|
monsterName.innerText = monsters[fighting].name;
|
|
monsterHealthText.innerText = monsterHealth;
|
|
}
|
|
|
|
function attack() {
|
|
text.innerText = "The " + monsters[fighting].name + " attacks.";
|
|
text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
|
|
health -= getMonsterAttackValue(monsters[fighting].level);
|
|
if (isMonsterHit()) {
|
|
monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
|
|
} else {
|
|
text.innerText += " You miss.";
|
|
}
|
|
healthText.innerText = health;
|
|
monsterHealthText.innerText = monsterHealth;
|
|
if (health <= 0) {
|
|
lose();
|
|
} else if (monsterHealth <= 0) {
|
|
if (fighting === 2) {
|
|
winGame();
|
|
} else {
|
|
defeatMonster();
|
|
}
|
|
}
|
|
if (Math.random() <= .1 && inventory.length !== 1) {
|
|
text.innerText += " Your " + inventory.pop() + " breaks.";
|
|
currentWeapon--;
|
|
}
|
|
}
|
|
|
|
function getMonsterAttackValue(level) {
|
|
const hit = (level * 5) - (Math.floor(Math.random() * xp));
|
|
console.log(hit);
|
|
return hit > 0 ? hit : 0;
|
|
}
|
|
|
|
function isMonsterHit() {
|
|
return Math.random() > .2 || health < 20;
|
|
}
|
|
|
|
function dodge() {
|
|
text.innerText = "You dodge the attack from the " + monsters[fighting].name;
|
|
}
|
|
|
|
function defeatMonster() {
|
|
gold += Math.floor(monsters[fighting].level * 6.7);
|
|
xp += monsters[fighting].level;
|
|
goldText.innerText = gold;
|
|
xpText.innerText = xp;
|
|
update(locations[4]);
|
|
}
|
|
|
|
function lose() {
|
|
update(locations[5]);
|
|
}
|
|
|
|
function winGame() {
|
|
update(locations[6]);
|
|
}
|
|
|
|
function restart() {
|
|
xp = 0;
|
|
health = 100;
|
|
gold = 50;
|
|
currentWeapon = 0;
|
|
inventory = ["stick"];
|
|
goldText.innerText = gold;
|
|
healthText.innerText = health;
|
|
xpText.innerText = xp;
|
|
goTown();
|
|
}
|
|
|
|
function easterEgg() {
|
|
update(locations[7]);
|
|
}
|
|
|
|
function pickTwo() {
|
|
pick(2);
|
|
}
|
|
|
|
function pickEight() {
|
|
pick(8);
|
|
}
|
|
|
|
function pick(guess) {
|
|
const numbers = [];
|
|
while (numbers.length < 10) {
|
|
numbers.push(Math.floor(Math.random() * 11));
|
|
}
|
|
text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
|
|
for (let i = 0; i < 10; i++) {
|
|
text.innerText += numbers[i] + "\n";
|
|
}
|
|
if (numbers.includes(guess)) {
|
|
text.innerText += "Right! You win 20 gold!";
|
|
gold += 20;
|
|
goldText.innerText = gold;
|
|
} else {
|
|
text.innerText += "Wrong! You lose 10 health!";
|
|
health -= 10;
|
|
healthText.innerText = health;
|
|
if (health <= 0) {
|
|
lose();
|
|
}
|
|
}
|
|
} |