Files
Techmino/.github/build/iOS/love.patch
2023-08-03 10:11:27 +08:00

107 lines
3.4 KiB
Diff

diff --git a/src/common/ios.h b/src/common/ios.h
index c1932555..552e432e 100644
--- a/src/common/ios.h
+++ b/src/common/ios.h
@@ -66,7 +66,7 @@ std::string getExecutablePath();
/**
* Causes devices with vibration support to vibrate for about 0.5 seconds.
**/
-void vibrate();
+void vibrate(const double seconds);
/**
* Enable mix mode (e.g. with background music apps) and playback with a muted device.
diff --git a/src/common/ios.mm b/src/common/ios.mm
index 7730991e..4ba8e708 100644
--- a/src/common/ios.mm
+++ b/src/common/ios.mm
@@ -36,6 +36,8 @@
#include <SDL_video.h>
#include <SDL_syswm.h>
+#include <sys/utsname.h>
+
static NSArray *getLovesInDocuments();
static bool deleteFileInDocuments(NSString *filename);
@@ -391,10 +393,40 @@ std::string getExecutablePath()
}
}
-void vibrate()
+void vibrate(const double seconds)
{
@autoreleasepool
{
+ struct utsname systemInfo;
+ uname(&systemInfo);
+ NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
+ NSRange iPhoneRange = [deviceString rangeOfString:@"iPhone"];
+ if (iPhoneRange.length == 6) {
+ NSRange commaRange = [deviceString rangeOfString:@","];
+ NSString *iPhone = [deviceString substringWithRange:iPhoneRange];
+ NSRange numRange = NSMakeRange(iPhoneRange.location + iPhoneRange.length, commaRange.location - iPhoneRange.location - iPhoneRange.length);
+ NSString *num = [deviceString substringWithRange:numRange];
+
+ if ([num intValue] >= 9) {
+ // iPhone 7 and above, see: https://gist.github.com/adamawolf/3048717#file-apple_mobile_device_types-txt-L22
+
+ if (@available(iOS 10.0, *)) {
+ // iOS 10.0 and above
+ UIImpactFeedbackGenerator *impact = nil;
+ if (seconds >= 0.5 && seconds < 1.5) {
+ impact = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleLight]; // 轻
+ } else if (seconds >= 1.5 && seconds < 2.5) {
+ impact = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium]; // 中
+ } else if (seconds >= 2.5) {
+ impact = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleHeavy]; // 重
+ } else {
+ return;
+ }
+ [impact impactOccurred];
+ return;
+ }
+ }
+ }
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
}
diff --git a/src/love.cpp b/src/love.cpp
index c8af8596..ae7a5e32 100644
--- a/src/love.cpp
+++ b/src/love.cpp
@@ -140,6 +140,10 @@ enum DoneAction
DONE_RESTART,
};
+extern "C" {
+ int luaopen_CCloader(lua_State *L);
+}
+
static DoneAction runlove(int argc, char **argv, int &retval)
{
// Oh, you just want the version? Okay!
@@ -158,6 +162,9 @@ static DoneAction runlove(int argc, char **argv, int &retval)
lua_State *L = luaL_newstate();
luaL_openlibs(L);
+ // Init CCloader
+ luaopen_CCloader(L);
+
// LuaJIT-specific setup needs to be done as early as possible - before
// get_app_arguments because that loads external library code. This is also
// loaded inside require("love"). Note that it doesn't use the love table.
diff --git a/src/modules/system/System.cpp b/src/modules/system/System.cpp
index e1de16d5..e0f03557 100644
--- a/src/modules/system/System.cpp
+++ b/src/modules/system/System.cpp
@@ -174,7 +174,7 @@ void System::vibrate(double seconds) const
#ifdef LOVE_ANDROID
love::android::vibrate(seconds);
#elif defined(LOVE_IOS)
- love::ios::vibrate();
+ love::ios::vibrate(seconds);
#else
LOVE_UNUSED(seconds);
#endif