diff --git a/README.md b/README.md index 68d4b28..60f4fc9 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,39 @@ # oppwars -A satirical take on drug wars, except you are a police officer. +Text-based RPG heavily inspired by the old BBS game *Legend of the Red Dragon* but modern and single player. -The irony is that you do the same stuff. +You can play this in any terminal on Linux, macOS and Windows. -Features: -- Buy Drugs. -- Purchase Whores / Fuck Whores. -- Buy Condoms. -- Diseases. -- Beat up homeless people. +Instead of a being a knight, you play as a cop in a city that's actively trying to kill you. You beat up homeless people, manage a Karma system (Paragon vs. Renegade), use drugs to get stat buffs, and have sexual relations with hookers to restore health. + +## Classes + +**1. The Robot** 🤖 +You have no empathy mechanics. You interpret the law literally. It's basically *RoboCop* logic—if they are loitering, they must be neutralized. + +**2. The Psychic** 🔮 +You were recruited and engineered as a kid, now you can fire psychic blasts with your mind, but you suffer from mental instability. + +**3. The Psychopath** 🔪 +You get bonuses for eating people. You aren't really interested in arresting people; you just like the ***taste*** of justice. This class excels at using violence to restore health. + +## Features +- Drugs: Increase XP gain, attack power or rewards from combat. +- Hookers: Fuck to regain health. Buy to earn an income. +- Condoms: Protect your sexual health and prevent unwanted kids. +- Combat: Beat up homeless people to earn cash and experience points. + +## Drug Manual +- Cocaine: Boosts XP gain. +- Fentanyl: Boosts Attack power. +- LSD: Not implemented - Just costs money. + +## Screenshots ![Screenshot Zero](screenshot0.avif) ![Screenshot One](screenshot1.avif) ![Screenshot Two](screenshot2.avif) +## Special Thanks + Props go out to [Lipgloss](https://github.com/charmbracelet/lipgloss) \ No newline at end of file diff --git a/classSelect.txt b/classSelect.txt new file mode 100644 index 0000000..72e0b20 --- /dev/null +++ b/classSelect.txt @@ -0,0 +1,7 @@ +=== Character Class Selection === + +What is your fondest memory? + +(1) Setting kittens on fire and torturing wildlife during childhood. +(2) Being raised by the Government to be a psionic assasin. +(3) Getting rebuilt into a ruthless killing machine after a tragic death. diff --git a/intro.txt b/intro.txt new file mode 100644 index 0000000..ec75059 --- /dev/null +++ b/intro.txt @@ -0,0 +1,12 @@ +You are a Constable, fresh out of high school and eager to make a name for +yourself in the Village of Burk's Falls as a new recruit for the OPP. + +Your captain, a gruff mother fucker named Staff Sergeant Grimstead, +calls you into his office. + +He lifts his head out of a pile of cocaine. + +"Rookie, I've got a few things to show you. This is where the real +money's made around here." + +He hands you a folder containing your badge number. \ No newline at end of file diff --git a/levels/randomEvent1.txt b/levels/randomEvent1.txt new file mode 100644 index 0000000..d5bc368 --- /dev/null +++ b/levels/randomEvent1.txt @@ -0,0 +1,8 @@ +You receive a call on your radio from a fellow officer who needs your help. + +"I got this degenerate transvestite who just served his boss with legal papers." you hear over the radio. + +What should they do? + +(1) Arrest the degenerate. +(2) Do nothing, it is for the courts to decide. diff --git a/levels/randomEvent2.txt b/levels/randomEvent2.txt new file mode 100644 index 0000000..8dc172d --- /dev/null +++ b/levels/randomEvent2.txt @@ -0,0 +1,10 @@ +You pull over a speeding car that was driving recklessly. + +The driver is a well known conservative poltician, who is visibly intoxicated and has an open container. + +There are also tire marks and a "stop sign" laying flat on the ground. + +He immediately offers you a large sum of cash to "forget this ever happened" and threatens your career if you don't. + +(1) Take the $500 and cocaine. +(2) Write him a ticket. \ No newline at end of file diff --git a/levels/randomEvent3.txt b/levels/randomEvent3.txt new file mode 100644 index 0000000..075ed31 --- /dev/null +++ b/levels/randomEvent3.txt @@ -0,0 +1,10 @@ +You are assigned to clear a peaceful but non-compliant protest blocking the entry to a foreclosed apartment complex. + +The protesters are local families being displaced. They are not violent, but their actions are delaying the official eviction process. + +The crowd will only move if you take action. What do you do? + +(1) Gas the crowd. +(2) Start arresting people. +(3) Talk with people and discuss their options. +(4) Call a team of mental health professionals and case workers. \ No newline at end of file diff --git a/levels/randomEvent4.txt b/levels/randomEvent4.txt new file mode 100644 index 0000000..a349814 --- /dev/null +++ b/levels/randomEvent4.txt @@ -0,0 +1,8 @@ +A shadowy figure in the bathroom slips you a note: + +"Grimstead is stashing product at the docks. Tonight." + +What do you do about it? + +(1) Steal the product. +(2) Report it to internal affairs. \ No newline at end of file diff --git a/levels/randomEvent5.txt b/levels/randomEvent5.txt new file mode 100644 index 0000000..b521bc2 --- /dev/null +++ b/levels/randomEvent5.txt @@ -0,0 +1,7 @@ +While processing a minor theft scene at an abandoned warehouse, you find +a hidden, unmarked briefcase containing a large sum of untraceable, clean +cash (enough to pay off your mortgage and then some). No one else knows +it's there, and the original owner is not the one who reported the theft. + +(1) Take the cash. +(2) File the briefcase as evidence. diff --git a/main.go b/main.go index d3bde50..7e360a5 100644 --- a/main.go +++ b/main.go @@ -42,6 +42,24 @@ var hitTheStreets string //go:embed levels/doctorsRoom.txt var doctorsRoom string +//go:embed levels/randomEvent1.txt +var randomEvent1 string + +//go:embed levels/randomEvent2.txt +var randomEvent2 string + +//go:embed levels/randomEvent3.txt +var randomEvent3 string + +//go:embed levels/randomEvent4.txt +var randomEvent4 string + +//go:embed levels/randomEvent5.txt +var randomEvent5 string + +//go:embed classSelect.txt +var classSelect string + // =-=-=-=-=-=-= End File String Embeds =-=-=-=-=-=-= // Game Variables - Core Gameplay @@ -49,21 +67,37 @@ var stats string // variable for stats generation output var statsCombat string // variable used for combat stats generation during fights var PlayerName string // player's name... var condoms = 0 // its better to have them and not need them -var std = false // what happens if you have connies +var infections = 0 // what happens if you don't have connies var money = 1800 // not specific currency var days = 30 // total number of days (default 30) var experience = 0 // your experience from combat battle fights (starts at 0) var level = 1 // your level from combat battle fights (starts at 1) -var whores = 0 // number of sex slaves you own +var hookers = 0 // number of sex slaves you own var cocaines = 0 // cocaine in 1/gram units var fentanyl = 0 // fentanyl in 500 miligram units var LSD = 0 // LSD in pills var bumfights = 25 // default number of homeless bum fights per day -const bumfightsTotal = 25 // total bumfights +const bumfightsTotal = 25 // total bumfights used to reset bum fights per day const taxes = 500 // skimming off the top -var childsupport = 0 // if you get a hoe preggers +var offspring = 0 // number of children you have by default +var childsupport = 0 // default 0 but changes if you get a hoe preggers + +// Character Stats + +var playerHP = 200 // default hit points for the player +var attack = 40 // default attack strength +var paragonRank = 0 // default goodness rank +var renegadeRank = 0 // default evil rank + +// character classes +var classTerminator = false // the robot warrior class +var classPsionic = false // the psionic magic class +var classPower = 1 // default starter psionic power +var classPsychopath = false // the psychopath torture class + +// Props to Lipgloss! +// These are colour and border styles for the game dialogs. -// Lipgloss - Props to var border = lipgloss.NewStyle(). BorderStyle(lipgloss.NormalBorder()). BorderForeground(lipgloss.Color("63")) @@ -82,13 +116,37 @@ var storyStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("#ffffffff ")). Background(lipgloss.Color("#0000FF")) +var propertyStyle = lipgloss.NewStyle(). + BorderStyle(lipgloss.NormalBorder()). + Width(75). + BorderForeground(lipgloss.Color("228")). + BorderBackground(lipgloss.Color("#5023aaff")). + Foreground(lipgloss.Color("#ffffffff ")). + Background(lipgloss.Color("#5023aaff")) + var slutStyle = lipgloss.NewStyle(). BorderStyle(lipgloss.NormalBorder()). Width(75). BorderForeground(lipgloss.Color("228")). BorderBackground(lipgloss.Color("#ff00a2ff")). - Foreground(lipgloss.Color("#ffffffff ")). - Background(lipgloss.Color("#ff00a2ff")) + Background(lipgloss.Color("#ffffffff ")). + Foreground(lipgloss.Color("#ff00a2ff")) + +var eventStyle = lipgloss.NewStyle(). + BorderStyle(lipgloss.NormalBorder()). + Width(75). + BorderForeground(lipgloss.Color("#0d7021ff")). + BorderBackground(lipgloss.Color("#0d7021ff")). + Background(lipgloss.Color("#0d7021ff ")). + Foreground(lipgloss.Color("#ffffffff")) + +var classSelectStyle = lipgloss.NewStyle(). + BorderStyle(lipgloss.NormalBorder()). + Width(75). + BorderForeground(lipgloss.Color("#0a72aaff")). + BorderBackground(lipgloss.Color("#0a72aaff")). + Background(lipgloss.Color("#0a72aaff")). + Foreground(lipgloss.Color("#ffffffff")) var statsStyle = lipgloss.NewStyle(). BorderStyle(lipgloss.NormalBorder()). @@ -98,12 +156,15 @@ var statsStyle = lipgloss.NewStyle(). var red = lipgloss.NewStyle(). Foreground(lipgloss.Color("#f20b0bff")) +var superColour = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#c6d007ff")) + var green = lipgloss.NewStyle(). - Foreground(lipgloss.Color("#18e60aff ")) + Foreground(lipgloss.Color("#13820bff ")) // why the fuck does golang not do this - should work on win10/11 (yes it does support ansi escape codes *now*) func ClearScreen() { - fmt.Print("\033[H\033[2J") + fmt.Print("\033[H\033[2J") // this does appear to work on windows pe liveiso from win11 (tested in qemu) } // Cool stylized Enter key masher @@ -112,68 +173,349 @@ func MashEnterKey() { bufio.NewReader(os.Stdin).ReadBytes('\n') } -func breakRoom() { - fmt.Println("Not Implemented") - MainMachine() +func RandomEvent() { + eventSelection := rand.IntN(5) + switch eventSelection { + case 1: + outerLoop1: + for { + fmt.Println(eventStyle.Render(randomEvent1)) + fmt.Println("Your choice,") + fmt.Print(green.Render(PlayerName), ">") + choice := 0 + fmt.Scan(&choice) + switch choice { + case 1: + renegadeRank = renegadeRank + 1 + paragonRank = paragonRank - 1 + break outerLoop1 + case 2: + paragonRank = paragonRank + 1 + renegadeRank = renegadeRank - 1 + break outerLoop1 + default: + fmt.Println("Invalid Choice, Fool!") + MashEnterKey() + } + } + case 2: + outerLoop2: + for { + fmt.Println(eventStyle.Render(randomEvent2)) + fmt.Println("Your choice,") + fmt.Print(green.Render(PlayerName), ">") + choice := 0 + fmt.Scan(&choice) + switch choice { + case 1: + renegadeRank = renegadeRank + 1 + paragonRank = paragonRank - 1 + money = money + 500 + cocaines = cocaines + 2 + break outerLoop2 + case 2: + paragonRank = paragonRank + 1 + renegadeRank = renegadeRank - 1 + break outerLoop2 + default: + fmt.Println("Invalid Choice, Fool!") + MashEnterKey() + } + } + case 3: + outerLoop3: + for { + fmt.Println(eventStyle.Render(randomEvent3)) + fmt.Println("Your choice,") + fmt.Print(green.Render(PlayerName), ">") + choice := 0 + fmt.Scan(&choice) + switch choice { + case 1: + renegadeRank = renegadeRank + 2 + paragonRank = paragonRank - 2 + break outerLoop3 + case 2: + renegadeRank = renegadeRank + 1 + paragonRank = paragonRank - 1 + break outerLoop3 + case 3: + paragonRank = paragonRank + 1 + renegadeRank = renegadeRank - 1 + break outerLoop3 + case 4: + paragonRank = paragonRank + 2 + renegadeRank = renegadeRank - 2 + break outerLoop3 + default: + fmt.Println("Invalid Choice, Fool!") + MashEnterKey() + } + } + case 4: + outerLoop4: + for { + fmt.Println(eventStyle.Render(randomEvent4)) + fmt.Println("Your choice,") + fmt.Print(green.Render(PlayerName), ">") + choice := 0 + fmt.Scan(&choice) + switch choice { + case 1: + renegadeRank = renegadeRank + 1 + paragonRank = paragonRank - 1 + fentanyl = fentanyl + 2 + break outerLoop4 + case 2: + paragonRank = paragonRank + 2 + renegadeRank = renegadeRank - 2 + break outerLoop4 + default: + fmt.Println("Invalid Choice, Fool!") + MashEnterKey() + } + } + case 5: + outerLoop5: + for { + fmt.Println(eventStyle.Render(randomEvent5)) + fmt.Println("Your choice,") + fmt.Print(green.Render(PlayerName), ">") + choice := 0 + fmt.Scan(&choice) + switch choice { + case 1: + renegadeRank = renegadeRank + 1 + paragonRank = paragonRank - 1 + money = money + 1000 + break outerLoop5 + case 2: + paragonRank = paragonRank + 1 + renegadeRank = renegadeRank - 1 + break outerLoop5 + default: + fmt.Println("Invalid Choice, Fool!") + MashEnterKey() + } + } + } +} + +func ClassSelection() { +classLoop: + for { + ClearScreen() + fmt.Println(classSelectStyle.Render(classSelect)) + fmt.Println("Your choice,") + fmt.Print(green.Render(PlayerName), ">") + choice := 0 + fmt.Scan(&choice) + switch choice { + case 1: + classPsychopath = true + break classLoop + case 2: + classPsionic = true + break classLoop + case 3: + classTerminator = true + break classLoop + default: + fmt.Println("Incorrect Selection") + MashEnterKey() + } + } } func HitTheStreets() { ClearScreen() - i := 0 choice := "" - for i < 1 { - ClearScreen() - CombatStats() - fmt.Println(storyStyle.Render(hitTheStreets)) - fmt.Println(statsStyle.Render(statsCombat)) - fmt.Println("Your choice,") - fmt.Print(green.Render(PlayerName), ">") - fmt.Scan(&choice) - if strings.ToUpper(choice) == "B" { + bumHP := 100 + i := 1 +hitLoop: + for bumHP >= 0 { + for i > 0 { ClearScreen() - fmt.Println(storyStyle.Render("Bum Fight!")) - fmt.Println() - fmt.Println("You encounter a ", red.Render("homeless piece of shit!")) - fmt.Println("") - fmt.Println("What do you do?") - fmt.Println("") - CombatStats() - fmt.Println(border.Render(statsCombat)) - fmt.Println("(A)ttack") - fmt.Println("(E)scape") - homelessPunch := "" - fmt.Scan(&homelessPunch) - if strings.ToUpper(homelessPunch) == "A" { - chance := rand.IntN(100) - if chance > 40 { - ClearScreen() - fmt.Println("You just hit the homeless bum with your police baton, it cracked his skull!") - fmt.Println("You sprinkle some crack on him and move along.") + switch paragonRank { + case 10: // when paragonRank reaches 10 we give a 25% chance to get shot for being a good cop + isThereRandomGoodPunishment := rand.IntN(4) + switch isThereRandomGoodPunishment { + case 1: + gangsterShot := 50 * level + fmt.Println(eventStyle.Render("Your recent string of high-profile good deeds within your department has turned them against you.")) + fmt.Println("") MashEnterKey() - experience = experience + 250 - money = money + 20 - bumfights = bumfights - 1 - i = 0 - } else { - ClearScreen() - fmt.Println(red.Render("You missed, and he got away!")) - fmt.Println() - fmt.Println("Perhaps you should lay off the donuts...") - bumfights = bumfights - 1 + fmt.Println(eventStyle.Render("A gang of drug dealers are unleashed upon you by Captain Grimstead himself!")) + fmt.Println(red.Render("They drive by in a noisy Cadillac spraying bullets in your direction. You get shot for "), gangsterShot, red.Render(" HP!")) + playerHP = playerHP - gangsterShot MashEnterKey() - i = 0 } - } else { - fmt.Println("You escape successfully.") - bumfights = bumfights - 1 - MashEnterKey() - i = 0 } - } else { - i = 1 + ClearScreen() + CombatStats() + fmt.Println(storyStyle.Render(hitTheStreets)) + fmt.Println(statsStyle.Render(statsCombat)) + fmt.Println("Your choice,") + fmt.Print(green.Render(PlayerName), ">") + fmt.Scan(&choice) + switch { + case strings.ToUpper(choice) == "B": + ClearScreen() + isThereRandomEvent := rand.IntN(6) + switch { + case isThereRandomEvent == 1: + RandomEvent() + } + bumHP = 100 * level + enemyList := []string{"homeless maniac", "drug addled homeless bum", "shit smeared homeless bum", "crazy homeless person", + "tent dweller surrounded by needles"} // list of enemy names in a slice + enemyNameGen := enemyList[rand.IntN(len(enemyList))] // picks a random enemy name from the slice + enemyName := strings.Clone(enemyNameGen) // memory copy from generated name + attackList := []string{"a broken whiskey bottle!", "a tinfoil hat!", "a rusty heroine needle!", "his crusty dick!", "a soiled newspaper!", + "a crack pipe!", "moldy bread!"} + outerLoop: + for bumHP >= 0 { + ClearScreen() + fmt.Println(storyStyle.Render("Bum Fight!")) + fmt.Println() + fmt.Println("You are staring at a ", red.Render(enemyName), "with", bumHP, " HP") + fmt.Println("") + fmt.Println("What do you do?") + fmt.Println("") + CombatStats() + fmt.Println(border.Render(statsCombat)) + fmt.Println("(F)ight") + switch { + case classPsionic: + classPower = classPower + 1 + fmt.Println(superColour.Render("(S)uper Ability: Psychic Blast")) + case classTerminator: + fmt.Println(superColour.Render("(S)uper Ability: Charged Shot")) + case classPsychopath: + fmt.Println(superColour.Render("(S)uper Ability: Chow Down")) + } + fmt.Println("(G)o back to HQ") + fmt.Println("Your choice,") + fmt.Print(green.Render(PlayerName), ">") + homelessFight := "" + fmt.Scan(&homelessFight) + switch { + case strings.ToUpper(homelessFight) == "F": + chance := rand.IntN(100) + switch { + case chance > 40: + attackPW := attack // Grabbing default attack power + switch { + case fentanyl <= 0: + attackPW = attackPW * level + default: + buffs := attack * fentanyl // default attack power multiplied by amount of fentanyl + modifier := level * 2 // double the damage based on level + attackPW = attackPW + buffs + modifier // + } + bumHP = bumHP - attackPW // attack homeless person + ClearScreen() + fmt.Println(red.Render("You smash the bum for "), attack, "HP!") + fmt.Println("The bum has ", bumHP, "HP left") + MashEnterKey() + switch { + case bumHP <= 0: // If you kill the bum, you get money and new stats + money = money*level + 300 + bumfights = bumfights - 1 + experienceGain := cocaines * 100 + levelGain := level * 100 + experience = experience + levelGain + experienceGain + levelGain + break outerLoop // this will break out the loop and sends you back to the combat menu + } + default: + ClearScreen() + fmt.Println(red.Render("You missed, he dodged your attack!")) + fmt.Println() + homelessAttack := 20 + playerHP = playerHP - homelessAttack + randomAttack := attackList[rand.IntN(len(attackList))] + fmt.Println(red.Render("The "), enemyName, red.Render("attacks you with "), randomAttack, red.Render(" for"), homelessAttack, red.Render(" HP")) + fmt.Println("Perhaps you should lay off the donuts...") + MashEnterKey() + switch { + case playerHP <= 0: + bumHP = 100 + break hitLoop + } + } + case strings.ToUpper(homelessFight) == "S": + switch { + case classPsionic: + psionicBlast := classPower * (attack * level) // This is supposed to seperate the atk and lvl variables so math works + bumHP = bumHP - psionicBlast + classPower = 1 + ClearScreen() + fmt.Println(superColour.Render("You blast the"), enemyName, superColour.Render(" for"), psionicBlast, superColour.Render("HP")) + fmt.Println("The bum has ", bumHP, "HP left") + MashEnterKey() + switch { + case bumHP <= 0: // If you kill the bum, you get money and new stats + money = money*level + 300 + bumfights = bumfights - 1 + experienceGain := cocaines * 100 + levelGain := level * 100 + experience = experience + levelGain + experienceGain + levelGain + break outerLoop // this will break out the loop and sends you back to the combat menu + } + case classPsychopath: + psychoUP := classPower * (attack * level) // same as above + bumHP = bumHP - psychoUP + classPower = 1 + ClearScreen() + fmt.Println(superColour.Render("You take a bite out of "), enemyName, superColour.Render(" for"), psychoUP, superColour.Render("HP")) + fmt.Println("The bum has ", bumHP, "HP left") + psychoBuff := psychoUP / 2 // This part takes half the damage you deal + playerHP = playerHP + psychoBuff // and converts it into health. + fmt.Println("You also absorb life force by digesting the flesh, gaining ", psychoUP, superColour.Render("HP!")) + MashEnterKey() + switch { + case bumHP <= 0: // If you kill the bum, you get money and new stats + money = money*level + 300 + bumfights = bumfights - 1 + experienceGain := cocaines * 100 + levelGain := level * 100 + experience = experience + levelGain + experienceGain + levelGain + break outerLoop // this will break out the loop and sends you back to the combat menu + } + + case classTerminator: + chargedShot := classPower * (attack * level * 2) // as above so below + bumHP = bumHP - chargedShot + classPower = 1 + ClearScreen() + fmt.Println(superColour.Render("You pull a plasma blaster out of your robotic leg and shoot the "), enemyName, superColour.Render(" for"), chargedShot, superColour.Render("HP")) + fmt.Println("The bum has ", bumHP, "HP left") + MashEnterKey() + switch { + case bumHP <= 0: // If you kill the bum, you get money and new stats + money = money*level + 300 + bumfights = bumfights - 1 + experienceGain := cocaines * 100 + levelGain := level * 100 + experience = experience + levelGain + experienceGain + levelGain + break outerLoop // this will break out the loop and sends you back to the combat menu + } + + } + default: + fmt.Println("You go back to HQ.") + MashEnterKey() + bumfights = bumfights - 1 + break hitLoop + } + } + bumfights = bumfights - 1 + case strings.ToUpper(choice) == "R": + MainMachine() + } } + MainMachine() } - MainMachine() } func RedRoom() { @@ -185,63 +527,71 @@ func RedRoom() { fmt.Println("Your choice,") fmt.Print(green.Render(PlayerName), ">") fmt.Scan(&choice) - // buy whore - if strings.ToUpper(choice) == "B" { + switch { + case strings.ToUpper(choice) == "B": // buy hooker ClearScreen() fmt.Println(slutStyle.Render("Sex Slave Menu")) - fmt.Println("Price: ", red.Render("$2000 per whore.")) + fmt.Println("Price: ", red.Render("$2000 per hooker.")) fmt.Println("Your cash: $", strconv.Itoa(money)) fmt.Println("") - fmt.Println("Buy one sex slave (Y/N)?") + fmt.Println("Buy one hooker (Y/N)?") + fmt.Print(green.Render(PlayerName), ">") slavePurchase := "" fmt.Scan(&slavePurchase) - if strings.ToUpper(slavePurchase) == "Y" { - if money > 2000 { - whores = whores + 1 - money = money - 5000 + switch { + case strings.ToUpper(slavePurchase) == "Y": + switch { + case money >= 2000: + hookers = hookers + 1 + money = money - 2000 ClearScreen() - fmt.Println(slutStyle.Render("You just purchased 1 whore to be a sex slave!")) + fmt.Println(slutStyle.Render("You just purchased 1 hooker, you da pimp!")) MashEnterKey() i = 0 - } else { + default: ClearScreen() fmt.Println(slutStyle.Render("Get some money, broke-ass!")) MashEnterKey() i = 0 } - } else { + default: i = 0 } - } else if strings.ToUpper(choice) == "P" { + + case strings.ToUpper(choice) == "P": // Buy Connies (Condoms) ClearScreen() fmt.Println(slutStyle.Render("$10 to buy a five pack of connies?")) fmt.Println("Price: ", red.Render("$10 for a five pack.")) fmt.Println("Your cash: $", strconv.Itoa(money)) fmt.Println("") - fmt.Println("Buy connies (Y/N)?") + fmt.Println("Buy five connies (Y/N)?") + fmt.Print(green.Render(PlayerName), ">") lapPurchase := "" fmt.Scan(&lapPurchase) - if strings.ToUpper(lapPurchase) == "Y" { - if money > 10 { + switch { + case strings.ToUpper(lapPurchase) == "Y": + switch { + case money >= 10: money = money - 10 + condoms = condoms + 5 ClearScreen() fmt.Println(slutStyle.Render("You just purchased a five pack of connies.")) fmt.Println() MashEnterKey() ClearScreen() i = 0 - } else { + default: ClearScreen() fmt.Println(slutStyle.Render("Get some money, broke-ass!")) MashEnterKey() ClearScreen() i = 0 } - } else { + default: i = 0 } - } else if strings.ToUpper(choice) == "L" { + case strings.ToUpper(choice) == "L": // Get Lap Dance ClearScreen() fmt.Println(slutStyle.Render("Get a fucking lap dance!")) fmt.Println("Price: ", red.Render("$20 for a 3 minute song.")) @@ -250,83 +600,104 @@ func RedRoom() { fmt.Println("Buy a lap dance (Y/N)?") lapPurchase := "" fmt.Scan(&lapPurchase) - if strings.ToUpper(lapPurchase) == "Y" { - if money > 20 { - money = money - 20 - ClearScreen() - fmt.Println(slutStyle.Render("That slut grinds on your dick to the song 'I like it that way' by Backstreet Boys.")) - fmt.Println() - fmt.Println("That shit was so hot, you came in your pants.") - MashEnterKey() - i = 0 - } else { - ClearScreen() - fmt.Println(slutStyle.Render("Get some money, broke-ass!")) - MashEnterKey() - i = 0 - } - } else { + switch { + case strings.ToUpper(lapPurchase) == "Y": + money = money - 20 + ClearScreen() + fmt.Println(slutStyle.Render("That slut grinds on your dick to the song 'I like it that way' by Backstreet Boys.")) + fmt.Println() + fmt.Println("That shit was so hot, you shot a hot load in your pants.") + playerHP = playerHP + 100 + MashEnterKey() + i = 0 + default: + ClearScreen() + fmt.Println(slutStyle.Render("Get some money, broke-ass!")) + MashEnterKey() i = 0 } - // Fuck Whore - } else if strings.ToUpper(choice) == "F" { + case strings.ToUpper(choice) == "F": // Fuck hooker ClearScreen() - fmt.Println(border.Render("Get your Dick Wet at OPP McDick's")) - fmt.Println("Price: ", red.Render("$100 to fuck a dirty whore for an hour.")) + fmt.Println(border.Render("Get your dick wet at OPP McDick's")) + fmt.Println("Price: ", red.Render("$100 to fuck a hooker for an hour.")) fmt.Println("Your cash: $", strconv.Itoa(money)) fmt.Println("") - fmt.Println("Buy an hour with a whore (Y/N)?") + fmt.Println("Buy an hour with a hooker (Y/N)?") + fmt.Print(green.Render(PlayerName), ">") fuckPurchase := "" fmt.Scan(&fuckPurchase) - if strings.ToUpper(fuckPurchase) == "Y" { - if money > 100 { + switch { + case strings.ToUpper(fuckPurchase) == "Y": + switch { + case money >= 100: money = money - 100 - if condoms == 0 { + playerHP = playerHP + 200 + switch { + case condoms == 0: stdChance := rand.IntN(100) preggoChance := rand.IntN(100) - if stdChance > 25 { - std = true - } else { - + switch { + case renegadeRank >= 10: + stdChance = 100 + preggoChance = 25 } - if preggoChance > 15 { - fmt.Println(border.Render("You got the whore pregnant! Do you want to sell the kid to")) - fmt.Println(border.Render("Pakistan for $500 up front to sew soccer balls?")) + + ClearScreen() + fmt.Println(slutStyle.Render(wifeyFucked)) + fmt.Println("You just fucked a dirty hooker! Oh... shit, it's your cousin!") + MashEnterKey() + + switch { // checking your sti chance + case stdChance <= 50: + infections = infections + 1 + ClearScreen() + fmt.Println(red.Render("Uh oh!")) + fmt.Println(slutStyle.Render("You got an infection!")) + MashEnterKey() + } + + switch { // checking your chance at having a kid + case preggoChance <= 25: + ClearScreen() + fmt.Println(red.Render("Uh oh!")) + fmt.Println(slutStyle.Render("You got the hooker pregnant! Do you want to sell the kid to Pakistan for $500?")) + fmt.Print(green.Render(PlayerName), "(Y/N) >") soccerBalls := "" fmt.Scan(&soccerBalls) - if strings.ToUpper(soccerBalls) == "Y" { + switch { + case strings.ToUpper(soccerBalls) == "Y": money = money + 500 - fmt.Println(border.Render("Bonus! You just made $500!")) - } else { - + fmt.Println(red.Render("Bonus! You just made $500... The kid is great at sewing soccer balls!")) + MashEnterKey() + default: + fmt.Println(red.Render("You have too much of a heart to sell your kid. Now you have to pay child support!")) + offspring = offspring + 1 + fmt.Println("") + fmt.Println(red.Render("Fuck!")) + MashEnterKey() } } - } else { + default: condoms = condoms - 1 } ClearScreen() - fmt.Println(slutStyle.Render(wifeyFucked)) - fmt.Println("You just fucked a dirty whore! Oh... shit, it's your cousin!") - MashEnterKey() - ClearScreen() i = 0 - } else { + default: ClearScreen() fmt.Println(red.Render("Get some money, broke-ass!")) MashEnterKey() - ClearScreen() i = 0 } - } else { + default: i = 0 } - // Return to HQ - } else if strings.ToUpper(choice) == "R" { + + case strings.ToUpper(choice) == "R": // Return to HQ i = 1 - MainMachine() - } else { - i = 0 + + default: + i = 0 // If any other input is given, loop again } } } @@ -341,49 +712,55 @@ func DoctorsOffice() { fmt.Println("Your choice,") fmt.Print(green.Render(PlayerName), ">") fmt.Scan(&choice) - if strings.ToUpper(choice) == "C" { + switch { + case strings.ToUpper(choice) == "C": ClearScreen() - fmt.Println(storyStyle.Render("Doctor's Miracle STD/STI Cures")) + fmt.Println(storyStyle.Render("Doctor's Miracle STI Cures")) fmt.Println() fmt.Println("You encounter ", red.Render("the doctor.")) fmt.Println("") - fmt.Println("Do you want to cure you or your 'friends' STD/STI for $100?") + fmt.Println("Do you want to cure you or your 'friends' STI for $100?") fmt.Println("") fmt.Println("(Y)es") fmt.Println("(N)o") stdCure := "" fmt.Scan(&stdCure) - if strings.ToUpper(stdCure) == "Y" { - if money > 100 { + switch { + case strings.ToUpper(stdCure) == "Y": + switch { + case money >= 100: fmt.Println("You pay the doctor $100 and you and/or your 'friends' are cured.") money = money - 100 - std = false + infections = 0 i = 1 MashEnterKey() - } else { - fmt.Println("You're too poor to cure your disease.") + default: + fmt.Println("You're too poor to cure your infections.") i = 1 - if std { - fmt.Println("But you still have a disease.") + switch { + case infections >= 1: + fmt.Println("But you still have an infection.") MashEnterKey() - } else { + default: fmt.Println() MashEnterKey() } + } - } else { + default: ClearScreen() fmt.Println("No cure for you. I guess.") - if std { - fmt.Println("But you still have a disease.") - MashEnterKey() - } else { - fmt.Println() + switch { + case infections > 0: + fmt.Println("But you still have an infection.") MashEnterKey() + i = 1 + default: + i = 1 } i = 0 } - } else { + default: ClearScreen() fmt.Println("You head back to HQ.") MashEnterKey() @@ -399,92 +776,124 @@ func PropertyRoom() { i := 0 choice := "" for i < 1 { - fmt.Println(storyStyle.Render(propertyRoom)) + fmt.Println(propertyStyle.Render(propertyRoom)) fmt.Println("Your choice,") fmt.Print(green.Render(PlayerName), ">") fmt.Scan(&choice) - if strings.ToUpper(choice) == "C" { + switch { + case strings.ToUpper(choice) == "C": // Cocaine Menu ClearScreen() - fmt.Println(border.Render("Cocaine Menu")) + fmt.Println(propertyStyle.Render("Cocaine Menu")) fmt.Println("Price: ", red.Render("$1000 per gram.")) fmt.Println("Your cash: $", strconv.Itoa(money)) fmt.Println("") fmt.Println("Buy one gram (Y/N)?") cokePurchase := "" fmt.Scan(&cokePurchase) - if strings.ToUpper(cokePurchase) == "Y" { - if money > 1000 { - cocaines = cocaines + 1 + switch { // Check purchase confirmation (Y/N) + case strings.ToUpper(cokePurchase) == "Y": + switch { // Check money + case money >= 1000: + switch { + case renegadeRank <= 10: + cocaines = cocaines + 2 + fmt.Println("You just purchased 1 gram of coke! Here is one on the house for being a team player!") + default: + cocaines = cocaines + 1 + fmt.Println("You just purchased 1 gram of coke!") + + } money = money - 1000 ClearScreen() - fmt.Println("You just purchased 1 gram of coke!") + MashEnterKey() i = 0 - } else { + default: ClearScreen() fmt.Println(red.Render("Get some money, broke-ass!")) MashEnterKey() i = 0 } - } else { + default: i = 0 } - } else if strings.ToUpper(choice) == "L" { + + case strings.ToUpper(choice) == "L": // LSD Menu ClearScreen() - fmt.Println(border.Render("LSD Menu")) + fmt.Println(propertyStyle.Render("LSD Menu")) fmt.Println("Price: ", red.Render("$100 for five tabs.")) fmt.Println("Your cash: $", strconv.Itoa(money)) fmt.Println("") - fmt.Println("Buy six tabs (Y/N)?") + fmt.Println("Buy five tabs (Y/N)?") LSDPurchase := "" fmt.Scan(&LSDPurchase) - if strings.ToUpper(LSDPurchase) == "Y" { - if money > 100 { - LSD = LSD + 5 + switch { // Check purchase confirmation (Y/N) + case strings.ToUpper(LSDPurchase) == "Y": + switch { + case money >= 100: // When money is at least 100 do the following + switch { + case renegadeRank <= 10: + LSD = LSD + 10 + fmt.Println("You just purchased 5 tabs of LSD! I'm tossing in a free sample since you're such a team player!") + default: + LSD = LSD + 5 + fmt.Println("You just purchased 5 tabs of LSD! Fuck yeah!") + } money = money - 100 ClearScreen() - fmt.Println("You just purchased 5 tabs of LSD! Fuck yeah!") + MashEnterKey() i = 0 - } else { + default: // otherwise do this when the user doesn't have 100 dollars ClearScreen() - fmt.Println(red.Render("You don't have the greenbacks, loser! Get some money, broke-ass!")) + fmt.Println(red.Render("You don't have the greenbacks, loser!")) MashEnterKey() i = 0 } - } else { + default: i = 0 } - } else if strings.ToUpper(choice) == "F" { + + case strings.ToUpper(choice) == "F": // Fentanyl Menu ClearScreen() - fmt.Println(border.Render("Fentanyl Menu")) + fmt.Println(propertyStyle.Render("Fentanyl Menu")) fmt.Println("Price: ", red.Render("$500 per hundred milligrams.")) fmt.Println("Your cash: $", strconv.Itoa(money)) fmt.Println("") fmt.Println("Buy 100 milligrams (Y/N)?") fentyPurchase := "" fmt.Scan(&fentyPurchase) - if strings.ToUpper(fentyPurchase) == "Y" { - if money > 500 { - fentanyl = fentanyl + 1 + switch { // Check purchase confirmation (Y/N) + case strings.ToUpper(fentyPurchase) == "Y": + switch { // Check money + case money >= 500: + switch { + case renegadeRank <= 10: + fentanyl = fentanyl + 2 + fmt.Println("You just purchased 1 bag of fenty! And one is on the house!") + default: + fentanyl = fentanyl + 1 + fmt.Println("You just purchased 1 bag of fenty!") + } money = money - 500 ClearScreen() - fmt.Println("You just purchased 1 bag of fenty!") MashEnterKey() i = 0 - } else { + default: ClearScreen() fmt.Println(red.Render("Get some money, broke-ass!")) MashEnterKey() i = 0 } - } else { + default: i = 0 } - } else if strings.ToUpper(choice) == "R" { + + case strings.ToUpper(choice) == "R": // Return to Main Machine i = 1 MainMachine() - } else { + + default: // Invalid input i = 0 } } @@ -493,7 +902,7 @@ func PropertyRoom() { func ClockOut() { choice := 0 ClearScreen() - fmt.Println(storyStyle.Render(wifey)) + fmt.Println(slutStyle.Render(wifey)) for choice < 1 { fmt.Println("Your choice,") fmt.Print(green.Render(PlayerName), ">") @@ -501,20 +910,21 @@ func ClockOut() { switch choice { case 1: chance := rand.IntN(100) - if chance < 50 { - ClearScreen() - if cocaines > 1 { + switch { + case chance <= 50: + switch cocaines { + case 0: + fmt.Println(red.Render("You bust your wife right in the fucking face!")) + MashEnterKey() + default: fmt.Println(red.Render("You pull out 1kg of cocaine and smash it open all over your face")) - cocaines = cocaines - 1 fmt.Println(red.Render("You shout 'COKE SLAM!'")) fmt.Println(red.Render("You bust your wife right in the fucking face!")) fmt.Println(red.Render("YARRRRR! (You don't know why you're a pirate now)")) MashEnterKey() ClearScreen() - } else { - fmt.Println(red.Render("You bust your wife right in the fucking face!")) } - } else { + default: ClearScreen() fmt.Println(red.Render("You try to bust your wife in the face but she dodges you and runs out the")) fmt.Println(red.Render("front door!")) @@ -526,7 +936,7 @@ func ClockOut() { fmt.Println(border.Render(wifeyFucked)) fmt.Println("You successfully hate fucked your wife.") fmt.Println() - fmt.Println("She apologizes for the cold dinner while she wipes the semen and blood from her butthole.") + fmt.Println("She apologizes for the cold dinner while she wipes the semen off her leg.") MashEnterKey() choice = 1 case 3: @@ -537,19 +947,24 @@ func ClockOut() { } ClearScreen() fmt.Println(border.Render("It is a new day!")) - if days == 0 { + switch { + case days <= 0: fmt.Println("You have run out of days...") MashEnterKey() GameOver() - } else { + default: days = days - 1 - if std { - bumfights = bumfightsTotal - 15 - } else { + switch { + case infections >= 1: + bumfights = bumfightsTotal - 15 - infections + default: bumfights = bumfightsTotal } - prostituteIncome := whores*500 - childsupport - money = money + taxes + prostituteIncome + childsupport = offspring * 100 + diseaseUpkeep := infections * 25 + hookersProfit := hookers * 500 + income := hookersProfit - childsupport - diseaseUpkeep + money = money + taxes + income fmt.Println("Cha ching! You now have ", money) MainMachine() } @@ -569,32 +984,42 @@ func GameOver() { } func CheckStats() { - stats = "PLAYER STATS" + "\n\n" + "Name " + "\n" + PlayerName + "\n" + "Condoms: " + strconv.Itoa(condoms) + "\n" + "Money: $" + strconv.Itoa(money) + "\n" + "Whores:" + strconv.Itoa(whores) + "\n" + "Cocaine (1 gram bags): " + strconv.Itoa(cocaines) + "\n" + "Fentanyl (100/mg bags): " + strconv.Itoa(fentanyl) + "\n" + "LSD (tabs): " + strconv.Itoa(LSD) + "\n" + "Days Left: " + strconv.Itoa(days) // builds the stats paragraph for the main screen + stats = "PLAYER STATS" + "\n\n" + "Name " + "\n" + PlayerName + "\n" + "Hit Points: " + strconv.Itoa(playerHP) + "\n" + "Condoms: " + strconv.Itoa(condoms) + "\n" + "Money: $" + strconv.Itoa(money) + "\n" + "hookers:" + strconv.Itoa(hookers) + "\n" + "Cocaine (1 gram bags): " + strconv.Itoa(cocaines) + "\n" + "Fentanyl (100/mg bags): " + strconv.Itoa(fentanyl) + "\n" + "LSD (tabs): " + strconv.Itoa(LSD) + "\n" + "Days Left: " + strconv.Itoa(days) // builds the stats paragraph for the main screen } func CombatStats() { - if experience == 1000 { + switch { + case experience >= 1000: level = 2 - } else if experience == 4000 { + case experience >= 4000: level = 3 - } else if experience == 8000 { + case experience >= 9000: level = 4 - } else if experience == 25000 { + case experience >= 18000: level = 5 - } else if experience == 75000 { + case experience >= 30000: level = 6 - } else if experience == 120000 { + case experience >= 60000: level = 7 - } else if experience == 175000 { + case experience >= 120000: level = 8 - } else if experience == 250000 { + case experience >= 240000: level = 9 - } else if experience == 1000000 { + case experience >= 480000: level = 10 - } else { - fmt.Println() + case experience >= 960000: + level = 11 + case experience >= 1920000: + level = 12 + case experience >= 3840000: + level = 13 + case experience >= 7680000: + level = 14 + case experience >= 15360000: + level = 15 } - statsCombat = "Name: " + PlayerName + "\n" + "Level :" + strconv.Itoa(level) + "\n" + "Money: $" + strconv.Itoa(money) + "\n" + "Experience :" + strconv.Itoa(experience) + "\n" + "Bum Fights Left: " + strconv.Itoa(bumfights) // builds Combat Stats + + statsCombat = "Name: " + PlayerName + "\n" + "Hit Points: " + strconv.Itoa(playerHP) + "\n" + "Level :" + strconv.Itoa(level) + "\n" + "Money: $" + strconv.Itoa(money) + "\n" + "Experience :" + strconv.Itoa(experience) + "\n" + "Bum Fights Left: " + strconv.Itoa(bumfights) // builds Combat Stats } func MainMachine() { @@ -606,26 +1031,19 @@ func MainMachine() { fmt.Println("Your choice,") fmt.Print(green.Render(PlayerName), ">") fmt.Scan(&choice) - if strings.ToUpper(choice) == "H" { + switch { + case strings.ToUpper(choice) == "H": HitTheStreets() - i = 1 - } else if strings.ToUpper(choice) == "P" { + case strings.ToUpper(choice) == "P": PropertyRoom() - i = 1 - } else if strings.ToUpper(choice) == "B" { - breakRoom() - i = 1 - } else if strings.ToUpper(choice) == "R" { + case strings.ToUpper(choice) == "R": RedRoom() - i = 1 - } else if strings.ToUpper(choice) == "D" { + case strings.ToUpper(choice) == "D": DoctorsOffice() - i = 1 - } else if strings.ToUpper(choice) == "G" { + case strings.ToUpper(choice) == "G": ClockOut() - i = 1 - } else { - i = 0 + case strings.ToUpper(choice) == "Q": + GameOver() } } } @@ -651,6 +1069,8 @@ func main() { playerNameMaker := strings.Clone(prompt) PlayerName = strings.TrimRight(playerNameMaker, "\n") // removes a trailing "Return" key that fucks everything up (i dont want the enter key IN the variable) ClearScreen() + ClassSelection() + ClearScreen() MainMachine() } diff --git a/menu.txt b/menu.txt index 9416917..5988684 100644 --- a/menu.txt +++ b/menu.txt @@ -1,11 +1,9 @@ MAIN MENU -1. Locker -2. Aqcuire Drugs -3. Buy Condoms -4. Hit the Streets -5. Find Whore -6. Pay off Judge -7. Union -8. Doctor -9. Clock Out +(H)it the Streets +(P)roperty Room +(B)reak Room +(R)ed Room +(D)octor +(G)oodbye +(Q)uit the game