From 040954027d58dea36d5de037b73ed889f0c81e22 Mon Sep 17 00:00:00 2001 From: j Date: Sat, 20 Apr 2024 02:40:58 -0400 Subject: [PATCH] Addtl Attack Logic --- src/game/gameFlow.ts | 222 +++++++++++++++++++++++++++---------------- 1 file changed, 139 insertions(+), 83 deletions(-) diff --git a/src/game/gameFlow.ts b/src/game/gameFlow.ts index a42ed4e..229a45c 100644 --- a/src/game/gameFlow.ts +++ b/src/game/gameFlow.ts @@ -454,7 +454,8 @@ class GameFlow { } else { responseMessage += `Do you want to:\n1. Hunt\n2. Continue\n\n` } - await this.statusUpdate(responseMessage) + await this.statusUpdate(this.gameState.lastPrompt + responseMessage) + this.gameState.lastPrompt = responseMessage; break; } @@ -522,89 +523,143 @@ class GameFlow { let responseMessage = '' this.gameState.lastPrompt = responseMessage; - if (!userInput || userInput === "") { - // Check for random encounter - // Calculate a factor based on total mileage to adjust encounter likelihood. - const mileageFactor = this.gameState.totalMileageWholeTrip / 100 - 4; + switch (this.gameState.subPhase) { - // Calculate the chance of encountering riders, scaling non-linearly with mileage. - const encounterChance = ((mileageFactor ** 2) + 72) / ((mileageFactor ** 2) + 12) - 1; + case 0: //Initial Logic + // Check for random encounter + // Calculate a factor based on total mileage to adjust encounter likelihood. + const mileageFactor = this.gameState.totalMileageWholeTrip / 100 - 4; - // Generate a random factor to determine if an encounter occurs. - const randomFactor = Math.random() * 10; + // Calculate the chance of encountering riders, scaling non-linearly with mileage. + const encounterChance = ((mileageFactor ** 2) + 72) / ((mileageFactor ** 2) + 12) - 1; - // If the random factor exceeds the encounter chance, skip to the next phase. - if (randomFactor > encounterChance) { - this.gameState.phase = PHASE_ENUM.EVENT; - this.gameState.save(); - return this.executeCurrentPhase(); - } - - - this.gameState.hostilityOfRiders = false; - if (Math.random() < 0.8) this.gameState.hostilityOfRiders = true; - } - if (!userInput || userInput === "" || userInput.toString().toLowerCase() === "start") { - responseMessage += `RIDERS AHEAD. THEY` - if (!this.gameState.hostilityOfRiders) responseMessage += ` DON'T` - responseMessage += ` LOOK HOSTILE`; - responseMessage += "\n\nTACTICS\n(1) RUN\n(2) ATTACK\n(3) CONTINUE\n(4) CIRCLE WAGONS"; - - this.gameState.tacticsChoiceWhenAttacked = 0 - this.gameState.lastPrompt = responseMessage; - this.gameState.save(); - await this.statusUpdate(responseMessage); - } else { - //check if its a valid interger between 1 and 4 inclusive - if (isNaN(Number(userInput)) || +userInput < 1 && +userInput > 4) { - - responseMessage = "Invalid input. Please enter a number between 1-4.\n\n"; - responseMessage += this.gameState.lastPrompt; - await this.statusUpdate(responseMessage); - return; - } - // Convert to integer in case it's not - this.gameState.tacticsChoiceWhenAttacked = Math.floor(+userInput); - // Random chance to flip hostility - if (Math.random() > 0.2) this.gameState.hostilityOfRiders = !this.gameState.hostilityOfRiders; - // Check tactics choice and resolve encounter - - switch (this.gameState.tacticsChoiceWhenAttacked) { - case 1: // RUN - this.gameState.totalMileageWholeTrip += this.gameState.hostilityOfRiders ? 15 : 20; - this.gameState.amountSpentOnAnimals -= this.gameState.hostilityOfRiders ? 10 : 40; - this.gameState.amountSpentOnMiscellaneousSupplies -= 15; - this.gameState.amountSpentOnAmmunition -= 150; + // Generate a random factor to determine if an encounter occurs. + const randomFactor = Math.random() * 10; + // If the random factor exceeds the encounter chance, skip to the next phase. + if (randomFactor > encounterChance) { this.gameState.phase = PHASE_ENUM.EVENT; this.gameState.save(); return this.executeCurrentPhase(); - case 2: // ATTACK - // Placeholder for attack logic, potentially involving a call to handleShooting() - this.handleShooting(); - // Adjust resources based on the outcome of handleShooting() - break; - case 3: // CONTINUE - if (this.gameState.hostilityOfRiders) { - this.gameState.totalMileageWholeTrip -= 5; - this.gameState.amountSpentOnAmmunition -= 100; - } - // No additional action if riders are friendly - break; - case 4: // CIRCLE WAGONS - if (this.gameState.hostilityOfRiders) { - this.gameState.totalMileageWholeTrip -= 20; - } else { - // Possibly a smaller penalty or no action if riders are friendly - this.gameState.totalMileageWholeTrip -= 10; - } - break; - default: - // Handle unexpected input (should be unreachable due to prior validation) - console.log("Unexpected tactics choice."); - break; - } + } + this.gameState.hostileRiders = false; + if (Math.random() < 0.8) this.gameState.hostileRiders = true; + responseMessage += `RIDERS AHEAD. THEY` + if (!this.gameState.hostileRiders) responseMessage += ` DON'T` + responseMessage += ` LOOK HOSTILE`; + responseMessage += "\n\nTACTICS\n(1) RUN\n(2) ATTACK\n(3) CONTINUE\n(4) CIRCLE WAGONS"; + + this.gameState.tacticsChoiceWhenAttacked = 0 + this.gameState.lastPrompt = responseMessage; + this.gameState.subPhase = 1; + this.gameState.save(); + await this.statusUpdate(responseMessage); + break; + case 1: // Choice + if (!userInput || isNaN(Number(userInput)) || +userInput < 1 && +userInput > 4) { + + responseMessage = "Invalid input. Please enter a number between 1-4.\n\n"; + responseMessage += this.gameState.lastPrompt; + await this.statusUpdate(responseMessage); + return; + } + // Convert to integer in case it's not + this.gameState.tacticsChoiceWhenAttacked = Math.floor(+userInput); + // Random chance to flip hostility + if (Math.random() > 0.2) this.gameState.hostileRiders = !this.gameState.hostileRiders; + + // Handle tactics choice + switch (this.gameState.tacticsChoiceWhenAttacked) { + case 1: // RUN + this.gameState.totalMileageWholeTrip += this.gameState.hostileRiders ? 20 : 15; + this.gameState.amountSpentOnAnimals -= this.gameState.hostileRiders ? 40 : 10; + this.gameState.amountSpentOnMiscellaneousSupplies -= this.gameState.hostileRiders ? 15 : 0; + this.gameState.amountSpentOnAmmunition -= this.gameState.hostileRiders ? 150 : 0; + + this.gameState.phase = PHASE_ENUM.EVENT; + this.gameState.subPhase = 0; + this.gameState.save(); + return this.executeCurrentPhase(); + case 2: // ATTACK + this.gameState.subPhase = 2; + this.gameState.save() + return this.executeCurrentPhase() + case 3: // CONTINUE + if (this.gameState.hostileRiders) { + //Penalize lost initiative if riders are hostile + this.gameState.lastPrompt = "You continue on cautiously, keeping your guard up. THE RIDERS ATTACK!\n\n"; + this.gameState.totalMileageWholeTrip -= 5; + this.gameState.amountSpentOnAmmunition -= 100; + this.gameState.subPhase = 2; + this.gameState.save() + return this.executeCurrentPhase() + } + // No additional action if riders are friendly + this.gameState.lastPrompt = "The riders continue on their way without incident.\n\n"; + this.gameState.phase = PHASE_ENUM.EVENT; + this.gameState.subPhase = 0; + this.gameState.save(); + return this.executeCurrentPhase(); + case 4: // CIRCLE WAGONS + if (!this.gameState.hostileRiders) { + this.gameState.totalMileageWholeTrip -= 20; + this.gameState.lastPrompt = "You formed a defensive circle with your wagons. The riders continue on their way without incident.\n\n"; + this.gameState.phase = PHASE_ENUM.EVENT; + this.gameState.subPhase = 0; + this.gameState.save(); + return this.executeCurrentPhase() + } + this.gameState.subPhase = 4; + this.gameState.lastPrompt = "You formed a defensive circle with your wagons.THE RIDERS ATTACK!\n\n" + this.gameState.save() + return this.executeCurrentPhase() + default: + // Handle unexpected input (should be unreachable due to prior validation) + console.log("Unexpected tactics choice."); + break; + } + break; + case 2: // Resolve fight logic + responseMessage = this.gameState.lastPrompt + responseMessage += this.handleShooting() + this.gameState.lastPrompt = responseMessage + this.gameState.subPhase = 3 + await this.statusUpdate(responseMessage) + await this.gameState.save() + break; + case 3: // Resolve fight outcome + if (!userInput) { + responseMessage = "Invalid input.\n\n" + responseMessage += this.gameState.lastPrompt + await this.statusUpdate(responseMessage) + return; + } + responseMessage += this.handleShooting(userInput.toString()); + if (this.gameState.shootResponseTime <= 1) { + responseMessage += `NICE SHOOTING---YOU DROVE THEM OFF!!!\n\n` + await this.statusUpdate(responseMessage) + } else if (this.gameState.shootResponseTime <= 4) { + responseMessage += `KINDA SLOW WITH YOUR GUN\n\n` + } else { + responseMessage += `LOUSY SHOT---YOU GOT KNIFED\nYOU HAVE TO SEE OL' DOC GARY CHESS\n\n` + this.gameState.injuryFlag = true + } + this.gameState.phase = PHASE_ENUM.ACTION_CHOICE; + await this.gameState.save(); + await this.executeCurrentPhase(); + return; + case 4: // Resolve wagon logic + responseMessage = this.gameState.lastPrompt + responseMessage += this.handleShooting() + this.gameState.lastPrompt = responseMessage + this.gameState.subPhase = 5 + await this.statusUpdate(responseMessage) + await this.gameState.save() + break; + case 5: // Resolve wagon outcome + break; } + } @@ -615,22 +670,23 @@ class GameFlow { if (!userInput || userInput.toString().toLowerCase() === "start") { responseMessage += this.handleShooting() await this.statusUpdate(responseMessage) + await this.gameState.save(); } else { responseMessage += this.handleShooting(userInput.toString()); - if (this.gameState.actualResponseTimeForBang <= 1) { + if (this.gameState.shootResponseTime <= 1) { responseMessage += `RIGHT BETWEEN THE EYES---YOU GOT A BIG ONE!!!!\n\n` responseMessage += `FULL BELLIES TONIGHT!\n\n` this.gameState.amountSpentOnFood += 52 + (Math.random() * 6) this.gameState.amountSpentOnAmmunition -= 10 - (Math.random() * 4) - await this.statusUpdate(responseMessage) - } else if (100 * Math.random() > (13 * this.gameState.actualResponseTimeForBang)) { + } else if (100 * Math.random() > (13 * this.gameState.shootResponseTime)) { responseMessage += `NICE SHOT--RIGHT ON TARGET--GOOD EATIN' TONIGHT!!\n\n` - this.gameState.amountSpentOnFood += 48 - (2 * this.gameState.actualResponseTimeForBang) - this.gameState.amountSpentOnAmmunition -= 10 - (3 * this.gameState.actualResponseTimeForBang) + this.gameState.amountSpentOnFood += 48 - (2 * this.gameState.shootResponseTime) + this.gameState.amountSpentOnAmmunition -= 10 - (3 * this.gameState.shootResponseTime) } else { responseMessage += `Better luck next time! Maybe practice your aim some more.\n\n` this.gameState.amountSpentOnAmmunition -= 50 } + this.gameState.lastPrompt = responseMessage; this.gameState.phase = PHASE_ENUM.ACTION_CHOICE; await this.gameState.save(); await this.executeCurrentPhase(); @@ -681,10 +737,10 @@ class GameFlow { actualResponseTimeForBang = 0; } // Update the game state with the actual response time - this.gameState.actualResponseTimeForBang = actualResponseTimeForBang; + this.gameState.shootResponseTime = actualResponseTimeForBang; } else { responseMessage += `Your Word was ${this.gameState.shootingWordSelector}. Better luck next time!\n\n` - this.gameState.actualResponseTimeForBang = 9; // Set a high time to indicate a miss + this.gameState.shootResponseTime = 9; // Set a high time to indicate a miss } return responseMessage; }