diff options
| author | XTra.KrazzY <XTra.KrazzY@gmail.com> | 2009-08-07 16:03:57 +0000 |
|---|---|---|
| committer | XTra.KrazzY <XTra.KrazzY@gmail.com> | 2009-08-07 16:03:57 +0000 |
| commit | 9cbfadb885b585ecbd1e93c885edeb27bbf830e7 (patch) | |
| tree | e4427ac704bbf44b37c9c5486532804849b19b0e /Source/Core | |
| parent | 270825cf71fc28074a8fdfd72786b5499685775b (diff) | |
Added the per-frame action manager. Implemented all TAS features: Auto Firing/Holding, Frame Advance. They all work perfectly (test it yourselves by changing the globals), they just need some GUI.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3947 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/Core.vcproj | 8 | ||||
| -rw-r--r-- | Source/Core/Core/Src/Core.cpp | 6 | ||||
| -rw-r--r-- | Source/Core/Core/Src/Frame.cpp | 93 | ||||
| -rw-r--r-- | Source/Core/Core/Src/Frame.h | 38 | ||||
| -rw-r--r-- | Source/Core/Core/Src/HW/SI_DeviceGCController.cpp | 5 | ||||
| -rw-r--r-- | Source/Core/Core/Src/SConscript | 1 |
6 files changed, 148 insertions, 3 deletions
diff --git a/Source/Core/Core/Core.vcproj b/Source/Core/Core/Core.vcproj index d9ce0fc178..cf4947f50c 100644 --- a/Source/Core/Core/Core.vcproj +++ b/Source/Core/Core/Core.vcproj @@ -2245,6 +2245,14 @@ >
</File>
<File
+ RelativePath=".\Src\Frame.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\Src\Frame.h"
+ >
+ </File>
+ <File
RelativePath=".\Src\Host.h"
>
</File>
diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index ccb5599746..9124d9e881 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -56,6 +56,7 @@ #include "LogManager.h" #include "State.h" +#include "Frame.h" #ifndef _WIN32 #define WINAPI @@ -592,9 +593,8 @@ void Callback_VideoLog(const TCHAR *_szMessage, int _bDoBreak) // We do not write to anything outside this function here void Callback_VideoCopiedToXFB(bool video_update) { - #ifdef RERECORDING - FrameUpdate(); - #endif + if(!video_update) + Frame::FrameUpdate(); SCoreStartupParameter& _CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter; diff --git a/Source/Core/Core/Src/Frame.cpp b/Source/Core/Core/Src/Frame.cpp new file mode 100644 index 0000000000..0cb636cf2c --- /dev/null +++ b/Source/Core/Core/Src/Frame.cpp @@ -0,0 +1,93 @@ +// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include "Core.h"
+#include "PluginManager.h"
+
+namespace Frame {
+
+bool g_bFrameStep = false;
+bool g_bAutoFire = false;
+u32 g_autoFirstKey = 0, g_autoSecondKey = 0;
+bool g_bFirstKey = true;
+
+void FrameUpdate() {
+ if(g_bFrameStep)
+ Core::SetState(Core::CORE_PAUSE);
+
+ if(g_bAutoFire)
+ g_bFirstKey = !g_bFirstKey;
+}
+
+void SetAutoHold(bool bEnabled, u32 keyToHold) {
+ g_bAutoFire = bEnabled;
+ if(bEnabled)
+ g_autoFirstKey = g_autoSecondKey = keyToHold;
+ else
+ g_autoFirstKey = g_autoSecondKey = 0;
+}
+
+void SetAutoFire(bool bEnabled, u32 keyOne, u32 keyTwo) {
+ g_bAutoFire = bEnabled;
+ if(bEnabled) {
+ g_autoFirstKey = keyOne;
+ g_autoSecondKey = keyTwo;
+ } else
+ g_autoFirstKey = g_autoSecondKey = 0;
+
+ g_bFirstKey = true;
+}
+
+bool IsAutoFiring() {
+ return g_bAutoFire;
+}
+
+void SetFrameStepping(bool bEnabled) {
+ g_bFrameStep = bEnabled;
+}
+
+
+void ModifyController(SPADStatus *PadStatus) {
+ u32 keyToPress = (g_bFirstKey) ? g_autoFirstKey : g_autoSecondKey;
+
+ if(!keyToPress)
+ return;
+
+ PadStatus->button |= keyToPress;
+
+ switch(keyToPress) {
+ default:
+ return;
+
+ case PAD_BUTTON_A:
+ PadStatus->analogA = 255;
+ break;
+ case PAD_BUTTON_B:
+ PadStatus->analogB = 255;
+ break;
+
+ case PAD_TRIGGER_L:
+ PadStatus->triggerLeft = 255;
+ break;
+ case PAD_TRIGGER_R:
+ PadStatus->triggerRight = 255;
+ break;
+ }
+
+}
+
+};
diff --git a/Source/Core/Core/Src/Frame.h b/Source/Core/Core/Src/Frame.h new file mode 100644 index 0000000000..e60e806c8d --- /dev/null +++ b/Source/Core/Core/Src/Frame.h @@ -0,0 +1,38 @@ +// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#ifndef __FRAME_H
+#define __FRAME_H
+
+// Per-(video )Frame actions
+
+namespace Frame {
+
+void FrameUpdate();
+
+bool IsAutoFiring();
+
+void SetAutoHold(bool bEnabled, u32 keyToHold = 0);
+void SetAutoFire(bool bEnabled, u32 keyOne = 0, u32 keyTwo = 0);
+
+void SetFrameStepping(bool bEnabled);
+
+void ModifyController(SPADStatus *PadStatus);
+
+};
+
+#endif // __FRAME_H
diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp index 89214b6755..0afc84b7db 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp @@ -25,6 +25,8 @@ #include "EXI_Device.h" #include "EXI_DeviceMic.h" +#include "../Frame.h" + ////////////////////////////////////////////////////////////////////////// // --- standard gamecube controller --- ////////////////////////////////////////////////////////////////////////// @@ -146,6 +148,9 @@ CSIDevice_GCController::GetData(u32& _Hi, u32& _Low) } #endif + if(Frame::IsAutoFiring()) + Frame::ModifyController(&PadStatus); + // Thankfully changing mode does not change the high bits ;) _Hi = (u32)((u8)PadStatus.stickY); _Hi |= (u32)((u8)PadStatus.stickX << 8); diff --git a/Source/Core/Core/Src/SConscript b/Source/Core/Core/Src/SConscript index edd5049634..26bc7a4887 100644 --- a/Source/Core/Core/Src/SConscript +++ b/Source/Core/Core/Src/SConscript @@ -11,6 +11,7 @@ files = ["ActionReplay.cpp", "CoreParameter.cpp", "CoreRerecording.cpp", "CoreTiming.cpp", + "Frame.cpp", "Host.cpp", "MemTools.cpp", "PatchEngine.cpp", |
