Stragedy is getting smarter.

This commit is contained in:
raeleus 2024-11-10 16:59:00 -08:00
parent 9dbd0b2ef0
commit 0f8404345e
3 changed files with 100 additions and 58 deletions

View file

@ -1370,6 +1370,11 @@ function handleStragedyShopStep(text) {
}
function doStragedy(command) {
var arg0 = getArgument(command, 0)
if (arg0 == null) {
arg0 = "easy"
}
var character = getCharacter()
state.stragedyTurn = "intro"
state.show = "stragedy"
@ -1394,12 +1399,30 @@ function doStragedy(command) {
shuffle(state.stragedyPlayerDeck)
state.stragedyPlayerDeck.splice(20)
state.stragedyPlayerDiscard = []
state.stragedyPlayerRetire = false
state.stragedyPlayerRetired = false
state.stragedyEnemyScore = 0
state.stragedyEnemyHand = []
state.stragedyEnemyBattlefield = []
state.stragedyEnemyDeck = ["5", "6", "7", "8", "a", "a", "9", "9", "10", "5", "5", "5", "2", "3", "4", "6", "7", "8", "9", "10"]
switch(arg0) {
case "impossible":
state.stragedyEnemyDeck = ["?", "?", "a", "q", "q", "k", "k", "w", "p", "2", "3", "4", "5", "6", "7", "7", "8", "10", "10", "10"]
case "hard":
state.stragedyEnemyDeck = ["j", "?", "a", "q", "q", "k", "k", "2", "3", "4", "5", "5", "6", "6", "7", "7", "8", "8", "10", "10"]
case "medium":
state.stragedyEnemyDeck = ["j", "j", "a", "q", "q", "k", "k", "2", "3", "4", "5", "5", "6", "6", "7", "7", "8", "8", "9", "10"]
break
case "very easy":
state.stragedyEnemyDeck = ["2", "2", "2", "3", "3", "3", "4", "4", "4", "5", "5", "5", "6", "6", "6", "7", "7", "8", "8", "9"]
case "automatic":
state.stragedyEnemyDeck = ["2", "2", "2", "3", "3", "3", "4", "4", "4", "5", "5", "5", "6", "6", "6", "6", "7", "7", "7", "7"]
case "easy":
default:
state.stragedyEnemyDeck = ["j", "j", "a", "a", "2", "2", "3", "3", "4", "4", "5", "5", "6", "6", "7", "7", "8", "8", "9", "9"]
break
}
shuffle(state.stragedyEnemyDeck)
state.stragedyEnemyDiscard = []
state.stragedyEnemySkipTurn = getRandomBoolean(.5)
@ -1451,7 +1474,7 @@ function handleStragedyTurn(text) {
stragedyCalculateScores()
if (!state.stragedyEnemySkipTurn) stragedyEnemyTurn()
}
return "You deal the cards."
return `You deal the cards. ${state.stragedyEnemySkipTurn ? "You go first." : "The opponent goes first."}`
case "game":
return stragedyPlayerTurn(text)
case "gameOver":
@ -1470,6 +1493,8 @@ function doAddCard(command) {
}
arg0 = arg0.toLowerCase()
if (arg0.startsWith("w")) arg0 = "w"
if (arg0.startsWith("b")) arg0 = "b"
switch(arg0) {
case "a":
case "ace":

View file

@ -2939,6 +2939,7 @@ function stragedyCalculateScores() {
}
function stragedyEnemyTurn() {
log(`enemy turn: ${state.stragedyEnemyHand}`)
state.stragedyEnemySkipTurn = false
state.stragedyEnemyTurnText = ""
if (state.stragedyPlayerScore > 30) {
@ -3010,7 +3011,7 @@ function stragedyEnemyTurn() {
var hasJack = hand.filter(x => /^.*j.*$/gi.test(x)).length > 0
var hasQueen = hand.filter(x => /^.*q.*$/gi.test(x)).length > 0
var hasKing = hand.filter(x => /^.*k.*$/gi.test(x)).length > 0
var hasJoker = hand.filter(x => /^.*?.*$/gi.test(x)).length > 0
var hasJoker = hand.filter(x => /^.*\?.*$/gi.test(x)).length > 0
var hasWitch = hand.filter(x => /^.*w.*$/gi.test(x)).length > 0
var hasPriest = hand.filter(x => /^.*p.*$/gi.test(x)).length > 0
var hasBrigand = hand.filter(x => /^.*b.*$/gi.test(x)).length > 0
@ -3066,52 +3067,59 @@ function stragedyEnemyTurn() {
}
}
state.stragedyEnemyTurnText = stragedyEnemyRandom()
// if (hand.length == 0) {
// if (deck.length == 0) state.stragedyEnemyTurnText = stragedyEnemyRetire()
// else state.stragedyEnemyTurnText = stragedyEnemyDrawCard()
// } else if (playerRetired && score < playerScore) {
// if (hasJoker) {
// state.stragedyEnemyTurnText = stragedyPlayCard(false, lowestNumberedBattlefieldCard)
// } else if (hasQueen && highestNumberedBattlefieldCard != null) {
// state.stragedyEnemyTurnText = stragedyPlayCard(false, "q" + highestNumberedBattlefieldCard)
// } else if (hasAce && bestAceNumber != null) {
// state.stragedyEnemyTurnText = stragedyPlayCard(false, "a" + bestAceNumber)
// } else if (hasKing && bestKingCard != null) {
// state.stragedyEnemyTurnText = stragedyPlayCard(false, "k" + bestKingCard)
// } else {
// state.stragedyEnemyTurnText = stragedyEnemyRandom()
// }
// } else if (playerRetired && score > playerScore) {
// state.stragedyEnemyTurnText = stragedyEnemyRetire()
// } else if (playerRetired && score == playerScore) {
// if (highestNumberedHandCardAddUpTo30 != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, highestNumberedHandCardAddUpTo30)
// else state.stragedyEnemyTurnText = stragedyEnemyRetire()
// } else if (score - playerScore > 20) {
// state.stragedyEnemyTurnText = stragedyEnemyRetire()
// } else if (hasNumberedCards && score < playerScore) {
// if (score < 20) state.stragedyEnemyTurnText = stragedyPlayCard(false, highestNumberedHandCardAddUpTo20)
// else state.stragedyEnemyTurnText = stragedyPlayCard(false, highestNumberedHandCard)
// } else if (score > 30 && battlefield.length > 0) {
// if (hasQueen && highestNumberedBattlefieldCard != null) {
// state.stragedyEnemyTurnText = stragedyPlayCard(false, "q" + highestNumberedBattlefieldCard)
// } else if (hasPriest && highestNumberedBattlefieldCard != null) {
// state.stragedyEnemyTurnText = stragedyPlayCard(false, "p" + highestNumberedBattlefieldCard)
// } else if (hasJack && highestNumberedBattlefieldCardSubtractDownTo30 != null) {
// state.stragedyEnemyTurnText = stragedyPlayCard(false, "j" + highestNumberedBattlefieldCardSubtractDownTo30)
// } else if (hasAce && bestAceNumber != null) {
// state.stragedyEnemyTurnText = stragedyPlayCard(false, "a" + bestAceNumber)
// } else if (kingCards.length > 0 && kingNumberedCardsInHand.length > 0) {
// state.stragedyEnemyTurnText = stragedyPlayCard(false, kingNumberedCardsInHand[kingNumberedCardsInHand.length - 1])
// } else {
// state.stragedyEnemyTurnText = stragedyEnemyRetire()
// }
// } else if (highestNumberedHandCardAddUpTo20 == null && hand.length > 0) {
// state.stragedyEnemyTurnText = stragedyEnemyDiscardCard()
// } else {
// state.stragedyEnemyTurnText = stragedyEnemyRandom()
// }
if (hand.length == 0) {
log(1)
if (deck.length == 0) state.stragedyEnemyTurnText = stragedyEnemyRetire()
else state.stragedyEnemyTurnText = stragedyEnemyDrawCard()
} else if (playerRetired && score < playerScore) {
log(2)
if (hasJoker) state.stragedyEnemyTurnText = stragedyPlayCard(false, "?" + lowestNumberedBattlefieldCard)
else if (hasQueen && highestNumberedBattlefieldCard != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, "q" + highestNumberedBattlefieldCard)
else if (hasAce && bestAceNumber != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, "a" + bestAceNumber)
else if (hasKing && bestKingCard != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, "k" + bestKingCard)
else if (highestNumberedHandCardAddUpTo30 != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, highestNumberedHandCardAddUpTo30)
else state.stragedyEnemyTurnText = stragedyEnemyRetire()
} else if (playerRetired && score > playerScore) {
log(3)
state.stragedyEnemyTurnText = stragedyEnemyRetire()
} else if (playerRetired && score == playerScore) {
log(4)
if (highestNumberedHandCardAddUpTo30 != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, highestNumberedHandCardAddUpTo30)
else state.stragedyEnemyTurnText = stragedyEnemyRetire()
} else if (score - playerScore > 20) {
log(5)
state.stragedyEnemyTurnText = stragedyEnemyRetire()
} else if (hasNumberedCards && score < playerScore) {
log(6)
if (score < 20 && highestNumberedHandCardAddUpTo20 != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, highestNumberedHandCardAddUpTo20)
else if (highestNumberedHandCardAddUpTo30 != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, highestNumberedHandCardAddUpTo30)
else if (deck.length > 0) state.stragedyEnemyTurnText = stragedyEnemyDiscardCard()
else if (hasQueen && highestNumberedBattlefieldCard != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, "q" + highestNumberedBattlefieldCard)
else if (hasAce && bestAceNumber != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, "a" + bestAceNumber)
else if (hasKing && bestKingCard != null) state.stragedyEnemyTurnText = stragedyPlayCard(false, "k" + bestKingCard)
else stragedyEnemyRandom()
} else if (score > 30 && battlefield.length > 0) {
log(7)
if (hasQueen && highestNumberedBattlefieldCard != null) {
state.stragedyEnemyTurnText = stragedyPlayCard(false, "q" + highestNumberedBattlefieldCard)
} else if (hasPriest && highestNumberedBattlefieldCard != null) {
state.stragedyEnemyTurnText = stragedyPlayCard(false, "p" + highestNumberedBattlefieldCard)
} else if (hasJack && highestNumberedBattlefieldCardSubtractDownTo30 != null) {
state.stragedyEnemyTurnText = stragedyPlayCard(false, "j" + highestNumberedBattlefieldCardSubtractDownTo30)
} else if (hasAce && bestAceNumber != null) {
state.stragedyEnemyTurnText = stragedyPlayCard(false, "a" + bestAceNumber)
} else if (kingCards.length > 0 && kingNumberedCardsInHand.length > 0) {
state.stragedyEnemyTurnText = stragedyPlayCard(false, kingNumberedCardsInHand[kingNumberedCardsInHand.length - 1])
} else {
state.stragedyEnemyTurnText = stragedyEnemyRetire()
}
} else if (highestNumberedHandCardAddUpTo20 == null && hand.length > 0) {
log(8)
state.stragedyEnemyTurnText = stragedyEnemyDiscardCard()
} else {
log(9)
state.stragedyEnemyTurnText = stragedyEnemyRandom()
}
stragedyCalculateScores()
if (state.stragedyEnemyScore > 30) {
@ -3121,25 +3129,29 @@ function stragedyEnemyTurn() {
}
function stragedyEnemyDrawCard() {
log(`Enemy draw a card`)
var card = state.stragedyEnemyDeck.pop()
state.stragedyEnemyHand.push(card)
return `The opponent has drawn a card.`
return `\nThe opponent has drawn a card.\n`
}
function stragedyEnemyDiscardCard() {
log(`Enemy discard a card`)
var card = state.stragedyEnemyHand.splice(getRandomInteger(0, state.stragedyEnemyHand.length - 1), 1)
state.stragedyEnemyDiscard.push(card)
var newCards = state.stragedyEnemyDeck.splice(getRandomInteger(0, state.stragedyEnemyHand.length - 2), 2)
var newCards = state.stragedyEnemyDeck.splice(state.stragedyEnemyDeck.length - 2, 2)
state.stragedyEnemyHand.push(...newCards)
return `The opponent has discarded a card and drawn ${newCards.length} cards.`
return `\nThe opponent has discarded a card and drawn ${newCards.length} cards.\n`
}
function stragedyEnemyRetire() {
log(`Enemy retire`)
state.stragedyEnemyRetired = true
return `The opponent has retired at ${state.stragedyEnemyScore} points.`
return `\nThe opponent has retired at ${state.stragedyEnemyScore} points.\n`
}
function stragedyEnemyRandom() {
log(`Enemy random`)
var hand = [...state.stragedyEnemyHand]
if (hand.length == 0) {
@ -3171,6 +3183,7 @@ function stragedyEnemyRandom() {
}
function stragedyPlayerTurn(text) {
log(`player turn`)
if (text.startsWith("d") && state.stragedyPlayerHand.length > 0) {
if (state.stragedyPlayerDeck.length == 0) return "\nYou cannot discard if you have 0 cards in your deck.\n"
@ -3210,6 +3223,11 @@ function stragedyPlayerTurn(text) {
return `You draw a ${drawCard}`
} else if (text == "r") {
state.stragedyPlayerRetired = true
stragedyEnemyTurn()
stragedyCalculateScores()
stragedyCheckForWin()
state.stragedyTurn = "gameOver"
return `You retire at ${state.stragedyPlayerScore}.`
} else {
var text = stragedyPlayCard(true, text)
if (state.stragedyEnemyRetired) {
@ -3222,6 +3240,7 @@ function stragedyPlayerTurn(text) {
}
function stragedyPlayCard(player, text) {
log(`${player ? "Player" : "Enemy"} play card ${text}`)
var character = getCharacter()
if (player) {
var battlefield = state.stragedyPlayerBattlefield

View file

@ -597,8 +597,7 @@ Type d to deal the cards or press f to forfeit.
var playerDeckCount = state.stragedyPlayerDeck.length
var playerDiscardCount = state.stragedyPlayerDiscard.length
if (!state.stragedyEnemySkipTurn) text = `-----The Opponent's Turn-----
${state.stragedyEnemyTurnText}
if (!state.stragedyEnemySkipTurn) text = `-----The Opponent's Turn-----${state.stragedyEnemyTurnText}
`
else text = ""
@ -617,8 +616,7 @@ ${toTitleCase(character.name)} ${haveWord} ${playerDeckCount} cards in the deck
if (state.stragedyPlayerHand.length > 0) text += `
Play a number card to the battlefield by typing its number.
Play a letter card onto a card in the battlefield by typing the letter followed by the card you want to play it on.
Witches and Brigands are played directly to the discard pile. Simply type w or b.
Play a letter card by typing the letter followed by the card you want to play it on.
Type d and the number or letter of a card in your hand to discard it. You will then draw 2 cards.
Type r to retire. This forces the opponent to make their last move.
Type f to forfeit. This quits the game immediately.