diff --git a/.agents/skills/fusion-android-porting/SKILL.md b/.agents/skills/fusion-android-porting/SKILL.md index 06a037038..d084913fe 100644 --- a/.agents/skills/fusion-android-porting/SKILL.md +++ b/.agents/skills/fusion-android-porting/SKILL.md @@ -7,6 +7,9 @@ description: Port Clickteam Fusion C++ extensions to Android, or diagnose Androi ## Scope +Apply the [common porting rules](../fusion-extension-porting/SKILL.md), including +Git checkout normalization and artifact hash verification, before this workflow. + Use this skill only for Fusion Android/JNI implementation, builds, publishing, or troubleshooting. For a multi-platform task, apply it to the Android portion; still assess shared C++ changes for their effect on other platforms. Keep iOS/Objective-C++ and HTML5 workflows in separate skills. diff --git a/.agents/skills/fusion-extension-porting/SKILL.md b/.agents/skills/fusion-extension-porting/SKILL.md new file mode 100644 index 000000000..6bc417d8f --- /dev/null +++ b/.agents/skills/fusion-extension-porting/SKILL.md @@ -0,0 +1,120 @@ +--- +name: fusion-extension-porting +description: Apply common rules when porting Clickteam Fusion extensions across Windows, Android, iOS, or HTML5, especially shared behavior, common native component boundaries, cross-platform artifact transfer, manifests, and publishing verification. Use platform skills for SDK and build procedures. +--- + +# Common Fusion extension porting rules + +## Scope + +Apply these rules across extension ports. Keep platform SDK, Runtime and build +procedures separate: use [Android porting](../fusion-android-porting/SKILL.md) +or [iOS porting](../fusion-ios-porting/SKILL.md) for the relevant target. +Derive paths and commands from the target project; do not require another plugin. +Write skills and repository documentation in English. + +Use the current Windows C++ implementation as the behavioral reference for +portable features. Reuse shared algorithms; adapt platform-specific object, +resource and Runtime access through the actual target SDK. Keep shared C++ +changes reviewable and honor the author's review requirements. + +## Reusable Runtime object helpers + +Object lookup, selection and creation are platform infrastructure. Keep separate +ObjectBase, ObjectSelection and ObjectCreation classes, following the existing +Windows and Android organization. Retain established filenames; solve SDK name +collisions through directories and explicit includes, rather than inventing a +plugin prefix. Plugin-specific predicates, coordinates and ACE dispatch belong +in the consuming adapter. Compare the full portable API with current reference +implementations, including capabilities the first consumer does not yet use. + +Test these helpers without a plugin's computational core. For native headers, +also compile/link multiple consumers to detect duplicate definitions; use one +consistent helper revision. Record concrete Runtime differences rather than +forcing Windows structure layouts or build procedures onto another platform. + +## Review and handoff + +When organizing a port for review, place core C++/ABI changes first, platform +adapters and generic helpers next, then build/publishing integration and docs. +Distinguish shared algorithm edits from a new C boundary around unchanged shared +classes. When rewriting history, verify the resulting file tree, preserve other +work and update the remote with an expected-head lease. + +Exclude temporary patches, build output, private SDK exports and investigation +notes from commits. Retain native binaries and verification metadata when they +are required inputs to the agreed cross-platform publishing workflow. + +## Evaluate common native components + +Assess this when starting another plugin port or introducing a shared dependency; +do not automatically split every plugin into multiple dynamic libraries. + +- Establish the actual linkage from build targets and binaries. An XCFramework + is a container and may hold static libraries; do not infer dynamic linkage + from its name or from another platform's implementation. +- Inventory common headers and compiled dependencies. Macros, constants, + templates and inline helpers do not imply that an entire utility header or + library is included in the final binary. Inspect emitted symbols, link maps + and final sizes to identify actual duplication and unused dependencies. +- Audit duplicate symbols, visibility, ODR/configuration differences, global + state, caches and ownership across plugins. Header-only code is not necessarily + stateless or collision-free. Linker folding or dead stripping is not a general + guarantee of deduplication or isolation across independent libraries. +- Prefer focused includes and source/build modularity for small, stateless + helpers. Interface, static or object-library targets can express shared + dependencies without adding a runtime deployment contract. This alone does + not remove duplication across separately linked plugin binaries. +- Consider a common dynamic library when several plugins demonstrably duplicate + substantial compiled code, or require one deliberately shared service/state. + Balance that benefit against version coupling, independent plugin updates, + loading, packaging and deployment complexity. Define which module owns state + and how conflicting dependency versions coexist before adopting the design. +- If a runtime boundary is justified, prefer a versioned C ABI with opaque + handles, explicit lengths and ownership. Keep allocation/release in the same + owning module; avoid exposing STL objects, C++ class layouts or exceptions. + Moving templates into a DLL does not by itself provide a stable C++ ABI. +- Check the target SDK/exporter's dependency support, architectures, loader + paths, embedding/signing and name-collision behavior using its platform skill. + Preserve the intended automated build/package/export workflow. A host-side + library build is insufficient evidence that Fusion will deploy it correctly. + +State the assessment and evidence briefly. Keep the current design when there +is no concrete benefit; propose shared C++ changes separately for author review. + +## Git checkout, artifact text and hashes + +Git's Windows `core.autocrlf` can convert LF to CRLF in generated artifact text, +not only source files. Public headers inside a prebuilt framework, XML metadata +such as Info.plist, and integration Markdown can change while the compiled +library remains byte-identical. A manifest hash mismatch alone is not evidence +that the native library is stale or needs rebuilding. + +- Define a consistent digest policy in the producer and consumer. Normalize + CRLF to LF for explicitly identified text artifacts as well as source + fingerprints. Check the format before treating metadata as text: a binary + plist is not XML. Preserve encoding and all content except the agreed newline + conversion; actual header or metadata edits must still fail verification. +- Keep binary hashes byte-exact, including static/shared libraries, executable + extensions, images and package archives. Never apply newline replacement to + every payload or skip verification to make a transfer pass. +- Compare device/platform copies of public headers using the same text policy. + Mixed LF/CRLF checkouts must not appear to change the compiled ABI. +- Use .gitattributes when byte-preserving checkout is required, but account for + existing working trees: adding an attribute does not necessarily rewrite + files already checked out. A consumer fix must work with existing transfers. +- Report the exact missing, unexpected or mismatched paths. Distinguish source + dependency changes, binary corruption, and text checkout differences before + recommending another native build. Do not regenerate a manifest merely to + accept unexplained differences. Preserve previous outputs on failure. + +## Required transfer regressions + +Verify LF and CRLF text, mixed header endings, rejection of real text edits, and +rejection of binary changes even when the only changed bytes are newline bytes. +Exercise the actual publisher with real transferred artifacts where available. +For tracked files, reproduce Windows Git conversion without changing the user's +checkout using `git -c core.autocrlf=true cat-file --filters HEAD:`. +Confirm validation, package contents and installation after that conversion; +passing local LF-only tests is insufficient evidence of Windows compatibility. +Report packaging, exporter, final-link and device validation separately. diff --git a/.agents/skills/fusion-ios-porting/SKILL.md b/.agents/skills/fusion-ios-porting/SKILL.md new file mode 100644 index 000000000..111d97e1c --- /dev/null +++ b/.agents/skills/fusion-ios-porting/SKILL.md @@ -0,0 +1,184 @@ +--- +name: fusion-ios-porting +description: Port Clickteam Fusion extensions to iOS using a shared C++ core, a Runtime adapter, Apple command-line builds, and verified extension packaging. Keep Android and macOS application procedures separate. +--- + +# Port Fusion extensions to iOS + +## Scope and constraints + +Apply the [common porting rules](../fusion-extension-porting/SKILL.md), including +Git checkout normalization and artifact hash verification, before this workflow. + +Use for iOS Runtime integration, native builds, exported Xcode projects, and .ext +publishing. Derive paths, commands, SDK requirements and artifact names from the +target extension's current project. Do not make FindTheWay settings mandatory +for other plugins. Write this skill, references and operational docs in English. +Preserve shared C++ interfaces; submit shared behavioral changes for author review. +Keep private SDK/exporter material outside the public repository. + +## Workflow + +1. Inspect current Windows ACE definitions, mobile adapters, the installed exporter + and a real exported project. Inventory IDs, property layout, parameter decoding, + events, selection, creation and unsupported operations before implementation. +2. Treat the Windows C++ implementation as the behavioral oracle for portable + features. Add direct comparisons against its actual classes for paths, flags, + units/ZOC, area layers, line ranges, AOE and caching; do not use Android output + as the specification. Adapt only platform-specific I/O/object mechanics using + the actual iOS SDK. Reuse computational algorithms in shared C++. Keep Runtime objects, selection, + creation and event dispatch in an owned adapter. Compare helpers with current + Windows and Android versions; preserve each Runtime's actual representations. + Check qualifiers, OI handle/index distinctions, slot zero, empty selections, + destroyed objects, nested events, scope/action restoration, layer sentinels and + post-creation physics/visibility. Do not assume the bundled mobile helper has + the same capabilities as the maintained Windows helper. + Use the reusable Runtime helpers described below; keep FTW or other plugin + semantics in the consuming adapter. +3. For a precompiled core, define a C-compatible boundary with opaque ownership, + fixed-width values, explicit buffer/string lengths and exception translation. + Avoid STL and C++ layout exposure. Retain owners across callback reentrancy; + snapshot iteration results and define destruction/replacement behavior. +4. Keep each plugin's build project under Extensions/iOS/. Use CMake and + Ninja/Make for scripted compilation; use Apple CLI tools for SDK selection and + XCFramework creation. Full Xcode supplies iOS SDKs; standalone Command Line + Tools are insufficient. Do not require opening Xcode GUI to build the core. +5. Build separate iOS device and simulator platform slices. The current task + supports arm64 only; do not add Intel/Rosetta/32-bit targets. Use a static + XCFramework when it matches the exported project's linking model. Prebuilding + isolates language settings, not the deployment availability of libc++ APIs. +6. Stage binaries with source/configuration and per-file hashes, normalize Git + text line endings for source fingerprints and transferred artifact text + (public headers, XML metadata and integration notes). Windows Git checkout + can convert these to CRLF. Keep static archive/.ext hashes byte-exact. + Publish only after all builds/verification succeed; preserve previous outputs + on failure. Keep Build directories ignored and transfer only owned artifacts. +7. Publish the extension as .ext, including required native and adapter material. + Native-only manifests are valid inputs to a Windows packager: verify compiled + dependencies, then package the current Runtime adapter there. Do not force a + Mac rebuild merely because the thin source adapter changed. + Validate its actual encoding and export round trip; do not rename an arbitrary + ZIP to .ext. Fusion may export files without adding their Xcode references. + Verify library/source references, include paths, system dependencies and final + linkage; prefer an idempotent integration step if project references are missing. + Check exported Scheme container/target references after project renaming, + effective architecture settings at project and dependency levels, required + versus weak linkage of static libraries, and consistent deployment targets. + If template defaults need conversion, provide an idempotent, target-aware CLI + with a dry-run mode; preserve unrelated flags, signing and SDK extensions. +8. Prefer a one-way handoff: Mac compiles native artifacts; Windows stages the + adapter and creates .ext. Do not require returning a Windows-made .ext to Mac. + Retain useful official packaging utilities and usage guides; remove obsolete + application scaffolding selectively. A GUI utility is not evidence of a CLI. + Reference architecture is guidance, not proof that every mechanism is optimal. + Hook Windows publishing into the target extension's existing release entry + point before its final archive is produced. Install to the actual Fusion + iPhone runtime directory when requested; fail clearly for a missing directory. + Distinguish successful packaging from complete Runtime feature parity. + Put plugin-specific generated-output rules in that plugin's .gitignore. +9. Image maps need CPU-readable pixels, including reloading purged Runtime data. + Preserve sampling coordinates, red/green channels, row pitch and image format; + distinguish logical colors from premultiplied display colors. Delegate paths + to the Runtime resource loader for sandbox, bundle, embedded and security-scoped + files. Do not invent writable paths to read images or dereference desktop + surface pointers on iOS. Document irrecoverable export quantization/alpha loss. + For background drawing, inspect both sprite positioning and visibility bounds: + Windows surface origins may be top-left coordinates while iOS sprite positions + are image-hotspot anchors. Convert per selected frame and keep the backdrop's + stored hotspot consistent; setting it to zero does not disable the sprite's + own image-hotspot subtraction. Test different animation-frame hotspots. +10. Validate in layers: host/core and ABI tests; actual Apple compile/link; + helpers against private Runtime declarations; .ext install/export; simulator + and device behavior. User-supplied Apple build logs establish that build only, + not full ACE coverage or device correctness. Keep concise usage documentation; + avoid committing investigation transcripts, temporary plans or redundant reports. + +## Reusable Runtime helpers and exported-project patches + +Use `Helpers/ObjectBase.h`, `ObjectSelection.h` and `ObjectCreation.h` as separate +generic classes, with common OI access in ObjectBase. Compare the current Windows +`Extensions/_3rdLib/Object*.h` and Android `_3rdLib` counterparts, including APIs +not yet used by the consuming extension. Do not rename them for that extension. + +The exporter already has its own ObjectSelection.h. Package the maintained +headers under export-root `Helpers/`, outside `Classes/`; use explicit relative +includes from Runtime sources. Verify the paths in the actual package, and avoid +global recursive search paths or header-map entries that could shadow the SDK +file. Inline implementations need no helper compilation unit or native library; +validate multiple translation units and package one consistent revision. Generate +extension-specific PBX IDs for any shared files that do require project entries. + +For adapter/helper fixes, provide an overlay patch for an existing Xcode export +when useful. Preserve the export-relative directory layout, include all changed +sources/headers and validate quoted include resolution. This permits testing on +Mac without another Windows/Fusion export. If an old helper compilation unit is +removed, update the project's source references or supply an empty compatibility +unit in the overlay so old references do not cause missing-file/duplicate-symbol +errors. Keep temporary compatibility units and patch archives out of production +commits. State which files to overwrite and any required project edits. + +## Runtime diagnosis and completion evidence + +Distinguish the selected build SDK, deployment target and simulator OS. Lowering +the minimum OS or choosing an older simulator does not change the build SDK. +If UIKit rejects startup for missing UIScene lifecycle adoption, investigate the +exporter's application lifecycle separately from the plugin. A plist declaration +alone does not implement scene/window/event handling. Describe an older-SDK test +as a temporary compatibility result, not a lifecycle migration or an official +vendor workaround unless verified from a vendor source. + +For missing hover previews, inspect the Runtime's touch-to-mouse mapping and +the example's event triggers before changing object creation or algorithms. +Check tap/drag behavior; distinguish input-trigger differences from incorrect +object counts, coordinates or selections. + +Report implementation, host/model tests, Apple compilation, packaging/export, +simulator behavior and device coverage separately. Revalidate the latest changed +adapter/helpers on Apple: an earlier successful native build or app launch does +not validate a later refactor. Generic helper tests must not link a plugin core. +Document host-only test limitations, including GNUstep versus Apple's exception +runtime. When implementation is complete, identify the remaining concrete review +and platform checks; do not imply exhaustive ACE coverage from one working demo. + +## Architectural reference: Phi's DarkEdif + +Reference ideas only; do not copy implementation or generated adapter code. +Upstream: https://github.com/SortaCore/MMF2Exts (inspected revision +ac3f3f9dd5d54e9fc2c980b33450c79f23ad58b2). + +- DarkEdif/Lib/FusionSDK.props selects static iOS libraries, device/simulator + builds and a post-build packaging tool. FusionSDKConfig.Template.ini describes + VS-initiated remote Mac builds and artifact transfer. +- DarkEdif/- MFAs and documentation/DarkEdif MultiTargeting.md documents encoded + .ext delivery containing compiled iOS files. It instructs users to add exported + CRun sources and the XCFramework to Xcode when references are not generated. +- DarkEdif/Phi Object/CRunPhi_Object.hpp and .mm demonstrate a thin Runtime class + forwarding to precompiled implementation through extern-C calls and an opaque + instance pointer, with callbacks back into the Runtime. +- The inspected tree exposes DarkEdifPostBuildTool.exe rather than its encoder + source. These references establish a delivery model, not a verified .ext codec + for a different publisher. Do not inherit its old SDK, VS, Intel or 32-bit defaults. +- Android's prebuild-before-packaging model also avoids replacing Fusion's Gradle + and manifest configuration. Treat that as a design lesson, not an iOS build recipe. + +## Legacy SDK .ext format and independent CLI + +The repository's make_ext.py is independently implemented; it does not wrap or +copy DarkEdif. Compatibility checks against non-placeholder SDK packages establish +an involutive byte framing around a traditionally encrypted ZIP, with project.txt +holding six NUL-terminated PBX insertion blocks (source build files/references, +group entries, Sources entries, header references, header group entries). Generate +owned IDs and validate ZIP decryption/CRC plus payload contents before publishing. +Do not put private SDK sources into regression fixtures or package them wholesale. + +A C/Objective-C Runtime pair can emit Mach-O .linker_option directives selecting +separate device/simulator archives by TargetConditionals. Use this only after +verifying the target exporter's library search paths and actual links. The supplied +project searches SRCROOT, allowing both uniquely named archives at ZIP root. +This can avoid manual framework-reference edits; it is not a universal exporter +assumption. Retain the XCFramework as the native handoff representation. + +Wine is optional validation material, not a publishing dependency. If it cannot +run a legacy 32-bit maker reliably in the executor, report that limitation; do not +claim its GUI or command-line interface passed. A verified independent format CLI +is preferable to fragile coordinate clicking when it meets the target workflow. diff --git a/.gitignore b/.gitignore index 18a1fadcd..6ddb8ba9c 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,8 @@ Extensions/Android_Extensions.lnk /Extensions/_3rdLib/FFmpeg-sdk/ /Extensions/_3rdLib/FFmpeg-build/out/ +# Python caches +__pycache__/ # Generated OpenSSL SDK, vcpkg checkout and dependency caches /Extensions/_3rdLib/Encrypt-sdk/ /Extensions/_3rdLib/Encrypt-build/out/ diff --git a/Extensions/AGENTS.md b/Extensions/AGENTS.md index adb609cc8..0f474882f 100644 --- a/Extensions/AGENTS.md +++ b/Extensions/AGENTS.md @@ -8,3 +8,11 @@ Check the current Windows helpers for additions or behavior changes on every such update, synchronize portable behavior to Android, and preserve necessary platform-specific runtime implementations. The skill includes the comparison paths, reviewed revision, compatibility requirements and validation workflow. + +# iOS Runtime object helpers + +For iOS Runtime and object helper changes, follow +[`fusion-ios-porting`](../.agents/skills/fusion-ios-porting/SKILL.md). +Keep generic ObjectBase, ObjectSelection and ObjectCreation classes separate +from plugin adapters. Compare their portable APIs with the current Windows and +Android helpers, and validate generic helpers without linking a plugin core. diff --git a/Extensions/FindTheWay/.gitignore b/Extensions/FindTheWay/.gitignore index 3c4efe206..9ec8a6bff 100644 --- a/Extensions/FindTheWay/.gitignore +++ b/Extensions/FindTheWay/.gitignore @@ -258,4 +258,8 @@ paket-files/ # Python Tools for Visual Studio (PTVS) __pycache__/ -*.pyc \ No newline at end of file +*.pyc + +# Generated iOS release outputs +/ToInstall/Files/Data/Runtime/iPhone/FindTheWay.ext +/ToInstall/Files/Tools/FindTheWay-iOS.zip diff --git a/Extensions/FindTheWay/FindTheWay.vcxproj b/Extensions/FindTheWay/FindTheWay.vcxproj index 6ef96d0a2..8006817d7 100644 --- a/Extensions/FindTheWay/FindTheWay.vcxproj +++ b/Extensions/FindTheWay/FindTheWay.vcxproj @@ -319,4 +319,5 @@ copy $(TargetPath) "C:\Steam\steamapps\common\Clickteam Fusion 2.5\Data\Runtime\ + diff --git a/Extensions/_Script/FindTheWayIOS.py b/Extensions/_Script/FindTheWayIOS.py new file mode 100644 index 000000000..48aaceee4 --- /dev/null +++ b/Extensions/_Script/FindTheWayIOS.py @@ -0,0 +1,235 @@ +"""Package and optionally install FindTheWay iOS from a verified Mac core. + +Consumes verified Mac native artifacts and creates the current Runtime .ext on Windows. +""" +from __future__ import annotations +import argparse +import hashlib +import json +import importlib.util +import os +from pathlib import Path, PurePosixPath +import plistlib +import shutil +import tempfile +import zipfile + +EXTENSIONS = Path(__file__).resolve().parent.parent + + +def sha(path: Path) -> str: + data = path.read_bytes() + # Git's Windows text checkout may change these Mac-generated artifacts to + # CRLF. Normalize only known text payloads; archives/.ext stay byte-exact. + if path.suffix == '.h' or path.name == 'Integration.md' or ( + path.name == 'Info.plist' and data.startswith(b' dict[str, str]: + import re + owned = [root / 'iOS/FindTheWay/Core'] + pending = [] + if include_runtime: + owned.append(root / 'iOS/Helpers') + pending = [p for p in (root / 'iOS/FindTheWay/Runtime').glob('*') + if p.suffix in {'.h', '.m', '.mm'}] + for folder in owned: + pending.extend(p for p in folder.rglob('*') if p.suffix in {'.h', '.mm', '.cpp'} + and 'tests' not in p.parts) + pending.append(root / 'iOS/FindTheWay/Core/CMakeLists.txt') + # Producer configuration changes must also invalidate transferred binaries. + project = root / 'iOS/FindTheWay' + pending.extend(project / name for name in ('CMakeLists.txt', 'build.py') + if (project / name).is_file()) + pending.append(root / 'iOS/FindTheWay/Core/build_xcframework.py') + hashes = {} + while pending: + source = pending.pop().resolve() + name = (source.relative_to(root.resolve()).as_posix() + if source.is_relative_to(root.resolve()) + else '../' + source.relative_to(root.resolve().parent).as_posix()) + if name in hashes: + continue + # Git may check text out as CRLF on Windows and LF on Mac. + hashes[name] = hashlib.sha256(source.read_bytes().replace(b'\r\n', b'\n')).hexdigest() + for include in re.findall(r'^\s*#\s*include\s*"([^"]+)"', + source.read_text(encoding='utf-8-sig'), re.M): + candidates = [source.parent / include, root / 'iOS/FindTheWay/Core/include' / include, + root / '_DeLib' / include, root / '_3rdLib' / include] + match = next((p for p in candidates if p.is_file()), None) + if match: + pending.append(match) + elif source.is_relative_to((root / 'iOS/FindTheWay/Core').resolve()): + raise ValueError(f'Unresolved shared dependency: {include}; update the shared-core checkout') + return hashes + + +def payload_files(bundle: Path, require_extension: bool = True) -> dict[str, Path]: + files = {} + for path in bundle.rglob('*'): + if path.is_symlink(): + raise ValueError(f'Symlinks are not allowed: {path}') + if path.is_file() and path != bundle / 'manifest.json': + name = path.relative_to(bundle).as_posix() + if name not in {'FindTheWay.ext', 'Integration.md'} and not name.startswith('FindTheWayCore.xcframework/'): + raise ValueError(f'Unexpected artifact: {name}') + files[name] = path + required = ['Integration.md', 'FindTheWayCore.xcframework/Info.plist'] + if require_extension: + required.append('FindTheWay.ext') + if not all(name in files for name in required): + raise ValueError('Bundle requires FindTheWay.ext, Integration.md and FindTheWayCore.xcframework') + if (require_extension and not files['FindTheWay.ext'].stat().st_size) or not files['Integration.md'].stat().st_size: + raise ValueError('Empty extension or integration instructions') + info = plistlib.loads(files['FindTheWayCore.xcframework/Info.plist'].read_bytes()) + variants = set() + for entry in info['AvailableLibraries']: + if entry['SupportedPlatform'] != 'ios' or entry['SupportedArchitectures'] != ['arm64']: + raise ValueError('Only iOS device/simulator arm64 artifacts are supported') + variant = entry.get('SupportedPlatformVariant', 'device') + if variant not in {'device', 'simulator'} or variant in variants: + raise ValueError('Unexpected or duplicate XCFramework platform slice') + variants.add(variant) + relative = PurePosixPath(entry['LibraryIdentifier']) / entry['LibraryPath'] + if relative.is_absolute() or '..' in relative.parts: + raise ValueError('Invalid XCFramework library path') + library = files.get('FindTheWayCore.xcframework/' + str(relative)) + if not library: + raise ValueError('Missing static archive in XCFramework slice') + with library.open('rb') as stream: + if stream.read(8) != b'!\n': + raise ValueError('Expected a static archive in each XCFramework slice') + if variants != {'device', 'simulator'}: + raise ValueError('Both device and simulator slices are required') + return files + + +def verify(bundle: Path, root: Path) -> dict[str, Path]: + manifest = json.loads((bundle / 'manifest.json').read_text(encoding='utf-8')) + kind = manifest.get('kind', 'release') + if kind not in {'native', 'release'}: + raise ValueError('Unknown iOS artifact kind') + files = payload_files(bundle, require_extension=kind == 'release') + if manifest.get('schema') != 1: + raise ValueError('Unsupported iOS artifact manifest') + expected = source_hashes(root, include_runtime=kind != 'native') + recorded = manifest.get('sources', {}) + matches = (all(recorded.get(name) == value for name, value in expected.items()) + if kind == 'native' and isinstance(recorded, dict) else recorded == expected) + if not matches: + raise ValueError('iOS artifacts are stale or from a different source checkout; rebuild on Mac') + recorded_files = manifest.get('files') + actual_files = {name: sha(path) for name, path in files.items()} + if recorded_files != actual_files: + names = (sorted(name for name in set(recorded_files) | set(actual_files) + if recorded_files.get(name) != actual_files.get(name)) + if isinstance(recorded_files, dict) else ['manifest.json files entry']) + raise ValueError('iOS artifact file set or SHA-256 mismatch: ' + ', '.join(names)) + return files + + +def extension_codec(): + script = Path(__file__).resolve().parents[1] / 'iOS/Tools/make_ext.py' + spec = importlib.util.spec_from_file_location('ftw_ext_codec', script) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def package_contents(files: dict[str, Path], root: Path) -> dict[str, bytes]: + payload = {} + payload['configure_findtheway_export.py'] = (root / 'iOS/FindTheWay/configure_export.py').read_bytes() + runtime = root / 'iOS/FindTheWay/Runtime' + for name in ('CRunFindTheWay.h', 'CRunFindTheWay.m', 'FTWObjectAdapter.mm', 'FTWPlatformAdapter.mm'): + payload['Classes/Extensions/' + name] = (runtime / name).read_bytes() + for name in ('ObjectBase.h', 'ObjectSelection.h', 'ObjectCreation.h'): + payload['Helpers/' + name] = (root / 'iOS/Helpers' / name).read_bytes() + info = plistlib.loads(files['FindTheWayCore.xcframework/Info.plist'].read_bytes()) + for entry in info['AvailableLibraries']: + folder = 'FindTheWayCore.xcframework/' + entry['LibraryIdentifier'] + '/' + platform = 'iphonesimulator' if entry.get('SupportedPlatformVariant') == 'simulator' else 'iphoneos' + payload['libFindTheWayCore_' + platform + '.a'] = files[folder + entry['LibraryPath']].read_bytes() + header = files.get(folder + entry.get('HeadersPath', 'Headers') + '/FindTheWayCore.h') + if not header: + raise ValueError('Native bundle is missing the compiled public ABI header') + data = header.read_bytes().replace(b'\r\n', b'\n') + previous = payload.get('Classes/Extensions/FindTheWayCore.h', data) + if previous != data: + raise ValueError('Device and simulator public ABI headers differ') + payload['Classes/Extensions/FindTheWayCore.h'] = data + for name, path in files.items(): + if name.startswith('FindTheWayCore.xcframework/'): + payload['Frameworks/' + name] = path.read_bytes() + license_file = root.parent / 'LICENSE' + if license_file.is_file(): + payload['FindTheWay-LICENSE.txt'] = license_file.read_bytes() + return payload + + +def stage(bundle: Path, root: Path, fusion_root: Path | None = None) -> None: + files = verify(bundle, root) + destination = fusion_root / 'Data/Runtime/iPhone' if fusion_root else None + if destination and not destination.is_dir(): + raise ValueError('Fusion iPhone runtime directory is missing; set FusionRoot to the installed Fusion directory') + install = root / 'FindTheWay/ToInstall/Files' + extension = install / 'Data/Runtime/iPhone/FindTheWay.ext' + support = install / 'Tools/FindTheWay-iOS.zip' + support.parent.mkdir(parents=True, exist_ok=True) + extension.parent.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory(prefix='ftw-ios-', dir=install) as temporary: + temporary = Path(temporary) + archive = temporary / support.name + with zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED) as output: + for name, path in sorted(files.items()): + if name != 'FindTheWay.ext': + output.write(path, name) + output.write(bundle / 'manifest.json', 'manifest.json') + copied = temporary / extension.name + extension_codec().write_extension('FindTheWay', package_contents(files, root), copied) + os.replace(archive, support) + os.replace(copied, extension) + if destination: + with tempfile.NamedTemporaryFile(dir=destination, prefix='FindTheWay-', suffix='.partial', delete=False) as stream: + temporary = Path(stream.name) + stream.write(extension.read_bytes()) + try: + os.replace(temporary, destination / 'FindTheWay.ext') + finally: + temporary.unlink(missing_ok=True) + print(f'Installed iOS extension: {destination / "FindTheWay.ext"}') + print(f'Created and verified iOS extension: {extension}') + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--artifacts', type=Path, required=True) + parser.add_argument('--install', action='store_true', help='Install into FusionRoot/Data/Runtime/iPhone') + actions = parser.add_mutually_exclusive_group() + actions.add_argument('--verify-only', action='store_true', + help='Verify transferred native/release artifacts without publishing') + actions.add_argument('--record-manifest', action='store_true', + help='Record hashes after completing Mac build/export/Runtime validation') + args = parser.parse_args() + bundle = args.artifacts.resolve() + if not bundle.is_dir(): + parser.error('iOS artifact directory is missing; prepare it on Mac or explicitly disable iOS packaging') + if args.verify_only: + files = verify(bundle, EXTENSIONS) + kind = json.loads((bundle / 'manifest.json').read_text(encoding='utf-8')).get('kind', 'release') + print(f'Verified {kind} artifacts: {len(files)} payload files') + if kind == 'native': + print('Core verified; Windows can package the current Runtime adapter.') + elif args.record_manifest: + files = payload_files(bundle) + manifest = {'schema': 1, 'sources': source_hashes(EXTENSIONS), + 'files': {name: sha(path) for name, path in files.items()}} + (bundle / 'manifest.json').write_text(json.dumps(manifest, indent=2, sort_keys=True), encoding='utf-8') + else: + fusion = Path(os.environ.get('FusionRoot') or r'C:\Steam\steamapps\common\Clickteam Fusion 2.5') if args.install else None + stage(bundle, EXTENSIONS, fusion) + + +if __name__ == '__main__': + main() diff --git a/Extensions/iOS/.gitignore b/Extensions/iOS/.gitignore index 39f00979e..933e4f8ec 100644 --- a/Extensions/iOS/.gitignore +++ b/Extensions/iOS/.gitignore @@ -1,37 +1,3 @@ -_Release - -SDK-Info.plist -SDK_Prefix.pch -robots.txt -main.m - -/Vorbis.framework -# /SDK.xcodeproj -/SDK -/Resources -/Ogg.framework - -/Classes/Animations -/Classes/Application -/Classes/Banks -/Classes/Box2D -/Classes/Events -/Classes/Expressions -/Classes/Frame -/Classes/Movements -/Classes/Objects -/Classes/OI -/Classes/OpenGL -/Classes/RunLoop -/Classes/Services -/Classes/Sprites -/Classes/Transitions -/Classes/Values -/Classes/RuntimeIPhoneAppDelegate.h -/Classes/RuntimeIPhoneAppDelegate.m - -/Classes/Extensions/* - -!/Classes/Extensions/CExtLoad.m -!/Classes/Extensions/CRunTemplate.h -!/Classes/Extensions/CRunTemplate.m +**/Build/ +**/__pycache__/ +**/.build-stage-*/ diff --git a/Extensions/iOS/.vscode/settings.json b/Extensions/iOS/.vscode/settings.json deleted file mode 100644 index f192b1608..000000000 --- a/Extensions/iOS/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "search.useIgnoreFiles": false, - "files.associations": { - "*.h": "objective-c" - } -} \ No newline at end of file diff --git a/Extensions/iOS/Application.cci b/Extensions/iOS/Application.cci deleted file mode 100644 index 2cf867e2e..000000000 Binary files a/Extensions/iOS/Application.cci and /dev/null differ diff --git a/Extensions/iOS/Classes/Extensions/CExtLoad.m b/Extensions/iOS/Classes/Extensions/CExtLoad.m deleted file mode 100644 index 7fac6dbea..000000000 --- a/Extensions/iOS/Classes/Extensions/CExtLoad.m +++ /dev/null @@ -1,415 +0,0 @@ -/* Copyright (c) 1996-2014 Clickteam -* -* This source code is part of the iOS exporter for Clickteam Multimedia Fusion 2 -* and Clickteam Fusion 2.5. -* -* Permission is hereby granted to any person obtaining a legal copy -* of Clickteam Multimedia Fusion 2 or Clickteam Fusion 2.5 to use or modify this source -* code for debugging, optimizing, or customizing applications created with -* Clickteam Multimedia Fusion 2 and/or Clickteam Fusion 2.5. -* Any other use of this source code is prohibited. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -* IN THE SOFTWARE. -*/ -//---------------------------------------------------------------------------------- -// -// CEXTLOAD Chargement des extensions -// -//---------------------------------------------------------------------------------- -#import "CExtLoad.h" -#import "CFile.h" -#import "CRunExtension.h" - -//F01 -#import "CRunTemplate.h" -#import "CRunFindTheWay.h" - -#import "CRunKcArray.h" -#import "CRunActiveBackdrop.h" -#import "CRunAdvGameBoard.h" -#import "CRunAdvPathMov.h" -#import "CRunCalcRect.h" -#import "CRunIIF.h" -#import "CRunInAndOutController.h" -#import "CRunkcdirect.h" -#import "CRunLayer.h" -#import "CRunMoveSafely2.h" -#import "CRunPlatform.h" -#import "CRunclickteam_movement_controller.h" -#import "CRunKcBoxA.h" -#import "CRunKcBoxB.h" -#import "CRunAccelerometer.h" -#import "CRunLocation.h" -#import "CRunkcini.h" -#import "CRunMultipleTouch.h" -#import "CRuniOSButton.h" -#import "CRuniOSSingleEdit.h" -#import "CRuniOSMultipleEdit.h" -#import "CRunJoystickControl.h" -#import "CRunAdvDir.h" -#import "CRunkcclock.h" -#import "CRunkchisc.h" -#import "CRunkcrandom.h" -#import "CRunObjectMover.h" -#import "CRunWargameMap.h" -#import "CRunparser.h" -#import "CRunMTRandom.h" -#import "CRunGet.h" -#import "CRunkclist.h" -#import "CRunkcinput.h" -#import "CRuniOSStore.h" -#import "CRunStringTokenizer.h" -#import "CRunMoveIt.h" -#import "CRunEasing.h" -#import "CRunkcedit.h" -#import "CRuniOS.h" -#import "CRunkcbutton.h" -#import "CRunCamera.h" -#import "CRunGameCenterConnect.h" -#import "CRunGameCenterLeaderboard.h" -#import "CRunGameCenterAchievements.h" -#import "CRunGameCenterAchievement.h" -#import "CRunGameCenterMultiplayer.h" -#import "CRunkcwctrl.h" -#import "CRunkcpica.h" -#import "CRuniOSVideo.h" -#import "CRunForEach.h" -#import "CRunCreateByName.h" -#import "CRunInventory.h" -#import "CRunDeadReckoning.h" -#import "CRunFlocking.h" -#import "CRunScreenZoom.h" -#import "CRunBox2DBase.h" -#import "CRunBox2DFan.h" -#import "CRunBox2DMagnet.h" -#import "CRunBox2DTreadmill.h" -#import "CRunBox2DParticules.h" -#import "CRunBox2DRopeAndChain.h" -#import "CRunBox2DGround.h" -#import "CRunBox2DJoint.h" -#import "CRunWebView2.h" -#import "CRunStencilMask.h" - -//F01END - -@implementation CExtLoad - --(void)dealloc -{ - [name release]; - [subType release]; - [super dealloc]; -} --(void)loadInfo:(CFile*)file -{ - NSUInteger debut = [file getFilePointer]; - - short size = abs([file readAShort]); - handle = [file readAShort]; - [file skipBytes:12]; - - name = [file readAString]; - NSRange index = [name rangeOfString:@"."]; - if (index.location!=NSNotFound) - { - NSString* temp=[name substringToIndex:index.location]; - [name release]; - name=temp; - [name retain]; - } - subType = [file readAString]; - - [file seek:debut + size]; -} - --(CRunExtension*)loadRunObject -{ - CRunExtension* object=nil; - -//F02 - if ([name caseInsensitiveCompare:@"Template"]==0) - { - object=[[CRunTemplate alloc] init]; - } - if ([name caseInsensitiveCompare:@"FindTheWay"]==0) - { - object=[[CRunFindTheWay alloc] init]; - } - - if ([name caseInsensitiveCompare:@"kcarray"]==0) - { - object=[[CRunKcArray alloc] init]; - } - if ([name caseInsensitiveCompare:@"ActiveBackdrop"]==0) - { - object=[[CRunActiveBackdrop alloc] init]; - } - if ([name caseInsensitiveCompare:@"AdvGameBoard"]==0) - { - object=[[CRunAdvGameBoard alloc] init]; - } - if ([name caseInsensitiveCompare:@"AdvPathMov"]==0) - { - object=[[CRunAdvPathMov alloc] init]; - } - if ([name caseInsensitiveCompare:@"CalcRect"]==0) - { - object=[[CRunCalcRect alloc] init]; - } - if ([name caseInsensitiveCompare:@"IIF"]==0) - { - object=[[CRunIIF alloc] init]; - } - if ([name caseInsensitiveCompare:@"InAndOutController"]==0) - { - object=[[CRunInAndOutController alloc] init]; - } - if ([name caseInsensitiveCompare:@"kcdirect"]==0) - { - object=[[CRunkcdirect alloc] init]; - } - if ([name caseInsensitiveCompare:@"Layer"]==0) - { - object=[[CRunLayer alloc] init]; - } - if ([name caseInsensitiveCompare:@"MoveSafely2"]==0) - { - object=[[CRunMoveSafely2 alloc] init]; - } - if ([name caseInsensitiveCompare:@"Platform"]==0) - { - object=[[CRunPlatform alloc] init]; - } - if ([name caseInsensitiveCompare:@"clickteam-movement-controller"]==0) - { - object=[[CRunclickteam_movement_controller alloc] init]; - } - if ([name caseInsensitiveCompare:@"KcBoxA"]==0) - { - object=[[CRunKcBoxA alloc] init]; - } - if ([name caseInsensitiveCompare:@"KcBoxB"]==0) - { - object=[[CRunKcBoxB alloc] init]; - } - if ([name caseInsensitiveCompare:@"Accelerometer"]==0) - { - object=[[CRunAccelerometer alloc] init]; - } - if ([name caseInsensitiveCompare:@"Location"]==0) - { - object=[[CRunLocation alloc] init]; - } - if ([name caseInsensitiveCompare:@"kcini"]==0) - { - object=[[CRunkcini alloc] init]; - } - if ([name caseInsensitiveCompare:@"MultipleTouch"]==0) - { - object=[[CRunMultipleTouch alloc] init]; - } - if ([name caseInsensitiveCompare:@"iOSButton"]==0) - { - object=[[CRuniOSButton alloc] init]; - } - if ([name caseInsensitiveCompare:@"iOSSingleEdit"]==0) - { - object=[[CRuniOSSingleEdit alloc] init]; - } - if ([name caseInsensitiveCompare:@"iOSMultipleEdit"]==0) - { - object=[[CRuniOSMultipleEdit alloc] init]; - } - if ([name caseInsensitiveCompare:@"AdvDir"]==0) - { - object=[[CRunAdvDir alloc] init]; - } - if ([name caseInsensitiveCompare:@"JoystickControl"]==0) - { - object=[[CRunJoystickControl alloc] init]; - } - if ([name caseInsensitiveCompare:@"kcclock"]==0) - { - object=[[CRunkcclock alloc] init]; - } - if ([name caseInsensitiveCompare:@"kchisc"]==0) - { - object=[[CRunkchisc alloc] init]; - } - if ([name caseInsensitiveCompare:@"kcrandom"]==0) - { - object=[[CRunkcrandom alloc] init]; - } - if ([name caseInsensitiveCompare:@"ObjectMover"]==0) - { - object=[[CRunObjectMover alloc] init]; - } - if ([name caseInsensitiveCompare:@"WargameMap"]==0) - { - object=[[CRunWargameMap alloc] init]; - } - if ([name caseInsensitiveCompare:@"parse"]==0) - { - object=[[CRunparser alloc] init]; - } - if ([name caseInsensitiveCompare:@"MTRandom"]==0) - { - object=[[CRunMTRandom alloc] init]; - } - if ([name caseInsensitiveCompare:@"parser"]==0) - { - object=[[CRunparser alloc] init]; - } - if ([name caseInsensitiveCompare:@"get"]==0) - { - object=[[CRunGet alloc] init]; - } - if ([name caseInsensitiveCompare:@"kclist"]==0) - { - object=[[CRunkclist alloc] init]; - } - if ([name caseInsensitiveCompare:@"kcinput"]==0) - { - object=[[CRunkcinput alloc] init]; - } - if ([name caseInsensitiveCompare:@"iOSStore"]==0) - { - object=[[CRuniOSStore alloc] init]; - } - if ([name caseInsensitiveCompare:@"StringTokenizer"]==0) - { - object=[[CRunStringTokenizer alloc] init]; - } - if ([name caseInsensitiveCompare:@"MoveIt"]==0) - { - object=[[CRunMoveIt alloc] init]; - } - if ([name caseInsensitiveCompare:@"Easing"]==0) - { - object=[[CRunEasing alloc] init]; - } - if ([name caseInsensitiveCompare:@"kcedit"]==0) - { - object=[[CRunkcedit alloc] init]; - } - if ([name caseInsensitiveCompare:@"iOS"]==0) - { - object=[[CRuniOS alloc] init]; - } - if ([name caseInsensitiveCompare:@"kcbutton"]==0) - { - object=[[CRunkcbutton alloc] init]; - } - if ([name caseInsensitiveCompare:@"Camera"]==0) - { - object=[[CRunCamera alloc] init]; - } - if ([name caseInsensitiveCompare:@"GameCenterConnect"]==0) - { - object=[[CRunGameCenterConnect alloc] init]; - } - if ([name caseInsensitiveCompare:@"GameCenterLeaderboard"]==0) - { - object=[[CRunGameCenterLeaderboard alloc] init]; - } - if ([name caseInsensitiveCompare:@"GameCenterAchievements"]==0) - { - object=[[CRunGameCenterAchievements alloc] init]; - } - if ([name caseInsensitiveCompare:@"GameCenterAchievement"]==0) - { - object=[[CRunGameCenterAchievement alloc] init]; - } - if ([name caseInsensitiveCompare:@"GameCenterMultiplayer"]==0) - { - object=[[CRunGameCenterMultiplayer alloc] init]; - } - if ([name caseInsensitiveCompare:@"kcpica"]==0) - { - object=[[CRunkcpica alloc] init]; - } - if ([name caseInsensitiveCompare:@"kcwctrl"]==0) - { - object=[[CRunkcwctrl alloc] init]; - } - if ([name caseInsensitiveCompare:@"iOSVideo"]==0) - { - object=[[CRuniOSVideo alloc] init]; - } - if ([name caseInsensitiveCompare:@"ForEach"]==0) - { - object=[[CRunForEach alloc] init]; - } - if ([name caseInsensitiveCompare:@"CreateByName"]==0) - { - object=[[CRunCreateByName alloc] init]; - } - if ([name caseInsensitiveCompare:@"Inventory"]==0) - { - object=[[CRunInventory alloc] init]; - } - if ([name caseInsensitiveCompare:@"DeadReckoning"]==0) - { - object=[[CRunDeadReckoning alloc] init]; - } - if ([name caseInsensitiveCompare:@"Flocking"]==0) - { - object=[[CRunFlocking alloc] init]; - } - if ([name caseInsensitiveCompare:@"ScreenZoom"]==0) - { - object=[[CRunScreenZoom alloc] init]; - } - if ([name caseInsensitiveCompare:@"Box2DBase"]==0) - { - object=[[CRunBox2DBase alloc] init]; - } - if ([name caseInsensitiveCompare:@"Box2DFan"]==0) - { - object=[[CRunBox2DFan alloc] init]; - } - if ([name caseInsensitiveCompare:@"Box2DMagnet"]==0) - { - object=[[CRunBox2DMagnet alloc] init]; - } - if ([name caseInsensitiveCompare:@"Box2DTreadmill"]==0) - { - object=[[CRunBox2DTreadmill alloc] init]; - } - if ([name caseInsensitiveCompare:@"Box2DParticules"]==0) - { - object=[[CRunBox2DParticules alloc] init]; - } - if ([name caseInsensitiveCompare:@"Box2DRopeAndChain"]==0) - { - object=[[CRunBox2DRopeAndChain alloc] init]; - } - if ([name caseInsensitiveCompare:@"Box2DGround"]==0) - { - object=[[CRunBox2DGround alloc] init]; - } - if ([name caseInsensitiveCompare:@"Box2DJoint"]==0) - { - object=[[CRunBox2DJoint alloc] init]; - } - if ([name caseInsensitiveCompare:@"WebView2"]==0) - { - object=[[CRunWebView2 alloc] init]; - } - if ([name caseInsensitiveCompare:@"StencilMask"]==0) - { - object=[[CRunStencilMask alloc] init]; - } - - //F02END - - return object; -} - -@end diff --git a/Extensions/iOS/Classes/Extensions/CRunFindTheWay.h b/Extensions/iOS/Classes/Extensions/CRunFindTheWay.h deleted file mode 100644 index 9866521c7..000000000 --- a/Extensions/iOS/Classes/Extensions/CRunFindTheWay.h +++ /dev/null @@ -1,30 +0,0 @@ -#import "CRunExtension.h" - -NS_ASSUME_NONNULL_BEGIN - -@class CRun; -@class CRunExtension; -@class CActExtension; -@class CCndExtension; - -@class CFile; -@class CValue; -@class CObject; -@class CCreateObjectInfo; - -@interface CRunFindTheWay : CRunExtension { - -} - --(int)getNumberOfConditions; --(BOOL)createRunObject:(CFile*)file withCOB:(CCreateObjectInfo*)cob andVersion:(int)version; --(int)handleRunObject; --(void)destroyRunObject:(BOOL)bFast; - --(BOOL)condition:(int)num withCndExtension:(CCndExtension*)cnd; --(void)action:(int)num withActExtension:(CActExtension*)act; --(CValue*)expression:(int)num; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Extensions/iOS/Classes/Extensions/CRunFindTheWay.m b/Extensions/iOS/Classes/Extensions/CRunFindTheWay.m deleted file mode 100644 index 474321300..000000000 --- a/Extensions/iOS/Classes/Extensions/CRunFindTheWay.m +++ /dev/null @@ -1,83 +0,0 @@ -#import "CRunFindTheWay.h" - -#import "CRun.h" -#import "CExtension.h" -#import "CActExtension.h" -#import "CCndExtension.h" - -#import "CFile.h" -#import "CValue.h" -#import "CObject.h" -#import "CCreateObjectInfo.h" - -// Define A/C/E here -// Condition -#define CND 0 - -#define CND_LAST 1 - -// Action -#define ACT 0 - -// Expression -#define EXP 0 - -@implementation CRunFindTheWay - -// Fusion Funcs --(int) getNumberOfConditions { - return CND_LAST; -} - --(BOOL)createRunObject:(CFile*)file withCOB:(CCreateObjectInfo*)cob andVersion:(int)version { - // Read Properties - // [file readAInt]; - - // Return - return YES; -} - --(void)destroyRunObject:(BOOL)bFast { - -} - --(int)handleRunObject { - return 0; -} - -// Jump Table -// Condition Jump Table --(BOOL)condition:(int)num withCndExtension:(CCndExtension*)cnd { - switch (num) { - case CND: { - // [cnd getParamOi:rh withNum:0]; - - return YES; - } - } - return NO; -} - -// Action Jump Table --(void)action:(int)num withActExtension:(CActExtension*)act { - switch (num) { - case ACT: { - // [act getParamExpression:rh withNum:5] - - break; - } - } -} - -// Expression Jump Table --(CValue*)expression:(int)num { - switch(num) { - case EXP:{ - return [rh getTempValue:(int)1]; - } - } - - return [rh getTempDouble:0]; -} - -@end diff --git a/Extensions/iOS/Classes/Extensions/CRunTemplate.h b/Extensions/iOS/Classes/Extensions/CRunTemplate.h deleted file mode 100644 index a4b6dde24..000000000 --- a/Extensions/iOS/Classes/Extensions/CRunTemplate.h +++ /dev/null @@ -1,30 +0,0 @@ -#import "CRunExtension.h" - -NS_ASSUME_NONNULL_BEGIN - -@class CRun; -@class CRunExtension; -@class CActExtension; -@class CCndExtension; - -@class CFile; -@class CValue; -@class CObject; -@class CCreateObjectInfo; - -@interface CRunTemplate : CRunExtension { - -} - --(int)getNumberOfConditions; --(BOOL)createRunObject:(CFile*)file withCOB:(CCreateObjectInfo*)cob andVersion:(int)version; --(int)handleRunObject; --(void)destroyRunObject:(BOOL)bFast; - --(BOOL)condition:(int)num withCndExtension:(CCndExtension*)cnd; --(void)action:(int)num withActExtension:(CActExtension*)act; --(CValue*)expression:(int)num; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Extensions/iOS/Classes/Extensions/CRunTemplate.m b/Extensions/iOS/Classes/Extensions/CRunTemplate.m deleted file mode 100644 index bfaea4de8..000000000 --- a/Extensions/iOS/Classes/Extensions/CRunTemplate.m +++ /dev/null @@ -1,83 +0,0 @@ -#import "CRunTemplate.h" - -#import "CRun.h" -#import "CExtension.h" -#import "CActExtension.h" -#import "CCndExtension.h" - -#import "CFile.h" -#import "CValue.h" -#import "CObject.h" -#import "CCreateObjectInfo.h" - -// Define A/C/E here -// Condition -#define CND 0 - -#define CND_LAST 1 - -// Action -#define ACT 0 - -// Expression -#define EXP 0 - -@implementation CRunTemplate - -// Fusion Funcs --(int) getNumberOfConditions { - return CND_LAST; -} - --(BOOL)createRunObject:(CFile*)file withCOB:(CCreateObjectInfo*)cob andVersion:(int)version { - // Read Properties - // [file readAInt]; - - // Return - return YES; -} - --(void)destroyRunObject:(BOOL)bFast { - -} - --(int)handleRunObject { - return 0; -} - -// Jump Table -// Condition Jump Table --(BOOL)condition:(int)num withCndExtension:(CCndExtension*)cnd { - switch (num) { - case CND: { - // [cnd getParamOi:rh withNum:0]; - - return YES; - } - } - return NO; -} - -// Action Jump Table --(void)action:(int)num withActExtension:(CActExtension*)act { - switch (num) { - case ACT: { - // [act getParamExpression:rh withNum:5] - - break; - } - } -} - -// Expression Jump Table --(CValue*)expression:(int)num { - switch(num) { - case EXP:{ - return [rh getTempValue:(int)1]; - } - } - - return [rh getTempDouble:0]; -} - -@end diff --git a/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/Info.plist b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/Info.plist new file mode 100644 index 000000000..3afa6cd4c --- /dev/null +++ b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/Info.plist @@ -0,0 +1,47 @@ + + + + + AvailableLibraries + + + BinaryPath + libFindTheWayCore.a + HeadersPath + Headers + LibraryIdentifier + ios-arm64 + LibraryPath + libFindTheWayCore.a + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + BinaryPath + libFindTheWayCore.a + HeadersPath + Headers + LibraryIdentifier + ios-arm64-simulator + LibraryPath + libFindTheWayCore.a + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64-simulator/Headers/FindTheWayCore.h b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64-simulator/Headers/FindTheWayCore.h new file mode 100644 index 000000000..e873ddfd6 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64-simulator/Headers/FindTheWayCore.h @@ -0,0 +1,81 @@ +#ifndef FINDTHEWAY_CORE_H +#define FINDTHEWAY_CORE_H +#include +#ifdef __cplusplus +extern "C" { +#endif +/* C ABI for map lifecycle, cell costs, and last-path queries. All calls execute on the owning Fusion + * thread. Handles are opaque, never reused, and remain invalid after release. + * Outputs are written only on success. No exceptions cross this boundary. */ +typedef uint64_t FTWMap; +typedef int32_t FTWStatus; +enum { FTW_OK=0, FTW_INVALID_ARGUMENT=1, FTW_INVALID_HANDLE=2, + FTW_OUT_OF_MEMORY=3, FTW_CORE_ERROR=4, FTW_BUFFER_TOO_SMALL=5 }; +enum { FTW_MAP=0, FTW_TERRAIN=1, FTW_DYNAMIC=2 }; +typedef struct FTWCoord { int32_t x; int32_t y; } FTWCoord; +enum { FTW_FIND_DIAGONAL=1, FTW_FIND_CHECK_CORNERS=2, FTW_FIND_FORCE=4 }; +/* A successful search with no route returns OK and count zero. Path coordinates + * include both endpoints. Copy the result before the next search/map mutation. + * A null buffer with zero capacity queries the count. BUFFER_TOO_SMALL writes + * required count only, leaving the coordinate buffer untouched. */ +FTWStatus ftw_map_find_path(FTWMap map, FTWCoord start, FTWCoord goal, + uint32_t flags, uint64_t *out_count); +FTWStatus ftw_map_copy_path(FTWMap map, FTWCoord *buffer, uint64_t capacity, + uint64_t *out_count); +uint32_t ftw_abi_version(void); +FTWStatus ftw_map_create(int32_t width, int32_t height, FTWMap *out_map); +/* Releasing an already released handle (including zero) succeeds. */ +FTWStatus ftw_map_release(FTWMap map); +/* Serialization is the core's ASCII map format, with explicit byte length. + * Export count excludes any terminator; no NUL is appended. Query with NULL/0. + * Too-small buffers are untouched and return the required byte count. */ +FTWStatus ftw_map_create_serialized(const char *bytes, uint64_t length, FTWMap *out_map); +FTWStatus ftw_map_export(FTWMap map, char *buffer, uint64_t capacity, uint64_t *out_length); +/* Isometric width/height are packed by the bridge, not by the caller. + * Signed offsets are translated at the C boundary to avoid LLP64/LP64 differences. */ +FTWStatus ftw_map_set_grid(FTWMap map, int32_t isometric, int32_t width, + int32_t height, int32_t offset_x, int32_t offset_y); +FTWStatus ftw_map_convert_coord(FTWMap map, FTWCoord input, int32_t to_grid, + FTWCoord *out_coord); +FTWStatus ftw_map_set_cost(FTWMap map, int32_t x, int32_t y, int32_t cost, int32_t layer); +FTWStatus ftw_map_get_cost(FTWMap map, int32_t x, int32_t y, int32_t layer, int32_t *out_cost); +/* ABI 2: Windows algorithm coverage. Lists are copied, not retained. UTF-8 + * path names are NUL terminated; NULL/empty selects the last path. */ +typedef struct FTWLists { + const FTWCoord *ally, *enemy, *zoc; + uint64_t ally_count, enemy_count, zoc_count; +} FTWLists; +typedef struct FTWAreaOptions { + FTWCoord start; + int32_t line, attack, range, start_range, ignore, all_range, attack_range; +} FTWAreaOptions; +typedef struct FTWAreaPoint { FTWCoord coord; uint64_t ring; } FTWAreaPoint; +FTWStatus ftw_map_set_lists(FTWMap, const FTWLists *); +FTWStatus ftw_map_find_ex(FTWMap, FTWCoord, FTWCoord, uint32_t flags, + uint32_t ignore, const char *save_name, uint64_t *count); +FTWStatus ftw_map_named_path(FTWMap, const char *name, FTWCoord *, uint64_t, uint64_t *); +FTWStatus ftw_map_area(FTWMap, const FTWAreaOptions *, uint64_t *rings, uint64_t *attack_start); +FTWStatus ftw_map_copy_area(FTWMap, FTWAreaPoint *, uint64_t, uint64_t *); +FTWStatus ftw_map_line_range(FTWMap, FTWCoord, int32_t direction, int32_t range, + uint32_t ignore, int32_t attack, int32_t *result); +FTWStatus ftw_generate_zoc(FTWCoord, FTWCoord *, uint64_t, uint64_t *); +FTWStatus ftw_map_aoe(FTWMap, FTWCoord, uint32_t direction, uint32_t type, + uint32_t ignore, FTWCoord *, uint64_t, uint64_t *); +FTWStatus ftw_map_stash(FTWMap, int32_t enable); +FTWStatus ftw_map_clear_costs(FTWMap, int32_t cost, int32_t layer); +/* Desktop GetMap semantics: outside-map coordinates sample as obstacle (255), + * while the original strict get_cost API retains argument validation. */ +FTWStatus ftw_map_sample_cost(FTWMap, int32_t x, int32_t y, int32_t layer, int32_t *cost); +FTWStatus ftw_map_dimensions(FTWMap, int32_t *width, int32_t *height); +FTWStatus ftw_map_display(FTWMap, int32_t layer, int32_t show_path, + const char *name, char *, uint64_t, uint64_t *); +/* Poll lazy merged-map updates without invoking Runtime code inside C++. */ +FTWStatus ftw_map_take_updates(FTWMap, uint64_t *count); +/* Callback is borrowed, synchronous on the owner thread. Do not throw through it. + * The core retains its map across callbacks; replacement/release is permitted. */ +typedef void (*FTWUpdateCallback)(void *context, FTWMap map); +FTWStatus ftw_map_set_callback(FTWMap, FTWUpdateCallback, void *context); +#ifdef __cplusplus +} +#endif +#endif diff --git a/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64-simulator/libFindTheWayCore.a b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64-simulator/libFindTheWayCore.a new file mode 100644 index 000000000..5a2c2b5b8 Binary files /dev/null and b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64-simulator/libFindTheWayCore.a differ diff --git a/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64/Headers/FindTheWayCore.h b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64/Headers/FindTheWayCore.h new file mode 100644 index 000000000..e873ddfd6 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64/Headers/FindTheWayCore.h @@ -0,0 +1,81 @@ +#ifndef FINDTHEWAY_CORE_H +#define FINDTHEWAY_CORE_H +#include +#ifdef __cplusplus +extern "C" { +#endif +/* C ABI for map lifecycle, cell costs, and last-path queries. All calls execute on the owning Fusion + * thread. Handles are opaque, never reused, and remain invalid after release. + * Outputs are written only on success. No exceptions cross this boundary. */ +typedef uint64_t FTWMap; +typedef int32_t FTWStatus; +enum { FTW_OK=0, FTW_INVALID_ARGUMENT=1, FTW_INVALID_HANDLE=2, + FTW_OUT_OF_MEMORY=3, FTW_CORE_ERROR=4, FTW_BUFFER_TOO_SMALL=5 }; +enum { FTW_MAP=0, FTW_TERRAIN=1, FTW_DYNAMIC=2 }; +typedef struct FTWCoord { int32_t x; int32_t y; } FTWCoord; +enum { FTW_FIND_DIAGONAL=1, FTW_FIND_CHECK_CORNERS=2, FTW_FIND_FORCE=4 }; +/* A successful search with no route returns OK and count zero. Path coordinates + * include both endpoints. Copy the result before the next search/map mutation. + * A null buffer with zero capacity queries the count. BUFFER_TOO_SMALL writes + * required count only, leaving the coordinate buffer untouched. */ +FTWStatus ftw_map_find_path(FTWMap map, FTWCoord start, FTWCoord goal, + uint32_t flags, uint64_t *out_count); +FTWStatus ftw_map_copy_path(FTWMap map, FTWCoord *buffer, uint64_t capacity, + uint64_t *out_count); +uint32_t ftw_abi_version(void); +FTWStatus ftw_map_create(int32_t width, int32_t height, FTWMap *out_map); +/* Releasing an already released handle (including zero) succeeds. */ +FTWStatus ftw_map_release(FTWMap map); +/* Serialization is the core's ASCII map format, with explicit byte length. + * Export count excludes any terminator; no NUL is appended. Query with NULL/0. + * Too-small buffers are untouched and return the required byte count. */ +FTWStatus ftw_map_create_serialized(const char *bytes, uint64_t length, FTWMap *out_map); +FTWStatus ftw_map_export(FTWMap map, char *buffer, uint64_t capacity, uint64_t *out_length); +/* Isometric width/height are packed by the bridge, not by the caller. + * Signed offsets are translated at the C boundary to avoid LLP64/LP64 differences. */ +FTWStatus ftw_map_set_grid(FTWMap map, int32_t isometric, int32_t width, + int32_t height, int32_t offset_x, int32_t offset_y); +FTWStatus ftw_map_convert_coord(FTWMap map, FTWCoord input, int32_t to_grid, + FTWCoord *out_coord); +FTWStatus ftw_map_set_cost(FTWMap map, int32_t x, int32_t y, int32_t cost, int32_t layer); +FTWStatus ftw_map_get_cost(FTWMap map, int32_t x, int32_t y, int32_t layer, int32_t *out_cost); +/* ABI 2: Windows algorithm coverage. Lists are copied, not retained. UTF-8 + * path names are NUL terminated; NULL/empty selects the last path. */ +typedef struct FTWLists { + const FTWCoord *ally, *enemy, *zoc; + uint64_t ally_count, enemy_count, zoc_count; +} FTWLists; +typedef struct FTWAreaOptions { + FTWCoord start; + int32_t line, attack, range, start_range, ignore, all_range, attack_range; +} FTWAreaOptions; +typedef struct FTWAreaPoint { FTWCoord coord; uint64_t ring; } FTWAreaPoint; +FTWStatus ftw_map_set_lists(FTWMap, const FTWLists *); +FTWStatus ftw_map_find_ex(FTWMap, FTWCoord, FTWCoord, uint32_t flags, + uint32_t ignore, const char *save_name, uint64_t *count); +FTWStatus ftw_map_named_path(FTWMap, const char *name, FTWCoord *, uint64_t, uint64_t *); +FTWStatus ftw_map_area(FTWMap, const FTWAreaOptions *, uint64_t *rings, uint64_t *attack_start); +FTWStatus ftw_map_copy_area(FTWMap, FTWAreaPoint *, uint64_t, uint64_t *); +FTWStatus ftw_map_line_range(FTWMap, FTWCoord, int32_t direction, int32_t range, + uint32_t ignore, int32_t attack, int32_t *result); +FTWStatus ftw_generate_zoc(FTWCoord, FTWCoord *, uint64_t, uint64_t *); +FTWStatus ftw_map_aoe(FTWMap, FTWCoord, uint32_t direction, uint32_t type, + uint32_t ignore, FTWCoord *, uint64_t, uint64_t *); +FTWStatus ftw_map_stash(FTWMap, int32_t enable); +FTWStatus ftw_map_clear_costs(FTWMap, int32_t cost, int32_t layer); +/* Desktop GetMap semantics: outside-map coordinates sample as obstacle (255), + * while the original strict get_cost API retains argument validation. */ +FTWStatus ftw_map_sample_cost(FTWMap, int32_t x, int32_t y, int32_t layer, int32_t *cost); +FTWStatus ftw_map_dimensions(FTWMap, int32_t *width, int32_t *height); +FTWStatus ftw_map_display(FTWMap, int32_t layer, int32_t show_path, + const char *name, char *, uint64_t, uint64_t *); +/* Poll lazy merged-map updates without invoking Runtime code inside C++. */ +FTWStatus ftw_map_take_updates(FTWMap, uint64_t *count); +/* Callback is borrowed, synchronous on the owner thread. Do not throw through it. + * The core retains its map across callbacks; replacement/release is permitted. */ +typedef void (*FTWUpdateCallback)(void *context, FTWMap map); +FTWStatus ftw_map_set_callback(FTWMap, FTWUpdateCallback, void *context); +#ifdef __cplusplus +} +#endif +#endif diff --git a/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64/libFindTheWayCore.a b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64/libFindTheWayCore.a new file mode 100644 index 000000000..e1e4432ca Binary files /dev/null and b/Extensions/iOS/FindTheWay/Artifacts/Current/FindTheWayCore.xcframework/ios-arm64/libFindTheWayCore.a differ diff --git a/Extensions/iOS/FindTheWay/Artifacts/Current/Integration.md b/Extensions/iOS/FindTheWay/Artifacts/Current/Integration.md new file mode 100644 index 000000000..65f26b929 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Artifacts/Current/Integration.md @@ -0,0 +1,13 @@ +# FindTheWay iOS integration + +Build host: Apple Silicon. Slices: iOS arm64 and iOS Simulator arm64. +Minimum iOS selected for this build: 17.0. + +Transfer Artifacts/Current to Windows. RunOnly verifies the core and +packages the current Runtime sources into FindTheWay.ext automatically. +The extension autolinks the correct device/simulator archive, libc++ +and iconv using the supplied exporter SRCROOT library search path. +The Runtime sources require C++11; shared C++20 stays precompiled. + +This command verifies source/file hashes and packaging metadata. +It does not establish Fusion export or final App/device validation. diff --git a/Extensions/iOS/FindTheWay/Artifacts/Current/manifest.json b/Extensions/iOS/FindTheWay/Artifacts/Current/manifest.json new file mode 100644 index 000000000..f87d8e922 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Artifacts/Current/manifest.json @@ -0,0 +1,39 @@ +{ + "build": { + "minimum_ios": "17.0", + "xcode": "Xcode 27.2\nBuild version 27B52" + }, + "files": { + "FindTheWayCore.xcframework/Info.plist": "947cb74ecdef874195b81cc16b7fa790b865504ae2796f0c8f2874e882aa6481", + "FindTheWayCore.xcframework/ios-arm64-simulator/Headers/FindTheWayCore.h": "ec01c2cf11e28c9655bf55fd32bf316f9114a162e35756efb9631062c31b49d8", + "FindTheWayCore.xcframework/ios-arm64-simulator/libFindTheWayCore.a": "63b8511560e7c9e81d34fa12aa93ee093ba12be3e8ba3b7bf5a6dae2b7b57c4d", + "FindTheWayCore.xcframework/ios-arm64/Headers/FindTheWayCore.h": "ec01c2cf11e28c9655bf55fd32bf316f9114a162e35756efb9631062c31b49d8", + "FindTheWayCore.xcframework/ios-arm64/libFindTheWayCore.a": "1e2ff2d11416416a72a96e551fc8c1bca987abfbf8133a433118eeb74adcf8fa", + "Integration.md": "c09fba46300a2c3f8f23ca18f64e41aa220f6e892f1b24ba4e0031a19ada9d8a" + }, + "kind": "native", + "schema": 1, + "sources": { + "_3rdLib/Base64.h": "cffc7b8db1cf2f92a88792176e2f77f7ea3bdbefd588c6b652246cfb983a25fb", + "_DeLib/AOE.h": "227bb14f72ad8117e9aa9adce55bec0212d7fb657fbeefb2094ff7c204ad41a7", + "_DeLib/ArithmeticTraits.h": "a42a4295b975cd62b8726e35e1418d3e16ba14f8f8fde4e2f70dae20d7e54ec7", + "_DeLib/FindTheWay.h": "a3786142854540e02f6d360c3e3bc4c1583a9bceec6f2ae1d1dc26af18cb2209", + "_DeLib/FindTheWayFusion.h": "0bf3cf80b2f38229d68becbd58c95786d12313c853dcbc4910e6988b9ad1c048", + "_DeLib/GeneralDefinition.h": "5d4cbc9c0dec62b837e7c8ddf1b767822d30f0111ad73e31c12005b1ac7259d8", + "_DeLib/MapData.h": "5d758e97c9f16a9adcbfed9342867d5f5515a029cb4a1a06cf4b17f555cd283a", + "_DeLib/StrNum.h": "75f7e22938c25f10279e837d672d546065d50a7ec6dd5c94382fa6240e884c9e", + "_DeLib/StringTraits.h": "850ef3b598e02b1e5ced31f89270571f3b9e2597009885bd903371d0c598bc3e", + "iOS/FindTheWay/CMakeLists.txt": "30a45a5d1081633a7d01d3c0f8ca651adfb20bfa77c4ec32f4a51b342e3afcc6", + "iOS/FindTheWay/Core/CMakeLists.txt": "582ae50243032e3a0f4ef8061ce6515bfb7b94546bc33a226397061806262426", + "iOS/FindTheWay/Core/FindTheWayCore.cpp": "7b9f724c7b32119c4a9ebeb5d3291dc9f292409b92057b9e375333f40e5451b1", + "iOS/FindTheWay/Core/build_xcframework.py": "35cd3156d548746647788717531d2eccf040f7dc53b90c6d27c10dae4d7d2dee", + "iOS/FindTheWay/Core/include/FindTheWayCore.h": "ec01c2cf11e28c9655bf55fd32bf316f9114a162e35756efb9631062c31b49d8", + "iOS/FindTheWay/Runtime/CRunFindTheWay.h": "9dc7aa93e2116ceb846b1e74c80eccd930fbcb1a38960f907eb4052a72e9f762", + "iOS/FindTheWay/Runtime/CRunFindTheWay.m": "c1465da6cc6989eaf1192fcfb81706ba218753655a89ea760e6b495d885b7ae6", + "iOS/FindTheWay/Runtime/FTWObjectAdapter.mm": "8d5f4d8f21e0e72e5207bc7bc83b6d929b496337884a6883add1a1c2b1a73507", + "iOS/FindTheWay/Runtime/FTWPlatformAdapter.mm": "2ad141893910ee080ce079ad2116fa5eb2fd38e933a7933f0e92a326d0b85908", + "iOS/FindTheWay/build.py": "d5446df6e0586241155fa33a2d4fea9863fc169308271cd6932736fde6ef966e", + "iOS/Helpers/FTWObjectHelpers.h": "1eaf6b1cd9d63e97663467cdb10dcc281bd49cc2a9dd1cb99cf9e4ce28f3825e", + "iOS/Helpers/FTWObjectHelpers.mm": "5bbdf89532c1e7189e38b47695958f8a63cba1f1f825d047d8cc4cbe8eee55fc" + } +} \ No newline at end of file diff --git a/Extensions/iOS/FindTheWay/CMakeLists.txt b/Extensions/iOS/FindTheWay/CMakeLists.txt new file mode 100644 index 000000000..0c78f4461 --- /dev/null +++ b/Extensions/iOS/FindTheWay/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.22) +project(FindTheWayIOSBuild LANGUAGES C CXX) +include(CTest) +# This project owns build orchestration, not a second copy of the shared core. +add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Core" + "${CMAKE_CURRENT_BINARY_DIR}/core") diff --git a/Extensions/iOS/FindTheWay/Core/CMakeLists.txt b/Extensions/iOS/FindTheWay/Core/CMakeLists.txt new file mode 100644 index 000000000..837dde25c --- /dev/null +++ b/Extensions/iOS/FindTheWay/Core/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.22) +project(FindTheWayCore LANGUAGES C CXX) +set(FTW_CORE_INCLUDE "${CMAKE_CURRENT_LIST_DIR}/../../../_DeLib" CACHE PATH "Current shared core headers") +if(NOT EXISTS "${FTW_CORE_INCLUDE}/FindTheWayFusion.h") + message(FATAL_ERROR "Shared core is outdated: select master 29edeed0 or newer, or set FTW_CORE_INCLUDE") +endif() +find_package(Iconv REQUIRED) +add_library(FindTheWayCore STATIC FindTheWayCore.cpp) +target_compile_features(FindTheWayCore PRIVATE cxx_std_20) +target_include_directories(FindTheWayCore PUBLIC include PRIVATE "${FTW_CORE_INCLUDE}" "${FTW_CORE_INCLUDE}/../_3rdLib") +target_link_libraries(FindTheWayCore PRIVATE Iconv::Iconv) +target_compile_definitions(FindTheWayCore PRIVATE DELIB_ACP_ENCODING="UTF-8") +set_target_properties(FindTheWayCore PROPERTIES CXX_EXTENSIONS OFF POSITION_INDEPENDENT_CODE ON) +include(CTest) +if(BUILD_TESTING AND NOT CMAKE_SYSTEM_NAME STREQUAL "iOS") + add_executable(abi_test tests/abi_test.c) + target_link_libraries(abi_test PRIVATE FindTheWayCore) + set_target_properties(abi_test PROPERTIES LINKER_LANGUAGE CXX) + add_test(NAME abi_test COMMAND abi_test) + add_executable(parity_test tests/parity_test.cpp) + target_link_libraries(parity_test PRIVATE FindTheWayCore) + target_compile_features(parity_test PRIVATE cxx_std_20) + target_include_directories(parity_test PRIVATE "${FTW_CORE_INCLUDE}" "${FTW_CORE_INCLUDE}/../_3rdLib") + target_compile_definitions(parity_test PRIVATE DELIB_ACP_ENCODING="UTF-8") + add_test(NAME parity_test COMMAND parity_test) +endif() diff --git a/Extensions/iOS/FindTheWay/Core/FindTheWayCore.cpp b/Extensions/iOS/FindTheWay/Core/FindTheWayCore.cpp new file mode 100644 index 000000000..a5d4a7ea1 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Core/FindTheWayCore.cpp @@ -0,0 +1,332 @@ +#include "FindTheWayCore.h" +#include +#include +#include +#include +#include +#include +#include +#include "FindTheWayFusion.h" +#include "AOE.h" +#include +#include + +namespace { +struct Map : FindTheWay::FindTheWayFusion { + FindTheWay::CoordSet ally, enemy, zoc; + int32_t offset_x=0, offset_y=0; + uint64_t updates=0; FTWMap handle=0; FTWUpdateCallback callback=nullptr; void* context=nullptr; + template explicit Map(T&&... args) : FindTheWayFusion(std::forward(args)...) { + SetUpdateMapCallBack([](void* p) { auto m=static_cast(p); ++m->updates; auto callback=m->callback; if(callback) callback(m->context,m->handle); },this); + } +}; +std::wstring path_name(const char* name) { + return name ? std::wstring_convert>{}.from_bytes(name) : L""; +} +std::string utf8(const std::wstring& text) { + return std::wstring_convert>{}.to_bytes(text); +} +std::mutex registry_mutex; +std::unordered_map> maps; +FTWMap next_handle = 1; +FTWMap publish(std::shared_ptr map) { + std::lock_guard lock(registry_mutex); + if (next_handle == std::numeric_limits::max()) + throw std::overflow_error("Handle space exhausted"); + const auto id = next_handle; + map->handle=id; + maps.emplace(id, std::move(map)); + ++next_handle; + return id; +} +FTWCoord narrow(FindTheWay::Coord coord) { + if (coord.x < INT32_MIN || coord.x > INT32_MAX || coord.y < INT32_MIN || coord.y > INT32_MAX) + throw std::overflow_error("Coordinate exceeds ABI range"); + return {static_cast(coord.x), static_cast(coord.y)}; +} + +struct InvalidHandle {}; +std::shared_ptr acquire(FTWMap handle) { + std::lock_guard lock(registry_mutex); + const auto it = maps.find(handle); + if (it == maps.end()) throw InvalidHandle{}; + return it->second; +} +template FTWStatus boundary(F&& fn) noexcept { + try { fn(); return FTW_OK; } + catch (const InvalidHandle&) { return FTW_INVALID_HANDLE; } + catch (const std::bad_alloc&) { return FTW_OUT_OF_MEMORY; } + catch (FindTheWay::Exception) { return FTW_INVALID_ARGUMENT; } + catch (const std::invalid_argument&) { return FTW_INVALID_ARGUMENT; } + catch (...) { return FTW_CORE_ERROR; } +} +FindTheWay::MapType validate(const Map& map, int32_t x, int32_t y, int32_t layer) { + if (x < 0 || y < 0 || static_cast(x) >= map.GetMapWidth() + || static_cast(y) >= map.GetMapHeight() || layer < 0 || layer > 2) + throw std::invalid_argument("Invalid cell or layer"); + return static_cast(layer); +} +} +extern "C" { +uint32_t ftw_abi_version(void) { return 2; } +FTWStatus ftw_map_create(int32_t width, int32_t height, FTWMap* output) { + if (!output || width <= 0 || height <= 0 + || static_cast(width)*height > INT32_MAX) return FTW_INVALID_ARGUMENT; + return boundary([&] { + auto map = std::make_shared(width, height); + *output = publish(std::move(map)); + }); +} +FTWStatus ftw_map_release(FTWMap handle) { + return boundary([&] { std::lock_guard lock(registry_mutex); maps.erase(handle); }); +} +FTWStatus ftw_map_set_cost(FTWMap handle, int32_t x, int32_t y, int32_t cost, int32_t layer) { + return boundary([&] { + const auto map = acquire(handle); + const auto type = validate(*map, x, y, layer); + map->SetMap(x, y, cost, type); + }); +} +FTWStatus ftw_map_get_cost(FTWMap handle, int32_t x, int32_t y, int32_t layer, int32_t* output) { + if (!output) return FTW_INVALID_ARGUMENT; + return boundary([&] { + const auto map = acquire(handle); + const auto type = validate(*map, x, y, layer); + *output = map->GetMap(x, y, type); + }); +} +FTWStatus ftw_map_find_path(FTWMap handle, FTWCoord start, FTWCoord goal, + uint32_t flags, uint64_t* count) { + if (!count || (flags & ~uint32_t(7))) return FTW_INVALID_ARGUMENT; + return boundary([&] { + const auto map = acquire(handle); + validate(*map, start.x, start.y, FTW_MAP); + validate(*map, goal.x, goal.y, FTW_MAP); + const FindTheWay::Coord from{start.x, start.y}, to{goal.x, goal.y}; + if (flags & FTW_FIND_FORCE) + map->ForceFind(from, to, flags & FTW_FIND_DIAGONAL, flags & FTW_FIND_CHECK_CORNERS); + else + map->Find(from, to, flags & FTW_FIND_DIAGONAL, flags & FTW_FIND_CHECK_CORNERS); + *count = map->GetPathValidity() ? map->GetDistance() : 0; + }); +} +FTWStatus ftw_map_copy_path(FTWMap handle, FTWCoord* buffer, uint64_t capacity, + uint64_t* count) { + if (!count || (!buffer && capacity)) return FTW_INVALID_ARGUMENT; + bool too_small = false; + const auto status = boundary([&] { + const auto map = acquire(handle); + const uint64_t required = map->GetPathValidity() ? map->GetDistance() : 0; + if (buffer && capacity >= required) { + std::vector points; + points.reserve(required); + for (uint64_t i = 0; i < required; ++i) { + const auto x = map->GetCoordAtPath(i, FindTheWay::CoordType::X); + const auto y = map->GetCoordAtPath(i, FindTheWay::CoordType::Y); + if (x < INT32_MIN || x > INT32_MAX || y < INT32_MIN || y > INT32_MAX) + throw std::overflow_error("Path coordinate exceeds ABI range"); + points.push_back({static_cast(x), static_cast(y)}); + } + std::copy(points.begin(), points.end(), buffer); + } else if (buffer) too_small = true; + *count = required; + }); + return status == FTW_OK && too_small ? FTW_BUFFER_TOO_SMALL : status; +} + +FTWStatus ftw_map_create_serialized(const char* bytes, uint64_t length, FTWMap* output) { + if (!output || !bytes || !length || length > INT32_MAX) return FTW_INVALID_ARGUMENT; + return boundary([&] { + std::wstring encoded; + encoded.reserve(static_cast(length)); + for (uint64_t i=0; i(bytes[i]); + if (!value || value>127) throw std::invalid_argument("Map format must be ASCII"); + encoded.push_back(value); + } + auto map=std::make_shared(encoded); + if (map->GetMapWidth()>INT32_MAX || map->GetMapHeight()>INT32_MAX + || map->GetMapWidth()*map->GetMapHeight()>INT32_MAX) + throw std::invalid_argument("Map dimensions exceed ABI range"); + *output=publish(std::move(map)); + }); +} +FTWStatus ftw_map_export(FTWMap handle, char* buffer, uint64_t capacity, uint64_t* length) { + if (!length || (!buffer && capacity)) return FTW_INVALID_ARGUMENT; + bool too_small=false; + const auto status=boundary([&] { + const auto map=acquire(handle); + const auto encoded=map->GetMap(); + if (buffer && capacity>=encoded.size()) { + for (wchar_t value : encoded) if (value<0 || value>127) + throw std::logic_error("Non-ASCII map serialization"); + for (size_t i=0;i(encoded[i]); + } else if (buffer) too_small=true; + *length=encoded.size(); + }); + return status==FTW_OK && too_small ? FTW_BUFFER_TOO_SMALL : status; +} +FTWStatus ftw_map_set_grid(FTWMap handle, int32_t isometric, int32_t width, + int32_t height, int32_t x, int32_t y) { + if ((isometric!=0 && isometric!=1) || width<=0 || height<=0 || width>65535 + || height>65535) return FTW_INVALID_ARGUMENT; + return boundary([&] { + const auto map=acquire(handle); + map->SetIsometric(isometric!=0); + // Keep signed offsets at the ABI boundary. The shared core stores size_t; + // translating the origin avoids LLP64/LP64 unsigned arithmetic differences. + map->SetGridSize(isometric ? Map::GetIsometricGridSize(width,height) : width,0,0); + map->offset_x=x;map->offset_y=y; + }); +} +FTWStatus ftw_map_convert_coord(FTWMap handle, FTWCoord input, int32_t to_grid, FTWCoord* output) { + if (!output || (to_grid!=0 && to_grid!=1)) return FTW_INVALID_ARGUMENT; + return boundary([&] { + const auto map=acquire(handle); + FindTheWay::Coord coord{input.x,input.y}; + if(to_grid) { + coord.x-=map->offset_x;coord.y-=map->offset_y; + *output=narrow(map->GetGridCoord(coord)); + } else { + coord=map->GetRealCoord(coord);coord.x+=map->offset_x;coord.y+=map->offset_y; + *output=narrow(coord); + } + }); +} + + +FTWStatus ftw_map_set_lists(FTWMap h, const FTWLists* lists) { + if (!lists || (!lists->ally && lists->ally_count) || (!lists->enemy && lists->enemy_count) + || (!lists->zoc && lists->zoc_count)) return FTW_INVALID_ARGUMENT; + return boundary([&] { + auto m=acquire(h); + auto copy=[](const FTWCoord* p,uint64_t n) { + if(n>INT32_MAX) throw std::invalid_argument("List too large"); + FindTheWay::CoordSet out; out.reserve(n); + for(uint64_t i=0;ially,lists->ally_count), e=copy(lists->enemy,lists->enemy_count), z=copy(lists->zoc,lists->zoc_count); + m->ally=std::move(a); m->enemy=std::move(e); m->zoc=std::move(z); + }); +} +FTWStatus ftw_map_find_ex(FTWMap h, FTWCoord start, FTWCoord goal, uint32_t flags, + uint32_t ignore, const char* name, uint64_t* count) { + if(!count || (flags&~7u)) return FTW_INVALID_ARGUMENT; + return boundary([&] { + auto m=acquire(h); const auto saved=path_name(name); + FindTheWay::Coord a{start.x,start.y},b{goal.x,goal.y}; + if(flags&FTW_FIND_FORCE) m->ForceFind(a,b,flags&1,flags&2,&m->ally,&m->enemy,&m->zoc,ignore); + else m->Find(a,b,flags&1,flags&2,&m->ally,&m->enemy,&m->zoc,ignore); + if(!saved.empty()) m->SaveLastPath(saved); + *count=m->GetPathValidity()?m->GetDistance():0; + }); +} +FTWStatus ftw_map_named_path(FTWMap h,const char* name,FTWCoord* output,uint64_t capacity,uint64_t* count) { + if(!count || (!output && capacity)) return FTW_INVALID_ARGUMENT; + bool small=false; + auto status=boundary([&] { + auto m=acquire(h); auto n=path_name(name); auto key=n.empty()?nullptr:&n; + uint64_t size=m->GetPathValidity(key)?m->GetDistance(key):0; + if(output && capacity>=size) { + std::vector points; points.reserve(size); + for(uint64_t i=0;iGetCoordAtPath(i,FindTheWay::CoordType::X,key),m->GetCoordAtPath(i,FindTheWay::CoordType::Y,key)})); + std::copy(points.begin(),points.end(),output); + } else if(output) small=true; + *count=size; + }); + return status==FTW_OK && small?FTW_BUFFER_TOO_SMALL:status; +} +FTWStatus ftw_map_area(FTWMap h,const FTWAreaOptions* o,uint64_t* rings,uint64_t* attack) { + if(!o || !rings || !attack || o->range<0 || o->start_range<0 || o->attack_range<0) return FTW_INVALID_ARGUMENT; + return boundary([&] { + auto m=acquire(h); size_t extra=65536; + FindTheWay::Coord start{o->start.x,o->start.y}; + if(o->line) m->CalcLineArea(start,o->range,o->start_range,&m->ally,&m->enemy,&m->zoc,o->ignore,o->attack); + else m->CalcArea(start,o->range,o->start_range,&m->ally,&m->enemy,&m->zoc,o->ignore,o->attack,o->all_range,o->attack_range,&extra); + *rings=m->GetArea().size(); *attack=extra; + }); +} +FTWStatus ftw_map_copy_area(FTWMap h,FTWAreaPoint* output,uint64_t capacity,uint64_t* count) { + if(!count || (!output && capacity)) return FTW_INVALID_ARGUMENT; + bool small=false; + auto status=boundary([&] { + auto m=acquire(h); const auto& area=m->GetArea(); + std::vector points; + for(size_t i=0;i=points.size()) std::copy(points.begin(),points.end(),output); + else if(output) small=true; + *count=points.size(); + }); + return status==FTW_OK && small?FTW_BUFFER_TOO_SMALL:status; +} +FTWStatus ftw_map_line_range(FTWMap h,FTWCoord start,int32_t dir,int32_t range,uint32_t ignore,int32_t attack,int32_t* result) { + if(!result || range<0) return FTW_INVALID_ARGUMENT; + return boundary([&] { auto m=acquire(h); *result=m->GetAbleLineRange({start.x,start.y},range,static_cast(dir),&m->ally,&m->enemy,&m->zoc,ignore,attack); }); +} +FTWStatus ftw_generate_zoc(FTWCoord start,FTWCoord* output,uint64_t capacity,uint64_t* count) { + if(!count || (!output && capacity)) return FTW_INVALID_ARGUMENT; + bool small=false; + auto status=boundary([&] { + FindTheWay::CoordSet coords; Map::GenerateZoc({start.x,start.y},&coords,false); + std::vector points; for(auto c:coords) points.push_back(narrow(c)); + if(output && capacity>=points.size()) std::copy(points.begin(),points.end(),output); + else if(output) small=true; + *count=points.size(); + }); return status==FTW_OK && small?FTW_BUFFER_TOO_SMALL:status; +} +FTWStatus ftw_map_aoe(FTWMap h,FTWCoord start,uint32_t dir,uint32_t type,uint32_t ignore,FTWCoord* output,uint64_t capacity,uint64_t* count) { + if(!count || (!output && capacity)) return FTW_INVALID_ARGUMENT; + bool small=false; + auto status=boundary([&] { + auto m=acquire(h); AOE::AOEClass aoe; FindTheWay::CoordSet coords; + aoe.GetAOE({start.x,start.y},dir,type,&coords); + auto flags=Map::ParseIgnoreFlag(ignore); + std::vector points; + for(auto c:coords) { + if(m->GetMap(c.x,c.y,FindTheWay::MapType::MAP)==255) continue; + if(!std::get<3>(flags) && std::find(m->ally.begin(),m->ally.end(),c)!=m->ally.end()) continue; + if(!std::get<4>(flags) && std::find(m->enemy.begin(),m->enemy.end(),c)!=m->enemy.end()) continue; + points.push_back(narrow(c)); + } + if(output && capacity>=points.size()) std::copy(points.begin(),points.end(),output); + else if(output) small=true; + *count=points.size(); + }); return status==FTW_OK && small?FTW_BUFFER_TOO_SMALL:status; +} +FTWStatus ftw_map_stash(FTWMap h,int32_t enable) { + return boundary([&] {auto m=acquire(h);m->SetStash(enable!=0);if(!enable)m->ClearStash();}); +} +FTWStatus ftw_map_clear_costs(FTWMap h,int32_t cost,int32_t layer) { + if(layer<1 || layer>2) return FTW_INVALID_ARGUMENT; + return boundary([&]{acquire(h)->ClearMap(static_cast(layer),cost);}); +} +FTWStatus ftw_map_dimensions(FTWMap h,int32_t* w,int32_t* height) { + if(!w || !height) return FTW_INVALID_ARGUMENT; + return boundary([&]{auto m=acquire(h); *w=m->GetMapWidth(); *height=m->GetMapHeight();}); +} +FTWStatus ftw_map_display(FTWMap h,int32_t layer,int32_t show,const char* name,char* output,uint64_t capacity,uint64_t* count) { + if(!count || (!output && capacity) || layer<0 || layer>2) return FTW_INVALID_ARGUMENT; + bool small=false; + auto status=boundary([&] { + auto m=acquire(h); auto n=path_name(name); + auto text=utf8(m->OutPutMapStr(static_cast(layer),show,n.empty()?nullptr:&n)); + if(output && capacity>=text.size()) std::copy(text.begin(),text.end(),output); + else if(output) small=true; + *count=text.size(); + });return status==FTW_OK && small?FTW_BUFFER_TOO_SMALL:status; +} +FTWStatus ftw_map_take_updates(FTWMap h,uint64_t* count) { + if(!count) return FTW_INVALID_ARGUMENT; + return boundary([&]{auto m=acquire(h);*count=m->updates;m->updates=0;}); +} +FTWStatus ftw_map_set_callback(FTWMap h,FTWUpdateCallback callback,void* context) { + return boundary([&]{auto m=acquire(h);m->callback=callback;m->context=context;}); +} + +FTWStatus ftw_map_sample_cost(FTWMap h,int32_t x,int32_t y,int32_t layer,int32_t* cost) { + if(!cost || layer<0 || layer>2) return FTW_INVALID_ARGUMENT; + return boundary([&]{auto m=acquire(h);*cost=m->GetMap(static_cast(x),static_cast(y),static_cast(layer));}); +} + +} diff --git a/Extensions/iOS/FindTheWay/Core/build_xcframework.py b/Extensions/iOS/FindTheWay/Core/build_xcframework.py new file mode 100644 index 000000000..6519813a8 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Core/build_xcframework.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +"""Build separate arm64 iOS/device and simulator archives on Apple Silicon.""" +import argparse +import pathlib +import platform +import shutil +import subprocess +import sys +import tempfile + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--core-include', type=pathlib.Path, + default=pathlib.Path(__file__).resolve().parents[3] / '_DeLib') + parser.add_argument('--project-source', type=pathlib.Path, + default=pathlib.Path(__file__).resolve().parent, + help='CMake entry project; defaults to the standalone core') + parser.add_argument('--build-dir', type=pathlib.Path, required=True) + parser.add_argument('--output', type=pathlib.Path, required=True) + parser.add_argument('--minimum-ios', required=True, + help='Explicit minimum OS; must satisfy actual libc++ availability') + args = parser.parse_args() + if platform.system() != 'Darwin' or platform.machine() != 'arm64': + parser.error('Run on an Apple Silicon Mac with Xcode selected') + for tool in ('xcodebuild', 'xcrun', 'cmake'): + if not shutil.which(tool): + parser.error(f'Missing tool: {tool}') + source = pathlib.Path(__file__).resolve().parent + core = args.core_include.resolve() + if not (core / 'FindTheWayFusion.h').is_file(): + parser.error('Shared headers must include FindTheWayFusion.h from current master') + output = args.output.resolve() + if output.suffix != '.xcframework' or output.exists(): + parser.error('Output must be a new .xcframework path; existing output is preserved') + if not args.minimum_ios or any(c not in '0123456789.' for c in args.minimum_ios): + parser.error('minimum-ios must be a numeric version') + archives = [] + generator = 'Ninja' if shutil.which('ninja') else 'Unix Makefiles' + for sdk in ('iphoneos', 'iphonesimulator'): + sdk_path = subprocess.check_output( + ['xcrun', '--sdk', sdk, '--show-sdk-path'], text=True).strip() + build = args.build_dir.resolve() / sdk + subprocess.run(['cmake', '-S', str(args.project_source.resolve()), '-B', str(build), '-G', generator, + '-DCMAKE_BUILD_TYPE=Release', + '-DCMAKE_SYSTEM_NAME=iOS', '-DCMAKE_OSX_ARCHITECTURES=arm64', + '-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY', + f'-DCMAKE_OSX_SYSROOT={sdk_path}', + f'-DCMAKE_OSX_DEPLOYMENT_TARGET={args.minimum_ios}', + f'-DFTW_CORE_INCLUDE={core}', f'-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY={build / "archives"}', + '-DBUILD_TESTING=OFF'], check=True) + subprocess.run(['cmake', '--build', str(build), '--parallel'], check=True) + archive = build / 'archives/libFindTheWayCore.a' + if not archive.is_file(): + raise RuntimeError(f'Expected Release archive not produced: {archive}') + archives.append(archive) + output.parent.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory(prefix='ftw-stage-', dir=output.parent) as stage: + staged = pathlib.Path(stage) / output.name + command = ['xcodebuild', '-create-xcframework'] + for archive in archives: + command += ['-library', str(archive), '-headers', str(source / 'include')] + subprocess.run(command + ['-output', str(staged)], check=True) + staged.rename(output) + print(output) + + +if __name__ == '__main__': + try: + main() + except (subprocess.CalledProcessError, RuntimeError) as error: + print(error, file=sys.stderr) + sys.exit(1) diff --git a/Extensions/iOS/FindTheWay/Core/include/FindTheWayCore.h b/Extensions/iOS/FindTheWay/Core/include/FindTheWayCore.h new file mode 100644 index 000000000..e873ddfd6 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Core/include/FindTheWayCore.h @@ -0,0 +1,81 @@ +#ifndef FINDTHEWAY_CORE_H +#define FINDTHEWAY_CORE_H +#include +#ifdef __cplusplus +extern "C" { +#endif +/* C ABI for map lifecycle, cell costs, and last-path queries. All calls execute on the owning Fusion + * thread. Handles are opaque, never reused, and remain invalid after release. + * Outputs are written only on success. No exceptions cross this boundary. */ +typedef uint64_t FTWMap; +typedef int32_t FTWStatus; +enum { FTW_OK=0, FTW_INVALID_ARGUMENT=1, FTW_INVALID_HANDLE=2, + FTW_OUT_OF_MEMORY=3, FTW_CORE_ERROR=4, FTW_BUFFER_TOO_SMALL=5 }; +enum { FTW_MAP=0, FTW_TERRAIN=1, FTW_DYNAMIC=2 }; +typedef struct FTWCoord { int32_t x; int32_t y; } FTWCoord; +enum { FTW_FIND_DIAGONAL=1, FTW_FIND_CHECK_CORNERS=2, FTW_FIND_FORCE=4 }; +/* A successful search with no route returns OK and count zero. Path coordinates + * include both endpoints. Copy the result before the next search/map mutation. + * A null buffer with zero capacity queries the count. BUFFER_TOO_SMALL writes + * required count only, leaving the coordinate buffer untouched. */ +FTWStatus ftw_map_find_path(FTWMap map, FTWCoord start, FTWCoord goal, + uint32_t flags, uint64_t *out_count); +FTWStatus ftw_map_copy_path(FTWMap map, FTWCoord *buffer, uint64_t capacity, + uint64_t *out_count); +uint32_t ftw_abi_version(void); +FTWStatus ftw_map_create(int32_t width, int32_t height, FTWMap *out_map); +/* Releasing an already released handle (including zero) succeeds. */ +FTWStatus ftw_map_release(FTWMap map); +/* Serialization is the core's ASCII map format, with explicit byte length. + * Export count excludes any terminator; no NUL is appended. Query with NULL/0. + * Too-small buffers are untouched and return the required byte count. */ +FTWStatus ftw_map_create_serialized(const char *bytes, uint64_t length, FTWMap *out_map); +FTWStatus ftw_map_export(FTWMap map, char *buffer, uint64_t capacity, uint64_t *out_length); +/* Isometric width/height are packed by the bridge, not by the caller. + * Signed offsets are translated at the C boundary to avoid LLP64/LP64 differences. */ +FTWStatus ftw_map_set_grid(FTWMap map, int32_t isometric, int32_t width, + int32_t height, int32_t offset_x, int32_t offset_y); +FTWStatus ftw_map_convert_coord(FTWMap map, FTWCoord input, int32_t to_grid, + FTWCoord *out_coord); +FTWStatus ftw_map_set_cost(FTWMap map, int32_t x, int32_t y, int32_t cost, int32_t layer); +FTWStatus ftw_map_get_cost(FTWMap map, int32_t x, int32_t y, int32_t layer, int32_t *out_cost); +/* ABI 2: Windows algorithm coverage. Lists are copied, not retained. UTF-8 + * path names are NUL terminated; NULL/empty selects the last path. */ +typedef struct FTWLists { + const FTWCoord *ally, *enemy, *zoc; + uint64_t ally_count, enemy_count, zoc_count; +} FTWLists; +typedef struct FTWAreaOptions { + FTWCoord start; + int32_t line, attack, range, start_range, ignore, all_range, attack_range; +} FTWAreaOptions; +typedef struct FTWAreaPoint { FTWCoord coord; uint64_t ring; } FTWAreaPoint; +FTWStatus ftw_map_set_lists(FTWMap, const FTWLists *); +FTWStatus ftw_map_find_ex(FTWMap, FTWCoord, FTWCoord, uint32_t flags, + uint32_t ignore, const char *save_name, uint64_t *count); +FTWStatus ftw_map_named_path(FTWMap, const char *name, FTWCoord *, uint64_t, uint64_t *); +FTWStatus ftw_map_area(FTWMap, const FTWAreaOptions *, uint64_t *rings, uint64_t *attack_start); +FTWStatus ftw_map_copy_area(FTWMap, FTWAreaPoint *, uint64_t, uint64_t *); +FTWStatus ftw_map_line_range(FTWMap, FTWCoord, int32_t direction, int32_t range, + uint32_t ignore, int32_t attack, int32_t *result); +FTWStatus ftw_generate_zoc(FTWCoord, FTWCoord *, uint64_t, uint64_t *); +FTWStatus ftw_map_aoe(FTWMap, FTWCoord, uint32_t direction, uint32_t type, + uint32_t ignore, FTWCoord *, uint64_t, uint64_t *); +FTWStatus ftw_map_stash(FTWMap, int32_t enable); +FTWStatus ftw_map_clear_costs(FTWMap, int32_t cost, int32_t layer); +/* Desktop GetMap semantics: outside-map coordinates sample as obstacle (255), + * while the original strict get_cost API retains argument validation. */ +FTWStatus ftw_map_sample_cost(FTWMap, int32_t x, int32_t y, int32_t layer, int32_t *cost); +FTWStatus ftw_map_dimensions(FTWMap, int32_t *width, int32_t *height); +FTWStatus ftw_map_display(FTWMap, int32_t layer, int32_t show_path, + const char *name, char *, uint64_t, uint64_t *); +/* Poll lazy merged-map updates without invoking Runtime code inside C++. */ +FTWStatus ftw_map_take_updates(FTWMap, uint64_t *count); +/* Callback is borrowed, synchronous on the owner thread. Do not throw through it. + * The core retains its map across callbacks; replacement/release is permitted. */ +typedef void (*FTWUpdateCallback)(void *context, FTWMap map); +FTWStatus ftw_map_set_callback(FTWMap, FTWUpdateCallback, void *context); +#ifdef __cplusplus +} +#endif +#endif diff --git a/Extensions/iOS/FindTheWay/Core/tests/abi_test.c b/Extensions/iOS/FindTheWay/Core/tests/abi_test.c new file mode 100644 index 000000000..28418e0f2 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Core/tests/abi_test.c @@ -0,0 +1,84 @@ +#include "FindTheWayCore.h" +#include +#include +#define CHECK(x) do { if (!(x)) { fprintf(stderr,"Failed line %d: %s\n",__LINE__,#x); return 1; } } while(0) +int main(void) { + FTWMap handle=0, unchanged=91; + int32_t cost=-1; + CHECK(ftw_abi_version()==2); + CHECK(ftw_map_create(0,4,&unchanged)==FTW_INVALID_ARGUMENT && unchanged==91); + CHECK(ftw_map_create(INT32_MAX,2,&handle)==FTW_INVALID_ARGUMENT); + CHECK(ftw_map_create(4,4,&handle)==FTW_OK && handle!=0); + CHECK(ftw_map_set_cost(handle,1,2,37,FTW_TERRAIN)==FTW_OK); + CHECK(ftw_map_get_cost(handle,1,2,FTW_TERRAIN,&cost)==FTW_OK && cost==37); + CHECK(ftw_map_get_cost(handle,1,2,9,&cost)==FTW_INVALID_ARGUMENT && cost==37); + CHECK(ftw_map_set_cost(handle,-1,0,4,FTW_MAP)==FTW_INVALID_ARGUMENT); + CHECK(ftw_map_set_cost(handle,4,0,4,FTW_MAP)==FTW_INVALID_ARGUMENT); + CHECK(ftw_map_get_cost(handle,0,0,FTW_MAP,0)==FTW_INVALID_ARGUMENT); + { + uint64_t count=99; + FTWCoord points[16], sentinel={-7,-8}; + CHECK(ftw_map_find_path(handle,(FTWCoord){0,0},(FTWCoord){3,3},0,&count)==FTW_OK && count==7); + CHECK(ftw_map_copy_path(handle,0,0,&count)==FTW_OK && count==7); + points[0]=sentinel; + CHECK(ftw_map_copy_path(handle,points,1,&count)==FTW_BUFFER_TOO_SMALL && count==7); + CHECK(points[0].x==-7 && points[0].y==-8); + CHECK(ftw_map_copy_path(handle,points,16,&count)==FTW_OK && count==7); + CHECK(points[0].x==0 && points[0].y==0 && points[6].x==3 && points[6].y==3); + for (uint64_t i=1;i0); + CHECK(ftw_map_get_cost(handle,0,0,FTW_MAP,&cost)==FTW_OK && cost==255); + CHECK(ftw_map_set_cost(handle,0,0,0,FTW_TERRAIN)==FTW_OK); + for (int y=0;y<4;++y) CHECK(ftw_map_set_cost(handle,2,y,255,FTW_TERRAIN)==FTW_OK); + CHECK(ftw_map_find_path(handle,(FTWCoord){0,0},(FTWCoord){3,3},0,&count)==FTW_OK && count==0); + CHECK(ftw_map_copy_path(handle,points,16,&count)==FTW_OK && count==0); + CHECK(ftw_map_set_cost(handle,2,2,0,FTW_TERRAIN)==FTW_OK); + CHECK(ftw_map_find_path(handle,(FTWCoord){0,0},(FTWCoord){3,3},0,&count)==FTW_OK && count>0); + CHECK(ftw_map_copy_path(handle,points,16,&count)==FTW_OK); + for (uint64_t i=0;i0); + char* encoded=(char*)malloc((size_t)length); + CHECK(encoded!=0); + encoded[0]='!'; + CHECK(ftw_map_export(handle,encoded,1,&length)==FTW_BUFFER_TOO_SMALL && encoded[0]=='!'); + CHECK(ftw_map_export(handle,encoded,length,&length)==FTW_OK); + FTWMap restored=0; + CHECK(ftw_map_create_serialized(encoded,length,&restored)==FTW_OK && restored!=handle); + CHECK(ftw_map_get_cost(restored,1,2,FTW_TERRAIN,&cost)==FTW_OK && cost==37); + CHECK(ftw_map_get_cost(restored,2,0,FTW_TERRAIN,&cost)==FTW_OK && cost==255); + CHECK(ftw_map_release(restored)==FTW_OK); + restored=77; + encoded[0]='!'; + CHECK(ftw_map_create_serialized(encoded,length,&restored)==FTW_INVALID_ARGUMENT && restored==77); + CHECK(ftw_map_create_serialized("bad",3,&restored)==FTW_INVALID_ARGUMENT && restored==77); + free(encoded); + cost=37; + } + CHECK(ftw_map_release(handle)==FTW_OK); + CHECK(ftw_map_release(handle)==FTW_OK); + CHECK(ftw_map_get_cost(handle,0,0,FTW_MAP,&cost)==FTW_INVALID_HANDLE && cost==37); + CHECK(ftw_map_create(2,2,&unchanged)==FTW_OK && unchanged!=handle); + CHECK(ftw_map_release(unchanged)==FTW_OK); + return 0; +} diff --git a/Extensions/iOS/FindTheWay/Core/tests/parity_test.cpp b/Extensions/iOS/FindTheWay/Core/tests/parity_test.cpp new file mode 100644 index 000000000..afbd09aed --- /dev/null +++ b/Extensions/iOS/FindTheWay/Core/tests/parity_test.cpp @@ -0,0 +1,116 @@ +// Direct oracle: the same C++ classes and call patterns as Windows Main.cpp. +#include "FindTheWayCore.h" +#include "FindTheWayFusion.h" +#include "AOE.h" +#include +#include +#include +#include +using namespace FindTheWay; +static void check(bool value,int line) {if(!value){std::cerr<<"Parity check failed at "<(p);} +static std::vector path(FTWMap h,const char* name) { + uint64_t count=0;CHECK(ftw_map_named_path(h,name,nullptr,0,&count)==FTW_OK); + std::vector result(count);CHECK(ftw_map_named_path(h,name,result.data(),count,&count)==FTW_OK);return result; +} +static void replace_in_callback(void* p,FTWMap old) { + FTWMap* replacement=static_cast(p); + CHECK(ftw_map_release(old)==FTW_OK); + CHECK(ftw_map_create(2,2,replacement)==FTW_OK); +} +int main() { + { + FTWMap old=0,replacement=0;uint64_t count=0; + CHECK(ftw_map_create(3,3,&old)==FTW_OK); + CHECK(ftw_map_set_cost(old,1,1,3,FTW_TERRAIN)==FTW_OK); + CHECK(ftw_map_set_callback(old,replace_in_callback,&replacement)==FTW_OK); + CHECK(ftw_map_find_ex(old,{0,0},{2,2},0,9,nullptr,&count)==FTW_OK && count==5); + CHECK(replacement && replacement!=old); + int value=-1;CHECK(ftw_map_get_cost(old,0,0,0,&value)==FTW_INVALID_HANDLE); + CHECK(ftw_map_release(replacement)==FTW_OK); + } + for(int iso=0;iso<2;++iso) { + FTWMap h=0;CHECK(ftw_map_create(9,8,&h)==FTW_OK); + FindTheWayFusion win(9,8);win.SetIsometric(iso);win.SetGridSize(iso?win.GetIsometricGridSize(64,32):32,10,20); + CHECK(ftw_map_set_grid(h,iso,iso?64:32,32,10,20)==FTW_OK); + for(int y=0;y<8;++y)for(int x=0;x<9;++x) { + int cost=(x==4 && y!=3)?255:((x*17+y*11)%5); + win.SetMap(x,y,cost,MapType::TERRAIN);CHECK(ftw_map_set_cost(h,x,y,cost,FTW_TERRAIN)==FTW_OK); + FTWCoord point;CHECK(ftw_map_convert_coord(h,{x,y},0,&point)==FTW_OK); + auto expected=win.GetRealCoord({x,y});CHECK(point.x==expected.x && point.y==expected.y); + } + CoordSet ally={{2,2},{3,2}},enemy={{5,3},{6,3}},zoc={{3,3},{5,2}}; + FTWCoord a[]={{2,2},{3,2}},e[]={{5,3},{6,3}},z[]={{3,3},{5,2}}; + FTWLists lists={a,e,z,2,2,2};CHECK(ftw_map_set_lists(h,&lists)==FTW_OK); + int updates=0;CHECK(ftw_map_set_callback(h,on_update,&updates)==FTW_OK); + const std::wstring savedName=L"路线"; + for(unsigned ignore=0;ignore<32;++ignore)for(unsigned flags=0;flags<8;++flags) { + Coord start{1,3},goal{7,3}; + if(flags&4)win.ForceFind(start,goal,flags&1,flags&2,&ally,&enemy,&zoc,ignore); + else win.Find(start,goal,flags&1,flags&2,&ally,&enemy,&zoc,ignore); + win.SaveLastPath(L"路线"); + uint64_t count=999; + CHECK(ftw_map_find_ex(h,{1,3},{7,3},flags,ignore,"路线",&count)==FTW_OK); + CHECK(count==(win.GetPathValidity()?win.GetDistance():0)); + auto result=path(h,nullptr); + for(size_t i=0;i result(count); + CHECK(ftw_map_copy_area(h,result.data(),count,&count)==FTW_OK); + size_t index=0; + for(size_t i=0;i filtered; + for(auto p:expected) { + if(win.GetMap(p.x,p.y,MapType::MAP)==255)continue; + if(!std::get<3>(flags) && std::find(ally.begin(),ally.end(),p)!=ally.end())continue; + if(!std::get<4>(flags) && std::find(enemy.begin(),enemy.end(),p)!=enemy.end())continue; + filtered.push_back(p); + } + uint64_t count=0;CHECK(ftw_map_aoe(h,{3,3},dir,type,ignore,nullptr,0,&count)==FTW_OK); + std::vector result(count);CHECK(ftw_map_aoe(h,{3,3},dir,type,ignore,result.data(),count,&count)==FTW_OK); + CHECK(result.size()==filtered.size()); + for(size_t i=0;i(c.x),static_cast(c.y),static_cast(layer))); + } + uint64_t count=0;CHECK(ftw_map_display(h,0,1,nullptr,nullptr,0,&count)==FTW_OK); + std::string text(count,' ');CHECK(ftw_map_display(h,0,1,nullptr,text.data(),count,&count)==FTW_OK); + CHECK(text==std::wstring_convert>{}.to_bytes(win.OutPutMapStr())); + CHECK(ftw_map_release(h)==FTW_OK); + } + for(FTWCoord start: {FTWCoord{0,0},FTWCoord{4,4},FTWCoord{-1,-1}}) { + CoordSet expected;FindTheWayClass::GenerateZoc({start.x,start.y},&expected,false); + uint64_t count=0;CHECK(ftw_generate_zoc(start,nullptr,0,&count)==FTW_OK); + std::vector result(count);CHECK(ftw_generate_zoc(start,result.data(),count,&count)==FTW_OK); + CHECK(result.size()==expected.size());for(size_t i=0;i + + true + python + $(MSBuildThisFileDirectory)Artifacts\Current + + + + + + + diff --git a/Extensions/iOS/FindTheWay/README.md b/Extensions/iOS/FindTheWay/README.md new file mode 100644 index 000000000..4a40d6f31 --- /dev/null +++ b/Extensions/iOS/FindTheWay/README.md @@ -0,0 +1,162 @@ +# FindTheWay iOS + +## Native artifacts and Windows publishing + +The Runtime implements the Windows C++ condition/action/expression set, except +condition 27, which accepts a Windows-only `cSurface*`. On iOS use picture import +(condition 12) or an Active's fixed value/frame (condition 26). This is source +coverage, not a claim that Fusion export or device tests have already passed. + +`Artifacts/Current` contains the author-built **ABI 2** core, built with Xcode +27.2 (27B52) for iOS 17.0 device/simulator arm64. Source fingerprints and archive +hashes match this revision; Windows can package these artifacts directly. +ABI 2 adds unit/ZOC-aware searches, areas, line ranges, AOE, map display, caching +and map-update callbacks. No shared algorithm header has been changed; the iOS +C boundary calls the same C++ classes as Windows. + +Rebuild only after native sources, ABI or producer configuration change. +Requires full Xcode selected with xcode-select, Python 3.10+, CMake 3.22+, and +optionally Ninja. Both iOS device and simulator use arm64; no Intel/Rosetta slice. + +```sh +set -o pipefail +python3 Extensions/iOS/FindTheWay/build.py --minimum-ios 17.0 \ + 2>&1 | tee /tmp/findtheway-ios-build.log +``` + +Commit/transfer `Extensions/iOS/FindTheWay/Artifacts/Current` to Windows. Build +FindTheWay **Run_Only Unicode / Win32** in Visual Studio once. Python 3.10+ is +required there. RunOnly verifies the transferred core, creates `FindTheWay.ext`, +installs it into Fusion and includes it in the combined ToInstall release archive. +No Wine, GUI automation or Mac-generated .ext is required. + +For a non-default Fusion installation, set the `FusionRoot` environment variable +before starting Visual Studio, or pass `/p:FusionRoot=...` to MSBuild. The default +matches the existing Steam publisher; missing iPhone runtime directories fail +explicitly. Standalone packaging/install is also available: + +```bat +python Extensions\_Script\FindTheWayIOS.py --artifacts Extensions\iOS\FindTheWay\Artifacts\Current --install +``` + +## Configure the Fusion export on Mac + +After each Fusion iOS export, close Xcode and run the included Python +configurator in the exported folder before reopening the project: + +```sh +python3 configure_findtheway_export.py . +``` + +For an existing export, use the repository copy instead: + +```sh +python3 Extensions/iOS/FindTheWay/configure_export.py /path/to/FindTheWay.xcodeproj +``` + +The configurator detects the App/linked static targets and their actual IDs, +fixes stale shared Scheme references after project renaming, sets arm64 for all +configurations, removes architecture exclusions, and explicitly links the right +FTW archive for each SDK. Static libraries such as Box2D use required linkage and +an explicit target dependency. Existing flags, search paths and device signing +are preserved; simulator signing is disabled. The minimum OS is the highest of +existing explicit values and the requested floor (17.0 by default). Use +`--minimum-ios` when the core was built for a higher minimum. Both exported FTW +archives must exist before any project edits are written. + +To preview changes from the repository root: + +```sh +python3 Extensions/iOS/FindTheWay/configure_export.py /path/to/FindTheWay.xcodeproj --dry-run +``` + +The path may also be the exported folder containing one .xcodeproj. For projects +with multiple App targets, specify `--target` with the actual App target name. +Repeated runs do not duplicate settings/dependencies. +This does not remove GDPR/advertising extensions or install their SDKs. Close +Xcode while running it, reopen, select the App scheme and an iPhone simulator, +clean the build folder and build/run. No native core rebuild is needed. +The .ext contains the configurator, owned Runtime sources/helpers, C header, both platform +archives, XCFramework and generated PBX source references. Mach-O autolink selects +the platform archive plus libc++/iconv, and the configurator adds explicit +SDK-conditional linker flags. Library lookup uses the supplied exporter's +`LIBRARY_SEARCH_PATHS = $(SRCROOT)`. The Runtime requires C++11, while shared C++20 +is precompiled. Adapter-only edits do not require a native rebuild; native source, +ABI or producer configuration edits do. + +## Windows behavior and iOS resources + +Portable behavior follows `Extensions/FindTheWay/Main.cpp`, `Func.h` and the +shared C++ algorithms: named/last paths, ignore flags, force/diagonal searches, +unit/ZOC lists, area rings and move/attack boundaries, line range, AOE filtering, +caching, serialization and map display. Runtime integration includes qualifiers, +selection/negation, object creation by parameter/name, collision/map/area/ZOC +iteration, map-update events and grid backdrops. Immediate events preserve the +outer selection and action state; object snapshots use slot plus creation ID. +Selection and creation use the independent `FusionIOS::ObjectSelection` and +`FusionIOS::ObjectCreation` classes in `../Helpers`. Their three inline headers +are general Runtime utilities, with no FindTheWay core dependency. + +Grid backdrops preserve Windows surface origins: cell center minus the source +Active's hotspot, plus the configured border offset. The iOS adapter converts +each surface origin to the selected frame's hotspot anchor and stores the same +hotspot in the backdrop's visibility bounds. This avoids subtracting a hotspot +twice and keeps border frames with different hotspots aligned. + +Picture imports call Fusion's `loadResourceData:`. The supplied SDK normalizes +Windows editor/export paths and backslashes, searches the sandbox and bundle, +opens embedded data elements, and handles security-scoped/file URLs. No writable +path is synthesized and no directory is created to read an image. iOS filenames +retain their actual case. File formats are those decoded by UIImage. + +Images are read from CPU pixels, including when the Runtime must reload purged +image data. Sampling follows Windows: dimensions use integer division by grid +size, cells sample at grid centers plus offsets, red is terrain cost, green is +dynamic cost. Picture sampling is orthogonal before applying isometric geometry. +The reader handles RGBA8888/JPEG, RGB888, RGBA4444, RGBA5551 and RGB565 with their +row pitch and premultiplication. Display-color getters do not scale costs by +alpha. Use opaque, lossless 32-bit map images for exact 8-bit costs; color already +lost to export quantization or fully transparent premultiplication cannot be +recovered. Signed offsets are normalized in the iOS C boundary to avoid Windows +LLP64 versus arm64 LP64 arithmetic differences. + +The independently implemented .ext codec uses observed SDK framing and standard +ZIP encryption, verifies decryption/CRC and writes six PBX insertion blocks. +Official maker and guide remain in `../Tools`; architectural references live in +the English iOS skill. The generic CLI packages an owned Runtime pair: + +```bat +python Extensions\iOS\Tools\make_ext.py --name Probe --project-zip RuntimeIPhone.zip --output Probe.ext +``` + +## Validation + +```sh +cmake -S Extensions/iOS/FindTheWay -B /tmp/ftw-host -DCMAKE_BUILD_TYPE=Debug +cmake --build /tmp/ftw-host +ctest --test-dir /tmp/ftw-host --output-on-failure +python3 -m unittest discover -s Extensions/iOS/tests -p 'test_*.py' +python3 Extensions/iOS/tests/run_runtime_fixture.py --core-library /tmp/ftw-host/core/libFindTheWayCore.a +``` + +The direct C++ oracle compares paths, 32 ignore flag combinations, area layers, +line ranges, ZOC, AOE, stash behavior and display output. Runtime fixture checks +use the actual adapter/core and Foundation (or GNUstep on Linux), with owned +models for SDK APIs. They cover selection, qualifiers, creation, callbacks, +image formats/pitch/alpha, resource-loader delegation and nested iteration. +Grid checks compare rendered origins and visibility bounds against Windows +positions with different per-frame hotspots, zero hotspots and obstacle/boundary +border offsets. +These models do not replace actual Fusion or iOS execution. + +On Apple Silicon, check all Runtime sources against a real exported project's +private SDK declarations before the final Xcode build: + +```sh +python3 Extensions/iOS/Helpers/check_helpers.py --runtime-project /path/to/Proj \ + --runtime-source Extensions/iOS/FindTheWay/Runtime \ + --include Extensions/iOS/FindTheWay/Core/include +``` + +Final Fusion export, Xcode linking and simulator/device behavior remain external +validation steps. Keep the PR draft until those checks pass. diff --git a/Extensions/iOS/FindTheWay/Runtime/CRunFindTheWay.h b/Extensions/iOS/FindTheWay/Runtime/CRunFindTheWay.h new file mode 100644 index 000000000..31532bfe0 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Runtime/CRunFindTheWay.h @@ -0,0 +1,42 @@ +#import "CRunExtension.h" +#include "FindTheWayCore.h" +@class CFile, CCreateObjectInfo, CCndExtension, CActExtension, CValue; +@interface CRunFindTheWay : CRunExtension { + FTWMap map; + BOOL isometric, alive; + int width, height, gridWidth, gridHeight, offsetX, offsetY; + NSData* lastPath; + NSString* iterationName; + FTWCoord iterationCoord; + int iterationIndex, iterationKind; + unsigned warnedConditions, warnedActions, warnedExpressions; + NSMutableData *allies, *enemies, *zones, *units; + NSArray* area; + uint64_t areaPosition, attackStart, areaGeneration; + BOOL isAttack; + id sourceObject; + +} +-(int)getNumberOfConditions; +-(BOOL)createRunObject:(CFile*)file withCOB:(CCreateObjectInfo*)cob andVersion:(int)version; +-(int)handleRunObject; +-(void)destroyRunObject:(BOOL)bFast; +-(BOOL)condition:(int)num withCndExtension:(CCndExtension*)cnd; +-(void)action:(int)num withActExtension:(CActExtension*)act; +-(CValue*)expression:(int)num; +-(void)mapUpdated:(FTWMap)updated; +-(BOOL)configureGrid; +-(void)clearMap; +-(void)syncLists; +-(void)iterate:(NSData*)data real:(BOOL)real name:(NSString*)name kind:(int)kind; +@end +@interface CRunFindTheWay (Objects) +-(BOOL)objectCondition:(int)num withCndExtension:(CCndExtension*)cnd; +-(void)objectAction:(int)num withActExtension:(CActExtension*)act; +-(NSData*)objectZone:(id)object; +-(void)createPoints:(NSData*)points withActExtension:(CActExtension*)act parameter:(int)param byName:(BOOL)byName; +@end +@interface CRunFindTheWay (Platform) +-(BOOL)platformCondition:(int)num withCndExtension:(CCndExtension*)cnd; +-(void)createGridWithAct:(CActExtension*)act; +@end diff --git a/Extensions/iOS/FindTheWay/Runtime/CRunFindTheWay.m b/Extensions/iOS/FindTheWay/Runtime/CRunFindTheWay.m new file mode 100644 index 000000000..eae8bd870 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Runtime/CRunFindTheWay.m @@ -0,0 +1,356 @@ +#import "CRunFindTheWay.h" +#import "CRun.h" +#import "CExtension.h" +#import "CActExtension.h" +#import "CCndExtension.h" +#import "CFile.h" +#import "CValue.h" +#if defined(__APPLE__) +#import +#endif +#include + +// The supplied exporter searches SRCROOT for libraries. Mach-O autolink selects +// the correct platform archive without changing global Xcode language settings. +#if defined(__APPLE__) && TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR +__asm__(".linker_option \"-lFindTheWayCore_iphonesimulator\""); +#else +__asm__(".linker_option \"-lFindTheWayCore_iphoneos\""); +#endif +__asm__(".linker_option \"-lc++\""); +__asm__(".linker_option \"-liconv\""); +#endif + +#ifdef __cplusplus +extern "C" +#endif +void ftw_ios_generate_event(CRun*, CExtension*, int); +static void updated(void* context,FTWMap map) { [(CRunFindTheWay*)context mapUpdated:map]; } +@implementation CRunFindTheWay +-(int)getNumberOfConditions { return 29; } +-(BOOL)createRunObject:(CFile*)file withCOB:(CCreateObjectInfo*)cob andVersion:(int)version { + if (ftw_abi_version()!=2) return NO; + isometric=[file readAByte]!=0; + gridWidth=gridHeight=1; + allies=[[NSMutableData alloc] init]; enemies=[[NSMutableData alloc] init]; + zones=[[NSMutableData alloc] init]; units=[[NSMutableData alloc] init]; + attackStart=65536; + alive=YES; + iterationKind=-1; + return YES; +} +-(void)clearMap { + ftw_map_set_callback(map,NULL,NULL); + ftw_map_release(map); map=0; + [lastPath release]; lastPath=nil; + width=height=0; + [area release]; area=nil; areaPosition=0; ++areaGeneration; +} +-(void)destroyRunObject:(BOOL)fast { + alive=NO; + [self clearMap]; + [allies release]; allies=nil; [enemies release]; enemies=nil; + [zones release]; zones=nil; [units release]; units=nil; + [iterationName release]; iterationName=nil; +} +-(int)handleRunObject { return 0; } +-(void)mapUpdated:(FTWMap)changed { + if(alive && changed==map) { + [area release];area=nil;++areaGeneration; + [self retain]; + @try { ftw_ios_generate_event(rh,ho,17); } + @finally { [self release]; } + } +} +-(BOOL)configureGrid { + ftw_map_set_callback(map,updated,self); + return map && ftw_map_set_grid(map,isometric,gridWidth,gridHeight,offsetX,offsetY)==FTW_OK; +} +-(void)syncLists { + FTWLists lists={(const FTWCoord*)[allies bytes],(const FTWCoord*)[enemies bytes],(const FTWCoord*)[zones bytes], + [allies length]/sizeof(FTWCoord),[enemies length]/sizeof(FTWCoord),[zones length]/sizeof(FTWCoord)}; + ftw_map_set_lists(map,&lists); +} +-(NSData*)pathNamed:(NSString*)name { + uint64_t count=0; + if(ftw_map_named_path(map,[name UTF8String],NULL,0,&count)!=FTW_OK || count>SIZE_MAX/sizeof(FTWCoord)) return nil; + NSMutableData* data=[NSMutableData dataWithLength:(NSUInteger)count*sizeof(FTWCoord)]; + return ftw_map_named_path(map,[name UTF8String],(FTWCoord*)[data mutableBytes],count,&count)==FTW_OK?data:nil; +} +-(BOOL)findPath:(int*)values save:(NSString*)name { + [lastPath release]; lastPath=nil; + if (!map) return NO; + FTWCoord start={values[0],values[1]}, goal={values[2],values[3]}; + if (values[8] && (ftw_map_convert_coord(map,start,1,&start)!=FTW_OK || + ftw_map_convert_coord(map,goal,1,&goal)!=FTW_OK)) return NO; + unsigned flags=(values[5]?FTW_FIND_DIAGONAL:0) | (values[6]?FTW_FIND_CHECK_CORNERS:0) | + (values[7]?FTW_FIND_FORCE:0); + uint64_t count=0; + [self syncLists]; + FTWMap original=map; + if (ftw_map_find_ex(original,start,goal,flags,(unsigned)values[4],[name UTF8String],&count)!=FTW_OK || !alive || map!=original || !count || count>SIZE_MAX/sizeof(FTWCoord)) return NO; + FTWCoord* points=(FTWCoord*)malloc((size_t)count*sizeof(FTWCoord)); + if (!points) return NO; + if (ftw_map_copy_path(map,points,count,&count)==FTW_OK) + lastPath=[[NSData alloc] initWithBytes:points length:(NSUInteger)count*sizeof(FTWCoord)]; + free(points); + + return lastPath!=nil; +} +-(void)iterate:(NSData*)data real:(BOOL)real name:(NSString*)name kind:(int)kind { + if (!data || !alive) return; + if (real) { + NSMutableData* converted=[NSMutableData dataWithData:data]; + FTWCoord* points=(FTWCoord*)[converted mutableBytes]; + for (NSUInteger i=0;i<[data length]/sizeof(FTWCoord);++i) + if (ftw_map_convert_coord(map,points[i],0,&points[i])!=FTW_OK) return; + data=converted; + } + [self retain]; [data retain]; + NSString* oldName=[iterationName retain]; + FTWCoord oldCoord=iterationCoord; + int oldIndex=iterationIndex, oldKind=iterationKind; + [iterationName release]; iterationName=[name copy]; iterationKind=kind; + @try { + const FTWCoord* points=(const FTWCoord*)[data bytes]; + NSUInteger count=[data length]/sizeof(FTWCoord); + for (NSUInteger i=0; i=0 && num<32 && !(*bits & (1u<0; + if (num==3 || num==6 || num==28) return iterationKind==num && [iterationName isEqualToString:[cnd getParamExpString:rh withNum:0]]; + if (num==7) return map!=0; + if (num==8) { + FTWCoord point={[cnd getParamExpression:rh withNum:0],[cnd getParamExpression:rh withNum:1]}; + int expected=[cnd getParamExpression:rh withNum:2], layer=[cnd getParamExpression:rh withNum:3], cost=255; + if ([cnd getParamExpression:rh withNum:4] && ftw_map_convert_coord(map,point,1,&point)!=FTW_OK) return NO; + return ftw_map_sample_cost(map,point.x,point.y,layer,&cost)==FTW_OK && + ((expected==-1 && cost!=255) || (expected==65536 && cost==255) || cost==expected); + } + if (num==2 || num==12 || num==26 || num==27) return [self platformCondition:num withCndExtension:cnd]; + if (num==18 || num==19 || num==20 || num==21 || num==22 || num==23 || (num>=9 && num<=11) || num==24 || num==25) + return [self objectCondition:num withCndExtension:cnd]; + if (num==13) { + int v[10]; for(int i=0;i<10;++i) v[i]=[cnd getParamExpression:rh withNum:i]; + if(!map) return NO; + FTWCoord start={v[2],v[3]}; + if(v[4] && ftw_map_convert_coord(map,start,1,&start)!=FTW_OK) return NO; + FTWAreaOptions options={start,v[0],v[1],v[5],v[6],v[7],v[8],v[9]}; + uint64_t rings=0,attack=65536,count=0; + [self syncLists];FTWMap original=map; + if(ftw_map_area(original,&options,&rings,&attack)!=FTW_OK || !alive || map!=original || ftw_map_copy_area(map,NULL,0,&count)!=FTW_OK + || count>SIZE_MAX/sizeof(FTWAreaPoint)) return NO; + NSMutableData* points=[NSMutableData dataWithLength:count*sizeof(FTWAreaPoint)]; + if(ftw_map_copy_area(map,(FTWAreaPoint*)[points mutableBytes],count,&count)!=FTW_OK) return NO; + NSMutableArray* result=[NSMutableArray arrayWithCapacity:rings]; + for(uint64_t i=0;i>16)?(int)(grid>>16):1):gridWidth; + [self configureGrid]; return; + } + if (num==2) { + NSString* pathName=[[[act getParamExpString:rh withNum:0] copy] autorelease]; + BOOL real=[act getParamExpression:rh withNum:1]!=0; + NSString* name=[act getParamExpString:rh withNum:2]; + [self iterate:[self pathNamed:pathName] real:real name:name kind:6]; return; + } + if (num==20) { + BOOL real=[act getParamExpression:rh withNum:0]!=0; + NSString* name=[act getParamExpString:rh withNum:1]; + if (!map) return; + NSMutableData* snapshot=[NSMutableData dataWithLength:(NSUInteger)width*(NSUInteger)height*sizeof(FTWCoord)]; + FTWCoord* points=(FTWCoord*)[snapshot mutableBytes]; + for(int y=0;y=12 && num<=18)) { + [self objectAction:num withActExtension:act]; return; + } + if(num==6) { [zones setLength:0]; return; } + if(num==9) { + int target=[act getParamExpression:rh withNum:0]; + if(target==-1 || target==0) [allies setLength:0]; + if(target==-1 || target==1) [enemies setLength:0]; + if(target==-1 || target==255) [units setLength:0]; + return; + } + if(num==11) { ftw_map_stash(map,[act getParamExpression:rh withNum:0]); return; } + if(num==7) { + NSString* name=[[[act getParamExpString:rh withNum:0] copy] autorelease]; + BOOL once=[act getParamExpression:rh withNum:1]!=0; + if(!map) return; + NSArray* snapshot=[[area copy] autorelease]; uint64_t generation=areaGeneration; + uint64_t first=once?areaPosition:0, end=once?first+1:[snapshot count]; + [self retain]; + @try { + for(uint64_t i=first;i=attackStart; + [self iterate:[snapshot objectAtIndex:i] real:NO name:name kind:14]; + if(generation==areaGeneration) ++areaPosition; + } + } @finally { [self release]; } + return; + } + [self warn:num category:@"action" bits:&warnedActions]; +} +-(CValue*)expression:(int)num { + [self retain]; + @try {return [self evaluateExpression:num];} + @finally {[self release];} +} +-(CValue*)evaluateExpression:(int)num { + static const int counts[20]={0,0,10,1,3,3,3,0,4,0,3,7,5,0,0,0,0,0,1,2}; + int values[10]={0}; NSString* name=nil; + if (num>=0 && num<20) for(int i=0;i=0 && (type==0 || type==1) && (NSUInteger)step<[data length]/sizeof(FTWCoord)) { + FTWCoord point=((const FTWCoord*)[data bytes])[step]; result=type==0?point.x:point.y; + } break; + } + case 5: case 6: { + FTWCoord point={values[0],values[1]}; result=num==5?65536:INT32_MAX; + if ((values[2]==0 || values[2]==1) && ftw_map_convert_coord(map,point,num==5,&point)==FTW_OK) + result=values[2]==0?point.x:point.y; + break; + } + case 7: result=iterationIndex; break; + case 8: { + FTWCoord point={values[0],values[1]}; result=255; + if (!values[2] || ftw_map_convert_coord(map,point,1,&point)==FTW_OK) + ftw_map_sample_cost(map,point.x,point.y,values[3],&result); + break; + } + case 9: { + uint64_t count=0; + if (ftw_map_export(map,NULL,0,&count)!=FTW_OK || count>SIZE_MAX) return [rh getTempString:@"InvalidMap"]; + NSMutableData* data=[NSMutableData dataWithLength:(NSUInteger)count]; + if (ftw_map_export(map,(char*)[data mutableBytes],count,&count)!=FTW_OK) return [rh getTempString:@"InvalidMap"]; + NSString* text=[[[NSString alloc] initWithBytes:[data bytes] length:(NSUInteger)count encoding:NSASCIIStringEncoding] autorelease]; + return [rh getTempString:text]; + } + case 10: { + if(!map) return [rh getTempString:@"InvalidMap"]; + uint64_t count=0; + if(ftw_map_display(map,values[0],values[1],[name UTF8String],NULL,0,&count)!=FTW_OK || count>SIZE_MAX) return [rh getTempString:@""]; + NSMutableData* data=[NSMutableData dataWithLength:count]; + if(ftw_map_display(map,values[0],values[1],[name UTF8String],(char*)[data mutableBytes],count,&count)!=FTW_OK) return [rh getTempString:@""]; + return [rh getTempString:[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]]; + } + case 11: { + FTWCoord start={values[0],values[1]}; + [self syncLists]; + if(!values[2] || ftw_map_convert_coord(map,start,1,&start)==FTW_OK) + ftw_map_line_range(map,start,values[3],values[4],(unsigned)values[5],values[6],&result); + break; + } + case 12: result=(values[0]?16:0)|(values[1]?8:0)|(values[2]?4:0)|(values[3]?2:0)|(values[4]?1:0); break; + case 13: result=FTW_MAP; break; + case 14: result=FTW_TERRAIN; break; + case 15: result=FTW_DYNAMIC; break; + case 16: result=0; break; + case 17: result=255; break; + case 18: result=values[0]<0?255:(values[0]>255?255:values[0]); break; + case 19: { + unsigned w=(unsigned)values[0]&65535, h=(unsigned)values[1]&65535; + result=(int)((w?w:1)|((h?h:1)<<16)); break; + } + default: [self warn:num category:@"expression" bits:&warnedExpressions]; break; + } + return [rh getTempValue:result]; +} +@end diff --git a/Extensions/iOS/FindTheWay/Runtime/FTWObjectAdapter.mm b/Extensions/iOS/FindTheWay/Runtime/FTWObjectAdapter.mm new file mode 100644 index 000000000..9736f6a84 --- /dev/null +++ b/Extensions/iOS/FindTheWay/Runtime/FTWObjectAdapter.mm @@ -0,0 +1,227 @@ +// Owned Runtime adapter. Windows ACE behavior with iOS Runtime representations. +#import "CRunFindTheWay.h" +#include "../../Helpers/ObjectSelection.h" +#include "../../Helpers/ObjectCreation.h" +#import "CRun.h" +#import "CObject.h" +#import "CExtension.h" +#import "CCndExtension.h" +#import "CActExtension.h" +#import "CEventProgram.h" +#import "CEvents.h" +#include +#include + +namespace { +short oil(CCndExtension* cnd, CRun* run, int index) { + return FusionIOS::ObjectBase::GetOil(cnd,run,index); +} +bool negated(CCndExtension* cnd) { + return FusionIOS::ObjectSelection::IsNegated(cnd); +} +bool grid(FTWMap map,CObject* object,FTWCoord& point) { + return object && ftw_map_convert_coord(map,{object->hoX,object->hoY},1,&point)==FTW_OK; +} +bool equal(FTWCoord a,FTWCoord b) { return a.x==b.x && a.y==b.y; } +bool contains(NSData* data,FTWCoord point) { + const FTWCoord* values=(const FTWCoord*)[data bytes]; + for(NSUInteger i=0;i<[data length]/sizeof(FTWCoord);++i) if(equal(values[i],point)) return true; + return false; +} +FusionIOS::ObjectRef ref(CObject* o) { return {o->hoNumber,o->hoCreationId}; } +} + +@implementation CRunFindTheWay (Objects) +-(BOOL)objectCondition:(int)num withCndExtension:(CCndExtension*)cnd { + FusionIOS::ObjectSelection selection(rh); + short type=oil(cnd,rh,0); bool negate=negated(cnd); + if(num==21) {selection.SelectAll(type);return YES;} + if(num==18) { + (void)oil(cnd,rh,1); + NSString* name=[cnd getParamExpString:rh withNum:2]; + return map && iterationKind==18 && [iterationName isEqualToString:name] + && selection.FilterObjects(type,negate,[&](CObject* o){return o==sourceObject;}); + } + int x=0,y=0,layer=0,mode=0; short other=-1; + if(num==9 || num==11 || num==24 || num==25) { + x=[cnd getParamExpression:rh withNum:1];y=[cnd getParamExpression:rh withNum:2]; + } + if(num==10) layer=[cnd getParamExpression:rh withNum:1]; + if(num==20) mode=[cnd getParamExpression:rh withNum:1]; + if(num==22) other=oil(cnd,rh,1); + if(!map) return NO; + if(num==24 || num==25) { + bool found=false; + selection.ForEach(type,[&](CObject* object) { + FTWCoord point={object->hoX,object->hoY}; + if(num==25 || grid(map,object,point)) found=found || equal(point,{x,y}); + }); + // Desktop no-object predicates do not change the SOL; Fusion negates the result. + return !found; + } + if(num==19) { + selection.SelectAll(type); std::vector retained; + selection.ForEach(type,[&](CObject* object) { + FTWCoord point;int cost=255; + if(grid(map,object,point)) ftw_map_sample_cost(map,point.x,point.y,FTW_TERRAIN,&cost); + if(cost!=255 && !contains(units,point)) retained.push_back(ref(object)); + }); + // Desktop vector overload leaves the SelectAll scope intact on no matches. + if(!retained.empty()) selection.Replace(type,retained); + return !retained.empty(); + } + if(num==23) { + std::vector seen; std::vector retained; + selection.ForEach(type,[&](CObject* object) { + FTWCoord point;if(!grid(map,object,point)) return; + bool duplicate=std::find_if(seen.begin(),seen.end(),[&](FTWCoord p){return equal(p,point);})!=seen.end(); + if(duplicate==negate) retained.push_back(ref(object)); + if(!duplicate) seen.push_back(point); + }); + if(!retained.empty()) selection.Replace(type,retained); + return !retained.empty(); + } + // Cost reads can dispatch OnMapUpdate. Finish them before the SOL predicate, + // which must remain pure even when a nested event removes/replaces objects. + struct Cost { FusionIOS::ObjectRef object; int cost; }; + std::vector costs; + if(num==10) { + const auto refs=selection.Snapshot(type,FusionIOS::ForEachFlag_Default,true); + FTWMap original=map; + for(auto r:refs) { + CObject* object=rh->rhObjectList[r.slot]; + if(!object || object->hoCreationId!=r.generation || object->hoX<0 || object->hoY<0) continue; + FTWCoord point;int cost=255; + if(grid(original,object,point)) ftw_map_sample_cost(original,point.x,point.y,layer,&cost); + if(!alive || map!=original) return NO; + costs.push_back({r,cost}); + } + } + struct Position { CObject* object; FTWCoord point; }; + std::vector others; + if(num==22) selection.ForEach(other,[&](CObject* object) { + FTWCoord point;if(grid(map,object,point)) others.push_back({object,point}); + }); + return selection.FilterObjects(type,negate,[&](CObject* object) { + if(num==11) return object->hoX==x && object->hoY==y; + if((num==9 || num==10) && (object->hoX<0 || object->hoY<0)) return false; + FTWCoord point;if(!grid(map,object,point)) return false; + if(num==9) return equal(point,{x,y}); + if(num==10) { + const auto current=ref(object); + for(auto cost:costs) if(cost.object.slot==current.slot && cost.object.generation==current.generation) return cost.cost==255; + return false; + } + if(num==20) { + for(NSUInteger i=0;i<[area count];++i) + if(contains([area objectAtIndex:i],point)) return mode==-1 || ((mode==1)==(i>=attackStart)); + return false; + } + if(num==22) for(auto p:others) if(object!=p.object && equal(point,p.point)) return true; + return false; + }); +} +-(NSData*)objectZone:(id)object { + FTWCoord start; if(!map || !grid(map,(CObject*)object,start)) return nil; + uint64_t count=0; if(ftw_generate_zoc(start,NULL,0,&count)!=FTW_OK) return nil; + NSMutableData* data=[NSMutableData dataWithLength:count*sizeof(FTWCoord)]; + return ftw_generate_zoc(start,(FTWCoord*)[data mutableBytes],count,&count)==FTW_OK?data:nil; +} +-(void)createPoints:(NSData*)points withActExtension:(CActExtension*)act parameter:(int)param byName:(BOOL)byName { + if(!map || !points) return; + // Freeze real coordinates before creation can initialize other extensions. + NSMutableData* converted=[NSMutableData dataWithData:points]; + FTWCoord* values=(FTWCoord*)[converted mutableBytes]; + for(NSUInteger i=0;i<[converted length]/sizeof(FTWCoord);++i) + if(ftw_map_convert_coord(map,values[i],0,&values[i])!=FTW_OK) return; + FusionIOS::ObjectCreation creation(rh); + short oi=byName?creation.GetCreationOI([act getParamExpString:rh withNum:param]):-1; + CreateDuplicateParam original={}; + if(!byName) original=*(LPCDP)&act->pParams[param]->evp.evpW.evpW0; + [self retain]; + @try { + for(NSUInteger i=0;i<[converted length]/sizeof(FTWCoord) && alive;++i) { + FusionIOS::ObjectCreation::CreateParams p; + if(byName) {p.oi=oi;p.x=(short)values[i].x;p.y=(short)values[i].y;p.layer=0;} + else { + CreateDuplicateParam local=original; + local.cdpPos.posX=(short)values[i].x;local.cdpPos.posY=(short)values[i].y; + BOOL repeat=NO; + if(!creation.ResolvePosition(local,p,repeat)) continue; + if(repeat) {act->pEvent->evtFlags|=ACTFLAGS_REPEAT;rh->rhEvtProg->rh2ActionLoop=YES;} + else act->pEvent->evtFlags&=~ACTFLAGS_REPEAT; + } + creation.Create(p); + } + } @finally { [self release]; } +} +-(void)objectAction:(int)num withActExtension:(CActExtension*)act { + if(num==18) { [self createGridWithAct:act]; return; } + CObject* object=nil; + if(num==3 || num==5 || num==8 || num==10 || num==13) object=[act getParamObject:rh withNum:0]; + if(num==16 || num==17) object=[act getParamObject:rh withNum:1]; + if(num==3) { + int cost=(unsigned char)[act getParamExpression:rh withNum:1], layer=[act getParamExpression:rh withNum:2]; + FTWCoord point; + if(layer!=FTW_MAP && grid(map,object,point)) ftw_map_set_cost(map,point.x,point.y,cost,layer); + return; + } + if(num==5) { + BOOL center=[act getParamExpression:rh withNum:1]!=0; + FTWCoord point;if(!grid(map,object,point)) return; + NSData* points=center?[self objectZone:object]:[NSData dataWithBytes:&point length:sizeof(point)]; + const FTWCoord* p=(const FTWCoord*)[points bytes]; + for(NSUInteger i=0;i<[points length]/sizeof(FTWCoord);++i) if(!contains(zones,p[i])) [zones appendBytes:&p[i] length:sizeof(FTWCoord)]; + return; + } + if(num==8) { + int type=[act getParamExpression:rh withNum:1]; FTWCoord point; + if(!grid(map,object,point)) return; + NSMutableData* list=type==0?allies:(type==1?enemies:(type==255?units:nil)); + [list appendBytes:&point length:sizeof(point)];return; + } + if(num==12) { + short type=act->pParams[0]->evp.evpW.evpW0; + NSString* name=[[[act getParamExpString:rh withNum:1] copy] autorelease]; + if(!map) return; + FusionIOS::ObjectSelection selection(rh); + [self retain]; + @try { + selection.ForEach(type,[&](CObject* source) { + if(!alive) return; + id previous=[sourceObject retain];sourceObject=source; + [source retain]; + @try { [self iterate:[self objectZone:source] real:YES name:name kind:18]; } + @finally { sourceObject=previous;[previous autorelease];[source release]; } + }); + } @finally { [self release]; } + return; + } + if(num==10 || num==13) { [self createPoints:[self objectZone:object] withActExtension:act parameter:1 byName:num==13];return; } + if(num==14 || num==15) { + if(map && areaPosition<[area count]) { + uint64_t generation=areaGeneration; + isAttack=!(areaPosition+1 +#include +#include +#include +#include + +namespace { +// Read logical CPU colors, not rendered/premultiplied display colors. CImage's +// getPixel() is used only to reload CPU data if the Runtime discarded it. +bool readCostPixel(CImage* image,int x,int y,int& terrain,int& dynamic) { + if(x<0 || y<0 || x>=image->width || y>=image->height || !image->data) return false; + unsigned bytes=image->bytesPrPixel; + if(bytes<2 || bytes>4) return false; + uint64_t pitch=image->bLineWidth>0?(uint64_t)image->bLineWidth:(uint64_t)image->width*bytes; + uint64_t offset=(uint64_t)y*pitch+(uint64_t)x*bytes; + if(image->dataLength && (offset>image->dataLength || bytes>image->dataLength-offset)) return false; + const unsigned char* p=(const unsigned char*)image->data+offset; + unsigned r=0,g=0,a=255;uint16_t packed=0; + if(bytes==2) std::memcpy(&packed,p,sizeof(packed)); + switch(image->format) { + case RGBA8888: case JPEG: + if(bytes!=4) return false;r=p[0];g=p[1];a=p[3];break; + case RGB888: + r=p[0];g=p[1];break; + case RGBA4444: + r=((packed>>12)&15)*17;g=((packed>>8)&15)*17;a=(packed&15)*17;break; + case RGBA5551: + r=((packed>>11)&31)*255/31;g=((packed>>6)&31)*255/31;a=(packed&1)*255;break; + case RGB565: + r=((packed>>11)&31)*255/31;g=((packed>>5)&63)*255/63;break; + default:return false; + } + if(image->premultimage && a && a!=255) {r=std::min(255u,(r*255+a/2)/a);g=std::min(255u,(g*255+a/2)/a);} + terrain=(int)r;dynamic=(int)g;return true; +} +} + +@implementation CRunFindTheWay (Platform) +-(BOOL)mapFromImage:(CImage*)image grid:(unsigned)packed x:(int)x y:(int)y { + if(!image || image->width<=0 || image->height<=0) return NO; + (void)[image getPixel:0 withY:0]; // Restore purged CPU pixels through the SDK. + if(!image->data) return NO; + int size=(packed&65535)?(packed&65535):1; + if(ftw_map_create(image->width/size,image->height/size,&map)!=FTW_OK) return NO; + ftw_map_dimensions(map,&width,&height); + gridWidth=size;gridHeight=size;offsetX=x;offsetY=y; + // Windows samples image maps in orthogonal space, then applies isometric mode. + if(ftw_map_set_grid(map,0,size,size,x,y)!=FTW_OK) {[self clearMap];return NO;} + for(int gy=0;gy=image->width || point.y>=image->height) continue; + int terrain=0,dynamic=0; + if(!readCostPixel(image,point.x,point.y,terrain,dynamic)) {[self clearMap];return NO;} + ftw_map_set_cost(map,gx,gy,terrain,FTW_TERRAIN); + ftw_map_set_cost(map,gx,gy,dynamic,FTW_DYNAMIC); + } + gridHeight=isometric?std::max(size/2,1):size; + if(![self configureGrid]) {[self clearMap];return NO;} + return YES; +} +-(BOOL)platformCondition:(int)num withCndExtension:(CCndExtension*)cnd { + [self clearMap]; + if(num==27) { + // A Windows cSurface pointer is not an iOS resource identifier or pointer. + for(int i=0;i<4;++i) (void)[cnd getParamExpression:rh withNum:i]; + NSLog(@"FindTheWay: Windows cSurface pointer import is unavailable on iOS; use a picture or Active image"); + return NO; + } + if(num==12) { + NSString* path=[[[cnd getParamExpString:rh withNum:0] copy] autorelease]; + unsigned packed=(unsigned)[cnd getParamExpression:rh withNum:1]; + int x=[cnd getParamExpression:rh withNum:2], y=[cnd getParamExpression:rh withNum:3]; + if(![path length]) return NO; + // Preserve Fusion's path normalization, sandbox/resource precedence, + // embedded-file lookup and security-scoped file URL handling. + NSData* bytes=[rh->rhApp loadResourceData:path]; + UIImage* source=bytes?[UIImage imageWithData:bytes]:nil; + CImage* image=source?[CImage loadUIImage:source]:nil; + BOOL result=[self mapFromImage:image grid:packed x:x y:y]; + [image release];return result; + } + if(num==26) { + unsigned fixed=(unsigned)[cnd getParamExpression:rh withNum:0]; + int frame=[cnd getParamExpression:rh withNum:1]; + unsigned packed=(unsigned)[cnd getParamExpression:rh withNum:2]; + int x=[cnd getParamExpression:rh withNum:3], y=[cnd getParamExpression:rh withNum:4]; + int slot=(int)(fixed&65535); + CObject* object=slotrhMaxObjects?rh->rhObjectList[slot]:nil; + if(!object || (unsigned short)object->hoCreationId!=(fixed>>16) || (object->hoFlags&HOF_DESTROYED) || object->hoType!=2 + || !object->roa || !object->roa->raAnimDirOffset || frame<0 || frame>=object->roa->raAnimDirOffset->adNumberOfFrame) return NO; + CImage* image=[rh->rhApp->imageBank getImageFromHandle:object->roa->raAnimDirOffset->adFrames[frame]]; + return [self mapFromImage:image grid:packed x:x y:y]; + } + unsigned packed=(unsigned)[cnd getParamExpression:rh withNum:0]; + int x=[cnd getParamExpression:rh withNum:1], y=[cnd getParamExpression:rh withNum:2]; + BOOL events=[cnd getParamExpression:rh withNum:3]!=0; + int layer=[cnd getParamExpression:rh withNum:4]-1, type=[cnd getParamExpression:rh withNum:5]; + NSString* name=[[[cnd getParamExpString:rh withNum:6] copy] autorelease]; + if(type<1 || type>2 || rh->rhFrame->nLayers<=0 || layer<-1 || layer>=rh->rhFrame->nLayers) return NO; + gridWidth=(packed&65535)?(int)(packed&65535):1; + gridHeight=isometric?((packed>>16)?(int)(packed>>16):1):gridWidth;offsetX=x;offsetY=y; + int frameWidth=rh->rhFrame->leVirtualRect.right-rh->rhFrame->leVirtualRect.left; + int frameHeight=rh->rhFrame->leVirtualRect.bottom-rh->rhFrame->leVirtualRect.top; + int w=frameWidth/gridWidth,h=frameHeight/gridWidth; + if(isometric) {int sum=std::min((int64_t)frameWidth*2/gridWidth,(int64_t)frameHeight*2/gridHeight);h=sum/2;w=h+(sum%2==0);} + if(ftw_map_create(w,h,&map)!=FTW_OK) return NO; + width=w;height=h; + if(![self configureGrid]) {[self clearMap];return NO;} + if(events) { + NSMutableData* snapshot=[NSMutableData dataWithLength:(NSUInteger)w*h*sizeof(FTWCoord)]; + FTWCoord* points=(FTWCoord*)[snapshot mutableBytes]; + for(int gy=0;gyrhFrame bkdCol_TestPoint:point.x-rh->rhWindowX withY:point.y-rh->rhWindowY andLayer:layer andPlane:0]) + ftw_map_set_cost(original,gx,gy,255,type); + } + } + return map!=0; +} +-(void)createGridWithAct:(CActExtension*)act { + CObject* source=[act getParamObject:rh withNum:0]; + int layer=[act getParamExpression:rh withNum:1]-1; + if(!map || !source || (source->hoFlags&HOF_DESTROYED) || source->hoType!=2 || !source->roa || !source->roa->raAnimDirOffset + || !source->ros || layer<0 || layer>=rh->rhFrame->nLayers) return; + CAnimDir* frames=source->roa->raAnimDirOffset; + int r=source->rov?[[source->rov getValue:0] getInt]:0,b=source->rov?[[source->rov getValue:1] getInt]:0; + int hotX=source->hoImgXSpot,hotY=source->hoImgYSpot; + int effect=source->ros->rsEffect,param=source->ros->rsEffectParam,shader=source->ros->rsEffectShader; + short sourceOI=source->hoOi; + std::vector images(frames->adFrames,frames->adFrames+frames->adNumberOfFrame); + auto add=[&](int frame,int x,int y) { + if((size_t)frame>=images.size()) return; + CImage* image=[rh->rhApp->imageBank getImageFromHandle:images[frame]]; + if(!image) return; + CBkd2* backdrop=[[CBkd2 alloc] initWithCRun:rh]; + // Windows mvAddBackdrop receives a surface's top-left. iOS sprites + // subtract the selected image's hotspot, so pass its anchor instead. + // CBkd2 also needs that hotspot for matching visibility/wrap bounds. + backdrop->img=images[frame];backdrop->x=x+image->xSpot;backdrop->y=y+image->ySpot; + backdrop->spotX=image->xSpot;backdrop->spotY=image->ySpot;backdrop->nLayer=(short)layer; + backdrop->obstacleType=OBSTACLE_TRANSPARENT;backdrop->colMode=0; + backdrop->inkEffect=effect;backdrop->inkEffectParam=param; + if(shader!=-1) backdrop->bkdEffectShader=[backdrop checkOrCreateEffectIfNeeded:rh->rhApp andCOI:[rh->rhApp->OIList getOIFromHandle:sourceOI]]; + [rh addBackdrop2:backdrop]; // Runtime consumes ownership, including duplicates. + }; + FTWMap original=map; + for(int gy=0;gy= len(self.tokens): + raise ValueError('Unexpected end of project') + token = self.tokens[self.index] + self.index += 1 + if expected is not None and token.group() != expected: + raise ValueError(f'Expected {expected}, found {token.group()}') + return token + + def parse(self): + token = self.take() + word = token.group() + if word == '{': + value = {} + while self.tokens[self.index].group() != '}': + key = self.parse().value + if not isinstance(key, str) or key in value: + raise ValueError(f'Invalid or duplicate project key: {key}') + self.take('=') + value[key] = self.parse() + self.take(';') + end = self.take('}').end() + elif word == '(': + value = [] + while self.tokens[self.index].group() != ')': + value.append(self.parse()) + if self.tokens[self.index].group() != ')': + self.take(',') + end = self.take(')').end() + else: + if word in ('}', ')', '=', ';', ','): + raise ValueError(f'Unexpected token: {word}') + value = re.sub(r'\\(.)', lambda m: {'n': '\n', 'r': '\r', 't': '\t'}.get(m[1], m[1]), word[1:-1]) if word.startswith('"') else word + end = token.end() + return Node(value, token.start(), end) + + def plain(self, identity): + return plain(self.objects[identity]) + + +def plain(node): + value = node.value + if isinstance(value, dict): + return {key: plain(child) for key, child in value.items()} + if isinstance(value, list): + return [plain(child) for child in value] + return value + + +def render(value, depth=0): + tab = '\t' * depth + if isinstance(value, dict): + return '{\n' + ''.join(tab + '\t' + json.dumps(k) + ' = ' + render(v, depth + 1) + ';\n' for k, v in value.items()) + tab + '}' + if isinstance(value, list): + return '(\n' + ''.join(tab + '\t' + render(v, depth + 1) + ',\n' for v in value) + tab + ')' + return json.dumps(value, ensure_ascii=False) + + +def words(value): + return list(value) if isinstance(value, list) else shlex.split(value or '') + + +def version(value): + if not re.fullmatch(r'\d+(?:\.\d+){0,2}', value): + raise ValueError(f'Invalid minimum iOS version: {value}') + return tuple(map(int, value.split('.'))) + (0,) * (3 - len(value.split('.'))) + + +def prepare(bundle, minimum='17.0', target=None): + path = bundle / 'project.pbxproj' + original = path.read_bytes().decode('utf-8-sig') + project = Project(original) + objects = project.objects + native = {key: project.plain(key) for key in objects if project.plain(key).get('isa') == 'PBXNativeTarget'} + apps = {key: obj for key, obj in native.items() if obj.get('productType') == 'com.apple.product-type.application' + and (target is None or obj.get('name') == target)} + if len(apps) != 1: + raise ValueError('Expected one App target; use --target with its actual name') + app_id, app = next(iter(apps.items())) + for platform in ('iphoneos', 'iphonesimulator'): + archive = bundle.parent / f'libFindTheWayCore_{platform}.a' + if not archive.is_file() or archive.read_bytes()[:8] != b'!\n': + raise ValueError(f'Missing or invalid exported core archive: {archive}') + root_id = project.root.value['rootObject'].value + config_ids = set() + for owner in [project.plain(root_id), *native.values()]: + config_ids.update(project.plain(owner['buildConfigurationList'])['buildConfigurations']) + settings = {key: project.plain(key)['buildSettings'] for key in config_ids} + floor = max([minimum] + [v['IPHONEOS_DEPLOYMENT_TARGET'] for v in settings.values() if v.get('IPHONEOS_DEPLOYMENT_TARGET')], key=version) + edits = [] + for key, values in settings.items(): + before = dict(values) + for setting in list(values): + if setting.split('[', 1)[0] in ('ARCHS', 'VALID_ARCHS', 'EXCLUDED_ARCHS', 'ONLY_ACTIVE_ARCH', 'SUPPORTED_PLATFORMS', 'IPHONEOS_DEPLOYMENT_TARGET'): + del values[setting] + values.update(ARCHS='arm64', EXCLUDED_ARCHS='', ONLY_ACTIVE_ARCH='NO', + SUPPORTED_PLATFORMS='iphoneos iphonesimulator', IPHONEOS_DEPLOYMENT_TARGET=floor) + app_configs = project.plain(app['buildConfigurationList'])['buildConfigurations'] + if key in app_configs: + search = words(values.get('LIBRARY_SEARCH_PATHS')) + for item in ('$(inherited)', '$(SRCROOT)'): + if item not in search: + search.append(item) + values['LIBRARY_SEARCH_PATHS'] = search + base = words(values.get('OTHER_LDFLAGS')) + for sdk in ('iphoneos', 'iphonesimulator'): + name = f'OTHER_LDFLAGS[sdk={sdk}*]' + flags = words(values.get(name)) + if base and not any(flags[i:i + len(base)] == base for i in range(len(flags) - len(base) + 1)): + flags = base + flags + for flag in ('$(inherited)', f'-lFindTheWayCore_{sdk}', '-lc++', '-liconv'): + if flag not in flags: + flags.append(flag) + values[name] = flags + values['CODE_SIGNING_ALLOWED[sdk=iphonesimulator*]'] = 'NO' + if values != before: + node = objects[key].value['buildSettings'] + edits.append((node.start, node.end, render(values, 3))) + # Required static linking and direct target dependencies (including Box2D). + products = {obj.get('productReference'): key for key, obj in native.items()} + dependencies = list(app.get('dependencies', [])) + known = {project.plain(dep).get('target') for dep in dependencies} + additions = {} + for phase in app['buildPhases']: + phase = project.plain(phase) + if phase['isa'] != 'PBXFrameworksBuildPhase': + continue + for build_id in phase['files']: + build = project.plain(build_id) + file = project.plain(build['fileRef']) + static = file.get('path', '').endswith('.a') + if static and 'Weak' in build.get('settings', {}).get('ATTRIBUTES', []): + node = objects[build_id].value['settings'] + values = dict(build['settings']) + values['ATTRIBUTES'] = [a for a in values['ATTRIBUTES'] if a != 'Weak'] + edits.append((node.start, node.end, render(values, 2))) + dep_id = products.get(build['fileRef']) if static else None + if dep_id and dep_id not in known: + proxy_id = hashlib.sha256(('FTW proxy ' + dep_id).encode()).hexdigest()[:24].upper() + item_id = hashlib.sha256(('FTW dependency ' + dep_id).encode()).hexdigest()[:24].upper() + if proxy_id in objects or item_id in objects: + raise ValueError('Generated dependency identifier collision') + additions[proxy_id] = dict(isa='PBXContainerItemProxy', containerPortal=root_id, proxyType='1', remoteGlobalIDString=dep_id, remoteInfo=native[dep_id]['name']) + additions[item_id] = dict(isa='PBXTargetDependency', target=dep_id, targetProxy=proxy_id) + dependencies.append(item_id) + known.add(dep_id) + if dependencies != app.get('dependencies', []): + node = objects[app_id].value['dependencies'] + edits.append((node.start, node.end, render(dependencies, 3))) + if additions: + at = project.root.value['objects'].end - 1 + edits.append((at, at, ''.join('\t\t' + key + ' = ' + render(value, 2) + ';\n' for key, value in additions.items()) + '\t')) + changed = original + for start, end, replacement in sorted(edits, reverse=True): + changed = changed[:start] + replacement + changed[end:] + Project(changed) # Reject a malformed edit before writing any files. + results = {path: changed.encode('utf-8')} if edits else {} + for scheme in bundle.glob('xcshareddata/xcschemes/*.xcscheme'): + old = scheme.read_text() + ET.fromstring(old) + def repair_ref(match): + element = ET.fromstring(match[0]) + identity = element.attrib.get('BlueprintIdentifier') + if identity not in native: + return match[0] + obj = native[identity] + element.set('ReferencedContainer', 'container:' + bundle.name) + element.set('BlueprintName', obj['name']) + product = project.plain(obj['productReference']) + element.set('BuildableName', product['path']) + return ET.tostring(element, encoding='unicode') + new = re.sub(r']*(?:/\s*>|>\s*)', repair_ref, old) + ET.fromstring(new) + if new != old: + results[scheme] = new.encode('utf-8') + return results, floor + + +def write_atomic(path, data): + mode = stat.S_IMODE(path.stat().st_mode) + with tempfile.NamedTemporaryFile(dir=path.parent, delete=False) as stream: + tmp = Path(stream.name) + stream.write(data) + try: + tmp.chmod(mode) + os.replace(tmp, path) + finally: + tmp.unlink(missing_ok=True) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('project', type=Path, help='.xcodeproj bundle or exported folder') + parser.add_argument('--target', help='App target name, only needed for multiple Apps') + parser.add_argument('--minimum-ios', default='17.0', help='Core minimum OS floor; higher project values are retained') + parser.add_argument('--dry-run', action='store_true', help='Print changes without writing') + args = parser.parse_args() + try: + bundle = args.project.resolve() + if bundle.suffix != '.xcodeproj': + projects = list(bundle.glob('*.xcodeproj')) + if len(projects) != 1: + raise ValueError('Specify one .xcodeproj bundle') + bundle = projects[0] + version(args.minimum_ios) + results, floor = prepare(bundle, args.minimum_ios, args.target) + for path, data in results.items(): + if args.dry_run: + print(''.join(difflib.unified_diff(path.read_text().splitlines(True), data.decode().splitlines(True), fromfile=str(path), tofile=str(path))), end='') + else: + write_atomic(path, data) + print(f'Updated: {path}') + print(f'{"Preview" if args.dry_run else "Configured"}: arm64, minimum iOS {floor}; {len(results)} file(s) changed') + except (OSError, ValueError, KeyError, IndexError, ET.ParseError) as error: + parser.exit(1, f'ERROR: {error}\n') + + +if __name__ == '__main__': + main() diff --git a/Extensions/iOS/Helpers/ObjectBase.h b/Extensions/iOS/Helpers/ObjectBase.h new file mode 100644 index 000000000..a9fdce953 --- /dev/null +++ b/Extensions/iOS/Helpers/ObjectBase.h @@ -0,0 +1,58 @@ +#pragma once +#import "CRun.h" +#import "CObject.h" +#import "CObjInfo.h" +#import "CCndExtension.h" +#import "CEvents.h" +#include + +namespace FusionIOS { +// Runtime objects are borrowed. Use these helpers only on Fusion's thread. +struct ObjectRef { int slot; short generation; }; + +class ObjectBase { +protected: + CRun* run; + CObject* GetObject(int slot) const { + return slot>=0 && slotrhMaxObjects ? run->rhObjectList[slot] : nil; + } + CObject* Resolve(ObjectRef ref) const { + CObject* object=GetObject(ref.slot); + return object && object->hoCreationId==ref.generation ? object : nil; + } + void IterateOiL(const std::function& callback) const { + for(int i=0;irhMaxOI;++i) if(run->rhOiList[i]) callback(run->rhOiList[i]); + } +public: + explicit ObjectBase(CRun* runtime) : run(runtime) {} + static short GetOil(CCndExtension* condition,CRun* runtime,int index=0) { + return [condition getParamObject:runtime withNum:index]->evp.evpW.evpW0; + } + CObjInfo* GetLPOIL(int oiList) const { + return oiList>=0 && oiListrhMaxOI ? run->rhOiList[oiList] : nil; + } + CObjInfo* GetLPOIL(CObject* object) const { return object ? object->hoOiList : nil; } + short GetOiFromOiList(int oiList) const { + CObjInfo* info=GetLPOIL(oiList);return info ? info->oilOi : -1; + } + static bool CompareObjectName(NSString* objectName,NSString* compareName) { + if(!objectName || !compareName) return false; + NSUInteger start=0; + while(start<[objectName length] && [objectName characterAtIndex:start]==0xffff) ++start; + return [[objectName substringFromIndex:start] caseInsensitiveCompare:compareName]==NSOrderedSame; + } + static bool CompareObjectName(CObjInfo* info,NSString* name) { + return info && CompareObjectName(info->oilName,name); + } + CObjInfo* GetOILByName(NSString* name) const { + CObjInfo* result=nil; + IterateOiL([&](CObjInfo* info){if(CompareObjectName(info,name)) result=info;}); + return result; + } + bool OILHasObject(NSString* name) const { return GetOILByName(name)!=nil; } + bool OILHasObject(CObjInfo* info) const { + bool found=false;IterateOiL([&](CObjInfo* current){found=found || current==info;}); + return found; + } +}; +} diff --git a/Extensions/iOS/Helpers/ObjectCreation.h b/Extensions/iOS/Helpers/ObjectCreation.h new file mode 100644 index 000000000..090d11420 --- /dev/null +++ b/Extensions/iOS/Helpers/ObjectCreation.h @@ -0,0 +1,52 @@ +#pragma once +#include "ObjectBase.h" +#import "CRunApp.h" +#import "CRunFrame.h" +#import "CEventProgram.h" +#import "CObjectCommon.h" +#import "CLayer.h" +#import "CRSpr.h" +#import "CBox2D.h" +#import "CEvents.h" +#include + +namespace FusionIOS { +class ObjectCreation : public ObjectBase { +public: + struct CreateParams { + short frameItem=-1,oi=-1; + int x=0,y=0,direction=0,layer=0; + }; + explicit ObjectCreation(CRun* runtime) : ObjectBase(runtime) {} + short GetCreationOI(NSString* name) const { + CObjInfo* info=GetOILByName(name);return info && info->oilType>=2 ? info->oilOi : -1; + } + int GetValidLayer(int layer) const { return std::max(-1,std::min(layer,run->rhFrame->nLayers-1)); } + // Position decoding remains SDK-specific; never copy a Windows layout. + bool ResolvePosition(const ::CreateDuplicateParam& source,CreateParams& result,BOOL& repeat) const { + auto local=source; + if(!read_Position(run,&local.cdpPos,0x11,&result.x,&result.y,&result.direction,&repeat,&result.layer)) return false; + result.oi=local.cdpOi;result.frameItem=local.cdpHFII;return true; + } + CObject* Create(const CreateParams& params) const { + if(params.oi<0 || (params.frameItem==-1 && params.layer<0)) return nil; + int layer=GetValidLayer(params.layer); + int slot=[run f_CreateObject:params.frameItem withOIHandle:params.oi + andX:params.x andY:params.y andDir:params.direction andFlags:0 andLayer:layer andNumCreation:-1]; + CObject* object=GetObject(slot);if(!object) return nil; + [run->rhEvtProg evt_AddCurrentObject:object]; + AddPhysicsAttractor(run,object); + CRunMvtPhysics* physics=[run GetPhysicMovement:object]; + if(physics) physics->CreateBody(object); + else if(run->rh4Box2DBase) run->rh4Box2DBase->pAddNormalObject(run->rh4Box2DBase,object); + if(layer>=0 && (object->hoOEFlags&OEFLAG_SPRITES)) { + CLayer* target=run->rhFrame->layers[layer]; + if((target->dwOptions&(FLOPT_TOHIDE|FLOPT_VISIBLE))!=FLOPT_VISIBLE) [object->ros obHide]; + } + return object; + } + CObject* OCCreateObject(const std::function& update) { + CreateParams params;update(this,params);return Create(params); + } +}; +} diff --git a/Extensions/iOS/Helpers/ObjectSelection.h b/Extensions/iOS/Helpers/ObjectSelection.h new file mode 100644 index 000000000..ab80cfc02 --- /dev/null +++ b/Extensions/iOS/Helpers/ObjectSelection.h @@ -0,0 +1,176 @@ +#pragma once +#include "ObjectBase.h" +#import "CQualToOiList.h" +#import "CEventProgram.h" +#import "CEvents.h" +#include +#include + +namespace FusionIOS { +enum ForEachFlags { ForEachFlag_Default=0, ForEachFlag_ForceAll=1, ForEachFlag_SelectedOnly=2 }; + +class ObjectSelection : public ObjectBase { + std::vector Types(int oiList) const { + std::vector result; + oiList=static_cast(oiList); + if(oiList==-1) return result; + if(oiList>=0) {if(GetLPOIL(oiList)) result.push_back(oiList);} + else { + // The SDK provides no qualifier-array length. Accept Runtime event + // parameters, not arbitrary external qualifier IDs. + CQualToOiList* qualifier=run->rhEvtProg->qualToOiList[oiList&0x7fff]; + if(qualifier) for(int i=0;i+1nQoi;i+=2) { + short type=qualifier->qoiList[i+1]; + if(type<0) break; + if(GetLPOIL(type) && std::find(result.begin(),result.end(),type)==result.end()) result.push_back(type); + } + } + return result; + } + std::vector SnapshotList(CObjInfo* info,bool selected,bool destroyed) const { + std::vector result; + int slot=info ? (selected ? info->oilListSelected : info->oilObject) : -1; + int remaining=run->rhMaxObjects; + while(slot>=0 && remaining-->0) { + CObject* object=GetObject(slot);if(!object) break; + if(destroyed || !(object->hoFlags&HOF_DESTROYED)) result.push_back({slot,object->hoCreationId}); + slot=selected ? object->hoNextSelected : object->hoNumNext; + } + return result; + } + void Assign(short type,const std::vector& refs) const { + CObjInfo* info=GetLPOIL(type);if(!info) return; + info->oilListSelected=-1;info->oilNumOfSelected=0;info->oilEventCount=run->rhEvtProg->rh2EventCount; + CObject* previous=nil; + for(auto ref:refs) { + CObject* object=Resolve(ref);if(!object || object->hoOiList!=info) continue; + if(previous) previous->hoNextSelected=object->hoNumber;else info->oilListSelected=object->hoNumber; + object->hoNextSelected=-1;previous=object;++info->oilNumOfSelected; + } + } +public: + using SelObj=std::vector; + using Filter=std::function; + using ForEachCallBack=std::function; + explicit ObjectSelection(CRun* runtime) : ObjectBase(runtime) {} + static bool IsNegated(CCndExtension* condition) { + LPEVT event=(LPEVT)((char*)condition->pParams[0]-CND_SIZE); + return (event->evtFlags2&EVFLAG2_NOT)!=0; + } + + std::vector Snapshot(int oiList,int flags=ForEachFlag_Default,bool destroyed=false) const { + std::vector result; + for(short type:Types(oiList)) { + CObjInfo* info=GetLPOIL(type); + bool selected=!(flags&ForEachFlag_ForceAll) && ObjectIsSelected(info); + if(!selected && !(flags&ForEachFlag_ForceAll) && (flags&ForEachFlag_SelectedOnly)) continue; + auto refs=SnapshotList(info,selected,destroyed);result.insert(result.end(),refs.begin(),refs.end()); + } + return result; + } + // Explicit replacement also clears empty SOLs. Generation IDs protect scope + // restore and iteration against deletion/slot reuse during callbacks. + void Replace(int oiList,const std::vector& refs) const { + std::vector unique; + for(auto ref:refs) if(std::find_if(unique.begin(),unique.end(),[&](ObjectRef r){return r.slot==ref.slot;})==unique.end()) unique.push_back(ref); + for(short type:Types(oiList)) Assign(type,unique); + } + void SelectAll(int oiList) const { Replace(oiList,Snapshot(oiList,ForEachFlag_ForceAll,true)); } + void SelectNone(int oiList) const { Replace(oiList,{}); } + void SelectObjects(int oiList,const SelObj& objects) const { + std::vector refs; + for(CObject* object:objects) if(object && GetObject(object->hoNumber)==object) refs.push_back({object->hoNumber,object->hoCreationId}); + Replace(oiList,refs); + } + void SelectObjects(CObjInfo* info,const SelObj& objects) const { + if(!info) return; + for(short type=0;typerhMaxOI;++type) if(GetLPOIL(type)==info) {SelectObjects(type,objects);return;} + } + void SelectOneObject(CObject* object) const { if(object) SelectObjects(object->hoOiList,{object}); } + CObject* GetFirstObject(CObjInfo* info,bool selected=false) const { + return info ? GetObject(selected ? info->oilListSelected : info->oilObject) : nil; + } + CObject* GetFirstObject(int oiList,bool selected=false) const { return GetFirstObject(GetLPOIL(oiList),selected); } + static bool ObjectIsQualifier(int oiList) { return (oiList&0x8000)!=0; } + bool ObjectIsSelected(CObjInfo* info) const { return info && info->oilEventCount==run->rhEvtProg->rh2EventCount; } + bool ObjectIsSelected(int oiList) const { + for(short type:Types(oiList)) if(ObjectIsSelected(GetLPOIL(type))) return true;return false; + } + bool Selected(CObjInfo* info) const { return ObjectIsSelected(info) && info->oilListSelected>=0; } + bool Selected(int oiList) const { return Selected(GetLPOIL(oiList)); } + int GetNumberOfSelected(int oiList) const { + int count=0;for(short type:Types(oiList)) count+=GetLPOIL(type)->oilNumOfSelected;return count; + } + int GetNumberOfObject(int oiList) const { + int count=0;for(short type:Types(oiList)) count+=GetLPOIL(type)->oilNObjects;return count; + } + bool ObjectIsOfType(CObject* object,int oiList) const { + if(object) for(short type:Types(oiList)) if(GetLPOIL(type)->oilOi==object->hoOi) return true;return false; + } + void ForEach(int oiList,const ForEachCallBack& callback,int flags=ForEachFlag_Default) const { + for(auto ref:Snapshot(oiList,flags)) {CObject* object=Resolve(ref);if(object && !(object->hoFlags&HOF_DESTROYED)) callback(object);} + } + // Predicates must not dispatch events or mutate object lists. + bool FilterObjects(int oiList,bool negate,const Filter& predicate,bool destroyed=true) const { + auto types=Types(oiList);if(types.empty()) return false; + std::vector retained; + for(auto ref:Snapshot(oiList,ForEachFlag_Default,destroyed)) { + CObject* object=Resolve(ref);if(object && predicate(object)!=negate) retained.push_back(ref); + } + for(short type:types) Assign(type,retained); + return !retained.empty()!=negate; + } + void IterateObjectWithIdentifier(int identifier,const ForEachCallBack& callback,bool selected=false) const { + IterateOiL([&](CObjInfo* info){ + CObject* first=GetFirstObject(info,selected); + if(first && first->hoIdentifier==identifier) for(auto ref:SnapshotList(info,selected,false)) { + CObject* object=Resolve(ref);if(object && !(object->hoFlags&HOF_DESTROYED)) callback(object); + } + }); + } + SelObj SaveSelectedObject(CObjInfo* info) const { + SelObj result;for(auto ref:SnapshotList(info,true,false)) result.push_back(Resolve(ref));return result; + } + class Scope { + friend class ObjectSelection; + CRun* run; + int count,action,loop; + BOOL on,looping; + LPEVT start; + struct Saved {short type;CObjInfo* info;int stamp;std::vector objects;}; + std::vector saved; + public: + explicit Scope(CRun* runtime) : run(runtime) { + CEventProgram* e=run->rhEvtProg;count=e->rh2EventCount;action=e->rh2ActionCount;loop=e->rh2ActionLoopCount; + on=e->rh2ActionOn;looping=e->rh2ActionLoop;start=e->rh4ActionStart; + } + void RestoreActionState() const { + CEventProgram* e=run->rhEvtProg;e->rh2ActionCount=action;e->rh2ActionLoopCount=loop; + e->rh2ActionOn=on;e->rh2ActionLoop=looping;e->rh4ActionStart=start; + } + }; + void SaveScope(Scope& scope) const { + scope.saved.clear(); + for(short type=0;typerhMaxOI;++type) if(CObjInfo* info=GetLPOIL(type)) { + int stamp=info->oilEventCount; + scope.saved.push_back({type,info,stamp,stamp==scope.count ? SnapshotList(info,true,true) : std::vector{}}); + } + } + Scope SaveScope() const { Scope scope(run);SaveScope(scope);return scope; } + void RestoreScope(const Scope& scope) const { + for(const auto& state:scope.saved) if(GetLPOIL(state.type)==state.info) { + if(state.stamp==scope.count) Replace(state.type,state.objects); + else state.info->oilEventCount=state.stamp; + } + } + void KeepScopeCall(bool keepScope,const std::function& callback) const { + if(!keepScope) {callback();return;} + const auto scope=SaveScope(); + @try { callback(); } + @finally { scope.RestoreActionState();RestoreScope(scope); } + } +}; +inline void KeepScopeCall(const ObjectSelection* selection,bool keepScope,const std::function& callback) { + if(selection) selection->KeepScopeCall(keepScope,callback);else callback(); +} +} diff --git a/Extensions/iOS/Helpers/README.md b/Extensions/iOS/Helpers/README.md new file mode 100644 index 000000000..9a2403e72 --- /dev/null +++ b/Extensions/iOS/Helpers/README.md @@ -0,0 +1,110 @@ +# iOS Runtime object helpers + +These C++11 Objective-C++ headers provide general Fusion Runtime functionality +for any iOS extension. They have no FindTheWay or native-core dependency: + +- `ObjectBase.h`: `FusionIOS::ObjectBase`, shared OI/object lookup, name + comparison, existence checks and OI-list-index to creation-handle conversion. +- `ObjectSelection.h`: `FusionIOS::ObjectSelection`, qualifiers, selection, + filtering, counts, type/identifier checks, iteration and selection/action scopes. +- `ObjectCreation.h`: `FusionIOS::ObjectCreation`, creation parameters, + SDK position resolution, name-based OI lookup and post-creation setup. + +Selection and creation are independent classes deriving from ObjectBase. Their +names and portable operations follow Windows `Extensions/_3rdLib/ObjectBase.h`, +`ObjectSelection.h`, `ObjectCreation.h` and Android's corresponding `_3rdLib` +classes. The Windows references were checked at `9ff0b78a`; they are unchanged +in this port. Use the current Windows implementation for future parity reviews. + +The filenames match Windows. Package the three headers in the export root's +`Helpers/` directory, separate from the SDK's own `Classes/Services/ObjectSelection.h`. +Runtime sources include `../../Helpers/ObjectSelection.h` or ObjectCreation.h; +do not add this directory to the SDK's global recursive header search paths. +All implementations are inline: use one consistent revision, with no helper +compilation unit or shared library. +Multiple extensions can include them without duplicate strong definitions. The +extension packager generates extension-specific PBX IDs for shared headers. + +```objc +#include "ObjectSelection.h" +#include "ObjectCreation.h" + +FusionIOS::ObjectSelection selection(run); +selection.ForEach(oiList, [&](CObject* object) { + // Use the current selection, or all objects if this event has not filtered it. +}); + +FusionIOS::ObjectCreation creation(run); +creation.OCCreateObject([&](FusionIOS::ObjectCreation*, + FusionIOS::ObjectCreation::CreateParams& params) { + params.oi = creation.GetCreationOI(@"Marker"); + params.x = x; + params.y = y; + params.layer = 0; +}); +``` + +## Selection and event scopes + +`SelectAll`, `SelectNone`, `SelectOneObject`, `SelectObjects`, `FilterObjects`, +`GetFirstObject`, `Selected`, `ObjectIsSelected`, `ObjectIsOfType`, +`GetNumberOfSelected`, `GetNumberOfObject`, `IterateObjectWithIdentifier` and +`SaveSelectedObject` are available without plugin-specific predicates. +`ForEachFlag_ForceAll` takes precedence over `ForEachFlag_SelectedOnly`. +`Selected` requires a nonempty current selection; `ObjectIsSelected` also accepts +an explicitly empty selection. Slot zero is valid. Qualifier pairs use the OI +list index, not the creation OI handle. + +`Snapshot`/`Replace` use slots plus creation IDs. Iteration skips removed/reused +objects and does not visit later creations. An empty replacement or SelectObjects +clears the SOL, as on Android; Windows's vector overload currently treats empty +input as a no-op. Filter predicates must not dispatch events or mutate lists. +Destroyed objects are excluded before predicate/negation when requested. + +`SaveScope`/`RestoreScope` save selections; `Scope::RestoreActionState` restores +action-loop state explicitly. `KeepScopeCall(true, callback)` restores both even +when an Objective-C exception escapes the callback. Apple Objective-C++ also +supports C++ exception unwinding. Empty selections, stale event stamps and +generation IDs are preserved; the current Runtime event counter is not rolled +back. Qualifiers must come from valid Runtime parameters because the SDK exposes +no qualifier-array length. All calls execute on Fusion's owning thread. + +## Creation and platform differences + +`ResolvePosition` decodes a copied SDK CreateDuplicateParam through read_Position; +the caller applies repeat flags to its action. `Create` accepts resolved parameters +and `OCCreateObject` initializes a local parameter set for each callback, including +nested creation. Creation selects the result, registers physics and applies +hidden-layer visibility. Layers are clamped to [-1, nLayers-1]; by-name creation +with HFII -1 requires an explicit layer. Names skip leading U+FFFF markers and +retain mobile case-insensitive comparison; Windows's StrEqu is case-sensitive. +Grid backdrops use a separate SDK API in the consuming extension. + +The Runtime and its objects remain borrowed. Do not retain these helpers after +the Runtime is destroyed, share them across threads, modify the exporter helper, +or expose Runtime objects through a plugin's native-core ABI. + +## Validation + +The standalone fixture compiles two translation units using these headers and +Foundation, without FindTheWay sources, headers or a native library: + +```sh +python3 Extensions/iOS/tests/run_runtime_fixture.py --helpers-only +``` + +It covers sparse OI handles, qualifiers, slot zero, counts, selection modes, +destroyed objects, filters, scopes/exceptions, slot reuse, nested creation and +layer sentinels. Linux uses GNUstep; its legacy Objective-C runtime cannot run +the C++ exception check, which is enabled on Apple only. These owned API models +do not replace tests with the actual iOS Runtime. + +Check the headers against an exported project's SDK on Apple Silicon: + +```sh +python3 Extensions/iOS/Helpers/check_helpers.py --runtime-project /path/to/Proj +``` + +Use `--runtime-source /path/to/extension/Runtime` and repeatable `--include` +arguments to check a consuming extension too. Follow with actual export, link +and Runtime checks, including parent/repeat creation, physics and hidden layers. diff --git a/Extensions/iOS/Helpers/check_helpers.py b/Extensions/iOS/Helpers/check_helpers.py new file mode 100644 index 000000000..9e45133f7 --- /dev/null +++ b/Extensions/iOS/Helpers/check_helpers.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +"""Syntax-check generic helpers and optional extension sources against an iOS Runtime.""" +import argparse +import pathlib +import platform +import shutil +import subprocess + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--runtime-project', type=pathlib.Path, required=True) + parser.add_argument('--minimum-ios', default='17.0') + parser.add_argument('--runtime-source', type=pathlib.Path, + help='Optional extension Runtime source directory') + parser.add_argument('--include', type=pathlib.Path, action='append', default=[], + help='Additional extension include directory; repeat as needed') + args = parser.parse_args() + if platform.system() != 'Darwin' or platform.machine() != 'arm64' or not shutil.which('xcrun'): + parser.error('Requires Apple Silicon macOS and selected Xcode') + if not args.minimum_ios or any(c not in '0123456789.' for c in args.minimum_ios): + parser.error('minimum-ios must be a numeric version') + project = args.runtime_project.resolve() + classes = project / 'Classes' + if not (classes / 'RunLoop' / 'CRun.h').is_file(): + parser.error('Expected an exported project with Classes/RunLoop/CRun.h') + sdk = subprocess.check_output(['xcrun', '--sdk', 'iphonesimulator', '--show-sdk-path'], text=True).strip() + includes = sorted({p.parent for p in classes.rglob('*.h')}) + helpers = pathlib.Path(__file__).resolve().parent + sources = sorted(helpers.glob('Object*.h')) + if args.runtime_source: + if not args.runtime_source.is_dir(): + parser.error('runtime-source must be an existing directory') + sources += [*sorted(args.runtime_source.glob('*.m')), *sorted(args.runtime_source.glob('*.mm'))] + command = ['xcrun', '--sdk', 'iphonesimulator', 'clang++', '-std=c++11', + '-target', f'arm64-apple-ios{args.minimum_ios}-simulator', '-isysroot', sdk, '-fno-objc-arc', '-fsyntax-only', + '-x', 'objective-c++', '-F', str(project), '-I', str(classes), + '-I', str(helpers)] + if args.runtime_source: + command += ['-I', str(args.runtime_source.resolve())] + for directory in args.include: + command += ['-I', str(directory.resolve())] + prefixes = list(project.glob('*_Prefix.pch')) + if len(prefixes) == 1: + command += ['-include', str(prefixes[0])] + for directory in includes: + command += ['-I', str(directory)] + subprocess.run(command + [str(source) for source in sources], check=True) + + +if __name__ == '__main__': + main() diff --git a/Extensions/iOS/README.md b/Extensions/iOS/README.md new file mode 100644 index 000000000..a319d10f3 --- /dev/null +++ b/Extensions/iOS/README.md @@ -0,0 +1,39 @@ +# iOS extensions + +Each plugin owns a build project under this folder. FindTheWay contains its +CMake/CLI entry points, Core and Runtime adapter. Shared Runtime helpers live +in Helpers; publishing/build regression tests live in tests. + +See [FindTheWay/README.md](FindTheWay/README.md) for build and artifact-transfer +commands. Build on Apple Silicon using CMake and Apple command-line tools; +device arm64 and simulator arm64 are separate platform slices. Keep private +Fusion SDK/exporter projects outside this repository. + +## FindTheWay export configuration tool + +After each Fusion iOS export, close Xcode and run the +[Python configurator](FindTheWay/configure_export.py) before opening the project. +From the repository root: + +```sh +python3 Extensions/iOS/FindTheWay/configure_export.py /path/to/FindTheWay.xcodeproj +``` + +The Windows publisher also includes it in FindTheWay.ext as +`configure_findtheway_export.py`. When present in the exported folder, run: + +```sh +python3 configure_findtheway_export.py . +``` + +It fixes arm64 settings, renamed Scheme references, required static linkage and +dependencies such as Box2D, and device/simulator FTW core selection. Use +`--dry-run` to preview; repeating the command does not duplicate configuration. +Both exported FTW archives must be present. It preserves higher minimum OS +versions and device signing; it does not rebuild the core or install advertising +SDKs. Reopen Xcode, select the App scheme, clean the build folder and build/run. + +This tool is specific to FindTheWay's exported native libraries. See the +[FindTheWay instructions](FindTheWay/README.md#configure-the-fusion-export-on-mac) +for options and the complete Mac/Windows publishing workflow; other plugins +should derive their configuration from their own artifacts and targets. diff --git a/Extensions/iOS/SDK.xcodeproj/project.pbxproj b/Extensions/iOS/SDK.xcodeproj/project.pbxproj deleted file mode 100644 index 1dd253ba8..000000000 --- a/Extensions/iOS/SDK.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2602 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 043EC9DB23548329007001F0 /* joydown.png in Resources */ = {isa = PBXBuildFile; fileRef = 043EC9DA23548328007001F0 /* joydown.png */; }; - 043EC9DD23548333007001F0 /* joydownd.png in Resources */ = {isa = PBXBuildFile; fileRef = 043EC9DC23548333007001F0 /* joydownd.png */; }; - 043EC9E423548352007001F0 /* joyup.png in Resources */ = {isa = PBXBuildFile; fileRef = 043EC9DE23548351007001F0 /* joyup.png */; }; - 043EC9E523548352007001F0 /* joyrightd.png in Resources */ = {isa = PBXBuildFile; fileRef = 043EC9DF23548351007001F0 /* joyrightd.png */; }; - 043EC9E623548352007001F0 /* joyleftd.png in Resources */ = {isa = PBXBuildFile; fileRef = 043EC9E023548351007001F0 /* joyleftd.png */; }; - 043EC9E723548352007001F0 /* joyupd.png in Resources */ = {isa = PBXBuildFile; fileRef = 043EC9E123548351007001F0 /* joyupd.png */; }; - 043EC9E823548352007001F0 /* joyleft.png in Resources */ = {isa = PBXBuildFile; fileRef = 043EC9E223548351007001F0 /* joyleft.png */; }; - 043EC9E923548352007001F0 /* joyright.png in Resources */ = {isa = PBXBuildFile; fileRef = 043EC9E323548351007001F0 /* joyright.png */; }; - 04578521238D67A5004156D9 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04578520238D67A5004156D9 /* WebKit.framework */; }; - 0F751AD912BE0DDA002D72FB /* iAd.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F751AD812BE0DDA002D72FB /* iAd.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 0F7AAA9C115E53090051E240 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F7AAA9B115E53090051E240 /* AVFoundation.framework */; }; - 0F7EE90D1834C33A00DCECFF /* CBox2D.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F7EE90C1834C33A00DCECFF /* CBox2D.m */; }; - 0F80199A182BD92400C543EE /* CRunMvtbox2d8directions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F801999182BD92400C543EE /* CRunMvtbox2d8directions.m */; }; - 0F80199D182BF60D00C543EE /* CRunMvtbox2daxial.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80199C182BF60D00C543EE /* CRunMvtbox2daxial.m */; }; - 0F8029D6182CBC6500F3854F /* CRunMvtbox2dbackground.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F8029D5182CBC6500F3854F /* CRunMvtbox2dbackground.m */; }; - 0F8029D9182CC1C200F3854F /* CRunMvtbox2dbouncingball.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F8029D8182CC1C200F3854F /* CRunMvtbox2dbouncingball.m */; }; - 0F8029DC182CC71B00F3854F /* CRunMvtbox2dplatform.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F8029DB182CC71B00F3854F /* CRunMvtbox2dplatform.m */; }; - 0F80619D1828CBC100040161 /* CRunBox2DBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80619C1828CBC100040161 /* CRunBox2DBase.m */; }; - 0F80F85F1833610E00A5D127 /* CRunMvtbox2dracecar.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F85E1833610E00A5D127 /* CRunMvtbox2dracecar.m */; }; - 0F80F8621833673600A5D127 /* CRunMvtbox2dspaceship.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F8611833673600A5D127 /* CRunMvtbox2dspaceship.m */; }; - 0F80F865183384F000A5D127 /* CRunMvtbox2dspring.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F864183384F000A5D127 /* CRunMvtbox2dspring.m */; }; - 0F80F86818338A2000A5D127 /* CRunMvtbox2dstatic.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F86718338A2000A5D127 /* CRunMvtbox2dstatic.m */; }; - 0F80F86B1833ABA800A5D127 /* CRunBox2DFan.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F86A1833ABA800A5D127 /* CRunBox2DFan.m */; }; - 0F80F86E1833B69C00A5D127 /* CRunBox2DMagnet.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F86D1833B69C00A5D127 /* CRunBox2DMagnet.m */; }; - 0F80F8711833C05100A5D127 /* CRunBox2DTreadmill.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F8701833C05100A5D127 /* CRunBox2DTreadmill.m */; }; - 0F80F8741833C5F000A5D127 /* CRunBox2DParticules.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F8731833C5EF00A5D127 /* CRunBox2DParticules.m */; }; - 0F80F8771833DC7600A5D127 /* CRunBox2DRopeAndChain.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F8761833DC7500A5D127 /* CRunBox2DRopeAndChain.m */; }; - 0F80F87A1833ECDF00A5D127 /* CRunBox2DGround.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80F8791833ECDE00A5D127 /* CRunBox2DGround.m */; }; - 0F812EB6122F9D160032040B /* ITunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = 0F812EB2122F9D160032040B /* ITunesArtwork.png */; }; - 0F8380DE1844A2BA00DEED30 /* CRunBox2DJoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F8380DD1844A2BA00DEED30 /* CRunBox2DJoint.m */; }; - 0FAF51CF160C9E4B0039137E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7C915C615F7FDBB00F5369B /* SystemConfiguration.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 0FAF526616133ED70039137E /* CRunFlocking.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FAF526516133ED60039137E /* CRunFlocking.m */; }; - 0FAF526816133F570039137E /* CPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FAF526716133F570039137E /* CPoint.m */; }; - 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; - 3DA0F3A819FE38140080FDC5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3DA0F3A719FE38140080FDC5 /* Images.xcassets */; }; - 8103571C27EFE941000AD374 /* CRunFindTheWay.m in Sources */ = {isa = PBXBuildFile; fileRef = 8103571B27EFE941000AD374 /* CRunFindTheWay.m */; }; - 81B13D9127EC884000AF5BF4 /* CRunTemplate.m in Sources */ = {isa = PBXBuildFile; fileRef = 81B13D9027EC884000AF5BF4 /* CRunTemplate.m */; }; - 8B0D31BB18366251005202BD /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D312E18366234005202BD /* b2BroadPhase.cpp */; }; - 8B0D31BC18366251005202BD /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D313018366234005202BD /* b2CollideCircle.cpp */; }; - 8B0D31BD18366251005202BD /* b2CollideEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D313118366234005202BD /* b2CollideEdge.cpp */; }; - 8B0D31BE18366251005202BD /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D313218366234005202BD /* b2CollidePolygon.cpp */; }; - 8B0D31BF18366251005202BD /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D313318366234005202BD /* b2Collision.cpp */; }; - 8B0D31C018366251005202BD /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D313518366234005202BD /* b2Distance.cpp */; }; - 8B0D31C118366251005202BD /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D313718366234005202BD /* b2DynamicTree.cpp */; }; - 8B0D31C218366251005202BD /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D313918366234005202BD /* b2TimeOfImpact.cpp */; }; - 8B0D31C318366251005202BD /* b2ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D313C18366234005202BD /* b2ChainShape.cpp */; }; - 8B0D31C418366251005202BD /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D313E18366234005202BD /* b2CircleShape.cpp */; }; - 8B0D31C518366251005202BD /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D314018366234005202BD /* b2EdgeShape.cpp */; }; - 8B0D31C618366251005202BD /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D314218366234005202BD /* b2PolygonShape.cpp */; }; - 8B0D31C718366251005202BD /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D314618366234005202BD /* b2BlockAllocator.cpp */; }; - 8B0D31C818366251005202BD /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D314818366234005202BD /* b2Draw.cpp */; }; - 8B0D31C918366251005202BD /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D314B18366234005202BD /* b2Math.cpp */; }; - 8B0D31CA18366251005202BD /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D314D18366234005202BD /* b2Settings.cpp */; }; - 8B0D31CB18366251005202BD /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D314F18366234005202BD /* b2StackAllocator.cpp */; }; - 8B0D31CC18366251005202BD /* b2Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D315118366234005202BD /* b2Timer.cpp */; }; - 8B0D31CD18366251005202BD /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D315418366234005202BD /* b2Body.cpp */; }; - 8B0D31CE18366251005202BD /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D315618366234005202BD /* b2ContactManager.cpp */; }; - 8B0D31CF18366251005202BD /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D315818366234005202BD /* b2Fixture.cpp */; }; - 8B0D31D018366251005202BD /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D315A18366234005202BD /* b2Island.cpp */; }; - 8B0D31D118366251005202BD /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D315D18366234005202BD /* b2World.cpp */; }; - 8B0D31D218366251005202BD /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D315F18366234005202BD /* b2WorldCallbacks.cpp */; }; - 8B0D31D318366251005202BD /* b2ChainAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D316218366234005202BD /* b2ChainAndCircleContact.cpp */; }; - 8B0D31D418366251005202BD /* b2ChainAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D316418366234005202BD /* b2ChainAndPolygonContact.cpp */; }; - 8B0D31D518366251005202BD /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D316618366234005202BD /* b2CircleContact.cpp */; }; - 8B0D31D618366251005202BD /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D316818366234005202BD /* b2Contact.cpp */; }; - 8B0D31D718366251005202BD /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D316A18366234005202BD /* b2ContactSolver.cpp */; }; - 8B0D31D818366251005202BD /* b2EdgeAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D316C18366234005202BD /* b2EdgeAndCircleContact.cpp */; }; - 8B0D31D918366251005202BD /* b2EdgeAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D316E18366234005202BD /* b2EdgeAndPolygonContact.cpp */; }; - 8B0D31DA18366251005202BD /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D317018366234005202BD /* b2PolygonAndCircleContact.cpp */; }; - 8B0D31DB18366251005202BD /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D317218366234005202BD /* b2PolygonContact.cpp */; }; - 8B0D31DC18366251005202BD /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D317518366234005202BD /* b2DistanceJoint.cpp */; }; - 8B0D31DD18366251005202BD /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D317718366234005202BD /* b2FrictionJoint.cpp */; }; - 8B0D31DE18366251005202BD /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D317918366234005202BD /* b2GearJoint.cpp */; }; - 8B0D31DF18366251005202BD /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D317B18366234005202BD /* b2Joint.cpp */; }; - 8B0D31E018366251005202BD /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D317D18366234005202BD /* b2MouseJoint.cpp */; }; - 8B0D31E118366251005202BD /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D317F18366234005202BD /* b2PrismaticJoint.cpp */; }; - 8B0D31E218366251005202BD /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D318118366234005202BD /* b2PulleyJoint.cpp */; }; - 8B0D31E318366251005202BD /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D318318366234005202BD /* b2RevoluteJoint.cpp */; }; - 8B0D31E418366251005202BD /* b2RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D318518366234005202BD /* b2RopeJoint.cpp */; }; - 8B0D31E518366251005202BD /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D318718366234005202BD /* b2WeldJoint.cpp */; }; - 8B0D31E618366251005202BD /* b2WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D318918366234005202BD /* b2WheelJoint.cpp */; }; - 8B0D31E718366251005202BD /* b2Rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0D318C18366234005202BD /* b2Rope.cpp */; }; - 8B0D31E81836639A005202BD /* libBox2D.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B0D3109183661E5005202BD /* libBox2D.a */; settings = {ATTRIBUTES = (Weak, ); }; }; - 8B189F8117F72DA500C3DC8A /* CTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B189F8017F72DA500C3DC8A /* CTexture.m */; }; - 8B2AE66018FEAEE700642A27 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B2AE65F18FEAEE700642A27 /* GameController.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 8B2D764C17EB235D00599FBE /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B2D764B17EB235D00599FBE /* CoreMotion.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 8B2D764F17EB363E00599FBE /* CRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B2D764D17EB363E00599FBE /* CRenderer.cpp */; }; - 8B5CD3761B336348008478B7 /* CRunStencilMask.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B5CD3751B336348008478B7 /* CRunStencilMask.m */; }; - 8BBA59CF18058211002222A0 /* CRunScreenZoom.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BBA59CE18058211002222A0 /* CRunScreenZoom.m */; }; - 8BDA7B89190BC31F0023BD01 /* CJoystickGamePad.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BDA7B88190BC31F0023BD01 /* CJoystickGamePad.m */; }; - A70E3F75120AFB0E005AC44F /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A70E3F74120AFB0E005AC44F /* CoreLocation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - A70E4036120B14FD005AC44F /* fire1D.png in Resources */ = {isa = PBXBuildFile; fileRef = A70E402F120B14FD005AC44F /* fire1D.png */; }; - A70E4038120B14FD005AC44F /* fire2D.png in Resources */ = {isa = PBXBuildFile; fileRef = A70E4031120B14FD005AC44F /* fire2D.png */; }; - A70E4039120B14FD005AC44F /* fire2U.png in Resources */ = {isa = PBXBuildFile; fileRef = A70E4032120B14FD005AC44F /* fire2U.png */; }; - A70E403B120B14FD005AC44F /* joyback.png in Resources */ = {isa = PBXBuildFile; fileRef = A70E4034120B14FD005AC44F /* joyback.png */; }; - A70E403C120B14FD005AC44F /* joyfront.png in Resources */ = {isa = PBXBuildFile; fileRef = A70E4035120B14FD005AC44F /* joyfront.png */; }; - A70E4056120B1540005AC44F /* default.fsh in Resources */ = {isa = PBXBuildFile; fileRef = A70E403F120B1519005AC44F /* default.fsh */; }; - A70E4057120B1540005AC44F /* default.vsh in Resources */ = {isa = PBXBuildFile; fileRef = A70E4040120B1519005AC44F /* default.vsh */; }; - A70E405A120B1540005AC44F /* gradient.fsh in Resources */ = {isa = PBXBuildFile; fileRef = A70E4043120B1519005AC44F /* gradient.fsh */; }; - A70E405B120B1540005AC44F /* gradient.vsh in Resources */ = {isa = PBXBuildFile; fileRef = A70E4044120B1519005AC44F /* gradient.vsh */; }; - A7136799139D3C550082293B /* Application.cci in Resources */ = {isa = PBXBuildFile; fileRef = A7136798139D3C550082293B /* Application.cci */; }; - A72B592A151A16F800223DD0 /* CAnim.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B578E151A16F700223DD0 /* CAnim.m */; }; - A72B592B151A16F800223DD0 /* CAnimDir.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5790151A16F700223DD0 /* CAnimDir.m */; }; - A72B592C151A16F800223DD0 /* CAnimHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5792151A16F700223DD0 /* CAnimHeader.m */; }; - A72B592D151A16F800223DD0 /* CRAni.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5794151A16F700223DD0 /* CRAni.m */; }; - A72B592E151A16F800223DD0 /* CALPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5797151A16F700223DD0 /* CALPlayer.m */; }; - A72B592F151A16F800223DD0 /* CEmbeddedFile.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5799151A16F700223DD0 /* CEmbeddedFile.m */; }; - A72B5931151A16F800223DD0 /* CJoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B579D151A16F700223DD0 /* CJoystick.m */; }; - A72B5932151A16F800223DD0 /* CJoystickAcc.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B579F151A16F700223DD0 /* CJoystickAcc.m */; }; - A72B5933151A16F800223DD0 /* CRunApp.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57A2151A16F700223DD0 /* CRunApp.m */; }; - A72B5934151A16F800223DD0 /* CRunFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57A4151A16F700223DD0 /* CRunFrame.m */; }; - A72B5935151A16F800223DD0 /* CRunView.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57A6151A16F700223DD0 /* CRunView.m */; }; - A72B5936151A16F800223DD0 /* CRunViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57A8151A16F700223DD0 /* CRunViewController.m */; }; - A72B5937151A16F800223DD0 /* CSoundPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57AA151A16F700223DD0 /* CSoundPlayer.m */; }; - A72B5938151A16F800223DD0 /* CSysEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57AC151A16F700223DD0 /* CSysEvent.m */; }; - A72B5939151A16F800223DD0 /* CSysEventClick.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57AE151A16F700223DD0 /* CSysEventClick.m */; }; - A72B593A151A16F800223DD0 /* MainView.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57B1151A16F700223DD0 /* MainView.m */; }; - A72B593B151A16F800223DD0 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57B3151A16F700223DD0 /* MainViewController.m */; }; - A72B593C151A16F800223DD0 /* CFont.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57B6151A16F700223DD0 /* CFont.m */; }; - A72B593D151A16F800223DD0 /* CFontBank.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57B8151A16F700223DD0 /* CFontBank.m */; }; - A72B593E151A16F800223DD0 /* CImage.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57BA151A16F700223DD0 /* CImage.m */; }; - A72B593F151A16F800223DD0 /* CImageBank.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57BC151A16F700223DD0 /* CImageBank.m */; }; - A72B5940151A16F800223DD0 /* CSound.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57BE151A16F700223DD0 /* CSound.m */; }; - A72B5941151A16F800223DD0 /* CSoundBank.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57C0151A16F700223DD0 /* CSoundBank.m */; }; - A72B5942151A16F800223DD0 /* CEventProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57C4151A16F700223DD0 /* CEventProgram.m */; }; - A72B5943151A16F800223DD0 /* CEvents.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57C6151A16F700223DD0 /* CEvents.m */; }; - A72B5945151A16F800223DD0 /* CLoadQualifiers.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57C9151A16F800223DD0 /* CLoadQualifiers.m */; }; - A72B5946151A16F800223DD0 /* CQualToOiList.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57CC151A16F800223DD0 /* CQualToOiList.m */; }; - A72B5947151A16F800223DD0 /* CValue.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57CF151A16F800223DD0 /* CValue.m */; }; - A72B5948151A16F800223DD0 /* CActExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57D2151A16F800223DD0 /* CActExtension.m */; }; - A72B5949151A16F800223DD0 /* CCndExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57D4151A16F800223DD0 /* CCndExtension.m */; }; - A72B594A151A16F800223DD0 /* CExtLoad.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57D6151A16F800223DD0 /* CExtLoad.m */; }; - A72B594B151A16F800223DD0 /* CExtLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57D8151A16F800223DD0 /* CExtLoader.m */; }; - A72B594C151A16F800223DD0 /* CRunAccelerometer.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57DA151A16F800223DD0 /* CRunAccelerometer.m */; }; - A72B594D151A16F800223DD0 /* CRunActiveBackdrop.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57DC151A16F800223DD0 /* CRunActiveBackdrop.m */; }; - A72B594E151A16F800223DD0 /* CRunAdvDir.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57DE151A16F800223DD0 /* CRunAdvDir.m */; }; - A72B594F151A16F800223DD0 /* CRunAdvGameBoard.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57E0151A16F800223DD0 /* CRunAdvGameBoard.m */; }; - A72B5950151A16F800223DD0 /* CRunAdvPathMov.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57E2151A16F800223DD0 /* CRunAdvPathMov.m */; }; - A72B5951151A16F800223DD0 /* CRunCalcRect.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57E4151A16F800223DD0 /* CRunCalcRect.m */; }; - A72B5952151A16F800223DD0 /* CRunCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57E6151A16F800223DD0 /* CRunCamera.m */; }; - A72B5953151A16F800223DD0 /* CRunclickteam_movement_controller.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57E8151A16F800223DD0 /* CRunclickteam_movement_controller.m */; }; - A72B5954151A16F800223DD0 /* CRunCreateByName.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57EA151A16F800223DD0 /* CRunCreateByName.m */; }; - A72B5955151A16F800223DD0 /* CRunEasing.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57EC151A16F800223DD0 /* CRunEasing.m */; }; - A72B5956151A16F800223DD0 /* CRunExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57EE151A16F800223DD0 /* CRunExtension.m */; }; - A72B5957151A16F800223DD0 /* CRunForEach.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57F0151A16F800223DD0 /* CRunForEach.m */; }; - A72B5958151A16F800223DD0 /* CRunGameCenterAchievement.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57F2151A16F800223DD0 /* CRunGameCenterAchievement.m */; }; - A72B5959151A16F800223DD0 /* CRunGameCenterAchievements.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57F4151A16F800223DD0 /* CRunGameCenterAchievements.m */; }; - A72B595A151A16F800223DD0 /* CRunGameCenterConnect.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57F6151A16F800223DD0 /* CRunGameCenterConnect.m */; }; - A72B595B151A16F800223DD0 /* CRunGameCenterLeaderboard.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57F8151A16F800223DD0 /* CRunGameCenterLeaderboard.m */; }; - A72B595C151A16F800223DD0 /* CRunGameCenterMultiplayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57FA151A16F800223DD0 /* CRunGameCenterMultiplayer.m */; }; - A72B595D151A16F800223DD0 /* CRunGet.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57FC151A16F800223DD0 /* CRunGet.m */; }; - A72B595E151A16F800223DD0 /* CRunIIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B57FE151A16F800223DD0 /* CRunIIF.m */; }; - A72B595F151A16F800223DD0 /* CRunInAndOutController.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5800151A16F800223DD0 /* CRunInAndOutController.m */; }; - A72B5960151A16F800223DD0 /* CRuniOS.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5802151A16F800223DD0 /* CRuniOS.m */; }; - A72B5961151A16F800223DD0 /* CRuniOSButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5804151A16F800223DD0 /* CRuniOSButton.m */; }; - A72B5962151A16F800223DD0 /* CRuniOSMultipleEdit.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5806151A16F800223DD0 /* CRuniOSMultipleEdit.m */; }; - A72B5963151A16F800223DD0 /* CRuniOSSingleEdit.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5808151A16F800223DD0 /* CRuniOSSingleEdit.m */; }; - A72B5965151A16F800223DD0 /* CRuniOSStore.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B580B151A16F800223DD0 /* CRuniOSStore.m */; }; - A72B5966151A16F800223DD0 /* CRuniOSVideo.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B580D151A16F800223DD0 /* CRuniOSVideo.m */; }; - A72B5967151A16F800223DD0 /* CRunJoystickControl.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B580F151A16F800223DD0 /* CRunJoystickControl.m */; }; - A72B5968151A16F800223DD0 /* CRunKcArray.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5811151A16F800223DD0 /* CRunKcArray.m */; }; - A72B5969151A16F800223DD0 /* CRunKcBoxA.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5813151A16F800223DD0 /* CRunKcBoxA.m */; }; - A72B596A151A16F800223DD0 /* CRunKcBoxB.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5815151A16F800223DD0 /* CRunKcBoxB.m */; }; - A72B596B151A16F800223DD0 /* CRunkcbutton.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5817151A16F800223DD0 /* CRunkcbutton.m */; }; - A72B596C151A16F800223DD0 /* CRunkcclock.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5819151A16F800223DD0 /* CRunkcclock.m */; }; - A72B596D151A16F800223DD0 /* CRunkcdirect.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B581B151A16F800223DD0 /* CRunkcdirect.m */; }; - A72B596E151A16F800223DD0 /* CRunkcedit.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B581D151A16F800223DD0 /* CRunkcedit.m */; }; - A72B596F151A16F800223DD0 /* CRunkchisc.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B581F151A16F800223DD0 /* CRunkchisc.m */; }; - A72B5971151A16F800223DD0 /* CRunkcini.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5822151A16F800223DD0 /* CRunkcini.m */; }; - A72B5973151A16F800223DD0 /* CRunkcinput.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5825151A16F800223DD0 /* CRunkcinput.m */; }; - A72B5974151A16F800223DD0 /* CRunkclist.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5827151A16F800223DD0 /* CRunkclist.m */; }; - A72B5975151A16F800223DD0 /* CRunkcpica.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5829151A16F800223DD0 /* CRunkcpica.m */; }; - A72B5976151A16F800223DD0 /* CRunkcrandom.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B582B151A16F800223DD0 /* CRunkcrandom.m */; }; - A72B5978151A16F800223DD0 /* CRunkcwctrl.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B582F151A16F800223DD0 /* CRunkcwctrl.m */; }; - A72B5979151A16F800223DD0 /* CRunLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5831151A16F800223DD0 /* CRunLayer.m */; }; - A72B597A151A16F800223DD0 /* CRunLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5833151A16F800223DD0 /* CRunLocation.m */; }; - A72B597B151A16F800223DD0 /* CRunMobileUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5835151A16F800223DD0 /* CRunMobileUtilities.m */; }; - A72B597C151A16F800223DD0 /* CRunMoveIt.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5837151A16F800223DD0 /* CRunMoveIt.m */; }; - A72B597D151A16F800223DD0 /* CRunMoveSafely2.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5839151A16F800223DD0 /* CRunMoveSafely2.m */; }; - A72B597E151A16F800223DD0 /* CRunMTRandom.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B583B151A16F800223DD0 /* CRunMTRandom.m */; }; - A72B597F151A16F800223DD0 /* CRunMultipleTouch.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B583D151A16F800223DD0 /* CRunMultipleTouch.m */; }; - A72B5980151A16F800223DD0 /* CRunObjectMover.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B583F151A16F800223DD0 /* CRunObjectMover.m */; }; - A72B5981151A16F800223DD0 /* CRunparser.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5841151A16F800223DD0 /* CRunparser.m */; }; - A72B5982151A16F800223DD0 /* CRunPlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5843151A16F800223DD0 /* CRunPlatform.m */; }; - A72B5983151A16F800223DD0 /* CRunStringTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5845151A16F800223DD0 /* CRunStringTokenizer.m */; }; - A72B5984151A16F800223DD0 /* CRunWargameMap.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5847151A16F800223DD0 /* CRunWargameMap.m */; }; - A72B5985151A16F800223DD0 /* CLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B584A151A16F800223DD0 /* CLayer.m */; }; - A72B5986151A16F800223DD0 /* CLO.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B584C151A16F800223DD0 /* CLO.m */; }; - A72B5987151A16F800223DD0 /* CLOList.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B584E151A16F800223DD0 /* CLOList.m */; }; - A72B5988151A16F800223DD0 /* CMove.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5851151A16F800223DD0 /* CMove.m */; }; - A72B5989151A16F800223DD0 /* CMoveBall.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5853151A16F800223DD0 /* CMoveBall.m */; }; - A72B598A151A16F800223DD0 /* CMoveBullet.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5855151A16F800223DD0 /* CMoveBullet.m */; }; - A72B598B151A16F800223DD0 /* CMoveDef.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5857151A16F800223DD0 /* CMoveDef.m */; }; - A72B598C151A16F800223DD0 /* CMoveDefBall.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5859151A16F800223DD0 /* CMoveDefBall.m */; }; - A72B598D151A16F800223DD0 /* CMoveDefExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B585B151A16F800223DD0 /* CMoveDefExtension.m */; }; - A72B598E151A16F800223DD0 /* CMoveDefGeneric.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B585D151A16F800223DD0 /* CMoveDefGeneric.m */; }; - A72B598F151A16F800223DD0 /* CMoveDefList.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B585F151A16F800223DD0 /* CMoveDefList.m */; }; - A72B5990151A16F800223DD0 /* CMoveDefMouse.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5861151A16F800223DD0 /* CMoveDefMouse.m */; }; - A72B5991151A16F800223DD0 /* CMoveDefPath.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5863151A16F800223DD0 /* CMoveDefPath.m */; }; - A72B5992151A16F800223DD0 /* CMoveDefPlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5865151A16F800223DD0 /* CMoveDefPlatform.m */; }; - A72B5993151A16F800223DD0 /* CMoveDefRace.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5867151A16F800223DD0 /* CMoveDefRace.m */; }; - A72B5994151A16F800223DD0 /* CMoveDefStatic.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5869151A16F800223DD0 /* CMoveDefStatic.m */; }; - A72B5995151A16F800223DD0 /* CMoveDisappear.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B586B151A16F800223DD0 /* CMoveDisappear.m */; }; - A72B5996151A16F800223DD0 /* CMoveExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B586D151A16F800223DD0 /* CMoveExtension.m */; }; - A72B5997151A16F800223DD0 /* CMoveGeneric.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B586F151A16F800223DD0 /* CMoveGeneric.m */; }; - A72B5998151A16F800223DD0 /* CMoveMouse.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5871151A16F800223DD0 /* CMoveMouse.m */; }; - A72B5999151A16F800223DD0 /* CMovePath.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5873151A16F800223DD0 /* CMovePath.m */; }; - A72B599A151A16F800223DD0 /* CMovePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5875151A16F800223DD0 /* CMovePlatform.m */; }; - A72B599B151A16F800223DD0 /* CMoveRace.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5877151A16F800223DD0 /* CMoveRace.m */; }; - A72B599C151A16F800223DD0 /* CMoveStatic.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5879151A16F800223DD0 /* CMoveStatic.m */; }; - A72B599D151A16F800223DD0 /* CPathStep.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B587B151A16F800223DD0 /* CPathStep.m */; }; - A72B599E151A16F800223DD0 /* CRMvt.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B587D151A16F800223DD0 /* CRMvt.m */; }; - A72B599F151A16F800223DD0 /* CRunMvtclickteam_circular.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B587F151A16F800223DD0 /* CRunMvtclickteam_circular.m */; }; - A72B59A0151A16F800223DD0 /* CRunMvtclickteam_dragdrop.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5881151A16F800223DD0 /* CRunMvtclickteam_dragdrop.m */; }; - A72B59A1151A16F800223DD0 /* CRunMvtclickteam_invaders.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5883151A16F800223DD0 /* CRunMvtclickteam_invaders.m */; }; - A72B59A2151A16F800223DD0 /* CRunMvtclickteam_presentation.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5885151A16F800223DD0 /* CRunMvtclickteam_presentation.m */; }; - A72B59A3151A16F800223DD0 /* CRunMvtclickteam_regpolygon.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5887151A16F800223DD0 /* CRunMvtclickteam_regpolygon.m */; }; - A72B59A4151A16F800223DD0 /* CRunMvtclickteam_simple_ellipse.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5889151A16F800223DD0 /* CRunMvtclickteam_simple_ellipse.m */; }; - A72B59A5151A16F800223DD0 /* CRunMvtclickteam_sinewave.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B588B151A16F800223DD0 /* CRunMvtclickteam_sinewave.m */; }; - A72B59A6151A16F800223DD0 /* CRunMvtclickteam_vector.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B588D151A16F800223DD0 /* CRunMvtclickteam_vector.m */; }; - A72B59A7151A16F800223DD0 /* CRunMvtExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B588F151A16F800223DD0 /* CRunMvtExtension.m */; }; - A72B59A8151A16F800223DD0 /* CRunMvtinandout.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5891151A16F800223DD0 /* CRunMvtinandout.m */; }; - A72B59A9151A16F800223DD0 /* CRunMvtpinball.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5893151A16F800223DD0 /* CRunMvtpinball.m */; }; - A72B59AA151A16F800223DD0 /* CRunMvtspaceship.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5895151A16F800223DD0 /* CRunMvtspaceship.m */; }; - A72B59AB151A16F800223DD0 /* CActive.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5898151A16F800223DD0 /* CActive.m */; }; - A72B59AC151A16F800223DD0 /* CCCA.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B589A151A16F800223DD0 /* CCCA.m */; }; - A72B59AD151A16F800223DD0 /* CCounter.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B589C151A16F800223DD0 /* CCounter.m */; }; - A72B59AE151A16F800223DD0 /* CExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B589E151A16F800223DD0 /* CExtension.m */; }; - A72B59AF151A16F800223DD0 /* CLives.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58A0151A16F800223DD0 /* CLives.m */; }; - A72B59B0151A16F800223DD0 /* CObject.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58A2151A16F800223DD0 /* CObject.m */; }; - A72B59B1151A16F800223DD0 /* CQuestion.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58A4151A16F800223DD0 /* CQuestion.m */; }; - A72B59B2151A16F800223DD0 /* CRCom.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58A6151A16F800223DD0 /* CRCom.m */; }; - A72B59B3151A16F800223DD0 /* CScore.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58A8151A16F800223DD0 /* CScore.m */; }; - A72B59B4151A16F800223DD0 /* CText.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58AA151A16F800223DD0 /* CText.m */; }; - A72B59B5151A16F800223DD0 /* CDefCCA.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58AD151A16F800223DD0 /* CDefCCA.m */; }; - A72B59B6151A16F800223DD0 /* CDefCounter.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58AF151A16F800223DD0 /* CDefCounter.m */; }; - A72B59B7151A16F800223DD0 /* CDefCounters.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58B1151A16F800223DD0 /* CDefCounters.m */; }; - A72B59B8151A16F800223DD0 /* CDefObject.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58B3151A16F800223DD0 /* CDefObject.m */; }; - A72B59B9151A16F800223DD0 /* CDefText.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58B5151A16F800223DD0 /* CDefText.m */; }; - A72B59BA151A16F800223DD0 /* CDefTexts.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58B7151A16F800223DD0 /* CDefTexts.m */; }; - A72B59BB151A16F800223DD0 /* CObjectCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58B9151A16F800223DD0 /* CObjectCommon.m */; }; - A72B59BC151A16F800223DD0 /* COC.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58BB151A16F800223DD0 /* COC.m */; }; - A72B59BD151A16F800223DD0 /* COCBackground.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58BD151A16F800223DD0 /* COCBackground.m */; }; - A72B59BE151A16F800223DD0 /* COCQBackdrop.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58BF151A16F800223DD0 /* COCQBackdrop.m */; }; - A72B59BF151A16F800223DD0 /* COI.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58C1151A16F800223DD0 /* COI.m */; }; - A72B59C0151A16F800223DD0 /* COIList.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58C3151A16F800223DD0 /* COIList.m */; }; - A72B59C2151A16F800223DD0 /* CRenderToTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58C8151A16F800223DD0 /* CRenderToTexture.m */; }; - A72B59C3151A16F800223DD0 /* CShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A72B58CA151A16F800223DD0 /* CShader.cpp */; }; - A72B59C4151A16F800223DD0 /* CTextSurface.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58CC151A16F800223DD0 /* CTextSurface.m */; }; - A72B59C5151A16F800223DD0 /* CBackDraw.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58D0151A16F800223DD0 /* CBackDraw.m */; }; - A72B59C6151A16F800223DD0 /* CBackDrawCls.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58D2151A16F800223DD0 /* CBackDrawCls.m */; }; - A72B59C7151A16F800223DD0 /* CBackDrawClsZone.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58D4151A16F800223DD0 /* CBackDrawClsZone.m */; }; - A72B59C8151A16F800223DD0 /* CBackDrawPaste.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58D6151A16F800223DD0 /* CBackDrawPaste.m */; }; - A72B59C9151A16F800223DD0 /* CBkd2.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58D8151A16F800223DD0 /* CBkd2.m */; }; - A72B59CA151A16F800223DD0 /* CCreateObjectInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58DA151A16F800223DD0 /* CCreateObjectInfo.m */; }; - A72B59CB151A16F800223DD0 /* CExtStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58DC151A16F800223DD0 /* CExtStorage.m */; }; - A72B59CC151A16F800223DD0 /* CLoop.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58DE151A16F800223DD0 /* CLoop.m */; }; - A72B59CD151A16F800223DD0 /* CObjInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58E0151A16F800223DD0 /* CObjInfo.m */; }; - A72B59CE151A16F800223DD0 /* CRun.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58E2151A16F800223DD0 /* CRun.m */; }; - A72B59D0151A16F800223DD0 /* CSaveGlobal.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58E5151A16F800223DD0 /* CSaveGlobal.m */; }; - A72B59D1151A16F800223DD0 /* RuntimeIPhoneAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58E7151A16F800223DD0 /* RuntimeIPhoneAppDelegate.m */; }; - A72B59D2151A16F800223DD0 /* CArrayList.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58EA151A16F800223DD0 /* CArrayList.m */; }; - A72B59D3151A16F800223DD0 /* CBitmap.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58EC151A16F800223DD0 /* CBitmap.m */; }; - A72B59D4151A16F800223DD0 /* CChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58EE151A16F800223DD0 /* CChunk.m */; }; - A72B59D6151A16F800223DD0 /* CFile.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58F1151A16F800223DD0 /* CFile.m */; }; - A72B59D8151A16F800223DD0 /* CFontInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58F4151A16F800223DD0 /* CFontInfo.m */; }; - A72B59D9151A16F800223DD0 /* CIni.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58F6151A16F800223DD0 /* CIni.m */; }; - A72B59DB151A16F800223DD0 /* CoreMath.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58F9151A16F800223DD0 /* CoreMath.m */; }; - A72B59DC151A16F800223DD0 /* CRect.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58FC151A16F800223DD0 /* CRect.m */; }; - A72B59DD151A16F800223DD0 /* CServices.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B58FE151A16F800223DD0 /* CServices.m */; }; - A72B59DF151A16F800223DD0 /* ModalInput.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5902151A16F800223DD0 /* ModalInput.m */; }; - A72B59E0151A16F800223DD0 /* NSExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5904151A16F800223DD0 /* NSExtensions.m */; }; - A72B59E1151A16F800223DD0 /* ObjectSelection.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5906151A16F800223DD0 /* ObjectSelection.m */; }; - A72B59E2151A16F800223DD0 /* CColMask.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B590A151A16F800223DD0 /* CColMask.m */; }; - A72B59E3151A16F800223DD0 /* CMask.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B590C151A16F800223DD0 /* CMask.m */; }; - A72B59E4151A16F800223DD0 /* CPSCM.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B590E151A16F800223DD0 /* CPSCM.m */; }; - A72B59E5151A16F800223DD0 /* CRSpr.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5910151A16F800223DD0 /* CRSpr.m */; }; - A72B59E6151A16F800223DD0 /* CSprite.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5912151A16F800223DD0 /* CSprite.m */; }; - A72B59E7151A16F800223DD0 /* CSpriteGen.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5914151A16F800223DD0 /* CSpriteGen.m */; }; - A72B59E8151A16F800223DD0 /* CFadeSprite.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5918151A16F800223DD0 /* CFadeSprite.m */; }; - A72B59E9151A16F800223DD0 /* CTrans.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B591A151A16F800223DD0 /* CTrans.m */; }; - A72B59EA151A16F800223DD0 /* CTransitionData.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B591C151A16F800223DD0 /* CTransitionData.m */; }; - A72B59EB151A16F800223DD0 /* CTransitionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B591E151A16F800223DD0 /* CTransitionManager.m */; }; - A72B59EC151A16F800223DD0 /* CTransitions.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5920151A16F800223DD0 /* CTransitions.m */; }; - A72B59ED151A16F800223DD0 /* CTransitionscctrans.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5922151A16F800223DD0 /* CTransitionscctrans.m */; }; - A72B59EE151A16F800223DD0 /* CDefStrings.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5925151A16F800223DD0 /* CDefStrings.m */; }; - A72B59EF151A16F800223DD0 /* CDefValues.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5927151A16F800223DD0 /* CDefValues.m */; }; - A72B59F0151A16F800223DD0 /* CRVal.m in Sources */ = {isa = PBXBuildFile; fileRef = A72B5929151A16F800223DD0 /* CRVal.m */; }; - A73F000514B8EC4A001531D7 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A73F000414B8EC4A001531D7 /* MediaPlayer.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - A74B0243145D55510055BC9D /* fire1U.png in Resources */ = {isa = PBXBuildFile; fileRef = A74B0242145D55510055BC9D /* fire1U.png */; }; - A7701E04117A2BE800C1250B /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7701E03117A2BE800C1250B /* OpenGLES.framework */; }; - A7779374117CFB0D008DB05F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7779373117CFB0D008DB05F /* QuartzCore.framework */; }; - A784823713732F0700F97A7F /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A784823613732F0700F97A7F /* MobileCoreServices.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - A7B3248F1344DA9D00406621 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7B3248E1344DA9D00406621 /* OpenAL.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - A7B324A41344DB4300406621 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7B324A31344DB4300406621 /* AudioToolbox.framework */; settings = {ATTRIBUTES = (Required, ); }; }; - A7B643401547084500946D1E /* CRunInventory.m in Sources */ = {isa = PBXBuildFile; fileRef = A7B6433F154707E500946D1E /* CRunInventory.m */; }; - A7C915C515F7FD9200F5369B /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = A7C915C315F7FD5C00F5369B /* Reachability.m */; }; - A7DFA82315D94BEC00A64A22 /* CRunDeadReckoning.m in Sources */ = {isa = PBXBuildFile; fileRef = A7DFA82215D93F7100A64A22 /* CRunDeadReckoning.m */; }; - ED0CD2D02563261700157A87 /* AVKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED0CD2CF2563261700157A87 /* AVKit.framework */; }; - ED0CD2D32563268F00157A87 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A73F000214B8EC18001531D7 /* CoreMedia.framework */; }; - ED0CD6431DA5602D00D02BF0 /* GameKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED0CD6421DA5602D00D02BF0 /* GameKit.framework */; }; - ED0CD6451DA5603600D02BF0 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED0CD6441DA5603600D02BF0 /* StoreKit.framework */; }; - ED15A7F42247ED7900798304 /* sineoffset_ext.fsh in Resources */ = {isa = PBXBuildFile; fileRef = ED15A7F02247ED7900798304 /* sineoffset_ext.fsh */; }; - ED15A7F52247ED7900798304 /* sineoffset_ext.vsh in Resources */ = {isa = PBXBuildFile; fileRef = ED15A7F12247ED7900798304 /* sineoffset_ext.vsh */; }; - ED15A7F62247ED7900798304 /* sinewave_ext.vsh in Resources */ = {isa = PBXBuildFile; fileRef = ED15A7F22247ED7900798304 /* sinewave_ext.vsh */; }; - ED15A7F72247ED7900798304 /* sinewave_ext.fsh in Resources */ = {isa = PBXBuildFile; fileRef = ED15A7F32247ED7900798304 /* sinewave_ext.fsh */; }; - ED755F391F84451E0041BDC0 /* CRunAESFusion.m in Sources */ = {isa = PBXBuildFile; fileRef = ED755F381F84451E0041BDC0 /* CRunAESFusion.m */; }; - ED7BBCBE252E1CC50034E8A4 /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7BBCBD252E1CC50034E8A4 /* Photos.framework */; }; - ED7CFAFF222747F300979ACC /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7CFAFE222747F200979ACC /* UserNotifications.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - ED8B37B31F69C8D80080A3B8 /* CRunKcDbl.m in Sources */ = {isa = PBXBuildFile; fileRef = ED8B37B21F69C8D80080A3B8 /* CRunKcDbl.m */; }; - ED961E9B22166838008709D4 /* ic_question.png in Resources */ = {isa = PBXBuildFile; fileRef = ED961E9722166838008709D4 /* ic_question.png */; }; - ED961E9C22166838008709D4 /* ic_error.png in Resources */ = {isa = PBXBuildFile; fileRef = ED961E9822166838008709D4 /* ic_error.png */; }; - ED961E9D22166838008709D4 /* ic_exclamation.png in Resources */ = {isa = PBXBuildFile; fileRef = ED961E9922166838008709D4 /* ic_exclamation.png */; }; - ED961E9E22166838008709D4 /* ic_information.png in Resources */ = {isa = PBXBuildFile; fileRef = ED961E9A22166838008709D4 /* ic_information.png */; }; - EDE1CF3121B1B5D10094F4F2 /* panorama_ext.fsh in Resources */ = {isa = PBXBuildFile; fileRef = EDE1CF2D21B1B5D00094F4F2 /* panorama_ext.fsh */; }; - EDE1CF3221B1B5D10094F4F2 /* perspective_ext.fsh in Resources */ = {isa = PBXBuildFile; fileRef = EDE1CF2E21B1B5D00094F4F2 /* perspective_ext.fsh */; }; - EDE1CF3321B1B5D10094F4F2 /* panorama_ext.vsh in Resources */ = {isa = PBXBuildFile; fileRef = EDE1CF2F21B1B5D00094F4F2 /* panorama_ext.vsh */; }; - EDE1CF3421B1B5D10094F4F2 /* perspective_ext.vsh in Resources */ = {isa = PBXBuildFile; fileRef = EDE1CF3021B1B5D10094F4F2 /* perspective_ext.vsh */; }; - EDE55AF71D2D490500B5AA42 /* CRunWebView2.m in Sources */ = {isa = PBXBuildFile; fileRef = EDE55AF61D2D490500B5AA42 /* CRunWebView2.m */; }; - EDE55B721D2D501300B5AA42 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = EDE55B711D2D501300B5AA42 /* libz.tbd */; }; -/* End PBXBuildFile section */ - -/* Begin PBXBuildRule section */ - 81B13D8D27EB895400AF5BF4 /* PBXBuildRule */ = { - isa = PBXBuildRule; - compilerSpec = com.apple.compilers.proxy.script; - fileType = sourcecode.metal; - inputFiles = ( - ); - isEditable = 1; - outputFiles = ( - ); - script = "# metal\n"; - }; - 81B13D8E27EB896600AF5BF4 /* PBXBuildRule */ = { - isa = PBXBuildRule; - compilerSpec = com.apple.compilers.proxy.script; - fileType = sourcecode.metal; - inputFiles = ( - ); - isEditable = 1; - outputFiles = ( - ); - script = "# metal\n"; - }; -/* End PBXBuildRule section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 8B0D3107183661E5005202BD /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 043EC9DA23548328007001F0 /* joydown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joydown.png; path = Resources/joydown.png; sourceTree = ""; }; - 043EC9DC23548333007001F0 /* joydownd.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joydownd.png; path = Resources/joydownd.png; sourceTree = ""; }; - 043EC9DE23548351007001F0 /* joyup.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joyup.png; path = Resources/joyup.png; sourceTree = ""; }; - 043EC9DF23548351007001F0 /* joyrightd.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joyrightd.png; path = Resources/joyrightd.png; sourceTree = ""; }; - 043EC9E023548351007001F0 /* joyleftd.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joyleftd.png; path = Resources/joyleftd.png; sourceTree = ""; }; - 043EC9E123548351007001F0 /* joyupd.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joyupd.png; path = Resources/joyupd.png; sourceTree = ""; }; - 043EC9E223548351007001F0 /* joyleft.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joyleft.png; path = Resources/joyleft.png; sourceTree = ""; }; - 043EC9E323548351007001F0 /* joyright.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joyright.png; path = Resources/joyright.png; sourceTree = ""; }; - 04578520238D67A5004156D9 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - 0F58615815E26882007126FA /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; }; - 0F751AD812BE0DDA002D72FB /* iAd.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iAd.framework; path = System/Library/Frameworks/iAd.framework; sourceTree = SDKROOT; }; - 0F7AAA9B115E53090051E240 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 0F7EE90B1834BB4000DCECFF /* CBox2D.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CBox2D.h; sourceTree = ""; }; - 0F7EE90C1834C33A00DCECFF /* CBox2D.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CBox2D.m; sourceTree = ""; }; - 0F801998182BD92400C543EE /* CRunMvtbox2d8directions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtbox2d8directions.h; sourceTree = ""; }; - 0F801999182BD92400C543EE /* CRunMvtbox2d8directions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtbox2d8directions.m; sourceTree = ""; }; - 0F80199B182BF60C00C543EE /* CRunMvtbox2daxial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtbox2daxial.h; sourceTree = ""; }; - 0F80199C182BF60D00C543EE /* CRunMvtbox2daxial.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtbox2daxial.m; sourceTree = ""; }; - 0F8029D4182CBC6500F3854F /* CRunMvtbox2dbackground.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtbox2dbackground.h; sourceTree = ""; }; - 0F8029D5182CBC6500F3854F /* CRunMvtbox2dbackground.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtbox2dbackground.m; sourceTree = ""; }; - 0F8029D7182CC1C200F3854F /* CRunMvtbox2dbouncingball.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtbox2dbouncingball.h; sourceTree = ""; }; - 0F8029D8182CC1C200F3854F /* CRunMvtbox2dbouncingball.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtbox2dbouncingball.m; sourceTree = ""; }; - 0F8029DA182CC71B00F3854F /* CRunMvtbox2dplatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtbox2dplatform.h; sourceTree = ""; }; - 0F8029DB182CC71B00F3854F /* CRunMvtbox2dplatform.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtbox2dplatform.m; sourceTree = ""; }; - 0F80619B1828CBC100040161 /* CRunBox2DBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunBox2DBase.h; sourceTree = ""; }; - 0F80619C1828CBC100040161 /* CRunBox2DBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunBox2DBase.m; sourceTree = ""; }; - 0F80F85D1833610E00A5D127 /* CRunMvtbox2dracecar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtbox2dracecar.h; sourceTree = ""; }; - 0F80F85E1833610E00A5D127 /* CRunMvtbox2dracecar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtbox2dracecar.m; sourceTree = ""; }; - 0F80F8601833673600A5D127 /* CRunMvtbox2dspaceship.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtbox2dspaceship.h; sourceTree = ""; }; - 0F80F8611833673600A5D127 /* CRunMvtbox2dspaceship.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtbox2dspaceship.m; sourceTree = ""; }; - 0F80F863183384EF00A5D127 /* CRunMvtbox2dspring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtbox2dspring.h; sourceTree = ""; }; - 0F80F864183384F000A5D127 /* CRunMvtbox2dspring.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtbox2dspring.m; sourceTree = ""; }; - 0F80F86618338A2000A5D127 /* CRunMvtbox2dstatic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtbox2dstatic.h; sourceTree = ""; }; - 0F80F86718338A2000A5D127 /* CRunMvtbox2dstatic.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtbox2dstatic.m; sourceTree = ""; }; - 0F80F8691833ABA800A5D127 /* CRunBox2DFan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunBox2DFan.h; sourceTree = ""; }; - 0F80F86A1833ABA800A5D127 /* CRunBox2DFan.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunBox2DFan.m; sourceTree = ""; }; - 0F80F86C1833B69C00A5D127 /* CRunBox2DMagnet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunBox2DMagnet.h; sourceTree = ""; }; - 0F80F86D1833B69C00A5D127 /* CRunBox2DMagnet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunBox2DMagnet.m; sourceTree = ""; }; - 0F80F86F1833C05100A5D127 /* CRunBox2DTreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunBox2DTreadmill.h; sourceTree = ""; }; - 0F80F8701833C05100A5D127 /* CRunBox2DTreadmill.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunBox2DTreadmill.m; sourceTree = ""; }; - 0F80F8721833C5EF00A5D127 /* CRunBox2DParticules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunBox2DParticules.h; sourceTree = ""; }; - 0F80F8731833C5EF00A5D127 /* CRunBox2DParticules.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunBox2DParticules.m; sourceTree = ""; }; - 0F80F8751833DC7400A5D127 /* CRunBox2DRopeAndChain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunBox2DRopeAndChain.h; sourceTree = ""; }; - 0F80F8761833DC7500A5D127 /* CRunBox2DRopeAndChain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunBox2DRopeAndChain.m; sourceTree = ""; }; - 0F80F8781833ECDE00A5D127 /* CRunBox2DGround.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunBox2DGround.h; sourceTree = ""; }; - 0F80F8791833ECDE00A5D127 /* CRunBox2DGround.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunBox2DGround.m; sourceTree = ""; }; - 0F812EB2122F9D160032040B /* ITunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ITunesArtwork.png; path = Resources/ITunesArtwork.png; sourceTree = ""; }; - 0F8380DC1844A2BA00DEED30 /* CRunBox2DJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunBox2DJoint.h; sourceTree = ""; }; - 0F8380DD1844A2BA00DEED30 /* CRunBox2DJoint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunBox2DJoint.m; sourceTree = ""; }; - 0FAF526416133ED60039137E /* CRunFlocking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunFlocking.h; sourceTree = ""; }; - 0FAF526516133ED60039137E /* CRunFlocking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunFlocking.m; sourceTree = ""; }; - 0FAF526716133F570039137E /* CPoint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPoint.m; sourceTree = ""; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D6058910D05DD3D006BFB54 /* SDK.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SDK.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 32CA4F630368D1EE00C91783 /* SDK_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDK_Prefix.pch; sourceTree = ""; }; - 3DA0F3A719FE38140080FDC5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = SDK/Images.xcassets; sourceTree = ""; }; - 8103571A27EFE941000AD374 /* CRunFindTheWay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunFindTheWay.h; sourceTree = ""; }; - 8103571B27EFE941000AD374 /* CRunFindTheWay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunFindTheWay.m; sourceTree = ""; }; - 81B13D8F27EC884000AF5BF4 /* CRunTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CRunTemplate.h; sourceTree = ""; }; - 81B13D9027EC884000AF5BF4 /* CRunTemplate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CRunTemplate.m; sourceTree = ""; }; - 8B0D30FC183661D0005202BD /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Box2D.h; path = Classes/Box2D/Box2D.h; sourceTree = ""; }; - 8B0D3109183661E5005202BD /* libBox2D.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBox2D.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 8B0D312E18366234005202BD /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = ""; }; - 8B0D312F18366234005202BD /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = ""; }; - 8B0D313018366234005202BD /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = ""; }; - 8B0D313118366234005202BD /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideEdge.cpp; sourceTree = ""; }; - 8B0D313218366234005202BD /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = ""; }; - 8B0D313318366234005202BD /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = ""; }; - 8B0D313418366234005202BD /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = ""; }; - 8B0D313518366234005202BD /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = ""; }; - 8B0D313618366234005202BD /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = ""; }; - 8B0D313718366234005202BD /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = ""; }; - 8B0D313818366234005202BD /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = ""; }; - 8B0D313918366234005202BD /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = ""; }; - 8B0D313A18366234005202BD /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = ""; }; - 8B0D313C18366234005202BD /* b2ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainShape.cpp; sourceTree = ""; }; - 8B0D313D18366234005202BD /* b2ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainShape.h; sourceTree = ""; }; - 8B0D313E18366234005202BD /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = ""; }; - 8B0D313F18366234005202BD /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = ""; }; - 8B0D314018366234005202BD /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = ""; }; - 8B0D314118366234005202BD /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeShape.h; sourceTree = ""; }; - 8B0D314218366234005202BD /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = ""; }; - 8B0D314318366234005202BD /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = ""; }; - 8B0D314418366234005202BD /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = ""; }; - 8B0D314618366234005202BD /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = ""; }; - 8B0D314718366234005202BD /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = ""; }; - 8B0D314818366234005202BD /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Draw.cpp; sourceTree = ""; }; - 8B0D314918366234005202BD /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Draw.h; sourceTree = ""; }; - 8B0D314A18366234005202BD /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GrowableStack.h; sourceTree = ""; }; - 8B0D314B18366234005202BD /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = ""; }; - 8B0D314C18366234005202BD /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = ""; }; - 8B0D314D18366234005202BD /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = ""; }; - 8B0D314E18366234005202BD /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = ""; }; - 8B0D314F18366234005202BD /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = ""; }; - 8B0D315018366234005202BD /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = ""; }; - 8B0D315118366234005202BD /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Timer.cpp; sourceTree = ""; }; - 8B0D315218366234005202BD /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Timer.h; sourceTree = ""; }; - 8B0D315418366234005202BD /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = ""; }; - 8B0D315518366234005202BD /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = ""; }; - 8B0D315618366234005202BD /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = ""; }; - 8B0D315718366234005202BD /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = ""; }; - 8B0D315818366234005202BD /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = ""; }; - 8B0D315918366234005202BD /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = ""; }; - 8B0D315A18366234005202BD /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = ""; }; - 8B0D315B18366234005202BD /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = ""; }; - 8B0D315C18366234005202BD /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = ""; }; - 8B0D315D18366234005202BD /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = ""; }; - 8B0D315E18366234005202BD /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = ""; }; - 8B0D315F18366234005202BD /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = ""; }; - 8B0D316018366234005202BD /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = ""; }; - 8B0D316218366234005202BD /* b2ChainAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndCircleContact.cpp; sourceTree = ""; }; - 8B0D316318366234005202BD /* b2ChainAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndCircleContact.h; sourceTree = ""; }; - 8B0D316418366234005202BD /* b2ChainAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndPolygonContact.cpp; sourceTree = ""; }; - 8B0D316518366234005202BD /* b2ChainAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndPolygonContact.h; sourceTree = ""; }; - 8B0D316618366234005202BD /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = ""; }; - 8B0D316718366234005202BD /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = ""; }; - 8B0D316818366234005202BD /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = ""; }; - 8B0D316918366234005202BD /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = ""; }; - 8B0D316A18366234005202BD /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = ""; }; - 8B0D316B18366234005202BD /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = ""; }; - 8B0D316C18366234005202BD /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = ""; }; - 8B0D316D18366234005202BD /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = ""; }; - 8B0D316E18366234005202BD /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = ""; }; - 8B0D316F18366234005202BD /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndPolygonContact.h; sourceTree = ""; }; - 8B0D317018366234005202BD /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = ""; }; - 8B0D317118366234005202BD /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = ""; }; - 8B0D317218366234005202BD /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = ""; }; - 8B0D317318366234005202BD /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = ""; }; - 8B0D317518366234005202BD /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; - 8B0D317618366234005202BD /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; - 8B0D317718366234005202BD /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = ""; }; - 8B0D317818366234005202BD /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = ""; }; - 8B0D317918366234005202BD /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = ""; }; - 8B0D317A18366234005202BD /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; - 8B0D317B18366234005202BD /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; - 8B0D317C18366234005202BD /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; - 8B0D317D18366234005202BD /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; - 8B0D317E18366234005202BD /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; - 8B0D317F18366234005202BD /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; - 8B0D318018366234005202BD /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = ""; }; - 8B0D318118366234005202BD /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = ""; }; - 8B0D318218366234005202BD /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = ""; }; - 8B0D318318366234005202BD /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = ""; }; - 8B0D318418366234005202BD /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = ""; }; - 8B0D318518366234005202BD /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RopeJoint.cpp; sourceTree = ""; }; - 8B0D318618366234005202BD /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RopeJoint.h; sourceTree = ""; }; - 8B0D318718366234005202BD /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = ""; }; - 8B0D318818366234005202BD /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = ""; }; - 8B0D318918366234005202BD /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WheelJoint.cpp; sourceTree = ""; }; - 8B0D318A18366234005202BD /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = ""; }; - 8B0D318C18366234005202BD /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = ""; }; - 8B0D318D18366234005202BD /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = ""; }; - 8B189F7F17F72DA500C3DC8A /* CTexture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTexture.h; sourceTree = ""; }; - 8B189F8017F72DA500C3DC8A /* CTexture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTexture.m; sourceTree = ""; }; - 8B2AE65F18FEAEE700642A27 /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; - 8B2D764B17EB235D00599FBE /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; - 8B2D764D17EB363E00599FBE /* CRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CRenderer.cpp; sourceTree = ""; }; - 8B2D764E17EB363E00599FBE /* CRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRenderer.h; sourceTree = ""; }; - 8B5CD3751B336348008478B7 /* CRunStencilMask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunStencilMask.m; sourceTree = ""; }; - 8B5CD3771B338F85008478B7 /* CRunStencilMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunStencilMask.h; sourceTree = ""; }; - 8BBA59CD18058211002222A0 /* CRunScreenZoom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunScreenZoom.h; sourceTree = ""; }; - 8BBA59CE18058211002222A0 /* CRunScreenZoom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunScreenZoom.m; sourceTree = ""; }; - 8BDA0073180EEB6B00E583E2 /* Array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Array.h; sourceTree = ""; }; - 8BDA7B87190BC31F0023BD01 /* CJoystickGamePad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJoystickGamePad.h; sourceTree = ""; }; - 8BDA7B88190BC31F0023BD01 /* CJoystickGamePad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJoystickGamePad.m; sourceTree = ""; }; - 8BDA7B90191101F30023BD01 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; }; - 8D1107310486CEB800E47090 /* SDK-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "SDK-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - A70E3F74120AFB0E005AC44F /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - A70E402F120B14FD005AC44F /* fire1D.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fire1D.png; path = Resources/fire1D.png; sourceTree = ""; }; - A70E4031120B14FD005AC44F /* fire2D.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fire2D.png; path = Resources/fire2D.png; sourceTree = ""; }; - A70E4032120B14FD005AC44F /* fire2U.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fire2U.png; path = Resources/fire2U.png; sourceTree = ""; }; - A70E4034120B14FD005AC44F /* joyback.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joyback.png; path = Resources/joyback.png; sourceTree = ""; }; - A70E4035120B14FD005AC44F /* joyfront.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joyfront.png; path = Resources/joyfront.png; sourceTree = ""; }; - A70E403F120B1519005AC44F /* default.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = default.fsh; path = Resources/Shaders/default.fsh; sourceTree = ""; }; - A70E4040120B1519005AC44F /* default.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = default.vsh; path = Resources/Shaders/default.vsh; sourceTree = ""; }; - A70E4043120B1519005AC44F /* gradient.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = gradient.fsh; path = Resources/Shaders/gradient.fsh; sourceTree = ""; }; - A70E4044120B1519005AC44F /* gradient.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = gradient.vsh; path = Resources/Shaders/gradient.vsh; sourceTree = ""; }; - A7136798139D3C550082293B /* Application.cci */ = {isa = PBXFileReference; lastKnownFileType = file; path = Application.cci; sourceTree = ""; }; - A72B1D4E13C1E08600B167CF /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; - A72B578D151A16F700223DD0 /* CAnim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAnim.h; sourceTree = ""; }; - A72B578E151A16F700223DD0 /* CAnim.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAnim.m; sourceTree = ""; }; - A72B578F151A16F700223DD0 /* CAnimDir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAnimDir.h; sourceTree = ""; }; - A72B5790151A16F700223DD0 /* CAnimDir.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAnimDir.m; sourceTree = ""; }; - A72B5791151A16F700223DD0 /* CAnimHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAnimHeader.h; sourceTree = ""; }; - A72B5792151A16F700223DD0 /* CAnimHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAnimHeader.m; sourceTree = ""; }; - A72B5793151A16F700223DD0 /* CRAni.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRAni.h; sourceTree = ""; }; - A72B5794151A16F700223DD0 /* CRAni.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRAni.m; sourceTree = ""; }; - A72B5796151A16F700223DD0 /* CALPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CALPlayer.h; sourceTree = ""; }; - A72B5797151A16F700223DD0 /* CALPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CALPlayer.m; sourceTree = ""; }; - A72B5798151A16F700223DD0 /* CEmbeddedFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEmbeddedFile.h; sourceTree = ""; }; - A72B5799151A16F700223DD0 /* CEmbeddedFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEmbeddedFile.m; sourceTree = ""; }; - A72B579C151A16F700223DD0 /* CJoystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJoystick.h; sourceTree = ""; }; - A72B579D151A16F700223DD0 /* CJoystick.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJoystick.m; sourceTree = ""; }; - A72B579E151A16F700223DD0 /* CJoystickAcc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJoystickAcc.h; sourceTree = ""; }; - A72B579F151A16F700223DD0 /* CJoystickAcc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJoystickAcc.m; sourceTree = ""; }; - A72B57A0151A16F700223DD0 /* CMusicPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMusicPlayer.h; sourceTree = ""; }; - A72B57A1151A16F700223DD0 /* CRunApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunApp.h; sourceTree = ""; }; - A72B57A2151A16F700223DD0 /* CRunApp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunApp.m; sourceTree = ""; }; - A72B57A3151A16F700223DD0 /* CRunFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunFrame.h; sourceTree = ""; }; - A72B57A4151A16F700223DD0 /* CRunFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunFrame.m; sourceTree = ""; }; - A72B57A5151A16F700223DD0 /* CRunView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunView.h; sourceTree = ""; }; - A72B57A6151A16F700223DD0 /* CRunView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunView.m; sourceTree = ""; }; - A72B57A7151A16F700223DD0 /* CRunViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunViewController.h; sourceTree = ""; }; - A72B57A8151A16F700223DD0 /* CRunViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunViewController.m; sourceTree = ""; }; - A72B57A9151A16F700223DD0 /* CSoundPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSoundPlayer.h; sourceTree = ""; }; - A72B57AA151A16F700223DD0 /* CSoundPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSoundPlayer.m; sourceTree = ""; }; - A72B57AB151A16F700223DD0 /* CSysEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSysEvent.h; sourceTree = ""; }; - A72B57AC151A16F700223DD0 /* CSysEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSysEvent.m; sourceTree = ""; }; - A72B57AD151A16F700223DD0 /* CSysEventClick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSysEventClick.h; sourceTree = ""; }; - A72B57AE151A16F700223DD0 /* CSysEventClick.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSysEventClick.m; sourceTree = ""; }; - A72B57AF151A16F700223DD0 /* ITouches.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ITouches.h; sourceTree = ""; }; - A72B57B0151A16F700223DD0 /* MainView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainView.h; sourceTree = ""; }; - A72B57B1151A16F700223DD0 /* MainView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainView.m; sourceTree = ""; }; - A72B57B2151A16F700223DD0 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = ""; }; - A72B57B3151A16F700223DD0 /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = ""; }; - A72B57B5151A16F700223DD0 /* CFont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFont.h; sourceTree = ""; }; - A72B57B6151A16F700223DD0 /* CFont.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CFont.m; sourceTree = ""; }; - A72B57B7151A16F700223DD0 /* CFontBank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFontBank.h; sourceTree = ""; }; - A72B57B8151A16F700223DD0 /* CFontBank.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CFontBank.m; sourceTree = ""; }; - A72B57B9151A16F700223DD0 /* CImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CImage.h; sourceTree = ""; }; - A72B57BA151A16F700223DD0 /* CImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CImage.m; sourceTree = ""; }; - A72B57BB151A16F700223DD0 /* CImageBank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CImageBank.h; sourceTree = ""; }; - A72B57BC151A16F700223DD0 /* CImageBank.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CImageBank.m; sourceTree = ""; }; - A72B57BD151A16F700223DD0 /* CSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSound.h; sourceTree = ""; }; - A72B57BE151A16F700223DD0 /* CSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSound.m; sourceTree = ""; }; - A72B57BF151A16F700223DD0 /* CSoundBank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSoundBank.h; sourceTree = ""; }; - A72B57C0151A16F700223DD0 /* CSoundBank.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSoundBank.m; sourceTree = ""; }; - A72B57C1151A16F700223DD0 /* IEnum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IEnum.h; sourceTree = ""; }; - A72B57C3151A16F700223DD0 /* CEventProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEventProgram.h; sourceTree = ""; }; - A72B57C4151A16F700223DD0 /* CEventProgram.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEventProgram.m; sourceTree = ""; }; - A72B57C5151A16F700223DD0 /* CEvents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEvents.h; sourceTree = ""; }; - A72B57C6151A16F700223DD0 /* CEvents.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEvents.m; sourceTree = ""; }; - A72B57C8151A16F800223DD0 /* CLoadQualifiers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLoadQualifiers.h; sourceTree = ""; }; - A72B57C9151A16F800223DD0 /* CLoadQualifiers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLoadQualifiers.m; sourceTree = ""; }; - A72B57CA151A16F800223DD0 /* Cncf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cncf.h; sourceTree = ""; }; - A72B57CB151A16F800223DD0 /* CQualToOiList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CQualToOiList.h; sourceTree = ""; }; - A72B57CC151A16F800223DD0 /* CQualToOiList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CQualToOiList.m; sourceTree = ""; }; - A72B57CE151A16F800223DD0 /* CValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CValue.h; sourceTree = ""; }; - A72B57CF151A16F800223DD0 /* CValue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CValue.m; sourceTree = ""; }; - A72B57D1151A16F800223DD0 /* CActExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CActExtension.h; sourceTree = ""; }; - A72B57D2151A16F800223DD0 /* CActExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CActExtension.m; sourceTree = ""; }; - A72B57D3151A16F800223DD0 /* CCndExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCndExtension.h; sourceTree = ""; }; - A72B57D4151A16F800223DD0 /* CCndExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCndExtension.m; sourceTree = ""; }; - A72B57D5151A16F800223DD0 /* CExtLoad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CExtLoad.h; sourceTree = ""; }; - A72B57D6151A16F800223DD0 /* CExtLoad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CExtLoad.m; sourceTree = ""; }; - A72B57D7151A16F800223DD0 /* CExtLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CExtLoader.h; sourceTree = ""; }; - A72B57D8151A16F800223DD0 /* CExtLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CExtLoader.m; sourceTree = ""; }; - A72B57D9151A16F800223DD0 /* CRunAccelerometer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunAccelerometer.h; sourceTree = ""; }; - A72B57DA151A16F800223DD0 /* CRunAccelerometer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunAccelerometer.m; sourceTree = ""; }; - A72B57DB151A16F800223DD0 /* CRunActiveBackdrop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunActiveBackdrop.h; sourceTree = ""; }; - A72B57DC151A16F800223DD0 /* CRunActiveBackdrop.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunActiveBackdrop.m; sourceTree = ""; }; - A72B57DD151A16F800223DD0 /* CRunAdvDir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunAdvDir.h; sourceTree = ""; }; - A72B57DE151A16F800223DD0 /* CRunAdvDir.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunAdvDir.m; sourceTree = ""; }; - A72B57DF151A16F800223DD0 /* CRunAdvGameBoard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunAdvGameBoard.h; sourceTree = ""; }; - A72B57E0151A16F800223DD0 /* CRunAdvGameBoard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunAdvGameBoard.m; sourceTree = ""; }; - A72B57E1151A16F800223DD0 /* CRunAdvPathMov.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunAdvPathMov.h; sourceTree = ""; }; - A72B57E2151A16F800223DD0 /* CRunAdvPathMov.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunAdvPathMov.m; sourceTree = ""; }; - A72B57E3151A16F800223DD0 /* CRunCalcRect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunCalcRect.h; sourceTree = ""; }; - A72B57E4151A16F800223DD0 /* CRunCalcRect.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunCalcRect.m; sourceTree = ""; }; - A72B57E5151A16F800223DD0 /* CRunCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunCamera.h; sourceTree = ""; }; - A72B57E6151A16F800223DD0 /* CRunCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunCamera.m; sourceTree = ""; }; - A72B57E7151A16F800223DD0 /* CRunclickteam_movement_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunclickteam_movement_controller.h; sourceTree = ""; }; - A72B57E8151A16F800223DD0 /* CRunclickteam_movement_controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunclickteam_movement_controller.m; sourceTree = ""; }; - A72B57E9151A16F800223DD0 /* CRunCreateByName.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunCreateByName.h; sourceTree = ""; }; - A72B57EA151A16F800223DD0 /* CRunCreateByName.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunCreateByName.m; sourceTree = ""; }; - A72B57EB151A16F800223DD0 /* CRunEasing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunEasing.h; sourceTree = ""; }; - A72B57EC151A16F800223DD0 /* CRunEasing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunEasing.m; sourceTree = ""; }; - A72B57ED151A16F800223DD0 /* CRunExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunExtension.h; sourceTree = ""; }; - A72B57EE151A16F800223DD0 /* CRunExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunExtension.m; sourceTree = ""; }; - A72B57EF151A16F800223DD0 /* CRunForEach.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunForEach.h; sourceTree = ""; }; - A72B57F0151A16F800223DD0 /* CRunForEach.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunForEach.m; sourceTree = ""; }; - A72B57F1151A16F800223DD0 /* CRunGameCenterAchievement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunGameCenterAchievement.h; sourceTree = ""; }; - A72B57F2151A16F800223DD0 /* CRunGameCenterAchievement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunGameCenterAchievement.m; sourceTree = ""; }; - A72B57F3151A16F800223DD0 /* CRunGameCenterAchievements.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunGameCenterAchievements.h; sourceTree = ""; }; - A72B57F4151A16F800223DD0 /* CRunGameCenterAchievements.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunGameCenterAchievements.m; sourceTree = ""; }; - A72B57F5151A16F800223DD0 /* CRunGameCenterConnect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunGameCenterConnect.h; sourceTree = ""; }; - A72B57F6151A16F800223DD0 /* CRunGameCenterConnect.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunGameCenterConnect.m; sourceTree = ""; }; - A72B57F7151A16F800223DD0 /* CRunGameCenterLeaderboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunGameCenterLeaderboard.h; sourceTree = ""; }; - A72B57F8151A16F800223DD0 /* CRunGameCenterLeaderboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunGameCenterLeaderboard.m; sourceTree = ""; }; - A72B57F9151A16F800223DD0 /* CRunGameCenterMultiplayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunGameCenterMultiplayer.h; sourceTree = ""; }; - A72B57FA151A16F800223DD0 /* CRunGameCenterMultiplayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunGameCenterMultiplayer.m; sourceTree = ""; }; - A72B57FB151A16F800223DD0 /* CRunGet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunGet.h; sourceTree = ""; }; - A72B57FC151A16F800223DD0 /* CRunGet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunGet.m; sourceTree = ""; }; - A72B57FD151A16F800223DD0 /* CRunIIF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunIIF.h; sourceTree = ""; }; - A72B57FE151A16F800223DD0 /* CRunIIF.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunIIF.m; sourceTree = ""; }; - A72B57FF151A16F800223DD0 /* CRunInAndOutController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunInAndOutController.h; sourceTree = ""; }; - A72B5800151A16F800223DD0 /* CRunInAndOutController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunInAndOutController.m; sourceTree = ""; }; - A72B5801151A16F800223DD0 /* CRuniOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRuniOS.h; sourceTree = ""; }; - A72B5802151A16F800223DD0 /* CRuniOS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRuniOS.m; sourceTree = ""; }; - A72B5803151A16F800223DD0 /* CRuniOSButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRuniOSButton.h; sourceTree = ""; }; - A72B5804151A16F800223DD0 /* CRuniOSButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRuniOSButton.m; sourceTree = ""; }; - A72B5805151A16F800223DD0 /* CRuniOSMultipleEdit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRuniOSMultipleEdit.h; sourceTree = ""; }; - A72B5806151A16F800223DD0 /* CRuniOSMultipleEdit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRuniOSMultipleEdit.m; sourceTree = ""; }; - A72B5807151A16F800223DD0 /* CRuniOSSingleEdit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRuniOSSingleEdit.h; sourceTree = ""; }; - A72B5808151A16F800223DD0 /* CRuniOSSingleEdit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRuniOSSingleEdit.m; sourceTree = ""; }; - A72B580A151A16F800223DD0 /* CRuniOSStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRuniOSStore.h; sourceTree = ""; }; - A72B580B151A16F800223DD0 /* CRuniOSStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRuniOSStore.m; sourceTree = ""; }; - A72B580C151A16F800223DD0 /* CRuniOSVideo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRuniOSVideo.h; sourceTree = ""; }; - A72B580D151A16F800223DD0 /* CRuniOSVideo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRuniOSVideo.m; sourceTree = ""; }; - A72B580E151A16F800223DD0 /* CRunJoystickControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunJoystickControl.h; sourceTree = ""; }; - A72B580F151A16F800223DD0 /* CRunJoystickControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunJoystickControl.m; sourceTree = ""; }; - A72B5810151A16F800223DD0 /* CRunKcArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunKcArray.h; sourceTree = ""; }; - A72B5811151A16F800223DD0 /* CRunKcArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunKcArray.m; sourceTree = ""; }; - A72B5812151A16F800223DD0 /* CRunKcBoxA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunKcBoxA.h; sourceTree = ""; }; - A72B5813151A16F800223DD0 /* CRunKcBoxA.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunKcBoxA.m; sourceTree = ""; }; - A72B5814151A16F800223DD0 /* CRunKcBoxB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunKcBoxB.h; sourceTree = ""; }; - A72B5815151A16F800223DD0 /* CRunKcBoxB.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunKcBoxB.m; sourceTree = ""; }; - A72B5816151A16F800223DD0 /* CRunkcbutton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkcbutton.h; sourceTree = ""; }; - A72B5817151A16F800223DD0 /* CRunkcbutton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkcbutton.m; sourceTree = ""; }; - A72B5818151A16F800223DD0 /* CRunkcclock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkcclock.h; sourceTree = ""; }; - A72B5819151A16F800223DD0 /* CRunkcclock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkcclock.m; sourceTree = ""; }; - A72B581A151A16F800223DD0 /* CRunkcdirect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkcdirect.h; sourceTree = ""; }; - A72B581B151A16F800223DD0 /* CRunkcdirect.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkcdirect.m; sourceTree = ""; }; - A72B581C151A16F800223DD0 /* CRunkcedit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkcedit.h; sourceTree = ""; }; - A72B581D151A16F800223DD0 /* CRunkcedit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkcedit.m; sourceTree = ""; }; - A72B581E151A16F800223DD0 /* CRunkchisc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkchisc.h; sourceTree = ""; }; - A72B581F151A16F800223DD0 /* CRunkchisc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkchisc.m; sourceTree = ""; }; - A72B5821151A16F800223DD0 /* CRunkcini.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkcini.h; sourceTree = ""; }; - A72B5822151A16F800223DD0 /* CRunkcini.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkcini.m; sourceTree = ""; }; - A72B5824151A16F800223DD0 /* CRunkcinput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkcinput.h; sourceTree = ""; }; - A72B5825151A16F800223DD0 /* CRunkcinput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkcinput.m; sourceTree = ""; }; - A72B5826151A16F800223DD0 /* CRunkclist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkclist.h; sourceTree = ""; }; - A72B5827151A16F800223DD0 /* CRunkclist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkclist.m; sourceTree = ""; }; - A72B5828151A16F800223DD0 /* CRunkcpica.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkcpica.h; sourceTree = ""; }; - A72B5829151A16F800223DD0 /* CRunkcpica.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkcpica.m; sourceTree = ""; }; - A72B582A151A16F800223DD0 /* CRunkcrandom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkcrandom.h; sourceTree = ""; }; - A72B582B151A16F800223DD0 /* CRunkcrandom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkcrandom.m; sourceTree = ""; }; - A72B582E151A16F800223DD0 /* CRunkcwctrl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunkcwctrl.h; sourceTree = ""; }; - A72B582F151A16F800223DD0 /* CRunkcwctrl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunkcwctrl.m; sourceTree = ""; }; - A72B5830151A16F800223DD0 /* CRunLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunLayer.h; sourceTree = ""; }; - A72B5831151A16F800223DD0 /* CRunLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunLayer.m; sourceTree = ""; }; - A72B5832151A16F800223DD0 /* CRunLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunLocation.h; sourceTree = ""; }; - A72B5833151A16F800223DD0 /* CRunLocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunLocation.m; sourceTree = ""; }; - A72B5834151A16F800223DD0 /* CRunMobileUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMobileUtilities.h; sourceTree = ""; }; - A72B5835151A16F800223DD0 /* CRunMobileUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMobileUtilities.m; sourceTree = ""; }; - A72B5836151A16F800223DD0 /* CRunMoveIt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMoveIt.h; sourceTree = ""; }; - A72B5837151A16F800223DD0 /* CRunMoveIt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMoveIt.m; sourceTree = ""; }; - A72B5838151A16F800223DD0 /* CRunMoveSafely2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMoveSafely2.h; sourceTree = ""; }; - A72B5839151A16F800223DD0 /* CRunMoveSafely2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMoveSafely2.m; sourceTree = ""; }; - A72B583A151A16F800223DD0 /* CRunMTRandom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMTRandom.h; sourceTree = ""; }; - A72B583B151A16F800223DD0 /* CRunMTRandom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMTRandom.m; sourceTree = ""; }; - A72B583C151A16F800223DD0 /* CRunMultipleTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMultipleTouch.h; sourceTree = ""; }; - A72B583D151A16F800223DD0 /* CRunMultipleTouch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMultipleTouch.m; sourceTree = ""; }; - A72B583E151A16F800223DD0 /* CRunObjectMover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunObjectMover.h; sourceTree = ""; }; - A72B583F151A16F800223DD0 /* CRunObjectMover.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunObjectMover.m; sourceTree = ""; }; - A72B5840151A16F800223DD0 /* CRunparser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunparser.h; sourceTree = ""; }; - A72B5841151A16F800223DD0 /* CRunparser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunparser.m; sourceTree = ""; }; - A72B5842151A16F800223DD0 /* CRunPlatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunPlatform.h; sourceTree = ""; }; - A72B5843151A16F800223DD0 /* CRunPlatform.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunPlatform.m; sourceTree = ""; }; - A72B5844151A16F800223DD0 /* CRunStringTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunStringTokenizer.h; sourceTree = ""; }; - A72B5845151A16F800223DD0 /* CRunStringTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunStringTokenizer.m; sourceTree = ""; }; - A72B5846151A16F800223DD0 /* CRunWargameMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunWargameMap.h; sourceTree = ""; }; - A72B5847151A16F800223DD0 /* CRunWargameMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunWargameMap.m; sourceTree = ""; }; - A72B5849151A16F800223DD0 /* CLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLayer.h; sourceTree = ""; }; - A72B584A151A16F800223DD0 /* CLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLayer.m; sourceTree = ""; }; - A72B584B151A16F800223DD0 /* CLO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLO.h; sourceTree = ""; }; - A72B584C151A16F800223DD0 /* CLO.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLO.m; sourceTree = ""; }; - A72B584D151A16F800223DD0 /* CLOList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLOList.h; sourceTree = ""; }; - A72B584E151A16F800223DD0 /* CLOList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLOList.m; sourceTree = ""; }; - A72B5850151A16F800223DD0 /* CMove.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMove.h; sourceTree = ""; }; - A72B5851151A16F800223DD0 /* CMove.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMove.m; sourceTree = ""; }; - A72B5852151A16F800223DD0 /* CMoveBall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveBall.h; sourceTree = ""; }; - A72B5853151A16F800223DD0 /* CMoveBall.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveBall.m; sourceTree = ""; }; - A72B5854151A16F800223DD0 /* CMoveBullet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveBullet.h; sourceTree = ""; }; - A72B5855151A16F800223DD0 /* CMoveBullet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveBullet.m; sourceTree = ""; }; - A72B5856151A16F800223DD0 /* CMoveDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDef.h; sourceTree = ""; }; - A72B5857151A16F800223DD0 /* CMoveDef.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDef.m; sourceTree = ""; }; - A72B5858151A16F800223DD0 /* CMoveDefBall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDefBall.h; sourceTree = ""; }; - A72B5859151A16F800223DD0 /* CMoveDefBall.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDefBall.m; sourceTree = ""; }; - A72B585A151A16F800223DD0 /* CMoveDefExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDefExtension.h; sourceTree = ""; }; - A72B585B151A16F800223DD0 /* CMoveDefExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDefExtension.m; sourceTree = ""; }; - A72B585C151A16F800223DD0 /* CMoveDefGeneric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDefGeneric.h; sourceTree = ""; }; - A72B585D151A16F800223DD0 /* CMoveDefGeneric.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDefGeneric.m; sourceTree = ""; }; - A72B585E151A16F800223DD0 /* CMoveDefList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDefList.h; sourceTree = ""; }; - A72B585F151A16F800223DD0 /* CMoveDefList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDefList.m; sourceTree = ""; }; - A72B5860151A16F800223DD0 /* CMoveDefMouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDefMouse.h; sourceTree = ""; }; - A72B5861151A16F800223DD0 /* CMoveDefMouse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDefMouse.m; sourceTree = ""; }; - A72B5862151A16F800223DD0 /* CMoveDefPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDefPath.h; sourceTree = ""; }; - A72B5863151A16F800223DD0 /* CMoveDefPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDefPath.m; sourceTree = ""; }; - A72B5864151A16F800223DD0 /* CMoveDefPlatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDefPlatform.h; sourceTree = ""; }; - A72B5865151A16F800223DD0 /* CMoveDefPlatform.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDefPlatform.m; sourceTree = ""; }; - A72B5866151A16F800223DD0 /* CMoveDefRace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDefRace.h; sourceTree = ""; }; - A72B5867151A16F800223DD0 /* CMoveDefRace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDefRace.m; sourceTree = ""; }; - A72B5868151A16F800223DD0 /* CMoveDefStatic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDefStatic.h; sourceTree = ""; }; - A72B5869151A16F800223DD0 /* CMoveDefStatic.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDefStatic.m; sourceTree = ""; }; - A72B586A151A16F800223DD0 /* CMoveDisappear.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveDisappear.h; sourceTree = ""; }; - A72B586B151A16F800223DD0 /* CMoveDisappear.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveDisappear.m; sourceTree = ""; }; - A72B586C151A16F800223DD0 /* CMoveExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveExtension.h; sourceTree = ""; }; - A72B586D151A16F800223DD0 /* CMoveExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveExtension.m; sourceTree = ""; }; - A72B586E151A16F800223DD0 /* CMoveGeneric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveGeneric.h; sourceTree = ""; }; - A72B586F151A16F800223DD0 /* CMoveGeneric.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveGeneric.m; sourceTree = ""; }; - A72B5870151A16F800223DD0 /* CMoveMouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveMouse.h; sourceTree = ""; }; - A72B5871151A16F800223DD0 /* CMoveMouse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveMouse.m; sourceTree = ""; }; - A72B5872151A16F800223DD0 /* CMovePath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMovePath.h; sourceTree = ""; }; - A72B5873151A16F800223DD0 /* CMovePath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMovePath.m; sourceTree = ""; }; - A72B5874151A16F800223DD0 /* CMovePlatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMovePlatform.h; sourceTree = ""; }; - A72B5875151A16F800223DD0 /* CMovePlatform.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMovePlatform.m; sourceTree = ""; }; - A72B5876151A16F800223DD0 /* CMoveRace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveRace.h; sourceTree = ""; }; - A72B5877151A16F800223DD0 /* CMoveRace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveRace.m; sourceTree = ""; }; - A72B5878151A16F800223DD0 /* CMoveStatic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMoveStatic.h; sourceTree = ""; }; - A72B5879151A16F800223DD0 /* CMoveStatic.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMoveStatic.m; sourceTree = ""; }; - A72B587A151A16F800223DD0 /* CPathStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPathStep.h; sourceTree = ""; }; - A72B587B151A16F800223DD0 /* CPathStep.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPathStep.m; sourceTree = ""; }; - A72B587C151A16F800223DD0 /* CRMvt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRMvt.h; sourceTree = ""; }; - A72B587D151A16F800223DD0 /* CRMvt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRMvt.m; sourceTree = ""; }; - A72B587E151A16F800223DD0 /* CRunMvtclickteam_circular.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtclickteam_circular.h; sourceTree = ""; }; - A72B587F151A16F800223DD0 /* CRunMvtclickteam_circular.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtclickteam_circular.m; sourceTree = ""; }; - A72B5880151A16F800223DD0 /* CRunMvtclickteam_dragdrop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtclickteam_dragdrop.h; sourceTree = ""; }; - A72B5881151A16F800223DD0 /* CRunMvtclickteam_dragdrop.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtclickteam_dragdrop.m; sourceTree = ""; }; - A72B5882151A16F800223DD0 /* CRunMvtclickteam_invaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtclickteam_invaders.h; sourceTree = ""; }; - A72B5883151A16F800223DD0 /* CRunMvtclickteam_invaders.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtclickteam_invaders.m; sourceTree = ""; }; - A72B5884151A16F800223DD0 /* CRunMvtclickteam_presentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtclickteam_presentation.h; sourceTree = ""; }; - A72B5885151A16F800223DD0 /* CRunMvtclickteam_presentation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtclickteam_presentation.m; sourceTree = ""; }; - A72B5886151A16F800223DD0 /* CRunMvtclickteam_regpolygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtclickteam_regpolygon.h; sourceTree = ""; }; - A72B5887151A16F800223DD0 /* CRunMvtclickteam_regpolygon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtclickteam_regpolygon.m; sourceTree = ""; }; - A72B5888151A16F800223DD0 /* CRunMvtclickteam_simple_ellipse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtclickteam_simple_ellipse.h; sourceTree = ""; }; - A72B5889151A16F800223DD0 /* CRunMvtclickteam_simple_ellipse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtclickteam_simple_ellipse.m; sourceTree = ""; }; - A72B588A151A16F800223DD0 /* CRunMvtclickteam_sinewave.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtclickteam_sinewave.h; sourceTree = ""; }; - A72B588B151A16F800223DD0 /* CRunMvtclickteam_sinewave.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtclickteam_sinewave.m; sourceTree = ""; }; - A72B588C151A16F800223DD0 /* CRunMvtclickteam_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtclickteam_vector.h; sourceTree = ""; }; - A72B588D151A16F800223DD0 /* CRunMvtclickteam_vector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtclickteam_vector.m; sourceTree = ""; }; - A72B588E151A16F800223DD0 /* CRunMvtExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtExtension.h; sourceTree = ""; }; - A72B588F151A16F800223DD0 /* CRunMvtExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtExtension.m; sourceTree = ""; }; - A72B5890151A16F800223DD0 /* CRunMvtinandout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtinandout.h; sourceTree = ""; }; - A72B5891151A16F800223DD0 /* CRunMvtinandout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtinandout.m; sourceTree = ""; }; - A72B5892151A16F800223DD0 /* CRunMvtpinball.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtpinball.h; sourceTree = ""; }; - A72B5893151A16F800223DD0 /* CRunMvtpinball.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtpinball.m; sourceTree = ""; }; - A72B5894151A16F800223DD0 /* CRunMvtspaceship.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunMvtspaceship.h; sourceTree = ""; }; - A72B5895151A16F800223DD0 /* CRunMvtspaceship.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunMvtspaceship.m; sourceTree = ""; }; - A72B5897151A16F800223DD0 /* CActive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CActive.h; sourceTree = ""; }; - A72B5898151A16F800223DD0 /* CActive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CActive.m; sourceTree = ""; }; - A72B5899151A16F800223DD0 /* CCCA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCCA.h; sourceTree = ""; }; - A72B589A151A16F800223DD0 /* CCCA.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCCA.m; sourceTree = ""; }; - A72B589B151A16F800223DD0 /* CCounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCounter.h; sourceTree = ""; }; - A72B589C151A16F800223DD0 /* CCounter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCounter.m; sourceTree = ""; }; - A72B589D151A16F800223DD0 /* CExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CExtension.h; sourceTree = ""; }; - A72B589E151A16F800223DD0 /* CExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CExtension.m; sourceTree = ""; }; - A72B589F151A16F800223DD0 /* CLives.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLives.h; sourceTree = ""; }; - A72B58A0151A16F800223DD0 /* CLives.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLives.m; sourceTree = ""; }; - A72B58A1151A16F800223DD0 /* CObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CObject.h; sourceTree = ""; }; - A72B58A2151A16F800223DD0 /* CObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CObject.m; sourceTree = ""; }; - A72B58A3151A16F800223DD0 /* CQuestion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CQuestion.h; sourceTree = ""; }; - A72B58A4151A16F800223DD0 /* CQuestion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CQuestion.m; sourceTree = ""; }; - A72B58A5151A16F800223DD0 /* CRCom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRCom.h; sourceTree = ""; }; - A72B58A6151A16F800223DD0 /* CRCom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRCom.m; sourceTree = ""; }; - A72B58A7151A16F800223DD0 /* CScore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CScore.h; sourceTree = ""; }; - A72B58A8151A16F800223DD0 /* CScore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CScore.m; sourceTree = ""; }; - A72B58A9151A16F800223DD0 /* CText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CText.h; sourceTree = ""; }; - A72B58AA151A16F800223DD0 /* CText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CText.m; sourceTree = ""; }; - A72B58AC151A16F800223DD0 /* CDefCCA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDefCCA.h; sourceTree = ""; }; - A72B58AD151A16F800223DD0 /* CDefCCA.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDefCCA.m; sourceTree = ""; }; - A72B58AE151A16F800223DD0 /* CDefCounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDefCounter.h; sourceTree = ""; }; - A72B58AF151A16F800223DD0 /* CDefCounter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDefCounter.m; sourceTree = ""; }; - A72B58B0151A16F800223DD0 /* CDefCounters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDefCounters.h; sourceTree = ""; }; - A72B58B1151A16F800223DD0 /* CDefCounters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDefCounters.m; sourceTree = ""; }; - A72B58B2151A16F800223DD0 /* CDefObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDefObject.h; sourceTree = ""; }; - A72B58B3151A16F800223DD0 /* CDefObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDefObject.m; sourceTree = ""; }; - A72B58B4151A16F800223DD0 /* CDefText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDefText.h; sourceTree = ""; }; - A72B58B5151A16F800223DD0 /* CDefText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDefText.m; sourceTree = ""; }; - A72B58B6151A16F800223DD0 /* CDefTexts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDefTexts.h; sourceTree = ""; }; - A72B58B7151A16F800223DD0 /* CDefTexts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDefTexts.m; sourceTree = ""; }; - A72B58B8151A16F800223DD0 /* CObjectCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CObjectCommon.h; sourceTree = ""; }; - A72B58B9151A16F800223DD0 /* CObjectCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CObjectCommon.m; sourceTree = ""; }; - A72B58BA151A16F800223DD0 /* COC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = COC.h; sourceTree = ""; }; - A72B58BB151A16F800223DD0 /* COC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = COC.m; sourceTree = ""; }; - A72B58BC151A16F800223DD0 /* COCBackground.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = COCBackground.h; sourceTree = ""; }; - A72B58BD151A16F800223DD0 /* COCBackground.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = COCBackground.m; sourceTree = ""; }; - A72B58BE151A16F800223DD0 /* COCQBackdrop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = COCQBackdrop.h; sourceTree = ""; }; - A72B58BF151A16F800223DD0 /* COCQBackdrop.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = COCQBackdrop.m; sourceTree = ""; }; - A72B58C0151A16F800223DD0 /* COI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = COI.h; sourceTree = ""; }; - A72B58C1151A16F800223DD0 /* COI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = COI.m; sourceTree = ""; }; - A72B58C2151A16F800223DD0 /* COIList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = COIList.h; sourceTree = ""; }; - A72B58C3151A16F800223DD0 /* COIList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = COIList.m; sourceTree = ""; }; - A72B58C7151A16F800223DD0 /* CRenderToTexture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRenderToTexture.h; sourceTree = ""; }; - A72B58C8151A16F800223DD0 /* CRenderToTexture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRenderToTexture.m; sourceTree = ""; }; - A72B58C9151A16F800223DD0 /* CShader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CShader.h; sourceTree = ""; }; - A72B58CA151A16F800223DD0 /* CShader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CShader.cpp; sourceTree = ""; }; - A72B58CB151A16F800223DD0 /* CTextSurface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTextSurface.h; sourceTree = ""; }; - A72B58CC151A16F800223DD0 /* CTextSurface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTextSurface.m; sourceTree = ""; }; - A72B58CF151A16F800223DD0 /* CBackDraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CBackDraw.h; sourceTree = ""; }; - A72B58D0151A16F800223DD0 /* CBackDraw.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CBackDraw.m; sourceTree = ""; }; - A72B58D1151A16F800223DD0 /* CBackDrawCls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CBackDrawCls.h; sourceTree = ""; }; - A72B58D2151A16F800223DD0 /* CBackDrawCls.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CBackDrawCls.m; sourceTree = ""; }; - A72B58D3151A16F800223DD0 /* CBackDrawClsZone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CBackDrawClsZone.h; sourceTree = ""; }; - A72B58D4151A16F800223DD0 /* CBackDrawClsZone.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CBackDrawClsZone.m; sourceTree = ""; }; - A72B58D5151A16F800223DD0 /* CBackDrawPaste.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CBackDrawPaste.h; sourceTree = ""; }; - A72B58D6151A16F800223DD0 /* CBackDrawPaste.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CBackDrawPaste.m; sourceTree = ""; }; - A72B58D7151A16F800223DD0 /* CBkd2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CBkd2.h; sourceTree = ""; }; - A72B58D8151A16F800223DD0 /* CBkd2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CBkd2.m; sourceTree = ""; }; - A72B58D9151A16F800223DD0 /* CCreateObjectInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCreateObjectInfo.h; sourceTree = ""; }; - A72B58DA151A16F800223DD0 /* CCreateObjectInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCreateObjectInfo.m; sourceTree = ""; }; - A72B58DB151A16F800223DD0 /* CExtStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CExtStorage.h; sourceTree = ""; }; - A72B58DC151A16F800223DD0 /* CExtStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CExtStorage.m; sourceTree = ""; }; - A72B58DD151A16F800223DD0 /* CLoop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLoop.h; sourceTree = ""; }; - A72B58DE151A16F800223DD0 /* CLoop.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLoop.m; sourceTree = ""; }; - A72B58DF151A16F800223DD0 /* CObjInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CObjInfo.h; sourceTree = ""; }; - A72B58E0151A16F800223DD0 /* CObjInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CObjInfo.m; sourceTree = ""; }; - A72B58E1151A16F800223DD0 /* CRun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRun.h; sourceTree = ""; }; - A72B58E2151A16F800223DD0 /* CRun.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRun.m; sourceTree = ""; }; - A72B58E4151A16F800223DD0 /* CSaveGlobal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSaveGlobal.h; sourceTree = ""; }; - A72B58E5151A16F800223DD0 /* CSaveGlobal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSaveGlobal.m; sourceTree = ""; }; - A72B58E6151A16F800223DD0 /* RuntimeIPhoneAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuntimeIPhoneAppDelegate.h; sourceTree = ""; }; - A72B58E7151A16F800223DD0 /* RuntimeIPhoneAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RuntimeIPhoneAppDelegate.m; sourceTree = ""; }; - A72B58E9151A16F800223DD0 /* CArrayList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CArrayList.h; sourceTree = ""; }; - A72B58EA151A16F800223DD0 /* CArrayList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CArrayList.m; sourceTree = ""; }; - A72B58EB151A16F800223DD0 /* CBitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CBitmap.h; sourceTree = ""; }; - A72B58EC151A16F800223DD0 /* CBitmap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CBitmap.m; sourceTree = ""; }; - A72B58ED151A16F800223DD0 /* CChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CChunk.h; sourceTree = ""; }; - A72B58EE151A16F800223DD0 /* CChunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CChunk.m; sourceTree = ""; }; - A72B58EF151A16F800223DD0 /* CFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFile.h; sourceTree = ""; }; - A72B58F1151A16F800223DD0 /* CFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CFile.m; sourceTree = ""; }; - A72B58F3151A16F800223DD0 /* CFontInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFontInfo.h; sourceTree = ""; }; - A72B58F4151A16F800223DD0 /* CFontInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CFontInfo.m; sourceTree = ""; }; - A72B58F5151A16F800223DD0 /* CIni.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CIni.h; sourceTree = ""; }; - A72B58F6151A16F800223DD0 /* CIni.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CIni.m; sourceTree = ""; }; - A72B58F8151A16F800223DD0 /* CoreMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreMath.h; sourceTree = ""; }; - A72B58F9151A16F800223DD0 /* CoreMath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreMath.m; sourceTree = ""; }; - A72B58FA151A16F800223DD0 /* CPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPoint.h; sourceTree = ""; }; - A72B58FB151A16F800223DD0 /* CRect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRect.h; sourceTree = ""; }; - A72B58FC151A16F800223DD0 /* CRect.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRect.m; sourceTree = ""; }; - A72B58FD151A16F800223DD0 /* CServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CServices.h; sourceTree = ""; }; - A72B58FE151A16F800223DD0 /* CServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CServices.m; sourceTree = ""; }; - A72B5901151A16F800223DD0 /* ModalInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModalInput.h; sourceTree = ""; }; - A72B5902151A16F800223DD0 /* ModalInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ModalInput.m; sourceTree = ""; }; - A72B5903151A16F800223DD0 /* NSExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSExtensions.h; sourceTree = ""; }; - A72B5904151A16F800223DD0 /* NSExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSExtensions.m; sourceTree = ""; }; - A72B5905151A16F800223DD0 /* ObjectSelection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectSelection.h; sourceTree = ""; }; - A72B5906151A16F800223DD0 /* ObjectSelection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjectSelection.m; sourceTree = ""; }; - A72B5907151A16F800223DD0 /* sort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sort.h; sourceTree = ""; }; - A72B5909151A16F800223DD0 /* CColMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CColMask.h; sourceTree = ""; }; - A72B590A151A16F800223DD0 /* CColMask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CColMask.m; sourceTree = ""; }; - A72B590B151A16F800223DD0 /* CMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMask.h; sourceTree = ""; }; - A72B590C151A16F800223DD0 /* CMask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMask.m; sourceTree = ""; }; - A72B590D151A16F800223DD0 /* CPSCM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPSCM.h; sourceTree = ""; }; - A72B590E151A16F800223DD0 /* CPSCM.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPSCM.m; sourceTree = ""; }; - A72B590F151A16F800223DD0 /* CRSpr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRSpr.h; sourceTree = ""; }; - A72B5910151A16F800223DD0 /* CRSpr.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRSpr.m; sourceTree = ""; }; - A72B5911151A16F800223DD0 /* CSprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSprite.h; sourceTree = ""; }; - A72B5912151A16F800223DD0 /* CSprite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSprite.m; sourceTree = ""; }; - A72B5913151A16F800223DD0 /* CSpriteGen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSpriteGen.h; sourceTree = ""; }; - A72B5914151A16F800223DD0 /* CSpriteGen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSpriteGen.m; sourceTree = ""; }; - A72B5915151A16F800223DD0 /* IDrawable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDrawable.h; sourceTree = ""; }; - A72B5917151A16F800223DD0 /* CFadeSprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFadeSprite.h; sourceTree = ""; }; - A72B5918151A16F800223DD0 /* CFadeSprite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CFadeSprite.m; sourceTree = ""; }; - A72B5919151A16F800223DD0 /* CTrans.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTrans.h; sourceTree = ""; }; - A72B591A151A16F800223DD0 /* CTrans.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTrans.m; sourceTree = ""; }; - A72B591B151A16F800223DD0 /* CTransitionData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTransitionData.h; sourceTree = ""; }; - A72B591C151A16F800223DD0 /* CTransitionData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTransitionData.m; sourceTree = ""; }; - A72B591D151A16F800223DD0 /* CTransitionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTransitionManager.h; sourceTree = ""; }; - A72B591E151A16F800223DD0 /* CTransitionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTransitionManager.m; sourceTree = ""; }; - A72B591F151A16F800223DD0 /* CTransitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTransitions.h; sourceTree = ""; }; - A72B5920151A16F800223DD0 /* CTransitions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTransitions.m; sourceTree = ""; }; - A72B5921151A16F800223DD0 /* CTransitionscctrans.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTransitionscctrans.h; sourceTree = ""; }; - A72B5922151A16F800223DD0 /* CTransitionscctrans.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CTransitionscctrans.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - A72B5924151A16F800223DD0 /* CDefStrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDefStrings.h; sourceTree = ""; }; - A72B5925151A16F800223DD0 /* CDefStrings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDefStrings.m; sourceTree = ""; }; - A72B5926151A16F800223DD0 /* CDefValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDefValues.h; sourceTree = ""; }; - A72B5927151A16F800223DD0 /* CDefValues.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDefValues.m; sourceTree = ""; }; - A72B5928151A16F800223DD0 /* CRVal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRVal.h; sourceTree = ""; }; - A72B5929151A16F800223DD0 /* CRVal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRVal.m; sourceTree = ""; }; - A73F000214B8EC18001531D7 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - A73F000414B8EC4A001531D7 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - A74B0242145D55510055BC9D /* fire1U.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fire1U.png; path = Resources/fire1U.png; sourceTree = ""; }; - A7701E03117A2BE800C1250B /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - A7779373117CFB0D008DB05F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - A784823013732ED100F97A7F /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - A784823613732F0700F97A7F /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - A7B3248E1344DA9D00406621 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; - A7B324A31344DB4300406621 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - A7B6433E154707E500946D1E /* CRunInventory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CRunInventory.h; sourceTree = ""; }; - A7B6433F154707E500946D1E /* CRunInventory.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CRunInventory.m; sourceTree = ""; }; - A7C915C215F7FD5C00F5369B /* Reachability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = ""; }; - A7C915C315F7FD5C00F5369B /* Reachability.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = ""; }; - A7C915C615F7FDBB00F5369B /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - A7DFA82115D93F7000A64A22 /* CRunDeadReckoning.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CRunDeadReckoning.h; sourceTree = ""; }; - A7DFA82215D93F7100A64A22 /* CRunDeadReckoning.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CRunDeadReckoning.m; sourceTree = ""; }; - ED0CD2CF2563261700157A87 /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; }; - ED0CD63D1DA5580500D02BF0 /* GameplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameplayKit.framework; path = System/Library/Frameworks/GameplayKit.framework; sourceTree = SDKROOT; }; - ED0CD6421DA5602D00D02BF0 /* GameKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameKit.framework; path = System/Library/Frameworks/GameKit.framework; sourceTree = SDKROOT; }; - ED0CD6441DA5603600D02BF0 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; - ED15A7F02247ED7900798304 /* sineoffset_ext.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = sineoffset_ext.fsh; path = Resources/Shaders/sineoffset_ext.fsh; sourceTree = ""; }; - ED15A7F12247ED7900798304 /* sineoffset_ext.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = sineoffset_ext.vsh; path = Resources/Shaders/sineoffset_ext.vsh; sourceTree = ""; }; - ED15A7F22247ED7900798304 /* sinewave_ext.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = sinewave_ext.vsh; path = Resources/Shaders/sinewave_ext.vsh; sourceTree = ""; }; - ED15A7F32247ED7900798304 /* sinewave_ext.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = sinewave_ext.fsh; path = Resources/Shaders/sinewave_ext.fsh; sourceTree = ""; }; - ED755F371F84451E0041BDC0 /* CRunAESFusion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunAESFusion.h; sourceTree = ""; }; - ED755F381F84451E0041BDC0 /* CRunAESFusion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunAESFusion.m; sourceTree = ""; }; - ED7BBCBD252E1CC50034E8A4 /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; }; - ED7CFAFE222747F200979ACC /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; - ED8B37B11F69C8D80080A3B8 /* CRunKcDbl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunKcDbl.h; sourceTree = ""; }; - ED8B37B21F69C8D80080A3B8 /* CRunKcDbl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunKcDbl.m; sourceTree = ""; }; - ED8B37B51F69CB110080A3B8 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; - ED961E9722166838008709D4 /* ic_question.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ic_question.png; path = Resources/ic_question.png; sourceTree = ""; }; - ED961E9822166838008709D4 /* ic_error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ic_error.png; path = Resources/ic_error.png; sourceTree = ""; }; - ED961E9922166838008709D4 /* ic_exclamation.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ic_exclamation.png; path = Resources/ic_exclamation.png; sourceTree = ""; }; - ED961E9A22166838008709D4 /* ic_information.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ic_information.png; path = Resources/ic_information.png; sourceTree = ""; }; - EDE1CF2D21B1B5D00094F4F2 /* panorama_ext.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = panorama_ext.fsh; path = Resources/Shaders/panorama_ext.fsh; sourceTree = ""; }; - EDE1CF2E21B1B5D00094F4F2 /* perspective_ext.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = perspective_ext.fsh; path = Resources/Shaders/perspective_ext.fsh; sourceTree = ""; }; - EDE1CF2F21B1B5D00094F4F2 /* panorama_ext.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = panorama_ext.vsh; path = Resources/Shaders/panorama_ext.vsh; sourceTree = ""; }; - EDE1CF3021B1B5D10094F4F2 /* perspective_ext.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = perspective_ext.vsh; path = Resources/Shaders/perspective_ext.vsh; sourceTree = ""; }; - EDE55AF51D2D490500B5AA42 /* CRunWebView2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRunWebView2.h; sourceTree = ""; }; - EDE55AF61D2D490500B5AA42 /* CRunWebView2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRunWebView2.m; sourceTree = ""; }; - EDE55B711D2D501300B5AA42 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ED0CD2D32563268F00157A87 /* CoreMedia.framework in Frameworks */, - 04578521238D67A5004156D9 /* WebKit.framework in Frameworks */, - ED0CD6451DA5603600D02BF0 /* StoreKit.framework in Frameworks */, - ED0CD6431DA5602D00D02BF0 /* GameKit.framework in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - ED0CD2D02563261700157A87 /* AVKit.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */, - 0F7AAA9C115E53090051E240 /* AVFoundation.framework in Frameworks */, - A7B324A41344DB4300406621 /* AudioToolbox.framework in Frameworks */, - A7701E04117A2BE800C1250B /* OpenGLES.framework in Frameworks */, - ED7BBCBE252E1CC50034E8A4 /* Photos.framework in Frameworks */, - A7779374117CFB0D008DB05F /* QuartzCore.framework in Frameworks */, - ED7CFAFF222747F300979ACC /* UserNotifications.framework in Frameworks */, - 8B2AE66018FEAEE700642A27 /* GameController.framework in Frameworks */, - 8B2D764C17EB235D00599FBE /* CoreMotion.framework in Frameworks */, - 0FAF51CF160C9E4B0039137E /* SystemConfiguration.framework in Frameworks */, - A73F000514B8EC4A001531D7 /* MediaPlayer.framework in Frameworks */, - A70E3F75120AFB0E005AC44F /* CoreLocation.framework in Frameworks */, - 0F751AD912BE0DDA002D72FB /* iAd.framework in Frameworks */, - A7B3248F1344DA9D00406621 /* OpenAL.framework in Frameworks */, - A784823713732F0700F97A7F /* MobileCoreServices.framework in Frameworks */, - EDE55B721D2D501300B5AA42 /* libz.tbd in Frameworks */, - 8B0D31E81836639A005202BD /* libBox2D.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8B0D3106183661E5005202BD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* SDK.app */, - 8B0D3109183661E5005202BD /* libBox2D.a */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - A72B578B151A16F700223DD0 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 8B0D30FB1836611E005202BD /* Box2D */, - 32CA4F630368D1EE00C91783 /* SDK_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - ED961E9822166838008709D4 /* ic_error.png */, - ED961E9922166838008709D4 /* ic_exclamation.png */, - ED961E9A22166838008709D4 /* ic_information.png */, - ED961E9722166838008709D4 /* ic_question.png */, - 3DA0F3A719FE38140080FDC5 /* Images.xcassets */, - A7711B411185F6AC0068BD0C /* Shaders */, - 0F812EB2122F9D160032040B /* ITunesArtwork.png */, - A70E402F120B14FD005AC44F /* fire1D.png */, - A74B0242145D55510055BC9D /* fire1U.png */, - A70E4031120B14FD005AC44F /* fire2D.png */, - A70E4032120B14FD005AC44F /* fire2U.png */, - A70E4034120B14FD005AC44F /* joyback.png */, - A70E4035120B14FD005AC44F /* joyfront.png */, - 043EC9DA23548328007001F0 /* joydown.png */, - 043EC9DC23548333007001F0 /* joydownd.png */, - 043EC9E223548351007001F0 /* joyleft.png */, - 043EC9E023548351007001F0 /* joyleftd.png */, - 043EC9E323548351007001F0 /* joyright.png */, - 043EC9DF23548351007001F0 /* joyrightd.png */, - 043EC9DE23548351007001F0 /* joyup.png */, - 043EC9E123548351007001F0 /* joyupd.png */, - A7136798139D3C550082293B /* Application.cci */, - 8D1107310486CEB800E47090 /* SDK-Info.plist */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED0CD2CF2563261700157A87 /* AVKit.framework */, - ED7BBCBD252E1CC50034E8A4 /* Photos.framework */, - 04578520238D67A5004156D9 /* WebKit.framework */, - ED7CFAFE222747F200979ACC /* UserNotifications.framework */, - ED8B37B51F69CB110080A3B8 /* libc++.tbd */, - ED0CD6441DA5603600D02BF0 /* StoreKit.framework */, - ED0CD6421DA5602D00D02BF0 /* GameKit.framework */, - ED0CD63D1DA5580500D02BF0 /* GameplayKit.framework */, - EDE55B711D2D501300B5AA42 /* libz.tbd */, - 8BDA7B90191101F30023BD01 /* AssetsLibrary.framework */, - 8B2AE65F18FEAEE700642A27 /* GameController.framework */, - 8B2D764B17EB235D00599FBE /* CoreMotion.framework */, - A72B1D4E13C1E08600B167CF /* libz.dylib */, - A7C915C615F7FDBB00F5369B /* SystemConfiguration.framework */, - 0F58615815E26882007126FA /* CoreBluetooth.framework */, - A73F000414B8EC4A001531D7 /* MediaPlayer.framework */, - A73F000214B8EC18001531D7 /* CoreMedia.framework */, - 0F751AD812BE0DDA002D72FB /* iAd.framework */, - A70E3F74120AFB0E005AC44F /* CoreLocation.framework */, - A7779373117CFB0D008DB05F /* QuartzCore.framework */, - 0F7AAA9B115E53090051E240 /* AVFoundation.framework */, - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 288765FC0DF74451002DB57D /* CoreGraphics.framework */, - A7701E03117A2BE800C1250B /* OpenGLES.framework */, - A7B3248E1344DA9D00406621 /* OpenAL.framework */, - A7B324A31344DB4300406621 /* AudioToolbox.framework */, - A784823013732ED100F97A7F /* CoreVideo.framework */, - A784823613732F0700F97A7F /* MobileCoreServices.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 8B0D30FB1836611E005202BD /* Box2D */ = { - isa = PBXGroup; - children = ( - 8B0D30FC183661D0005202BD /* Box2D.h */, - 8B0D312D18366234005202BD /* Collision */, - 8B0D314518366234005202BD /* Common */, - 8B0D315318366234005202BD /* Dynamics */, - 8B0D318B18366234005202BD /* Rope */, - ); - name = Box2D; - sourceTree = ""; - }; - 8B0D312D18366234005202BD /* Collision */ = { - isa = PBXGroup; - children = ( - 8B0D312E18366234005202BD /* b2BroadPhase.cpp */, - 8B0D312F18366234005202BD /* b2BroadPhase.h */, - 8B0D313018366234005202BD /* b2CollideCircle.cpp */, - 8B0D313118366234005202BD /* b2CollideEdge.cpp */, - 8B0D313218366234005202BD /* b2CollidePolygon.cpp */, - 8B0D313318366234005202BD /* b2Collision.cpp */, - 8B0D313418366234005202BD /* b2Collision.h */, - 8B0D313518366234005202BD /* b2Distance.cpp */, - 8B0D313618366234005202BD /* b2Distance.h */, - 8B0D313718366234005202BD /* b2DynamicTree.cpp */, - 8B0D313818366234005202BD /* b2DynamicTree.h */, - 8B0D313918366234005202BD /* b2TimeOfImpact.cpp */, - 8B0D313A18366234005202BD /* b2TimeOfImpact.h */, - 8B0D313B18366234005202BD /* Shapes */, - ); - name = Collision; - path = Classes/Box2D/Collision; - sourceTree = ""; - }; - 8B0D313B18366234005202BD /* Shapes */ = { - isa = PBXGroup; - children = ( - 8B0D313C18366234005202BD /* b2ChainShape.cpp */, - 8B0D313D18366234005202BD /* b2ChainShape.h */, - 8B0D313E18366234005202BD /* b2CircleShape.cpp */, - 8B0D313F18366234005202BD /* b2CircleShape.h */, - 8B0D314018366234005202BD /* b2EdgeShape.cpp */, - 8B0D314118366234005202BD /* b2EdgeShape.h */, - 8B0D314218366234005202BD /* b2PolygonShape.cpp */, - 8B0D314318366234005202BD /* b2PolygonShape.h */, - 8B0D314418366234005202BD /* b2Shape.h */, - ); - path = Shapes; - sourceTree = ""; - }; - 8B0D314518366234005202BD /* Common */ = { - isa = PBXGroup; - children = ( - 8B0D314618366234005202BD /* b2BlockAllocator.cpp */, - 8B0D314718366234005202BD /* b2BlockAllocator.h */, - 8B0D314818366234005202BD /* b2Draw.cpp */, - 8B0D314918366234005202BD /* b2Draw.h */, - 8B0D314A18366234005202BD /* b2GrowableStack.h */, - 8B0D314B18366234005202BD /* b2Math.cpp */, - 8B0D314C18366234005202BD /* b2Math.h */, - 8B0D314D18366234005202BD /* b2Settings.cpp */, - 8B0D314E18366234005202BD /* b2Settings.h */, - 8B0D314F18366234005202BD /* b2StackAllocator.cpp */, - 8B0D315018366234005202BD /* b2StackAllocator.h */, - 8B0D315118366234005202BD /* b2Timer.cpp */, - 8B0D315218366234005202BD /* b2Timer.h */, - ); - name = Common; - path = Classes/Box2D/Common; - sourceTree = ""; - }; - 8B0D315318366234005202BD /* Dynamics */ = { - isa = PBXGroup; - children = ( - 8B0D315418366234005202BD /* b2Body.cpp */, - 8B0D315518366234005202BD /* b2Body.h */, - 8B0D315618366234005202BD /* b2ContactManager.cpp */, - 8B0D315718366234005202BD /* b2ContactManager.h */, - 8B0D315818366234005202BD /* b2Fixture.cpp */, - 8B0D315918366234005202BD /* b2Fixture.h */, - 8B0D315A18366234005202BD /* b2Island.cpp */, - 8B0D315B18366234005202BD /* b2Island.h */, - 8B0D315C18366234005202BD /* b2TimeStep.h */, - 8B0D315D18366234005202BD /* b2World.cpp */, - 8B0D315E18366234005202BD /* b2World.h */, - 8B0D315F18366234005202BD /* b2WorldCallbacks.cpp */, - 8B0D316018366234005202BD /* b2WorldCallbacks.h */, - 8B0D316118366234005202BD /* Contacts */, - 8B0D317418366234005202BD /* Joints */, - ); - name = Dynamics; - path = Classes/Box2D/Dynamics; - sourceTree = ""; - }; - 8B0D316118366234005202BD /* Contacts */ = { - isa = PBXGroup; - children = ( - 8B0D316218366234005202BD /* b2ChainAndCircleContact.cpp */, - 8B0D316318366234005202BD /* b2ChainAndCircleContact.h */, - 8B0D316418366234005202BD /* b2ChainAndPolygonContact.cpp */, - 8B0D316518366234005202BD /* b2ChainAndPolygonContact.h */, - 8B0D316618366234005202BD /* b2CircleContact.cpp */, - 8B0D316718366234005202BD /* b2CircleContact.h */, - 8B0D316818366234005202BD /* b2Contact.cpp */, - 8B0D316918366234005202BD /* b2Contact.h */, - 8B0D316A18366234005202BD /* b2ContactSolver.cpp */, - 8B0D316B18366234005202BD /* b2ContactSolver.h */, - 8B0D316C18366234005202BD /* b2EdgeAndCircleContact.cpp */, - 8B0D316D18366234005202BD /* b2EdgeAndCircleContact.h */, - 8B0D316E18366234005202BD /* b2EdgeAndPolygonContact.cpp */, - 8B0D316F18366234005202BD /* b2EdgeAndPolygonContact.h */, - 8B0D317018366234005202BD /* b2PolygonAndCircleContact.cpp */, - 8B0D317118366234005202BD /* b2PolygonAndCircleContact.h */, - 8B0D317218366234005202BD /* b2PolygonContact.cpp */, - 8B0D317318366234005202BD /* b2PolygonContact.h */, - ); - path = Contacts; - sourceTree = ""; - }; - 8B0D317418366234005202BD /* Joints */ = { - isa = PBXGroup; - children = ( - 8B0D317518366234005202BD /* b2DistanceJoint.cpp */, - 8B0D317618366234005202BD /* b2DistanceJoint.h */, - 8B0D317718366234005202BD /* b2FrictionJoint.cpp */, - 8B0D317818366234005202BD /* b2FrictionJoint.h */, - 8B0D317918366234005202BD /* b2GearJoint.cpp */, - 8B0D317A18366234005202BD /* b2GearJoint.h */, - 8B0D317B18366234005202BD /* b2Joint.cpp */, - 8B0D317C18366234005202BD /* b2Joint.h */, - 8B0D317D18366234005202BD /* b2MouseJoint.cpp */, - 8B0D317E18366234005202BD /* b2MouseJoint.h */, - 8B0D317F18366234005202BD /* b2PrismaticJoint.cpp */, - 8B0D318018366234005202BD /* b2PrismaticJoint.h */, - 8B0D318118366234005202BD /* b2PulleyJoint.cpp */, - 8B0D318218366234005202BD /* b2PulleyJoint.h */, - 8B0D318318366234005202BD /* b2RevoluteJoint.cpp */, - 8B0D318418366234005202BD /* b2RevoluteJoint.h */, - 8B0D318518366234005202BD /* b2RopeJoint.cpp */, - 8B0D318618366234005202BD /* b2RopeJoint.h */, - 8B0D318718366234005202BD /* b2WeldJoint.cpp */, - 8B0D318818366234005202BD /* b2WeldJoint.h */, - 8B0D318918366234005202BD /* b2WheelJoint.cpp */, - 8B0D318A18366234005202BD /* b2WheelJoint.h */, - ); - path = Joints; - sourceTree = ""; - }; - 8B0D318B18366234005202BD /* Rope */ = { - isa = PBXGroup; - children = ( - 8B0D318C18366234005202BD /* b2Rope.cpp */, - 8B0D318D18366234005202BD /* b2Rope.h */, - ); - name = Rope; - path = Classes/Box2D/Rope; - sourceTree = ""; - }; - 8BDA7B8A190BC3280023BD01 /* Input/Joystick/Gamepad */ = { - isa = PBXGroup; - children = ( - A72B57AF151A16F700223DD0 /* ITouches.h */, - A72B579C151A16F700223DD0 /* CJoystick.h */, - A72B579D151A16F700223DD0 /* CJoystick.m */, - A72B579E151A16F700223DD0 /* CJoystickAcc.h */, - A72B579F151A16F700223DD0 /* CJoystickAcc.m */, - 8BDA7B87190BC31F0023BD01 /* CJoystickGamePad.h */, - 8BDA7B88190BC31F0023BD01 /* CJoystickGamePad.m */, - A72B57AB151A16F700223DD0 /* CSysEvent.h */, - A72B57AC151A16F700223DD0 /* CSysEvent.m */, - A72B57AD151A16F700223DD0 /* CSysEventClick.h */, - A72B57AE151A16F700223DD0 /* CSysEventClick.m */, - ); - name = Input/Joystick/Gamepad; - sourceTree = ""; - }; - 8BDA7B8B190BC3450023BD01 /* UI */ = { - isa = PBXGroup; - children = ( - A72B57A5151A16F700223DD0 /* CRunView.h */, - A72B57A6151A16F700223DD0 /* CRunView.m */, - A72B57A7151A16F700223DD0 /* CRunViewController.h */, - A72B57A8151A16F700223DD0 /* CRunViewController.m */, - A72B57B0151A16F700223DD0 /* MainView.h */, - A72B57B1151A16F700223DD0 /* MainView.m */, - A72B57B2151A16F700223DD0 /* MainViewController.h */, - A72B57B3151A16F700223DD0 /* MainViewController.m */, - ); - name = UI; - sourceTree = ""; - }; - 8BDA7B8C190BC37C0023BD01 /* Sound */ = { - isa = PBXGroup; - children = ( - A72B57A9151A16F700223DD0 /* CSoundPlayer.h */, - A72B57AA151A16F700223DD0 /* CSoundPlayer.m */, - A72B57A0151A16F700223DD0 /* CMusicPlayer.h */, - A72B5796151A16F700223DD0 /* CALPlayer.h */, - A72B5797151A16F700223DD0 /* CALPlayer.m */, - ); - name = Sound; - sourceTree = ""; - }; - A72B578B151A16F700223DD0 /* Classes */ = { - isa = PBXGroup; - children = ( - A72B58E6151A16F800223DD0 /* RuntimeIPhoneAppDelegate.h */, - A72B58E7151A16F800223DD0 /* RuntimeIPhoneAppDelegate.m */, - A72B58C4151A16F800223DD0 /* OpenGL */, - A72B578C151A16F700223DD0 /* Animations */, - A72B5795151A16F700223DD0 /* Application */, - A72B57B4151A16F700223DD0 /* Banks */, - A72B57C2151A16F700223DD0 /* Events */, - A72B57CD151A16F800223DD0 /* Expressions */, - A72B57D0151A16F800223DD0 /* Extensions */, - A72B5848151A16F800223DD0 /* Frame */, - A72B584F151A16F800223DD0 /* Movements */, - A72B5896151A16F800223DD0 /* Objects */, - A72B58AB151A16F800223DD0 /* OI */, - A72B58CE151A16F800223DD0 /* RunLoop */, - A72B58E8151A16F800223DD0 /* Services */, - A72B5908151A16F800223DD0 /* Sprites */, - A72B5916151A16F800223DD0 /* Transitions */, - A72B5923151A16F800223DD0 /* Values */, - ); - path = Classes; - sourceTree = ""; - }; - A72B578C151A16F700223DD0 /* Animations */ = { - isa = PBXGroup; - children = ( - A72B578D151A16F700223DD0 /* CAnim.h */, - A72B578E151A16F700223DD0 /* CAnim.m */, - A72B578F151A16F700223DD0 /* CAnimDir.h */, - A72B5790151A16F700223DD0 /* CAnimDir.m */, - A72B5791151A16F700223DD0 /* CAnimHeader.h */, - A72B5792151A16F700223DD0 /* CAnimHeader.m */, - A72B5793151A16F700223DD0 /* CRAni.h */, - A72B5794151A16F700223DD0 /* CRAni.m */, - ); - path = Animations; - sourceTree = ""; - }; - A72B5795151A16F700223DD0 /* Application */ = { - isa = PBXGroup; - children = ( - 8B189F7F17F72DA500C3DC8A /* CTexture.h */, - 8B189F8017F72DA500C3DC8A /* CTexture.m */, - A72B57A1151A16F700223DD0 /* CRunApp.h */, - A72B57A2151A16F700223DD0 /* CRunApp.m */, - A72B57A3151A16F700223DD0 /* CRunFrame.h */, - A72B57A4151A16F700223DD0 /* CRunFrame.m */, - A72B5798151A16F700223DD0 /* CEmbeddedFile.h */, - A72B5799151A16F700223DD0 /* CEmbeddedFile.m */, - 8BDA7B8B190BC3450023BD01 /* UI */, - 8BDA7B8C190BC37C0023BD01 /* Sound */, - 8BDA7B8A190BC3280023BD01 /* Input/Joystick/Gamepad */, - ); - path = Application; - sourceTree = ""; - }; - A72B57B4151A16F700223DD0 /* Banks */ = { - isa = PBXGroup; - children = ( - A72B57B5151A16F700223DD0 /* CFont.h */, - A72B57B6151A16F700223DD0 /* CFont.m */, - A72B57B7151A16F700223DD0 /* CFontBank.h */, - A72B57B8151A16F700223DD0 /* CFontBank.m */, - A72B57B9151A16F700223DD0 /* CImage.h */, - A72B57BA151A16F700223DD0 /* CImage.m */, - A72B57BB151A16F700223DD0 /* CImageBank.h */, - A72B57BC151A16F700223DD0 /* CImageBank.m */, - A72B57BD151A16F700223DD0 /* CSound.h */, - A72B57BE151A16F700223DD0 /* CSound.m */, - A72B57BF151A16F700223DD0 /* CSoundBank.h */, - A72B57C0151A16F700223DD0 /* CSoundBank.m */, - A72B57C1151A16F700223DD0 /* IEnum.h */, - ); - path = Banks; - sourceTree = ""; - }; - A72B57C2151A16F700223DD0 /* Events */ = { - isa = PBXGroup; - children = ( - A72B57C3151A16F700223DD0 /* CEventProgram.h */, - A72B57C4151A16F700223DD0 /* CEventProgram.m */, - A72B57C5151A16F700223DD0 /* CEvents.h */, - A72B57C6151A16F700223DD0 /* CEvents.m */, - A72B57C8151A16F800223DD0 /* CLoadQualifiers.h */, - A72B57C9151A16F800223DD0 /* CLoadQualifiers.m */, - A72B57CA151A16F800223DD0 /* Cncf.h */, - A72B57CB151A16F800223DD0 /* CQualToOiList.h */, - A72B57CC151A16F800223DD0 /* CQualToOiList.m */, - ); - path = Events; - sourceTree = ""; - }; - A72B57CD151A16F800223DD0 /* Expressions */ = { - isa = PBXGroup; - children = ( - A72B57CE151A16F800223DD0 /* CValue.h */, - A72B57CF151A16F800223DD0 /* CValue.m */, - ); - path = Expressions; - sourceTree = ""; - }; - A72B57D0151A16F800223DD0 /* Extensions */ = { - isa = PBXGroup; - children = ( - A72B57D1151A16F800223DD0 /* CActExtension.h */, - A72B57D2151A16F800223DD0 /* CActExtension.m */, - 0F7EE90B1834BB4000DCECFF /* CBox2D.h */, - 0F7EE90C1834C33A00DCECFF /* CBox2D.m */, - A72B57D3151A16F800223DD0 /* CCndExtension.h */, - A72B57D4151A16F800223DD0 /* CCndExtension.m */, - A72B57D5151A16F800223DD0 /* CExtLoad.h */, - A72B57D6151A16F800223DD0 /* CExtLoad.m */, - A72B57D7151A16F800223DD0 /* CExtLoader.h */, - A72B57D8151A16F800223DD0 /* CExtLoader.m */, - A72B57D9151A16F800223DD0 /* CRunAccelerometer.h */, - A72B57DA151A16F800223DD0 /* CRunAccelerometer.m */, - A72B57DB151A16F800223DD0 /* CRunActiveBackdrop.h */, - A72B57DC151A16F800223DD0 /* CRunActiveBackdrop.m */, - A72B57DD151A16F800223DD0 /* CRunAdvDir.h */, - A72B57DE151A16F800223DD0 /* CRunAdvDir.m */, - A72B57DF151A16F800223DD0 /* CRunAdvGameBoard.h */, - A72B57E0151A16F800223DD0 /* CRunAdvGameBoard.m */, - A72B57E1151A16F800223DD0 /* CRunAdvPathMov.h */, - A72B57E2151A16F800223DD0 /* CRunAdvPathMov.m */, - ED755F371F84451E0041BDC0 /* CRunAESFusion.h */, - ED755F381F84451E0041BDC0 /* CRunAESFusion.m */, - 0F80619B1828CBC100040161 /* CRunBox2DBase.h */, - 0F80619C1828CBC100040161 /* CRunBox2DBase.m */, - 0F80F8691833ABA800A5D127 /* CRunBox2DFan.h */, - 0F80F86A1833ABA800A5D127 /* CRunBox2DFan.m */, - 0F80F8781833ECDE00A5D127 /* CRunBox2DGround.h */, - 0F80F8791833ECDE00A5D127 /* CRunBox2DGround.m */, - 0F8380DC1844A2BA00DEED30 /* CRunBox2DJoint.h */, - 0F8380DD1844A2BA00DEED30 /* CRunBox2DJoint.m */, - 0F80F86C1833B69C00A5D127 /* CRunBox2DMagnet.h */, - 0F80F86D1833B69C00A5D127 /* CRunBox2DMagnet.m */, - 0F80F8721833C5EF00A5D127 /* CRunBox2DParticules.h */, - 0F80F8731833C5EF00A5D127 /* CRunBox2DParticules.m */, - 0F80F8751833DC7400A5D127 /* CRunBox2DRopeAndChain.h */, - 0F80F8761833DC7500A5D127 /* CRunBox2DRopeAndChain.m */, - 0F80F86F1833C05100A5D127 /* CRunBox2DTreadmill.h */, - 0F80F8701833C05100A5D127 /* CRunBox2DTreadmill.m */, - A72B57E3151A16F800223DD0 /* CRunCalcRect.h */, - A72B57E4151A16F800223DD0 /* CRunCalcRect.m */, - A72B57E5151A16F800223DD0 /* CRunCamera.h */, - A72B57E6151A16F800223DD0 /* CRunCamera.m */, - A72B57E7151A16F800223DD0 /* CRunclickteam_movement_controller.h */, - A72B57E8151A16F800223DD0 /* CRunclickteam_movement_controller.m */, - A72B57E9151A16F800223DD0 /* CRunCreateByName.h */, - A72B57EA151A16F800223DD0 /* CRunCreateByName.m */, - A7DFA82115D93F7000A64A22 /* CRunDeadReckoning.h */, - A7DFA82215D93F7100A64A22 /* CRunDeadReckoning.m */, - A72B57EB151A16F800223DD0 /* CRunEasing.h */, - A72B57EC151A16F800223DD0 /* CRunEasing.m */, - A72B57ED151A16F800223DD0 /* CRunExtension.h */, - A72B57EE151A16F800223DD0 /* CRunExtension.m */, - 0FAF526416133ED60039137E /* CRunFlocking.h */, - 0FAF526516133ED60039137E /* CRunFlocking.m */, - A72B57EF151A16F800223DD0 /* CRunForEach.h */, - A72B57F0151A16F800223DD0 /* CRunForEach.m */, - A72B57F1151A16F800223DD0 /* CRunGameCenterAchievement.h */, - A72B57F2151A16F800223DD0 /* CRunGameCenterAchievement.m */, - A72B57F3151A16F800223DD0 /* CRunGameCenterAchievements.h */, - A72B57F4151A16F800223DD0 /* CRunGameCenterAchievements.m */, - A72B57F5151A16F800223DD0 /* CRunGameCenterConnect.h */, - A72B57F6151A16F800223DD0 /* CRunGameCenterConnect.m */, - A72B57F7151A16F800223DD0 /* CRunGameCenterLeaderboard.h */, - A72B57F8151A16F800223DD0 /* CRunGameCenterLeaderboard.m */, - A72B57F9151A16F800223DD0 /* CRunGameCenterMultiplayer.h */, - A72B57FA151A16F800223DD0 /* CRunGameCenterMultiplayer.m */, - A72B57FB151A16F800223DD0 /* CRunGet.h */, - A72B57FC151A16F800223DD0 /* CRunGet.m */, - A72B57FD151A16F800223DD0 /* CRunIIF.h */, - A72B57FE151A16F800223DD0 /* CRunIIF.m */, - A72B57FF151A16F800223DD0 /* CRunInAndOutController.h */, - A72B5800151A16F800223DD0 /* CRunInAndOutController.m */, - A7B6433E154707E500946D1E /* CRunInventory.h */, - A7B6433F154707E500946D1E /* CRunInventory.m */, - A72B5801151A16F800223DD0 /* CRuniOS.h */, - A72B5802151A16F800223DD0 /* CRuniOS.m */, - A72B5803151A16F800223DD0 /* CRuniOSButton.h */, - A72B5804151A16F800223DD0 /* CRuniOSButton.m */, - A72B5805151A16F800223DD0 /* CRuniOSMultipleEdit.h */, - A72B5806151A16F800223DD0 /* CRuniOSMultipleEdit.m */, - A72B5807151A16F800223DD0 /* CRuniOSSingleEdit.h */, - A72B5808151A16F800223DD0 /* CRuniOSSingleEdit.m */, - A72B580A151A16F800223DD0 /* CRuniOSStore.h */, - A72B580B151A16F800223DD0 /* CRuniOSStore.m */, - A72B580C151A16F800223DD0 /* CRuniOSVideo.h */, - A72B580D151A16F800223DD0 /* CRuniOSVideo.m */, - A72B580E151A16F800223DD0 /* CRunJoystickControl.h */, - A72B580F151A16F800223DD0 /* CRunJoystickControl.m */, - A72B5810151A16F800223DD0 /* CRunKcArray.h */, - A72B5811151A16F800223DD0 /* CRunKcArray.m */, - A72B5812151A16F800223DD0 /* CRunKcBoxA.h */, - A72B5813151A16F800223DD0 /* CRunKcBoxA.m */, - A72B5814151A16F800223DD0 /* CRunKcBoxB.h */, - A72B5815151A16F800223DD0 /* CRunKcBoxB.m */, - A72B5816151A16F800223DD0 /* CRunkcbutton.h */, - A72B5817151A16F800223DD0 /* CRunkcbutton.m */, - A72B5818151A16F800223DD0 /* CRunkcclock.h */, - A72B5819151A16F800223DD0 /* CRunkcclock.m */, - ED8B37B11F69C8D80080A3B8 /* CRunKcDbl.h */, - ED8B37B21F69C8D80080A3B8 /* CRunKcDbl.m */, - A72B581A151A16F800223DD0 /* CRunkcdirect.h */, - A72B581B151A16F800223DD0 /* CRunkcdirect.m */, - A72B581C151A16F800223DD0 /* CRunkcedit.h */, - A72B581D151A16F800223DD0 /* CRunkcedit.m */, - A72B581E151A16F800223DD0 /* CRunkchisc.h */, - A72B581F151A16F800223DD0 /* CRunkchisc.m */, - A72B5821151A16F800223DD0 /* CRunkcini.h */, - A72B5822151A16F800223DD0 /* CRunkcini.m */, - A72B5824151A16F800223DD0 /* CRunkcinput.h */, - A72B5825151A16F800223DD0 /* CRunkcinput.m */, - A72B5826151A16F800223DD0 /* CRunkclist.h */, - A72B5827151A16F800223DD0 /* CRunkclist.m */, - A72B5828151A16F800223DD0 /* CRunkcpica.h */, - A72B5829151A16F800223DD0 /* CRunkcpica.m */, - A72B582A151A16F800223DD0 /* CRunkcrandom.h */, - A72B582B151A16F800223DD0 /* CRunkcrandom.m */, - A72B582E151A16F800223DD0 /* CRunkcwctrl.h */, - A72B582F151A16F800223DD0 /* CRunkcwctrl.m */, - A72B5830151A16F800223DD0 /* CRunLayer.h */, - A72B5831151A16F800223DD0 /* CRunLayer.m */, - A72B5832151A16F800223DD0 /* CRunLocation.h */, - A72B5833151A16F800223DD0 /* CRunLocation.m */, - A72B5834151A16F800223DD0 /* CRunMobileUtilities.h */, - A72B5835151A16F800223DD0 /* CRunMobileUtilities.m */, - A72B5836151A16F800223DD0 /* CRunMoveIt.h */, - A72B5837151A16F800223DD0 /* CRunMoveIt.m */, - A72B5838151A16F800223DD0 /* CRunMoveSafely2.h */, - A72B5839151A16F800223DD0 /* CRunMoveSafely2.m */, - A72B583A151A16F800223DD0 /* CRunMTRandom.h */, - A72B583B151A16F800223DD0 /* CRunMTRandom.m */, - A72B583C151A16F800223DD0 /* CRunMultipleTouch.h */, - A72B583D151A16F800223DD0 /* CRunMultipleTouch.m */, - A72B583E151A16F800223DD0 /* CRunObjectMover.h */, - A72B583F151A16F800223DD0 /* CRunObjectMover.m */, - A72B5840151A16F800223DD0 /* CRunparser.h */, - A72B5841151A16F800223DD0 /* CRunparser.m */, - A72B5842151A16F800223DD0 /* CRunPlatform.h */, - A72B5843151A16F800223DD0 /* CRunPlatform.m */, - 8BBA59CD18058211002222A0 /* CRunScreenZoom.h */, - 8BBA59CE18058211002222A0 /* CRunScreenZoom.m */, - 8B5CD3771B338F85008478B7 /* CRunStencilMask.h */, - 8B5CD3751B336348008478B7 /* CRunStencilMask.m */, - A72B5844151A16F800223DD0 /* CRunStringTokenizer.h */, - A72B5845151A16F800223DD0 /* CRunStringTokenizer.m */, - A72B5846151A16F800223DD0 /* CRunWargameMap.h */, - A72B5847151A16F800223DD0 /* CRunWargameMap.m */, - EDE55AF51D2D490500B5AA42 /* CRunWebView2.h */, - EDE55AF61D2D490500B5AA42 /* CRunWebView2.m */, - 81B13D8F27EC884000AF5BF4 /* CRunTemplate.h */, - 81B13D9027EC884000AF5BF4 /* CRunTemplate.m */, - 8103571A27EFE941000AD374 /* CRunFindTheWay.h */, - 8103571B27EFE941000AD374 /* CRunFindTheWay.m */, - ); - path = Extensions; - sourceTree = ""; - }; - A72B5848151A16F800223DD0 /* Frame */ = { - isa = PBXGroup; - children = ( - A72B5849151A16F800223DD0 /* CLayer.h */, - A72B584A151A16F800223DD0 /* CLayer.m */, - A72B584B151A16F800223DD0 /* CLO.h */, - A72B584C151A16F800223DD0 /* CLO.m */, - A72B584D151A16F800223DD0 /* CLOList.h */, - A72B584E151A16F800223DD0 /* CLOList.m */, - ); - path = Frame; - sourceTree = ""; - }; - A72B584F151A16F800223DD0 /* Movements */ = { - isa = PBXGroup; - children = ( - A72B5850151A16F800223DD0 /* CMove.h */, - A72B5851151A16F800223DD0 /* CMove.m */, - A72B5852151A16F800223DD0 /* CMoveBall.h */, - A72B5853151A16F800223DD0 /* CMoveBall.m */, - A72B5854151A16F800223DD0 /* CMoveBullet.h */, - A72B5855151A16F800223DD0 /* CMoveBullet.m */, - A72B5856151A16F800223DD0 /* CMoveDef.h */, - A72B5857151A16F800223DD0 /* CMoveDef.m */, - A72B5858151A16F800223DD0 /* CMoveDefBall.h */, - A72B5859151A16F800223DD0 /* CMoveDefBall.m */, - A72B585A151A16F800223DD0 /* CMoveDefExtension.h */, - A72B585B151A16F800223DD0 /* CMoveDefExtension.m */, - A72B585C151A16F800223DD0 /* CMoveDefGeneric.h */, - A72B585D151A16F800223DD0 /* CMoveDefGeneric.m */, - A72B585E151A16F800223DD0 /* CMoveDefList.h */, - A72B585F151A16F800223DD0 /* CMoveDefList.m */, - A72B5860151A16F800223DD0 /* CMoveDefMouse.h */, - A72B5861151A16F800223DD0 /* CMoveDefMouse.m */, - A72B5862151A16F800223DD0 /* CMoveDefPath.h */, - A72B5863151A16F800223DD0 /* CMoveDefPath.m */, - A72B5864151A16F800223DD0 /* CMoveDefPlatform.h */, - A72B5865151A16F800223DD0 /* CMoveDefPlatform.m */, - A72B5866151A16F800223DD0 /* CMoveDefRace.h */, - A72B5867151A16F800223DD0 /* CMoveDefRace.m */, - A72B5868151A16F800223DD0 /* CMoveDefStatic.h */, - A72B5869151A16F800223DD0 /* CMoveDefStatic.m */, - A72B586A151A16F800223DD0 /* CMoveDisappear.h */, - A72B586B151A16F800223DD0 /* CMoveDisappear.m */, - A72B586C151A16F800223DD0 /* CMoveExtension.h */, - A72B586D151A16F800223DD0 /* CMoveExtension.m */, - A72B586E151A16F800223DD0 /* CMoveGeneric.h */, - A72B586F151A16F800223DD0 /* CMoveGeneric.m */, - A72B5870151A16F800223DD0 /* CMoveMouse.h */, - A72B5871151A16F800223DD0 /* CMoveMouse.m */, - A72B5872151A16F800223DD0 /* CMovePath.h */, - A72B5873151A16F800223DD0 /* CMovePath.m */, - A72B5874151A16F800223DD0 /* CMovePlatform.h */, - A72B5875151A16F800223DD0 /* CMovePlatform.m */, - A72B5876151A16F800223DD0 /* CMoveRace.h */, - A72B5877151A16F800223DD0 /* CMoveRace.m */, - A72B5878151A16F800223DD0 /* CMoveStatic.h */, - A72B5879151A16F800223DD0 /* CMoveStatic.m */, - A72B587A151A16F800223DD0 /* CPathStep.h */, - A72B587B151A16F800223DD0 /* CPathStep.m */, - A72B587C151A16F800223DD0 /* CRMvt.h */, - A72B587D151A16F800223DD0 /* CRMvt.m */, - A72B587E151A16F800223DD0 /* CRunMvtclickteam_circular.h */, - A72B587F151A16F800223DD0 /* CRunMvtclickteam_circular.m */, - A72B5880151A16F800223DD0 /* CRunMvtclickteam_dragdrop.h */, - A72B5881151A16F800223DD0 /* CRunMvtclickteam_dragdrop.m */, - A72B5882151A16F800223DD0 /* CRunMvtclickteam_invaders.h */, - A72B5883151A16F800223DD0 /* CRunMvtclickteam_invaders.m */, - A72B5884151A16F800223DD0 /* CRunMvtclickteam_presentation.h */, - A72B5885151A16F800223DD0 /* CRunMvtclickteam_presentation.m */, - A72B5886151A16F800223DD0 /* CRunMvtclickteam_regpolygon.h */, - A72B5887151A16F800223DD0 /* CRunMvtclickteam_regpolygon.m */, - A72B5888151A16F800223DD0 /* CRunMvtclickteam_simple_ellipse.h */, - A72B5889151A16F800223DD0 /* CRunMvtclickteam_simple_ellipse.m */, - A72B588A151A16F800223DD0 /* CRunMvtclickteam_sinewave.h */, - A72B588B151A16F800223DD0 /* CRunMvtclickteam_sinewave.m */, - A72B588C151A16F800223DD0 /* CRunMvtclickteam_vector.h */, - A72B588D151A16F800223DD0 /* CRunMvtclickteam_vector.m */, - A72B588E151A16F800223DD0 /* CRunMvtExtension.h */, - A72B588F151A16F800223DD0 /* CRunMvtExtension.m */, - A72B5890151A16F800223DD0 /* CRunMvtinandout.h */, - A72B5891151A16F800223DD0 /* CRunMvtinandout.m */, - A72B5892151A16F800223DD0 /* CRunMvtpinball.h */, - A72B5893151A16F800223DD0 /* CRunMvtpinball.m */, - A72B5894151A16F800223DD0 /* CRunMvtspaceship.h */, - A72B5895151A16F800223DD0 /* CRunMvtspaceship.m */, - 0F801998182BD92400C543EE /* CRunMvtbox2d8directions.h */, - 0F801999182BD92400C543EE /* CRunMvtbox2d8directions.m */, - 0F80199B182BF60C00C543EE /* CRunMvtbox2daxial.h */, - 0F80199C182BF60D00C543EE /* CRunMvtbox2daxial.m */, - 0F8029D4182CBC6500F3854F /* CRunMvtbox2dbackground.h */, - 0F8029D5182CBC6500F3854F /* CRunMvtbox2dbackground.m */, - 0F8029D7182CC1C200F3854F /* CRunMvtbox2dbouncingball.h */, - 0F8029D8182CC1C200F3854F /* CRunMvtbox2dbouncingball.m */, - 0F8029DA182CC71B00F3854F /* CRunMvtbox2dplatform.h */, - 0F8029DB182CC71B00F3854F /* CRunMvtbox2dplatform.m */, - 0F80F85D1833610E00A5D127 /* CRunMvtbox2dracecar.h */, - 0F80F85E1833610E00A5D127 /* CRunMvtbox2dracecar.m */, - 0F80F8601833673600A5D127 /* CRunMvtbox2dspaceship.h */, - 0F80F8611833673600A5D127 /* CRunMvtbox2dspaceship.m */, - 0F80F863183384EF00A5D127 /* CRunMvtbox2dspring.h */, - 0F80F864183384F000A5D127 /* CRunMvtbox2dspring.m */, - 0F80F86618338A2000A5D127 /* CRunMvtbox2dstatic.h */, - 0F80F86718338A2000A5D127 /* CRunMvtbox2dstatic.m */, - ); - path = Movements; - sourceTree = ""; - }; - A72B5896151A16F800223DD0 /* Objects */ = { - isa = PBXGroup; - children = ( - A72B58A1151A16F800223DD0 /* CObject.h */, - A72B58A2151A16F800223DD0 /* CObject.m */, - A72B5897151A16F800223DD0 /* CActive.h */, - A72B5898151A16F800223DD0 /* CActive.m */, - A72B5899151A16F800223DD0 /* CCCA.h */, - A72B589A151A16F800223DD0 /* CCCA.m */, - A72B589B151A16F800223DD0 /* CCounter.h */, - A72B589C151A16F800223DD0 /* CCounter.m */, - A72B589D151A16F800223DD0 /* CExtension.h */, - A72B589E151A16F800223DD0 /* CExtension.m */, - A72B589F151A16F800223DD0 /* CLives.h */, - A72B58A0151A16F800223DD0 /* CLives.m */, - A72B58A3151A16F800223DD0 /* CQuestion.h */, - A72B58A4151A16F800223DD0 /* CQuestion.m */, - A72B58A5151A16F800223DD0 /* CRCom.h */, - A72B58A6151A16F800223DD0 /* CRCom.m */, - A72B58A7151A16F800223DD0 /* CScore.h */, - A72B58A8151A16F800223DD0 /* CScore.m */, - A72B58A9151A16F800223DD0 /* CText.h */, - A72B58AA151A16F800223DD0 /* CText.m */, - ); - path = Objects; - sourceTree = ""; - }; - A72B58AB151A16F800223DD0 /* OI */ = { - isa = PBXGroup; - children = ( - A72B58AC151A16F800223DD0 /* CDefCCA.h */, - A72B58AD151A16F800223DD0 /* CDefCCA.m */, - A72B58AE151A16F800223DD0 /* CDefCounter.h */, - A72B58AF151A16F800223DD0 /* CDefCounter.m */, - A72B58B0151A16F800223DD0 /* CDefCounters.h */, - A72B58B1151A16F800223DD0 /* CDefCounters.m */, - A72B58B2151A16F800223DD0 /* CDefObject.h */, - A72B58B3151A16F800223DD0 /* CDefObject.m */, - A72B58B4151A16F800223DD0 /* CDefText.h */, - A72B58B5151A16F800223DD0 /* CDefText.m */, - A72B58B6151A16F800223DD0 /* CDefTexts.h */, - A72B58B7151A16F800223DD0 /* CDefTexts.m */, - A72B58B8151A16F800223DD0 /* CObjectCommon.h */, - A72B58B9151A16F800223DD0 /* CObjectCommon.m */, - A72B58BA151A16F800223DD0 /* COC.h */, - A72B58BB151A16F800223DD0 /* COC.m */, - A72B58BC151A16F800223DD0 /* COCBackground.h */, - A72B58BD151A16F800223DD0 /* COCBackground.m */, - A72B58BE151A16F800223DD0 /* COCQBackdrop.h */, - A72B58BF151A16F800223DD0 /* COCQBackdrop.m */, - A72B58C0151A16F800223DD0 /* COI.h */, - A72B58C1151A16F800223DD0 /* COI.m */, - A72B58C2151A16F800223DD0 /* COIList.h */, - A72B58C3151A16F800223DD0 /* COIList.m */, - ); - path = OI; - sourceTree = ""; - }; - A72B58C4151A16F800223DD0 /* OpenGL */ = { - isa = PBXGroup; - children = ( - 8B2D764D17EB363E00599FBE /* CRenderer.cpp */, - 8B2D764E17EB363E00599FBE /* CRenderer.h */, - A72B58C9151A16F800223DD0 /* CShader.h */, - A72B58CA151A16F800223DD0 /* CShader.cpp */, - A72B58CB151A16F800223DD0 /* CTextSurface.h */, - A72B58CC151A16F800223DD0 /* CTextSurface.m */, - A72B58C7151A16F800223DD0 /* CRenderToTexture.h */, - A72B58C8151A16F800223DD0 /* CRenderToTexture.m */, - ); - path = OpenGL; - sourceTree = ""; - }; - A72B58CE151A16F800223DD0 /* RunLoop */ = { - isa = PBXGroup; - children = ( - A72B58CF151A16F800223DD0 /* CBackDraw.h */, - A72B58D0151A16F800223DD0 /* CBackDraw.m */, - A72B58D1151A16F800223DD0 /* CBackDrawCls.h */, - A72B58D2151A16F800223DD0 /* CBackDrawCls.m */, - A72B58D3151A16F800223DD0 /* CBackDrawClsZone.h */, - A72B58D4151A16F800223DD0 /* CBackDrawClsZone.m */, - A72B58D5151A16F800223DD0 /* CBackDrawPaste.h */, - A72B58D6151A16F800223DD0 /* CBackDrawPaste.m */, - A72B58D7151A16F800223DD0 /* CBkd2.h */, - A72B58D8151A16F800223DD0 /* CBkd2.m */, - A72B58D9151A16F800223DD0 /* CCreateObjectInfo.h */, - A72B58DA151A16F800223DD0 /* CCreateObjectInfo.m */, - A72B58DB151A16F800223DD0 /* CExtStorage.h */, - A72B58DC151A16F800223DD0 /* CExtStorage.m */, - A72B58DD151A16F800223DD0 /* CLoop.h */, - A72B58DE151A16F800223DD0 /* CLoop.m */, - A72B58DF151A16F800223DD0 /* CObjInfo.h */, - A72B58E0151A16F800223DD0 /* CObjInfo.m */, - A72B58E1151A16F800223DD0 /* CRun.h */, - A72B58E2151A16F800223DD0 /* CRun.m */, - A72B58E4151A16F800223DD0 /* CSaveGlobal.h */, - A72B58E5151A16F800223DD0 /* CSaveGlobal.m */, - ); - path = RunLoop; - sourceTree = ""; - }; - A72B58E8151A16F800223DD0 /* Services */ = { - isa = PBXGroup; - children = ( - 0FAF526716133F570039137E /* CPoint.m */, - 8BDA0073180EEB6B00E583E2 /* Array.h */, - A72B58E9151A16F800223DD0 /* CArrayList.h */, - A72B58EA151A16F800223DD0 /* CArrayList.m */, - A72B58EB151A16F800223DD0 /* CBitmap.h */, - A72B58EC151A16F800223DD0 /* CBitmap.m */, - A72B58ED151A16F800223DD0 /* CChunk.h */, - A72B58EE151A16F800223DD0 /* CChunk.m */, - A72B58EF151A16F800223DD0 /* CFile.h */, - A72B58F1151A16F800223DD0 /* CFile.m */, - A72B58F3151A16F800223DD0 /* CFontInfo.h */, - A72B58F4151A16F800223DD0 /* CFontInfo.m */, - A72B58F5151A16F800223DD0 /* CIni.h */, - A72B58F6151A16F800223DD0 /* CIni.m */, - A72B58F8151A16F800223DD0 /* CoreMath.h */, - A72B58F9151A16F800223DD0 /* CoreMath.m */, - A72B58FA151A16F800223DD0 /* CPoint.h */, - A72B58FB151A16F800223DD0 /* CRect.h */, - A72B58FC151A16F800223DD0 /* CRect.m */, - A72B58FD151A16F800223DD0 /* CServices.h */, - A72B58FE151A16F800223DD0 /* CServices.m */, - A72B5901151A16F800223DD0 /* ModalInput.h */, - A72B5902151A16F800223DD0 /* ModalInput.m */, - A72B5903151A16F800223DD0 /* NSExtensions.h */, - A72B5904151A16F800223DD0 /* NSExtensions.m */, - A72B5905151A16F800223DD0 /* ObjectSelection.h */, - A72B5906151A16F800223DD0 /* ObjectSelection.m */, - A7C915C215F7FD5C00F5369B /* Reachability.h */, - A7C915C315F7FD5C00F5369B /* Reachability.m */, - A72B5907151A16F800223DD0 /* sort.h */, - ); - path = Services; - sourceTree = ""; - }; - A72B5908151A16F800223DD0 /* Sprites */ = { - isa = PBXGroup; - children = ( - A72B5909151A16F800223DD0 /* CColMask.h */, - A72B590A151A16F800223DD0 /* CColMask.m */, - A72B590B151A16F800223DD0 /* CMask.h */, - A72B590C151A16F800223DD0 /* CMask.m */, - A72B590D151A16F800223DD0 /* CPSCM.h */, - A72B590E151A16F800223DD0 /* CPSCM.m */, - A72B590F151A16F800223DD0 /* CRSpr.h */, - A72B5910151A16F800223DD0 /* CRSpr.m */, - A72B5911151A16F800223DD0 /* CSprite.h */, - A72B5912151A16F800223DD0 /* CSprite.m */, - A72B5913151A16F800223DD0 /* CSpriteGen.h */, - A72B5914151A16F800223DD0 /* CSpriteGen.m */, - A72B5915151A16F800223DD0 /* IDrawable.h */, - ); - path = Sprites; - sourceTree = ""; - }; - A72B5916151A16F800223DD0 /* Transitions */ = { - isa = PBXGroup; - children = ( - A72B5917151A16F800223DD0 /* CFadeSprite.h */, - A72B5918151A16F800223DD0 /* CFadeSprite.m */, - A72B5919151A16F800223DD0 /* CTrans.h */, - A72B591A151A16F800223DD0 /* CTrans.m */, - A72B591B151A16F800223DD0 /* CTransitionData.h */, - A72B591C151A16F800223DD0 /* CTransitionData.m */, - A72B591D151A16F800223DD0 /* CTransitionManager.h */, - A72B591E151A16F800223DD0 /* CTransitionManager.m */, - A72B591F151A16F800223DD0 /* CTransitions.h */, - A72B5920151A16F800223DD0 /* CTransitions.m */, - A72B5921151A16F800223DD0 /* CTransitionscctrans.h */, - A72B5922151A16F800223DD0 /* CTransitionscctrans.m */, - ); - path = Transitions; - sourceTree = ""; - }; - A72B5923151A16F800223DD0 /* Values */ = { - isa = PBXGroup; - children = ( - A72B5924151A16F800223DD0 /* CDefStrings.h */, - A72B5925151A16F800223DD0 /* CDefStrings.m */, - A72B5926151A16F800223DD0 /* CDefValues.h */, - A72B5927151A16F800223DD0 /* CDefValues.m */, - A72B5928151A16F800223DD0 /* CRVal.h */, - A72B5929151A16F800223DD0 /* CRVal.m */, - ); - path = Values; - sourceTree = ""; - }; - A7711B411185F6AC0068BD0C /* Shaders */ = { - isa = PBXGroup; - children = ( - ED15A7F02247ED7900798304 /* sineoffset_ext.fsh */, - ED15A7F12247ED7900798304 /* sineoffset_ext.vsh */, - ED15A7F32247ED7900798304 /* sinewave_ext.fsh */, - ED15A7F22247ED7900798304 /* sinewave_ext.vsh */, - EDE1CF2D21B1B5D00094F4F2 /* panorama_ext.fsh */, - EDE1CF2F21B1B5D00094F4F2 /* panorama_ext.vsh */, - EDE1CF2E21B1B5D00094F4F2 /* perspective_ext.fsh */, - EDE1CF3021B1B5D10094F4F2 /* perspective_ext.vsh */, - A70E403F120B1519005AC44F /* default.fsh */, - A70E4040120B1519005AC44F /* default.vsh */, - A70E4043120B1519005AC44F /* gradient.fsh */, - A70E4044120B1519005AC44F /* gradient.vsh */, - ); - name = Shaders; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* SDK */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "SDK" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - ); - buildRules = ( - 81B13D8E27EB896600AF5BF4 /* PBXBuildRule */, - 81B13D8D27EB895400AF5BF4 /* PBXBuildRule */, - ); - dependencies = ( - ); - name = SDK; - productName = SDK; - productReference = 1D6058910D05DD3D006BFB54 /* SDK.app */; - productType = "com.apple.product-type.application"; - }; - 8B0D3108183661E5005202BD /* Box2D */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8B0D3126183661E5005202BD /* Build configuration list for PBXNativeTarget "Box2D" */; - buildPhases = ( - 8B0D3105183661E5005202BD /* Sources */, - 8B0D3106183661E5005202BD /* Frameworks */, - 8B0D3107183661E5005202BD /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Box2D; - productName = Box2D; - productReference = 8B0D3109183661E5005202BD /* libBox2D.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1320; - ORGANIZATIONNAME = Clickteam; - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - SystemCapabilities = { - com.apple.BackgroundModes = { - enabled = 0; - }; - com.apple.GameCenter = { - enabled = 0; - }; - com.apple.InAppPurchase = { - enabled = 0; - }; - }; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SDK" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - en, - fr, - de, - Base, - ja, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* SDK */, - 8B0D3108183661E5005202BD /* Box2D */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 043EC9DB23548329007001F0 /* joydown.png in Resources */, - EDE1CF3121B1B5D10094F4F2 /* panorama_ext.fsh in Resources */, - ED15A7F42247ED7900798304 /* sineoffset_ext.fsh in Resources */, - A70E4056120B1540005AC44F /* default.fsh in Resources */, - A70E4057120B1540005AC44F /* default.vsh in Resources */, - A70E405A120B1540005AC44F /* gradient.fsh in Resources */, - A70E405B120B1540005AC44F /* gradient.vsh in Resources */, - A70E4036120B14FD005AC44F /* fire1D.png in Resources */, - ED961E9C22166838008709D4 /* ic_error.png in Resources */, - A70E4038120B14FD005AC44F /* fire2D.png in Resources */, - 043EC9E923548352007001F0 /* joyright.png in Resources */, - ED15A7F72247ED7900798304 /* sinewave_ext.fsh in Resources */, - ED15A7F62247ED7900798304 /* sinewave_ext.vsh in Resources */, - ED15A7F52247ED7900798304 /* sineoffset_ext.vsh in Resources */, - ED961E9B22166838008709D4 /* ic_question.png in Resources */, - 043EC9E723548352007001F0 /* joyupd.png in Resources */, - A70E4039120B14FD005AC44F /* fire2U.png in Resources */, - A70E403B120B14FD005AC44F /* joyback.png in Resources */, - 3DA0F3A819FE38140080FDC5 /* Images.xcassets in Resources */, - ED961E9E22166838008709D4 /* ic_information.png in Resources */, - A70E403C120B14FD005AC44F /* joyfront.png in Resources */, - 043EC9E423548352007001F0 /* joyup.png in Resources */, - 043EC9DD23548333007001F0 /* joydownd.png in Resources */, - 0F812EB6122F9D160032040B /* ITunesArtwork.png in Resources */, - 043EC9E523548352007001F0 /* joyrightd.png in Resources */, - EDE1CF3221B1B5D10094F4F2 /* perspective_ext.fsh in Resources */, - A7136799139D3C550082293B /* Application.cci in Resources */, - EDE1CF3321B1B5D10094F4F2 /* panorama_ext.vsh in Resources */, - 043EC9E823548352007001F0 /* joyleft.png in Resources */, - 043EC9E623548352007001F0 /* joyleftd.png in Resources */, - ED961E9D22166838008709D4 /* ic_exclamation.png in Resources */, - EDE1CF3421B1B5D10094F4F2 /* perspective_ext.vsh in Resources */, - A74B0243145D55510055BC9D /* fire1U.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - A7C915C515F7FD9200F5369B /* Reachability.m in Sources */, - A7DFA82315D94BEC00A64A22 /* CRunDeadReckoning.m in Sources */, - A7B643401547084500946D1E /* CRunInventory.m in Sources */, - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - A72B592A151A16F800223DD0 /* CAnim.m in Sources */, - A72B592B151A16F800223DD0 /* CAnimDir.m in Sources */, - A72B592C151A16F800223DD0 /* CAnimHeader.m in Sources */, - A72B592D151A16F800223DD0 /* CRAni.m in Sources */, - A72B592E151A16F800223DD0 /* CALPlayer.m in Sources */, - A72B592F151A16F800223DD0 /* CEmbeddedFile.m in Sources */, - A72B5931151A16F800223DD0 /* CJoystick.m in Sources */, - A72B5932151A16F800223DD0 /* CJoystickAcc.m in Sources */, - A72B5933151A16F800223DD0 /* CRunApp.m in Sources */, - A72B5934151A16F800223DD0 /* CRunFrame.m in Sources */, - A72B5935151A16F800223DD0 /* CRunView.m in Sources */, - ED8B37B31F69C8D80080A3B8 /* CRunKcDbl.m in Sources */, - A72B5936151A16F800223DD0 /* CRunViewController.m in Sources */, - A72B5937151A16F800223DD0 /* CSoundPlayer.m in Sources */, - A72B5938151A16F800223DD0 /* CSysEvent.m in Sources */, - A72B5939151A16F800223DD0 /* CSysEventClick.m in Sources */, - A72B593A151A16F800223DD0 /* MainView.m in Sources */, - A72B593B151A16F800223DD0 /* MainViewController.m in Sources */, - A72B593C151A16F800223DD0 /* CFont.m in Sources */, - A72B593D151A16F800223DD0 /* CFontBank.m in Sources */, - A72B593E151A16F800223DD0 /* CImage.m in Sources */, - A72B593F151A16F800223DD0 /* CImageBank.m in Sources */, - A72B5940151A16F800223DD0 /* CSound.m in Sources */, - A72B5941151A16F800223DD0 /* CSoundBank.m in Sources */, - A72B5942151A16F800223DD0 /* CEventProgram.m in Sources */, - 81B13D9127EC884000AF5BF4 /* CRunTemplate.m in Sources */, - A72B5943151A16F800223DD0 /* CEvents.m in Sources */, - A72B5945151A16F800223DD0 /* CLoadQualifiers.m in Sources */, - A72B5946151A16F800223DD0 /* CQualToOiList.m in Sources */, - A72B5947151A16F800223DD0 /* CValue.m in Sources */, - A72B5948151A16F800223DD0 /* CActExtension.m in Sources */, - A72B5949151A16F800223DD0 /* CCndExtension.m in Sources */, - A72B594A151A16F800223DD0 /* CExtLoad.m in Sources */, - A72B594B151A16F800223DD0 /* CExtLoader.m in Sources */, - A72B594C151A16F800223DD0 /* CRunAccelerometer.m in Sources */, - A72B594D151A16F800223DD0 /* CRunActiveBackdrop.m in Sources */, - A72B594E151A16F800223DD0 /* CRunAdvDir.m in Sources */, - A72B594F151A16F800223DD0 /* CRunAdvGameBoard.m in Sources */, - A72B5950151A16F800223DD0 /* CRunAdvPathMov.m in Sources */, - A72B5951151A16F800223DD0 /* CRunCalcRect.m in Sources */, - A72B5952151A16F800223DD0 /* CRunCamera.m in Sources */, - A72B5953151A16F800223DD0 /* CRunclickteam_movement_controller.m in Sources */, - A72B5954151A16F800223DD0 /* CRunCreateByName.m in Sources */, - A72B5955151A16F800223DD0 /* CRunEasing.m in Sources */, - A72B5956151A16F800223DD0 /* CRunExtension.m in Sources */, - A72B5957151A16F800223DD0 /* CRunForEach.m in Sources */, - A72B5958151A16F800223DD0 /* CRunGameCenterAchievement.m in Sources */, - A72B5959151A16F800223DD0 /* CRunGameCenterAchievements.m in Sources */, - A72B595A151A16F800223DD0 /* CRunGameCenterConnect.m in Sources */, - A72B595B151A16F800223DD0 /* CRunGameCenterLeaderboard.m in Sources */, - A72B595C151A16F800223DD0 /* CRunGameCenterMultiplayer.m in Sources */, - A72B595D151A16F800223DD0 /* CRunGet.m in Sources */, - A72B595E151A16F800223DD0 /* CRunIIF.m in Sources */, - A72B595F151A16F800223DD0 /* CRunInAndOutController.m in Sources */, - A72B5960151A16F800223DD0 /* CRuniOS.m in Sources */, - A72B5961151A16F800223DD0 /* CRuniOSButton.m in Sources */, - A72B5962151A16F800223DD0 /* CRuniOSMultipleEdit.m in Sources */, - A72B5963151A16F800223DD0 /* CRuniOSSingleEdit.m in Sources */, - A72B5965151A16F800223DD0 /* CRuniOSStore.m in Sources */, - A72B5966151A16F800223DD0 /* CRuniOSVideo.m in Sources */, - A72B5967151A16F800223DD0 /* CRunJoystickControl.m in Sources */, - A72B5968151A16F800223DD0 /* CRunKcArray.m in Sources */, - A72B5969151A16F800223DD0 /* CRunKcBoxA.m in Sources */, - A72B596A151A16F800223DD0 /* CRunKcBoxB.m in Sources */, - A72B596B151A16F800223DD0 /* CRunkcbutton.m in Sources */, - A72B596C151A16F800223DD0 /* CRunkcclock.m in Sources */, - A72B596D151A16F800223DD0 /* CRunkcdirect.m in Sources */, - A72B596E151A16F800223DD0 /* CRunkcedit.m in Sources */, - A72B596F151A16F800223DD0 /* CRunkchisc.m in Sources */, - A72B5971151A16F800223DD0 /* CRunkcini.m in Sources */, - A72B5973151A16F800223DD0 /* CRunkcinput.m in Sources */, - A72B5974151A16F800223DD0 /* CRunkclist.m in Sources */, - A72B5975151A16F800223DD0 /* CRunkcpica.m in Sources */, - A72B5976151A16F800223DD0 /* CRunkcrandom.m in Sources */, - A72B5978151A16F800223DD0 /* CRunkcwctrl.m in Sources */, - A72B5979151A16F800223DD0 /* CRunLayer.m in Sources */, - A72B597A151A16F800223DD0 /* CRunLocation.m in Sources */, - 8B189F8117F72DA500C3DC8A /* CTexture.m in Sources */, - A72B597B151A16F800223DD0 /* CRunMobileUtilities.m in Sources */, - A72B597C151A16F800223DD0 /* CRunMoveIt.m in Sources */, - A72B597D151A16F800223DD0 /* CRunMoveSafely2.m in Sources */, - A72B597E151A16F800223DD0 /* CRunMTRandom.m in Sources */, - A72B597F151A16F800223DD0 /* CRunMultipleTouch.m in Sources */, - A72B5980151A16F800223DD0 /* CRunObjectMover.m in Sources */, - A72B5981151A16F800223DD0 /* CRunparser.m in Sources */, - A72B5982151A16F800223DD0 /* CRunPlatform.m in Sources */, - A72B5983151A16F800223DD0 /* CRunStringTokenizer.m in Sources */, - A72B5984151A16F800223DD0 /* CRunWargameMap.m in Sources */, - A72B5985151A16F800223DD0 /* CLayer.m in Sources */, - A72B5986151A16F800223DD0 /* CLO.m in Sources */, - A72B5987151A16F800223DD0 /* CLOList.m in Sources */, - A72B5988151A16F800223DD0 /* CMove.m in Sources */, - A72B5989151A16F800223DD0 /* CMoveBall.m in Sources */, - A72B598A151A16F800223DD0 /* CMoveBullet.m in Sources */, - A72B598B151A16F800223DD0 /* CMoveDef.m in Sources */, - ED755F391F84451E0041BDC0 /* CRunAESFusion.m in Sources */, - A72B598C151A16F800223DD0 /* CMoveDefBall.m in Sources */, - A72B598D151A16F800223DD0 /* CMoveDefExtension.m in Sources */, - A72B598E151A16F800223DD0 /* CMoveDefGeneric.m in Sources */, - A72B598F151A16F800223DD0 /* CMoveDefList.m in Sources */, - A72B5990151A16F800223DD0 /* CMoveDefMouse.m in Sources */, - A72B5991151A16F800223DD0 /* CMoveDefPath.m in Sources */, - A72B5992151A16F800223DD0 /* CMoveDefPlatform.m in Sources */, - A72B5993151A16F800223DD0 /* CMoveDefRace.m in Sources */, - A72B5994151A16F800223DD0 /* CMoveDefStatic.m in Sources */, - A72B5995151A16F800223DD0 /* CMoveDisappear.m in Sources */, - A72B5996151A16F800223DD0 /* CMoveExtension.m in Sources */, - A72B5997151A16F800223DD0 /* CMoveGeneric.m in Sources */, - A72B5998151A16F800223DD0 /* CMoveMouse.m in Sources */, - A72B5999151A16F800223DD0 /* CMovePath.m in Sources */, - A72B599A151A16F800223DD0 /* CMovePlatform.m in Sources */, - A72B599B151A16F800223DD0 /* CMoveRace.m in Sources */, - A72B599C151A16F800223DD0 /* CMoveStatic.m in Sources */, - A72B599D151A16F800223DD0 /* CPathStep.m in Sources */, - A72B599E151A16F800223DD0 /* CRMvt.m in Sources */, - A72B599F151A16F800223DD0 /* CRunMvtclickteam_circular.m in Sources */, - A72B59A0151A16F800223DD0 /* CRunMvtclickteam_dragdrop.m in Sources */, - A72B59A1151A16F800223DD0 /* CRunMvtclickteam_invaders.m in Sources */, - A72B59A2151A16F800223DD0 /* CRunMvtclickteam_presentation.m in Sources */, - A72B59A3151A16F800223DD0 /* CRunMvtclickteam_regpolygon.m in Sources */, - A72B59A4151A16F800223DD0 /* CRunMvtclickteam_simple_ellipse.m in Sources */, - A72B59A5151A16F800223DD0 /* CRunMvtclickteam_sinewave.m in Sources */, - 8B5CD3761B336348008478B7 /* CRunStencilMask.m in Sources */, - A72B59A6151A16F800223DD0 /* CRunMvtclickteam_vector.m in Sources */, - A72B59A7151A16F800223DD0 /* CRunMvtExtension.m in Sources */, - A72B59A8151A16F800223DD0 /* CRunMvtinandout.m in Sources */, - A72B59A9151A16F800223DD0 /* CRunMvtpinball.m in Sources */, - A72B59AA151A16F800223DD0 /* CRunMvtspaceship.m in Sources */, - A72B59AB151A16F800223DD0 /* CActive.m in Sources */, - A72B59AC151A16F800223DD0 /* CCCA.m in Sources */, - A72B59AD151A16F800223DD0 /* CCounter.m in Sources */, - A72B59AE151A16F800223DD0 /* CExtension.m in Sources */, - A72B59AF151A16F800223DD0 /* CLives.m in Sources */, - 8103571C27EFE941000AD374 /* CRunFindTheWay.m in Sources */, - A72B59B0151A16F800223DD0 /* CObject.m in Sources */, - A72B59B1151A16F800223DD0 /* CQuestion.m in Sources */, - A72B59B2151A16F800223DD0 /* CRCom.m in Sources */, - A72B59B3151A16F800223DD0 /* CScore.m in Sources */, - A72B59B4151A16F800223DD0 /* CText.m in Sources */, - A72B59B5151A16F800223DD0 /* CDefCCA.m in Sources */, - A72B59B6151A16F800223DD0 /* CDefCounter.m in Sources */, - A72B59B7151A16F800223DD0 /* CDefCounters.m in Sources */, - A72B59B8151A16F800223DD0 /* CDefObject.m in Sources */, - A72B59B9151A16F800223DD0 /* CDefText.m in Sources */, - A72B59BA151A16F800223DD0 /* CDefTexts.m in Sources */, - A72B59BB151A16F800223DD0 /* CObjectCommon.m in Sources */, - A72B59BC151A16F800223DD0 /* COC.m in Sources */, - A72B59BD151A16F800223DD0 /* COCBackground.m in Sources */, - A72B59BE151A16F800223DD0 /* COCQBackdrop.m in Sources */, - A72B59BF151A16F800223DD0 /* COI.m in Sources */, - A72B59C0151A16F800223DD0 /* COIList.m in Sources */, - A72B59C2151A16F800223DD0 /* CRenderToTexture.m in Sources */, - A72B59C3151A16F800223DD0 /* CShader.cpp in Sources */, - A72B59C4151A16F800223DD0 /* CTextSurface.m in Sources */, - A72B59C5151A16F800223DD0 /* CBackDraw.m in Sources */, - A72B59C6151A16F800223DD0 /* CBackDrawCls.m in Sources */, - A72B59C7151A16F800223DD0 /* CBackDrawClsZone.m in Sources */, - EDE55AF71D2D490500B5AA42 /* CRunWebView2.m in Sources */, - A72B59C8151A16F800223DD0 /* CBackDrawPaste.m in Sources */, - A72B59C9151A16F800223DD0 /* CBkd2.m in Sources */, - A72B59CA151A16F800223DD0 /* CCreateObjectInfo.m in Sources */, - A72B59CB151A16F800223DD0 /* CExtStorage.m in Sources */, - A72B59CC151A16F800223DD0 /* CLoop.m in Sources */, - A72B59CD151A16F800223DD0 /* CObjInfo.m in Sources */, - A72B59CE151A16F800223DD0 /* CRun.m in Sources */, - A72B59D0151A16F800223DD0 /* CSaveGlobal.m in Sources */, - A72B59D1151A16F800223DD0 /* RuntimeIPhoneAppDelegate.m in Sources */, - A72B59D2151A16F800223DD0 /* CArrayList.m in Sources */, - A72B59D3151A16F800223DD0 /* CBitmap.m in Sources */, - A72B59D4151A16F800223DD0 /* CChunk.m in Sources */, - A72B59D6151A16F800223DD0 /* CFile.m in Sources */, - A72B59D8151A16F800223DD0 /* CFontInfo.m in Sources */, - A72B59D9151A16F800223DD0 /* CIni.m in Sources */, - A72B59DB151A16F800223DD0 /* CoreMath.m in Sources */, - A72B59DC151A16F800223DD0 /* CRect.m in Sources */, - 8B2D764F17EB363E00599FBE /* CRenderer.cpp in Sources */, - A72B59DD151A16F800223DD0 /* CServices.m in Sources */, - A72B59DF151A16F800223DD0 /* ModalInput.m in Sources */, - A72B59E0151A16F800223DD0 /* NSExtensions.m in Sources */, - A72B59E1151A16F800223DD0 /* ObjectSelection.m in Sources */, - 8BBA59CF18058211002222A0 /* CRunScreenZoom.m in Sources */, - A72B59E2151A16F800223DD0 /* CColMask.m in Sources */, - A72B59E3151A16F800223DD0 /* CMask.m in Sources */, - A72B59E4151A16F800223DD0 /* CPSCM.m in Sources */, - A72B59E5151A16F800223DD0 /* CRSpr.m in Sources */, - A72B59E6151A16F800223DD0 /* CSprite.m in Sources */, - A72B59E7151A16F800223DD0 /* CSpriteGen.m in Sources */, - A72B59E8151A16F800223DD0 /* CFadeSprite.m in Sources */, - A72B59E9151A16F800223DD0 /* CTrans.m in Sources */, - A72B59EA151A16F800223DD0 /* CTransitionData.m in Sources */, - A72B59EB151A16F800223DD0 /* CTransitionManager.m in Sources */, - A72B59EC151A16F800223DD0 /* CTransitions.m in Sources */, - A72B59ED151A16F800223DD0 /* CTransitionscctrans.m in Sources */, - A72B59EE151A16F800223DD0 /* CDefStrings.m in Sources */, - A72B59EF151A16F800223DD0 /* CDefValues.m in Sources */, - A72B59F0151A16F800223DD0 /* CRVal.m in Sources */, - 0FAF526616133ED70039137E /* CRunFlocking.m in Sources */, - 0FAF526816133F570039137E /* CPoint.m in Sources */, - 0F80619D1828CBC100040161 /* CRunBox2DBase.m in Sources */, - 0F80199A182BD92400C543EE /* CRunMvtbox2d8directions.m in Sources */, - 8BDA7B89190BC31F0023BD01 /* CJoystickGamePad.m in Sources */, - 0F80199D182BF60D00C543EE /* CRunMvtbox2daxial.m in Sources */, - 0F8029D6182CBC6500F3854F /* CRunMvtbox2dbackground.m in Sources */, - 0F8029D9182CC1C200F3854F /* CRunMvtbox2dbouncingball.m in Sources */, - 0F8029DC182CC71B00F3854F /* CRunMvtbox2dplatform.m in Sources */, - 0F80F85F1833610E00A5D127 /* CRunMvtbox2dracecar.m in Sources */, - 0F80F8621833673600A5D127 /* CRunMvtbox2dspaceship.m in Sources */, - 0F80F865183384F000A5D127 /* CRunMvtbox2dspring.m in Sources */, - 0F80F86818338A2000A5D127 /* CRunMvtbox2dstatic.m in Sources */, - 0F80F86B1833ABA800A5D127 /* CRunBox2DFan.m in Sources */, - 0F80F86E1833B69C00A5D127 /* CRunBox2DMagnet.m in Sources */, - 0F80F8711833C05100A5D127 /* CRunBox2DTreadmill.m in Sources */, - 0F80F8741833C5F000A5D127 /* CRunBox2DParticules.m in Sources */, - 0F80F8771833DC7600A5D127 /* CRunBox2DRopeAndChain.m in Sources */, - 0F80F87A1833ECDF00A5D127 /* CRunBox2DGround.m in Sources */, - 0F7EE90D1834C33A00DCECFF /* CBox2D.m in Sources */, - 0F8380DE1844A2BA00DEED30 /* CRunBox2DJoint.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8B0D3105183661E5005202BD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8B0D31BB18366251005202BD /* b2BroadPhase.cpp in Sources */, - 8B0D31BC18366251005202BD /* b2CollideCircle.cpp in Sources */, - 8B0D31BD18366251005202BD /* b2CollideEdge.cpp in Sources */, - 8B0D31BE18366251005202BD /* b2CollidePolygon.cpp in Sources */, - 8B0D31BF18366251005202BD /* b2Collision.cpp in Sources */, - 8B0D31C018366251005202BD /* b2Distance.cpp in Sources */, - 8B0D31C118366251005202BD /* b2DynamicTree.cpp in Sources */, - 8B0D31C218366251005202BD /* b2TimeOfImpact.cpp in Sources */, - 8B0D31C318366251005202BD /* b2ChainShape.cpp in Sources */, - 8B0D31C418366251005202BD /* b2CircleShape.cpp in Sources */, - 8B0D31C518366251005202BD /* b2EdgeShape.cpp in Sources */, - 8B0D31C618366251005202BD /* b2PolygonShape.cpp in Sources */, - 8B0D31C718366251005202BD /* b2BlockAllocator.cpp in Sources */, - 8B0D31C818366251005202BD /* b2Draw.cpp in Sources */, - 8B0D31C918366251005202BD /* b2Math.cpp in Sources */, - 8B0D31CA18366251005202BD /* b2Settings.cpp in Sources */, - 8B0D31CB18366251005202BD /* b2StackAllocator.cpp in Sources */, - 8B0D31CC18366251005202BD /* b2Timer.cpp in Sources */, - 8B0D31CD18366251005202BD /* b2Body.cpp in Sources */, - 8B0D31CE18366251005202BD /* b2ContactManager.cpp in Sources */, - 8B0D31CF18366251005202BD /* b2Fixture.cpp in Sources */, - 8B0D31D018366251005202BD /* b2Island.cpp in Sources */, - 8B0D31D118366251005202BD /* b2World.cpp in Sources */, - 8B0D31D218366251005202BD /* b2WorldCallbacks.cpp in Sources */, - 8B0D31D318366251005202BD /* b2ChainAndCircleContact.cpp in Sources */, - 8B0D31D418366251005202BD /* b2ChainAndPolygonContact.cpp in Sources */, - 8B0D31D518366251005202BD /* b2CircleContact.cpp in Sources */, - 8B0D31D618366251005202BD /* b2Contact.cpp in Sources */, - 8B0D31D718366251005202BD /* b2ContactSolver.cpp in Sources */, - 8B0D31D818366251005202BD /* b2EdgeAndCircleContact.cpp in Sources */, - 8B0D31D918366251005202BD /* b2EdgeAndPolygonContact.cpp in Sources */, - 8B0D31DA18366251005202BD /* b2PolygonAndCircleContact.cpp in Sources */, - 8B0D31DB18366251005202BD /* b2PolygonContact.cpp in Sources */, - 8B0D31DC18366251005202BD /* b2DistanceJoint.cpp in Sources */, - 8B0D31DD18366251005202BD /* b2FrictionJoint.cpp in Sources */, - 8B0D31DE18366251005202BD /* b2GearJoint.cpp in Sources */, - 8B0D31DF18366251005202BD /* b2Joint.cpp in Sources */, - 8B0D31E018366251005202BD /* b2MouseJoint.cpp in Sources */, - 8B0D31E118366251005202BD /* b2PrismaticJoint.cpp in Sources */, - 8B0D31E218366251005202BD /* b2PulleyJoint.cpp in Sources */, - 8B0D31E318366251005202BD /* b2RevoluteJoint.cpp in Sources */, - 8B0D31E418366251005202BD /* b2RopeJoint.cpp in Sources */, - 8B0D31E518366251005202BD /* b2WeldJoint.cpp in Sources */, - 8B0D31E618366251005202BD /* b2WheelJoint.cpp in Sources */, - 8B0D31E718366251005202BD /* b2Rope.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_INLINES_ARE_PRIVATE_EXTERN = NO; - GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = SDK_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_THUMB_SUPPORT = NO; - HEADER_SEARCH_PATHS = "\"$(SRCROOT)\"/**"; - INFOPLIST_FILE = "SDK-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - ); - OTHER_CFLAGS = "-Wno-shift-negative-value"; - PRODUCT_BUNDLE_IDENTIFIER = com.clickteam.runtime; - PRODUCT_NAME = SDK; - PROVISIONING_PROFILE = ""; - TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "\"$(PROJECT_DIR)/Classes\"/**"; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - ); - GCC_INLINES_ARE_PRIVATE_EXTERN = NO; - GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp; - GCC_OPTIMIZATION_LEVEL = fast; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = SDK_Prefix.pch; - GCC_THUMB_SUPPORT = NO; - HEADER_SEARCH_PATHS = "\"$(SRCROOT)\"/**"; - INFOPLIST_FILE = "SDK-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - ); - OTHER_CFLAGS = "-Wno-shift-negative-value"; - PRODUCT_BUNDLE_IDENTIFIER = com.clickteam.runtime; - PRODUCT_NAME = SDK; - PROVISIONING_PROFILE = ""; - TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "\"$(PROJECT_DIR)/Classes\"/**"; - }; - name = Release; - }; - 8B0D3127183661E5005202BD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DSTROOT = /tmp/Box2D.dst; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/Classes/**"; - }; - name = Debug; - }; - 8B0D3128183661E5005202BD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DSTROOT = /tmp/Box2D.dst; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/Classes/**"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_BITCODE = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_AUTO_VECTORIZATION = NO; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_THREADSAFE_STATICS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "$(SRCROOT)/*/**"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "-Wno-shift-negative-value"; - PROVISIONING_PROFILE = ""; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - RUN_CLANG_STATIC_ANALYZER = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_BITCODE = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_AUTO_VECTORIZATION = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 3; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_THREADSAFE_STATICS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = "$(SRCROOT)/*/**"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - OTHER_CFLAGS = "-Wno-shift-negative-value"; - PROVISIONING_PROFILE = ""; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "SDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 1D6058950D05DD3E006BFB54 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8B0D3126183661E5005202BD /* Build configuration list for PBXNativeTarget "Box2D" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8B0D3127183661E5005202BD /* Debug */, - 8B0D3128183661E5005202BD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/Extensions/iOS/SDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Extensions/iOS/SDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/Extensions/iOS/SDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Extensions/iOS/SDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Extensions/iOS/SDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/Extensions/iOS/SDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/Extensions/iOS/SDK.xcodeproj/project.xcworkspace/xcuserdata/defisym.xcuserdatad/UserInterfaceState.xcuserstate b/Extensions/iOS/SDK.xcodeproj/project.xcworkspace/xcuserdata/defisym.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 3f81ba8e9..000000000 Binary files a/Extensions/iOS/SDK.xcodeproj/project.xcworkspace/xcuserdata/defisym.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/Extensions/iOS/SDK.xcodeproj/xcuserdata/defisym.xcuserdatad/xcschemes/xcschememanagement.plist b/Extensions/iOS/SDK.xcodeproj/xcuserdata/defisym.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 8d300d40f..000000000 --- a/Extensions/iOS/SDK.xcodeproj/xcuserdata/defisym.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - SchemeUserState - - Box2D.xcscheme_^#shared#^_ - - orderHint - 1 - - SDK.xcscheme_^#shared#^_ - - orderHint - 0 - - - - diff --git a/Extensions/iOS/Tools/iOS.zip b/Extensions/iOS/Tools/iOS.zip deleted file mode 100644 index af21bf854..000000000 Binary files a/Extensions/iOS/Tools/iOS.zip and /dev/null differ diff --git a/Extensions/iOS/Tools/make_ext.py b/Extensions/iOS/Tools/make_ext.py new file mode 100644 index 000000000..f97ad0d51 --- /dev/null +++ b/Extensions/iOS/Tools/make_ext.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python3 +"""Create a Fusion iOS .ext from owned sources, without GUI dependencies. + +Independently implemented from observed SDK package framing and the standard +PKZIP traditional encryption format. No DarkEdif implementation is used. +""" +from __future__ import annotations +import argparse +import hashlib +import io +import os +from pathlib import Path, PurePosixPath +import re +import struct +import tempfile +import zipfile +import zlib + +# Format compatibility value used by the legacy SDK, not an access credential. +ZIP_PASSWORD = b'Kjfkj05kfJK' + + +def transform(data: bytes) -> bytes: + # The legacy framing transform is its own inverse. + return bytes((255 + index - value) & 255 for index, value in enumerate(data)) + + +def _crc(value: int, byte: int) -> int: + value ^= byte + for _ in range(8): + value = (value >> 1) ^ (0xedb88320 if value & 1 else 0) + return value + + +def _encrypt(data: bytes) -> bytes: + keys = [0x12345678, 0x23456789, 0x34567890] + def update(byte): + keys[0] = _crc(keys[0], byte) + keys[1] = ((keys[1] + (keys[0] & 255)) * 134775813 + 1) & 0xffffffff + keys[2] = _crc(keys[2], keys[1] >> 24) + for byte in ZIP_PASSWORD: + update(byte) + output = bytearray() + for byte in data: + temp = keys[2] | 2 + output.append(byte ^ (((temp * (temp ^ 1)) >> 8) & 255)) + update(byte) + return bytes(output) + + +def safe_name(name: str) -> str: + path = PurePosixPath(name) + if not name or path.is_absolute() or '..' in path.parts or '\\' in name or ':' in name or '\0' in name: + raise ValueError(f'Invalid package path: {name!r}') + return str(path) + + +def project_metadata(name: str, names) -> bytes: + if not re.fullmatch(r'[A-Za-z_][A-Za-z0-9_]*', name): + raise ValueError('Extension name must be a C/Objective-C identifier') + prefix = 'Classes/Extensions/' + required = {f'{prefix}CRun{name}.h', f'{prefix}CRun{name}.m'} + if not required.issubset(names): + raise ValueError('Missing CRun extension .h/.m pair') + blocks = [[] for _ in range(6)] + for path in sorted(names): + if not path.startswith(prefix): + continue + filename = path[len(prefix):] + if '/' in filename: + raise ValueError('Runtime compilation units must be directly under Classes/Extensions') + if not re.fullmatch(r'[A-Za-z0-9_.-]+', filename): + raise ValueError('Unsupported Runtime filename') + suffix = Path(filename).suffix + kind = {'.h': 'sourcecode.c.h', '.m': 'sourcecode.c.objc', '.mm': 'sourcecode.cpp.objcpp'}.get(suffix) + if not kind: + continue + ref = hashlib.sha256((name + ' file ' + path).encode()).hexdigest()[:24].upper() + file_line = f'\t\t{ref} /* {filename} */ = {{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = {kind}; path = {filename}; sourceTree = ""; }};\n' + group_line = f'\t\t\t\t{ref} /* {filename} */,\n' + if suffix == '.h': + blocks[4].append(file_line) + blocks[5].append(group_line) + else: + build = hashlib.sha256((name + ' build ' + path).encode()).hexdigest()[:24].upper() + blocks[0].append(f'\t\t{build} /* {filename} in Sources */ = {{isa = PBXBuildFile; fileRef = {ref} /* {filename} */; }};\n') + blocks[1].append(file_line) + blocks[2].append(group_line) + blocks[3].append(f'\t\t\t\t{build} /* {filename} in Sources */,\n') + return b''.join(''.join(block).encode('utf-8') + b'\0' for block in blocks) + + +def _zip(files: dict[str, bytes]) -> bytes: + output = io.BytesIO() + central = [] + for name, data in sorted(files.items()): + filename = safe_name(name).encode('utf-8') + crc = zlib.crc32(data) + compressor = zlib.compressobj(9, zlib.DEFLATED, -15) + compressed = compressor.compress(data) + compressor.flush() + encrypted = _encrypt(os.urandom(11) + bytes([crc >> 24]) + compressed) + if max(len(data), len(encrypted), output.tell()) >= 0xffffffff or len(filename) > 65535: + raise ValueError('Legacy .ext ZIP limits exceeded') + offset = output.tell() + flags = 0x801 # UTF-8 filename and traditional ZIP encryption. + output.write(struct.pack(' 65535: + raise ValueError('Too many legacy ZIP entries') + start = output.tell() + output.write(b''.join(central)) + size = output.tell() - start + output.write(struct.pack(' dict[str, bytes]: + with zipfile.ZipFile(io.BytesIO(transform(data))) as archive: + archive.setpassword(ZIP_PASSWORD) + files = {} + for info in archive.infolist(): + if not info.is_dir(): + name = safe_name(info.filename) + if name in files: + raise ValueError('Duplicate .ext entry') + files[name] = archive.read(info) # Includes standard ZIP CRC validation. + return files + + +def write_extension(name: str, files: dict[str, bytes], output: Path) -> None: + contents = {safe_name(path): data for path, data in files.items()} + if 'project.txt' in contents: + raise ValueError('project.txt is generated by the packager') + contents['project.txt'] = project_metadata(name, contents) + encoded = transform(_zip(contents)) + if read_extension(encoded) != contents: + raise ValueError('Encoded extension verification failed') + output.parent.mkdir(parents=True, exist_ok=True) + with tempfile.NamedTemporaryFile(dir=output.parent, prefix=output.name, suffix='.partial', delete=False) as stream: + temporary = Path(stream.name) + stream.write(encoded) + try: + os.replace(temporary, output) + finally: + temporary.unlink(missing_ok=True) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--name', required=True) + parser.add_argument('--project-zip', type=Path, required=True) + parser.add_argument('--output', type=Path, required=True) + args = parser.parse_args() + files = {} + with zipfile.ZipFile(args.project_zip) as archive: + for basename in (f'CRun{args.name}.h', f'CRun{args.name}.m'): + matches = [n for n in archive.namelist() if n in ( + 'RuntimeIPhone/Classes/Extensions/' + basename, 'Classes/Extensions/' + basename)] + if len(matches) != 1: + parser.error(f'Expected one Classes/Extensions/{basename}') + files['Classes/Extensions/' + basename] = archive.read(matches[0]) + write_extension(args.name, files, args.output) + print(f'Created and verified: {args.output}') + + +if __name__ == '__main__': + main() diff --git a/Extensions/iOS/tests/object_helpers/ObjectHelpersPeer.mm b/Extensions/iOS/tests/object_helpers/ObjectHelpersPeer.mm new file mode 100644 index 000000000..8fb9be98b --- /dev/null +++ b/Extensions/iOS/tests/object_helpers/ObjectHelpersPeer.mm @@ -0,0 +1,12 @@ +// A second extension-like translation unit using the same generic headers. +#include "ObjectCreation.h" +#include "ObjectSelection.h" + +CObject* CreateFromPeer(CRun* run,short oi) { + FusionIOS::ObjectCreation creation(run); + FusionIOS::ObjectCreation::CreateParams params;params.oi=oi;params.x=17;params.y=23; + return creation.Create(params); +} +int CountFromPeer(CRun* run,int oiList) { + return FusionIOS::ObjectSelection(run).GetNumberOfObject(oiList); +} diff --git a/Extensions/iOS/tests/object_helpers/ObjectHelpersTest.mm b/Extensions/iOS/tests/object_helpers/ObjectHelpersTest.mm new file mode 100644 index 000000000..d7527fea0 --- /dev/null +++ b/Extensions/iOS/tests/object_helpers/ObjectHelpersTest.mm @@ -0,0 +1,111 @@ +// No FindTheWay sources, headers or native library are used by these tests. +#include "ObjectSelection.h" +#include "ObjectCreation.h" +#include +#include +#define CHECK(x) do {if(!(x)) {NSLog(@"FAILED line %d: %s",__LINE__,#x);abort();}} while(0) +using namespace FusionIOS; +CObject* CreateFromPeer(CRun*,short); +int CountFromPeer(CRun*,int); + +int main() { + NSAutoreleasePool* pool=[[NSAutoreleasePool alloc] init]; + CRun* run=[[CRun alloc] init]; + run->rhOiList[0]->oilOi=71;run->rhOiList[1]->oilOi=131;run->rhOiList[2]->oilOi=511; + run->rhOiList[0]->oilName=@"\uffff\uffffToken";run->rhOiList[1]->oilName=@"Peer"; + ObjectBase base(run);ObjectCreation creation(run);ObjectSelection selection(run); + CCndExtension* condition=[[[CCndExtension alloc] init] autorelease]; + condition->parameters=@[@32768];[condition prepare]; + CHECK(ObjectBase::GetOil(condition,run)==-32768 && !ObjectSelection::IsNegated(condition)); + condition->pEvent->evtFlags2=EVFLAG2_NOT;CHECK(ObjectSelection::IsNegated(condition)); + CHECK(base.GetOiFromOiList(0)==71 && base.GetOiFromOiList(1)==131); + CHECK(base.GetOiFromOiList(0x8000)==-1 && base.GetOiFromOiList(-1)==-1); + CHECK(base.GetLPOIL(99)==nil && base.GetLPOIL((CObject*)nil)==nil); + CHECK(base.OILHasObject(@"token") && base.OILHasObject(run->rhOiList[1])); + CHECK(!base.OILHasObject(@"missing") && !ObjectBase::CompareObjectName((NSString*)nil,@"Token")); + CHECK(creation.GetCreationOI(@"TOKEN")==71); + ObjectCreation::CreateParams params;params.oi=71;params.x=3;params.y=5; + CObject* a=creation.Create(params);CObject* b=creation.Create(params);CObject* c=CreateFromPeer(run,131); + CHECK(a && a->hoNumber==0 && c->hoX==17 && c->hoY==23); + CHECK(base.GetLPOIL(a)==run->rhOiList[0] && CountFromPeer(run,0)==2); + a->hoIdentifier=b->hoIdentifier=0x41435456;c->hoIdentifier=123; + selection.SelectAll(0);CHECK(selection.Selected(0) && selection.ObjectIsSelected(0)); + CHECK(selection.GetFirstObject(0)==b && selection.GetFirstObject(0,true)==b); + selection.SelectOneObject(a);CHECK(selection.Selected(0) && selection.GetFirstObject(0,true)==a); + CHECK(selection.GetNumberOfSelected(0)==1 && selection.GetNumberOfObject(0)==2); + CHECK(selection.ObjectIsOfType(a,0) && !selection.ObjectIsOfType(a,1)); + auto selected=selection.SaveSelectedObject(run->rhOiList[0]);CHECK(selected.size()==1 && selected[0]==a); + selection.SelectObjects(0,{a,a,c});CHECK(selection.GetNumberOfSelected(0)==1); + selection.SelectObjects(0,{});CHECK(selection.ObjectIsSelected(0) && !selection.Selected(0)); + int visits=0;selection.ForEach(0,[&](CObject*){++visits;});CHECK(visits==0); + --run->rhOiList[0]->oilEventCount; + selection.ForEach(0,[&](CObject*){++visits;},ForEachFlag_SelectedOnly);CHECK(visits==0); + selection.ForEach(0,[&](CObject*){++visits;},ForEachFlag_SelectedOnly|ForEachFlag_ForceAll);CHECK(visits==2); + selection.SelectAll(0);b->hoFlags|=HOF_DESTROYED;visits=0; + selection.ForEach(0,[&](CObject*){++visits;});CHECK(visits==1); + CHECK(!selection.FilterObjects(0,true,[&](CObject*){return false;},false)); + CHECK(selection.GetNumberOfSelected(0)==1 && selection.GetFirstObject(0,true)==a); + b->hoFlags&=~HOF_DESTROYED; + short members[]={71,0,131,1,-1,-1}; + CQualToOiList* qualifier=[[[CQualToOiList alloc] init] autorelease];qualifier->nQoi=6;qualifier->qoiList=members; + run->rhEvtProg->qualToOiList[0]=qualifier; + selection.SelectAll(0x8000);CHECK(selection.GetNumberOfObject(-32768)==3 && selection.GetNumberOfSelected(0x8000)==3); + CHECK(selection.ObjectIsOfType(c,0x8000) && selection.ObjectIsQualifier(0x8000)); + CHECK(selection.FilterObjects(-32768,false,[&](CObject* o){return o==a || o==c;})); + CHECK(selection.GetNumberOfSelected(0)==1 && selection.GetNumberOfSelected(1)==1); + selection.SelectAll(0);visits=0; + selection.IterateObjectWithIdentifier(0x41435456,[&](CObject*){++visits;});CHECK(visits==2); + // Snapshot iteration skips a slot whose creation ID changed in a callback. + visits=0;selection.ForEach(0,[&](CObject* o){++visits;if(o==b) ++a->hoCreationId;});CHECK(visits==1);--a->hoCreationId; + selection.SelectOneObject(a);selection.SelectNone(1);--run->rhOiList[2]->oilEventCount; + CEventProgram* events=run->rhEvtProg;events->rh2ActionCount=7;events->rh2ActionLoopCount=8;events->rh2ActionOn=YES; + auto scope=selection.SaveScope(); + ++events->rh2EventCount;selection.SelectAll(0x8000);selection.SelectAll(2);events->rh2ActionCount=90; + selection.RestoreScope(scope);CHECK(events->rh2ActionCount==90); + scope.RestoreActionState();CHECK(events->rh2ActionCount==7); + CHECK(selection.GetFirstObject(0,true)==a && selection.GetNumberOfSelected(1)==0 && selection.ObjectIsSelected(1)); + CHECK(!selection.ObjectIsSelected(2)); + @try { + selection.KeepScopeCall(true,[&] { + selection.SelectAll(0x8000);events->rh2ActionCount=99; + @throw [NSException exceptionWithName:@"Nested" reason:@"fixture" userInfo:nil]; + }); + CHECK(false); + } @catch(NSException* e) { CHECK([[e name] isEqualToString:@"Nested"]); } + CHECK(selection.GetNumberOfSelected(0)==1 && selection.GetNumberOfSelected(1)==0 && events->rh2ActionCount==7); + // Apple's unified Objective-C++ exception runtime supports C++ exceptions. + // The legacy GNU Objective-C runtime used by Linux fixtures does not. +#ifdef __APPLE__ + try { + selection.KeepScopeCall(true,[&] {selection.SelectNone(0);throw std::runtime_error("fixture");}); + CHECK(false); + } catch(const std::runtime_error&) {} + CHECK(selection.GetNumberOfSelected(0)==1); +#endif + selection.KeepScopeCall(false,[&]{selection.SelectNone(0);});CHECK(!selection.Selected(0)); + selection.SelectOneObject(a);scope=selection.SaveScope();++a->hoCreationId;selection.RestoreScope(scope); + CHECK(selection.GetNumberOfSelected(0)==0);--a->hoCreationId; + // Local creation parameters survive a nested creation on the same helper. + CObject* outer=creation.OCCreateObject([&](ObjectCreation* helper,ObjectCreation::CreateParams& p) { + p.oi=71;p.x=41;p.y=43; + CObject* inner=helper->OCCreateObject([&](ObjectCreation*,ObjectCreation::CreateParams& q){q.oi=131;q.x=2;q.y=4;}); + CHECK(inner && inner->hoOi==131 && inner->hoX==2); + }); + CHECK(outer && outer->hoOi==71 && outer->hoX==41 && outer->hoY==43); + run->rhFrame->layers[0]->dwOptions=FLOPT_TOHIDE;params.layer=999; + CHECK(creation.Create(params)->ros->hidden); + params.layer=-1;CHECK(creation.Create(params)==nil);params.frameItem=0; + CHECK(creation.Create(params)!=nil); + ::CreateDuplicateParam source={};source.cdpOi=71;source.cdpHFII=-1; + source.cdpPos.posOINUMParent=-1;source.cdpPos.posX=29;source.cdpPos.posY=31;source.cdpPos.posLayer=0; + BOOL repeat=NO;ObjectCreation::CreateParams resolved; + CHECK(creation.ResolvePosition(source,resolved,repeat) && resolved.x==29 && resolved.y==31 && resolved.oi==71); + source.cdpPos.posOINUMParent=0;CHECK(!creation.ResolvePosition(source,resolved,repeat)); + selection.SelectAll(0);int before=selection.GetNumberOfObject(0);visits=0; + selection.ForEach(0,[&](CObject*) {if(visits++==0) CHECK(CreateFromPeer(run,71)!=nil);}); + CHECK(visits==before && selection.GetNumberOfObject(0)==before+1); + CHECK(run->physicsCalls==run->nextSlot); + NSLog(@"Generic ObjectBase/Selection/Creation checks passed without a plugin core"); + [run release];[pool drain]; + return 0; +} diff --git a/Extensions/iOS/tests/run_runtime_fixture.py b/Extensions/iOS/tests/run_runtime_fixture.py new file mode 100644 index 000000000..523d4c2b3 --- /dev/null +++ b/Extensions/iOS/tests/run_runtime_fixture.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +"""Run generic helpers or the Runtime adapter against owned fixtures and Foundation. + +The extension mode requires a host-built FindTheWayCore static library; the +helpers-only mode has no plugin dependency. These owned models do not exercise +the private Fusion Runtime or replace Apple/exporter/device integration checks. +""" +import argparse +from pathlib import Path +import platform +import shlex +import shutil +import subprocess +import tempfile + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--helpers-only', action='store_true', + help='Test generic helpers across two translation units, without any plugin/core') + parser.add_argument('--core-library', type=Path) + parser.add_argument('--compiler', default='clang') + args = parser.parse_args() + if not args.helpers_only and (not args.core_library or not args.core_library.is_file()): + parser.error('Build the core for this host first') + if not shutil.which(args.compiler): + parser.error('Objective-C compiler is missing') + tests = Path(__file__).resolve().parent + project = tests.parent / 'FindTheWay' + sources = [tests / 'runtime_fixture/RuntimeModel.mm'] + includes = [tests / 'runtime_fixture', tests.parent / 'Helpers'] + libraries = [] + if args.helpers_only: + sources += [tests / 'object_helpers/ObjectHelpersTest.mm', tests / 'object_helpers/ObjectHelpersPeer.mm'] + else: + sources += [project / 'Runtime/CRunFindTheWay.m', tests / 'runtime_fixture/RuntimeAdapterTest.m', + project / 'Runtime/FTWObjectAdapter.mm', project / 'Runtime/FTWPlatformAdapter.mm'] + includes += [project / 'Runtime', project / 'Core/include'] + libraries = [str(args.core_library.resolve())] + flags = [] + if platform.system() == 'Darwin': + flags = ['-framework', 'Foundation', '-lc++'] + ([] if args.helpers_only else ['-liconv']) + compile_flags = ['-fno-objc-arc', '-fobjc-exceptions', '-fexceptions'] + else: + if not shutil.which('gnustep-config'): + parser.error('Linux checks require GNUstep Base development headers/libraries') + compile_flags = shlex.split(subprocess.check_output(['gnustep-config', '--objc-flags'], text=True)) + objc_headers = subprocess.check_output(['gcc', '-print-file-name=include'], text=True).strip() + compile_flags += ['-I', objc_headers] + flags = shlex.split(subprocess.check_output(['gnustep-config', '--base-libs'], text=True)) + ['-lstdc++'] + with tempfile.TemporaryDirectory(prefix='ftw-runtime-test-') as folder: + output = Path(folder) / 'test' + subprocess.run([args.compiler, *compile_flags, + '-x', 'objective-c++', '-std=c++11', + *[arg for directory in includes for arg in ('-I', str(directory))], + *map(str, sources), *(['-x', 'none', *libraries] if libraries else []), + *flags, '-o', str(output)], check=True) + subprocess.run([str(output)], check=True) + + +if __name__ == '__main__': + main() diff --git a/Extensions/iOS/tests/runtime_fixture/CActExtension.h b/Extensions/iOS/tests/runtime_fixture/CActExtension.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CActExtension.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CAnimDir.h b/Extensions/iOS/tests/runtime_fixture/CAnimDir.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CAnimDir.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CBkd2.h b/Extensions/iOS/tests/runtime_fixture/CBkd2.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CBkd2.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CBox2D.h b/Extensions/iOS/tests/runtime_fixture/CBox2D.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CBox2D.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CCndExtension.h b/Extensions/iOS/tests/runtime_fixture/CCndExtension.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CCndExtension.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CCreateObjectInfo.h b/Extensions/iOS/tests/runtime_fixture/CCreateObjectInfo.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CCreateObjectInfo.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CEventProgram.h b/Extensions/iOS/tests/runtime_fixture/CEventProgram.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CEventProgram.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CEvents.h b/Extensions/iOS/tests/runtime_fixture/CEvents.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CEvents.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CExtension.h b/Extensions/iOS/tests/runtime_fixture/CExtension.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CExtension.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CFile.h b/Extensions/iOS/tests/runtime_fixture/CFile.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CFile.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CImage.h b/Extensions/iOS/tests/runtime_fixture/CImage.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CImage.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CImageBank.h b/Extensions/iOS/tests/runtime_fixture/CImageBank.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CImageBank.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CLayer.h b/Extensions/iOS/tests/runtime_fixture/CLayer.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CLayer.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/COI.h b/Extensions/iOS/tests/runtime_fixture/COI.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/COI.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/COIList.h b/Extensions/iOS/tests/runtime_fixture/COIList.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/COIList.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CObjInfo.h b/Extensions/iOS/tests/runtime_fixture/CObjInfo.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CObjInfo.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CObject.h b/Extensions/iOS/tests/runtime_fixture/CObject.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CObject.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CObjectCommon.h b/Extensions/iOS/tests/runtime_fixture/CObjectCommon.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CObjectCommon.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CQualToOiList.h b/Extensions/iOS/tests/runtime_fixture/CQualToOiList.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CQualToOiList.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CRAni.h b/Extensions/iOS/tests/runtime_fixture/CRAni.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CRAni.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CRSpr.h b/Extensions/iOS/tests/runtime_fixture/CRSpr.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CRSpr.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CRVal.h b/Extensions/iOS/tests/runtime_fixture/CRVal.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CRVal.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CRun.h b/Extensions/iOS/tests/runtime_fixture/CRun.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CRun.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CRunApp.h b/Extensions/iOS/tests/runtime_fixture/CRunApp.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CRunApp.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CRunExtension.h b/Extensions/iOS/tests/runtime_fixture/CRunExtension.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CRunExtension.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CRunFrame.h b/Extensions/iOS/tests/runtime_fixture/CRunFrame.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CRunFrame.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/CValue.h b/Extensions/iOS/tests/runtime_fixture/CValue.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/CValue.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/runtime_fixture/RuntimeAPI.h b/Extensions/iOS/tests/runtime_fixture/RuntimeAPI.h new file mode 100644 index 000000000..565cb188f --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/RuntimeAPI.h @@ -0,0 +1,137 @@ +#pragma once +#import +@class CRun, CExtension, CObject,CObjInfo,CEventProgram,CRunFrame,CRunApp; +#ifdef __cplusplus +struct CRunMvtPhysics;struct FixturePhysics; +#endif +typedef struct { int left,top,right,bottom; } CRect; +typedef struct {short posOINUMParent,posFlags,posX,posY,posSlope,posAngle;int posDir;short posTypeParent,posOiList,posLayer;} PositionParam; +typedef PositionParam* LPPOS; +typedef struct { PositionParam cdpPos;short cdpHFII,cdpOi;unsigned cdpFree;} CreateDuplicateParam; +typedef CreateDuplicateParam* LPCDP; +typedef struct FixtureParam {short evpCode;union {struct {short evpW0,evpW1;char tail[64];} evpW;} evp;} *LPEVP; +typedef struct FixtureEvent {unsigned char evtFlags,evtFlags2;char rest[14];} *LPEVT; +#define CND_SIZE 16 +#define EVFLAG2_NOT 1 +#define ACTFLAGS_REPEAT 1 +@interface CValue : NSObject { @public id value; } +-(int)getInt; +-(NSString*)getString; +@end +@interface CRun : NSObject { +@public CObject** rhObjectList;CObjInfo** rhOiList;int rhMaxObjects,rhMaxOI,rhWindowX,rhWindowY; + CEventProgram* rhEvtProg;CRunFrame* rhFrame;CRunApp* rhApp;NSMutableArray* backdrops; + int nextSlot,physicsCalls; +#ifdef __cplusplus + FixturePhysics* rh4Box2DBase; +#endif +} +-(int)f_CreateObject:(short)frame withOIHandle:(short)oi andX:(int)x andY:(int)y andDir:(int)dir andFlags:(int)flags andLayer:(int)layer andNumCreation:(int)creation; +#ifdef __cplusplus +-(CRunMvtPhysics*)GetPhysicMovement:(CObject*)object; +#endif +-(void)addBackdrop2:(id)backdrop; +-(CValue*)getTempValue:(int)value; +-(CValue*)getTempString:(NSString*)value; +@end +@interface CExtension : NSObject { +@public NSArray* parameters; NSUInteger nextParameter; + void (*event)(void*,int); void* context; +} +-(CValue*)getExpParam; +-(void)generateEvent:(int)code withParam:(int)param; +@end +@interface CRunExtension : NSObject { @public CRun* rh; CExtension* ho; } +@end +@interface CFile : NSObject { @public unsigned char byte; } +-(unsigned char)readAByte; +@end +@interface CCreateObjectInfo : NSObject +@end +@interface CCndExtension : NSObject { @public NSArray* parameters;NSMutableData* eventData;LPEVP pParams[16];LPEVT pEvent; } +-(LPEVP)getParamObject:(CRun*)run withNum:(int)index; +-(void)prepare; +-(int)getParamExpression:(CRun*)run withNum:(int)index; +-(NSString*)getParamExpString:(CRun*)run withNum:(int)index; +@end +@interface CActExtension : NSObject { @public NSArray* parameters;NSMutableData* eventData;LPEVP pParams[16];LPEVT pEvent; } +-(CObject*)getParamObject:(CRun*)run withNum:(int)index; +-(void)prepare; +-(int)getParamExpression:(CRun*)run withNum:(int)index; +-(NSString*)getParamExpString:(CRun*)run withNum:(int)index; +@end + +// Owned model of the Runtime fields used by object/platform adapters, not SDK code. +@class COIList,CObject,CObjInfo,CQualToOiList,CEventProgram,CRunFrame,CRunApp,CImageBank,CImage,CRAni,CAnimDir,CRVal,CRSpr,CLayer; +#define OBSTACLE_TRANSPARENT 4 +#define HOF_DESTROYED 1 +#define OEFLAG_SPRITES 2 +#define FLOPT_VISIBLE 1 +#define FLOPT_TOHIDE 2 +@interface CObjInfo:NSObject { @public short oilOi,oilType;NSString* oilName;int oilEventCount,oilListSelected,oilNumOfSelected,oilObject,oilNObjects; } +@end +@interface CQualToOiList:NSObject { @public short nQoi;short* qoiList; } +@end +@interface CEventProgram:NSObject { @public CQualToOiList** qualToOiList;int rh2EventCount,rh2ActionCount,rh2ActionLoopCount;BOOL rh2ActionOn,rh2ActionLoop;LPEVT rh4ActionStart; } +-(void)evt_AddCurrentObject:(CObject*)object; +@end +@interface CRunFrame:NSObject { @public int nLayers;CLayer** layers;CRect leVirtualRect; } +-(BOOL)bkdCol_TestPoint:(int)x withY:(int)y andLayer:(int)layer andPlane:(int)plane; +@end +@interface CLayer:NSObject { @public int dwOptions; } +@end +@interface CImageBank:NSObject { @public NSMutableDictionary* images; } +-(CImage*)getImageFromHandle:(unsigned short)handle; +@end +@interface CRunApp:NSObject { @public CImageBank* imageBank;COIList* OIList;NSMutableDictionary* resources;NSString* loadedPath; } +-(NSData*)loadResourceData:(NSString*)path; +@end +@interface CObject:NSObject { +@public short hoCreationId,hoNumber,hoOi,hoType,hoFlags,hoOEFlags,hoNextSelected,hoNumNext; + int hoX,hoY,hoImgXSpot,hoImgYSpot,hoIdentifier;CObjInfo* hoOiList;CRAni* roa;CRVal* rov;CRSpr* ros; +} +@end +@interface CAnimDir:NSObject { @public short adNumberOfFrame;unsigned short* adFrames; } +@end +@interface CRAni:NSObject { @public CAnimDir* raAnimDirOffset; } +@end +@interface CRSpr:NSObject { @public int rsEffect,rsEffectParam,rsEffectShader;BOOL hidden; } +-(void)obHide; +@end +@interface CRVal:NSObject { @public NSArray* values; } +-(CValue*)getValue:(int)index; +@end +@interface UIImage:NSObject ++(UIImage*)imageWithContentsOfFile:(NSString*)path; ++(UIImage*)imageNamed:(NSString*)path; ++(UIImage*)imageWithData:(NSData*)data; +@end +enum {RGBA8888,RGBA4444,RGBA5551,RGB888,RGB565,JPEG}; +@interface CImage:NSObject { @public int width,height;short xSpot,ySpot;NSArray* pixels;unsigned int* data;NSUInteger dataLength;short bytesPrPixel,format;int bLineWidth;BOOL premultimage; } ++(CImage*)loadUIImage:(UIImage*)image; +-(int)getPixel:(int)x withY:(int)y; +@end +@interface CBkd2:NSObject { +@public unsigned short img;int x,y,spotX,spotY,nLayer,obstacleType,colMode,inkEffect,inkEffectParam,bkdEffectShader; +} +-(id)initWithCRun:(CRun*)run; +-(int)checkOrCreateEffectIfNeeded:(CRunApp*)app andCOI:(id)oi; +@end +#ifdef __cplusplus +struct CRunMvtPhysics { int* calls;void CreateBody(CObject*){if(calls)++*calls;} }; +struct FixturePhysics {void (*pAddNormalObject)(FixturePhysics*,CObject*);}; +extern "C" { +#endif +void AddPhysicsAttractor(CRun*,CObject*); +BOOL read_Position(CRun*,LPPOS,unsigned,int*,int*,int*,BOOL*,int*); +#ifdef __cplusplus +} +#endif + +@interface COIList:NSObject +-(id)getOIFromHandle:(short)handle; +@end + +// Optional resource image returned by the owned Runtime model. +extern CImage* fixtureFileImage; +extern NSData* fixtureFileBytes; diff --git a/Extensions/iOS/tests/runtime_fixture/RuntimeAdapterTest.m b/Extensions/iOS/tests/runtime_fixture/RuntimeAdapterTest.m new file mode 100644 index 000000000..f28be7693 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/RuntimeAdapterTest.m @@ -0,0 +1,251 @@ +// Own API fixtures plus real Foundation and the actual C++ core/Runtime adapter. +#import "RuntimeAPI.h" +#import "CRunFindTheWay.h" +#include +#include "ObjectSelection.h" +#include "ObjectCreation.h" +#define CHECK(x) do { if (!(x)) { NSLog(@"FAILED line %d: %s",__LINE__,#x); abort(); } } while(0) +static BOOL condition(CRunFindTheWay* extension, int code, NSArray* params) { + CCndExtension* cnd=[[[CCndExtension alloc] init] autorelease]; cnd->parameters=params;[cnd prepare]; + return [extension condition:code withCndExtension:cnd]; +} +static void action(CRunFindTheWay* extension, int code, NSArray* params) { + CActExtension* act=[[[CActExtension alloc] init] autorelease]; act->parameters=params;[act prepare]; + [extension action:code withActExtension:act]; +} +static CValue* expression(CRunFindTheWay* extension, int code, NSArray* params) { + extension->ho->parameters=params; extension->ho->nextParameter=0; + CValue* result=[extension expression:code]; + CHECK(extension->ho->nextParameter==[params count]); + return result; +} +typedef struct { CRunFindTheWay* ext; int mode, outer, inner; } Events; +static void event(void* context, int code) { + Events* events=(Events*)context; CRunFindTheWay* ext=events->ext; + if(code==17) return; + if (condition(ext,code,@[@"inner"])) { ++events->inner; return; } + CHECK(condition(ext,code,@[@"outer"])); ++events->outer; + int x=[expression(ext,0,@[]) getInt], y=[expression(ext,1,@[]) getInt]; + if (events->outer==1 && events->mode==1) { + action(ext,2,@[@"walk",@0,@"inner"]); + CHECK([expression(ext,0,@[]) getInt]==x && [expression(ext,1,@[]) getInt]==y); + CHECK(condition(ext,code,@[@"outer"])); + } + if (events->outer==1 && events->mode==2) CHECK(condition(ext,0,@[@3,@3])); + if (events->mode==3) [ext destroyRunObject:NO]; +} +static CRunFindTheWay* fresh(void) { + CRunFindTheWay* ext=[[CRunFindTheWay alloc] init];ext->rh=[[[CRun alloc] init] autorelease];ext->ho=[[[CExtension alloc] init] autorelease]; + CFile* file=[[[CFile alloc] init] autorelease];CHECK([ext createRunObject:file withCOB:nil andVersion:1]);return ext; +} +static BOOL negatedCondition(CRunFindTheWay* ext,int code,NSArray* params) { + CCndExtension* cnd=[[[CCndExtension alloc] init] autorelease];cnd->parameters=params;[cnd prepare];cnd->pEvent->evtFlags2=EVFLAG2_NOT; + return [ext condition:code withCndExtension:cnd]; +} +typedef struct {CRunFindTheWay* ext;int count,updates;BOOL destroy;} ObjectEvents; +static void objectEvent(void* context,int code) { + ObjectEvents* state=(ObjectEvents*)context;CRunFindTheWay* ext=state->ext;CRun* run=ext->rh; + ++run->rhEvtProg->rh2EventCount;run->rhEvtProg->rh2ActionCount=99;run->rhEvtProg->rh2ActionLoopCount=88; + run->rhEvtProg->rh2ActionOn=NO;run->rhEvtProg->rh2ActionLoop=NO; + if(code==17) {++state->updates;return;} + CHECK(code==18);CHECK(condition(ext,18,@[@0,@1,@"zone"]));++state->count; + if(state->destroy) [ext destroyRunObject:NO]; +} +static void eventChecks(void) { + CRunFindTheWay* ext=fresh();CRun* run=ext->rh;CHECK(condition(ext,0,@[@5,@5])); + FusionIOS::ObjectCreation creation(run);FusionIOS::ObjectCreation::CreateParams p;p.oi=10;p.x=p.y=2;CObject* first=creation.Create(p);p.x=3;CObject* second=creation.Create(p); + FusionIOS::ObjectSelection selection(run);selection.Replace(0,{{first->hoNumber,first->hoCreationId}}); + run->rhEvtProg->rh2ActionOn=YES;run->rhEvtProg->rh2ActionLoop=YES;run->rhEvtProg->rh2ActionCount=12;run->rhEvtProg->rh2ActionLoopCount=13; + ObjectEvents events={ext,0,0,NO};ext->ho->event=objectEvent;ext->ho->context=&events; + action(ext,12,@[@0,@"zone"]);CHECK(events.count==8); + CHECK(run->rhOiList[0]->oilNumOfSelected==1 && run->rhOiList[0]->oilListSelected==first->hoNumber); + CHECK(run->rhEvtProg->rh2ActionOn && run->rhEvtProg->rh2ActionLoop && run->rhEvtProg->rh2ActionCount==12 && run->rhEvtProg->rh2ActionLoopCount==13); + action(ext,0,@[@2,@2,@255,@1,@0]);CHECK(condition(ext,10,@[@0,@0]));CHECK(events.updates==1); + CHECK(run->rhOiList[0]->oilListSelected==first->hoNumber); + selection.SelectAll(0);int visited=0; + selection.ForEach(0,[&](CObject* object){++visited;if(object==second)++first->hoCreationId;});CHECK(visited==1);--first->hoCreationId; + selection.Replace(0,{{first->hoNumber,first->hoCreationId}});events.destroy=YES;events.count=0; + action(ext,12,@[@0,@"zone"]);CHECK(events.count==1); + [ext release]; +} +static void objectChecks(void) { + CRunFindTheWay* ext=fresh();CRun* run=ext->rh; + CHECK(condition(ext,0,@[@8,@8])); + FusionIOS::ObjectCreation creation(run);FusionIOS::ObjectCreation::CreateParams p;p.oi=10;p.x=2;p.y=2; + CObject* a=creation.Create(p);CHECK(a && a->hoNumber==0); // slot zero is success + p.x=3;CObject* b=creation.Create(p);p.x=2;p.oi=11;CObject* c=creation.Create(p); + CHECK(a && b && c && run->physicsCalls==3); + run->rhFrame->layers[0]->dwOptions=FLOPT_TOHIDE;p.oi=12;p.layer=999; + CObject* hidden=creation.Create(p);CHECK(hidden && hidden->ros->hidden); + p.layer=-1;p.frameItem=-1;CHECK(!creation.Create(p)); + p.frameItem=0;CObject* sentinel=creation.Create(p);CHECK(sentinel && !sentinel->ros->hidden); + run->rhFrame->layers[0]->dwOptions=FLOPT_VISIBLE; + run->rhOiList[0]->oilName=@"\uffffToken";CHECK(creation.GetCreationOI(@"token")==10);CHECK(creation.GetCreationOI(@"missing")==-1); + FusionIOS::ObjectSelection selection(run);selection.SelectAll(0);selection.SelectAll(1); + CHECK(condition(ext,9,@[@0,@2,@2]));CHECK(run->rhOiList[0]->oilNumOfSelected==1 && run->rhOiList[0]->oilListSelected==0); + CHECK(condition(ext,24,@[@0,@3,@2]));CHECK(!condition(ext,25,@[@0,@2,@2])); // no-object reads current SOL + selection.SelectAll(0);CHECK(!negatedCondition(ext,11,@[@0,@2,@2])); + CHECK(run->rhOiList[0]->oilNumOfSelected==1 && run->rhOiList[0]->oilListSelected==1); + CHECK(condition(ext,21,@[@0]));CHECK(run->rhOiList[0]->oilNumOfSelected==2); + b->hoFlags|=HOF_DESTROYED;CHECK(selection.Snapshot(0).size()==1); + CHECK(condition(ext,11,@[@0,@3,@2]));CHECK(run->rhOiList[0]->oilListSelected==b->hoNumber); + b->hoFlags&=~HOF_DESTROYED;selection.SelectAll(0); + CHECK(condition(ext,22,@[@0,@1]));CHECK(run->rhOiList[0]->oilListSelected==0); + selection.SelectAll(0);selection.SelectAll(1); + short pairs[]={10,0,11,1};CQualToOiList* qualifier=[[[CQualToOiList alloc] init] autorelease];qualifier->nQoi=4;qualifier->qoiList=pairs;run->rhEvtProg->qualToOiList[0]=qualifier; + CHECK(condition(ext,11,@[@(-32768),@2,@2]));CHECK(run->rhOiList[0]->oilNumOfSelected==1 && run->rhOiList[1]->oilNumOfSelected==1); + selection.SelectNone(0);CHECK(selection.Snapshot(0).empty()); + --run->rhOiList[0]->oilEventCount;CHECK(selection.Snapshot(0).size()==2); // stale scope falls back to all + selection.SelectAll(0);auto refs=selection.Snapshot(0);++a->hoCreationId;selection.Replace(0,refs); + CHECK(run->rhOiList[0]->oilNumOfSelected==1);--a->hoCreationId; + action(ext,3,@[a,@255,@1]);selection.SelectAll(0);CHECK(condition(ext,10,@[@0,@1]));CHECK(run->rhOiList[0]->oilListSelected==0); + action(ext,4,@[@0,@1]);action(ext,8,@[a,@255]);selection.SelectAll(0);CHECK(condition(ext,19,@[@0]));CHECK(run->rhOiList[0]->oilListSelected==1); + action(ext,9,@[@255]);action(ext,5,@[a,@1]);action(ext,6,@[]); + action(ext,8,@[c,@0]);action(ext,8,@[b,@1]);action(ext,11,@[@1]); + CHECK(condition(ext,13,@[@0,@0,@2,@2,@0,@3,@0,@9,@1,@2]));CHECK(condition(ext,16,@[])); + CHECK([expression(ext,11,@[@2,@2,@0,@0,@3,@9,@0]) getInt]>=0); + selection.SelectAll(0);(void)condition(ext,20,@[@0,@(-1)]); + run->rhOiList[2]->oilName=@"Marker";run->rhMaxObjects=64; + run->rhObjectList=(CObject**)realloc(run->rhObjectList,64*sizeof(CObject*));memset(run->rhObjectList+16,0,48*sizeof(CObject*)); + CreateDuplicateParam cp={};cp.cdpOi=12;cp.cdpHFII=-1;cp.cdpPos.posOINUMParent=-1;cp.cdpPos.posLayer=0; + NSData* create=[NSData dataWithBytes:&cp length:sizeof(cp)]; + int previous=run->nextSlot;action(ext,10,@[a,create]);CHECK(run->nextSlot==previous+8); + action(ext,13,@[a,@"Marker"]);CHECK(run->nextSlot==previous+16); + action(ext,16,@[create,a,@0,@11,@31]);action(ext,17,@[@"Marker",a,@1,@21,@31]); + action(ext,14,@[create]);action(ext,15,@[@"Marker"]); + action(ext,7,@[@"area",@0]);CHECK(!condition(ext,16,@[])); + action(ext,9,@[@(-1)]);action(ext,11,@[@0]); + [ext destroyRunObject:NO];[ext release]; +} +static void gridChecks(void) { + CRunFindTheWay* ext=fresh();CRun* run=ext->rh; + CHECK(condition(ext,0,@[@2,@2])); + action(ext,19,@[@32,@10,@20]); + action(ext,0,@[@1,@0,@255,@1,@0]); + CObject* source=[[[CObject alloc] init] autorelease];source->hoType=2; + source->hoImgXSpot=5;source->hoImgYSpot=7; + source->roa=[[CRAni alloc] init];source->ros=[[CRSpr alloc] init]; + source->rov=[[CRVal alloc] init];source->rov->values=@[@31,@29]; + CAnimDir* frames=[[[CAnimDir alloc] init] autorelease];unsigned short handles[]={1,2,3}; + frames->adNumberOfFrame=3;frames->adFrames=handles;source->roa->raAnimDirOffset=frames; + const int hotspots[][2]={{16,16},{0,16},{16,0}}; + for(int i=0;i<3;++i) { + CImage* image=[[[CImage alloc] init] autorelease];image->width=image->height=32; + image->xSpot=hotspots[i][0];image->ySpot=hotspots[i][1]; + [run->rhApp->imageBank->images setObject:image forKey:@(handles[i])]; + } + // Expected Windows surface origins: cell center minus the source hotspot, + // with R/B offsets only at internal obstacle edges, not the map boundary. + const int expected[][3]={{1,21,29},{2,52,29},{1,21,61},{3,21,61}, + {1,53,61},{2,53,61},{3,53,61}}; + for(int pass=0;pass<2;++pass) { + action(ext,18,@[source,@1]);CHECK([run->backdrops count]==7); + for(int i=0;i<7;++i) { + CBkd2* backdrop=[run->backdrops objectAtIndex:i]; + CImage* image=[run->rhApp->imageBank getImageFromHandle:backdrop->img]; + CHECK(backdrop->img==expected[i][0]); + // The Runtime's sprite subtracts the image hotspot; its visibility + // rectangle separately subtracts CBkd2's stored hotspot. + CHECK(backdrop->x-image->xSpot==expected[i][1]); + CHECK(backdrop->y-image->ySpot==expected[i][2]); + CHECK(backdrop->x-backdrop->spotX==expected[i][1]); + CHECK(backdrop->y-backdrop->spotY==expected[i][2]); + } + [run->backdrops removeAllObjects]; + // Zero hotspots must retain the same Windows surface origins too. + for(int i=0;i<3;++i) { + CImage* image=[run->rhApp->imageBank getImageFromHandle:handles[i]]; + image->xSpot=image->ySpot=0; + } + } + [ext destroyRunObject:NO];[ext release]; +} +static void platformChecks(void) { + CRunFindTheWay* ext=fresh();CRun* run=ext->rh; + CHECK(condition(ext,2,@[@1,@0,@0,@0,@1,@1,@"collision"])); + CHECK([expression(ext,8,@[@3,@3,@0,@1]) getInt]==255); + CHECK([expression(ext,8,@[@2,@3,@0,@1]) getInt]==0); + CObject* object=[[CObject alloc] init];object->hoNumber=0;object->hoCreationId=7;object->hoType=2; + object->roa=[[CRAni alloc] init];CAnimDir* frames=[[[CAnimDir alloc] init] autorelease];unsigned short handles[]={1,2,3};frames->adNumberOfFrame=3;frames->adFrames=handles;object->roa->raAnimDirOffset=frames; + object->ros=[[CRSpr alloc] init];run->rhObjectList[0]=object; + CImage* image=[[[CImage alloc] init] autorelease];image->width=image->height=2; + image->pixels=@[@0x00112233,@0x00445566,@0x00778899,@0x00aabbcc]; + unsigned int rawPixels[]={0xff112233,0xff445566,0xff778899,0xffaabbcc}; + image->data=rawPixels;image->dataLength=sizeof(rawPixels);image->bytesPrPixel=4;image->format=RGBA8888;image->bLineWidth=8; + [run->rhApp->imageBank->images setObject:image forKey:@1]; + CHECK(condition(ext,26,@[@(7<<16),@0,@1,@0,@0])); + CHECK([expression(ext,8,@[@0,@0,@0,@1]) getInt]==0x33); + CHECK([expression(ext,8,@[@1,@1,@0,@2]) getInt]==0xbb); + struct PixelCase {short format,bytes;unsigned raw;int r,g;BOOL premult;}; + const PixelCase cases[]={ + {RGBA8888,4,0x804080c8,200,128,NO}, {RGBA8888,4,0x80002040,128,64,YES}, + {RGB888,3,0x00112233,51,34,NO}, {RGBA4444,2,0xf84f,255,136,NO}, + {RGBA5551,2,0xf801,255,0,NO}, {RGB565,2,0xfbe0,255,125,NO}, {JPEG,4,0xff123456,86,52,NO}}; + unsigned char storage[16]={0}; + for(auto test:cases) { + image->format=test.format;image->bytesPrPixel=test.bytes;image->bLineWidth=8;image->premultimage=test.premult; + image->data=(unsigned*)storage;image->dataLength=16; + for(int py=0;py<2;++py)for(int px=0;px<2;++px)memcpy(storage+py*8+px*test.bytes,&test.raw,test.bytes); + CHECK(condition(ext,26,@[@(7<<16),@0,@1,@0,@0])); + for(int py=0;py<2;++py)for(int px=0;px<2;++px) { + CHECK([expression(ext,8,@[@(px),@(py),@0,@1]) getInt]==test.r); + CHECK([expression(ext,8,@[@(px),@(py),@0,@2]) getInt]==test.g); + } + } + image->dataLength=1;CHECK(!condition(ext,26,@[@(7<<16),@0,@1,@0,@0]));image->dataLength=16; + fixtureFileImage=image;fixtureFileBytes=[NSData dataWithBytes:"png fixture" length:11]; + for(NSString* path in @[@"C:\\Project\\地图.png",@"maps/地图.png",@"/private/app/Documents/map.png",@"file:///private/app/Documents/map.png"]) { + [run->rhApp->resources setObject:fixtureFileBytes forKey:path]; + CHECK(condition(ext,12,@[path,@1,@0,@0])); + CHECK([run->rhApp->loadedPath isEqualToString:path]); + CHECK([expression(ext,8,@[@1,@1,@0,@1]) getInt]==86); + } + fixtureFileImage=nil;fixtureFileBytes=nil; + CHECK(condition(ext,0,@[@2,@2]));action(ext,18,@[object,@1]);CHECK([run->backdrops count]>0); + CHECK(!condition(ext,27,@[@0,@1,@0,@0]));CHECK(!condition(ext,7,@[])); + CHECK(!condition(ext,12,@[@"missing.png",@1,@0,@0])); + [ext destroyRunObject:NO];[ext release]; +} +int main(void) { + NSAutoreleasePool* pool=[[NSAutoreleasePool alloc] init]; + CRunFindTheWay* ext=[[CRunFindTheWay alloc] init]; + ext->rh=[[[CRun alloc] init] autorelease]; ext->ho=[[[CExtension alloc] init] autorelease]; + CFile* file=[[[CFile alloc] init] autorelease]; + CHECK([ext createRunObject:file withCOB:nil andVersion:1]); + CHECK([ext getNumberOfConditions]==29); + CHECK(condition(ext,0,@[@4,@4])); + CHECK(condition(ext,7,@[])); + action(ext,0,@[@1,@1,@255,@1,@0]); + CHECK([expression(ext,8,@[@1,@1,@0,@1]) getInt]==255); + CHECK(condition(ext,8,@[@1,@1,@65536,@1,@0])); + CHECK(condition(ext,8,@[@0,@0,@(-1),@1,@0])); + CHECK(condition(ext,4,@[@0,@0,@3,@3,@9,@0,@1,@0,@0,@"walk"])); + CHECK([expression(ext,3,@[@"walk"]) getInt]==7); + CHECK([expression(ext,4,@[@"walk",@6,@0]) getInt]==3); + NSString* encoded=[[[expression(ext,9,@[]) getString] copy] autorelease]; + CHECK(condition(ext,1,@[encoded])); + CHECK([expression(ext,8,@[@1,@1,@0,@1]) getInt]==255); + action(ext,4,@[@0,@1]); + CHECK([expression(ext,8,@[@1,@1,@0,@1]) getInt]==0); + action(ext,19,@[@32,@10,@20]); + CHECK([expression(ext,6,@[@2,@1,@0]) getInt]==90); + CHECK([expression(ext,6,@[@2,@1,@1]) getInt]==68); + action(ext,19,@[@32,@(-1),@0]); + CHECK([expression(ext,6,@[@2,@1,@0]) getInt]==79); + CHECK([[expression(ext,10,@[@0,@0,@""]) getString] length]>0); + CHECK([expression(ext,2,@[@0,@0,@3,@3,@9,@0,@1,@0,@0,@"walk"]) getInt]==7); + Events events={ext,1,0,0}; ext->ho->event=event; ext->ho->context=&events; + action(ext,2,@[@"walk",@0,@"outer"]); + CHECK(events.outer==7 && events.inner==7); + events.mode=2; events.outer=events.inner=0; + action(ext,2,@[@"walk",@0,@"outer"]); + CHECK(events.outer==7); // Snapshot survives replacing the native map. + CHECK(condition(ext,4,@[@0,@0,@2,@2,@9,@0,@1,@0,@0,@"walk"])); + events.mode=3; events.outer=0; + action(ext,2,@[@"walk",@0,@"outer"]); + CHECK(events.outer==1); // Destroying during iteration stops safely. + [ext release]; + objectChecks();platformChecks();gridChecks();eventChecks(); + NSLog(@"Runtime adapter fixture checks passed"); + [pool drain]; return 0; +} diff --git a/Extensions/iOS/tests/runtime_fixture/RuntimeModel.mm b/Extensions/iOS/tests/runtime_fixture/RuntimeModel.mm new file mode 100644 index 000000000..873b2a402 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/RuntimeModel.mm @@ -0,0 +1,141 @@ +// Owned Runtime model shared by generic helper and extension tests. +#import "RuntimeAPI.h" +#include +#include +CImage* fixtureFileImage=nil;NSData* fixtureFileBytes=nil; +static CValue* makeValue(id value) { + CValue* result=[[[CValue alloc] init] autorelease]; result->value=value; return result; +} +@implementation CValue +-(int)getInt { return [value intValue]; } +-(NSString*)getString { return [value isKindOfClass:[NSString class]]?value:[value description]; } +@end +@implementation CRun +-(id)init { + if((self=[super init])) { + rhMaxObjects=16;rhMaxOI=3;rhObjectList=(CObject**)calloc(rhMaxObjects,sizeof(CObject*));rhOiList=(CObjInfo**)calloc(rhMaxOI,sizeof(CObjInfo*)); + rhEvtProg=[[CEventProgram alloc] init];rhEvtProg->rh2EventCount=1; + rhEvtProg->qualToOiList=(CQualToOiList**)calloc(1,sizeof(CQualToOiList*)); + rhFrame=[[CRunFrame alloc] init];rhFrame->nLayers=1;rhFrame->layers=(CLayer**)calloc(1,sizeof(CLayer*)); + rhFrame->layers[0]=[[CLayer alloc] init];rhFrame->layers[0]->dwOptions=FLOPT_VISIBLE; + rhFrame->leVirtualRect={0,0,8,8}; + rhApp=[[CRunApp alloc] init];rhApp->imageBank=[[CImageBank alloc] init];rhApp->imageBank->images=[[NSMutableDictionary alloc] init]; + backdrops=[[NSMutableArray alloc] init];rhApp->resources=[[NSMutableDictionary alloc] init]; + for(int i=0;ioilOi=10+i;rhOiList[i]->oilType=2;rhOiList[i]->oilObject=-1;rhOiList[i]->oilListSelected=-1;} + } return self; +} +-(void)dealloc { + for(int i=0;iqualToOiList);[rhEvtProg release]; + [rhFrame->layers[0] release];free(rhFrame->layers);[rhFrame release]; + [rhApp->resources release];[rhApp->loadedPath release];[rhApp->imageBank->images release];[rhApp->imageBank release];[rhApp release];[backdrops release];[super dealloc]; +} +-(int)f_CreateObject:(short)frame withOIHandle:(short)oi andX:(int)x andY:(int)y andDir:(int)dir andFlags:(int)flags andLayer:(int)layer andNumCreation:(int)creation { + int slot=nextSlot++;if(slot<0 || slot>=rhMaxObjects) return -1; + int type=0;while(typeoilOi!=oi)) ++type; + if(type==rhMaxOI) return -1; + CObject* object=[[CObject alloc] init];object->hoCreationId=1;object->hoNumber=slot;object->hoOi=oi;object->hoOiList=rhOiList[type]; + object->hoX=x;object->hoY=y;object->hoType=2;object->hoOEFlags=OEFLAG_SPRITES;object->ros=[[CRSpr alloc] init]; + object->hoNumNext=rhOiList[type]->oilObject;rhOiList[type]->oilObject=slot;object->hoNextSelected=-1;++rhOiList[type]->oilNObjects; + [rhObjectList[slot] release];rhObjectList[slot]=object;return slot; +} +-(CRunMvtPhysics*)GetPhysicMovement:(CObject*)object {return nullptr;} +-(void)addBackdrop2:(id)backdrop {[backdrops addObject:backdrop];[backdrop release];} +-(CValue*)getTempValue:(int)value { return makeValue([NSNumber numberWithInt:value]); } +-(CValue*)getTempString:(NSString*)value { return makeValue(value); } +@end +@implementation CExtension +-(CValue*)getExpParam { return makeValue([parameters objectAtIndex:nextParameter++]); } +-(void)generateEvent:(int)code withParam:(int)param { if (event) event(context,code); } +@end +@implementation CRunExtension +@end +@implementation CFile +-(unsigned char)readAByte { return byte; } +@end +@implementation CCreateObjectInfo +@end +static void prepare(NSArray* params,NSMutableData** storage,LPEVP* pointers,LPEVT* event) { + *storage=[[NSMutableData alloc] initWithLength:CND_SIZE+16*sizeof(FixtureParam)]; + *event=(LPEVT)[*storage mutableBytes]; + for(int i=0;i<16;++i) { + pointers[i]=(LPEVP)((char*)[*storage mutableBytes]+CND_SIZE+i*sizeof(FixtureParam)); + if((NSUInteger)i<[params count]) { + id value=[params objectAtIndex:i]; + if([value isKindOfClass:[NSNumber class]]) pointers[i]->evp.evpW.evpW0=[value shortValue]; + if([value isKindOfClass:[NSData class]]) memcpy(&pointers[i]->evp.evpW.evpW0,[value bytes],[value length]); + } + } +} +@implementation CCndExtension +-(void)prepare {prepare(parameters,&eventData,pParams,&pEvent);} +-(void)dealloc {[eventData release];[super dealloc];} +-(LPEVP)getParamObject:(CRun*)run withNum:(int)index {return pParams[index];} +-(int)getParamExpression:(CRun*)run withNum:(int)index { return [[parameters objectAtIndex:index] intValue]; } +-(NSString*)getParamExpString:(CRun*)run withNum:(int)index { return [parameters objectAtIndex:index]; } +@end +@implementation CActExtension +-(void)prepare {prepare(parameters,&eventData,pParams,&pEvent);} +-(void)dealloc {[eventData release];[super dealloc];} +-(CObject*)getParamObject:(CRun*)run withNum:(int)index {id value=[parameters objectAtIndex:index];return [value isKindOfClass:[CObject class]]?value:nil;} +-(int)getParamExpression:(CRun*)run withNum:(int)index { return [[parameters objectAtIndex:index] intValue]; } +-(NSString*)getParamExpString:(CRun*)run withNum:(int)index { return [parameters objectAtIndex:index]; } +@end +@implementation CObjInfo +@end +@implementation CQualToOiList +@end +@implementation CEventProgram +-(void)evt_AddCurrentObject:(CObject*)object { + CObjInfo* info=object->hoOiList; + object->hoNextSelected=info->oilEventCount==rh2EventCount?info->oilListSelected:-1; + info->oilListSelected=object->hoNumber;info->oilNumOfSelected=1;info->oilEventCount=rh2EventCount; +} +@end +@implementation CRunFrame +-(BOOL)bkdCol_TestPoint:(int)x withY:(int)y andLayer:(int)layer andPlane:(int)plane {return x==3 && y==3;} +@end +@implementation CLayer +@end +@implementation CRunApp +-(NSData*)loadResourceData:(NSString*)path {[loadedPath release];loadedPath=[path copy];return [resources objectForKey:path];} +@end +@implementation CImageBank +-(CImage*)getImageFromHandle:(unsigned short)handle {return [images objectForKey:@(handle)];} +@end +@implementation CObject +-(void)dealloc {[roa release];[rov release];[ros release];[super dealloc];} +@end +@implementation CAnimDir +@end +@implementation CRAni +@end +@implementation CRSpr +-(id)init {if((self=[super init]))rsEffectShader=-1;return self;} +-(void)obHide {hidden=YES;} +@end +@implementation CRVal +-(CValue*)getValue:(int)index {return makeValue((NSUInteger)index<[values count]?[values objectAtIndex:index]:@0);} +@end +@implementation UIImage ++(UIImage*)imageWithContentsOfFile:(NSString*)path {return nil;} ++(UIImage*)imageNamed:(NSString*)path {return nil;} ++(UIImage*)imageWithData:(NSData*)data {return data==fixtureFileBytes?[[[UIImage alloc] init] autorelease]:nil;} +@end +@implementation CImage ++(CImage*)loadUIImage:(UIImage*)image {return image?[fixtureFileImage retain]:nil;} +-(int)getPixel:(int)x withY:(int)y {return [[pixels objectAtIndex:y*width+x] intValue];} +@end +@implementation COIList +-(id)getOIFromHandle:(short)handle {return nil;} +@end +@implementation CBkd2 +-(int)checkOrCreateEffectIfNeeded:(CRunApp*)app andCOI:(id)oi {return -1;} +-(id)initWithCRun:(CRun*)run {return [super init];} +@end +void AddPhysicsAttractor(CRun* run,CObject* object) {++run->physicsCalls;} +BOOL read_Position(CRun* run,LPPOS pos,unsigned flags,int* x,int* y,int* dir,BOOL* repeat,int* layer) { + if(pos->posOINUMParent!=-1) return NO; + *x=pos->posX;*y=pos->posY;*dir=pos->posDir;*repeat=NO;*layer=pos->posLayer;return YES; +} diff --git a/Extensions/iOS/tests/runtime_fixture/UIKit/UIKit.h b/Extensions/iOS/tests/runtime_fixture/UIKit/UIKit.h new file mode 100644 index 000000000..2cb3e3fb2 --- /dev/null +++ b/Extensions/iOS/tests/runtime_fixture/UIKit/UIKit.h @@ -0,0 +1 @@ +#import "RuntimeAPI.h" diff --git a/Extensions/iOS/tests/test_build_script.py b/Extensions/iOS/tests/test_build_script.py new file mode 100644 index 000000000..ec3a0ade4 --- /dev/null +++ b/Extensions/iOS/tests/test_build_script.py @@ -0,0 +1,78 @@ +"""Command orchestration fixtures; no Apple compilation is claimed by these tests.""" +import importlib.util +from pathlib import Path +import subprocess +import sys +import tempfile +import unittest +from unittest.mock import patch + +SCRIPT = Path(__file__).resolve().parents[1] / 'FindTheWay/Core/build_xcframework.py' +spec = importlib.util.spec_from_file_location('ftw_build_core', SCRIPT) +builder = importlib.util.module_from_spec(spec) +spec.loader.exec_module(builder) + + +class BuildScriptTests(unittest.TestCase): + def test_arm64_cli_build_and_framework_handoff(self): + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + core = root / 'shared' + core.mkdir() + (core / 'FindTheWayFusion.h').touch() + commands = [] + def run(command, **kwargs): + commands.append(command) + if command[:2] == ['cmake', '--build']: + archive = Path(command[2]) / 'archives/libFindTheWayCore.a' + archive.parent.mkdir(parents=True) + archive.write_bytes(b'!\nfixture') + elif command[:2] == ['xcodebuild', '-create-xcframework']: + Path(command[-1]).mkdir() + return subprocess.CompletedProcess(command, 0) + argv = [str(SCRIPT), '--core-include', str(core), '--build-dir', str(root / 'Build'), + '--output', str(root / 'Result.xcframework'), '--minimum-ios', '17.0'] + with patch.object(sys, 'argv', argv), \ + patch.object(builder.platform, 'system', return_value='Darwin'), \ + patch.object(builder.platform, 'machine', return_value='arm64'), \ + patch.object(builder.shutil, 'which', return_value='/fixture/tool'), \ + patch.object(builder.subprocess, 'check_output', side_effect=['/SDK/device\n', '/SDK/simulator\n']), \ + patch.object(builder.subprocess, 'run', side_effect=run): + builder.main() + configurations = [c for c in commands if c[:2] == ['cmake', '-S']] + self.assertEqual(len(configurations), 2) + for command in configurations: + self.assertEqual(command[command.index('-G')+1], 'Ninja') + self.assertIn('-DCMAKE_OSX_ARCHITECTURES=arm64', command) + self.assertIn('-DBUILD_TESTING=OFF', command) + self.assertIn('-DCMAKE_OSX_SYSROOT=/SDK/device', configurations[0]) + self.assertIn('-DCMAKE_OSX_SYSROOT=/SDK/simulator', configurations[1]) + self.assertTrue((root / 'Result.xcframework').is_dir()) + self.assertEqual(commands[-1].count('-library'), 2) + + def test_failed_build_preserves_existing_framework(self): + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + core = root / 'shared' + core.mkdir() + (core / 'FindTheWayFusion.h').touch() + output = root / 'Good.xcframework' + output.mkdir() + sentinel = output / 'sentinel' + sentinel.write_bytes(b'previous build') + argv = [str(SCRIPT), '--core-include', str(core), '--build-dir', str(root / 'Build'), + '--output', str(output), '--minimum-ios', '17.0'] + with patch.object(sys, 'argv', argv), \ + patch.object(builder.platform, 'system', return_value='Darwin'), \ + patch.object(builder.platform, 'machine', return_value='arm64'), \ + patch.object(builder.shutil, 'which', return_value='/fixture/tool'), \ + patch.object(builder.subprocess, 'run') as run, \ + patch.object(sys, 'stderr'): + with self.assertRaises(SystemExit): + builder.main() + run.assert_not_called() + self.assertEqual(sentinel.read_bytes(), b'previous build') + + +if __name__ == '__main__': + unittest.main() diff --git a/Extensions/iOS/tests/test_configure_export.py b/Extensions/iOS/tests/test_configure_export.py new file mode 100644 index 000000000..b9a92c629 --- /dev/null +++ b/Extensions/iOS/tests/test_configure_export.py @@ -0,0 +1,107 @@ +"""Owned project fixtures; no private Fusion project metadata is redistributed.""" +import importlib.util +from pathlib import Path +import subprocess +import sys +import tempfile +import unittest + +SCRIPT = Path(__file__).resolve().parents[1] / 'FindTheWay/configure_export.py' +spec = importlib.util.spec_from_file_location('ftw_configure_export', SCRIPT) +module = importlib.util.module_from_spec(spec) +sys.modules[spec.name] = module +spec.loader.exec_module(module) + + +class ExportTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) + self.bundle = self.root / 'RenamedGame.xcodeproj' + self.bundle.mkdir() + self.ids = {name: f'{index:024X}' for index, name in enumerate( + ['project', 'app', 'physics', 'appconfigs', 'physicsconfigs', 'projectconfigs', + 'appdebug', 'apprelease', 'physicsdebug', 'projectdebug', 'product', 'physicsproduct', + 'frameworks', 'link'], 1)} + i = self.ids + objects = { + i['project']: dict(isa='PBXProject', buildConfigurationList=i['projectconfigs']), + i['app']: dict(isa='PBXNativeTarget', name='RenamedGame', productType='com.apple.product-type.application', productReference=i['product'], buildConfigurationList=i['appconfigs'], buildPhases=[i['frameworks']], dependencies=[]), + i['physics']: dict(isa='PBXNativeTarget', name='Physics', productType='com.apple.product-type.library.static', productReference=i['physicsproduct'], buildConfigurationList=i['physicsconfigs']), + i['appconfigs']: dict(isa='XCConfigurationList', buildConfigurations=[i['appdebug'], i['apprelease']]), + i['physicsconfigs']: dict(isa='XCConfigurationList', buildConfigurations=[i['physicsdebug']]), + i['projectconfigs']: dict(isa='XCConfigurationList', buildConfigurations=[i['projectdebug']]), + i['product']: dict(isa='PBXFileReference', path='RenamedGame.app'), + i['physicsproduct']: dict(isa='PBXFileReference', path='libPhysics.a'), + i['frameworks']: dict(isa='PBXFrameworksBuildPhase', files=[i['link']]), + i['link']: dict(isa='PBXBuildFile', fileRef=i['physicsproduct'], settings={'ATTRIBUTES': ['Weak', 'OtherAttribute']}), + } + for config in ('appdebug', 'apprelease', 'physicsdebug', 'projectdebug'): + objects[i[config]] = dict(isa='XCBuildConfiguration', name=config, buildSettings={ + 'ARCHS': 'x86_64', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]': 'arm64', + 'IPHONEOS_DEPLOYMENT_TARGET': '17.6' if config=='appdebug' else '12.0', + 'OTHER_LDFLAGS': ['$(inherited)', '-framework', 'UIKit', '-framework', 'AVFoundation'], + 'CODE_SIGN_STYLE': 'Manual', 'DEVELOPMENT_TEAM': 'AUTHORTEAM', + 'LIBRARY_SEARCH_PATHS': ['$(inherited)', '$(SRCROOT)/Other'], + 'CUSTOM_SETTING': 'Preserved'}) + self.path = self.bundle / 'project.pbxproj' + self.path.write_text('// !$*UTF8*$!\n' + module.render(dict(objects=objects, rootObject=i['project']))) + schemes = self.bundle / 'xcshareddata/xcschemes' + schemes.mkdir(parents=True) + self.scheme = schemes / 'Old.xcscheme' + self.scheme.write_text('\n') + for platform in ('iphoneos', 'iphonesimulator'): + (self.root / f'libFindTheWayCore_{platform}.a').write_bytes(b'!\nfixture') + + def apply(self): + results, floor = module.prepare(self.bundle) + for path, data in results.items(): + module.write_atomic(path, data) + return results, floor + + def test_renamed_targets_architectures_linkage_signing_and_schemes(self): + changes, floor = self.apply() + self.assertEqual(floor, '17.6') + project = module.Project(self.path.read_text()) + for config in ('appdebug', 'apprelease', 'physicsdebug', 'projectdebug'): + settings = project.plain(self.ids[config])['buildSettings'] + self.assertEqual(settings['ARCHS'], 'arm64') + self.assertNotIn('EXCLUDED_ARCHS[sdk=iphonesimulator*]', settings) + self.assertEqual(settings['IPHONEOS_DEPLOYMENT_TARGET'], '17.6') + self.assertEqual(settings['CUSTOM_SETTING'], 'Preserved') + self.assertEqual(settings['DEVELOPMENT_TEAM'], 'AUTHORTEAM') + settings = project.plain(self.ids['appdebug'])['buildSettings'] + self.assertIn('$(SRCROOT)/Other', settings['LIBRARY_SEARCH_PATHS']) + self.assertIn('-lFindTheWayCore_iphonesimulator', settings['OTHER_LDFLAGS[sdk=iphonesimulator*]']) + self.assertEqual(settings['OTHER_LDFLAGS[sdk=iphonesimulator*]'].count('-framework'), 2) + self.assertEqual(project.plain(self.ids['link'])['settings']['ATTRIBUTES'], ['OtherAttribute']) + dep = project.plain(self.ids['app'])['dependencies'][0] + self.assertEqual(project.plain(dep)['target'], self.ids['physics']) + self.assertIn('container:RenamedGame.xcodeproj', self.scheme.read_text()) + self.assertIn('BuildableName="RenamedGame.app"', self.scheme.read_text()) + + def test_second_run_is_byte_identical(self): + self.apply() + before = self.path.read_bytes(), self.scheme.read_bytes() + changes, _ = self.apply() + self.assertFalse(changes) + self.assertEqual(before, (self.path.read_bytes(), self.scheme.read_bytes())) + + def test_missing_core_preserves_project(self): + before = self.path.read_bytes() + (self.root / 'libFindTheWayCore_iphoneos.a').unlink() + with self.assertRaisesRegex(ValueError, 'archive'): + self.apply() + self.assertEqual(before, self.path.read_bytes()) + + def test_cli_dry_run_preserves_files(self): + before = self.path.read_bytes(), self.scheme.read_bytes() + result = subprocess.run([sys.executable, str(SCRIPT), str(self.root), '--dry-run'], capture_output=True, text=True) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertIn('Preview: arm64', result.stdout) + self.assertEqual(before, (self.path.read_bytes(), self.scheme.read_bytes())) + + +if __name__ == '__main__': + unittest.main() diff --git a/Extensions/iOS/tests/test_ext_codec.py b/Extensions/iOS/tests/test_ext_codec.py new file mode 100644 index 000000000..7d66e48d6 --- /dev/null +++ b/Extensions/iOS/tests/test_ext_codec.py @@ -0,0 +1,76 @@ +import importlib.util +import io +import re +from pathlib import Path +import subprocess +import sys +import tempfile +import unittest +import zipfile + +SCRIPT = Path(__file__).resolve().parents[1] / 'Tools/make_ext.py' +spec = importlib.util.spec_from_file_location('make_ext', SCRIPT) +codec = importlib.util.module_from_spec(spec) +spec.loader.exec_module(codec) + + +class ExtCodecTests(unittest.TestCase): + def setUp(self): + self.files = {'Classes/Extensions/CRunProbe.h': b'// owned header fixture\n', + 'Classes/Extensions/CRunProbe.m': b'// owned source fixture\n', + 'Classes/Extensions/ProbeHelper.mm': b'// owned helper fixture\n', + 'libProbe_iphoneos.a': b'!\nowned fixture'} + + def test_standard_zip_reader_accepts_encryption_and_payload(self): + with tempfile.TemporaryDirectory() as temporary: + output = Path(temporary) / 'Probe.ext' + codec.write_extension('Probe', self.files, output) + self.assertNotEqual(output.read_bytes()[:4], b'PK\x03\x04') + with zipfile.ZipFile(io.BytesIO(codec.transform(output.read_bytes()))) as archive: + archive.setpassword(codec.ZIP_PASSWORD) + self.assertIsNone(archive.testzip()) + for name, data in self.files.items(): + self.assertEqual(archive.read(name), data) + metadata = codec.read_extension(output.read_bytes())['project.txt'].split(b'\0') + self.assertEqual(len(metadata), 7) + self.assertEqual(metadata[-1], b'') + self.assertIn(b'CRunProbe.m in Sources', metadata[0]) + self.assertIn(b'ProbeHelper.mm in Sources', metadata[3]) + self.assertIn(b'CRunProbe.h', metadata[4]) + + def test_bad_input_preserves_previous_package(self): + with tempfile.TemporaryDirectory() as temporary: + output = Path(temporary) / 'Probe.ext' + output.write_bytes(b'previous package') + for name, files in [('bad name', self.files), ('Probe', {'../outside': b'bad'})]: + with self.assertRaises(ValueError): + codec.write_extension(name, files, output) + self.assertEqual(output.read_bytes(), b'previous package') + + def test_shared_headers_have_extension_scoped_project_ids(self): + def ids(name): + files = {f'Classes/Extensions/CRun{name}.h', f'Classes/Extensions/CRun{name}.m', + 'Classes/Extensions/ObjectSelection.h'} + metadata = codec.project_metadata(name, files) + self.assertIn(b'ObjectSelection.h', metadata) + return set(re.findall(rb'([0-9A-F]{24}) /\*', metadata)) + self.assertTrue(ids('First').isdisjoint(ids('Second'))) + + def test_cli_collects_only_the_named_runtime_pair(self): + with tempfile.TemporaryDirectory() as temporary: + folder = Path(temporary) + source = folder / 'RuntimeIPhone.zip' + with zipfile.ZipFile(source, 'w') as archive: + for name, data in self.files.items(): + archive.writestr('RuntimeIPhone/' + name, data) + archive.writestr('RuntimeIPhone/Classes/PrivateSDK.m', b'private fixture') + output = folder / 'Probe.ext' + subprocess.run([sys.executable, str(SCRIPT), '--name', 'Probe', + '--project-zip', str(source), '--output', str(output)], check=True, capture_output=True) + files = codec.read_extension(output.read_bytes()) + self.assertEqual(set(files), {'Classes/Extensions/CRunProbe.h', + 'Classes/Extensions/CRunProbe.m', 'project.txt'}) + + +if __name__ == '__main__': + unittest.main() diff --git a/Extensions/iOS/tests/test_publisher.py b/Extensions/iOS/tests/test_publisher.py new file mode 100644 index 000000000..6fc766e7d --- /dev/null +++ b/Extensions/iOS/tests/test_publisher.py @@ -0,0 +1,190 @@ +import importlib.util +import json +import sys +import io +from contextlib import redirect_stdout +from unittest.mock import patch +from pathlib import Path +import plistlib +import tempfile +import unittest +import zipfile + +SCRIPT = Path(__file__).resolve().parents[2] / '_Script/FindTheWayIOS.py' +spec = importlib.util.spec_from_file_location('ios_publisher', SCRIPT) +publisher = importlib.util.module_from_spec(spec) +spec.loader.exec_module(publisher) + + +class PublisherTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) / 'Extensions' + for name in ('iOS/FindTheWay/Runtime/CRunFindTheWay.h', + 'iOS/FindTheWay/Runtime/CRunFindTheWay.m', + 'iOS/FindTheWay/Runtime/FTWObjectAdapter.mm', + 'iOS/FindTheWay/Runtime/FTWPlatformAdapter.mm', + 'iOS/Helpers/ObjectBase.h', + 'iOS/Helpers/ObjectSelection.h', + 'iOS/Helpers/ObjectCreation.h', + 'iOS/FindTheWay/configure_export.py', + 'iOS/FindTheWay/Core/CMakeLists.txt', + 'iOS/FindTheWay/Core/build_xcframework.py'): + path = self.root / name + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text('// source fixture') + self.bundle = Path(self.temp.name) / 'bundle' + self.bundle.mkdir() + # Synthetic packaging fixtures, not executable extension/binary evidence. + (self.bundle / 'FindTheWay.ext').write_bytes(b'extension fixture') + (self.bundle / 'Integration.md').write_text('integration fixture\n') + self.libraries = [] + for variant in ('device', 'simulator'): + name = 'ios-arm64' + ('-simulator' if variant == 'simulator' else '') + library = self.bundle / 'FindTheWayCore.xcframework' / name / 'libFindTheWayCore.a' + library.parent.mkdir(parents=True) + library.write_bytes(b'!\narchive fixture') + headers = library.parent / 'Headers' + headers.mkdir() + (headers / 'FindTheWayCore.h').write_text('// ABI fixture\n') + entry = dict(LibraryIdentifier=name, LibraryPath=library.name, HeadersPath='Headers', + SupportedPlatform='ios', SupportedArchitectures=['arm64']) + if variant == 'simulator': + entry['SupportedPlatformVariant'] = variant + self.libraries.append(entry) + self.info = self.bundle / 'FindTheWayCore.xcframework/Info.plist' + self.info.write_bytes(plistlib.dumps({'AvailableLibraries': self.libraries})) + self.record() + + def record(self): + files = publisher.payload_files(self.bundle) + (self.bundle / 'manifest.json').write_text(json.dumps({ + 'schema': 1, 'sources': publisher.source_hashes(self.root), + 'files': {name: publisher.sha(path) for name, path in files.items()}})) + + def test_valid_staging_and_support_archive(self): + publisher.stage(self.bundle, self.root) + install = self.root / 'FindTheWay/ToInstall/Files' + contents = publisher.extension_codec().read_extension((install / 'Data/Runtime/iPhone/FindTheWay.ext').read_bytes()) + self.assertIn('libFindTheWayCore_iphoneos.a', contents) + self.assertIn('configure_findtheway_export.py', contents) + self.assertIn('Classes/Extensions/FTWObjectAdapter.mm', contents) + self.assertIn('Classes/Extensions/FTWPlatformAdapter.mm', contents) + for name in ('Base', 'Selection', 'Creation'): + self.assertIn('Helpers/Object' + name + '.h', contents) + self.assertNotIn(b'ObjectSelection.h', contents['project.txt']) + self.assertNotIn('Classes/Extensions/FTWObjectHelpers.mm', contents) + self.assertEqual(contents['project.txt'].count(b'in Sources */ ='), 3) + self.assertIn('libFindTheWayCore_iphonesimulator.a', contents) + self.assertEqual(contents['Classes/Extensions/CRunFindTheWay.m'], b'// source fixture') + with zipfile.ZipFile(install / 'Tools/FindTheWay-iOS.zip') as archive: + self.assertIn('FindTheWayCore.xcframework/Info.plist', archive.namelist()) + self.assertIn('Integration.md', archive.namelist()) + self.assertNotIn('FindTheWay.ext', archive.namelist()) + + def test_stale_source_preserves_previous_artifact(self): + publisher.stage(self.bundle, self.root) + output = self.root / 'FindTheWay/ToInstall/Files/Data/Runtime/iPhone/FindTheWay.ext' + before = output.read_bytes() + (self.root / 'iOS/FindTheWay/Runtime/CRunFindTheWay.m').write_text('// changed') + with self.assertRaisesRegex(ValueError, 'stale'): + publisher.stage(self.bundle, self.root) + self.assertEqual(output.read_bytes(), before) + + def test_native_bundle_builds_extension_without_rebuilding_core(self): + (self.bundle / 'FindTheWay.ext').unlink() + files = publisher.payload_files(self.bundle, require_extension=False) + (self.bundle / 'manifest.json').write_text(json.dumps({ + 'schema': 1, 'kind': 'native', 'sources': publisher.source_hashes(self.root), + 'files': {name: publisher.sha(path) for name, path in files.items()}})) + publisher.verify(self.bundle, self.root) + with patch.object(publisher, 'EXTENSIONS', self.root), patch.object( + sys, 'argv', ['publisher', '--verify-only', '--artifacts', str(self.bundle)]), redirect_stdout(io.StringIO()) as output: + publisher.main() + self.assertIn('Verified native artifacts', output.getvalue()) + self.assertFalse((self.root / 'FindTheWay/ToInstall').exists()) + # Runtime-only changes must not require another Apple core build. + runtime = self.root / 'iOS/FindTheWay/Runtime/CRunFindTheWay.m' + runtime.write_text('// updated Runtime adapter') + publisher.stage(self.bundle, self.root) + output = self.root / 'FindTheWay/ToInstall/Files/Data/Runtime/iPhone/FindTheWay.ext' + contents = publisher.extension_codec().read_extension(output.read_bytes()) + self.assertEqual(contents['Classes/Extensions/CRunFindTheWay.m'], b'// updated Runtime adapter') + + def test_windows_line_endings_do_not_invalidate_sources(self): + source = self.root / 'iOS/FindTheWay/Runtime/CRunFindTheWay.m' + source.write_bytes(b'// source\n// fixture\n') + self.record() + source.write_bytes(b'// source\r\n// fixture\r\n') + publisher.verify(self.bundle, self.root) + + def test_windows_line_endings_do_not_invalidate_artifact_text(self): + # Mac-generated XML/header/docs are Git text, unlike static libraries. + for path in self.bundle.rglob('*'): + if path.is_file() and (path.suffix in {'.h', '.plist'} or path.name == 'Integration.md'): + data = path.read_bytes() + self.assertIn(b'\n', data) + path.write_bytes(data.replace(b'\n', b'\r\n')) + publisher.verify(self.bundle, self.root) + publisher.stage(self.bundle, self.root) + + def test_mixed_header_line_endings_are_equivalent(self): + header = next(self.bundle.rglob('*.h')) + header.write_bytes(header.read_bytes().replace(b'\n', b'\r\n')) + publisher.stage(self.bundle, self.root) + file = self.root / 'FindTheWay/ToInstall/Files/Data/Runtime/iPhone/FindTheWay.ext' + contents = publisher.extension_codec().read_extension(file.read_bytes()) + self.assertEqual(contents['Classes/Extensions/FindTheWayCore.h'], b'// ABI fixture\n') + + def test_artifact_text_edits_are_still_rejected(self): + header = next(self.bundle.rglob('*.h')) + header.write_bytes(header.read_bytes().replace(b'fixture', b'changed')) + with self.assertRaisesRegex(ValueError, 'SHA-256 mismatch.*FindTheWayCore.h'): + publisher.verify(self.bundle, self.root) + + def test_binary_line_endings_are_not_normalized(self): + library = next(self.bundle.rglob('*.a')) + library.write_bytes(library.read_bytes() + b'\r\n') + with self.assertRaisesRegex(ValueError, 'SHA-256 mismatch.*libFindTheWayCore.a'): + publisher.verify(self.bundle, self.root) + + def test_producer_project_changes_invalidate_bundle(self): + project = self.root / 'iOS/FindTheWay' + project.mkdir(parents=True, exist_ok=True) + (project / 'CMakeLists.txt').write_text('# producer fixture') + self.record() + (project / 'CMakeLists.txt').write_text('# changed configuration') + with self.assertRaisesRegex(ValueError, 'stale'): + publisher.verify(self.bundle, self.root) + + def test_install_requires_real_runtime_directory(self): + with self.assertRaisesRegex(ValueError, 'Fusion iPhone runtime directory'): + publisher.stage(self.bundle, self.root, Path(self.temp.name) / 'MissingFusion') + fusion = Path(self.temp.name) / 'Fusion' + target = fusion / 'Data/Runtime/iPhone' + target.mkdir(parents=True) + publisher.stage(self.bundle, self.root, fusion) + self.assertTrue((target / 'FindTheWay.ext').is_file()) + self.assertIn('project.txt', publisher.extension_codec().read_extension((target / 'FindTheWay.ext').read_bytes())) + + def test_tampered_binary_rejected(self): + library = next(self.bundle.rglob('*.a')) + library.write_bytes(library.read_bytes() + b'changed') + with self.assertRaisesRegex(ValueError, 'SHA-256'): + publisher.verify(self.bundle, self.root) + + def test_intel_slice_rejected(self): + self.libraries[1]['SupportedArchitectures'] = ['arm64', 'x86_64'] + self.info.write_bytes(plistlib.dumps({'AvailableLibraries': self.libraries})) + with self.assertRaisesRegex(ValueError, 'arm64'): + publisher.verify(self.bundle, self.root) + + def test_sdk_payload_rejected(self): + (self.bundle / 'CRun.m').write_text('private SDK fixture') + with self.assertRaisesRegex(ValueError, 'Unexpected artifact'): + publisher.verify(self.bundle, self.root) + + +if __name__ == '__main__': + unittest.main()