Initial commit
This commit is contained in:
		
						commit
						534eab9fac
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | atmosphere | ||||||
							
								
								
									
										131
									
								
								forecast.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								forecast.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,131 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"os/exec" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Forecast is a representation of the current state of the weather. | ||||||
|  | type Forecast struct { | ||||||
|  | 	raw        string | ||||||
|  | 	time       TimeOfDay | ||||||
|  | 	cloudiness Cloudiness | ||||||
|  | 	raininess  Raininess | ||||||
|  | 	visibility Visibility | ||||||
|  | 	windiness  Windiness | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewForecast parses the output of ~iajrz's climate program. | ||||||
|  | // TODO?: boolean randomize option to generate completely random weather as a demo mode? | ||||||
|  | func NewForecast() (Forecast, error) { | ||||||
|  | 	out, err := exec.Command("/home/iajrz/climate").Output() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return Forecast{}, err | ||||||
|  | 	} | ||||||
|  | 	rawWeather := string(out) | ||||||
|  | 	return Forecast{ | ||||||
|  | 		raw:        rawWeather, | ||||||
|  | 		time:       TimeOfDay(findSubstring(rawWeather, timeStrings)), | ||||||
|  | 		cloudiness: Cloudiness(findSubstring(rawWeather, cloudStrings)), | ||||||
|  | 		raininess:  Raininess(findSubstring(rawWeather, rainStrings)), | ||||||
|  | 		visibility: Visibility(findSubstring(rawWeather, visibilityStrings)), | ||||||
|  | 		windiness:  Windiness(findSubstring(rawWeather, windStrings)), | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (f Forecast) String() string { | ||||||
|  | 	return f.raw | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func findSubstring(s string, substrings []string) int { | ||||||
|  | 	for i := range substrings { | ||||||
|  | 		if strings.Contains(s, substrings[i]) { | ||||||
|  | 			return i | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type TimeOfDay int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	EarlyMorning TimeOfDay = iota | ||||||
|  | 	Morning | ||||||
|  | 	Afternoon | ||||||
|  | 	Night | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var timeStrings = []string{ | ||||||
|  | 	"early morning", | ||||||
|  | 	"morning", | ||||||
|  | 	"afternoon", | ||||||
|  | 	"night", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Cloudiness int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	ClearSky Cloudiness = iota | ||||||
|  | 	AlmostClear | ||||||
|  | 	PartlyCloudy | ||||||
|  | 	MostlyCloudy | ||||||
|  | 	Cloudy | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var cloudStrings = []string{ | ||||||
|  | 	"clear", | ||||||
|  | 	"almost clear", | ||||||
|  | 	"partly cloudy", | ||||||
|  | 	"mostly cloudy", | ||||||
|  | 	"cloudy", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Raininess int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	NoRain Raininess = iota | ||||||
|  | 	Drizzle | ||||||
|  | 	LightShower | ||||||
|  | 	Shower | ||||||
|  | 	HeavyShower | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var rainStrings = []string{ | ||||||
|  | 	"no rain", | ||||||
|  | 	"a drizzle", | ||||||
|  | 	"a light shower", | ||||||
|  | 	"a shower", | ||||||
|  | 	"a heavy shower", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Visibility int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	NoFog Visibility = iota | ||||||
|  | 	Haze | ||||||
|  | 	Mist | ||||||
|  | 	Fog | ||||||
|  | 	HeavyFog | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var visibilityStrings = []string{ | ||||||
|  | 	"visibility", | ||||||
|  | 	"There's haze", | ||||||
|  | 	"There's mist", | ||||||
|  | 	"There's fog", | ||||||
|  | 	"There's heavy fog", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Windiness int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	NoWind Windiness = iota | ||||||
|  | 	Breeze | ||||||
|  | 	StiffWind | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var windStrings = []string{ | ||||||
|  | 	"no breeze", | ||||||
|  | 	"light breeze", | ||||||
|  | 	"stiff wind", | ||||||
|  | } | ||||||
							
								
								
									
										202
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,202 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	tea "github.com/charmbracelet/bubbletea" | ||||||
|  | 	"github.com/muesli/reflow/wordwrap" | ||||||
|  | 	"github.com/muesli/termenv" | ||||||
|  | 	"strings" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 	app := tea.NewProgram(model{startTime: time.Now()}) | ||||||
|  | 	if err := app.Start(); err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Queues the initial loading of the forecast and | ||||||
|  | func (m model) Init() tea.Cmd { | ||||||
|  | 	return tea.Batch(updateForecast, renderOften) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var updateForecast = func() tea.Msg { | ||||||
|  | 	forecast, err := NewForecast() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return forecast | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var updateForecastOften = tea.Tick(20*time.Second, func(t time.Time) tea.Msg { | ||||||
|  | 	return updateForecast() | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | var makeSceneMsg = func(f Forecast) func() tea.Msg { | ||||||
|  | 	return func() tea.Msg { | ||||||
|  | 		scene, err := NewScene("scene1", f) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		return scene | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type fadeOut float32 | ||||||
|  | type fadeIn float32 | ||||||
|  | 
 | ||||||
|  | // Used to update the progress of a fade out transition. | ||||||
|  | var tickFadeOut = tea.Every(time.Millisecond*100, func(t time.Time) tea.Msg { | ||||||
|  | 	return fadeOut(0.05) | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | // Used to update the progress of a fade in transition. | ||||||
|  | var tickFadeIn = tea.Every(time.Millisecond*100, func(t time.Time) tea.Msg { | ||||||
|  | 	return fadeIn(0.05) | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | type renderTick struct{} | ||||||
|  | 
 | ||||||
|  | // Used to update the screen at least once per second. | ||||||
|  | var renderOften = tea.Tick(time.Second, func(t time.Time) tea.Msg { | ||||||
|  | 	return renderTick{} | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | // Update updates the internal state of the model and queues any events that | ||||||
|  | // need to be scheduled. | ||||||
|  | func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { | ||||||
|  | 	cmds := []tea.Cmd{} | ||||||
|  | 
 | ||||||
|  | 	switch msg := msg.(type) { | ||||||
|  | 	case tea.KeyMsg: | ||||||
|  | 		switch msg.String() { | ||||||
|  | 		case "ctrl+c", "ctrl+d", "q": | ||||||
|  | 			return m, tea.Quit | ||||||
|  | 		case "esc": | ||||||
|  | 			// TODO: Menu for options. Maybe 100% randomized weather? | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	case tea.WindowSizeMsg: | ||||||
|  | 		m.width = msg.Width | ||||||
|  | 		m.height = msg.Height | ||||||
|  | 
 | ||||||
|  | 	case Forecast: | ||||||
|  | 		// Re-queue the forecast polling. | ||||||
|  | 		cmds = append(cmds, updateForecastOften) | ||||||
|  | 
 | ||||||
|  | 		// No action required if the forecast hasn't changed. | ||||||
|  | 		if msg == m.Forecast { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// If this isn't the initial startup forecast, we need to fade out the scene. | ||||||
|  | 		if m.Forecast != (Forecast{}) { | ||||||
|  | 			m.fading = true | ||||||
|  | 			cmds = append(cmds, tickFadeOut) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// In all cases, we need to load a scene with the forecast. | ||||||
|  | 		m.Forecast = msg | ||||||
|  | 		cmds = append(cmds, makeSceneMsg(m.Forecast)) | ||||||
|  | 
 | ||||||
|  | 	case Scene: | ||||||
|  | 		if m.Scene.foreground == nil { | ||||||
|  | 			m.Scene = msg | ||||||
|  | 		} else { | ||||||
|  | 			m.nextScene = msg | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	case fadeOut: | ||||||
|  | 		m.fadeProgress += float32(msg) | ||||||
|  | 		if m.fadeProgress >= 1.0 { | ||||||
|  | 			m.fadeProgress = 1.0 | ||||||
|  | 			// To unfade, we need a Scene ready to rock. If we don't have one, stall. | ||||||
|  | 			if m.nextScene.foreground == nil { | ||||||
|  | 				cmds = append(cmds, tickFadeOut) | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			m.Scene = m.nextScene | ||||||
|  | 			m.nextScene = Scene{} | ||||||
|  | 			cmds = append(cmds, tickFadeIn) | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		cmds = append(cmds, tickFadeOut) | ||||||
|  | 
 | ||||||
|  | 	case fadeIn: | ||||||
|  | 		m.fadeProgress -= float32(msg) | ||||||
|  | 		if m.fadeProgress <= 0.0 { | ||||||
|  | 			m.fadeProgress = 0.0 | ||||||
|  | 			m.fading = false | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		cmds = append(cmds, tickFadeIn) | ||||||
|  | 
 | ||||||
|  | 	case error: | ||||||
|  | 		m.err = msg | ||||||
|  | 
 | ||||||
|  | 	case renderTick: | ||||||
|  | 		cmds = append(cmds, renderOften) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return m, tea.Batch(cmds...) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // View lays out the screen and queries the Scene for its contents. | ||||||
|  | // It also handles transitions when changing from Scene to Scene. | ||||||
|  | func (m model) View() string { | ||||||
|  | 	if m.err != nil { | ||||||
|  | 		return m.err.Error() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	weather := wordwrap.String(m.Forecast.String(), m.width) | ||||||
|  | 	m.height -= strings.Count(weather, "\n") | ||||||
|  | 	weather = strings.TrimSpace(weather) // Trim trailing newline | ||||||
|  | 
 | ||||||
|  | 	output := "" | ||||||
|  | 	lastStyle := Style{} | ||||||
|  | 	profile := termenv.EnvColorProfile() | ||||||
|  | 
 | ||||||
|  | 	// Center scene in terminal | ||||||
|  | 	xOff := (m.Scene.Width - m.width) / 2 | ||||||
|  | 	yOff := (m.Scene.Height - m.height) / 2 | ||||||
|  | 
 | ||||||
|  | 	for y := yOff; y < yOff+m.height; y++ { | ||||||
|  | 		for x := xOff; x < xOff+m.width; x++ { | ||||||
|  | 			char, style := m.Scene.GetCell(x, y, int(time.Since(m.startTime).Seconds())) | ||||||
|  | 			style = style.Convert(profile) | ||||||
|  | 
 | ||||||
|  | 			// For wipe transitions, replace character with blank space. | ||||||
|  | 			if float32((x-xOff)/2+y-yOff) < m.fadeProgress*float32(m.width/2+m.height) { | ||||||
|  | 				char = ' ' | ||||||
|  | 				style = Style{} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// Only output formatting escape codes if the style's changed since the last cell. | ||||||
|  | 			if lastStyle.String() != style.String() { | ||||||
|  | 				output += style.String() | ||||||
|  | 				lastStyle = style | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			output += string(char) | ||||||
|  | 		} | ||||||
|  | 		output += "\n" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	output += termenv.CSI + termenv.ResetSeq + "m" | ||||||
|  | 	output += weather | ||||||
|  | 
 | ||||||
|  | 	return output | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type model struct { | ||||||
|  | 	Forecast | ||||||
|  | 	Scene | ||||||
|  | 	err          error | ||||||
|  | 	nextScene    Scene | ||||||
|  | 	fading       bool | ||||||
|  | 	fadeProgress float32 | ||||||
|  | 	width        int | ||||||
|  | 	height       int | ||||||
|  | 	startTime    time.Time | ||||||
|  | } | ||||||
							
								
								
									
										271
									
								
								scene.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								scene.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,271 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bufio" | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/muesli/termenv" | ||||||
|  | 	"github.com/ojrac/opensimplex-go" | ||||||
|  | 	"io" | ||||||
|  | 	"os" | ||||||
|  | 	"path" | ||||||
|  | 	"unicode" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Style represents a pair of colors, foreground and background. | ||||||
|  | type Style struct { | ||||||
|  | 	fg termenv.Color | ||||||
|  | 	bg termenv.Color | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Convert is a wrapper for termenv.Profile.Convert, it converts the foreground | ||||||
|  | // and background colors of a Style to be within a given terminal's Profile. | ||||||
|  | func (s Style) Convert(profile termenv.Profile) Style { | ||||||
|  | 	return Style{ | ||||||
|  | 		profile.Convert(s.fg), | ||||||
|  | 		profile.Convert(s.bg), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // String fills the Stringer interface and returns an ANSI escape code | ||||||
|  | // formatted to produce text in the specified Style. | ||||||
|  | func (s Style) String() string { | ||||||
|  | 	if s.fg == nil { | ||||||
|  | 		s.fg = termenv.NoColor{} | ||||||
|  | 	} | ||||||
|  | 	if s.bg == nil { | ||||||
|  | 		s.bg = termenv.NoColor{} | ||||||
|  | 	} | ||||||
|  | 	// TODO: Looks like the background color is overriding the foreground color. What's the proper way to do this? | ||||||
|  | 	return fmt.Sprintf("%s%s;%sm", termenv.CSI, s.fg.Sequence(false), s.bg.Sequence(true)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Scene holds all the necessary information to make a dynamic, weather-y ASCII | ||||||
|  | // landscape. | ||||||
|  | type Scene struct { | ||||||
|  | 	foreground [][]rune | ||||||
|  | 	background [][]rune | ||||||
|  | 	windground [][]rune | ||||||
|  | 	depth      [][]rune | ||||||
|  | 	forecast   Forecast | ||||||
|  | 
 | ||||||
|  | 	generator opensimplex.Noise | ||||||
|  | 
 | ||||||
|  | 	Width  int | ||||||
|  | 	Height int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	fgPath    = "foreground.txt" | ||||||
|  | 	depthPath = "depth.txt" | ||||||
|  | 	windPath  = "wind.txt" | ||||||
|  | 
 | ||||||
|  | 	earlyPath     = "early.txt" | ||||||
|  | 	morningPath   = "morning.txt" | ||||||
|  | 	afternoonPath = "afternoon.txt" | ||||||
|  | 	nightPath     = "night.txt" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var timeToPath = []string{ | ||||||
|  | 	earlyPath, | ||||||
|  | 	morningPath, | ||||||
|  | 	afternoonPath, | ||||||
|  | 	nightPath, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewScene accepts a path to a folder containing foreground, windground, | ||||||
|  | // depth, and background files and loads them from disk as needed to generate | ||||||
|  | // imagery for the given forecast. | ||||||
|  | func NewScene(scenePath string, forecast Forecast) (Scene, error) { | ||||||
|  | 	var s Scene | ||||||
|  | 	var err error | ||||||
|  | 
 | ||||||
|  | 	s.forecast = forecast | ||||||
|  | 	s.generator = opensimplex.NewNormalized(0) | ||||||
|  | 
 | ||||||
|  | 	s.foreground, err = readRunesFromFile(path.Join(scenePath, fgPath)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return s, err | ||||||
|  | 	} | ||||||
|  | 	s.depth, err = readRunesFromFile(path.Join(scenePath, depthPath)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return s, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s.windground, err = readRunesFromFile(path.Join(scenePath, windPath)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return s, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	bgPath := timeToPath[forecast.time] | ||||||
|  | 	s.background, err = readRunesFromFile(path.Join(scenePath, bgPath)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return s, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s.normalize() | ||||||
|  | 
 | ||||||
|  | 	/*m.depthData = make([][]uint8, 0) | ||||||
|  | 	for i := range depthRunes { | ||||||
|  | 		m.depthData = append(m.depthData, make([]uint8, 0)) | ||||||
|  | 		for j := range depthRunes[i] { | ||||||
|  | 			m.depthData[i] = append(m.depthData[i], uint8(depthRunes[i][j])-48) | ||||||
|  | 		} | ||||||
|  | 	}*/ | ||||||
|  | 	return s, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // normalize adjusts the foreground, windground, depth map, and background to | ||||||
|  | // have matching widths and heights. It adjusts by cropping to the shortest | ||||||
|  | // number of lines between the four and adjusts each line to the shortest of | ||||||
|  | // any lines in any of the four maps. | ||||||
|  | func (s *Scene) normalize() { | ||||||
|  | 	scenes := [...][][]rune{s.foreground, s.windground, s.depth, s.background} | ||||||
|  | 
 | ||||||
|  | 	s.Height = 999999999 | ||||||
|  | 	for i := range scenes { | ||||||
|  | 		if len(scenes[i]) < s.Height { | ||||||
|  | 			s.Height = len(scenes[i]) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for i := range scenes { | ||||||
|  | 		scenes[i] = scenes[i][:s.Height] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s.Width = 999999999 | ||||||
|  | 	for j := 0; j < s.Height; j++ { | ||||||
|  | 		for i := range scenes { | ||||||
|  | 			if len(scenes[i][j]) < s.Width { | ||||||
|  | 				s.Width = len(scenes[i][j]) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for i := range scenes { | ||||||
|  | 			scenes[i][j] = scenes[i][j][:s.Width] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: Change this to a map? Map can be iterated over and still referenced by name. | ||||||
|  | 	s.foreground = scenes[0] | ||||||
|  | 	s.windground = scenes[1] | ||||||
|  | 	s.depth = scenes[2] | ||||||
|  | 	s.background = scenes[3] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s Scene) GetCell(x, y, time int) (rune, Style) { | ||||||
|  | 	fx := float64(x) | ||||||
|  | 	fy := float64(y) | ||||||
|  | 	ftime := float64(time) | ||||||
|  | 	fcloud := float64(s.forecast.cloudiness) | ||||||
|  | 	fwind := float64(s.forecast.windiness) | ||||||
|  | 	frain := float64(s.forecast.raininess) | ||||||
|  | 
 | ||||||
|  | 	char := ' ' | ||||||
|  | 	style := Style{ | ||||||
|  | 		termenv.ANSI256Color(255), | ||||||
|  | 		termenv.ANSI256Color(232), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Out of bounds | ||||||
|  | 	if y >= s.Height || y < 0 { | ||||||
|  | 		return char, Style{} | ||||||
|  | 	} | ||||||
|  | 	if x >= s.Width || x < 0 { | ||||||
|  | 		return char, Style{} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	depth := uint8(s.depth[y][x] - 48) | ||||||
|  | 
 | ||||||
|  | 	// Char selection | ||||||
|  | 	char = s.foreground[y][x] | ||||||
|  | 	// Pull from wind map if the current cell is windswept. | ||||||
|  | 	if fwind > 0.0 && s.generator.Eval3(fx/40+fwind/8*ftime*2, fy/20, ftime/5+fwind/10*ftime/2) > 0.6 { | ||||||
|  | 		char = s.windground[y][x] | ||||||
|  | 	} | ||||||
|  | 	// Depth 9 is considered "transparent," so use the char from the background. | ||||||
|  | 	if depth == 9 { | ||||||
|  | 		char = s.background[y][x] | ||||||
|  | 	} | ||||||
|  | 	if frain > 0.0 && 0.1+frain/20 > s.generator.Eval3(fx+ftime*fwind*3, fy-ftime*5, ftime/15) { | ||||||
|  | 		char = '|' | ||||||
|  | 		if fwind > 1.0 { | ||||||
|  | 			char = '/' | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Style selection | ||||||
|  | 	// Calculate fog | ||||||
|  | 	fog := (depth - 1) + uint8(s.forecast.visibility-1)*2 | ||||||
|  | 	if s.forecast.visibility == 0 { | ||||||
|  | 		fog = (depth + uint8(s.forecast.visibility)) / 2 | ||||||
|  | 	} | ||||||
|  | 	// Don't show fog in the sky during the night. | ||||||
|  | 	if depth == 9 && (s.forecast.time == Night || s.forecast.time == EarlyMorning) { | ||||||
|  | 		fog = 0 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add clouds | ||||||
|  | 	cloudiness := 0 | ||||||
|  | 	if depth > 8 && fcloud/5 > s.generator.Eval3(fx/50+ftime/24+ftime*(fwind/8), fy/12, 1000+ftime/80) { | ||||||
|  | 		cloudiness += 10 | ||||||
|  | 	} | ||||||
|  | 	if depth > 6 && fcloud/7 > s.generator.Eval3(fx/20+ftime/14+ftime*(fwind/8), fy/6, 0+ftime/80) { | ||||||
|  | 		cloudiness += 10 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// At night, fog obscures distant objects with darkness. | ||||||
|  | 	if s.forecast.time == Night || s.forecast.time == EarlyMorning { | ||||||
|  | 		style.fg = termenv.ANSI256Color(255 - fog - fog/2) | ||||||
|  | 	} else { | ||||||
|  | 		// Merge fog with clouds during daytime. | ||||||
|  | 		cloudiness += int(fog) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if cloudiness > 23 { | ||||||
|  | 		cloudiness = 23 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if cloudiness > 0 { | ||||||
|  | 		style.bg = termenv.ANSI256Color(232 + cloudiness) | ||||||
|  | 	} else { | ||||||
|  | 		style.bg = termenv.ANSI256Color(232 + fog) | ||||||
|  | 	} | ||||||
|  | 	return char, style | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // readRunesFromFile reads the file at the given path and reads it character by | ||||||
|  | // character, line by line into a slice of slices of runes. | ||||||
|  | func readRunesFromFile(filepath string) ([][]rune, error) { | ||||||
|  | 	file, err := os.Open(filepath) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	br := bufio.NewReader(file) | ||||||
|  | 	img := make([][]rune, 0) | ||||||
|  | 	img = append(img, make([]rune, 0)) | ||||||
|  | 
 | ||||||
|  | 	for { | ||||||
|  | 		r, s, err := br.ReadRune() | ||||||
|  | 		if err != nil { | ||||||
|  | 			if err == io.EOF { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Invalid unicode characters are skipped. | ||||||
|  | 		if r == unicode.ReplacementChar && s == 1 { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Start a new slice on newline, otherwise append character to current slice. | ||||||
|  | 		if r == '\n' { | ||||||
|  | 			img = append(img, make([]rune, 0)) | ||||||
|  | 		} else { | ||||||
|  | 			img[len(img)-1] = append(img[len(img)-1], r) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return img, nil | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								scene1/afternoon.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								scene1/afternoon.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  |                                                                                        ---___                 |                      __------''''       | ||||||
|  |                                                                                                 ---__       ,.---.,        __---                        | ||||||
|  |                                                                                                        -__ ;/-'''-\; --'                                | ||||||
|  |                                                                                                           :|'     `|:                                   | ||||||
|  |                                                                                                           :|.     ,|;  --__ ___                         | ||||||
|  |                                                                                                      __--- ;\-___-/;             ''-- --___             | ||||||
|  |                                                                                                    ''    ,  `'---'`                         -----____   | ||||||
|  |                                                                                         ___---''        /                                            '' | ||||||
|  |                                                                                       ''               '             \                                  | ||||||
|  |                                                                          ____--                       ,               \                                 | ||||||
|  |                                                                        ''                            /                                                  | ||||||
|  |                                                                                                     /                   \                               | ||||||
|  |                                                       __--                                         '                     \                              | ||||||
|  |                                                                                                                           \                             | ||||||
|  |                                                                                                  /                                                      | ||||||
|  |                                                                                                 /                                                       | ||||||
|  |                                                                                                /                                                        | ||||||
|  |                                                                                               '                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
							
								
								
									
										31
									
								
								scene1/depth.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								scene1/depth.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 | ||||||
|  | 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 | ||||||
|  | 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999899 | ||||||
|  | 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999988999999999999988888 | ||||||
|  | 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999889999999999999999999999999999999998888888888899999888888888888 | ||||||
|  | 9999999999999999999999999999999999998999999999999999999999999999999999999999999998888888888889999999999999999999999999888888888888888889998888888888888 | ||||||
|  | 9999999999999999999999999999999999888889999988888888999999988889999998889998888888888888888888888888899999888889999888888888888888888888888888888888888 | ||||||
|  | 9999999999999999999999999999999998888888888888888888888988888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 | ||||||
|  | 9999999999999999999999999999998888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888555555555888 | ||||||
|  | 9999999999999999999999999999988888888888888888888888888888888888888888888888888888888888888888888888855555555555888888888855555555555555555555555555555 | ||||||
|  | 9999999999999999999999999988888888888888888888888888888888888888888888888888888888888888888888555555555555555555555535555555555555555555555555555555555 | ||||||
|  | 9999999999999998889999999888888888888888888888888888888888888888888888888888888888888888885555555555555555555555555355555555555555555555555555555555555 | ||||||
|  | 9999999999999988888899998888888888888888888888888888888888888888888888888888888888888885555555555555555555555555553555555555555555555555555555555555555 | ||||||
|  | 9999988889999888888888888888888888888888888888888888888888888888888888888888555558888833333333333333333333553333335555555555555555555555555555555555555 | ||||||
|  | 9888888888888888888888888888888888888888888888888888888888888888888888855555555555555333333333333333333333355555533555555555555555555555555555555555555 | ||||||
|  | 8888888888888888888888888888888888888555555558888888888888555555555555555555555555533333333333333333333333335555535355555555555555533333333333333333333 | ||||||
|  | 8888888888888888888888555588885555555555555555555555555555555555555555555555555555333333333333333333333333344444434434444444333333333333333333333333333 | ||||||
|  | 8888888888888888855555555555555555555555555555555555555555555555555555555555555444433333333333333333333333344444434444444433333333333333333333333333333 | ||||||
|  | 8888888855555555555555555555555555555555555555555555544444444444444444444444444444433333333333333333333333344433333333333333333333333333333333333333333 | ||||||
|  | 5555555555555555555555555555555555555555555544444444444444443333333333333333333333333333333333333333333333333333333333333333333333333111111111111111111 | ||||||
|  | 5555555555555555555555555555555555544444444444444444444444333333333333333333333333333333333333333333333333333333333333331111111111111111111111111111111 | ||||||
|  | 5555555555555555544444444444444444444444444444444444443333333333333333333333333333333333333333333333333333333311111111111111111111111111111111111111111 | ||||||
|  | 4444444444444444444444444444444444444444444444444333333333333333333333333333333333333333333333333333333331111111111111111111111111111111111111111111111 | ||||||
|  | 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333111111111111111111111111111111111111111111111111 | ||||||
|  | 3333333333333333333333333333333333333333333333333333333333333333333333333333333333332222222222222221111111111111111111111111111111111111111111111111111 | ||||||
|  | 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111111111111111111111111111111111111111111111111 | ||||||
|  | 2222222222222222222222222222222222221212222222222222222222222222222222222211111111111111111111111111111111111111111111111111111111111111111111111111111 | ||||||
|  | 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 | ||||||
|  | 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 | ||||||
|  | 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 | ||||||
|  | 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 | ||||||
							
								
								
									
										31
									
								
								scene1/early.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								scene1/early.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  |                                                                                   .                            *                                        | ||||||
|  |                                            `                              *                                       .                 `                   | ||||||
|  |         *                                                                                           `          .:  TWA.                        *        | ||||||
|  |                              *                                  .                                        .    /  0    Vm *                              | ||||||
|  |                                                                                                              ,       . 'B               .               | ||||||
|  |                                                         *                     *                  *           |'         D                               | ||||||
|  |                     `                                                                                        '|    O    P                               | ||||||
|  |                                                                                                               \\                                        | ||||||
|  | .                                                      '                                                       `=____-'                                 | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
							
								
								
									
										31
									
								
								scene1/foreground.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								scene1/foreground.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                     .   | ||||||
|  |                                                                                                                                    __             ./ \.  | ||||||
|  |                                                                                         __                                 ___.--''  \     _.--'\/      | ||||||
|  |                                     .                                            ___,.-"  '-,                         _--''           \   /     /       | ||||||
|  |                                   ./ \.     /''\_.-.       _-".      .-.   __.--'"           '--.____     ___..    _-'                 '-/              | ||||||
|  |                                  /     \_.-'        \-. ,-"    \_-"""   \-"                          "---'     \--"                                     | ||||||
|  |                               __/                      '                                                                                   ,----.___    | ||||||
|  |                              /                                                                       _._________          _______..------''         ''- | ||||||
|  |                           .-'                                                                 _.--'''           ''--/-''''                              | ||||||
|  |                .__       /                                                                _-'`                     /                                    | ||||||
|  |               /   '-    /                                                              .-'  __                    /                                     | ||||||
|  |      __..    /      '--"                                                    _.--.     /-----""----,-,_____  -----O                                  '   | ||||||
|  |  _.-'    '--'                                                          __.-'     `-__//-\___-'  .' _ '.   \      |\                  '                  | ||||||
|  | '                                    _,-.,___             ____,,,,..../            ,-'|+|,-  .'   |+|  '-,-"     | \                                    | ||||||
|  |                       ____    ,.----"        \___,----''``                        -,--   ---|             |      |  \       .=                          | ||||||
|  |                  ..--'    '--/                                           .     -   | ==  == |   _    _    |      |                                      | ||||||
|  |         .--.___.'                                    __                            |  ===   |  |+|  |+|   |      |                        '             | ||||||
|  | -'-.___/                               '    _  -               _    _    __  ___ __|__|||___|_____________|___  _|_    _                                | ||||||
|  |                         '               .-                - '                                                                                           | ||||||
|  |                                      '                -'                                                      -             '                           | ||||||
|  |                                                    '                                                     .                                              | ||||||
|  |                            _     .   -    -    "               '      &&                                                                           '    | ||||||
|  |                      '                                                              _..=           -                               '                    | ||||||
|  |           '                                                                           _.'  -                             '                              | ||||||
|  |    '               '                * *                                    '                                '                                 '         | ||||||
|  |                                    *|*|*         @&&                                               ,            &&                                      | ||||||
|  |    '                                            &&&@&          '                                                                      '                 | ||||||
|  |                 '                                                                     '                                                                 | ||||||
|  |                                                                                                                                                         | ||||||
							
								
								
									
										31
									
								
								scene1/morning.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								scene1/morning.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  |  '--__                |                      __------                                                                                                   | ||||||
|  |          --__       ,.---.,        __---                                                                                                                | ||||||
|  |                -__ ;/-'''-\; --'                                                                                                                        | ||||||
|  |                   :|'     `|:                                                                                                                           | ||||||
|  |                   :|.     ,|;  --__ ___                                                                                                                 | ||||||
|  |                    ;\-___-/;             ''--  ____                                                                                                     | ||||||
|  |                  ,  `'---'`                             '----_____                                                                                      | ||||||
|  |                 /                                                        -------____                                                                    | ||||||
|  |                '             \                                                              ____                                                        | ||||||
|  |               ,               \                                                                 '''--------                                             | ||||||
|  |              /                                                                                                                                          | ||||||
|  |             /                   \                                                                                                                       | ||||||
|  |            /                     \                                                                                                                      | ||||||
|  |           '                       \                                                                                                                     | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
							
								
								
									
										31
									
								
								scene1/night.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								scene1/night.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  |                                                                                   .                            *                                        | ||||||
|  |                                            `                              *                                       .                 `                   | ||||||
|  |         *        .:  TWA.                                                                           `                                          *        | ||||||
|  |                 /  0    Vm   *                                  .                                        .                *                              | ||||||
|  |                ,       . 'B                                                                                        *                    .               | ||||||
|  |                |'         D                             *                     *                  *                                                      | ||||||
|  |                '|    O    P                                                                                                                             | ||||||
|  |                 \\                                                                                                                                      | ||||||
|  | .                `=____-'                              '                                                                                                | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
							
								
								
									
										31
									
								
								scene1/wind.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								scene1/wind.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                         | ||||||
|  |                                                                                                                                                     .   | ||||||
|  |                                                                                                                                    __             ./ \. | ||||||
|  |                                                                                         __                                 ___.--''  \     _.--'\/      | ||||||
|  |                                     .                                            ___,.-"  '-,                         _--''           \   /     /       | ||||||
|  |                                   ./ \.     /''\_.-.       _-".      .-.   __.--'"           '--.____     ___..    _-'                 '-/              | ||||||
|  |                                  /     \_.-'        \-. ,-"    \_-"""   \-"                          "---'     \--"                                     | ||||||
|  |                               __/                      '                                                                                   ,----.___    | ||||||
|  |                              /                                                                       _._________          _______..------''         ''- | ||||||
|  |                           .-'                                                                 _.--'''           ''--/-''''                              | ||||||
|  |                .__       /                                                                _-'`                     /                                    | ||||||
|  |               /   '-    /                                                              .-'  __                    /                                     | ||||||
|  |      __..    /      '--"                                                    _.--.     /-----""----,-,_____  -----O                                  `   | ||||||
|  |  _.-'    '--'                                                          __.-'     `-__//-\___-'  .' _ '.   \      |\                  `                  | ||||||
|  | '                                    _,-.,___             ____,,,,..../            ,-'|+|,-  .'   |+|  '-,-"     | \                                    | ||||||
|  |                       ____    ,.----"        \___,----''``                        -,--   ---|             |      |  \       .=                          | ||||||
|  |                  ..--'    '--/                                           .     -   | ==  == |   _    _    |      |                                      | ||||||
|  |         .--.___.'                                    __                            |  ===   |  |+|  |+|   |      |                        `             | ||||||
|  | -'-.___/                               `    _  -               _    _    __  ___ __|__|||___|_____________|___  _|_    _                                | ||||||
|  |                         `               .-                - '                                                                                           | ||||||
|  |                                      `                -'                                                      -             '                           | ||||||
|  |                                                    '                                                     .                                              | ||||||
|  |                            _     .   -    -    "               `      &&                                                                           '    | ||||||
|  |                      '                                                              _..=           -                               `                    | ||||||
|  |           '                                                                           _.`  -                             '                              | ||||||
|  |    `               `                + +                                    `                                `                                 `         | ||||||
|  |                                    +|+|+         @&&                                               ,            &&                                      | ||||||
|  |    '                                            &&&@&          `                                                                      `                 | ||||||
|  |                 `                                                                     `                                                                 | ||||||
|  |                                                                                                                                                         | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user