scene

package
v0.6.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 26, 2022 License: BSD-3-Clause Imports: 12 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// separator for the script function name
	ScrSep = "_"

	// script event is optional function. It is OK to not exists.
	// it is called at everywhere
	ScrEventPrefix = "event"

	// script scene is replacement for entire flow in a scene.
	// It requires setting to next scene in the script function.
	ScrScenePrefix = "scene"

	// script replace is replacement function for partial flow in a scene.
	// If it is called, the partial flow of original scene
	// does not through.
	ScrReplacePrefix = "replace"

	// script user is requirement function for implementing flow in a scene.
	// The function of this type must exist and be called from a specific scene.
	// Therefore, the game is aborted if definition is not found.
	ScrUserPrefix = "user"
)
View Source
const (
	// Max length for replace text length used for plain text.
	// Affects to LoadingMessage.
	MaxReplacePlainTextLen = 32
	// Max length for replace text length used for command. -5 means the length of command prefix "[NN] ".
	// Affects to NewGame, LoadGame, QuitGame and ReturnMenu.
	MaxReplaceCmdTextLen = DefaultPrintCWidth - 5
)
View Source
const (
	// default used symbol for PrintLine()
	DefaultLineSymbol = "-"

	// default used fg symbol for PrintBar()
	DefaultTextBarFg = "*"

	// default used bg symbol for PrintBar()
	DefaultTextBarBg = "."

	// default used width PrintBar()
	DefaultTextBarWidth = 8

	// default used for PrintC()
	DefaultPrintCWidth = 26
)
View Source
const (
	AlignmentLeft   = attr.AlignmentLeft
	AlignmentCenter = attr.AlignmentCenter
	AlignmentRight  = attr.AlignmentRight
)

for convenience, attribute.Alignment are redeclared here, so that user need not to import attribute package explicitly.

View Source
const (
	// use for get or set scene name.
	SceneNameTitle    = "title"
	SceneNameNewGame  = "newgame"
	SceneNameAutosave = "autosave"
	SceneNameBase     = "base"
	SceneNameShop     = "shop"
	SceneNameTrain    = "train"
	SceneNameAblUp    = "ablup"
	SceneNameTrainEnd = "trainend"
	SceneNameTurnEnd  = "turnend"
	SceneNameLoadEnd  = "loadend"
)
View Source
const (
	// Scene LoadGame and SaveGame are not registered in default scene transition.
	// These are used by call SceneManager.RunXXXScene() from external.
	SceneNameLoadGame = "loadgame"
	SceneNameSaveGame = "savegame"
)
View Source
const (
	// +callback: {{.Name}}()
	// baseシーンにおける、行動の選択肢を表示します。
	ScrBaseUserShowMenu = "base_user_show_menu"

	// +callback: handled = {{.Name}}(input_num)
	// 行動の選択肢を表示した後、ユーザーからの入力番号を得て、
	// その入力番号input_numと共に、この関数が呼ばれます。
	// もし、入力番号input_numに対して何らかの処理を行った場合、
	// この関数の戻り値としてtrueを返してください。
	// その場合、次のシーンの遷移先が決まっていれば、遷移します。
	// 決まっていなければ、再び、選択肢の表示から繰り返します。
	// 戻り値としてfalseを返した場合、ユーザーの入力待ちから繰り返します。
	ScrBaseUserMenuSelected = "base_user_menu_selected"
)

+scene: base プレイヤーの拠点での活動シーンです。 ここで、各種設定を行ったり、プレイヤーの行動を決定したりすることを想定しています

View Source
const (
	// +callback: {{.Name}}()
	// Itemの一覧を表示する処理を置き換える。
	// もし定義されていなければ、CSVで定義されたItemを
	// クリックできるボタンの形式で全て表示する。
	ScrShopReplaceShowMenu = "shop_replace_show_menu"

	// +callback: handled = {{.Name}}(input_num)
	// 入力番号input_numと共に呼ばれ、それに対する処理を行う。
	// もし、何らかの処理を行った場合、この関数の戻り値としてtrueを
	// 返してください。tureを返した場合、次のシーンの遷移先の確認を行います。
	// 次のシーンが決まっていれば遷移します。決まっていなければ、
	// 再び、選択肢の表示から繰り返します。
	// 戻り値としてfalseを返した場合、通常の購入処理を続行します。
	ScrShopEventMenuSelected = "shop_event_menu_selected"

	// +callback: done = {{.Name}}(buy_item_number)
	// 購入処理の後に呼ばれます。購入に成功した場合、buy_item_number
	// には正数が渡されます。失敗していた場合は、-1 が渡されます。
	// 戻り値として true を返した場合、次のシーンの遷移先の確認を行います。
	// 次のシーンが決まってなければ、再び、選択肢の表示から繰り返します。
	// 戻り値として false を返した場合、ユーザー入力から繰り返します。
	// この関数が定義されていない場合、戻り値 false を返した場合と同様に
	// ユーザー入力から繰り返します。
	ScrShopEventBuyItem = "shop_event_buy_item"
)

+scene: shop お店での売買を行うシーンです。 ここでItemの購入処理を行うことを想定しています。

View Source
const (
	// +callback: {{.Name}}()
	// 調教対象のステータスの表示をこの関数で行います。
	ScrTrainUserShowStatus = "train_user_show_status"

	// +callback: ok = {{.Name}}(input_num)
	// 選択番号input_numに対応するコマンドが、現在実行可能であるかを
	// true/falseで返します。ここで実行可能であったコマンド群が、
	// 画面に表示され、train_user_cmd()が実行されます。
	ScrTrainReplaceCmdAble = "train_replace_cmd_able"

	// +callback: {{.Name}}()
	// ユーザー定義のコマンド群の表示をこの関数で行います。
	ScrTrainReplaceShowOtherCmd = "train_replace_show_other_cmd"

	// +callback: handled = {{.Name}}(input_num)
	// 選択番号input_numに対応するコマンドを実行します。
	// コマンドを処理した場合、trueを返してください。
	// trueを返した場合、train_user_check_source()を実行し、
	// 定義されていれば train_event_cmd_end()が実行されます。
	ScrTrainUserCmd = "train_user_cmd"

	// +callback: handled = {{.Name}}(input_num)
	// 通常のコマンドが実行不能のとき代わりに呼ばれます。
	// 選択番号input_numに対応するユーザー定義のコマンドを実行します。
	// コマンドを処理した場合、trueを返してください。
	// trueを返した場合、train_user_check_source()を実行し、
	// 定義されていれば train_event_cmd_end()が実行されます。
	ScrTrainUserOtherCmd = "train_user_other_cmd"

	// +callback: {{.Name}}(input_num)
	// train_user_cmd()または、train_user_other_cmd()でtrueを返したとき、
	// 実行したコマンド番号input_numとともに、この関数が呼ばれます。
	// ここでは、コマンドの実行によって入手したSource変数の値を、
	// 調教対象のパラメータに変換します。
	ScrTrainUserCheckSource = "train_user_check_source"

	// +callback: {{.Name}}(input_num)
	// 選択番号input_numに対応するコマンドが実行された後に、呼びだされます。
	// ここで、調教に対する口上の表示を行います。
	ScrTrainEventTrainCmdEnd = "train_event_cmd_end"
)

+scene: train 調教のシーンです。 ここでは、調教コマンドの実行およびコマンドの結果の反映を行うことを想定しています。

View Source
const (
	// +callback: {{.Name}}()
	ScrAblUpUserShowJuel = "ablup_user_show_juel"

	// +callback: {{.Name}}()
	ScrAblUpUserShowMenu = "ablup_user_show_menu"

	// +callback: ok = {{.Name}}(input_num)
	ScrAblUpUserMenuSelected = "ablup_user_menu_selected" // +number -> bool
)

+scene: ablup 能力上昇のシーンです。 Trainシーンの実行結果を、成長の結果として反映することを想定しています。

View Source
const DefaultShowItemFormat = "[%d] %s ($%d)"
View Source
const (
	// PlaceHolderNumber is a place holder for a number instead of "%d".
	PlaceHolderNumber = "12345"
)
View Source
const (
	// +callback: {{.Name}}()
	// loadendシーン以外のシーンからbaseシーンへ遷移したとき、
	// 現在のゲームの状態を自動で保存します。
	// この関数によって、その保存処理を置き換えることができます。
	// もし、自動保存処理を行いたくない場合、この関数を定義し、
	// その中で何も処理を行わないことで実現できます。
	ScrAutoSaveReplace = "autosave_replace"
)

+scene: autosave 自動保存シーンです。 現在のゲームの状態を自動保存します。

View Source
const (
	// +callback: {{.Name}}()
	// newgameシーンで、保存される全てのデータを初期化した後に呼ばれます。
	// ここで、新しくゲームを始める為に必要なデータを設定することを想定しています。
	ScrNewGameEventInit = "newgame_event_init"
)

+scene: newgame 新規開始時の準備シーンです。 ここで、ゲーム開始時に必要なデータの準備を行うことを想定しています。

View Source
const (
	// +callback: {{.Name}}()
	// データが保存される直前に呼び出されます。
	// ここで、セーブデータのコメントを書き換えることができます。
	// デフォルトでは、 "2006/01/02 15:04:05" の形式で、現在時刻がコメントとして使用されます
	ScrSaveGameEventBeforeSave = "savegame_event_before_save"
)

+scene: savegame savegame シーンは特殊なシーンです。 他の組み込みシーンとは違い、直接遷移することはできません

View Source
const (
	// +callback: {{.Name}}()
	// It replaces builtin flow for loading existance savefile at title scene.
	// It is called when user select "loading game" at title scene.
	// If you want something to do after loading savefile, it should
	// be done at loadend scene, not to use this callbask.
	//
	// titleシーンの"LoadGame..."を選択した後の、
	// セーブファイルを読み込む処理を、この関数によって置き換えます。
	// セーブファイルを読み込んだ後に何らかの処理をしたい場合には、
	// この関数を用いるべきではありません。代わりにloadendシーンで
	// そのような処理を行うべきです。
	ScrTitleReplaceLoadGame = "title_replace_loadgame"
)

+scene: title タイトル画面のシーンです。タイトルの表示およびゲームの開始準備を行います。

Variables

View Source
var ErrorInterrupt = errors.New("interrupted")

Flow is interrupted.

View Source
var ErrorQuit = errors.New("quit")

Flow is interrupted so that quit immediatly.

View Source
var ErrorSceneNext = errors.New("go to next scene")

Scene flow is interrupted so that start next scene immediatly.

Functions

func DefaultOrString added in v0.3.0

func DefaultOrString(_default string, replacement string) string

DefaultOrString is a helper function for string replacement. It returns _default text if replacement text is likely empty, otherwise returns replacement text

func ParseMoneyFormat added in v0.3.0

func ParseMoneyFormat(src string) (string, error)

ParseMoneyFormat validates source string has correct monery format and converts it to be used on scene flow.

Types

type Config

type Config struct {
	// can be auto-saved in the specific scene transition
	CanAutoSave bool
}

Scene Configure

type ConfigReplaceText added in v0.3.0

type ConfigReplaceText struct {
	// for boot
	LoadingMessage string

	// for title
	NewGame  string
	LoadGame string
	QuitGame string

	// for shop
	ReturnMenu  string
	MoneyFormat string

	// for save/load
	SelectSaveData   string
	SelectLoadData   string
	ConfirmOverwrite string
}

ConfigReplaceText holds strings for replace specific text in the bultin scenes. empty string is treated as no replace (use builtin).

func (*ConfigReplaceText) Validate added in v0.3.0

func (c *ConfigReplaceText) Validate() error

type IOController

type IOController interface {
	InputPort
	OutputPort
	Layouter
}

io controller has interfaces for external io layer, inputting, outputting and layouting etc.

type InputPort

type InputPort interface {
	// RawInput returns user input (i.e. key press) directly.
	// It waits until user input any key.
	RawInput() (string, error)

	// RawInputWithTimeout returns user input (i.e. key press) directly.
	// it can be canceled by canceling context.
	// This function timeouts with given timeout duration, and returns error context.DeadlineExceeded.
	RawInputWithTimeout(context.Context, time.Duration) (string, error)

	// Command returns string command which is emitted with user confirming.
	// It waits until user emit any command.
	Command() (string, error)

	// it returns string command which is emitted with user confirming.
	// it can be canceled by canceling context.
	// This function timeouts with given timeout duration, and returns error context.DeadlineExceeded.
	CommandWithTimeout(context.Context, time.Duration) (string, error)

	// Same as Command but return number command.
	// It waits until user emit any number command.
	CommandNumber() (int, error)

	// return number command limiting in range [min:max]
	// it can be canceled by canceling context.
	// This function timeouts with given timeout duration, and returns error context.DeadlineExceeded.
	CommandNumberWithTimeout(context.Context, time.Duration) (int, error)

	// return number command limiting in range [min:max]
	CommandNumberRange(ctx context.Context, min, max int) (int, error)

	// return number command matching to given candidates.
	CommandNumberSelect(context.Context, ...int) (int, error)

	// wait for any user confirming.
	// shorthand for Wait with context.Background.
	Wait() error

	// wait for any user confirming.
	// it can be canceled by canceling context.
	// This function timeouts with given timeout duration, and returns error context.DeadlineExceeded.
	WaitWithTimeout(ctx context.Context, timeout time.Duration) error
}

input interface.

type Layouter

type Layouter interface {
	// set new layout. since it is low level function, use SetSingleLayout,
	// SetHorizontalLayout and SetVerticalLayout to layout simply.
	//
	// More detail is in erago/attribute package.
	SetLayout(layout *attr.LayoutData) error

	// set single view layout. if name is already exist, text in the view is kept.
	SetSingleLayout(name string) error

	// split screen into left and right views which have unique name.
	// rate is separator position on entire screen.
	// if name is already exist in views, text in the view is kept.
	SetHorizontalLayout(vname1, vname2 string, rate float64) error

	// split screen into upper and bottom views which have unique name.
	// if name is already exist in views, text in the view is kept.
	SetVerticalLayout(vname1, vname2 string, rate float64) error

	// set default output view by view name.
	SetCurrentView(vname string) error

	// return default output view name.
	GetCurrentViewName() string

	// return existing views name
	GetViewNames() []string
}

layouter layouts output screen. screen is divided by unit named view.

if it is not implement actually, ViewPrinter's functions should be handled correctry.

type NextFunc

type NextFunc func() (string, error)

It is used to get current scene's next in scene trainsition. Returned string must be name of next scene, and error controlls scene trainsition which is defined in "erago/scene" package.

type OutputPort

type OutputPort interface {
	// print text with parsing button pattern.
	// when text is matched to the pattern print text as button.
	Print(text string) error
	PrintL(text string) error // print the text added "\n" to end.
	PrintC(text string, width int) error
	PrintW(text string) error
	PrintButton(caption, command string) error
	PrintPlain(text string) error
	PrintLine(sym string) error
	PrintBar(now, max int64, width int, fg, bg string) error
	TextBar(now, max int64, width int, fg, bg string) (string, error)
	PrintImage(file string, widthInRW, heightInLC int) error
	MeasureImageSize(file string, widthInRW, heightInLC int) (width, height int, err error)

	NewPage() error
	ClearLine(nline int) error
	ClearLineAll() error

	// Prefixed V functions perform same as not V-prefixed functions.
	// But difference is that targeting for the view frame specified by name and
	// return error of such view frame is not found.
	VPrint(vname, text string) error
	VPrintL(vname, text string) error
	VPrintC(vname, text string, width int) error
	VPrintW(vname, text string) error
	VPrintButton(vname, caption, command string) error
	VPrintPlain(vname, text string) error
	VPrintLine(vname, sym string) error
	VPrintBar(vname string, now, max int64, width int, fg, bg string) error

	VNewPage(vname string) error
	VClearLine(vname string, nline int) error
	VClearLineAll(vname string) error

	CurrentRuneWidth() (int, error) // rune width of currently editing line.
	LineCount() (int, error)        // line count as it increases outputting new line
	WindowRuneWidth() (int, error)  // max rune width for view width.
	WindowLineCount() (int, error)  // max line count for view height.

	// output options
	SetColor(color uint32) error
	GetColor() (uint32, error)
	ResetColor() error

	GetAlignment() (attr.Alignment, error)
	SetAlignment(attr.Alignment) error
}

output interface.

type Scene

type Scene interface {
	// Scene updates self to next Scene
	Next() (Scene, error)
	// returns self name
	Name() string
}

Representing each scene Flow.

type SceneManager

type SceneManager struct {
	// contains filtered or unexported fields
}

SceneManager is entry point of the scene flow transition.

Example:

  sm := NewSceneManager(...)
  defer sm.Free()
	 // do something

func NewSceneManager

func NewSceneManager(game IOController, scr Scripter, state *state.GameState, config Config) *SceneManager

func (SceneManager) DoLoadGameScene

func (sm SceneManager) DoLoadGameScene() error

Run flow of scene: LoadGame. It sets next scene `loadend` and return ErrorSceneNext if load success.

func (SceneManager) DoSaveGameScene

func (sm SceneManager) DoSaveGameScene() error

Run flow of scene: SaveGame.

func (SceneManager) DoTrainsScene

func (sm SceneManager) DoTrainsScene(commands []int64) error

do train flow using commands which contains train No.

func (*SceneManager) Free

func (sm *SceneManager) Free()

Free referene cycle. It must be called at end use of SceneManager for GC.

func (SceneManager) RegisterScene

func (sm SceneManager) RegisterScene(s Scene)

register user-defined scene into scene trainsition

func (SceneManager) RegisterSceneFunc

func (sm SceneManager) RegisterSceneFunc(name string, next_func func() (string, error))

register user-defined scene flow into scene trainsition using scene name and next function. next function is converted scene.NextFunc internally.

func (*SceneManager) Run

func (sm *SceneManager) Run(ctx context.Context, start_scene string) (err error)

run scene transitions starting from start_scene. it blocks until done, you can use go func() to avoid blocking main thread.

func (SceneManager) SceneExists

func (sm SceneManager) SceneExists(name string) bool

return SceneManager has the name scene.

func (SceneManager) SetNextSceneByName

func (sm SceneManager) SetNextSceneByName(scene_name string) error

Set Next Scene using sence name, if scene name is not found return error.

func (*SceneManager) SetReplaceText added in v0.3.0

func (sm *SceneManager) SetReplaceText(config ConfigReplaceText) error

Set ConfigReplaceText to replace text in the builtin scene flow. It is concurrency unsafe.

func (SceneManager) UnRegisterScene

func (sm SceneManager) UnRegisterScene(name string)

unregister Scene from scene trainsition. if not registered scene name is passed do nothing.

type Scripter

type Scripter interface {
	// oprations for era module.
	EraCall(string) error
	EraCallBoolArgInt(string, int64) (bool, error)
	HasEraValue(string) bool
}

Scripter handles calling script function in era module. These functions can return spcial error defined in the package scene In such case, scene flow will be changed by type of special error.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL