crushcandydx/main.go

271 lines
7.0 KiB
Go

// main
package main
import (
"fmt"
"strings"
)
func main() {
type Item struct {
name, description string
moveable bool
openable bool
}
type Room struct {
name, description string
items map[string]*Item
north, south, west, east string
}
type Player struct {
loc *Room
items map[string]*Item
}
inventory := map[string]*Item{}
entryItems := map[string]*Item{}
chestItems := map[string]*Item{
"chest": {"chest", "none",
false,
true,
},
}
caveItems := map[string]*Item{
"key": {"House Key", "It resembles a house key.",
true,
false},
}
foyerItems := map[string]*Item{}
/* Pointing to the struct "Room" allows us to directly modify its values */
rooms := map[string]*Room{
"entry": {"Field", "\nYou find yourself before a mansion to the (n)orth.\n" +
"The door to the mansion is locked.\n" +
"There is a cave to the (w)est.\n" +
"In the distance, you see some sort of box to the (e)ast.",
entryItems,
"none", "none", "cave", "chest"},
"chest": {"Chest", "\nYou see a closed chest freezer in front of you.\n" +
"There is an empty field to the (w)est.\n",
chestItems,
"none", "none", "entry", "none"},
"cave": {"Cave", "\nA beast of inconevialable horror dwells in this" +
" cave and proceds to tear you apart.\n",
caveItems,
"none", "none", "none", "entry"},
"foyer": {"Foyer", "\n You find yourself in the foyer of the mansion,\n" +
"Add the real description here after referencing notes and what not.",
foyerItems,
"none", "none", "none", "none"},
}
player := Player{rooms["entry"], inventory}
player.items["syringe"] = &Item{"Syringe", "A syringe with a missing needle is in your pocket.", false, false}
var command [2]string
var quit bool = false
var steak_happened = false
println()
println()
println()
println()
println()
println("Welcome to Crush Candy DX!")
println("Type \"h\" for help!")
println("Enjoy!")
println()
println()
for quit != true {
println(player.loc.description, "\n")
fmt.Print("Enter text: ")
fmt.Scanln(&command[0], &command[1])
command[0] = strings.ToLower(command[0])
command[1] = strings.ToLower(command[1])
switch command[0] {
case "q", "quit", "exit":
print("Are you sure you want to quit? (y/n): ")
fmt.Scanln(&command[0])
if strings.ToLower(command[0]) == "y" {
println("The shame of quiting causes your liver to burst" +
" as you keel over.")
println("RIP")
quit = true
} else {
println("Welcome back from the edge! ")
}
case "h", "help":
print("Commands:\n\n" +
"(h)elp\n" +
"(c)lear\n" +
"(q)uit\n\n" +
"(n)orth\n" +
"(s)outh\n" +
"(e)ast\n" +
"(w)est\n\n" +
"(l)ook\n" +
"(g)et\n" +
"(o)pen\n" +
"(u)se\n" +
"(i)nventory\n\n")
case "w", "west":
if player.loc.west != "none" {
player.loc = rooms[player.loc.west]
break
}
println("\nYou can't go that way!\n")
case "e", "east":
if player.loc.east != "none" {
player.loc = rooms[player.loc.east]
break
}
println("\nYou can't go that way!\n")
case "n", "north":
if player.loc.north != "none" {
player.loc = rooms[player.loc.north]
break
}
println("\nYou can't go that way!\n")
case "s", "south":
if player.loc.south != "none" {
player.loc = rooms[player.loc.south]
break
}
println("\nYou can't go that way!\n")
case "i", "inventory":
println("")
println("Inventory:\n")
//Listing items, and looking at them, should be different.
for _, v := range player.items {
println(v.name, " ", v.description)
}
println("")
case "g", "get":
if command[1] == "" {
println("")
println("Get what? ")
break
}
if _, ok := player.loc.items[command[1]]; ok &&
player.loc.items[command[1]].moveable == true {
println("You grab the", command[1],
"and place it in your pocket.")
player.items[command[1]] = player.loc.items[command[1]]
delete(player.loc.items, command[1])
if player.loc.name == "Chest" {
player.loc.description = "" +
"\nYou see an open chest freezer in front of you.\n" +
"The freezer is empty\n" +
"There is an empty field to the (w)est.\n"
break
}
if player.loc.name == "Cave" {
player.loc.description = "You are in a dark cave.\n" +
"There is an empty field to the (e)ast."
break
}
}
println("\nI don't see any", command[1], "to get!")
case "o", "open":
if command[1] == "" {
println("")
println("Open what? ")
break
}
if _, ok := player.loc.items[command[1]]; ok &&
player.loc.items[command[1]].openable == true {
if player.loc.name == "Chest" {
println("\nYou open the chest")
player.loc.items["chest"].openable = false
player.loc.items["steak"] = &Item{"steak", "A rotting disgusting steak. " +
"\n You have no idea why you put it in your pocket.", true, false}
player.loc.description = "" +
"\nYou see an open chest freezer in front of you.\n" +
"There is a putrid steak in the freezer\n" +
"There is an empty field to the (w)est.\n"
break
}
}
println("\nI don't know how to open a", command[1]+"!")
case "":
println("\n What do you want me to do? ")
break
default:
println("\nI don't know how to '", command[0], "'\n")
}
// Perhaps the below should somehow be attached to the room struct?
// Feels silly to check this every time, but I suppose it is fine.
// Perhaps something like, instead of these if statements
// We run something like room.action() every loop, and stuff like this
// here below will be activated.
// I guess room.action() would be a seperate function for every room?
// Perhaps next game. I think we'll just loop through all these things
// time
if player.loc.name == "Cave" {
if _, ok := player.items["steak"]; ok {
println("\n You see a poodle sitting in the cave. You can't stand " +
"the smell of the steak anymore and decide to toss it " +
"out of the cave which the dog happily chases after.")
rooms["cave"].description = "You are in a dark cave.\n" +
"There is a key on the floor.\n" +
"There is an empty field to the (e)ast."
steak_happened = true
delete(player.items, "steak")
}
if steak_happened == false {
println(player.loc.description)
println("Well, it looks like you died! Good luck next time!")
quit = true
}
}
if player.loc.name == "Field" {
if _, ok := player.items["key"]; ok {
println("You use the key to open the door to the mansion.\n" +
"The key broke off in the lock")
delete(player.items, "key")
rooms["entry"].description = "\nYou find yourself before a mansion to the (n)orth.\n" +
"The door to the mansion is wide open.\n " +
"There is a cave to the (w)est.\n" +
"In the distance, you see some sort of box to the (e)ast."
rooms["entry"].north = "foyer"
}
}
/*Clear the commands in case the user just presses "enter"*/
command[0] = ""
command[1] = ""
}
}