From 40620d9e99e2000c490750bf9a61934bccbeb3ea Mon Sep 17 00:00:00 2001 From: raeleus Date: Mon, 11 Nov 2024 17:28:38 -0800 Subject: [PATCH] Added Witch functionality. --- Input.js | 2 +- Library.js | 75 ++++++++++++++++++++++++++++++++++-------------------- Output.js | 13 ++++++++-- 3 files changed, 59 insertions(+), 31 deletions(-) diff --git a/Input.js b/Input.js index 398c8d1..55311e9 100644 --- a/Input.js +++ b/Input.js @@ -1413,7 +1413,7 @@ function doStragedy(command) { 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": + case "effortless": state.stragedyEnemyDeck = ["j", "j", "a", "a", "2", "2", "3", "3", "4", "4", "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"] diff --git a/Library.js b/Library.js index 14b6505..1b63c69 100644 --- a/Library.js +++ b/Library.js @@ -2988,25 +2988,10 @@ function stragedyEnemyTurn() { var hasNumberedCards = hand.filter(x => /^\d+$/gi.test(x)).length > 0 - var sortedNumberedHandCards = hand.filter(x => /^\d+$/gi.test(x)).sort((a, b) => parseInt(a) - parseInt(b)) - var highestNumberedHandCard = sortedNumberedHandCards.length > 0 ? sortedNumberedHandCards[sortedNumberedHandCards.length - 1] : null - - // var sortedNumberedHandCardsToAddUpTo30 = hand.filter(x => /^\d+$/gi.test(x) && parseInt(x) <= 30 - score).sort((a, b) => parseInt(a) - parseInt(b)) - // var highestNumberedHandCardAddUpTo30 = sortedNumberedHandCardsToAddUpTo30.length > 0 ? sortedNumberedHandCardsToAddUpTo30[sortedNumberedHandCardsToAddUpTo30.length - 1] : null - - var sortedNumberedHandCardsToSubtractDownTo30 = hand.filter(x => /^\d+$/gi.test(x) && parseInt(x) <= 30 + score).sort((a, b) => parseInt(a) - parseInt(b)) - var highestNumberedHandCardSubtractDownTo30 = sortedNumberedHandCardsToSubtractDownTo30.length > 0 ? sortedNumberedHandCardsToSubtractDownTo30[sortedNumberedHandCardsToSubtractDownTo30.length - 1] : null - - // var sortedNumberedHandCardsToAddUpTo20 = hand.filter(x => /^\d+$/gi.test(x) && parseInt(x) <= 20 - score).sort((a, b) => parseInt(a) - parseInt(b)) - // var highestNumberedHandCardToReach20 = sortedNumberedHandCardsToAddUpTo20.length > 0 ? sortedNumberedHandCardsToAddUpTo20[sortedNumberedHandCardsToAddUpTo20.length - 1] : null - var sortedNumberedBattlefieldCards = battlefield.filter(x => /^[kpw\?]*\d+$/gi.test(x)).sort((a, b) => parseInt(a.replaceAll(/\D/gi, "")) - parseInt(b.replaceAll(/\D/gi, ""))) var highestNumberedBattlefieldCard = sortedNumberedBattlefieldCards.length > 0 ? sortedNumberedBattlefieldCards[sortedNumberedBattlefieldCards.length - 1] : null var lowestNumberedBattlefieldCard = sortedNumberedBattlefieldCards.length > 0 ? sortedNumberedBattlefieldCards[0] : null - var sortedNumberedBattlefieldCardsToSubtractDownTo30 = battlefield.filter(x => /^[kpw\?]*\d+$/gi.test(x) && parseInt(x) <= 30 + score).sort((a, b) => parseInt(a) - parseInt(b)) - var highestNumberedBattlefieldCardSubtractDownTo30 = sortedNumberedBattlefieldCardsToSubtractDownTo30.length > 0 ? sortedNumberedBattlefieldCardsToSubtractDownTo30[sortedNumberedBattlefieldCardsToSubtractDownTo30.length - 1] : null - var hasAce = hand.filter(x => /^.*a.*$/gi.test(x)).length > 0 var hasJack = hand.filter(x => /^.*j.*$/gi.test(x)).length > 0 var hasQueen = hand.filter(x => /^.*q.*$/gi.test(x)).length > 0 @@ -3015,15 +3000,6 @@ function stragedyEnemyTurn() { 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 - var has10 = hand.filter(x => /^.*10.*$/gi.test(x)).length > 0 - var has9 = hand.filter(x => /^.*9.*$/gi.test(x)).length > 0 - var has8 = hand.filter(x => /^.*8.*$/gi.test(x)).length > 0 - var has7 = hand.filter(x => /^.*7.*$/gi.test(x)).length > 0 - var has6 = hand.filter(x => /^.*6.*$/gi.test(x)).length > 0 - var has5 = hand.filter(x => /^.*5.*$/gi.test(x)).length > 0 - var has4 = hand.filter(x => /^.*4.*$/gi.test(x)).length > 0 - var has3 = hand.filter(x => /^.*3.*$/gi.test(x)).length > 0 - var has2 = hand.filter(x => /^.*2.*$/gi.test(x)).length > 0 var faceCardHandCount = hand.filter(x => /.*\D.*/gi.test(x)).length @@ -3273,11 +3249,12 @@ function stragedyEnemyRetire() { return `\nThe opponent has retired at ${state.stragedyEnemyScore} points.\n` } -function stragedyEnemyRandom() { +function stragedyEnemyRandom(punish) { log(`Enemy random`) var hand = [...state.stragedyEnemyHand] if (hand.length == 0) { + if (punish) return "\nThe enemy has no cards to play.\n" if (state.stragedyEnemyDeck.length > 0) return stragedyEnemyDrawCard() return stragedyEnemyRetire() } @@ -3301,6 +3278,49 @@ function stragedyEnemyRandom() { } } while (hand.length > 0) + if (punish) { + state.stragedyEnemyDiscard.push(...state.stragedyEnemyHand) + state.stragedyEnemyHand = [] + return "\nThe enemy could not play any cards and therfore discarded their entire hand.\n" + } + + if (state.stragedyEnemyDeck.length > 0) return stragedyEnemyDrawCard() + return stragedyEnemyRetire() +} + +function stragedyPlayerRandom(punish) { + log(`Player random`) + var hand = [...state.stragedyPlayerHand] + + if (hand.length == 0) { + return "\nThe player has no cards to play.\n" + } + + do { + var index = getRandomInteger(0, hand.length - 1) + var card = hand.splice(index, 1)[0] + + if (/\d+/gi.test(card)) { + return stragedyPlayCard(true, card) + } else if (state.stragedyPlayerBattlefield.length > 0) { + var battlefield = [...new Set(state.stragedyPlayerBattlefield)] + do { + var battlefieldIndex = getRandomInteger(0, battlefield.length - 1) + var battlefieldCard = battlefield.splice(battlefieldIndex, 1)[0] + + if (!battlefieldCard.includes(card)) { + return stragedyPlayCard(true, card + battlefieldCard) + } + } while (battlefield.length > 0) + } + } while (hand.length > 0) + + if (punish) { + state.stragedyPlayerDiscard.push(...state.stragedyEnemyHand) + state.stragedyPlayerHand = [] + return "\nThe player could not play any cards and therfore discarded their entire hand.\n" + } + if (state.stragedyEnemyDeck.length > 0) return stragedyEnemyDrawCard() return stragedyEnemyRetire() } @@ -3492,15 +3512,14 @@ function stragedyPlayCard(player, text) { battlefield.push(handCard + targetCard) stragedyCalculateScores() - stragedyEnemyTurn() return `\n${characterName} ${playedWord} a joker on the ${targetCard}. The card's value is increased to make the total score 30.\n` case "w": hand.splice(handIndex, 1) discard.push(handCard) - //todo:handlecursing + var enemyMove = !player ? stragedyPlayerRandom(true) : stragedyEnemyRandom(true) stragedyCalculateScores() - return `\n${characterName} ${playedWord} a witch on the opponent.\n` + return `\n${characterName} ${playedWord} a witch on ${enemyName}. ${enemyMove}\n` case "p": if (targetCard == "") { if (player) state.stragedyEnemySkipTurn = true diff --git a/Output.js b/Output.js index 7086bdd..2173a07 100644 --- a/Output.js +++ b/Output.js @@ -513,6 +513,16 @@ const modifier = (text) => { text += "\n#map" text += "\n Generates an 11x11 ASCII map of the surrounding locations centered at the party location. The @ symbol is the party location." + text += "\n\n--Stragedy Card Game--" + text += "\n#basicdeck" + text += "\n The basic cards necessary to enjoy the Stragedy card game are added to the character's inventory." + text += "\n#cardshop" + text += "\n This opens the stragedy card shop where characters can spend gold to purchase cards. The inventory is randomized based on the day." + text += "\n#addcard (card_name or card_rarity)" + text += "\n Adds the specified card or randomly generates a card and adds it to the character's inventory. Specifying a rarity (common, rare, epic, legendary) will choose a random card from those lists. Valid card names are a, ace, j, jack, q, queen, k, king, ?, joker, w, witch, p, priest, b, brigand, and any number 2-10" + text += "\n#stragedy (automatic|effortless|easy|medium|hard|impossible)" + text += "\n Initiates a game of Stragedy, a card game played against an AI opponent. Specifying a difficulty (default is easy) grants the opponent a corresponding deck. Please see the game manual on github for rules, tactics, and a complete tutorial: github.com/raeleus/Hashtag-DnD/" + text += "\n\n--Danger Zone--" text += "\n#reset" text += "\n Removes all characters, locations, and notes. Changes all settings to their defaults. Use with caution!" @@ -628,8 +638,7 @@ Type f to forfeit. This quits the game immediately. if (state.stragedyWinner != "forfeit" && state.stragedyEnemyTurnText != null) text += state.stragedyEnemyTurnText - text += ` -The battle has concluded.${state.stragedyWinner != "forfeit" ? `\nFinal scores:\n${character.name}: ${state.stragedyPlayerScore}\nOpponent: ${state.stragedyEnemyScore}`: ""} + text += `The battle has concluded.${state.stragedyWinner != "forfeit" ? `\nFinal scores:\n${character.name}: ${state.stragedyPlayerScore}\nOpponent: ${state.stragedyEnemyScore}`: ""} ` if (state.stragedyWinner == "player") text += `${toTitleCase(character.name)} ${haveWord} won! Congratulations.` else if (state.stragedyWinner == "enemy" || state.stragedyWinner == "forfeit") text += `${toTitleCase(character.name)} ${haveWord} lost! Better luck next time.`