|
@@ -0,0 +1,176 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "red-green/door"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+type Deck struct {
|
|
|
+ Cards []door.Panel
|
|
|
+ Backs []door.Panel
|
|
|
+ Mark []door.Panel
|
|
|
+}
|
|
|
+
|
|
|
+func (d *Deck) Init() {
|
|
|
+ d.Cards = make([]door.Panel, 52)
|
|
|
+ for x := 0; x < 52; x++ {
|
|
|
+ d.Cards[x] = CardOf(x)
|
|
|
+ }
|
|
|
+ d.Backs = make([]door.Panel, 5)
|
|
|
+ for x := 0; x < 5; x++ {
|
|
|
+ d.Backs[0] = BackOf(x)
|
|
|
+ }
|
|
|
+ d.Mark = make([]door.Panel, 2)
|
|
|
+ d.Mark[0] = MarkOf(0)
|
|
|
+ d.Mark[1] = MarkOf(1)
|
|
|
+}
|
|
|
+
|
|
|
+func CardOf(c int) door.Panel {
|
|
|
+ suit := GetSuit(c)
|
|
|
+ rank := GetRank(c)
|
|
|
+ var is_red bool = suit < 2
|
|
|
+ var color string
|
|
|
+
|
|
|
+ if is_red {
|
|
|
+ color = door.ColorText("RED ON WHITE")
|
|
|
+ } else {
|
|
|
+ color = door.ColorText("BLACK ON WHITE")
|
|
|
+ }
|
|
|
+
|
|
|
+ p := door.Panel{
|
|
|
+ X: 0,
|
|
|
+ Y: 0,
|
|
|
+ Width: 5}
|
|
|
+ r := RankSymbol(rank)
|
|
|
+ s := SuitSymbol(suit)
|
|
|
+
|
|
|
+ p.Lines = append(p.Lines,
|
|
|
+ door.Line{Text: string(r) + string(s) + " ",
|
|
|
+ DefaultColor: color})
|
|
|
+ p.Lines = append(p.Lines,
|
|
|
+ door.Line{Text: " " + string(s) + " ",
|
|
|
+ DefaultColor: color})
|
|
|
+ p.Lines = append(p.Lines,
|
|
|
+ door.Line{Text: " " + string(s) + string(r),
|
|
|
+ DefaultColor: color})
|
|
|
+ return p
|
|
|
+}
|
|
|
+
|
|
|
+func BackOf(level int) door.Panel {
|
|
|
+ p := door.Panel{
|
|
|
+ X: 0,
|
|
|
+ Y: 0,
|
|
|
+ Width: 5,
|
|
|
+ }
|
|
|
+ for x := 0; x < 3; x++ {
|
|
|
+ p.Lines = append(p.Lines,
|
|
|
+ door.Line{Text: strings.Repeat(string(BackSymbol(level)), 5)})
|
|
|
+ }
|
|
|
+ return p
|
|
|
+}
|
|
|
+
|
|
|
+func MarkOf(c int) door.Panel {
|
|
|
+ p := door.Panel{Width: 1}
|
|
|
+ color := door.ColorText("BLUE ON WHITE")
|
|
|
+ var m rune
|
|
|
+ if c == 0 {
|
|
|
+ m = ' '
|
|
|
+ } else {
|
|
|
+ if door.Unicode {
|
|
|
+ m = '\u25a0'
|
|
|
+ } else {
|
|
|
+ m = '\xfe'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ p.Lines = append(p.Lines,
|
|
|
+ door.Line{Text: string(m),
|
|
|
+ DefaultColor: color})
|
|
|
+ return p
|
|
|
+}
|
|
|
+
|
|
|
+func RankSymbol(c int) rune {
|
|
|
+ const symbols = "A23456789TJQK"
|
|
|
+ return rune(symbols[c])
|
|
|
+}
|
|
|
+
|
|
|
+func SuitSymbol(c int) rune {
|
|
|
+ if door.Unicode {
|
|
|
+ switch c {
|
|
|
+ case 0:
|
|
|
+ return '\u2665'
|
|
|
+ case 1:
|
|
|
+ return '\u2666'
|
|
|
+ case 2:
|
|
|
+ return '\u2663'
|
|
|
+ case 3:
|
|
|
+ return '\u2660'
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if door.Full_CP437 {
|
|
|
+ switch c {
|
|
|
+ case 0:
|
|
|
+ return '\x03'
|
|
|
+ case 1:
|
|
|
+ return '\x04'
|
|
|
+ case 2:
|
|
|
+ return '\x05'
|
|
|
+ case 3:
|
|
|
+ return '\x06'
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ switch c {
|
|
|
+ case 0:
|
|
|
+ return '*'
|
|
|
+ case 1:
|
|
|
+ return '^'
|
|
|
+ case 2:
|
|
|
+ return '%'
|
|
|
+ case 3:
|
|
|
+ return '$'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return '?'
|
|
|
+}
|
|
|
+
|
|
|
+func BackSymbol(level int) rune {
|
|
|
+ if level == 0 {
|
|
|
+ return ' '
|
|
|
+ }
|
|
|
+ if door.Unicode {
|
|
|
+ switch level {
|
|
|
+ case 1:
|
|
|
+ return '\u2591'
|
|
|
+ case 2:
|
|
|
+ return '\u2592'
|
|
|
+ case 3:
|
|
|
+ return '\u2593'
|
|
|
+ case 4:
|
|
|
+ return '\u2588'
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ switch level {
|
|
|
+ case 1:
|
|
|
+ return '\xb0'
|
|
|
+ case 2:
|
|
|
+ return '\xb1'
|
|
|
+ case 3:
|
|
|
+ return '\xb2'
|
|
|
+ case 4:
|
|
|
+ return '\xdb'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return '?'
|
|
|
+}
|
|
|
+
|
|
|
+func GetRank(c int) int {
|
|
|
+ return (c % 52) % 13
|
|
|
+}
|
|
|
+
|
|
|
+func GetSuit(c int) int {
|
|
|
+ return (c % 52) / 13
|
|
|
+}
|
|
|
+
|
|
|
+func GetDeck(c int) int {
|
|
|
+ return c / 52
|
|
|
+}
|