Table of Contents
resources / account_resource.gd
Attached Scenes
|
Note
|
No attached scenes. |
Code
extends Resource
class_name AccountResource
const PATH = "user://data/account-data_%s.json"
@export var number : int = 1
@export var player_name : String = 'Player'
@export var latest_chapter_name : String = 'Opening'
@export var chapters : Array[AccountChapterResource]
static func parse_mapping() -> Dictionary:
return { 'chapters': AccountChapterResource }
static func find_or_initialize(value: int) -> AccountResource:
var resource = find(value)
if not resource:
resource = AccountResource.new()
resource.setup(value)
return resource
static func find(value: int) -> AccountResource:
var path = PATH % value
if FileAccess.file_exists(path):
var f = FileAccess.open(path, FileAccess.READ)
var json = f.get_as_text()
f.close()
return ResourceHelper.parse(AccountResource, json)
else:
return null
func setup(_number: int) -> void:
number = _number
func save() -> void:
var path = PATH % number
var dir = path.get_base_dir()
if not DirAccess.dir_exists_absolute(dir):
DirAccess.make_dir_recursive_absolute(dir)
var f = FileAccess.open(path, FileAccess.WRITE)
f.store_string(ResourceHelper.json(self))
f.close()
func delete() -> void:
var path = PATH % number
if FileAccess.file_exists(path):
var dir = DirAccess.open(path.get_base_dir())
dir.remove(path)
func attr(key) -> String:
match key:
'total_play_time': return total_play_time()
'obtained_strawberry_count': return str(obtained_strawberry_count())
'total_failure_count': return str(total_failure_count())
_: return str(get(key))
func total_play_time() -> String:
var dict = total_play_time_dict()
return "%d:%02d:%02d.%03d" % [dict['hour'], dict['minute'], dict['second'], dict['msec']]
func latest_chapter() -> AccountChapterResource:
var arr = chapters
arr.sort_custom(func(a, b): return a.number < b.number)
return arr[-1] if arr else null
func get_chapter(value: int) -> AccountChapterResource:
var arr = chapters.filter(func(c): return c.number == value)
return arr[0] if arr else null
func obtained_strawberry_count() -> int:
return ArrayHelper.sum(chapters, 'obtained_strawberry_count()')
func total_failure_count() -> int:
return ArrayHelper.sum(chapters, 'total_failure_count()')
func total_play_msec() -> int:
return ArrayHelper.sum(chapters, 'total_play_msec()')
func obtained_blue_hearts() -> Array[bool]:
return obtained_in_chapters('obtained_blue_heart')
func obtained_cassettes() -> Array[bool]:
return obtained_in_chapters('obtained_cassette')
func total_play_time_dict() -> Dictionary:
var msec = total_play_msec()
return {
'hour': (msec / 1000 / 60 / 60),
'minute': (msec / 1000 / 60) % 60,
'second': (msec / 1000) % 60,
'msec': msec % 1000,
}
func obtained_in_chapters(key: String) -> Array[bool]:
var arr : Array[bool] = []
for i in ChapterResource.MAX_NUMBER: arr.push_back(false)
for chapter in chapters:
if not chapter: continue
arr[chapter.number - 1] = chapter.get(key)
return arr