From 8485d7d8008dc37d29be19bb42f6990e9013808f Mon Sep 17 00:00:00 2001 From: Raktbastr Date: Fri, 25 Apr 2025 23:08:47 -0500 Subject: [PATCH] Shops, encounters, poi menus, items, and some other stuff. Poi dialogue and combat left! --- files/encounters.js | 62 ++++++-- files/functions.js | 73 +++++++--- files/main.js | 19 ++- files/poiscreens.js | 7 + files/shops.js | 338 +++++++++++++++++++++++++++++++------------- files/variables.js | 14 +- 6 files changed, 371 insertions(+), 142 deletions(-) diff --git a/files/encounters.js b/files/encounters.js index 35764d6..6a40a3d 100644 --- a/files/encounters.js +++ b/files/encounters.js @@ -58,7 +58,7 @@ export function naturalEncounter(location){ return HLabominationEncounters[randomNumber(0, HLabominationEncounters.length-1)]; } } else { - return abominationEncounters[randomNumber(0, abominationEncounters.length-1)]; + return abominationEncounters[randomNumber(0, abominationEncounters.length-1)]; } case "MWBOS": if(HLE == true){ @@ -69,7 +69,7 @@ export function naturalEncounter(location){ return HLMWBOSEncounters[randomNumber(0, HLMWBOSEncounters.length-1)]; } } else { - return MWBOSEncounters[randomNumber(0, MWBOSEncounters.length-1)]; + return MWBOSEncounters[randomNumber(0, MWBOSEncounters.length-1)]; } case "BOS": if(HLE == true){ @@ -80,7 +80,7 @@ export function naturalEncounter(location){ return HLBOSEncounters[randomNumber(0, HLBOSEncounters.length-1)]; } } else { - return BOSEncounters[randomNumber(0, BOSEncounters.length-1)]; + return BOSEncounters[randomNumber(0, BOSEncounters.length-1)]; } case "NCR": if(HLE == true){ @@ -91,7 +91,7 @@ export function naturalEncounter(location){ return HLNCREncounters[randomNumber(0, HLNCREncounters.length-1)]; } } else { - return NCREncounters[randomNumber(0, NCREncounters.length-1)]; + return NCREncounters[randomNumber(0, NCREncounters.length-1)]; } case "legion": if(HLE == true){ @@ -102,7 +102,7 @@ export function naturalEncounter(location){ return HLlegionEncounters[randomNumber(0, HLlegionEncounters.length-1)]; } } else { - return legionEncounters[randomNumber(0, legionEncounters.length-1)]; + return legionEncounters[randomNumber(0, legionEncounters.length-1)]; } case "settler": if(HLE == true){ @@ -113,7 +113,7 @@ export function naturalEncounter(location){ return HLsettlerEncounters[randomNumber(0, HLsettlerEncounters.length-1)]; } } else { - return settlerEncounters[randomNumber(0, settlerEncounters.length-1)]; + return settlerEncounters[randomNumber(0, settlerEncounters.length-1)]; } case "raider": if(HLE == true){ @@ -124,7 +124,7 @@ export function naturalEncounter(location){ return HLraiderEncounters[randomNumber(0, HLraiderEncounters.length-1)]; } } else { - return raiderEncounters[randomNumber(0, raiderEncounters.length-1)]; + return raiderEncounters[randomNumber(0, raiderEncounters.length-1)]; } } } else { @@ -172,34 +172,72 @@ export function forcedEncounter(HLE, faction, forcedHLE){ } var raiderEncounters = [ - {name: "Raider Aspirant", faction: "raider", minLevel: 5, maxLevel: 15, damageClass: "B", minDamage: 5, maxDamage: 10} + {name: "Raider Aspirant", faction: "raider", minLevel: 1, maxLevel: 15, damageClass: "B", minDamage: 5, maxDamage: 10}, + {name: "Raider", faction: "raider", minLevel: 15, maxLevel: 25, damageClass: "B", minDamage: 10, maxDamage: 20}, + {name: "Raider Scavenger", faction: "raider", minLevel: 25, maxLevel: 35, damageClass: "B", minDamage: 20, maxDamage: 30} ]; var HLraiderEncounters = [ + {name: "Raider Enforcer", faction: "raider", minLevel: 35, maxLevel: 50, damageClass: "B", minDamage: 30, maxDamage: 40}, + {name: "Raider Warlord", faction: "raider", minLevel: 50, maxLevel: 65, damageClass: "B", minDamage: 40, maxDamage: 50}, + {name: "Raider Boss", faction: "raider", minLevel: 65, maxLevel: 80, damageClass: "B", minDamage: 50, maxDamage: 60} ]; var MWBOSEncounters = [ - {name: "MWBOS Paladin", faction: "MWBOS", minLevel: 40, maxLevel: 65, damageClass: "E", minDamage: 5, maxDamage: 40} + {name: "MWBOS Initiate", faction: "MWBOS", minLevel: 5, maxLevel: 10, damageClass: "E", minDamage: 5, maxDamage: 40}, + {name: "MWBOS Knight", faction: "MWBOS", minLevel: 15, maxLevel: 20, damageClass: "E", minDamage: 40, maxDamage: 60}, + {name: "MWBOS Knight Captain", faction: "MWBOS", minLevel: 25, maxLevel: 30, damageClass: "E", minDamage: 60, maxDamage: 80} ]; var HLMWBOSEncounters = [ + {name: "MWBOS Paladin", faction: "MWBOS", minLevel: 35, maxLevel: 40, damageClass: "E", minDamage: 60, maxDamage: 80}, + {name: "MWBOS Star Paladin", faction: "MWBOS", minLevel: 45, maxLevel: 50, damageClass: "E", minDamage: 80, maxDamage: 100}, + {name: "MWBOS Head Paladin", faction: "MWBOS", minLevel: 55, maxLevel: 60, damageClass: "E", minDamage: 100, maxDamage: 120} ]; var abominationEncounters = [ - {name: "Deathclaw", faction: "abomination", minLevel: 50, maxLevel: 100, damageClass: "B", minDamage: 35, maxDamage: 75} + {name: "Mole Rat", faction: "abomination", minLevel: 1, maxLevel: 15, damageClass: "B", minDamage: 1, maxDamage: 5}, + {name: "Mongrel", faction: "abomination", minLevel: 15, maxLevel: 30, damageClass: "B", minDamage: 5, maxDamage: 10}, + {name: "Radscorpion", faction: "abomination", minLevel: 30, maxLevel: 50, damageClass: "B", minDamage: 5, maxDamage: 10}, ]; var HLabominationEncounters = [ + {name: "Super Mutant", faction: "abomination", minLevel: 50, maxLevel: 65, damageClass: "B", minDamage: 5, maxDamage: 10}, + {name: "Tunneler", faction: "abomination", minLevel: 65, maxLevel: 80, damageClass: "B", minDamage: 5, maxDamage: 10}, + {name: "Deathclaw", faction: "abomination", minLevel: 80, maxLevel: 100, damageClass: "B", minDamage: 5, maxDamage: 10}, ]; var NCREncounters = [ + {name: "NCR Trooper", faction: "NCR", minLevel: 40, maxLevel: 70, damageClass: "B", minDamage: 5, maxDamage: 10}, + {name: "NCR Ranger", faction: "NCR", minLevel: 50, maxLevel: 70, damageClass: "B", minDamage: 10, maxDamage: 20}, + {name: "NCR Commander", faction: "NCR", minLevel: 60, maxLevel: 70, damageClass: "B", minDamage: 20, maxDamage: 30} ]; var HLNCREncounters = [ + {name: "NCR Heavy Trooper", faction: "NCR", minLevel: 70, maxLevel: 100, damageClass: "B", minDamage: 30, maxDamage: 40}, + {name: "NCR Veteran Ranger", faction: "NCR", minLevel: 80, maxLevel: 100, damageClass: "B", minDamage: 40, maxDamage: 50}, + {name: "NCR General", faction: "NCR", minLevel: 90, maxLevel: 100, damageClass: "B", minDamage: 50, maxDamage: 60} ]; -var BOSEncounters = [ +var BOSEncounters = [ //Reduntant, your not gonna encounter a low level Lost Hills BOS encounter + {name: "BOS Paladin", faction: "BOS", minLevel: 60, maxLevel: 80, damageClass: "E", minDamage: 60, maxDamage: 80}, + {name: "BOS Star Paladin", faction: "BOS", minLevel: 70, maxLevel: 90, damageClass: "E", minDamage: 80, maxDamage: 100}, + {name: "BOS Head Paladin", faction: "BOS", minLevel: 80, maxLevel: 100, damageClass: "E", minDamage: 100, maxDamage: 120} ]; var HLBOSEncounters = [ + {name: "BOS Paladin", faction: "BOS", minLevel: 60, maxLevel: 80, damageClass: "E", minDamage: 60, maxDamage: 80}, + {name: "BOS Star Paladin", faction: "BOS", minLevel: 70, maxLevel: 90, damageClass: "E", minDamage: 80, maxDamage: 100}, + {name: "BOS Head Paladin", faction: "BOS", minLevel: 80, maxLevel: 100, damageClass: "E", minDamage: 100, maxDamage: 120} ]; var settlerEncounters = [ - {name: "John Settler", faction: "settler", minLevel: 1, maxLevel: 2, damageClass: "B", minDamage: 1, maxDamage: 2} + {name: "John Settler", faction: "settler", minLevel: 1, maxLevel: 2, damageClass: "B", minDamage: 1, maxDamage: 2}, + {name: "Settler", faction: "settler", minLevel: 2, maxLevel: 3, damageClass: "B", minDamage: 2, maxDamage: 3}, + {name: "Settler Scavenger", faction: "settler", minLevel: 3, maxLevel: 4, damageClass: "B", minDamage: 3, maxDamage: 4}, ]; var HLsettlerEncounters = [ + {name: "Settler Gaurdsman", faction: "settler", minLevel: 4, maxLevel: 5, damageClass: "B", minDamage: 4, maxDamage: 5}, + {name: "Settler Enforcer", faction: "settler", minLevel: 5, maxLevel: 6, damageClass: "B", minDamage: 5, maxDamage: 6}, + {name: "Settler Sheriff", faction: "settler", minLevel: 6, maxLevel: 7, damageClass: "B", minDamage: 6, maxDamage: 7}, ]; var legionEncounters = [ + {name: "Legion Recruit", faction: "legion", minLevel: 30, maxLevel: 40, damageClass: "B", minDamage: 1, maxDamage: 2}, + {name: "Legionary", faction: "legion", minLevel: 40, maxLevel: 50, damageClass: "B", minDamage: 2, maxDamage: 3}, + {name: "Legion Vexillarius", faction: "legion", minLevel: 50, maxLevel: 60, damageClass: "B", minDamage: 3, maxDamage: 4}, ]; var HLlegionEncounters = [ + {name: "Legion Decanus", faction: "legion", minLevel: 60, maxLevel: 70, damageClass: "B", minDamage: 4, maxDamage: 5}, + {name: "Legion Centurion", faction: "legion", minLevel: 70, maxLevel: 80, damageClass: "B", minDamage: 5, maxDamage: 6}, + {name: "Legion Praetorian", faction: "legion", minLevel: 80, maxLevel: 90, damageClass: "B", minDamage: 6, maxDamage: 7}, ]; \ No newline at end of file diff --git a/files/functions.js b/files/functions.js index 71ccb9c..911fb4c 100755 --- a/files/functions.js +++ b/files/functions.js @@ -28,7 +28,6 @@ export function randomNumber(min, max) { // Takes in two parameters, min and max return randNum; } - // Used for game export function healthCapCalc() { // Calculates HP cap given current radPoints healthCap = healthCap-radPoints; @@ -85,24 +84,24 @@ export function calcLocation() { } if (walkRate == 2) { if (path == 0) { - location * 2; + location + 2; } if (path == 1) { - locationA * 2; + locationA + 2; } if (path == 2) { - locationB * 2; + locationB + 2; } } if (walkRate == 3) { if (path == 0) { - location * 3; + location + 3; } if (path == 1) { - locationA * 3; + locationA + 3; } if (path == 2) { - locationB * 3; + locationB + 3; } } } @@ -174,7 +173,7 @@ function death3(dc) { function death4(dc) { console.clear(); sleep(2); - console.log("You have been killed, therefore you are DEAD...\n\n"); + console.log("You have been killed, therefore you are dead...\n\n"); console.log(" \\|/"); console.log(" _/\\___<0> | "); console.log("-------------------------------\n\n"); @@ -226,10 +225,10 @@ export function travelScreen() { console.log("│ . . - . . - . . . - │"); console.log("│ - . . . . . . - . .│"); console.log("└──────────────────────────────────────┘"); - console.log("Press [ENTER] to open Pip-Boy"); + console.log("Press [SPACE] to open Pip-Boy"); console.log("Current Health: "+health); console.log("Food Amt: "+food); - console.log("Distance to next POI: "); + console.log("Distance to next POI: " + pois[poiCounter].location-location); travelFrame++ } else if (travelFrame == 1) { console.clear(); @@ -248,10 +247,10 @@ export function travelScreen() { console.log("│ - . - . . . - . - . │"); console.log("│ - . . - . . . - .│"); console.log("└──────────────────────────────────────┘"); - console.log("Press [ENTER] to open Pip-Boy"); + console.log("Press [SPACE] to open Pip-Boy"); console.log("Current Health: "+health); console.log("Food Amt: "+food); - console.log("Distance to next POI: "); + console.log("Distance to next POI: " + pois[poiCounter].location-location); travelFrame++ } else if (travelFrame == 2) { console.clear(); @@ -270,10 +269,10 @@ export function travelScreen() { console.log("│ - . - . . . - . - . │"); console.log("│ - . . - . . . - .│"); console.log("└──────────────────────────────────────┘"); - console.log("Press [ENTER] to open Pip-Boy"); + console.log("Press [SPACE] to open Pip-Boy"); console.log("Current Health: "+health); console.log("Food Amt: "+food); - console.log("Distance to next POI: "); + console.log("Distance to next POI: " + pois[poiCounter].location-location); travelFrame++ } else if (travelFrame == 3) { console.clear(); @@ -292,10 +291,10 @@ export function travelScreen() { console.log("│ - . - . . . - . - . │"); console.log("│ - . . - . . . - .│"); console.log("└──────────────────────────────────────┘"); - console.log("Press [ENTER] to open Pip-Boy"); + console.log("Press [SPACE] to open Pip-Boy"); console.log("Current Health: "+health); console.log("Food Amt: "+food); - console.log("Distance to next POI: "); + console.log("Distance to next POI: " + pois[poiCounter].location-location); travelFrame=0; } } @@ -360,7 +359,7 @@ export function pauseScreen() { console.log ("3) View Distances"); console.log ("4) View Stats"); console.log ("5) Scavenge"); - console.log ("6) Test Death"); + console.log ("6) Change Speed/Food Rate"); let pauseInput = userInput("Enter: "); switch(pauseInput) { case "1": @@ -371,7 +370,6 @@ export function pauseScreen() { break; case "3": console.clear(); - console.log("Current Location: "+location); if (path == 0) { console.log("Current Path: Main"); } @@ -396,7 +394,7 @@ export function pauseScreen() { console.log(pois[i].name+" - "+visited[i]); } if (pois[i].visited == false) { - console.log("??? "+pois[i].location-location+" location points away"); + console.log("??? "+pois[i].location-locationA+" location points away"); } } } @@ -406,7 +404,7 @@ export function pauseScreen() { console.log(pois[i].name+" - "+visited[i]); } if (pois[i].visited == false) { - console.log("??? "+pois[i].location-location+" location points away"); + console.log("??? "+pois[i].location-locationB+" location points away"); } } } @@ -424,7 +422,7 @@ export function pauseScreen() { console.log("Walk Rate: "+walkRate); console.log("Food Amt: "+food); console.log("Food Rate: "+foodRate); - console.log("Current Location: "+location); + console.log("Distance to next POI: " + pois[poiCounter].location-location); console.log("Current Path: "+path); userInput("\n[Press Enter to return]"); break; @@ -432,7 +430,38 @@ export function pauseScreen() { scavenge(); break; case "6": - testDeath = true; + console.clear(); + console.log("Current Walk Rate: "+walkRate); + console.log("Current Food Rate: "+foodRate); + console.log("---------------------------"); + console.log("What would you like to change?"); + console.log("---------------------------"); + console.log("1) Walk Rate"); + console.log("2) Food Rate"); + let rateInput = userInput("Enter: "); + switch(rateInput) { + case "1": + console.log("Current Walk Rate: "+walkRate); + let walkRateInput = userInput("Enter new Walk Rate (1-3): "); + if (walkRateInput >= 1 && walkRateInput <= 3) { + walkRate = walkRateInput; + } else { + console.log("Invalid input. Walk Rate not changed."); + } + break; + case "2": + console.log("Current Food Rate: "+foodRate); + let foodRateInput = userInput("Enter new Food Rate (1-3): "); + if (foodRateInput >= 1 && foodRateInput <= 3) { + foodRate = foodRateInput; + } else { + console.log("Invalid input. Food Rate not changed."); + } + break; + default: + console.log("Invalid input. No changes made."); + } + userInput("\n[Press Enter to return]"); break; } } \ No newline at end of file diff --git a/files/main.js b/files/main.js index d2a2bb4..5651d5e 100755 --- a/files/main.js +++ b/files/main.js @@ -1,5 +1,5 @@ // Program is started from here, runs functions from other files. -import { userInput, sleep, disableRawMode, walkPathMain } from './functions.js'; +import { userInput, sleep, disableRawMode, walkPathMain, randomNumber, removeDuplicates } from './functions.js'; import { forcedEncounter, naturalEncounter } from './encounters.js'; import { ravenRockStore } from './shops.js'; @@ -12,8 +12,6 @@ console.log(" / ' / / / console.log("---/__-------__---/---/----__---------_/_---------/-------__----__----__---__----__---_--_----__-------/___ /----__----__----__-/-"); console.log(" / / ) / / / ) / / / o / / ) / ) /___) (_ ` / ) / / ) /___) / | / ) / ) / / "); console.log("_/________(___(_/___/___(___/_(___(__(_ __o_____/____/_(___/_/___/_(___ _(__)_(___/_/_/__/_(___ _____/_____|__(___/_(___(_(___/___\n\n"); - - await sleep(1); console.log("What would you like to do?"); @@ -36,12 +34,23 @@ switch(mainMenuInput) { case "3": console.log("Quitting Game..."); await sleep(1); - break; + exit(0); case "4": console.log("Credits:"); console.log("Bethesda Game Studios - The Fallout IP and related characters/lore"); console.log("Readline-sync - NPM package used for async collection of user input"); - break; + break; + case "5": + var thing1 = [1,2,3,4,5,6,7,8,9]; + var thing2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + var thing3 = []; + while (thing3.length < 6) { + let randomPick = randomNumber(1,thing2.length); + thing3.push(thing2[randomPick]); + thing2.pop(randomPick); + } + console.log(thing2); + break; } function startGame() { // So far what I have is filler and testing, feel free to change. diff --git a/files/poiscreens.js b/files/poiscreens.js index 912bce5..a8d737a 100644 --- a/files/poiscreens.js +++ b/files/poiscreens.js @@ -463,6 +463,9 @@ function hub() { case "2": pauseScreen(); case "3": + trader(); + break; + case "4": enableRawMode(); console.clear(); break; @@ -478,6 +481,7 @@ function lostHills() { console.log("What would you like to do?"); console.log("1) Explore"); console.log("2) Open your PIP-Boy"); + console.log("3) Attempt to trade"); console.log("4) Leave"); let poiInput = userInput("Enter: "); switch(poiInput) { @@ -488,6 +492,9 @@ function lostHills() { case "2": pauseScreen(); case "3": + lostHillsStore(); + break; + case "4": enableRawMode(); console.clear(); break; diff --git a/files/shops.js b/files/shops.js index 2351eb6..f382073 100644 --- a/files/shops.js +++ b/files/shops.js @@ -2,20 +2,134 @@ import { randomNumber, userInput } from "./functions.js"; import "./variables.js"; // Inventories for the various shops, based of global item lists -// Most item prices in Raven Rock and Eureka are multiplied by 10, as they are using pre-war money var rrInv = [ + {item: supplyList[0], name: supplyList[0].name, price: supplyList[0].cost/10, amount: 1000}, + {item: supplyList[1], name: supplyList[1].name, price: supplyList[1].cost, amount: 100}, + {item: supplyList[2], name: supplyList[2].name, price: supplyList[2].cost, amount: 100}, + {item: supplyList[3], name: supplyList[3].name, price: supplyList[3].cost, amount: 100}, + {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[2].cost, amount: 10}, + {item: equipmentList[8], name: equipmentList[8].name, price: equipmentList[8].cost, amount: 10}, +]; +var vt0Inv = [ {item: supplyList[0], name: supplyList[0].name, price: supplyList[0].cost, amount: 1000}, {item: supplyList[1], name: supplyList[1].name, price: supplyList[1].cost*10, amount: 100}, {item: supplyList[2], name: supplyList[2].name, price: supplyList[2].cost*10, amount: 100}, {item: supplyList[3], name: supplyList[3].name, price: supplyList[3].cost*10, amount: 100}, - {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost*10, amount: 10}, - {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[1].cost*10, amount: 10}, - {item: equipmentList[8], name: equipmentList[8].name, price: equipmentList[2].cost*10, amount: 10}, + {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[2].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[3].name, price: equipmentList[3].cost, amount: 10}, + {item: equipmentList[4], name: equipmentList[4].name, price: equipmentList[4].cost, amount: 10}, + {item: equipmentList[5], name: equipmentList[5].name, price: equipmentList[5].cost, amount: 10}, + {item: equipmentList[8], name: equipmentList[8].name, price: equipmentList[8].cost, amount: 10}, + {item: equipmentList[9], name: equipmentList[9].name, price: equipmentList[9].cost, amount: 10}, + {item: equipmentList[11], name: equipmentList[11].name, price: equipmentList[11].cost, amount: 10}, +]; +var vegasInv = [ + {item: supplyList[0], name: supplyList[0].name, price: supplyList[0].cost, amount: 1000}, + {item: supplyList[1], name: supplyList[1].name, price: supplyList[1].cost, amount: 100}, + {item: supplyList[2], name: supplyList[2].name, price: supplyList[2].cost, amount: 100}, + {item: supplyList[3], name: supplyList[3].name, price: supplyList[3].cost, amount: 100}, + {item: supplyList[4], name: supplyList[4].name, price: supplyList[4].cost, amount: 100}, + {item: supplyList[5], name: supplyList[5].name, price: supplyList[5].cost, amount: 100}, + {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[2].cost, amount: 10}, + {item: equipmentList[3], name: equipmentList[3].name, price: equipmentList[3].cost, amount: 10}, + {item: equipmentList[4], name: equipmentList[4].name, price: equipmentList[4].cost, amount: 10}, + {item: equipmentList[5], name: equipmentList[5].name, price: equipmentList[5].cost, amount: 10}, + {item: equipmentList[9], name: equipmentList[9].name, price: equipmentList[9].cost, amount: 10}, + {item: equipmentList[11], name: equipmentList[11].name, price: equipmentList[11].cost, amount: 10}, +]; +var eurInv = [ + {item: supplyList[0], name: supplyList[0].name, price: supplyList[0].cost, amount: 1000}, + {item: supplyList[1], name: supplyList[1].name, price: supplyList[1].cost, amount: 100}, + {item: supplyList[2], name: supplyList[2].name, price: supplyList[2].cost, amount: 100}, + {item: supplyList[3], name: supplyList[3].name, price: supplyList[3].cost, amount: 100}, + {item: supplyList[4], name: supplyList[4].name, price: supplyList[4].cost, amount: 100}, + {item: supplyList[5], name: supplyList[5].name, price: supplyList[5].cost, amount: 100}, + {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[2].cost, amount: 10}, + {item: equipmentList[3], name: equipmentList[3].name, price: equipmentList[3].cost, amount: 10}, + {item: equipmentList[4], name: equipmentList[4].name, price: equipmentList[4].cost, amount: 10}, + {item: equipmentList[5], name: equipmentList[5].name, price: equipmentList[5].cost, amount: 10}, + {item: equipmentList[6], name: equipmentList[6].name, price: equipmentList[6].cost, amount: 10}, + {item: equipmentList[7], name: equipmentList[7].name, price: equipmentList[7].cost, amount: 10}, + {item: equipmentList[9], name: equipmentList[9].name, price: equipmentList[9].cost, amount: 10}, + {item: equipmentList[11], name: equipmentList[11].name, price: equipmentList[12].cost, amount: 10}, + {item: equipmentList[12], name: equipmentList[12].name, price: equipmentList[12].cost, amount: 10}, +]; +var traderInv = [ + [ // Tier 1 + {item: supplyList[0], name: supplyList[0].name, price: supplyList[0].cost/10, amount: 1000}, + {item: supplyList[1], name: supplyList[1].name, price: supplyList[1].cost, amount: 100}, + {item: supplyList[2], name: supplyList[2].name, price: supplyList[2].cost, amount: 100}, + {item: supplyList[3], name: supplyList[3].name, price: supplyList[3].cost, amount: 100}, + {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost, amount: 10}, + {item: equipmentList[1], name: equipmentList[1].name, price: equipmentList[1].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[2].cost, amount: 10}, + {item: equipmentList[3], name: equipmentList[3].name, price: equipmentList[3].cost, amount: 10}, + {item: equipmentList[8], name: equipmentList[8].name, price: equipmentList[8].cost, amount: 10}, + ], + [ // Tier 2 + {item: supplyList[0], name: supplyList[0].name, price: supplyList[0].cost, amount: 1000}, + {item: supplyList[1], name: supplyList[1].name, price: supplyList[1].cost, amount: 100}, + {item: supplyList[2], name: supplyList[2].name, price: supplyList[2].cost, amount: 100}, + {item: supplyList[3], name: supplyList[3].name, price: supplyList[3].cost, amount: 100}, + {item: supplyList[4], name: supplyList[4].name, price: supplyList[4].cost, amount: 100}, + {item: supplyList[5], name: supplyList[5].name, price: supplyList[5].cost, amount: 100}, + {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[2].cost, amount: 10}, + {item: equipmentList[3], name: equipmentList[3].name, price: equipmentList[3].cost, amount: 10}, + {item: equipmentList[4], name: equipmentList[4].name, price: equipmentList[4].cost, amount: 10}, + {item: equipmentList[5], name: equipmentList[5].name, price: equipmentList[5].cost, amount: 10}, + {item: equipmentList[9], name: equipmentList[9].name, price: equipmentList[9].cost, amount: 10}, + {item: equipmentList[11], name: equipmentList[11].name, price: equipmentList[11].cost, amount: 10}, + ], + [ // Tier 3 + {item: supplyList[0], name: supplyList[0].name, price: supplyList[0].cost, amount: 1000}, + {item: supplyList[1], name: supplyList[1].name, price: supplyList[1].cost, amount: 100}, + {item: supplyList[2], name: supplyList[2].name, price: supplyList[2].cost, amount: 100}, + {item: supplyList[3], name: supplyList[3].name, price: supplyList[3].cost, amount: 100}, + {item: supplyList[4], name: supplyList[4].name, price: supplyList[4].cost, amount: 100}, + {item: supplyList[5], name: supplyList[5].name, price: supplyList[5].cost, amount: 100}, + {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[2].cost, amount: 10}, + {item: equipmentList[3], name: equipmentList[3].name, price: equipmentList[3].cost, amount: 10}, + {item: equipmentList[4], name: equipmentList[4].name, price: equipmentList[4].cost, amount: 10}, + {item: equipmentList[5], name: equipmentList[5].name, price: equipmentList[5].cost, amount: 10}, + {item: equipmentList[6], name: equipmentList[6].name, price: equipmentList[6].cost, amount: 10}, + {item: equipmentList[7], name: equipmentList[7].name, price: equipmentList[7].cost, amount: 10}, + {item: equipmentList[9], name: equipmentList[9].name, price: equipmentList[9].cost, amount: 10}, + {item: equipmentList[11], name: equipmentList[11].name, price: equipmentList[12].cost, amount: 10}, + {item: equipmentList[12], name: equipmentList[12].name, price: equipmentList[12].cost, amount: 10}, + ] +]; +var tempTraderInv = []; +var whitespringInv = [ + {item: supplyList[0], name: supplyList[0].name, price: supplyList[0].cost/10, amount: 1000}, + {item: supplyList[1], name: supplyList[1].name, price: supplyList[1].cost, amount: 100}, + {item: supplyList[2], name: supplyList[2].name, price: supplyList[2].cost, amount: 100}, + {item: supplyList[3], name: supplyList[3].name, price: supplyList[3].cost, amount: 100}, + {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost, amount: 10}, + {item: equipmentList[1], name: equipmentList[1].name, price: equipmentList[1].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[2].cost, amount: 10}, + {item: equipmentList[3], name: equipmentList[3].name, price: equipmentList[3].cost, amount: 10}, + {item: equipmentList[8], name: equipmentList[8].name, price: equipmentList[8].cost, amount: 10}, +]; +var lostHillsInv = [ + {item: supplyList[0], name: supplyList[0].name, price: supplyList[0].cost, amount: 1000}, + {item: supplyList[1], name: supplyList[1].name, price: supplyList[1].cost, amount: 100}, + {item: supplyList[2], name: supplyList[2].name, price: supplyList[2].cost, amount: 100}, + {item: supplyList[3], name: supplyList[3].name, price: supplyList[3].cost, amount: 100}, + {item: supplyList[4], name: supplyList[4].name, price: supplyList[4].cost, amount: 100}, + {item: equipmentList[0], name: equipmentList[0].name, price: equipmentList[0].cost, amount: 10}, + {item: equipmentList[2], name: equipmentList[2].name, price: equipmentList[2].cost, amount: 10}, + {item: equipmentList[4], name: equipmentList[4].name, price: equipmentList[4].cost, amount: 10}, + {item: equipmentList[5], name: equipmentList[5].name, price: equipmentList[5].cost, amount: 10}, + {item: equipmentList[6], name: equipmentList[6].name, price: equipmentList[6].cost, amount: 10}, + {item: equipmentList[7], name: equipmentList[7].name, price: equipmentList[7].cost, amount: 10}, + {item: equipmentList[12], name: equipmentList[12].name, price: equipmentList[12].cost, amount: 10}, ]; -var vt0Inv = []; -var vegasInv = []; // A mix of gunrunners, mick&ralphs, and followers -var eurInv = []; -var traderInv = []; export function ravenRockStore() { while (true) { @@ -24,7 +138,7 @@ export function ravenRockStore() { console.log("Name | Price (PW Money) | Amount in stock"); console.log("-----------------------------------------------------"); for (var i = 0; i < rrInv.length; i++) { - console.log(i+"). " + rrInv[i].name + " | " + rrInv[i].price + " | " + rrInv[i].amount); + console.log(i+"). " + rrInv[i].name + " | " + rrInv[i].price*10 + " | " + rrInv[i].amount); } console.log("-----------------------------------------------------"); console.log("You have " + preWarMoney + " pre-war money."); @@ -41,12 +155,12 @@ export function ravenRockStore() { console.log("Not enough stock."); userInput("[Enter]"); break; - } else if (itemAmt * rrInv[itemNum].price > preWarMoney) { + } else if (itemAmt * rrInv[itemNum].price*10 > preWarMoney) { console.log("Not enough money."); userInput("[Enter]"); break; } else { - preWarMoney -= itemAmt * rrInv[itemNum].price; + preWarMoney -= itemAmt * rrInv[itemNum].price*10; rrInv[itemNum].amount -= itemAmt; console.log("You bought " + itemAmt + " " + rrInv[itemNum].name + "(s)."); console.log("You have " + preWarMoney + " pre-war money left."); @@ -161,7 +275,7 @@ export function eurekaStore() { console.log("Name | Price (PW Money) | Amount in stock"); console.log("-----------------------------------------------------"); for (var i = 0; i < eurInv.length; i++) { - console.log(i+"). " + eurInv[i].item + " | " + eurInv[i].price + " | " + eurInv[i].amount); + console.log(i+"). " + eurInv[i].item + " | " + eurInv[i].price*10 + " | " + eurInv[i].amount); } console.log("-----------------------------------------------------"); console.log("You have " + preWarMoney + " pre-war money."); @@ -177,11 +291,11 @@ export function eurekaStore() { if (itemAmt > eurInv[itemNum].amount) { console.log("Not enough stock."); break; - } else if (itemAmt * eurInv[itemNum].price > preWarMoney) { + } else if (itemAmt * eurInv[itemNum].price*10 > preWarMoney) { console.log("Not enough money."); break; } else { - preWarMoney -= itemAmt * eurInv[itemNum].price; + preWarMoney -= itemAmt * eurInv[itemNum].price*10; eurInv[itemNum].amount -= itemAmt; console.log("You bought " + itemAmt + " " + eurInv[itemNum].item + "(s)."); console.log("You have " + preWarMoney + " pre-war money left."); @@ -198,98 +312,37 @@ export function eurekaStore() { } } -export function trader() { // Picks a selection of items from a global trader inventory, used for misc area shops - var tempTraderInv = []; - for (var a = 0; a <= 2; a++) { - let randomPick = randomNumber() - tempTraderInv.push(traderInv[1]); - console.log(randomPick); - } - console.log(tempTraderInv); - +export function lostHillsStore() { while (true) { console.clear(); - console.log("You attempt to trade with a local trader, this is thier selection."); + console.log("Brotherhood of Steel Requisition System - Lost Hills"); console.log("Name | Price (Caps) | Amount in stock"); console.log("-----------------------------------------------------"); - for (var i = 0; i < Inv.length; i++) { - console.log(i+"). " + rrInv[i].item + " | " + rrInv[i].price + " | " + rrInv[i].amount); + for (var i = 0; i < lostHillsInv.length; i++) { + console.log(i+"). " + lostHillsInv[i].item + " | " + lostHillsInv[i].price + " | " + lostHillsInv[i].amount); } console.log("-----------------------------------------------------"); - console.log("You have " + preWarMoney + " pre-war money."); + console.log("You have " + caps + " caps."); console.log("What would you like to do?"); console.log("1) Buy supplies"); console.log("2) Leave shop"); - var rrInput = userInput("Enter: "); - switch(rrInput) { + var lostHillsInput = userInput("Enter: "); + switch(lostHillsInput) { case "1": console.log("What would you like to buy?"); let itemNum = userInput("Enter item number: "); let itemAmt = userInput("Enter amount: "); - if (itemAmt > rrInv[itemNum].amount) { + if (itemAmt > lostHillsInv[itemNum].amount) { console.log("Not enough stock."); break; - } else if (itemAmt * rrInv[itemNum].price > preWarMoney) { + } else if (itemAmt * lostHillsInv[itemNum].price > caps) { console.log("Not enough money."); break; } else { - preWarMoney -= itemAmt * rrInv[itemNum].price; - rrInv[itemNum].amount -= itemAmt; - console.log("You bought " + itemAmt + " " + rrInv[itemNum].item + "(s)."); - console.log("You have " + preWarMoney + " pre-war money left."); - console.log("Press enter to continue..."); - userInput("[Enter]"); - } - break; - case "2": - console.log("Leaving shop..."); - return true; - break; - default: - console.log("Invalid input, try again."); - } - } -} - -export function genericBOSStore(poiName) { // Picks a selection of items from a global trader inventory, used for misc area shops - var tempTraderInv = []; - for (var a = 0; a <= 2; a++) { - let randomPick = randomNumber() - tempTraderInv.push(traderInv[1]); - console.log(randomPick); - } - console.log(tempTraderInv); - - while (true) { - console.clear(); - console.log("Brotherhood of Steel Requisition System - "+poiName); - console.log("Name | Price (Caps) | Amount in stock"); - console.log("-----------------------------------------------------"); - for (var i = 0; i < Inv.length; i++) { - console.log(i+"). " + rrInv[i].item + " | " + rrInv[i].price + " | " + rrInv[i].amount); - } - console.log("-----------------------------------------------------"); - console.log("You have " + preWarMoney + " pre-war money."); - console.log("What would you like to do?"); - console.log("1) Buy supplies"); - console.log("2) Leave shop"); - var rrInput = userInput("Enter: "); - switch(rrInput) { - case "1": - console.log("What would you like to buy?"); - let itemNum = userInput("Enter item number: "); - let itemAmt = userInput("Enter amount: "); - if (itemAmt > rrInv[itemNum].amount) { - console.log("Not enough stock."); - break; - } else if (itemAmt * rrInv[itemNum].price > preWarMoney) { - console.log("Not enough money."); - break; - } else { - preWarMoney -= itemAmt * rrInv[itemNum].price; - rrInv[itemNum].amount -= itemAmt; - console.log("You bought " + itemAmt + " " + rrInv[itemNum].item + "(s)."); - console.log("You have " + preWarMoney + " pre-war money left."); + caps -= itemAmt * lostHillsInv[itemNum].price; + lostHillsInv[itemNum].amount -= itemAmt; + console.log("You bought " + itemAmt + " " + lostHillsInv[itemNum].item + "(s)."); + console.log("You have " + caps + " caps left."); console.log("Press enter to continue..."); userInput("[Enter]"); } @@ -309,30 +362,30 @@ export function whitespringStore() { console.log("Welcome to the Whitespring Mall. Selection pulls from all vendors.") console.log("Name | Price (Caps) | Amount in stock"); console.log("-----------------------------------------------------"); - for (var i = 0; i < vt0InvInv.length; i++) { - console.log(i+"). " + vt0InvInv[i].item + " | " + vtInv[i].price + " | " + vtInv[i].amount); + for (var i = 0; i < whitespringInv.length; i++) { + console.log(i+"). " + whitespringInv[i].item + " | " + whitespringInv[i].price + " | " + whitespringInv[i].amount); } console.log("-----------------------------------------------------"); console.log("You have " + caps + " caps."); console.log("What would you like to do?"); console.log("1) Buy supplies"); console.log("2) Leave shop"); - var vt0Input = userInput("Enter: "); - switch(vt0Input) { + var whitespringInput = userInput("Enter: "); + switch(whitespringInput) { case "1": console.log("What would you like to buy?"); let itemNum = userInput("Enter item number: "); let itemAmt = userInput("Enter amount: "); - if (itemAmt > vt0Inv[itemNum].amount) { + if (itemAmt > whitespringInv[itemNum].amount) { console.log("Not enough stock."); break; - } else if (itemAmt * vt0Inv[itemNum].price > caps) { + } else if (itemAmt * whitespringInvv[itemNum].price > caps) { console.log("Not enough money."); break; } else { - caps -= itemAmt * vt0Inv[itemNum].price; - rrInv[itemNum].amount -= itemAmt; - console.log("You bought " + itemAmt + " " + vt0Inv[itemNum].item + "(s)."); + caps -= itemAmt * whitespringInv[itemNum].price; + whitespringInv[itemNum].amount -= itemAmt; + console.log("You bought " + itemAmt + " " + whitespringInv[itemNum].item + "(s)."); console.log("You have " + caps + " caps left."); console.log("Press enter to continue..."); userInput("[Enter]"); @@ -345,4 +398,95 @@ export function whitespringStore() { console.log("Invalid input, try again."); } } +} + +// The Trader System + +// traderLock: Prevents the player from regerating the trader's inventory before they leave the POI/Encounter +// traderInv: The global trader inventory, has a set of items for each tier of gear, pulled from the global item lists +// tempTraderInv: An array of items that the trader, when encountered, will be able to pull from for thier stock +// trader(): Called when a player barters with a trader. Fist checks to see if traderLock is false, then sets it to true. +// Then uses the tier parameter to determine which inventory to pull from. +// It then places the respective tier of equipment into the tempTraderInv array. +// The trader now randomly picks 5 items from the tempTraderInv array and places them into tempTraderStock. +// Had traderLock been true, the trader would present the previously generated stock. +// Trader then uses the same system as the other stores to allow the player to buy and view items but with a custom message +// The message is passed in as a parameter, and is displayed at the top of the trader menu. + +global.traderLock = false; +export function trader(tier, message) { + if (traderLock == false) { + traderLock = true; + var tempTraderStock = []; + var tempTraderInv = []; + switch(tier) { + case "1": + tempTraderInv = traderInv[0]; + for (var a = 0; a <= 5; a++) { + let randomPick = randomNumber(); + tempTraderStock.push(tempTraderInv[randomPick]); + tempTraderInv.pop[randomPick]; + } + break; + case "2": + tempTraderInv = traderInv[0]; + for (var a = 0; a <= 5; a++) { + let randomPick = randomNumber(); + tempTraderStock.push(tempTraderInv[randomPick]); + tempTraderInv.pop[randomPick]; + } + break; + case "3": + tempTraderInv = traderInv[0]; + for (var a = 0; a <= 5; a++) { + let randomPick = randomNumber(); + tempTraderStock.push(tempTraderInv[randomPick]); + tempTraderInv.pop[randomPick]; + } + break; + } + } + + while (true) { + console.clear(); + console.log(message); + console.log("Name | Price (Caps) | Amount in stock"); + console.log("-----------------------------------------------------"); + for (var i = 0; i < tempTraderInv.length; i++) { + console.log(i+1+"). " + tempTraderInv[i].item + " | " + tempTraderInv[i].price + " | " + tempTraderInv[i].amount); + } + console.log("-----------------------------------------------------"); + console.log("You have " + caps + " caps."); + console.log("What would you like to do?"); + console.log("1) Buy supplies"); + console.log("2) Leave shop"); + var rrInput = userInput("Enter: "); + switch(rrInput) { + case "1": + console.log("What would you like to buy?"); + let itemNum = userInput("Enter item number: "); + let itemAmt = userInput("Enter amount: "); + if (itemAmt > tempBOSStock[itemNum].amount) { + console.log("Not enough stock."); + break; + } else if (itemAmt * tempBOSStock[itemNum].price > caps) { + console.log("Not enough money."); + break; + } else { + preWarMoney -= itemAmt * tempBOSStock[itemNum].price; + tempBOSStock[itemNum].amount -= itemAmt; + console.log("You bought " + itemAmt + " " + tempBOSStock[itemNum].item + "(s)."); + console.log("You have " + caps + " caps left."); + console.log("Press enter to continue..."); + userInput("[Enter]"); + } + break; + case "2": + console.log("Leaving shop..."); + return true; + break; + default: + console.log("Invalid input, try again."); + } + } } \ No newline at end of file diff --git a/files/variables.js b/files/variables.js index cca617b..3ced373 100644 --- a/files/variables.js +++ b/files/variables.js @@ -59,11 +59,17 @@ global.equipmentList = [ // Equipment: weapons, armor, tools // Energy Resistant Armor {name: "Leather Armor", description: "A set of leather armor, good protection from laser weapons.", type: "armor", resistances: {balistic: 2, slash: 2, laser: 5, plasma: 3}, unit: "dr", cost: 5, weight: 5}, - {name: "Combat Armor", description: "A ser of combat armor, great protection from laser and plasma weapons.", type: "armor", resistances: {balistic: 5, slash: 5, laser: 10, plasma: 10}, unit: "dr", cost: 5, weight: 5}, + {name: "Sturdy Leather Armor", description: "A set of combat armor, better protection from laser and plasma weapons.", type: "armor", resistances: {balistic: 5, slash: 5, laser: 10, plasma: 10}, unit: "dr", cost: 5, weight: 5}, // Ballistic Resistant Armor {name: "Raider Armor", description: "A set of raider armor, good protection from balistic damage.", type: "armor", resistances: {balistic: 5, slash: 3, laser: 2, plasma: 2}, unit: "dr", cost: 5, weight: 5}, - {name: "Metal Armor" , description: "A set of raider armor, good protection from ballistic and slash damage.", type: "armor", resistances: {balistic: 10, slash: 10, laser: 5, plasma: 5}, unit: "dr", cost: 5, weight: 5}, + {name: "Metal Armor" , description: "A set of raider armor, better protection from ballistic and slash damage.", type: "armor", resistances: {balistic: 10, slash: 10, laser: 5, plasma: 5}, unit: "dr", cost: 5, weight: 5}, + + // Tier 3 Armor + {name: "Combat Armor", description: "A set of combat armor, better protection from all damage types.", type: "armor", resistances: {balistic: 10, slash: 10, laser: 10, plasma: 10}, unit: "dr", cost: 5, weight: 5}, + {name: "Centurion Armor", description: "A set of Centurion armor, great protection from ballistic damage.", type: "armor", value: "5", unit: "dr",cost: 25, weight: 25}, + {name: "NCR Ranger Armor" , description: "A set of NCR Ranger armor, great protection from laser and plasma weapons", type: "armor", value: "5", unit: "dr",cost: 30, weight: 30}, + // Non-specialized Power Armor {name: "T-45 Power Armor", description: "A set of T-45 Power Armor, protects against all damage types.", type: "parmor", resistances: {balistic: 15, slash: 15, laser: 15, plasma: 15}, unit: "dt", cost: 5, weight: 5}, @@ -83,10 +89,6 @@ global.equipmentList = [ // Equipment: weapons, armor, tools // Special Armor {name: "Chinese Stealth Suit", description: "Chinese Stealth Suit, +25% Chance to skip encounter if worn", type: "uarmor", value: "5", unit: "dr",cost: 20, weight: 20}, {name: "Excavator Power Armor", description: "Excavator Power Armor, +25% Chance to find extra loot", type: "parmor", resistances: {balistic: 5, slash: 5, laser: 5, plasma: 5}, unit: "dt", cost: 5, weight: 5}, - - // Even MORE Specialer Armor - {name: "Centurion Armor", description: "A set of Centurion armor, made for you", type: "armor", value: "5", unit: "dr",cost: 25, weight: 25}, - {name: "NCR Ranger Armor" , description: "A set of NCR Ranger armor, standard issue", type: "armor", value: "5", unit: "dr",cost: 30, weight: 30}, ]; global.achievements = [