1 
2 #include "../nx.h"
3 #include "options.h"
4 #include "dialog.h"
5 #include "message.h"
6 using namespace Options;
7 #include "options.fdh"
8 #include "libretro_shared.h"
9 FocusStack optionstack;
10 
11 #define SLIDE_SPEED				32
12 #define SLIDE_DIST				(3 * SLIDE_SPEED)
13 
14 static struct
15 {
16 	Dialog *dlg, *subdlg;
17 	Dialog *dismiss_on_focus;
18 	int mm_cursel;
19 	bool InMainMenu;
20 	int xoffset;
21 
22 	int remapping_key, new_sdl_key;
23 } opt;
24 
25 
options_init(int retmode)26 bool options_init(int retmode)
27 {
28 	memset(&opt, 0, sizeof(opt));
29 	Options::init_objects();
30 	opt.dlg = new Dialog;
31 
32 	opt.xoffset = SLIDE_DIST;
33 	opt.dlg->offset(-SLIDE_DIST, 0);
34 
35 	EnterMainMenu();
36 	opt.dlg->ondismiss = DialogDismissed;
37 	opt.dlg->ShowFull();
38 
39 	inputs[F3KEY] = 0;
40 	sound(SND_MENU_MOVE);
41 	return 0;
42 }
43 
options_close()44 void options_close()
45 {
46 	Options::close_objects();
47 	while(FocusHolder *fh = optionstack.ItemAt(0))
48 		delete fh;
49 
50 	settings_save();
51 }
52 
53 /*
54 void c------------------------------() {}
55 */
56 
options_tick()57 void options_tick()
58 {
59 int i;
60 FocusHolder *fh;
61 
62 	if (justpushed(F3KEY))
63 	{
64 		game.pause(0);
65 		return;
66 	}
67 
68 	ClearScreen(BLACK);
69 	Options::run_and_draw_objects();
70 
71 	fh = optionstack.ItemAt(optionstack.CountItems() - 1);
72 	if (fh)
73 	{
74 		fh->RunInput();
75 		if (game.paused != GP_OPTIONS) return;
76 
77 		fh = optionstack.ItemAt(optionstack.CountItems() - 1);
78 		if (fh == opt.dismiss_on_focus && fh)
79 		{
80 			opt.dismiss_on_focus = NULL;
81 			delete fh;
82 		}
83 	}
84 
85 	for(i=0;;i++)
86 	{
87 		fh = optionstack.ItemAt(i);
88 		if (!fh) break;
89 
90 		fh->Draw();
91 	}
92 
93 	if (opt.xoffset > 0)
94 	{
95 		opt.dlg->offset(SLIDE_SPEED, 0);
96 		opt.xoffset -= SLIDE_SPEED;
97 	}
98 }
99 
100 
101 /*
102 void c------------------------------() {}
103 */
104 
DialogDismissed()105 void DialogDismissed()
106 {
107 	if (opt.InMainMenu)
108 	{
109 		memset(inputs, 0, sizeof(inputs));
110 		game.pause(false);
111 	}
112 	else
113 	{
114 		EnterMainMenu();
115 	}
116 }
117 
_60hz_change(ODItem * item,int dir)118 void _60hz_change(ODItem *item, int dir)
119 {
120    extern bool retro_60hz;
121    retro_60hz ^= 1;
122 }
123 
_60hz_get(ODItem * item)124 void _60hz_get(ODItem *item)
125 {
126    extern bool retro_60hz;
127    static const char *strs[] = { "50fps", "60fps" };
128    strcpy(item->suffix, strs[retro_60hz]);
129 }
130 
131 /*
132 void c------------------------------() {}
133 */
134 
EnterMainMenu()135 static void EnterMainMenu()
136 {
137 Dialog *dlg = opt.dlg;
138 
139 	dlg->Clear();
140 
141 	dlg->AddItem("Framerate: ", _60hz_change, _60hz_get);
142 
143 	dlg->AddSeparator();
144 
145 	//dlg->AddItem("Enable Debug Keys", _debug_change, _debug_get);
146 	//dlg->AddItem("Save Slots: ", _save_change, _save_get);
147 
148 	dlg->AddSeparator();
149 
150 	dlg->AddItem("Music: ", _music_change, _music_get);
151 	dlg->AddItem("Sound: ", _sound_change, _sound_get);
152 
153 	dlg->AddSeparator();
154 	dlg->AddDismissalItem();
155 
156 	dlg->SetSelection(opt.mm_cursel);
157 	dlg->onclear = LeavingMainMenu;
158 	opt.InMainMenu = true;
159 }
160 
LeavingMainMenu()161 void LeavingMainMenu()
162 {
163 	opt.mm_cursel = opt.dlg->GetSelection();
164 	opt.dlg->onclear = NULL;
165 	opt.InMainMenu = false;
166 }
167 
168 #if 0
169 void _debug_change(ODItem *item, int dir)
170 {
171 	settings->enable_debug_keys ^= 1;
172 	sound(SND_MENU_SELECT);
173 }
174 
175 void _debug_get(ODItem *item)
176 {
177 	static const char *strs[] = { "", " =" };
178 	strcpy(item->suffix, strs[settings->enable_debug_keys]);
179 }
180 
181 void _save_change(ODItem *item, int dir)
182 {
183 	settings->multisave ^= 1;
184 	sound(SND_MENU_MOVE);
185 }
186 
187 void _save_get(ODItem *item)
188 {
189 	static const char *strs[] = { "1", "5" };
190 	strcpy(item->suffix, strs[settings->multisave]);
191 }
192 #endif
193 
194 
_sound_change(ODItem * item,int dir)195 void _sound_change(ODItem *item, int dir)
196 {
197 	settings->sound_enabled ^= 1;
198 	sound(SND_MENU_SELECT);
199 }
200 
_sound_get(ODItem * item)201 void _sound_get(ODItem *item)
202 {
203 	static const char *strs[] = { "Off", "On" };
204 	strcpy(item->suffix, strs[settings->sound_enabled]);
205 }
206 
207 
208 
_music_change(ODItem * item,int dir)209 void _music_change(ODItem *item, int dir)
210 {
211 	music_set_enabled((settings->music_enabled + 1) % 3);
212 	sound(SND_MENU_SELECT);
213 }
214 
_music_get(ODItem * item)215 void _music_get(ODItem *item)
216 {
217 	static const char *strs[] = { "Off", "On", "Boss Only" };
218 	strcpy(item->suffix, strs[settings->music_enabled]);
219 }
220 
221 /*
222 void c------------------------------() {}
223 */
224