Browse Source

Updates to space-ace.

Still need to fix things, and update the database
(YYYYMMDD).
Steve Thielemann 2 years ago
parent
commit
e77c1de589
6 changed files with 174 additions and 14 deletions
  1. 7 0
      NOTES.txt
  2. 6 0
      go.mod
  3. 18 9
      playcards.go
  4. 102 5
      space-ace.go
  5. 10 0
      space.ans
  6. 31 0
      space.go

+ 7 - 0
NOTES.txt

@@ -4,4 +4,11 @@ go get github.com/seehuhn/mt19937
 rng := rand.New(mt19937.New())
 rng.Seed(time.Now().UnixNano())
 
+After a game, the screen isn't cleared/starmap isn't shown.
+
+Need to redo storage. I want top runs, and monthly top runs.
+Change date from unix timestamp to yyyymmdd. It sorts, and
+is very easy to process.
+
+Display scores doesn't do anything.  :P
 

+ 6 - 0
go.mod

@@ -9,3 +9,9 @@ require red-green/door v0.0.0-00010101000000-000000000000
 require github.com/mattn/go-sqlite3 v1.14.10
 
 require github.com/seehuhn/mt19937 v1.0.0
+
+require (
+	golang.org/x/sys v0.2.0 // indirect
+	golang.org/x/term v0.2.0 // indirect
+	golang.org/x/text v0.4.0 // indirect
+)

+ 18 - 9
playcards.go

@@ -535,7 +535,7 @@ func (pc *PlayCards) Init() {
 
 }
 
-func (pc *PlayCards) Play() int {
+func (pc *PlayCards) Play() rune {
 	// this defaults (for now) to playing today (if unplayed).
 	// Otherwise display calendar.
 	pc.Play_day = time.Now()
@@ -545,7 +545,7 @@ func (pc *PlayCards) Play() int {
 	played := pc.DB.HandsPlayedOnDay(pc.Play_day_t)
 
 	log.Printf("HandsPlayedOnDay(%d), %d", pc.Play_day_t, played)
-	var r int
+	var r rune
 
 	if played == 0 {
 		pc.Door.Write(door.CRNL + door.Reset + "Let's play today..." + door.CRNL)
@@ -667,7 +667,7 @@ AGAIN:
 	return ' '
 }
 
-func (pc *PlayCards) PlayCards() int {
+func (pc *PlayCards) PlayCards() rune {
 	pc.InitValues()
 
 	var game_width int
@@ -742,7 +742,9 @@ Next_Hand:
 	}
 
 	var Dealing bool = true
-	var r int = 0
+	var r rune
+	var ex door.Extended
+	var err error
 
 	pc.Redraw(Dealing)
 
@@ -781,8 +783,8 @@ Next_Hand:
 		waiting = 0
 
 		for waiting < int(door.Inactivity) {
-			r = pc.Door.WaitKey(1, 0)
-			if r == -1 {
+			r, ex, err = pc.Door.WaitKey(time.Second)
+			if err == door.ErrTimeout {
 				// TIMEOUT is expected here
 				waiting++
 
@@ -803,7 +805,7 @@ Next_Hand:
 			}
 		}
 
-		if r > 0 {
+		if err == nil {
 			// Not a timeout
 
 			/*
@@ -813,6 +815,13 @@ Next_Hand:
 				}
 			*/
 
+			switch ex {
+			case door.LEFT_ARROW:
+				r = '4'
+			case door.RIGHT_ARROW:
+				r = '6'
+			}
+
 			switch r {
 			case '\x0d':
 				// Next Card
@@ -1022,7 +1031,7 @@ Next_Hand:
 					}
 				}
 
-			case door.XKEY_LEFT_ARROW, '4':
+			case '4':
 				var new_select int = FindNextActiveCard(true, &pc.State, pc.Select_card)
 
 				if new_select >= 0 {
@@ -1040,7 +1049,7 @@ Next_Hand:
 					pc.Door.Write(c.Output() + door.Reset)
 				}
 
-			case door.XKEY_RIGHT_ARROW, '6':
+			case '6':
 				var new_select int = FindNextActiveCard(false, &pc.State, pc.Select_card)
 
 				if new_select >= 0 {

+ 102 - 5
space-ace.go

@@ -16,7 +16,7 @@ import (
 
 var Config map[string]string
 
-func press_a_key(d *door.Door) int {
+func press_a_key(d *door.Door) rune {
 	green := door.ColorText("BOLD GREEN")
 	blue := door.ColorText("BOLD BLUE")
 	yellow := door.ColorText("BOLD YELLOW")
@@ -50,7 +50,9 @@ func press_a_key(d *door.Door) int {
 
 	d.Write(door.Reset + any_color(text))
 
-	var r int = -1
+	var r rune
+	var ex door.Extended
+	var err error
 	var t int
 	sleep_ms := 250
 	ms_sleep := 0
@@ -61,9 +63,9 @@ func press_a_key(d *door.Door) int {
 	current_word := text[words[word][0]:words[word][1]]
 	t = 0
 
-	r = d.WaitKey(0, int64(sleep_ms)*1000)
+	r, ex, err = d.WaitKey(time.Duration(sleep_ms) * time.Millisecond) // 0, int64(sleep_ms)*1000)
 
-	for r == -1 {
+	for err == door.ErrTimeout && ex == door.NOP { // r == -1 {
 		ms_sleep += sleep_ms
 
 		if ms_sleep > 1000 {
@@ -122,7 +124,7 @@ func press_a_key(d *door.Door) int {
 		d.Write(any_color(string(work_text)))
 
 	READKEY:
-		r = d.WaitKey(0, int64(sleep_ms)*1000)
+		r, ex, err = d.WaitKey(time.Duration(sleep_ms) * time.Millisecond) // 0, int64(sleep_ms)*1000)
 	}
 
 	d.Write(strings.Repeat("\b", len(text)))
@@ -356,6 +358,98 @@ func About() door.Panel {
 	return about
 }
 
+func MakeScoresRender(dateColor string, datelen int, nickColor string, nicklen int, scoreColor string) func(string) string {
+	renderF := func(text string) string {
+		var r door.Render = door.Render{Line: text}
+		r.Append(dateColor, datelen)
+		r.Append(nickColor, nicklen)
+		r.Append(scoreColor, len(text)-(datelen+nicklen))
+		return r.Result
+	}
+	return renderF
+}
+
+func DisplayScores(Door *door.Door, db *DBData, config *map[string]string) {
+	// Scores::score()
+
+	// make_top_scores_panel()
+	W := 38
+	var top_scores_panel door.Panel = door.Panel{Width: W,
+		Style:       door.DOUBLE,
+		BorderColor: door.ColorText("CYAN ON BLUE"),
+		Title:       "[ The TOP Monthly Scores: ]",
+	}
+
+	const nick_len int = 17 // Max Nick Length
+
+	var date_monthly string
+	var ok bool
+	date_monthly, ok = (*config)["date_monthly"]
+
+	if !ok {
+		date_monthly = "January"
+	}
+	var longest_month int = len(FormatDate(1631280600, date_monthly))
+
+	monthly := db.GetMonthlyScores(15)
+	if len(monthly) == 0 {
+		top_scores_panel.Lines = append(top_scores_panel.Lines,
+			door.Line{Text: fmt.Sprintf("%*s", -W, "No, Not Yet!"),
+				DefaultColor: door.ColorText("BRI YELLOW ON BLUE"),
+			})
+	} else {
+		ScoresRender := MakeScoresRender(door.ColorText("BOLD WHITE ON BLUE"),
+			longest_month,
+			door.ColorText("CYAN ON BLUE"),
+			nick_len,
+			door.ColorText("BOLD CYAN ON BLUE"))
+		YourScoresRender := MakeScoresRender(
+			door.ColorText("BOLD WHITE ON BLUE"),
+			longest_month,
+			door.ColorText("BOLD GREEN ON BLUE"),
+			nick_len,
+			door.ColorText("BOLD YELLOW ON BLUE"))
+
+		for idx := range monthly {
+			var result string = fmt.Sprintf("%*s", -longest_month,
+				FormatDate(monthly[idx].Date, date_monthly))
+			result += " " + fmt.Sprintf("%*s", -(nick_len-1), monthly[idx].User)
+			result += fmt.Sprintf(" %d", monthly[idx].Score)
+			result += strings.Repeat(" ", W-len(result))
+			if monthly[idx].User == Door.Config.Real_name || monthly[idx].User == Door.Config.Handle {
+				top_scores_panel.Lines = append(top_scores_panel.Lines,
+					door.Line{Text: result, RenderF: YourScoresRender})
+			} else {
+				top_scores_panel.Lines = append(top_scores_panel.Lines,
+					door.Line{Text: result, RenderF: ScoresRender})
+			}
+		}
+
+	}
+	// end make_top_scores_panel
+
+	// make_top_this_month_panel()
+	W = 38
+	var title string = fmt.Sprintf("[ The TOP Scores for %s: ]",
+		FormatDate(time.Now().Unix(), date_monthly))
+	var top_month_panel door.Panel = door.Panel{Width: W,
+		Style:       door.DOUBLE,
+		BorderColor: door.ColorText(""),
+		Title:       fmt.Sprintf("%*s", -W, title),
+	}
+	scores := db.GetScores(15)
+	if len(scores) == 0 {
+		top_month_panel.Lines = append(top_month_panel.Lines,
+			door.Line{Text: fmt.Sprintf("%*s", -W, "No, Not Yet!"),
+				DefaultColor: door.ColorText("BRI YELLOW ON BLUE"),
+			})
+	} else {
+
+	}
+	// Scores.display_scores()
+
+}
+
 func main() {
 	var message string
 
@@ -371,6 +465,7 @@ func main() {
 
 	d := door.Door{}
 	d.Init("space-ace")
+	defer d.Close()
 
 	db := DBData{}
 	db.Open("space-database.db")
@@ -481,6 +576,8 @@ func main() {
 
 		case 'S':
 			// View Scores
+			DisplayScores(&d, &db, &Config)
+			press_a_key(&d)
 		case 'C':
 			// Configure
 			Configure(&d, &db)

+ 10 - 0
space.ans

@@ -0,0 +1,10 @@
+[?7hワイイイイロワ アアイイロロアイイロアイイロロアイイロロアイイロアイイロロアイイロロ
+アアロアアロローアイローアロローアロローアイローアロローアロロ
+ーアワワワワ   ーアイロ ーイローーーーワワ ーイローーーーワワ
+ ゚゚゚゚イイーーアアイ  ーーアアイイ ー ー゚゚  ーーアアイイ ー ー゚゚
+ロ    アイ ー  アイ  アイ  アイ  アイ  アイ  アイ
+゚ ローーア゚     ーア  ーーア  ーーア  ーア  ーーア  ーーア
+
+
+Bugz in space, with a deck of cards
+

+ 31 - 0
space.go

@@ -0,0 +1,31 @@
+package main
+
+import (
+  "red-green/door"
+  "log"
+  )
+
+func ANSISpace() []string {
+  data := []string {
+    "\x1b[?7h\x1b[255D\x1b[0;1;32m\xdc\x1b[42m\xb2\xb2\xb2\xb2\xdb\x1b[40m\xdc \x1b[42m\xb1\xb1\xb2\xb2\xdb\xdb\x1b[4C\xb1\xb2\xb2\xdb\x1b[4C\xb1\xb2\xb2\xdb\xdb\x1b[3C\xb1\xb2\xb2\xdb\xdb\x1b[11C\xb1\xb2\xb2\xdb\x1b[4C\xb1\xb2\xb2\xdb\xdb\x1b[3C\xb1\xb2\xb2\xdb\xdb\x1b[40m",
+    "\x1b[42m\xb1\xb1\x1b[4C\xdb\x1b[2C\xb1\xb1\x1b[2C\xdb\xdb\x1b[2C\xb0\xb1\x1b[2C\xb2\xdb\x1b[2C\xb0\xb1\x1b[3C\xdb\xdb\x1b[1C\xb0\xb1\x1b[3C\xdb\xdb\x1b[9C\xb0\xb1\x1b[2C\xb2\xdb\x1b[2C\xb0\xb1\x1b[3C\xdb\xdb\x1b[1C\xb0\xb1\x1b[3C\xdb\xdb\x1b[40m",
+    "\x1b[42m\xb0\xb1\x1b[40m\xdc\xdc\xdc\xdc   \x1b[42m\xb0\xb1\x1b[2C\xb2\xdb\x1b[1C \xb0\x1b[4C\xb2\xdb\x1b[1C\xb0\xb0\x1b[6C\xb0\xb0\x1b[0;32m\xdc\xdc\x1b[11C\x1b[42m \x1b[1m\xb0\x1b[4C\xb2\xdb\x1b[1C\xb0\xb0\x1b[6C\xb0\xb0\x1b[0;32m\xdc\xdc",
+    " \x1b[1m\xdf\xdf\xdf\xdf\x1b[42m\xb2\xb2\x1b[2C\xb0\xb0\xb1\xb1\xb2\x1b[2C  \xb0\xb0\xb1\xb1\xb2\xb2\x1b[1C \xb0\x1b[6C \xb0\x1b[0;32m\xdf\xdf\x1b[11C\x1b[42m  \x1b[1m\xb0\xb0\xb1\xb1\xb2\xb2\x1b[1C \xb0\x1b[6C \xb0\x1b[0;32m\xdf\xdf",
+    "\xdb    \x1b[1;42m\xb1\xb2\x1b[2C \xb0\x1b[5C  \x1b[4C\xb1\xb2\x1b[1C  \x1b[3C\xb1\xb2\x1b[1C  \x1b[3C\xb1\xb2\x1b[8C  \x1b[4C\xb1\xb2\x1b[1C  \x1b[3C\xb1\xb2\x1b[1C  \x1b[3C\xb1\xb2\x1b[40m",
+    "\x1b[0;32m\xdf\x1b[42m \x1b[40m\xdb\x1b[1;42m\xb0\xb0\xb1\x1b[0;32m\xdf \x1b[42m  \x1b[7C  \x1b[2C\x1b[1m\xb0\xb1\x1b[3C  \xb0\xb0\xb1\x1b[3C  \xb0\xb0\xb1\x1b[10C  \x1b[2C\xb0\xb1\x1b[3C  \xb0\xb0\xb1\x1b[3C  \xb0\xb0\xb1\x1b[40m",
+    "",
+    "",
+    "\x1b[37mBugz in space, with a deck of cards",
+    "\x1b[0m",
+  }
+  if !door.Unicode && !door.CP437 {
+    log.Panicf("Call after door.Init() so Unicode/CP437 has been set.")
+  }
+  if door.Unicode {
+    for idx := range data {
+      data[idx] = door.CP437_to_Unicode(data[idx])
+    }
+  }
+  return data
+}
+