main.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "log"
  6. "strings"
  7. "time"
  8. door "git.red-green.com/RedGreen/doorgo"
  9. )
  10. var (
  11. d door.Door
  12. udb *UserDB
  13. u *User
  14. )
  15. func main() {
  16. d.Init("Geode")
  17. defer d.Close()
  18. udb = &UserDB{}
  19. err := udb.Open("users.db3")
  20. if err != nil {
  21. fmt.Printf("UserDB.Open(filename='users.db3') > %v\r\n", err)
  22. return
  23. }
  24. d.WriteS(door.ColorTextS("BRI YEL ON BLA") + "Geode" + door.ColorTextS("WHI ON BLA") + " by " + door.ColorTextS("BRI RED ON BLA") + "Apollo" + door.ColorTextS("BRI BLA ON BLA") + "@" + door.ColorTextS("BRI GRE ON BLA") + "21:1/236" + door.Reset + door.CRNL)
  25. LOGIN:
  26. for {
  27. d.WriteS(door.GotoS(1, 3) + door.Reset + strings.Repeat(" ", door.Width-1) + door.GotoS(1, 4) + strings.Repeat(" ", door.Width-1) + door.GotoS(1, 5) + strings.Repeat(" ", door.Width-1) + door.GotoS(1, 6) + strings.Repeat(" ", door.Width-1) + door.GotoS(1, 7) + strings.Repeat(" ", door.Width-1) + door.GotoS(1, 8) + strings.Repeat(" ", door.Width-1) + door.GotoS(1, 9) + strings.Repeat(" ", door.Width-1))
  28. d.WriteS(door.GotoS(1, 3) + door.ColorTextS("BRI YEL ON BLA") + "Login: " + door.ColorTextS("BRI WHI ON BLU"))
  29. name := d.Input(30)
  30. if len(name) == 0 {
  31. d.WriteS(door.Reset + door.CRNL + "Goodbye!")
  32. return
  33. }
  34. u = udb.FindUserByName(name)
  35. if u == nil {
  36. u = &User{Name: name}
  37. // New User, So get their password and their class of choice
  38. d.WriteS(door.GotoS(1, 4) + door.ColorTextS("BRI YEL ON BLA") + "Password: " + door.ColorTextS("BLU ON BLU"))
  39. pwd := d.Input(30)
  40. if len(pwd) == 0 {
  41. d.WriteS(door.Reset + door.CRNL + "Goodbye!")
  42. return
  43. }
  44. err = u.SetPassword(pwd)
  45. if err != nil {
  46. d.WriteS(door.Reset + door.CRNL + "Err: " + err.Error() + door.CRNL)
  47. _, _, err = d.WaitKey(door.Inactivity)
  48. if err != nil {
  49. if errors.Is(err, door.ErrDisconnected) {
  50. return
  51. }
  52. }
  53. continue LOGIN
  54. }
  55. d.WriteS(door.Reset + door.CRNL)
  56. bb := door.ColorTextS("BRI BLA ON BLA")
  57. d.WriteS(bb + "[" + door.ColorTextS("BRI CYA ON BLA") + "K" + bb + "] " + door.ColorTextS("CYA ON BLA") + "Knight" + door.Reset + door.CRNL)
  58. d.WriteS(bb + "[" + door.ColorTextS("BRO ON BLA") + "T" + bb + "] " + door.ColorTextS("BRO ON BLA") + "Thief" + door.Reset + door.CRNL)
  59. d.WriteS(bb + "[" + door.ColorTextS("BRI GRE ON BLA") + "C" + bb + "] " + door.ColorTextS("GRE ON BLA") + "Cleric" + door.Reset + door.CRNL)
  60. d.WriteS(bb + "[" + door.ColorTextS("BRI MAG ON BLA") + "W" + bb + "] " + door.ColorTextS("MAG ON BLA") + "Wizard" + door.Reset + door.CRNL)
  61. d.WriteS(bb + "[" + door.ColorTextS("BRI RED ON BLA") + "R" + bb + "] " + door.ColorTextS("RED ON BLA") + "Ranger" + door.Reset + door.CRNL)
  62. r, _, err := d.WaitKey(door.Inactivity)
  63. if err != nil {
  64. if errors.Is(err, door.ErrDisconnected) {
  65. return
  66. }
  67. continue LOGIN
  68. }
  69. switch r {
  70. case 'k', 'K':
  71. u.Class = 1
  72. u.Health = 30
  73. u.MaxHealth = 30
  74. u.MaxMagic = 0
  75. u.Magic = 0
  76. u.Gold = 200
  77. case 't', 'T':
  78. u.Class = 2
  79. u.Health = 20
  80. u.MaxHealth = 20
  81. u.MaxMagic = 0
  82. u.Magic = 0
  83. u.Gold = 250 // Thieves get bonus gold (+50)
  84. case 'c', 'C':
  85. u.Class = 3
  86. u.Health = 25
  87. u.MaxHealth = 25
  88. u.MaxMagic = 7
  89. u.Magic = 7
  90. u.Gold = 200
  91. case 'w', 'W':
  92. u.Class = 4
  93. u.Health = 20
  94. u.MaxHealth = 20
  95. u.MaxMagic = 12
  96. u.Magic = 12
  97. u.Gold = 200
  98. case 'r', 'R':
  99. u.Class = 5
  100. u.Health = 20
  101. u.MaxHealth = 20
  102. u.MaxMagic = 0
  103. u.Magic = 0
  104. u.Gold = 200
  105. default:
  106. continue LOGIN
  107. }
  108. u.Level = 1
  109. err = udb.SaveUser(u)
  110. if err != nil {
  111. log.Printf("u = %#v", u)
  112. log.Printf("UserDB.SaveUser(u) > %v", err)
  113. d.WriteS(door.Reset + door.CRNL + "Err: " + err.Error() + door.CRNL)
  114. d.WaitKey(door.Inactivity)
  115. return
  116. }
  117. break LOGIN
  118. } else {
  119. // Existing User, So verify their password
  120. d.WriteS(door.GotoS(1, 4) + door.ColorTextS("BRI YEL ON BLA") + "Password: " + door.ColorTextS("BLU ON BLU"))
  121. pwd := d.Input(30)
  122. if len(pwd) == 0 {
  123. d.WriteS(door.Reset + door.CRNL + "Goodbye!")
  124. return
  125. }
  126. if u.VerifyPassword(pwd) != nil {
  127. d.WriteS(door.Reset + door.CRNL + door.ColorTextS("BRI RED ON BLA") + "Invalid Username or Password!" + door.Reset + door.CRNL)
  128. d.WaitKey(time.Duration(10) * time.Second)
  129. u = nil
  130. continue LOGIN
  131. } else {
  132. d.WriteS(door.Reset + door.CRNL)
  133. break LOGIN
  134. }
  135. }
  136. }
  137. d.WriteS(door.ColorTextS("BRI CYA ON BLA") + "Welcome " + door.ColorTextS("BRI WHI ON BLA") + u.Name + door.ColorTextS("BRI CYA ON BLA") + " the ")
  138. switch u.Class {
  139. case 1:
  140. d.WriteS(door.ColorTextS("CYA ON BLA") + "Knight")
  141. case 2:
  142. d.WriteS(door.ColorTextS("BRO ON BLA") + "Thief")
  143. case 3:
  144. d.WriteS(door.ColorTextS("GRE ON BLA") + "Cleric")
  145. case 4:
  146. d.WriteS(door.ColorTextS("MAG ON BLA") + "Wizard")
  147. case 5:
  148. d.WriteS(door.ColorTextS("RED ON BLA") + "Ranger")
  149. default:
  150. d.WriteS(door.ColorTextS("BLI BRI RED ON BLA") + "Unknown")
  151. }
  152. d.WriteS(door.Reset + door.CRNL)
  153. go renderStatusBar()
  154. d.WaitKey(door.Inactivity)
  155. }
  156. func renderStatusBar() {
  157. if d.Disconnected || u == nil {
  158. return
  159. }
  160. d.WriteS(door.SavePos + door.GotoS(1, door.Height-1) + door.Reset + strings.Repeat(" ", door.Width-1) + door.RestorePos)
  161. d.WriteS(door.SavePos + door.GotoS(1, door.Height) + door.Reset + strings.Repeat(" ", door.Width-1) + door.RestorePos)
  162. bb := door.ColorTextS("BRI BLA ON BLA")
  163. bar_width := ((door.Width - 3) / 2) - 1
  164. hp := int(float64(bar_width) * (float64(u.Health) / float64(u.MaxHealth)))
  165. pos_txt := fmt.Sprintf("%-3d%% (%d, %d) %-3d%%", int((float64(u.Health)/float64(u.MaxHealth))*100.0), u.X, u.Y, int((float64(u.Magic)/float64(u.MaxMagic))*100.0))
  166. d.WriteS(door.SavePos + door.GotoS((door.Width/2)-(len(pos_txt)/2), door.Height-1) + door.ColorTextS("BRI CYA ON BLA") + pos_txt + door.RestorePos)
  167. if u.MaxMagic != 0 {
  168. mp := int(float64(bar_width) * (float64(u.Magic) / float64(u.MaxMagic)))
  169. log.Printf("HP=%d/%d %d%% (%d) MP=%d/%d %d%% (%d) bar_width=%d", u.Health, u.MaxHealth, int((float64(u.Health)/float64(u.MaxHealth))*100.0), hp, u.Magic, u.MaxMagic, int((float64(u.Magic)/float64(u.MaxMagic))*100.0), mp, bar_width)
  170. d.WriteS(door.SavePos + door.GotoS(1, door.Height) + bb + "[" + door.ColorTextS("BRI RED ON BLA") + strings.Repeat(door.BARS.Solid, hp) + strings.Repeat(" ", bar_width-hp) + bb + "] [" + door.ColorTextS("BRI MAG ON BLA") + strings.Repeat(door.BARS.Solid, mp) + strings.Repeat(" ", bar_width-mp) + bb + "]" + door.RestorePos)
  171. } else {
  172. log.Printf("HP=%d/%d %d%% (%d) bar_width=%d", u.Health, u.MaxHealth, int((float64(u.Health)/float64(u.MaxHealth))*100.0), hp, bar_width)
  173. d.WriteS(door.SavePos + door.GotoS(1, door.Height) + bb + "[" + door.ColorTextS("BRI RED ON BLA") + strings.Repeat(door.BARS.Solid, hp) + strings.Repeat(" ", bar_width-hp) + bb + "]" + door.RestorePos)
  174. }
  175. }