Compare commits
No commits in common. "040954027d58dea36d5de037b73ed889f0c81e22" and "c0d93da68783bf219fa4a4b6c987412d243ff0bc" have entirely different histories.
040954027d
...
c0d93da687
|
@ -454,8 +454,7 @@ class GameFlow {
|
||||||
} else {
|
} else {
|
||||||
responseMessage += `Do you want to:\n1. Hunt\n2. Continue\n\n`
|
responseMessage += `Do you want to:\n1. Hunt\n2. Continue\n\n`
|
||||||
}
|
}
|
||||||
await this.statusUpdate(this.gameState.lastPrompt + responseMessage)
|
await this.statusUpdate(responseMessage)
|
||||||
this.gameState.lastPrompt = responseMessage;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -523,143 +522,89 @@ class GameFlow {
|
||||||
let responseMessage = ''
|
let responseMessage = ''
|
||||||
this.gameState.lastPrompt = responseMessage;
|
this.gameState.lastPrompt = responseMessage;
|
||||||
|
|
||||||
switch (this.gameState.subPhase) {
|
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;
|
||||||
|
|
||||||
case 0: //Initial Logic
|
// Calculate the chance of encountering riders, scaling non-linearly with mileage.
|
||||||
// Check for random encounter
|
const encounterChance = ((mileageFactor ** 2) + 72) / ((mileageFactor ** 2) + 12) - 1;
|
||||||
// Calculate a factor based on total mileage to adjust encounter likelihood.
|
|
||||||
const mileageFactor = this.gameState.totalMileageWholeTrip / 100 - 4;
|
|
||||||
|
|
||||||
// Calculate the chance of encountering riders, scaling non-linearly with mileage.
|
// Generate a random factor to determine if an encounter occurs.
|
||||||
const encounterChance = ((mileageFactor ** 2) + 72) / ((mileageFactor ** 2) + 12) - 1;
|
const randomFactor = Math.random() * 10;
|
||||||
|
|
||||||
// Generate a random factor to determine if an encounter occurs.
|
// If the random factor exceeds the encounter chance, skip to the next phase.
|
||||||
const randomFactor = Math.random() * 10;
|
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;
|
||||||
|
|
||||||
// If the random factor exceeds the encounter chance, skip to the next phase.
|
|
||||||
if (randomFactor > encounterChance) {
|
|
||||||
this.gameState.phase = PHASE_ENUM.EVENT;
|
this.gameState.phase = PHASE_ENUM.EVENT;
|
||||||
this.gameState.save();
|
this.gameState.save();
|
||||||
return this.executeCurrentPhase();
|
return this.executeCurrentPhase();
|
||||||
}
|
case 2: // ATTACK
|
||||||
this.gameState.hostileRiders = false;
|
// Placeholder for attack logic, potentially involving a call to handleShooting()
|
||||||
if (Math.random() < 0.8) this.gameState.hostileRiders = true;
|
this.handleShooting();
|
||||||
responseMessage += `RIDERS AHEAD. THEY`
|
// Adjust resources based on the outcome of handleShooting()
|
||||||
if (!this.gameState.hostileRiders) responseMessage += ` DON'T`
|
break;
|
||||||
responseMessage += ` LOOK HOSTILE`;
|
case 3: // CONTINUE
|
||||||
responseMessage += "\n\nTACTICS\n(1) RUN\n(2) ATTACK\n(3) CONTINUE\n(4) CIRCLE WAGONS";
|
if (this.gameState.hostilityOfRiders) {
|
||||||
|
this.gameState.totalMileageWholeTrip -= 5;
|
||||||
this.gameState.tacticsChoiceWhenAttacked = 0
|
this.gameState.amountSpentOnAmmunition -= 100;
|
||||||
this.gameState.lastPrompt = responseMessage;
|
}
|
||||||
this.gameState.subPhase = 1;
|
// No additional action if riders are friendly
|
||||||
this.gameState.save();
|
break;
|
||||||
await this.statusUpdate(responseMessage);
|
case 4: // CIRCLE WAGONS
|
||||||
break;
|
if (this.gameState.hostilityOfRiders) {
|
||||||
case 1: // Choice
|
this.gameState.totalMileageWholeTrip -= 20;
|
||||||
if (!userInput || isNaN(Number(userInput)) || +userInput < 1 && +userInput > 4) {
|
} else {
|
||||||
|
// Possibly a smaller penalty or no action if riders are friendly
|
||||||
responseMessage = "Invalid input. Please enter a number between 1-4.\n\n";
|
this.gameState.totalMileageWholeTrip -= 10;
|
||||||
responseMessage += this.gameState.lastPrompt;
|
}
|
||||||
await this.statusUpdate(responseMessage);
|
break;
|
||||||
return;
|
default:
|
||||||
}
|
// Handle unexpected input (should be unreachable due to prior validation)
|
||||||
// Convert to integer in case it's not
|
console.log("Unexpected tactics choice.");
|
||||||
this.gameState.tacticsChoiceWhenAttacked = Math.floor(+userInput);
|
break;
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -670,23 +615,22 @@ class GameFlow {
|
||||||
if (!userInput || userInput.toString().toLowerCase() === "start") {
|
if (!userInput || userInput.toString().toLowerCase() === "start") {
|
||||||
responseMessage += this.handleShooting()
|
responseMessage += this.handleShooting()
|
||||||
await this.statusUpdate(responseMessage)
|
await this.statusUpdate(responseMessage)
|
||||||
await this.gameState.save();
|
|
||||||
} else {
|
} else {
|
||||||
responseMessage += this.handleShooting(userInput.toString());
|
responseMessage += this.handleShooting(userInput.toString());
|
||||||
if (this.gameState.shootResponseTime <= 1) {
|
if (this.gameState.actualResponseTimeForBang <= 1) {
|
||||||
responseMessage += `RIGHT BETWEEN THE EYES---YOU GOT A BIG ONE!!!!\n\n`
|
responseMessage += `RIGHT BETWEEN THE EYES---YOU GOT A BIG ONE!!!!\n\n`
|
||||||
responseMessage += `FULL BELLIES TONIGHT!\n\n`
|
responseMessage += `FULL BELLIES TONIGHT!\n\n`
|
||||||
this.gameState.amountSpentOnFood += 52 + (Math.random() * 6)
|
this.gameState.amountSpentOnFood += 52 + (Math.random() * 6)
|
||||||
this.gameState.amountSpentOnAmmunition -= 10 - (Math.random() * 4)
|
this.gameState.amountSpentOnAmmunition -= 10 - (Math.random() * 4)
|
||||||
} else if (100 * Math.random() > (13 * this.gameState.shootResponseTime)) {
|
await this.statusUpdate(responseMessage)
|
||||||
|
} else if (100 * Math.random() > (13 * this.gameState.actualResponseTimeForBang)) {
|
||||||
responseMessage += `NICE SHOT--RIGHT ON TARGET--GOOD EATIN' TONIGHT!!\n\n`
|
responseMessage += `NICE SHOT--RIGHT ON TARGET--GOOD EATIN' TONIGHT!!\n\n`
|
||||||
this.gameState.amountSpentOnFood += 48 - (2 * this.gameState.shootResponseTime)
|
this.gameState.amountSpentOnFood += 48 - (2 * this.gameState.actualResponseTimeForBang)
|
||||||
this.gameState.amountSpentOnAmmunition -= 10 - (3 * this.gameState.shootResponseTime)
|
this.gameState.amountSpentOnAmmunition -= 10 - (3 * this.gameState.actualResponseTimeForBang)
|
||||||
} else {
|
} else {
|
||||||
responseMessage += `Better luck next time! Maybe practice your aim some more.\n\n`
|
responseMessage += `Better luck next time! Maybe practice your aim some more.\n\n`
|
||||||
this.gameState.amountSpentOnAmmunition -= 50
|
this.gameState.amountSpentOnAmmunition -= 50
|
||||||
}
|
}
|
||||||
this.gameState.lastPrompt = responseMessage;
|
|
||||||
this.gameState.phase = PHASE_ENUM.ACTION_CHOICE;
|
this.gameState.phase = PHASE_ENUM.ACTION_CHOICE;
|
||||||
await this.gameState.save();
|
await this.gameState.save();
|
||||||
await this.executeCurrentPhase();
|
await this.executeCurrentPhase();
|
||||||
|
@ -737,10 +681,10 @@ class GameFlow {
|
||||||
actualResponseTimeForBang = 0;
|
actualResponseTimeForBang = 0;
|
||||||
}
|
}
|
||||||
// Update the game state with the actual response time
|
// Update the game state with the actual response time
|
||||||
this.gameState.shootResponseTime = actualResponseTimeForBang;
|
this.gameState.actualResponseTimeForBang = actualResponseTimeForBang;
|
||||||
} else {
|
} else {
|
||||||
responseMessage += `Your Word was ${this.gameState.shootingWordSelector}. Better luck next time!\n\n`
|
responseMessage += `Your Word was ${this.gameState.shootingWordSelector}. Better luck next time!\n\n`
|
||||||
this.gameState.shootResponseTime = 9; // Set a high time to indicate a miss
|
this.gameState.actualResponseTimeForBang = 9; // Set a high time to indicate a miss
|
||||||
}
|
}
|
||||||
return responseMessage;
|
return responseMessage;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ class GameState {
|
||||||
authorName: string;
|
authorName: string;
|
||||||
amountSpentOnAnimals: number = 0;
|
amountSpentOnAnimals: number = 0;
|
||||||
amountSpentOnAmmunition: number = 0;
|
amountSpentOnAmmunition: number = 0;
|
||||||
shootResponseTime: number = 0;
|
actualResponseTimeForBang: number = 0;
|
||||||
clockTimeAtStartOfBang: number = 0;
|
clockTimeAtStartOfBang: number = 0;
|
||||||
amountSpentOnClothing: number = 0;
|
amountSpentOnClothing: number = 0;
|
||||||
insufficientClothingFlag: boolean = false;
|
insufficientClothingFlag: boolean = false;
|
||||||
|
@ -35,7 +35,7 @@ class GameState {
|
||||||
amountSpentOnItemsAtFort: number = 0;
|
amountSpentOnItemsAtFort: number = 0;
|
||||||
randomEventNumber: number = 0;
|
randomEventNumber: number = 0;
|
||||||
illnessFlag: boolean = false;
|
illnessFlag: boolean = false;
|
||||||
hostileRiders: boolean = false;
|
hostilityOfRiders: boolean = false;
|
||||||
shootingWordSelector: string = '';
|
shootingWordSelector: string = '';
|
||||||
shootingWordVariations: string[] = [];
|
shootingWordVariations: string[] = [];
|
||||||
cashLeftAfterInitialPurchases: number = 800;
|
cashLeftAfterInitialPurchases: number = 800;
|
||||||
|
|
Loading…
Reference in New Issue