123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453 |
- package door
- import (
- "log"
- "math/rand"
- "time"
- "unicode"
- )
- type NoMoreSecretsConfig struct {
- Jumble_Sec int
- Jumble_Loop_Speed int
- Reveal_Loop_Speed int
- Max_Time int
- Color string
- }
- var NoMoreSecretsDefault NoMoreSecretsConfig
- func init() {
- NoMoreSecretsDefault = NoMoreSecretsConfig{
- Jumble_Sec: 2,
- Jumble_Loop_Speed: 35,
- Reveal_Loop_Speed: 50,
- Max_Time: 5000,
- Color: ColorText("CYAN ON BLACK"),
- }
- }
- func getRandom() byte {
-
- var rb byte = 0x7f
- for rb == 0x7f {
- rb = byte(rand.Intn(0xdf-0x21) + 0x21)
- }
- return rb
- }
- func NoMoreSecrets(output string, Door *Door, config *NoMoreSecretsConfig) {
-
- rand.Seed(time.Now().UnixNano())
- if Unicode {
- var original []rune = []rune(output)
- var work []rune = make([]rune, 0)
- var workpos int = 0
- var charpos []int
- var chartime []int
- var revealpos map[int]int
- var colormap map[int]string
- var coloridx []int
- var lastcolor []int
- var currentANSI string
- var ANSIchar rune
- colormap = make(map[int]string)
- revealpos = make(map[int]int)
- coloridx = make([]int, 0)
-
- lastcolor = make([]int, 1)
- lastcolor[0] = 0
-
-
- for x := 0; x < len(original); x++ {
- var char rune = original[x]
- if char == '\x1b' {
-
- currentANSI = "\x1b["
- if original[x+1] != '[' {
- log.Println("NoMoreSecrets: Found \\x1b not followed by [!")
- }
- x += 2
- for {
- currentANSI += string(original[x])
- if unicode.IsLetter(original[x]) {
- ANSIchar = original[x]
- break
- }
- x++
- }
-
-
- if ANSIchar == 'm' {
-
- Door.UpdateLastColor(currentANSI, &lastcolor)
- colormap[workpos] = Color(lastcolor...)
- coloridx = append(coloridx, workpos)
-
- } else {
-
- var ANSIrunes []rune = []rune(currentANSI)
- work = append(work, ANSIrunes...)
- workpos += len(ANSIrunes)
- }
-
- } else {
-
- if unicode.IsPrint(char) {
- if char == ' ' {
- work = append(work, char)
- chartime = append(chartime, 0)
- } else {
- work = append(work, char)
- chartime = append(chartime, rand.Intn(config.Max_Time+1))
- }
- charpos = append(charpos, workpos)
- revealpos[workpos] = x
- workpos++
- } else {
-
- work = append(work, char)
- workpos++
- }
- }
- }
-
- var renderF func() string = func() string {
- var result string
- var lastcolor string
- var pos int = 0
- for idx, char := range work {
- var found bool
- _, found = revealpos[idx]
- if found {
- for charpos[pos] != idx {
- pos++
- }
-
- if chartime[pos] != 0 && char != ' ' {
- if lastcolor != config.Color {
- result += config.Color
- lastcolor = config.Color
- }
- } else {
-
- var best string
-
- for _, cpos := range coloridx {
- if cpos > idx {
- break
- }
- best = colormap[cpos]
- }
- if lastcolor != best {
- result += best
- lastcolor = best
- }
- }
- }
- result += string(char)
- }
- return result
- }
- for i := 0; i < (config.Jumble_Sec*1000)/config.Jumble_Loop_Speed; i++ {
- for _, pos := range charpos {
- if work[pos] != ' ' {
-
- var rb byte = getRandom()
- var safe []byte = []byte{rb}
- var rndchar string = CP437_to_Unicode(string(safe))
- work[pos] = []rune(rndchar)[0]
- }
- }
- Door.Write(renderF())
- if Door.Disconnect() {
- return
- }
- time.Sleep(time.Millisecond * time.Duration(config.Jumble_Loop_Speed))
- }
- for {
- var revealed bool = true
- for idx, pos := range charpos {
- if work[pos] != ' ' {
- if chartime[idx] > 0 {
- if chartime[idx] < 500 {
- if rand.Intn(3) == 0 {
- var safe []byte = []byte{getRandom()}
- var rndchar string = CP437_to_Unicode(string(safe))
- work[pos] = []rune(rndchar)[0]
- }
- } else {
- if rand.Intn(10) == 0 {
- var safe []byte = []byte{getRandom()}
- var rndchar string = CP437_to_Unicode(string(safe))
- work[pos] = []rune(rndchar)[0]
- }
- }
- if chartime[idx] < config.Reveal_Loop_Speed {
- chartime[idx] = 0
- } else {
- chartime[idx] -= config.Reveal_Loop_Speed
- }
- revealed = false
- } else {
- work[pos] = original[revealpos[pos]]
- }
- }
- }
- Door.Write(renderF())
- if Door.Disconnect() {
- return
- }
- time.Sleep(time.Millisecond * time.Duration(config.Reveal_Loop_Speed))
- if revealed {
- break
- }
- }
- } else {
-
- var original []byte = []byte(output)
- var work []byte
- var workpos int = 0
- var charpos []int
- var chartime []int
- var revealpos map[int]int
- var colormap map[int]string
- var coloridx []int
- var lastcolor []int
- var currentANSI string
- var ANSIchar byte
- work = make([]byte, 0)
- colormap = make(map[int]string)
- revealpos = make(map[int]int)
- coloridx = make([]int, 0)
-
- lastcolor = make([]int, 1)
- lastcolor[0] = 0
-
-
- for x := 0; x < len(original); x++ {
- var char byte = original[x]
- if char == '\x1b' {
-
- currentANSI = "\x1b["
- if original[x+1] != '[' {
- log.Println("NoMoreSecrets: Found \\x1b not followed by [!")
- }
- x += 2
- for {
- currentANSI += string(original[x])
- if unicode.IsLetter(rune(original[x])) {
- ANSIchar = original[x]
- break
- }
- x++
- }
-
- if ANSIchar == 'm' {
-
- Door.UpdateLastColor(currentANSI, &lastcolor)
- colormap[workpos] = Color(lastcolor...)
- coloridx = append(coloridx, workpos)
- } else {
-
- work = append(work, []byte(currentANSI)...)
- workpos += len(currentANSI)
- }
-
- } else {
-
- if unicode.IsPrint(rune(char)) {
- if char == ' ' {
- work = append(work, char)
- chartime = append(chartime, 0)
- } else {
- work = append(work, char)
- chartime = append(chartime, rand.Intn(config.Max_Time+1))
- }
- charpos = append(charpos, workpos)
- revealpos[workpos] = x
- workpos++
- } else {
-
- work = append(work, char)
- workpos++
- }
- }
- }
-
- var renderF func() string = func() string {
- var result []byte
- var lastcolor string
- var pos int = 0
- for idx, char := range work {
- _, found := revealpos[idx]
- if found {
- for charpos[pos] != idx {
- pos++
- }
-
- if chartime[pos] != 0 && char != ' ' {
- if lastcolor != config.Color {
- result = append(result, []byte(config.Color)...)
- lastcolor = config.Color
- }
- } else {
-
- var best string
- for _, cpos := range coloridx {
- if cpos > idx {
- break
- }
- best = colormap[cpos]
- }
- if lastcolor != best {
- result = append(result, []byte(best)...)
- lastcolor = best
- }
- }
- }
- result = append(result, char)
- }
- return string(result)
- }
- for i := 0; i < (config.Jumble_Sec*1000)/config.Jumble_Loop_Speed; i++ {
- for _, pos := range charpos {
- if work[pos] != ' ' {
- work[pos] = getRandom()
- }
- }
- Door.Write(renderF())
- if Door.Disconnect() {
- return
- }
- time.Sleep(time.Millisecond * time.Duration(config.Jumble_Loop_Speed))
- }
- for {
- var revealed bool = true
- for idx, pos := range charpos {
- if work[pos] != ' ' {
- if chartime[idx] > 0 {
- if chartime[idx] < 500 {
- if rand.Intn(3) == 0 {
- work[pos] = getRandom()
- }
- } else {
- if rand.Intn(10) == 0 {
- work[pos] = getRandom()
- }
- }
- if chartime[idx] < config.Reveal_Loop_Speed {
- chartime[idx] = 0
- } else {
- chartime[idx] -= config.Reveal_Loop_Speed
- }
- revealed = false
- } else {
- work[pos] = original[revealpos[pos]]
- }
- }
- }
- Door.Write(renderF())
- if Door.Disconnect() {
- return
- }
- time.Sleep(time.Millisecond * time.Duration(config.Reveal_Loop_Speed))
- if revealed {
- break
- }
- }
- }
- }
|