forked from tildetown/town
		
	some color/presentation tweaks
This commit is contained in:
		
							parent
							
								
									d7adcbf11f
								
							
						
					
					
						commit
						39396eba4e
					
				| @ -46,6 +46,8 @@ func cli(s *streams) error { | |||||||
| 	mainFlex := tview.NewFlex() | 	mainFlex := tview.NewFlex() | ||||||
| 	innerFlex := tview.NewFlex() | 	innerFlex := tview.NewFlex() | ||||||
| 	input := tview.NewTextArea() | 	input := tview.NewTextArea() | ||||||
|  | 	input.SetBorder(true).SetBorderColor(tcell.ColorPaleTurquoise) | ||||||
|  | 	input.SetTitle("press ctrl+d to send") | ||||||
| 
 | 
 | ||||||
| 	title := tview.NewTextView() | 	title := tview.NewTextView() | ||||||
| 	title.SetDynamicColors(true) | 	title.SetDynamicColors(true) | ||||||
| @ -54,10 +56,14 @@ func cli(s *streams) error { | |||||||
| 
 | 
 | ||||||
| 	msgScroll := tview.NewTextView() | 	msgScroll := tview.NewTextView() | ||||||
| 	msgScroll.SetDynamicColors(true) | 	msgScroll.SetDynamicColors(true) | ||||||
|  | 	msgScroll.SetBackgroundColor(tcell.ColorBlack) | ||||||
|  | 	msgScroll.SetTextColor(tcell.ColorWhite) | ||||||
| 
 | 
 | ||||||
| 	sidebar := tview.NewTextView() | 	sidebar := tview.NewTextView() | ||||||
| 	sidebar.SetBorder(true) | 	sidebar.SetBorder(true) | ||||||
| 	sidebar.SetDynamicColors(true) | 	sidebar.SetDynamicColors(true) | ||||||
|  | 	sidebar.SetBackgroundColor(tcell.ColorBlack) | ||||||
|  | 	sidebar.SetTextColor(tcell.ColorGray) | ||||||
| 	sidebar.SetText(heredoc.Doc(` | 	sidebar.SetText(heredoc.Doc(` | ||||||
| 		[-:-:b]hey here are some hints[-:-:-] | 		[-:-:b]hey here are some hints[-:-:-] | ||||||
| 
 | 
 | ||||||
| @ -68,12 +74,12 @@ func cli(s *streams) error { | |||||||
| 
 | 
 | ||||||
| 		try a [-:-:b]verb[-:-:-] using [-:-:b]/[-:-:-] like: | 		try a [-:-:b]verb[-:-:-] using [-:-:b]/[-:-:-] like: | ||||||
| 
 | 
 | ||||||
| 		[-:-:b]/go north[-:-:-] | 		[-:-:b]/nod[-:-:-] | ||||||
| 
 | 
 | ||||||
| 	`)) | 	`)) | ||||||
| 
 | 
 | ||||||
| 	innerFlex.SetDirection(tview.FlexColumn) | 	innerFlex.SetDirection(tview.FlexColumn) | ||||||
| 	innerFlex.AddItem(msgScroll, 0, 2, false) | 	innerFlex.AddItem(msgScroll, 0, 3, false) | ||||||
| 	innerFlex.AddItem(sidebar, 0, 1, false) | 	innerFlex.AddItem(sidebar, 0, 1, false) | ||||||
| 
 | 
 | ||||||
| 	mainFlex.SetDirection(tview.FlexRow) | 	mainFlex.SetDirection(tview.FlexRow) | ||||||
| @ -88,9 +94,146 @@ func cli(s *streams) error { | |||||||
| 
 | 
 | ||||||
| 	player := newCharacter("you", "TODO") | 	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) { | 	handleInput := func(msg string) { | ||||||
| 		if strings.HasPrefix(msg, "/") { | 		trimmed := strings.TrimSpace(msg) | ||||||
| 			// TODO handle command | 		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)) | 		fmt.Fprintln(msgScroll, player.Say(msg)) | ||||||
| 	} | 	} | ||||||
| @ -106,9 +249,78 @@ func cli(s *streams) error { | |||||||
| 		return event | 		return event | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
|  | 	app.SetAfterDrawFunc(func(_ tcell.Screen) { | ||||||
|  | 		scenes[currentScreen]() | ||||||
|  | 		app.SetAfterDrawFunc(nil) | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
| 	return app.Run() | 	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" | ||||||
|  | 
 | ||||||
|  | <input> | ||||||
|  | 
 | ||||||
|  | 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? | ||||||
|  | 
 | ||||||
|  | <input> | ||||||
|  | 
 | ||||||
|  | cube: cool, thank you. that's <email> right? if so, you can /nod to confirm. otherwise just tell me again what your email is. | ||||||
|  | 
 | ||||||
|  | <nod> | ||||||
|  | 
 | ||||||
|  | cube: excellent. next, you'll talk to | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
| type character struct { | type character struct { | ||||||
| 	Name        string | 	Name        string | ||||||
| 	Description 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 { | type answers struct { | ||||||
| 	username string | 	username string | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user