commit 6a1706051d3bf15cb7bfba75d55f450f23e69810 Author: jts Date: Sat Jul 11 11:31:35 2026 +0300 İlk commit: Stepstead Godot istemci (4.6 Mobile) Co-Authored-By: Claude Opus 4.8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0440c97 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Godot cache / import +.godot/ +.import/ + +# Build çıktıları (1.1G+, yeniden üretilir) +exports/ +android/ + +# Derlenmiş binary'ler +*.aar +native/**/build/ + +# Mac +.DS_Store diff --git a/LORE.md b/LORE.md new file mode 100644 index 0000000..0a4970e --- /dev/null +++ b/LORE.md @@ -0,0 +1,74 @@ +# Gazamfer — Dünya ve Hikaye + +## Gezegen + +Gazamfer, üç kıtadan oluşan büyük bir gezegendir. Üç ırk yaşar: **arkanlar**, **zirler** ve **insanlar** — bu sırayla var oldular. Arkanlar hep vardı; sonra zirler, en son insanlar. + +### Kıtalar +- **Eldoria** — insanların ve zirlerin toprakları +- **Meridia** — insanların ve zirlerin toprakları +- **Kaldün** — yalnızca arkanların diyarı. Magma ve sıcaklık üzerine kurulu. + +--- + +## Irklar + +### Arkanlar +Gezegenin en kadim ve en tehlikeli ırkı; asıl tehdit. Olağanüstü fiziksel boyutları ve üstün mistik güçleri vardır. Çok uzun yaşarlar. + +Güçlerini **magmanın sıcaklığından** alırlar, bu yüzden Kaldün'den uzaklaşmazlar. Ayrıca **10.000 yıl önce** zirlerle olan büyük savaşta, zir şamanlarının büyüleri yüzünden **üreme yeteneklerini kaybettiler**. O günden beri sayıları artmıyor ve Kaldün'ü asla terk etmiyorlar. + +Bugün insanların arkanlardan hiç haberi yok. **Bir arkan görüp hayatta kalan tek bir insan bile yok.** + +### Zirler +Genelde düşmanlık göstermeyen ırk. Arkanlar ve insanlarla karşılaştıklarında tepkisiz kalır, zorda kalmadıkça savaşmazlar. İnsanlara göre kısa boylu, doğayla iç içe büyümüşlerdir. Zamanlarının çoğunu yer altında geçirir, güneşliyken pek yüzeye çıkmazlar. + +En büyük özellikleri: **karanlıkta, insanların gündüz gördüğünden çok daha uzağı görebilirler.** + +Çoğunluğu **şaman ve druit**; savaşçıları ve avcıları da vardır. Arkanlarla üreme lanetini büken güç onlardan çıkmıştır. + +İnsanlarla alıp veremedikleri yok — bazıları insan tüccarlarla alışveriş yapar. Ama zir güveni zor kazanılır. + +**Zirler farklı bir dil konuşur, insanlar anlamaz.** Yalnızca **seçilmişler — yani oyuncular — zirceyi anlayabilir.** *(Bu, hikâyede ilerleyen zamanda ortaya çıkacak.)* + +### İnsanlar +Üç gruba ayrılırlar: + +- **Soylular** — yalnızca belirli ailelerin kanını taşıyanlardan çıkar + - paladin · priest · büyücü +- **Halk** — kimse ne olmak isterse onu seçer + - hunter · warrior · keşiş +- **Lanetliler** — aslında halktan insanlar; yaşayışları ve yaptıkları yüzünden bu üç sınıftan biri olurlar + - hırsız · kara büyücü + +--- + +## Thessa Mor + +Başlangıç köyünün en yaşlı ve bilge kişisi. **Aslında bir arkan.** + +Kadim gücü sayesinde çok önce insanların arasına karışmış. Diğer arkanların yaptıklarını yanlış buluyor. İnsanların arasında yaşadığı ve oranın koşulları yüzünden **fiziksel arkan yapısını kaybetmiş**; mistik gücüyle kendini insan olarak gösteriyor. + +Kimse gerçeğini bilmiyor. + +--- + +## Oyun Mekaniği — Lore Bağı + +Oyuncular **adım atarak Action Point toplar.** Bu AP'ler **Will Power** birikmesini sağlar. Will Power, insanların **aylar sürecek işleri inanılmaz kısa sürelerde** tamamlamasını sağlar. Yürümek = güç biriktirmek. + +--- + +## Merkezî Çatışma + +**Thessa Mor**, seçilmişlere zirceyi ve seçilmiş olmanın yollarını öğretir. Amacı net: **arkanların yok olması.** Başka türlü Gazamfer'de dengenin asla sağlanamayacağına inanır. + +**Arkanlar seçilmişleri uzaktan görebilir.** Yürüyerek güçlenen, Will Power biriktiren insanları fark ederler. Üreme lanetlerine çare ararken bir yol bulduklarını sanırlar: **bu insanların ruhlarını / Will Power'larını emerek** lanetten kurtulmak. + +Yani seçilmişler hem arkanların yok edilmesinin tek umudu, hem de arkanların hayatta kalma planının hedefi. İki taraf da aynı güce — Will Power'a — bakıyor. + +### Kaldün'ün Etkisi +Kaldün'de bazı alanlarda duran insanların **Will Power'ı azalmaya başlar.** O bölgelerde yapılan her işlem çok daha fazla Will Power harcar. Arkan diyarı, seçilmişi kendi silahından mahrum bırakır — Kaldün'e ne kadar dalarsan, o kadar güçsüzleşirsin. + +### Son Hedef +Thessa Mor, arkanları yok etmek için **seçilmişlerden bir ordu** kuruyor. Tek kader anı değil — yürüyerek güçlenen, zirlerle konuşabilen, Will Power taşıyan seçilmişlerin ortak gücü arkanların sonunu getirecek. diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion new file mode 100755 index 0000000..de50cb0 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion @@ -0,0 +1,5 @@ +XSym +0044 +99be1ba3f1b49f27eaef0cd758c0b70d +Versions/Current/GodotApplePluginsCoreMotion + \ No newline at end of file diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Resources b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Resources new file mode 100755 index 0000000..ae77f62 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Resources @@ -0,0 +1,5 @@ +XSym +0026 +e58c4cf10cc7c8ef7d7167ccb641aeb4 +Versions/Current/Resources + \ No newline at end of file diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/GodotApplePluginsCoreMotion b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/GodotApplePluginsCoreMotion new file mode 100755 index 0000000..98986fc Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/GodotApplePluginsCoreMotion differ diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/Info.plist b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..2cfe6f5 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 25F71 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GodotApplePluginsCoreMotion + CFBundleIdentifier + godotappleplugins.GodotApplePluginsCoreMotion + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GodotApplePluginsCoreMotion + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 25E251 + DTPlatformName + macosx + DTPlatformVersion + 26.4 + DTSDKBuild + 25E251 + DTSDKName + macosx26.4 + DTXcode + 2641 + DTXcodeBuild + 17E202 + LSMinimumSystemVersion + 14.0 + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAbsoluteAltitudeData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAbsoluteAltitudeData.xml new file mode 100644 index 0000000..1ec861f --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAbsoluteAltitudeData.xml @@ -0,0 +1,27 @@ + + + + An absolute (sea-level-referenced) altitude sample from [CMAltimeter]. + + + Wraps Apple's [code skip-lint]CMAbsoluteAltitudeData[/code], available on iOS 15 and later. Reports altitude referenced to mean sea level along with accuracy and precision estimates. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmabsolutealtitudedata]CMAbsoluteAltitudeData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Estimated accuracy of [member altitude] in meters. + + + Altitude in meters relative to mean sea level. + + + Estimated precision of [member altitude] in meters. + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAccelerometerData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAccelerometerData.xml new file mode 100644 index 0000000..f5ca206 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAccelerometerData.xml @@ -0,0 +1,20 @@ + + + + A single accelerometer sample produced by [CMMotionManager]. + + + Wraps Apple's [code skip-lint]CMAccelerometerData[/code]. Provides the raw accelerometer reading in G-forces (1 G = 9.81 m/s²) along each device axis. See Apple's [url=https://developer.apple.com/documentation/coremotion/cmaccelerometerdata]CMAccelerometerData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Acceleration along each axis in G-forces. Includes gravity. To remove gravity, use device-motion updates and read [member CMDeviceMotion.user_acceleration] instead. + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAltimeter.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAltimeter.xml new file mode 100644 index 0000000..a3956ac --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAltimeter.xml @@ -0,0 +1,79 @@ + + + + Reports relative and (iOS 15+) absolute altitude from the device barometer. + + + Wraps Apple's [code skip-lint]CMAltimeter[/code]. Use [method start_relative_altitude_updates] for change-from-start readings and [method start_absolute_altitude_updates] for sea-level-referenced readings (iOS 15+). + [b]Requires the [code]NSMotionUsageDescription[/code] Info.plist key.[/b] + [b]Platform availability:[/b] Real implementation on [b]iOS[/b]. On other platforms [code]is_*_available[/code] returns [code]false[/code] and calls to start updates emit [signal altimeter_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmaltimeter]CMAltimeter reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Returns Apple's [code skip-lint]CMAuthorizationStatus[/code] integer for altimeter access (0 = notDetermined, 1 = restricted, 2 = denied, 3 = authorized). + + + + + + Returns [code]true[/code] when the device can report absolute (sea-level) altitude. Requires iOS 15 or later. + + + + + + Returns [code]true[/code] when the device has a barometer capable of reporting relative altitude. + + + + + + Begins absolute altitude updates delivered via [signal absolute_altitude_updated]. iOS 15+; emits [signal altimeter_failed] on earlier iOS versions or other platforms. + + + + + + Begins relative altitude updates delivered via [signal relative_altitude_updated]. + + + + + + Stops absolute altitude updates. + + + + + + Stops relative altitude updates. + + + + + + + + Emitted on the main thread when a new absolute altitude sample is available. + + + + + + Emitted when CoreMotion reports an error or when the API is unavailable on the current platform. + + + + + + Emitted on the main thread when a new relative altitude sample is available. + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAltitudeData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAltitudeData.xml new file mode 100644 index 0000000..ac287dd --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMAltitudeData.xml @@ -0,0 +1,24 @@ + + + + A relative altitude / barometric pressure sample from [CMAltimeter]. + + + Wraps Apple's [code skip-lint]CMAltitudeData[/code]. The altitude is reported relative to the point at which updates were started, not absolute sea level — for absolute readings, use [method CMAltimeter.start_absolute_altitude_updates] and [CMAbsoluteAltitudeData]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmaltitudedata]CMAltitudeData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Barometric pressure in kilopascals (kPa). + + + Change in altitude in meters, relative to the point at which updates were started. + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMDeviceMotion.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMDeviceMotion.xml new file mode 100644 index 0000000..8c196ab --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMDeviceMotion.xml @@ -0,0 +1,56 @@ + + + + Fused sensor data combining accelerometer, gyroscope and magnetometer into attitude, gravity, user acceleration and bias-corrected rotation rate. + + + Wraps Apple's [code skip-lint]CMDeviceMotion[/code]. Use this instead of raw accelerometer/gyro data when you need device attitude, gravity-separated user acceleration, or bias-corrected rotation. Emitted by both [CMMotionManager] (handheld device) and [CMHeadphoneMotionManager] (AirPods). + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmdevicemotion]CMDeviceMotion reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Device attitude as a quaternion, relative to the reference frame chosen when starting updates. + + + Device attitude as Euler angles in radians: [code]x[/code] is roll, [code]y[/code] is pitch, [code]z[/code] is yaw. + + + The gravity component of the acceleration, in G-forces, in device coordinates. + + + Heading in degrees, where 0° is the reference attitude. Returns [code]-1[/code] on platforms where heading is not available (e.g. macOS headphone motion, iOS < 11). + + + Bias-corrected magnetic field in microteslas. Check [member magnetic_field_accuracy] to interpret reliability. + + + Calibration accuracy of [member magnetic_field]. + + + Bias-corrected rotation rate around each axis in radians per second. + + + The time at which the sample was taken, in seconds since device boot. + + + Acceleration imparted by the user, in G-forces, with gravity removed. + + + + + The magnetometer has not been calibrated; [member magnetic_field] is not reliable. + + + Low calibration accuracy. + + + Medium calibration accuracy. + + + High calibration accuracy. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMGyroData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMGyroData.xml new file mode 100644 index 0000000..b86934a --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMGyroData.xml @@ -0,0 +1,20 @@ + + + + A single gyroscope sample produced by [CMMotionManager]. + + + Wraps Apple's [code skip-lint]CMGyroData[/code]. Provides the raw rotation rate around each device axis. See Apple's [url=https://developer.apple.com/documentation/coremotion/cmgyrodata]CMGyroData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Rotation rate around each axis in radians per second. Includes bias from gyroscope drift. For a bias-corrected value, use device-motion updates and read [member CMDeviceMotion.rotation_rate] instead. + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMHeadphoneMotionManager.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMHeadphoneMotionManager.xml new file mode 100644 index 0000000..e74e51b --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMHeadphoneMotionManager.xml @@ -0,0 +1,70 @@ + + + + Streams fused head motion data from AirPods Pro / AirPods Max / AirPods 3rd gen and later. + + + Wraps Apple's [code skip-lint]CMHeadphoneMotionManager[/code]. Provides [CMDeviceMotion] samples representing head pose when compatible headphones are connected. Useful for head-tracked audio, spatial UI, or letting the user look around with their head while their hands are free. + [b]Requires the [code]NSMotionUsageDescription[/code] Info.plist key (and on macOS, the matching entitlement).[/b] + [b]Platform availability:[/b] Real implementation on [b]iOS 14+[/b] and [b]macOS 14+[/b]. On other platforms [member is_device_motion_available] is [code]false[/code] and [method start_device_motion_updates] emits [signal update_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmheadphonemotionmanager]CMHeadphoneMotionManager reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Returns Apple's [code skip-lint]CMAuthorizationStatus[/code] integer (0 = notDetermined, 1 = restricted, 2 = denied, 3 = authorized). Available on iOS 17.4 / macOS 14.4 and later; returns 0 on earlier versions. + + + + + + Begins delivering [CMDeviceMotion] samples for the connected headphones via [signal device_motion_updated]. If no compatible headphones are connected, samples will begin to arrive once a pair connects. + + + + + + Stops headphone motion updates. + + + + + + The most recent headphone motion sample, or [code]null[/code] if none is available. + + + [code]true[/code] when updates are currently being delivered. + + + [code]true[/code] when compatible headphones are currently connected and providing motion data. + + + + + + Emitted when compatible headphones connect and begin providing motion data. + + + + + + Emitted on the main thread when a new headphone motion sample is available. + + + + + Emitted when the previously connected headphones disconnect. + + + + + + Emitted when CoreMotion reports an error or when the API is unavailable on the current platform. + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMagnetometerData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMagnetometerData.xml new file mode 100644 index 0000000..1c7691b --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMagnetometerData.xml @@ -0,0 +1,20 @@ + + + + A single magnetometer sample produced by [CMMotionManager]. + + + Wraps Apple's [code skip-lint]CMMagnetometerData[/code]. Provides the raw magnetic field reading in microteslas along each device axis. Includes bias from device magnetic interference. For a bias-corrected value, use device-motion updates and read [member CMDeviceMotion.magnetic_field] instead. See Apple's [url=https://developer.apple.com/documentation/coremotion/cmmagnetometerdata]CMMagnetometerData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Magnetic field strength along each axis in microteslas (µT). + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMotionActivity.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMotionActivity.xml new file mode 100644 index 0000000..0a28fbd --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMotionActivity.xml @@ -0,0 +1,50 @@ + + + + A user-activity classification (walking, running, automotive, etc.) from the system motion coprocessor. + + + Wraps Apple's [code skip-lint]CMMotionActivity[/code]. More than one activity flag may be set simultaneously (e.g. [member walking] and [member automotive] when the user is moving inside a vehicle). The system uses [member confidence] to indicate how certain the classification is. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmmotionactivity]CMMotionActivity reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + [code]true[/code] when the user appears to be in a vehicle. + + + How confident the system is in this classification. + + + [code]true[/code] when the user appears to be cycling. + + + [code]true[/code] when the user appears to be running. + + + Unix-time start of the period for which this activity applies, in seconds. + + + [code]true[/code] when the user appears to be stationary. + + + [code]true[/code] when the system cannot classify the user's activity. + + + [code]true[/code] when the user appears to be walking. + + + + + Low confidence in the classification. + + + Medium confidence in the classification. + + + High confidence in the classification. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMotionActivityManager.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMotionActivityManager.xml new file mode 100644 index 0000000..c2a8207 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMotionActivityManager.xml @@ -0,0 +1,64 @@ + + + + Classifies the user's current activity (walking, running, automotive, cycling, stationary). + + + Wraps Apple's [code skip-lint]CMMotionActivityManager[/code]. The system continuously classifies user activity in the background while motion permission is granted, so [method query_activity] can return historical data even from before your app launched. + [b]Requires the [code]NSMotionUsageDescription[/code] Info.plist key.[/b] + [b]Platform availability:[/b] Real implementation on [b]iOS[/b]. On other platforms [method is_activity_available] returns [code]false[/code] and calls report unavailability via the callback or [signal activity_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmmotionactivitymanager]CMMotionActivityManager reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Returns Apple's [code skip-lint]CMAuthorizationStatus[/code] integer (0 = notDetermined, 1 = restricted, 2 = denied, 3 = authorized). + + + + + + Returns [code]true[/code] when the device has a motion coprocessor capable of activity classification. + + + + + + + + + Returns historical activities recorded between two Unix-time stamps. [param callback] is invoked on the main thread with [code]callback(activities: Array, error: String)[/code]; [param activities] is an array of [CMMotionActivity]. + + + + + + Begins live activity updates delivered via [signal activity_updated]. The signal fires whenever the classified activity changes. + + + + + + Stops live activity updates. + + + + + + + + Emitted when the API is unavailable on the current platform. + + + + + + Emitted on the main thread when the user's classified activity changes. + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMotionManager.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMotionManager.xml new file mode 100644 index 0000000..ed9199c --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMMotionManager.xml @@ -0,0 +1,162 @@ + + + + Streams accelerometer, gyroscope, magnetometer, and fused device-motion data from the device. + + + Wraps Apple's [code skip-lint]CMMotionManager[/code]. Configure an update interval, call one of the [code]start_*_updates[/code] methods, and connect to the matching signal to receive samples. + Prefer [signal device_motion_updated] over raw [signal accelerometer_updated] / [signal gyro_updated] / [signal magnetometer_updated] when you need gravity-separated user acceleration, bias-corrected rotation, or device attitude. + [b]Platform availability:[/b] Real implementation on [b]iOS[/b]. On other platforms the manager exists but [code]is_*_available[/code] returns [code]false[/code] and calling [code]start_*_updates[/code] emits [signal update_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmmotionmanager]CMMotionManager reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Begins delivering accelerometer samples via [signal accelerometer_updated]. Sampling cadence is controlled by [member accelerometer_update_interval]. + + + + + + + Begins delivering fused [CMDeviceMotion] samples via [signal device_motion_updated]. [param referenceFrame] selects how attitude is referenced. Pass [constant XMAGNETIC_NORTH_Z_VERTICAL] or [constant XTRUE_NORTH_Z_VERTICAL] to align yaw with magnetic or true north (requires the magnetometer). + + + + + + Begins delivering gyroscope samples via [signal gyro_updated]. Sampling cadence is controlled by [member gyro_update_interval]. + + + + + + Begins delivering magnetometer samples via [signal magnetometer_updated]. Sampling cadence is controlled by [member magnetometer_update_interval]. + + + + + + Stops accelerometer updates. + + + + + + Stops device-motion updates. + + + + + + Stops gyroscope updates. + + + + + + Stops magnetometer updates. + + + + + + The most recent accelerometer sample, or [code]null[/code] if none is available. + + + Desired interval between accelerometer samples in seconds. + + + The most recent device-motion sample, or [code]null[/code] if none is available. + + + Desired interval between device-motion samples in seconds. + + + The most recent gyroscope sample, or [code]null[/code] if none is available. + + + Desired interval between gyroscope samples in seconds. + + + [code]true[/code] when accelerometer updates are currently being delivered. + + + [code]true[/code] when the device has an accelerometer available to this binding. + + + [code]true[/code] when device-motion updates are currently being delivered. + + + [code]true[/code] when fused device-motion is available on this device. + + + [code]true[/code] when gyroscope updates are currently being delivered. + + + [code]true[/code] when the device has a gyroscope available to this binding. + + + [code]true[/code] when magnetometer updates are currently being delivered. + + + [code]true[/code] when the device has a magnetometer available to this binding. + + + The most recent magnetometer sample, or [code]null[/code] if none is available. + + + Desired interval between magnetometer samples in seconds. + + + + + + + Emitted on the main thread when a new accelerometer sample is available. + + + + + + Emitted on the main thread when a new fused device-motion sample is available. + + + + + + Emitted on the main thread when a new gyroscope sample is available. + + + + + + Emitted on the main thread when a new magnetometer sample is available. + + + + + + Emitted when CoreMotion reports an error or when the API is unavailable on the current platform. + + + + + + Z axis vertical, X axis aligned with an arbitrary direction in the horizontal plane. + + + Same as [constant XARBITRARY_Z_VERTICAL] but corrected for magnetometer drift. + + + Z axis vertical, X axis pointing toward magnetic north. Requires the magnetometer. + + + Z axis vertical, X axis pointing toward true north. Requires the magnetometer and Location Services. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMPedometer.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMPedometer.xml new file mode 100644 index 0000000..58473fd --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMPedometer.xml @@ -0,0 +1,89 @@ + + + + Step, distance, and floor counts from the system pedometer. + + + Wraps Apple's [code skip-lint]CMPedometer[/code]. Supports both historical queries (already-recorded data from the system) and live updates. + [b]Requires the [code]NSMotionUsageDescription[/code] Info.plist key.[/b] On iOS the system records pedometer data continuously while motion permission is granted, so [method query_pedometer_data] can return data even from before your app launched. + [b]Platform availability:[/b] Real implementation on [b]iOS[/b]. On other platforms the [code]is_*_available[/code] static methods return [code]false[/code] and calls report unavailability through their callback or [signal pedometer_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmpedometer]CMPedometer reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Returns the current authorization status using Apple's [code skip-lint]CMAuthorizationStatus[/code] integer (0 = notDetermined, 1 = restricted, 2 = denied, 3 = authorized). + + + + + + Returns [code]true[/code] when the device can report cadence. + + + + + + Returns [code]true[/code] when the device can estimate walked/run distance. + + + + + + Returns [code]true[/code] when the device can count floors ascended/descended. + + + + + + Returns [code]true[/code] when the device can report pace. + + + + + + Returns [code]true[/code] when the device can count steps. Step counting is the minimum requirement for any pedometer functionality. + + + + + + + + + Queries pedometer data recorded between two Unix-time stamps. [param callback] is invoked on the main thread with [code]callback(data: CMPedometerData, error: String)[/code]; [param data] is [code]null[/code] when [param error] is set. + + + + + + + Begins live pedometer updates accumulating from [param fromUnixTime] (Unix seconds). Subsequent samples arrive via [signal pedometer_updated]. Use [code]Time.get_unix_time_from_system()[/code] for "now". + + + + + + Stops live pedometer updates. + + + + + + + + Emitted when CoreMotion reports an error on a live updates stream, or when the API is unavailable on the current platform. + + + + + + Emitted on the main thread with the latest cumulative pedometer reading since [method start_updates] was called. + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMPedometerData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMPedometerData.xml new file mode 100644 index 0000000..826cd15 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/Resources/doc_classes/CMPedometerData.xml @@ -0,0 +1,41 @@ + + + + Aggregated pedometer data covering a time window. + + + Wraps Apple's [code skip-lint]CMPedometerData[/code]. Optional Apple values (distance, floor counts, pace, cadence) report [code]-1[/code] when the underlying capability is unavailable on the device. See Apple's [url=https://developer.apple.com/documentation/coremotion/cmpedometerdata]CMPedometerData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Average pace across the window in seconds per meter, or [code]-1[/code] when unavailable. + + + Instantaneous cadence in steps per second, or [code]-1[/code] when unavailable. + + + Instantaneous pace in seconds per meter, or [code]-1[/code] when unavailable. + + + Distance walked or run in meters, or [code]-1[/code] when distance estimation is unavailable. + + + Unix-time end of the reporting window in seconds. + + + Approximate number of floors ascended, or [code]-1[/code] when floor counting is unavailable. + + + Approximate number of floors descended, or [code]-1[/code] when floor counting is unavailable. + + + Step count across the reporting window. + + + Unix-time start of the reporting window in seconds. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/_CodeSignature/CodeResources b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/_CodeSignature/CodeResources new file mode 100644 index 0000000..3d08064 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/A/_CodeSignature/CodeResources @@ -0,0 +1,271 @@ + + + + + files + + Resources/Info.plist + + V2gXiXYEKthoF+/jfExDDWF93LQ= + + Resources/doc_classes/CMAbsoluteAltitudeData.xml + + ruTKO3c2PbLquPxEPjNbxh5Lr0g= + + Resources/doc_classes/CMAccelerometerData.xml + + MGhilTq5A7cDDIGlgTeepQ5YnEU= + + Resources/doc_classes/CMAltimeter.xml + + Bh8pRJUZzdX38IUZXYxk5xLAOcY= + + Resources/doc_classes/CMAltitudeData.xml + + XncwCLUZGKxizsT4d36ImyTAfhc= + + Resources/doc_classes/CMDeviceMotion.xml + + 7cMBuEKO+J33emlQzGAmUVY+37Y= + + Resources/doc_classes/CMGyroData.xml + + BUfMW1Q1pI+HZDTgn7S/kC4RZVY= + + Resources/doc_classes/CMHeadphoneMotionManager.xml + + FnOPBnmglv3tUY2/KINv4MwAnUk= + + Resources/doc_classes/CMMagnetometerData.xml + + yhze/CizXvHiuOZrD0iiFhB4mTU= + + Resources/doc_classes/CMMotionActivity.xml + + 2BYkcgbtrEhnKtg4wo2BMIH3pxA= + + Resources/doc_classes/CMMotionActivityManager.xml + + i12o0lpE95M+o3cs+BhlMG6+PWA= + + Resources/doc_classes/CMMotionManager.xml + + y/QuZavNCtAQp/aFqQpPBsLrwpI= + + Resources/doc_classes/CMPedometer.xml + + jXC71Xh81YCrJcTyIk1ZfQ0zrzg= + + Resources/doc_classes/CMPedometerData.xml + + ragAg6xgX258zW943jka4RCMk7A= + + + files2 + + Resources/Info.plist + + hash2 + + RA4KNEUT3BeYQxqO+ChSDfr68XFnxKBqktMIMvNJOKg= + + + Resources/doc_classes/CMAbsoluteAltitudeData.xml + + hash2 + + RJbSliCU4rrzZ+Ds73KNMiV2V2hC3kF1vml1r3gVNrg= + + + Resources/doc_classes/CMAccelerometerData.xml + + hash2 + + 0ZTg5tlk5CebGDj0zvJBOHrNq7MFG5YM+TXXkMpOvXg= + + + Resources/doc_classes/CMAltimeter.xml + + hash2 + + wjkXKlnfQlR3FpN4zMszvfAKegJddYZaXaJPcf+5jKo= + + + Resources/doc_classes/CMAltitudeData.xml + + hash2 + + MrQBfd0SlC/fnCNRxWozDU2l1kuh6u4krHpUeyNpEDw= + + + Resources/doc_classes/CMDeviceMotion.xml + + hash2 + + OGWPjyAOnFUgAUTrNZYuvDDj/QyxAzjJxvzzc9w72GI= + + + Resources/doc_classes/CMGyroData.xml + + hash2 + + CauWse7MqNhA3wY+9eK7esh6Hj6s43RlEK4zO46KNkk= + + + Resources/doc_classes/CMHeadphoneMotionManager.xml + + hash2 + + 8255jnS84Sld2w3fVL5fTl4EOn4zIbMfQE5ArxPScpA= + + + Resources/doc_classes/CMMagnetometerData.xml + + hash2 + + f1C6fe6RKz0BiJEeVQ6WQmwuLXyOpQple5yzW1VF59U= + + + Resources/doc_classes/CMMotionActivity.xml + + hash2 + + mJtQxqJ5A/FzMfPR6briuOcUhX+TYmQt1tOdzncVFKM= + + + Resources/doc_classes/CMMotionActivityManager.xml + + hash2 + + ptSLkSJQIHBOZfAzvavj63f4//29X9S9wqISFndxkcA= + + + Resources/doc_classes/CMMotionManager.xml + + hash2 + + k3zhKAXBA0YNQnBIZnf6I1/ZKQWkCSqCan+n4wHqvgI= + + + Resources/doc_classes/CMPedometer.xml + + hash2 + + wQfIsk9BMd0ZPyaPfjD2gKMPERVqxuZWa1jjKbCsqJA= + + + Resources/doc_classes/CMPedometerData.xml + + hash2 + + pGA4w+NWkL1kO3DCw31Q8wFg+x5b2yL9hgKAWPOfEN8= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/Current b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/Current new file mode 100755 index 0000000..18ca124 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework/Versions/Current @@ -0,0 +1,5 @@ +XSym +0001 +7fc56270e7a70fa81a5935b72eacbe29 +A + \ No newline at end of file diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/Info.plist b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/Info.plist new file mode 100644 index 0000000..fb546da --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/Info.plist @@ -0,0 +1,44 @@ + + + + + AvailableLibraries + + + BinaryPath + GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion + LibraryIdentifier + ios-arm64 + LibraryPath + GodotApplePluginsCoreMotion.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + BinaryPath + GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + GodotApplePluginsCoreMotion.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64/GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64/GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion new file mode 100755 index 0000000..2c8912d Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64/GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion differ diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64/GodotApplePluginsCoreMotion.framework/Info.plist b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64/GodotApplePluginsCoreMotion.framework/Info.plist new file mode 100644 index 0000000..66426e2 Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64/GodotApplePluginsCoreMotion.framework/Info.plist differ diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64/GodotApplePluginsCoreMotion.framework/_CodeSignature/CodeResources b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64/GodotApplePluginsCoreMotion.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..7aadfcf --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64/GodotApplePluginsCoreMotion.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + YATGjz2TdE4R5vbRwDC/UvHPYg0= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion new file mode 100755 index 0000000..b66d41e Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsCoreMotion.framework/GodotApplePluginsCoreMotion differ diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsCoreMotion.framework/Info.plist b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsCoreMotion.framework/Info.plist new file mode 100644 index 0000000..47859af Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsCoreMotion.framework/Info.plist differ diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsCoreMotion.framework/_CodeSignature/CodeResources b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsCoreMotion.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..069bb04 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsCoreMotion.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + UePO3lMGlX3OnMIwpSjcm5NID5w= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/GodotApplePluginsCoreMotion b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/GodotApplePluginsCoreMotion new file mode 100755 index 0000000..de50cb0 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/GodotApplePluginsCoreMotion @@ -0,0 +1,5 @@ +XSym +0044 +99be1ba3f1b49f27eaef0cd758c0b70d +Versions/Current/GodotApplePluginsCoreMotion + \ No newline at end of file diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Resources b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Resources new file mode 100755 index 0000000..ae77f62 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Resources @@ -0,0 +1,5 @@ +XSym +0026 +e58c4cf10cc7c8ef7d7167ccb641aeb4 +Versions/Current/Resources + \ No newline at end of file diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/GodotApplePluginsCoreMotion b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/GodotApplePluginsCoreMotion new file mode 100755 index 0000000..6a7c365 Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/GodotApplePluginsCoreMotion differ diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/Info.plist b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..2cfe6f5 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 25F71 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GodotApplePluginsCoreMotion + CFBundleIdentifier + godotappleplugins.GodotApplePluginsCoreMotion + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GodotApplePluginsCoreMotion + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 25E251 + DTPlatformName + macosx + DTPlatformVersion + 26.4 + DTSDKBuild + 25E251 + DTSDKName + macosx26.4 + DTXcode + 2641 + DTXcodeBuild + 17E202 + LSMinimumSystemVersion + 14.0 + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAbsoluteAltitudeData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAbsoluteAltitudeData.xml new file mode 100644 index 0000000..1ec861f --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAbsoluteAltitudeData.xml @@ -0,0 +1,27 @@ + + + + An absolute (sea-level-referenced) altitude sample from [CMAltimeter]. + + + Wraps Apple's [code skip-lint]CMAbsoluteAltitudeData[/code], available on iOS 15 and later. Reports altitude referenced to mean sea level along with accuracy and precision estimates. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmabsolutealtitudedata]CMAbsoluteAltitudeData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Estimated accuracy of [member altitude] in meters. + + + Altitude in meters relative to mean sea level. + + + Estimated precision of [member altitude] in meters. + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAccelerometerData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAccelerometerData.xml new file mode 100644 index 0000000..f5ca206 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAccelerometerData.xml @@ -0,0 +1,20 @@ + + + + A single accelerometer sample produced by [CMMotionManager]. + + + Wraps Apple's [code skip-lint]CMAccelerometerData[/code]. Provides the raw accelerometer reading in G-forces (1 G = 9.81 m/s²) along each device axis. See Apple's [url=https://developer.apple.com/documentation/coremotion/cmaccelerometerdata]CMAccelerometerData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Acceleration along each axis in G-forces. Includes gravity. To remove gravity, use device-motion updates and read [member CMDeviceMotion.user_acceleration] instead. + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAltimeter.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAltimeter.xml new file mode 100644 index 0000000..a3956ac --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAltimeter.xml @@ -0,0 +1,79 @@ + + + + Reports relative and (iOS 15+) absolute altitude from the device barometer. + + + Wraps Apple's [code skip-lint]CMAltimeter[/code]. Use [method start_relative_altitude_updates] for change-from-start readings and [method start_absolute_altitude_updates] for sea-level-referenced readings (iOS 15+). + [b]Requires the [code]NSMotionUsageDescription[/code] Info.plist key.[/b] + [b]Platform availability:[/b] Real implementation on [b]iOS[/b]. On other platforms [code]is_*_available[/code] returns [code]false[/code] and calls to start updates emit [signal altimeter_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmaltimeter]CMAltimeter reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Returns Apple's [code skip-lint]CMAuthorizationStatus[/code] integer for altimeter access (0 = notDetermined, 1 = restricted, 2 = denied, 3 = authorized). + + + + + + Returns [code]true[/code] when the device can report absolute (sea-level) altitude. Requires iOS 15 or later. + + + + + + Returns [code]true[/code] when the device has a barometer capable of reporting relative altitude. + + + + + + Begins absolute altitude updates delivered via [signal absolute_altitude_updated]. iOS 15+; emits [signal altimeter_failed] on earlier iOS versions or other platforms. + + + + + + Begins relative altitude updates delivered via [signal relative_altitude_updated]. + + + + + + Stops absolute altitude updates. + + + + + + Stops relative altitude updates. + + + + + + + + Emitted on the main thread when a new absolute altitude sample is available. + + + + + + Emitted when CoreMotion reports an error or when the API is unavailable on the current platform. + + + + + + Emitted on the main thread when a new relative altitude sample is available. + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAltitudeData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAltitudeData.xml new file mode 100644 index 0000000..ac287dd --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMAltitudeData.xml @@ -0,0 +1,24 @@ + + + + A relative altitude / barometric pressure sample from [CMAltimeter]. + + + Wraps Apple's [code skip-lint]CMAltitudeData[/code]. The altitude is reported relative to the point at which updates were started, not absolute sea level — for absolute readings, use [method CMAltimeter.start_absolute_altitude_updates] and [CMAbsoluteAltitudeData]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmaltitudedata]CMAltitudeData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Barometric pressure in kilopascals (kPa). + + + Change in altitude in meters, relative to the point at which updates were started. + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMDeviceMotion.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMDeviceMotion.xml new file mode 100644 index 0000000..8c196ab --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMDeviceMotion.xml @@ -0,0 +1,56 @@ + + + + Fused sensor data combining accelerometer, gyroscope and magnetometer into attitude, gravity, user acceleration and bias-corrected rotation rate. + + + Wraps Apple's [code skip-lint]CMDeviceMotion[/code]. Use this instead of raw accelerometer/gyro data when you need device attitude, gravity-separated user acceleration, or bias-corrected rotation. Emitted by both [CMMotionManager] (handheld device) and [CMHeadphoneMotionManager] (AirPods). + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmdevicemotion]CMDeviceMotion reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Device attitude as a quaternion, relative to the reference frame chosen when starting updates. + + + Device attitude as Euler angles in radians: [code]x[/code] is roll, [code]y[/code] is pitch, [code]z[/code] is yaw. + + + The gravity component of the acceleration, in G-forces, in device coordinates. + + + Heading in degrees, where 0° is the reference attitude. Returns [code]-1[/code] on platforms where heading is not available (e.g. macOS headphone motion, iOS < 11). + + + Bias-corrected magnetic field in microteslas. Check [member magnetic_field_accuracy] to interpret reliability. + + + Calibration accuracy of [member magnetic_field]. + + + Bias-corrected rotation rate around each axis in radians per second. + + + The time at which the sample was taken, in seconds since device boot. + + + Acceleration imparted by the user, in G-forces, with gravity removed. + + + + + The magnetometer has not been calibrated; [member magnetic_field] is not reliable. + + + Low calibration accuracy. + + + Medium calibration accuracy. + + + High calibration accuracy. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMGyroData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMGyroData.xml new file mode 100644 index 0000000..b86934a --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMGyroData.xml @@ -0,0 +1,20 @@ + + + + A single gyroscope sample produced by [CMMotionManager]. + + + Wraps Apple's [code skip-lint]CMGyroData[/code]. Provides the raw rotation rate around each device axis. See Apple's [url=https://developer.apple.com/documentation/coremotion/cmgyrodata]CMGyroData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Rotation rate around each axis in radians per second. Includes bias from gyroscope drift. For a bias-corrected value, use device-motion updates and read [member CMDeviceMotion.rotation_rate] instead. + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMHeadphoneMotionManager.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMHeadphoneMotionManager.xml new file mode 100644 index 0000000..e74e51b --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMHeadphoneMotionManager.xml @@ -0,0 +1,70 @@ + + + + Streams fused head motion data from AirPods Pro / AirPods Max / AirPods 3rd gen and later. + + + Wraps Apple's [code skip-lint]CMHeadphoneMotionManager[/code]. Provides [CMDeviceMotion] samples representing head pose when compatible headphones are connected. Useful for head-tracked audio, spatial UI, or letting the user look around with their head while their hands are free. + [b]Requires the [code]NSMotionUsageDescription[/code] Info.plist key (and on macOS, the matching entitlement).[/b] + [b]Platform availability:[/b] Real implementation on [b]iOS 14+[/b] and [b]macOS 14+[/b]. On other platforms [member is_device_motion_available] is [code]false[/code] and [method start_device_motion_updates] emits [signal update_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmheadphonemotionmanager]CMHeadphoneMotionManager reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Returns Apple's [code skip-lint]CMAuthorizationStatus[/code] integer (0 = notDetermined, 1 = restricted, 2 = denied, 3 = authorized). Available on iOS 17.4 / macOS 14.4 and later; returns 0 on earlier versions. + + + + + + Begins delivering [CMDeviceMotion] samples for the connected headphones via [signal device_motion_updated]. If no compatible headphones are connected, samples will begin to arrive once a pair connects. + + + + + + Stops headphone motion updates. + + + + + + The most recent headphone motion sample, or [code]null[/code] if none is available. + + + [code]true[/code] when updates are currently being delivered. + + + [code]true[/code] when compatible headphones are currently connected and providing motion data. + + + + + + Emitted when compatible headphones connect and begin providing motion data. + + + + + + Emitted on the main thread when a new headphone motion sample is available. + + + + + Emitted when the previously connected headphones disconnect. + + + + + + Emitted when CoreMotion reports an error or when the API is unavailable on the current platform. + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMagnetometerData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMagnetometerData.xml new file mode 100644 index 0000000..1c7691b --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMagnetometerData.xml @@ -0,0 +1,20 @@ + + + + A single magnetometer sample produced by [CMMotionManager]. + + + Wraps Apple's [code skip-lint]CMMagnetometerData[/code]. Provides the raw magnetic field reading in microteslas along each device axis. Includes bias from device magnetic interference. For a bias-corrected value, use device-motion updates and read [member CMDeviceMotion.magnetic_field] instead. See Apple's [url=https://developer.apple.com/documentation/coremotion/cmmagnetometerdata]CMMagnetometerData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Magnetic field strength along each axis in microteslas (µT). + + + The time at which the sample was taken, in seconds since device boot. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMotionActivity.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMotionActivity.xml new file mode 100644 index 0000000..0a28fbd --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMotionActivity.xml @@ -0,0 +1,50 @@ + + + + A user-activity classification (walking, running, automotive, etc.) from the system motion coprocessor. + + + Wraps Apple's [code skip-lint]CMMotionActivity[/code]. More than one activity flag may be set simultaneously (e.g. [member walking] and [member automotive] when the user is moving inside a vehicle). The system uses [member confidence] to indicate how certain the classification is. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmmotionactivity]CMMotionActivity reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + [code]true[/code] when the user appears to be in a vehicle. + + + How confident the system is in this classification. + + + [code]true[/code] when the user appears to be cycling. + + + [code]true[/code] when the user appears to be running. + + + Unix-time start of the period for which this activity applies, in seconds. + + + [code]true[/code] when the user appears to be stationary. + + + [code]true[/code] when the system cannot classify the user's activity. + + + [code]true[/code] when the user appears to be walking. + + + + + Low confidence in the classification. + + + Medium confidence in the classification. + + + High confidence in the classification. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMotionActivityManager.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMotionActivityManager.xml new file mode 100644 index 0000000..c2a8207 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMotionActivityManager.xml @@ -0,0 +1,64 @@ + + + + Classifies the user's current activity (walking, running, automotive, cycling, stationary). + + + Wraps Apple's [code skip-lint]CMMotionActivityManager[/code]. The system continuously classifies user activity in the background while motion permission is granted, so [method query_activity] can return historical data even from before your app launched. + [b]Requires the [code]NSMotionUsageDescription[/code] Info.plist key.[/b] + [b]Platform availability:[/b] Real implementation on [b]iOS[/b]. On other platforms [method is_activity_available] returns [code]false[/code] and calls report unavailability via the callback or [signal activity_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmmotionactivitymanager]CMMotionActivityManager reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Returns Apple's [code skip-lint]CMAuthorizationStatus[/code] integer (0 = notDetermined, 1 = restricted, 2 = denied, 3 = authorized). + + + + + + Returns [code]true[/code] when the device has a motion coprocessor capable of activity classification. + + + + + + + + + Returns historical activities recorded between two Unix-time stamps. [param callback] is invoked on the main thread with [code]callback(activities: Array, error: String)[/code]; [param activities] is an array of [CMMotionActivity]. + + + + + + Begins live activity updates delivered via [signal activity_updated]. The signal fires whenever the classified activity changes. + + + + + + Stops live activity updates. + + + + + + + + Emitted when the API is unavailable on the current platform. + + + + + + Emitted on the main thread when the user's classified activity changes. + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMotionManager.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMotionManager.xml new file mode 100644 index 0000000..ed9199c --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMMotionManager.xml @@ -0,0 +1,162 @@ + + + + Streams accelerometer, gyroscope, magnetometer, and fused device-motion data from the device. + + + Wraps Apple's [code skip-lint]CMMotionManager[/code]. Configure an update interval, call one of the [code]start_*_updates[/code] methods, and connect to the matching signal to receive samples. + Prefer [signal device_motion_updated] over raw [signal accelerometer_updated] / [signal gyro_updated] / [signal magnetometer_updated] when you need gravity-separated user acceleration, bias-corrected rotation, or device attitude. + [b]Platform availability:[/b] Real implementation on [b]iOS[/b]. On other platforms the manager exists but [code]is_*_available[/code] returns [code]false[/code] and calling [code]start_*_updates[/code] emits [signal update_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmmotionmanager]CMMotionManager reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Begins delivering accelerometer samples via [signal accelerometer_updated]. Sampling cadence is controlled by [member accelerometer_update_interval]. + + + + + + + Begins delivering fused [CMDeviceMotion] samples via [signal device_motion_updated]. [param referenceFrame] selects how attitude is referenced. Pass [constant XMAGNETIC_NORTH_Z_VERTICAL] or [constant XTRUE_NORTH_Z_VERTICAL] to align yaw with magnetic or true north (requires the magnetometer). + + + + + + Begins delivering gyroscope samples via [signal gyro_updated]. Sampling cadence is controlled by [member gyro_update_interval]. + + + + + + Begins delivering magnetometer samples via [signal magnetometer_updated]. Sampling cadence is controlled by [member magnetometer_update_interval]. + + + + + + Stops accelerometer updates. + + + + + + Stops device-motion updates. + + + + + + Stops gyroscope updates. + + + + + + Stops magnetometer updates. + + + + + + The most recent accelerometer sample, or [code]null[/code] if none is available. + + + Desired interval between accelerometer samples in seconds. + + + The most recent device-motion sample, or [code]null[/code] if none is available. + + + Desired interval between device-motion samples in seconds. + + + The most recent gyroscope sample, or [code]null[/code] if none is available. + + + Desired interval between gyroscope samples in seconds. + + + [code]true[/code] when accelerometer updates are currently being delivered. + + + [code]true[/code] when the device has an accelerometer available to this binding. + + + [code]true[/code] when device-motion updates are currently being delivered. + + + [code]true[/code] when fused device-motion is available on this device. + + + [code]true[/code] when gyroscope updates are currently being delivered. + + + [code]true[/code] when the device has a gyroscope available to this binding. + + + [code]true[/code] when magnetometer updates are currently being delivered. + + + [code]true[/code] when the device has a magnetometer available to this binding. + + + The most recent magnetometer sample, or [code]null[/code] if none is available. + + + Desired interval between magnetometer samples in seconds. + + + + + + + Emitted on the main thread when a new accelerometer sample is available. + + + + + + Emitted on the main thread when a new fused device-motion sample is available. + + + + + + Emitted on the main thread when a new gyroscope sample is available. + + + + + + Emitted on the main thread when a new magnetometer sample is available. + + + + + + Emitted when CoreMotion reports an error or when the API is unavailable on the current platform. + + + + + + Z axis vertical, X axis aligned with an arbitrary direction in the horizontal plane. + + + Same as [constant XARBITRARY_Z_VERTICAL] but corrected for magnetometer drift. + + + Z axis vertical, X axis pointing toward magnetic north. Requires the magnetometer. + + + Z axis vertical, X axis pointing toward true north. Requires the magnetometer and Location Services. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMPedometer.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMPedometer.xml new file mode 100644 index 0000000..58473fd --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMPedometer.xml @@ -0,0 +1,89 @@ + + + + Step, distance, and floor counts from the system pedometer. + + + Wraps Apple's [code skip-lint]CMPedometer[/code]. Supports both historical queries (already-recorded data from the system) and live updates. + [b]Requires the [code]NSMotionUsageDescription[/code] Info.plist key.[/b] On iOS the system records pedometer data continuously while motion permission is granted, so [method query_pedometer_data] can return data even from before your app launched. + [b]Platform availability:[/b] Real implementation on [b]iOS[/b]. On other platforms the [code]is_*_available[/code] static methods return [code]false[/code] and calls report unavailability through their callback or [signal pedometer_failed]. + See Apple's [url=https://developer.apple.com/documentation/coremotion/cmpedometer]CMPedometer reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + + + Returns the current authorization status using Apple's [code skip-lint]CMAuthorizationStatus[/code] integer (0 = notDetermined, 1 = restricted, 2 = denied, 3 = authorized). + + + + + + Returns [code]true[/code] when the device can report cadence. + + + + + + Returns [code]true[/code] when the device can estimate walked/run distance. + + + + + + Returns [code]true[/code] when the device can count floors ascended/descended. + + + + + + Returns [code]true[/code] when the device can report pace. + + + + + + Returns [code]true[/code] when the device can count steps. Step counting is the minimum requirement for any pedometer functionality. + + + + + + + + + Queries pedometer data recorded between two Unix-time stamps. [param callback] is invoked on the main thread with [code]callback(data: CMPedometerData, error: String)[/code]; [param data] is [code]null[/code] when [param error] is set. + + + + + + + Begins live pedometer updates accumulating from [param fromUnixTime] (Unix seconds). Subsequent samples arrive via [signal pedometer_updated]. Use [code]Time.get_unix_time_from_system()[/code] for "now". + + + + + + Stops live pedometer updates. + + + + + + + + Emitted when CoreMotion reports an error on a live updates stream, or when the API is unavailable on the current platform. + + + + + + Emitted on the main thread with the latest cumulative pedometer reading since [method start_updates] was called. + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMPedometerData.xml b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMPedometerData.xml new file mode 100644 index 0000000..826cd15 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/Resources/doc_classes/CMPedometerData.xml @@ -0,0 +1,41 @@ + + + + Aggregated pedometer data covering a time window. + + + Wraps Apple's [code skip-lint]CMPedometerData[/code]. Optional Apple values (distance, floor counts, pace, cadence) report [code]-1[/code] when the underlying capability is unavailable on the device. See Apple's [url=https://developer.apple.com/documentation/coremotion/cmpedometerdata]CMPedometerData reference[/url]. + + + $DOCS_URL/coremotion_coremotionguide.html + + + + Average pace across the window in seconds per meter, or [code]-1[/code] when unavailable. + + + Instantaneous cadence in steps per second, or [code]-1[/code] when unavailable. + + + Instantaneous pace in seconds per meter, or [code]-1[/code] when unavailable. + + + Distance walked or run in meters, or [code]-1[/code] when distance estimation is unavailable. + + + Unix-time end of the reporting window in seconds. + + + Approximate number of floors ascended, or [code]-1[/code] when floor counting is unavailable. + + + Approximate number of floors descended, or [code]-1[/code] when floor counting is unavailable. + + + Step count across the reporting window. + + + Unix-time start of the reporting window in seconds. + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/_CodeSignature/CodeResources b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/_CodeSignature/CodeResources new file mode 100644 index 0000000..3d08064 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/A/_CodeSignature/CodeResources @@ -0,0 +1,271 @@ + + + + + files + + Resources/Info.plist + + V2gXiXYEKthoF+/jfExDDWF93LQ= + + Resources/doc_classes/CMAbsoluteAltitudeData.xml + + ruTKO3c2PbLquPxEPjNbxh5Lr0g= + + Resources/doc_classes/CMAccelerometerData.xml + + MGhilTq5A7cDDIGlgTeepQ5YnEU= + + Resources/doc_classes/CMAltimeter.xml + + Bh8pRJUZzdX38IUZXYxk5xLAOcY= + + Resources/doc_classes/CMAltitudeData.xml + + XncwCLUZGKxizsT4d36ImyTAfhc= + + Resources/doc_classes/CMDeviceMotion.xml + + 7cMBuEKO+J33emlQzGAmUVY+37Y= + + Resources/doc_classes/CMGyroData.xml + + BUfMW1Q1pI+HZDTgn7S/kC4RZVY= + + Resources/doc_classes/CMHeadphoneMotionManager.xml + + FnOPBnmglv3tUY2/KINv4MwAnUk= + + Resources/doc_classes/CMMagnetometerData.xml + + yhze/CizXvHiuOZrD0iiFhB4mTU= + + Resources/doc_classes/CMMotionActivity.xml + + 2BYkcgbtrEhnKtg4wo2BMIH3pxA= + + Resources/doc_classes/CMMotionActivityManager.xml + + i12o0lpE95M+o3cs+BhlMG6+PWA= + + Resources/doc_classes/CMMotionManager.xml + + y/QuZavNCtAQp/aFqQpPBsLrwpI= + + Resources/doc_classes/CMPedometer.xml + + jXC71Xh81YCrJcTyIk1ZfQ0zrzg= + + Resources/doc_classes/CMPedometerData.xml + + ragAg6xgX258zW943jka4RCMk7A= + + + files2 + + Resources/Info.plist + + hash2 + + RA4KNEUT3BeYQxqO+ChSDfr68XFnxKBqktMIMvNJOKg= + + + Resources/doc_classes/CMAbsoluteAltitudeData.xml + + hash2 + + RJbSliCU4rrzZ+Ds73KNMiV2V2hC3kF1vml1r3gVNrg= + + + Resources/doc_classes/CMAccelerometerData.xml + + hash2 + + 0ZTg5tlk5CebGDj0zvJBOHrNq7MFG5YM+TXXkMpOvXg= + + + Resources/doc_classes/CMAltimeter.xml + + hash2 + + wjkXKlnfQlR3FpN4zMszvfAKegJddYZaXaJPcf+5jKo= + + + Resources/doc_classes/CMAltitudeData.xml + + hash2 + + MrQBfd0SlC/fnCNRxWozDU2l1kuh6u4krHpUeyNpEDw= + + + Resources/doc_classes/CMDeviceMotion.xml + + hash2 + + OGWPjyAOnFUgAUTrNZYuvDDj/QyxAzjJxvzzc9w72GI= + + + Resources/doc_classes/CMGyroData.xml + + hash2 + + CauWse7MqNhA3wY+9eK7esh6Hj6s43RlEK4zO46KNkk= + + + Resources/doc_classes/CMHeadphoneMotionManager.xml + + hash2 + + 8255jnS84Sld2w3fVL5fTl4EOn4zIbMfQE5ArxPScpA= + + + Resources/doc_classes/CMMagnetometerData.xml + + hash2 + + f1C6fe6RKz0BiJEeVQ6WQmwuLXyOpQple5yzW1VF59U= + + + Resources/doc_classes/CMMotionActivity.xml + + hash2 + + mJtQxqJ5A/FzMfPR6briuOcUhX+TYmQt1tOdzncVFKM= + + + Resources/doc_classes/CMMotionActivityManager.xml + + hash2 + + ptSLkSJQIHBOZfAzvavj63f4//29X9S9wqISFndxkcA= + + + Resources/doc_classes/CMMotionManager.xml + + hash2 + + k3zhKAXBA0YNQnBIZnf6I1/ZKQWkCSqCan+n4wHqvgI= + + + Resources/doc_classes/CMPedometer.xml + + hash2 + + wQfIsk9BMd0ZPyaPfjD2gKMPERVqxuZWa1jjKbCsqJA= + + + Resources/doc_classes/CMPedometerData.xml + + hash2 + + pGA4w+NWkL1kO3DCw31Q8wFg+x5b2yL9hgKAWPOfEN8= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/Current b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/Current new file mode 100755 index 0000000..18ca124 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework/Versions/Current @@ -0,0 +1,5 @@ +XSym +0001 +7fc56270e7a70fa81a5935b72eacbe29 +A + \ No newline at end of file diff --git a/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.linux.arm64.so b/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.linux.arm64.so new file mode 100644 index 0000000..5bb0844 Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.linux.arm64.so differ diff --git a/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.linux.x86_64.so b/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.linux.x86_64.so new file mode 100644 index 0000000..f7b9d62 Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.linux.x86_64.so differ diff --git a/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.windows.arm64.dll b/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.windows.arm64.dll new file mode 100644 index 0000000..dc37950 Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.windows.arm64.dll differ diff --git a/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.windows.x86_64.dll b/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.windows.x86_64.dll new file mode 100644 index 0000000..e838257 Binary files /dev/null and b/addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.windows.x86_64.dll differ diff --git a/addons/GodotApplePluginsCoreMotion/godot_apple_plugins_core_motion.gdextension b/addons/GodotApplePluginsCoreMotion/godot_apple_plugins_core_motion.gdextension new file mode 100644 index 0000000..7212316 --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/godot_apple_plugins_core_motion.gdextension @@ -0,0 +1,18 @@ +[configuration] + +entry_symbol = "godot_apple_plugins_core_motion_start" +compatibility_minimum = 4.2 + +[libraries] +ios = "res://addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.xcframework" +linux.arm64 = "res://addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.linux.arm64.so" +linux.x86_64 = "res://addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.linux.x86_64.so" +macos.arm64 = "res://addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion.framework" +macos.x86_64 = "res://addons/GodotApplePluginsCoreMotion/bin/GodotApplePluginsCoreMotion_x64.framework" +windows.arm64 = "res://addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.windows.arm64.dll" +windows.x86_64 = "res://addons/GodotApplePluginsCoreMotion/bin/godot_apple_plugins_core_motion_stub.windows.x86_64.dll" + +[dependencies] +ios = { "res://addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework": "" } +macos.arm64 = { "res://addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework": "" } +macos.x86_64 = { "res://addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework": "" } diff --git a/addons/GodotApplePluginsCoreMotion/godot_apple_plugins_core_motion.gdextension.uid b/addons/GodotApplePluginsCoreMotion/godot_apple_plugins_core_motion.gdextension.uid new file mode 100644 index 0000000..e61ebcc --- /dev/null +++ b/addons/GodotApplePluginsCoreMotion/godot_apple_plugins_core_motion.gdextension.uid @@ -0,0 +1 @@ +uid://dhf6qp0offg0b diff --git a/addons/GodotApplePluginsRuntime/README.md b/addons/GodotApplePluginsRuntime/README.md new file mode 100644 index 0000000..bf7fc9a --- /dev/null +++ b/addons/GodotApplePluginsRuntime/README.md @@ -0,0 +1,8 @@ +`SwiftGodotRuntime` payload for the split `GodotApplePlugins*` addons. + +The split addon frameworks share the runtime from +`res://addons/GodotApplePluginsRuntime/bin`. + +Keep this addon installed when using any split `GodotApplePlugins*` addon. The +`.gdextension` manifests declare it as a native dependency so Godot embeds it in +iOS exports and preloads it on macOS. diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Resources b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Resources new file mode 100755 index 0000000..ae77f62 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Resources @@ -0,0 +1,5 @@ +XSym +0026 +e58c4cf10cc7c8ef7d7167ccb641aeb4 +Versions/Current/Resources + \ No newline at end of file diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/SwiftGodotRuntime b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/SwiftGodotRuntime new file mode 100755 index 0000000..8695fa2 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/SwiftGodotRuntime @@ -0,0 +1,5 @@ +XSym +0034 +d9f38aed87acda872f71f5c9a9f1a0cf +Versions/Current/SwiftGodotRuntime + \ No newline at end of file diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/A/Resources/Info.plist b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..528ccc3 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 25F71 + CFBundleDevelopmentRegion + en + CFBundleExecutable + SwiftGodotRuntime + CFBundleIdentifier + swiftgodot.SwiftGodotRuntime + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + SwiftGodotRuntime + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 25E251 + DTPlatformName + macosx + DTPlatformVersion + 26.4 + DTSDKBuild + 25E251 + DTSDKName + macosx26.4 + DTXcode + 2641 + DTXcodeBuild + 17E202 + LSMinimumSystemVersion + 14.0 + + diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/A/SwiftGodotRuntime b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/A/SwiftGodotRuntime new file mode 100755 index 0000000..1897a66 Binary files /dev/null and b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/A/SwiftGodotRuntime differ diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/A/_CodeSignature/CodeResources b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/A/_CodeSignature/CodeResources new file mode 100644 index 0000000..9aafd0e --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/A/_CodeSignature/CodeResources @@ -0,0 +1,128 @@ + + + + + files + + Resources/Info.plist + + rs4XjH4BXNQu+5tpbh9iAcLOIeo= + + + files2 + + Resources/Info.plist + + hash2 + + cQ/r/W+7G+K1jNBmCgdhR5xs5WLS21Xc3R3oTeLoeMs= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/Current b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/Current new file mode 100755 index 0000000..18ca124 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework/Versions/Current @@ -0,0 +1,5 @@ +XSym +0001 +7fc56270e7a70fa81a5935b72eacbe29 +A + \ No newline at end of file diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/Info.plist b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/Info.plist new file mode 100644 index 0000000..a3e561d --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/Info.plist @@ -0,0 +1,44 @@ + + + + + AvailableLibraries + + + BinaryPath + SwiftGodotRuntime.framework/SwiftGodotRuntime + LibraryIdentifier + ios-arm64 + LibraryPath + SwiftGodotRuntime.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + BinaryPath + SwiftGodotRuntime.framework/SwiftGodotRuntime + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + SwiftGodotRuntime.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64/SwiftGodotRuntime.framework/Info.plist b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64/SwiftGodotRuntime.framework/Info.plist new file mode 100644 index 0000000..8dada05 Binary files /dev/null and b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64/SwiftGodotRuntime.framework/Info.plist differ diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64/SwiftGodotRuntime.framework/SwiftGodotRuntime b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64/SwiftGodotRuntime.framework/SwiftGodotRuntime new file mode 100755 index 0000000..3ad4d90 Binary files /dev/null and b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64/SwiftGodotRuntime.framework/SwiftGodotRuntime differ diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64/SwiftGodotRuntime.framework/_CodeSignature/CodeResources b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64/SwiftGodotRuntime.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..8c26393 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64/SwiftGodotRuntime.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + 6WsXVY++re9rUkG4Ckg+FZPmp48= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64_x86_64-simulator/SwiftGodotRuntime.framework/Info.plist b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64_x86_64-simulator/SwiftGodotRuntime.framework/Info.plist new file mode 100644 index 0000000..42a181e Binary files /dev/null and b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64_x86_64-simulator/SwiftGodotRuntime.framework/Info.plist differ diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64_x86_64-simulator/SwiftGodotRuntime.framework/SwiftGodotRuntime b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64_x86_64-simulator/SwiftGodotRuntime.framework/SwiftGodotRuntime new file mode 100755 index 0000000..28f6b5f Binary files /dev/null and b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64_x86_64-simulator/SwiftGodotRuntime.framework/SwiftGodotRuntime differ diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64_x86_64-simulator/SwiftGodotRuntime.framework/_CodeSignature/CodeResources b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64_x86_64-simulator/SwiftGodotRuntime.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..968afc4 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework/ios-arm64_x86_64-simulator/SwiftGodotRuntime.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + SVuEmDA5fhoHjDX1OZ8EhAidy0s= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Resources b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Resources new file mode 100755 index 0000000..ae77f62 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Resources @@ -0,0 +1,5 @@ +XSym +0026 +e58c4cf10cc7c8ef7d7167ccb641aeb4 +Versions/Current/Resources + \ No newline at end of file diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/SwiftGodotRuntime b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/SwiftGodotRuntime new file mode 100755 index 0000000..8695fa2 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/SwiftGodotRuntime @@ -0,0 +1,5 @@ +XSym +0034 +d9f38aed87acda872f71f5c9a9f1a0cf +Versions/Current/SwiftGodotRuntime + \ No newline at end of file diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/A/Resources/Info.plist b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..528ccc3 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 25F71 + CFBundleDevelopmentRegion + en + CFBundleExecutable + SwiftGodotRuntime + CFBundleIdentifier + swiftgodot.SwiftGodotRuntime + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + SwiftGodotRuntime + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 25E251 + DTPlatformName + macosx + DTPlatformVersion + 26.4 + DTSDKBuild + 25E251 + DTSDKName + macosx26.4 + DTXcode + 2641 + DTXcodeBuild + 17E202 + LSMinimumSystemVersion + 14.0 + + diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/A/SwiftGodotRuntime b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/A/SwiftGodotRuntime new file mode 100755 index 0000000..29c8b54 Binary files /dev/null and b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/A/SwiftGodotRuntime differ diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/A/_CodeSignature/CodeResources b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/A/_CodeSignature/CodeResources new file mode 100644 index 0000000..9aafd0e --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/A/_CodeSignature/CodeResources @@ -0,0 +1,128 @@ + + + + + files + + Resources/Info.plist + + rs4XjH4BXNQu+5tpbh9iAcLOIeo= + + + files2 + + Resources/Info.plist + + hash2 + + cQ/r/W+7G+K1jNBmCgdhR5xs5WLS21Xc3R3oTeLoeMs= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/Current b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/Current new file mode 100755 index 0000000..18ca124 --- /dev/null +++ b/addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework/Versions/Current @@ -0,0 +1,5 @@ +XSym +0001 +7fc56270e7a70fa81a5935b72eacbe29 +A + \ No newline at end of file diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit new file mode 100755 index 0000000..731e95a --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit @@ -0,0 +1,5 @@ +XSym +0042 +8cedafd2db76746fc7627d87b40dbaa3 +Versions/Current/GodotApplePluginsStoreKit + \ No newline at end of file diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/Info.plist b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/Info.plist new file mode 100644 index 0000000..1458b62 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 25F71 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GodotApplePluginsStoreKit + CFBundleIdentifier + godotappleplugins.GodotApplePluginsStoreKit + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GodotApplePluginsStoreKit + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 25E251 + DTPlatformName + macosx + DTPlatformVersion + 26.4 + DTSDKBuild + 25E251 + DTSDKName + macosx26.4 + DTXcode + 2641 + DTXcodeBuild + 17E202 + LSMinimumSystemVersion + 14.0 + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/ProductView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/ProductView.xml new file mode 100644 index 0000000..eb5e0ea --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/ProductView.xml @@ -0,0 +1,53 @@ + + + + A view that displays a single product from the App Store. + + + This class represents a view that displays a single product from the App Store. It allows you to configure the product to display, the style of the view, and the icon to use. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the product view on top of the current view hierarchy. + + + + + + Whether the view prefers to show the promotional icon for the product. + + + The product identifier of the product to display. + + + The style of the product view. See [enum ViewStyle] for available options. + + + The name of the system icon to use as a placeholder while the product icon loads. + + + + + The system automatically chooses the most appropriate style. + + + A compact style that displays minimal information. + + + A large style that displays more detailed information. + + + The regular style. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreKitManager.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreKitManager.xml new file mode 100644 index 0000000..cdb3d54 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreKitManager.xml @@ -0,0 +1,180 @@ + + + + Manages StoreKit interactions such as requesting products, purchasing, and restoring purchases. + + + This class handles the core StoreKit functionality. It provides methods to fetch product information from the App Store, initiate purchases, + restore previous purchases and be notified of the current status of the purchase upon startup. + + Once you instantiate this class, connect to the the [signal transaction_updated] signal to + get notification related to the status of your purchases - these are delivered to notify + your application of what products your user is entitled to at startup. If you are using + Apple's PurchaseIntent, you will also want to connect to the [signal purchase_intent]. + + The [signal transaction_updated] is only raised for verified transactions. + Apple also supports unverified transactions, those are posted to the [signal unverified_transaction_updated] signal + and in addition to the transaction they contains a status code from the [enum VerificationError]. + + After you have set up your signals, you are ready to receive those events. + + In addition, when you call the [method purchase] or [method purchase_with_options] you will + want to setup a handler for the [signal purchase_completed] signal which is raised in + response to different events during the purchasing. + + + + + + + + The current entitlements sequence provides the most recent transaction for each product the customer is entitled to, use this + to refresh the list of features the user is entitled to. + + Specifically, it includes: + + * One transaction for each non-consumable In-App Purchase + * The latest transaction for each auto-renewable subscription whose Product.SubscriptionInfo.RenewalState is either subscribed or inGracePeriod + * The latest transaction for each non-renewing subscription, including those that have ended + * Products that have been refunded or revoked by the App Store are excluded from the current entitlements, as are consumable In-App Purchases. To retrieve transactions for unfinished consumables, use the unfinished or all transaction sequences instead. + + + + + + + Initiates the purchase of a specific product, e.g. [code]purchase(product)[/code]. This will raise the + [signal purchase_completed] signal, either to indicate that an error took place, or the status of the + purchase. + + + + + + + + Initiates the purchase of a specific product, e.g. [code]purchase(product)[/code], and allows you to provide additional purchase options. + This will raise the + [signal purchase_completed] signal, either to indicate that an error took place, or the status of the + purchase. + + + + + + + Requests product information for a list of product identifiers, e.g. [code]request_products(PackedStringArray(["com.example.product1", "com.example.product2"]))[/code]. + This method will raise the [signal products_request_completed] signal when the information is retrieved. + + + + + + Restores previously purchased non-consumable products and auto-renewable subscriptions. This will raise the + [signal restore_completed] signal when the product purchased have been restored. + + + + + + + + + + + + + + Emitted when a product request completes. + [param products] is an Array of [StoreProduct]s (or nulls). + [param status] indicates success or failure. + + + + + + + + Emitted when a purchase completes. + [param transaction] is the [StoreTransaction] on success. + [param status] indicates the result (OK, cancelled, invalid product, etc.). + [param error_message] contains error details if failed. + + + + + + + + + + + + Emitted when the restore process completes. `arg1` is the [enum StoreKitStatus], and `arg2` is an error message if applicable. + + + + + + + + + + + Emitted when a transaction is updated (e.g., a subscription renews or a purchase is approved externally). `transaction` is the updated [StoreTransaction]. + + You must call the finished method on the transaction once you have made sure that you have delivered the content to the user. + + + + + + + + + + + + The operation completed successfully. + + + The product identifier is invalid. + + + The operation was cancelled. + + + The transaction could not be verified. + + + The user cancelled the operation. + + + The purchase is pending (e.g., waiting for parental approval). + + + An unknown status occurred. + + + The certificate chain was parsable, but was invalid due to one or more revoked certificates. + + + The certificate chain was parsable, but it was invalid for signing this data. + + + The device verification properties were invalid for this device. + + + Th JWS header and any data included in it or it's certificate chain had an invalid encoding. + + + The certificate chain was valid for signing this data, but the leaf's public key was invalid for the JWS signature. + + + Either the JWS header or any certificate in the chain was missing necessary properties for verification. + + + A new error code was introduced that was not previously handled. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProduct.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProduct.xml new file mode 100644 index 0000000..bcd2df4 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProduct.xml @@ -0,0 +1,34 @@ + + + + Represents a product available for purchase in the App Store. + + + This class contains information about a product, such as its ID, display name, description, and price. It is returned by [method StoreKitManager.request_products]. + + + + + + The description of the product, used for display in the UI. + + + The localized display name of the product. + + + The formatted price of the product, including the currency symbol (e.g. "$0.99"). + + + Indicates whether the product can be shared with family members. + + + A JSON debug representation of the product. + + + The price of the product in the local currency. + + + The unique identifier for the product. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductPaymentMode.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductPaymentMode.xml new file mode 100644 index 0000000..be5d378 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductPaymentMode.xml @@ -0,0 +1,35 @@ + + + + The payment modes for subscription offers that apply to a transaction. + + + + + + + + + + Returns a payment mode representing a free trial. + + + + + + Returns a payment mode where the user pays as they go (e.g. monthly for 3 months). + + + + + + Returns a payment mode where the user pays the entire amount up front. + + + + + + The localized description of the payment mode. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductPurchaseOption.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductPurchaseOption.xml new file mode 100644 index 0000000..8183011 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductPurchaseOption.xml @@ -0,0 +1,48 @@ + + + + Represents an option that can be supplied when purchasing a [StoreProduct]. + + + You create instances of this class and you can pass those to [method StoreKitManager.purchase_with_options]. + + + + + + + + + Creates a purchase option with an app account token. This token should be a UUID string that associates the transaction with a user account on your service. + + + + + + + Creates a purchase option with a specific introductory offer eligibility. This requires the signed JWS string from the App Store. + + + + + + + Creates a purchase option specifying the quantity of the product to purchase. + + + + + + + Creates a purchase option to simulate the "Ask to Buy" flow in the sandbox environment. + + + + + + + Creates a purchase option for a win-back offer. + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductSubscriptionOffer.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductSubscriptionOffer.xml new file mode 100644 index 0000000..87a0330 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductSubscriptionOffer.xml @@ -0,0 +1,25 @@ + + + + Represents a subscription offer for a [StoreProduct]. + + + You configure these in AppStore Connect. See [url=https://developer.apple.com/documentation/storekit/product/subscriptionoffer]Apple's documentation[/url] for additional information + + + + + + An introductory offer for new subscribers. + + + A promotional offer for existing or lapsed subscribers. + + + A win-back offer for lapsed subscribers. + + + An unknown offer type. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductSubscriptionPeriod.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductSubscriptionPeriod.xml new file mode 100644 index 0000000..57566bc --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreProductSubscriptionPeriod.xml @@ -0,0 +1,24 @@ + + + + Values that represent the duration of time between subscription renewals. + + + + + + + + A subscription period of one day. + + + A subscription period of one month. + + + A subscription period of one week. + + + A subscription period of one year. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreSubscriptionInfo.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreSubscriptionInfo.xml new file mode 100644 index 0000000..574555f --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreSubscriptionInfo.xml @@ -0,0 +1,49 @@ + + + + Provides subscription group metadata and status queries. + + + This class wraps StoreKit subscription information and exposes the subscription group metadata for a product. + Use the status methods to query the current subscription status for a product, subscription group, or transaction ID. + + + + + + + + + Fetches the current status entries for this subscription. The callback receives a [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] on success, or a [code skip-lint]String[/code] describing the error. + + + + + + + + Fetches status entries for the subscription group identifier. The callback receives a [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] on success, or a [code skip-lint]String[/code] describing the error. + + + + + + + + Fetches the status entry for the provided transaction identifier. The callback receives a [code skip-lint]StoreSubscriptionInfoStatus[/code] when available, an empty [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] when no status is found, or a [code skip-lint]String[/code] describing the error. + On macOS, this requires macOS 15.4 or newer; earlier versions perform no action. + + + + + + The localized display name of the subscription group. Returns an empty string if unavailable. + + + The subscription group level used for upgrade/downgrade ranking. Returns [code]-1[/code] when unavailable. + + + The subscription group identifier from App Store Connect. Returns an empty string if unavailable. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml new file mode 100644 index 0000000..90d857e --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml @@ -0,0 +1,25 @@ + + + + Contains verified renewal metadata for a subscription. + + + This class wraps StoreKit renewal information and is only created from verified renewal data. + + + + + + The app account token used when purchasing, as a UUID string. Returns an empty string when not set. + + + The app transaction identifier associated with the subscription. Returns an empty string when unavailable. + + + The current product identifier for the subscription group. + + + The original transaction identifier for the subscription. Returns [code]0[/code] when unavailable. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreSubscriptionInfoStatus.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreSubscriptionInfoStatus.xml new file mode 100644 index 0000000..7f195d2 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreSubscriptionInfoStatus.xml @@ -0,0 +1,42 @@ + + + + Describes the status of a subscription in a subscription group. + + + This class wraps StoreKit's subscription status information, including renewal state, verified renewal info, and the latest verified transaction. + + + + + + Verified renewal info for the subscription, or [code]null[/code] if it is missing or unverified. + + + The current renewal state. Use the [enum RenewalState] constants. + + + The latest verified transaction for the subscription, or [code]null[/code] if it is missing or unverified. + + + + + The renewal state is unknown or not available. + + + The subscription has expired. + + + The subscription is currently active. + + + The subscription is in the billing retry period after a failed renewal. + + + The subscription is in the grace period after a failed renewal. + + + The subscription was revoked by Apple. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreTransaction.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreTransaction.xml new file mode 100644 index 0000000..aff59a8 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreTransaction.xml @@ -0,0 +1,56 @@ + + + + Represents a successful purchase transaction. + + + This class contains details about a purchase, such as the product ID, purchase date, and expiration date (for subscriptions). + + When you receive a transaction update, you must call the [method finish] method on the transaction once you have made sure + that you have delivered the content to the user. + + + + + + + + The finish method notifies the App Store that the app has successfully provided the purchased content or + activated the purchased service, allowing the transaction to be completed. + + Call [method finish] only after your app has delivered the content or enabled the service. If the purchase + includes on-demand resources, wait to finish the transaction until the download is complete or the + resources have otherwise been fully delivered. + + + + + + The date when the subscription expires, as a Unix timestamp. Returns 0 if not applicable. + + + Whether this transaction is an upgrade of another transaction. + + + The JWS (JSON Web Signature) representation of the signed transaction, suitable for server-side receipt validation (for example the App Store Server API or a third-party validator such as RevenueCat). Empty when the transaction was not constructed from a verification result. + + + The transaction identifier of the original purchase. + + + The type of ownership (e.g., "purchased", "familyShared", "unknown"). + + + The unique identifier of the purchased product. + + + The date when the purchase was made, as a Unix timestamp. + + + The date when the transaction was revoked, as a Unix timestamp. Returns 0 if not revoked. + + + The unique identifier of the transaction. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreView.xml new file mode 100644 index 0000000..fd27e2c --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/StoreView.xml @@ -0,0 +1,30 @@ + + + + A view that displays a collection of products. + + + This class represents a view that displays multiple products from the App Store. It is useful for creating a storefront or a list of available items. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the store view on top of the current view hierarchy. + + + + + + A list of product identifiers to display in the store view. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/SubscriptionOfferView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/SubscriptionOfferView.xml new file mode 100644 index 0000000..a835c49 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/SubscriptionOfferView.xml @@ -0,0 +1,44 @@ + + + + A view for redeeming subscription offers. + + + This class provides a view for users to redeem subscription offer codes. It handles the UI flow for entering and verifying offer codes. + + + + + + + + Dismisses the currently presented view. + + + + + + + Presents the offer code redemption view. note: The `callback` parameter is currently unused; use the [signal success] and [signal error] signals to handle the result. + + + + + + The title displayed on the view. + + + + + + + Emitted when the offer redemption fails. `arg1` contains the error message. + + + + + Emitted when the offer redemption is successful. + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/SubscriptionStoreView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/SubscriptionStoreView.xml new file mode 100644 index 0000000..5ae2037 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Resources/doc_classes/SubscriptionStoreView.xml @@ -0,0 +1,59 @@ + + + + A view for displaying subscription options. + + + This class presents a standard StoreKit subscription view. It can be configured to show a specific subscription group or a list of specific products. The visual style of the controls is also customizable. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the subscription store view on top of the current view hierarchy. + + + + + + The visual style of the subscription controls. See [enum ControlStyle] for options. + + + The identifier of the subscription group to display. If set, this takes precedence over [member product_i_ds]. + + + A list of specific product identifiers to display. Ignored if [member group_id] is set. + + + + + The system automatically chooses the most appropriate style. + + + A picker style. + + + A button-based style. + + + A compact picker style. + + + A prominent picker style. + + + A paged picker style. + + + A prominent paged picker style. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/GodotApplePluginsStoreKit b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/GodotApplePluginsStoreKit new file mode 100755 index 0000000..854d6ba Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/GodotApplePluginsStoreKit differ diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/Info.plist b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..1458b62 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 25F71 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GodotApplePluginsStoreKit + CFBundleIdentifier + godotappleplugins.GodotApplePluginsStoreKit + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GodotApplePluginsStoreKit + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 25E251 + DTPlatformName + macosx + DTPlatformVersion + 26.4 + DTSDKBuild + 25E251 + DTSDKName + macosx26.4 + DTXcode + 2641 + DTXcodeBuild + 17E202 + LSMinimumSystemVersion + 14.0 + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/ProductView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/ProductView.xml new file mode 100644 index 0000000..eb5e0ea --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/ProductView.xml @@ -0,0 +1,53 @@ + + + + A view that displays a single product from the App Store. + + + This class represents a view that displays a single product from the App Store. It allows you to configure the product to display, the style of the view, and the icon to use. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the product view on top of the current view hierarchy. + + + + + + Whether the view prefers to show the promotional icon for the product. + + + The product identifier of the product to display. + + + The style of the product view. See [enum ViewStyle] for available options. + + + The name of the system icon to use as a placeholder while the product icon loads. + + + + + The system automatically chooses the most appropriate style. + + + A compact style that displays minimal information. + + + A large style that displays more detailed information. + + + The regular style. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreKitManager.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreKitManager.xml new file mode 100644 index 0000000..cdb3d54 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreKitManager.xml @@ -0,0 +1,180 @@ + + + + Manages StoreKit interactions such as requesting products, purchasing, and restoring purchases. + + + This class handles the core StoreKit functionality. It provides methods to fetch product information from the App Store, initiate purchases, + restore previous purchases and be notified of the current status of the purchase upon startup. + + Once you instantiate this class, connect to the the [signal transaction_updated] signal to + get notification related to the status of your purchases - these are delivered to notify + your application of what products your user is entitled to at startup. If you are using + Apple's PurchaseIntent, you will also want to connect to the [signal purchase_intent]. + + The [signal transaction_updated] is only raised for verified transactions. + Apple also supports unverified transactions, those are posted to the [signal unverified_transaction_updated] signal + and in addition to the transaction they contains a status code from the [enum VerificationError]. + + After you have set up your signals, you are ready to receive those events. + + In addition, when you call the [method purchase] or [method purchase_with_options] you will + want to setup a handler for the [signal purchase_completed] signal which is raised in + response to different events during the purchasing. + + + + + + + + The current entitlements sequence provides the most recent transaction for each product the customer is entitled to, use this + to refresh the list of features the user is entitled to. + + Specifically, it includes: + + * One transaction for each non-consumable In-App Purchase + * The latest transaction for each auto-renewable subscription whose Product.SubscriptionInfo.RenewalState is either subscribed or inGracePeriod + * The latest transaction for each non-renewing subscription, including those that have ended + * Products that have been refunded or revoked by the App Store are excluded from the current entitlements, as are consumable In-App Purchases. To retrieve transactions for unfinished consumables, use the unfinished or all transaction sequences instead. + + + + + + + Initiates the purchase of a specific product, e.g. [code]purchase(product)[/code]. This will raise the + [signal purchase_completed] signal, either to indicate that an error took place, or the status of the + purchase. + + + + + + + + Initiates the purchase of a specific product, e.g. [code]purchase(product)[/code], and allows you to provide additional purchase options. + This will raise the + [signal purchase_completed] signal, either to indicate that an error took place, or the status of the + purchase. + + + + + + + Requests product information for a list of product identifiers, e.g. [code]request_products(PackedStringArray(["com.example.product1", "com.example.product2"]))[/code]. + This method will raise the [signal products_request_completed] signal when the information is retrieved. + + + + + + Restores previously purchased non-consumable products and auto-renewable subscriptions. This will raise the + [signal restore_completed] signal when the product purchased have been restored. + + + + + + + + + + + + + + Emitted when a product request completes. + [param products] is an Array of [StoreProduct]s (or nulls). + [param status] indicates success or failure. + + + + + + + + Emitted when a purchase completes. + [param transaction] is the [StoreTransaction] on success. + [param status] indicates the result (OK, cancelled, invalid product, etc.). + [param error_message] contains error details if failed. + + + + + + + + + + + + Emitted when the restore process completes. `arg1` is the [enum StoreKitStatus], and `arg2` is an error message if applicable. + + + + + + + + + + + Emitted when a transaction is updated (e.g., a subscription renews or a purchase is approved externally). `transaction` is the updated [StoreTransaction]. + + You must call the finished method on the transaction once you have made sure that you have delivered the content to the user. + + + + + + + + + + + + The operation completed successfully. + + + The product identifier is invalid. + + + The operation was cancelled. + + + The transaction could not be verified. + + + The user cancelled the operation. + + + The purchase is pending (e.g., waiting for parental approval). + + + An unknown status occurred. + + + The certificate chain was parsable, but was invalid due to one or more revoked certificates. + + + The certificate chain was parsable, but it was invalid for signing this data. + + + The device verification properties were invalid for this device. + + + Th JWS header and any data included in it or it's certificate chain had an invalid encoding. + + + The certificate chain was valid for signing this data, but the leaf's public key was invalid for the JWS signature. + + + Either the JWS header or any certificate in the chain was missing necessary properties for verification. + + + A new error code was introduced that was not previously handled. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProduct.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProduct.xml new file mode 100644 index 0000000..bcd2df4 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProduct.xml @@ -0,0 +1,34 @@ + + + + Represents a product available for purchase in the App Store. + + + This class contains information about a product, such as its ID, display name, description, and price. It is returned by [method StoreKitManager.request_products]. + + + + + + The description of the product, used for display in the UI. + + + The localized display name of the product. + + + The formatted price of the product, including the currency symbol (e.g. "$0.99"). + + + Indicates whether the product can be shared with family members. + + + A JSON debug representation of the product. + + + The price of the product in the local currency. + + + The unique identifier for the product. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductPaymentMode.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductPaymentMode.xml new file mode 100644 index 0000000..be5d378 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductPaymentMode.xml @@ -0,0 +1,35 @@ + + + + The payment modes for subscription offers that apply to a transaction. + + + + + + + + + + Returns a payment mode representing a free trial. + + + + + + Returns a payment mode where the user pays as they go (e.g. monthly for 3 months). + + + + + + Returns a payment mode where the user pays the entire amount up front. + + + + + + The localized description of the payment mode. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductPurchaseOption.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductPurchaseOption.xml new file mode 100644 index 0000000..8183011 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductPurchaseOption.xml @@ -0,0 +1,48 @@ + + + + Represents an option that can be supplied when purchasing a [StoreProduct]. + + + You create instances of this class and you can pass those to [method StoreKitManager.purchase_with_options]. + + + + + + + + + Creates a purchase option with an app account token. This token should be a UUID string that associates the transaction with a user account on your service. + + + + + + + Creates a purchase option with a specific introductory offer eligibility. This requires the signed JWS string from the App Store. + + + + + + + Creates a purchase option specifying the quantity of the product to purchase. + + + + + + + Creates a purchase option to simulate the "Ask to Buy" flow in the sandbox environment. + + + + + + + Creates a purchase option for a win-back offer. + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionOffer.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionOffer.xml new file mode 100644 index 0000000..87a0330 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionOffer.xml @@ -0,0 +1,25 @@ + + + + Represents a subscription offer for a [StoreProduct]. + + + You configure these in AppStore Connect. See [url=https://developer.apple.com/documentation/storekit/product/subscriptionoffer]Apple's documentation[/url] for additional information + + + + + + An introductory offer for new subscribers. + + + A promotional offer for existing or lapsed subscribers. + + + A win-back offer for lapsed subscribers. + + + An unknown offer type. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionPeriod.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionPeriod.xml new file mode 100644 index 0000000..57566bc --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionPeriod.xml @@ -0,0 +1,24 @@ + + + + Values that represent the duration of time between subscription renewals. + + + + + + + + A subscription period of one day. + + + A subscription period of one month. + + + A subscription period of one week. + + + A subscription period of one year. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfo.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfo.xml new file mode 100644 index 0000000..574555f --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfo.xml @@ -0,0 +1,49 @@ + + + + Provides subscription group metadata and status queries. + + + This class wraps StoreKit subscription information and exposes the subscription group metadata for a product. + Use the status methods to query the current subscription status for a product, subscription group, or transaction ID. + + + + + + + + + Fetches the current status entries for this subscription. The callback receives a [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] on success, or a [code skip-lint]String[/code] describing the error. + + + + + + + + Fetches status entries for the subscription group identifier. The callback receives a [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] on success, or a [code skip-lint]String[/code] describing the error. + + + + + + + + Fetches the status entry for the provided transaction identifier. The callback receives a [code skip-lint]StoreSubscriptionInfoStatus[/code] when available, an empty [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] when no status is found, or a [code skip-lint]String[/code] describing the error. + On macOS, this requires macOS 15.4 or newer; earlier versions perform no action. + + + + + + The localized display name of the subscription group. Returns an empty string if unavailable. + + + The subscription group level used for upgrade/downgrade ranking. Returns [code]-1[/code] when unavailable. + + + The subscription group identifier from App Store Connect. Returns an empty string if unavailable. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml new file mode 100644 index 0000000..90d857e --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml @@ -0,0 +1,25 @@ + + + + Contains verified renewal metadata for a subscription. + + + This class wraps StoreKit renewal information and is only created from verified renewal data. + + + + + + The app account token used when purchasing, as a UUID string. Returns an empty string when not set. + + + The app transaction identifier associated with the subscription. Returns an empty string when unavailable. + + + The current product identifier for the subscription group. + + + The original transaction identifier for the subscription. Returns [code]0[/code] when unavailable. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoStatus.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoStatus.xml new file mode 100644 index 0000000..7f195d2 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoStatus.xml @@ -0,0 +1,42 @@ + + + + Describes the status of a subscription in a subscription group. + + + This class wraps StoreKit's subscription status information, including renewal state, verified renewal info, and the latest verified transaction. + + + + + + Verified renewal info for the subscription, or [code]null[/code] if it is missing or unverified. + + + The current renewal state. Use the [enum RenewalState] constants. + + + The latest verified transaction for the subscription, or [code]null[/code] if it is missing or unverified. + + + + + The renewal state is unknown or not available. + + + The subscription has expired. + + + The subscription is currently active. + + + The subscription is in the billing retry period after a failed renewal. + + + The subscription is in the grace period after a failed renewal. + + + The subscription was revoked by Apple. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreTransaction.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreTransaction.xml new file mode 100644 index 0000000..aff59a8 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreTransaction.xml @@ -0,0 +1,56 @@ + + + + Represents a successful purchase transaction. + + + This class contains details about a purchase, such as the product ID, purchase date, and expiration date (for subscriptions). + + When you receive a transaction update, you must call the [method finish] method on the transaction once you have made sure + that you have delivered the content to the user. + + + + + + + + The finish method notifies the App Store that the app has successfully provided the purchased content or + activated the purchased service, allowing the transaction to be completed. + + Call [method finish] only after your app has delivered the content or enabled the service. If the purchase + includes on-demand resources, wait to finish the transaction until the download is complete or the + resources have otherwise been fully delivered. + + + + + + The date when the subscription expires, as a Unix timestamp. Returns 0 if not applicable. + + + Whether this transaction is an upgrade of another transaction. + + + The JWS (JSON Web Signature) representation of the signed transaction, suitable for server-side receipt validation (for example the App Store Server API or a third-party validator such as RevenueCat). Empty when the transaction was not constructed from a verification result. + + + The transaction identifier of the original purchase. + + + The type of ownership (e.g., "purchased", "familyShared", "unknown"). + + + The unique identifier of the purchased product. + + + The date when the purchase was made, as a Unix timestamp. + + + The date when the transaction was revoked, as a Unix timestamp. Returns 0 if not revoked. + + + The unique identifier of the transaction. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreView.xml new file mode 100644 index 0000000..fd27e2c --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/StoreView.xml @@ -0,0 +1,30 @@ + + + + A view that displays a collection of products. + + + This class represents a view that displays multiple products from the App Store. It is useful for creating a storefront or a list of available items. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the store view on top of the current view hierarchy. + + + + + + A list of product identifiers to display in the store view. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/SubscriptionOfferView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/SubscriptionOfferView.xml new file mode 100644 index 0000000..a835c49 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/SubscriptionOfferView.xml @@ -0,0 +1,44 @@ + + + + A view for redeeming subscription offers. + + + This class provides a view for users to redeem subscription offer codes. It handles the UI flow for entering and verifying offer codes. + + + + + + + + Dismisses the currently presented view. + + + + + + + Presents the offer code redemption view. note: The `callback` parameter is currently unused; use the [signal success] and [signal error] signals to handle the result. + + + + + + The title displayed on the view. + + + + + + + Emitted when the offer redemption fails. `arg1` contains the error message. + + + + + Emitted when the offer redemption is successful. + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/SubscriptionStoreView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/SubscriptionStoreView.xml new file mode 100644 index 0000000..5ae2037 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/Resources/doc_classes/SubscriptionStoreView.xml @@ -0,0 +1,59 @@ + + + + A view for displaying subscription options. + + + This class presents a standard StoreKit subscription view. It can be configured to show a specific subscription group or a list of specific products. The visual style of the controls is also customizable. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the subscription store view on top of the current view hierarchy. + + + + + + The visual style of the subscription controls. See [enum ControlStyle] for options. + + + The identifier of the subscription group to display. If set, this takes precedence over [member product_i_ds]. + + + A list of specific product identifiers to display. Ignored if [member group_id] is set. + + + + + The system automatically chooses the most appropriate style. + + + A picker style. + + + A button-based style. + + + A compact picker style. + + + A prominent picker style. + + + A paged picker style. + + + A prominent paged picker style. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/_CodeSignature/CodeResources b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/_CodeSignature/CodeResources new file mode 100644 index 0000000..cfbbede --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/A/_CodeSignature/CodeResources @@ -0,0 +1,282 @@ + + + + + files + + Resources/Info.plist + + a55hY0Y80uiEzgMh34WPQ7T7f9g= + + Resources/doc_classes/ProductView.xml + + 3M/6BEREzR8r51+r7zHfNSE5b/Y= + + Resources/doc_classes/StoreKitManager.xml + + bt53Uy4kbGGF9s1fmSNPavGPnpU= + + Resources/doc_classes/StoreProduct.xml + + mwGN2YBdj37NeXDdKBGxIhu6F1Q= + + Resources/doc_classes/StoreProductPaymentMode.xml + + NWY7MWtIM/XlQIVtJfnEJDg5O00= + + Resources/doc_classes/StoreProductPurchaseOption.xml + + 169Dx+ppSwA69d/5JTXMtg9Wu+4= + + Resources/doc_classes/StoreProductSubscriptionOffer.xml + + Z9WImiN8BvWcEXY3kS78lNuIHTE= + + Resources/doc_classes/StoreProductSubscriptionPeriod.xml + + 2GZh4pGspXZ6DTfBgsIvKk+rsKg= + + Resources/doc_classes/StoreSubscriptionInfo.xml + + iTUGmpMJSPm1WxCSZ1FxHoTlvg4= + + Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml + + sidHqdcp1EqWz8BWDhmiFp+4jSw= + + Resources/doc_classes/StoreSubscriptionInfoStatus.xml + + fFnkPu1YM23Oje4l/Bq14YYe5fQ= + + Resources/doc_classes/StoreTransaction.xml + + SEF4DEE7yg/NvV73/uaKoEafHJk= + + Resources/doc_classes/StoreView.xml + + 2dsu8CTBVlVg6KNiS/MuzBEJg7U= + + Resources/doc_classes/SubscriptionOfferView.xml + + b5WaOfu8qhnx5i23j63JbHk/kzE= + + Resources/doc_classes/SubscriptionStoreView.xml + + EoSh+YB8fT3oUQSc5LfSUmBXoLM= + + + files2 + + Resources/Info.plist + + hash2 + + /6j/2zcQNRzfP1sg63em4jRqPqhGSiGOpqfgQCzJeNM= + + + Resources/doc_classes/ProductView.xml + + hash2 + + 7Ddtn8pSBD+TNGRdC25Il10b5UZYYxU0grcp/IyZdlw= + + + Resources/doc_classes/StoreKitManager.xml + + hash2 + + dZ6oFf761fvgzfkz45zY9Henbznpq3PFMvr1r9WLMFE= + + + Resources/doc_classes/StoreProduct.xml + + hash2 + + TvmIFLQO8Mh1OadfUGo3MSE97h/rtQdoWXiRXkM3jQA= + + + Resources/doc_classes/StoreProductPaymentMode.xml + + hash2 + + TDqPjis6qFjJQzKCo4FJJd4fFcIJ2cIviwErHcoJ5XQ= + + + Resources/doc_classes/StoreProductPurchaseOption.xml + + hash2 + + O8BFgmvMVyqR/0rjOusvZv2FE56kO5585gj3KqoZnWU= + + + Resources/doc_classes/StoreProductSubscriptionOffer.xml + + hash2 + + C98FhDedLmFFe9gcOjar1labrLrbH9X6mFbQ8te3NBQ= + + + Resources/doc_classes/StoreProductSubscriptionPeriod.xml + + hash2 + + pDzhbm+IN3xUQ/jVbRKkxnjIOr7NeP3Q81f3T3Lp9LI= + + + Resources/doc_classes/StoreSubscriptionInfo.xml + + hash2 + + ghTYbH7kRMCHMadaJk9UZYfr3rMPvTnDDOIjFyhnzxY= + + + Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml + + hash2 + + YeI62LA698nuy18k3V+6ZfW2En4hMvG6XHx6xhD8RE8= + + + Resources/doc_classes/StoreSubscriptionInfoStatus.xml + + hash2 + + dVeYxCgV/Tuzu+G9T0DS++vSUDMcbeSvNQQTjDWc0lM= + + + Resources/doc_classes/StoreTransaction.xml + + hash2 + + 2IYnBgeGbRHqCP0R1G/IT3yiEsagfvmyGTW83kecb4w= + + + Resources/doc_classes/StoreView.xml + + hash2 + + JYaszhGFbW9nynHNO/cQYwigipk/kwgHgviYdcgJ7xY= + + + Resources/doc_classes/SubscriptionOfferView.xml + + hash2 + + 2XxnmOysDfBXDux9ZtJcLkV2Gx0SRlrvHm05mgVChVk= + + + Resources/doc_classes/SubscriptionStoreView.xml + + hash2 + + JEaDbQQ6WRP2sZn2J5jtbOYsyJyWQwRO+FXUYmoTGVA= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/GodotApplePluginsStoreKit b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/GodotApplePluginsStoreKit new file mode 100755 index 0000000..854d6ba Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/GodotApplePluginsStoreKit differ diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/Info.plist b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/Info.plist new file mode 100644 index 0000000..1458b62 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 25F71 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GodotApplePluginsStoreKit + CFBundleIdentifier + godotappleplugins.GodotApplePluginsStoreKit + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GodotApplePluginsStoreKit + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 25E251 + DTPlatformName + macosx + DTPlatformVersion + 26.4 + DTSDKBuild + 25E251 + DTSDKName + macosx26.4 + DTXcode + 2641 + DTXcodeBuild + 17E202 + LSMinimumSystemVersion + 14.0 + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/ProductView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/ProductView.xml new file mode 100644 index 0000000..eb5e0ea --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/ProductView.xml @@ -0,0 +1,53 @@ + + + + A view that displays a single product from the App Store. + + + This class represents a view that displays a single product from the App Store. It allows you to configure the product to display, the style of the view, and the icon to use. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the product view on top of the current view hierarchy. + + + + + + Whether the view prefers to show the promotional icon for the product. + + + The product identifier of the product to display. + + + The style of the product view. See [enum ViewStyle] for available options. + + + The name of the system icon to use as a placeholder while the product icon loads. + + + + + The system automatically chooses the most appropriate style. + + + A compact style that displays minimal information. + + + A large style that displays more detailed information. + + + The regular style. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreKitManager.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreKitManager.xml new file mode 100644 index 0000000..cdb3d54 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreKitManager.xml @@ -0,0 +1,180 @@ + + + + Manages StoreKit interactions such as requesting products, purchasing, and restoring purchases. + + + This class handles the core StoreKit functionality. It provides methods to fetch product information from the App Store, initiate purchases, + restore previous purchases and be notified of the current status of the purchase upon startup. + + Once you instantiate this class, connect to the the [signal transaction_updated] signal to + get notification related to the status of your purchases - these are delivered to notify + your application of what products your user is entitled to at startup. If you are using + Apple's PurchaseIntent, you will also want to connect to the [signal purchase_intent]. + + The [signal transaction_updated] is only raised for verified transactions. + Apple also supports unverified transactions, those are posted to the [signal unverified_transaction_updated] signal + and in addition to the transaction they contains a status code from the [enum VerificationError]. + + After you have set up your signals, you are ready to receive those events. + + In addition, when you call the [method purchase] or [method purchase_with_options] you will + want to setup a handler for the [signal purchase_completed] signal which is raised in + response to different events during the purchasing. + + + + + + + + The current entitlements sequence provides the most recent transaction for each product the customer is entitled to, use this + to refresh the list of features the user is entitled to. + + Specifically, it includes: + + * One transaction for each non-consumable In-App Purchase + * The latest transaction for each auto-renewable subscription whose Product.SubscriptionInfo.RenewalState is either subscribed or inGracePeriod + * The latest transaction for each non-renewing subscription, including those that have ended + * Products that have been refunded or revoked by the App Store are excluded from the current entitlements, as are consumable In-App Purchases. To retrieve transactions for unfinished consumables, use the unfinished or all transaction sequences instead. + + + + + + + Initiates the purchase of a specific product, e.g. [code]purchase(product)[/code]. This will raise the + [signal purchase_completed] signal, either to indicate that an error took place, or the status of the + purchase. + + + + + + + + Initiates the purchase of a specific product, e.g. [code]purchase(product)[/code], and allows you to provide additional purchase options. + This will raise the + [signal purchase_completed] signal, either to indicate that an error took place, or the status of the + purchase. + + + + + + + Requests product information for a list of product identifiers, e.g. [code]request_products(PackedStringArray(["com.example.product1", "com.example.product2"]))[/code]. + This method will raise the [signal products_request_completed] signal when the information is retrieved. + + + + + + Restores previously purchased non-consumable products and auto-renewable subscriptions. This will raise the + [signal restore_completed] signal when the product purchased have been restored. + + + + + + + + + + + + + + Emitted when a product request completes. + [param products] is an Array of [StoreProduct]s (or nulls). + [param status] indicates success or failure. + + + + + + + + Emitted when a purchase completes. + [param transaction] is the [StoreTransaction] on success. + [param status] indicates the result (OK, cancelled, invalid product, etc.). + [param error_message] contains error details if failed. + + + + + + + + + + + + Emitted when the restore process completes. `arg1` is the [enum StoreKitStatus], and `arg2` is an error message if applicable. + + + + + + + + + + + Emitted when a transaction is updated (e.g., a subscription renews or a purchase is approved externally). `transaction` is the updated [StoreTransaction]. + + You must call the finished method on the transaction once you have made sure that you have delivered the content to the user. + + + + + + + + + + + + The operation completed successfully. + + + The product identifier is invalid. + + + The operation was cancelled. + + + The transaction could not be verified. + + + The user cancelled the operation. + + + The purchase is pending (e.g., waiting for parental approval). + + + An unknown status occurred. + + + The certificate chain was parsable, but was invalid due to one or more revoked certificates. + + + The certificate chain was parsable, but it was invalid for signing this data. + + + The device verification properties were invalid for this device. + + + Th JWS header and any data included in it or it's certificate chain had an invalid encoding. + + + The certificate chain was valid for signing this data, but the leaf's public key was invalid for the JWS signature. + + + Either the JWS header or any certificate in the chain was missing necessary properties for verification. + + + A new error code was introduced that was not previously handled. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProduct.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProduct.xml new file mode 100644 index 0000000..bcd2df4 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProduct.xml @@ -0,0 +1,34 @@ + + + + Represents a product available for purchase in the App Store. + + + This class contains information about a product, such as its ID, display name, description, and price. It is returned by [method StoreKitManager.request_products]. + + + + + + The description of the product, used for display in the UI. + + + The localized display name of the product. + + + The formatted price of the product, including the currency symbol (e.g. "$0.99"). + + + Indicates whether the product can be shared with family members. + + + A JSON debug representation of the product. + + + The price of the product in the local currency. + + + The unique identifier for the product. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductPaymentMode.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductPaymentMode.xml new file mode 100644 index 0000000..be5d378 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductPaymentMode.xml @@ -0,0 +1,35 @@ + + + + The payment modes for subscription offers that apply to a transaction. + + + + + + + + + + Returns a payment mode representing a free trial. + + + + + + Returns a payment mode where the user pays as they go (e.g. monthly for 3 months). + + + + + + Returns a payment mode where the user pays the entire amount up front. + + + + + + The localized description of the payment mode. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductPurchaseOption.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductPurchaseOption.xml new file mode 100644 index 0000000..8183011 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductPurchaseOption.xml @@ -0,0 +1,48 @@ + + + + Represents an option that can be supplied when purchasing a [StoreProduct]. + + + You create instances of this class and you can pass those to [method StoreKitManager.purchase_with_options]. + + + + + + + + + Creates a purchase option with an app account token. This token should be a UUID string that associates the transaction with a user account on your service. + + + + + + + Creates a purchase option with a specific introductory offer eligibility. This requires the signed JWS string from the App Store. + + + + + + + Creates a purchase option specifying the quantity of the product to purchase. + + + + + + + Creates a purchase option to simulate the "Ask to Buy" flow in the sandbox environment. + + + + + + + Creates a purchase option for a win-back offer. + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductSubscriptionOffer.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductSubscriptionOffer.xml new file mode 100644 index 0000000..87a0330 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductSubscriptionOffer.xml @@ -0,0 +1,25 @@ + + + + Represents a subscription offer for a [StoreProduct]. + + + You configure these in AppStore Connect. See [url=https://developer.apple.com/documentation/storekit/product/subscriptionoffer]Apple's documentation[/url] for additional information + + + + + + An introductory offer for new subscribers. + + + A promotional offer for existing or lapsed subscribers. + + + A win-back offer for lapsed subscribers. + + + An unknown offer type. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductSubscriptionPeriod.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductSubscriptionPeriod.xml new file mode 100644 index 0000000..57566bc --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreProductSubscriptionPeriod.xml @@ -0,0 +1,24 @@ + + + + Values that represent the duration of time between subscription renewals. + + + + + + + + A subscription period of one day. + + + A subscription period of one month. + + + A subscription period of one week. + + + A subscription period of one year. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreSubscriptionInfo.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreSubscriptionInfo.xml new file mode 100644 index 0000000..574555f --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreSubscriptionInfo.xml @@ -0,0 +1,49 @@ + + + + Provides subscription group metadata and status queries. + + + This class wraps StoreKit subscription information and exposes the subscription group metadata for a product. + Use the status methods to query the current subscription status for a product, subscription group, or transaction ID. + + + + + + + + + Fetches the current status entries for this subscription. The callback receives a [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] on success, or a [code skip-lint]String[/code] describing the error. + + + + + + + + Fetches status entries for the subscription group identifier. The callback receives a [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] on success, or a [code skip-lint]String[/code] describing the error. + + + + + + + + Fetches the status entry for the provided transaction identifier. The callback receives a [code skip-lint]StoreSubscriptionInfoStatus[/code] when available, an empty [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] when no status is found, or a [code skip-lint]String[/code] describing the error. + On macOS, this requires macOS 15.4 or newer; earlier versions perform no action. + + + + + + The localized display name of the subscription group. Returns an empty string if unavailable. + + + The subscription group level used for upgrade/downgrade ranking. Returns [code]-1[/code] when unavailable. + + + The subscription group identifier from App Store Connect. Returns an empty string if unavailable. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml new file mode 100644 index 0000000..90d857e --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml @@ -0,0 +1,25 @@ + + + + Contains verified renewal metadata for a subscription. + + + This class wraps StoreKit renewal information and is only created from verified renewal data. + + + + + + The app account token used when purchasing, as a UUID string. Returns an empty string when not set. + + + The app transaction identifier associated with the subscription. Returns an empty string when unavailable. + + + The current product identifier for the subscription group. + + + The original transaction identifier for the subscription. Returns [code]0[/code] when unavailable. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreSubscriptionInfoStatus.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreSubscriptionInfoStatus.xml new file mode 100644 index 0000000..7f195d2 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreSubscriptionInfoStatus.xml @@ -0,0 +1,42 @@ + + + + Describes the status of a subscription in a subscription group. + + + This class wraps StoreKit's subscription status information, including renewal state, verified renewal info, and the latest verified transaction. + + + + + + Verified renewal info for the subscription, or [code]null[/code] if it is missing or unverified. + + + The current renewal state. Use the [enum RenewalState] constants. + + + The latest verified transaction for the subscription, or [code]null[/code] if it is missing or unverified. + + + + + The renewal state is unknown or not available. + + + The subscription has expired. + + + The subscription is currently active. + + + The subscription is in the billing retry period after a failed renewal. + + + The subscription is in the grace period after a failed renewal. + + + The subscription was revoked by Apple. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreTransaction.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreTransaction.xml new file mode 100644 index 0000000..aff59a8 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreTransaction.xml @@ -0,0 +1,56 @@ + + + + Represents a successful purchase transaction. + + + This class contains details about a purchase, such as the product ID, purchase date, and expiration date (for subscriptions). + + When you receive a transaction update, you must call the [method finish] method on the transaction once you have made sure + that you have delivered the content to the user. + + + + + + + + The finish method notifies the App Store that the app has successfully provided the purchased content or + activated the purchased service, allowing the transaction to be completed. + + Call [method finish] only after your app has delivered the content or enabled the service. If the purchase + includes on-demand resources, wait to finish the transaction until the download is complete or the + resources have otherwise been fully delivered. + + + + + + The date when the subscription expires, as a Unix timestamp. Returns 0 if not applicable. + + + Whether this transaction is an upgrade of another transaction. + + + The JWS (JSON Web Signature) representation of the signed transaction, suitable for server-side receipt validation (for example the App Store Server API or a third-party validator such as RevenueCat). Empty when the transaction was not constructed from a verification result. + + + The transaction identifier of the original purchase. + + + The type of ownership (e.g., "purchased", "familyShared", "unknown"). + + + The unique identifier of the purchased product. + + + The date when the purchase was made, as a Unix timestamp. + + + The date when the transaction was revoked, as a Unix timestamp. Returns 0 if not revoked. + + + The unique identifier of the transaction. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreView.xml new file mode 100644 index 0000000..fd27e2c --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/StoreView.xml @@ -0,0 +1,30 @@ + + + + A view that displays a collection of products. + + + This class represents a view that displays multiple products from the App Store. It is useful for creating a storefront or a list of available items. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the store view on top of the current view hierarchy. + + + + + + A list of product identifiers to display in the store view. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/SubscriptionOfferView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/SubscriptionOfferView.xml new file mode 100644 index 0000000..a835c49 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/SubscriptionOfferView.xml @@ -0,0 +1,44 @@ + + + + A view for redeeming subscription offers. + + + This class provides a view for users to redeem subscription offer codes. It handles the UI flow for entering and verifying offer codes. + + + + + + + + Dismisses the currently presented view. + + + + + + + Presents the offer code redemption view. note: The `callback` parameter is currently unused; use the [signal success] and [signal error] signals to handle the result. + + + + + + The title displayed on the view. + + + + + + + Emitted when the offer redemption fails. `arg1` contains the error message. + + + + + Emitted when the offer redemption is successful. + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/SubscriptionStoreView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/SubscriptionStoreView.xml new file mode 100644 index 0000000..5ae2037 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/Resources/doc_classes/SubscriptionStoreView.xml @@ -0,0 +1,59 @@ + + + + A view for displaying subscription options. + + + This class presents a standard StoreKit subscription view. It can be configured to show a specific subscription group or a list of specific products. The visual style of the controls is also customizable. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the subscription store view on top of the current view hierarchy. + + + + + + The visual style of the subscription controls. See [enum ControlStyle] for options. + + + The identifier of the subscription group to display. If set, this takes precedence over [member product_i_ds]. + + + A list of specific product identifiers to display. Ignored if [member group_id] is set. + + + + + The system automatically chooses the most appropriate style. + + + A picker style. + + + A button-based style. + + + A compact picker style. + + + A prominent picker style. + + + A paged picker style. + + + A prominent paged picker style. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/_CodeSignature/CodeResources b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/_CodeSignature/CodeResources new file mode 100644 index 0000000..cfbbede --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework/Versions/Current/_CodeSignature/CodeResources @@ -0,0 +1,282 @@ + + + + + files + + Resources/Info.plist + + a55hY0Y80uiEzgMh34WPQ7T7f9g= + + Resources/doc_classes/ProductView.xml + + 3M/6BEREzR8r51+r7zHfNSE5b/Y= + + Resources/doc_classes/StoreKitManager.xml + + bt53Uy4kbGGF9s1fmSNPavGPnpU= + + Resources/doc_classes/StoreProduct.xml + + mwGN2YBdj37NeXDdKBGxIhu6F1Q= + + Resources/doc_classes/StoreProductPaymentMode.xml + + NWY7MWtIM/XlQIVtJfnEJDg5O00= + + Resources/doc_classes/StoreProductPurchaseOption.xml + + 169Dx+ppSwA69d/5JTXMtg9Wu+4= + + Resources/doc_classes/StoreProductSubscriptionOffer.xml + + Z9WImiN8BvWcEXY3kS78lNuIHTE= + + Resources/doc_classes/StoreProductSubscriptionPeriod.xml + + 2GZh4pGspXZ6DTfBgsIvKk+rsKg= + + Resources/doc_classes/StoreSubscriptionInfo.xml + + iTUGmpMJSPm1WxCSZ1FxHoTlvg4= + + Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml + + sidHqdcp1EqWz8BWDhmiFp+4jSw= + + Resources/doc_classes/StoreSubscriptionInfoStatus.xml + + fFnkPu1YM23Oje4l/Bq14YYe5fQ= + + Resources/doc_classes/StoreTransaction.xml + + SEF4DEE7yg/NvV73/uaKoEafHJk= + + Resources/doc_classes/StoreView.xml + + 2dsu8CTBVlVg6KNiS/MuzBEJg7U= + + Resources/doc_classes/SubscriptionOfferView.xml + + b5WaOfu8qhnx5i23j63JbHk/kzE= + + Resources/doc_classes/SubscriptionStoreView.xml + + EoSh+YB8fT3oUQSc5LfSUmBXoLM= + + + files2 + + Resources/Info.plist + + hash2 + + /6j/2zcQNRzfP1sg63em4jRqPqhGSiGOpqfgQCzJeNM= + + + Resources/doc_classes/ProductView.xml + + hash2 + + 7Ddtn8pSBD+TNGRdC25Il10b5UZYYxU0grcp/IyZdlw= + + + Resources/doc_classes/StoreKitManager.xml + + hash2 + + dZ6oFf761fvgzfkz45zY9Henbznpq3PFMvr1r9WLMFE= + + + Resources/doc_classes/StoreProduct.xml + + hash2 + + TvmIFLQO8Mh1OadfUGo3MSE97h/rtQdoWXiRXkM3jQA= + + + Resources/doc_classes/StoreProductPaymentMode.xml + + hash2 + + TDqPjis6qFjJQzKCo4FJJd4fFcIJ2cIviwErHcoJ5XQ= + + + Resources/doc_classes/StoreProductPurchaseOption.xml + + hash2 + + O8BFgmvMVyqR/0rjOusvZv2FE56kO5585gj3KqoZnWU= + + + Resources/doc_classes/StoreProductSubscriptionOffer.xml + + hash2 + + C98FhDedLmFFe9gcOjar1labrLrbH9X6mFbQ8te3NBQ= + + + Resources/doc_classes/StoreProductSubscriptionPeriod.xml + + hash2 + + pDzhbm+IN3xUQ/jVbRKkxnjIOr7NeP3Q81f3T3Lp9LI= + + + Resources/doc_classes/StoreSubscriptionInfo.xml + + hash2 + + ghTYbH7kRMCHMadaJk9UZYfr3rMPvTnDDOIjFyhnzxY= + + + Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml + + hash2 + + YeI62LA698nuy18k3V+6ZfW2En4hMvG6XHx6xhD8RE8= + + + Resources/doc_classes/StoreSubscriptionInfoStatus.xml + + hash2 + + dVeYxCgV/Tuzu+G9T0DS++vSUDMcbeSvNQQTjDWc0lM= + + + Resources/doc_classes/StoreTransaction.xml + + hash2 + + 2IYnBgeGbRHqCP0R1G/IT3yiEsagfvmyGTW83kecb4w= + + + Resources/doc_classes/StoreView.xml + + hash2 + + JYaszhGFbW9nynHNO/cQYwigipk/kwgHgviYdcgJ7xY= + + + Resources/doc_classes/SubscriptionOfferView.xml + + hash2 + + 2XxnmOysDfBXDux9ZtJcLkV2Gx0SRlrvHm05mgVChVk= + + + Resources/doc_classes/SubscriptionStoreView.xml + + hash2 + + JEaDbQQ6WRP2sZn2J5jtbOYsyJyWQwRO+FXUYmoTGVA= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/Info.plist b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/Info.plist new file mode 100644 index 0000000..d71ce2a --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/Info.plist @@ -0,0 +1,44 @@ + + + + + AvailableLibraries + + + BinaryPath + GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit + LibraryIdentifier + ios-arm64 + LibraryPath + GodotApplePluginsStoreKit.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + BinaryPath + GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + GodotApplePluginsStoreKit.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64/GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64/GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit new file mode 100755 index 0000000..0b4f0de Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64/GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit differ diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64/GodotApplePluginsStoreKit.framework/Info.plist b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64/GodotApplePluginsStoreKit.framework/Info.plist new file mode 100644 index 0000000..35e8f8a Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64/GodotApplePluginsStoreKit.framework/Info.plist differ diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64/GodotApplePluginsStoreKit.framework/_CodeSignature/CodeResources b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64/GodotApplePluginsStoreKit.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..9d6d166 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64/GodotApplePluginsStoreKit.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + V8PWdxC5/1nXKwt1M5QCJgGRdjA= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit new file mode 100755 index 0000000..773a62a Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsStoreKit.framework/GodotApplePluginsStoreKit differ diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsStoreKit.framework/Info.plist b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsStoreKit.framework/Info.plist new file mode 100644 index 0000000..0913b90 Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsStoreKit.framework/Info.plist differ diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsStoreKit.framework/_CodeSignature/CodeResources b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsStoreKit.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..6d2c976 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework/ios-arm64_x86_64-simulator/GodotApplePluginsStoreKit.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + L4kon8ZV5wwiJdTfnRgX6BK3cqI= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/GodotApplePluginsStoreKit b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/GodotApplePluginsStoreKit new file mode 100755 index 0000000..731e95a --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/GodotApplePluginsStoreKit @@ -0,0 +1,5 @@ +XSym +0042 +8cedafd2db76746fc7627d87b40dbaa3 +Versions/Current/GodotApplePluginsStoreKit + \ No newline at end of file diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Resources b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Resources new file mode 100755 index 0000000..ae77f62 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Resources @@ -0,0 +1,5 @@ +XSym +0026 +e58c4cf10cc7c8ef7d7167ccb641aeb4 +Versions/Current/Resources + \ No newline at end of file diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/GodotApplePluginsStoreKit b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/GodotApplePluginsStoreKit new file mode 100755 index 0000000..d084303 Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/GodotApplePluginsStoreKit differ diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/Info.plist b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..1458b62 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 25F71 + CFBundleDevelopmentRegion + en + CFBundleExecutable + GodotApplePluginsStoreKit + CFBundleIdentifier + godotappleplugins.GodotApplePluginsStoreKit + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + GodotApplePluginsStoreKit + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 25E251 + DTPlatformName + macosx + DTPlatformVersion + 26.4 + DTSDKBuild + 25E251 + DTSDKName + macosx26.4 + DTXcode + 2641 + DTXcodeBuild + 17E202 + LSMinimumSystemVersion + 14.0 + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/ProductView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/ProductView.xml new file mode 100644 index 0000000..eb5e0ea --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/ProductView.xml @@ -0,0 +1,53 @@ + + + + A view that displays a single product from the App Store. + + + This class represents a view that displays a single product from the App Store. It allows you to configure the product to display, the style of the view, and the icon to use. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the product view on top of the current view hierarchy. + + + + + + Whether the view prefers to show the promotional icon for the product. + + + The product identifier of the product to display. + + + The style of the product view. See [enum ViewStyle] for available options. + + + The name of the system icon to use as a placeholder while the product icon loads. + + + + + The system automatically chooses the most appropriate style. + + + A compact style that displays minimal information. + + + A large style that displays more detailed information. + + + The regular style. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreKitManager.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreKitManager.xml new file mode 100644 index 0000000..cdb3d54 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreKitManager.xml @@ -0,0 +1,180 @@ + + + + Manages StoreKit interactions such as requesting products, purchasing, and restoring purchases. + + + This class handles the core StoreKit functionality. It provides methods to fetch product information from the App Store, initiate purchases, + restore previous purchases and be notified of the current status of the purchase upon startup. + + Once you instantiate this class, connect to the the [signal transaction_updated] signal to + get notification related to the status of your purchases - these are delivered to notify + your application of what products your user is entitled to at startup. If you are using + Apple's PurchaseIntent, you will also want to connect to the [signal purchase_intent]. + + The [signal transaction_updated] is only raised for verified transactions. + Apple also supports unverified transactions, those are posted to the [signal unverified_transaction_updated] signal + and in addition to the transaction they contains a status code from the [enum VerificationError]. + + After you have set up your signals, you are ready to receive those events. + + In addition, when you call the [method purchase] or [method purchase_with_options] you will + want to setup a handler for the [signal purchase_completed] signal which is raised in + response to different events during the purchasing. + + + + + + + + The current entitlements sequence provides the most recent transaction for each product the customer is entitled to, use this + to refresh the list of features the user is entitled to. + + Specifically, it includes: + + * One transaction for each non-consumable In-App Purchase + * The latest transaction for each auto-renewable subscription whose Product.SubscriptionInfo.RenewalState is either subscribed or inGracePeriod + * The latest transaction for each non-renewing subscription, including those that have ended + * Products that have been refunded or revoked by the App Store are excluded from the current entitlements, as are consumable In-App Purchases. To retrieve transactions for unfinished consumables, use the unfinished or all transaction sequences instead. + + + + + + + Initiates the purchase of a specific product, e.g. [code]purchase(product)[/code]. This will raise the + [signal purchase_completed] signal, either to indicate that an error took place, or the status of the + purchase. + + + + + + + + Initiates the purchase of a specific product, e.g. [code]purchase(product)[/code], and allows you to provide additional purchase options. + This will raise the + [signal purchase_completed] signal, either to indicate that an error took place, or the status of the + purchase. + + + + + + + Requests product information for a list of product identifiers, e.g. [code]request_products(PackedStringArray(["com.example.product1", "com.example.product2"]))[/code]. + This method will raise the [signal products_request_completed] signal when the information is retrieved. + + + + + + Restores previously purchased non-consumable products and auto-renewable subscriptions. This will raise the + [signal restore_completed] signal when the product purchased have been restored. + + + + + + + + + + + + + + Emitted when a product request completes. + [param products] is an Array of [StoreProduct]s (or nulls). + [param status] indicates success or failure. + + + + + + + + Emitted when a purchase completes. + [param transaction] is the [StoreTransaction] on success. + [param status] indicates the result (OK, cancelled, invalid product, etc.). + [param error_message] contains error details if failed. + + + + + + + + + + + + Emitted when the restore process completes. `arg1` is the [enum StoreKitStatus], and `arg2` is an error message if applicable. + + + + + + + + + + + Emitted when a transaction is updated (e.g., a subscription renews or a purchase is approved externally). `transaction` is the updated [StoreTransaction]. + + You must call the finished method on the transaction once you have made sure that you have delivered the content to the user. + + + + + + + + + + + + The operation completed successfully. + + + The product identifier is invalid. + + + The operation was cancelled. + + + The transaction could not be verified. + + + The user cancelled the operation. + + + The purchase is pending (e.g., waiting for parental approval). + + + An unknown status occurred. + + + The certificate chain was parsable, but was invalid due to one or more revoked certificates. + + + The certificate chain was parsable, but it was invalid for signing this data. + + + The device verification properties were invalid for this device. + + + Th JWS header and any data included in it or it's certificate chain had an invalid encoding. + + + The certificate chain was valid for signing this data, but the leaf's public key was invalid for the JWS signature. + + + Either the JWS header or any certificate in the chain was missing necessary properties for verification. + + + A new error code was introduced that was not previously handled. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProduct.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProduct.xml new file mode 100644 index 0000000..bcd2df4 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProduct.xml @@ -0,0 +1,34 @@ + + + + Represents a product available for purchase in the App Store. + + + This class contains information about a product, such as its ID, display name, description, and price. It is returned by [method StoreKitManager.request_products]. + + + + + + The description of the product, used for display in the UI. + + + The localized display name of the product. + + + The formatted price of the product, including the currency symbol (e.g. "$0.99"). + + + Indicates whether the product can be shared with family members. + + + A JSON debug representation of the product. + + + The price of the product in the local currency. + + + The unique identifier for the product. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductPaymentMode.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductPaymentMode.xml new file mode 100644 index 0000000..be5d378 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductPaymentMode.xml @@ -0,0 +1,35 @@ + + + + The payment modes for subscription offers that apply to a transaction. + + + + + + + + + + Returns a payment mode representing a free trial. + + + + + + Returns a payment mode where the user pays as they go (e.g. monthly for 3 months). + + + + + + Returns a payment mode where the user pays the entire amount up front. + + + + + + The localized description of the payment mode. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductPurchaseOption.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductPurchaseOption.xml new file mode 100644 index 0000000..8183011 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductPurchaseOption.xml @@ -0,0 +1,48 @@ + + + + Represents an option that can be supplied when purchasing a [StoreProduct]. + + + You create instances of this class and you can pass those to [method StoreKitManager.purchase_with_options]. + + + + + + + + + Creates a purchase option with an app account token. This token should be a UUID string that associates the transaction with a user account on your service. + + + + + + + Creates a purchase option with a specific introductory offer eligibility. This requires the signed JWS string from the App Store. + + + + + + + Creates a purchase option specifying the quantity of the product to purchase. + + + + + + + Creates a purchase option to simulate the "Ask to Buy" flow in the sandbox environment. + + + + + + + Creates a purchase option for a win-back offer. + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionOffer.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionOffer.xml new file mode 100644 index 0000000..87a0330 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionOffer.xml @@ -0,0 +1,25 @@ + + + + Represents a subscription offer for a [StoreProduct]. + + + You configure these in AppStore Connect. See [url=https://developer.apple.com/documentation/storekit/product/subscriptionoffer]Apple's documentation[/url] for additional information + + + + + + An introductory offer for new subscribers. + + + A promotional offer for existing or lapsed subscribers. + + + A win-back offer for lapsed subscribers. + + + An unknown offer type. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionPeriod.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionPeriod.xml new file mode 100644 index 0000000..57566bc --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreProductSubscriptionPeriod.xml @@ -0,0 +1,24 @@ + + + + Values that represent the duration of time between subscription renewals. + + + + + + + + A subscription period of one day. + + + A subscription period of one month. + + + A subscription period of one week. + + + A subscription period of one year. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfo.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfo.xml new file mode 100644 index 0000000..574555f --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfo.xml @@ -0,0 +1,49 @@ + + + + Provides subscription group metadata and status queries. + + + This class wraps StoreKit subscription information and exposes the subscription group metadata for a product. + Use the status methods to query the current subscription status for a product, subscription group, or transaction ID. + + + + + + + + + Fetches the current status entries for this subscription. The callback receives a [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] on success, or a [code skip-lint]String[/code] describing the error. + + + + + + + + Fetches status entries for the subscription group identifier. The callback receives a [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] on success, or a [code skip-lint]String[/code] describing the error. + + + + + + + + Fetches the status entry for the provided transaction identifier. The callback receives a [code skip-lint]StoreSubscriptionInfoStatus[/code] when available, an empty [code skip-lint]Array[StoreSubscriptionInfoStatus][/code] when no status is found, or a [code skip-lint]String[/code] describing the error. + On macOS, this requires macOS 15.4 or newer; earlier versions perform no action. + + + + + + The localized display name of the subscription group. Returns an empty string if unavailable. + + + The subscription group level used for upgrade/downgrade ranking. Returns [code]-1[/code] when unavailable. + + + The subscription group identifier from App Store Connect. Returns an empty string if unavailable. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml new file mode 100644 index 0000000..90d857e --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml @@ -0,0 +1,25 @@ + + + + Contains verified renewal metadata for a subscription. + + + This class wraps StoreKit renewal information and is only created from verified renewal data. + + + + + + The app account token used when purchasing, as a UUID string. Returns an empty string when not set. + + + The app transaction identifier associated with the subscription. Returns an empty string when unavailable. + + + The current product identifier for the subscription group. + + + The original transaction identifier for the subscription. Returns [code]0[/code] when unavailable. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoStatus.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoStatus.xml new file mode 100644 index 0000000..7f195d2 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreSubscriptionInfoStatus.xml @@ -0,0 +1,42 @@ + + + + Describes the status of a subscription in a subscription group. + + + This class wraps StoreKit's subscription status information, including renewal state, verified renewal info, and the latest verified transaction. + + + + + + Verified renewal info for the subscription, or [code]null[/code] if it is missing or unverified. + + + The current renewal state. Use the [enum RenewalState] constants. + + + The latest verified transaction for the subscription, or [code]null[/code] if it is missing or unverified. + + + + + The renewal state is unknown or not available. + + + The subscription has expired. + + + The subscription is currently active. + + + The subscription is in the billing retry period after a failed renewal. + + + The subscription is in the grace period after a failed renewal. + + + The subscription was revoked by Apple. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreTransaction.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreTransaction.xml new file mode 100644 index 0000000..aff59a8 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreTransaction.xml @@ -0,0 +1,56 @@ + + + + Represents a successful purchase transaction. + + + This class contains details about a purchase, such as the product ID, purchase date, and expiration date (for subscriptions). + + When you receive a transaction update, you must call the [method finish] method on the transaction once you have made sure + that you have delivered the content to the user. + + + + + + + + The finish method notifies the App Store that the app has successfully provided the purchased content or + activated the purchased service, allowing the transaction to be completed. + + Call [method finish] only after your app has delivered the content or enabled the service. If the purchase + includes on-demand resources, wait to finish the transaction until the download is complete or the + resources have otherwise been fully delivered. + + + + + + The date when the subscription expires, as a Unix timestamp. Returns 0 if not applicable. + + + Whether this transaction is an upgrade of another transaction. + + + The JWS (JSON Web Signature) representation of the signed transaction, suitable for server-side receipt validation (for example the App Store Server API or a third-party validator such as RevenueCat). Empty when the transaction was not constructed from a verification result. + + + The transaction identifier of the original purchase. + + + The type of ownership (e.g., "purchased", "familyShared", "unknown"). + + + The unique identifier of the purchased product. + + + The date when the purchase was made, as a Unix timestamp. + + + The date when the transaction was revoked, as a Unix timestamp. Returns 0 if not revoked. + + + The unique identifier of the transaction. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreView.xml new file mode 100644 index 0000000..fd27e2c --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/StoreView.xml @@ -0,0 +1,30 @@ + + + + A view that displays a collection of products. + + + This class represents a view that displays multiple products from the App Store. It is useful for creating a storefront or a list of available items. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the store view on top of the current view hierarchy. + + + + + + A list of product identifiers to display in the store view. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/SubscriptionOfferView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/SubscriptionOfferView.xml new file mode 100644 index 0000000..a835c49 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/SubscriptionOfferView.xml @@ -0,0 +1,44 @@ + + + + A view for redeeming subscription offers. + + + This class provides a view for users to redeem subscription offer codes. It handles the UI flow for entering and verifying offer codes. + + + + + + + + Dismisses the currently presented view. + + + + + + + Presents the offer code redemption view. note: The `callback` parameter is currently unused; use the [signal success] and [signal error] signals to handle the result. + + + + + + The title displayed on the view. + + + + + + + Emitted when the offer redemption fails. `arg1` contains the error message. + + + + + Emitted when the offer redemption is successful. + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/SubscriptionStoreView.xml b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/SubscriptionStoreView.xml new file mode 100644 index 0000000..5ae2037 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/Resources/doc_classes/SubscriptionStoreView.xml @@ -0,0 +1,59 @@ + + + + A view for displaying subscription options. + + + This class presents a standard StoreKit subscription view. It can be configured to show a specific subscription group or a list of specific products. The visual style of the controls is also customizable. + + + + + + + + Dismisses the currently presented view. + + + + + + Presents the subscription store view on top of the current view hierarchy. + + + + + + The visual style of the subscription controls. See [enum ControlStyle] for options. + + + The identifier of the subscription group to display. If set, this takes precedence over [member product_i_ds]. + + + A list of specific product identifiers to display. Ignored if [member group_id] is set. + + + + + The system automatically chooses the most appropriate style. + + + A picker style. + + + A button-based style. + + + A compact picker style. + + + A prominent picker style. + + + A paged picker style. + + + A prominent paged picker style. + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/_CodeSignature/CodeResources b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/_CodeSignature/CodeResources new file mode 100644 index 0000000..cfbbede --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/A/_CodeSignature/CodeResources @@ -0,0 +1,282 @@ + + + + + files + + Resources/Info.plist + + a55hY0Y80uiEzgMh34WPQ7T7f9g= + + Resources/doc_classes/ProductView.xml + + 3M/6BEREzR8r51+r7zHfNSE5b/Y= + + Resources/doc_classes/StoreKitManager.xml + + bt53Uy4kbGGF9s1fmSNPavGPnpU= + + Resources/doc_classes/StoreProduct.xml + + mwGN2YBdj37NeXDdKBGxIhu6F1Q= + + Resources/doc_classes/StoreProductPaymentMode.xml + + NWY7MWtIM/XlQIVtJfnEJDg5O00= + + Resources/doc_classes/StoreProductPurchaseOption.xml + + 169Dx+ppSwA69d/5JTXMtg9Wu+4= + + Resources/doc_classes/StoreProductSubscriptionOffer.xml + + Z9WImiN8BvWcEXY3kS78lNuIHTE= + + Resources/doc_classes/StoreProductSubscriptionPeriod.xml + + 2GZh4pGspXZ6DTfBgsIvKk+rsKg= + + Resources/doc_classes/StoreSubscriptionInfo.xml + + iTUGmpMJSPm1WxCSZ1FxHoTlvg4= + + Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml + + sidHqdcp1EqWz8BWDhmiFp+4jSw= + + Resources/doc_classes/StoreSubscriptionInfoStatus.xml + + fFnkPu1YM23Oje4l/Bq14YYe5fQ= + + Resources/doc_classes/StoreTransaction.xml + + SEF4DEE7yg/NvV73/uaKoEafHJk= + + Resources/doc_classes/StoreView.xml + + 2dsu8CTBVlVg6KNiS/MuzBEJg7U= + + Resources/doc_classes/SubscriptionOfferView.xml + + b5WaOfu8qhnx5i23j63JbHk/kzE= + + Resources/doc_classes/SubscriptionStoreView.xml + + EoSh+YB8fT3oUQSc5LfSUmBXoLM= + + + files2 + + Resources/Info.plist + + hash2 + + /6j/2zcQNRzfP1sg63em4jRqPqhGSiGOpqfgQCzJeNM= + + + Resources/doc_classes/ProductView.xml + + hash2 + + 7Ddtn8pSBD+TNGRdC25Il10b5UZYYxU0grcp/IyZdlw= + + + Resources/doc_classes/StoreKitManager.xml + + hash2 + + dZ6oFf761fvgzfkz45zY9Henbznpq3PFMvr1r9WLMFE= + + + Resources/doc_classes/StoreProduct.xml + + hash2 + + TvmIFLQO8Mh1OadfUGo3MSE97h/rtQdoWXiRXkM3jQA= + + + Resources/doc_classes/StoreProductPaymentMode.xml + + hash2 + + TDqPjis6qFjJQzKCo4FJJd4fFcIJ2cIviwErHcoJ5XQ= + + + Resources/doc_classes/StoreProductPurchaseOption.xml + + hash2 + + O8BFgmvMVyqR/0rjOusvZv2FE56kO5585gj3KqoZnWU= + + + Resources/doc_classes/StoreProductSubscriptionOffer.xml + + hash2 + + C98FhDedLmFFe9gcOjar1labrLrbH9X6mFbQ8te3NBQ= + + + Resources/doc_classes/StoreProductSubscriptionPeriod.xml + + hash2 + + pDzhbm+IN3xUQ/jVbRKkxnjIOr7NeP3Q81f3T3Lp9LI= + + + Resources/doc_classes/StoreSubscriptionInfo.xml + + hash2 + + ghTYbH7kRMCHMadaJk9UZYfr3rMPvTnDDOIjFyhnzxY= + + + Resources/doc_classes/StoreSubscriptionInfoRenewalInfo.xml + + hash2 + + YeI62LA698nuy18k3V+6ZfW2En4hMvG6XHx6xhD8RE8= + + + Resources/doc_classes/StoreSubscriptionInfoStatus.xml + + hash2 + + dVeYxCgV/Tuzu+G9T0DS++vSUDMcbeSvNQQTjDWc0lM= + + + Resources/doc_classes/StoreTransaction.xml + + hash2 + + 2IYnBgeGbRHqCP0R1G/IT3yiEsagfvmyGTW83kecb4w= + + + Resources/doc_classes/StoreView.xml + + hash2 + + JYaszhGFbW9nynHNO/cQYwigipk/kwgHgviYdcgJ7xY= + + + Resources/doc_classes/SubscriptionOfferView.xml + + hash2 + + 2XxnmOysDfBXDux9ZtJcLkV2Gx0SRlrvHm05mgVChVk= + + + Resources/doc_classes/SubscriptionStoreView.xml + + hash2 + + JEaDbQQ6WRP2sZn2J5jtbOYsyJyWQwRO+FXUYmoTGVA= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/Current b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/Current new file mode 100755 index 0000000..18ca124 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework/Versions/Current @@ -0,0 +1,5 @@ +XSym +0001 +7fc56270e7a70fa81a5935b72eacbe29 +A + \ No newline at end of file diff --git a/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.linux.arm64.so b/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.linux.arm64.so new file mode 100644 index 0000000..5c14876 Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.linux.arm64.so differ diff --git a/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.linux.x86_64.so b/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.linux.x86_64.so new file mode 100644 index 0000000..b8a924e Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.linux.x86_64.so differ diff --git a/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.windows.arm64.dll b/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.windows.arm64.dll new file mode 100644 index 0000000..3d16282 Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.windows.arm64.dll differ diff --git a/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.windows.x86_64.dll b/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.windows.x86_64.dll new file mode 100644 index 0000000..383a2de Binary files /dev/null and b/addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.windows.x86_64.dll differ diff --git a/addons/GodotApplePluginsStoreKit/godot_apple_plugins_storekit.gdextension b/addons/GodotApplePluginsStoreKit/godot_apple_plugins_storekit.gdextension new file mode 100644 index 0000000..ec3eb01 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/godot_apple_plugins_storekit.gdextension @@ -0,0 +1,18 @@ +[configuration] + +entry_symbol = "godot_apple_plugins_storekit_start" +compatibility_minimum = 4.2 + +[libraries] +ios = "res://addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.xcframework" +linux.arm64 = "res://addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.linux.arm64.so" +linux.x86_64 = "res://addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.linux.x86_64.so" +macos.arm64 = "res://addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit.framework" +macos.x86_64 = "res://addons/GodotApplePluginsStoreKit/bin/GodotApplePluginsStoreKit_x64.framework" +windows.arm64 = "res://addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.windows.arm64.dll" +windows.x86_64 = "res://addons/GodotApplePluginsStoreKit/bin/godot_apple_plugins_storekit_stub.windows.x86_64.dll" + +[dependencies] +ios = { "res://addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.xcframework": "" } +macos.arm64 = { "res://addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime.framework": "" } +macos.x86_64 = { "res://addons/GodotApplePluginsRuntime/bin/SwiftGodotRuntime_x64.framework": "" } diff --git a/addons/GodotApplePluginsStoreKit/godot_apple_plugins_storekit.gdextension.uid b/addons/GodotApplePluginsStoreKit/godot_apple_plugins_storekit.gdextension.uid new file mode 100644 index 0000000..3e9f668 --- /dev/null +++ b/addons/GodotApplePluginsStoreKit/godot_apple_plugins_storekit.gdextension.uid @@ -0,0 +1 @@ +uid://bdk4tefhew8xb diff --git a/addons/stepcounter/export_plugin.gd b/addons/stepcounter/export_plugin.gd new file mode 100644 index 0000000..4f03323 --- /dev/null +++ b/addons/stepcounter/export_plugin.gd @@ -0,0 +1,25 @@ +@tool +extends EditorExportPlugin +## Android export'unda StepCounter AAR'ını ve izinleri ekler. + +const PLUGIN_NAME := "StepCounter" +# Derlenmiş AAR buraya kopyalanmalı (native/stepcounter-android/build çıktısı) +const AAR_PATH := "res://addons/stepcounter/stepcounter-release.aar" + +func _supports_platform(platform: EditorExportPlatform) -> bool: + return platform is EditorExportPlatformAndroid + +func _get_android_libraries(platform: EditorExportPlatform, debug: bool) -> PackedStringArray: + return PackedStringArray([AAR_PATH]) + +func _get_android_dependencies(platform: EditorExportPlatform, debug: bool) -> PackedStringArray: + return PackedStringArray(["org.jetbrains.kotlin:kotlin-stdlib:2.1.0"]) + +func _get_android_manifest_element_contents(platform: EditorExportPlatform, debug: bool) -> String: + return """ + + + """ + +func _get_name() -> String: + return PLUGIN_NAME diff --git a/addons/stepcounter/export_plugin.gd.uid b/addons/stepcounter/export_plugin.gd.uid new file mode 100644 index 0000000..ad88977 --- /dev/null +++ b/addons/stepcounter/export_plugin.gd.uid @@ -0,0 +1 @@ +uid://dbplx5scln6x8 diff --git a/addons/stepcounter/plugin.cfg b/addons/stepcounter/plugin.cfg new file mode 100644 index 0000000..4de6a7b --- /dev/null +++ b/addons/stepcounter/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="StepCounter" +description="Android adım sayar (TYPE_STEP_COUNTER) Godot eklentisi" +author="Stepstead" +version="1.0.0" +script="stepcounter.gd" diff --git a/addons/stepcounter/stepcounter.gd b/addons/stepcounter/stepcounter.gd new file mode 100644 index 0000000..6e11d89 --- /dev/null +++ b/addons/stepcounter/stepcounter.gd @@ -0,0 +1,13 @@ +@tool +extends EditorPlugin +## StepCounter Android eklentisini export'a kaydeder. + +var _export_plugin: EditorExportPlugin + +func _enter_tree() -> void: + _export_plugin = preload("res://addons/stepcounter/export_plugin.gd").new() + add_export_plugin(_export_plugin) + +func _exit_tree() -> void: + remove_export_plugin(_export_plugin) + _export_plugin = null diff --git a/addons/stepcounter/stepcounter.gd.uid b/addons/stepcounter/stepcounter.gd.uid new file mode 100644 index 0000000..d25d489 --- /dev/null +++ b/addons/stepcounter/stepcounter.gd.uid @@ -0,0 +1 @@ +uid://ccvwkrmtxhcpd diff --git a/assets/Gemini_Generated_Image_il57l9il57l9il57.png b/assets/Gemini_Generated_Image_il57l9il57l9il57.png new file mode 100644 index 0000000..61246d4 Binary files /dev/null and b/assets/Gemini_Generated_Image_il57l9il57l9il57.png differ diff --git a/assets/Gemini_Generated_Image_il57l9il57l9il57.png.import b/assets/Gemini_Generated_Image_il57l9il57l9il57.png.import new file mode 100644 index 0000000..49aa3a7 --- /dev/null +++ b/assets/Gemini_Generated_Image_il57l9il57l9il57.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bc4ic176ip724" +path="res://.godot/imported/Gemini_Generated_Image_il57l9il57l9il57.png-6729d11757cd4fc5f0265ee7b852b587.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/Gemini_Generated_Image_il57l9il57l9il57.png" +dest_files=["res://.godot/imported/Gemini_Generated_Image_il57l9il57l9il57.png-6729d11757cd4fc5f0265ee7b852b587.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/events/haydut_pususu.webp b/assets/events/haydut_pususu.webp new file mode 100644 index 0000000..5e188d1 Binary files /dev/null and b/assets/events/haydut_pususu.webp differ diff --git a/assets/events/haydut_pususu.webp.import b/assets/events/haydut_pususu.webp.import new file mode 100644 index 0000000..c497a63 --- /dev/null +++ b/assets/events/haydut_pususu.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d22rj77notxya" +path="res://.godot/imported/haydut_pususu.webp-dbfae365b7f0fbba4e25ece3d813d313.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/events/haydut_pususu.webp" +dest_files=["res://.godot/imported/haydut_pususu.webp-dbfae365b7f0fbba4e25ece3d813d313.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/events/kayip_sandik.webp b/assets/events/kayip_sandik.webp new file mode 100644 index 0000000..a2220b8 Binary files /dev/null and b/assets/events/kayip_sandik.webp differ diff --git a/assets/events/kayip_sandik.webp.import b/assets/events/kayip_sandik.webp.import new file mode 100644 index 0000000..89d800c --- /dev/null +++ b/assets/events/kayip_sandik.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtv3ri2rhb6py" +path="res://.godot/imported/kayip_sandik.webp-3fa1ef6c42bd0166f87d8385c20927e2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/events/kayip_sandik.webp" +dest_files=["res://.godot/imported/kayip_sandik.webp-3fa1ef6c42bd0166f87d8385c20927e2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/events/yarali_gezgin.webp b/assets/events/yarali_gezgin.webp new file mode 100644 index 0000000..9ae6ee5 Binary files /dev/null and b/assets/events/yarali_gezgin.webp differ diff --git a/assets/events/yarali_gezgin.webp.import b/assets/events/yarali_gezgin.webp.import new file mode 100644 index 0000000..35a8346 --- /dev/null +++ b/assets/events/yarali_gezgin.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cj7h4rdvg3m5p" +path="res://.godot/imported/yarali_gezgin.webp-5a08b60a39e21e355f65a770bf092c74.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/events/yarali_gezgin.webp" +dest_files=["res://.godot/imported/yarali_gezgin.webp-5a08b60a39e21e355f65a770bf092c74.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/eşyalar.png b/assets/eşyalar.png new file mode 100644 index 0000000..3604487 Binary files /dev/null and b/assets/eşyalar.png differ diff --git a/assets/eşyalar.png.import b/assets/eşyalar.png.import new file mode 100644 index 0000000..fa28e01 --- /dev/null +++ b/assets/eşyalar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://biy5tnisx2ws1" +path="res://.godot/imported/eşyalar.png-08e1e394e0b02ac0b54a6c531561df00.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/eşyalar.png" +dest_files=["res://.godot/imported/eşyalar.png-08e1e394e0b02ac0b54a6c531561df00.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/fonts/eşyalaryeni.png b/assets/fonts/eşyalaryeni.png new file mode 100644 index 0000000..07572b8 Binary files /dev/null and b/assets/fonts/eşyalaryeni.png differ diff --git a/assets/fonts/eşyalaryeni.png.import b/assets/fonts/eşyalaryeni.png.import new file mode 100644 index 0000000..7294d08 --- /dev/null +++ b/assets/fonts/eşyalaryeni.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5mt5ebhw5fkx" +path="res://.godot/imported/eşyalaryeni.png-213c45e533430e7f817693551f782035.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/fonts/eşyalaryeni.png" +dest_files=["res://.godot/imported/eşyalaryeni.png-213c45e533430e7f817693551f782035.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/akca_koru.webp b/assets/locations/akca_koru.webp new file mode 100644 index 0000000..014ab13 Binary files /dev/null and b/assets/locations/akca_koru.webp differ diff --git a/assets/locations/akca_koru.webp.import b/assets/locations/akca_koru.webp.import new file mode 100644 index 0000000..28d3743 --- /dev/null +++ b/assets/locations/akca_koru.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dm1mdddk3xr0e" +path="res://.godot/imported/akca_koru.webp-82ca481674464e502bc9b8f381a3a494.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/akca_koru.webp" +dest_files=["res://.godot/imported/akca_koru.webp-82ca481674464e502bc9b8f381a3a494.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/av_topraklari.webp b/assets/locations/av_topraklari.webp new file mode 100644 index 0000000..bdb1a89 Binary files /dev/null and b/assets/locations/av_topraklari.webp differ diff --git a/assets/locations/av_topraklari.webp.import b/assets/locations/av_topraklari.webp.import new file mode 100644 index 0000000..e454bcc --- /dev/null +++ b/assets/locations/av_topraklari.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://788tqenktam4" +path="res://.godot/imported/av_topraklari.webp-30d8de443d33b60cd7598e62a1ff9c94.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/av_topraklari.webp" +dest_files=["res://.godot/imported/av_topraklari.webp-30d8de443d33b60cd7598e62a1ff9c94.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/aynali_gol.webp b/assets/locations/aynali_gol.webp new file mode 100644 index 0000000..9e77b8e Binary files /dev/null and b/assets/locations/aynali_gol.webp differ diff --git a/assets/locations/aynali_gol.webp.import b/assets/locations/aynali_gol.webp.import new file mode 100644 index 0000000..ccd8c82 --- /dev/null +++ b/assets/locations/aynali_gol.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6bvwv8qo2s5v" +path="res://.godot/imported/aynali_gol.webp-b46b50096cc15f31c5faa515fbcde202.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/aynali_gol.webp" +dest_files=["res://.godot/imported/aynali_gol.webp-b46b50096cc15f31c5faa515fbcde202.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/cayirlar.webp b/assets/locations/cayirlar.webp new file mode 100644 index 0000000..356c427 Binary files /dev/null and b/assets/locations/cayirlar.webp differ diff --git a/assets/locations/cayirlar.webp.import b/assets/locations/cayirlar.webp.import new file mode 100644 index 0000000..daec293 --- /dev/null +++ b/assets/locations/cayirlar.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3u0jghd6crxj" +path="res://.godot/imported/cayirlar.webp-065b7f72d0e5051016cf56009a305a28.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/cayirlar.webp" +dest_files=["res://.godot/imported/cayirlar.webp-065b7f72d0e5051016cf56009a305a28.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/derin_maden.webp b/assets/locations/derin_maden.webp new file mode 100644 index 0000000..51c5133 Binary files /dev/null and b/assets/locations/derin_maden.webp differ diff --git a/assets/locations/derin_maden.webp.import b/assets/locations/derin_maden.webp.import new file mode 100644 index 0000000..9556f61 --- /dev/null +++ b/assets/locations/derin_maden.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmwbd5sy21h86" +path="res://.godot/imported/derin_maden.webp-d3dfe54a56d64350f92b8ebce738f459.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/derin_maden.webp" +dest_files=["res://.godot/imported/derin_maden.webp-d3dfe54a56d64350f92b8ebce738f459.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/ejder_dagi.webp b/assets/locations/ejder_dagi.webp new file mode 100644 index 0000000..5366d34 Binary files /dev/null and b/assets/locations/ejder_dagi.webp differ diff --git a/assets/locations/ejder_dagi.webp.import b/assets/locations/ejder_dagi.webp.import new file mode 100644 index 0000000..c1e3bc2 --- /dev/null +++ b/assets/locations/ejder_dagi.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://df7ephtgrjnay" +path="res://.godot/imported/ejder_dagi.webp-6fd8e14d9221ad43cee26ae4b98aab94.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/ejder_dagi.webp" +dest_files=["res://.godot/imported/ejder_dagi.webp-6fd8e14d9221ad43cee26ae4b98aab94.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/firtina_kiyisi.webp b/assets/locations/firtina_kiyisi.webp new file mode 100644 index 0000000..83edeb5 Binary files /dev/null and b/assets/locations/firtina_kiyisi.webp differ diff --git a/assets/locations/firtina_kiyisi.webp.import b/assets/locations/firtina_kiyisi.webp.import new file mode 100644 index 0000000..4d365b3 --- /dev/null +++ b/assets/locations/firtina_kiyisi.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djjymhrfdp1nb" +path="res://.godot/imported/firtina_kiyisi.webp-d334048a72c8d2eff658e3bf781cec41.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/firtina_kiyisi.webp" +dest_files=["res://.godot/imported/firtina_kiyisi.webp-d334048a72c8d2eff658e3bf781cec41.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/fisilti_ormani.webp b/assets/locations/fisilti_ormani.webp new file mode 100644 index 0000000..dc22eb1 Binary files /dev/null and b/assets/locations/fisilti_ormani.webp differ diff --git a/assets/locations/fisilti_ormani.webp.import b/assets/locations/fisilti_ormani.webp.import new file mode 100644 index 0000000..883e359 --- /dev/null +++ b/assets/locations/fisilti_ormani.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://but1q5ntk3a1d" +path="res://.godot/imported/fisilti_ormani.webp-645d321c91c94f5c5cf4abb9b2a460a3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/fisilti_ormani.webp" +dest_files=["res://.godot/imported/fisilti_ormani.webp-645d321c91c94f5c5cf4abb9b2a460a3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/gumus_camlik.webp b/assets/locations/gumus_camlik.webp new file mode 100644 index 0000000..4851c8c Binary files /dev/null and b/assets/locations/gumus_camlik.webp differ diff --git a/assets/locations/gumus_camlik.webp.import b/assets/locations/gumus_camlik.webp.import new file mode 100644 index 0000000..eb286b8 --- /dev/null +++ b/assets/locations/gumus_camlik.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8ai6olk8k4fu" +path="res://.godot/imported/gumus_camlik.webp-a0f7c01574aaa236e052eb186d4ded02.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/gumus_camlik.webp" +dest_files=["res://.godot/imported/gumus_camlik.webp-a0f7c01574aaa236e052eb186d4ded02.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/kadim_orman.webp b/assets/locations/kadim_orman.webp new file mode 100644 index 0000000..407da71 Binary files /dev/null and b/assets/locations/kadim_orman.webp differ diff --git a/assets/locations/kadim_orman.webp.import b/assets/locations/kadim_orman.webp.import new file mode 100644 index 0000000..6fb469e --- /dev/null +++ b/assets/locations/kadim_orman.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://owd7efirs86o" +path="res://.godot/imported/kadim_orman.webp-189089e6f1f0686872ff91933bc33a35.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/kadim_orman.webp" +dest_files=["res://.godot/imported/kadim_orman.webp-189089e6f1f0686872ff91933bc33a35.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/karanlik_orman.webp b/assets/locations/karanlik_orman.webp new file mode 100644 index 0000000..2cb6d0f Binary files /dev/null and b/assets/locations/karanlik_orman.webp differ diff --git a/assets/locations/karanlik_orman.webp.import b/assets/locations/karanlik_orman.webp.import new file mode 100644 index 0000000..4d0fa51 --- /dev/null +++ b/assets/locations/karanlik_orman.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://2yr5tfhj78vx" +path="res://.godot/imported/karanlik_orman.webp-db603e5fa3d2e6b91f08365e60eabe27.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/karanlik_orman.webp" +dest_files=["res://.godot/imported/karanlik_orman.webp-db603e5fa3d2e6b91f08365e60eabe27.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/koy.webp b/assets/locations/koy.webp new file mode 100644 index 0000000..d01fca9 Binary files /dev/null and b/assets/locations/koy.webp differ diff --git a/assets/locations/koy.webp.import b/assets/locations/koy.webp.import new file mode 100644 index 0000000..13d833e --- /dev/null +++ b/assets/locations/koy.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwl8cqejlf2pp" +path="res://.godot/imported/koy.webp-d7d9ef326a60aacf3d8a2ddaad1ba554.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/koy.webp" +dest_files=["res://.godot/imported/koy.webp-d7d9ef326a60aacf3d8a2ddaad1ba554.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/liman.webp b/assets/locations/liman.webp new file mode 100644 index 0000000..25827cb Binary files /dev/null and b/assets/locations/liman.webp differ diff --git a/assets/locations/liman.webp.import b/assets/locations/liman.webp.import new file mode 100644 index 0000000..a3d0503 --- /dev/null +++ b/assets/locations/liman.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bnn05q7ax2kxs" +path="res://.godot/imported/liman.webp-bc89e23936ff793fcc806e0a8d512fe8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/liman.webp" +dest_files=["res://.godot/imported/liman.webp-bc89e23936ff793fcc806e0a8d512fe8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/pazar.webp b/assets/locations/pazar.webp new file mode 100644 index 0000000..3dac863 Binary files /dev/null and b/assets/locations/pazar.webp differ diff --git a/assets/locations/pazar.webp.import b/assets/locations/pazar.webp.import new file mode 100644 index 0000000..dfc725e --- /dev/null +++ b/assets/locations/pazar.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://k7k3u2dgfxhb" +path="res://.godot/imported/pazar.webp-f6428d19c9af9275cfd3a34d541273ac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/pazar.webp" +dest_files=["res://.godot/imported/pazar.webp-f6428d19c9af9275cfd3a34d541273ac.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/locations/tas_ocagi.webp b/assets/locations/tas_ocagi.webp new file mode 100644 index 0000000..bded6ce Binary files /dev/null and b/assets/locations/tas_ocagi.webp differ diff --git a/assets/locations/tas_ocagi.webp.import b/assets/locations/tas_ocagi.webp.import new file mode 100644 index 0000000..40a84e7 --- /dev/null +++ b/assets/locations/tas_ocagi.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4riv75bvh23e" +path="res://.godot/imported/tas_ocagi.webp-fed57d781dd21cb558e6e2efcb38e75e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/locations/tas_ocagi.webp" +dest_files=["res://.godot/imported/tas_ocagi.webp-fed57d781dd21cb558e6e2efcb38e75e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/akca_koru.webp b/assets/pins/akca_koru.webp new file mode 100644 index 0000000..2f0e7eb Binary files /dev/null and b/assets/pins/akca_koru.webp differ diff --git a/assets/pins/akca_koru.webp.import b/assets/pins/akca_koru.webp.import new file mode 100644 index 0000000..81ff854 --- /dev/null +++ b/assets/pins/akca_koru.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rsx2unv18wqi" +path="res://.godot/imported/akca_koru.webp-4f85188beedf17f744d6f24f980fdac0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/akca_koru.webp" +dest_files=["res://.godot/imported/akca_koru.webp-4f85188beedf17f744d6f24f980fdac0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/av_topraklari.webp b/assets/pins/av_topraklari.webp new file mode 100644 index 0000000..3e29e70 Binary files /dev/null and b/assets/pins/av_topraklari.webp differ diff --git a/assets/pins/av_topraklari.webp.import b/assets/pins/av_topraklari.webp.import new file mode 100644 index 0000000..4b650f2 --- /dev/null +++ b/assets/pins/av_topraklari.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0dha52r02b8a" +path="res://.godot/imported/av_topraklari.webp-698cd2049704f7af6722955f97b3638d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/av_topraklari.webp" +dest_files=["res://.godot/imported/av_topraklari.webp-698cd2049704f7af6722955f97b3638d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/aynali_gol.webp b/assets/pins/aynali_gol.webp new file mode 100644 index 0000000..bd94b4f Binary files /dev/null and b/assets/pins/aynali_gol.webp differ diff --git a/assets/pins/aynali_gol.webp.import b/assets/pins/aynali_gol.webp.import new file mode 100644 index 0000000..fa036ff --- /dev/null +++ b/assets/pins/aynali_gol.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dn12681rujmnd" +path="res://.godot/imported/aynali_gol.webp-1912b78603e7957d3158bf6bbda98cb0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/aynali_gol.webp" +dest_files=["res://.godot/imported/aynali_gol.webp-1912b78603e7957d3158bf6bbda98cb0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/cayirlar.webp b/assets/pins/cayirlar.webp new file mode 100644 index 0000000..bd5d9b4 Binary files /dev/null and b/assets/pins/cayirlar.webp differ diff --git a/assets/pins/cayirlar.webp.import b/assets/pins/cayirlar.webp.import new file mode 100644 index 0000000..e700151 --- /dev/null +++ b/assets/pins/cayirlar.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://oepptxj33dhv" +path="res://.godot/imported/cayirlar.webp-60c746b2f5863064279a968b1308ae14.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/cayirlar.webp" +dest_files=["res://.godot/imported/cayirlar.webp-60c746b2f5863064279a968b1308ae14.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/derin_maden.webp b/assets/pins/derin_maden.webp new file mode 100644 index 0000000..7917985 Binary files /dev/null and b/assets/pins/derin_maden.webp differ diff --git a/assets/pins/derin_maden.webp.import b/assets/pins/derin_maden.webp.import new file mode 100644 index 0000000..887688b --- /dev/null +++ b/assets/pins/derin_maden.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chv7b7lo5hmaq" +path="res://.godot/imported/derin_maden.webp-c50aa8d2a3692ff18063994ae761b053.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/derin_maden.webp" +dest_files=["res://.godot/imported/derin_maden.webp-c50aa8d2a3692ff18063994ae761b053.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/ejder_dagi.webp b/assets/pins/ejder_dagi.webp new file mode 100644 index 0000000..6788ff0 Binary files /dev/null and b/assets/pins/ejder_dagi.webp differ diff --git a/assets/pins/ejder_dagi.webp.import b/assets/pins/ejder_dagi.webp.import new file mode 100644 index 0000000..22f2559 --- /dev/null +++ b/assets/pins/ejder_dagi.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cpga8fahoyxqo" +path="res://.godot/imported/ejder_dagi.webp-83256afc3e33ab4ea1d5a1ce59fe3a7a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/ejder_dagi.webp" +dest_files=["res://.godot/imported/ejder_dagi.webp-83256afc3e33ab4ea1d5a1ce59fe3a7a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/firtina_kiyisi.webp b/assets/pins/firtina_kiyisi.webp new file mode 100644 index 0000000..8550609 Binary files /dev/null and b/assets/pins/firtina_kiyisi.webp differ diff --git a/assets/pins/firtina_kiyisi.webp.import b/assets/pins/firtina_kiyisi.webp.import new file mode 100644 index 0000000..6a4aae7 --- /dev/null +++ b/assets/pins/firtina_kiyisi.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpysrtc5s6fwk" +path="res://.godot/imported/firtina_kiyisi.webp-a13a68d011e1d87ba45a3e9e9b9dc14b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/firtina_kiyisi.webp" +dest_files=["res://.godot/imported/firtina_kiyisi.webp-a13a68d011e1d87ba45a3e9e9b9dc14b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/fisilti_ormani.webp b/assets/pins/fisilti_ormani.webp new file mode 100644 index 0000000..3f26d03 Binary files /dev/null and b/assets/pins/fisilti_ormani.webp differ diff --git a/assets/pins/fisilti_ormani.webp.import b/assets/pins/fisilti_ormani.webp.import new file mode 100644 index 0000000..4a81f9b --- /dev/null +++ b/assets/pins/fisilti_ormani.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b67kk15b162ad" +path="res://.godot/imported/fisilti_ormani.webp-c999ecdbcd07fd748d74d05cd1b06359.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/fisilti_ormani.webp" +dest_files=["res://.godot/imported/fisilti_ormani.webp-c999ecdbcd07fd748d74d05cd1b06359.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/gumus_camlik.webp b/assets/pins/gumus_camlik.webp new file mode 100644 index 0000000..d30bbea Binary files /dev/null and b/assets/pins/gumus_camlik.webp differ diff --git a/assets/pins/gumus_camlik.webp.import b/assets/pins/gumus_camlik.webp.import new file mode 100644 index 0000000..68a528a --- /dev/null +++ b/assets/pins/gumus_camlik.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cf376cxbo0dtj" +path="res://.godot/imported/gumus_camlik.webp-c52e1bbde9294452eb09a528dea19c97.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/gumus_camlik.webp" +dest_files=["res://.godot/imported/gumus_camlik.webp-c52e1bbde9294452eb09a528dea19c97.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/kadim_orman.webp b/assets/pins/kadim_orman.webp new file mode 100644 index 0000000..e1ef75c Binary files /dev/null and b/assets/pins/kadim_orman.webp differ diff --git a/assets/pins/kadim_orman.webp.import b/assets/pins/kadim_orman.webp.import new file mode 100644 index 0000000..bcfab8a --- /dev/null +++ b/assets/pins/kadim_orman.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blqbet3d7xqe2" +path="res://.godot/imported/kadim_orman.webp-11576727a418c1f8f2e0890365f54a68.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/kadim_orman.webp" +dest_files=["res://.godot/imported/kadim_orman.webp-11576727a418c1f8f2e0890365f54a68.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/karanlik_orman.webp b/assets/pins/karanlik_orman.webp new file mode 100644 index 0000000..7cb3725 Binary files /dev/null and b/assets/pins/karanlik_orman.webp differ diff --git a/assets/pins/karanlik_orman.webp.import b/assets/pins/karanlik_orman.webp.import new file mode 100644 index 0000000..9d8cf2b --- /dev/null +++ b/assets/pins/karanlik_orman.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfhwg4i45jtgf" +path="res://.godot/imported/karanlik_orman.webp-b32c640b987ff892e5be509e646e1eb8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/karanlik_orman.webp" +dest_files=["res://.godot/imported/karanlik_orman.webp-b32c640b987ff892e5be509e646e1eb8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/koy.webp b/assets/pins/koy.webp new file mode 100644 index 0000000..d329fbf Binary files /dev/null and b/assets/pins/koy.webp differ diff --git a/assets/pins/koy.webp.import b/assets/pins/koy.webp.import new file mode 100644 index 0000000..a9fefba --- /dev/null +++ b/assets/pins/koy.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7bkc8wygu2kx" +path="res://.godot/imported/koy.webp-d771ad8028b23ce083b4b811288f008e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/koy.webp" +dest_files=["res://.godot/imported/koy.webp-d771ad8028b23ce083b4b811288f008e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/liman.webp b/assets/pins/liman.webp new file mode 100644 index 0000000..1e582d6 Binary files /dev/null and b/assets/pins/liman.webp differ diff --git a/assets/pins/liman.webp.import b/assets/pins/liman.webp.import new file mode 100644 index 0000000..c4742ff --- /dev/null +++ b/assets/pins/liman.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1elo3hdcs81n" +path="res://.godot/imported/liman.webp-6760a782e837487d1ce7d4c8e6021835.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/liman.webp" +dest_files=["res://.godot/imported/liman.webp-6760a782e837487d1ce7d4c8e6021835.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/pazar.webp b/assets/pins/pazar.webp new file mode 100644 index 0000000..166e7d5 Binary files /dev/null and b/assets/pins/pazar.webp differ diff --git a/assets/pins/pazar.webp.import b/assets/pins/pazar.webp.import new file mode 100644 index 0000000..cc6a156 --- /dev/null +++ b/assets/pins/pazar.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hnojv627j2xg" +path="res://.godot/imported/pazar.webp-1699b6adb29be9d9ac365cdbfc8926c0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/pazar.webp" +dest_files=["res://.godot/imported/pazar.webp-1699b6adb29be9d9ac365cdbfc8926c0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/pins/tas_ocagi.webp b/assets/pins/tas_ocagi.webp new file mode 100644 index 0000000..e813c76 Binary files /dev/null and b/assets/pins/tas_ocagi.webp differ diff --git a/assets/pins/tas_ocagi.webp.import b/assets/pins/tas_ocagi.webp.import new file mode 100644 index 0000000..d3550fd --- /dev/null +++ b/assets/pins/tas_ocagi.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dhs3njrbjr4jw" +path="res://.godot/imported/tas_ocagi.webp-35d66e34156c8450f2d2698740e00239.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/pins/tas_ocagi.webp" +dest_files=["res://.godot/imported/tas_ocagi.webp-35d66e34156c8450f2d2698740e00239.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/items/bass.tres b/assets/sprites/items/bass.tres new file mode 100644 index 0000000..866d317 --- /dev/null +++ b/assets/sprites/items/bass.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(1135, 137, 186, 103) diff --git a/assets/sprites/items/carp.tres b/assets/sprites/items/carp.tres new file mode 100644 index 0000000..44e79dc --- /dev/null +++ b/assets/sprites/items/carp.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(593, 138, 178, 101) diff --git a/assets/sprites/items/cooked_fish.tres b/assets/sprites/items/cooked_fish.tres new file mode 100644 index 0000000..54eae04 --- /dev/null +++ b/assets/sprites/items/cooked_fish.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(1369, 256, 265, 117) diff --git a/assets/sprites/items/copper_axe.tres b/assets/sprites/items/copper_axe.tres new file mode 100644 index 0000000..38b23a5 --- /dev/null +++ b/assets/sprites/items/copper_axe.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(1424, 133, 155, 112) diff --git a/assets/sprites/items/copper_ingot.tres b/assets/sprites/items/copper_ingot.tres new file mode 100644 index 0000000..12e6776 --- /dev/null +++ b/assets/sprites/items/copper_ingot.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(615, 17, 135, 92) diff --git a/assets/sprites/items/copper_ore.tres b/assets/sprites/items/copper_ore.tres new file mode 100644 index 0000000..d89bb8b --- /dev/null +++ b/assets/sprites/items/copper_ore.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(70, 16, 133, 93) diff --git a/assets/sprites/items/copper_pickaxe.tres b/assets/sprites/items/copper_pickaxe.tres new file mode 100644 index 0000000..e08a561 --- /dev/null +++ b/assets/sprites/items/copper_pickaxe.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(60, 257, 153, 115) diff --git a/assets/sprites/items/iron_axe.tres b/assets/sprites/items/iron_axe.tres new file mode 100644 index 0000000..688302f --- /dev/null +++ b/assets/sprites/items/iron_axe.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(613, 256, 138, 118) diff --git a/assets/sprites/items/iron_ingot.tres b/assets/sprites/items/iron_ingot.tres new file mode 100644 index 0000000..76ca38c --- /dev/null +++ b/assets/sprites/items/iron_ingot.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(887, 17, 137, 92) diff --git a/assets/sprites/items/iron_ore.tres b/assets/sprites/items/iron_ore.tres new file mode 100644 index 0000000..a4c65ca --- /dev/null +++ b/assets/sprites/items/iron_ore.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(342, 15, 135, 96) diff --git a/assets/sprites/items/iron_pickaxe.tres b/assets/sprites/items/iron_pickaxe.tres new file mode 100644 index 0000000..80d5d29 --- /dev/null +++ b/assets/sprites/items/iron_pickaxe.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(335, 257, 149, 115) diff --git a/assets/sprites/items/items_atlas.json b/assets/sprites/items/items_atlas.json new file mode 100644 index 0000000..aa431b4 --- /dev/null +++ b/assets/sprites/items/items_atlas.json @@ -0,0 +1,121 @@ +{ + "atlas": "items_atlas.png", + "size": [ + 1638, + 378 + ], + "cell": [ + 273, + 126 + ], + "items": { + "copper_ore": { + "x": 70, + "y": 16, + "w": 133, + "h": 93 + }, + "iron_ore": { + "x": 342, + "y": 15, + "w": 135, + "h": 96 + }, + "copper_ingot": { + "x": 615, + "y": 17, + "w": 135, + "h": 92 + }, + "iron_ingot": { + "x": 887, + "y": 17, + "w": 137, + "h": 92 + }, + "pine_log": { + "x": 1151, + "y": 15, + "w": 155, + "h": 95 + }, + "oak_log": { + "x": 1417, + "y": 15, + "w": 168, + "h": 96 + }, + "mint": { + "x": 55, + "y": 136, + "w": 163, + "h": 106 + }, + "sage": { + "x": 332, + "y": 137, + "w": 154, + "h": 104 + }, + "carp": { + "x": 593, + "y": 138, + "w": 178, + "h": 101 + }, + "perch": { + "x": 861, + "y": 138, + "w": 188, + "h": 102 + }, + "bass": { + "x": 1135, + "y": 137, + "w": 186, + "h": 103 + }, + "copper_axe": { + "x": 1424, + "y": 133, + "w": 155, + "h": 112 + }, + "copper_pickaxe": { + "x": 60, + "y": 257, + "w": 153, + "h": 115 + }, + "iron_pickaxe": { + "x": 335, + "y": 257, + "w": 149, + "h": 115 + }, + "iron_axe": { + "x": 613, + "y": 256, + "w": 138, + "h": 118 + }, + "steel_pickaxe": { + "x": 880, + "y": 257, + "w": 150, + "h": 115 + }, + "mint_tea": { + "x": 1135, + "y": 256, + "w": 187, + "h": 117 + }, + "cooked_fish": { + "x": 1369, + "y": 256, + "w": 265, + "h": 117 + } + } +} \ No newline at end of file diff --git a/assets/sprites/items/items_atlas.png b/assets/sprites/items/items_atlas.png new file mode 100644 index 0000000..fbe959a Binary files /dev/null and b/assets/sprites/items/items_atlas.png differ diff --git a/assets/sprites/items/items_atlas.png.import b/assets/sprites/items/items_atlas.png.import new file mode 100644 index 0000000..17b513e --- /dev/null +++ b/assets/sprites/items/items_atlas.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1ts12euh0m68" +path="res://.godot/imported/items_atlas.png-4c5e7917565ac2e04cb4c2120b67afac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/items/items_atlas.png" +dest_files=["res://.godot/imported/items_atlas.png-4c5e7917565ac2e04cb4c2120b67afac.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/items/mint.tres b/assets/sprites/items/mint.tres new file mode 100644 index 0000000..9ed2647 --- /dev/null +++ b/assets/sprites/items/mint.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(55, 136, 163, 106) diff --git a/assets/sprites/items/mint_tea.tres b/assets/sprites/items/mint_tea.tres new file mode 100644 index 0000000..48947bf --- /dev/null +++ b/assets/sprites/items/mint_tea.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(1135, 256, 187, 117) diff --git a/assets/sprites/items/oak_log.tres b/assets/sprites/items/oak_log.tres new file mode 100644 index 0000000..9e26729 --- /dev/null +++ b/assets/sprites/items/oak_log.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(1417, 15, 168, 96) diff --git a/assets/sprites/items/perch.tres b/assets/sprites/items/perch.tres new file mode 100644 index 0000000..7acd7de --- /dev/null +++ b/assets/sprites/items/perch.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(861, 138, 188, 102) diff --git a/assets/sprites/items/pine_log.tres b/assets/sprites/items/pine_log.tres new file mode 100644 index 0000000..b3e79fb --- /dev/null +++ b/assets/sprites/items/pine_log.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(1151, 15, 155, 95) diff --git a/assets/sprites/items/sage.tres b/assets/sprites/items/sage.tres new file mode 100644 index 0000000..5103e1f --- /dev/null +++ b/assets/sprites/items/sage.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(332, 137, 154, 104) diff --git a/assets/sprites/items/steel_pickaxe.tres b/assets/sprites/items/steel_pickaxe.tres new file mode 100644 index 0000000..accf6e6 --- /dev/null +++ b/assets/sprites/items/steel_pickaxe.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3] + +[ext_resource type="Texture2D" path="res://assets/sprites/items/items_atlas.png" id="1"] + +[resource] +atlas = ExtResource("1") +region = Rect2(880, 257, 150, 115) diff --git a/assets/sprites/nodes.png b/assets/sprites/nodes.png new file mode 100644 index 0000000..3f4f089 Binary files /dev/null and b/assets/sprites/nodes.png differ diff --git a/assets/sprites/nodes.png.import b/assets/sprites/nodes.png.import new file mode 100644 index 0000000..539019e --- /dev/null +++ b/assets/sprites/nodes.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7438mdq1syio" +path="res://.godot/imported/nodes.png-74d9440dc9afd43a95e761859017776f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/nodes.png" +dest_files=["res://.godot/imported/nodes.png-74d9440dc9afd43a95e761859017776f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/player.png b/assets/sprites/player.png new file mode 100644 index 0000000..8c0e35e Binary files /dev/null and b/assets/sprites/player.png differ diff --git a/assets/sprites/player.png.import b/assets/sprites/player.png.import new file mode 100644 index 0000000..d7d009f --- /dev/null +++ b/assets/sprites/player.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cp5ivfvov0vm6" +path="res://.godot/imported/player.png-e1eaffe0873063c60a0d0b322e4d87d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/player.png" +dest_files=["res://.godot/imported/player.png-e1eaffe0873063c60a0d0b322e4d87d9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/player_flag.webp b/assets/sprites/player_flag.webp new file mode 100644 index 0000000..61efb6a Binary files /dev/null and b/assets/sprites/player_flag.webp differ diff --git a/assets/sprites/player_flag.webp.import b/assets/sprites/player_flag.webp.import new file mode 100644 index 0000000..a3b3dbf --- /dev/null +++ b/assets/sprites/player_flag.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dsxpgv734hxt6" +path="res://.godot/imported/player_flag.webp-8ad66d6b94ceca61fd0af58207233b70.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/player_flag.webp" +dest_files=["res://.godot/imported/player_flag.webp-8ad66d6b94ceca61fd0af58207233b70.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/tiles.png b/assets/sprites/tiles.png new file mode 100644 index 0000000..2bc87f2 Binary files /dev/null and b/assets/sprites/tiles.png differ diff --git a/assets/sprites/tiles.png.import b/assets/sprites/tiles.png.import new file mode 100644 index 0000000..b2ccba4 --- /dev/null +++ b/assets/sprites/tiles.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://f0krj814erci" +path="res://.godot/imported/tiles.png-96ebea94593a378b8712f71e8b40fe75.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/tiles.png" +dest_files=["res://.godot/imported/tiles.png-96ebea94593a378b8712f71e8b40fe75.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/stepstead-gorsel-listesi.md b/assets/stepstead-gorsel-listesi.md new file mode 100644 index 0000000..cfd74dc --- /dev/null +++ b/assets/stepstead-gorsel-listesi.md @@ -0,0 +1,71 @@ +# Stepstead — Görsel & İkon İhtiyaç Listesi + +## 1. Tile'lar (`tiles.png` — şu an 192×32, 6 kare, 32×32) +| Index | İsim | Açıklama | +|---|---|---| +| 0 | grass | Çimen, yürünür, taban | +| 1 | forest | Orman zemini, ağaç node spawn | +| 2 | mountain | Dağ, maden node spawn | +| 3 | water | Su, yürünmez, kıyıdan balık | +| 4 | sand | Kum/kıyı, yürünür | +| 5 | rock | Kaya (dağ biyomu dolgu) | + +## 2. Kaynak node'ları (`nodes.png` — şu an 128×32, 4 kare, 32×32) +| İsim | Skill | Görsel | +|---|---|---| +| tree | woodcutting | Ağaç | +| ore | mining | Cevher damarı/kaya | +| herb | foraging | Bitki/ot | +| fish | fishing | Balık halkası/olta noktası | + +Not: Hasat sonrası "cooldown" hâli gri+yarı saydam (kod modulate ile yapıyor, ekstra görsel şart değil ama opsiyonel "tükenmiş" varyantı güzel olur). + +## 3. Oyuncu (`player.png` — şu an 32×32, tek kare) +- Temel karakter sprite. İdeal: 4 yön + yürüme animasyonu (sprite sheet). Min: 1 statik kare. + +## 4. Eşya ikonları (17 adet — DB `icon` alanı **boş**, hepsi gerekli; ~32×32 veya 64×64) + +**Materyaller (10):** +- ore_copper — Bakır Cevheri +- ingot_copper — Bakır Külçe +- ore_iron — Demir Cevheri +- ingot_iron — Demir Külçe +- log_pine — Çam Odunu +- log_oak — Meşe Odunu +- herb_mint — Nane +- herb_sage — Adaçayı *(uncommon)* +- fish_carp — Sazan +- fish_perch — Tatlısu Levrek *(uncommon)* + +**Aletler (5):** +- fishing_rod — Ahşap Olta +- axe_copper — Bakır Balta +- pickaxe_copper — Bakır Kazma +- axe_iron — Demir Balta *(uncommon)* +- pickaxe_iron — Demir Kazma *(uncommon)* + +**Tüketilebilir (2):** +- tea_mint — Nane Çayı +- cooked_carp — Pişmiş Sazan + +## 5. UI ikonları (şu an emoji/metin — ikona dönüşebilir) +- 👣 adım/step bakiyesi +- Envanter butonu +- Üretim (craft) butonu +- Çıkış (logout) +- Adım ekle (debug) +- Recenter (kamerayı ortala) + +## 6. Skill ikonları (10 — UI'da metin, ikon yok) +mining, fishing, foraging, woodcutting, hunting, combat, smithing, alchemy, cooking, construction +*(şu an aktif kaynak: ilk 5; smithing/alchemy/cooking üretimde kullanılıyor)* + +## 7. Nadirlik (rarity) — renk var, rozet yok (opsiyonel) +common · uncommon · rare · epic · legendary (5 çerçeve/rozet) + +## 8. Uygulama ikonu +- `icon.svg` — uygulama/store ikonu (mevcut placeholder, gerçek logo gerek) +- Splash ekranı görseli/logo (şu an yok) + +--- +**Öncelik:** Eşya ikonları (17) en kritik — envanter/üretim/loot boş görünüyor. Sonra tile+node tutarlı sanat seti, sonra player animasyonu. diff --git a/assets/world_map.png b/assets/world_map.png new file mode 100644 index 0000000..babeb32 Binary files /dev/null and b/assets/world_map.png differ diff --git a/assets/world_map.png.import b/assets/world_map.png.import new file mode 100644 index 0000000..c5ef51a --- /dev/null +++ b/assets/world_map.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://h7p2e1eehebu" +path="res://.godot/imported/world_map.png-338d0d0d25decca5df3f8d5ab6fd5584.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/world_map.png" +dest_files=["res://.godot/imported/world_map.png-338d0d0d25decca5df3f8d5ab6fd5584.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/autoload/api.gd b/autoload/api.gd new file mode 100644 index 0000000..0d04de6 --- /dev/null +++ b/autoload/api.gd @@ -0,0 +1,47 @@ +extends Node +## HTTP istemcisi — Stepstead API'sine istek atar. + +signal request_completed(method: String, path: String, status: int, body: Variant) + +func request(method: String, path: String, body: Variant = null, auth: bool = true) -> Dictionary: + var http := HTTPRequest.new() + add_child(http) + var url := Config.get_api_base() + path + var headers := ["Content-Type: application/json", "Accept: application/json"] + if auth and Auth.token != "": + headers.append("Authorization: Bearer " + Auth.token) + + var method_id: int = HTTPClient.METHOD_GET + match method.to_upper(): + "GET": method_id = HTTPClient.METHOD_GET + "POST": method_id = HTTPClient.METHOD_POST + "PUT": method_id = HTTPClient.METHOD_PUT + "DELETE": method_id = HTTPClient.METHOD_DELETE + "PATCH": method_id = HTTPClient.METHOD_PATCH + + var body_str := "" + if body != null: + body_str = JSON.stringify(body) + + var err := http.request(url, headers, method_id, body_str) + if err != OK: + http.queue_free() + return {"ok": false, "status": 0, "error": "request_failed", "body": null} + + var result: Array = await http.request_completed + http.queue_free() + + var status: int = result[1] + var raw_body: PackedByteArray = result[3] + var parsed: Variant = null + if raw_body.size() > 0: + var text := raw_body.get_string_from_utf8() + var json := JSON.new() + if json.parse(text) == OK: + parsed = json.data + else: + parsed = text + + var ok := status >= 200 and status < 300 + request_completed.emit(method.to_upper(), path, status, parsed) + return {"ok": ok, "status": status, "body": parsed} diff --git a/autoload/api.gd.uid b/autoload/api.gd.uid new file mode 100644 index 0000000..79cafba --- /dev/null +++ b/autoload/api.gd.uid @@ -0,0 +1 @@ +uid://c1wofkvtrtvaw diff --git a/autoload/auth.gd b/autoload/auth.gd new file mode 100644 index 0000000..e4060c1 --- /dev/null +++ b/autoload/auth.gd @@ -0,0 +1,53 @@ +extends Node +## Auth durumu — JWT token saklama ve auth API çağrıları. + +const SAVE_PATH := "user://auth.dat" + +var token: String = "" +var user: Dictionary = {} + +func _ready() -> void: + _load() + +func _save() -> void: + var f := FileAccess.open(SAVE_PATH, FileAccess.WRITE) + if f: + f.store_var({"token": token, "user": user}) + +func _load() -> void: + if not FileAccess.file_exists(SAVE_PATH): + return + var f := FileAccess.open(SAVE_PATH, FileAccess.READ) + if f: + var data: Variant = f.get_var() + if data is Dictionary: + token = data.get("token", "") + user = data.get("user", {}) + +func is_logged_in() -> bool: + return token != "" + +func clear() -> void: + token = "" + user = {} + _save() + +func register(email: String, password: String, display_name: String = "") -> Dictionary: + var body := {"email": email, "password": password} + if display_name != "": + body["display_name"] = display_name + return await Api.request("POST", "/auth/register", body, false) + +func login(email: String, password: String) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/auth/login", {"email": email, "password": password}, false) + if res.ok and res.body is Dictionary and res.body.has("access_token"): + token = res.body["access_token"] + _save() + var me_res: Dictionary = await Api.request("GET", "/auth/me", null, true) + if me_res.ok: + user = me_res.body + _save() + return res + +func request_password_reset(email: String) -> Dictionary: + return await Api.request("POST", "/auth/request-password-reset", {"email": email}, false) diff --git a/autoload/auth.gd.uid b/autoload/auth.gd.uid new file mode 100644 index 0000000..b0b1505 --- /dev/null +++ b/autoload/auth.gd.uid @@ -0,0 +1 @@ +uid://bse17dq853ush diff --git a/autoload/config.gd b/autoload/config.gd new file mode 100644 index 0000000..9d89c0c --- /dev/null +++ b/autoload/config.gd @@ -0,0 +1,63 @@ +extends Node +## Global yapılandırma. API endpoint ve sabitler. + +const API_BASE_URL := "https://api.stepstead.com" + +const VERSION := "0.1.0" +const PLATFORM_ANDROID := "android" +const PLATFORM_IOS := "ios" + +## Testler için runtime override (örn. headless E2E'de http://127.0.0.1:8002) +var override_base := "" + +func get_api_base() -> String: + if override_base != "": + return override_base + return API_BASE_URL + +func current_platform() -> String: + var name := OS.get_name().to_lower() + if name == "android": + return PLATFORM_ANDROID + if name == "ios": + return PLATFORM_IOS + return name + + +## --- Kullanıcı ayarları (Ayarlar paneli) --- +const _SETTINGS_PATH := "user://settings.cfg" +var sound_on := true +var music_on := true +var notif_on := true + +func _ready() -> void: + load_settings() + +func load_settings() -> void: + var cf := ConfigFile.new() + if cf.load(_SETTINGS_PATH) == OK: + sound_on = bool(cf.get_value("audio", "sound", true)) + music_on = bool(cf.get_value("audio", "music", true)) + notif_on = bool(cf.get_value("notify", "enabled", true)) + _apply_audio() + +func save_settings() -> void: + var cf := ConfigFile.new() + cf.set_value("audio", "sound", sound_on) + cf.set_value("audio", "music", music_on) + cf.set_value("notify", "enabled", notif_on) + cf.save(_SETTINGS_PATH) + _apply_audio() + +func _apply_audio() -> void: + # "Sfx" / "Music" bus'ları varsa sustur; yoksa Master'ı ses ayarına bağla + var sfx := AudioServer.get_bus_index("Sfx") + if sfx != -1: + AudioServer.set_bus_mute(sfx, not sound_on) + var mus := AudioServer.get_bus_index("Music") + if mus != -1: + AudioServer.set_bus_mute(mus, not music_on) + if sfx == -1 and mus == -1: + var master := AudioServer.get_bus_index("Master") + if master != -1: + AudioServer.set_bus_mute(master, not (sound_on or music_on)) diff --git a/autoload/config.gd.uid b/autoload/config.gd.uid new file mode 100644 index 0000000..2bc25f0 --- /dev/null +++ b/autoload/config.gd.uid @@ -0,0 +1 @@ +uid://kmeam3or5l4c diff --git a/autoload/game_state.gd b/autoload/game_state.gd new file mode 100644 index 0000000..76e4a44 --- /dev/null +++ b/autoload/game_state.gd @@ -0,0 +1,281 @@ +extends Node +## Oyun durumu — karakter, skill, envanter cache. + +signal character_loaded(character: Dictionary) +signal step_balance_changed(new_value: int) + +var character: Dictionary = {} +var skills: Array = [] +var inventory: Array = [] + +signal inventory_changed +signal harvest_succeeded(payload: Dictionary) +signal level_up(kind: String, new_level: int) # "skill" veya "character" +signal item_used(payload: Dictionary) + +func has_character() -> bool: + return character.has("id") + +func load_character() -> Dictionary: + var res: Dictionary = await Api.request("GET", "/character/me", null, true) + if res.ok: + character = res.body + skills = character.get("skills", []) + character_loaded.emit(character) + return res + +func create_character(name: String) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/character", {"name": name}, true) + if res.ok: + character = res.body + skills = character.get("skills", []) + character_loaded.emit(character) + return res + +func load_inventory() -> Dictionary: + var res: Dictionary = await Api.request("GET", "/world/inventory", null, true) + if res.ok: + inventory = res.body if res.body is Array else [] + inventory_changed.emit() + return res + +func list_recipes() -> Array: + var res: Dictionary = await Api.request("GET", "/craft/recipes", null, true) + return res.body if res.ok and res.body is Array else [] + +func craft_recipe(code: String, qty: int = 1) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/craft", {"recipe_code": code, "qty": qty}, true) + if res.ok and res.body is Dictionary: + var b: Dictionary = res.body + character["step_balance"] = b["step_balance"] + character["level"] = b["character_level"] + character["total_xp"] = b.get("total_xp", character.get("total_xp", 0)) + for s in skills: + if s.get("skill_name") == b["skill"]: + s["xp"] = s.get("xp", 0) + b["xp_gained"] + s["level"] = b["skill_level"] + break + character_loaded.emit(character) + await load_inventory() + # Toast yeniden kullan + harvest_succeeded.emit({ + "item_name": "%dx %s" % [int(b["output_qty"]), b["output_item_name"]], + "xp_gained": b["xp_gained"], + "skill": b["skill"], + }) + if b.get("skill_level_up", false): + level_up.emit("skill", b["skill_level"]) + if b.get("character_level_up", false): + level_up.emit("character", b["character_level"]) + return res + +func use_item(item_code: String, qty: int = 1) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/world/use-item", + {"item_code": item_code, "qty": qty}, true) + if res.ok and res.body is Dictionary: + var b: Dictionary = res.body + character["step_balance"] = b["step_balance"] + character_loaded.emit(character) + await load_inventory() + item_used.emit(b) + return res + +# --- Lokasyon-graf dünya --- + +signal map_loaded(map_data: Dictionary) +signal traveled(payload: Dictionary) +signal event_started(event: Dictionary) +signal event_resolved(result: Dictionary) + +var map_data: Dictionary = {} + +func load_map() -> Dictionary: + var res: Dictionary = await Api.request("GET", "/world/map", null, true) + if res.ok and res.body is Dictionary: + map_data = res.body + map_loaded.emit(map_data) + var pe: Variant = map_data.get("pending_event") + if pe is Dictionary: + event_started.emit(pe) + return res + +func load_location() -> Dictionary: + return await Api.request("GET", "/world/location", null, true) + +func travel(to_code: String) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/world/travel", {"to_code": to_code}, true) + if res.ok and res.body is Dictionary: + var b: Dictionary = res.body + character["step_balance"] = b["step_balance"] + character["location_code"] = b["location_code"] + character["location_name"] = b["location_name"] + character_loaded.emit(character) + traveled.emit(b) + var ev: Variant = b.get("event") + if ev is Dictionary: + event_started.emit(ev) + return res + +func gather(item_code: String) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/world/gather", {"item_code": item_code}, true) + if res.ok and res.body is Dictionary: + var b: Dictionary = res.body + character["step_balance"] = b["step_balance"] + character["level"] = b["character_level"] + character["total_xp"] = b["total_xp"] + for s in skills: + if s.get("skill_name") == b["skill"]: + s["xp"] = s.get("xp", 0) + b["xp_gained"] + s["level"] = b["skill_level"] + break + character_loaded.emit(character) + await load_inventory() + harvest_succeeded.emit(b) # toast aynı formatı kullanır + if b.get("skill_level_up", false): + level_up.emit("skill", b["skill_level"]) + if b.get("character_level_up", false): + level_up.emit("character", b["character_level"]) + return res + +func resolve_event(choice: int) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/world/event/resolve", {"choice": choice}, true) + if res.ok and res.body is Dictionary: + var b: Dictionary = res.body + character["step_balance"] = b["step_balance"] + if b.has("gold"): + character["gold"] = b["gold"] + character_loaded.emit(character) + await load_inventory() + event_resolved.emit(b) + return res + +# --- Pazar (market + vendor) --- + +func market_listings(q: String = "", mine: bool = false) -> Array: + var path := "/market/listings?q=%s&mine=%s" % [q.uri_encode(), "true" if mine else "false"] + var res: Dictionary = await Api.request("GET", path, null, true) + return res.body if res.ok and res.body is Array else [] + +func market_list(item_code: String, qty: int, unit_price: int) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/market/list", + {"item_code": item_code, "qty": qty, "unit_price": unit_price}, true) + if res.ok: + await load_inventory() + return res + +func market_buy(listing_id: int, qty: int = 0) -> Dictionary: + var body := {"listing_id": listing_id} + if qty > 0: + body["qty"] = qty + var res: Dictionary = await Api.request("POST", "/market/buy", body, true) + if res.ok and res.body is Dictionary: + character["gold"] = res.body["gold"] + character_loaded.emit(character) + await load_inventory() + return res + +func market_cancel(listing_id: int) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/market/cancel", {"listing_id": listing_id}, true) + if res.ok: + await load_inventory() + return res + +func vendor_prices() -> Array: + var res: Dictionary = await Api.request("GET", "/market/vendor", null, true) + return res.body if res.ok and res.body is Array else [] + +func vendor_sell(item_code: String, qty: int) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/market/vendor/sell", + {"item_code": item_code, "qty": qty}, true) + if res.ok and res.body is Dictionary: + character["gold"] = res.body["gold"] + character_loaded.emit(character) + await load_inventory() + return res + +func vendor_stock() -> Array: + var res: Dictionary = await Api.request("GET", "/market/vendor/stock", null, true) + return res.body if res.ok and res.body is Array else [] + +func vendor_buy(item_code: String, qty: int) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/market/vendor/buy", + {"item_code": item_code, "qty": qty}, true) + if res.ok and res.body is Dictionary: + character["gold"] = res.body["gold"] + character_loaded.emit(character) + await load_inventory() + return res + +# --- Şehir vendor'ları (şehir haritası) --- + +func city_vendors() -> Dictionary: + return await Api.request("GET", "/market/city", null, true) + +func npc_shop(npc_id: int) -> Dictionary: + return await Api.request("GET", "/market/vendor/%d/shop" % npc_id, null, true) + +func npc_buy(npc_id: int, item_code: String, qty: int) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/market/vendor/%d/buy" % npc_id, + {"item_code": item_code, "qty": qty}, true) + if res.ok and res.body is Dictionary: + character["gold"] = res.body["gold"] + character_loaded.emit(character) + await load_inventory() + return res + +func npc_sell(npc_id: int, item_code: String, qty: int) -> Dictionary: + var res: Dictionary = await Api.request("POST", "/market/vendor/%d/sell" % npc_id, + {"item_code": item_code, "qty": qty}, true) + if res.ok and res.body is Dictionary: + character["gold"] = res.body["gold"] + character_loaded.emit(character) + await load_inventory() + return res + +# --- Kamp --- + +func build_camp() -> Dictionary: + var res: Dictionary = await Api.request("POST", "/world/camp/build", null, true) + if res.ok and res.body is Dictionary: + var b: Dictionary = res.body + character["step_balance"] = b["step_balance"] + character["level"] = b["character_level"] + for s in skills: + if s.get("skill_name") == "construction": + s["xp"] = s.get("xp", 0) + int(b["xp_gained"]) + s["level"] = b["skill_level"] + break + character_loaded.emit(character) + await load_inventory() + harvest_succeeded.emit({ + "item_name": "⛺ Kamp", + "xp_gained": b["xp_gained"], + "skill": "construction", + }) + if b.get("skill_level_up", false): + level_up.emit("skill", b["skill_level"]) + if b.get("character_level_up", false): + level_up.emit("character", b["character_level"]) + return res + +# --- Liderlik --- + +func leaderboard(by: String = "steps") -> Dictionary: + return await Api.request("GET", "/leaderboard?by=" + by, null, true) + +# --- Günlük hedef + streak --- + +signal daily_claimed(result: Dictionary) + +func daily_status() -> Dictionary: + return await Api.request("GET", "/world/daily", null, true) + +func daily_claim() -> Dictionary: + var res: Dictionary = await Api.request("POST", "/world/daily/claim", null, true) + if res.ok and res.body is Dictionary: + var b: Dictionary = res.body + character["step_balance"] = b["step_balance"] + character["gold"] = b["gold"] + character_loaded.emit(character) + daily_claimed.emit(b) + return res diff --git a/autoload/game_state.gd.uid b/autoload/game_state.gd.uid new file mode 100644 index 0000000..ab4fa76 --- /dev/null +++ b/autoload/game_state.gd.uid @@ -0,0 +1 @@ +uid://0bu7lg8ddk2y diff --git a/autoload/pedometer.gd b/autoload/pedometer.gd new file mode 100644 index 0000000..2e63063 --- /dev/null +++ b/autoload/pedometer.gd @@ -0,0 +1,196 @@ +extends Node +## Pedometer soyutlama katmanı. +## +## Platforma göre kaynak: +## - Android: "StepCounter" singleton (TYPE_STEP_COUNTER, reboot'tan beri kümülatif) +## - iOS: "Pedometer" singleton (CMPedometer, oturum kümülatif) +## - Editör / masaüstü: simülasyon (manuel/otomatik adım üretir) +## +## Native plugin sözleşmesi (her iki platform da aynı): +## bool is_available() +## void start() +## void stop() +## int get_step_count() # kümülatif sayaç (artar, reboot'ta sıfırlanabilir) +## +## İstemci kümülatif sayaçtan delta hesaplar, son senkronize değeri kalıcı +## tutar (user://pedometer.cfg) ve sunucuya yalnızca delta gönderir. +## Otorite sunucuda — sunucu dakika başı tavan uygular (anti-cheat). + +signal steps_synced(accepted: int, rejected: int, balance: int) +signal raw_step_count(total: int) + +const SAVE_PATH := "user://pedometer.cfg" +const POLL_INTERVAL := 5.0 # sn — sayaç okuma +const SYNC_INTERVAL := 30.0 # sn — sunucuya gönderme + +# Editör/masaüstü simülasyonu: otomatik yürüyüş hızı (adım/dakika). +# 0 = kapalı (sadece sim_add ile manuel). ~100/dk normal yürüyüş. +var sim_walk_per_min := 0 + +var _plugin: Object = null +var _platform := "" +var _last_total := 0 # en son sunucuya senkronize edilen kümülatif değer +var _current_total := 0 # cihazdan okunan güncel kümülatif değer +var _pending := 0 # henüz gönderilmemiş delta +var _running := false +var _sim_total := 0 # editör simülasyon sayacı + +var _poll_timer: Timer +var _sync_timer: Timer + + +func _ready() -> void: + _platform = Config.current_platform() + _load_state() + _init_plugin() + + _poll_timer = Timer.new() + _poll_timer.wait_time = POLL_INTERVAL + _poll_timer.timeout.connect(_on_poll) + add_child(_poll_timer) + + _sync_timer = Timer.new() + _sync_timer.wait_time = SYNC_INTERVAL + _sync_timer.timeout.connect(_on_sync_tick) + add_child(_sync_timer) + + +func _init_plugin() -> void: + var singleton_name := "" + if _platform == Config.PLATFORM_ANDROID: + singleton_name = "StepCounter" + elif _platform == Config.PLATFORM_IOS: + singleton_name = "Pedometer" + + if singleton_name != "" and Engine.has_singleton(singleton_name): + _plugin = Engine.get_singleton(singleton_name) + print("[Pedometer] native plugin yüklendi: ", singleton_name) + else: + _plugin = null + print("[Pedometer] native plugin yok — simülasyon modu (", _platform, ")") + + +func is_native() -> bool: + return _plugin != null and _plugin.has_method("is_available") and _plugin.is_available() + + +## Adım dinlemeyi başlat (login + karakter yüklendikten sonra çağrılır). +func start() -> void: + if _running: + return + _running = true + # Android 10+ çalışma zamanı izni + if _platform == Config.PLATFORM_ANDROID: + if not OS.request_permission("android.permission.ACTIVITY_RECOGNITION"): + push_warning("[Pedometer] ACTIVITY_RECOGNITION izni reddedildi/bekliyor") + if is_native() and _plugin.has_method("start"): + _plugin.start() + _poll_timer.start() + _sync_timer.start() + _on_poll() + + +func stop() -> void: + if not _running: + return + _running = false + if is_native() and _plugin.has_method("stop"): + _plugin.stop() + _poll_timer.stop() + _sync_timer.stop() + + +func _read_device_total() -> int: + if is_native() and _plugin.has_method("get_step_count"): + return int(_plugin.get_step_count()) + # simülasyon — otomatik yürüyüş açıksa her poll'da hız oranında ekle + if sim_walk_per_min > 0: + _sim_total += int(round(sim_walk_per_min * POLL_INTERVAL / 60.0)) + return _sim_total + + +## Editör/test: sürekli yürüyüş simülasyonu aç/kapat (adım/dakika). +## Örn. Pedometer.sim_walk(100) → dakikada ~100 adım, otomatik sync'lenir. +func sim_walk(steps_per_min: int) -> void: + sim_walk_per_min = max(0, steps_per_min) + + +## Editör/test: manuel adım enjekte et (simülasyon sayacını ilerletir). +func sim_add(steps: int) -> void: + _sim_total += max(0, steps) + _on_poll() + + +func _on_poll() -> void: + var total := _read_device_total() + + # reboot tespiti: sayaç geriye gittiyse delta'yı ham total kabul et + if total < _last_total: + _last_total = 0 + + _current_total = total + _pending = max(0, _current_total - _last_total) + raw_step_count.emit(_current_total) + + +func _on_sync_tick() -> void: + if _pending > 0: + await sync_now() + + +## Bekleyen delta'yı sunucuya gönder. last_sync sonrası kalıcı kaydet. +func sync_now() -> Dictionary: + _on_poll() + if _pending <= 0: + return {"ok": true, "accepted": 0} + if Auth.token == "": + return {"ok": false, "error": "no_auth"} + + var delta := _pending + var src := _platform if is_native() else "sim" + var res: Dictionary = await Api.request("POST", "/world/sync-steps", + {"delta": delta, "source": src}, true) + + if res.ok and res.body is Dictionary: + var b: Dictionary = res.body + # gönderdiğimiz delta'yı senkronize sayılan total'a işle + _last_total += delta + _pending = max(0, _current_total - _last_total) + _save_state() + + if GameState.has_character(): + GameState.character["step_balance"] = int(b["step_balance"]) + GameState.character["step_lifetime"] = int(b.get("step_lifetime", 0)) + GameState.character_loaded.emit(GameState.character) + var acc: int = int(b.get("accepted", 0)) + var rej: int = int(b.get("rejected", 0)) + steps_synced.emit(acc, rej, int(b["step_balance"])) + if rej > 0: + push_warning("[Pedometer] %d adım reddedildi (tavan). reason=%s" % [rej, str(b.get("reason"))]) + return {"ok": true, "accepted": acc, "rejected": rej} + + return {"ok": false, "error": "sync_failed", "status": res.get("status", 0)} + + +func _load_state() -> void: + var cfg := ConfigFile.new() + if cfg.load(SAVE_PATH) == OK: + _last_total = int(cfg.get_value("pedometer", "last_total", 0)) + _sim_total = int(cfg.get_value("pedometer", "sim_total", 0)) + + +func _save_state() -> void: + var cfg := ConfigFile.new() + cfg.set_value("pedometer", "last_total", _last_total) + cfg.set_value("pedometer", "sim_total", _sim_total) + cfg.save(SAVE_PATH) + + +# Uygulama arka plandan döndüğünde hemen senkronize et (background adımları toparla) +func _notification(what: int) -> void: + if what == NOTIFICATION_APPLICATION_RESUMED: + if _running: + await sync_now() + elif what == NOTIFICATION_APPLICATION_PAUSED: + if _running: + await sync_now() diff --git a/autoload/pedometer.gd.uid b/autoload/pedometer.gd.uid new file mode 100644 index 0000000..f613ddd --- /dev/null +++ b/autoload/pedometer.gd.uid @@ -0,0 +1 @@ +uid://c6o6yfjjvhgpw diff --git a/autoload/world_state.gd.uid b/autoload/world_state.gd.uid new file mode 100644 index 0000000..dde78dd --- /dev/null +++ b/autoload/world_state.gd.uid @@ -0,0 +1 @@ +uid://l0n5h4ijuubn diff --git a/autoload/ws_client.gd b/autoload/ws_client.gd new file mode 100644 index 0000000..7cf3d67 --- /dev/null +++ b/autoload/ws_client.gd @@ -0,0 +1,117 @@ +extends Node +## Canlı multiplayer istemcisi — diğer oyuncuların pozisyonlarını WebSocket ile alır. +## Sunucu eventleri: online_list (sadece bağlanınca), player_joined, player_moved, +## player_left, pong. Kopunca 5 sn'de bir yeniden bağlanır. + +signal player_joined(p: Dictionary) +signal player_moved(p: Dictionary) +signal player_left(char_id: int) +signal online_list(players: Array) +signal chat_received(msg: Dictionary) +signal chat_history(messages: Array) # global geçmiş (bağlanınca) +signal local_chat_history(messages: Array) # bulunulan lokasyonun geçmişi (istek üzerine) +signal connection_changed(is_connected: bool) + +const PING_INTERVAL := 25.0 # sunucu presence TTL 120sn, ping ile yenilenir +const RECONNECT_DELAY := 5.0 + +var _ws: WebSocketPeer = null +var _open := false +var _ping_accum := 0.0 +var _reconnect_accum := 0.0 +var _should_run := false + +func start() -> void: + if _should_run: + return + _should_run = true + _connect_ws() + +func stop() -> void: + _should_run = false + if _ws != null: + _ws.close() + _ws = null + if _open: + _open = false + connection_changed.emit(false) + +func _connect_ws() -> void: + if Auth.token == "": + return + var url := Config.get_api_base().replace("https://", "wss://").replace("http://", "ws://") + "/ws?token=" + Auth.token + _ws = WebSocketPeer.new() + var err := _ws.connect_to_url(url) + if err != OK: + push_warning("WS bağlantı hatası: %d" % err) + _ws = null + _ping_accum = 0.0 + +func _process(delta: float) -> void: + if not _should_run: + return + if _ws == null: + _reconnect_accum += delta + if _reconnect_accum >= RECONNECT_DELAY: + _reconnect_accum = 0.0 + _connect_ws() + return + _ws.poll() + var state := _ws.get_ready_state() + if state == WebSocketPeer.STATE_OPEN: + if not _open: + _open = true + connection_changed.emit(true) + while _ws.get_available_packet_count() > 0: + _handle_packet(_ws.get_packet().get_string_from_utf8()) + _ping_accum += delta + if _ping_accum >= PING_INTERVAL: + _ping_accum = 0.0 + _ws.send_text("{\"type\":\"ping\"}") + elif state == WebSocketPeer.STATE_CLOSED: + _ws = null + _reconnect_accum = 0.0 + if _open: + _open = false + connection_changed.emit(false) + +func _handle_packet(text: String) -> void: + var json := JSON.new() + if json.parse(text) != OK: + return + if not (json.data is Dictionary): + return + var msg: Dictionary = json.data + match str(msg.get("type", "")): + "online_list": + var players: Array = msg.get("players", []) + online_list.emit(players) + "player_joined": + player_joined.emit(msg) + "player_moved": + player_moved.emit(msg) + "player_left": + player_left.emit(int(msg.get("char_id", 0))) + "chat": + chat_received.emit(msg) + "chat_history": + var messages: Array = msg.get("messages", []) + if str(msg.get("channel", "global")) == "local": + local_chat_history.emit(messages) + else: + chat_history.emit(messages) + "pong": + pass + +func send_chat(text: String, channel: String = "global") -> void: + if _ws == null or _ws.get_ready_state() != WebSocketPeer.STATE_OPEN: + return + var trimmed := text.strip_edges() + if trimmed == "": + return + _ws.send_text(JSON.stringify({"type": "chat", "text": trimmed, "channel": channel})) + +func request_local_history() -> void: + if _ws == null or _ws.get_ready_state() != WebSocketPeer.STATE_OPEN: + return + _ws.send_text("{\"type\":\"get_local_history\"}") diff --git a/autoload/ws_client.gd.uid b/autoload/ws_client.gd.uid new file mode 100644 index 0000000..5b27fe3 --- /dev/null +++ b/autoload/ws_client.gd.uid @@ -0,0 +1 @@ +uid://h776ig7kb06j diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..eb1b140 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,328 @@ +[preset.0] + +name="Stepstead" +platform="iOS" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="exports/ssv2/ssv2.ipa" +patches=PackedStringArray() +patch_delta_encoding=false +patch_delta_compression_level_zstd=19 +patch_delta_min_reduction=0.1 +patch_delta_include_filters="*" +patch_delta_exclude_filters="" +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +architectures/arm64=true +application/app_store_team_id="NKXK995565" +application/export_method_debug=1 +application/code_sign_identity_debug="" +application/code_sign_identity_release="" +application/provisioning_profile_specifier_debug="" +application/provisioning_profile_specifier_release="" +application/export_method_release=1 +application/bundle_identifier="com.stepstead.game" +application/signature="" +application/short_version="" +application/version="" +application/additional_plist_content="" +application/icon_interpolation=4 +application/export_project_only=false +application/delete_old_export_files_unconditionally=false +entitlements/increased_memory_limit=false +entitlements/game_center=true +entitlements/push_notifications="Disabled" +entitlements/additional="ek bir bilgi" +capabilities/access_wifi=true +capabilities/performance_gaming_tier=false +capabilities/performance_a12=false +capabilities/additional=PackedStringArray() +shader_baker/enabled=false +user_data/accessible_from_files_app=false +user_data/accessible_from_itunes_sharing=false +privacy/camera_usage_description="" +privacy/camera_usage_description_localized={} +privacy/microphone_usage_description="" +privacy/microphone_usage_description_localized={} +privacy/photolibrary_usage_description="" +privacy/photolibrary_usage_description_localized={} +privacy/file_timestamp_access_reasons=3 +privacy/system_boot_time_access_reasons=1 +privacy/disk_space_access_reasons=3 +privacy/active_keyboard_access_reasons=0 +privacy/user_defaults_access_reasons=0 +privacy/tracking_enabled=false +privacy/tracking_domains=PackedStringArray() +privacy/collected_data/name/collected=false +privacy/collected_data/name/linked_to_user=false +privacy/collected_data/name/used_for_tracking=false +privacy/collected_data/name/collection_purposes=0 +privacy/collected_data/email_address/collected=false +privacy/collected_data/email_address/linked_to_user=false +privacy/collected_data/email_address/used_for_tracking=false +privacy/collected_data/email_address/collection_purposes=0 +privacy/collected_data/phone_number/collected=false +privacy/collected_data/phone_number/linked_to_user=false +privacy/collected_data/phone_number/used_for_tracking=false +privacy/collected_data/phone_number/collection_purposes=0 +privacy/collected_data/physical_address/collected=false +privacy/collected_data/physical_address/linked_to_user=false +privacy/collected_data/physical_address/used_for_tracking=false +privacy/collected_data/physical_address/collection_purposes=0 +privacy/collected_data/other_contact_info/collected=false +privacy/collected_data/other_contact_info/linked_to_user=false +privacy/collected_data/other_contact_info/used_for_tracking=false +privacy/collected_data/other_contact_info/collection_purposes=0 +privacy/collected_data/health/collected=false +privacy/collected_data/health/linked_to_user=false +privacy/collected_data/health/used_for_tracking=false +privacy/collected_data/health/collection_purposes=0 +privacy/collected_data/fitness/collected=false +privacy/collected_data/fitness/linked_to_user=false +privacy/collected_data/fitness/used_for_tracking=false +privacy/collected_data/fitness/collection_purposes=0 +privacy/collected_data/payment_info/collected=false +privacy/collected_data/payment_info/linked_to_user=false +privacy/collected_data/payment_info/used_for_tracking=false +privacy/collected_data/payment_info/collection_purposes=0 +privacy/collected_data/credit_info/collected=false +privacy/collected_data/credit_info/linked_to_user=false +privacy/collected_data/credit_info/used_for_tracking=false +privacy/collected_data/credit_info/collection_purposes=0 +privacy/collected_data/other_financial_info/collected=false +privacy/collected_data/other_financial_info/linked_to_user=false +privacy/collected_data/other_financial_info/used_for_tracking=false +privacy/collected_data/other_financial_info/collection_purposes=0 +privacy/collected_data/precise_location/collected=false +privacy/collected_data/precise_location/linked_to_user=false +privacy/collected_data/precise_location/used_for_tracking=false +privacy/collected_data/precise_location/collection_purposes=0 +privacy/collected_data/coarse_location/collected=false +privacy/collected_data/coarse_location/linked_to_user=false +privacy/collected_data/coarse_location/used_for_tracking=false +privacy/collected_data/coarse_location/collection_purposes=0 +privacy/collected_data/sensitive_info/collected=false +privacy/collected_data/sensitive_info/linked_to_user=false +privacy/collected_data/sensitive_info/used_for_tracking=false +privacy/collected_data/sensitive_info/collection_purposes=0 +privacy/collected_data/contacts/collected=false +privacy/collected_data/contacts/linked_to_user=false +privacy/collected_data/contacts/used_for_tracking=false +privacy/collected_data/contacts/collection_purposes=0 +privacy/collected_data/emails_or_text_messages/collected=false +privacy/collected_data/emails_or_text_messages/linked_to_user=false +privacy/collected_data/emails_or_text_messages/used_for_tracking=false +privacy/collected_data/emails_or_text_messages/collection_purposes=0 +privacy/collected_data/photos_or_videos/collected=false +privacy/collected_data/photos_or_videos/linked_to_user=false +privacy/collected_data/photos_or_videos/used_for_tracking=false +privacy/collected_data/photos_or_videos/collection_purposes=0 +privacy/collected_data/audio_data/collected=false +privacy/collected_data/audio_data/linked_to_user=false +privacy/collected_data/audio_data/used_for_tracking=false +privacy/collected_data/audio_data/collection_purposes=0 +privacy/collected_data/gameplay_content/collected=false +privacy/collected_data/gameplay_content/linked_to_user=false +privacy/collected_data/gameplay_content/used_for_tracking=false +privacy/collected_data/gameplay_content/collection_purposes=0 +privacy/collected_data/customer_support/collected=false +privacy/collected_data/customer_support/linked_to_user=false +privacy/collected_data/customer_support/used_for_tracking=false +privacy/collected_data/customer_support/collection_purposes=0 +privacy/collected_data/other_user_content/collected=false +privacy/collected_data/other_user_content/linked_to_user=false +privacy/collected_data/other_user_content/used_for_tracking=false +privacy/collected_data/other_user_content/collection_purposes=0 +privacy/collected_data/browsing_history/collected=false +privacy/collected_data/browsing_history/linked_to_user=false +privacy/collected_data/browsing_history/used_for_tracking=false +privacy/collected_data/browsing_history/collection_purposes=0 +privacy/collected_data/search_history/collected=false +privacy/collected_data/search_history/linked_to_user=false +privacy/collected_data/search_history/used_for_tracking=false +privacy/collected_data/search_history/collection_purposes=0 +privacy/collected_data/user_id/collected=false +privacy/collected_data/user_id/linked_to_user=false +privacy/collected_data/user_id/used_for_tracking=false +privacy/collected_data/user_id/collection_purposes=0 +privacy/collected_data/device_id/collected=false +privacy/collected_data/device_id/linked_to_user=false +privacy/collected_data/device_id/used_for_tracking=false +privacy/collected_data/device_id/collection_purposes=0 +privacy/collected_data/purchase_history/collected=false +privacy/collected_data/purchase_history/linked_to_user=false +privacy/collected_data/purchase_history/used_for_tracking=false +privacy/collected_data/purchase_history/collection_purposes=0 +privacy/collected_data/product_interaction/collected=false +privacy/collected_data/product_interaction/linked_to_user=false +privacy/collected_data/product_interaction/used_for_tracking=false +privacy/collected_data/product_interaction/collection_purposes=0 +privacy/collected_data/advertising_data/collected=false +privacy/collected_data/advertising_data/linked_to_user=false +privacy/collected_data/advertising_data/used_for_tracking=false +privacy/collected_data/advertising_data/collection_purposes=0 +privacy/collected_data/other_usage_data/collected=false +privacy/collected_data/other_usage_data/linked_to_user=false +privacy/collected_data/other_usage_data/used_for_tracking=false +privacy/collected_data/other_usage_data/collection_purposes=0 +privacy/collected_data/crash_data/collected=false +privacy/collected_data/crash_data/linked_to_user=false +privacy/collected_data/crash_data/used_for_tracking=false +privacy/collected_data/crash_data/collection_purposes=0 +privacy/collected_data/performance_data/collected=false +privacy/collected_data/performance_data/linked_to_user=false +privacy/collected_data/performance_data/used_for_tracking=false +privacy/collected_data/performance_data/collection_purposes=0 +privacy/collected_data/other_diagnostic_data/collected=false +privacy/collected_data/other_diagnostic_data/linked_to_user=false +privacy/collected_data/other_diagnostic_data/used_for_tracking=false +privacy/collected_data/other_diagnostic_data/collection_purposes=0 +privacy/collected_data/environment_scanning/collected=false +privacy/collected_data/environment_scanning/linked_to_user=false +privacy/collected_data/environment_scanning/used_for_tracking=false +privacy/collected_data/environment_scanning/collection_purposes=0 +privacy/collected_data/hands/collected=false +privacy/collected_data/hands/linked_to_user=false +privacy/collected_data/hands/used_for_tracking=false +privacy/collected_data/hands/collection_purposes=0 +privacy/collected_data/head/collected=false +privacy/collected_data/head/linked_to_user=false +privacy/collected_data/head/used_for_tracking=false +privacy/collected_data/head/collection_purposes=0 +privacy/collected_data/other_data_types/collected=false +privacy/collected_data/other_data_types/linked_to_user=false +privacy/collected_data/other_data_types/used_for_tracking=false +privacy/collected_data/other_data_types/collection_purposes=0 +icons/icon_1024x1024="" +icons/icon_1024x1024_dark="" +icons/icon_1024x1024_tinted="" +icons/settings_58x58="" +icons/settings_58x58_dark="" +icons/settings_58x58_tinted="" +icons/settings_87x87="" +icons/settings_87x87_dark="" +icons/settings_87x87_tinted="" +icons/notification_40x40="" +icons/notification_40x40_dark="" +icons/notification_40x40_tinted="" +icons/notification_60x60="" +icons/notification_60x60_dark="" +icons/notification_60x60_tinted="" +icons/notification_76x76="" +icons/notification_76x76_dark="" +icons/notification_76x76_tinted="" +icons/notification_114x114="" +icons/notification_114x114_dark="" +icons/notification_114x114_tinted="" +icons/spotlight_80x80="" +icons/spotlight_80x80_dark="" +icons/spotlight_80x80_tinted="" +icons/spotlight_120x120="" +icons/spotlight_120x120_dark="" +icons/spotlight_120x120_tinted="" +icons/iphone_120x120="" +icons/iphone_120x120_dark="" +icons/iphone_120x120_tinted="" +icons/iphone_180x180="" +icons/iphone_180x180_dark="" +icons/iphone_180x180_tinted="" +icons/ipad_167x167="" +icons/ipad_167x167_dark="" +icons/ipad_167x167_tinted="" +icons/ipad_152x152="" +icons/ipad_152x152_dark="" +icons/ipad_152x152_tinted="" +icons/ios_128x128="" +icons/ios_128x128_dark="" +icons/ios_128x128_tinted="" +icons/ios_192x192="" +icons/ios_192x192_dark="" +icons/ios_192x192_tinted="" +icons/ios_136x136="" +icons/ios_136x136_dark="" +icons/ios_136x136_tinted="" +icons/app_store_1024x1024="" +icons/app_store_1024x1024_dark="" +icons/app_store_1024x1024_tinted="" +application/targeted_device_family=2 +application/min_ios_version="14.0" +storyboard/image_scale_mode=0 +storyboard/custom_image@2x="" +storyboard/custom_image@3x="" +storyboard/use_custom_bg_color=false +storyboard/custom_bg_color=Color(0, 0, 0, 1) + +[preset.1] + +name="Android" +platform="Android" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="exports/stepstead.apk" +patches=PackedStringArray() +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.1.options] + +gradle_build/use_gradle_build=true +gradle_build/gradle_build_directory="" +gradle_build/android_source_template="" +gradle_build/compress_native_libraries=false +gradle_build/export_format=0 +gradle_build/min_sdk="" +gradle_build/target_sdk="" +architectures/armeabi-v7a=false +architectures/arm64-v8a=true +architectures/x86=false +architectures/x86_64=false +version/code=1 +version/name="0.1.0" +package/unique_name="com.stepstead.game" +package/name="Stepstead" +package/signed=true +package/app_category=2 +package/retain_data_on_uninstall=false +package/exclude_from_recents=false +package/show_in_android_tv=false +package/show_in_app_library=true +package/show_as_launcher_app=false +launcher_icons/main_192x192="" +launcher_icons/adaptive_foreground_432x432="" +launcher_icons/adaptive_background_432x432="" +launcher_icons/adaptive_monochrome_432x432="" +graphics/opengl_debug=false +xr_features/xr_mode=0 +screen/immersive_mode=true +screen/support_small=true +screen/support_normal=true +screen/support_large=true +screen/support_xlarge=true +user_data_backup/allow=false +command_line/extra_args="" +apk_expansion/enable=false +apk_expansion/SALT="" +apk_expansion/public_key="" +permissions/custom_permissions=PackedStringArray() +permissions/internet=true diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..aa478c5 --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ +S diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..a416c2e --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://p1gi0jm7msu0" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/native/README.md b/native/README.md new file mode 100644 index 0000000..9777e52 --- /dev/null +++ b/native/README.md @@ -0,0 +1,88 @@ +# Stepstead — Pedometer Native Eklentiler + +Adım sayar soyutlaması `autoload/pedometer.gd` içinde. Native plugin yoksa +otomatik **simülasyon** moduna düşer (editör/masaüstü test). Gerçek cihazda +adım okumak için aşağıdaki native eklentiler derlenip projeye eklenmeli. + +GDScript ↔ native sözleşmesi (her iki platform aynı): + +| Metot | Dönüş | Açıklama | +|---------------------|-------|--------------------------------------------| +| `is_available()` | bool | Cihazda adım sayar sensörü var mı | +| `start()` | void | Dinlemeyi başlat | +| `stop()` | void | Dinlemeyi durdur | +| `get_step_count()` | int | Açılıştan beri kümülatif adım | + +Singleton adları: Android = `StepCounter`, iOS = `Pedometer`. + +--- + +## Android (`stepcounter-android/`) — Mac'te derleme + +**Gereksinim:** Mac + Android Studio (Android SDK API 34 + JDK 17) + Godot 4.6. + +Gradle projesi hazır: `settings.gradle`, `build.gradle`, `gradle.properties`, +wrapper config (`gradle/wrapper/gradle-wrapper.properties` → Gradle 8.5). +Eksik tek şey wrapper binary'si ve godot-lib — aşağıda. + +### 1. Android Build Template'i kur (godot-lib.aar için) +Godot editöründe projeyi aç → **Project > Install Android Build Template**. +Bu, proje köküne `android/build/` oluşturur. Godot kütüphanesini bul: +```bash +find android/build -iname "godot-lib*.aar" +# örn: android/build/libs/release/godot-lib.template_release.aar +``` +Bu AAR'ı plugin libs/ içine kopyala: +```bash +mkdir -p native/stepcounter-android/libs +cp android/build/libs/release/godot-lib.*.aar native/stepcounter-android/libs/ +``` + +### 2. SDK yolunu bildir +```bash +cd native/stepcounter-android +echo "sdk.dir=$HOME/Library/Android/sdk" > local.properties +``` + +### 3. Gradle wrapper'ı üret + derle +Android Studio'da klasörü açarsan wrapper'ı otomatik üretir. CLI ile: +```bash +# Homebrew gradle ile tek seferlik wrapper üret (sonra ./gradlew yeter) +brew install gradle # yoksa +gradle wrapper --gradle-version 8.5 +./gradlew assembleRelease +``` + +### 4. AAR'ı projeye koy + etkinleştir +```bash +cp build/outputs/aar/stepcounter-release.aar \ + ../../addons/stepcounter/stepcounter-release.aar +``` +Godot: **Project > Project Settings > Plugins > StepCounter = Enable**. +Android export'unda **Use Gradle Build** açık olmalı. + +İzin: `ACTIVITY_RECOGNITION` (Android 10+). Export plugin manifest'e ekler, +`pedometer.gd` çalışma zamanında `OS.request_permission(...)` ile ister. + +> Not: `libs/`, `local.properties`, `.gradle/`, `build/` ve wrapper jar'ı +> repoya girmez (bkz `.gitignore`). + +--- + +## iOS (`pedometer-ios/`) — yazıldı + +`CMPedometer` (CoreMotion) Objective-C++ plugin. Singleton `Pedometer`, +aynı 4 metot. Kaynak + `.gdip` config + build/iPhone yükleme adımları: +**`pedometer-ios/README.md`**. + +> CMPedometer iOS Simulator'da çalışmaz → iPhone 13 ile gerçek cihaz testi. +> Derleme godot-ios-plugins harness (scons) ile, Xcode'da imzalı yüklenir. + +--- + +## Test (native plugin olmadan) + +Editör/masaüstünde HUD'daki **+100** butonu `Pedometer.sim_add(100)` çağırır, +ardından `/world/sync-steps` ile sunucuya gider. Sunucu dakika-başı tavan +(anti-cheat) uygular; aşan adımlar reddedilir ve `step_log`'a `accepted=false` +olarak yazılır. diff --git a/native/pedometer-ios/README.md b/native/pedometer-ios/README.md new file mode 100644 index 0000000..e9f006d --- /dev/null +++ b/native/pedometer-ios/README.md @@ -0,0 +1,75 @@ +# Stepstead — iOS Pedometer Plugin (CMPedometer) + +Godot 4 iOS plugin. `Pedometer` singleton'ı, `autoload/pedometer.gd` ile aynı +sözleşmeyi sağlar: `is_available / start / stop / get_step_count`. + +**Kaynak dosyalar:** +- `pedometer.h`, `pedometer.mm` — singleton + CMPedometer mantığı +- `pedometer_module.h`, `pedometer_module.mm` — init/deinit (singleton kaydı) +- `pedometer.gdip` — plugin config (CoreMotion.framework + NSMotionUsageDescription) + +> ⚠️ CMPedometer **iOS Simulator'da çalışmaz** (`is_available()` = false). +> Gerçek cihaz gerekir → **iPhone 13 ile test.** + +--- + +## Derleme — godot-ios-plugins harness (Mac, önerilen) + +**Gereksinim:** Mac + Xcode + command line tools + SCons (`brew install scons`). + +```bash +# 1. Resmi iOS plugin harness'ını klonla +git clone https://github.com/godotengine/godot-ios-plugins.git +cd godot-ios-plugins + +# 2. Godot 4.6 başlık dosyalarını üret (godot kaynağını çeker) +./scripts/generate_headers.sh 4.6.0.stable # repo README'sindeki sürüm formatı + +# 3. Bu plugin'i plugins/ altına kopyala +cp -r /path/Stepstead/native/pedometer-ios plugins/pedometer + +# 4. Derle (arm64, release) — çıktı bin/pedometer.*.a +scons target=template_release arch=arm64 plugin=pedometer version=4.6 +scons target=template_debug arch=arm64 plugin=pedometer version=4.6 +``` + +> SCons komutunun tam imzası harness sürümüne göre değişebilir; repo +> README'sini esas al. Çatı `plugins/pedometer/` altındaki tüm `.mm` +> dosyalarını otomatik derler. + +--- + +## Godot projesine ekleme + +1. Çıktıları projeye koy: + ``` + res://ios/plugins/pedometer/pedometer.a + res://ios/plugins/pedometer/pedometer.gdip + ``` + (`.gdip` zaten bu klasörde — `.a` ile birlikte kopyala.) +2. Godot: **Project > Export > iOS** preset'inde **Plugins** sekmesinde + `Pedometer` işaretli olmalı. +3. `.gdip` `NSMotionUsageDescription`'ı otomatik Info.plist'e ekler. + (Apple izni: ilk `start()` çağrısında sistem motion izni sorar.) + +--- + +## iPhone 13'e yükleme (gerçek test) + +1. Godot'ta iOS export → Xcode projesi üretir. +2. Xcode'da aç → **Signing & Capabilities**'da Apple ID (ücretsiz hesap olur, + 7 günlük provisioning) ile imzala. +3. iPhone 13'ü kabloyla bağla → Xcode'da hedef cihaz seç → **Run**. +4. Oyunda login → `Pedometer.start()` (world.gd otomatik çağırır) → + sistem "Motion & Fitness" izni sorar → izin ver. +5. Telefonu cebe at, yürü → adım bakiyesi 30 sn'de bir `/world/sync-steps` + ile artar (sunucu anti-cheat tavanı 250/dk uygular). + +--- + +## İleride (enhancement) + +`startPedometerUpdatesFromDate:` uygulama açıkken sayar. Arka planda/kapalıyken +atılan adımları toparlamak için `queryPedometerDataFromDate:toDate:withHandler:` +ile son sync zamanından şu ana kadarki geçmişi çekmek gerekir (iOS 7 günlük +adım geçmişi tutar). MVP'de yok — `get_step_count` sadece oturum sayımı. diff --git a/native/pedometer-ios/pedometer.gdip b/native/pedometer-ios/pedometer.gdip new file mode 100644 index 0000000..845fa71 --- /dev/null +++ b/native/pedometer-ios/pedometer.gdip @@ -0,0 +1,15 @@ +[config] +name="Pedometer" +binary="pedometer.a" +initialization="pedometer_init_module" +deinitialization="pedometer_deinit_module" + +[dependencies] +linked=[] +embedded=[] +system=["CoreMotion.framework"] +capabilities=[] +files=[] + +[plist] +NSMotionUsageDescription:string="Yürüyüş adımlarınızı sayarak oyunda ilerlemenizi sağlar." diff --git a/native/pedometer-ios/pedometer.h b/native/pedometer-ios/pedometer.h new file mode 100644 index 0000000..fc4955a --- /dev/null +++ b/native/pedometer-ios/pedometer.h @@ -0,0 +1,35 @@ +// Stepstead — iOS Pedometer plugin (CMPedometer) +// Godot 4 iOS plugin. Singleton adı: "Pedometer" +// +// GDScript sözleşmesi (autoload/pedometer.gd ile eşleşir): +// bool is_available() +// void start() +// void stop() +// int get_step_count() -> oturum başından beri kümülatif adım +#ifndef STEPSTEAD_PEDOMETER_H +#define STEPSTEAD_PEDOMETER_H + +#include "core/object/class_db.h" +#include "core/object/object.h" + +class Pedometer : public Object { + GDCLASS(Pedometer, Object); + + static Pedometer *instance; + +protected: + static void _bind_methods(); + +public: + bool is_available(); + void start(); + void stop(); + int get_step_count(); + + static Pedometer *get_singleton(); + + Pedometer(); + ~Pedometer(); +}; + +#endif // STEPSTEAD_PEDOMETER_H diff --git a/native/pedometer-ios/pedometer.mm b/native/pedometer-ios/pedometer.mm new file mode 100644 index 0000000..ef6f763 --- /dev/null +++ b/native/pedometer-ios/pedometer.mm @@ -0,0 +1,85 @@ +// Stepstead — iOS Pedometer plugin (CMPedometer) implementasyonu. +#import "pedometer.h" + +#import +#import + +// Objective-C tarafı: CMPedometer'ı tutar, adım sayısını günceller. +@interface StepsteadPedometer : NSObject +@property(nonatomic, strong) CMPedometer *pedometer; +@property(nonatomic, assign) int stepCount; +@property(nonatomic, strong) NSDate *sessionStart; +@property(nonatomic, assign) BOOL running; +@end + +@implementation StepsteadPedometer +@end + +static StepsteadPedometer *_ped = nil; + +Pedometer *Pedometer::instance = nullptr; + +void Pedometer::_bind_methods() { + ClassDB::bind_method(D_METHOD("is_available"), &Pedometer::is_available); + ClassDB::bind_method(D_METHOD("start"), &Pedometer::start); + ClassDB::bind_method(D_METHOD("stop"), &Pedometer::stop); + ClassDB::bind_method(D_METHOD("get_step_count"), &Pedometer::get_step_count); +} + +bool Pedometer::is_available() { + // Not: iOS Simulator'da daima false döner — gerçek cihaz gerekir. + return [CMPedometer isStepCountingAvailable] ? true : false; +} + +void Pedometer::start() { + if (![CMPedometer isStepCountingAvailable]) { + return; + } + if (_ped == nil) { + _ped = [[StepsteadPedometer alloc] init]; + _ped.pedometer = [[CMPedometer alloc] init]; + _ped.stepCount = 0; + } + if (_ped.running) { + return; + } + _ped.running = YES; + _ped.sessionStart = [NSDate date]; + _ped.stepCount = 0; + + // Uygulama açıkken canlı güncelleme. numberOfSteps = sessionStart'tan beri. + [_ped.pedometer startPedometerUpdatesFromDate:_ped.sessionStart + withHandler:^(CMPedometerData *_Nullable data, NSError *_Nullable error) { + if (data != nil && error == nil) { + _ped.stepCount = [data.numberOfSteps intValue]; + } + }]; +} + +void Pedometer::stop() { + if (_ped != nil && _ped.running) { + [_ped.pedometer stopPedometerUpdates]; + _ped.running = NO; + } +} + +int Pedometer::get_step_count() { + return _ped != nil ? _ped.stepCount : 0; +} + +Pedometer *Pedometer::get_singleton() { + return instance; +} + +Pedometer::Pedometer() { + ERR_FAIL_COND(instance != nullptr); + instance = this; +} + +Pedometer::~Pedometer() { + if (_ped != nil) { + [_ped.pedometer stopPedometerUpdates]; + _ped = nil; + } + instance = nullptr; +} diff --git a/native/pedometer-ios/pedometer_module.h b/native/pedometer-ios/pedometer_module.h new file mode 100644 index 0000000..d46405e --- /dev/null +++ b/native/pedometer-ios/pedometer_module.h @@ -0,0 +1,8 @@ +// Plugin init/deinit — godot-ios-plugins çatısı bu fonksiyonları çağırır. +#ifndef STEPSTEAD_PEDOMETER_MODULE_H +#define STEPSTEAD_PEDOMETER_MODULE_H + +void pedometer_init_module(); +void pedometer_deinit_module(); + +#endif // STEPSTEAD_PEDOMETER_MODULE_H diff --git a/native/pedometer-ios/pedometer_module.mm b/native/pedometer-ios/pedometer_module.mm new file mode 100644 index 0000000..5571c0b --- /dev/null +++ b/native/pedometer-ios/pedometer_module.mm @@ -0,0 +1,20 @@ +#import "pedometer_module.h" +#import "pedometer.h" + +#import "core/config/engine.h" +#import "core/object/class_db.h" + +Pedometer *pedometer_singleton = nullptr; + +void pedometer_init_module() { + ClassDB::register_class(); + pedometer_singleton = memnew(Pedometer); + Engine::get_singleton()->add_singleton(Engine::Singleton("Pedometer", pedometer_singleton)); +} + +void pedometer_deinit_module() { + if (pedometer_singleton) { + memdelete(pedometer_singleton); + pedometer_singleton = nullptr; + } +} diff --git a/native/stepcounter-android/.gitignore b/native/stepcounter-android/.gitignore new file mode 100644 index 0000000..e64dfdb --- /dev/null +++ b/native/stepcounter-android/.gitignore @@ -0,0 +1,8 @@ +.gradle/ +build/ +libs/ +local.properties +.idea/ +*.iml +# wrapper binary makinede üretilir +gradle/wrapper/gradle-wrapper.jar diff --git a/native/stepcounter-android/build.gradle b/native/stepcounter-android/build.gradle new file mode 100644 index 0000000..1aa4bd1 --- /dev/null +++ b/native/stepcounter-android/build.gradle @@ -0,0 +1,38 @@ +// StepCounter — Godot 4 Android plugin (AAR) +// Derleme (Mac, Android SDK + JDK 17): +// 1. godot-lib..release.aar dosyasını libs/ içine koy +// (Godot editöründen: AndroidStudio export template, veya +// https://github.com/godotengine/godot/releases içindeki +// godot-lib aar — Godot 4.6 ile eşleşmeli) +// 2. ./gradlew assembleRelease +// 3. Çıktı: build/outputs/aar/stepcounter-release.aar +// 4. AAR'ı res://addons/stepcounter/ altına kopyala + +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.stepstead.stepcounter' + compileSdk 34 + + defaultConfig { + minSdk 24 // Android 7.0 — TYPE_STEP_COUNTER için yeterli + targetSdk 34 + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } +} + +dependencies { + // Godot kütüphanesi — sürüm Godot editörüyle birebir eşleşmeli (4.6) + compileOnly fileTree(dir: 'libs', include: ['godot-lib.*.aar']) + implementation 'org.jetbrains.kotlin:kotlin-stdlib:2.1.0' +} diff --git a/native/stepcounter-android/gradle.properties b/native/stepcounter-android/gradle.properties new file mode 100644 index 0000000..dec9857 --- /dev/null +++ b/native/stepcounter-android/gradle.properties @@ -0,0 +1,6 @@ +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +android.useAndroidX=true +kotlin.code.style=official +android.nonTransitiveRClass=true +android.aapt2FromMavenOverride=/home/Jts/Android/Sdk/build-tools/34.0.0/aapt2 +android.disableResourceValidation=true diff --git a/native/stepcounter-android/gradle/wrapper/gradle-wrapper.properties b/native/stepcounter-android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..642629c --- /dev/null +++ b/native/stepcounter-android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Jan 17 12:08:26 PST 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/native/stepcounter-android/gradlew b/native/stepcounter-android/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/native/stepcounter-android/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/native/stepcounter-android/gradlew.bat b/native/stepcounter-android/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/native/stepcounter-android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/native/stepcounter-android/settings.gradle b/native/stepcounter-android/settings.gradle new file mode 100644 index 0000000..0c11eac --- /dev/null +++ b/native/stepcounter-android/settings.gradle @@ -0,0 +1,21 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + plugins { + id 'com.android.library' version '8.2.2' + id 'org.jetbrains.kotlin.android' version '2.1.0' + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = 'stepcounter' diff --git a/native/stepcounter-android/src/main/AndroidManifest.xml b/native/stepcounter-android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..62887a7 --- /dev/null +++ b/native/stepcounter-android/src/main/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/native/stepcounter-android/src/main/java/com/stepstead/stepcounter/StepCounterPlugin.kt b/native/stepcounter-android/src/main/java/com/stepstead/stepcounter/StepCounterPlugin.kt new file mode 100644 index 0000000..2f626c1 --- /dev/null +++ b/native/stepcounter-android/src/main/java/com/stepstead/stepcounter/StepCounterPlugin.kt @@ -0,0 +1,75 @@ +package com.stepstead.stepcounter + +import android.content.Context +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import org.godotengine.godot.Godot +import org.godotengine.godot.plugin.GodotPlugin +import org.godotengine.godot.plugin.SignalInfo +import org.godotengine.godot.plugin.UsedByGodot + +/** + * Godot 4 Android eklentisi — TYPE_STEP_COUNTER sensörü. + * + * GDScript sözleşmesi (Pedometer.gd ile eşleşir): + * bool is_available() + * void start() + * void stop() + * int get_step_count() -> reboot'tan beri kümülatif adım (Int) + * + * Sinyal: step_count_updated(total: Int) + * + * Singleton adı: "StepCounter" + */ +class StepCounterPlugin(godot: Godot) : GodotPlugin(godot), SensorEventListener { + + private var sensorManager: SensorManager? = null + private var stepSensor: Sensor? = null + private var lastTotal: Int = 0 + private var listening: Boolean = false + + override fun getPluginName(): String = "StepCounter" + + override fun getPluginSignals(): Set = + setOf(SignalInfo("step_count_updated", Integer::class.java)) + + @UsedByGodot + fun is_available(): Boolean { + val ctx = activity ?: return false + val sm = ctx.getSystemService(Context.SENSOR_SERVICE) as? SensorManager ?: return false + return sm.getDefaultSensor(Sensor.TYPE_STEP_COUNTER) != null + } + + @UsedByGodot + fun start() { + if (listening) return + val ctx = activity ?: return + sensorManager = ctx.getSystemService(Context.SENSOR_SERVICE) as? SensorManager + stepSensor = sensorManager?.getDefaultSensor(Sensor.TYPE_STEP_COUNTER) + if (stepSensor != null) { + sensorManager?.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_NORMAL) + listening = true + } + } + + @UsedByGodot + fun stop() { + if (!listening) return + sensorManager?.unregisterListener(this) + listening = false + } + + @UsedByGodot + fun get_step_count(): Int = lastTotal + + override fun onSensorChanged(event: SensorEvent?) { + if (event == null || event.sensor.type != Sensor.TYPE_STEP_COUNTER) return + // event.values[0] = cihaz açılışından beri toplam adım (float) + lastTotal = event.values[0].toInt() + emitSignal("step_count_updated", lastTotal) + } + + override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {} +} diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..384cd53 --- /dev/null +++ b/project.godot @@ -0,0 +1,53 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Stepstead" +config/description="Adım tabanlı MMO toplayıcı oyun" +config/version="0.1.0" +run/main_scene="res://scenes/splash.tscn" +config/features=PackedStringArray("4.6", "Mobile") +config/icon="res://icon.svg" + +[autoload] + +Config="*res://autoload/config.gd" +Api="*res://autoload/api.gd" +Auth="*res://autoload/auth.gd" +GameState="*res://autoload/game_state.gd" +Pedometer="*res://autoload/pedometer.gd" +WsClient="*res://autoload/ws_client.gd" + +[display] + +window/size/viewport_width=720 +window/size/viewport_height=1280 +window/stretch/mode="canvas_items" +window/stretch/aspect="keep_width" +window/handheld/orientation=1 + +[editor_plugins] + +enabled=PackedStringArray("res://addons/stepcounter/plugin.cfg") + +[input] + +ui_touch={ +"deadzone": 0.5, +"events": [Object(InputEventScreenTouch,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"index":0,"position":Vector2(0, 0),"canceled":false,"pressed":true,"double_tap":false,"script":null) +] +} + +[rendering] + +textures/canvas_textures/default_texture_filter=0 +renderer/rendering_method="mobile" +textures/vram_compression/import_etc2_astc=true diff --git a/scenes/character_create.tscn b/scenes/character_create.tscn new file mode 100644 index 0000000..ab573df --- /dev/null +++ b/scenes/character_create.tscn @@ -0,0 +1,57 @@ +[gd_scene load_steps=2 format=3 uid="uid://b0charcr00000"] + +[ext_resource type="Script" path="res://scripts/character_create.gd" id="1_cc"] + +[node name="CharacterCreate" type="Control"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource("1_cc") + +[node name="Bg" type="ColorRect" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color(0.961, 0.949, 0.929, 1) + +[node name="Panel" type="PanelContainer" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -260.0 +offset_top = -200.0 +offset_right = 260.0 +offset_bottom = 200.0 + +[node name="VBox" type="VBoxContainer" parent="Panel"] +custom_minimum_size = Vector2(440, 0) +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="Panel/VBox"] +text = "Karakter Oluştur" +horizontal_alignment = 1 +theme_override_font_sizes/font_size = 28 +theme_override_colors/font_color = Color(0.227, 0.353, 0.251, 1) + +[node name="Hint" type="Label" parent="Panel/VBox"] +text = "3-32 karakter, sadece harf/rakam/alt-tire" +horizontal_alignment = 1 +theme_override_colors/font_color = Color(0.4, 0.4, 0.4, 1) + +[node name="Name" type="LineEdit" parent="Panel/VBox"] +placeholder_text = "Karakter adı" +max_length = 32 + +[node name="Create" type="Button" parent="Panel/VBox"] +text = "Oluştur" + +[node name="Logout" type="Button" parent="Panel/VBox"] +text = "Çıkış" +flat = true + +[node name="Error" type="Label" parent="Panel/VBox"] +horizontal_alignment = 1 +autowrap_mode = 3 +theme_override_colors/font_color = Color(0.8, 0.2, 0.2, 1) diff --git a/scenes/login.tscn b/scenes/login.tscn new file mode 100644 index 0000000..fa6a9b0 --- /dev/null +++ b/scenes/login.tscn @@ -0,0 +1,54 @@ +[gd_scene load_steps=2 format=3 uid="uid://b0login000000"] + +[ext_resource type="Script" path="res://scripts/login.gd" id="1_login"] + +[node name="Login" type="Control"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource("1_login") + +[node name="Bg" type="ColorRect" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color(0.961, 0.949, 0.929, 1) + +[node name="Panel" type="PanelContainer" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -260.0 +offset_top = -260.0 +offset_right = 260.0 +offset_bottom = 260.0 + +[node name="VBox" type="VBoxContainer" parent="Panel"] +custom_minimum_size = Vector2(440, 0) +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="Panel/VBox"] +text = "Stepstead'e Giriş" +horizontal_alignment = 1 +theme_override_font_sizes/font_size = 28 +theme_override_colors/font_color = Color(0.227, 0.353, 0.251, 1) + +[node name="Email" type="LineEdit" parent="Panel/VBox"] +placeholder_text = "E-posta" + +[node name="Password" type="LineEdit" parent="Panel/VBox"] +placeholder_text = "Şifre" +secret = true + +[node name="LoginBtn" type="Button" parent="Panel/VBox"] +text = "Giriş Yap" + +[node name="RegisterBtn" type="Button" parent="Panel/VBox"] +text = "Hesabın yok mu? Kayıt ol" +flat = true + +[node name="Error" type="Label" parent="Panel/VBox"] +horizontal_alignment = 1 +theme_override_colors/font_color = Color(0.8, 0.2, 0.2, 1) diff --git a/scenes/register.tscn b/scenes/register.tscn new file mode 100644 index 0000000..92752cc --- /dev/null +++ b/scenes/register.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=2 format=3 uid="uid://b0reg0000000"] + +[ext_resource type="Script" path="res://scripts/register.gd" id="1_reg"] + +[node name="Register" type="Control"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource("1_reg") + +[node name="Bg" type="ColorRect" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color(0.961, 0.949, 0.929, 1) + +[node name="Panel" type="PanelContainer" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -260.0 +offset_top = -300.0 +offset_right = 260.0 +offset_bottom = 300.0 + +[node name="VBox" type="VBoxContainer" parent="Panel"] +custom_minimum_size = Vector2(440, 0) +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="Panel/VBox"] +text = "Kayıt Ol" +horizontal_alignment = 1 +theme_override_font_sizes/font_size = 28 +theme_override_colors/font_color = Color(0.227, 0.353, 0.251, 1) + +[node name="Email" type="LineEdit" parent="Panel/VBox"] +placeholder_text = "E-posta" + +[node name="Password" type="LineEdit" parent="Panel/VBox"] +placeholder_text = "Şifre (min 8 karakter)" +secret = true + +[node name="DisplayName" type="LineEdit" parent="Panel/VBox"] +placeholder_text = "Görünen isim (opsiyonel)" + +[node name="Submit" type="Button" parent="Panel/VBox"] +text = "Kayıt Ol" + +[node name="Back" type="Button" parent="Panel/VBox"] +text = "Geri" +flat = true + +[node name="Error" type="Label" parent="Panel/VBox"] +horizontal_alignment = 1 +autowrap_mode = 3 +theme_override_colors/font_color = Color(0.8, 0.2, 0.2, 1) diff --git a/scenes/splash.tscn b/scenes/splash.tscn new file mode 100644 index 0000000..a8ca28e --- /dev/null +++ b/scenes/splash.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=2 format=3 uid="uid://b0splash00000"] + +[ext_resource type="Script" path="res://scripts/splash.gd" id="1_splash"] + +[node name="Splash" type="Control"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource("1_splash") + +[node name="Bg" type="ColorRect" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color(0.227, 0.353, 0.251, 1) + +[node name="VBox" type="VBoxContainer" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -180.0 +offset_top = -80.0 +offset_right = 180.0 +offset_bottom = 80.0 +alignment = 1 + +[node name="Title" type="Label" parent="VBox"] +text = "Stepstead" +horizontal_alignment = 1 +theme_override_font_sizes/font_size = 64 +theme_override_colors/font_color = Color(0.961, 0.949, 0.929, 1) + +[node name="Tagline" type="Label" parent="VBox"] +text = "Her adımın değer kazanır" +horizontal_alignment = 1 +theme_override_colors/font_color = Color(0.961, 0.949, 0.929, 0.8) + +[node name="Status" type="Label" parent="VBox"] +text = "Yükleniyor..." +horizontal_alignment = 1 +theme_override_colors/font_color = Color(0.961, 0.949, 0.929, 0.6) diff --git a/scenes/world.tscn b/scenes/world.tscn new file mode 100644 index 0000000..10bd4d7 --- /dev/null +++ b/scenes/world.tscn @@ -0,0 +1,186 @@ +[gd_scene format=3 uid="uid://b0world000000"] + +[ext_resource type="Script" path="res://scripts/world.gd" id="1_world"] +[ext_resource type="Texture2D" path="res://assets/sprites/player.png" id="2_player"] +[ext_resource type="Script" path="res://scripts/hud.gd" id="3_hud"] +[ext_resource type="Script" path="res://scripts/toast.gd" id="4_toast"] +[ext_resource type="Script" path="res://scripts/inventory_panel.gd" id="5_inv"] +[ext_resource type="Script" path="res://scripts/craft_panel.gd" id="6_craft"] + +[node name="World" type="Node2D"] +script = ExtResource("1_world") + +[node name="Void" type="CanvasLayer" parent="."] +layer = -10 + +[node name="VoidBg" type="ColorRect" parent="Void"] +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color(0.03, 0.03, 0.05, 1) + +[node name="TileLayer" type="Node2D" parent="."] + +[node name="NodeLayer" type="Node2D" parent="."] + +[node name="Player" type="Sprite2D" parent="."] +z_index = 10 +texture = ExtResource("2_player") + +[node name="Camera" type="Camera2D" parent="Player"] +zoom = Vector2(2, 2) + +[node name="PanCamera" type="Camera2D" parent="."] +zoom = Vector2(1.5, 1.5) + +[node name="HUD" type="CanvasLayer" parent="."] +script = ExtResource("3_hud") + +[node name="TopBar" type="PanelContainer" parent="HUD"] +anchor_right = 1.0 +offset_bottom = 64.0 + +[node name="HBox" type="HBoxContainer" parent="HUD/TopBar"] +theme_override_constants/separation = 16 + +[node name="CharName" type="Label" parent="HUD/TopBar/HBox"] +text = "..." +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 18 + +[node name="Level" type="Label" parent="HUD/TopBar/HBox"] +text = "Lv 1" +theme_override_font_sizes/font_size = 18 + +[node name="Steps" type="Label" parent="HUD/TopBar/HBox"] +text = "👣 0" +theme_override_font_sizes/font_size = 18 + +[node name="AddSteps" type="Button" parent="HUD/TopBar/HBox"] +text = "+100" +tooltip_text = "Debug: 100 adım ekle" + +[node name="InventoryBtn" type="Button" parent="HUD/TopBar/HBox"] +text = "🎒" +tooltip_text = "Envanter" + +[node name="CraftBtn" type="Button" parent="HUD/TopBar/HBox"] +text = "🔨" +tooltip_text = "Üretim" + +[node name="Logout" type="Button" parent="HUD/TopBar/HBox"] +text = "Çıkış" + +[node name="RecenterBtn" type="Button" parent="HUD"] +visible = false +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -200.0 +offset_top = -80.0 +offset_right = -20.0 +offset_bottom = -20.0 +text = "📍 Konumuma Dön" + +[node name="InventoryPanel" type="PanelContainer" parent="HUD"] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -200.0 +offset_top = -260.0 +offset_right = 200.0 +offset_bottom = 260.0 +script = ExtResource("5_inv") + +[node name="Margin" type="MarginContainer" parent="HUD/InventoryPanel"] +theme_override_constants/margin_left = 16 +theme_override_constants/margin_right = 16 +theme_override_constants/margin_top = 16 +theme_override_constants/margin_bottom = 16 + +[node name="VBox" type="VBoxContainer" parent="HUD/InventoryPanel/Margin"] +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="HUD/InventoryPanel/Margin/VBox"] +text = "Envanter" +theme_override_font_sizes/font_size = 22 +horizontal_alignment = 1 + +[node name="Scroll" type="ScrollContainer" parent="HUD/InventoryPanel/Margin/VBox"] +size_flags_vertical = 3 + +[node name="List" type="VBoxContainer" parent="HUD/InventoryPanel/Margin/VBox/Scroll"] +size_flags_horizontal = 3 +theme_override_constants/separation = 6 + +[node name="CloseBtn" type="Button" parent="HUD/InventoryPanel/Margin/VBox"] +text = "Kapat" + +[node name="CraftPanel" type="PanelContainer" parent="HUD"] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -260.0 +offset_top = -300.0 +offset_right = 260.0 +offset_bottom = 300.0 +script = ExtResource("6_craft") + +[node name="Margin" type="MarginContainer" parent="HUD/CraftPanel"] +theme_override_constants/margin_left = 14 +theme_override_constants/margin_right = 14 +theme_override_constants/margin_top = 14 +theme_override_constants/margin_bottom = 14 + +[node name="VBox" type="VBoxContainer" parent="HUD/CraftPanel/Margin"] +theme_override_constants/separation = 10 + +[node name="Title" type="Label" parent="HUD/CraftPanel/Margin/VBox"] +text = "Üretim" +theme_override_font_sizes/font_size = 22 +horizontal_alignment = 1 + +[node name="FilterBox" type="HBoxContainer" parent="HUD/CraftPanel/Margin/VBox"] +theme_override_constants/separation = 6 + +[node name="Scroll" type="ScrollContainer" parent="HUD/CraftPanel/Margin/VBox"] +size_flags_vertical = 3 + +[node name="List" type="VBoxContainer" parent="HUD/CraftPanel/Margin/VBox/Scroll"] +size_flags_horizontal = 3 +theme_override_constants/separation = 8 + +[node name="CloseBtn" type="Button" parent="HUD/CraftPanel/Margin/VBox"] +text = "Kapat" + +[node name="Toast" type="CanvasLayer" parent="."] +script = ExtResource("4_toast") + +[node name="Anchor" type="Control" parent="Toast"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 + +[node name="VBox" type="VBoxContainer" parent="Toast/Anchor"] +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -240.0 +offset_top = -160.0 +offset_right = 240.0 +offset_bottom = -16.0 +alignment = 2 +theme_override_constants/separation = 6 + +[node name="MoveConfirm" type="ConfirmationDialog" parent="HUD"] +title = "Hareket" +initial_position = 2 +size = Vector2i(360, 180) +ok_button_text = "Git" +cancel_button_text = "İptal" +dialog_text = "" diff --git a/scripts/character_create.gd b/scripts/character_create.gd new file mode 100644 index 0000000..cf000ff --- /dev/null +++ b/scripts/character_create.gd @@ -0,0 +1,26 @@ +extends Control + +@onready var name_input: LineEdit = $Panel/VBox/Name +@onready var create_btn: Button = $Panel/VBox/Create +@onready var logout_btn: Button = $Panel/VBox/Logout +@onready var error: Label = $Panel/VBox/Error + +func _ready() -> void: + error.text = "" + create_btn.pressed.connect(_on_create) + logout_btn.pressed.connect(func(): + Auth.clear() + get_tree().change_scene_to_file("res://scenes/login.tscn")) + +func _on_create() -> void: + error.text = "" + create_btn.disabled = true + var res: Dictionary = await GameState.create_character(name_input.text.strip_edges()) + create_btn.disabled = false + if not res.ok: + var detail := "Karakter oluşturulamadı" + if res.body is Dictionary and res.body.has("detail"): + detail = str(res.body["detail"]) + error.text = detail + return + get_tree().change_scene_to_file("res://scenes/world.tscn") diff --git a/scripts/character_create.gd.uid b/scripts/character_create.gd.uid new file mode 100644 index 0000000..d7d6620 --- /dev/null +++ b/scripts/character_create.gd.uid @@ -0,0 +1 @@ +uid://cv25ehw0rw6qf diff --git a/scripts/chat_panel.gd b/scripts/chat_panel.gd new file mode 100644 index 0000000..7c4612b --- /dev/null +++ b/scripts/chat_panel.gd @@ -0,0 +1,179 @@ +extends PanelContainer +## Sohbet paneli — kod ile kurulur (tscn'de yok), WsClient chat sinyallerini dinler. +## hud.gd oluşturup HUD CanvasLayer'ına ekler. Node adı "ChatPanel" (world.gd blokaj kontrolü). + +const MAX_ROWS := 60 +const PANEL_HEIGHT := 480.0 + +var _list: VBoxContainer +var _scroll: ScrollContainer +var _input: LineEdit +var _tab_global: Button +var _tab_local: Button + +## Aktif kanal: "global" | "local". Mesajlar kanal başına bellekte tutulur, +## sekme değişince yeniden çizilir. +var _channel := "global" +var _msgs := {"global": [], "local": []} + +func _ready() -> void: + name = "ChatPanel" + visible = false + _build_ui() + WsClient.chat_received.connect(_on_chat) + WsClient.chat_history.connect(_on_history) + WsClient.local_chat_history.connect(_on_local_history) + # Lokasyon değişince yerel geçmiş bayatlar + GameState.traveled.connect(func(_p: Dictionary) -> void: + _msgs["local"] = [] + if visible and _channel == "local": + WsClient.request_local_history()) + +func _build_ui() -> void: + set_anchors_preset(Control.PRESET_BOTTOM_WIDE) + offset_top = -PANEL_HEIGHT + offset_left = 8 + offset_right = -8 + offset_bottom = -8 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.08, 0.1, 0.13, 0.95) + sb.set_corner_radius_all(10) + add_theme_stylebox_override("panel", sb) + + var margin := MarginContainer.new() + margin.add_theme_constant_override("margin_left", 12) + margin.add_theme_constant_override("margin_right", 12) + margin.add_theme_constant_override("margin_top", 8) + margin.add_theme_constant_override("margin_bottom", 8) + add_child(margin) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 6) + margin.add_child(vbox) + + var top := HBoxContainer.new() + var title := Label.new() + title.text = "💬 Sohbet" + title.add_theme_font_size_override("font_size", 18) + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + top.add_child(title) + _tab_global = Button.new() + _tab_global.text = "🌍 Genel" + _tab_global.toggle_mode = true + _tab_global.button_pressed = true + _tab_global.pressed.connect(func() -> void: _switch_channel("global")) + top.add_child(_tab_global) + _tab_local = Button.new() + _tab_local.text = "📍 Burada" + _tab_local.toggle_mode = true + _tab_local.pressed.connect(func() -> void: _switch_channel("local")) + top.add_child(_tab_local) + var close_btn := Button.new() + close_btn.text = "✕" + close_btn.pressed.connect(func() -> void: visible = false) + top.add_child(close_btn) + vbox.add_child(top) + + _scroll = ScrollContainer.new() + _scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL + _scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + vbox.add_child(_scroll) + + _list = VBoxContainer.new() + _list.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _list.add_theme_constant_override("separation", 4) + _scroll.add_child(_list) + + var bottom := HBoxContainer.new() + bottom.add_theme_constant_override("separation", 8) + _input = LineEdit.new() + _input.placeholder_text = "Mesaj yaz…" + _input.max_length = 300 + _input.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _input.text_submitted.connect(func(_t: String) -> void: _send()) + bottom.add_child(_input) + var send_btn := Button.new() + send_btn.text = "Gönder" + send_btn.pressed.connect(_send) + bottom.add_child(send_btn) + vbox.add_child(bottom) + +func open() -> void: + visible = true + if _channel == "local" and (_msgs["local"] as Array).is_empty(): + WsClient.request_local_history() + _scroll_to_bottom() + _input.grab_focus() + +func _switch_channel(ch: String) -> void: + _channel = ch + _tab_global.button_pressed = ch == "global" + _tab_local.button_pressed = ch == "local" + _input.placeholder_text = "Mesaj yaz…" if ch == "global" else "Buradakilere yaz…" + if ch == "local": + WsClient.request_local_history() + _rerender() + +func _send() -> void: + var msg := _input.text.strip_edges() + if msg == "": + return + WsClient.send_chat(msg, _channel) + _input.text = "" + _input.grab_focus() + +func _on_history(messages: Array) -> void: + _msgs["global"] = messages.duplicate() + if _channel == "global": + _rerender() + +func _on_local_history(messages: Array) -> void: + _msgs["local"] = messages.duplicate() + if _channel == "local": + _rerender() + +func _on_chat(msg: Dictionary) -> void: + var ch := str(msg.get("channel", "global")) + if not _msgs.has(ch): + return + var arr: Array = _msgs[ch] + arr.append(msg) + while arr.size() > MAX_ROWS: + arr.pop_front() + if ch == _channel: + _append_row(msg) + while _list.get_child_count() > MAX_ROWS: + var oldest := _list.get_child(0) + _list.remove_child(oldest) + oldest.queue_free() + _scroll_to_bottom() + +func _rerender() -> void: + for c in _list.get_children(): + c.queue_free() + for m in (_msgs[_channel] as Array): + if m is Dictionary: + _append_row(m) + _scroll_to_bottom() + +func _append_row(msg: Dictionary) -> void: + var own: bool = int(msg.get("char_id", 0)) == int(GameState.character.get("id", -1)) + var row := RichTextLabel.new() + row.bbcode_enabled = true + row.fit_content = true + row.scroll_active = false + row.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + row.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var name_color := "#7ee08a" if own else "#e0c060" + row.text = "[color=%s]%s:[/color] %s" % [ + name_color, + str(msg.get("name", "?")).replace("[", "["), + str(msg.get("text", "")).replace("[", "["), + ] + _list.add_child(row) + +func _scroll_to_bottom() -> void: + if not visible: + return + await get_tree().process_frame + _scroll.scroll_vertical = int(_scroll.get_v_scroll_bar().max_value) diff --git a/scripts/chat_panel.gd.uid b/scripts/chat_panel.gd.uid new file mode 100644 index 0000000..cf1519d --- /dev/null +++ b/scripts/chat_panel.gd.uid @@ -0,0 +1 @@ +uid://dn5l3bpgv7xdd diff --git a/scripts/city_map.gd b/scripts/city_map.gd new file mode 100644 index 0000000..403c53d --- /dev/null +++ b/scripts/city_map.gd @@ -0,0 +1,155 @@ +extends CanvasLayer +## Şehir haritası — bir şehir location'ının içi. Prosedürel placeholder zemin +## (bina blokları + yollar) üzerinde vendor NPC pinleri. Pine tıkla → dükkan (VendorShop). +## "🗺 Dünya Haritası" ile kapanır. world.gd oluşturur; açıkken world input'u durur. +## Node adı "CityMap". + +var _root: Control +var _canvas: Control +var _pins_box: Control +var _title: Label +var _shop: PanelContainer +var _vendors: Array = [] # {npc_id,name,role} +var _pin_pos: Array = [] # Vector2 ekran koordinatları (canvas _draw kullanır) +var _location_name := "" + +func _ready() -> void: + name = "CityMap" + layer = 4 + visible = false + _build_ui() + +func is_open() -> bool: + return visible + +func _build_ui() -> void: + _root = Control.new() + _root.set_anchors_preset(Control.PRESET_FULL_RECT) + _root.mouse_filter = Control.MOUSE_FILTER_STOP + add_child(_root) + + # Prosedürel zemin (buildings + yollar) — pin konumlarına göre çizilir + _canvas = CityCanvas.new() + _canvas.set_anchors_preset(Control.PRESET_FULL_RECT) + _canvas.mouse_filter = Control.MOUSE_FILTER_IGNORE + _root.add_child(_canvas) + + # Pin container (butonlar mutlak konumlu) + _pins_box = Control.new() + _pins_box.set_anchors_preset(Control.PRESET_FULL_RECT) + _pins_box.mouse_filter = Control.MOUSE_FILTER_IGNORE + _root.add_child(_pins_box) + + # Üst bar + var bar := PanelContainer.new() + bar.set_anchors_preset(Control.PRESET_TOP_WIDE) + bar.offset_bottom = 64 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.08, 0.09, 0.12, 0.95) + bar.add_theme_stylebox_override("panel", sb) + _root.add_child(bar) + var hb := HBoxContainer.new() + hb.add_theme_constant_override("separation", 10) + bar.add_child(hb) + var m := MarginContainer.new() + m.add_theme_constant_override("margin_left", 12) + m.add_theme_constant_override("margin_right", 12) + m.add_theme_constant_override("margin_top", 8) + m.add_theme_constant_override("margin_bottom", 8) + m.size_flags_horizontal = Control.SIZE_EXPAND_FILL + hb.add_child(m) + _title = Label.new() + _title.add_theme_font_size_override("font_size", 18) + m.add_child(_title) + var back := Button.new() + back.text = "🗺 Dünya Haritası" + back.pressed.connect(_close) + hb.add_child(back) + + # Satıcı dükkanı (alt-sheet) — pinlerin üstünde + _shop = preload("res://scripts/vendor_shop.gd").new() + add_child(_shop) + +func open() -> void: + visible = true + _title.text = "🏙 Yükleniyor…" + var res: Dictionary = await GameState.city_vendors() + if not res.ok or not (res.body is Dictionary): + _title.text = "🏙 Şehir yüklenemedi" + _vendors = [] + else: + _location_name = str(res.body.get("location_name", "Şehir")) + _vendors = res.body.get("vendors", []) + _title.text = "🏙 %s" % _location_name + _layout_pins() + +func _close() -> void: + _shop.visible = false + visible = false + +func _layout_pins() -> void: + for c in _pins_box.get_children(): + c.queue_free() + _pin_pos.clear() + var size := get_viewport().get_visible_rect().size + var n := _vendors.size() + if n == 0: + _canvas.queue_redraw() + return + # Zikzak yerleşim: üst bar altından alt nav üstüne kadar dağıt + var top := 110.0 + var bottom := size.y - 140.0 + for i in range(n): + var t := float(i) / float(maxi(1, n - 1)) if n > 1 else 0.5 + var y := lerpf(top, bottom, t) + var x := size.x * (0.30 if i % 2 == 0 else 0.68) + var pos := Vector2(x, y) + _pin_pos.append(pos) + _add_pin(_vendors[i], pos) + _canvas.pins = _pin_pos + _canvas.queue_redraw() + +func _add_pin(v: Dictionary, pos: Vector2) -> void: + var btn := Button.new() + var role := str(v.get("role", "")) + btn.text = "🏪\n%s" % str(v.get("name", "")) + btn.tooltip_text = role + btn.add_theme_font_size_override("font_size", 13) + btn.custom_minimum_size = Vector2(150, 64) + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.18, 0.15, 0.10, 0.96) + sb.border_color = Color(0.85, 0.7, 0.35) + sb.set_border_width_all(2) + sb.set_corner_radius_all(8) + btn.add_theme_stylebox_override("normal", sb) + _pins_box.add_child(btn) + btn.size = btn.custom_minimum_size + btn.position = pos - btn.custom_minimum_size / 2.0 + var npc_id := int(v.get("npc_id", 0)) + var vname := str(v.get("name", "")) + btn.pressed.connect(func() -> void: _shop.open(npc_id, vname)) + + +## Prosedürel şehir zemini — zemin, yollar, pin altı bina blokları. +class CityCanvas extends Control: + var pins: Array = [] + func _draw() -> void: + var s := size + # Zemin (toprak/çim degrade hissi) + draw_rect(Rect2(Vector2.ZERO, s), Color(0.16, 0.18, 0.13)) + draw_rect(Rect2(Vector2(0, s.y * 0.5), Vector2(s.x, s.y * 0.5)), Color(0.14, 0.15, 0.11)) + # Ana yol (dikey) + var road_col := Color(0.30, 0.27, 0.22) + draw_rect(Rect2(Vector2(s.x * 0.5 - 22, 90), Vector2(44, s.y - 220)), road_col) + # Pin altı bina blokları + for p in pins: + var bp: Vector2 = p + draw_line(Vector2(s.x * 0.5, bp.y), bp, road_col, 14.0) + var bsize := Vector2(120, 90) + var top_left := bp - Vector2(bsize.x / 2.0, bsize.y + 20) + draw_rect(Rect2(top_left, bsize), Color(0.28, 0.24, 0.20)) + draw_rect(Rect2(top_left, bsize), Color(0.5, 0.42, 0.30), false, 2.0) + var roof := PackedVector2Array([ + top_left + Vector2(-8, 0), top_left + Vector2(bsize.x + 8, 0), + top_left + Vector2(bsize.x / 2.0, -34)]) + draw_colored_polygon(roof, Color(0.45, 0.22, 0.18)) diff --git a/scripts/city_map.gd.uid b/scripts/city_map.gd.uid new file mode 100644 index 0000000..b899e92 --- /dev/null +++ b/scripts/city_map.gd.uid @@ -0,0 +1 @@ +uid://8gu6e0tl5yf8 diff --git a/scripts/craft_panel.gd b/scripts/craft_panel.gd new file mode 100644 index 0000000..b35aa26 --- /dev/null +++ b/scripts/craft_panel.gd @@ -0,0 +1,137 @@ +extends PanelContainer +## Üretim paneli — tarif listeler, üretim yapar. + +@onready var list: VBoxContainer = $Margin/VBox/Scroll/List +@onready var title_label: Label = $Margin/VBox/Title +@onready var close_btn: Button = $Margin/VBox/CloseBtn +@onready var filter_box: HBoxContainer = $Margin/VBox/FilterBox + +const SKILL_LABEL := { + "mining": "Madencilik", "fishing": "Balıkçılık", "foraging": "Bitki Toplama", + "woodcutting": "Ağaç Kesme", "hunting": "Avcılık", "combat": "Dövüş", + "smithing": "Demircilik", "alchemy": "Simyacılık", "cooking": "Yemek Pişirme", + "construction": "İnşa", +} + +var _recipes: Array = [] +var _filter: String = "" + +func _ready() -> void: + visible = false + close_btn.pressed.connect(func(): visible = false) + +func open() -> void: + visible = true + title_label.text = "Üretim — yükleniyor..." + _recipes = await GameState.list_recipes() + _build_filters() + _render() + +func _build_filters() -> void: + for c in filter_box.get_children(): + c.queue_free() + var skills_seen: Dictionary = {} + for r in _recipes: + skills_seen[r["skill"]] = true + var all_btn := Button.new() + all_btn.text = "Tümü" + all_btn.toggle_mode = true + all_btn.button_pressed = _filter == "" + all_btn.pressed.connect(func(): + _filter = "" + _render() + _build_filters()) + filter_box.add_child(all_btn) + for sk in skills_seen.keys(): + var b := Button.new() + b.text = SKILL_LABEL.get(sk, sk) + b.toggle_mode = true + b.button_pressed = _filter == sk + b.pressed.connect(func(): + _filter = sk + _render() + _build_filters()) + filter_box.add_child(b) + +func _render() -> void: + for c in list.get_children(): + c.queue_free() + var shown := 0 + title_label.text = "Üretim" + for r in _recipes: + if _filter != "" and r["skill"] != _filter: + continue + shown += 1 + list.add_child(_make_row(r)) + if shown == 0: + var l := Label.new() + l.text = "Bu kategoride tarif yok." + l.add_theme_color_override("font_color", Color(0.6, 0.6, 0.6)) + list.add_child(l) + +func _make_row(r: Dictionary) -> Control: + var card := PanelContainer.new() + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.16, 0.18, 0.20, 1) if r.get("craftable", false) else Color(0.12, 0.13, 0.14, 1) + sb.set_corner_radius_all(6) + sb.set_content_margin_all(10) + card.add_theme_stylebox_override("panel", sb) + + var vb := VBoxContainer.new() + vb.add_theme_constant_override("separation", 4) + card.add_child(vb) + + var top := HBoxContainer.new() + top.add_theme_constant_override("separation", 8) + vb.add_child(top) + + var title := Label.new() + title.text = "%s → %dx %s" % [str(r["name"]), int(r["output_qty"]), str(r["output_item_name"])] + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + title.add_theme_font_size_override("font_size", 15) + if not r.get("unlocked", false): + title.add_theme_color_override("font_color", Color(0.55, 0.55, 0.55)) + top.add_child(title) + + var btn := Button.new() + btn.text = "Üret" + btn.disabled = not r.get("craftable", false) + btn.pressed.connect(_on_craft.bind(str(r["code"]))) + top.add_child(btn) + + var meta := Label.new() + var skill_tr: String = SKILL_LABEL.get(r["skill"], r["skill"]) + meta.text = "%s Lv %d • %d adım • +%d XP" % [skill_tr, int(r["required_level"]), int(r["step_cost"]), int(r["xp_reward"])] + meta.add_theme_color_override("font_color", Color(0.7, 0.7, 0.75)) + meta.add_theme_font_size_override("font_size", 12) + vb.add_child(meta) + + for ing in r["ingredients"]: + var row := Label.new() + var have := int(ing["have"]) + var need := int(ing["qty"]) + var color: Color = Color(0.6, 0.85, 0.5) if have >= need else Color(0.85, 0.4, 0.4) + row.text = " • %s %d/%d" % [str(ing["item_name"]), have, need] + row.add_theme_color_override("font_color", color) + row.add_theme_font_size_override("font_size", 12) + vb.add_child(row) + + if not r.get("unlocked", false): + var lock := Label.new() + lock.text = " 🔒 %s Lv %d gerekli" % [skill_tr, int(r["required_level"])] + lock.add_theme_color_override("font_color", Color(0.9, 0.6, 0.3)) + lock.add_theme_font_size_override("font_size", 12) + vb.add_child(lock) + + return card + +func _on_craft(code: String) -> void: + var res: Dictionary = await GameState.craft_recipe(code, 1) + if not res.ok: + var msg := "Üretim başarısız" + if res.body is Dictionary and res.body.has("detail"): + msg = str(res.body["detail"]) + print("[craft fail] ", msg) + # Refresh + _recipes = await GameState.list_recipes() + _render() diff --git a/scripts/craft_panel.gd.uid b/scripts/craft_panel.gd.uid new file mode 100644 index 0000000..90df80f --- /dev/null +++ b/scripts/craft_panel.gd.uid @@ -0,0 +1 @@ +uid://y2a48brb8qaw diff --git a/scripts/daily_panel.gd b/scripts/daily_panel.gd new file mode 100644 index 0000000..c437eb4 --- /dev/null +++ b/scripts/daily_panel.gd @@ -0,0 +1,113 @@ +extends PanelContainer +## Günlük hedef + streak paneli — kod ile kurulur, hud.gd ekler. Node adı "DailyPanel". + +var _title: Label +var _progress: ProgressBar +var _progress_lbl: Label +var _streak_lbl: Label +var _claim_btn: Button +var _result_lbl: Label + +func _ready() -> void: + name = "DailyPanel" + visible = false + _build_ui() + +func _build_ui() -> void: + set_anchors_preset(Control.PRESET_CENTER_TOP) + offset_top = 90 + offset_left = -170 + offset_right = 170 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.10, 0.12, 0.10, 0.97) + sb.border_color = Color(0.75, 0.62, 0.35) + sb.set_border_width_all(1) + sb.set_corner_radius_all(10) + sb.set_content_margin_all(14) + add_theme_stylebox_override("panel", sb) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 8) + add_child(vbox) + + var top := HBoxContainer.new() + _title = Label.new() + _title.text = "🎁 Günlük Hedef" + _title.add_theme_font_size_override("font_size", 17) + _title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + top.add_child(_title) + var close_btn := Button.new() + close_btn.text = "✕" + close_btn.pressed.connect(func() -> void: visible = false) + top.add_child(close_btn) + vbox.add_child(top) + + _progress = ProgressBar.new() + _progress.custom_minimum_size = Vector2(0, 22) + _progress.show_percentage = false + vbox.add_child(_progress) + + _progress_lbl = Label.new() + _progress_lbl.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _progress_lbl.add_theme_font_size_override("font_size", 13) + vbox.add_child(_progress_lbl) + + _streak_lbl = Label.new() + _streak_lbl.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _streak_lbl.add_theme_font_size_override("font_size", 13) + _streak_lbl.add_theme_color_override("font_color", Color(0.9, 0.78, 0.5)) + vbox.add_child(_streak_lbl) + + _claim_btn = Button.new() + _claim_btn.text = "Ödülü Al" + _claim_btn.pressed.connect(_on_claim) + vbox.add_child(_claim_btn) + + _result_lbl = Label.new() + _result_lbl.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _result_lbl.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _result_lbl.add_theme_font_size_override("font_size", 13) + _result_lbl.visible = false + vbox.add_child(_result_lbl) + +func open() -> void: + visible = true + _result_lbl.visible = false + await refresh() + +func refresh() -> void: + var res: Dictionary = await GameState.daily_status() + if not res.ok or not (res.body is Dictionary): + _progress_lbl.text = "Yüklenemedi" + _claim_btn.disabled = true + return + var d: Dictionary = res.body + var goal := int(d.get("goal", 1)) + var today := int(d.get("today_steps", 0)) + _progress.max_value = goal + _progress.value = mini(today, goal) + _progress_lbl.text = "👣 %d / %d" % [today, goal] + _streak_lbl.text = "🔥 Streak: %d gün • Ödül: +%d👣 +%d🪙" % [ + int(d.get("streak_days", 0)), int(d.get("bonus_steps", 0)), int(d.get("bonus_gold", 0))] + if bool(d.get("claimed_today", false)): + _claim_btn.text = "✅ Bugün alındı" + _claim_btn.disabled = true + elif bool(d.get("claimable", false)): + _claim_btn.text = "🎁 Ödülü Al" + _claim_btn.disabled = false + else: + _claim_btn.text = "Hedefe %d adım kaldı" % maxi(0, goal - today) + _claim_btn.disabled = true + +func _on_claim() -> void: + _claim_btn.disabled = true + var res: Dictionary = await GameState.daily_claim() + if res.ok and res.body is Dictionary: + var b: Dictionary = res.body + _result_lbl.text = "🎉 +%d👣 +%d🪙 — %d günlük streak!" % [ + int(b.get("bonus_steps", 0)), int(b.get("bonus_gold", 0)), int(b.get("streak_days", 0))] + _result_lbl.visible = true + elif res.body is Dictionary and res.body.has("detail"): + _result_lbl.text = "⚠ " + str(res.body["detail"]) + _result_lbl.visible = true + await refresh() diff --git a/scripts/daily_panel.gd.uid b/scripts/daily_panel.gd.uid new file mode 100644 index 0000000..b9c7dc5 --- /dev/null +++ b/scripts/daily_panel.gd.uid @@ -0,0 +1 @@ +uid://bd438ja6h0wv0 diff --git a/scripts/event_dialog.gd b/scripts/event_dialog.gd new file mode 100644 index 0000000..be16ddf --- /dev/null +++ b/scripts/event_dialog.gd @@ -0,0 +1,151 @@ +extends Control +## D&D tarzı olay kartı — tam ekran karartma + kart. Seçim → sunucu çözer (d20 + skill). +## Kod ile kurulur, world.gd HUD'a ekler. Node adı "EventDialog". + +var _card_title: Label +var _card_image: TextureRect +var _card_text: Label +var _choices_box: VBoxContainer +var _result_box: VBoxContainer +var _result_text: Label +var _check_text: Label +var _continue_btn: Button + +func _ready() -> void: + name = "EventDialog" + visible = false + set_anchors_preset(Control.PRESET_FULL_RECT) + _build_ui() + +func _build_ui() -> void: + var dim := ColorRect.new() + dim.color = Color(0, 0, 0, 0.65) + dim.set_anchors_preset(Control.PRESET_FULL_RECT) + add_child(dim) + + var center := CenterContainer.new() + center.set_anchors_preset(Control.PRESET_FULL_RECT) + add_child(center) + + var card := PanelContainer.new() + card.custom_minimum_size = Vector2(560, 0) + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.13, 0.11, 0.09, 0.98) + sb.border_color = Color(0.75, 0.62, 0.35) + sb.set_border_width_all(2) + sb.set_corner_radius_all(12) + sb.set_content_margin_all(20) + card.add_theme_stylebox_override("panel", sb) + center.add_child(card) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 12) + card.add_child(vbox) + + _card_title = Label.new() + _card_title.add_theme_font_size_override("font_size", 22) + _card_title.add_theme_color_override("font_color", Color(0.9, 0.78, 0.5)) + _card_title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + vbox.add_child(_card_title) + + # Olay illüstrasyonu — assets/events/.webp varsa gösterilir + _card_image = TextureRect.new() + _card_image.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + _card_image.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + _card_image.custom_minimum_size = Vector2(0, 280) + _card_image.visible = false + vbox.add_child(_card_image) + + _card_text = Label.new() + _card_text.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _card_text.add_theme_font_size_override("font_size", 15) + vbox.add_child(_card_text) + + _choices_box = VBoxContainer.new() + _choices_box.add_theme_constant_override("separation", 8) + vbox.add_child(_choices_box) + + _result_box = VBoxContainer.new() + _result_box.add_theme_constant_override("separation", 8) + _result_box.visible = false + vbox.add_child(_result_box) + + _check_text = Label.new() + _check_text.add_theme_font_size_override("font_size", 14) + _check_text.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _result_box.add_child(_check_text) + + _result_text = Label.new() + _result_text.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _result_text.add_theme_font_size_override("font_size", 15) + _result_box.add_child(_result_text) + + _continue_btn = Button.new() + _continue_btn.text = "Devam" + _continue_btn.pressed.connect(func() -> void: visible = false) + _result_box.add_child(_continue_btn) + +func show_event(ev: Dictionary) -> void: + _card_title.text = "🎴 %s" % str(ev.get("name", "Olay")) + var img_path := "res://assets/events/%s.webp" % str(ev.get("code", "")) + if ev.has("code") and ResourceLoader.exists(img_path): + _card_image.texture = load(img_path) + _card_image.visible = true + else: + _card_image.visible = false + _card_text.text = str(ev.get("text", "")) + _result_box.visible = false + _choices_box.visible = true + for c in _choices_box.get_children(): + c.queue_free() + var choices: Array = ev.get("choices", []) + for i in range(choices.size()): + var ch: Dictionary = choices[i] + var btn := Button.new() + btn.text = str(ch.get("text", "Seçenek %d" % (i + 1))) + btn.pressed.connect(_on_choice.bind(i)) + _choices_box.add_child(btn) + visible = true + +func _on_choice(index: int) -> void: + for c in _choices_box.get_children(): + if c is Button: + (c as Button).disabled = true + var res: Dictionary = await GameState.resolve_event(index) + if not res.ok: + var msg := "Olay çözülemedi" + if res.body is Dictionary and res.body.has("detail"): + msg = str(res.body["detail"]) + _result_text.text = "⚠ " + msg + _check_text.text = "" + _choices_box.visible = false + _result_box.visible = true + return + var b: Dictionary = res.body + var parts: Array[String] = [] + var check: Variant = b.get("skill_check") + if check is Dictionary: + var ok: bool = bool(check.get("success", false)) + _check_text.text = "🎲 %d + %d ≥ %d — %s" % [ + int(check.get("roll", 0)), int(check.get("skill_level", 0)), + int(check.get("dc", 0)), "BAŞARILI!" if ok else "BAŞARISIZ"] + _check_text.add_theme_color_override("font_color", + Color(0.5, 0.9, 0.5) if ok else Color(0.95, 0.5, 0.4)) + else: + _check_text.text = "" + parts.append(str(b.get("result_text", ""))) + var sd := int(b.get("steps_delta", 0)) + if sd != 0: + parts.append("%s%d adım" % ["+" if sd > 0 else "", sd]) + var gd := int(b.get("gold_delta", 0)) + if gd != 0: + parts.append("%s%d 🪙 gold" % ["+" if gd > 0 else "", gd]) + var gained: Array = b.get("items_gained", []) + for it in gained: + parts.append("+%d× %s" % [int(it.get("qty", 1)), str(it.get("name", ""))]) + var xg: Variant = b.get("xp_gained") + if xg is Dictionary: + parts.append("+%d XP (%s)" % [int(xg.get("xp", 0)), str(xg.get("skill", ""))]) + _result_text.text = "\n".join(parts) + _choices_box.visible = false + _result_box.visible = true diff --git a/scripts/event_dialog.gd.uid b/scripts/event_dialog.gd.uid new file mode 100644 index 0000000..e57cdc6 --- /dev/null +++ b/scripts/event_dialog.gd.uid @@ -0,0 +1 @@ +uid://ljumj6x4prg5 diff --git a/scripts/game.gd.uid b/scripts/game.gd.uid new file mode 100644 index 0000000..9fc2a38 --- /dev/null +++ b/scripts/game.gd.uid @@ -0,0 +1 @@ +uid://c3hrqbpw3015v diff --git a/scripts/hud.gd b/scripts/hud.gd new file mode 100644 index 0000000..54459de --- /dev/null +++ b/scripts/hud.gd @@ -0,0 +1,159 @@ +extends CanvasLayer +## HUD — üst bilgi çubuğu (karakter/altın/adım + ikincil ikonlar) ve +## alt navigasyon çubuğu (Harita/Çanta/Üretim/Market/Karakter/Ayarlar). +## Ana paneller kod ile kurulur; alt bar soldan kayarak girer. + +@onready var char_label: Label = $TopBar/HBox/CharName +@onready var level_label: Label = $TopBar/HBox/Level +@onready var steps_label: Label = $TopBar/HBox/Steps +@onready var logout_btn: Button = $TopBar/HBox/Logout +@onready var add_steps_btn: Button = $TopBar/HBox/AddSteps +@onready var inventory_btn: Button = $TopBar/HBox/InventoryBtn +@onready var inventory_panel: PanelContainer = $InventoryPanel +@onready var craft_btn: Button = $TopBar/HBox/CraftBtn +@onready var craft_panel: PanelContainer = $CraftPanel + +const NAV_HEIGHT := 96 + +var chat_panel: PanelContainer +var market_panel: PanelContainer +var daily_panel: PanelContainer +var skills_panel: PanelContainer +var leaderboard_panel: PanelContainer +var settings_panel: PanelContainer +var gold_label: Label +var _nav_layer: CanvasLayer + +func _ready() -> void: + add_steps_btn.pressed.connect(_add_steps_debug) + # Eski üst-bar nav butonları alt çubuğa taşındı — gizle (tscn'e dokunmadan) + inventory_btn.visible = false + craft_btn.visible = false + logout_btn.visible = false + + # Kod-ile-kurulan paneller + chat_panel = preload("res://scripts/chat_panel.gd").new() + add_child(chat_panel) + market_panel = preload("res://scripts/market_panel.gd").new() + add_child(market_panel) + daily_panel = preload("res://scripts/daily_panel.gd").new() + add_child(daily_panel) + skills_panel = preload("res://scripts/skills_panel.gd").new() + add_child(skills_panel) + leaderboard_panel = preload("res://scripts/leaderboard_panel.gd").new() + add_child(leaderboard_panel) + settings_panel = preload("res://scripts/settings_panel.gd").new() + add_child(settings_panel) + settings_panel.logout_requested.connect(_logout) + + # Üst bar: altın etiketi + ikincil ikonlar (sohbet/lider/günlük) + var hbox: HBoxContainer = $TopBar/HBox + gold_label = Label.new() + gold_label.add_theme_color_override("font_color", Color(0.95, 0.8, 0.35)) + hbox.add_child(gold_label) + hbox.move_child(gold_label, steps_label.get_index() + 1) + _top_icon(hbox, "💬", _open_chat) + _top_icon(hbox, "🏆", _open_leaderboard) + _top_icon(hbox, "🎁", _open_daily) + + _build_bottom_nav() + _render() + GameState.character_loaded.connect(func(_c): _render()) + +func _top_icon(hbox: HBoxContainer, txt: String, cb: Callable) -> void: + var b := Button.new() + b.text = txt + hbox.add_child(b) + b.pressed.connect(cb) + +# --- Alt navigasyon çubuğu --- + +func _build_bottom_nav() -> void: + _nav_layer = CanvasLayer.new() + _nav_layer.layer = 3 + add_child(_nav_layer) + + var bar := PanelContainer.new() + bar.set_anchors_preset(Control.PRESET_BOTTOM_WIDE) + bar.offset_top = -NAV_HEIGHT + bar.offset_bottom = 0 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.09, 0.10, 0.13, 0.98) + sb.border_color = Color(0.2, 0.22, 0.28) + sb.border_width_top = 2 + bar.add_theme_stylebox_override("panel", sb) + _nav_layer.add_child(bar) + + var hbox := HBoxContainer.new() + hbox.add_theme_constant_override("separation", 0) + bar.add_child(hbox) + + _nav_btn(hbox, "🗺", "Harita", close_all_panels) + _nav_btn(hbox, "🎒", "Çanta", func() -> void: _toggle(inventory_panel)) + _nav_btn(hbox, "🛠", "Üretim", func() -> void: _toggle(craft_panel)) + _nav_btn(hbox, "🏪", "Market", func() -> void: _toggle(market_panel)) + _nav_btn(hbox, "👤", "Karakter", func() -> void: _toggle(skills_panel)) + _nav_btn(hbox, "⚙", "Ayarlar", func() -> void: _toggle(settings_panel)) + + # Soldan kaydırarak gir + _nav_layer.offset = Vector2(-720, 0) + var tw := create_tween() + tw.tween_property(_nav_layer, "offset", Vector2.ZERO, 0.35).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) + +func _nav_btn(hbox: HBoxContainer, icon: String, label: String, cb: Callable) -> void: + var b := Button.new() + b.size_flags_horizontal = Control.SIZE_EXPAND_FILL + b.custom_minimum_size = Vector2(0, NAV_HEIGHT) + b.focus_mode = Control.FOCUS_NONE + b.flat = true + b.text = "%s\n%s" % [icon, label] + b.add_theme_font_size_override("font_size", 13) + b.autowrap_mode = TextServer.AUTOWRAP_OFF + hbox.add_child(b) + b.pressed.connect(cb) + +func _all_panels() -> Array: + return [inventory_panel, craft_panel, market_panel, skills_panel, + daily_panel, leaderboard_panel, chat_panel, settings_panel] + +func close_all_panels() -> void: + for p in _all_panels(): + if p != null: + p.visible = false + +# Bir paneli aç/kapat; açarken diğerlerini kapat (tek panel görünür) +func _toggle(panel: PanelContainer) -> void: + if panel == null: + return + if panel.visible: + panel.visible = false + return + close_all_panels() + panel.open() + +func _open_chat() -> void: _toggle(chat_panel) +func _open_leaderboard() -> void: _toggle(leaderboard_panel) +func _open_daily() -> void: _toggle(daily_panel) + +func _add_steps_debug() -> void: + # Gerçek pedometer yolunu test eder: simülasyon sayacına ekle + sunucuya sync + Pedometer.sim_add(100) + await Pedometer.sync_now() + _render() + +func _render() -> void: + var c: Dictionary = GameState.character + if c.is_empty(): + return + char_label.text = str(c.get("name", "")) + level_label.text = "Lv %d" % int(c.get("level", 1)) + steps_label.text = "👣 %d" % int(c.get("step_balance", 0)) + if gold_label != null: + gold_label.text = "🪙 %d" % int(c.get("gold", 0)) + +func _logout() -> void: + WsClient.stop() + Auth.clear() + GameState.character = {} + GameState.skills = [] + get_tree().change_scene_to_file("res://scenes/login.tscn") diff --git a/scripts/hud.gd.uid b/scripts/hud.gd.uid new file mode 100644 index 0000000..7110577 --- /dev/null +++ b/scripts/hud.gd.uid @@ -0,0 +1 @@ +uid://b1mucbwfpp41x diff --git a/scripts/inventory_panel.gd b/scripts/inventory_panel.gd new file mode 100644 index 0000000..92cb596 --- /dev/null +++ b/scripts/inventory_panel.gd @@ -0,0 +1,66 @@ +extends PanelContainer +## Envanter paneli — açıldığında /world/inventory yükler, listede gösterir. + +@onready var list: VBoxContainer = $Margin/VBox/Scroll/List +@onready var title: Label = $Margin/VBox/Title +@onready var close_btn: Button = $Margin/VBox/CloseBtn + +const RARITY_COLOR := { + "common": Color(0.85, 0.85, 0.85), + "uncommon": Color(0.4, 0.85, 0.4), + "rare": Color(0.4, 0.6, 1.0), + "epic": Color(0.7, 0.4, 1.0), + "legendary": Color(1.0, 0.7, 0.2), +} + +func _ready() -> void: + visible = false + close_btn.pressed.connect(func(): visible = false) + GameState.inventory_changed.connect(_render) + +func open() -> void: + visible = true + await GameState.load_inventory() + _render() + +func _render() -> void: + for c in list.get_children(): + c.queue_free() + title.text = "Envanter (%d)" % GameState.inventory.size() + if GameState.inventory.is_empty(): + var l := Label.new() + l.text = "Boş. Bir node'dan kaynak topla." + l.add_theme_color_override("font_color", Color(0.6, 0.6, 0.6)) + list.add_child(l) + return + for it in GameState.inventory: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 12) + var name := Label.new() + name.text = str(it.get("item_name", "")) + name.add_theme_color_override("font_color", RARITY_COLOR.get(str(it.get("rarity", "common")), Color.WHITE)) + name.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(name) + var qty := Label.new() + qty.text = "x%d" % int(it.get("qty", 1)) + row.add_child(qty) + # Consumable ise "Kullan" butonu (effect backend'den gelir, örn. +50 adım) + if str(it.get("item_type", "")) == "consumable" and it.get("effect") != null: + var effect: Dictionary = it["effect"] + var btn := Button.new() + btn.text = "Kullan (+%d)" % int(effect.get("amount", 0)) + var code: String = str(it.get("item_code", "")) + btn.pressed.connect(_on_use_item.bind(btn, code)) + row.add_child(btn) + list.add_child(row) + +func _on_use_item(btn: Button, code: String) -> void: + btn.disabled = true + var res: Dictionary = await GameState.use_item(code, 1) + if not res.ok: + var msg := "Kullanılamadı" + if res.body is Dictionary and res.body.has("detail"): + msg = str(res.body["detail"]) + print("[use-item fail] ", msg) + btn.disabled = false + # Başarıda inventory_changed sinyali paneli zaten yeniden çizer diff --git a/scripts/inventory_panel.gd.uid b/scripts/inventory_panel.gd.uid new file mode 100644 index 0000000..e544fcd --- /dev/null +++ b/scripts/inventory_panel.gd.uid @@ -0,0 +1 @@ +uid://bdgv55r7u52uy diff --git a/scripts/leaderboard_panel.gd b/scripts/leaderboard_panel.gd new file mode 100644 index 0000000..ac22e78 --- /dev/null +++ b/scripts/leaderboard_panel.gd @@ -0,0 +1,117 @@ +extends PanelContainer +## Liderlik tablosu — 👣 adım / ⭐ level / 🪙 gold sekmeleri, top 20 + kendi sıran. +## Kod ile kurulur. Node adı "LeaderboardPanel". + +const PANEL_HEIGHT := 560.0 + +var _list: VBoxContainer +var _tabs := {} +var _my_rank_lbl: Label +var _by := "steps" + +func _ready() -> void: + name = "LeaderboardPanel" + visible = false + _build_ui() + +func _build_ui() -> void: + set_anchors_preset(Control.PRESET_BOTTOM_WIDE) + offset_top = -PANEL_HEIGHT + offset_left = 8 + offset_right = -8 + offset_bottom = -8 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.12, 0.10, 0.13, 0.97) + sb.set_corner_radius_all(10) + add_theme_stylebox_override("panel", sb) + + var margin := MarginContainer.new() + margin.add_theme_constant_override("margin_left", 14) + margin.add_theme_constant_override("margin_right", 14) + margin.add_theme_constant_override("margin_top", 10) + margin.add_theme_constant_override("margin_bottom", 10) + add_child(margin) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 6) + margin.add_child(vbox) + + var top := HBoxContainer.new() + var title := Label.new() + title.text = "🏆 Liderlik" + title.add_theme_font_size_override("font_size", 18) + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + top.add_child(title) + for entry in [["steps", "👣"], ["level", "⭐"], ["gold", "🪙"]]: + var btn := Button.new() + btn.text = str(entry[1]) + btn.toggle_mode = true + var key := str(entry[0]) + btn.pressed.connect(func() -> void: _switch(key)) + top.add_child(btn) + _tabs[key] = btn + (_tabs["steps"] as Button).button_pressed = true + var close_btn := Button.new() + close_btn.text = "✕" + close_btn.pressed.connect(func() -> void: visible = false) + top.add_child(close_btn) + vbox.add_child(top) + + _my_rank_lbl = Label.new() + _my_rank_lbl.add_theme_font_size_override("font_size", 13) + _my_rank_lbl.add_theme_color_override("font_color", Color(0.75, 0.7, 0.55)) + vbox.add_child(_my_rank_lbl) + + var scroll := ScrollContainer.new() + scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL + scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + vbox.add_child(scroll) + + _list = VBoxContainer.new() + _list.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _list.add_theme_constant_override("separation", 4) + scroll.add_child(_list) + +func open() -> void: + visible = true + await _render() + +func _switch(by: String) -> void: + _by = by + for key in _tabs: + (_tabs[key] as Button).button_pressed = key == by + _render() + +func _render() -> void: + for c in _list.get_children(): + c.queue_free() + var res: Dictionary = await GameState.leaderboard(_by) + if not res.ok or not (res.body is Dictionary): + _my_rank_lbl.text = "Yüklenemedi" + return + var d: Dictionary = res.body + _my_rank_lbl.text = "Senin sıran: #%d" % int(d.get("my_rank", 0)) + var unit := {"steps": "👣", "level": "⭐", "gold": "🪙"}.get(_by, "") + for r in d.get("rows", []): + if r is Dictionary: + _list.add_child(_row(r, str(unit))) + +func _row(r: Dictionary, unit: String) -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 10) + var me: bool = bool(r.get("me", false)) + var rank := int(r.get("rank", 0)) + var rank_lbl := Label.new() + rank_lbl.text = ["🥇", "🥈", "🥉"][rank - 1] if rank <= 3 else "#%d" % rank + rank_lbl.custom_minimum_size = Vector2(44, 0) + row.add_child(rank_lbl) + var name_lbl := Label.new() + name_lbl.text = "%s (Lv %d)" % [str(r.get("name", "")), int(r.get("level", 1))] + name_lbl.size_flags_horizontal = Control.SIZE_EXPAND_FILL + if me: + name_lbl.add_theme_color_override("font_color", Color(0.5, 0.9, 0.5)) + row.add_child(name_lbl) + var val_lbl := Label.new() + val_lbl.text = "%s %d" % [unit, int(r.get("value", 0))] + row.add_child(val_lbl) + return row diff --git a/scripts/leaderboard_panel.gd.uid b/scripts/leaderboard_panel.gd.uid new file mode 100644 index 0000000..947c534 --- /dev/null +++ b/scripts/leaderboard_panel.gd.uid @@ -0,0 +1 @@ +uid://d0ce3a7plnqyr diff --git a/scripts/location_panel.gd b/scripts/location_panel.gd new file mode 100644 index 0000000..f10c7ad --- /dev/null +++ b/scripts/location_panel.gd @@ -0,0 +1,210 @@ +extends PanelContainer +## Lokasyon paneli — bulunduğun yerin kaynakları (topla butonları), buradaki oyuncular. +## Kod ile kurulur, world.gd HUD'a ekler. Node adı "LocationPanel". + +const PANEL_HEIGHT := 620.0 + +signal city_requested + +var _city_btn: Button +var _title: Label +var _desc: Label +var _players: Label +var _list: VBoxContainer +var _scroll: ScrollContainer +var _header: TextureRect + +func _ready() -> void: + name = "LocationPanel" + visible = false + _build_ui() + +func _build_ui() -> void: + set_anchors_preset(Control.PRESET_BOTTOM_WIDE) + offset_top = -PANEL_HEIGHT + offset_left = 8 + offset_right = -8 + offset_bottom = -8 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.10, 0.12, 0.10, 0.97) + sb.set_corner_radius_all(10) + add_theme_stylebox_override("panel", sb) + + var margin := MarginContainer.new() + margin.add_theme_constant_override("margin_left", 14) + margin.add_theme_constant_override("margin_right", 14) + margin.add_theme_constant_override("margin_top", 10) + margin.add_theme_constant_override("margin_bottom", 10) + add_child(margin) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 6) + margin.add_child(vbox) + + # Lokasyon başlık görseli (assets/locations/.webp — varsa) + _header = TextureRect.new() + _header.custom_minimum_size = Vector2(0, 190) + _header.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + _header.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_COVERED + _header.clip_contents = true + _header.visible = false + vbox.add_child(_header) + + var top := HBoxContainer.new() + _title = Label.new() + _title.add_theme_font_size_override("font_size", 20) + _title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + top.add_child(_title) + _city_btn = Button.new() + _city_btn.text = "🏙 Şehir Haritası" + _city_btn.visible = false + _city_btn.pressed.connect(func() -> void: + visible = false + city_requested.emit()) + top.add_child(_city_btn) + var close_btn := Button.new() + close_btn.text = "✕" + close_btn.pressed.connect(func() -> void: visible = false) + top.add_child(close_btn) + vbox.add_child(top) + + _desc = Label.new() + _desc.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _desc.add_theme_font_size_override("font_size", 13) + _desc.add_theme_color_override("font_color", Color(0.7, 0.72, 0.65)) + vbox.add_child(_desc) + + _players = Label.new() + _players.add_theme_font_size_override("font_size", 13) + _players.add_theme_color_override("font_color", Color(0.55, 0.75, 0.95)) + vbox.add_child(_players) + + _scroll = ScrollContainer.new() + _scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL + _scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + vbox.add_child(_scroll) + + _list = VBoxContainer.new() + _list.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _list.add_theme_constant_override("separation", 6) + _scroll.add_child(_list) + +func open() -> void: + visible = true + await refresh() + +func refresh() -> void: + var res: Dictionary = await GameState.load_location() + if not res.ok or not (res.body is Dictionary): + _title.text = "Lokasyon yüklenemedi" + return + var loc: Dictionary = res.body + _title.text = "📍 %s" % str(loc.get("name", "")) + _city_btn.visible = str(loc.get("type", "")) in ["city", "village"] + _desc.text = str(loc.get("description", "")) + var img_path := "res://assets/locations/%s.webp" % str(loc.get("code", "")) + if ResourceLoader.exists(img_path): + _header.texture = load(img_path) + _header.visible = true + else: + _header.visible = false + var names: Array = loc.get("players_here", []) + _players.text = "👥 Burada: %s" % ", ".join(names) if not names.is_empty() else "👥 Burada başka kimse yok" + + for c in _list.get_children(): + c.queue_free() + _list.add_child(_camp_row(loc)) + var resources: Array = loc.get("resources", []) + if resources.is_empty(): + var l := Label.new() + l.text = "Burada toplanacak kaynak yok." + l.add_theme_color_override("font_color", Color(0.6, 0.6, 0.6)) + _list.add_child(l) + return + var bal := int(GameState.character.get("step_balance", 0)) + for r in resources: + if r is Dictionary: + _list.add_child(_resource_row(r, bal)) + +const SKILL_TR := {"mining": "Madencilik", "fishing": "Balıkçılık", "foraging": "Toplama", + "woodcutting": "Ağaç Kesme", "hunting": "Avcılık"} + +func _resource_row(r: Dictionary, bal: int) -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 10) + var info := VBoxContainer.new() + info.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var name_lbl := Label.new() + name_lbl.text = str(r.get("item_name", "")) + name_lbl.add_theme_font_size_override("font_size", 15) + info.add_child(name_lbl) + var meta := Label.new() + var skill: String = str(r.get("skill", "")) + meta.text = "%s • %d👣 • +%dXP" % [SKILL_TR.get(skill, skill), int(r.get("step_cost", 0)), int(r.get("xp", 0))] + meta.add_theme_font_size_override("font_size", 12) + meta.add_theme_color_override("font_color", Color(0.6, 0.62, 0.58)) + info.add_child(meta) + row.add_child(info) + + var btn := Button.new() + var cd := int(r.get("cooldown_remaining", 0)) + var tool_ok: bool = bool(r.get("tool_ok", true)) + var cost := int(r.get("step_cost", 0)) + if not tool_ok: + btn.text = "🔒 %s gerekli" % str(r.get("tool_needed", "Tool")) + btn.disabled = true + elif cd > 0: + btn.text = "⏳ %ds" % cd + btn.disabled = true + elif bal < cost: + btn.text = "👣 yetersiz" + btn.disabled = true + else: + btn.text = "Topla" + var code := str(r.get("item_code", "")) + btn.pressed.connect(_on_gather.bind(btn, code)) + row.add_child(btn) + return row + +const CAMP_ITEM_TR := {"log_oak": "Meşe Odunu", "stone_small": "Küçük Taş", "vine": "Sarmaşık"} + +func _camp_row(loc: Dictionary) -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 10) + var lbl := Label.new() + lbl.size_flags_horizontal = Control.SIZE_EXPAND_FILL + lbl.add_theme_font_size_override("font_size", 13) + if bool(loc.get("has_camp", false)): + lbl.text = "⛺ Kampın var — toplama maliyeti -%25" + lbl.add_theme_color_override("font_color", Color(0.6, 0.85, 0.6)) + row.add_child(lbl) + return row + var cost_items: Dictionary = loc.get("camp_cost_items", {}) + var parts: Array[String] = [] + for code in cost_items: + parts.append("%d %s" % [int(cost_items[code]), str(CAMP_ITEM_TR.get(code, code))]) + lbl.text = "⛺ Kamp: %s + %d👣 (-%%25 maliyet)" % [", ".join(parts), int(loc.get("camp_step_cost", 100))] + lbl.add_theme_color_override("font_color", Color(0.75, 0.7, 0.55)) + row.add_child(lbl) + var btn := Button.new() + btn.text = "Kur" + btn.pressed.connect(_on_build_camp.bind(btn)) + row.add_child(btn) + return row + +func _on_build_camp(btn: Button) -> void: + btn.disabled = true + var res: Dictionary = await GameState.build_camp() + if not res.ok and res.body is Dictionary and res.body.has("detail"): + print("[camp fail] ", str(res.body["detail"])) + await refresh() + +func _on_gather(btn: Button, code: String) -> void: + btn.disabled = true + var res: Dictionary = await GameState.gather(code) + if not res.ok: + var msg := "Toplanamadı" + if res.body is Dictionary and res.body.has("detail"): + msg = str(res.body["detail"]) + print("[gather fail] ", msg) + await refresh() diff --git a/scripts/location_panel.gd.uid b/scripts/location_panel.gd.uid new file mode 100644 index 0000000..975b1ac --- /dev/null +++ b/scripts/location_panel.gd.uid @@ -0,0 +1 @@ +uid://kp3wsy87dnj1 diff --git a/scripts/login.gd b/scripts/login.gd new file mode 100644 index 0000000..41f1e9e --- /dev/null +++ b/scripts/login.gd @@ -0,0 +1,32 @@ +extends Control + +@onready var email_input: LineEdit = $Panel/VBox/Email +@onready var pw_input: LineEdit = $Panel/VBox/Password +@onready var login_btn: Button = $Panel/VBox/LoginBtn +@onready var register_btn: Button = $Panel/VBox/RegisterBtn +@onready var error_label: Label = $Panel/VBox/Error + +func _ready() -> void: + error_label.text = "" + login_btn.pressed.connect(_on_login) + register_btn.pressed.connect(_on_goto_register) + +func _on_login() -> void: + error_label.text = "" + login_btn.disabled = true + var res: Dictionary = await Auth.login(email_input.text.strip_edges(), pw_input.text) + login_btn.disabled = false + if not res.ok: + var detail := "Giriş başarısız" + if res.body is Dictionary and res.body.has("detail"): + detail = str(res.body["detail"]) + error_label.text = detail + return + var char_res: Dictionary = await GameState.load_character() + if char_res.ok: + get_tree().change_scene_to_file("res://scenes/world.tscn") + else: + get_tree().change_scene_to_file("res://scenes/character_create.tscn") + +func _on_goto_register() -> void: + get_tree().change_scene_to_file("res://scenes/register.tscn") diff --git a/scripts/login.gd.uid b/scripts/login.gd.uid new file mode 100644 index 0000000..980da47 --- /dev/null +++ b/scripts/login.gd.uid @@ -0,0 +1 @@ +uid://0drmet5cxbp4 diff --git a/scripts/market_panel.gd b/scripts/market_panel.gd new file mode 100644 index 0000000..13a002f --- /dev/null +++ b/scripts/market_panel.gd @@ -0,0 +1,293 @@ +extends PanelContainer +## Pazar paneli — oyuncu ilanları + NPC vendor. Kod ile kurulur, hud.gd ekler. +## Node adı "MarketPanel" (world.gd blokaj kontrolü). +## Görüntüleme her yerden; ilan verme / satın alma / vendor satışı sadece pazar'da +## (sunucu zaten doğrular, UI da butonları kilitler). + +const PANEL_HEIGHT := 640.0 +const MARKET_LOCATION := "pazar" + +var _tab_listings: Button +var _tab_sell: Button +var _tab_stock: Button +var _list: VBoxContainer +var _scroll: ScrollContainer +var _search: LineEdit +var _info: Label +var _tab := "listings" # "listings" | "sell" | "stock" + +func _ready() -> void: + name = "MarketPanel" + visible = false + _build_ui() + +func _build_ui() -> void: + set_anchors_preset(Control.PRESET_BOTTOM_WIDE) + offset_top = -PANEL_HEIGHT + offset_left = 8 + offset_right = -8 + offset_bottom = -8 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.13, 0.11, 0.08, 0.97) + sb.set_corner_radius_all(10) + add_theme_stylebox_override("panel", sb) + + var margin := MarginContainer.new() + margin.add_theme_constant_override("margin_left", 12) + margin.add_theme_constant_override("margin_right", 12) + margin.add_theme_constant_override("margin_top", 8) + margin.add_theme_constant_override("margin_bottom", 8) + add_child(margin) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 6) + margin.add_child(vbox) + + var top := HBoxContainer.new() + var title := Label.new() + title.text = "🏪 Pazar" + title.add_theme_font_size_override("font_size", 18) + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + top.add_child(title) + _tab_listings = Button.new() + _tab_listings.text = "📜 İlanlar" + _tab_listings.toggle_mode = true + _tab_listings.button_pressed = true + _tab_listings.pressed.connect(func() -> void: _switch("listings")) + top.add_child(_tab_listings) + _tab_sell = Button.new() + _tab_sell.text = "🎒 Sat" + _tab_sell.toggle_mode = true + _tab_sell.pressed.connect(func() -> void: _switch("sell")) + top.add_child(_tab_sell) + _tab_stock = Button.new() + _tab_stock.text = "🧰 Vendor" + _tab_stock.toggle_mode = true + _tab_stock.pressed.connect(func() -> void: _switch("stock")) + top.add_child(_tab_stock) + var close_btn := Button.new() + close_btn.text = "✕" + close_btn.pressed.connect(func() -> void: visible = false) + top.add_child(close_btn) + vbox.add_child(top) + + _info = Label.new() + _info.add_theme_font_size_override("font_size", 13) + _info.add_theme_color_override("font_color", Color(0.75, 0.7, 0.55)) + vbox.add_child(_info) + + _search = LineEdit.new() + _search.placeholder_text = "🔍 Ara…" + _search.text_submitted.connect(func(_t: String) -> void: refresh()) + vbox.add_child(_search) + + _scroll = ScrollContainer.new() + _scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL + _scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + vbox.add_child(_scroll) + + _list = VBoxContainer.new() + _list.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _list.add_theme_constant_override("separation", 6) + _scroll.add_child(_list) + +func _at_market() -> bool: + return str(GameState.character.get("location_code", "")) == MARKET_LOCATION + +func open() -> void: + visible = true + refresh() + +func _switch(tab: String) -> void: + _tab = tab + _tab_listings.button_pressed = tab == "listings" + _tab_sell.button_pressed = tab == "sell" + _tab_stock.button_pressed = tab == "stock" + _search.visible = tab == "listings" + refresh() + +func refresh() -> void: + _info.text = ("🪙 %d" % int(GameState.character.get("gold", 0))) + \ + ("" if _at_market() else " • ⚠ İşlem için Pazar'a git (sadece vitrin)") + for c in _list.get_children(): + c.queue_free() + if _tab == "listings": + await _render_listings() + elif _tab == "sell": + await _render_sell() + else: + await _render_stock() + +func _render_listings() -> void: + var rows: Array = await GameState.market_listings(_search.text.strip_edges()) + if rows.is_empty(): + _list.add_child(_muted("Açık ilan yok.")) + return + for r in rows: + if r is Dictionary: + _list.add_child(_listing_row(r)) + +func _listing_row(r: Dictionary) -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 10) + var info := VBoxContainer.new() + info.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var name_lbl := Label.new() + name_lbl.text = "%s ×%d" % [str(r.get("item_name", "")), int(r.get("qty", 0))] + name_lbl.add_theme_font_size_override("font_size", 15) + info.add_child(name_lbl) + var meta := Label.new() + meta.text = "🪙 %d/adet • %s" % [int(r.get("unit_price", 0)), str(r.get("seller_name", ""))] + meta.add_theme_font_size_override("font_size", 12) + meta.add_theme_color_override("font_color", Color(0.6, 0.58, 0.5)) + info.add_child(meta) + row.add_child(info) + + var btn := Button.new() + if bool(r.get("mine", false)): + btn.text = "İptal" + btn.pressed.connect(_on_cancel.bind(btn, int(r.get("id", 0)))) + else: + var total: int = int(r.get("qty", 0)) * int(r.get("unit_price", 0)) + btn.text = "Al (🪙 %d)" % total + if not _at_market(): + btn.disabled = true + elif int(GameState.character.get("gold", 0)) < total: + btn.text = "🪙 yetersiz" + btn.disabled = true + else: + btn.pressed.connect(_on_buy.bind(btn, int(r.get("id", 0)))) + row.add_child(btn) + return row + +func _render_sell() -> void: + var rows: Array = await GameState.vendor_prices() + if rows.is_empty(): + _list.add_child(_muted("Envanterin boş.")) + return + var at_market := _at_market() + for r in rows: + if r is Dictionary: + _list.add_child(_sell_row(r, at_market)) + +func _sell_row(r: Dictionary, at_market: bool) -> VBoxContainer: + var box := VBoxContainer.new() + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 8) + var name_lbl := Label.new() + name_lbl.text = "%s ×%d" % [str(r.get("item_name", "")), int(r.get("qty", 0))] + name_lbl.add_theme_font_size_override("font_size", 15) + name_lbl.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(name_lbl) + + var qty_spin := SpinBox.new() + qty_spin.min_value = 1 + qty_spin.max_value = int(r.get("qty", 1)) + qty_spin.value = 1 + row.add_child(qty_spin) + + var vend_btn := Button.new() + vend_btn.text = "Vendor 🪙 %d" % int(r.get("unit_price", 0)) + vend_btn.disabled = not at_market + vend_btn.pressed.connect(_on_vendor_sell.bind(vend_btn, str(r.get("item_code", "")), qty_spin)) + row.add_child(vend_btn) + box.add_child(row) + + var row2 := HBoxContainer.new() + row2.add_theme_constant_override("separation", 8) + var spacer := Control.new() + spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row2.add_child(spacer) + var price_lbl := Label.new() + price_lbl.text = "İlan fiyatı:" + price_lbl.add_theme_font_size_override("font_size", 12) + row2.add_child(price_lbl) + var price_spin := SpinBox.new() + price_spin.min_value = 1 + price_spin.max_value = 1000000 + price_spin.value = maxi(1, int(r.get("unit_price", 1)) * 2) + row2.add_child(price_spin) + var list_btn := Button.new() + list_btn.text = "📜 İlan Ver" + list_btn.disabled = not at_market + list_btn.pressed.connect(_on_list.bind(list_btn, str(r.get("item_code", "")), qty_spin, price_spin)) + row2.add_child(list_btn) + box.add_child(row2) + return box + +func _render_stock() -> void: + var rows: Array = await GameState.vendor_stock() + if rows.is_empty(): + _list.add_child(_muted("Vendor stoku yüklenemedi.")) + return + var at_market := _at_market() + var gold := int(GameState.character.get("gold", 0)) + for r in rows: + if r is Dictionary: + _list.add_child(_stock_row(r, at_market, gold)) + +func _stock_row(r: Dictionary, at_market: bool, gold: int) -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 8) + var name_lbl := Label.new() + name_lbl.text = str(r.get("item_name", "")) + name_lbl.add_theme_font_size_override("font_size", 15) + name_lbl.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(name_lbl) + var qty_spin := SpinBox.new() + qty_spin.min_value = 1 + qty_spin.max_value = 10 + qty_spin.value = 1 + row.add_child(qty_spin) + var price := int(r.get("unit_price", 0)) + var btn := Button.new() + btn.text = "Al 🪙 %d" % price + if not at_market: + btn.disabled = true + elif gold < price: + btn.text = "🪙 yetersiz" + btn.disabled = true + else: + btn.pressed.connect(_on_vendor_buy.bind(btn, str(r.get("item_code", "")), qty_spin)) + row.add_child(btn) + return row + +func _on_vendor_buy(btn: Button, code: String, qty_spin: SpinBox) -> void: + btn.disabled = true + var res: Dictionary = await GameState.vendor_buy(code, int(qty_spin.value)) + _report(res) + refresh() + +func _on_buy(btn: Button, listing_id: int) -> void: + btn.disabled = true + var res: Dictionary = await GameState.market_buy(listing_id) + _report(res) + refresh() + +func _on_cancel(btn: Button, listing_id: int) -> void: + btn.disabled = true + var res: Dictionary = await GameState.market_cancel(listing_id) + _report(res) + refresh() + +func _on_vendor_sell(btn: Button, code: String, qty_spin: SpinBox) -> void: + btn.disabled = true + var res: Dictionary = await GameState.vendor_sell(code, int(qty_spin.value)) + _report(res) + refresh() + +func _on_list(btn: Button, code: String, qty_spin: SpinBox, price_spin: SpinBox) -> void: + btn.disabled = true + var res: Dictionary = await GameState.market_list(code, int(qty_spin.value), int(price_spin.value)) + _report(res) + refresh() + +func _report(res: Dictionary) -> void: + if not res.ok and res.body is Dictionary and res.body.has("detail"): + _info.text = "⚠ " + str(res.body["detail"]) + +func _muted(text: String) -> Label: + var l := Label.new() + l.text = text + l.add_theme_color_override("font_color", Color(0.6, 0.6, 0.6)) + return l diff --git a/scripts/market_panel.gd.uid b/scripts/market_panel.gd.uid new file mode 100644 index 0000000..79d38d8 --- /dev/null +++ b/scripts/market_panel.gd.uid @@ -0,0 +1 @@ +uid://ckdntvohya4hp diff --git a/scripts/register.gd b/scripts/register.gd new file mode 100644 index 0000000..e1e3ed4 --- /dev/null +++ b/scripts/register.gd @@ -0,0 +1,28 @@ +extends Control + +@onready var email: LineEdit = $Panel/VBox/Email +@onready var pw: LineEdit = $Panel/VBox/Password +@onready var name_input: LineEdit = $Panel/VBox/DisplayName +@onready var submit_btn: Button = $Panel/VBox/Submit +@onready var back_btn: Button = $Panel/VBox/Back +@onready var error: Label = $Panel/VBox/Error + +func _ready() -> void: + error.text = "" + submit_btn.pressed.connect(_on_submit) + back_btn.pressed.connect(func(): get_tree().change_scene_to_file("res://scenes/login.tscn")) + +func _on_submit() -> void: + error.text = "" + submit_btn.disabled = true + var res: Dictionary = await Auth.register(email.text.strip_edges(), pw.text, name_input.text.strip_edges()) + submit_btn.disabled = false + if not res.ok: + var detail := "Kayıt başarısız" + if res.body is Dictionary and res.body.has("detail"): + detail = str(res.body["detail"]) + error.text = detail + return + error.text = "Doğrulama e-postası gönderildi. Şimdi giriş yapabilirsin." + await get_tree().create_timer(1.5).timeout + get_tree().change_scene_to_file("res://scenes/login.tscn") diff --git a/scripts/register.gd.uid b/scripts/register.gd.uid new file mode 100644 index 0000000..926d076 --- /dev/null +++ b/scripts/register.gd.uid @@ -0,0 +1 @@ +uid://p2qk5fny80mq diff --git a/scripts/settings_panel.gd b/scripts/settings_panel.gd new file mode 100644 index 0000000..bdd24e2 --- /dev/null +++ b/scripts/settings_panel.gd @@ -0,0 +1,119 @@ +extends PanelContainer +## Ayarlar paneli — ses/müzik/bildirim toggle, hesap bilgisi, çıkış, sürüm. +## Kod ile kurulur. Node adı "SettingsPanel". Alt-sheet (skills_panel deseni). + +const PANEL_HEIGHT := 520.0 + +signal logout_requested + +var _sound_chk: CheckButton +var _music_chk: CheckButton +var _notif_chk: CheckButton +var _email_lbl: Label + +func _ready() -> void: + name = "SettingsPanel" + visible = false + _build_ui() + +func _build_ui() -> void: + set_anchors_preset(Control.PRESET_BOTTOM_WIDE) + offset_top = -PANEL_HEIGHT + offset_left = 8 + offset_right = -8 + offset_bottom = -8 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.10, 0.10, 0.13, 0.97) + sb.set_corner_radius_all(10) + add_theme_stylebox_override("panel", sb) + + var margin := MarginContainer.new() + margin.add_theme_constant_override("margin_left", 16) + margin.add_theme_constant_override("margin_right", 16) + margin.add_theme_constant_override("margin_top", 12) + margin.add_theme_constant_override("margin_bottom", 12) + add_child(margin) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 10) + margin.add_child(vbox) + + var top := HBoxContainer.new() + var title := Label.new() + title.text = "⚙ Ayarlar" + title.add_theme_font_size_override("font_size", 18) + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + top.add_child(title) + var close_btn := Button.new() + close_btn.text = "✕" + close_btn.pressed.connect(func() -> void: visible = false) + top.add_child(close_btn) + vbox.add_child(top) + + vbox.add_child(_section("🔊 Ses")) + _sound_chk = _toggle_row(vbox, "Ses efektleri", Config.sound_on, func(v: bool) -> void: + Config.sound_on = v + Config.save_settings()) + _music_chk = _toggle_row(vbox, "Müzik", Config.music_on, func(v: bool) -> void: + Config.music_on = v + Config.save_settings()) + + vbox.add_child(_section("🔔 Bildirim")) + _notif_chk = _toggle_row(vbox, "Bildirimlere izin ver", Config.notif_on, func(v: bool) -> void: + Config.notif_on = v + Config.save_settings()) + + vbox.add_child(_section("👤 Hesap")) + _email_lbl = Label.new() + _email_lbl.add_theme_color_override("font_color", Color(0.75, 0.8, 0.88)) + vbox.add_child(_email_lbl) + + var spacer := Control.new() + spacer.size_flags_vertical = Control.SIZE_EXPAND_FILL + vbox.add_child(spacer) + + var logout_btn := Button.new() + logout_btn.text = "🚪 Çıkış Yap" + var lb_sb := StyleBoxFlat.new() + lb_sb.bg_color = Color(0.55, 0.18, 0.16) + lb_sb.set_corner_radius_all(6) + logout_btn.add_theme_stylebox_override("normal", lb_sb) + logout_btn.pressed.connect(func() -> void: + visible = false + logout_requested.emit()) + vbox.add_child(logout_btn) + + var ver := Label.new() + ver.text = "Stepstead • sürüm %s" % Config.VERSION + ver.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + ver.add_theme_font_size_override("font_size", 11) + ver.add_theme_color_override("font_color", Color(1, 1, 1, 0.4)) + vbox.add_child(ver) + +func _section(txt: String) -> Label: + var l := Label.new() + l.text = txt + l.add_theme_font_size_override("font_size", 14) + l.add_theme_color_override("font_color", Color(0.9, 0.78, 0.5)) + return l + +func _toggle_row(parent: VBoxContainer, label: String, value: bool, cb: Callable) -> CheckButton: + var row := HBoxContainer.new() + var lbl := Label.new() + lbl.text = label + lbl.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(lbl) + var chk := CheckButton.new() + chk.button_pressed = value + chk.toggled.connect(cb) + row.add_child(chk) + parent.add_child(row) + return chk + +func open() -> void: + visible = true + _sound_chk.button_pressed = Config.sound_on + _music_chk.button_pressed = Config.music_on + _notif_chk.button_pressed = Config.notif_on + var email := str(Auth.user.get("email", "")) + _email_lbl.text = "E-posta: %s" % (email if email != "" else "—") diff --git a/scripts/settings_panel.gd.uid b/scripts/settings_panel.gd.uid new file mode 100644 index 0000000..4eea332 --- /dev/null +++ b/scripts/settings_panel.gd.uid @@ -0,0 +1 @@ +uid://c71hdvgrbu5eh diff --git a/scripts/skills_panel.gd b/scripts/skills_panel.gd new file mode 100644 index 0000000..b5fa356 --- /dev/null +++ b/scripts/skills_panel.gd @@ -0,0 +1,116 @@ +extends PanelContainer +## Skill paneli — 10 skill, level + bir sonraki seviyeye XP ilerlemesi. +## Eğri sunucuyla aynı: level N eşiği = 100 × N² XP. Kod ile kurulur. Node adı "SkillsPanel". + +const PANEL_HEIGHT := 560.0 + +const SKILL_TR := { + "mining": "⛏ Madencilik", "fishing": "🎣 Balıkçılık", "foraging": "🌿 Toplama", + "woodcutting": "🪓 Ağaç Kesme", "hunting": "🏹 Avcılık", "combat": "⚔ Savaş", + "smithing": "🔨 Demircilik", "alchemy": "⚗ Simya", "cooking": "🍳 Aşçılık", + "construction": "🏠 İnşaat", +} + +var _list: VBoxContainer + +func _ready() -> void: + name = "SkillsPanel" + visible = false + _build_ui() + GameState.character_loaded.connect(func(_c: Dictionary) -> void: + if visible: + _render()) + +func _build_ui() -> void: + set_anchors_preset(Control.PRESET_BOTTOM_WIDE) + offset_top = -PANEL_HEIGHT + offset_left = 8 + offset_right = -8 + offset_bottom = -8 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.10, 0.10, 0.13, 0.97) + sb.set_corner_radius_all(10) + add_theme_stylebox_override("panel", sb) + + var margin := MarginContainer.new() + margin.add_theme_constant_override("margin_left", 14) + margin.add_theme_constant_override("margin_right", 14) + margin.add_theme_constant_override("margin_top", 10) + margin.add_theme_constant_override("margin_bottom", 10) + add_child(margin) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 6) + margin.add_child(vbox) + + var top := HBoxContainer.new() + var title := Label.new() + title.text = "📊 Yetenekler" + title.add_theme_font_size_override("font_size", 18) + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + top.add_child(title) + var close_btn := Button.new() + close_btn.text = "✕" + close_btn.pressed.connect(func() -> void: visible = false) + top.add_child(close_btn) + vbox.add_child(top) + + var scroll := ScrollContainer.new() + scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL + scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + vbox.add_child(scroll) + + _list = VBoxContainer.new() + _list.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _list.add_theme_constant_override("separation", 8) + scroll.add_child(_list) + +func open() -> void: + visible = true + _render() + +func _render() -> void: + for c in _list.get_children(): + c.queue_free() + var skills: Array = GameState.skills.duplicate() + skills.sort_custom(func(a: Dictionary, b: Dictionary) -> bool: + return int(a.get("xp", 0)) > int(b.get("xp", 0))) + for s in skills: + if s is Dictionary: + _list.add_child(_skill_row(s)) + +func _skill_row(s: Dictionary) -> VBoxContainer: + var box := VBoxContainer.new() + box.add_theme_constant_override("separation", 2) + var skill_name := str(s.get("skill_name", "")) + var lvl := int(s.get("level", 1)) + var xp := int(s.get("xp", 0)) + + var top := HBoxContainer.new() + var name_lbl := Label.new() + name_lbl.text = str(SKILL_TR.get(skill_name, skill_name)) + name_lbl.add_theme_font_size_override("font_size", 15) + name_lbl.size_flags_horizontal = Control.SIZE_EXPAND_FILL + top.add_child(name_lbl) + var lvl_lbl := Label.new() + lvl_lbl.add_theme_font_size_override("font_size", 14) + lvl_lbl.add_theme_color_override("font_color", Color(0.9, 0.78, 0.5)) + top.add_child(lvl_lbl) + box.add_child(top) + + var bar := ProgressBar.new() + bar.custom_minimum_size = Vector2(0, 14) + bar.show_percentage = false + if lvl >= 50: + lvl_lbl.text = "Lv %d (MAX)" % lvl + bar.max_value = 1 + bar.value = 1 + else: + # level N eşiği = 100×N²; sonraki seviye eşiği 100×(N+1)² + var cur_floor := 100 * lvl * lvl + var next_need := 100 * (lvl + 1) * (lvl + 1) + lvl_lbl.text = "Lv %d • %d / %d XP" % [lvl, xp, next_need] + bar.max_value = next_need - cur_floor + bar.value = clampi(xp - cur_floor, 0, next_need - cur_floor) + box.add_child(bar) + return box diff --git a/scripts/skills_panel.gd.uid b/scripts/skills_panel.gd.uid new file mode 100644 index 0000000..cfdb9c2 --- /dev/null +++ b/scripts/skills_panel.gd.uid @@ -0,0 +1 @@ +uid://fah27k5pkhe2 diff --git a/scripts/splash.gd b/scripts/splash.gd new file mode 100644 index 0000000..4088eeb --- /dev/null +++ b/scripts/splash.gd @@ -0,0 +1,32 @@ +extends Control + +@onready var status_label: Label = $VBox/Status + +func _ready() -> void: + status_label.text = "Bağlanılıyor..." + await _check_session() + +func _check_session() -> void: + if not Auth.is_logged_in(): + _go_login() + return + var res: Dictionary = await Api.request("GET", "/auth/me", null, true) + if not res.ok: + Auth.clear() + _go_login() + return + Auth.user = res.body + var char_res: Dictionary = await GameState.load_character() + if char_res.ok: + _go_game() + else: + _go_character_create() + +func _go_login() -> void: + get_tree().change_scene_to_file("res://scenes/login.tscn") + +func _go_character_create() -> void: + get_tree().change_scene_to_file("res://scenes/character_create.tscn") + +func _go_game() -> void: + get_tree().change_scene_to_file("res://scenes/world.tscn") diff --git a/scripts/splash.gd.uid b/scripts/splash.gd.uid new file mode 100644 index 0000000..8c50027 --- /dev/null +++ b/scripts/splash.gd.uid @@ -0,0 +1 @@ +uid://deo1am2bu5ted diff --git a/scripts/toast.gd b/scripts/toast.gd new file mode 100644 index 0000000..b2c72ab --- /dev/null +++ b/scripts/toast.gd @@ -0,0 +1,45 @@ +extends CanvasLayer +## Ekranın altında geçici bildirim. + +@onready var container: VBoxContainer = $Anchor/VBox + +func _ready() -> void: + add_to_group("toast") + GameState.harvest_succeeded.connect(_on_harvest) + GameState.level_up.connect(_on_level_up) + GameState.item_used.connect(_on_item_used) + +func _on_item_used(p: Dictionary) -> void: + show_toast("🍵 %s kullanıldı +%d adım" % [p.get("item_name", ""), int(p.get("effect_amount", 0))], Color(0.5, 0.85, 1.0)) + +func _on_harvest(p: Dictionary) -> void: + var skill_tr := {"mining": "Madencilik", "fishing": "Balıkçılık", "foraging": "Bitki Toplama", + "woodcutting": "Ağaç Kesme", "hunting": "Avcılık"} + var skill: String = str(skill_tr.get(p.get("skill", ""), str(p.get("skill", "")))) + show_toast("+1 %s +%d %s XP" % [p.get("item_name", ""), int(p.get("xp_gained", 0)), skill], Color(0.4, 0.8, 0.4)) + +func _on_level_up(kind: String, lvl: int) -> void: + if kind == "character": + show_toast("🎉 Karakter Level %d!" % lvl, Color(1.0, 0.85, 0.2)) + else: + show_toast("⭐ Skill Level %d!" % lvl, Color(0.5, 0.85, 1.0)) + +func show_toast(text: String, color: Color = Color.WHITE, dur: float = 2.5) -> void: + var panel := PanelContainer.new() + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.1, 0.12, 0.15, 0.92) + sb.set_corner_radius_all(8) + sb.set_content_margin_all(12) + panel.add_theme_stylebox_override("panel", sb) + var label := Label.new() + label.text = text + label.add_theme_color_override("font_color", color) + label.add_theme_font_size_override("font_size", 16) + panel.add_child(label) + container.add_child(panel) + panel.modulate.a = 0.0 + var tw := create_tween() + tw.tween_property(panel, "modulate:a", 1.0, 0.15) + tw.tween_interval(dur) + tw.tween_property(panel, "modulate:a", 0.0, 0.3) + tw.tween_callback(panel.queue_free) diff --git a/scripts/toast.gd.uid b/scripts/toast.gd.uid new file mode 100644 index 0000000..b09f2f9 --- /dev/null +++ b/scripts/toast.gd.uid @@ -0,0 +1 @@ +uid://c0rfvgjj6kt1p diff --git a/scripts/vendor_shop.gd b/scripts/vendor_shop.gd new file mode 100644 index 0000000..10197b2 --- /dev/null +++ b/scripts/vendor_shop.gd @@ -0,0 +1,236 @@ +extends PanelContainer +## Satıcı dükkanı — bir NPC vendor'ın stoğu. Şehir haritasındaki pine tıklayınca açılır. +## İki sekme: 🛒 Satın Al (sabit stok + oyuncu konsinyeleri, ömür rozetli) / 💰 Sat. +## Kod ile kurulur. Node adı "VendorShop". Alt-sheet. + +const PANEL_HEIGHT := 640.0 + +const RARITY_COLOR := { + "common": Color(0.8, 0.8, 0.8), "uncommon": Color(0.4, 0.85, 0.4), + "rare": Color(0.35, 0.6, 1.0), "epic": Color(0.7, 0.45, 0.95), + "legendary": Color(1.0, 0.65, 0.2), +} + +var _npc_id := 0 +var _npc_name := "" +var _tab := "buy" # "buy" | "sell" +var _title: Label +var _info: Label +var _tab_buy: Button +var _tab_sell: Button +var _list: VBoxContainer + +func _ready() -> void: + name = "VendorShop" + visible = false + _build_ui() + +func _build_ui() -> void: + set_anchors_preset(Control.PRESET_BOTTOM_WIDE) + offset_top = -PANEL_HEIGHT + offset_left = 8 + offset_right = -8 + offset_bottom = -8 + var sb := StyleBoxFlat.new() + sb.bg_color = Color(0.12, 0.11, 0.09, 0.98) + sb.set_corner_radius_all(10) + add_theme_stylebox_override("panel", sb) + + var margin := MarginContainer.new() + margin.add_theme_constant_override("margin_left", 12) + margin.add_theme_constant_override("margin_right", 12) + margin.add_theme_constant_override("margin_top", 8) + margin.add_theme_constant_override("margin_bottom", 8) + add_child(margin) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 6) + margin.add_child(vbox) + + var top := HBoxContainer.new() + _title = Label.new() + _title.add_theme_font_size_override("font_size", 18) + _title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + top.add_child(_title) + var close_btn := Button.new() + close_btn.text = "✕" + close_btn.pressed.connect(func() -> void: visible = false) + top.add_child(close_btn) + vbox.add_child(top) + + _info = Label.new() + _info.add_theme_font_size_override("font_size", 13) + _info.add_theme_color_override("font_color", Color(0.95, 0.8, 0.35)) + vbox.add_child(_info) + + var tabs := HBoxContainer.new() + tabs.add_theme_constant_override("separation", 6) + _tab_buy = _tab_btn(tabs, "🛒 Satın Al", "buy") + _tab_sell = _tab_btn(tabs, "💰 Sat", "sell") + vbox.add_child(tabs) + + var scroll := ScrollContainer.new() + scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL + scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + vbox.add_child(scroll) + _list = VBoxContainer.new() + _list.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _list.add_theme_constant_override("separation", 6) + scroll.add_child(_list) + +func _tab_btn(parent: HBoxContainer, label: String, key: String) -> Button: + var b := Button.new() + b.text = label + b.toggle_mode = true + b.size_flags_horizontal = Control.SIZE_EXPAND_FILL + b.pressed.connect(func() -> void: + _tab = key + _sync_tabs() + refresh()) + parent.add_child(b) + return b + +func _sync_tabs() -> void: + _tab_buy.button_pressed = _tab == "buy" + _tab_sell.button_pressed = _tab == "sell" + +func open(npc_id: int, npc_name: String = "") -> void: + _npc_id = npc_id + _npc_name = npc_name + _tab = "buy" + _sync_tabs() + visible = true + refresh() + +func refresh() -> void: + _info.text = "🪙 %d" % int(GameState.character.get("gold", 0)) + for c in _list.get_children(): + c.queue_free() + if _tab == "buy": + await _render_buy() + else: + await _render_sell() + +func _muted(txt: String) -> Label: + var l := Label.new() + l.text = txt + l.add_theme_color_override("font_color", Color(0.6, 0.6, 0.6)) + return l + +func _render_buy() -> void: + var res: Dictionary = await GameState.npc_shop(_npc_id) + if not res.ok or not (res.body is Dictionary): + _list.add_child(_muted("Dükkan yüklenemedi.")) + return + var body: Dictionary = res.body + _title.text = "🏪 %s" % str(body.get("npc_name", _npc_name)) + var role := str(body.get("role", "")) + if role != "": + _title.text += " (%s)" % role + var items: Array = body.get("items", []) + if items.is_empty(): + _list.add_child(_muted("Bu satıcının stoğu boş.")) + return + var gold := int(GameState.character.get("gold", 0)) + for it in items: + if it is Dictionary: + _list.add_child(_buy_row(it, gold)) + +func _buy_row(it: Dictionary, gold: int) -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 8) + var info := VBoxContainer.new() + info.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var name_lbl := Label.new() + name_lbl.text = str(it.get("item_name", "")) + name_lbl.add_theme_font_size_override("font_size", 15) + name_lbl.add_theme_color_override("font_color", RARITY_COLOR.get(str(it.get("rarity", "common")), Color.WHITE)) + info.add_child(name_lbl) + var meta := Label.new() + var price := int(it.get("unit_price", 0)) + var src := str(it.get("source", "base")) + if src == "player": + var exp := int(it.get("expires_in_h", 0)) + var qty := int(it.get("qty", 0)) + meta.text = "🪙 %d • kalan %d • ⏳ %ds (oyuncu malı)" % [price, qty, exp] + meta.add_theme_color_override("font_color", Color(0.7, 0.75, 0.85)) + else: + meta.text = "🪙 %d • sınırsız" % price + meta.add_theme_color_override("font_color", Color(0.6, 0.62, 0.58)) + meta.add_theme_font_size_override("font_size", 12) + info.add_child(meta) + row.add_child(info) + + var qty_spin := SpinBox.new() + qty_spin.min_value = 1 + qty_spin.max_value = maxi(1, int(it.get("qty", 10))) if src == "player" else 10 + qty_spin.value = 1 + qty_spin.custom_minimum_size = Vector2(70, 0) + row.add_child(qty_spin) + + var btn := Button.new() + if gold < price: + btn.text = "🪙 az" + btn.disabled = true + else: + btn.text = "Al" + btn.pressed.connect(_on_buy.bind(btn, str(it.get("item_code", "")), qty_spin)) + row.add_child(btn) + return row + +func _render_sell() -> void: + var inv: Array = GameState.inventory + var sellable := inv.filter(func(r: Variant) -> bool: return r is Dictionary and int(r.get("qty", 0)) > 0) + if sellable.is_empty(): + _list.add_child(_muted("Envanterin boş.")) + return + _list.add_child(_muted("Satıcıya sat → gold. (Satıcının normalde satmadığı ürün 24s dükkanına düşer.)")) + for r in sellable: + _list.add_child(_sell_row(r)) + +func _sell_row(r: Dictionary) -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 8) + var name_lbl := Label.new() + name_lbl.text = "%s ×%d" % [str(r.get("item_name", "")), int(r.get("qty", 0))] + name_lbl.add_theme_font_size_override("font_size", 15) + name_lbl.add_theme_color_override("font_color", RARITY_COLOR.get(str(r.get("rarity", "common")), Color.WHITE)) + name_lbl.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(name_lbl) + + var qty_spin := SpinBox.new() + qty_spin.min_value = 1 + qty_spin.max_value = maxi(1, int(r.get("qty", 1))) + qty_spin.value = 1 + qty_spin.custom_minimum_size = Vector2(70, 0) + row.add_child(qty_spin) + + var btn := Button.new() + btn.text = "Sat" + btn.pressed.connect(_on_sell.bind(btn, str(r.get("item_code", "")), qty_spin)) + row.add_child(btn) + return row + +func _on_buy(btn: Button, code: String, qty_spin: SpinBox) -> void: + btn.disabled = true + var res: Dictionary = await GameState.npc_buy(_npc_id, code, int(qty_spin.value)) + _toast(res, "✅ Satın alındı", "🚫 Alınamadı") + await refresh() + +func _on_sell(btn: Button, code: String, qty_spin: SpinBox) -> void: + btn.disabled = true + var res: Dictionary = await GameState.npc_sell(_npc_id, code, int(qty_spin.value)) + _toast(res, "✅ Satıldı", "🚫 Satılamadı") + await refresh() + +func _toast(res: Dictionary, ok_msg: String, fail_prefix: String) -> void: + var toast := get_tree().get_first_node_in_group("toast") + var msg := ok_msg + var col := Color(0.6, 0.85, 0.5) + if not res.ok: + col = Color(0.95, 0.5, 0.4) + msg = fail_prefix + if res.body is Dictionary and res.body.has("detail"): + msg = "%s: %s" % [fail_prefix, str(res.body["detail"])] + if toast != null and toast.has_method("show_toast"): + toast.call("show_toast", msg, col) diff --git a/scripts/vendor_shop.gd.uid b/scripts/vendor_shop.gd.uid new file mode 100644 index 0000000..a78e965 --- /dev/null +++ b/scripts/vendor_shop.gd.uid @@ -0,0 +1 @@ +uid://eeoyqkrgnk16 diff --git a/scripts/world.gd b/scripts/world.gd new file mode 100644 index 0000000..b5d9faa --- /dev/null +++ b/scripts/world.gd @@ -0,0 +1,369 @@ +extends Node2D +## Dünya haritası — lokasyon-graf modeli (2026-07-04 dönüşümü). +## Statik harita: lokasyon pinleri + yollar. Tıkla → seyahat (adım maliyeti) ya da +## bulunduğun yerin panelini aç (kaynak toplama). Yolda D&D tarzı olay kartları çıkar. +## Eski tile/chunk/fog sistemi kaldırıldı; sahnedeki TileLayer/NodeLayer katmanları +## yol/pin çizimi için yeniden kullanılıyor. + +## Harita görseli 1536×1024 (3:2). Ekrana yüksekliğe göre sığdırılır (1100px), +## genişlik 1650px olur → kamera sadece yatay kaydırılır (drag). +## DB koordinatları 0-1000 grid'dir ve görselin tamamına oranlanır. +const MAP_ORIGIN := Vector2(0, 150) +const MAP_SIZE := Vector2(1650, 1100) +const CAM_Y := 640.0 +const CAM_X_MIN := 360.0 +const CAM_X_MAX := MAP_SIZE.x - 360.0 +const PIN_TAP_RADIUS := 34.0 +const CLICK_DRAG_THRESHOLD := 12.0 + +@onready var road_layer: Node2D = $TileLayer +@onready var pin_layer: Node2D = $NodeLayer +@onready var player: Sprite2D = $Player +@onready var pan_camera: Camera2D = $PanCamera +@onready var confirm: ConfirmationDialog = $HUD/MoveConfirm +@onready var recenter_btn: Button = $HUD/RecenterBtn + +const TYPE_COLOR := { + "village": Color(0.95, 0.80, 0.30), + "city": Color(0.95, 0.55, 0.25), + "forest": Color(0.30, 0.65, 0.35), + "mine": Color(0.62, 0.62, 0.68), + "lake": Color(0.35, 0.60, 0.90), + "meadow": Color(0.55, 0.80, 0.45), + "hunting": Color(0.75, 0.45, 0.30), +} +const TYPE_LABEL := { + "village": "Köy", "city": "Şehir", "forest": "Orman", "mine": "Maden", + "lake": "Göl/Kıyı", "meadow": "Çayır", "hunting": "Av Sahası", +} + +var _pins: Dictionary = {} # code -> Node2D +var _locs: Dictionary = {} # code -> location dict +var _roads: Array = [] +var _pending_travel := "" +var _others_loc: Dictionary = {} # char_id -> location_code +var _press_pos := Vector2.ZERO +var _pressing := false + +var location_panel: PanelContainer +var event_dialog: Control +var city_map: CanvasLayer + + +class MapPin extends Node2D: + var color := Color.WHITE + var is_here := false + var tex: Texture2D = null # assets/pins/.webp — varsa çizim yerine bu + const TEX_H := 56.0 # ekranda pin yüksekliği (ucu lokasyon noktasında) + func _draw() -> void: + if tex != null: + var s := TEX_H / float(tex.get_height()) + var w := tex.get_width() * s + draw_set_transform(Vector2(-w / 2.0, -TEX_H), 0.0, Vector2(s, s)) + draw_texture(tex, Vector2.ZERO) + draw_set_transform(Vector2.ZERO, 0.0, Vector2.ONE) + if is_here: + draw_arc(Vector2(0, -TEX_H * 0.64), TEX_H * 0.42, 0.0, TAU, 32, Color(1, 1, 1, 0.9), 3.0) + return + draw_circle(Vector2(2, 3), 13.0, Color(0, 0, 0, 0.30)) + draw_circle(Vector2.ZERO, 12.0, color) + draw_arc(Vector2.ZERO, 12.0, 0.0, TAU, 24, Color(0.15, 0.15, 0.15, 0.8), 2.0) + if is_here: + draw_arc(Vector2.ZERO, 18.0, 0.0, TAU, 24, Color(1, 1, 1, 0.9), 3.0) + + +func _ready() -> void: + if not GameState.has_character(): + await GameState.load_character() + + # Eski sistemin kalıntıları: fog katmanı ve recenter gizli, kamera sabit + var void_layer: CanvasLayer = get_node_or_null("Void") + if void_layer != null: + void_layer.visible = false + recenter_btn.visible = false + pan_camera.position = Vector2(CAM_X_MIN, CAM_Y) + pan_camera.zoom = Vector2(1, 1) + pan_camera.make_current() + player.scale = Vector2(0.9, 0.9) + # Bayrak işareti varsa oyuncu sprite'ı onu kullanır; direğin dibi anchor noktası + var flag_path := "res://assets/sprites/player_flag.webp" + if ResourceLoader.exists(flag_path): + player.texture = load(flag_path) + player.centered = false + player.offset = Vector2(-7.5, -76.0) # direk dibi (webp içi piksel) → origin + + confirm.confirmed.connect(_on_travel_confirmed) + + # Kod ile kurulan paneller + location_panel = preload("res://scripts/location_panel.gd").new() + $HUD.add_child(location_panel) + event_dialog = preload("res://scripts/event_dialog.gd").new() + $HUD.add_child(event_dialog) + # Şehir haritası (kendi CanvasLayer'ında) — lokasyon panelindeki butondan açılır + city_map = preload("res://scripts/city_map.gd").new() + add_child(city_map) + location_panel.city_requested.connect(func() -> void: city_map.open()) + + GameState.map_loaded.connect(_draw_map) + GameState.traveled.connect(_on_traveled) + GameState.event_started.connect(func(ev: Dictionary) -> void: event_dialog.call("show_event", ev)) + + WsClient.online_list.connect(_on_ws_online_list) + WsClient.player_joined.connect(_on_ws_player) + WsClient.player_moved.connect(_on_ws_player) + WsClient.player_left.connect(_on_ws_player_left) + WsClient.start() + + await GameState.load_inventory() + await GameState.load_map() + Pedometer.start() + + +# --- Harita çizimi --- + +func _map_pos(loc: Dictionary) -> Vector2: + return MAP_ORIGIN + Vector2(float(loc["map_x"]), float(loc["map_y"])) / 1000.0 * MAP_SIZE + +func _draw_map(md: Dictionary) -> void: + for c in road_layer.get_children(): + c.queue_free() + for c in pin_layer.get_children(): + c.queue_free() + _pins.clear() + _locs.clear() + + # Harita görseli (assets/world_map.png, 1536×1024) — MAP_SIZE alanına ölçeklenir, + # pinler DB'deki 0-1000 koordinatlarıyla üstüne oturur + var bg := Sprite2D.new() + bg.texture = load("res://assets/world_map.png") + bg.centered = false + bg.position = MAP_ORIGIN + if bg.texture != null: + bg.scale = MAP_SIZE / Vector2(bg.texture.get_size()) + road_layer.add_child(bg) + + var locs: Array = md.get("locations", []) + _roads = md.get("roads", []) + for l in locs: + _locs[str(l["code"])] = l + + # Yollar — editörde çizilen ara noktalardan (normalize 0-1) geçen kıvrımlı hat + for r in _roads: + var la: Dictionary = _locs.get(str(r["a"]), {}) + var lb: Dictionary = _locs.get(str(r["b"]), {}) + if la.is_empty() or lb.is_empty(): + continue + var pts: Array[Vector2] = [_map_pos(la)] + for w in r.get("waypoints", []): + if w is Array and w.size() == 2: + pts.append(MAP_ORIGIN + Vector2(float(w[0]), float(w[1])) * MAP_SIZE) + pts.append(_map_pos(lb)) + var line := Line2D.new() + line.width = 4.0 + line.default_color = Color(0.55, 0.48, 0.38, 0.7) + line.joint_mode = Line2D.LINE_JOINT_ROUND + line.round_precision = 4 + for p in pts: + line.add_point(p) + road_layer.add_child(line) + var cost := Label.new() + cost.text = "%d" % int(r["steps"]) + cost.add_theme_font_size_override("font_size", 11) + cost.add_theme_color_override("font_color", Color(0.2, 0.15, 0.1)) + cost.add_theme_color_override("font_outline_color", Color(1, 0.95, 0.8, 0.9)) + cost.add_theme_constant_override("outline_size", 4) + cost.position = pts[pts.size() / 2] - Vector2(12, 8) + road_layer.add_child(cost) + + # Pinler + for l in locs: + var code := str(l["code"]) + var pin := MapPin.new() + pin.color = TYPE_COLOR.get(str(l["type"]), Color.WHITE) + pin.position = _map_pos(l) + var pin_tex := "res://assets/pins/%s.webp" % code + if ResourceLoader.exists(pin_tex): + pin.tex = load(pin_tex) + var name_lbl := Label.new() + name_lbl.text = str(l["name"]) + name_lbl.add_theme_font_size_override("font_size", 12) + name_lbl.add_theme_color_override("font_color", Color(0.15, 0.15, 0.15)) + name_lbl.add_theme_color_override("font_outline_color", Color(1, 1, 1, 0.8)) + name_lbl.add_theme_constant_override("outline_size", 4) + name_lbl.custom_minimum_size = Vector2(120, 0) + name_lbl.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + name_lbl.position = Vector2(-60, 16) + pin.add_child(name_lbl) + var badge := Label.new() + badge.name = "Badge" + badge.text = "" + badge.add_theme_font_size_override("font_size", 12) + badge.add_theme_color_override("font_color", Color(0.1, 0.3, 0.7)) + badge.position = Vector2(10, -26) + pin.add_child(badge) + pin_layer.add_child(pin) + _pins[code] = pin + + _update_marker() + _refresh_presence() + +func _update_marker() -> void: + var my_code := str(GameState.character.get("location_code", GameState.map_data.get("my_location", ""))) + for code in _pins: + var pin: MapPin = _pins[code] + pin.is_here = code == my_code + pin.queue_redraw() + if _pins.has(my_code): + var my_pin: MapPin = _pins[my_code] + var pin_pos := my_pin.position + # Görselli pinde bayrak direği pin tepesine oturur, çizim pininde eski yerine + player.position = pin_pos + (Vector2(0, -MapPin.TEX_H) if my_pin.tex != null else Vector2(0, -26)) + # Kamerayı bulunduğun pine ortala (yatay) + pan_camera.position.x = clampf(pin_pos.x, CAM_X_MIN, CAM_X_MAX) + player.visible = _pins.has(my_code) + + +# --- Girdi: pin tıklama --- + +func _input(event: InputEvent) -> void: + # Şehir haritası açıkken dünya haritası girdisini yok say (pan/tık çakışmasın) + if city_map != null and city_map.is_open(): + return + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: + if event.pressed: + _press_pos = event.position + _pressing = not _is_over_hud(event.position) + else: + var was_pressing := _pressing + _pressing = false + if event.position.distance_to(_press_pos) > CLICK_DRAG_THRESHOLD: + return + if not was_pressing or _is_over_hud(event.position): + return + _handle_tap(event.position) + elif event is InputEventMouseMotion and _pressing: + # Yatay harita kaydırma (harita ekrandan geniş) + pan_camera.position.x = clampf(pan_camera.position.x - event.relative.x, CAM_X_MIN, CAM_X_MAX) + +func _screen_to_world(screen_pos: Vector2) -> Vector2: + return get_viewport().get_canvas_transform().affine_inverse() * screen_pos + +func _handle_tap(screen_pos: Vector2) -> void: + var wp := _screen_to_world(screen_pos) + var best_code := "" + var best_d := PIN_TAP_RADIUS + for code in _pins: + var d: float = (_pins[code] as Node2D).position.distance_to(wp) + if d < best_d: + best_d = d + best_code = str(code) + if best_code != "": + _on_pin_tapped(best_code) + +func _is_over_hud(pos: Vector2) -> bool: + if pos.y < 70.0: # TopBar + return true + if pos.y > get_viewport().get_visible_rect().size.y - 96.0: # alt nav çubuğu + return true + if _has_blocking_panel(): + return true + return false + +func _has_blocking_panel() -> bool: + var hud := $HUD + for n in [hud.get_node_or_null("InventoryPanel"), hud.get_node_or_null("CraftPanel"), + hud.get_node_or_null("ChatPanel"), hud.get_node_or_null("LocationPanel"), + hud.get_node_or_null("EventDialog"), hud.get_node_or_null("MarketPanel"), + hud.get_node_or_null("DailyPanel"), hud.get_node_or_null("SkillsPanel"), + hud.get_node_or_null("LeaderboardPanel"), hud.get_node_or_null("SettingsPanel")]: + if n != null and n.visible: + return true + if confirm.visible: + return true + return false + + +# --- Seyahat --- + +func _on_pin_tapped(code: String) -> void: + var my_code := str(GameState.character.get("location_code", "")) + if code == my_code: + location_panel.call("open") + return + # Yol var mı? + var road: Dictionary = {} + for r in _roads: + if (str(r["a"]) == my_code and str(r["b"]) == code) or (str(r["b"]) == my_code and str(r["a"]) == code): + road = r + break + var loc: Dictionary = _locs.get(code, {}) + if road.is_empty(): + $Toast.call("show_toast", "🚫 %s: buradan doğrudan yol yok" % str(loc.get("name", code)), Color(0.95, 0.6, 0.4)) + return + var cost := int(road["steps"]) + var bal := int(GameState.character.get("step_balance", 0)) + var lines: Array[String] = [] + lines.append("%s → %s" % [str(_locs.get(my_code, {}).get("name", my_code)), str(loc.get("name", code))]) + lines.append("%s — %s" % [TYPE_LABEL.get(str(loc.get("type", "")), ""), str(loc.get("description", ""))]) + lines.append("Yol: %d adım • Bakiye: %d" % [cost, bal]) + if bal < cost: + lines.append("⚠ %d adım eksik. Daha yürümen gerek." % (cost - bal)) + confirm.dialog_text = "\n".join(lines) + confirm.get_ok_button().text = "Tamam" + confirm.get_cancel_button().text = "Kapat" + _pending_travel = "" + else: + confirm.dialog_text = "\n".join(lines) + confirm.get_ok_button().text = "Yola Çık" + confirm.get_cancel_button().text = "İptal" + _pending_travel = code + confirm.popup_centered() + +func _on_travel_confirmed() -> void: + if _pending_travel == "": + return + var dest := _pending_travel + _pending_travel = "" + var res: Dictionary = await GameState.travel(dest) + if not res.ok: + var msg := "Seyahat başarısız" + if res.body is Dictionary and res.body.has("detail"): + msg = str(res.body["detail"]) + $Toast.call("show_toast", "🚫 " + msg, Color(0.95, 0.5, 0.4)) + +func _on_traveled(b: Dictionary) -> void: + _update_marker() + $Toast.call("show_toast", "🥾 %s'e vardın (-%d adım)" % [str(b.get("location_name", "")), int(b.get("step_cost", 0))], Color(0.6, 0.85, 0.5)) + # Olay yoksa lokasyon panelini aç + if not (b.get("event") is Dictionary): + location_panel.call("open") + + +# --- Multiplayer presence --- + +func _on_ws_online_list(players: Array) -> void: + for p in players: + if p is Dictionary: + _others_loc[int(p.get("char_id", 0))] = str(p.get("location_code", "")) + _refresh_presence() + +func _on_ws_player(p: Dictionary) -> void: + _others_loc[int(p.get("char_id", 0))] = str(p.get("location_code", "")) + _refresh_presence() + +func _on_ws_player_left(char_id: int) -> void: + _others_loc.erase(char_id) + _refresh_presence() + +func _refresh_presence() -> void: + var counts: Dictionary = {} + var my_id := int(GameState.character.get("id", -1)) + for cid in _others_loc: + if int(cid) == my_id: + continue + var code: String = _others_loc[cid] + counts[code] = int(counts.get(code, 0)) + 1 + for code in _pins: + var badge: Label = (_pins[code] as Node2D).get_node("Badge") + var n := int(counts.get(code, 0)) + badge.text = "👤%d" % n if n > 0 else "" diff --git a/scripts/world.gd.uid b/scripts/world.gd.uid new file mode 100644 index 0000000..37223ea --- /dev/null +++ b/scripts/world.gd.uid @@ -0,0 +1 @@ +uid://cwfuwbnjp4yv5 diff --git a/tests/e2e_test.gd b/tests/e2e_test.gd new file mode 100644 index 0000000..e0dd7f4 --- /dev/null +++ b/tests/e2e_test.gd @@ -0,0 +1,147 @@ +extends Node +## Headless E2E — gerçek backend'e karşı istemci akışlarını doğrular. +## Çalıştırma (RP5): tests/run_e2e.sh (token üretir + tea_mint seed eder + bunu çağırır) +## godot --headless --path . res://tests/e2e_test.tscn +## Env: SS_TOKEN_A (ana karakter), SS_TOKEN_B (wstestchar), SS_API_BASE (ops. override) + +var _fails := 0 +var _ws_connected := false +var _got_online_list := false +var _got_chat_history := false +var _got_local_history := false +var _moved_payload: Dictionary = {} +var _chat_payload: Dictionary = {} + +func _ready() -> void: + await _run() + print("== SONUÇ: %s (%d hata) ==" % ["BAŞARILI" if _fails == 0 else "BAŞARISIZ", _fails]) + get_tree().quit(0 if _fails == 0 else 1) + +func _run() -> void: + print("== Stepstead headless E2E ==") + var base := OS.get_environment("SS_API_BASE") + if base != "": + Config.override_base = base + print(" API base: ", base) + var token_a := OS.get_environment("SS_TOKEN_A") + var token_b := OS.get_environment("SS_TOKEN_B") + if token_a == "" or token_b == "": + _check(false, "SS_TOKEN_A / SS_TOKEN_B env değişkenleri gerekli") + return + + Auth.token = token_a + + # 1) Karakter yükle + var res: Dictionary = await GameState.load_character() + _check(res.ok and str(GameState.character.get("name", "")) != "", "load_character") + print(" karakter: %s, adım: %d" % [str(GameState.character.get("name", "")), int(GameState.character.get("step_balance", 0))]) + + # 2) Envanter yükle + res = await GameState.load_inventory() + _check(res.ok, "load_inventory (%d item)" % GameState.inventory.size()) + + # 3) Consumable kullan (wrapper tea_mint seed etti) + var bal_before: int = int(GameState.character.get("step_balance", 0)) + res = await GameState.use_item("tea_mint", 1) + _check(res.ok, "use_item HTTP") + var bal_after: int = int(GameState.character.get("step_balance", 0)) + _check(bal_after == bal_before + 50, "use_item +50 adım (önce %d, sonra %d)" % [bal_before, bal_after]) + + # 4) WebSocket bağlan + WsClient.connection_changed.connect(func(c: bool) -> void: _ws_connected = c) + WsClient.online_list.connect(func(_players: Array) -> void: _got_online_list = true) + WsClient.chat_history.connect(func(_messages: Array) -> void: _got_chat_history = true) + WsClient.player_moved.connect(func(p: Dictionary) -> void: _moved_payload = p) + WsClient.chat_received.connect(func(m: Dictionary) -> void: _chat_payload = m) + WsClient.start() + _check(await _wait_for(func() -> bool: return _ws_connected, 10.0), "WS bağlantısı açıldı") + _check(await _wait_for(func() -> bool: return _got_online_list, 5.0), "online_list alındı") + _check(await _wait_for(func() -> bool: return _got_chat_history, 5.0), "chat_history alındı") + + # 4b) Chat: gönder → echo geri gelmeli + var chat_msg := "e2e test %d" % (Time.get_ticks_msec()) + WsClient.send_chat(chat_msg) + _check(await _wait_for(func() -> bool: return str(_chat_payload.get("text", "")) == chat_msg, 10.0), + "chat gönderildi ve echo alındı") + + # 4c) Yerel chat: kanal local echo + yerel geçmiş + await get_tree().create_timer(1.2).timeout # flood koruması + var local_msg := "e2e yerel %d" % (Time.get_ticks_msec()) + WsClient.send_chat(local_msg, "local") + _check(await _wait_for(func() -> bool: + return str(_chat_payload.get("text", "")) == local_msg \ + and str(_chat_payload.get("channel", "")) == "local", 10.0), + "yerel chat echo alındı (channel=local)") + WsClient.local_chat_history.connect(func(_m: Array) -> void: _got_local_history = true) + WsClient.request_local_history() + _check(await _wait_for(func() -> bool: return _got_local_history, 5.0), "yerel chat geçmişi alındı") + + # 4d) Günlük hedef + market vitrini + res = await GameState.daily_status() + _check(res.ok and res.body is Dictionary and res.body.has("goal"), + "daily_status (hedef %d, bugün %d)" % [int(res.body.get("goal", 0)), int(res.body.get("today_steps", 0))] if res.ok else "daily_status") + var market_rows: Array = await GameState.market_listings() + _check(market_rows is Array, "market_listings (%d ilan)" % market_rows.size()) + var vendor_rows: Array = await GameState.vendor_prices() + _check(not vendor_rows.is_empty(), "vendor_prices (%d çeşit item)" % vendor_rows.size()) + var stock_rows: Array = await GameState.vendor_stock() + _check(not stock_rows.is_empty(), "vendor_stock (%d mal)" % stock_rows.size()) + res = await GameState.leaderboard("steps") + _check(res.ok and res.body is Dictionary and not (res.body.get("rows", []) as Array).is_empty(), + "leaderboard (sıram #%d)" % int(res.body.get("my_rank", 0)) if res.ok else "leaderboard") + + # 5) Harita + seyahat (lokasyon-graf dünya) + res = await GameState.load_map() + var locs: Array = GameState.map_data.get("locations", []) + var my_loc := str(GameState.map_data.get("my_location", "")) + _check(res.ok and locs.size() >= 10 and my_loc != "", "load_map (%d lokasyon, buradayım: %s)" % [locs.size(), my_loc]) + + # Bulunduğum yerden giden ilk yolu seç, oraya git + var dest := "" + for r in GameState.map_data.get("roads", []): + if str(r["a"]) == my_loc: + dest = str(r["b"]) + break + if str(r["b"]) == my_loc: + dest = str(r["a"]) + break + _check(dest != "", "gidilecek komşu lokasyon bulundu (%s)" % dest) + res = await GameState.travel(dest) + _check(res.ok and str(GameState.character.get("location_code", "")) == dest, "travel → %s" % dest) + # Yolda olay çıktıysa çöz (0. seçim) + if res.ok and res.body is Dictionary and res.body.get("event") is Dictionary: + var ev_res: Dictionary = await GameState.resolve_event(0) + _check(ev_res.ok, "yol olayı çözüldü (%s)" % str(res.body["event"].get("name", ""))) + + # 6) Lokasyon detayı + res = await GameState.load_location() + _check(res.ok and res.body is Dictionary and res.body.has("resources"), + "load_location (%d kaynak)" % (res.body.get("resources", []) as Array).size() if res.ok else "load_location") + + # 7) B karakteri REST ile seyahat etsin → bize location_code'lu player_moved düşmeli + Auth.token = token_b + var mv: Dictionary = await Api.request("POST", "/world/travel", {"to_code": "fisilti_ormani"}, true) + if not mv.ok: + mv = await Api.request("POST", "/world/travel", {"to_code": "koy"}, true) + Auth.token = token_a + _check(mv.ok, "B /world/travel") + _check(await _wait_for(func() -> bool: return str(_moved_payload.get("name", "")) == "wstestchar", 10.0), + "player_moved eventi WS'ten alındı (lokasyon: %s)" % str(_moved_payload.get("location_code", ""))) + + WsClient.stop() + +func _wait_for(cond: Callable, timeout: float) -> bool: + var elapsed := 0.0 + while elapsed < timeout: + if cond.call(): + return true + await get_tree().process_frame + elapsed += get_process_delta_time() + return bool(cond.call()) + +func _check(ok: bool, what: String) -> void: + if ok: + print(" ✅ ", what) + else: + _fails += 1 + printerr(" ❌ ", what) diff --git a/tests/e2e_test.gd.uid b/tests/e2e_test.gd.uid new file mode 100644 index 0000000..976eb4d --- /dev/null +++ b/tests/e2e_test.gd.uid @@ -0,0 +1 @@ +uid://bpradaj44vdka diff --git a/tests/e2e_test.tscn b/tests/e2e_test.tscn new file mode 100644 index 0000000..eaf992a --- /dev/null +++ b/tests/e2e_test.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://ss_e2e_test"] + +[ext_resource type="Script" path="res://tests/e2e_test.gd" id="1_e2e"] + +[node name="E2ETest" type="Node"] +script = ExtResource("1_e2e") diff --git a/tests/run_e2e.sh b/tests/run_e2e.sh new file mode 100755 index 0000000..e35306e --- /dev/null +++ b/tests/run_e2e.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# Stepstead headless E2E — RP5'te çalışır. +# Token üretir, test karakterine tea_mint seed eder, Godot'u headless çalıştırır. +set -e +cd "$(dirname "$0")/.." + +# Tokenlar (.env'i okuyabilmek için cwd /opt/stepstead olmalı) +read -r TOKEN_A TOKEN_B < <(cd /opt/stepstead && ./venv/bin/python3 -c " +import asyncio, asyncpg +from config import settings +from security import create_access_token +async def ids(): + dsn = settings.DATABASE_URL.replace('postgresql+asyncpg://', 'postgresql://') + c = await asyncpg.connect(dsn) + a = await c.fetchval(\"SELECT id FROM users WHERE email='jts@jts.rocks'\") + b = await c.fetchval(\"SELECT id FROM users WHERE email='wstest@stepstead.local'\") + await c.close() + return a, b +a, b = asyncio.run(ids()) +print(create_access_token(a), create_access_token(b)) +") + +# Test hazırlığı: tea_mint seed (use_item), bekleyen olayları temizle, +# B'yi köye koy ve adım bakiyelerini garanti et +sudo -u postgres psql -d stepstead -qc " +INSERT INTO inventory (character_id, item_id, qty, slot) +SELECT c.id, i.id, 1, COALESCE((SELECT MAX(slot)+1 FROM inventory WHERE character_id=c.id), 0) +FROM characters c JOIN users u ON u.id = c.user_id, items i +WHERE u.email='jts@jts.rocks' AND i.code='tea_mint' + AND NOT EXISTS (SELECT 1 FROM inventory inv WHERE inv.character_id=c.id AND inv.item_id=i.id); +UPDATE inventory SET qty = qty + 1 +WHERE character_id=(SELECT c.id FROM characters c JOIN users u ON u.id=c.user_id WHERE u.email='jts@jts.rocks') + AND item_id=(SELECT id FROM items WHERE code='tea_mint'); +UPDATE characters SET pending_event = NULL +WHERE name IN ('joethesleeper', 'wstestchar'); +UPDATE characters SET location_id=(SELECT id FROM locations WHERE code='koy') +WHERE name='wstestchar'; +UPDATE characters SET step_balance = GREATEST(step_balance, 3000) +WHERE name IN ('joethesleeper', 'wstestchar');" + +SS_TOKEN_A="$TOKEN_A" SS_TOKEN_B="$TOKEN_B" SS_API_BASE="${SS_API_BASE:-http://127.0.0.1:8002}" \ + timeout 120 godot --headless --path . res://tests/e2e_test.tscn