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