Diverge Free vs. Paid Features

* Free (shareware) versions of the game will not be able to Publish
  Levels (attach custom doodads to the level file) and they will not be
  able to load a level which relies on embedded doodads.
* The UI for the Publish Level window is still available, but clicking
  on the confirm button will just open the Register (License) window.
* When loading a level containing embedded doodads: if some can't load
  because they're embedded and you're using the free version of the
  game, the error message is customized to reflect that.
This commit is contained in:
Noah 2021-06-16 22:35:01 -07:00
parent 0449737607
commit dce32ea14b
10 changed files with 70 additions and 25 deletions

9
go.mod
View File

@ -7,6 +7,7 @@ require (
git.kirsle.net/go/log v0.0.0-20200902035305-70ac2848949b git.kirsle.net/go/log v0.0.0-20200902035305-70ac2848949b
git.kirsle.net/go/render v0.0.0-20210104010442-b4a1979a8ba1 git.kirsle.net/go/render v0.0.0-20210104010442-b4a1979a8ba1
git.kirsle.net/go/ui v0.0.0-20200710023146-e2a561fbd04c git.kirsle.net/go/ui v0.0.0-20200710023146-e2a561fbd04c
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/fsnotify/fsnotify v1.4.9 github.com/fsnotify/fsnotify v1.4.9
github.com/gen2brain/dlgs v0.0.0-20210406143744-f512297a108e github.com/gen2brain/dlgs v0.0.0-20210406143744-f512297a108e
github.com/google/uuid v1.1.2 github.com/google/uuid v1.1.2
@ -24,5 +25,13 @@ require (
) )
// replace git.kirsle.net/go/render => /home/kirsle/SketchyMaze/deps/render // replace git.kirsle.net/go/render => /home/kirsle/SketchyMaze/deps/render
// replace git.kirsle.net/go/ui => /home/kirsle/SketchyMaze/deps/ui // replace git.kirsle.net/go/ui => /home/kirsle/SketchyMaze/deps/ui
// replace git.kirsle.net/go/audio => /home/kirsle/SketchyMaze/deps/audio // replace git.kirsle.net/go/audio => /home/kirsle/SketchyMaze/deps/audio
// replace git.kirsle.net/go/render => /run/build/doodle/deps/render
// replace git.kirsle.net/go/ui => /run/build/doodle/deps/ui
// replace git.kirsle.net/go/audio => /run/build/doodle/deps/audio

1
go.sum
View File

@ -37,6 +37,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=

View File

@ -4,7 +4,7 @@ package branding
const ( const (
AppName = "Sketchy Maze" AppName = "Sketchy Maze"
Summary = "A drawing-based maze game" Summary = "A drawing-based maze game"
Version = "0.6.1" Version = "0.7.0"
Website = "https://www.sketchymaze.com" Website = "https://www.sketchymaze.com"
Copyright = "2021 Noah Petherbridge" Copyright = "2021 Noah Petherbridge"

View File

@ -13,6 +13,7 @@ import (
"git.kirsle.net/apps/doodle/pkg/branding" "git.kirsle.net/apps/doodle/pkg/branding"
"git.kirsle.net/apps/doodle/pkg/enum" "git.kirsle.net/apps/doodle/pkg/enum"
"git.kirsle.net/apps/doodle/pkg/filesystem" "git.kirsle.net/apps/doodle/pkg/filesystem"
"git.kirsle.net/apps/doodle/pkg/license"
"git.kirsle.net/apps/doodle/pkg/log" "git.kirsle.net/apps/doodle/pkg/log"
"git.kirsle.net/apps/doodle/pkg/userdir" "git.kirsle.net/apps/doodle/pkg/userdir"
"git.kirsle.net/apps/doodle/pkg/wasm" "git.kirsle.net/apps/doodle/pkg/wasm"
@ -118,6 +119,9 @@ func ListBuiltin() ([]string, error) {
func LoadFromEmbeddable(filename string, fs filesystem.Embeddable) (*Doodad, error) { func LoadFromEmbeddable(filename string, fs filesystem.Embeddable) (*Doodad, error) {
if bin, err := fs.GetFile(balance.EmbeddedDoodadsBasePath + filename); err == nil { if bin, err := fs.GetFile(balance.EmbeddedDoodadsBasePath + filename); err == nil {
log.Debug("doodads.LoadFromEmbeddable: found %s", filename) log.Debug("doodads.LoadFromEmbeddable: found %s", filename)
if !license.IsRegistered() {
return nil, license.ErrRegisteredFeature
}
return Deserialize(filename, bin) return Deserialize(filename, bin)
} }
return LoadFile(filename) return LoadFile(filename)

View File

@ -12,6 +12,7 @@ import (
"git.kirsle.net/apps/doodle/pkg/enum" "git.kirsle.net/apps/doodle/pkg/enum"
"git.kirsle.net/apps/doodle/pkg/keybind" "git.kirsle.net/apps/doodle/pkg/keybind"
"git.kirsle.net/apps/doodle/pkg/level" "git.kirsle.net/apps/doodle/pkg/level"
"git.kirsle.net/apps/doodle/pkg/license"
"git.kirsle.net/apps/doodle/pkg/log" "git.kirsle.net/apps/doodle/pkg/log"
"git.kirsle.net/apps/doodle/pkg/modal" "git.kirsle.net/apps/doodle/pkg/modal"
"git.kirsle.net/apps/doodle/pkg/userdir" "git.kirsle.net/apps/doodle/pkg/userdir"
@ -279,7 +280,13 @@ func (s *EditorScene) LoadLevel(filename string) error {
log.Info("Installing %d actors into the drawing", len(level.Actors)) log.Info("Installing %d actors into the drawing", len(level.Actors))
if err := s.UI.Canvas.InstallActors(level.Actors); err != nil { if err := s.UI.Canvas.InstallActors(level.Actors); err != nil {
modal.Alert("This level references some doodads that were not found:\n\n%s", err).WithTitle("Level Errors") summary := "This level references some doodads that were not found:"
if strings.Contains(err.Error(), license.ErrRegisteredFeature.Error()) {
summary = "This level contains embedded doodads, but this is not\n" +
"available in the free version of the game. The following\n" +
"doodads could not be loaded:"
}
modal.Alert("%s\n\n%s", summary, err).WithTitle("Level Errors")
return fmt.Errorf("EditorScene.LoadLevel: InstallActors: %s", err) return fmt.Errorf("EditorScene.LoadLevel: InstallActors: %s", err)
} }

View File

@ -689,24 +689,6 @@ func (u *EditorUI) SetupMenuBar(d *Doodle) *ui.MenuBar {
native.OpenLocalURL(balance.GuidebookPath) native.OpenLocalURL(balance.GuidebookPath)
}) })
helpMenu.AddItem("Register", func() { helpMenu.AddItem("Register", func() {
if u.licenseWindow == nil {
cfg := windows.License{
Supervisor: u.Supervisor,
Engine: d.Engine,
OnCancel: func() {
u.licenseWindow.Hide()
},
}
cfg.OnLicensed = func() {
// License status has changed, reload the window!
if u.licenseWindow != nil {
u.licenseWindow.Hide()
}
u.licenseWindow = windows.MakeLicenseWindow(d.width, d.height, cfg)
}
cfg.OnLicensed()
}
u.licenseWindow.Show() u.licenseWindow.Show()
}) })
helpMenu.AddItem("About", func() { helpMenu.AddItem("About", func() {

View File

@ -10,6 +10,7 @@ import (
"git.kirsle.net/apps/doodle/pkg/doodads" "git.kirsle.net/apps/doodle/pkg/doodads"
"git.kirsle.net/apps/doodle/pkg/level" "git.kirsle.net/apps/doodle/pkg/level"
"git.kirsle.net/apps/doodle/pkg/level/publishing" "git.kirsle.net/apps/doodle/pkg/level/publishing"
"git.kirsle.net/apps/doodle/pkg/license"
"git.kirsle.net/apps/doodle/pkg/log" "git.kirsle.net/apps/doodle/pkg/log"
"git.kirsle.net/apps/doodle/pkg/modal" "git.kirsle.net/apps/doodle/pkg/modal"
"git.kirsle.net/apps/doodle/pkg/windows" "git.kirsle.net/apps/doodle/pkg/windows"
@ -82,6 +83,27 @@ func (u *EditorUI) SetupPopups(d *Doodle) {
window.Hide() window.Hide()
} }
// License Registration Window.
if u.licenseWindow == nil {
cfg := windows.License{
Supervisor: u.Supervisor,
Engine: d.Engine,
OnCancel: func() {
u.licenseWindow.Hide()
},
}
cfg.OnLicensed = func() {
// License status has changed, reload the window!
if u.licenseWindow != nil {
u.licenseWindow.Hide()
}
u.licenseWindow = windows.MakeLicenseWindow(d.width, d.height, cfg)
}
cfg.OnLicensed()
u.licenseWindow.Hide()
}
// Doodad Dropper. // Doodad Dropper.
if u.doodadWindow == nil { if u.doodadWindow == nil {
u.doodadWindow = windows.NewDoodadDropper(windows.DoodadDropper{ u.doodadWindow = windows.NewDoodadDropper(windows.DoodadDropper{
@ -128,6 +150,19 @@ func (u *EditorUI) SetupPopups(d *Doodle) {
Level: scene.Level, Level: scene.Level,
OnPublish: func(includeBuiltins bool) { OnPublish: func(includeBuiltins bool) {
// XXX: Paid Version Only.
if !license.IsRegistered() {
if u.licenseWindow != nil {
u.licenseWindow.Show()
u.Supervisor.FocusWindow(u.licenseWindow)
}
d.Flash("Level Publishing is only available in the full version of the game.")
// modal.Alert(
// "This feature is only available in the full version of the game.",
// ).WithTitle("Please register")
return
}
log.Debug("OnPublish: include builtins=%+v", includeBuiltins) log.Debug("OnPublish: include builtins=%+v", includeBuiltins)
cwd, _ := os.Getwd() cwd, _ := os.Getwd()
d.Prompt(fmt.Sprintf("File name (relative to %s)> ", cwd), func(answer string) { d.Prompt(fmt.Sprintf("File name (relative to %s)> ", cwd), func(answer string) {

View File

@ -13,6 +13,11 @@ import (
"github.com/dgrijalva/jwt-go" "github.com/dgrijalva/jwt-go"
) )
// Errors
var (
ErrRegisteredFeature = errors.New("feature not available")
)
// Registration object encoded into a license key file. // Registration object encoded into a license key file.
type Registration struct { type Registration struct {
Name string `json:"name"` Name string `json:"name"`

View File

@ -2,6 +2,7 @@ package uix
import ( import (
"errors" "errors"
"fmt"
"strings" "strings"
"git.kirsle.net/apps/doodle/pkg/doodads" "git.kirsle.net/apps/doodle/pkg/doodads"
@ -20,7 +21,7 @@ func (w *Canvas) InstallActors(actors level.ActorMap) error {
for id, actor := range actors { for id, actor := range actors {
doodad, err := doodads.LoadFromEmbeddable(actor.Filename, w.level) doodad, err := doodads.LoadFromEmbeddable(actor.Filename, w.level)
if err != nil { if err != nil {
errs = append(errs, err.Error()) errs = append(errs, fmt.Sprintf("%s: %s", actor.Filename, err.Error()))
continue continue
} }

View File

@ -7,6 +7,7 @@ import (
"git.kirsle.net/apps/doodle/pkg/balance" "git.kirsle.net/apps/doodle/pkg/balance"
"git.kirsle.net/apps/doodle/pkg/branding" "git.kirsle.net/apps/doodle/pkg/branding"
"git.kirsle.net/apps/doodle/pkg/license" "git.kirsle.net/apps/doodle/pkg/license"
"git.kirsle.net/apps/doodle/pkg/log"
"git.kirsle.net/apps/doodle/pkg/modal" "git.kirsle.net/apps/doodle/pkg/modal"
"git.kirsle.net/apps/doodle/pkg/native" "git.kirsle.net/apps/doodle/pkg/native"
"git.kirsle.net/go/render" "git.kirsle.net/go/render"
@ -66,7 +67,7 @@ func NewLicenseWindow(cfg License) *ui.Window {
window.Configure(ui.Config{ window.Configure(ui.Config{
Width: windowWidth, Width: windowWidth,
Height: windowHeight, Height: windowHeight,
Background: render.RGBA(200, 200, 255, 255), Background: render.RGBA(255, 200, 255, 255),
}) })
var rows = []struct { var rows = []struct {
@ -127,21 +128,21 @@ func NewLicenseWindow(cfg License) *ui.Window {
{ {
IfUnregistered: true, IfUnregistered: true,
Button: ui.NewButton("Key Browse", ui.NewLabel(ui.Label{ Button: ui.NewButton("Key Browse", ui.NewLabel(ui.Label{
Text: "Upload License Key File", Text: "Browse for License Key",
Font: balance.UIFont, Font: balance.UIFont,
})), })),
ButtonStyle: &balance.ButtonPrimary, ButtonStyle: &balance.ButtonPrimary,
Func: func() { Func: func() {
filename, err := native.OpenFile("Select License File", "*.key *.txt") filename, err := native.OpenFile("Select License File", "*.key *.txt")
if err != nil { if err != nil {
modal.Alert(err.Error()) log.Error(err.Error())
return return
} }
// Upload and validate the license key. // Upload and validate the license key.
reg, err := license.UploadLicenseFile(filename) reg, err := license.UploadLicenseFile(filename)
if err != nil { if err != nil {
modal.Alert(err.Error()) modal.Alert("That license key didn't seem quite right.").WithTitle("License Error")
return return
} }