oppwars/main.go

713 lines
20 KiB
Go

package main
import (
"fmt"
"math/rand/v2"
"os"
"strconv"
"strings"
"bufio"
_ "embed"
"github.com/charmbracelet/lipgloss"
)
// =-=-=-=-=-= These are variables for embeding files as hardcoded strings - dont remove them, they just LOOK like comments =-=-=-=-=-=-=
//go:embed menu.txt
var menu string
//go:embed levels/wifey.txt
var wifey string
//go:embed levels/wife-fucked.txt
var wifeyFucked string
//go:embed officers.txt
var officers string
//go:embed intro.txt
var intro string
//go:embed levels/propertyRoom.txt
var propertyRoom string
//go:embed levels/redRoom.txt
var redRoom string
//go:embed levels/hitTheStreets.txt
var hitTheStreets string
//go:embed levels/doctorsRoom.txt
var doctorsRoom string
// =-=-=-=-=-=-= End File String Embeds =-=-=-=-=-=-=
// Game Variables - Core Gameplay
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 diseases = 0 // what happens if you 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 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 used to reset bum fights per day
const taxes = 500 // skimming off the top
var offspring = 0 // number of children you have by default
var childsupport = 0 // default 0 but changes if you get a hoe preggers
var playerHP = 200 // default hit points for the player
// Lipgloss - Props to
var border = lipgloss.NewStyle().
BorderStyle(lipgloss.NormalBorder()).
BorderForeground(lipgloss.Color("63"))
var titleStyle = lipgloss.NewStyle().
BorderStyle(lipgloss.NormalBorder()).
BorderForeground(lipgloss.Color("#f20b0bff")).
Foreground(lipgloss.Color("#ffffffff ")).
Background(lipgloss.Color("#f20b0bff"))
var storyStyle = lipgloss.NewStyle().
BorderStyle(lipgloss.NormalBorder()).
Width(75).
BorderForeground(lipgloss.Color("228")).
BorderBackground(lipgloss.Color("#0000FF")).
Foreground(lipgloss.Color("#ffffffff ")).
Background(lipgloss.Color("#0000FF"))
var slutStyle = lipgloss.NewStyle().
BorderStyle(lipgloss.NormalBorder()).
Width(75).
BorderForeground(lipgloss.Color("228")).
BorderBackground(lipgloss.Color("#ff00a2ff")).
Background(lipgloss.Color("#ffffffff ")).
Foreground(lipgloss.Color("#ff00a2ff"))
var statsStyle = lipgloss.NewStyle().
BorderStyle(lipgloss.NormalBorder()).
Foreground(lipgloss.Color("#ffffffff ")).
Background(lipgloss.Color("#2a2a60ff"))
var red = lipgloss.NewStyle().
Foreground(lipgloss.Color("#f20b0bff"))
var green = lipgloss.NewStyle().
Foreground(lipgloss.Color("#18e60aff "))
// 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") // this does appear to work on windows pe liveiso from win11 (tested in qemu)
}
// Cool stylized Enter key masher
func MashEnterKey() {
fmt.Println(statsStyle.Render("Mash the 'Enter' key!"))
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
func breakRoom() {
fmt.Println("Not Implemented")
MainMachine()
}
func HitTheStreets() {
ClearScreen()
choice := ""
bumHP := 100
i := 1
for playerHP > 0 {
for i > 0 {
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 * level
outerLoop:
for bumHP > 0 {
ClearScreen()
fmt.Println(storyStyle.Render("Bum Fight!"))
fmt.Println()
fmt.Println("You are staring at a ", red.Render("homeless piece of shit!"), "with", bumHP, " HP")
fmt.Println("")
fmt.Println("What do you do?")
fmt.Println("")
CombatStats()
fmt.Println(border.Render(statsCombat))
fmt.Println("(F)ight")
fmt.Println("(G)o back to HQ")
fmt.Println("Your choice,")
fmt.Print(green.Render(PlayerName), ">")
homelessFight := ""
fmt.Scan(&homelessFight)
if strings.ToUpper(homelessFight) == "F" {
chance := rand.IntN(100)
if chance > 40 {
attack := 20 // default attack power
switch {
case fentanyl <= 0:
attack = 20
default:
modifier := attack * fentanyl // default attack power multiplied by amount of fentanyl
attack = attack + modifier
}
bumHP = bumHP - attack
ClearScreen()
fmt.Println(red.Render("You smash the bum for "), attack, "hit points!")
fmt.Println("The bum has ", bumHP, " HP left")
MashEnterKey()
switch {
case bumHP <= 0:
money = money + 200
bumfights = bumfights - 1
experienceGain := cocaines * 100
levelGain := level * 100
experience = experience + levelGain + experienceGain + 100
break outerLoop
}
} else {
ClearScreen()
fmt.Println(red.Render("You missed, he dodged your attack!"))
fmt.Println()
homelessAttack := 20
playerHP = playerHP - homelessAttack
fmt.Println(red.Render("The homeless thug attacks you with a broken whiskey bottle for"), homelessAttack, " HP")
fmt.Println("Perhaps you should lay off the donuts...")
if playerHP < 0 {
bumHP = 100
break outerLoop
}
MashEnterKey()
}
} else {
fmt.Println("You go back to HQ.")
bumfights = bumfights - 1
bumHP = 0
MashEnterKey()
MainMachine()
}
}
bumfights = bumfights - 1
} else if strings.ToUpper(choice) == "R" {
MainMachine()
}
}
}
MainMachine()
}
func RedRoom() {
ClearScreen()
i := 0
choice := ""
for i < 1 {
fmt.Println(slutStyle.Render(redRoom))
fmt.Println("Your choice,")
fmt.Print(green.Render(PlayerName), ">")
fmt.Scan(&choice)
// buy whore
if strings.ToUpper(choice) == "B" {
ClearScreen()
fmt.Println(slutStyle.Render("Sex Slave Menu"))
fmt.Println("Price: ", red.Render("$2000 per whore."))
fmt.Println("Your cash: $", strconv.Itoa(money))
fmt.Println("")
fmt.Println("Buy one sex slave (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
ClearScreen()
fmt.Println(slutStyle.Render("You just purchased 1 whore to be a sex slave!"))
MashEnterKey()
i = 0
} else {
ClearScreen()
fmt.Println(slutStyle.Render("Get some money, broke-ass!"))
MashEnterKey()
i = 0
}
} else {
i = 0
}
} else if strings.ToUpper(choice) == "P" {
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.Print(green.Render(PlayerName), ">")
lapPurchase := ""
fmt.Scan(&lapPurchase)
if strings.ToUpper(lapPurchase) == "Y" {
if money > 10 {
money = money - 10
ClearScreen()
fmt.Println(slutStyle.Render("You just purchased a five pack of connies."))
fmt.Println()
MashEnterKey()
ClearScreen()
i = 0
} else {
ClearScreen()
fmt.Println(slutStyle.Render("Get some money, broke-ass!"))
MashEnterKey()
ClearScreen()
i = 0
}
} else {
i = 0
}
} else if strings.ToUpper(choice) == "L" {
ClearScreen()
fmt.Println(slutStyle.Render("Get a fucking lap dance!"))
fmt.Println("Price: ", red.Render("$20 for a 3 minute song."))
fmt.Println("Your cash: $", strconv.Itoa(money))
fmt.Println("")
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 shot a hot load in your pants.")
playerHP = playerHP + 100
MashEnterKey()
i = 0
} else {
ClearScreen()
fmt.Println(slutStyle.Render("Get some money, broke-ass!"))
MashEnterKey()
i = 0
}
} else {
i = 0
}
// Fuck Whore
} else if strings.ToUpper(choice) == "F" {
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("Your cash: $", strconv.Itoa(money))
fmt.Println("")
fmt.Println("Buy an hour with a whore (Y/N)?")
fmt.Print(green.Render(PlayerName), ">")
fuckPurchase := ""
fmt.Scan(&fuckPurchase)
if strings.ToUpper(fuckPurchase) == "Y" {
if money >= 100 {
money = money - 100
if condoms == 0 {
stdChance := rand.IntN(100)
preggoChance := rand.IntN(100)
ClearScreen()
fmt.Println(slutStyle.Render(wifeyFucked))
fmt.Println("You just fucked a dirty whore! Oh... shit, it's your cousin!")
MashEnterKey()
switch {
case stdChance <= 50:
diseases = diseases + 1
ClearScreen()
fmt.Println(red.Render("Uh oh!"))
fmt.Println(slutStyle.Render("You got a disease!"))
MashEnterKey()
}
switch {
case preggoChance <= 25:
ClearScreen()
fmt.Println(red.Render("Uh oh!"))
fmt.Println(slutStyle.Render("You got the whore 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" {
money = money + 500
fmt.Println(red.Render("Bonus! You just made $500... The kid is great at sewing soccer balls!"))
MashEnterKey()
} else {
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 {
condoms = condoms - 1
playerHP = playerHP + 200
}
ClearScreen()
i = 0
} else {
ClearScreen()
fmt.Println(red.Render("Get some money, broke-ass!"))
MashEnterKey()
i = 0
}
} else {
i = 0
}
// Return to HQ
} else if strings.ToUpper(choice) == "R" {
i = 1
MainMachine()
} else {
i = 0
}
}
}
func DoctorsOffice() {
ClearScreen()
i := 0
choice := ""
for i < 1 {
ClearScreen()
fmt.Println(storyStyle.Render(doctorsRoom))
fmt.Println("Your choice,")
fmt.Print(green.Render(PlayerName), ">")
fmt.Scan(&choice)
if strings.ToUpper(choice) == "C" {
ClearScreen()
fmt.Println(storyStyle.Render("Doctor's Miracle STD/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("")
fmt.Println("(Y)es")
fmt.Println("(N)o")
stdCure := ""
fmt.Scan(&stdCure)
if strings.ToUpper(stdCure) == "Y" {
if money > 100 {
fmt.Println("You pay the doctor $100 and you and/or your 'friends' are cured.")
money = money - 100
diseases = 0
i = 1
MashEnterKey()
} else {
fmt.Println("You're too poor to cure your diseases.")
i = 1
if diseases >= 1 {
fmt.Println("But you still have a diseases.")
MashEnterKey()
} else {
fmt.Println()
MashEnterKey()
}
}
} else {
ClearScreen()
fmt.Println("No cure for you. I guess.")
if diseases >= 0 {
fmt.Println("But you still have a disease.")
MashEnterKey()
} else {
fmt.Println()
MashEnterKey()
}
i = 0
}
} else {
ClearScreen()
fmt.Println("You head back to HQ.")
MashEnterKey()
i = 0
}
i = 1
}
MainMachine()
}
func PropertyRoom() {
ClearScreen()
i := 0
choice := ""
for i < 1 {
fmt.Println(storyStyle.Render(propertyRoom))
fmt.Println("Your choice,")
fmt.Print(green.Render(PlayerName), ">")
fmt.Scan(&choice)
if strings.ToUpper(choice) == "C" {
ClearScreen()
fmt.Println(border.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
money = money - 1000
ClearScreen()
fmt.Println("You just purchased 1 gram of coke!")
MashEnterKey()
i = 0
} else {
ClearScreen()
fmt.Println(red.Render("Get some money, broke-ass!"))
MashEnterKey()
i = 0
}
} else {
i = 0
}
} else if strings.ToUpper(choice) == "L" {
ClearScreen()
fmt.Println(border.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)?")
LSDPurchase := ""
fmt.Scan(&LSDPurchase)
if strings.ToUpper(LSDPurchase) == "Y" {
if money > 100 {
LSD = LSD + 5
money = money - 100
ClearScreen()
fmt.Println("You just purchased 5 tabs of LSD! Fuck yeah!")
MashEnterKey()
i = 0
} else {
ClearScreen()
fmt.Println(red.Render("You don't have the greenbacks, loser! Get some money, broke-ass!"))
MashEnterKey()
i = 0
}
} else {
i = 0
}
} else if strings.ToUpper(choice) == "F" {
ClearScreen()
fmt.Println(border.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
money = money - 500
ClearScreen()
fmt.Println("You just purchased 1 bag of fenty!")
MashEnterKey()
i = 0
} else {
ClearScreen()
fmt.Println(red.Render("Get some money, broke-ass!"))
MashEnterKey()
i = 0
}
} else {
i = 0
}
} else if strings.ToUpper(choice) == "R" {
i = 1
MainMachine()
} else {
i = 0
}
}
}
func ClockOut() {
choice := 0
ClearScreen()
fmt.Println(slutStyle.Render(wifey))
for choice < 1 {
fmt.Println("Your choice,")
fmt.Print(green.Render(PlayerName), ">")
fmt.Scan(&choice)
switch choice {
case 1:
chance := rand.IntN(100)
if chance < 50 {
ClearScreen()
if cocaines > 1 {
fmt.Println(red.Render("You pull out 1kg of cocaine and smash it open all over your face"))
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!"))
MashEnterKey()
}
} else {
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!"))
fmt.Println(red.Render("Oh well.. who is she gonna call bro?"))
MashEnterKey()
}
choice = 1
case 2:
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.")
MashEnterKey()
choice = 1
case 3:
fmt.Println("You take some of your drugs. You are enjoying your life for once.")
choice = 1
default:
choice = 0
}
ClearScreen()
fmt.Println(border.Render("It is a new day!"))
if days == 0 {
fmt.Println("You have run out of days...")
MashEnterKey()
GameOver()
} else {
days = days - 1
if diseases >= 1 {
bumfights = bumfightsTotal - 15 - diseases
} else {
bumfights = bumfightsTotal
}
childsupport = offspring * 100
prostituteIncome := whores*500 - childsupport
money = money + taxes + prostituteIncome
fmt.Println("Cha ching! You now have ", money)
MainMachine()
}
}
}
func GameOver() {
fmt.Println(border.Render("Game Over, Bitch!!!"))
CheckStats()
CombatStats()
fmt.Println(statsStyle.Render(stats))
fmt.Println(statsStyle.Render(statsCombat))
fmt.Println()
fmt.Println("The game will exit now...")
MashEnterKey()
os.Exit(0)
}
func CheckStats() {
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" + "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
}
func CombatStats() {
if experience == 1000 {
level = 2
} else if experience == 4000 {
level = 3
} else if experience == 8000 {
level = 4
} else if experience == 25000 {
level = 5
} else if experience == 75000 {
level = 6
} else if experience == 120000 {
level = 7
} else if experience == 175000 {
level = 8
} else if experience == 250000 {
level = 9
} else if experience == 1000000 {
level = 10
} else {
fmt.Println()
}
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() {
ClearScreen()
i := 0
choice := ""
for i < 1 {
ScreenMachine()
fmt.Println("Your choice,")
fmt.Print(green.Render(PlayerName), ">")
fmt.Scan(&choice)
if strings.ToUpper(choice) == "H" {
HitTheStreets()
i = 1
} else if strings.ToUpper(choice) == "P" {
PropertyRoom()
i = 1
} else if strings.ToUpper(choice) == "B" {
breakRoom()
i = 1
} else if strings.ToUpper(choice) == "R" {
RedRoom()
i = 1
} else if strings.ToUpper(choice) == "D" {
DoctorsOffice()
i = 1
} else if strings.ToUpper(choice) == "G" {
ClockOut()
i = 1
} else {
i = 0
}
}
}
func ScreenMachine() {
CheckStats()
fmt.Println(storyStyle.Render("OPP Wars - Corruption"))
fmt.Println(lipgloss.JoinHorizontal(lipgloss.Top, border.Render(menu), statsStyle.Render(stats))) // makes a horizontal display joining two paras
}
func main() {
officerStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("0000FF"))
fmt.Println(titleStyle.Render("OPP Wars - Corruption"))
fmt.Println(officerStyle.Render(officers))
MashEnterKey()
ClearScreen()
fmt.Println(storyStyle.Render("OPP Wars - Corruption"))
fmt.Println(storyStyle.Render(intro))
fmt.Print("Enter your damned name, Constable: ")
reader := bufio.NewReader(os.Stdin)
prompt, _ := reader.ReadString('\n')
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()
MainMachine()
}