diff --git a/cmd/signup/main.go b/cmd/signup/main.go index 1c66a3c..20f8c8b 100644 --- a/cmd/signup/main.go +++ b/cmd/signup/main.go @@ -46,6 +46,8 @@ func cli(s *streams) error { mainFlex := tview.NewFlex() innerFlex := tview.NewFlex() input := tview.NewTextArea() + input.SetBorder(true).SetBorderColor(tcell.ColorPaleTurquoise) + input.SetTitle("press ctrl+d to send") title := tview.NewTextView() title.SetDynamicColors(true) @@ -54,10 +56,14 @@ func cli(s *streams) error { msgScroll := tview.NewTextView() msgScroll.SetDynamicColors(true) + msgScroll.SetBackgroundColor(tcell.ColorBlack) + msgScroll.SetTextColor(tcell.ColorWhite) sidebar := tview.NewTextView() sidebar.SetBorder(true) sidebar.SetDynamicColors(true) + sidebar.SetBackgroundColor(tcell.ColorBlack) + sidebar.SetTextColor(tcell.ColorGray) sidebar.SetText(heredoc.Doc(` [-:-:b]hey here are some hints[-:-:-] @@ -68,12 +74,12 @@ func cli(s *streams) error { try a [-:-:b]verb[-:-:-] using [-:-:b]/[-:-:-] like: - [-:-:b]/go north[-:-:-] + [-:-:b]/nod[-:-:-] `)) innerFlex.SetDirection(tview.FlexColumn) - innerFlex.AddItem(msgScroll, 0, 2, false) + innerFlex.AddItem(msgScroll, 0, 3, false) innerFlex.AddItem(sidebar, 0, 1, false) mainFlex.SetDirection(tview.FlexRow) @@ -88,9 +94,146 @@ func cli(s *streams) error { player := newCharacter("you", "TODO") + currentScreen := "start" + + sceneTransition := func(text string) { + fmt.Fprintln(msgScroll, heredoc.Doc(` + + [purple]----------[-:-:-] + + `)) + fmt.Fprintln(msgScroll, text) + } + + scenes := map[string]func(){ + "start": func() { + fmt.Fprintln(msgScroll, heredoc.Doc(` + You open your eyes. + + You're in some kind of workshop. + Wires and computers in various state of disrepair are strewn across + tables and shelves. It smells faintly of burnt cedar. + + The wires and components before you slowly drag + themselves into the shape of a small humanoid. + + [-:-:b]wire guy says:[-:-:-] + hello, welcome to the application for membership in tilde town. + first, please let me know what a good [-:-:b]email address[-:-:-] is for you? + just say it out loud. as many times as you need. to get it right. + when you're ready to move on, [-:-:b]/nod[-:-:-] + `)) + }, + "nodded": func() { + sceneTransition(heredoc.Doc(` + The workshop fades away. You hear the sound of a dial up modem + in the distance. + + Trees spring up out of the ground around you: birches, oaks, maples, + firs, yews, pines, cypresses complete with tiny swamps around their trunks, + junipers, redwoods, cedars, towering palms waving gently in a breeze, eucalyptus, + banyan. the smell is riotous like a canvas with all the colors splashed on. birds + start to sing. + + a shrike alights on a branch in front of you. + + [-:-:b]the shrike says:[-:-:-] + phweeturpff. how did you find out about the town? did anyone refer you? + + just say your answer out loud. when you've said what you want, [-:-:b]/lean[-:-:-] + against a tree. + `)) + }, + "leaned": func() { + sceneTransition(heredoc.Doc(` + You sink backwards into the forest. You find yourself floating in darkness. + + At the far reaches of your vision you can make out a faint neon grid. Around you + float pieces of consumer electronic appliances from 1980s Earth. A VCR approaches + you and speaks, flapping its tape slot cover with each word. + + [-:-:b]the vcr says:[-:-:-] + welcome! thank you for coming this far. just two questions left. what about + tilde town interests you? what kind of stuff might you want to get up to here? + + as usual, just say your answer. when you're satisfied, please [-:-:b]/spin[-:-:-] + around in this void. + `)) + }, + "spun": func() { + sceneTransition(heredoc.Doc(` + You realize your eyes have been shut. You open them and, in an instant, + the neon grid and polygons are gone. You're in a convenience store. Outside + it's dark besides a single pool of light coming from a street lamp. it's illuminating + some litter and a rusty, blue 1994 pontiac grand am. + + The shelves around you are stocked with products you've never heard of before like + Visible Pants, Petty Burgers, Gentle Rice, Boo Sponge, Power Banjo, Superware, Kneephones, + and Diet Coagulator. A mop is mopping the floor and turns to you. + + [-:-:b]the mop says:[-:-:-] + swishy slop. last question. where online can we get to know you? do you have a personal + website or social media presence? we'll take whatever. + + say some links and words out loud, you know the drill. + + when you're happy you can submit this whole experience by leaving the + store. just [-:-:b]/open[-:-:-] the door. + `)) + }, + "done": func() { + sceneTransition(heredoc.Doc(` + thank you for applying to tilde.town! + + please be on the look out for an email from [-:-:b]root@tilde.town[-:-:-] + + you can [-:-:b]/quit[-:-:-] now + + ok bye have a good one~ + `)) + }, + } + handleInput := func(msg string) { - if strings.HasPrefix(msg, "/") { - // TODO handle command + trimmed := strings.TrimSpace(msg) + if trimmed == "" { + return + } + if strings.HasPrefix(trimmed, "/") { + split := strings.Split(trimmed, " ") + if len(split) > 0 { + trimmed = split[0] + } + switch strings.TrimPrefix(trimmed, "/") { + case "quit": + os.Exit(0) + // TODO refactor into a state machine + case "nod": + if currentScreen != "start" { + return + } + currentScreen = "nodded" + scenes[currentScreen]() + case "lean": + if currentScreen != "nodded" { + return + } + currentScreen = "leaned" + scenes[currentScreen]() + case "spin": + if currentScreen != "leaned" { + return + } + currentScreen = "spun" + scenes[currentScreen]() + case "open": + if currentScreen != "spun" { + return + } + currentScreen = "done" + scenes[currentScreen]() + } + return } fmt.Fprintln(msgScroll, player.Say(msg)) } @@ -106,9 +249,78 @@ func cli(s *streams) error { return event }) + app.SetAfterDrawFunc(func(_ tcell.Screen) { + scenes[currentScreen]() + app.SetAfterDrawFunc(nil) + }) + return app.Run() } +/* + +I need a script for how this interaction should go. It should feel more organic and fluid than just filling out a form. It shouldn't, however, take more than 10 minutes to get through stuff. The end result is to collect: + +- an email address +- how a user found out about the town +- if they have a referral from an existing member +- what interests them about the town +- any links to personal websites or social media + +A given is that the applicant is interacting with a "host" that guides them through the process. Should there be more than one host? + +How many rooms should there be? 1? more? + +in terms of data collection, I intend to just save the transcript of their interaction instead of more structured data. The only real structured data are email and referral. + +another idea/thought/dream: + +the whole point of this is to spatialize a form. it's a form! a set of questions and corresponding textarea elements. but in order to trigger self reflection -- as well as a feeling of being seen by another (in a good way) -- i want to turn the form into a shape. i'm thinking about this like the room in Eclipse Penumbra: + +(For the Hollow Head was drug paraphenalia you could walk into. The building itself was the syringe, or the hookah, or the sniff-tube) + +so, spatialized, every room is a question. the rooms take shape as a linear script the user moves through by: + +1. answering a question +2. executing a verb + +and finally at the end, a verb to confirm submission. + +one idea but i'm scratchin: + +opening: + +It's dark. Before you a button appears. It's a pink circle with a ~ at the center. It looks like a button. You could press it. + + +/press button + +A thin seam splits the darkness from the top and buttom of the button. The darkness splits apart and you're standing in a forest clearing. Birds are singing in strange octaves. + +A cube is here, floating. + +cube: hello! how are you? you can respond to me by typing anything and pressing "ctrl+d" + + + +cube: thank you for telling me. i'm just a program so i can't really understand. i hope you forgive me. + +cube: i'm here to help you apply for a homestead over there in tilde town. + +the cube inclines in the direction of what looks like a far off town. + +cube: first, what is an email address we can use to contact you? + + + +cube: cool, thank you. that's right? if so, you can /nod to confirm. otherwise just tell me again what your email is. + + + +cube: excellent. next, you'll talk to + +*/ + type character struct { Name string Description string @@ -145,6 +357,16 @@ func main() { } } +/* + +From the start point the player advances the "form" by performing a tactile action. for now it's a button press but it could be something more interesting later. Keeping this as a one room, limited-verb thing is good for accessibility. + +so the script is a list of strings that advance by tactility...is it dialogue? or scene description? i think i should fake dialogue /as/ scene description. + +You open your eyes. You're standing in a small room. It's dim, lit softly by a mix of candles and electro-luminescent wire. Computers. + +*/ + /* type answers struct { username string