/
SaveMenu.ts
112 lines (94 loc) · 3.42 KB
/
SaveMenu.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import {SandFieldPsynergy} from "field_abilities/SandFieldPsynergy";
import {GoldenSun} from "../GoldenSun";
import {Window} from "../Window";
import {Button} from "../XGamepad";
export class SaveMenu {
private static readonly DEFAULT_SCALE = 1.1;
private static readonly MAX_SCALE = 1.25;
private game: Phaser.Game;
private data: GoldenSun;
private window: Window;
private button_tween: Phaser.Tween;
private button: Phaser.Sprite;
private _open: boolean;
get open() {
return this._open;
}
constructor(game: Phaser.Game, data: GoldenSun) {
this.game = game;
this.data = data;
this.window = new Window(this.game, 40, 40, 156, 28);
this.button = this.window.create_at_group(30, 16, "buttons", {frame: "save_game"});
this.button.anchor.setTo(0.5, 0.5);
this.window.set_text_in_position("Save your quest", 48, 10, {italic: true});
this._open = false;
}
set_controls() {
const controls = [
{buttons: Button.A, on_down: this.download_snapshot.bind(this), sfx: {down: "menu/positive"}},
{buttons: Button.B, on_down: this.close_menu.bind(this), sfx: {down: "menu/negative"}},
];
this.data.control_manager.add_controls(controls, {loop_config: {horizontal: true}});
}
download_snapshot() {
if (!this.data.hero.on_reveal) {
this.data.snapshot_manager.generate_snapshot();
}
}
set_button_tween() {
this.button.scale.setTo(SaveMenu.DEFAULT_SCALE, SaveMenu.DEFAULT_SCALE);
this.button_tween = this.game.add
.tween(this.button.scale)
.to({x: SaveMenu.MAX_SCALE, y: SaveMenu.MAX_SCALE}, 125, Phaser.Easing.Linear.None, true, 0, -1, true);
}
close_menu() {
this._open = false;
this.data.cursor_manager.hide();
this.data.control_manager.reset();
this.button_tween.stop();
this.button_tween = null;
this.window.close(() => {
this.data.save_open = false;
});
}
open_menu() {
this._open = true;
this.window.show(() => {
this.data.cursor_manager.move_to({x: 38, y: 55}, {animate: false});
this.data.cursor_manager.show();
this.set_button_tween();
this.set_controls();
});
}
}
export function initialize_save_menu(game: Phaser.Game, data: GoldenSun) {
let trigger_menu = () => {
if (
data.hero.in_action() ||
data.hero.walking_over_rope ||
data.in_battle ||
!data.assets_loaded ||
data.shop_open ||
data.healer_open ||
data.menu_open ||
data.game_event_manager.on_event ||
data.tile_event_manager.timers_running ||
data.tile_event_manager.on_event
) {
return;
} else if (data.hero.sand_mode) {
(data.info.field_abilities_list.sand as SandFieldPsynergy).return_to_normal();
return;
}
if (!data.save_open) {
data.save_open = true;
data.hero.stop_char();
data.hero.update_shadow();
data.audio.play_se("menu/move");
data.save_menu.open_menu();
}
};
const controls = [{buttons: Button.START, on_down: trigger_menu}];
data.control_manager.add_controls(controls, {persist: true});
return new SaveMenu(game, data);
}