Support for VS Unisystem games (Not yet supported properly in movies and netplay)
This commit is contained in:
parent
21b0d0cb06
commit
04d470b15d
38 changed files with 2028 additions and 41 deletions
|
@ -328,6 +328,7 @@ void BaseMapper::Initialize(RomData &romData)
|
|||
|
||||
_hasBattery = romData.HasBattery || ForceBattery();
|
||||
_isPalRom = romData.IsPalRom;
|
||||
_isVsSystem = romData.IsVsSystem;
|
||||
_crc32 = romData.Crc32;
|
||||
_hasBusConflicts = HasBusConflicts();
|
||||
|
||||
|
@ -417,8 +418,13 @@ void BaseMapper::ApplyCheats()
|
|||
|
||||
void BaseMapper::GetMemoryRanges(MemoryRanges &ranges)
|
||||
{
|
||||
ranges.AddHandler(MemoryOperation::Read, 0x4018, 0xFFFF);
|
||||
ranges.AddHandler(MemoryOperation::Write, 0x4018, 0xFFFF);
|
||||
if(IsVsSystem()) {
|
||||
ranges.AddHandler(MemoryOperation::Read, 0x6000, 0xFFFF);
|
||||
ranges.AddHandler(MemoryOperation::Write, 0x6000, 0xFFFF);
|
||||
} else {
|
||||
ranges.AddHandler(MemoryOperation::Read, 0x4018, 0xFFFF);
|
||||
ranges.AddHandler(MemoryOperation::Write, 0x4018, 0xFFFF);
|
||||
}
|
||||
}
|
||||
|
||||
void BaseMapper::SetDefaultNametables(uint8_t* nametableA, uint8_t* nametableB)
|
||||
|
@ -482,6 +488,11 @@ bool BaseMapper::IsPalRom()
|
|||
return _isPalRom;
|
||||
}
|
||||
|
||||
bool BaseMapper::IsVsSystem()
|
||||
{
|
||||
return _isVsSystem;
|
||||
}
|
||||
|
||||
uint32_t BaseMapper::GetCrc32()
|
||||
{
|
||||
return _crc32;
|
||||
|
|
|
@ -47,6 +47,7 @@ private:
|
|||
|
||||
bool _onlyChrRam = false;
|
||||
bool _isPalRom = false;
|
||||
bool _isVsSystem = false;
|
||||
bool _hasBusConflicts = false;
|
||||
string _romFilename;
|
||||
|
||||
|
@ -158,6 +159,7 @@ public:
|
|||
void SetDefaultNametables(uint8_t* nametableA, uint8_t* nametableB);
|
||||
|
||||
bool IsPalRom();
|
||||
bool IsVsSystem();
|
||||
uint32_t GetCrc32();
|
||||
|
||||
uint8_t ReadRAM(uint16_t addr);
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
#include <thread>
|
||||
#include "Console.h"
|
||||
#include "BaseMapper.h"
|
||||
#include "ControlManager.h"
|
||||
#include "VsControlManager.h"
|
||||
#include "MapperFactory.h"
|
||||
#include "Debugger.h"
|
||||
#include "MessageManager.h"
|
||||
|
@ -53,7 +55,7 @@ void Console::Initialize(string romFilename, stringstream *filestream, string ip
|
|||
}
|
||||
_apu.reset(new APU(_memoryManager.get()));
|
||||
|
||||
_controlManager.reset(new ControlManager());
|
||||
_controlManager.reset(_mapper->IsVsSystem() ? new VsControlManager() : new ControlManager());
|
||||
|
||||
_memoryManager->RegisterIODevice(_mapper.get());
|
||||
_memoryManager->RegisterIODevice(_ppu.get());
|
||||
|
|
|
@ -29,12 +29,12 @@ class ControlManager : public Snapshotable, public IMemoryHandler
|
|||
bool _refreshState = false;
|
||||
|
||||
void RefreshAllPorts();
|
||||
uint8_t GetPortValue(uint8_t port);
|
||||
|
||||
static void RegisterControlDevice(shared_ptr<BaseControlDevice> controlDevice, uint8_t port);
|
||||
void UnregisterControlDevice(uint8_t port);
|
||||
|
||||
protected:
|
||||
uint8_t GetPortValue(uint8_t port);
|
||||
virtual void StreamState(bool saving);
|
||||
|
||||
public:
|
||||
|
@ -59,12 +59,12 @@ class ControlManager : public Snapshotable, public IMemoryHandler
|
|||
|
||||
static void BroadcastInput(uint8_t port, uint8_t state);
|
||||
|
||||
void GetMemoryRanges(MemoryRanges &ranges)
|
||||
virtual void GetMemoryRanges(MemoryRanges &ranges)
|
||||
{
|
||||
ranges.AddHandler(MemoryOperation::Read, 0x4016, 0x4017);
|
||||
ranges.AddHandler(MemoryOperation::Write, 0x4016);
|
||||
}
|
||||
|
||||
uint8_t ReadRAM(uint16_t addr);
|
||||
void WriteRAM(uint16_t addr, uint8_t value);
|
||||
virtual uint8_t ReadRAM(uint16_t addr);
|
||||
virtual void WriteRAM(uint16_t addr, uint8_t value);
|
||||
};
|
|
@ -522,6 +522,8 @@
|
|||
<ClInclude Include="VRC6.h" />
|
||||
<ClInclude Include="VRC7.h" />
|
||||
<ClInclude Include="VrcIrq.h" />
|
||||
<ClInclude Include="VsControlManager.h" />
|
||||
<ClInclude Include="VsSystem.h" />
|
||||
<ClInclude Include="Zapper.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
@ -579,6 +581,7 @@
|
|||
<ClCompile Include="VideoRenderer.cpp" />
|
||||
<ClCompile Include="VideoDecoder.cpp" />
|
||||
<ClCompile Include="BaseVideoFilter.cpp" />
|
||||
<ClCompile Include="VsControlManager.cpp" />
|
||||
<ClCompile Include="Zapper.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
|
|
|
@ -575,6 +575,12 @@
|
|||
<ClInclude Include="Mapper241.h">
|
||||
<Filter>Nes\Mappers\Unnamed</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="VsSystem.h">
|
||||
<Filter>Nes\Mappers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="VsControlManager.h">
|
||||
<Filter>Nes</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
|
@ -646,9 +652,6 @@
|
|||
<ClCompile Include="ControlManager.cpp">
|
||||
<Filter>Nes</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MapperFactory.cpp">
|
||||
<Filter>Nes</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MemoryManager.cpp">
|
||||
<Filter>Nes</Filter>
|
||||
</ClCompile>
|
||||
|
@ -715,5 +718,11 @@
|
|||
<ClCompile Include="ReverbFilter.cpp">
|
||||
<Filter>Nes\APU\Filters</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MapperFactory.cpp">
|
||||
<Filter>Nes\Mappers</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="VsControlManager.cpp">
|
||||
<Filter>Nes</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,21 +1,6 @@
|
|||
#include "stdafx.h"
|
||||
#include "EmulationSettings.h"
|
||||
|
||||
uint32_t EmulationSettings::PpuPaletteArgb[64] = {
|
||||
0xFF666666, 0xFF002A88, 0xFF1412A7, 0xFF3B00A4, 0xFF5C007E,
|
||||
0xFF6E0040, 0xFF6C0600, 0xFF561D00, 0xFF333500, 0xFF0B4800,
|
||||
0xFF005200, 0xFF004F08, 0xFF00404D, 0xFF000000, 0xFF000000,
|
||||
0xFF000000, 0xFFADADAD, 0xFF155FD9, 0xFF4240FF, 0xFF7527FE,
|
||||
0xFFA01ACC, 0xFFB71E7B, 0xFFB53120, 0xFF994E00, 0xFF6B6D00,
|
||||
0xFF388700, 0xFF0C9300, 0xFF008F32, 0xFF007C8D, 0xFF000000,
|
||||
0xFF000000, 0xFF000000, 0xFFFFFEFF, 0xFF64B0FF, 0xFF9290FF,
|
||||
0xFFC676FF, 0xFFF36AFF, 0xFFFE6ECC, 0xFFFE8170, 0xFFEA9E22,
|
||||
0xFFBCBE00, 0xFF88D800, 0xFF5CE430, 0xFF45E082, 0xFF48CDDE,
|
||||
0xFF4F4F4F, 0xFF000000, 0xFF000000, 0xFFFFFEFF, 0xFFC0DFFF,
|
||||
0xFFD3D2FF, 0xFFE8C8FF, 0xFFFBC2FF, 0xFFFEC4EA, 0xFFFECCC5,
|
||||
0xFFF7D8A5, 0xFFE4E594, 0xFFCFEF96, 0xFFBDF4AB, 0xFFB3F3CC,
|
||||
0xFFB5EBF2, 0xFFB8B8B8, 0xFF000000, 0xFF000000,
|
||||
};
|
||||
#include "VsControlManager.h"
|
||||
|
||||
//Version 0.1.1
|
||||
uint16_t EmulationSettings::_versionMajor = 0;
|
||||
|
@ -37,6 +22,7 @@ double EmulationSettings::_reverbStrength = 0;
|
|||
double EmulationSettings::_reverbDelay = 0;
|
||||
|
||||
NesModel EmulationSettings::_model = NesModel::Auto;
|
||||
PpuModel EmulationSettings::_ppuModel = PpuModel::Ppu2C03;
|
||||
|
||||
uint32_t EmulationSettings::_emulationSpeed = 100;
|
||||
|
||||
|
@ -49,4 +35,18 @@ ConsoleType EmulationSettings::_consoleType = ConsoleType::Nes;
|
|||
ExpansionPortDevice EmulationSettings::_expansionDevice = ExpansionPortDevice::None;
|
||||
ControllerType EmulationSettings::_controllerTypes[4] = { ControllerType::None, ControllerType::None, ControllerType::None, ControllerType::None };
|
||||
KeyMappingSet EmulationSettings::_controllerKeys[4] = { KeyMappingSet(), KeyMappingSet(), KeyMappingSet(), KeyMappingSet() };
|
||||
bool EmulationSettings::_needControllerUpdate = false;
|
||||
bool EmulationSettings::_needControllerUpdate = false;
|
||||
|
||||
uint32_t EmulationSettings::_ppuPaletteArgb[11][64] = {
|
||||
/* 2C02 */ { 0xFF666666, 0xFF002A88, 0xFF1412A7, 0xFF3B00A4, 0xFF5C007E, 0xFF6E0040, 0xFF6C0600, 0xFF561D00, 0xFF333500, 0xFF0B4800, 0xFF005200, 0xFF004F08, 0xFF00404D, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFADADAD, 0xFF155FD9, 0xFF4240FF, 0xFF7527FE, 0xFFA01ACC, 0xFFB71E7B, 0xFFB53120, 0xFF994E00, 0xFF6B6D00, 0xFF388700, 0xFF0C9300, 0xFF008F32, 0xFF007C8D, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFEFF, 0xFF64B0FF, 0xFF9290FF, 0xFFC676FF, 0xFFF36AFF, 0xFFFE6ECC, 0xFFFE8170, 0xFFEA9E22, 0xFFBCBE00, 0xFF88D800, 0xFF5CE430, 0xFF45E082, 0xFF48CDDE, 0xFF4F4F4F, 0xFF000000, 0xFF000000, 0xFFFFFEFF, 0xFFC0DFFF, 0xFFD3D2FF, 0xFFE8C8FF, 0xFFFBC2FF, 0xFFFEC4EA, 0xFFFECCC5, 0xFFF7D8A5, 0xFFE4E594, 0xFFCFEF96, 0xFFBDF4AB, 0xFFB3F3CC, 0xFFB5EBF2, 0xFFB8B8B8, 0xFF000000, 0xFF000000 } ,
|
||||
/* 2C03 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
|
||||
/* 2C04-0001 */ { 0xFFFFB6B6, 0xFFDA6DFF, 0xFFFF0000, 0xFF9191FF, 0xFF009191, 0xFF244800, 0xFF484848, 0xFFFF0091, 0xFFFFFFFF, 0xFF6D6D6D, 0xFFFFB600, 0xFFB6006D, 0xFF91006D, 0xFFDADA00, 0xFF6D4800, 0xFFFFFFFF, 0xFF6DB6FF, 0xFFDAB66D, 0xFF6D2400, 0xFF6DDA00, 0xFF91DAFF, 0xFFDAB6FF, 0xFFFFDA91, 0xFF0048FF, 0xFFFFDA00, 0xFF48FFDA, 0xFF000000, 0xFF480000, 0xFFDADADA, 0xFF919191, 0xFFFF00FF, 0xFF002491, 0xFF00006D, 0xFFB6DAFF, 0xFFFFB6FF, 0xFF00FF00, 0xFF00FFFF, 0xFF004848, 0xFF00B66D, 0xFFB600FF, 0xFF000000, 0xFF914800, 0xFFFF91FF, 0xFFB62400, 0xFF9100FF, 0xFF0000DA, 0xFFFF9100, 0xFF000000, 0xFF000000, 0xFF249100, 0xFFB6B6B6, 0xFF006D24, 0xFFB6FF48, 0xFF6D48DA, 0xFFFFFF00, 0xFFDA6D00, 0xFF004800, 0xFF006DDA, 0xFF009100, 0xFF242424, 0xFFFFFF6D, 0xFFFF6DFF, 0xFF916D00, 0xFF91FF6D },
|
||||
/* 2C04-0002 */ { 0xFF000000, 0xFFFFB600, 0xFF916D00, 0xFFB6FF48, 0xFF91FF6D, 0xFFFF6DFF, 0xFF009191, 0xFFB6DAFF, 0xFFFF0000, 0xFF9100FF, 0xFFFFFF6D, 0xFFFF91FF, 0xFFFFFFFF, 0xFFDA6DFF, 0xFF91DAFF, 0xFF009100, 0xFF004800, 0xFF6DB6FF, 0xFFB62400, 0xFFDADADA, 0xFF00B66D, 0xFF6DDA00, 0xFF480000, 0xFF9191FF, 0xFF484848, 0xFFFF00FF, 0xFF00006D, 0xFF48FFDA, 0xFFDAB6FF, 0xFF6D4800, 0xFF000000, 0xFF6D48DA, 0xFF91006D, 0xFFFFDA91, 0xFFFF9100, 0xFFFFB6FF, 0xFF006DDA, 0xFF6D2400, 0xFFB6B6B6, 0xFF0000DA, 0xFFB600FF, 0xFFFFDA00, 0xFF6D6D6D, 0xFF244800, 0xFF0048FF, 0xFF000000, 0xFFDADA00, 0xFFFFFFFF, 0xFFDAB66D, 0xFF242424, 0xFF00FF00, 0xFFDA6D00, 0xFF004848, 0xFF002491, 0xFFFF0091, 0xFF249100, 0xFF000000, 0xFF00FFFF, 0xFF914800, 0xFFFFFF00, 0xFFFFB6B6, 0xFFB6006D, 0xFF006D24, 0xFF919191 },
|
||||
/* 2C04-0003 */ { 0xFFB600FF, 0xFFFF6DFF, 0xFF91FF6D, 0xFFB6B6B6, 0xFF009100, 0xFFFFFFFF, 0xFFB6DAFF, 0xFF244800, 0xFF002491, 0xFF000000, 0xFFFFDA91, 0xFF6D4800, 0xFFFF0091, 0xFFDADADA, 0xFFDAB66D, 0xFF91DAFF, 0xFF9191FF, 0xFF009191, 0xFFB6006D, 0xFF0048FF, 0xFF249100, 0xFF916D00, 0xFFDA6D00, 0xFF00B66D, 0xFF6D6D6D, 0xFF6D48DA, 0xFF000000, 0xFF0000DA, 0xFFFF0000, 0xFFB62400, 0xFFFF91FF, 0xFFFFB6B6, 0xFFDA6DFF, 0xFF004800, 0xFF00006D, 0xFFFFFF00, 0xFF242424, 0xFFFFB600, 0xFFFF9100, 0xFFFFFFFF, 0xFF6DDA00, 0xFF91006D, 0xFF6DB6FF, 0xFFFF00FF, 0xFF006DDA, 0xFF919191, 0xFF000000, 0xFF6D2400, 0xFF00FFFF, 0xFF480000, 0xFFB6FF48, 0xFFFFB6FF, 0xFF914800, 0xFF00FF00, 0xFFDADA00, 0xFF484848, 0xFF006D24, 0xFF000000, 0xFFDAB6FF, 0xFFFFFF6D, 0xFF9100FF, 0xFF48FFDA, 0xFFFFDA00, 0xFF004848 },
|
||||
/* 2C04-0004 */ { 0xFF916D00, 0xFF6D48DA, 0xFF009191, 0xFFDADA00, 0xFF000000, 0xFFFFB6B6, 0xFF002491, 0xFFDA6D00, 0xFFB6B6B6, 0xFF6D2400, 0xFF00FF00, 0xFF00006D, 0xFFFFDA91, 0xFFFFFF00, 0xFF009100, 0xFFB6FF48, 0xFFFF6DFF, 0xFF480000, 0xFF0048FF, 0xFFFF91FF, 0xFF000000, 0xFF484848, 0xFFB62400, 0xFFFF9100, 0xFFDAB66D, 0xFF00B66D, 0xFF9191FF, 0xFF249100, 0xFF91006D, 0xFF000000, 0xFF91FF6D, 0xFF6DB6FF, 0xFFB6006D, 0xFF006D24, 0xFF914800, 0xFF0000DA, 0xFF9100FF, 0xFFB600FF, 0xFF6D6D6D, 0xFFFF0091, 0xFF004848, 0xFFDADADA, 0xFF006DDA, 0xFF004800, 0xFF242424, 0xFFFFFF6D, 0xFF919191, 0xFFFF00FF, 0xFFFFB6FF, 0xFFFFFFFF, 0xFF6D4800, 0xFFFF0000, 0xFFFFDA00, 0xFF48FFDA, 0xFFFFFFFF, 0xFF91DAFF, 0xFF000000, 0xFFFFB600, 0xFFDA6DFF, 0xFFB6DAFF, 0xFF6DDA00, 0xFFDAB6FF, 0xFF00FFFF, 0xFF244800 },
|
||||
/* 2C05-01 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
|
||||
/* 2C05-02 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
|
||||
/* 2C05-03 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
|
||||
/* 2C05-04 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
|
||||
/* 2C05-05 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 }
|
||||
};
|
|
@ -159,6 +159,21 @@ enum class StereoFilter
|
|||
Panning = 2,
|
||||
};
|
||||
|
||||
enum class PpuModel
|
||||
{
|
||||
Ppu2C02 = 0,
|
||||
Ppu2C03 = 1,
|
||||
Ppu2C04A = 2,
|
||||
Ppu2C04B = 3,
|
||||
Ppu2C04C = 4,
|
||||
Ppu2C04D = 5,
|
||||
Ppu2C05A = 6,
|
||||
Ppu2C05B = 7,
|
||||
Ppu2C05C = 8,
|
||||
Ppu2C05D = 9,
|
||||
Ppu2C05E = 10
|
||||
};
|
||||
|
||||
class EmulationSettings
|
||||
{
|
||||
private:
|
||||
|
@ -166,7 +181,7 @@ private:
|
|||
static uint8_t _versionMinor;
|
||||
static uint8_t _versionRevision;
|
||||
|
||||
static uint32_t PpuPaletteArgb[64];
|
||||
static uint32_t _ppuPaletteArgb[11][64];
|
||||
static uint32_t _flags;
|
||||
|
||||
static Language _displayLanguage;
|
||||
|
@ -182,6 +197,7 @@ private:
|
|||
static double _reverbDelay;
|
||||
|
||||
static NesModel _model;
|
||||
static PpuModel _ppuModel;
|
||||
|
||||
static uint32_t _emulationSpeed;
|
||||
|
||||
|
@ -247,6 +263,16 @@ public:
|
|||
return _model;
|
||||
}
|
||||
|
||||
static void SetPpuModel(PpuModel ppuModel)
|
||||
{
|
||||
_ppuModel = ppuModel;
|
||||
}
|
||||
|
||||
static PpuModel GetPpuModel()
|
||||
{
|
||||
return _ppuModel;
|
||||
}
|
||||
|
||||
//0: Muted, 0.5: Default, 1.0: Max volume
|
||||
static void SetChannelVolume(AudioChannel channel, double volume)
|
||||
{
|
||||
|
@ -410,17 +436,17 @@ public:
|
|||
|
||||
static uint32_t* GetRgbPalette()
|
||||
{
|
||||
return PpuPaletteArgb;
|
||||
return _ppuPaletteArgb[(int)_ppuModel];
|
||||
}
|
||||
|
||||
static void GetRgbPalette(uint32_t* paletteBuffer)
|
||||
{
|
||||
memcpy(paletteBuffer, PpuPaletteArgb, sizeof(PpuPaletteArgb));
|
||||
memcpy(paletteBuffer, _ppuPaletteArgb[0], sizeof(_ppuPaletteArgb[0]));
|
||||
}
|
||||
|
||||
static void SetRgbPalette(uint32_t* paletteBuffer)
|
||||
{
|
||||
memcpy(PpuPaletteArgb, paletteBuffer, sizeof(PpuPaletteArgb));
|
||||
memcpy(_ppuPaletteArgb[0], paletteBuffer, sizeof(_ppuPaletteArgb[0]));
|
||||
}
|
||||
|
||||
static void SetExpansionDevice(ExpansionPortDevice expansionDevice)
|
||||
|
|
|
@ -154,10 +154,7 @@ public:
|
|||
RomData romData;
|
||||
|
||||
romData.MapperID = MapperFactory::FdsMapperID;
|
||||
romData.SubMapperID = 0;
|
||||
romData.MirroringType = MirroringType::Vertical;
|
||||
romData.HasBattery = false;
|
||||
romData.IsPalRom = false;
|
||||
romData.PrgRom = LoadBios();
|
||||
|
||||
if(romData.PrgRom.size() != 0x2000) {
|
||||
|
|
|
@ -89,6 +89,7 @@
|
|||
#include "VRC3.h"
|
||||
#include "VRC6.h"
|
||||
#include "VRC7.h"
|
||||
#include "VsSystem.h"
|
||||
|
||||
BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
|
||||
{
|
||||
|
@ -160,6 +161,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
|
|||
case 94: return new UnRom_94();
|
||||
case 95: return new Namco108_95();
|
||||
case 97: return new IremTamS1();
|
||||
case 99: return new VsSystem();
|
||||
case 101: return new JalecoJfxx(true);
|
||||
case 107: return new Mapper107();
|
||||
case 112: return new Mapper112();
|
||||
|
|
24
Core/PPU.cpp
24
Core/PPU.cpp
|
@ -11,6 +11,8 @@ PPU::PPU(MemoryManager *memoryManager)
|
|||
{
|
||||
PPU::Instance = this;
|
||||
|
||||
EmulationSettings::SetPpuModel(PpuModel::Ppu2C02);
|
||||
|
||||
_memoryManager = memoryManager;
|
||||
_outputBuffers[0] = new uint16_t[256 * 240];
|
||||
_outputBuffers[1] = new uint16_t[256 * 240];
|
||||
|
@ -20,7 +22,7 @@ PPU::PPU(MemoryManager *memoryManager)
|
|||
uint8_t paletteRamBootValues[0x20] { 0x09, 0x01, 0x00, 0x01, 0x00, 0x02, 0x02, 0x0D, 0x08, 0x10, 0x08, 0x24, 0x00, 0x00, 0x04, 0x2C,
|
||||
0x09, 0x01, 0x34, 0x03, 0x00, 0x04, 0x00, 0x14, 0x08, 0x3A, 0x00, 0x02, 0x00, 0x20, 0x2C, 0x08 };
|
||||
memcpy(_paletteRAM, paletteRamBootValues, sizeof(_paletteRAM));
|
||||
memset(_spriteRAM, 0xFF, 0x100);
|
||||
memset(_spriteRAM, 0xFF, 0x100);
|
||||
memset(_secondarySpriteRAM, 0xFF, 0x20);
|
||||
|
||||
Reset();
|
||||
|
@ -137,6 +139,14 @@ uint8_t PPU::ReadRAM(uint16_t addr)
|
|||
UpdateStatusFlag();
|
||||
returnValue = _state.Status;
|
||||
openBusMask = 0x1F;
|
||||
|
||||
switch(EmulationSettings::GetPpuModel()) {
|
||||
case PpuModel::Ppu2C05A: openBusMask = 0x00; returnValue |= 0x1B; break;
|
||||
case PpuModel::Ppu2C05B: openBusMask = 0x00; returnValue |= 0x3D; break;
|
||||
case PpuModel::Ppu2C05C: openBusMask = 0x00; returnValue |= 0x1C; break;
|
||||
case PpuModel::Ppu2C05D: openBusMask = 0x00; returnValue |= 0x1B; break;
|
||||
case PpuModel::Ppu2C05E: openBusMask = 0x00; break;
|
||||
}
|
||||
break;
|
||||
|
||||
case PPURegisters::SpriteData:
|
||||
|
@ -190,10 +200,18 @@ void PPU::WriteRAM(uint16_t addr, uint8_t value)
|
|||
|
||||
switch(GetRegisterID(addr)) {
|
||||
case PPURegisters::Control:
|
||||
SetControlRegister(value);
|
||||
if(EmulationSettings::GetPpuModel() >= PpuModel::Ppu2C05A && EmulationSettings::GetPpuModel() <= PpuModel::Ppu2C05E) {
|
||||
SetMaskRegister(value);
|
||||
} else {
|
||||
SetControlRegister(value);
|
||||
}
|
||||
break;
|
||||
case PPURegisters::Mask:
|
||||
SetMaskRegister(value);
|
||||
if(EmulationSettings::GetPpuModel() >= PpuModel::Ppu2C05A && EmulationSettings::GetPpuModel() <= PpuModel::Ppu2C05E) {
|
||||
SetControlRegister(value);
|
||||
} else {
|
||||
SetMaskRegister(value);
|
||||
}
|
||||
break;
|
||||
case PPURegisters::SpriteAddr:
|
||||
_state.SpriteRamAddr = value;
|
||||
|
|
|
@ -22,9 +22,11 @@ struct RomData
|
|||
string Filename;
|
||||
|
||||
uint16_t MapperID;
|
||||
uint8_t SubMapperID;
|
||||
bool HasBattery;
|
||||
bool IsPalRom;
|
||||
uint8_t SubMapperID = 0;
|
||||
bool HasBattery = false;
|
||||
bool IsPalRom = false;
|
||||
bool IsVsSystem = false;
|
||||
bool IsPlayChoice = false;
|
||||
MirroringType MirroringType;
|
||||
|
||||
vector<uint8_t> PrgRom;
|
||||
|
@ -95,6 +97,24 @@ struct NESHeader
|
|||
}
|
||||
}
|
||||
|
||||
bool IsPlaychoice()
|
||||
{
|
||||
switch(GetRomHeaderVersion()) {
|
||||
case RomHeaderVersion::Nes2_0:
|
||||
case RomHeaderVersion::iNes: return (Byte7 & 0x02) == 0x02;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool IsVsSystem()
|
||||
{
|
||||
switch(GetRomHeaderVersion()) {
|
||||
case RomHeaderVersion::Nes2_0:
|
||||
case RomHeaderVersion::iNes: return (Byte7 & 0x01) == 0x01;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
RomHeaderVersion GetRomHeaderVersion()
|
||||
{
|
||||
if((Byte7 & 0x0C) == 0x08) {
|
||||
|
|
|
@ -122,6 +122,10 @@ bool RomLoader::LoadFile(string filename, istream *filestream, string ipsFilenam
|
|||
RomData RomLoader::GetRomData()
|
||||
{
|
||||
_romData.Filename = _filename;
|
||||
|
||||
//Use filename to detect PAL/VS system games
|
||||
_romData.IsPalRom |= _filename.find("(e)") != string::npos || _filename.find("(E)") != string::npos;
|
||||
_romData.IsVsSystem |= _filename.find("(VS)") != string::npos || _filename.find("(vs)") != string::npos || _filename.find("(Vs)") != string::npos || _filename.find("(vS)") != string::npos;
|
||||
return _romData;
|
||||
}
|
||||
|
||||
|
|
4
Core/VsControlManager.cpp
Normal file
4
Core/VsControlManager.cpp
Normal file
|
@ -0,0 +1,4 @@
|
|||
#include "stdafx.h"
|
||||
#include "VsControlManager.h"
|
||||
|
||||
VsControlManager *VsControlManager::_instance = nullptr;
|
121
Core/VsControlManager.h
Normal file
121
Core/VsControlManager.h
Normal file
|
@ -0,0 +1,121 @@
|
|||
#pragma once
|
||||
#include "stdafx.h"
|
||||
#include "ControlManager.h"
|
||||
#include "CPU.h"
|
||||
#include <assert.h>
|
||||
|
||||
class VsControlManager : public ControlManager
|
||||
{
|
||||
private:
|
||||
static VsControlManager *_instance;
|
||||
uint8_t _prgChrSelectBit;
|
||||
uint8_t _dipSwitches = 0;
|
||||
bool _serviceButton = false;
|
||||
bool _coinInserted[2] = { };
|
||||
int32_t _coinInsertCycle[2] = { };
|
||||
|
||||
private:
|
||||
void UpdateCoinInsertedFlags()
|
||||
{
|
||||
int32_t cycle = CPU::GetCycleCount();
|
||||
for(int i = 0; i < 2; i++) {
|
||||
if(_coinInserted[i] && cycle - _coinInsertCycle[i] > 120000) {
|
||||
_coinInserted[i] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
VsControlManager()
|
||||
{
|
||||
_instance = this;
|
||||
}
|
||||
|
||||
~VsControlManager()
|
||||
{
|
||||
if(_instance == this) {
|
||||
_instance = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
static VsControlManager* GetInstance()
|
||||
{
|
||||
return _instance;
|
||||
}
|
||||
|
||||
void InsertCoin(uint8_t port)
|
||||
{
|
||||
assert(port < 2);
|
||||
|
||||
_coinInsertCycle[port] = CPU::GetCycleCount();
|
||||
_coinInserted[port] = true;
|
||||
}
|
||||
|
||||
void SetDipSwitches(uint8_t dipSwitches)
|
||||
{
|
||||
_dipSwitches = dipSwitches;
|
||||
}
|
||||
|
||||
void SetServiceButtonState(bool pushed)
|
||||
{
|
||||
_serviceButton = pushed;
|
||||
}
|
||||
|
||||
void GetMemoryRanges(MemoryRanges &ranges)
|
||||
{
|
||||
ControlManager::GetMemoryRanges(ranges);
|
||||
ranges.AddHandler(MemoryOperation::Read, 0x4020, 0x5FFF);
|
||||
ranges.AddHandler(MemoryOperation::Write, 0x4020, 0x5FFF);
|
||||
}
|
||||
|
||||
uint8_t GetPrgChrSelectBit()
|
||||
{
|
||||
return _prgChrSelectBit;
|
||||
}
|
||||
|
||||
uint8_t ReadRAM(uint16_t addr)
|
||||
{
|
||||
UpdateCoinInsertedFlags();
|
||||
|
||||
uint8_t value = 0;
|
||||
switch(addr) {
|
||||
case 0x4016: value = GetPortValue(1); break;
|
||||
case 0x4017: value = GetPortValue(0); break;
|
||||
}
|
||||
|
||||
value &= 0x01;
|
||||
|
||||
if(addr == 0x4016) {
|
||||
if(_coinInserted[0]) {
|
||||
value |= 0x20;
|
||||
}
|
||||
if(_coinInserted[1]) {
|
||||
value |= 0x40;
|
||||
}
|
||||
if(_serviceButton) {
|
||||
value |= 0x04;
|
||||
}
|
||||
|
||||
value |= ((_dipSwitches & 0x01) ? 0x08 : 0x00);
|
||||
value |= ((_dipSwitches & 0x02) ? 0x10 : 0x00);
|
||||
} else if(addr == 0x4017) {
|
||||
value |= ((_dipSwitches & 0x04) ? 0x04 : 0x00);
|
||||
value |= ((_dipSwitches & 0x08) ? 0x08 : 0x00);
|
||||
value |= ((_dipSwitches & 0x10) ? 0x10 : 0x00);
|
||||
value |= ((_dipSwitches & 0x20) ? 0x20 : 0x00);
|
||||
value |= ((_dipSwitches & 0x40) ? 0x40 : 0x00);
|
||||
value |= ((_dipSwitches & 0x80) ? 0x80 : 0x00);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
void WriteRAM(uint16_t addr, uint8_t value)
|
||||
{
|
||||
ControlManager::WriteRAM(addr, value);
|
||||
|
||||
if(addr == 0x4016) {
|
||||
_prgChrSelectBit = (value >> 2) & 0x01;
|
||||
}
|
||||
}
|
||||
};
|
36
Core/VsSystem.h
Normal file
36
Core/VsSystem.h
Normal file
|
@ -0,0 +1,36 @@
|
|||
#pragma once
|
||||
#include "stdafx.h"
|
||||
#include "BaseMapper.h"
|
||||
#include "VsControlManager.h"
|
||||
|
||||
class VsSystem : public BaseMapper
|
||||
{
|
||||
private:
|
||||
uint8_t _prgChrSelectBit = false;
|
||||
|
||||
protected:
|
||||
virtual uint16_t GetPRGPageSize() { return 0x2000; }
|
||||
virtual uint16_t GetCHRPageSize() { return 0x2000; }
|
||||
|
||||
virtual void InitMapper()
|
||||
{
|
||||
if(_prgSize > 0x6000) {
|
||||
SelectPRGPage(0, 0);
|
||||
}
|
||||
SelectPRGPage(1, 1);
|
||||
SelectPRGPage(2, 2);
|
||||
SelectPRGPage(3, 3);
|
||||
|
||||
SelectCHRPage(0, 0);
|
||||
}
|
||||
|
||||
uint8_t ReadVRAM(uint16_t addr)
|
||||
{
|
||||
if(_prgChrSelectBit != VsControlManager::GetInstance()->GetPrgChrSelectBit()) {
|
||||
_prgChrSelectBit = VsControlManager::GetInstance()->GetPrgChrSelectBit();
|
||||
SelectCHRPage(0, _prgChrSelectBit);
|
||||
}
|
||||
|
||||
return BaseMapper::ReadVRAM(addr);
|
||||
}
|
||||
};
|
|
@ -20,6 +20,8 @@ public:
|
|||
romData.MirroringType = header.GetMirroringType();
|
||||
romData.HasBattery = header.HasBattery();
|
||||
romData.IsPalRom = header.IsPalRom();
|
||||
romData.IsVsSystem = header.IsVsSystem();
|
||||
romData.IsPlayChoice = header.IsPlaychoice();
|
||||
|
||||
romData.PrgRom.insert(romData.PrgRom.end(), buffer, buffer + header.GetPrgSize());
|
||||
buffer += header.GetPrgSize();
|
||||
|
|
|
@ -18,6 +18,7 @@ namespace Mesen.GUI.Config
|
|||
public VideoInfo VideoInfo;
|
||||
public InputInfo InputInfo;
|
||||
public List<string> RecentFiles;
|
||||
public List<VsConfigInfo> VsConfig;
|
||||
public List<CheatInfo> Cheats;
|
||||
public bool ShowOnlyCheatsForCurrentGame;
|
||||
public NesModel Region;
|
||||
|
|
111
GUI.NET/Config/VsConfigInfo.cs
Normal file
111
GUI.NET/Config/VsConfigInfo.cs
Normal file
|
@ -0,0 +1,111 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
|
||||
namespace Mesen.GUI.Config
|
||||
{
|
||||
public class VsConfigInfo
|
||||
{
|
||||
public string GameID;
|
||||
public string GameHash;
|
||||
public InteropEmu.PpuModel PpuModel;
|
||||
public byte DipSwitches;
|
||||
|
||||
public static VsConfigInfo GetCurrentGameConfig(bool createNew)
|
||||
{
|
||||
string hash = MD5Helper.GetMD5Hash(InteropEmu.GetROMPath());
|
||||
foreach(VsConfigInfo config in ConfigManager.Config.VsConfig) {
|
||||
if(config.GameHash == hash) {
|
||||
return config;
|
||||
}
|
||||
}
|
||||
|
||||
if(createNew) {
|
||||
VsConfigInfo newConfig = new VsConfigInfo();
|
||||
newConfig.GameHash = hash;
|
||||
ConfigManager.Config.VsConfig.Add(newConfig);
|
||||
return newConfig;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void ApplyConfig()
|
||||
{
|
||||
VsConfigInfo configInfo = GetCurrentGameConfig(false);
|
||||
if(configInfo != null) {
|
||||
InteropEmu.VsSetGameConfig(configInfo.PpuModel, configInfo.DipSwitches);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class VsGameConfig
|
||||
{
|
||||
public string GameName;
|
||||
public List<List<string>> DipSwitches;
|
||||
|
||||
private static Dictionary<string, VsGameConfig> _gameConfigs = new Dictionary<string, VsGameConfig>();
|
||||
|
||||
public static string GetGameID(string romName)
|
||||
{
|
||||
romName = romName.ToLowerInvariant().Replace(" ", "");
|
||||
foreach(KeyValuePair<string, VsGameConfig> kvp in _gameConfigs) {
|
||||
if(romName.Contains(kvp.Key.ToLowerInvariant().Replace(" ", "")) || romName.Contains(kvp.Value.GameName.ToLowerInvariant().Replace(" ", ""))) {
|
||||
return kvp.Key;
|
||||
}
|
||||
}
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
public static VsGameConfig GetGameConfig(string gameID)
|
||||
{
|
||||
if(gameID != null && _gameConfigs.ContainsKey(gameID)) {
|
||||
return _gameConfigs[gameID];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static Dictionary<string, VsGameConfig> GetGameConfigs()
|
||||
{
|
||||
return _gameConfigs;
|
||||
}
|
||||
|
||||
static VsGameConfig()
|
||||
{
|
||||
XmlDocument config = new XmlDocument();
|
||||
config.Load(ResourceManager.GetZippedResource("VsSystem.xml"));
|
||||
|
||||
foreach(XmlNode gameNode in config.SelectNodes("/VsSystemGames/Game")) {
|
||||
var gameConfig = new VsGameConfig();
|
||||
gameConfig.GameName = gameNode.Attributes["Localization"].Value;
|
||||
gameConfig.DipSwitches = new List<List<string>>();
|
||||
foreach(XmlNode dipSwitch in gameNode.SelectNodes("DipSwitch")) {
|
||||
if(dipSwitch.Attributes["Localization"] != null) {
|
||||
var list = new List<string>();
|
||||
gameConfig.DipSwitches.Add(list);
|
||||
|
||||
list.Add(dipSwitch.Attributes["Localization"].Value);
|
||||
foreach(XmlNode option in dipSwitch.SelectNodes("Option")) {
|
||||
list.Add(option.InnerText);
|
||||
}
|
||||
} else {
|
||||
var list = new List<string>();
|
||||
gameConfig.DipSwitches.Add(list);
|
||||
|
||||
list.Add("Unknown");
|
||||
list.Add("Off");
|
||||
list.Add("On");
|
||||
}
|
||||
}
|
||||
_gameConfigs[gameNode.Attributes["ID"].Value] = gameConfig;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
737
GUI.NET/Dependencies/VsSystem.xml
Normal file
737
GUI.NET/Dependencies/VsSystem.xml
Normal file
|
@ -0,0 +1,737 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<VsSystemGames>
|
||||
<Game ID="BattleCity" Localization="Battle City">
|
||||
<DipSwitch Localization="Credits for 2 Players">
|
||||
<Option>1</Option>
|
||||
<Option>2</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>3</Option>
|
||||
<Option>5</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Demo Sounds">
|
||||
<Option>On</Option>
|
||||
<Option>Off</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="PPU">
|
||||
<Option>RP2C04-0001</Option>
|
||||
<Option>RP2C04-0002</Option>
|
||||
<Option>RP2C04-0003</Option>
|
||||
<Option>RP2C04-0004</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="Castlevania" Localization="Castlevania">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>3</Option>
|
||||
<Option>2</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Bonus">
|
||||
<Option>100k</Option>
|
||||
<Option>300k</Option>
|
||||
<Option>200k</Option>
|
||||
<Option>400k</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty">
|
||||
<Option>Normal</Option>
|
||||
<Option>Hard</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="CluCluLand" Localization="Clu Clu Land">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>3</Option>
|
||||
<Option>5</Option>
|
||||
<Option>4</Option>
|
||||
<Option>2</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
<Game ID="DrMario" Localization="Dr. Mario">
|
||||
<DipSwitch Localization="Drop Rate Increases After">
|
||||
<Option>7 Pills</Option>
|
||||
<Option>8 Pills</Option>
|
||||
<Option>9 Pills</Option>
|
||||
<Option>10 Pills</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Virus Level">
|
||||
<Option>1</Option>
|
||||
<Option>3</Option>
|
||||
<Option>5</Option>
|
||||
<Option>7</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Drop Speed">
|
||||
<Option>Slow</Option>
|
||||
<Option>Normal</Option>
|
||||
<Option>Fast</Option>
|
||||
<Option>Faster</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Free Play">
|
||||
<Option>Off</Option>
|
||||
<Option>On</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Demo Sounds">
|
||||
<Option>Off</Option>
|
||||
<Option>On</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="DuckHunt" Localization="Duck Hunt">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty">
|
||||
<Option>Very Easy</Option>
|
||||
<Option>Easy</Option>
|
||||
<Option>Hard</Option>
|
||||
<Option>Very Hard</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Misses per Game">
|
||||
<Option>3</Option>
|
||||
<Option>5</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Bonus Life">
|
||||
<Option>30000</Option>
|
||||
<Option>50000</Option>
|
||||
<Option>80000</Option>
|
||||
<Option>100000</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="ExciteBike" Localization="Excitebike">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Bonus">
|
||||
<Option>100k and Every 50k</Option>
|
||||
<Option>100k Only</Option>
|
||||
<Option>Every 100k</Option>
|
||||
<Option>None</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Part 1 Qualifying Time">
|
||||
<Option>Normal</Option>
|
||||
<Option>Hard</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Part 2 Qualifying Time">
|
||||
<Option>Normal</Option>
|
||||
<Option>Hard</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="FreedomForce" Localization="Freedom Force">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
<Game ID="Golf" Localization="Golf">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>Free Play</Option>
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Hole Size">
|
||||
<Option>Large</Option>
|
||||
<Option>Small</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Points per Stroke">
|
||||
<Option>Easy</Option>
|
||||
<Option>Hard</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Starting Points">
|
||||
<Option>10</Option>
|
||||
<Option>16</Option>
|
||||
<Option>13</Option>
|
||||
<Option>20</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty Vs. Computer">
|
||||
<Option>Easy</Option>
|
||||
<Option>Hard</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="Goonies" Localization="Goonies">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>3</Option>
|
||||
<Option>2</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Timer">
|
||||
<Option>Normal</Option>
|
||||
<Option>Fast</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Demo Sounds">
|
||||
<Option>Off</Option>
|
||||
<Option>On</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="Gradius" Localization="Gradius">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>4</Option>
|
||||
<Option>3</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Bonus">
|
||||
<Option>100k</Option>
|
||||
<Option>300k</Option>
|
||||
<Option>200k</Option>
|
||||
<Option>400k</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty">
|
||||
<Option>Normal</Option>
|
||||
<Option>Hard</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Demo Sounds">
|
||||
<Option>Off</Option>
|
||||
<Option>On</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="Gumshoe" Localization="Gumshoe">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty">
|
||||
<Option>Easy</Option>
|
||||
<Option>Normal</Option>
|
||||
<Option>Hard</Option>
|
||||
<Option>Very Hard</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>5</Option>
|
||||
<Option>3</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Bullets per Balloon">
|
||||
<Option>3</Option>
|
||||
<Option>2</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Bonus Life">
|
||||
<Option>80000</Option>
|
||||
<Option>100000</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="HoganAlley" Localization="Hogan's Alley">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty">
|
||||
<Option>Easy</Option>
|
||||
<Option>Normal</Option>
|
||||
<Option>Hard</Option>
|
||||
<Option>Very Hard</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Misses per Game">
|
||||
<Option>3</Option>
|
||||
<Option>5</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Bonus Life">
|
||||
<Option>30000</Option>
|
||||
<Option>50000</Option>
|
||||
<Option>80000</Option>
|
||||
<Option>100000</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="IceClimber" Localization="Ice Climber">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>3</Option>
|
||||
<Option>5</Option>
|
||||
<Option>4</Option>
|
||||
<Option>7</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty">
|
||||
<Option>Normal</Option>
|
||||
<Option>Hard</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Time before the bear">
|
||||
<Option>Long</Option>
|
||||
<Option>Short</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="MachRider" Localization="Mach Rider">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Time">
|
||||
<Option>280</Option>
|
||||
<Option>220</Option>
|
||||
<Option>250</Option>
|
||||
<Option>200</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
<Game ID="MachRiderFightingCourse" Localization="Mach Rider - Fighting Course">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="1st Race Length (km)">
|
||||
<Option>12</Option>
|
||||
<Option>15</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
<Game ID="MightyBombJack" Localization="Mighty Bomb Jack">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>3</Option>
|
||||
<Option>4</Option>
|
||||
<Option>2</Option>
|
||||
<Option>5</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
<Game ID="NinjaJajamaruKun" Localization="Ninja Jajamaru Kun">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>3</Option>
|
||||
<Option>5</Option>
|
||||
<Option>4</Option>
|
||||
<Option>Unused</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Demo Sounds">
|
||||
<Option>Off</Option>
|
||||
<Option>On</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="Pinball" Localization="Pinball">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>Free Play</Option>
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Balls">
|
||||
<Option>3</Option>
|
||||
<Option>5</Option>
|
||||
<Option>4</Option>
|
||||
<Option>2</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Ball Speed">
|
||||
<Option>Normal</Option>
|
||||
<Option>Fast</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="Platoon" Localization="Platoon">
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Demo Sounds">
|
||||
<Option>Off</Option>
|
||||
<Option>On</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="RBI Baseball" Localization="RBI Baseball">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="1p/inn, 2p/inn, Time/Min">
|
||||
<Option>3, 2, 6</Option>
|
||||
<Option>2, 1, 3</Option>
|
||||
<Option>4, 3, 7</Option>
|
||||
<Option>2, 2, 4</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Demo Sounds">
|
||||
<Option>Off</Option>
|
||||
<Option>On</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="PPU">
|
||||
<Option>RP2C04-0001</Option>
|
||||
<Option>RP2C03</Option>
|
||||
<Option>RP2C04-0002</Option>
|
||||
<Option>Unused</Option>
|
||||
<Option>RP2C04-0003</Option>
|
||||
<Option>RP2C04-0004</Option>
|
||||
<Option>Unused</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="RaidBungelingBay" Localization="Raid on Bungeling Bay">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>2</Option>
|
||||
<Option>3</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
<Game ID="Slalom" Localization="Slalom">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Freestyle Points">
|
||||
<Option>Left / Right</Option>
|
||||
<Option>Hold Time</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty">
|
||||
<Option>Very Easy</Option>
|
||||
<Option>Easy</Option>
|
||||
<Option>Hard</Option>
|
||||
<Option>Very Hard</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Allow Continue">
|
||||
<Option>Yes</Option>
|
||||
<Option>No</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Inverted Input">
|
||||
<Option>Off</Option>
|
||||
<Option>On</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="Soccer" Localization="Soccer">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Points Timer">
|
||||
<Option>600 Pts</Option>
|
||||
<Option>1000 Pts</Option>
|
||||
<Option>800 Pts</Option>
|
||||
<Option>1200 Pts</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty">
|
||||
<Option>Very Easy</Option>
|
||||
<Option>Easy</Option>
|
||||
<Option>Hard</Option>
|
||||
<Option>Very Hard</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="StarLuster" Localization="Star Luster">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Palette Color">
|
||||
<Option>Unused</Option>
|
||||
<Option>Green</Option>
|
||||
<Option>Black</Option>
|
||||
<Option>Grey</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
<Game ID="SuperMarioBros" Localization="Super Mario Bros">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 5 credits</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 4 credits</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>3</Option>
|
||||
<Option>2</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Bonus Life">
|
||||
<Option>100</Option>
|
||||
<Option>200</Option>
|
||||
<Option>150</Option>
|
||||
<Option>250</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Timer">
|
||||
<Option>Normal</Option>
|
||||
<Option>Fast</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Continue Lives">
|
||||
<Option>4</Option>
|
||||
<Option>3</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="SuperSkyKid" Localization="Super Sky Kid">
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>2</Option>
|
||||
<Option>3</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="PPU">
|
||||
<Option>RP2C04-0001</Option>
|
||||
<Option>RP2C03</Option>
|
||||
<Option>RP2C04-0002</Option>
|
||||
<Option>Unused</Option>
|
||||
<Option>RP2C04-0003</Option>
|
||||
<Option>Unused</Option>
|
||||
<Option>RP2C04-0004</Option>
|
||||
<Option>Unused</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="SuperXevious" Localization="Super Xevious">
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="PPU">
|
||||
<Option>RP2C04-0001</Option>
|
||||
<Option>RP2C04-0002</Option>
|
||||
<Option>RP2C04-0003</Option>
|
||||
<Option>RP2C04-0004</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="Tetris" Localization="Tetris">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Palette Color">
|
||||
<Option>Unused</Option>
|
||||
<Option>Green</Option>
|
||||
<Option>Black</Option>
|
||||
<Option>Grey</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
<Game ID="TKOBoxing" Localization="TKO Boxing">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch Localization="Palette Color">
|
||||
<Option>Black</Option>
|
||||
<Option>White</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
<Game ID="TopGun" Localization="Top Gun">
|
||||
<DipSwitch Localization="Coins">
|
||||
<Option>1 coin = 1 credit</Option>
|
||||
<Option>3 coins = 1 credit</Option>
|
||||
<Option>1 coin = 3 credits</Option>
|
||||
<Option>5 coins = 1 credit</Option>
|
||||
<Option>1 coin = 2 credits</Option>
|
||||
<Option>4 coins = 1 credit</Option>
|
||||
<Option>2 coins = 1 credit</Option>
|
||||
<Option>Free Play</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Lives">
|
||||
<Option>3 per coin - 12 maximum</Option>
|
||||
<Option>2 per coin - 9 maximum</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Bonus">
|
||||
<Option>30k and every 50k</Option>
|
||||
<Option>100k and every 150k</Option>
|
||||
<Option>50k and every 100k</Option>
|
||||
<Option>200k and every 200k</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Difficulty">
|
||||
<Option>Easy</Option>
|
||||
<Option>Hard</Option>
|
||||
</DipSwitch>
|
||||
<DipSwitch Localization="Demo Sounds">
|
||||
<Option>Off</Option>
|
||||
<Option>On</Option>
|
||||
</DipSwitch>
|
||||
</Game>
|
||||
<Game ID="Unknown" Localization="Unknown">
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
<DipSwitch />
|
||||
</Game>
|
||||
</VsSystemGames>
|
|
@ -62,6 +62,18 @@
|
|||
<Value ID="FourPlayerAdapter">Four Player Adapter</Value>
|
||||
<Value ID="ArkanoidController">Arkanoid Controller</Value>
|
||||
</Enum>
|
||||
<Enum ID="PpuModel">
|
||||
<Value ID="Ppu2C03">RP2C03</Value>
|
||||
<Value ID="Ppu2C04A">RP2C04-0001</Value>
|
||||
<Value ID="Ppu2C04B">RP2C04-0002</Value>
|
||||
<Value ID="Ppu2C04C">RP2C04-0003</Value>
|
||||
<Value ID="Ppu2C04D">RP2C04-0004</Value>
|
||||
<Value ID="Ppu2C05A">RP2C05-01</Value>
|
||||
<Value ID="Ppu2C05B">RP2C05-02</Value>
|
||||
<Value ID="Ppu2C05C">RP2C05-03</Value>
|
||||
<Value ID="Ppu2C05D">RP2C05-04</Value>
|
||||
<Value ID="Ppu2C05E">RP2C05-05</Value>
|
||||
</Enum>
|
||||
<Enum ID="Language">
|
||||
<Value ID="SystemDefault">User Account Default</Value>
|
||||
<Value ID="English">English</Value>
|
||||
|
|
|
@ -15,6 +15,9 @@
|
|||
<Control ID="mnuSwitchDiskSide">Changer le disque de côté</Control>
|
||||
<Control ID="mnuSelectDisk">Choisir le disque</Control>
|
||||
<Control ID="mnuEjectDisk">Éjecter le disque</Control>
|
||||
<Control ID="mnuVsGameConfig">Configuration du jeu VS</Control>
|
||||
<Control ID="mnuInsertCoin1">Insérer une pièce (1)</Control>
|
||||
<Control ID="mnuInsertCoin2">Insérer une pièce (2)</Control>
|
||||
<Control ID="mnuOptions">Options</Control>
|
||||
<Control ID="mnuEmulationSpeed">Vitesse</Control>
|
||||
<Control ID="mnuEmuSpeedNormal">Normale (100%)</Control>
|
||||
|
@ -256,6 +259,11 @@
|
|||
<Control ID="lblDonate">Mesen est gratuit. Par contre, si vous voulez supporter son dévelopement, cliquez sur le lien ci-dessous pour plus d'information. Thank you!</Control>
|
||||
<Control ID="lnkDonate">Pour plus d'information, cliquez ici.</Control>
|
||||
</Form>
|
||||
<Form ID="frmVsGameConfig" Title="Configuration du jeu VS">
|
||||
<Control ID="lblGame">Jeu</Control>
|
||||
<Control ID="lblPpuModel">Modèle du PPU</Control>
|
||||
<Control ID="grpDipSwitches">Commutateurs DIP</Control>
|
||||
</Form>
|
||||
</Forms>
|
||||
<Messages>
|
||||
<Message ID="FilterAll">Tous les fichiers (*.*)|*.*</Message>
|
||||
|
@ -319,6 +327,18 @@
|
|||
<Value ID="FourPlayerAdapter">Adapteur pour 4 joueurs</Value>
|
||||
<Value ID="ArkanoidController">Manette Arkanoid</Value>
|
||||
</Enum>
|
||||
<Enum ID="PpuModel">
|
||||
<Value ID="Ppu2C03">RP2C03</Value>
|
||||
<Value ID="Ppu2C04A">RP2C04-0001</Value>
|
||||
<Value ID="Ppu2C04B">RP2C04-0002</Value>
|
||||
<Value ID="Ppu2C04C">RP2C04-0003</Value>
|
||||
<Value ID="Ppu2C04D">RP2C04-0004</Value>
|
||||
<Value ID="Ppu2C05A">RP2C05-01</Value>
|
||||
<Value ID="Ppu2C05B">RP2C05-02</Value>
|
||||
<Value ID="Ppu2C05C">RP2C05-03</Value>
|
||||
<Value ID="Ppu2C05D">RP2C05-04</Value>
|
||||
<Value ID="Ppu2C05E">RP2C05-05</Value>
|
||||
</Enum>
|
||||
<Enum ID="Language">
|
||||
<Value ID="SystemDefault">Défaut du compte utilisateur</Value>
|
||||
<Value ID="English">English</Value>
|
||||
|
|
|
@ -15,6 +15,9 @@
|
|||
<Control ID="mnuSwitchDiskSide">A面B面切り替え</Control>
|
||||
<Control ID="mnuSelectDisk">ディスク選択</Control>
|
||||
<Control ID="mnuEjectDisk">ディスクを取り出す</Control>
|
||||
<Control ID="mnuVsGameConfig">VSゲームの設定</Control>
|
||||
<Control ID="mnuInsertCoin1">インサートコイン 1</Control>
|
||||
<Control ID="mnuInsertCoin2">インサートコイン 2</Control>
|
||||
<Control ID="mnuOptions">設定</Control>
|
||||
<Control ID="mnuEmulationSpeed">速度</Control>
|
||||
<Control ID="mnuEmuSpeedNormal">通常 (100%)</Control>
|
||||
|
@ -317,6 +320,18 @@
|
|||
<Value ID="FourPlayerAdapter">4-Player Adapter</Value>
|
||||
<Value ID="ArkanoidController">Arkanoidコントローラ</Value>
|
||||
</Enum>
|
||||
<Enum ID="PpuModel">
|
||||
<Value ID="Ppu2C03">RP2C03</Value>
|
||||
<Value ID="Ppu2C04A">RP2C04-0001</Value>
|
||||
<Value ID="Ppu2C04B">RP2C04-0002</Value>
|
||||
<Value ID="Ppu2C04C">RP2C04-0003</Value>
|
||||
<Value ID="Ppu2C04D">RP2C04-0004</Value>
|
||||
<Value ID="Ppu2C05A">RP2C05-01</Value>
|
||||
<Value ID="Ppu2C05B">RP2C05-02</Value>
|
||||
<Value ID="Ppu2C05C">RP2C05-03</Value>
|
||||
<Value ID="Ppu2C05D">RP2C05-04</Value>
|
||||
<Value ID="Ppu2C05E">RP2C05-05</Value>
|
||||
</Enum>
|
||||
<Enum ID="Language">
|
||||
<Value ID="SystemDefault">ユーザーアカウントのデフォルト</Value>
|
||||
<Value ID="English">English</Value>
|
||||
|
|
84
GUI.NET/Forms/Config/ctrlDipSwitch.Designer.cs
generated
Normal file
84
GUI.NET/Forms/Config/ctrlDipSwitch.Designer.cs
generated
Normal file
|
@ -0,0 +1,84 @@
|
|||
namespace Mesen.GUI.Forms.Config
|
||||
{
|
||||
partial class ctrlDipSwitch
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
|
||||
this.lblName = new System.Windows.Forms.Label();
|
||||
this.cboDipSwitch = new System.Windows.Forms.ComboBox();
|
||||
this.flowLayoutPanel1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// flowLayoutPanel1
|
||||
//
|
||||
this.flowLayoutPanel1.Controls.Add(this.lblName);
|
||||
this.flowLayoutPanel1.Controls.Add(this.cboDipSwitch);
|
||||
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
|
||||
this.flowLayoutPanel1.Size = new System.Drawing.Size(249, 27);
|
||||
this.flowLayoutPanel1.TabIndex = 0;
|
||||
//
|
||||
// lblName
|
||||
//
|
||||
this.lblName.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||
this.lblName.AutoSize = true;
|
||||
this.lblName.Location = new System.Drawing.Point(3, 7);
|
||||
this.lblName.Name = "lblName";
|
||||
this.lblName.Size = new System.Drawing.Size(55, 13);
|
||||
this.lblName.TabIndex = 1;
|
||||
this.lblName.Text = "DipSwitch";
|
||||
//
|
||||
// cboDipSwitch
|
||||
//
|
||||
this.cboDipSwitch.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.cboDipSwitch.FormattingEnabled = true;
|
||||
this.cboDipSwitch.Location = new System.Drawing.Point(64, 3);
|
||||
this.cboDipSwitch.Name = "cboDipSwitch";
|
||||
this.cboDipSwitch.Size = new System.Drawing.Size(181, 21);
|
||||
this.cboDipSwitch.TabIndex = 2;
|
||||
//
|
||||
// ctrlDipSwitch
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.flowLayoutPanel1);
|
||||
this.Name = "ctrlDipSwitch";
|
||||
this.Size = new System.Drawing.Size(249, 27);
|
||||
this.flowLayoutPanel1.ResumeLayout(false);
|
||||
this.flowLayoutPanel1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
|
||||
private System.Windows.Forms.Label lblName;
|
||||
private System.Windows.Forms.ComboBox cboDipSwitch;
|
||||
}
|
||||
}
|
57
GUI.NET/Forms/Config/ctrlDipSwitch.cs
Normal file
57
GUI.NET/Forms/Config/ctrlDipSwitch.cs
Normal file
|
@ -0,0 +1,57 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Mesen.GUI.Forms.Config
|
||||
{
|
||||
public partial class ctrlDipSwitch : UserControl
|
||||
{
|
||||
public ctrlDipSwitch()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
[Bindable(true)]
|
||||
[Browsable(true)]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
[EditorBrowsable(EditorBrowsableState.Always)]
|
||||
public override string Text
|
||||
{
|
||||
get
|
||||
{
|
||||
return lblName.Text;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
lblName.Text=value;
|
||||
}
|
||||
}
|
||||
|
||||
public ComboBox.ObjectCollection Items
|
||||
{
|
||||
get
|
||||
{
|
||||
return cboDipSwitch.Items;
|
||||
}
|
||||
}
|
||||
|
||||
public int SelectedIndex
|
||||
{
|
||||
get
|
||||
{
|
||||
return cboDipSwitch.SelectedIndex;
|
||||
}
|
||||
set
|
||||
{
|
||||
cboDipSwitch.SelectedIndex = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
120
GUI.NET/Forms/Config/ctrlDipSwitch.resx
Normal file
120
GUI.NET/Forms/Config/ctrlDipSwitch.resx
Normal file
|
@ -0,0 +1,120 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
144
GUI.NET/Forms/Config/frmVsGameConfig.Designer.cs
generated
Normal file
144
GUI.NET/Forms/Config/frmVsGameConfig.Designer.cs
generated
Normal file
|
@ -0,0 +1,144 @@
|
|||
namespace Mesen.GUI.Forms.Config
|
||||
{
|
||||
partial class frmVsGameConfig
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.tlpMain = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.cboGame = new System.Windows.Forms.ComboBox();
|
||||
this.lblGame = new System.Windows.Forms.Label();
|
||||
this.lblPpuModel = new System.Windows.Forms.Label();
|
||||
this.cboPpuModel = new System.Windows.Forms.ComboBox();
|
||||
this.grpDipSwitches = new System.Windows.Forms.GroupBox();
|
||||
this.tlpMain.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// baseConfigPanel
|
||||
//
|
||||
this.baseConfigPanel.Location = new System.Drawing.Point(0, 295);
|
||||
this.baseConfigPanel.Size = new System.Drawing.Size(305, 29);
|
||||
//
|
||||
// tlpMain
|
||||
//
|
||||
this.tlpMain.ColumnCount = 2;
|
||||
this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
|
||||
this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||
this.tlpMain.Controls.Add(this.cboGame, 1, 0);
|
||||
this.tlpMain.Controls.Add(this.lblGame, 0, 0);
|
||||
this.tlpMain.Controls.Add(this.lblPpuModel, 0, 1);
|
||||
this.tlpMain.Controls.Add(this.cboPpuModel, 1, 1);
|
||||
this.tlpMain.Controls.Add(this.grpDipSwitches, 0, 2);
|
||||
this.tlpMain.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tlpMain.Location = new System.Drawing.Point(0, 0);
|
||||
this.tlpMain.Name = "tlpMain";
|
||||
this.tlpMain.RowCount = 3;
|
||||
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||
this.tlpMain.Size = new System.Drawing.Size(305, 324);
|
||||
this.tlpMain.TabIndex = 0;
|
||||
//
|
||||
// cboGame
|
||||
//
|
||||
this.cboGame.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.cboGame.FormattingEnabled = true;
|
||||
this.cboGame.Location = new System.Drawing.Point(73, 3);
|
||||
this.cboGame.Name = "cboGame";
|
||||
this.cboGame.Size = new System.Drawing.Size(194, 21);
|
||||
this.cboGame.TabIndex = 5;
|
||||
this.cboGame.SelectedIndexChanged += new System.EventHandler(this.cboGame_SelectedIndexChanged);
|
||||
//
|
||||
// lblGame
|
||||
//
|
||||
this.lblGame.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||
this.lblGame.AutoSize = true;
|
||||
this.lblGame.Location = new System.Drawing.Point(3, 7);
|
||||
this.lblGame.Name = "lblGame";
|
||||
this.lblGame.Size = new System.Drawing.Size(38, 13);
|
||||
this.lblGame.TabIndex = 4;
|
||||
this.lblGame.Text = "Game:";
|
||||
//
|
||||
// lblPpuModel
|
||||
//
|
||||
this.lblPpuModel.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||
this.lblPpuModel.AutoSize = true;
|
||||
this.lblPpuModel.Location = new System.Drawing.Point(3, 34);
|
||||
this.lblPpuModel.Name = "lblPpuModel";
|
||||
this.lblPpuModel.Size = new System.Drawing.Size(64, 13);
|
||||
this.lblPpuModel.TabIndex = 1;
|
||||
this.lblPpuModel.Text = "PPU Model:";
|
||||
//
|
||||
// cboPpuModel
|
||||
//
|
||||
this.cboPpuModel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.cboPpuModel.FormattingEnabled = true;
|
||||
this.cboPpuModel.Location = new System.Drawing.Point(73, 30);
|
||||
this.cboPpuModel.Name = "cboPpuModel";
|
||||
this.cboPpuModel.Size = new System.Drawing.Size(194, 21);
|
||||
this.cboPpuModel.TabIndex = 2;
|
||||
//
|
||||
// grpDipSwitches
|
||||
//
|
||||
this.tlpMain.SetColumnSpan(this.grpDipSwitches, 2);
|
||||
this.grpDipSwitches.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.grpDipSwitches.Location = new System.Drawing.Point(3, 57);
|
||||
this.grpDipSwitches.Margin = new System.Windows.Forms.Padding(3, 3, 3, 30);
|
||||
this.grpDipSwitches.Name = "grpDipSwitches";
|
||||
this.grpDipSwitches.Size = new System.Drawing.Size(299, 237);
|
||||
this.grpDipSwitches.TabIndex = 3;
|
||||
this.grpDipSwitches.TabStop = false;
|
||||
this.grpDipSwitches.Text = "DIP Switches";
|
||||
//
|
||||
// frmVsGameConfig
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(305, 324);
|
||||
this.Controls.Add(this.tlpMain);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "frmVsGameConfig";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
this.Text = "Game Configuration";
|
||||
this.Controls.SetChildIndex(this.tlpMain, 0);
|
||||
this.Controls.SetChildIndex(this.baseConfigPanel, 0);
|
||||
this.tlpMain.ResumeLayout(false);
|
||||
this.tlpMain.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TableLayoutPanel tlpMain;
|
||||
private System.Windows.Forms.Label lblPpuModel;
|
||||
private System.Windows.Forms.ComboBox cboPpuModel;
|
||||
private System.Windows.Forms.GroupBox grpDipSwitches;
|
||||
private System.Windows.Forms.ComboBox cboGame;
|
||||
private System.Windows.Forms.Label lblGame;
|
||||
}
|
||||
}
|
142
GUI.NET/Forms/Config/frmVsGameConfig.cs
Normal file
142
GUI.NET/Forms/Config/frmVsGameConfig.cs
Normal file
|
@ -0,0 +1,142 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Mesen.GUI.Config;
|
||||
|
||||
namespace Mesen.GUI.Forms.Config
|
||||
{
|
||||
public partial class frmVsGameConfig : BaseConfigForm
|
||||
{
|
||||
public frmVsGameConfig(VsConfigInfo configInfo)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
Entity = configInfo;
|
||||
|
||||
if(string.IsNullOrWhiteSpace(configInfo.GameID)) {
|
||||
configInfo.GameID = VsGameConfig.GetGameID(InteropEmu.GetROMPath());
|
||||
}
|
||||
|
||||
AddBinding("PpuModel", cboPpuModel);
|
||||
|
||||
foreach(KeyValuePair<string, VsGameConfig> kvp in VsGameConfig.GetGameConfigs()) {
|
||||
cboGame.Items.Add(kvp.Value.GameName);
|
||||
if(kvp.Key == configInfo.GameID) {
|
||||
cboGame.SelectedIndex = cboGame.Items.Count - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void cboGame_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
VsGameConfig config = VsGameConfig.GetGameConfig(VsGameConfig.GetGameID(cboGame.SelectedItem.ToString()));
|
||||
UpdateDipSwitches(config, false);
|
||||
}
|
||||
|
||||
private void UpdateDipSwitches(VsGameConfig config, bool updateDropdown)
|
||||
{
|
||||
grpDipSwitches.Controls.Clear();
|
||||
|
||||
List<List<string>> dipSwitches;
|
||||
if(config != null) {
|
||||
dipSwitches = config.DipSwitches;
|
||||
if(updateDropdown) {
|
||||
cboGame.SelectedIndexChanged -= cboGame_SelectedIndexChanged;
|
||||
cboGame.SelectedItem = config.GameName;
|
||||
cboGame.SelectedIndexChanged += cboGame_SelectedIndexChanged;
|
||||
}
|
||||
} else {
|
||||
dipSwitches = new List<List<string>>();
|
||||
for(int i = 0; i < 8; i++) {
|
||||
dipSwitches.Add(new List<string>(new string[] { "Unknown", "Off", "On" }));
|
||||
}
|
||||
}
|
||||
|
||||
int row = 0;
|
||||
var tlpDipSwitches = new TableLayoutPanel();
|
||||
tlpDipSwitches.Dock = DockStyle.Fill;
|
||||
tlpDipSwitches.ColumnStyles.Add(new ColumnStyle());
|
||||
tlpDipSwitches.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
||||
tlpDipSwitches.ColumnCount = 2;
|
||||
|
||||
byte value = ((VsConfigInfo)Entity).DipSwitches;
|
||||
int currentBit = 0;
|
||||
foreach(List<string> setting in dipSwitches) {
|
||||
var optionLabel = new Label();
|
||||
optionLabel.AutoSize = true;
|
||||
optionLabel.Text = setting[0] + ":";
|
||||
optionLabel.TextAlign = ContentAlignment.MiddleLeft;
|
||||
optionLabel.Dock = DockStyle.Fill;
|
||||
|
||||
var optionDropdown = new ComboBox();
|
||||
optionDropdown.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
for(int i = 1, len = setting.Count; i < len; i++) {
|
||||
optionDropdown.Items.Add(new DipSwitchOption() { Index = i - 1, DisplayValue = setting[i] });
|
||||
}
|
||||
|
||||
int bitCount = (int)Math.Round(Math.Log(optionDropdown.Items.Count) / Math.Log(2));
|
||||
|
||||
int selectedIndex = (value >> currentBit) & ((1 << bitCount) - 1);
|
||||
optionDropdown.SelectedIndex = selectedIndex;
|
||||
currentBit += bitCount;
|
||||
|
||||
|
||||
tlpDipSwitches.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
||||
tlpDipSwitches.Controls.Add(optionLabel, 0, row);
|
||||
tlpDipSwitches.Controls.Add(optionDropdown, 1, row);
|
||||
row++;
|
||||
}
|
||||
tlpDipSwitches.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
|
||||
tlpDipSwitches.RowCount = row + 1;
|
||||
grpDipSwitches.Controls.Add(tlpDipSwitches);
|
||||
tlpDipSwitches.PerformLayout();
|
||||
}
|
||||
|
||||
private byte GetDipSwitchValue()
|
||||
{
|
||||
int value = 0;
|
||||
int currentBit = 0;
|
||||
if(grpDipSwitches.Controls.Count > 0) {
|
||||
foreach(Control control in grpDipSwitches.Controls[0].Controls) {
|
||||
if(control is ComboBox && control != cboPpuModel) {
|
||||
ComboBox dipSwitch = (ComboBox)control;
|
||||
int bitCount = (int)Math.Round(Math.Log(dipSwitch.Items.Count) / Math.Log(2));
|
||||
|
||||
if(dipSwitch.SelectedItem != null) {
|
||||
value |= ((DipSwitchOption)dipSwitch.SelectedItem).Index << currentBit;
|
||||
}
|
||||
|
||||
currentBit += bitCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (byte)value;
|
||||
}
|
||||
|
||||
protected override void UpdateConfig()
|
||||
{
|
||||
base.UpdateConfig();
|
||||
|
||||
((VsConfigInfo)Entity).DipSwitches = (byte)GetDipSwitchValue();
|
||||
((VsConfigInfo)Entity).GameID = VsGameConfig.GetGameID(cboGame.SelectedItem.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
public class DipSwitchOption
|
||||
{
|
||||
public int Index;
|
||||
public string DisplayValue;
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return DisplayValue;
|
||||
}
|
||||
}
|
||||
}
|
123
GUI.NET/Forms/Config/frmVsGameConfig.resx
Normal file
123
GUI.NET/Forms/Config/frmVsGameConfig.resx
Normal file
|
@ -0,0 +1,123 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
</root>
|
46
GUI.NET/Forms/frmMain.Designer.cs
generated
46
GUI.NET/Forms/frmMain.Designer.cs
generated
|
@ -64,6 +64,10 @@ namespace Mesen.GUI.Forms
|
|||
this.mnuSwitchDiskSide = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mnuSelectDisk = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mnuEjectDisk = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.sepVsSystem = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.mnuVsGameConfig = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mnuInsertCoin1 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mnuInsertCoin2 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mnuOptions = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mnuEmulationSpeed = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.mnuEmuSpeedNormal = new System.Windows.Forms.ToolStripMenuItem();
|
||||
|
@ -261,7 +265,11 @@ namespace Mesen.GUI.Forms
|
|||
this.sepFdsDisk,
|
||||
this.mnuSwitchDiskSide,
|
||||
this.mnuSelectDisk,
|
||||
this.mnuEjectDisk});
|
||||
this.mnuEjectDisk,
|
||||
this.sepVsSystem,
|
||||
this.mnuVsGameConfig,
|
||||
this.mnuInsertCoin1,
|
||||
this.mnuInsertCoin2});
|
||||
this.mnuGame.Name = "mnuGame";
|
||||
this.mnuGame.Size = new System.Drawing.Size(55, 22);
|
||||
this.mnuGame.Text = "Game";
|
||||
|
@ -322,6 +330,38 @@ namespace Mesen.GUI.Forms
|
|||
this.mnuEjectDisk.Text = "Eject Disk";
|
||||
this.mnuEjectDisk.Click += new System.EventHandler(this.mnuEjectDisk_Click);
|
||||
//
|
||||
// sepVsSystem
|
||||
//
|
||||
this.sepVsSystem.Name = "sepVsSystem";
|
||||
this.sepVsSystem.Size = new System.Drawing.Size(217, 6);
|
||||
this.sepVsSystem.Visible = false;
|
||||
//
|
||||
// mnuVsGameConfig
|
||||
//
|
||||
this.mnuVsGameConfig.Image = global::Mesen.GUI.Properties.Resources.DipSwitches;
|
||||
this.mnuVsGameConfig.Name = "mnuVsGameConfig";
|
||||
this.mnuVsGameConfig.Size = new System.Drawing.Size(220, 22);
|
||||
this.mnuVsGameConfig.Text = "Game Configuration";
|
||||
this.mnuVsGameConfig.Click += new System.EventHandler(this.mnuVsGameConfig_Click);
|
||||
//
|
||||
// mnuInsertCoin1
|
||||
//
|
||||
this.mnuInsertCoin1.Image = global::Mesen.GUI.Properties.Resources.coins;
|
||||
this.mnuInsertCoin1.Name = "mnuInsertCoin1";
|
||||
this.mnuInsertCoin1.Size = new System.Drawing.Size(220, 22);
|
||||
this.mnuInsertCoin1.Text = "Insert Coin (1)";
|
||||
this.mnuInsertCoin1.Visible = false;
|
||||
this.mnuInsertCoin1.Click += new System.EventHandler(this.mnuInsertCoin1_Click);
|
||||
//
|
||||
// mnuInsertCoin2
|
||||
//
|
||||
this.mnuInsertCoin2.Image = global::Mesen.GUI.Properties.Resources.coins;
|
||||
this.mnuInsertCoin2.Name = "mnuInsertCoin2";
|
||||
this.mnuInsertCoin2.Size = new System.Drawing.Size(220, 22);
|
||||
this.mnuInsertCoin2.Text = "Insert Coin (2)";
|
||||
this.mnuInsertCoin2.Visible = false;
|
||||
this.mnuInsertCoin2.Click += new System.EventHandler(this.mnuInsertCoin2_Click);
|
||||
//
|
||||
// mnuOptions
|
||||
//
|
||||
this.mnuOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
|
@ -1037,6 +1077,10 @@ namespace Mesen.GUI.Forms
|
|||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem14;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuShowFPS;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuFullscreen;
|
||||
private System.Windows.Forms.ToolStripSeparator sepVsSystem;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuInsertCoin1;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuVsGameConfig;
|
||||
private System.Windows.Forms.ToolStripMenuItem mnuInsertCoin2;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@ namespace Mesen.GUI.Forms
|
|||
menuTimer.Start();
|
||||
|
||||
VideoInfo.ApplyConfig();
|
||||
InitializeVsSystemMenu();
|
||||
InitializeFdsDiskMenu();
|
||||
InitializeEmulationSpeedMenu();
|
||||
|
||||
|
@ -268,7 +269,9 @@ namespace Mesen.GUI.Forms
|
|||
case InteropEmu.ConsoleNotificationType.GameLoaded:
|
||||
_currentGame = Path.GetFileNameWithoutExtension(InteropEmu.GetROMPath());
|
||||
InitializeFdsDiskMenu();
|
||||
InitializeVsSystemMenu();
|
||||
CheatInfo.ApplyCheats();
|
||||
VsConfigInfo.ApplyConfig();
|
||||
InitializeStateMenu(mnuSaveState, true);
|
||||
InitializeStateMenu(mnuLoadState, false);
|
||||
this.StartEmuThread();
|
||||
|
@ -1108,5 +1111,31 @@ namespace Mesen.GUI.Forms
|
|||
{
|
||||
_menuOpened = false;
|
||||
}
|
||||
|
||||
private void InitializeVsSystemMenu()
|
||||
{
|
||||
sepVsSystem.Visible = InteropEmu.IsVsSystem();
|
||||
mnuInsertCoin1.Visible = InteropEmu.IsVsSystem();
|
||||
mnuInsertCoin2.Visible = InteropEmu.IsVsSystem();
|
||||
mnuVsGameConfig.Visible = InteropEmu.IsVsSystem();
|
||||
}
|
||||
|
||||
private void mnuInsertCoin1_Click(object sender, EventArgs e)
|
||||
{
|
||||
InteropEmu.VsInsertCoin(0);
|
||||
}
|
||||
|
||||
private void mnuInsertCoin2_Click(object sender, EventArgs e)
|
||||
{
|
||||
InteropEmu.VsInsertCoin(1);
|
||||
}
|
||||
|
||||
private void mnuVsGameConfig_Click(object sender, EventArgs e)
|
||||
{
|
||||
VsConfigInfo configInfo = VsConfigInfo.GetCurrentGameConfig(true);
|
||||
if(new frmVsGameConfig(configInfo).ShowDialog(sender, this) == DialogResult.OK) {
|
||||
VsConfigInfo.ApplyConfig();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -173,6 +173,7 @@
|
|||
<Compile Include="Config\PlayerProfile.cs" />
|
||||
<Compile Include="Config\ConfigManager.cs" />
|
||||
<Compile Include="Config\ServerInfo.cs" />
|
||||
<Compile Include="Config\VsConfigInfo.cs" />
|
||||
<Compile Include="Controls\ctrlTrackbar.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
|
@ -314,6 +315,12 @@
|
|||
<Compile Include="Forms\Cheats\frmCheat.Designer.cs">
|
||||
<DependentUpon>frmCheat.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Config\ctrlDipSwitch.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Config\ctrlDipSwitch.Designer.cs">
|
||||
<DependentUpon>ctrlDipSwitch.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Config\ctrlInputPortConfig.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
|
@ -368,6 +375,12 @@
|
|||
<Compile Include="Forms\Cheats\frmCheatList.Designer.cs">
|
||||
<DependentUpon>frmCheatList.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Config\frmVsGameConfig.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Config\frmVsGameConfig.Designer.cs">
|
||||
<DependentUpon>frmVsGameConfig.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\frmAbout.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
|
@ -484,6 +497,9 @@
|
|||
<EmbeddedResource Include="Forms\Cheats\frmCheat.resx">
|
||||
<DependentUpon>frmCheat.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\Config\ctrlDipSwitch.resx">
|
||||
<DependentUpon>ctrlDipSwitch.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\Config\ctrlInputPortConfig.resx">
|
||||
<DependentUpon>ctrlInputPortConfig.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
|
@ -511,6 +527,9 @@
|
|||
<EmbeddedResource Include="Forms\Cheats\frmCheatList.resx">
|
||||
<DependentUpon>frmCheatList.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\Config\frmVsGameConfig.resx">
|
||||
<DependentUpon>frmVsGameConfig.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\frmAbout.resx">
|
||||
<DependentUpon>frmAbout.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
|
@ -564,6 +583,7 @@
|
|||
</Content>
|
||||
<Content Include="Dependencies\resources.en.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
<SubType>Designer</SubType>
|
||||
</Content>
|
||||
<Content Include="Dependencies\resources.fr.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
|
@ -573,7 +593,13 @@
|
|||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
<SubType>Designer</SubType>
|
||||
</Content>
|
||||
<Content Include="Dependencies\VsSystem.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
<SubType>Designer</SubType>
|
||||
</Content>
|
||||
<Content Include="Icon.ico" />
|
||||
<Content Include="Resources\coins.png" />
|
||||
<None Include="Resources\DipSwitches.png" />
|
||||
<None Include="Resources\MesenIcon.png" />
|
||||
<None Include="Resources\system-software-update.png" />
|
||||
<None Include="Resources\view-refresh.png" />
|
||||
|
|
|
@ -91,6 +91,10 @@ namespace Mesen.GUI
|
|||
[DllImport(DLLPath)] public static extern void FdsInsertDisk(UInt32 diskNumber);
|
||||
[DllImport(DLLPath)] public static extern void FdsSwitchDiskSide();
|
||||
|
||||
[DllImport(DLLPath)] [return: MarshalAs(UnmanagedType.I1)] public static extern bool IsVsSystem();
|
||||
[DllImport(DLLPath)] public static extern void VsInsertCoin(UInt32 port);
|
||||
[DllImport(DLLPath)] public static extern void VsSetGameConfig(PpuModel model, byte dipSwitches);
|
||||
|
||||
[DllImport(DLLPath)] public static extern void CheatAddCustom(UInt32 address, Byte value, Int32 compareValue, [MarshalAs(UnmanagedType.I1)]bool isRelativeAddress);
|
||||
[DllImport(DLLPath)] public static extern void CheatAddGameGenie([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(UTF8Marshaler))]string code);
|
||||
[DllImport(DLLPath)] public static extern void CheatAddProActionRocky(UInt32 code);
|
||||
|
@ -340,6 +344,21 @@ namespace Mesen.GUI
|
|||
ArkanoidController = 3,
|
||||
}
|
||||
|
||||
public enum PpuModel
|
||||
{
|
||||
Ppu2C02 = 0,
|
||||
Ppu2C03 = 1,
|
||||
Ppu2C04A = 2,
|
||||
Ppu2C04B = 3,
|
||||
Ppu2C04C = 4,
|
||||
Ppu2C04D = 5,
|
||||
Ppu2C05A = 6,
|
||||
Ppu2C05B = 7,
|
||||
Ppu2C05C = 8,
|
||||
Ppu2C05D = 9,
|
||||
Ppu2C05E = 10,
|
||||
}
|
||||
|
||||
public struct KeyMappingSet
|
||||
{
|
||||
public KeyMapping Mapping1;
|
||||
|
|
20
GUI.NET/Properties/Resources.Designer.cs
generated
20
GUI.NET/Properties/Resources.Designer.cs
generated
|
@ -100,6 +100,16 @@ namespace Mesen.GUI.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap coins {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("coins", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
|
@ -110,6 +120,16 @@ namespace Mesen.GUI.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap DipSwitches {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("DipSwitches", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
|
|
|
@ -193,4 +193,10 @@
|
|||
<data name="Video" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\image-x-generic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="coins" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\coins.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="DipSwitches" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\DipSwitches.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
BIN
GUI.NET/Resources/DipSwitches.png
Normal file
BIN
GUI.NET/Resources/DipSwitches.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 661 B |
BIN
GUI.NET/Resources/coins.png
Normal file
BIN
GUI.NET/Resources/coins.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 631 B |
|
@ -14,6 +14,7 @@
|
|||
#include "../Core/VideoDecoder.h"
|
||||
#include "../Core/AutoRomTest.h"
|
||||
#include "../Core/FDS.h"
|
||||
#include "../Core/VsControlManager.h"
|
||||
|
||||
NES::Renderer *_renderer = nullptr;
|
||||
SoundManager *_soundManager = nullptr;
|
||||
|
@ -283,5 +284,24 @@ namespace InteropEmu {
|
|||
DllExport void __stdcall FdsEjectDisk() { FDS::EjectDisk(); }
|
||||
DllExport void __stdcall FdsInsertDisk(uint32_t diskNumber) { FDS::InsertDisk(diskNumber); }
|
||||
DllExport void __stdcall FdsSwitchDiskSide() { FDS::SwitchDiskSide(); }
|
||||
|
||||
//VS System functions
|
||||
DllExport bool __stdcall IsVsSystem() { return VsControlManager::GetInstance() != nullptr; }
|
||||
DllExport void __stdcall VsInsertCoin(uint32_t port)
|
||||
{
|
||||
VsControlManager* vs = VsControlManager::GetInstance();
|
||||
if(vs) {
|
||||
vs->InsertCoin(port);
|
||||
}
|
||||
}
|
||||
|
||||
DllExport void __stdcall VsSetGameConfig(PpuModel model, uint8_t dipSwitches)
|
||||
{
|
||||
VsControlManager* vs = VsControlManager::GetInstance();
|
||||
if(vs) {
|
||||
EmulationSettings::SetPpuModel(model);
|
||||
vs->SetDipSwitches(dipSwitches);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue