16
#include "../common/cheat.h"
22
#include "sdl-video.h"
23
#include "unix-netplay.h"
30
* Read a custom pallete from a file and load it into the core.
33
LoadCPalette(const std::string &file)
38
if(!(fp = FCEUD_UTF8fopen(file.c_str(), "rb"))) {
39
printf(" Error loading custom palette from file: %s\n", file.c_str());
42
fread(tmpp, 1, 192, fp);
43
FCEUI_SetPaletteArray(tmpp);
48
* Creates the subdirectories used for saving snapshots, movies, game
49
* saves, etc. Hopefully obsolete with new configuration system.
52
CreateDirs(const std::string &dir)
54
char *subs[7]={"fcs","snaps","gameinfo","sav","cheats","movie"};
60
for(x = 0; x < 6; x++) {
61
subdir = dir + PSS + subs[x];
62
mkdir(subdir.c_str());
65
mkdir(dir.c_str(), S_IRWXU);
66
for(x = 0; x < 6; x++) {
67
subdir = dir + PSS + subs[x];
68
mkdir(subdir.c_str(), S_IRWXU);
74
* Attempts to locate FCEU's application directory. This will
75
* hopefully become obsolete once the new configuration system is in
79
GetBaseDirectory(std::string &dir)
81
char *home = getenv("HOME");
83
dir = std::string(home) + "/.fceux";
86
home = new char[MAX_PATH + 1];
87
GetModuleFileName(NULL, home, MAX_PATH + 1);
89
char *lastBS = strrchr(home,'\\');
94
dir = std::string(home);
106
std::string dir, prefix;
109
GetBaseDirectory(dir);
111
FCEUI_SetBaseDirectory(dir.c_str());
114
config = new Config(dir);
117
config->addOption('s', "sound", "SDL.Sound", 1);
118
config->addOption("volume", "SDL.SoundVolume", 150);
119
config->addOption("trianglevol", "SDL.TriangleVolume", 256);
120
config->addOption("square1vol", "SDL.Square1Volume", 256);
121
config->addOption("square2vol", "SDL.Square2Volume", 256);
122
config->addOption("noisevol", "SDL.NoiseVolume", 256);
123
config->addOption("pcmvol", "SDL.PCMVolume", 256);
124
config->addOption("soundrate", "SDL.SoundRate", 11000);
125
config->addOption("soundq", "SDL.SoundQuality", 1);
126
config->addOption("soundrecord", "SDL.SoundRecordFile", "");
127
config->addOption("soundbufsize", "SDL.SoundBufSize", 48);
130
config->addOption('g', "gamegenie", "SDL.GameGenie", 0);
131
config->addOption("lowpass", "SDL.LowPass", 0);
132
config->addOption("pal", "SDL.PAL", 0);
133
config->addOption("frameskip", "SDL.Frameskip", 0);
134
config->addOption("clipsides", "SDL.ClipSides", 0);
135
config->addOption("nospritelim", "SDL.DisableSpriteLimit", 1);
138
config->addOption('p', "palette", "SDL.Palette", "");
139
config->addOption("tint", "SDL.Tint", 56);
140
config->addOption("hue", "SDL.Hue", 72);
141
config->addOption("ntsccolor", "SDL.Color", 0);
144
config->addOption("slstart", "SDL.ScanLineStart", 0);
145
config->addOption("slend", "SDL.ScanLineEnd", 239);
148
config->addOption('x', "xres", "SDL.XResolution", 512);
149
config->addOption('y', "yres", "SDL.YResolution", 448);
150
config->addOption('f', "fullscreen", "SDL.Fullscreen", 0);
151
config->addOption('b', "bpp", "SDL.BitsPerPixel", 32);
152
config->addOption("doublebuf", "SDL.DoubleBuffering", 0);
153
config->addOption("autoscale", "SDL.AutoScale", 1);
154
config->addOption("keepratio", "SDL.KeepRatio", 1);
155
config->addOption("xscale", "SDL.XScale", 1.0);
156
config->addOption("yscale", "SDL.YScale", 1.0);
157
config->addOption("xstretch", "SDL.XStretch", 0);
158
config->addOption("ystretch", "SDL.YStretch", 0);
159
config->addOption("noframe", "SDL.NoFrame", 0);
160
config->addOption("special", "SDL.SpecialFilter", 0);
163
config->addOption("opengl", "SDL.OpenGL", 0);
164
config->addOption("openglip", "SDL.OpenGLip", 0);
165
config->addOption("SDL.SpecialFilter", 0);
166
config->addOption("SDL.SpecialFX", 0);
168
// network play options - netplay is broken
170
config->addOption('n', "net", "SDL.NetworkServer", "");
171
config->addOption('u', "user", "SDL.NetworkUsername", "");
172
config->addOption('w', "pass", "SDL.NetworkPassword", "");
173
config->addOption('k', "netkey", "SDL.NetworkGameKey", "");
174
config->addOption( 0, "port", "SDL.NetworkPort", 4046);
175
config->addOption('l', "players", "SDL.NetworkNumPlayers", 1);
177
// input configuration options
178
config->addOption("input1", "SDL.Input.0", "GamePad.0");
179
config->addOption("input2", "SDL.Input.1", "GamePad.1");
180
config->addOption("input3", "SDL.Input.2", "Gamepad.2");
181
config->addOption("input4", "SDL.Input.3", "Gamepad.3");
183
// allow for input configuration
184
config->addOption('i', "inputcfg", "SDL.InputCfg", InputCfg);
187
config->addOption("inputdisplay", "SDL.InputDisplay", 0);
189
// pause movie playback at frame x
190
config->addOption("pauseframe", "SDL.PauseFrame", 0);
192
// overwrite the config file?
193
config->addOption("no-config", "SDL.NoConfig", 0);
196
config->addOption("playmov", "SDL.Movie", "");
197
config->addOption("subtitles", "SDL.SubtitleDisplay", 1);
201
config->addOption("loadlua", "SDL.LuaScript", "");
205
config->addOption("videolog", "SDL.VideoLog", "");
206
config->addOption("mute", "SDL.MuteCapture", 0);
209
// fcm -> fm2 conversion
210
config->addOption("fcmconvert", "SDL.FCMConvert", "");
212
// fm2 -> srt conversion
213
config->addOption("ripsubs", "SDL.RipSubs", "");
215
// enable new PPU core
216
config->addOption("newppu", "SDL.NewPPU", "0");
219
for(unsigned int i = 0; i < GAMEPAD_NUM_DEVICES; i++) {
221
snprintf(buf, 20, "SDL.Input.GamePad.%d.", i);
224
config->addOption(prefix + "DeviceType", DefaultGamePadDevice[i]);
225
config->addOption(prefix + "DeviceNum", 0);
226
for(unsigned int j = 0; j < GAMEPAD_NUM_BUTTONS; j++) {
227
config->addOption(prefix + GamePadNames[j], DefaultGamePad[i][j]);
232
for(unsigned int i = 0; i < POWERPAD_NUM_DEVICES; i++) {
234
snprintf(buf, 20, "SDL.Input.PowerPad.%d.", i);
237
config->addOption(prefix + "DeviceType", DefaultPowerPadDevice[i]);
238
config->addOption(prefix + "DeviceNum", 0);
239
for(unsigned int j = 0; j < POWERPAD_NUM_BUTTONS; j++) {
240
config->addOption(prefix +PowerPadNames[j], DefaultPowerPad[i][j]);
245
prefix = "SDL.Input.QuizKing.";
246
config->addOption(prefix + "DeviceType", DefaultQuizKingDevice);
247
config->addOption(prefix + "DeviceNum", 0);
248
for(unsigned int j = 0; j < QUIZKING_NUM_BUTTONS; j++) {
249
config->addOption(prefix + QuizKingNames[j], DefaultQuizKing[j]);
253
prefix = "SDL.Input.HyperShot.";
254
config->addOption(prefix + "DeviceType", DefaultHyperShotDevice);
255
config->addOption(prefix + "DeviceNum", 0);
256
for(unsigned int j = 0; j < HYPERSHOT_NUM_BUTTONS; j++) {
257
config->addOption(prefix + HyperShotNames[j], DefaultHyperShot[j]);
261
prefix = "SDL.Input.Mahjong.";
262
config->addOption(prefix + "DeviceType", DefaultMahjongDevice);
263
config->addOption(prefix + "DeviceNum", 0);
264
for(unsigned int j = 0; j < MAHJONG_NUM_BUTTONS; j++) {
265
config->addOption(prefix + MahjongNames[j], DefaultMahjong[j]);
269
prefix = "SDL.Input.TopRider.";
270
config->addOption(prefix + "DeviceType", DefaultTopRiderDevice);
271
config->addOption(prefix + "DeviceNum", 0);
272
for(unsigned int j = 0; j < TOPRIDER_NUM_BUTTONS; j++) {
273
config->addOption(prefix + TopRiderNames[j], DefaultTopRider[j]);
277
prefix = "SDL.Input.FTrainer.";
278
config->addOption(prefix + "DeviceType", DefaultFTrainerDevice);
279
config->addOption(prefix + "DeviceNum", 0);
280
for(unsigned int j = 0; j < FTRAINER_NUM_BUTTONS; j++) {
281
config->addOption(prefix + FTrainerNames[j], DefaultFTrainer[j]);
285
prefix = "SDL.Input.FamilyKeyBoard.";
286
config->addOption(prefix + "DeviceType", DefaultFamilyKeyBoardDevice);
287
config->addOption(prefix + "DeviceNum", 0);
288
for(unsigned int j = 0; j < FAMILYKEYBOARD_NUM_BUTTONS; j++) {
289
config->addOption(prefix + FamilyKeyBoardNames[j],
290
DefaultFamilyKeyBoard[j]);
294
prefix = "SDL.Hotkeys.";
295
config->addOption(prefix + "CheatMenu", SDLK_F1);
296
config->addOption(prefix + "BindState", SDLK_F2);
298
config->addOption(prefix + "LoadLua", SDLK_F3);
300
config->addOption(prefix + "RenderBG", SDLK_F4);
301
config->addOption(prefix + "SaveState", SDLK_F5);
302
config->addOption(prefix + "FrameAdvanceLagSkip", SDLK_F6);
303
config->addOption(prefix + "LoadState", SDLK_F7);
304
config->addOption(prefix + "LagCounterDisplay", SDLK_F8);
305
config->addOption(prefix + "MovieToggleFrameDisplay", SDLK_F9);
306
config->addOption(prefix + "SubtitleDisplay", SDLK_F10);
307
config->addOption(prefix + "Reset", SDLK_F11);
308
config->addOption(prefix + "Screenshot", SDLK_F12);
309
config->addOption(prefix + "Pause", SDLK_PAUSE);
310
config->addOption(prefix + "DecreaseSpeed", SDLK_MINUS);
311
config->addOption(prefix + "IncreaseSpeed", SDLK_EQUALS);
312
config->addOption(prefix + "FrameAdvance", SDLK_BACKSLASH);
313
config->addOption(prefix + "InputDisplay", SDLK_i);
314
config->addOption(prefix + "MovieToggleReadWrite", SDLK_q);
316
config->addOption(prefix + "MuteCapture", SDLK_DELETE);
318
config->addOption(prefix + "Quit", SDLK_ESCAPE);
319
//config->addOption(prefix + "Power", 0);
324
config->addOption(prefix + "SelectState0", SDLK_0);
325
config->addOption(prefix + "SelectState1", SDLK_1);
326
config->addOption(prefix + "SelectState2", SDLK_2);
327
config->addOption(prefix + "SelectState3", SDLK_3);
328
config->addOption(prefix + "SelectState4", SDLK_4);
329
config->addOption(prefix + "SelectState5", SDLK_5);
330
config->addOption(prefix + "SelectState6", SDLK_6);
331
config->addOption(prefix + "SelectState7", SDLK_7);
332
config->addOption(prefix + "SelectState8", SDLK_8);
333
config->addOption(prefix + "SelectState9", SDLK_9);
338
config->addOption("SDL.OekaKids.0.DeviceType", "Mouse");
339
config->addOption("SDL.OekaKids.0.DeviceNum", 0);
341
config->addOption("SDL.Arkanoid.0.DeviceType", "Mouse");
342
config->addOption("SDL.Arkanoid.0.DeviceNum", 0);
344
config->addOption("SDL.Shadow.0.DeviceType", "Mouse");
345
config->addOption("SDL.Shadow.0.DeviceNum", 0);
347
config->addOption("SDL.Zapper.0.DeviceType", "Mouse");
348
config->addOption("SDL.Zapper.0.DeviceNum", 0);
354
UpdateEMUCore(Config *config)
356
int ntsccol, ntsctint, ntschue, flag, start, end;
357
std::string cpalette;
359
config->getOption("SDL.Color", &ntsccol);
360
config->getOption("SDL.Tint", &ntsctint);
361
config->getOption("SDL.Hue", &ntschue);
362
FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue);
364
config->getOption("SDL.Palette", &cpalette);
365
if(cpalette.size()) {
366
LoadCPalette(cpalette);
369
config->getOption("SDL.PAL", &flag);
370
FCEUI_SetVidSystem(flag ? 1 : 0);
372
config->getOption("SDL.GameGenie", &flag);
373
FCEUI_SetGameGenie(flag ? 1 : 0);
375
config->getOption("SDL.LowPass", &flag);
376
FCEUI_SetLowPass(flag ? 1 : 0);
378
config->getOption("SDL.DisableSpriteLimit", &flag);
379
FCEUI_DisableSpriteLimitation(flag ? 1 : 0);
382
//config->getOption("SDL.SnapName", &flag);
383
//FCEUI_SetSnapName(flag ? true : false);
385
config->getOption("SDL.ScanLineStart", &start);
386
config->getOption("SDL.ScanLineEnd", &end);
388
#if DOING_SCANLINE_CHECKS
389
for(int i = 0; i < 2; x++) {
390
if(srendlinev[x]<0 || srendlinev[x]>239) srendlinev[x]=0;
391
if(erendlinev[x]<srendlinev[x] || erendlinev[x]>239) erendlinev[x]=239;
395
FCEUI_SetRenderedLines(start + 8, end - 8, start, end);