diff --git a/.github/ISSUE_TEMPLATE/hmm-issue-template.md b/.github/ISSUE_TEMPLATE/hmm-issue-template.md new file mode 100644 index 00000000..79252a3e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/hmm-issue-template.md @@ -0,0 +1,11 @@ +--- +name: Hmm issue template +about: 'Hmm의 ' +title: '' +labels: '' +assignees: '' + +--- + +# 인수 조건 +- [ ] diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..49f77bbd --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +## 연관된 이슈 + +- closed #이슈번호 + +## 작업 내용 및 고민 내용 + +## 스크린샷 + +## 리뷰 요구사항 diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml new file mode 100644 index 00000000..88ada6ac --- /dev/null +++ b/.github/workflows/ios-ci.yml @@ -0,0 +1,126 @@ +name: iOS CI + +on: + push: + branches: [ main, dev ] + pull_request: + branches: [ main, dev ] + +jobs: + build-and-test: + name: Build and Test + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest-stable + + - name: Show Xcode version + run: xcodebuild -version + + - name: Find latest iOS Simulator + id: find-simulator + run: | + echo "🔍 사용 가능한 시뮬레이터 검색 중..." + + # simctl을 사용하여 사용 가능한 iPhone 시뮬레이터 가져오기 + ALL_DEVICES=$(xcrun simctl list devices available | grep "iPhone") + + echo "📋 찾은 iPhone 시뮬레이터:" + echo "$ALL_DEVICES" + + # 숫자가 있는 iPhone만 추출하고 번호로 정렬 (iPhone 16, 17, 18... 등) + # sed로 "iPhone <숫자>" 패턴만 추출하고, 숫자로 정렬하여 가장 큰 것 선택 + NUMBERED_IPHONES=$(echo "$ALL_DEVICES" | grep -E "iPhone [0-9]+" | sed -E 's/.*iPhone ([0-9]+).*/\1/' | sort -n -u) + LATEST_NUMBER=$(echo "$NUMBERED_IPHONES" | tail -1) + + echo "📊 찾은 iPhone 버전: $(echo $NUMBERED_IPHONES | tr '\n' ' ')" + echo "🎯 최신 버전: iPhone $LATEST_NUMBER" + + # 최신 버전의 iPhone을 우선순위로 찾기 (Pro Max > Pro > Plus > 기본) + SIMULATOR_ID="" + for MODEL in "iPhone $LATEST_NUMBER Pro Max" "iPhone $LATEST_NUMBER Pro" "iPhone $LATEST_NUMBER Plus" "iPhone $LATEST_NUMBER"; do + FOUND=$(echo "$ALL_DEVICES" | grep "$MODEL" | tail -1) + if [ ! -z "$FOUND" ]; then + echo "✅ '$MODEL' 발견!" + # UUID 추출 + SIMULATOR_ID=$(echo "$FOUND" | grep -oE '[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}') + SIMULATOR_NAME=$(echo "$FOUND" | sed -E 's/^[[:space:]]*([^(]+).*/\1/' | xargs) + + echo "simulator_id=$SIMULATOR_ID" >> $GITHUB_OUTPUT + echo "simulator_name=$SIMULATOR_NAME" >> $GITHUB_OUTPUT + echo "✅ 선택된 시뮬레이터: $SIMULATOR_NAME" + echo "📱 시뮬레이터 ID: $SIMULATOR_ID" + break + fi + done + + # 시뮬레이터를 찾지 못한 경우 + if [ -z "$SIMULATOR_ID" ]; then + echo "❌ 사용 가능한 iPhone 시뮬레이터를 찾을 수 없습니다!" + echo "📋 전체 시뮬레이터 목록:" + xcrun simctl list devices available + exit 1 + fi + + - name: Show selected simulator + run: | + echo "🎯 사용할 시뮬레이터: ${{ steps.find-simulator.outputs.simulator_name }}" + echo "🆔 시뮬레이터 ID: ${{ steps.find-simulator.outputs.simulator_id }}" + + - name: Cache SPM packages + uses: actions/cache@v4 + with: + path: | + ~/Library/Developer/Xcode/DerivedData/**/SourcePackages + **/Package.resolved + key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} + restore-keys: | + ${{ runner.os }}-spm- + + - name: Build SoloDeveloperTraining + run: | + cd SoloDeveloperTraining + xcodebuild clean build \ + -project SoloDeveloperTraining.xcodeproj \ + -scheme SoloDeveloperTraining \ + -destination "platform=iOS Simulator,id=${{ steps.find-simulator.outputs.simulator_id }}" \ + CODE_SIGNING_ALLOWED=NO \ + CODE_SIGNING_REQUIRED=NO + + - name: Test SoloDeveloperTraining + run: | + cd SoloDeveloperTraining + xcodebuild test \ + -project SoloDeveloperTraining.xcodeproj \ + -scheme SoloDeveloperTraining \ + -destination "platform=iOS Simulator,id=${{ steps.find-simulator.outputs.simulator_id }}" \ + CODE_SIGNING_ALLOWED=NO \ + CODE_SIGNING_REQUIRED=NO \ + || echo "No tests found or tests failed - continuing..." + + - name: Build SoloDeveloperTraining-Dev + run: | + cd SoloDeveloperTraining + xcodebuild clean build \ + -project SoloDeveloperTraining.xcodeproj \ + -scheme SoloDeveloperTraining-Dev \ + -destination "platform=iOS Simulator,id=${{ steps.find-simulator.outputs.simulator_id }}" \ + CODE_SIGNING_ALLOWED=NO \ + CODE_SIGNING_REQUIRED=NO + + - name: Test SoloDeveloperTraining-Dev + run: | + cd SoloDeveloperTraining + xcodebuild test \ + -project SoloDeveloperTraining.xcodeproj \ + -scheme SoloDeveloperTraining-Dev \ + -destination "platform=iOS Simulator,id=${{ steps.find-simulator.outputs.simulator_id }}" \ + CODE_SIGNING_ALLOWED=NO \ + CODE_SIGNING_REQUIRED=NO \ + || echo "No tests found or tests failed - continuing..." \ No newline at end of file diff --git a/.github/workflows/release-note.yml b/.github/workflows/release-note.yml new file mode 100644 index 00000000..87aa2f29 --- /dev/null +++ b/.github/workflows/release-note.yml @@ -0,0 +1,199 @@ +name: Release Note Generator + +on: + pull_request: + types: [closed] + branches: + - main + +permissions: + contents: write + pull-requests: read + +jobs: + create_release_note: + # PR이 실제로 merge되었을 때만 실행 + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Xcode 프로젝트에서 버전 정보 추출 + - name: Extract Xcode version info + id: xcode_version + run: | + # 프로젝트 이름 + PROJECT_NAME="SoloDeveloperTraining" + + # MARKETING_VERSION 추출 + MARKETING_VERSION=$(grep -m 1 "MARKETING_VERSION = " "${PROJECT_NAME}/${PROJECT_NAME}.xcodeproj/project.pbxproj" | sed 's/.*MARKETING_VERSION = \(.*\);/\1/' | tr -d ' ') + + # BUILD_NUMBER 추출 + BUILD_NUMBER=$(grep -m 1 "CURRENT_PROJECT_VERSION = " "${PROJECT_NAME}/${PROJECT_NAME}.xcodeproj/project.pbxproj" | awk -F'[ ;]' '{print $3}') + + echo "marketing_version=$MARKETING_VERSION" >> $GITHUB_OUTPUT + echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT + + echo "📱 Extracted Marketing Version: $MARKETING_VERSION" + echo "🔢 Extracted Build Number: $BUILD_NUMBER" + + # 버전이 변경되었는지 확인 + - name: Check if tag exists + id: check_tag + run: | + if git rev-parse "v${{ steps.xcode_version.outputs.marketing_version }}" >/dev/null 2>&1; then + echo "exists=true" >> $GITHUB_OUTPUT + echo "⚠️ Tag v${{ steps.xcode_version.outputs.marketing_version }} already exists" + else + echo "exists=false" >> $GITHUB_OUTPUT + echo "✅ Tag v${{ steps.xcode_version.outputs.marketing_version }} does not exist" + fi + + # main 브랜치에 포함된 커밋을 기준으로 PR 조회 + - name: Get merged PRs in main branch + # 동일한 태그가 존재하지 않을 경우만 실행 + if: steps.check_tag.outputs.exists == 'false' + id: get_prs + uses: actions/github-script@v7 + with: + script: | + try { + const owner = context.repo.owner; + const repo = context.repo.repo; + const pull_number = context.payload.pull_request.number; + + const prNumbers = new Set(); + + console.log(`🔎 Analyzing commits from merged PR #${pull_number}...`); + + // 1. 현재 main으로 머지된 PR에 포함된 모든 커밋 목록을 가져옵니다. + const commits = await github.paginate( + github.rest.pulls.listCommits, + { + owner, + repo, + pull_number: pull_number + } + ); + + // 2. 각 커밋과 연결된 PR들을 역추적합니다. + for (const commit of commits) { + const linkedPRs = await github.rest.repos.listPullRequestsAssociatedWithCommit({ + owner, + repo, + commit_sha: commit.sha + }); + + linkedPRs.data.forEach(pr => { + // 머지된 PR이고, 현재 main으로 머지된 PR 자체가 아닌 경우(하위 PR인 경우) 추가 + if (pr.merged_at && pr.number !== pull_number) { + prNumbers.add(pr.number); + } + }); + } + + // 3. 현재 PR을 포함시킵니다. + prNumbers.add(pull_number); + + console.log(`✅ Found ${prNumbers.size} unique sub-PRs.`); + + const prDetails = []; + for (const number of Array.from(prNumbers)) { + const { data: pr } = await github.rest.pulls.get({ + owner, + repo, + pull_number: number + }); + prDetails.push(pr); + } + + prDetails.sort((a, b) => new Date(b.merged_at) - new Date(a.merged_at)); + + // 4. PR 라벨에 따라 카테고라이징 합니다. + const features = prDetails.filter(pr => pr.labels.some(l => ['Feature','UI','Design'].includes(l.name))); + const bugfixes = prDetails.filter(pr => pr.labels.some(l => ['Fix','Bug'].includes(l.name))); + const maintenance = prDetails.filter(pr => pr.labels.some(l => ['Chore','Refactor','Remove','Docs','Test'].includes(l.name))); + const others = prDetails.filter(pr => !pr.labels.some(l => ['Feature','UI','Design','Fix','Bug','Chore','Refactor','Remove','Docs','Test','Someday','Release'].includes(l.name))); + + console.log(`📊 PR Breakdown - Features: ${features.length}, Fixes: ${bugfixes.length}, Maint: ${maintenance.length}, Others: ${others.length}`); + + // 5. 문서 내용을 추가합니다. + let releaseNotes = '## What\'s Changed\n\n'; + const formatPR = (pr) => `- ${pr.title} @${pr.user.login} ([#${pr.number}](${pr.html_url}))\n`; + + if (features.length) releaseNotes += `### 🚀 New Features\n${features.map(formatPR).join('')}\n`; + if (bugfixes.length) releaseNotes += `### 🐛 Bug Fixes\n${bugfixes.map(formatPR).join('')}\n`; + if (maintenance.length) releaseNotes += `### 🚩 Maintenance\n${maintenance.map(formatPR).join('')}\n`; + if (others.length) releaseNotes += `### 📝 Others\n${others.map(formatPR).join('')}\n`; + + return releaseNotes; + + } catch (error) { + console.error('❌ Error:', error.message); + core.setFailed(error.message); + throw error; + } + + # 릴리즈 생성 및 업데이트 + - name: Create or Update Release + if: steps.check_tag.outputs.exists == 'false' + uses: actions/github-script@v7 + with: + script: | + try { + const marketingVersion = '${{ steps.xcode_version.outputs.marketing_version }}'; + const buildNumber = '${{ steps.xcode_version.outputs.build_number }}'; + const tagName = `v${marketingVersion}`; + const releaseNotes = ${{ steps.get_prs.outputs.result }}; + + if (!marketingVersion || marketingVersion === '') { + throw new Error('Marketing version is empty or invalid'); + } + if (!buildNumber || buildNumber === '') { + throw new Error('Build number is empty or invalid'); + } + + console.log(`📦 Creating/updating release: ${tagName}`); + console.log(`📱 Version: ${marketingVersion}`); + console.log(`🔢 Build: ${buildNumber}`); + + const fullReleaseNotes = `**Version**: ${marketingVersion}\n**Build**: ${buildNumber}\n\n${releaseNotes}`; + + const { data: releases } = await github.rest.repos.listReleases({ + owner: context.repo.owner, + repo: context.repo.repo + }); + + const existingRelease = releases.find(r => r.tag_name === tagName); + + if (existingRelease) { + console.log(`🔄 Updating existing release: ${tagName}`); + await github.rest.repos.updateRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: existingRelease.id, + body: fullReleaseNotes + }); + console.log(`✅ Updated release: ${tagName} (Build: ${buildNumber})`); + } else { + console.log(`🆕 Creating new release: ${tagName}`); + const release = await github.rest.repos.createRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + tag_name: tagName, + name: `v${marketingVersion}`, + body: fullReleaseNotes, + draft: false, + prerelease: false + }); + console.log(`✅ Created release: ${tagName} (Build: ${buildNumber})`); + console.log(`🔗 Release URL: ${release.data.html_url}`); + } + + } catch (error) { + console.error('❌ Error creating/updating release:', error.message); + core.setFailed(`Failed to create/update release: ${error.message}`); + throw error; + } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 52fe2f71..002557e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,62 +1,110 @@ +# Created by https://www.toptal.com/developers/gitignore/api/swift,xcode,macos +# Edit at https://www.toptal.com/developers/gitignore?templates=swift,xcode,macos +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride +# Icon must end with two \r +Icon +# Thumbnails +._* +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +### macOS Patch ### +# iCloud generated files +*.icloud +### Swift ### # Xcode # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - ## User settings +*.xcuserstate +*.xcuserdatad xcuserdata/ - +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 ## Obj-C/Swift specific *.hmap - ## App packaging *.ipa *.dSYM.zip *.dSYM - ## Playgrounds timeline.xctimeline playground.xcworkspace - # Swift Package Manager -# # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. # Packages/ # Package.pins # Package.resolved # *.xcodeproj -# # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata # hence it is not needed unless you have added a package configuration file to your project # .swiftpm - .build/ - # CocoaPods -# # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# # Pods/ -# # Add this line if you want to avoid checking in source code from the Xcode workspace # *.xcworkspace - # Carthage -# # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts - Carthage/Build/ - +# Accio dependency management +Dependencies/ +.accio/ # fastlane -# # It is recommended to not store the screenshots in the git repo. # Instead, use fastlane to re-generate the screenshots whenever they are needed. # For more information about the recommended setup visit: # https://docs.fastlane.tools/best-practices/source-control/#source-control - fastlane/report.xml fastlane/Preview.html fastlane/screenshots/**/*.png fastlane/test_output +# Code Injection +# After new code Injection tools there’s a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode +iOSInjectionProject/ +### Xcode ### +## Xcode 8 and earlier +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcodeproj/project.xcworkspace/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno +**/xcshareddata/WorkspaceSettings.xcsettings +Secret.swift +# End of https://www.toptal.com/developers/gitignore/api/swift,xcode,macos + diff --git a/Prototype/Prototype/Prototype.xcodeproj/project.pbxproj b/Prototype/Prototype/Prototype.xcodeproj/project.pbxproj new file mode 100644 index 00000000..6389af48 --- /dev/null +++ b/Prototype/Prototype/Prototype.xcodeproj/project.pbxproj @@ -0,0 +1,365 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 28CCE4832EF321FA00385818 /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 28CCE4822EF321FA00385818 /* Lottie */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 08267DF92EF1A312005A0066 /* Prototype.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Prototype.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 08267DFB2EF1A312005A0066 /* Prototype */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = Prototype; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 08267DF62EF1A312005A0066 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 28CCE4832EF321FA00385818 /* Lottie in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08267DF02EF1A312005A0066 = { + isa = PBXGroup; + children = ( + 08267DFB2EF1A312005A0066 /* Prototype */, + 08267DFA2EF1A312005A0066 /* Products */, + ); + sourceTree = ""; + }; + 08267DFA2EF1A312005A0066 /* Products */ = { + isa = PBXGroup; + children = ( + 08267DF92EF1A312005A0066 /* Prototype.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 08267DF82EF1A312005A0066 /* Prototype */ = { + isa = PBXNativeTarget; + buildConfigurationList = 08267E042EF1A314005A0066 /* Build configuration list for PBXNativeTarget "Prototype" */; + buildPhases = ( + 08267DF52EF1A312005A0066 /* Sources */, + 08267DF62EF1A312005A0066 /* Frameworks */, + 08267DF72EF1A312005A0066 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 08267DFB2EF1A312005A0066 /* Prototype */, + ); + name = Prototype; + packageProductDependencies = ( + 28CCE4822EF321FA00385818 /* Lottie */, + ); + productName = Prototype; + productReference = 08267DF92EF1A312005A0066 /* Prototype.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08267DF12EF1A312005A0066 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 2610; + LastUpgradeCheck = 2610; + TargetAttributes = { + 08267DF82EF1A312005A0066 = { + CreatedOnToolsVersion = 26.1.1; + }; + }; + }; + buildConfigurationList = 08267DF42EF1A312005A0066 /* Build configuration list for PBXProject "Prototype" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 08267DF02EF1A312005A0066; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 28CCE4812EF321FA00385818 /* XCRemoteSwiftPackageReference "lottie-ios" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 08267DFA2EF1A312005A0066 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 08267DF82EF1A312005A0066 /* Prototype */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 08267DF72EF1A312005A0066 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 08267DF52EF1A312005A0066 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 08267E022EF1A314005A0066 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + 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_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = 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_OBJC_ROOT_CLASS = YES_ERROR; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 08267E032EF1A314005A0066 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + 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_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = 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_OBJC_ROOT_CLASS = YES_ERROR; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = 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_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 08267E052EF1A314005A0066 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.hmm.Prototype; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 08267E062EF1A314005A0066 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.hmm.Prototype; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 08267DF42EF1A312005A0066 /* Build configuration list for PBXProject "Prototype" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08267E022EF1A314005A0066 /* Debug */, + 08267E032EF1A314005A0066 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 08267E042EF1A314005A0066 /* Build configuration list for PBXNativeTarget "Prototype" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08267E052EF1A314005A0066 /* Debug */, + 08267E062EF1A314005A0066 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 28CCE4812EF321FA00385818 /* XCRemoteSwiftPackageReference "lottie-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/airbnb/lottie-ios"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.5.2; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 28CCE4822EF321FA00385818 /* Lottie */ = { + isa = XCSwiftPackageProductDependency; + package = 28CCE4812EF321FA00385818 /* XCRemoteSwiftPackageReference "lottie-ios" */; + productName = Lottie; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 08267DF12EF1A312005A0066 /* Project object */; +} diff --git a/Prototype/Prototype/Prototype.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Prototype/Prototype/Prototype.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/Prototype/Prototype/Prototype.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Prototype/Prototype/Prototype.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Prototype/Prototype/Prototype.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..9805a57e --- /dev/null +++ b/Prototype/Prototype/Prototype.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "0a79f2009ea5ba6a9e7c2c6471d05458a7ac9a981d2fd7ab914f1eb741af1ea1", + "pins" : [ + { + "identity" : "lottie-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/airbnb/lottie-ios", + "state" : { + "revision" : "a004050748dc197c56256a14dca49a035d74726c", + "version" : "4.5.2" + } + } + ], + "version" : 3 +} diff --git a/Prototype/Prototype/Prototype/ApplyDesign/ApplyDesignResourceView.swift b/Prototype/Prototype/Prototype/ApplyDesign/ApplyDesignResourceView.swift new file mode 100644 index 00000000..9c61f060 --- /dev/null +++ b/Prototype/Prototype/Prototype/ApplyDesign/ApplyDesignResourceView.swift @@ -0,0 +1,359 @@ +// +// ApplyDesignResourceView.swift +// Prototype +// +// Created by sunjae on 12/17/25. +// + +import SwiftUI +import WebKit +import Lottie +import SpriteKit +import RealityKit +import Combine + +struct ApplyDesignResourceView: View { + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: 10) { + Text("Description").font(.title2) + Text( + "로고나 캐릭터에 필요한 gif, lottie 등 다양한 형태의 디자인 리소스를 가능한 방법으로 적용하고 확인합니다." + ) + Divider() + .padding(.bottom, 16) + VStack(spacing: 16) { + Logo() + Character2D() + Character3D() + } + }.padding() + } + } +} + +struct GIFView: UIViewRepresentable { + + enum RenderType { + case webView // 웹뷰 방식 + case imageSource // 이미지 소스 변환 및 재생 방식 + } + + let gifName: String + let renderType: RenderType + + func makeUIView(context: Context) -> UIView { + switch renderType { + case .webView: + return makeWebView() + case .imageSource: + return makeImageView() + } + } + + func updateUIView(_ uiView: UIView, context: Context) {} +} + +private extension GIFView { + func makeWebView() -> WKWebView { + let webView = WKWebView() + webView.scrollView.isScrollEnabled = false + webView.isOpaque = false + webView.backgroundColor = .clear + + if let path = Bundle.main.path(forResource: gifName, ofType: "gif") { + let url = URL(fileURLWithPath: path) + let data = try? Data(contentsOf: url) + + webView.load( + data ?? Data(), + mimeType: "image/gif", + characterEncodingName: "UTF-8", + baseURL: url + ) + } + return webView + } + + func makeImageView() -> UIView { + let container = UIView() + container.backgroundColor = .clear + + let imageView = UIImageView() + imageView.backgroundColor = .clear + imageView.contentMode = .scaleAspectFit + imageView.clipsToBounds = true + imageView.translatesAutoresizingMaskIntoConstraints = false + + container.addSubview(imageView) + + NSLayoutConstraint.activate([ + imageView.leadingAnchor.constraint(equalTo: container.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: container.trailingAnchor), + imageView.topAnchor.constraint(equalTo: container.topAnchor), + imageView.bottomAnchor.constraint(equalTo: container.bottomAnchor) + ]) + + // GIF 세팅 + guard + let url = Bundle.main.url(forResource: gifName, withExtension: "gif"), + let data = try? Data(contentsOf: url), + let source = CGImageSourceCreateWithData(data as CFData, nil) + else { return container } + + let frameCount = CGImageSourceGetCount(source) + var images: [UIImage] = [] + + for index in 0.., with event: UIEvent?) { + if self.isJumping { return } + self.isJumping = true + smileAnimation() + } +} + +struct SpriteCharacterView: View { + var body: some View { + VStack { + Text("* 터치하면 점프합니다.") + SpriteView( + scene: CharacterScene(), + options: [.allowsTransparency] + ) + .frame(width: 200, height: 200) + } + } +} + +struct RealityControlView: View { + @StateObject private var viewModel = Character3DViewModel() + + var body: some View { + RealityCharacterView(viewModel: viewModel) + .frame(width: 200, height: 200) + .gesture( + DragGesture() + .onChanged { value in + viewModel.dragOffset = value.translation + } + ) + } +} + +final class Character3DViewModel: ObservableObject { + @Published var dragOffset: CGSize = .zero +} + +struct RealityCharacterView: UIViewRepresentable { + @ObservedObject var viewModel: Character3DViewModel + + func makeUIView(context: Context) -> ARView { + let view = ARView(frame: .zero) + view.environment.background = .color(.clear) + + let character = try! Entity.load(named: "sample_character_3D") + character.generateCollisionShapes(recursive: true) + + // 사이즈 자동 맞춤 + let bounds = character.visualBounds(relativeTo: nil) + let size = bounds.extents + let maxDimension = max(size.x, size.y, size.z) + let targetSize: Float = 0.4 + let scale = targetSize / maxDimension + character.scale = SIMD3(repeating: scale) + + let anchor = AnchorEntity(world: .zero) + anchor.addChild(character) + view.scene.addAnchor(anchor) + + context.coordinator.character = character + + return view + } + + func updateUIView(_ uiView: ARView, context: Context) { + guard let character = context.coordinator.character else { return } + let offset = viewModel.dragOffset + character.position.x = Float(offset.width) * 0.001 + character.position.y = Float(-offset.height) * 0.001 + } + + func makeCoordinator() -> Coordinator { + Coordinator() + } + + final class Coordinator { + var character: Entity? + var viewModel: Character3DViewModel? + } +} + +// MARK: - 로고 +struct Logo: View { + + enum Option: String, CaseIterable { + case webViewGIF = "GIF - WebView" + case imageSourceGIF = "GIF - ImageSource" + case lottie = "Lottie" + } + + @State private var selectedOption: Option = .webViewGIF + + var body: some View { + VStack(alignment: .leading, spacing: 10) { + Text("로고") + .font(.title) + .bold() + + Picker("방법 선택", selection: $selectedOption) { + ForEach(Option.allCases, id: \.self) { type in + Text(type.rawValue) + } + } + .pickerStyle(.segmented) + Group { + switch selectedOption { + case .webViewGIF: + GIFView(gifName: "logo_gif", renderType: .webView) + .frame(width: 200, height: 200) + case .imageSourceGIF: + GIFView(gifName: "logo_gif", renderType: .imageSource) + .frame(width: 200, height: 200) + case .lottie: + LottieView(animation: .named("logo_lottie")) + .playing(loopMode: .playOnce).frame(width: 200, height: 200) // 재생 모드 설정 가능 + } + }.frame(maxWidth: .infinity) + .background(Color.white) + } + } +} + +// MARK: - 2D캐릭터 표시 및 제어 +struct Character2D: View { + + enum Option: String, CaseIterable { + case gif = "GIF" + case lottie = "Lottie" + case spriteKit = "SpriteKit" + } + + @State private var selectedOption: Option = .gif + + var body: some View { + VStack(alignment: .leading, spacing: 10) { + Text("2D캐릭터") + .font(.title) + .bold() + + Picker("방법 선택", selection: $selectedOption) { + ForEach(Option.allCases, id: \.self) { type in + Text(type.rawValue) + } + } + .pickerStyle(.segmented) + Group { + switch selectedOption { + case .gif: + GIFView(gifName: "character_blink_gif", renderType: .webView) + .frame(width: 200, height: 200) + case .lottie: + LottieView(animation: .named("character_smile_lottie")) + .playing(loopMode: .loop).frame(width: 200, height: 200) // 재생 모드 설정 가능 + case .spriteKit: + SpriteCharacterView() + } + }.frame(maxWidth: .infinity) + } + } +} + +// MARK: - 3D캐릭터 표시 및 제어 +struct Character3D: View { + + var body: some View { + VStack(alignment: .leading, spacing: 10) { + Text("3D캐릭터") + .font(.title) + .bold() + Text("* 드래그 시 이동합니다.") + RealityControlView() + .frame(maxWidth: .infinity) + } + } +} + +#Preview { + ApplyDesignResourceView() +} diff --git a/Prototype/Prototype/Prototype/ApplyDesign/Resources/GIF/character_blink_gif.gif b/Prototype/Prototype/Prototype/ApplyDesign/Resources/GIF/character_blink_gif.gif new file mode 100644 index 00000000..86dba77c Binary files /dev/null and b/Prototype/Prototype/Prototype/ApplyDesign/Resources/GIF/character_blink_gif.gif differ diff --git a/Prototype/Prototype/Prototype/ApplyDesign/Resources/GIF/character_smile_gif.gif b/Prototype/Prototype/Prototype/ApplyDesign/Resources/GIF/character_smile_gif.gif new file mode 100644 index 00000000..384c5a2d Binary files /dev/null and b/Prototype/Prototype/Prototype/ApplyDesign/Resources/GIF/character_smile_gif.gif differ diff --git a/Prototype/Prototype/Prototype/ApplyDesign/Resources/GIF/logo_gif.gif b/Prototype/Prototype/Prototype/ApplyDesign/Resources/GIF/logo_gif.gif new file mode 100644 index 00000000..935ca797 Binary files /dev/null and b/Prototype/Prototype/Prototype/ApplyDesign/Resources/GIF/logo_gif.gif differ diff --git a/Prototype/Prototype/Prototype/ApplyDesign/Resources/Lottie/character_smile_lottie.json b/Prototype/Prototype/Prototype/ApplyDesign/Resources/Lottie/character_smile_lottie.json new file mode 100644 index 00000000..47b0e2d5 --- /dev/null +++ b/Prototype/Prototype/Prototype/ApplyDesign/Resources/Lottie/character_smile_lottie.json @@ -0,0 +1 @@ +{"v":"5.7.5","fr":100,"ip":0,"op":243,"w":201,"h":200,"nm":"Comp 1","ddd":0,"metadata":{},"assets":[{"id":"0","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"","sr":1,"ks":{"p":{"a":0,"k":[201,200],"ix":2},"a":{"a":0,"k":[200,200],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0},{"ddd":0,"refId":"1","w":202,"h":202,"ind":2,"ty":0,"nm":"Gemini_Generated_Image_9e5vou9e5vou9e5v-Photoroom","sr":1,"ks":{"p":{"a":0,"k":[-1,-1],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0,"parent":1}]},{"id":"2","layers":[{"ddd":0,"refId":"3","ind":3,"ty":2,"nm":"Image","sr":1,"ks":{"p":{"a":0,"k":[101,101],"ix":2},"a":{"a":0,"k":[512,512],"ix":2},"s":{"a":0,"k":[19.53125,19.53125],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Fill mask - box","sr":1,"ks":{"p":{"a":0,"k":[1,1],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[202,202],"ix":2},"p":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2}},{"ty":"fl","c":{"a":0,"k":[0,0,0],"ix":2},"o":{"a":0,"k":0,"ix":2},"r":1,"bm":0}],"ip":0,"op":244,"st":0,"bm":0}]},{"id":"1","layers":[{"ddd":0,"ind":5,"ty":4,"nm":"Fill mask","sr":1,"ks":{"p":{"a":0,"k":[1,1],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"td":1,"ao":0,"shapes":[{"ty":"gr","nm":"Fill mask","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":2}},{"ty":"fl","c":{"a":0,"k":[0,0,0],"ix":2},"o":{"a":0,"k":100,"ix":2},"r":1,"bm":0},{"ty":"tr","p":{"a":0,"k":[100,100],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]}],"ip":0,"op":244,"st":0,"bm":0},{"ddd":0,"refId":"2","w":202,"h":202,"ind":2,"ty":0,"nm":"Gemini_Generated_Image_9e5vou9e5vou9e5v-Photoroom","sr":1,"ks":{"p":{"a":0,"k":[100,100],"ix":2},"a":{"a":0,"k":[100,100],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0,"tt":1}]},{"id":"3","u":"","p":"data:image/png;base64,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","w":1024,"h":1024,"e":1},{"id":"4","layers":[{"ddd":0,"refId":"5","ind":6,"ty":2,"nm":"Image","sr":1,"ks":{"p":{"a":0,"k":[101,100],"ix":2},"a":{"a":0,"k":[512,512],"ix":2},"s":{"a":0,"k":[19.53125,19.53125],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Fill mask - box","sr":1,"ks":{"p":{"a":0,"k":[1,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[202,201],"ix":2},"p":{"a":0,"k":[100,100.5],"ix":2},"r":{"a":0,"k":0,"ix":2}},{"ty":"fl","c":{"a":0,"k":[0,0,0],"ix":2},"o":{"a":0,"k":0,"ix":2},"r":1,"bm":0}],"ip":0,"op":244,"st":0,"bm":0}]},{"id":"6","layers":[{"ddd":0,"ind":8,"ty":4,"nm":"Fill mask","sr":1,"ks":{"p":{"a":0,"k":[1,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"td":1,"ao":0,"shapes":[{"ty":"gr","nm":"Fill mask","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":2}},{"ty":"fl","c":{"a":0,"k":[0,0,0],"ix":2},"o":{"a":0,"k":100,"ix":2},"r":1,"bm":0},{"ty":"tr","p":{"a":0,"k":[100,100],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]}],"ip":0,"op":244,"st":0,"bm":0},{"ddd":0,"refId":"4","w":202,"h":201,"ind":9,"ty":0,"nm":"Gemini_Generated_Image_a49ogpa49ogpa49o-Photoroom","sr":1,"ks":{"p":{"a":0,"k":[100,100.5],"ix":2},"a":{"a":0,"k":[100,100.5],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0,"tt":1}]},{"id":"5","u":"","p":"data:image/png;base64,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","w":1024,"h":1024,"e":1}],"layers":[{"ddd":0,"ind":12345679,"ty":4,"nm":"Group Layer 8","sr":1,"ks":{"p":{"a":0,"k":[146.75,185.702868852459,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[20.59426229508197,20.59426229508197,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[220.741,37.184],[225.501,35.896],[228.749,32.36800000000001],[229.981,27.216000000000008],[228.749,22.12],[225.501,18.592],[220.741,17.304],[215.981,18.592],[212.677,22.12],[211.501,27.216000000000008],[212.677,32.36800000000001],[215.981,35.896],[220.741,37.184],[220.741,37.184],[220.741,37.184]],"i":[[0,0],[-1.380999999999972,0.8586999999999989],[-0.7839999999999918,1.493299999999991],[0,1.903999999999996],[0.8220000000000027,1.493299999999991],[1.382000000000062,0.8586999999999989],[1.79200000000003,0],[1.418999999999983,-0.8586999999999989],[0.8220000000000027,-1.493300000000005],[0,-1.904000000000011],[-0.7839999999999918,-1.5307000000000102],[-1.380999999999972,-0.8586999999999989],[-1.754000000000019,0],[0,0],[0,0]],"o":[[1.79200000000003,0],[1.382000000000062,-0.8586999999999989],[0.8220000000000027,-1.5307000000000102],[0,-1.904000000000011],[-0.7839999999999918,-1.493300000000005],[-1.380999999999972,-0.8586999999999989],[-1.754000000000019,0],[-1.380999999999972,0.8586999999999989],[-0.7839999999999918,1.493299999999991],[0,1.903999999999996],[0.8220000000000027,1.493299999999991],[1.418999999999983,0.8586999999999989],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[221.357,43.06400000000001],[214.917,41.608],[210.49300000000005,37.408],[211.221,36.232],[211.221,42.392],[205.173,42.392],[205.173,0],[211.501,0],[211.501,18.36800000000001],[210.49300000000005,16.912000000000006],[214.973,12.88],[221.357,11.424000000000007],[229.085,13.49600000000001],[234.51700000000005,19.152],[236.533,27.216000000000008],[234.51700000000005,35.28],[229.141,40.992],[221.357,43.06400000000001],[221.357,43.06400000000001],[221.357,43.06400000000001]],"i":[[0,0],[1.942000000000007,0.9706999999999937],[1.045999999999935,1.829300000000003],[-0.2426666666666506,0.3919999999999959],[0,-2.053333333333327],[2.015999999999963,0],[0,14.13066666666667],[-2.109333333333325,0],[0,-6.122666666666674],[0.3360000000000127,0.4853333333333296],[-1.865999999999985,0.9707000000000079],[-2.38900000000001,0],[-2.277000000000044,-1.3813000000000102],[-1.30600000000004,-2.389300000000006],[0,-2.986699999999999],[1.343999999999937,-2.389300000000006],[2.27800000000002,-1.4187000000000012],[2.912000000000035,0],[0,0],[0,0]],"o":[[-2.351999999999975,0],[-1.903999999999996,-0.9707000000000079],[0.2426666666666506,-0.3919999999999959],[0,2.053333333333327],[-2.015999999999963,0],[0,-14.13066666666667],[2.109333333333325,0],[0,6.122666666666667],[-0.3360000000000127,-0.4853333333333296],[1.120000000000005,-1.717300000000009],[1.867000000000075,-0.9706999999999937],[2.875,0],[2.314999999999941,1.381299999999996],[1.343999999999937,2.389300000000006],[0,2.986699999999999],[-1.30600000000004,2.389300000000006],[-2.27699999999993,1.381299999999996],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[181.87,43.06400000000001],[176.438,42],[172.854,38.976],[171.566,34.384],[172.63,29.960000000000008],[176.046,26.656000000000006],[181.814,24.752],[192.342,23.016000000000005],[192.342,28],[183.046,29.624],[179.35,31.248],[178.174,34.16],[179.462,37.016000000000005],[182.878,38.08],[187.35799999999995,36.96000000000001],[190.38199999999995,33.992],[191.446,29.792],[191.446,22.008],[189.766,18.36800000000001],[185.398,16.912000000000006],[180.974,18.256],[178.23,21.616],[172.966,18.98400000000001],[175.71,15.064000000000007],[180.134,12.376],[185.566,11.424000000000007],[191.894,12.768],[196.206,16.52],[197.774,22.008],[197.774,42.392],[191.726,42.392],[191.726,36.904],[193.014,37.072],[190.27,40.264],[186.518,42.336],[181.87,43.06400000000001],[181.87,43.06400000000001],[181.87,43.06400000000001]],"i":[[0,0],[1.567999999999984,0.7092999999999989],[0.8589999999999236,1.2693000000000012],[0,1.7547],[-0.7089999999999463,1.306699999999992],[-1.530000000000086,0.8960000000000008],[-2.313999999999965,0.3733000000000004],[-3.509333333333302,0.5786666666666633],[0,-1.661333333333332],[3.098666666666645,-0.541333333333327],[0.7839999999999918,-0.784000000000006],[0,-1.194699999999997],[-0.8579999999999472,-0.7467000000000041],[-1.381000000000085,0],[-1.268999999999892,0.7466999999999899],[-0.7089999999999463,1.2319999999999993],[0,1.530699999999996],[0,2.594666666666669],[1.120000000000005,0.9332999999999885],[1.829999999999927,0],[1.269999999999982,-0.8960000000000008],[0.5979999999999563,-1.381299999999996],[1.754666666666708,0.8773333333333255],[-1.269000000000005,1.11999999999999],[-1.680000000000064,0.6346999999999952],[-1.903999999999996,0],[-1.828999999999951,-0.8960000000000008],[-1.008000000000038,-1.6053],[0,-2.090699999999998],[0,-6.794666666666672],[2.015999999999963,0],[0,1.829333333333338],[-0.4293333333333749,-0.05599999999999739],[1.120000000000005,-0.8959999999999866],[1.418999999999983,-0.4852999999999952],[1.717999999999961,0],[0,0],[0,0]],"o":[[-2.052999999999997,0],[-1.529999999999973,-0.7467000000000041],[-0.8580000000000609,-1.306699999999992],[0,-1.642700000000005],[0.7469999999999573,-1.306700000000006],[1.530999999999949,-0.8960000000000008],[3.509333333333302,-0.5786666666666633],[0,1.661333333333332],[-3.098666666666645,0.541333333333327],[-1.680000000000064,0.2987000000000108],[-0.7839999999999918,0.7467000000000041],[0,1.157300000000006],[0.8959999999999582,0.7092999999999989],[1.717999999999961,0],[1.307000000000016,-0.7467000000000041],[0.7100000000000364,-1.2693000000000012],[0,-2.594666666666669],[0,-1.493299999999991],[-1.081999999999994,-0.9707000000000079],[-1.680000000000064,0],[-1.232000000000085,0.8586999999999989],[-1.754666666666708,-0.8773333333333255],[0.5599999999999454,-1.493300000000005],[1.269999999999982,-1.157300000000006],[1.717999999999961,-0.6347000000000094],[2.389999999999986,0],[1.866999999999962,0.8960000000000008],[1.045999999999935,1.568000000000012],[0,6.794666666666672],[-2.015999999999963,0],[0,-1.829333333333338],[0.4293333333333749,0.05599999999999739],[-0.70900000000006,1.2319999999999993],[-1.081999999999994,0.8960000000000008],[-1.380999999999972,0.4853000000000094],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[159.072,42.392],[159.072,0],[165.4,0],[165.4,42.392],[159.072,42.392],[159.072,42.392],[159.072,42.392]],"i":[[0,0],[0,14.13066666666667],[-2.109333333333325,0],[0,-14.13066666666667],[2.109333333333325,0],[0,0],[0,0]],"o":[[0,-14.13066666666667],[2.109333333333325,0],[0,14.13066666666667],[-2.109333333333325,0],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[138.952,43.06400000000001],[130.888,40.992],[125.456,35.28],[123.496,27.16],[125.456,19.040000000000006],[130.832,13.49600000000001],[138.448,11.424000000000007],[144.552,12.600000000000009],[149.088,15.848],[151.888,20.49600000000001],[152.896,26.096],[152.84,27.608],[152.616,29.064000000000007],[128.48,29.064000000000007],[128.48,24.024],[149.032,24.024],[146.008,26.320000000000007],[145.616,21.448000000000008],[142.816,18.032],[138.448,16.744],[133.968,18.032],[130.944,21.616],[130.104,27.216000000000008],[130.944,32.592],[134.192,36.176],[139.008,37.464],[143.65599999999995,36.232],[146.736,33.040000000000006],[151.888,35.56],[149.088,39.42400000000001],[144.60799999999995,42.11200000000001],[138.952,43.06400000000001],[138.952,43.06400000000001],[138.952,43.06400000000001]],"i":[[0,0],[2.351999999999975,1.381299999999996],[1.307000000000016,2.389300000000006],[0,2.986699999999999],[-1.307000000000016,2.35199999999999],[-2.240000000000009,1.343999999999994],[-2.836999999999989,0],[-1.79200000000003,-0.784000000000006],[-1.231999999999971,-1.381299999999996],[-0.6349999999999909,-1.754700000000014],[0,-1.978700000000003],[0.03699999999992087,-0.5227000000000004],[0.1119999999999663,-0.4480000000000075],[8.04533333333336,0],[0,1.680000000000007],[-6.850666666666712,0],[1.008000000000038,-0.7653333333333308],[0.6349999999999909,1.4187000000000012],[1.269000000000005,0.8213000000000079],[1.680000000000064,0],[1.307000000000016,-0.8586999999999989],[0.70900000000006,-1.567999999999998],[-0.1490000000000009,-2.202700000000007],[-0.7469999999999573,-1.530699999999996],[-1.380999999999972,-0.8586999999999989],[-1.79200000000003,0],[-1.268999999999892,0.8213000000000079],[-0.7469999999999573,1.306699999999992],[-1.717333333333386,-0.8400000000000034],[1.269000000000005,-1.157300000000006],[1.755000000000109,-0.6720000000000113],[2.052999999999997,0],[0,0],[0,0]],"o":[[-3.024000000000001,0],[-2.315000000000055,-1.4187000000000012],[-1.307000000000016,-2.426699999999997],[0,-3.061299999999989],[1.343999999999937,-2.352000000000004],[2.240000000000009,-1.3813000000000102],[2.277000000000044,0],[1.79200000000003,0.7839999999999918],[1.232000000000085,1.344000000000008],[0.6720000000000255,1.7547],[0,0.4852999999999952],[-0.03700000000003456,0.5227000000000004],[-8.04533333333336,0],[0,-1.680000000000007],[6.850666666666712,0],[-1.008000000000038,0.7653333333333308],[0.3729999999999336,-1.829300000000003],[-0.59699999999998,-1.456000000000003],[-1.232000000000085,-0.8586999999999989],[-1.67999999999995,0],[-1.306999999999903,0.8213000000000079],[-0.7089999999999463,1.530699999999996],[-0.1870000000000118,2.053299999999993],[0.7839999999999918,1.53070000000001],[1.418999999999983,0.8586999999999989],[1.828999999999951,0],[1.307000000000016,-0.8212999999999937],[1.717333333333386,0.8400000000000034],[-0.59699999999998,1.4187000000000012],[-1.231999999999971,1.11999999999999],[-1.716999999999985,0.6346999999999952],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[111.001,7.951999999999998],[111.001,0.6720000000000041],[117.329,0.6720000000000041],[117.329,7.951999999999998],[111.001,7.951999999999998],[111.001,7.951999999999998],[111.001,7.951999999999998]],"i":[[0,0],[0,2.426666666666662],[-2.109333333333325,0],[0,-2.426666666666662],[2.109333333333325,0],[0,0],[0,0]],"o":[[0,-2.426666666666662],[2.109333333333325,0],[0,2.426666666666662],[-2.109333333333325,0],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[111.001,42.392],[111.001,12.096],[117.329,12.096],[117.329,42.392],[111.001,42.392],[111.001,42.392],[111.001,42.392]],"i":[[0,0],[0,10.09866666666667],[-2.109333333333325,0],[0,-10.09866666666667],[2.109333333333325,0],[0,0],[0,0]],"o":[[0,-10.09866666666666],[2.109333333333325,0],[0,10.09866666666666],[-2.109333333333325,0],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[101.41,42.72800000000001],[94.01800000000003,40.040000000000006],[91.38599999999997,32.48],[91.38599999999997,17.808000000000007],[86.06600000000003,17.808000000000007],[86.06600000000003,12.096],[86.90599999999995,12.096],[90.21000000000004,10.864],[91.38599999999997,7.504000000000005],[91.38599999999997,5.152000000000001],[97.71400000000006,5.152000000000001],[97.71400000000006,12.096],[104.602,12.096],[104.602,17.808000000000007],[97.71400000000006,17.808000000000007],[97.71400000000006,32.2],[98.21799999999996,34.888000000000005],[99.84199999999998,36.568],[102.754,37.128],[103.76200000000006,37.072],[104.826,36.96000000000001],[104.826,42.392],[103.09,42.616],[101.41,42.72800000000001],[101.41,42.72800000000001],[101.41,42.72800000000001]],"i":[[0,0],[1.754999999999995,1.792000000000002],[0,3.248000000000005],[0,4.890666666666661],[1.773333333333312,0],[0,1.903999999999996],[-0.2799999999999727,0],[-0.7839999999999918,0.8212999999999937],[0,1.4187000000000012],[0,0.7839999999999989],[-2.109333333333325,0],[0,-2.314666666666668],[-2.295999999999935,0],[0,-1.903999999999996],[2.295999999999935,0],[0,-4.797333333333327],[-0.3360000000000127,-0.7467000000000041],[-0.7469999999999573,-0.4106999999999914],[-1.19500000000005,0],[-0.3730000000000473,0.03730000000000189],[-0.3360000000000127,0.03729999999998768],[0,-1.810666666666663],[0.6349999999999909,-0.07469999999999288],[0.4850000000000136,0],[0,0],[0,0]],"o":[[-3.173000000000002,0],[-1.754999999999995,-1.792000000000002],[0,-4.890666666666661],[-1.773333333333312,0],[0,-1.903999999999996],[0.2799999999999727,0],[1.419000000000096,0],[0.7839999999999918,-0.8213000000000079],[0,-0.7839999999999989],[2.109333333333325,0],[0,2.314666666666668],[2.295999999999935,0],[0,1.903999999999996],[-2.295999999999935,0],[0,4.797333333333327],[0,1.045299999999997],[0.3360000000000127,0.7092999999999989],[0.7470000000000709,0.3733000000000004],[0.2989999999999782,0],[0.3729999999999336,-0.03730000000000189],[0,1.810666666666663],[-0.5230000000000246,0.0747000000000071],[-0.6349999999999909,0.0747000000000071],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[78.71499999999997,42.72800000000001],[71.32299999999998,40.040000000000006],[68.69100000000003,32.48],[68.69100000000003,17.808000000000007],[63.37099999999998,17.808000000000007],[63.37099999999998,12.096],[64.21100000000001,12.096],[67.51499999999999,10.864],[68.69100000000003,7.504000000000005],[68.69100000000003,5.152000000000001],[75.019,5.152000000000001],[75.019,12.096],[81.90700000000004,12.096],[81.90700000000004,17.808000000000007],[75.019,17.808000000000007],[75.019,32.2],[75.52300000000002,34.888000000000005],[77.14699999999999,36.568],[80.05900000000003,37.128],[81.06700000000001,37.072],[82.13099999999997,36.96000000000001],[82.13099999999997,42.392],[80.39499999999998,42.616],[78.71499999999997,42.72800000000001],[78.71499999999997,42.72800000000001],[78.71499999999997,42.72800000000001]],"i":[[0,0],[1.754000000000019,1.792000000000002],[0,3.248000000000005],[0,4.890666666666661],[1.773333333333369,0],[0,1.903999999999996],[-0.2800000000000296,0],[-0.7839999999999918,0.8212999999999937],[0,1.4187000000000012],[0,0.7839999999999989],[-2.109333333333325,0],[0,-2.314666666666668],[-2.295999999999992,0],[0,-1.903999999999996],[2.295999999999992,0],[0,-4.797333333333327],[-0.3360000000000127,-0.7467000000000041],[-0.7470000000000141,-0.4106999999999914],[-1.19500000000005,0],[-0.3740000000000236,0.03730000000000189],[-0.3360000000000127,0.03729999999998768],[0,-1.810666666666663],[0.6340000000000146,-0.07469999999999288],[0.4850000000000136,0],[0,0],[0,0]],"o":[[-3.173999999999978,0],[-1.754999999999995,-1.792000000000002],[0,-4.890666666666661],[-1.773333333333369,0],[0,-1.903999999999996],[0.2800000000000296,0],[1.418000000000006,0],[0.7839999999999918,-0.8213000000000079],[0,-0.7839999999999989],[2.109333333333325,0],[0,2.314666666666668],[2.295999999999992,0],[0,1.903999999999996],[-2.295999999999992,0],[0,4.797333333333327],[0,1.045299999999997],[0.3359999999999559,0.7092999999999989],[0.7460000000000377,0.3733000000000004],[0.297999999999945,0],[0.3730000000000473,-0.03730000000000189],[0,1.810666666666663],[-0.5230000000000246,0.0747000000000071],[-0.6349999999999909,0.0747000000000071],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[44.18799999999999,37.184],[48.94799999999998,35.896],[52.19600000000003,32.36800000000001],[53.428,27.216000000000008],[52.19600000000003,22.12],[48.94799999999998,18.592],[44.18799999999999,17.304],[39.428,18.592],[36.12400000000002,22.12],[34.94799999999998,27.216000000000008],[36.12400000000002,32.36800000000001],[39.428,35.896],[44.18799999999999,37.184],[44.18799999999999,37.184],[44.18799999999999,37.184]],"i":[[0,0],[-1.381999999999948,0.8586999999999989],[-0.7840000000000487,1.493299999999991],[0,1.903999999999996],[0.8209999999999695,1.493299999999991],[1.381000000000029,0.8586999999999989],[1.79200000000003,0],[1.418000000000006,-0.8586999999999989],[0.8209999999999695,-1.493300000000005],[0,-1.904000000000011],[-0.7840000000000487,-1.5307000000000102],[-1.382000000000005,-0.8586999999999989],[-1.754999999999995,0],[0,0],[0,0]],"o":[[1.79200000000003,0],[1.381000000000029,-0.8586999999999989],[0.8209999999999695,-1.5307000000000102],[0,-1.904000000000011],[-0.7840000000000487,-1.493300000000005],[-1.381999999999948,-0.8586999999999989],[-1.754999999999995,0],[-1.382000000000005,0.8586999999999989],[-0.7840000000000487,1.493299999999991],[0,1.903999999999996],[0.8209999999999695,1.493299999999991],[1.418000000000006,0.8586999999999989],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[44.18799999999999,43.06400000000001],[36.18000000000001,40.992],[30.46800000000002,35.336],[28.33999999999997,27.216000000000008],[30.46800000000002,19.096],[36.18000000000001,13.49600000000001],[44.18799999999999,11.424000000000007],[52.19600000000003,13.49600000000001],[57.85199999999998,19.096],[59.98000000000002,27.216000000000008],[57.85199999999998,35.392],[52.139999999999986,41.048],[44.18799999999999,43.06400000000001],[44.18799999999999,43.06400000000001],[44.18799999999999,43.06400000000001]],"i":[[0,0],[2.425999999999988,1.381299999999996],[1.418000000000006,2.389300000000006],[0,3.024000000000001],[-1.41900000000004,2.352000000000004],[-2.389999999999986,1.343999999999994],[-2.949999999999989,0],[-2.352000000000032,-1.3813000000000102],[-1.381999999999948,-2.389300000000006],[0,-3.061300000000003],[1.418000000000006,-2.389299999999992],[2.38900000000001,-1.381299999999996],[2.912000000000035,0],[0,0],[0,0]],"o":[[-2.911999999999978,0],[-2.389999999999986,-1.381299999999996],[-1.41900000000004,-2.389299999999992],[0,-3.061300000000003],[1.418000000000006,-2.389300000000006],[2.38900000000001,-1.3813000000000102],[2.98599999999999,0],[2.388999999999953,1.343999999999994],[1.418000000000006,2.352000000000004],[0,3.061299999999989],[-1.418999999999983,2.389300000000006],[-2.389999999999986,1.343999999999994],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[0,42.392],[0,0.6720000000000041],[6.608000000000004,0.6720000000000041],[6.608000000000004,36.512],[24.639999999999986,36.512],[24.639999999999986,42.392],[0,42.392],[0,42.392],[0,42.392]],"i":[[0,0],[0,13.90666666666666],[-2.202666666666687,0],[0,-11.94666666666666],[-6.01066666666668,0],[0,-1.959999999999994],[8.21333333333331,0],[0,0],[0,0]],"o":[[0,-13.90666666666667],[2.202666666666687,0],[0,11.94666666666667],[6.01066666666668,0],[0,1.959999999999994],[-8.21333333333331,0],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"fl","c":{"a":0,"k":[1,1,1],"ix":2},"o":{"a":0,"k":100,"ix":2},"r":1,"bm":0},{"ty":"tr","p":{"a":0,"k":[98.08047485351562,-21.67217254638672],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[99.99999403953552,99.99999403953552],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[246.681,42.392],[246.681,0],[253.009,0],[253.009,18.032],[252.001,17.248],[255.585,12.936000000000007],[261.297,11.424000000000007],[267.23299999999995,12.88],[271.265,16.912000000000006],[272.721,22.792],[272.721,42.392],[266.449,42.392],[266.449,24.528000000000006],[265.553,20.664],[263.201,18.2],[259.729,17.304],[256.25699999999995,18.2],[253.849,20.664],[253.009,24.528000000000006],[253.009,42.392],[246.681,42.392],[246.681,42.392],[246.681,42.392]],"i":[[0,0],[0,14.13066666666667],[-2.109333333333325,0],[0,-6.010666666666665],[0.3360000000000127,0.2613333333333259],[-1.643000000000029,0.9706999999999937],[-2.166000000000054,0],[-1.717999999999961,-0.9706999999999937],[-0.9710000000000036,-1.717300000000009],[0,-2.202699999999993],[0,-6.533333333333331],[2.090666666666721,0],[0,5.954666666666668],[0.59699999999998,1.045299999999997],[1.007999999999925,0.5600000000000023],[1.305999999999926,0],[1.045000000000073,-0.5973000000000042],[0.59699999999998,-1.082700000000003],[0,-1.493300000000005],[0,-5.954666666666668],[2.109333333333325,0],[0,0],[0,0]],"o":[[0,-14.13066666666667],[2.109333333333325,0],[0,6.010666666666665],[-0.3360000000000127,-0.2613333333333259],[0.7459999999999809,-1.903999999999996],[1.641999999999967,-1.0080000000000098],[2.240000000000009,0],[1.717000000000098,0.9707000000000079],[0.9700000000000273,1.717299999999994],[0,6.533333333333331],[-2.090666666666721,0],[0,-5.954666666666668],[0,-1.5307000000000102],[-0.5599999999999454,-1.082700000000003],[-1.008000000000038,-0.5973000000000042],[-1.270000000000095,0],[-1.007999999999953,0.5600000000000023],[-0.5600000000000023,1.082700000000003],[0,5.954666666666668],[-2.109333333333325,0],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-354.5325317382812,-77.50520324707031],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[237.089,42.72800000000001],[229.697,40.040000000000006],[227.065,32.48],[227.065,17.808000000000007],[221.745,17.808000000000007],[221.745,12.096],[222.585,12.096],[225.889,10.864],[227.065,7.504000000000005],[227.065,5.152000000000001],[233.393,5.152000000000001],[233.393,12.096],[240.281,12.096],[240.281,17.808000000000007],[233.393,17.808000000000007],[233.393,32.2],[233.897,34.888000000000005],[235.521,36.568],[238.433,37.128],[239.441,37.072],[240.505,36.96000000000001],[240.505,42.392],[238.769,42.616],[237.089,42.72800000000001],[237.089,42.72800000000001],[237.089,42.72800000000001]],"i":[[0,0],[1.755000000000052,1.792000000000002],[0,3.248000000000005],[0,4.890666666666661],[1.773333333333369,0],[0,1.903999999999996],[-0.2800000000000296,0],[-0.7839999999999918,0.8212999999999937],[0,1.4187000000000012],[0,0.7839999999999989],[-2.109333333333325,0],[0,-2.314666666666668],[-2.295999999999992,0],[0,-1.903999999999996],[2.295999999999992,0],[0,-4.797333333333327],[-0.3360000000000127,-0.7467000000000041],[-0.7459999999999809,-0.4106999999999914],[-1.194000000000017,0],[-0.3729999999999905,0.03730000000000189],[-0.3360000000000127,0.03729999999998768],[0,-1.810666666666663],[0.6350000000000477,-0.07469999999999288],[0.48599999999999,0],[0,0],[0,0]],"o":[[-3.173000000000002,0],[-1.753999999999962,-1.792000000000002],[0,-4.890666666666661],[-1.773333333333369,0],[0,-1.903999999999996],[0.2800000000000296,0],[1.418999999999983,0],[0.7839999999999918,-0.8213000000000079],[0,-0.7839999999999989],[2.109333333333325,0],[0,2.314666666666668],[2.295999999999992,0],[0,1.903999999999996],[-2.295999999999992,0],[0,4.797333333333327],[0,1.045299999999997],[0.3359999999999559,0.7092999999999989],[0.7470000000000141,0.3733000000000004],[0.2989999999999782,0],[0.3740000000000236,-0.03730000000000189],[0,1.810666666666663],[-0.5220000000000482,0.0747000000000071],[-0.6339999999999577,0.0747000000000071],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-354.5325317382812,-77.50520324707031],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[210.259,7.951999999999998],[210.259,0.6720000000000041],[216.587,0.6720000000000041],[216.587,7.951999999999998],[210.259,7.951999999999998],[210.259,7.951999999999998],[210.259,7.951999999999998]],"i":[[0,0],[0,2.426666666666662],[-2.109333333333325,0],[0,-2.426666666666662],[2.109333333333325,0],[0,0],[0,0]],"o":[[0,-2.426666666666662],[2.109333333333325,0],[0,2.426666666666662],[-2.109333333333325,0],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-354.5325317382812,-77.50520324707031],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[210.259,42.392],[210.259,12.096],[216.587,12.096],[216.587,42.392],[210.259,42.392],[210.259,42.392],[210.259,42.392]],"i":[[0,0],[0,10.09866666666667],[-2.109333333333325,0],[0,-10.09866666666667],[2.109333333333325,0],[0,0],[0,0]],"o":[[0,-10.09866666666666],[2.109333333333325,0],[0,10.09866666666666],[-2.109333333333325,0],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-354.5325317382812,-77.50520324707031],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[169.688,42.392],[159.272,12.096],[165.992,12.096],[173.944,36.232],[171.592,36.232],[179.712,12.096],[185.48,12.096],[193.544,36.232],[191.192,36.232],[199.2,12.096],[205.92,12.096],[195.448,42.392],[189.736,42.392],[181.56,17.696],[183.632,17.696],[175.456,42.392],[169.688,42.392],[169.688,42.392],[169.688,42.392]],"i":[[0,0],[3.47199999999998,10.09866666666667],[-2.240000000000009,0],[-2.650666666666666,-8.045333333333332],[0.7839999999999918,0],[-2.706666666666649,8.045333333333332],[-1.922666666666657,0],[-2.687999999999988,-8.045333333333332],[0.7839999999999918,0],[-2.669333333333327,8.045333333333332],[-2.240000000000009,0],[3.490666666666641,-10.09866666666667],[1.903999999999996,0],[2.725333333333367,8.232],[-0.6906666666666865,0],[2.72533333333331,-8.232],[1.922666666666657,0],[0,0],[0,0]],"o":[[-3.47199999999998,-10.09866666666666],[2.240000000000009,0],[2.650666666666666,8.045333333333332],[-0.7839999999999918,0],[2.706666666666649,-8.045333333333332],[1.922666666666657,0],[2.687999999999988,8.045333333333332],[-0.7839999999999918,0],[2.669333333333327,-8.045333333333332],[2.240000000000009,0],[-3.490666666666641,10.09866666666666],[-1.903999999999996,0],[-2.725333333333367,-8.232],[0.6906666666666865,0],[-2.72533333333331,8.232],[-1.922666666666657,0],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-354.5325317382812,-77.50520324707031],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"fl","c":{"a":0,"k":[1,1,1],"ix":2},"o":{"a":0,"k":100,"ix":2},"r":1,"bm":0},{"ty":"tr","p":{"a":0,"k":[155.86146545410156,56.001014709472656],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[99.99999403953552,99.99999403953552],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[132.444,43.06400000000001],[124.38,40.992],[118.948,35.28],[116.988,27.16],[118.948,19.040000000000006],[124.324,13.49600000000001],[131.94,11.424000000000007],[138.044,12.600000000000009],[142.58,15.848],[145.38,20.49600000000001],[146.388,26.096],[146.332,27.608],[146.108,29.064000000000007],[121.972,29.064000000000007],[121.972,24.024],[142.524,24.024],[139.5,26.320000000000007],[139.108,21.448000000000008],[136.308,18.032],[131.94,16.744],[127.46,18.032],[124.436,21.616],[123.596,27.216000000000008],[124.436,32.592],[127.684,36.176],[132.5,37.464],[137.148,36.232],[140.228,33.040000000000006],[145.38,35.56],[142.58,39.42400000000001],[138.1,42.11200000000001],[132.444,43.06400000000001],[132.444,43.06400000000001],[132.444,43.06400000000001]],"i":[[0,0],[2.351999999999975,1.381299999999996],[1.305999999999983,2.389300000000006],[0,2.986699999999999],[-1.307000000000016,2.35199999999999],[-2.240000000000009,1.343999999999994],[-2.838000000000022,0],[-1.79200000000003,-0.784000000000006],[-1.232000000000028,-1.381299999999996],[-0.6350000000000477,-1.754700000000014],[0,-1.978700000000003],[0.03699999999997772,-0.5227000000000004],[0.1120000000000232,-0.4480000000000075],[8.045333333333303,0],[0,1.680000000000007],[-6.850666666666655,0],[1.007999999999981,-0.7653333333333308],[0.6340000000000146,1.4187000000000012],[1.269000000000005,0.8213000000000079],[1.67999999999995,0],[1.305999999999983,-0.8586999999999989],[0.7090000000000032,-1.567999999999998],[-0.1499999999999773,-2.202700000000007],[-0.7470000000000141,-1.530699999999996],[-1.382000000000005,-0.8586999999999989],[-1.791999999999973,0],[-1.269999999999982,0.8213000000000079],[-0.7469999999999573,1.306699999999992],[-1.717333333333329,-0.8400000000000034],[1.269000000000005,-1.157300000000006],[1.754000000000019,-0.6720000000000113],[2.052999999999997,0],[0,0],[0,0]],"o":[[-3.024000000000001,0],[-2.314999999999998,-1.4187000000000012],[-1.307000000000016,-2.426699999999997],[0,-3.061299999999989],[1.343999999999994,-2.352000000000004],[2.240000000000009,-1.3813000000000102],[2.276999999999987,0],[1.791999999999973,0.7839999999999918],[1.231999999999971,1.344000000000008],[0.6719999999999686,1.7547],[0,0.4852999999999952],[-0.03800000000001091,0.5227000000000004],[-8.045333333333303,0],[0,-1.680000000000007],[6.850666666666655,0],[-1.007999999999981,0.7653333333333308],[0.3730000000000473,-1.829300000000003],[-0.5979999999999563,-1.456000000000003],[-1.232000000000028,-0.8586999999999989],[-1.680000000000007,0],[-1.307000000000016,0.8213000000000079],[-0.7100000000000364,1.530699999999996],[-0.186999999999955,2.053299999999993],[0.7839999999999918,1.53070000000001],[1.418000000000006,0.8586999999999989],[1.829000000000008,0],[1.305999999999983,-0.8212999999999937],[1.717333333333329,0.8400000000000034],[-0.5980000000000132,1.4187000000000012],[-1.232000000000028,1.11999999999999],[-1.718000000000018,0.6346999999999952],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-211.7300415039062,-77.67320251464844],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[95.32,37.184],[100.024,35.896],[103.328,32.36800000000001],[104.56,27.216000000000008],[103.328,22.12],[100.024,18.592],[95.32,17.304],[90.56,18.592],[87.256,22.12],[86.08000000000001,27.216000000000008],[87.256,32.36800000000001],[90.50399999999999,35.896],[95.32,37.184],[95.32,37.184],[95.32,37.184]],"i":[[0,0],[-1.381,0.8586999999999989],[-0.7839999999999918,1.493299999999991],[0,1.903999999999996],[0.820999999999998,1.493299999999991],[1.419000000000011,0.8586999999999989],[1.754999999999995,0],[1.418999999999983,-0.8586999999999989],[0.7839999999999918,-1.493300000000005],[0,-1.904000000000011],[-0.7839999999999918,-1.5307000000000102],[-1.381,-0.8586999999999989],[-1.792000000000002,0],[0,0],[0,0]],"o":[[1.754999999999995,0],[1.419000000000011,-0.8586999999999989],[0.820999999999998,-1.5307000000000102],[0,-1.904000000000011],[-0.7839999999999918,-1.493300000000005],[-1.381,-0.8586999999999989],[-1.754999999999995,0],[-1.419000000000011,0.8586999999999989],[-0.7839999999999918,1.493299999999991],[0,1.903999999999996],[0.7839999999999918,1.493299999999991],[1.419000000000011,0.8586999999999989],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-211.7300415039062,-77.67320251464844],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[94.70400000000001,43.06400000000001],[86.864,40.992],[81.43199999999999,35.28],[79.47200000000001,27.216000000000008],[81.488,19.152],[86.91999999999999,13.49600000000001],[94.648,11.424000000000007],[101.088,12.88],[105.512,16.912000000000006],[104.56,18.36800000000001],[104.56,0],[110.832,0],[110.832,42.392],[104.84,42.392],[104.84,36.232],[105.568,37.408],[101.088,41.608],[94.70400000000001,43.06400000000001],[94.70400000000001,43.06400000000001],[94.70400000000001,43.06400000000001]],"i":[[0,0],[2.314999999999998,1.381299999999996],[1.344000000000023,2.389300000000006],[0,2.986699999999999],[-1.343999999999994,2.389300000000006],[-2.276999999999987,1.381299999999996],[-2.875,0],[-1.8669999999999902,-0.9706999999999937],[-1.082999999999998,-1.717300000000009],[0.3173333333333233,-0.4853333333333296],[0,6.122666666666674],[-2.090666666666664,0],[0,-14.13066666666667],[1.99733333333333,0],[0,2.053333333333327],[-0.242666666666679,-0.3919999999999959],[1.941000000000003,-0.9707000000000079],[2.314999999999998,0],[0,0],[0,0]],"o":[[-2.912000000000006,0],[-2.277000000000015,-1.4187000000000012],[-1.306999999999988,-2.389300000000006],[0,-2.986699999999999],[1.343999999999994,-2.389300000000006],[2.277000000000015,-1.3813000000000102],[2.426999999999992,0],[1.867000000000019,0.9707000000000079],[-0.3173333333333233,0.4853333333333296],[0,-6.122666666666674],[2.090666666666664,0],[0,14.13066666666667],[-1.99733333333333,0],[0,-2.053333333333327],[0.242666666666679,0.3919999999999959],[-1.045000000000016,1.829300000000003],[-1.941000000000003,0.9706999999999937],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-211.7300415039062,-77.67320251464844],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[57.40100000000001,43.06400000000001],[51.968999999999994,42],[48.38499999999999,38.976],[47.09700000000001,34.384],[48.161,29.960000000000008],[51.577,26.656000000000006],[57.345,24.752],[67.87299999999999,23.016000000000005],[67.87299999999999,28],[58.577,29.624],[54.881,31.248],[53.70500000000001,34.16],[54.992999999999995,37.016000000000005],[58.40899999999999,38.08],[62.88900000000001,36.96000000000001],[65.91300000000001,33.992],[66.977,29.792],[66.977,22.008],[65.297,18.36800000000001],[60.929,16.912000000000006],[56.505,18.256],[53.761,21.616],[48.496999999999986,18.98400000000001],[51.240999999999985,15.064000000000007],[55.66499999999999,12.376],[61.09700000000001,11.424000000000007],[67.42500000000001,12.768],[71.737,16.52],[73.305,22.008],[73.305,42.392],[67.257,42.392],[67.257,36.904],[68.54499999999999,37.072],[65.80099999999999,40.264],[62.04900000000001,42.336],[57.40100000000001,43.06400000000001],[57.40100000000001,43.06400000000001],[57.40100000000001,43.06400000000001]],"i":[[0,0],[1.568000000000012,0.7092999999999989],[0.8590000000000089,1.2693000000000012],[0,1.7547],[-0.7090000000000032,1.306699999999992],[-1.531000000000006,0.8960000000000008],[-2.314999999999998,0.3733000000000004],[-3.509333333333331,0.5786666666666633],[0,-1.661333333333332],[3.098666666666674,-0.541333333333327],[0.7839999999999918,-0.784000000000006],[0,-1.194699999999997],[-0.8590000000000089,-0.7467000000000041],[-1.381,0],[-1.269000000000005,0.7466999999999899],[-0.7090000000000032,1.2319999999999993],[0,1.530699999999996],[0,2.594666666666669],[1.120000000000005,0.9332999999999885],[1.829000000000008,0],[1.269000000000005,-0.8960000000000008],[0.5970000000000084,-1.381299999999996],[1.754666666666679,0.8773333333333255],[-1.268999999999977,1.11999999999999],[-1.680000000000007,0.6346999999999952],[-1.903999999999996,0],[-1.829000000000008,-0.8960000000000008],[-1.0080000000000098,-1.6053],[0,-2.090699999999998],[0,-6.794666666666672],[2.015999999999991,0],[0,1.829333333333338],[-0.429333333333318,-0.05599999999999739],[1.120000000000005,-0.8959999999999866],[1.418999999999983,-0.4852999999999952],[1.716999999999985,0],[0,0],[0,0]],"o":[[-2.053000000000026,0],[-1.531000000000006,-0.7467000000000041],[-0.8589999999999804,-1.306699999999992],[0,-1.642700000000005],[0.7469999999999857,-1.306700000000006],[1.531000000000006,-0.8960000000000008],[3.509333333333331,-0.5786666666666633],[0,1.661333333333332],[-3.098666666666674,0.541333333333327],[-1.680000000000007,0.2987000000000108],[-0.7839999999999918,0.7467000000000041],[0,1.157300000000006],[0.896000000000015,0.7092999999999989],[1.717000000000013,0],[1.306999999999988,-0.7467000000000041],[0.7089999999999748,-1.2693000000000012],[0,-2.594666666666669],[0,-1.493299999999991],[-1.082999999999998,-0.9707000000000079],[-1.680000000000007,0],[-1.2319999999999993,0.8586999999999989],[-1.754666666666679,-0.8773333333333255],[0.5600000000000023,-1.493300000000005],[1.269000000000005,-1.157300000000006],[1.717000000000013,-0.6347000000000094],[2.388999999999982,0],[1.86699999999999,0.8960000000000008],[1.045000000000016,1.568000000000012],[0,6.794666666666672],[-2.015999999999991,0],[0,-1.829333333333338],[0.429333333333318,0.05599999999999739],[-0.7089999999999748,1.2319999999999993],[-1.082999999999998,0.8960000000000008],[-1.381,0.4853000000000094],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-211.7300415039062,-77.67320251464844],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"v":[[0,42.392],[0,0.6720000000000041],[6.159999999999997,0.6720000000000041],[21.84,22.400000000000006],[18.75999999999999,22.400000000000006],[34.16,0.6720000000000041],[40.31999999999999,0.6720000000000041],[40.31999999999999,42.392],[33.768,42.392],[33.768,8.456000000000003],[36.232,9.128],[20.49600000000001,30.632000000000005],[19.824000000000012,30.632000000000005],[4.424000000000007,9.128],[6.608000000000004,8.456000000000003],[6.608000000000004,42.392],[0,42.392],[0,42.392],[0,42.392]],"i":[[0,0],[0,13.90666666666666],[-2.053333333333342,0],[-5.226666666666659,-7.242666666666665],[1.026666666666671,0],[-5.133333333333326,7.242666666666672],[-2.053333333333342,0],[0,-13.90666666666667],[2.183999999999997,0],[0,11.312],[-0.8213333333333424,-0.2240000000000038],[5.245333333333321,-7.168000000000006],[0.2239999999999895,0],[5.133333333333326,7.168000000000006],[-0.7280000000000086,0.2240000000000038],[0,-11.312],[2.202666666666659,0],[0,0],[0,0]],"o":[[0,-13.90666666666667],[2.053333333333342,0],[5.226666666666659,7.242666666666672],[-1.026666666666671,0],[5.133333333333326,-7.242666666666665],[2.053333333333342,0],[0,13.90666666666666],[-2.183999999999997,0],[0,-11.312],[0.8213333333333424,0.2240000000000038],[-5.245333333333321,7.168000000000006],[-0.2239999999999895,0],[-5.133333333333326,-7.168000000000006],[0.7280000000000086,-0.2240000000000038],[0,11.312],[-2.202666666666659,0],[0,0],[0,0],[0,0]]}}},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[-211.7300415039062,-77.67320251464844],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"fl","c":{"a":0,"k":[1,1,1],"ix":2},"o":{"a":0,"k":100,"ix":2},"r":1,"bm":0},{"ty":"tr","p":{"a":0,"k":[2.91259765625,56.001014709472656],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[99.99999403953552,99.99999403953552],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[702.6863719370097,144],"ix":2},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":72,"ix":2}},{"ty":"fl","c":{"a":0,"k":[0,0,0],"ix":2},"o":{"a":0,"k":100,"ix":2},"r":1,"bm":0},{"ty":"tm","s":{"a":0,"k":0,"ix":2},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":2},"m":1},{"ty":"tr","p":{"a":0,"k":[56.54167175292969,-0.000022762338630855083],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[99.99999403953552,99.99999403953552],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":80,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]},{"ty":"tr","p":{"a":0,"k":[122.0000003294881,25.00000012138912],"ix":2},"a":{"a":0,"k":[56.54167175292969,-0.00002288818359375],"ix":2},"s":{"a":0,"k":[34.403572049765366,34.403572049765366],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}}]}],"ip":0,"op":244,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":3,"nm":"","sr":1,"ks":{"p":{"a":0,"k":[200,200],"ix":2},"a":{"a":0,"k":[200,200],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0},{"ddd":0,"refId":"0","w":202,"h":201,"ind":11,"ty":0,"nm":"Frame 104","sr":1,"ks":{"p":{"a":0,"k":[-1,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":1,"k":[{"t":43,"s":[100],"h":1},{"t":44,"s":[100],"h":1},{"t":45,"s":[100],"h":1},{"t":46,"s":[100],"h":1},{"t":47,"s":[100],"h":1},{"t":48,"s":[100],"h":1},{"t":49,"s":[100],"h":1},{"t":50,"s":[100],"h":1},{"t":51,"s":[100],"h":1},{"t":52,"s":[100],"h":1},{"t":53,"s":[100],"h":1},{"t":54,"s":[100],"h":1},{"t":55,"s":[100],"h":1},{"t":56,"s":[100],"h":1},{"t":57,"s":[100],"h":1},{"t":58,"s":[100],"h":1},{"t":59,"s":[100],"h":1},{"t":60,"s":[100],"h":1},{"t":61,"s":[100],"h":1},{"t":62,"s":[100],"h":1},{"t":63,"s":[100],"h":1},{"t":64,"s":[100],"h":1},{"t":65,"s":[100],"h":1},{"t":66,"s":[100],"h":1},{"t":67,"s":[100],"h":1},{"t":68,"s":[100],"h":1},{"t":69,"s":[100],"h":1},{"t":70,"s":[100],"h":1},{"t":71,"s":[100],"h":1},{"t":72,"s":[100],"h":1},{"t":73,"s":[100],"h":1},{"t":74,"s":[100],"h":1},{"t":75,"s":[100],"h":1},{"t":76,"s":[100],"h":1},{"t":77,"s":[100],"h":1},{"t":78,"s":[100],"h":1},{"t":79,"s":[100],"h":1},{"t":80,"s":[100],"h":1},{"t":81,"s":[100],"h":1},{"t":82,"s":[100],"h":1},{"t":83,"s":[100],"h":1},{"t":84,"s":[100],"h":1},{"t":85,"s":[100],"h":1},{"t":86,"s":[100],"h":1},{"t":87,"s":[100],"h":1},{"t":88,"s":[100],"h":1},{"t":89,"s":[100],"h":1},{"t":90,"s":[100],"h":1},{"t":91,"s":[100],"h":1},{"t":92,"s":[100],"h":1},{"t":93,"s":[0],"h":1},{"t":94,"s":[0],"h":1},{"t":95,"s":[0],"h":1},{"t":96,"s":[0],"h":1},{"t":97,"s":[0],"h":1},{"t":98,"s":[0],"h":1},{"t":99,"s":[0],"h":1},{"t":100,"s":[0],"h":1},{"t":101,"s":[0],"h":1},{"t":102,"s":[0],"h":1},{"t":103,"s":[0],"h":1},{"t":104,"s":[0],"h":1},{"t":105,"s":[0],"h":1},{"t":106,"s":[0],"h":1},{"t":107,"s":[0],"h":1},{"t":108,"s":[0],"h":1},{"t":109,"s":[0],"h":1},{"t":110,"s":[0],"h":1},{"t":111,"s":[0],"h":1},{"t":112,"s":[0],"h":1},{"t":113,"s":[0],"h":1},{"t":114,"s":[0],"h":1},{"t":115,"s":[0],"h":1},{"t":116,"s":[0],"h":1},{"t":117,"s":[0],"h":1},{"t":118,"s":[0],"h":1},{"t":119,"s":[0],"h":1},{"t":120,"s":[0],"h":1},{"t":121,"s":[0],"h":1},{"t":122,"s":[0],"h":1},{"t":123,"s":[0],"h":1},{"t":124,"s":[0],"h":1},{"t":125,"s":[0],"h":1},{"t":126,"s":[0],"h":1},{"t":127,"s":[0],"h":1},{"t":128,"s":[0],"h":1},{"t":129,"s":[0],"h":1},{"t":130,"s":[0],"h":1},{"t":131,"s":[0],"h":1},{"t":132,"s":[0],"h":1},{"t":133,"s":[0],"h":1},{"t":134,"s":[0],"h":1},{"t":135,"s":[0],"h":1},{"t":136,"s":[0],"h":1},{"t":137,"s":[0],"h":1},{"t":138,"s":[0],"h":1},{"t":139,"s":[0],"h":1},{"t":140,"s":[0],"h":1},{"t":141,"s":[0],"h":1},{"t":142,"s":[0],"h":1},{"t":143,"s":[100],"h":1},{"t":144,"s":[100],"h":1},{"t":145,"s":[100],"h":1},{"t":146,"s":[100],"h":1},{"t":147,"s":[100],"h":1},{"t":148,"s":[100],"h":1},{"t":149,"s":[100],"h":1},{"t":150,"s":[100],"h":1},{"t":151,"s":[100],"h":1},{"t":152,"s":[100],"h":1},{"t":153,"s":[100],"h":1},{"t":154,"s":[100],"h":1},{"t":155,"s":[100],"h":1},{"t":156,"s":[100],"h":1},{"t":157,"s":[100],"h":1},{"t":158,"s":[100],"h":1},{"t":159,"s":[100],"h":1},{"t":160,"s":[100],"h":1},{"t":161,"s":[100],"h":1},{"t":162,"s":[100],"h":1},{"t":163,"s":[100],"h":1},{"t":164,"s":[100],"h":1},{"t":165,"s":[100],"h":1},{"t":166,"s":[100],"h":1},{"t":167,"s":[100],"h":1},{"t":168,"s":[100],"h":1},{"t":169,"s":[100],"h":1},{"t":170,"s":[100],"h":1},{"t":171,"s":[100],"h":1},{"t":172,"s":[100],"h":1},{"t":173,"s":[100],"h":1},{"t":174,"s":[100],"h":1},{"t":175,"s":[100],"h":1},{"t":176,"s":[100],"h":1},{"t":177,"s":[100],"h":1},{"t":178,"s":[100],"h":1},{"t":179,"s":[100],"h":1},{"t":180,"s":[100],"h":1},{"t":181,"s":[100],"h":1},{"t":182,"s":[100],"h":1},{"t":183,"s":[100],"h":1},{"t":184,"s":[100],"h":1},{"t":185,"s":[100],"h":1},{"t":186,"s":[100],"h":1},{"t":187,"s":[100],"h":1},{"t":188,"s":[100],"h":1},{"t":189,"s":[100],"h":1},{"t":190,"s":[100],"h":1},{"t":191,"s":[100],"h":1},{"t":192,"s":[100],"h":1},{"t":193,"s":[0],"h":1},{"t":194,"s":[0],"h":1},{"t":195,"s":[0],"h":1},{"t":196,"s":[0],"h":1},{"t":197,"s":[0],"h":1},{"t":198,"s":[0],"h":1},{"t":199,"s":[0],"h":1},{"t":200,"s":[0],"h":1},{"t":201,"s":[0],"h":1},{"t":202,"s":[0],"h":1},{"t":203,"s":[0],"h":1},{"t":204,"s":[0],"h":1},{"t":205,"s":[0],"h":1},{"t":206,"s":[0],"h":1},{"t":207,"s":[0],"h":1},{"t":208,"s":[0],"h":1},{"t":209,"s":[0],"h":1},{"t":210,"s":[0],"h":1},{"t":211,"s":[0],"h":1},{"t":212,"s":[0],"h":1},{"t":213,"s":[0],"h":1},{"t":214,"s":[0],"h":1},{"t":215,"s":[0],"h":1},{"t":216,"s":[0],"h":1},{"t":217,"s":[0],"h":1},{"t":218,"s":[0],"h":1},{"t":219,"s":[0],"h":1},{"t":220,"s":[0],"h":1},{"t":221,"s":[0],"h":1},{"t":222,"s":[0],"h":1},{"t":223,"s":[0],"h":1},{"t":224,"s":[0],"h":1},{"t":225,"s":[0],"h":1},{"t":226,"s":[0],"h":1},{"t":227,"s":[0],"h":1},{"t":228,"s":[0],"h":1},{"t":229,"s":[0],"h":1},{"t":230,"s":[0],"h":1},{"t":231,"s":[0],"h":1},{"t":232,"s":[0],"h":1},{"t":233,"s":[0],"h":1},{"t":234,"s":[0],"h":1},{"t":235,"s":[0],"h":1},{"t":236,"s":[0],"h":1},{"t":237,"s":[0],"h":1},{"t":238,"s":[0],"h":1},{"t":239,"s":[0],"h":1},{"t":240,"s":[0],"h":1},{"t":241,"s":[0],"h":1},{"t":242,"s":[0],"h":1},{"t":243,"s":[100],"h":1}],"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0,"parent":10},{"ddd":0,"ind":12,"ty":3,"nm":"Frame 105","sr":1,"ks":{"p":{"a":0,"k":[478,200],"ix":2},"a":{"a":0,"k":[478,200],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":3,"nm":"","sr":1,"ks":{"p":{"a":0,"k":[200,200],"ix":2},"a":{"a":0,"k":[200,200],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0,"parent":12},{"ddd":0,"refId":"6","w":202,"h":201,"ind":9,"ty":0,"nm":"Gemini_Generated_Image_a49ogpa49ogpa49o-Photoroom","sr":1,"ks":{"p":{"a":0,"k":[-1,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":2},"s":{"a":0,"k":[100,100],"ix":2},"r":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":100,"ix":2},"sk":{"a":0,"k":0,"ix":2},"sa":{"a":0,"k":0,"ix":2}},"ao":0,"ip":0,"op":244,"st":0,"bm":0,"parent":13}],"markers":[]} \ No newline at end of file diff --git a/Prototype/Prototype/Prototype/ApplyDesign/Resources/Lottie/logo_lottie.json b/Prototype/Prototype/Prototype/ApplyDesign/Resources/Lottie/logo_lottie.json new file mode 100644 index 00000000..98e350cf --- /dev/null +++ b/Prototype/Prototype/Prototype/ApplyDesign/Resources/Lottie/logo_lottie.json @@ -0,0 +1 @@ +{"nm":"로고","ddd":0,"h":300,"w":300,"meta":{"g":"LottieFiles Figma v106"},"layers":[{"ty":4,"nm":"Gemini_Generated_Image_dacc7qdacc7qdacc-Photoroom 1 (Border)","sr":1,"st":0,"op":107,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[25,25]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.40087257324568,125.40026882804793],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[86.40097822738178,110.40026952837809],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[86.40097822738178,110.40026952837809],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[93.36547983950662,131.2937685528882],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[90.71947922701725,123.35576892350292],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[91.60297943152757,126.00626879975457],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[91.3564793744684,125.26676883428087],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[91.4029793852321,125.4062688277678],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[91.40647938604226,125.41676882727756],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[91.39697938384322,125.3882688286082],"t":106.4929928779602},{"s":[91.40097938476914,125.40026882804793],"t":107}]},"r":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[21.407910113145988],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[-2.6024811970472683],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[-2.6024811970472683],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[30.841592858920876],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[18.13529377756663],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[22.377929922077783],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[21.19421763048524],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[21.41751426967005],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[21.434321543587203],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[21.388701800097806],"t":106.4929928779602},{"s":[21.407910113145988],"t":107}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}}},{"ty":"st","bm":0,"hd":false,"nm":"","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":0},"w":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[1],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[1],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[1],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[1],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[1],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[1],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[1],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[1],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[1],"t":106.4929928779602},{"s":[1],"t":107}]},"c":{"a":0,"k":[0,0,0]}}],"ind":1},{"ty":4,"nm":"Gemini_Generated_Image_dacc7qdacc7qdacc-Photoroom 1 (Mask)","sr":1,"st":0,"op":107,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","bm":0,"hd":false,"nm":"","it":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[50,0],[50,50],[0,50],[0,0]]}],"t":107}]}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[1,0,0]},"r":2,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[25,25],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[25,25],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[25,25],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[25,25],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[25,25],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[25,25],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[25,25],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[25,25],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[25,25],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[25,25],"t":106.4929928779602},{"s":[25,25],"t":107}]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.40087257324568,125.40026882804793],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[86.40097822738178,110.40026952837809],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[86.40097822738178,110.40026952837809],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[93.36547983950662,131.2937685528882],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[90.71947922701725,123.35576892350292],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[91.60297943152757,126.00626879975457],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[91.3564793744684,125.26676883428087],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[91.4029793852321,125.4062688277678],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[91.40647938604226,125.41676882727756],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[91.39697938384322,125.3882688286082],"t":106.4929928779602},{"s":[91.40097938476914,125.40026882804793],"t":107}]},"r":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[21.407910113145988],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[-2.6024811970472683],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[-2.6024811970472683],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[30.841592858920876],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[18.13529377756663],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[22.377929922077783],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[21.19421763048524],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[21.41751426967005],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[21.434321543587203],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[21.388701800097806],"t":106.4929928779602},{"s":[21.407910113145988],"t":107}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":2},{"ty":2,"nm":"Gemini_Generated_Image_dacc7qdacc7qdacc-Photoroom 1","sr":1,"st":0,"op":107,"ip":0,"hd":false,"ddd":0,"bm":0,"tt":1,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[512,512]},"s":{"a":0,"k":[4.8828125,4.8828125]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.40087257324568,125.40026882804793],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[86.40097822738178,110.40026952837809],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[86.40097822738178,110.40026952837809],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[93.36547983950662,131.2937685528882],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[90.71947922701725,123.35576892350292],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[91.60297943152757,126.00626879975457],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[91.3564793744684,125.26676883428087],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[91.4029793852321,125.4062688277678],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[91.40647938604226,125.41676882727756],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[91.39697938384322,125.3882688286082],"t":106.4929928779602},{"s":[91.40097938476914,125.40026882804793],"t":107}]},"r":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[21.407910113145988],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[-2.6024811970472683],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[-2.6024811970472683],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[30.841592858920876],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[18.13529377756663],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[22.377929922077783],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[21.19421763048524],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[21.41751426967005],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[21.434321543587203],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[21.388701800097806],"t":106.4929928779602},{"s":[21.407910113145988],"t":107}]},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[100],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[100],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[100],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[100],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[100],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[100],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[100],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[100],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[100],"t":106.4929928779602},{"s":[100],"t":107}]}},"refId":"0a224e8e34eadd0e46bc2059027a2254cd08e303","ind":3},{"ty":4,"nm":"1인","sr":1,"st":0,"op":107.55,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[28.5,8],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[28.5,8],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[28.5,8],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[25.02,8],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[26.34,8],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[25.9,8],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[26.02,8],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[26,8],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[26,8],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[26,8],"t":106.4929928779602},{"s":[26,8],"t":107}]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.5,94],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[82.5,70],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[82.5,70],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[77.61,105.88],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[79.48,92.5],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[78.86,97.03],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[79.03,95.77],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[79,96.01],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[79,96.03],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[79,95.98],"t":106.4929928779602},{"s":[79,96],"t":107}]},"r":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[-10],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[-10],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[3.93],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[-1.36],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[0.41],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[-0.08],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[0.01],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[0.02],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[0],"t":106.4929928779602},{"s":[0.01],"t":107}]},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[100],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[100],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[100],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[100],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[100],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[100],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[100],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[100],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[100],"t":106.4929928779602},{"s":[100],"t":107}]}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[15.01,-6.09],[15.01,23],[8.86,23],[8.86,-0.25],[8.69,-0.25],[2.03,3.92],[2.03,-1.53],[9.23,-6.09],[15.01,-6.09]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[15.0142,-6.09091],[15.0142,23],[8.86364,23],[8.86364,-0.252842],[8.69318,-0.252842],[2.03125,3.9233],[2.03125,-1.53125],[9.23295,-6.09091],[15.0142,-6.09091]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[15.0142,-6.09091],[15.0142,23],[8.86364,23],[8.86364,-0.252842],[8.69318,-0.252842],[2.03125,3.9233],[2.03125,-1.53125],[9.23295,-6.09091],[15.0142,-6.09091]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[12.92289994,-4.824638539],[12.92289994,20.214199999999998],[7.629015227,20.214199999999998],[7.629015227,0.20024580502],[7.482304172,0.20024580502],[1.7483102229999998,3.794693543],[1.7483102229999998,-0.9000852229999999],[7.946899358999999,-4.824638539],[12.92289994,-4.824638539]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.71744082,-5.305728967],[13.71744082,21.2726],[8.098082231,21.2726],[8.098082231,0.028105618060000004],[7.9423483159999995,0.028105618060000004],[1.855806619,3.843554579],[1.855806619,-1.139881619],[8.435504427,-5.305728967],[13.71744082,-5.305728967]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.45214344,-5.145092764],[13.45214344,20.9192],[7.941460652,20.9192],[7.941460652,0.08558326552000001],[7.788739472,0.08558326552000001],[1.819913548,3.8272398680000004],[1.819913548,-1.059813548],[8.272359084,-5.145092764],[13.45214344,-5.145092764]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.52616246,-5.189910901],[13.52616246,21.0178],[7.985158693,21.0178],[7.985158693,0.06954677417999999],[7.831596948,0.06954677417999999],[1.829927857,3.831791737],[1.829927857,-1.082152857],[8.317877281,-5.189910901],[13.52616246,-5.189910901]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.51219944,-5.181456364],[13.51219944,20.999200000000002],[7.976915452,20.999200000000002],[7.976915452,0.07257191351999998],[7.823512272,0.07257191351999998],[1.828038748,3.830933068],[1.828038748,-1.077938748],[8.309290683999999,-5.181456364],[13.51219944,-5.181456364]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.511148460000001,-5.180820001],[13.511148460000001,20.997799999999998],[7.976294993,20.997799999999998],[7.976294993,0.07279961218000003],[7.822903748,0.07279961218000003],[1.8278965569999999,3.8308684370000003],[1.8278965569999999,-1.0776215569999998],[8.308644380999999,-5.180820001],[13.511148460000001,-5.180820001]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.51400112,-5.182547272],[13.51400112,21.0016],[7.977979096,21.0016],[7.977979096,0.07218157296],[7.824555456,0.07218157296],[1.828282504,3.831043864],[1.828282504,-1.078482504],[8.310398631999998,-5.182547272],[13.51400112,-5.182547272]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.51,-5.18],[13.51,21],[7.98,21],[7.98,0.07],[7.82,0.07],[1.83,3.83],[1.83,-1.08],[8.31,-5.18],[13.51,-5.18]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[47.05,-10.48],[52.37,-10.48],[52.37,16.12],[47.05,16.12],[47.05,-10.48]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[47.0503,-10.48],[52.3703,-10.48],[52.3703,16.12],[47.0503,16.12],[47.0503,-10.48]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[47.0503,-10.48],[52.3703,-10.48],[52.3703,16.12],[47.0503,16.12],[47.0503,-10.48]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[40.5524215,-8.6023708],[45.1313987,-8.6023708],[45.1313987,14.292515199999999],[40.5524215,14.292515199999999],[40.5524215,-8.6023708]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.021139500000004,-9.3157324],[47.8816511,-9.3157324],[47.8816511,14.9868256],[43.021139500000004,14.9868256],[43.021139500000004,-9.3157324]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.196834,-9.0775408],[46.963341199999995,-9.0775408],[46.963341199999995,14.7549952],[42.196834,14.7549952],[42.196834,-9.0775408]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.4268185,-9.1439972],[47.2195533,-9.1439972],[47.2195533,14.8196768],[42.4268185,14.8196768],[42.4268185,-9.1439972]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.383434,-9.1314608],[47.1712212,-9.1314608],[47.1712212,14.807475199999999],[42.383434,14.807475199999999],[42.383434,-9.1314608]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.3801685,-9.1305172],[47.1675833,-9.1305172],[47.1675833,14.8065568],[42.3801685,14.8065568],[42.3801685,-9.1305172]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.389032,-9.133078399999999],[47.1774576,-9.133078399999999],[47.1774576,14.8090496],[42.389032,14.8090496],[42.389032,-9.133078399999999]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.39,-9.13],[47.17,-9.13],[47.17,14.81],[42.39,14.81],[42.39,-9.13]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[27.69,21.64],[53.33,21.64],[53.33,25.92],[27.69,25.92],[27.69,21.64]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[27.6903,21.64],[53.3303,21.64],[53.3303,25.92],[27.6903,25.92],[27.6903,21.64]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[27.6903,21.64],[53.3303,21.64],[53.3303,25.92],[27.6903,25.92],[27.6903,21.64]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.8890759,19.0436344],[45.9576803,19.0436344],[45.9576803,22.7274732],[23.8890759,22.7274732],[23.8890759,19.0436344]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[25.333262700000002,20.0300632],[48.758735900000005,20.0300632],[48.758735900000005,23.9403996],[25.333262700000002,23.9403996],[25.333262700000002,20.0300632]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.851048400000003,19.7006944],[47.8234628,19.7006944],[47.8234628,23.5354032],[24.851048400000003,23.5354032],[24.851048400000003,19.7006944]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.9855881,19.7925896],[48.0844077,19.7925896],[48.0844077,23.6483988],[24.9855881,23.6483988],[24.9855881,19.7925896]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.960208400000003,19.7752544],[48.0351828,19.7752544],[48.0351828,23.6270832],[24.960208400000003,23.6270832],[24.960208400000003,19.7752544]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.9582981,19.773949599999998],[48.0314777,19.773949599999998],[48.0314777,23.6254788],[24.9582981,23.6254788],[24.9582981,19.773949599999998]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.963483200000002,19.7774912],[48.0415344,19.7774912],[48.0415344,23.6298336],[24.963483200000002,23.6298336],[24.963483200000002,19.7774912]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.96,19.78],[48.04,19.78],[48.04,23.63],[24.96,23.63],[24.96,19.78]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[27.69,13.48],[33.01,13.48],[33.01,23.4],[27.69,23.4],[27.69,13.48]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[27.6903,13.48],[33.0103,13.48],[33.0103,23.4],[27.6903,23.4],[27.6903,13.48]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[27.6903,13.48],[33.0103,13.48],[33.0103,23.4],[27.6903,23.4],[27.6903,13.48]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.8890759,12.0202408],[28.468053100000002,12.0202408],[28.468053100000002,20.558484],[23.8890759,20.558484],[23.8890759,12.0202408]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[25.333262700000002,12.5748424],[30.1937743,12.5748424],[30.1937743,21.638052],[25.333262700000002,21.638052],[25.333262700000002,12.5748424]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.851048400000003,12.3896608],[29.617555600000003,12.3896608],[29.617555600000003,21.277584],[24.851048400000003,21.277584],[24.851048400000003,12.3896608]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.9855881,12.4413272],[29.778322900000003,12.4413272],[29.778322900000003,21.378156],[24.9855881,21.378156],[24.9855881,12.4413272]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.960208400000003,12.4315808],[29.747995600000003,12.4315808],[29.747995600000003,21.359184],[24.960208400000003,21.359184],[24.960208400000003,12.4315808]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.9582981,12.4308472],[29.7457129,12.4308472],[29.7457129,21.357756],[24.9582981,21.357756],[24.9582981,12.4308472]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.963483200000002,12.432838400000001],[29.751908800000002,12.432838400000001],[29.751908800000002,21.361632],[24.963483200000002,21.361632],[24.963483200000002,12.432838400000001]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.96,12.43],[29.75,12.43],[29.75,21.36],[24.96,21.36],[24.96,12.43]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[-1.52,-0.8],[-0.88,-1.41],[0,-1.84],[0.91,-1.44],[1.52,-0.83],[1.89,0],[1.52,0.8],[0.91,1.41],[0,1.79],[-0.88,1.41],[-1.52,0.8],[-1.89,0]],"o":[[1.89,0],[1.52,0.8],[0.91,1.41],[0,1.79],[-0.88,1.41],[-1.52,0.8],[-1.89,0],[-1.52,-0.83],[-0.88,-1.44],[0,-1.84],[0.91,-1.41],[1.52,-0.8],[0,0]],"v":[[32.21,-8.12],[37.33,-6.92],[40.93,-3.6],[42.29,1.28],[40.93,6.12],[37.33,9.48],[32.21,10.68],[27.09,9.48],[23.45,6.12],[22.13,1.28],[23.45,-3.6],[27.09,-6.92],[32.21,-8.12]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[-1.5200000000000031,-0.7999999999999998],[-0.8800000000000026,-1.4133400000000003],[0,-1.8400020000000001],[0.9067000000000007,-1.4400000000000004],[1.519999999999996,-0.82667],[1.8933000000000035,0],[1.5199999999999996,0.7999999999999989],[0.9067000000000007,1.4133300000000002],[0,1.7866699999999998],[-0.879999999999999,1.4133300000000002],[-1.5199999999999996,0.7999999999999998],[-1.8932999999999964,0]],"o":[[1.8933000000000035,0],[1.519999999999996,0.7999999999999998],[0.9067000000000007,1.4133300000000002],[0,1.7866699999999998],[-0.8800000000000026,1.4133300000000002],[-1.5200000000000031,0.7999999999999989],[-1.8932999999999964,0],[-1.5199999999999996,-0.82667],[-0.879999999999999,-1.4400000000000004],[0,-1.8400020000000001],[0.9067000000000007,-1.4133400000000003],[1.5199999999999996,-0.7999999999999998],[0,0]],"v":[[32.2103,-8.12],[37.3303,-6.92],[40.9303,-3.6],[42.2903,1.28],[40.9303,6.12],[37.3303,9.48],[32.2103,10.68],[27.0903,9.48],[23.4503,6.12],[22.1303,1.28],[23.4503,-3.6],[27.0903,-6.92],[32.2103,-8.12]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[-1.5200000000000031,-0.7999999999999998],[-0.8800000000000026,-1.4133400000000003],[0,-1.8400020000000001],[0.9067000000000007,-1.4400000000000004],[1.519999999999996,-0.82667],[1.8933000000000035,0],[1.5199999999999996,0.7999999999999989],[0.9067000000000007,1.4133300000000002],[0,1.7866699999999998],[-0.879999999999999,1.4133300000000002],[-1.5199999999999996,0.7999999999999998],[-1.8932999999999964,0]],"o":[[1.8933000000000035,0],[1.519999999999996,0.7999999999999998],[0.9067000000000007,1.4133300000000002],[0,1.7866699999999998],[-0.8800000000000026,1.4133300000000002],[-1.5200000000000031,0.7999999999999989],[-1.8932999999999964,0],[-1.5199999999999996,-0.82667],[-0.879999999999999,-1.4400000000000004],[0,-1.8400020000000001],[0.9067000000000007,-1.4133400000000003],[1.5199999999999996,-0.7999999999999998],[0,0]],"v":[[32.2103,-8.12],[37.3303,-6.92],[40.9303,-3.6],[42.2903,1.28],[40.9303,6.12],[37.3303,9.48],[32.2103,10.68],[27.0903,9.48],[23.4503,6.12],[22.1303,1.28],[23.4503,-3.6],[27.0903,-6.92],[32.2103,-8.12]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[-1.3082792000000016,-0.6885679999999997],[-0.7574248000000012,-1.2164675139999996],[0,-1.5837084],[0.7803639700000031,-1.2394224000000003],[1.3082791999999945,-0.7115189570000021],[1.6296240299999996,0],[1.308279200000003,0.6885679999999988],[0.7803639700000031,1.2164714430000003],[0,1.5378005570000002],[-0.7574247999999977,1.2164714429999999],[-1.308279199999998,0.6885679999999997],[-1.6296240300000022,0]],"o":[[1.6296240299999996,0],[1.3082791999999945,0.6885679999999997],[0.7803639700000031,1.2164714429999999],[0,1.5378005570000002],[-0.7574248000000012,1.2164714430000003],[-1.3082792000000016,0.6885679999999988],[-1.6296240300000022,0],[-1.308279199999998,-0.7115189570000021],[-0.7574247999999977,-1.2394224000000003],[0,-1.5837084],[0.7803639700000031,-1.2164675139999996],[1.308279200000003,-0.6885679999999997],[0,0]],"v":[[27.779485100000002,-6.5710952],[32.186320300000006,-5.5382432],[35.28487629999999,-2.6806859999999997],[36.455441900000004,1.5195788],[35.28487629999999,5.6854152],[32.186320300000006,8.577400800000001],[27.779485100000002,9.610252800000001],[23.3726499,8.577400800000001],[20.239665499999997,5.6854152],[19.1035283,1.5195788],[20.239665499999997,-2.6806859999999997],[23.3726499,-5.5382432],[27.779485100000002,-6.5710952]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[-1.3887176000000023,-0.7309039999999998],[-0.8039944000000017,-1.2912646419999998],[0,-1.6810812],[0.8283624100000022,-1.3156272000000002],[1.3887175999999952,-0.7552679210000013],[1.729801590000001,0],[1.3887176000000017,0.7309039999999989],[0.8283624100000022,1.2912632790000003],[0,1.632352721],[-0.8039943999999981,1.291263279],[-1.3887175999999988,0.7309039999999998],[-1.7298015900000001,0]],"o":[[1.729801590000001,0],[1.3887175999999952,0.7309039999999998],[0.8283624100000022,1.291263279],[0,1.632352721],[-0.8039944000000017,1.2912632790000003],[-1.3887176000000023,0.7309039999999989],[-1.7298015900000001,0],[-1.3887175999999988,-0.7552679210000013],[-0.8039943999999981,-1.3156272000000002],[0,-1.6810812],[0.8283624100000022,-1.2912646419999998],[1.3887176000000017,-0.7309039999999998],[0,0]],"v":[[29.4628703,-7.1595656],[34.140655900000006,-6.0632095999999995],[37.4297239,-3.0299579999999997],[38.6722607,1.4285564],[37.4297239,5.8505256],[34.140655900000006,8.9203224],[29.4628703,10.0166784],[24.7850847,8.9203224],[21.4594715,5.8505256],[20.2534799,1.4285564],[21.4594715,-3.0299579999999997],[24.7850847,-6.0632095999999995],[29.4628703,-7.1595656]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[-1.361859200000002,-0.7167679999999997],[-0.7884448000000015,-1.2662898639999998],[0,-1.6485684],[0.8123357200000025,-1.2901824000000002],[1.361859199999995,-0.7406601320000016],[1.6963522800000006,0],[1.3618592000000023,0.7167679999999989],[0.8123357200000025,1.2662902680000003],[0,1.6007817320000002],[-0.788444799999998,1.266290268],[-1.3618591999999985,0.7167679999999997],[-1.6963522800000008,0]],"o":[[1.6963522800000006,0],[1.361859199999995,0.7167679999999997],[0.8123357200000025,1.266290268],[0,1.6007817320000002],[-0.7884448000000015,1.2662902680000003],[-1.361859200000002,0.7167679999999989],[-1.6963522800000008,0],[-1.3618591999999985,-0.7406601320000016],[-0.788444799999998,-1.2901824000000002],[0,-1.6485684],[0.8123357200000025,-1.2662898639999998],[1.3618592000000023,-0.7167679999999997],[0,0]],"v":[[28.9007876,-6.9630752000000005],[33.48810280000001,-5.8879231999999995],[36.7135588,-2.913336],[37.9320644,1.4589488],[36.7135588,5.7953952],[33.48810280000001,8.805820800000001],[28.9007876,9.8809728],[24.3134724,8.805820800000001],[21.052177999999998,5.7953952],[19.8695108,1.4589488],[21.052177999999998,-2.913336],[24.3134724,-5.8879231999999995],[28.9007876,-6.9630752000000005]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[-1.3693528000000021,-0.7207119999999998],[-0.7927832000000016,-1.2732579259999999],[0,-1.6576396],[0.8168072300000024,-1.2972816000000003],[1.369352799999995,-0.7447357630000015],[1.7056847700000006,0],[1.3693528000000021,0.7207119999999989],[0.8168072300000024,1.2732578370000003],[0,1.609590163],[-0.792783199999998,1.273257837],[-1.3693527999999986,0.7207119999999998],[-1.7056847700000006,0]],"o":[[1.7056847700000006,0],[1.369352799999995,0.7207119999999998],[0.8168072300000024,1.273257837],[0,1.609590163],[-0.7927832000000016,1.2732578370000003],[-1.3693528000000021,0.7207119999999989],[-1.7056847700000006,0],[-1.3693527999999986,-0.7447357630000015],[-0.792783199999998,-1.2972816000000003],[0,-1.6576396],[0.8168072300000024,-1.2732579259999999],[1.3693528000000021,-0.7207119999999998],[0,0]],"v":[[29.0576109,-7.0178968],[33.6701677,-5.9368288],[36.9133717,-2.945874],[38.1385821,1.4504692],[36.9133717,5.8107768],[33.6701677,8.8377672],[29.0576109,9.9188352],[24.4450541,8.8377672],[21.1658145,5.8107768],[19.9766397,1.4504692],[21.1658145,-2.945874],[24.4450541,-5.9368288],[29.0576109,-7.0178968]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[-1.3679392000000021,-0.7199679999999997],[-0.7919648000000016,-1.2719434639999998],[0,-1.6559284],[0.8159637200000025,-1.2959424000000004],[1.367939199999995,-0.7439669320000015],[1.7039242800000007,0],[1.3679392000000021,0.7199679999999988],[0.8159637200000025,1.2719434680000004],[0,1.607928532],[-0.791964799999998,1.271943468],[-1.3679391999999986,0.7199679999999997],[-1.7039242800000007,0]],"o":[[1.7039242800000007,0],[1.367939199999995,0.7199679999999997],[0.8159637200000025,1.271943468],[0,1.607928532],[-0.7919648000000016,1.2719434680000004],[-1.3679392000000021,0.7199679999999988],[-1.7039242800000007,0],[-1.3679391999999986,-0.7439669320000015],[-0.791964799999998,-1.2959424000000004],[0,-1.6559284],[0.8159637200000025,-1.2719434639999998],[1.3679392000000021,-0.7199679999999997],[0,0]],"v":[[29.028027599999998,-7.0075552000000005],[33.63582280000001,-5.9276032],[36.875678799999996,-2.939736],[38.0996244,1.4520688],[36.875678799999996,5.8078752],[33.63582280000001,8.8317408],[29.028027599999998,9.9116928],[24.4202324,8.8317408],[21.144378,5.8078752],[19.9564308,1.4520688],[21.144378,-2.939736],[24.4202324,-5.9276032],[29.028027599999998,-7.0075552000000005]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[-1.3678328000000022,-0.7199119999999998],[-0.7919032000000016,-1.2718445259999998],[0,-1.6557996],[0.8159002300000024,-1.2958416000000001],[1.367832799999995,-0.7439090630000016],[1.7037917700000005,0],[1.3678328000000022,0.7199119999999989],[0.8159002300000024,1.2718445370000002],[0,1.607803463],[-0.791903199999998,1.271844537],[-1.3678327999999986,0.7199119999999998],[-1.7037917700000007,0]],"o":[[1.7037917700000005,0],[1.367832799999995,0.7199119999999998],[0.8159002300000024,1.271844537],[0,1.607803463],[-0.7919032000000016,1.2718445370000002],[-1.3678328000000022,0.7199119999999989],[-1.7037917700000007,0],[-1.3678327999999986,-0.7439090630000016],[-0.791903199999998,-1.2958416000000001],[0,-1.6557996],[0.8159002300000024,-1.2718445259999998],[1.3678328000000022,-0.7199119999999998],[0,0]],"v":[[29.0258009,-7.0067768],[33.6332377,-5.9269088],[36.872841699999995,-2.9392739999999997],[38.0966921,1.4521892],[36.872841699999995,5.8076568],[33.6332377,8.8312872],[29.0258009,9.911155200000001],[24.418364099999998,8.8312872],[21.1427645,5.8076568],[19.9549097,1.4521892],[21.1427645,-2.9392739999999997],[24.418364099999998,-5.9269088],[29.0258009,-7.0067768]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[-1.368121600000002,-0.7200639999999998],[-0.7920704000000016,-1.2721130719999998],[0,-1.6561492],[0.8160725600000025,-1.2961152000000002],[1.368121599999995,-0.7440661360000016],[1.7041514400000006,0],[1.368121600000002,0.7200639999999989],[0.8160725600000025,1.2721130640000002],[0,1.6081429360000001],[-0.7920703999999981,1.272113064],[-1.3681215999999985,0.7200639999999998],[-1.7041514400000006,0]],"o":[[1.7041514400000006,0],[1.368121599999995,0.7200639999999998],[0.8160725600000025,1.272113064],[0,1.6081429360000001],[-0.7920704000000016,1.2721130640000002],[-1.368121600000002,0.7200639999999989],[-1.7041514400000006,0],[-1.3681215999999985,-0.7440661360000016],[-0.7920703999999981,-1.2961152000000002],[0,-1.6561492],[0.8160725600000025,-1.2721130719999998],[1.368121600000002,-0.7200639999999998],[0,0]],"v":[[29.0318448,-7.0088896],[33.6402544,-5.9287936],[36.880542399999996,-2.940528],[38.1046512,1.4518624],[36.880542399999996,5.8082496],[33.6402544,8.832518400000001],[29.0318448,9.9126144],[24.4234352,8.832518400000001],[21.147143999999997,5.8082496],[19.9590384,1.4518624],[21.147143999999997,-2.940528],[24.4234352,-5.9287936],[29.0318448,-7.0088896]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[-1.37,-0.72],[-0.79,-1.27],[0,-1.66],[0.82,-1.3],[1.37,-0.74],[1.7,0],[1.37,0.72],[0.82,1.27],[0,1.61],[-0.79,1.27],[-1.37,0.72],[-1.7,0]],"o":[[1.7,0],[1.37,0.72],[0.82,1.27],[0,1.61],[-0.79,1.27],[-1.37,0.72],[-1.7,0],[-1.37,-0.74],[-0.79,-1.3],[0,-1.66],[0.82,-1.27],[1.37,-0.72],[0,0]],"v":[[29.03,-7.01],[33.64,-5.93],[36.88,-2.94],[38.1,1.45],[36.88,5.81],[33.64,8.83],[29.03,9.91],[24.42,8.83],[21.15,5.81],[19.96,1.45],[21.15,-2.94],[24.42,-5.93],[29.03,-7.01]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0.75,-0.4],[0.43,-0.72],[0,-1.04],[-0.43,-0.72],[-0.75,-0.4],[-0.91,0],[-0.75,0.37],[-0.43,0.69],[0,0.99],[0.43,0.69],[0.75,0.37],[0.91,0]],"o":[[-0.91,0],[-0.75,0.37],[-0.43,0.69],[0,0.99],[0.43,0.69],[0.75,0.37],[0.91,0],[0.75,-0.4],[0.43,-0.72],[0,-1.04],[-0.43,-0.72],[-0.75,-0.4],[0,0]],"v":[[32.21,-3.56],[29.73,-2.96],[27.97,-1.32],[27.33,1.28],[27.97,3.84],[29.73,5.48],[32.21,6.04],[34.69,5.48],[36.45,3.84],[37.09,1.28],[36.45,-1.32],[34.69,-2.96],[32.21,-3.56]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0.7467000000000006,-0.3999999999999999],[0.42669999999999675,-0.72],[0,-1.040001],[-0.4267000000000003,-0.7199999999999998],[-0.7467000000000006,-0.40000000000000036],[-0.9066999999999972,0],[-0.746699999999997,0.3733299999999993],[-0.42669999999999675,0.6933300000000004],[0,0.9866599999999999],[0.42670000000000385,0.6933320000000001],[0.746699999999997,0.37333000000000016],[0.9067000000000007,0]],"o":[[-0.9066999999999972,0],[-0.7467000000000006,0.37333000000000016],[-0.4267000000000003,0.6933320000000001],[0,0.9866599999999999],[0.42669999999999675,0.6933300000000004],[0.7467000000000006,0.3733299999999993],[0.9067000000000007,0],[0.746699999999997,-0.40000000000000036],[0.42670000000000385,-0.7199999999999998],[0,-1.040001],[-0.42669999999999675,-0.72],[-0.746699999999997,-0.3999999999999999],[0,0]],"v":[[32.2103,-3.56],[29.7303,-2.96],[27.9703,-1.32],[27.3303,1.28],[27.9703,3.84],[29.7303,5.48],[32.2103,6.04],[34.6903,5.48],[36.4503,3.84],[37.0903,1.28],[36.4503,-1.32],[34.6903,-2.96],[32.2103,-3.56]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0.7467000000000006,-0.3999999999999999],[0.42669999999999675,-0.72],[0,-1.040001],[-0.4267000000000003,-0.7199999999999998],[-0.7467000000000006,-0.40000000000000036],[-0.9066999999999972,0],[-0.746699999999997,0.3733299999999993],[-0.42669999999999675,0.6933300000000004],[0,0.9866599999999999],[0.42670000000000385,0.6933320000000001],[0.746699999999997,0.37333000000000016],[0.9067000000000007,0]],"o":[[-0.9066999999999972,0],[-0.7467000000000006,0.37333000000000016],[-0.4267000000000003,0.6933320000000001],[0,0.9866599999999999],[0.42669999999999675,0.6933300000000004],[0.7467000000000006,0.3733299999999993],[0.9067000000000007,0],[0.746699999999997,-0.40000000000000036],[0.42670000000000385,-0.7199999999999998],[0,-1.040001],[-0.42669999999999675,-0.72],[-0.746699999999997,-0.3999999999999999],[0,0]],"v":[[32.2103,-3.56],[29.7303,-2.96],[27.9703,-1.32],[27.3303,1.28],[27.9703,3.84],[29.7303,5.48],[32.2103,6.04],[34.6903,5.48],[36.4503,3.84],[37.0903,1.28],[36.4503,-1.32],[34.6903,-2.96],[32.2103,-3.56]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0.6426503700000006,-0.3442840000000005],[0.36722317000000176,-0.6197098071],[0,-0.8951393999999999],[-0.3672231700000004,-0.6197111999999997],[-0.6426503700000006,-0.3442840000000003],[-0.7803639699999996,0],[-0.642650369999997,0.3213330429999995],[-0.36722317000000176,0.596760243],[0,0.8492364859999999],[0.36722316999999893,0.5967594572000001],[0.642650370000002,0.32133304299999976],[0.7803639700000031,0]],"o":[[-0.7803639699999996,0],[-0.6426503700000006,0.32133304299999976],[-0.3672231700000004,0.5967594572000001],[0,0.8492364859999999],[0.36722317000000176,0.596760243],[0.6426503700000006,0.3213330429999995],[0.7803639700000031,0],[0.642650370000002,-0.3442840000000003],[0.36722316999999893,-0.6197111999999997],[0,-0.8951393999999999],[-0.36722317000000176,-0.6197098071],[-0.642650369999997,-0.3442840000000005],[0,0]],"v":[[27.779485100000002,-2.6462575999999998],[25.6449243,-2.1298315999999997],[24.1300747,-0.7182685929],[23.5792203,1.5195788],[24.1300747,3.7229963999999995],[25.6449243,5.1345608],[27.779485100000002,5.6165584],[29.914045899999998,5.1345608],[31.428895500000003,3.7229963999999995],[31.9797499,1.5195788],[31.428895500000003,-0.7182685929],[29.914045899999998,-2.1298315999999997],[27.779485100000002,-2.6462575999999998]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0.6821816100000005,-0.3654520000000003],[0.38982000999999983,-0.6578127363],[0,-0.9501762],[-0.3898200100000003,-0.6578135999999997],[-0.6821816100000005,-0.36545200000000033],[-0.8283624099999987,0],[-0.682181609999997,0.3410880789999994],[-0.38982000999999983,0.6334496790000002],[0,0.9014473579999999],[0.3898200100000008,0.6334499516000001],[0.6821816100000001,0.3410880789999999],[0.8283624100000022,0]],"o":[[-0.8283624099999987,0],[-0.6821816100000005,0.3410880789999999],[-0.3898200100000003,0.6334499516000001],[0,0.9014473579999999],[0.38982000999999983,0.6334496790000002],[0.6821816100000005,0.3410880789999994],[0.8283624100000022,0],[0.6821816100000001,-0.36545200000000033],[0.3898200100000008,-0.6578135999999997],[0,-0.9501762],[-0.38982000999999983,-0.6578127363],[-0.682181609999997,-0.3654520000000003],[0,0]],"v":[[29.4628703,-2.9934127999999998],[27.1970679,-2.4452347999999997],[25.5890791,-0.9468824637],[25.0043559,1.4285564],[25.5890791,3.7674491999999997],[27.1970679,5.2658024],[29.4628703,5.777435199999999],[31.728672699999997,5.2658024],[33.3366615,3.7674491999999997],[33.921384700000004,1.4285564],[33.3366615,-0.9468824637],[31.728672699999997,-2.4452347999999997],[29.4628703,-2.9934127999999998]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0.6689821200000006,-0.3583840000000003],[0.3822749200000005,-0.6450901596],[0,-0.9317993999999999],[-0.38227492000000035,-0.6450911999999996],[-0.6689821200000006,-0.3583840000000003],[-0.812335719999999,0],[-0.668982119999997,0.3344918679999994],[-0.3822749200000005,0.6211990680000001],[0,0.8840141359999999],[0.3822749200000002,0.6211989872000001],[0.6689821200000008,0.33449186799999986],[0.8123357200000025,0]],"o":[[-0.812335719999999,0],[-0.6689821200000006,0.33449186799999986],[-0.38227492000000035,0.6211989872000001],[0,0.8840141359999999],[0.3822749200000005,0.6211990680000001],[0.6689821200000006,0.3344918679999994],[0.8123357200000025,0],[0.6689821200000008,-0.3583840000000003],[0.3822749200000002,-0.6450911999999996],[0,-0.9317993999999999],[-0.3822749200000005,-0.6450901596],[-0.668982119999997,-0.3583840000000003],[0,0]],"v":[[28.9007876,-2.8774976],[26.6788068,-2.3399216],[25.1019172,-0.8705482404],[24.5285028,1.4589488],[25.1019172,3.7526064],[26.6788068,5.2219808],[28.9007876,5.7237184],[31.122768399999998,5.2219808],[32.699658,3.7526064],[33.273072400000004,1.4589488],[32.699658,-0.8705482404],[31.122768399999998,-2.3399216],[28.9007876,-2.8774976]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0.6726648300000007,-0.36035600000000034],[0.3843800300000003,-0.6486398089],[0,-0.9369265999999999],[-0.3843800300000003,-0.6486407999999997],[-0.6726648300000007,-0.36035600000000034],[-0.8168072299999989,0],[-0.6726648299999971,0.3363322369999994],[-0.3843800300000003,0.6246170370000002],[0,0.888878074],[0.38438003000000037,0.6246170548000001],[0.6726648300000005,0.33633223699999987],[0.8168072300000024,0]],"o":[[-0.8168072299999989,0],[-0.6726648300000007,0.33633223699999987],[-0.3843800300000003,0.6246170548000001],[0,0.888878074],[0.3843800300000003,0.6246170370000002],[0.6726648300000007,0.3363322369999994],[0.8168072300000024,0],[0.6726648300000005,-0.36035600000000034],[0.38438003000000037,-0.6486407999999997],[0,-0.9369265999999999],[-0.3843800300000003,-0.6486398089],[-0.6726648299999971,-0.36035600000000034],[0,0]],"v":[[29.0576109,-2.9098384],[26.8234037,-2.3693044],[25.2378373,-0.8918457911000001],[24.6612677,1.4504692],[25.2378373,3.7567475999999997],[26.8234037,5.2342072],[29.0576109,5.738705599999999],[31.2918181,5.2342072],[32.877384500000005,3.7567475999999997],[33.453954100000004,1.4504692],[32.877384500000005,-0.8918457911000001],[31.2918181,-2.3693044],[29.0576109,-2.9098384]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0.6719701200000006,-0.3599840000000003],[0.38398292000000034,-0.6479701996],[0,-0.9359594],[-0.38398292000000034,-0.6479711999999997],[-0.6719701200000006,-0.3599840000000003],[-0.815963719999999,0],[-0.671970119999997,0.3359850679999994],[-0.38398292000000034,0.6239722680000002],[0,0.8879605359999999],[0.38398292000000034,0.6239722672000001],[0.6719701200000006,0.33598506799999983],[0.8159637200000025,0]],"o":[[-0.815963719999999,0],[-0.6719701200000006,0.33598506799999983],[-0.38398292000000034,0.6239722672000001],[0,0.8879605359999999],[0.38398292000000034,0.6239722680000002],[0.6719701200000006,0.3359850679999994],[0.8159637200000025,0],[0.6719701200000006,-0.3599840000000003],[0.38398292000000034,-0.6479711999999997],[0,-0.9359594],[-0.38398292000000034,-0.6479701996],[-0.671970119999997,-0.3599840000000003],[0,0]],"v":[[29.028027599999998,-2.9037376],[26.7961268,-2.3637616],[25.2121972,-0.8878282004],[24.6362228,1.4520688],[25.2121972,3.7559663999999997],[26.7961268,5.2319008],[29.028027599999998,5.7358784],[31.2599284,5.2319008],[32.843858000000004,3.7559663999999997],[33.419832400000004,1.4520688],[32.843858000000004,-0.8878282004],[31.2599284,-2.3637616],[29.028027599999998,-2.9037376]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0.6719178300000006,-0.35995600000000033],[0.38395303000000036,-0.6479197989],[0,-0.9358865999999999],[-0.38395303000000036,-0.6479207999999996],[-0.6719178300000006,-0.35995600000000033],[-0.8159002299999989,0],[-0.671917829999997,0.3359589369999994],[-0.38395303000000036,0.6239237370000001],[0,0.8878914739999999],[0.38395303000000036,0.6239237348000001],[0.6719178300000006,0.33595893699999985],[0.8159002300000024,0]],"o":[[-0.8159002299999989,0],[-0.6719178300000006,0.33595893699999985],[-0.38395303000000036,0.6239237348000001],[0,0.8878914739999999],[0.38395303000000036,0.6239237370000001],[0.6719178300000006,0.3359589369999994],[0.8159002300000024,0],[0.6719178300000006,-0.35995600000000033],[0.38395303000000036,-0.6479207999999996],[0,-0.9358865999999999],[-0.38395303000000036,-0.6479197989],[-0.671917829999997,-0.35995600000000033],[0,0]],"v":[[29.0258009,-2.9032783999999996],[26.7940737,-2.3633444],[25.210267299999998,-0.8875258011],[24.6343377,1.4521892],[25.210267299999998,3.7559075999999996],[26.7940737,5.2317272],[29.0258009,5.7356656],[31.2575281,5.2317272],[32.8413345,3.7559075999999996],[33.417264100000004,1.4521892],[32.8413345,-0.8875258011],[31.2575281,-2.3633444],[29.0258009,-2.9032783999999996]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0.6720597600000006,-0.3600320000000003],[0.38403416000000035,-0.6480566007999999],[0,-0.9360842],[-0.38403416000000035,-0.6480575999999997],[-0.6720597600000006,-0.36003200000000035],[-0.816072559999999,0],[-0.672059759999997,0.3360298639999994],[-0.38403416000000035,0.6240554640000001],[0,0.8880789279999999],[0.38403416000000035,0.6240554656000001],[0.6720597600000006,0.33602986399999984],[0.8160725600000025,0]],"o":[[-0.816072559999999,0],[-0.6720597600000006,0.33602986399999984],[-0.38403416000000035,0.6240554656000001],[0,0.8880789279999999],[0.38403416000000035,0.6240554640000001],[0.6720597600000006,0.3360298639999994],[0.8160725600000025,0],[0.6720597600000006,-0.36003200000000035],[0.38403416000000035,-0.6480575999999997],[0,-0.9360842],[-0.38403416000000035,-0.6480566007999999],[-0.672059759999997,-0.3600320000000003],[0,0]],"v":[[29.0318448,-2.9045248],[26.7996464,-2.3644768],[25.2155056,-0.8883465992],[24.639454399999998,1.4518624],[25.2155056,3.7560672],[26.7996464,5.232198400000001],[29.0318448,5.7362432],[31.2640432,5.232198400000001],[32.848184,3.7560672],[33.424235200000005,1.4518624],[32.848184,-0.8883465992],[31.2640432,-2.3644768],[29.0318448,-2.9045248]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0.67,-0.36],[0.38,-0.65],[0,-0.94],[-0.38,-0.65],[-0.67,-0.36],[-0.82,0],[-0.67,0.34],[-0.38,0.62],[0,0.89],[0.38,0.62],[0.67,0.34],[0.82,0]],"o":[[-0.82,0],[-0.67,0.34],[-0.38,0.62],[0,0.89],[0.38,0.62],[0.67,0.34],[0.82,0],[0.67,-0.36],[0.38,-0.65],[0,-0.94],[-0.38,-0.65],[-0.67,-0.36],[0,0]],"v":[[29.03,-2.9],[26.8,-2.36],[25.21,-0.89],[24.64,1.45],[25.21,3.76],[26.8,5.23],[29.03,5.74],[31.26,5.23],[32.85,3.76],[33.42,1.45],[32.85,-0.89],[31.26,-2.36],[29.03,-2.9]]}],"t":107}]}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0,0,0]},"r":1,"o":{"a":0,"k":100}}],"ind":4},{"ty":4,"nm":"개발자 키우기","sr":1,"st":0,"op":107.55,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[76.5,32]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[169.5,179]},"r":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[18.95],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[18.95],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[-7.44],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[2.59],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[-0.76],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[0.17],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[-0.01],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[-0.02],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[0.02],"t":106.4929928779602},{"s":[0],"t":107}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[28.28,-10.52],[33.32,-10.52],[33.32,26.52],[28.28,26.52],[28.28,-10.52]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.56,3.44],[29.72,3.44],[29.72,7.72],[23.56,7.72],[23.56,3.44]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0.45,-2.35],[1.01,-2.11],[1.73,-1.81],[2.59,-1.52],[0,0],[-1.65,1.97],[-0.72,2.4],[0,2.96],[0,0]],"o":[[0,0],[0,2.61],[-0.43,2.35],[-1.01,2.08],[-1.71,1.79],[0,0],[2.8,-1.65],[1.68,-2],[0.72,-2.43],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0.4532999999999987,-2.346669],[1.0132999999999992,-2.1066700000000003],[1.7332999999999998,-1.8133],[2.58667,-1.5199999999999996],[0,0],[-1.6533299999999995,1.9733],[-0.7199999999999989,2.3999999999999995],[0,2.96],[0,0]],"o":[[0,0],[0,2.61333],[-0.4267000000000003,2.34667],[-1.013300000000001,2.08],[-1.706669999999999,1.7866999999999997],[0,0],[2.8,-1.6532999999999998],[1.6799999999999997,-2.000000000000001],[0.7200000000000006,-2.4266680000000003],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0.4532999999999987,-2.346669],[1.0132999999999992,-2.1066700000000003],[1.7332999999999998,-1.8133],[2.58667,-1.5199999999999996],[0,0],[-1.6533299999999995,1.9733],[-0.7199999999999989,2.3999999999999995],[0,2.96],[0,0]],"o":[[0,0],[0,2.61333],[-0.4267000000000003,2.34667],[-1.013300000000001,2.08],[-1.706669999999999,1.7866999999999997],[0,0],[2.8,-1.6532999999999998],[1.6799999999999997,-2.000000000000001],[0.7200000000000006,-2.4266680000000003],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0.4532999999999987,-2.346669],[1.0132999999999992,-2.1066700000000003],[1.7332999999999998,-1.8133],[2.58667,-1.5199999999999996],[0,0],[-1.6533299999999995,1.9733],[-0.7199999999999989,2.3999999999999995],[0,2.96],[0,0]],"o":[[0,0],[0,2.61333],[-0.4267000000000003,2.34667],[-1.013300000000001,2.08],[-1.706669999999999,1.7866999999999997],[0,0],[2.8,-1.6532999999999998],[1.6799999999999997,-2.000000000000001],[0.7200000000000006,-2.4266680000000003],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0.4532999999999987,-2.346669],[1.0132999999999992,-2.1066700000000003],[1.7332999999999998,-1.8133],[2.58667,-1.5199999999999996],[0,0],[-1.6533299999999995,1.9733],[-0.7199999999999989,2.3999999999999995],[0,2.96],[0,0]],"o":[[0,0],[0,2.61333],[-0.4267000000000003,2.34667],[-1.013300000000001,2.08],[-1.706669999999999,1.7866999999999997],[0,0],[2.8,-1.6532999999999998],[1.6799999999999997,-2.000000000000001],[0.7200000000000006,-2.4266680000000003],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0.4532999999999987,-2.346669],[1.0132999999999992,-2.1066700000000003],[1.7332999999999998,-1.8133],[2.58667,-1.5199999999999996],[0,0],[-1.6533299999999995,1.9733],[-0.7199999999999989,2.3999999999999995],[0,2.96],[0,0]],"o":[[0,0],[0,2.61333],[-0.4267000000000003,2.34667],[-1.013300000000001,2.08],[-1.706669999999999,1.7866999999999997],[0,0],[2.8,-1.6532999999999998],[1.6799999999999997,-2.000000000000001],[0.7200000000000006,-2.4266680000000003],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0.4532999999999987,-2.346669],[1.0132999999999992,-2.1066700000000003],[1.7332999999999998,-1.8133],[2.58667,-1.5199999999999996],[0,0],[-1.6533299999999995,1.9733],[-0.7199999999999989,2.3999999999999995],[0,2.96],[0,0]],"o":[[0,0],[0,2.61333],[-0.4267000000000003,2.34667],[-1.013300000000001,2.08],[-1.706669999999999,1.7866999999999997],[0,0],[2.8,-1.6532999999999998],[1.6799999999999997,-2.000000000000001],[0.7200000000000006,-2.4266680000000003],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0.4532999999999987,-2.346669],[1.0132999999999992,-2.1066700000000003],[1.7332999999999998,-1.8133],[2.58667,-1.5199999999999996],[0,0],[-1.6533299999999995,1.9733],[-0.7199999999999989,2.3999999999999995],[0,2.96],[0,0]],"o":[[0,0],[0,2.61333],[-0.4267000000000003,2.34667],[-1.013300000000001,2.08],[-1.706669999999999,1.7866999999999997],[0,0],[2.8,-1.6532999999999998],[1.6799999999999997,-2.000000000000001],[0.7200000000000006,-2.4266680000000003],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0.4532999999999987,-2.346669],[1.0132999999999992,-2.1066700000000003],[1.7332999999999998,-1.8133],[2.58667,-1.5199999999999996],[0,0],[-1.6533299999999995,1.9733],[-0.7199999999999989,2.3999999999999995],[0,2.96],[0,0]],"o":[[0,0],[0,2.61333],[-0.4267000000000003,2.34667],[-1.013300000000001,2.08],[-1.706669999999999,1.7866999999999997],[0,0],[2.8,-1.6532999999999998],[1.6799999999999997,-2.000000000000001],[0.7200000000000006,-2.4266680000000003],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0.4532999999999987,-2.346669],[1.0132999999999992,-2.1066700000000003],[1.7332999999999998,-1.8133],[2.58667,-1.5199999999999996],[0,0],[-1.6533299999999995,1.9733],[-0.7199999999999989,2.3999999999999995],[0,2.96],[0,0]],"o":[[0,0],[0,2.61333],[-0.4267000000000003,2.34667],[-1.013300000000001,2.08],[-1.706669999999999,1.7866999999999997],[0,0],[2.8,-1.6532999999999998],[1.6799999999999997,-2.000000000000001],[0.7200000000000006,-2.4266680000000003],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0.45,-2.35],[1.01,-2.11],[1.73,-1.81],[2.59,-1.52],[0,0],[-1.65,1.97],[-0.72,2.4],[0,2.96],[0,0]],"o":[[0,0],[0,2.61],[-0.43,2.35],[-1.01,2.08],[-1.71,1.79],[0,0],[2.8,-1.65],[1.68,-2],[0.72,-2.43],[0,0],[0,0]],"v":[[12.52,-5.96],[17.64,-5.96],[16.96,1.48],[14.8,8.16],[10.68,14],[4.24,18.96],[1.16,15.24],[7.84,9.8],[11.44,3.2],[12.52,-4.88],[12.52,-5.96]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3,-5.96],[14.08,-5.96],[14.08,-1.72],[3,-1.72],[3,-5.96]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.04,-9.56],[25.04,-9.56],[25.04,24.92],[20.04,24.92],[20.04,-9.56]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.88,-8.88],[45.16,-8.88],[45.16,-4.48],[52.44,-4.48],[52.44,-8.88],[57.68,-8.88],[57.68,7.32],[39.88,7.32],[39.88,-8.88]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.8769,-8.88],[45.1569,-8.88],[45.1569,-4.48],[52.4369,-4.48],[52.4369,-8.88],[57.6769,-8.88],[57.6769,7.32],[39.8769,7.32],[39.8769,-8.88]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.8769,-8.88],[45.1569,-8.88],[45.1569,-4.48],[52.4369,-4.48],[52.4369,-8.88],[57.6769,-8.88],[57.6769,7.32],[39.8769,7.32],[39.8769,-8.88]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.8769,-8.88],[45.1569,-8.88],[45.1569,-4.48],[52.4369,-4.48],[52.4369,-8.88],[57.6769,-8.88],[57.6769,7.32],[39.8769,7.32],[39.8769,-8.88]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.8769,-8.88],[45.1569,-8.88],[45.1569,-4.48],[52.4369,-4.48],[52.4369,-8.88],[57.6769,-8.88],[57.6769,7.32],[39.8769,7.32],[39.8769,-8.88]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.8769,-8.88],[45.1569,-8.88],[45.1569,-4.48],[52.4369,-4.48],[52.4369,-8.88],[57.6769,-8.88],[57.6769,7.32],[39.8769,7.32],[39.8769,-8.88]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.8769,-8.88],[45.1569,-8.88],[45.1569,-4.48],[52.4369,-4.48],[52.4369,-8.88],[57.6769,-8.88],[57.6769,7.32],[39.8769,7.32],[39.8769,-8.88]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.8769,-8.88],[45.1569,-8.88],[45.1569,-4.48],[52.4369,-4.48],[52.4369,-8.88],[57.6769,-8.88],[57.6769,7.32],[39.8769,7.32],[39.8769,-8.88]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.8769,-8.88],[45.1569,-8.88],[45.1569,-4.48],[52.4369,-4.48],[52.4369,-8.88],[57.6769,-8.88],[57.6769,7.32],[39.8769,7.32],[39.8769,-8.88]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.8769,-8.88],[45.1569,-8.88],[45.1569,-4.48],[52.4369,-4.48],[52.4369,-8.88],[57.6769,-8.88],[57.6769,7.32],[39.8769,7.32],[39.8769,-8.88]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.88,-8.88],[45.16,-8.88],[45.16,-4.48],[52.44,-4.48],[52.44,-8.88],[57.68,-8.88],[57.68,7.32],[39.88,7.32],[39.88,-8.88]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.16,-0.52],[45.16,3.2],[52.44,3.2],[52.44,-0.52],[45.16,-0.52]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.1569,-0.52],[45.1569,3.2],[52.4369,3.2],[52.4369,-0.52],[45.1569,-0.52]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.1569,-0.52],[45.1569,3.2],[52.4369,3.2],[52.4369,-0.52],[45.1569,-0.52]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.1569,-0.52],[45.1569,3.2],[52.4369,3.2],[52.4369,-0.52],[45.1569,-0.52]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.1569,-0.52],[45.1569,3.2],[52.4369,3.2],[52.4369,-0.52],[45.1569,-0.52]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.1569,-0.52],[45.1569,3.2],[52.4369,3.2],[52.4369,-0.52],[45.1569,-0.52]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.1569,-0.52],[45.1569,3.2],[52.4369,3.2],[52.4369,-0.52],[45.1569,-0.52]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.1569,-0.52],[45.1569,3.2],[52.4369,3.2],[52.4369,-0.52],[45.1569,-0.52]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.1569,-0.52],[45.1569,3.2],[52.4369,3.2],[52.4369,-0.52],[45.1569,-0.52]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.1569,-0.52],[45.1569,3.2],[52.4369,3.2],[52.4369,-0.52],[45.1569,-0.52]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.16,-0.52],[45.16,3.2],[52.44,3.2],[52.44,-0.52],[45.16,-0.52]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.64,-10.48],[67.96,-10.48],[67.96,8.32],[62.64,8.32],[62.64,-10.48]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.6369,-10.48],[67.9569,-10.48],[67.9569,8.32],[62.6369,8.32],[62.6369,-10.48]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.6369,-10.48],[67.9569,-10.48],[67.9569,8.32],[62.6369,8.32],[62.6369,-10.48]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.6369,-10.48],[67.9569,-10.48],[67.9569,8.32],[62.6369,8.32],[62.6369,-10.48]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.6369,-10.48],[67.9569,-10.48],[67.9569,8.32],[62.6369,8.32],[62.6369,-10.48]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.6369,-10.48],[67.9569,-10.48],[67.9569,8.32],[62.6369,8.32],[62.6369,-10.48]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.6369,-10.48],[67.9569,-10.48],[67.9569,8.32],[62.6369,8.32],[62.6369,-10.48]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.6369,-10.48],[67.9569,-10.48],[67.9569,8.32],[62.6369,8.32],[62.6369,-10.48]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.6369,-10.48],[67.9569,-10.48],[67.9569,8.32],[62.6369,8.32],[62.6369,-10.48]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.6369,-10.48],[67.9569,-10.48],[67.9569,8.32],[62.6369,8.32],[62.6369,-10.48]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.64,-10.48],[67.96,-10.48],[67.96,8.32],[62.64,8.32],[62.64,-10.48]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.84,-3.4],[72.84,-3.4],[72.84,0.96],[65.84,0.96],[65.84,-3.4]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.8369,-3.4],[72.8369,-3.4],[72.8369,0.96],[65.8369,0.96],[65.8369,-3.4]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.8369,-3.4],[72.8369,-3.4],[72.8369,0.96],[65.8369,0.96],[65.8369,-3.4]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.8369,-3.4],[72.8369,-3.4],[72.8369,0.96],[65.8369,0.96],[65.8369,-3.4]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.8369,-3.4],[72.8369,-3.4],[72.8369,0.96],[65.8369,0.96],[65.8369,-3.4]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.8369,-3.4],[72.8369,-3.4],[72.8369,0.96],[65.8369,0.96],[65.8369,-3.4]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.8369,-3.4],[72.8369,-3.4],[72.8369,0.96],[65.8369,0.96],[65.8369,-3.4]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.8369,-3.4],[72.8369,-3.4],[72.8369,0.96],[65.8369,0.96],[65.8369,-3.4]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.8369,-3.4],[72.8369,-3.4],[72.8369,0.96],[65.8369,0.96],[65.8369,-3.4]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.8369,-3.4],[72.8369,-3.4],[72.8369,0.96],[65.8369,0.96],[65.8369,-3.4]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.84,-3.4],[72.84,-3.4],[72.84,0.96],[65.84,0.96],[65.84,-3.4]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.52,9.72],[67.96,9.72],[67.96,19.84],[48.84,19.84],[48.84,24.2],[43.56,24.2],[43.56,16.04],[62.72,16.04],[62.72,13.8],[43.52,13.8],[43.52,9.72]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5169,9.72],[67.9569,9.72],[67.9569,19.84],[48.8369,19.84],[48.8369,24.2],[43.5569,24.2],[43.5569,16.04],[62.7169,16.04],[62.7169,13.8],[43.5169,13.8],[43.5169,9.72]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5169,9.72],[67.9569,9.72],[67.9569,19.84],[48.8369,19.84],[48.8369,24.2],[43.5569,24.2],[43.5569,16.04],[62.7169,16.04],[62.7169,13.8],[43.5169,13.8],[43.5169,9.72]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5169,9.72],[67.9569,9.72],[67.9569,19.84],[48.8369,19.84],[48.8369,24.2],[43.5569,24.2],[43.5569,16.04],[62.7169,16.04],[62.7169,13.8],[43.5169,13.8],[43.5169,9.72]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5169,9.72],[67.9569,9.72],[67.9569,19.84],[48.8369,19.84],[48.8369,24.2],[43.5569,24.2],[43.5569,16.04],[62.7169,16.04],[62.7169,13.8],[43.5169,13.8],[43.5169,9.72]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5169,9.72],[67.9569,9.72],[67.9569,19.84],[48.8369,19.84],[48.8369,24.2],[43.5569,24.2],[43.5569,16.04],[62.7169,16.04],[62.7169,13.8],[43.5169,13.8],[43.5169,9.72]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5169,9.72],[67.9569,9.72],[67.9569,19.84],[48.8369,19.84],[48.8369,24.2],[43.5569,24.2],[43.5569,16.04],[62.7169,16.04],[62.7169,13.8],[43.5169,13.8],[43.5169,9.72]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5169,9.72],[67.9569,9.72],[67.9569,19.84],[48.8369,19.84],[48.8369,24.2],[43.5569,24.2],[43.5569,16.04],[62.7169,16.04],[62.7169,13.8],[43.5169,13.8],[43.5169,9.72]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5169,9.72],[67.9569,9.72],[67.9569,19.84],[48.8369,19.84],[48.8369,24.2],[43.5569,24.2],[43.5569,16.04],[62.7169,16.04],[62.7169,13.8],[43.5169,13.8],[43.5169,9.72]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5169,9.72],[67.9569,9.72],[67.9569,19.84],[48.8369,19.84],[48.8369,24.2],[43.5569,24.2],[43.5569,16.04],[62.7169,16.04],[62.7169,13.8],[43.5169,13.8],[43.5169,9.72]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.52,9.72],[67.96,9.72],[67.96,19.84],[48.84,19.84],[48.84,24.2],[43.56,24.2],[43.56,16.04],[62.72,16.04],[62.72,13.8],[43.52,13.8],[43.52,9.72]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.56,22.16],[69.04,22.16],[69.04,26.32],[43.56,26.32],[43.56,22.16]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5569,22.16],[69.0369,22.16],[69.0369,26.32],[43.5569,26.32],[43.5569,22.16]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5569,22.16],[69.0369,22.16],[69.0369,26.32],[43.5569,26.32],[43.5569,22.16]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5569,22.16],[69.0369,22.16],[69.0369,26.32],[43.5569,26.32],[43.5569,22.16]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5569,22.16],[69.0369,22.16],[69.0369,26.32],[43.5569,26.32],[43.5569,22.16]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5569,22.16],[69.0369,22.16],[69.0369,26.32],[43.5569,26.32],[43.5569,22.16]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5569,22.16],[69.0369,22.16],[69.0369,26.32],[43.5569,26.32],[43.5569,22.16]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5569,22.16],[69.0369,22.16],[69.0369,26.32],[43.5569,26.32],[43.5569,22.16]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5569,22.16],[69.0369,22.16],[69.0369,26.32],[43.5569,26.32],[43.5569,22.16]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.5569,22.16],[69.0369,22.16],[69.0369,26.32],[43.5569,26.32],[43.5569,22.16]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.56,22.16],[69.04,22.16],[69.04,26.32],[43.56,26.32],[43.56,22.16]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.45,-2.05],[0.85,-1.81],[1.31,-1.41],[1.71,-0.8],[0,0],[-1.12,1.17],[-0.75,1.44],[-0.37,1.55],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05],[-0.43,2.05],[-0.85,1.79],[-1.28,1.41],[0,0],[1.55,-0.72],[1.15,-1.17],[0.77,-1.44],[0.37,-1.57],[0,0],[0,0]],"v":[[84.31,-4.64],[88.51,-4.64],[88.51,-0.48],[87.83,5.68],[85.91,11.48],[82.67,16.28],[78.19,19.6],[75.19,15.4],[79.19,12.56],[82.03,8.64],[83.75,4.16],[84.31,-0.48],[84.31,-4.64]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.4532999999999987,-2.0533399999999995],[0.8533000000000044,-1.8133300000000006],[1.306600000000003,-1.4133000000000013],[1.7066000000000088,-0.8000000000000007],[0,0],[-1.1199999999999903,1.1732999999999993],[-0.7467000000000041,1.4399999999999995],[-0.37340000000000373,1.5466699999999998],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05333],[-0.42669999999999675,2.05333],[-0.8533999999999935,1.7866999999999997],[-1.2800000000000011,1.4132999999999996],[0,0],[1.546599999999998,-0.7200000000000006],[1.1466000000000065,-1.1733000000000011],[0.7733000000000061,-1.4400000000000004],[0.3733000000000004,-1.5733300000000003],[0,0],[0,0]],"v":[[84.3138,-4.64],[88.5138,-4.64],[88.5138,-0.48],[87.8338,5.68],[85.9138,11.48],[82.6738,16.28],[78.1938,19.6],[75.1938,15.4],[79.1938,12.56],[82.0338,8.64],[83.7538,4.16],[84.3138,-0.48],[84.3138,-4.64]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.4532999999999987,-2.0533399999999995],[0.8533000000000044,-1.8133300000000006],[1.306600000000003,-1.4133000000000013],[1.7066000000000088,-0.8000000000000007],[0,0],[-1.1199999999999903,1.1732999999999993],[-0.7467000000000041,1.4399999999999995],[-0.37340000000000373,1.5466699999999998],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05333],[-0.42669999999999675,2.05333],[-0.8533999999999935,1.7866999999999997],[-1.2800000000000011,1.4132999999999996],[0,0],[1.546599999999998,-0.7200000000000006],[1.1466000000000065,-1.1733000000000011],[0.7733000000000061,-1.4400000000000004],[0.3733000000000004,-1.5733300000000003],[0,0],[0,0]],"v":[[84.3138,-4.64],[88.5138,-4.64],[88.5138,-0.48],[87.8338,5.68],[85.9138,11.48],[82.6738,16.28],[78.1938,19.6],[75.1938,15.4],[79.1938,12.56],[82.0338,8.64],[83.7538,4.16],[84.3138,-0.48],[84.3138,-4.64]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.4532999999999987,-2.0533399999999995],[0.8533000000000044,-1.8133300000000006],[1.306600000000003,-1.4133000000000013],[1.7066000000000088,-0.8000000000000007],[0,0],[-1.1199999999999903,1.1732999999999993],[-0.7467000000000041,1.4399999999999995],[-0.37340000000000373,1.5466699999999998],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05333],[-0.42669999999999675,2.05333],[-0.8533999999999935,1.7866999999999997],[-1.2800000000000011,1.4132999999999996],[0,0],[1.546599999999998,-0.7200000000000006],[1.1466000000000065,-1.1733000000000011],[0.7733000000000061,-1.4400000000000004],[0.3733000000000004,-1.5733300000000003],[0,0],[0,0]],"v":[[84.3138,-4.64],[88.5138,-4.64],[88.5138,-0.48],[87.8338,5.68],[85.9138,11.48],[82.6738,16.28],[78.1938,19.6],[75.1938,15.4],[79.1938,12.56],[82.0338,8.64],[83.7538,4.16],[84.3138,-0.48],[84.3138,-4.64]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.4532999999999987,-2.0533399999999995],[0.8533000000000044,-1.8133300000000006],[1.306600000000003,-1.4133000000000013],[1.7066000000000088,-0.8000000000000007],[0,0],[-1.1199999999999903,1.1732999999999993],[-0.7467000000000041,1.4399999999999995],[-0.37340000000000373,1.5466699999999998],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05333],[-0.42669999999999675,2.05333],[-0.8533999999999935,1.7866999999999997],[-1.2800000000000011,1.4132999999999996],[0,0],[1.546599999999998,-0.7200000000000006],[1.1466000000000065,-1.1733000000000011],[0.7733000000000061,-1.4400000000000004],[0.3733000000000004,-1.5733300000000003],[0,0],[0,0]],"v":[[84.3138,-4.64],[88.5138,-4.64],[88.5138,-0.48],[87.8338,5.68],[85.9138,11.48],[82.6738,16.28],[78.1938,19.6],[75.1938,15.4],[79.1938,12.56],[82.0338,8.64],[83.7538,4.16],[84.3138,-0.48],[84.3138,-4.64]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.4532999999999987,-2.0533399999999995],[0.8533000000000044,-1.8133300000000006],[1.306600000000003,-1.4133000000000013],[1.7066000000000088,-0.8000000000000007],[0,0],[-1.1199999999999903,1.1732999999999993],[-0.7467000000000041,1.4399999999999995],[-0.37340000000000373,1.5466699999999998],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05333],[-0.42669999999999675,2.05333],[-0.8533999999999935,1.7866999999999997],[-1.2800000000000011,1.4132999999999996],[0,0],[1.546599999999998,-0.7200000000000006],[1.1466000000000065,-1.1733000000000011],[0.7733000000000061,-1.4400000000000004],[0.3733000000000004,-1.5733300000000003],[0,0],[0,0]],"v":[[84.3138,-4.64],[88.5138,-4.64],[88.5138,-0.48],[87.8338,5.68],[85.9138,11.48],[82.6738,16.28],[78.1938,19.6],[75.1938,15.4],[79.1938,12.56],[82.0338,8.64],[83.7538,4.16],[84.3138,-0.48],[84.3138,-4.64]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.4532999999999987,-2.0533399999999995],[0.8533000000000044,-1.8133300000000006],[1.306600000000003,-1.4133000000000013],[1.7066000000000088,-0.8000000000000007],[0,0],[-1.1199999999999903,1.1732999999999993],[-0.7467000000000041,1.4399999999999995],[-0.37340000000000373,1.5466699999999998],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05333],[-0.42669999999999675,2.05333],[-0.8533999999999935,1.7866999999999997],[-1.2800000000000011,1.4132999999999996],[0,0],[1.546599999999998,-0.7200000000000006],[1.1466000000000065,-1.1733000000000011],[0.7733000000000061,-1.4400000000000004],[0.3733000000000004,-1.5733300000000003],[0,0],[0,0]],"v":[[84.3138,-4.64],[88.5138,-4.64],[88.5138,-0.48],[87.8338,5.68],[85.9138,11.48],[82.6738,16.28],[78.1938,19.6],[75.1938,15.4],[79.1938,12.56],[82.0338,8.64],[83.7538,4.16],[84.3138,-0.48],[84.3138,-4.64]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.4532999999999987,-2.0533399999999995],[0.8533000000000044,-1.8133300000000006],[1.306600000000003,-1.4133000000000013],[1.7066000000000088,-0.8000000000000007],[0,0],[-1.1199999999999903,1.1732999999999993],[-0.7467000000000041,1.4399999999999995],[-0.37340000000000373,1.5466699999999998],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05333],[-0.42669999999999675,2.05333],[-0.8533999999999935,1.7866999999999997],[-1.2800000000000011,1.4132999999999996],[0,0],[1.546599999999998,-0.7200000000000006],[1.1466000000000065,-1.1733000000000011],[0.7733000000000061,-1.4400000000000004],[0.3733000000000004,-1.5733300000000003],[0,0],[0,0]],"v":[[84.3138,-4.64],[88.5138,-4.64],[88.5138,-0.48],[87.8338,5.68],[85.9138,11.48],[82.6738,16.28],[78.1938,19.6],[75.1938,15.4],[79.1938,12.56],[82.0338,8.64],[83.7538,4.16],[84.3138,-0.48],[84.3138,-4.64]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.4532999999999987,-2.0533399999999995],[0.8533000000000044,-1.8133300000000006],[1.306600000000003,-1.4133000000000013],[1.7066000000000088,-0.8000000000000007],[0,0],[-1.1199999999999903,1.1732999999999993],[-0.7467000000000041,1.4399999999999995],[-0.37340000000000373,1.5466699999999998],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05333],[-0.42669999999999675,2.05333],[-0.8533999999999935,1.7866999999999997],[-1.2800000000000011,1.4132999999999996],[0,0],[1.546599999999998,-0.7200000000000006],[1.1466000000000065,-1.1733000000000011],[0.7733000000000061,-1.4400000000000004],[0.3733000000000004,-1.5733300000000003],[0,0],[0,0]],"v":[[84.3138,-4.64],[88.5138,-4.64],[88.5138,-0.48],[87.8338,5.68],[85.9138,11.48],[82.6738,16.28],[78.1938,19.6],[75.1938,15.4],[79.1938,12.56],[82.0338,8.64],[83.7538,4.16],[84.3138,-0.48],[84.3138,-4.64]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.4532999999999987,-2.0533399999999995],[0.8533000000000044,-1.8133300000000006],[1.306600000000003,-1.4133000000000013],[1.7066000000000088,-0.8000000000000007],[0,0],[-1.1199999999999903,1.1732999999999993],[-0.7467000000000041,1.4399999999999995],[-0.37340000000000373,1.5466699999999998],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05333],[-0.42669999999999675,2.05333],[-0.8533999999999935,1.7866999999999997],[-1.2800000000000011,1.4132999999999996],[0,0],[1.546599999999998,-0.7200000000000006],[1.1466000000000065,-1.1733000000000011],[0.7733000000000061,-1.4400000000000004],[0.3733000000000004,-1.5733300000000003],[0,0],[0,0]],"v":[[84.3138,-4.64],[88.5138,-4.64],[88.5138,-0.48],[87.8338,5.68],[85.9138,11.48],[82.6738,16.28],[78.1938,19.6],[75.1938,15.4],[79.1938,12.56],[82.0338,8.64],[83.7538,4.16],[84.3138,-0.48],[84.3138,-4.64]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0.45,-2.05],[0.85,-1.81],[1.31,-1.41],[1.71,-0.8],[0,0],[-1.12,1.17],[-0.75,1.44],[-0.37,1.55],[0,1.52],[0,0]],"o":[[0,0],[0,0],[0,2.05],[-0.43,2.05],[-0.85,1.79],[-1.28,1.41],[0,0],[1.55,-0.72],[1.15,-1.17],[0.77,-1.44],[0.37,-1.57],[0,0],[0,0]],"v":[[84.31,-4.64],[88.51,-4.64],[88.51,-0.48],[87.83,5.68],[85.91,11.48],[82.67,16.28],[78.19,19.6],[75.19,15.4],[79.19,12.56],[82.03,8.64],[83.75,4.16],[84.31,-0.48],[84.31,-4.64]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.37,-1.47],[-0.72,-1.36],[-1.12,-1.12],[-1.52,-0.69],[0,0],[1.28,1.33],[0.88,1.71],[0.43,1.92],[0,1.97],[0,0]],"o":[[0,0],[0,0],[0,1.39],[0.37,1.47],[0.75,1.36],[1.15,1.09],[0,0],[-1.71,-0.8],[-1.25,-1.36],[-0.85,-1.73],[-0.43,-1.95],[0,0],[0,0]],"v":[[85.43,-4.64],[89.63,-4.64],[89.63,-0.48],[90.19,3.8],[91.83,8.04],[94.63,11.76],[98.63,14.44],[95.67,18.68],[91.19,15.48],[87.99,10.88],[86.07,5.4],[85.43,-0.48],[85.43,-4.64]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.3733999999999895,-1.4666699999999997],[-0.7199999999999989,-1.3599999999999994],[-1.1199999999999903,-1.1199999999999992],[-1.519999999999996,-0.6932999999999989],[0,0],[1.2800000000000011,1.3333000000000013],[0.8800000000000097,1.7066999999999997],[0.42659999999999343,1.92],[0,1.97333],[0,0]],"o":[[0,0],[0,0],[0,1.386666],[0.3733000000000004,1.4666700000000006],[0.7466000000000008,1.3600000000000012],[1.1466000000000065,1.093300000000001],[0,0],[-1.7066999999999979,-0.8000000000000007],[-1.2533999999999992,-1.3600000000000012],[-0.8533999999999935,-1.7333300000000005],[-0.42670000000001096,-1.9466700000000006],[0,0],[0,0]],"v":[[85.4338,-4.64],[89.6338,-4.64],[89.6338,-0.48],[90.1938,3.8],[91.8338,8.04],[94.6338,11.76],[98.6338,14.44],[95.6738,18.68],[91.1938,15.48],[87.9938,10.88],[86.0738,5.4],[85.4338,-0.48],[85.4338,-4.64]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.3733999999999895,-1.4666699999999997],[-0.7199999999999989,-1.3599999999999994],[-1.1199999999999903,-1.1199999999999992],[-1.519999999999996,-0.6932999999999989],[0,0],[1.2800000000000011,1.3333000000000013],[0.8800000000000097,1.7066999999999997],[0.42659999999999343,1.92],[0,1.97333],[0,0]],"o":[[0,0],[0,0],[0,1.386666],[0.3733000000000004,1.4666700000000006],[0.7466000000000008,1.3600000000000012],[1.1466000000000065,1.093300000000001],[0,0],[-1.7066999999999979,-0.8000000000000007],[-1.2533999999999992,-1.3600000000000012],[-0.8533999999999935,-1.7333300000000005],[-0.42670000000001096,-1.9466700000000006],[0,0],[0,0]],"v":[[85.4338,-4.64],[89.6338,-4.64],[89.6338,-0.48],[90.1938,3.8],[91.8338,8.04],[94.6338,11.76],[98.6338,14.44],[95.6738,18.68],[91.1938,15.48],[87.9938,10.88],[86.0738,5.4],[85.4338,-0.48],[85.4338,-4.64]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.3733999999999895,-1.4666699999999997],[-0.7199999999999989,-1.3599999999999994],[-1.1199999999999903,-1.1199999999999992],[-1.519999999999996,-0.6932999999999989],[0,0],[1.2800000000000011,1.3333000000000013],[0.8800000000000097,1.7066999999999997],[0.42659999999999343,1.92],[0,1.97333],[0,0]],"o":[[0,0],[0,0],[0,1.386666],[0.3733000000000004,1.4666700000000006],[0.7466000000000008,1.3600000000000012],[1.1466000000000065,1.093300000000001],[0,0],[-1.7066999999999979,-0.8000000000000007],[-1.2533999999999992,-1.3600000000000012],[-0.8533999999999935,-1.7333300000000005],[-0.42670000000001096,-1.9466700000000006],[0,0],[0,0]],"v":[[85.4338,-4.64],[89.6338,-4.64],[89.6338,-0.48],[90.1938,3.8],[91.8338,8.04],[94.6338,11.76],[98.6338,14.44],[95.6738,18.68],[91.1938,15.48],[87.9938,10.88],[86.0738,5.4],[85.4338,-0.48],[85.4338,-4.64]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.3733999999999895,-1.4666699999999997],[-0.7199999999999989,-1.3599999999999994],[-1.1199999999999903,-1.1199999999999992],[-1.519999999999996,-0.6932999999999989],[0,0],[1.2800000000000011,1.3333000000000013],[0.8800000000000097,1.7066999999999997],[0.42659999999999343,1.92],[0,1.97333],[0,0]],"o":[[0,0],[0,0],[0,1.386666],[0.3733000000000004,1.4666700000000006],[0.7466000000000008,1.3600000000000012],[1.1466000000000065,1.093300000000001],[0,0],[-1.7066999999999979,-0.8000000000000007],[-1.2533999999999992,-1.3600000000000012],[-0.8533999999999935,-1.7333300000000005],[-0.42670000000001096,-1.9466700000000006],[0,0],[0,0]],"v":[[85.4338,-4.64],[89.6338,-4.64],[89.6338,-0.48],[90.1938,3.8],[91.8338,8.04],[94.6338,11.76],[98.6338,14.44],[95.6738,18.68],[91.1938,15.48],[87.9938,10.88],[86.0738,5.4],[85.4338,-0.48],[85.4338,-4.64]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.3733999999999895,-1.4666699999999997],[-0.7199999999999989,-1.3599999999999994],[-1.1199999999999903,-1.1199999999999992],[-1.519999999999996,-0.6932999999999989],[0,0],[1.2800000000000011,1.3333000000000013],[0.8800000000000097,1.7066999999999997],[0.42659999999999343,1.92],[0,1.97333],[0,0]],"o":[[0,0],[0,0],[0,1.386666],[0.3733000000000004,1.4666700000000006],[0.7466000000000008,1.3600000000000012],[1.1466000000000065,1.093300000000001],[0,0],[-1.7066999999999979,-0.8000000000000007],[-1.2533999999999992,-1.3600000000000012],[-0.8533999999999935,-1.7333300000000005],[-0.42670000000001096,-1.9466700000000006],[0,0],[0,0]],"v":[[85.4338,-4.64],[89.6338,-4.64],[89.6338,-0.48],[90.1938,3.8],[91.8338,8.04],[94.6338,11.76],[98.6338,14.44],[95.6738,18.68],[91.1938,15.48],[87.9938,10.88],[86.0738,5.4],[85.4338,-0.48],[85.4338,-4.64]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.3733999999999895,-1.4666699999999997],[-0.7199999999999989,-1.3599999999999994],[-1.1199999999999903,-1.1199999999999992],[-1.519999999999996,-0.6932999999999989],[0,0],[1.2800000000000011,1.3333000000000013],[0.8800000000000097,1.7066999999999997],[0.42659999999999343,1.92],[0,1.97333],[0,0]],"o":[[0,0],[0,0],[0,1.386666],[0.3733000000000004,1.4666700000000006],[0.7466000000000008,1.3600000000000012],[1.1466000000000065,1.093300000000001],[0,0],[-1.7066999999999979,-0.8000000000000007],[-1.2533999999999992,-1.3600000000000012],[-0.8533999999999935,-1.7333300000000005],[-0.42670000000001096,-1.9466700000000006],[0,0],[0,0]],"v":[[85.4338,-4.64],[89.6338,-4.64],[89.6338,-0.48],[90.1938,3.8],[91.8338,8.04],[94.6338,11.76],[98.6338,14.44],[95.6738,18.68],[91.1938,15.48],[87.9938,10.88],[86.0738,5.4],[85.4338,-0.48],[85.4338,-4.64]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.3733999999999895,-1.4666699999999997],[-0.7199999999999989,-1.3599999999999994],[-1.1199999999999903,-1.1199999999999992],[-1.519999999999996,-0.6932999999999989],[0,0],[1.2800000000000011,1.3333000000000013],[0.8800000000000097,1.7066999999999997],[0.42659999999999343,1.92],[0,1.97333],[0,0]],"o":[[0,0],[0,0],[0,1.386666],[0.3733000000000004,1.4666700000000006],[0.7466000000000008,1.3600000000000012],[1.1466000000000065,1.093300000000001],[0,0],[-1.7066999999999979,-0.8000000000000007],[-1.2533999999999992,-1.3600000000000012],[-0.8533999999999935,-1.7333300000000005],[-0.42670000000001096,-1.9466700000000006],[0,0],[0,0]],"v":[[85.4338,-4.64],[89.6338,-4.64],[89.6338,-0.48],[90.1938,3.8],[91.8338,8.04],[94.6338,11.76],[98.6338,14.44],[95.6738,18.68],[91.1938,15.48],[87.9938,10.88],[86.0738,5.4],[85.4338,-0.48],[85.4338,-4.64]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.3733999999999895,-1.4666699999999997],[-0.7199999999999989,-1.3599999999999994],[-1.1199999999999903,-1.1199999999999992],[-1.519999999999996,-0.6932999999999989],[0,0],[1.2800000000000011,1.3333000000000013],[0.8800000000000097,1.7066999999999997],[0.42659999999999343,1.92],[0,1.97333],[0,0]],"o":[[0,0],[0,0],[0,1.386666],[0.3733000000000004,1.4666700000000006],[0.7466000000000008,1.3600000000000012],[1.1466000000000065,1.093300000000001],[0,0],[-1.7066999999999979,-0.8000000000000007],[-1.2533999999999992,-1.3600000000000012],[-0.8533999999999935,-1.7333300000000005],[-0.42670000000001096,-1.9466700000000006],[0,0],[0,0]],"v":[[85.4338,-4.64],[89.6338,-4.64],[89.6338,-0.48],[90.1938,3.8],[91.8338,8.04],[94.6338,11.76],[98.6338,14.44],[95.6738,18.68],[91.1938,15.48],[87.9938,10.88],[86.0738,5.4],[85.4338,-0.48],[85.4338,-4.64]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.3733999999999895,-1.4666699999999997],[-0.7199999999999989,-1.3599999999999994],[-1.1199999999999903,-1.1199999999999992],[-1.519999999999996,-0.6932999999999989],[0,0],[1.2800000000000011,1.3333000000000013],[0.8800000000000097,1.7066999999999997],[0.42659999999999343,1.92],[0,1.97333],[0,0]],"o":[[0,0],[0,0],[0,1.386666],[0.3733000000000004,1.4666700000000006],[0.7466000000000008,1.3600000000000012],[1.1466000000000065,1.093300000000001],[0,0],[-1.7066999999999979,-0.8000000000000007],[-1.2533999999999992,-1.3600000000000012],[-0.8533999999999935,-1.7333300000000005],[-0.42670000000001096,-1.9466700000000006],[0,0],[0,0]],"v":[[85.4338,-4.64],[89.6338,-4.64],[89.6338,-0.48],[90.1938,3.8],[91.8338,8.04],[94.6338,11.76],[98.6338,14.44],[95.6738,18.68],[91.1938,15.48],[87.9938,10.88],[86.0738,5.4],[85.4338,-0.48],[85.4338,-4.64]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[-0.37,-1.47],[-0.72,-1.36],[-1.12,-1.12],[-1.52,-0.69],[0,0],[1.28,1.33],[0.88,1.71],[0.43,1.92],[0,1.97],[0,0]],"o":[[0,0],[0,0],[0,1.39],[0.37,1.47],[0.75,1.36],[1.15,1.09],[0,0],[-1.71,-0.8],[-1.25,-1.36],[-0.85,-1.73],[-0.43,-1.95],[0,0],[0,0]],"v":[[85.43,-4.64],[89.63,-4.64],[89.63,-0.48],[90.19,3.8],[91.83,8.04],[94.63,11.76],[98.63,14.44],[95.67,18.68],[91.19,15.48],[87.99,10.88],[86.07,5.4],[85.43,-0.48],[85.43,-4.64]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.63,-6.96],[96.99,-6.96],[96.99,-2.56],[76.63,-2.56],[76.63,-6.96]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.6338,-6.96],[96.9938,-6.96],[96.9938,-2.56],[76.6338,-2.56],[76.6338,-6.96]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.6338,-6.96],[96.9938,-6.96],[96.9938,-2.56],[76.6338,-2.56],[76.6338,-6.96]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.6338,-6.96],[96.9938,-6.96],[96.9938,-2.56],[76.6338,-2.56],[76.6338,-6.96]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.6338,-6.96],[96.9938,-6.96],[96.9938,-2.56],[76.6338,-2.56],[76.6338,-6.96]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.6338,-6.96],[96.9938,-6.96],[96.9938,-2.56],[76.6338,-2.56],[76.6338,-6.96]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.6338,-6.96],[96.9938,-6.96],[96.9938,-2.56],[76.6338,-2.56],[76.6338,-6.96]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.6338,-6.96],[96.9938,-6.96],[96.9938,-2.56],[76.6338,-2.56],[76.6338,-6.96]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.6338,-6.96],[96.9938,-6.96],[96.9938,-2.56],[76.6338,-2.56],[76.6338,-6.96]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.6338,-6.96],[96.9938,-6.96],[96.9938,-2.56],[76.6338,-2.56],[76.6338,-6.96]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.63,-6.96],[96.99,-6.96],[96.99,-2.56],[76.63,-2.56],[76.63,-6.96]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.67,-10.48],[105.03,-10.48],[105.03,26.56],[99.67,26.56],[99.67,-10.48]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.6738,-10.48],[105.034,-10.48],[105.034,26.56],[99.6738,26.56],[99.6738,-10.48]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.6738,-10.48],[105.034,-10.48],[105.034,26.56],[99.6738,26.56],[99.6738,-10.48]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.6738,-10.48],[105.034,-10.48],[105.034,26.56],[99.6738,26.56],[99.6738,-10.48]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.6738,-10.48],[105.034,-10.48],[105.034,26.56],[99.6738,26.56],[99.6738,-10.48]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.6738,-10.48],[105.034,-10.48],[105.034,26.56],[99.6738,26.56],[99.6738,-10.48]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.6738,-10.48],[105.034,-10.48],[105.034,26.56],[99.6738,26.56],[99.6738,-10.48]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.6738,-10.48],[105.034,-10.48],[105.034,26.56],[99.6738,26.56],[99.6738,-10.48]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.6738,-10.48],[105.034,-10.48],[105.034,26.56],[99.6738,26.56],[99.6738,-10.48]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.6738,-10.48],[105.034,-10.48],[105.034,26.56],[99.6738,26.56],[99.6738,-10.48]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[99.67,-10.48],[105.03,-10.48],[105.03,26.56],[99.67,26.56],[99.67,-10.48]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.87,3.64],[110.39,3.64],[110.39,8],[103.87,8],[103.87,3.64]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.874,3.64],[110.394,3.64],[110.394,8],[103.874,8],[103.874,3.64]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.874,3.64],[110.394,3.64],[110.394,8],[103.874,8],[103.874,3.64]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.874,3.64],[110.394,3.64],[110.394,8],[103.874,8],[103.874,3.64]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.874,3.64],[110.394,3.64],[110.394,8],[103.874,8],[103.874,3.64]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.874,3.64],[110.394,3.64],[110.394,8],[103.874,8],[103.874,3.64]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.874,3.64],[110.394,3.64],[110.394,8],[103.874,8],[103.874,3.64]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.874,3.64],[110.394,3.64],[110.394,8],[103.874,8],[103.874,3.64]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.874,3.64],[110.394,3.64],[110.394,8],[103.874,8],[103.874,3.64]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.874,3.64],[110.394,3.64],[110.394,8],[103.874,8],[103.874,3.64]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[103.87,3.64],[110.39,3.64],[110.39,8],[103.87,8],[103.87,3.64]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0.48,-2.64],[1.23,-2.37],[2.21,-2.05],[3.49,-1.73],[0,0],[-1.89,1.63],[-1.09,1.89],[-0.45,2.21],[0,2.61],[0,0]],"o":[[0,0],[0,2.85],[-0.48,2.61],[-1.23,2.37],[-2.21,2.05],[0,0],[2.85,-1.41],[1.89,-1.63],[1.09,-1.89],[0.48,-2.21],[0,0],[0,0]],"v":[[55.15,41.04],[60.31,41.04],[59.59,49.28],[57.03,56.76],[51.87,63.4],[43.31,69.08],[40.51,64.96],[47.63,60.4],[52.11,55.12],[54.43,48.96],[55.15,41.72],[55.15,41.04]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0.480000000000004,-2.6400000000000006],[1.226700000000001,-2.3733000000000004],[2.213300000000004,-2.0533],[3.493400000000001,-1.7332999999999998],[0,0],[-1.8932999999999964,1.6266999999999996],[-1.0932999999999993,1.8933000000000035],[-0.4532999999999987,2.2132999999999967],[0,2.6133000000000024],[0,0]],"o":[[0,0],[0,2.8533000000000044],[-0.4799999999999969,2.6133000000000024],[-1.2265999999999977,2.3733000000000004],[-2.2134,2.0533],[0,0],[2.8534000000000006,-1.4132999999999925],[1.8933999999999997,-1.6266999999999996],[1.0934000000000026,-1.8932999999999964],[0.480000000000004,-2.213300000000004],[0,0],[0,0]],"v":[[55.1512,41.04],[60.3112,41.04],[59.5913,49.28],[57.0312,56.76],[51.8713,63.4],[43.3112,69.08],[40.5112,64.96],[47.6312,60.4],[52.1112,55.12],[54.4312,48.96],[55.1512,41.72],[55.1512,41.04]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0.480000000000004,-2.6400000000000006],[1.226700000000001,-2.3733000000000004],[2.213300000000004,-2.0533],[3.493400000000001,-1.7332999999999998],[0,0],[-1.8932999999999964,1.6266999999999996],[-1.0932999999999993,1.8933000000000035],[-0.4532999999999987,2.2132999999999967],[0,2.6133000000000024],[0,0]],"o":[[0,0],[0,2.8533000000000044],[-0.4799999999999969,2.6133000000000024],[-1.2265999999999977,2.3733000000000004],[-2.2134,2.0533],[0,0],[2.8534000000000006,-1.4132999999999925],[1.8933999999999997,-1.6266999999999996],[1.0934000000000026,-1.8932999999999964],[0.480000000000004,-2.213300000000004],[0,0],[0,0]],"v":[[55.1512,41.04],[60.3112,41.04],[59.5913,49.28],[57.0312,56.76],[51.8713,63.4],[43.3112,69.08],[40.5112,64.96],[47.6312,60.4],[52.1112,55.12],[54.4312,48.96],[55.1512,41.72],[55.1512,41.04]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0.480000000000004,-2.6400000000000006],[1.226700000000001,-2.3733000000000004],[2.213300000000004,-2.0533],[3.493400000000001,-1.7332999999999998],[0,0],[-1.8932999999999964,1.6266999999999996],[-1.0932999999999993,1.8933000000000035],[-0.4532999999999987,2.2132999999999967],[0,2.6133000000000024],[0,0]],"o":[[0,0],[0,2.8533000000000044],[-0.4799999999999969,2.6133000000000024],[-1.2265999999999977,2.3733000000000004],[-2.2134,2.0533],[0,0],[2.8534000000000006,-1.4132999999999925],[1.8933999999999997,-1.6266999999999996],[1.0934000000000026,-1.8932999999999964],[0.480000000000004,-2.213300000000004],[0,0],[0,0]],"v":[[55.1512,41.04],[60.3112,41.04],[59.5913,49.28],[57.0312,56.76],[51.8713,63.4],[43.3112,69.08],[40.5112,64.96],[47.6312,60.4],[52.1112,55.12],[54.4312,48.96],[55.1512,41.72],[55.1512,41.04]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0.480000000000004,-2.6400000000000006],[1.226700000000001,-2.3733000000000004],[2.213300000000004,-2.0533],[3.493400000000001,-1.7332999999999998],[0,0],[-1.8932999999999964,1.6266999999999996],[-1.0932999999999993,1.8933000000000035],[-0.4532999999999987,2.2132999999999967],[0,2.6133000000000024],[0,0]],"o":[[0,0],[0,2.8533000000000044],[-0.4799999999999969,2.6133000000000024],[-1.2265999999999977,2.3733000000000004],[-2.2134,2.0533],[0,0],[2.8534000000000006,-1.4132999999999925],[1.8933999999999997,-1.6266999999999996],[1.0934000000000026,-1.8932999999999964],[0.480000000000004,-2.213300000000004],[0,0],[0,0]],"v":[[55.1512,41.04],[60.3112,41.04],[59.5913,49.28],[57.0312,56.76],[51.8713,63.4],[43.3112,69.08],[40.5112,64.96],[47.6312,60.4],[52.1112,55.12],[54.4312,48.96],[55.1512,41.72],[55.1512,41.04]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0.480000000000004,-2.6400000000000006],[1.226700000000001,-2.3733000000000004],[2.213300000000004,-2.0533],[3.493400000000001,-1.7332999999999998],[0,0],[-1.8932999999999964,1.6266999999999996],[-1.0932999999999993,1.8933000000000035],[-0.4532999999999987,2.2132999999999967],[0,2.6133000000000024],[0,0]],"o":[[0,0],[0,2.8533000000000044],[-0.4799999999999969,2.6133000000000024],[-1.2265999999999977,2.3733000000000004],[-2.2134,2.0533],[0,0],[2.8534000000000006,-1.4132999999999925],[1.8933999999999997,-1.6266999999999996],[1.0934000000000026,-1.8932999999999964],[0.480000000000004,-2.213300000000004],[0,0],[0,0]],"v":[[55.1512,41.04],[60.3112,41.04],[59.5913,49.28],[57.0312,56.76],[51.8713,63.4],[43.3112,69.08],[40.5112,64.96],[47.6312,60.4],[52.1112,55.12],[54.4312,48.96],[55.1512,41.72],[55.1512,41.04]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0.480000000000004,-2.6400000000000006],[1.226700000000001,-2.3733000000000004],[2.213300000000004,-2.0533],[3.493400000000001,-1.7332999999999998],[0,0],[-1.8932999999999964,1.6266999999999996],[-1.0932999999999993,1.8933000000000035],[-0.4532999999999987,2.2132999999999967],[0,2.6133000000000024],[0,0]],"o":[[0,0],[0,2.8533000000000044],[-0.4799999999999969,2.6133000000000024],[-1.2265999999999977,2.3733000000000004],[-2.2134,2.0533],[0,0],[2.8534000000000006,-1.4132999999999925],[1.8933999999999997,-1.6266999999999996],[1.0934000000000026,-1.8932999999999964],[0.480000000000004,-2.213300000000004],[0,0],[0,0]],"v":[[55.1512,41.04],[60.3112,41.04],[59.5913,49.28],[57.0312,56.76],[51.8713,63.4],[43.3112,69.08],[40.5112,64.96],[47.6312,60.4],[52.1112,55.12],[54.4312,48.96],[55.1512,41.72],[55.1512,41.04]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0.480000000000004,-2.6400000000000006],[1.226700000000001,-2.3733000000000004],[2.213300000000004,-2.0533],[3.493400000000001,-1.7332999999999998],[0,0],[-1.8932999999999964,1.6266999999999996],[-1.0932999999999993,1.8933000000000035],[-0.4532999999999987,2.2132999999999967],[0,2.6133000000000024],[0,0]],"o":[[0,0],[0,2.8533000000000044],[-0.4799999999999969,2.6133000000000024],[-1.2265999999999977,2.3733000000000004],[-2.2134,2.0533],[0,0],[2.8534000000000006,-1.4132999999999925],[1.8933999999999997,-1.6266999999999996],[1.0934000000000026,-1.8932999999999964],[0.480000000000004,-2.213300000000004],[0,0],[0,0]],"v":[[55.1512,41.04],[60.3112,41.04],[59.5913,49.28],[57.0312,56.76],[51.8713,63.4],[43.3112,69.08],[40.5112,64.96],[47.6312,60.4],[52.1112,55.12],[54.4312,48.96],[55.1512,41.72],[55.1512,41.04]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0.480000000000004,-2.6400000000000006],[1.226700000000001,-2.3733000000000004],[2.213300000000004,-2.0533],[3.493400000000001,-1.7332999999999998],[0,0],[-1.8932999999999964,1.6266999999999996],[-1.0932999999999993,1.8933000000000035],[-0.4532999999999987,2.2132999999999967],[0,2.6133000000000024],[0,0]],"o":[[0,0],[0,2.8533000000000044],[-0.4799999999999969,2.6133000000000024],[-1.2265999999999977,2.3733000000000004],[-2.2134,2.0533],[0,0],[2.8534000000000006,-1.4132999999999925],[1.8933999999999997,-1.6266999999999996],[1.0934000000000026,-1.8932999999999964],[0.480000000000004,-2.213300000000004],[0,0],[0,0]],"v":[[55.1512,41.04],[60.3112,41.04],[59.5913,49.28],[57.0312,56.76],[51.8713,63.4],[43.3112,69.08],[40.5112,64.96],[47.6312,60.4],[52.1112,55.12],[54.4312,48.96],[55.1512,41.72],[55.1512,41.04]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0.480000000000004,-2.6400000000000006],[1.226700000000001,-2.3733000000000004],[2.213300000000004,-2.0533],[3.493400000000001,-1.7332999999999998],[0,0],[-1.8932999999999964,1.6266999999999996],[-1.0932999999999993,1.8933000000000035],[-0.4532999999999987,2.2132999999999967],[0,2.6133000000000024],[0,0]],"o":[[0,0],[0,2.8533000000000044],[-0.4799999999999969,2.6133000000000024],[-1.2265999999999977,2.3733000000000004],[-2.2134,2.0533],[0,0],[2.8534000000000006,-1.4132999999999925],[1.8933999999999997,-1.6266999999999996],[1.0934000000000026,-1.8932999999999964],[0.480000000000004,-2.213300000000004],[0,0],[0,0]],"v":[[55.1512,41.04],[60.3112,41.04],[59.5913,49.28],[57.0312,56.76],[51.8713,63.4],[43.3112,69.08],[40.5112,64.96],[47.6312,60.4],[52.1112,55.12],[54.4312,48.96],[55.1512,41.72],[55.1512,41.04]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0.48,-2.64],[1.23,-2.37],[2.21,-2.05],[3.49,-1.73],[0,0],[-1.89,1.63],[-1.09,1.89],[-0.45,2.21],[0,2.61],[0,0]],"o":[[0,0],[0,2.85],[-0.48,2.61],[-1.23,2.37],[-2.21,2.05],[0,0],[2.85,-1.41],[1.89,-1.63],[1.09,-1.89],[0.48,-2.21],[0,0],[0,0]],"v":[[55.15,41.04],[60.31,41.04],[59.59,49.28],[57.03,56.76],[51.87,63.4],[43.31,69.08],[40.51,64.96],[47.63,60.4],[52.11,55.12],[54.43,48.96],[55.15,41.72],[55.15,41.04]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.75,41.04],[57.79,41.04],[57.79,45.28],[42.75,45.28],[42.75,41.04]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7512,41.04],[57.7912,41.04],[57.7912,45.28],[42.7512,45.28],[42.7512,41.04]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7512,41.04],[57.7912,41.04],[57.7912,45.28],[42.7512,45.28],[42.7512,41.04]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7512,41.04],[57.7912,41.04],[57.7912,45.28],[42.7512,45.28],[42.7512,41.04]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7512,41.04],[57.7912,41.04],[57.7912,45.28],[42.7512,45.28],[42.7512,41.04]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7512,41.04],[57.7912,41.04],[57.7912,45.28],[42.7512,45.28],[42.7512,41.04]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7512,41.04],[57.7912,41.04],[57.7912,45.28],[42.7512,45.28],[42.7512,41.04]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7512,41.04],[57.7912,41.04],[57.7912,45.28],[42.7512,45.28],[42.7512,41.04]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7512,41.04],[57.7912,41.04],[57.7912,45.28],[42.7512,45.28],[42.7512,41.04]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7512,41.04],[57.7912,41.04],[57.7912,45.28],[42.7512,45.28],[42.7512,41.04]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.75,41.04],[57.79,41.04],[57.79,45.28],[42.75,45.28],[42.75,41.04]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.11,50.12],[55.11,54.2],[41.51,55.44],[40.83,50.96],[55.11,50.12]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.1112,50.12],[55.1112,54.2],[41.5112,55.44],[40.8312,50.96],[55.1112,50.12]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.1112,50.12],[55.1112,54.2],[41.5112,55.44],[40.8312,50.96],[55.1112,50.12]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.1112,50.12],[55.1112,54.2],[41.5112,55.44],[40.8312,50.96],[55.1112,50.12]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.1112,50.12],[55.1112,54.2],[41.5112,55.44],[40.8312,50.96],[55.1112,50.12]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.1112,50.12],[55.1112,54.2],[41.5112,55.44],[40.8312,50.96],[55.1112,50.12]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.1112,50.12],[55.1112,54.2],[41.5112,55.44],[40.8312,50.96],[55.1112,50.12]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.1112,50.12],[55.1112,54.2],[41.5112,55.44],[40.8312,50.96],[55.1112,50.12]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.1112,50.12],[55.1112,54.2],[41.5112,55.44],[40.8312,50.96],[55.1112,50.12]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.1112,50.12],[55.1112,54.2],[41.5112,55.44],[40.8312,50.96],[55.1112,50.12]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.11,50.12],[55.11,54.2],[41.51,55.44],[40.83,50.96],[55.11,50.12]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.79,37.48],[71.11,37.48],[71.11,74.52],[65.79,74.52],[65.79,37.48]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.7913,37.48],[71.1113,37.48],[71.1113,74.52],[65.7913,74.52],[65.7913,37.48]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.7913,37.48],[71.1113,37.48],[71.1113,74.52],[65.7913,74.52],[65.7913,37.48]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.7913,37.48],[71.1113,37.48],[71.1113,74.52],[65.7913,74.52],[65.7913,37.48]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.7913,37.48],[71.1113,37.48],[71.1113,74.52],[65.7913,74.52],[65.7913,37.48]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.7913,37.48],[71.1113,37.48],[71.1113,74.52],[65.7913,74.52],[65.7913,37.48]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.7913,37.48],[71.1113,37.48],[71.1113,74.52],[65.7913,74.52],[65.7913,37.48]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.7913,37.48],[71.1113,37.48],[71.1113,74.52],[65.7913,74.52],[65.7913,37.48]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.7913,37.48],[71.1113,37.48],[71.1113,74.52],[65.7913,74.52],[65.7913,37.48]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.7913,37.48],[71.1113,37.48],[71.1113,74.52],[65.7913,74.52],[65.7913,37.48]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.79,37.48],[71.11,37.48],[71.11,74.52],[65.79,74.52],[65.79,37.48]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.47,58.2],[110.99,58.2],[110.99,62.48],[77.47,62.48],[77.47,58.2]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.4681,58.2],[110.988,58.2],[110.988,62.48],[77.4681,62.48],[77.4681,58.2]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.4681,58.2],[110.988,58.2],[110.988,62.48],[77.4681,62.48],[77.4681,58.2]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.4681,58.2],[110.988,58.2],[110.988,62.48],[77.4681,62.48],[77.4681,58.2]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.4681,58.2],[110.988,58.2],[110.988,62.48],[77.4681,62.48],[77.4681,58.2]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.4681,58.2],[110.988,58.2],[110.988,62.48],[77.4681,62.48],[77.4681,58.2]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.4681,58.2],[110.988,58.2],[110.988,62.48],[77.4681,62.48],[77.4681,58.2]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.4681,58.2],[110.988,58.2],[110.988,62.48],[77.4681,62.48],[77.4681,58.2]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.4681,58.2],[110.988,58.2],[110.988,62.48],[77.4681,62.48],[77.4681,58.2]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.4681,58.2],[110.988,58.2],[110.988,62.48],[77.4681,62.48],[77.4681,58.2]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[77.47,58.2],[110.99,58.2],[110.99,62.48],[77.47,62.48],[77.47,58.2]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.43,61],[96.75,61],[96.75,74.56],[91.43,74.56],[91.43,61]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.4281,61],[96.7481,61],[96.7481,74.56],[91.4281,74.56],[91.4281,61]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.4281,61],[96.7481,61],[96.7481,74.56],[91.4281,74.56],[91.4281,61]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.4281,61],[96.7481,61],[96.7481,74.56],[91.4281,74.56],[91.4281,61]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.4281,61],[96.7481,61],[96.7481,74.56],[91.4281,74.56],[91.4281,61]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.4281,61],[96.7481,61],[96.7481,74.56],[91.4281,74.56],[91.4281,61]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.4281,61],[96.7481,61],[96.7481,74.56],[91.4281,74.56],[91.4281,61]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.4281,61],[96.7481,61],[96.7481,74.56],[91.4281,74.56],[91.4281,61]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.4281,61],[96.7481,61],[96.7481,74.56],[91.4281,74.56],[91.4281,61]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.4281,61],[96.7481,61],[96.7481,74.56],[91.4281,74.56],[91.4281,61]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[91.43,61],[96.75,61],[96.75,74.56],[91.43,74.56],[91.43,61]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[-2,-0.69],[-1.12,-1.25],[0,-1.68],[1.12,-1.25],[2.03,-0.69],[2.64,0],[2.03,0.67],[1.15,1.23],[0,1.71],[-1.12,1.25],[-2,0.67],[-2.64,0]],"o":[[2.64,0],[2.03,0.67],[1.12,1.25],[0,1.71],[-1.12,1.23],[-2,0.67],[-2.64,0],[-2,-0.69],[-1.12,-1.25],[0,-1.68],[1.15,-1.25],[2.03,-0.69],[0,0]],"v":[[94.15,38.76],[101.11,39.8],[105.83,42.68],[107.51,47.08],[105.83,51.52],[101.11,54.4],[94.15,55.4],[87.15,54.4],[82.43,51.52],[80.75,47.08],[82.43,42.68],[87.15,39.8],[94.15,38.76]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[-1.999900000000011,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1199999999999903,-1.253300000000003],[2.027000000000001,-0.6933000000000007],[2.6400000000000006,0],[2.0267000000000053,0.6666999999999987],[1.1466999999999956,1.226699999999994],[0,1.706700000000005],[-1.1200000000000045,1.253300000000003],[-2,0.6667000000000058],[-2.6400000000000006,0]],"o":[[2.6400000000000006,0],[2.027000000000001,0.6667000000000058],[1.1199999999999903,1.253300000000003],[0,1.706700000000005],[-1.1200000000000045,1.226699999999994],[-1.999900000000011,0.6666999999999987],[-2.6400000000000006,0],[-2,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1466999999999956,-1.253300000000003],[2.0267000000000053,-0.6933000000000007],[0,0]],"v":[[94.1481,38.76],[101.108,39.8],[105.828,42.68],[107.508,47.08],[105.828,51.52],[101.108,54.4],[94.1481,55.4],[87.1481,54.4],[82.4281,51.52],[80.7481,47.08],[82.4281,42.68],[87.1481,39.8],[94.1481,38.76]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[-1.999900000000011,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1199999999999903,-1.253300000000003],[2.027000000000001,-0.6933000000000007],[2.6400000000000006,0],[2.0267000000000053,0.6666999999999987],[1.1466999999999956,1.226699999999994],[0,1.706700000000005],[-1.1200000000000045,1.253300000000003],[-2,0.6667000000000058],[-2.6400000000000006,0]],"o":[[2.6400000000000006,0],[2.027000000000001,0.6667000000000058],[1.1199999999999903,1.253300000000003],[0,1.706700000000005],[-1.1200000000000045,1.226699999999994],[-1.999900000000011,0.6666999999999987],[-2.6400000000000006,0],[-2,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1466999999999956,-1.253300000000003],[2.0267000000000053,-0.6933000000000007],[0,0]],"v":[[94.1481,38.76],[101.108,39.8],[105.828,42.68],[107.508,47.08],[105.828,51.52],[101.108,54.4],[94.1481,55.4],[87.1481,54.4],[82.4281,51.52],[80.7481,47.08],[82.4281,42.68],[87.1481,39.8],[94.1481,38.76]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[-1.999900000000011,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1199999999999903,-1.253300000000003],[2.027000000000001,-0.6933000000000007],[2.6400000000000006,0],[2.0267000000000053,0.6666999999999987],[1.1466999999999956,1.226699999999994],[0,1.706700000000005],[-1.1200000000000045,1.253300000000003],[-2,0.6667000000000058],[-2.6400000000000006,0]],"o":[[2.6400000000000006,0],[2.027000000000001,0.6667000000000058],[1.1199999999999903,1.253300000000003],[0,1.706700000000005],[-1.1200000000000045,1.226699999999994],[-1.999900000000011,0.6666999999999987],[-2.6400000000000006,0],[-2,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1466999999999956,-1.253300000000003],[2.0267000000000053,-0.6933000000000007],[0,0]],"v":[[94.1481,38.76],[101.108,39.8],[105.828,42.68],[107.508,47.08],[105.828,51.52],[101.108,54.4],[94.1481,55.4],[87.1481,54.4],[82.4281,51.52],[80.7481,47.08],[82.4281,42.68],[87.1481,39.8],[94.1481,38.76]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[-1.999900000000011,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1199999999999903,-1.253300000000003],[2.027000000000001,-0.6933000000000007],[2.6400000000000006,0],[2.0267000000000053,0.6666999999999987],[1.1466999999999956,1.226699999999994],[0,1.706700000000005],[-1.1200000000000045,1.253300000000003],[-2,0.6667000000000058],[-2.6400000000000006,0]],"o":[[2.6400000000000006,0],[2.027000000000001,0.6667000000000058],[1.1199999999999903,1.253300000000003],[0,1.706700000000005],[-1.1200000000000045,1.226699999999994],[-1.999900000000011,0.6666999999999987],[-2.6400000000000006,0],[-2,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1466999999999956,-1.253300000000003],[2.0267000000000053,-0.6933000000000007],[0,0]],"v":[[94.1481,38.76],[101.108,39.8],[105.828,42.68],[107.508,47.08],[105.828,51.52],[101.108,54.4],[94.1481,55.4],[87.1481,54.4],[82.4281,51.52],[80.7481,47.08],[82.4281,42.68],[87.1481,39.8],[94.1481,38.76]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[-1.999900000000011,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1199999999999903,-1.253300000000003],[2.027000000000001,-0.6933000000000007],[2.6400000000000006,0],[2.0267000000000053,0.6666999999999987],[1.1466999999999956,1.226699999999994],[0,1.706700000000005],[-1.1200000000000045,1.253300000000003],[-2,0.6667000000000058],[-2.6400000000000006,0]],"o":[[2.6400000000000006,0],[2.027000000000001,0.6667000000000058],[1.1199999999999903,1.253300000000003],[0,1.706700000000005],[-1.1200000000000045,1.226699999999994],[-1.999900000000011,0.6666999999999987],[-2.6400000000000006,0],[-2,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1466999999999956,-1.253300000000003],[2.0267000000000053,-0.6933000000000007],[0,0]],"v":[[94.1481,38.76],[101.108,39.8],[105.828,42.68],[107.508,47.08],[105.828,51.52],[101.108,54.4],[94.1481,55.4],[87.1481,54.4],[82.4281,51.52],[80.7481,47.08],[82.4281,42.68],[87.1481,39.8],[94.1481,38.76]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[-1.999900000000011,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1199999999999903,-1.253300000000003],[2.027000000000001,-0.6933000000000007],[2.6400000000000006,0],[2.0267000000000053,0.6666999999999987],[1.1466999999999956,1.226699999999994],[0,1.706700000000005],[-1.1200000000000045,1.253300000000003],[-2,0.6667000000000058],[-2.6400000000000006,0]],"o":[[2.6400000000000006,0],[2.027000000000001,0.6667000000000058],[1.1199999999999903,1.253300000000003],[0,1.706700000000005],[-1.1200000000000045,1.226699999999994],[-1.999900000000011,0.6666999999999987],[-2.6400000000000006,0],[-2,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1466999999999956,-1.253300000000003],[2.0267000000000053,-0.6933000000000007],[0,0]],"v":[[94.1481,38.76],[101.108,39.8],[105.828,42.68],[107.508,47.08],[105.828,51.52],[101.108,54.4],[94.1481,55.4],[87.1481,54.4],[82.4281,51.52],[80.7481,47.08],[82.4281,42.68],[87.1481,39.8],[94.1481,38.76]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[-1.999900000000011,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1199999999999903,-1.253300000000003],[2.027000000000001,-0.6933000000000007],[2.6400000000000006,0],[2.0267000000000053,0.6666999999999987],[1.1466999999999956,1.226699999999994],[0,1.706700000000005],[-1.1200000000000045,1.253300000000003],[-2,0.6667000000000058],[-2.6400000000000006,0]],"o":[[2.6400000000000006,0],[2.027000000000001,0.6667000000000058],[1.1199999999999903,1.253300000000003],[0,1.706700000000005],[-1.1200000000000045,1.226699999999994],[-1.999900000000011,0.6666999999999987],[-2.6400000000000006,0],[-2,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1466999999999956,-1.253300000000003],[2.0267000000000053,-0.6933000000000007],[0,0]],"v":[[94.1481,38.76],[101.108,39.8],[105.828,42.68],[107.508,47.08],[105.828,51.52],[101.108,54.4],[94.1481,55.4],[87.1481,54.4],[82.4281,51.52],[80.7481,47.08],[82.4281,42.68],[87.1481,39.8],[94.1481,38.76]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[-1.999900000000011,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1199999999999903,-1.253300000000003],[2.027000000000001,-0.6933000000000007],[2.6400000000000006,0],[2.0267000000000053,0.6666999999999987],[1.1466999999999956,1.226699999999994],[0,1.706700000000005],[-1.1200000000000045,1.253300000000003],[-2,0.6667000000000058],[-2.6400000000000006,0]],"o":[[2.6400000000000006,0],[2.027000000000001,0.6667000000000058],[1.1199999999999903,1.253300000000003],[0,1.706700000000005],[-1.1200000000000045,1.226699999999994],[-1.999900000000011,0.6666999999999987],[-2.6400000000000006,0],[-2,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1466999999999956,-1.253300000000003],[2.0267000000000053,-0.6933000000000007],[0,0]],"v":[[94.1481,38.76],[101.108,39.8],[105.828,42.68],[107.508,47.08],[105.828,51.52],[101.108,54.4],[94.1481,55.4],[87.1481,54.4],[82.4281,51.52],[80.7481,47.08],[82.4281,42.68],[87.1481,39.8],[94.1481,38.76]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[-1.999900000000011,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1199999999999903,-1.253300000000003],[2.027000000000001,-0.6933000000000007],[2.6400000000000006,0],[2.0267000000000053,0.6666999999999987],[1.1466999999999956,1.226699999999994],[0,1.706700000000005],[-1.1200000000000045,1.253300000000003],[-2,0.6667000000000058],[-2.6400000000000006,0]],"o":[[2.6400000000000006,0],[2.027000000000001,0.6667000000000058],[1.1199999999999903,1.253300000000003],[0,1.706700000000005],[-1.1200000000000045,1.226699999999994],[-1.999900000000011,0.6666999999999987],[-2.6400000000000006,0],[-2,-0.6933000000000007],[-1.1200000000000045,-1.253300000000003],[0,-1.6799999999999997],[1.1466999999999956,-1.253300000000003],[2.0267000000000053,-0.6933000000000007],[0,0]],"v":[[94.1481,38.76],[101.108,39.8],[105.828,42.68],[107.508,47.08],[105.828,51.52],[101.108,54.4],[94.1481,55.4],[87.1481,54.4],[82.4281,51.52],[80.7481,47.08],[82.4281,42.68],[87.1481,39.8],[94.1481,38.76]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[-2,-0.69],[-1.12,-1.25],[0,-1.68],[1.12,-1.25],[2.03,-0.69],[2.64,0],[2.03,0.67],[1.15,1.23],[0,1.71],[-1.12,1.25],[-2,0.67],[-2.64,0]],"o":[[2.64,0],[2.03,0.67],[1.12,1.25],[0,1.71],[-1.12,1.23],[-2,0.67],[-2.64,0],[-2,-0.69],[-1.12,-1.25],[0,-1.68],[1.15,-1.25],[2.03,-0.69],[0,0]],"v":[[94.15,38.76],[101.11,39.8],[105.83,42.68],[107.51,47.08],[105.83,51.52],[101.11,54.4],[94.15,55.4],[87.15,54.4],[82.43,51.52],[80.75,47.08],[82.43,42.68],[87.15,39.8],[94.15,38.76]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[1.2,-0.32],[0.64,-0.61],[0,-0.91],[-0.64,-0.61],[-1.17,-0.32],[-1.6,0],[-1.17,0.29],[-0.64,0.61],[0,0.88],[0.67,0.59],[1.17,0.32],[1.65,0]],"o":[[-1.6,0],[-1.17,0.32],[-0.64,0.59],[0,0.88],[0.64,0.61],[1.2,0.29],[1.65,0],[1.17,-0.32],[0.67,-0.61],[0,-0.91],[-0.64,-0.61],[-1.17,-0.32],[0,0]],"v":[[94.11,42.96],[89.91,43.44],[87.19,44.84],[86.23,47.08],[87.19,49.32],[89.91,50.72],[94.11,51.16],[98.35,50.72],[101.07,49.32],[102.07,47.08],[101.07,44.84],[98.35,43.44],[94.11,42.96]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[1.1999999999999886,-0.3200000000000003],[0.6400000000000006,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[-1.5999999999999943,0],[-1.1732999999999976,0.2933000000000021],[-0.6400000000000006,0.6133000000000024],[0,0.8800000000000026],[0.6670000000000016,0.5866999999999933],[1.1734000000000009,0.3200000000000003],[1.6534000000000049,0]],"o":[[-1.5999999999999943,0],[-1.1732999999999976,0.3200000000000003],[-0.6400000000000006,0.5866999999999933],[0,0.8800000000000026],[0.6400000000000006,0.6133000000000024],[1.1999999999999886,0.2933000000000021],[1.6534000000000049,0],[1.1734000000000009,-0.3200000000000003],[0.6670000000000016,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[0,0]],"v":[[94.1081,42.96],[89.9081,43.44],[87.1881,44.84],[86.2281,47.08],[87.1881,49.32],[89.9081,50.72],[94.1081,51.16],[98.3481,50.72],[101.068,49.32],[102.068,47.08],[101.068,44.84],[98.3481,43.44],[94.1081,42.96]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[1.1999999999999886,-0.3200000000000003],[0.6400000000000006,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[-1.5999999999999943,0],[-1.1732999999999976,0.2933000000000021],[-0.6400000000000006,0.6133000000000024],[0,0.8800000000000026],[0.6670000000000016,0.5866999999999933],[1.1734000000000009,0.3200000000000003],[1.6534000000000049,0]],"o":[[-1.5999999999999943,0],[-1.1732999999999976,0.3200000000000003],[-0.6400000000000006,0.5866999999999933],[0,0.8800000000000026],[0.6400000000000006,0.6133000000000024],[1.1999999999999886,0.2933000000000021],[1.6534000000000049,0],[1.1734000000000009,-0.3200000000000003],[0.6670000000000016,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[0,0]],"v":[[94.1081,42.96],[89.9081,43.44],[87.1881,44.84],[86.2281,47.08],[87.1881,49.32],[89.9081,50.72],[94.1081,51.16],[98.3481,50.72],[101.068,49.32],[102.068,47.08],[101.068,44.84],[98.3481,43.44],[94.1081,42.96]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[1.1999999999999886,-0.3200000000000003],[0.6400000000000006,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[-1.5999999999999943,0],[-1.1732999999999976,0.2933000000000021],[-0.6400000000000006,0.6133000000000024],[0,0.8800000000000026],[0.6670000000000016,0.5866999999999933],[1.1734000000000009,0.3200000000000003],[1.6534000000000049,0]],"o":[[-1.5999999999999943,0],[-1.1732999999999976,0.3200000000000003],[-0.6400000000000006,0.5866999999999933],[0,0.8800000000000026],[0.6400000000000006,0.6133000000000024],[1.1999999999999886,0.2933000000000021],[1.6534000000000049,0],[1.1734000000000009,-0.3200000000000003],[0.6670000000000016,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[0,0]],"v":[[94.1081,42.96],[89.9081,43.44],[87.1881,44.84],[86.2281,47.08],[87.1881,49.32],[89.9081,50.72],[94.1081,51.16],[98.3481,50.72],[101.068,49.32],[102.068,47.08],[101.068,44.84],[98.3481,43.44],[94.1081,42.96]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[1.1999999999999886,-0.3200000000000003],[0.6400000000000006,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[-1.5999999999999943,0],[-1.1732999999999976,0.2933000000000021],[-0.6400000000000006,0.6133000000000024],[0,0.8800000000000026],[0.6670000000000016,0.5866999999999933],[1.1734000000000009,0.3200000000000003],[1.6534000000000049,0]],"o":[[-1.5999999999999943,0],[-1.1732999999999976,0.3200000000000003],[-0.6400000000000006,0.5866999999999933],[0,0.8800000000000026],[0.6400000000000006,0.6133000000000024],[1.1999999999999886,0.2933000000000021],[1.6534000000000049,0],[1.1734000000000009,-0.3200000000000003],[0.6670000000000016,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[0,0]],"v":[[94.1081,42.96],[89.9081,43.44],[87.1881,44.84],[86.2281,47.08],[87.1881,49.32],[89.9081,50.72],[94.1081,51.16],[98.3481,50.72],[101.068,49.32],[102.068,47.08],[101.068,44.84],[98.3481,43.44],[94.1081,42.96]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[1.1999999999999886,-0.3200000000000003],[0.6400000000000006,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[-1.5999999999999943,0],[-1.1732999999999976,0.2933000000000021],[-0.6400000000000006,0.6133000000000024],[0,0.8800000000000026],[0.6670000000000016,0.5866999999999933],[1.1734000000000009,0.3200000000000003],[1.6534000000000049,0]],"o":[[-1.5999999999999943,0],[-1.1732999999999976,0.3200000000000003],[-0.6400000000000006,0.5866999999999933],[0,0.8800000000000026],[0.6400000000000006,0.6133000000000024],[1.1999999999999886,0.2933000000000021],[1.6534000000000049,0],[1.1734000000000009,-0.3200000000000003],[0.6670000000000016,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[0,0]],"v":[[94.1081,42.96],[89.9081,43.44],[87.1881,44.84],[86.2281,47.08],[87.1881,49.32],[89.9081,50.72],[94.1081,51.16],[98.3481,50.72],[101.068,49.32],[102.068,47.08],[101.068,44.84],[98.3481,43.44],[94.1081,42.96]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[1.1999999999999886,-0.3200000000000003],[0.6400000000000006,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[-1.5999999999999943,0],[-1.1732999999999976,0.2933000000000021],[-0.6400000000000006,0.6133000000000024],[0,0.8800000000000026],[0.6670000000000016,0.5866999999999933],[1.1734000000000009,0.3200000000000003],[1.6534000000000049,0]],"o":[[-1.5999999999999943,0],[-1.1732999999999976,0.3200000000000003],[-0.6400000000000006,0.5866999999999933],[0,0.8800000000000026],[0.6400000000000006,0.6133000000000024],[1.1999999999999886,0.2933000000000021],[1.6534000000000049,0],[1.1734000000000009,-0.3200000000000003],[0.6670000000000016,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[0,0]],"v":[[94.1081,42.96],[89.9081,43.44],[87.1881,44.84],[86.2281,47.08],[87.1881,49.32],[89.9081,50.72],[94.1081,51.16],[98.3481,50.72],[101.068,49.32],[102.068,47.08],[101.068,44.84],[98.3481,43.44],[94.1081,42.96]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[1.1999999999999886,-0.3200000000000003],[0.6400000000000006,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[-1.5999999999999943,0],[-1.1732999999999976,0.2933000000000021],[-0.6400000000000006,0.6133000000000024],[0,0.8800000000000026],[0.6670000000000016,0.5866999999999933],[1.1734000000000009,0.3200000000000003],[1.6534000000000049,0]],"o":[[-1.5999999999999943,0],[-1.1732999999999976,0.3200000000000003],[-0.6400000000000006,0.5866999999999933],[0,0.8800000000000026],[0.6400000000000006,0.6133000000000024],[1.1999999999999886,0.2933000000000021],[1.6534000000000049,0],[1.1734000000000009,-0.3200000000000003],[0.6670000000000016,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[0,0]],"v":[[94.1081,42.96],[89.9081,43.44],[87.1881,44.84],[86.2281,47.08],[87.1881,49.32],[89.9081,50.72],[94.1081,51.16],[98.3481,50.72],[101.068,49.32],[102.068,47.08],[101.068,44.84],[98.3481,43.44],[94.1081,42.96]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[1.1999999999999886,-0.3200000000000003],[0.6400000000000006,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[-1.5999999999999943,0],[-1.1732999999999976,0.2933000000000021],[-0.6400000000000006,0.6133000000000024],[0,0.8800000000000026],[0.6670000000000016,0.5866999999999933],[1.1734000000000009,0.3200000000000003],[1.6534000000000049,0]],"o":[[-1.5999999999999943,0],[-1.1732999999999976,0.3200000000000003],[-0.6400000000000006,0.5866999999999933],[0,0.8800000000000026],[0.6400000000000006,0.6133000000000024],[1.1999999999999886,0.2933000000000021],[1.6534000000000049,0],[1.1734000000000009,-0.3200000000000003],[0.6670000000000016,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[0,0]],"v":[[94.1081,42.96],[89.9081,43.44],[87.1881,44.84],[86.2281,47.08],[87.1881,49.32],[89.9081,50.72],[94.1081,51.16],[98.3481,50.72],[101.068,49.32],[102.068,47.08],[101.068,44.84],[98.3481,43.44],[94.1081,42.96]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[1.1999999999999886,-0.3200000000000003],[0.6400000000000006,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[-1.5999999999999943,0],[-1.1732999999999976,0.2933000000000021],[-0.6400000000000006,0.6133000000000024],[0,0.8800000000000026],[0.6670000000000016,0.5866999999999933],[1.1734000000000009,0.3200000000000003],[1.6534000000000049,0]],"o":[[-1.5999999999999943,0],[-1.1732999999999976,0.3200000000000003],[-0.6400000000000006,0.5866999999999933],[0,0.8800000000000026],[0.6400000000000006,0.6133000000000024],[1.1999999999999886,0.2933000000000021],[1.6534000000000049,0],[1.1734000000000009,-0.3200000000000003],[0.6670000000000016,-0.6133000000000024],[0,-0.9067000000000007],[-0.6400000000000006,-0.6133000000000024],[-1.1732999999999976,-0.3200000000000003],[0,0]],"v":[[94.1081,42.96],[89.9081,43.44],[87.1881,44.84],[86.2281,47.08],[87.1881,49.32],[89.9081,50.72],[94.1081,51.16],[98.3481,50.72],[101.068,49.32],[102.068,47.08],[101.068,44.84],[98.3481,43.44],[94.1081,42.96]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[1.2,-0.32],[0.64,-0.61],[0,-0.91],[-0.64,-0.61],[-1.17,-0.32],[-1.6,0],[-1.17,0.29],[-0.64,0.61],[0,0.88],[0.67,0.59],[1.17,0.32],[1.65,0]],"o":[[-1.6,0],[-1.17,0.32],[-0.64,0.59],[0,0.88],[0.64,0.61],[1.2,0.29],[1.65,0],[1.17,-0.32],[0.67,-0.61],[0,-0.91],[-0.64,-0.61],[-1.17,-0.32],[0,0]],"v":[[94.11,42.96],[89.91,43.44],[87.19,44.84],[86.23,47.08],[87.19,49.32],[89.91,50.72],[94.11,51.16],[98.35,50.72],[101.07,49.32],[102.07,47.08],[101.07,44.84],[98.35,43.44],[94.11,42.96]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.19,37.48],[145.51,37.48],[145.51,74.52],[140.19,74.52],[140.19,37.48]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.185,37.48],[145.505,37.48],[145.505,74.52],[140.185,74.52],[140.185,37.48]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.185,37.48],[145.505,37.48],[145.505,74.52],[140.185,74.52],[140.185,37.48]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.185,37.48],[145.505,37.48],[145.505,74.52],[140.185,74.52],[140.185,37.48]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.185,37.48],[145.505,37.48],[145.505,74.52],[140.185,74.52],[140.185,37.48]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.185,37.48],[145.505,37.48],[145.505,74.52],[140.185,74.52],[140.185,37.48]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.185,37.48],[145.505,37.48],[145.505,74.52],[140.185,74.52],[140.185,37.48]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.185,37.48],[145.505,37.48],[145.505,74.52],[140.185,74.52],[140.185,37.48]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.185,37.48],[145.505,37.48],[145.505,74.52],[140.185,74.52],[140.185,37.48]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.185,37.48],[145.505,37.48],[145.505,74.52],[140.185,74.52],[140.185,37.48]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[140.19,37.48],[145.51,37.48],[145.51,74.52],[140.19,74.52],[140.19,37.48]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0.56,-2.59],[1.28,-2.27],[2.21,-1.95],[3.28,-1.6],[0,0],[-2.11,2.08],[-0.93,2.64],[0,3.31],[0,0]],"o":[[0,0],[0,2.83],[-0.53,2.56],[-1.25,2.27],[-2.19,1.92],[0,0],[3.57,-1.73],[2.13,-2.11],[0.93,-2.67],[0,0],[0,0]],"v":[[129.26,41.32],[134.51,41.32],[133.67,49.44],[130.95,56.68],[125.75,63],[117.55,68.28],[114.75,64.08],[123.27,58.36],[127.87,51.24],[129.26,42.28],[129.26,41.32]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0.5600000000000023,-2.5867000000000004],[1.2800000000000011,-2.2667],[2.212999999999994,-1.9466999999999999],[3.280000000000001,-1.5999999999999943],[0,0],[-2.1069999999999993,2.0799999999999983],[-0.9329999999999927,2.6400000000000006],[0,3.3066999999999993],[0,0]],"o":[[0,0],[0,2.8267000000000024],[-0.532999999999987,2.5600000000000023],[-1.252999999999986,2.2667],[-2.1869999999999976,1.9200000000000017],[0,0],[3.5729999999999933,-1.7332999999999998],[2.1329999999999956,-2.1066999999999965],[0.9330000000000069,-2.6666999999999987],[0,0],[0,0]],"v":[[129.265,41.32],[134.505,41.32],[133.665,49.44],[130.945,56.68],[125.745,63],[117.545,68.28],[114.745,64.08],[123.265,58.36],[127.865,51.24],[129.265,42.28],[129.265,41.32]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0.5600000000000023,-2.5867000000000004],[1.2800000000000011,-2.2667],[2.212999999999994,-1.9466999999999999],[3.280000000000001,-1.5999999999999943],[0,0],[-2.1069999999999993,2.0799999999999983],[-0.9329999999999927,2.6400000000000006],[0,3.3066999999999993],[0,0]],"o":[[0,0],[0,2.8267000000000024],[-0.532999999999987,2.5600000000000023],[-1.252999999999986,2.2667],[-2.1869999999999976,1.9200000000000017],[0,0],[3.5729999999999933,-1.7332999999999998],[2.1329999999999956,-2.1066999999999965],[0.9330000000000069,-2.6666999999999987],[0,0],[0,0]],"v":[[129.265,41.32],[134.505,41.32],[133.665,49.44],[130.945,56.68],[125.745,63],[117.545,68.28],[114.745,64.08],[123.265,58.36],[127.865,51.24],[129.265,42.28],[129.265,41.32]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0.5600000000000023,-2.5867000000000004],[1.2800000000000011,-2.2667],[2.212999999999994,-1.9466999999999999],[3.280000000000001,-1.5999999999999943],[0,0],[-2.1069999999999993,2.0799999999999983],[-0.9329999999999927,2.6400000000000006],[0,3.3066999999999993],[0,0]],"o":[[0,0],[0,2.8267000000000024],[-0.532999999999987,2.5600000000000023],[-1.252999999999986,2.2667],[-2.1869999999999976,1.9200000000000017],[0,0],[3.5729999999999933,-1.7332999999999998],[2.1329999999999956,-2.1066999999999965],[0.9330000000000069,-2.6666999999999987],[0,0],[0,0]],"v":[[129.265,41.32],[134.505,41.32],[133.665,49.44],[130.945,56.68],[125.745,63],[117.545,68.28],[114.745,64.08],[123.265,58.36],[127.865,51.24],[129.265,42.28],[129.265,41.32]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0.5600000000000023,-2.5867000000000004],[1.2800000000000011,-2.2667],[2.212999999999994,-1.9466999999999999],[3.280000000000001,-1.5999999999999943],[0,0],[-2.1069999999999993,2.0799999999999983],[-0.9329999999999927,2.6400000000000006],[0,3.3066999999999993],[0,0]],"o":[[0,0],[0,2.8267000000000024],[-0.532999999999987,2.5600000000000023],[-1.252999999999986,2.2667],[-2.1869999999999976,1.9200000000000017],[0,0],[3.5729999999999933,-1.7332999999999998],[2.1329999999999956,-2.1066999999999965],[0.9330000000000069,-2.6666999999999987],[0,0],[0,0]],"v":[[129.265,41.32],[134.505,41.32],[133.665,49.44],[130.945,56.68],[125.745,63],[117.545,68.28],[114.745,64.08],[123.265,58.36],[127.865,51.24],[129.265,42.28],[129.265,41.32]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0.5600000000000023,-2.5867000000000004],[1.2800000000000011,-2.2667],[2.212999999999994,-1.9466999999999999],[3.280000000000001,-1.5999999999999943],[0,0],[-2.1069999999999993,2.0799999999999983],[-0.9329999999999927,2.6400000000000006],[0,3.3066999999999993],[0,0]],"o":[[0,0],[0,2.8267000000000024],[-0.532999999999987,2.5600000000000023],[-1.252999999999986,2.2667],[-2.1869999999999976,1.9200000000000017],[0,0],[3.5729999999999933,-1.7332999999999998],[2.1329999999999956,-2.1066999999999965],[0.9330000000000069,-2.6666999999999987],[0,0],[0,0]],"v":[[129.265,41.32],[134.505,41.32],[133.665,49.44],[130.945,56.68],[125.745,63],[117.545,68.28],[114.745,64.08],[123.265,58.36],[127.865,51.24],[129.265,42.28],[129.265,41.32]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0.5600000000000023,-2.5867000000000004],[1.2800000000000011,-2.2667],[2.212999999999994,-1.9466999999999999],[3.280000000000001,-1.5999999999999943],[0,0],[-2.1069999999999993,2.0799999999999983],[-0.9329999999999927,2.6400000000000006],[0,3.3066999999999993],[0,0]],"o":[[0,0],[0,2.8267000000000024],[-0.532999999999987,2.5600000000000023],[-1.252999999999986,2.2667],[-2.1869999999999976,1.9200000000000017],[0,0],[3.5729999999999933,-1.7332999999999998],[2.1329999999999956,-2.1066999999999965],[0.9330000000000069,-2.6666999999999987],[0,0],[0,0]],"v":[[129.265,41.32],[134.505,41.32],[133.665,49.44],[130.945,56.68],[125.745,63],[117.545,68.28],[114.745,64.08],[123.265,58.36],[127.865,51.24],[129.265,42.28],[129.265,41.32]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0.5600000000000023,-2.5867000000000004],[1.2800000000000011,-2.2667],[2.212999999999994,-1.9466999999999999],[3.280000000000001,-1.5999999999999943],[0,0],[-2.1069999999999993,2.0799999999999983],[-0.9329999999999927,2.6400000000000006],[0,3.3066999999999993],[0,0]],"o":[[0,0],[0,2.8267000000000024],[-0.532999999999987,2.5600000000000023],[-1.252999999999986,2.2667],[-2.1869999999999976,1.9200000000000017],[0,0],[3.5729999999999933,-1.7332999999999998],[2.1329999999999956,-2.1066999999999965],[0.9330000000000069,-2.6666999999999987],[0,0],[0,0]],"v":[[129.265,41.32],[134.505,41.32],[133.665,49.44],[130.945,56.68],[125.745,63],[117.545,68.28],[114.745,64.08],[123.265,58.36],[127.865,51.24],[129.265,42.28],[129.265,41.32]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0.5600000000000023,-2.5867000000000004],[1.2800000000000011,-2.2667],[2.212999999999994,-1.9466999999999999],[3.280000000000001,-1.5999999999999943],[0,0],[-2.1069999999999993,2.0799999999999983],[-0.9329999999999927,2.6400000000000006],[0,3.3066999999999993],[0,0]],"o":[[0,0],[0,2.8267000000000024],[-0.532999999999987,2.5600000000000023],[-1.252999999999986,2.2667],[-2.1869999999999976,1.9200000000000017],[0,0],[3.5729999999999933,-1.7332999999999998],[2.1329999999999956,-2.1066999999999965],[0.9330000000000069,-2.6666999999999987],[0,0],[0,0]],"v":[[129.265,41.32],[134.505,41.32],[133.665,49.44],[130.945,56.68],[125.745,63],[117.545,68.28],[114.745,64.08],[123.265,58.36],[127.865,51.24],[129.265,42.28],[129.265,41.32]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0.5600000000000023,-2.5867000000000004],[1.2800000000000011,-2.2667],[2.212999999999994,-1.9466999999999999],[3.280000000000001,-1.5999999999999943],[0,0],[-2.1069999999999993,2.0799999999999983],[-0.9329999999999927,2.6400000000000006],[0,3.3066999999999993],[0,0]],"o":[[0,0],[0,2.8267000000000024],[-0.532999999999987,2.5600000000000023],[-1.252999999999986,2.2667],[-2.1869999999999976,1.9200000000000017],[0,0],[3.5729999999999933,-1.7332999999999998],[2.1329999999999956,-2.1066999999999965],[0.9330000000000069,-2.6666999999999987],[0,0],[0,0]],"v":[[129.265,41.32],[134.505,41.32],[133.665,49.44],[130.945,56.68],[125.745,63],[117.545,68.28],[114.745,64.08],[123.265,58.36],[127.865,51.24],[129.265,42.28],[129.265,41.32]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0.56,-2.59],[1.28,-2.27],[2.21,-1.95],[3.28,-1.6],[0,0],[-2.11,2.08],[-0.93,2.64],[0,3.31],[0,0]],"o":[[0,0],[0,2.83],[-0.53,2.56],[-1.25,2.27],[-2.19,1.92],[0,0],[3.57,-1.73],[2.13,-2.11],[0.93,-2.67],[0,0],[0,0]],"v":[[129.26,41.32],[134.51,41.32],[133.67,49.44],[130.95,56.68],[125.75,63],[117.55,68.28],[114.75,64.08],[123.27,58.36],[127.87,51.24],[129.26,42.28],[129.26,41.32]]}],"t":107}]}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"h":1,"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.75,41.32],[131.75,41.32],[131.75,45.56],[116.75,45.56],[116.75,41.32]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.745,41.32],[131.745,41.32],[131.745,45.56],[116.745,45.56],[116.745,41.32]]}],"t":1},{"o":{"x":0,"y":0},"i":{"x":1.42,"y":1.42},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.745,41.32],[131.745,41.32],[131.745,45.56],[116.745,45.56],[116.745,41.32]]}],"t":49},{"o":{"x":1.42,"y":1.42},"i":{"x":0.82,"y":0.82},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.745,41.32],[131.745,41.32],[131.745,45.56],[116.745,45.56],[116.745,41.32]]}],"t":57.21328469685146},{"o":{"x":0.82,"y":0.82},"i":{"x":1.07,"y":1.07},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.745,41.32],[131.745,41.32],[131.745,45.56],[116.745,45.56],[116.745,41.32]]}],"t":65.42656939370292},{"o":{"x":1.07,"y":1.07},"i":{"x":0.97,"y":0.97},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.745,41.32],[131.745,41.32],[131.745,45.56],[116.745,45.56],[116.745,41.32]]}],"t":73.63985409055437},{"o":{"x":0.97,"y":0.97},"i":{"x":1.01,"y":1.01},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.745,41.32],[131.745,41.32],[131.745,45.56],[116.745,45.56],[116.745,41.32]]}],"t":81.85313878740584},{"o":{"x":1.01,"y":1.01},"i":{"x":0.99,"y":0.99},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.745,41.32],[131.745,41.32],[131.745,45.56],[116.745,45.56],[116.745,41.32]]}],"t":90.06642348425729},{"o":{"x":0.99,"y":0.99},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.745,41.32],[131.745,41.32],[131.745,45.56],[116.745,45.56],[116.745,41.32]]}],"t":98.27970818110875},{"o":{"x":1,"y":1},"i":{"x":1,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.745,41.32],[131.745,41.32],[131.745,45.56],[116.745,45.56],[116.745,41.32]]}],"t":106.4929928779602},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[116.75,41.32],[131.75,41.32],[131.75,45.56],[116.75,45.56],[116.75,41.32]]}],"t":107}]}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0,0,0]},"r":1,"o":{"a":0,"k":100}}],"ind":5},{"ty":4,"nm":"Frame 95 Bg","sr":1,"st":0,"op":107.55,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[150,150]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[150,150]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[300,0],[300,300],[0,300],[0,0]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}}],"ind":6}],"v":"5.7.0","fr":60,"op":106.55,"ip":0,"assets":[{"id":"0a224e8e34eadd0e46bc2059027a2254cd08e303","e":1,"w":1024,"h":1024,"p":"data:image/png;base64,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","u":""}]} \ No newline at end of file diff --git a/Prototype/Prototype/Prototype/ApplyDesign/Resources/PNG/character_close.png b/Prototype/Prototype/Prototype/ApplyDesign/Resources/PNG/character_close.png new file mode 100644 index 00000000..c6bf8e0b Binary files /dev/null and b/Prototype/Prototype/Prototype/ApplyDesign/Resources/PNG/character_close.png differ diff --git a/Prototype/Prototype/Prototype/ApplyDesign/Resources/PNG/character_idle.png b/Prototype/Prototype/Prototype/ApplyDesign/Resources/PNG/character_idle.png new file mode 100644 index 00000000..d4839e06 Binary files /dev/null and b/Prototype/Prototype/Prototype/ApplyDesign/Resources/PNG/character_idle.png differ diff --git a/Prototype/Prototype/Prototype/ApplyDesign/Resources/PNG/character_smile.png b/Prototype/Prototype/Prototype/ApplyDesign/Resources/PNG/character_smile.png new file mode 100644 index 00000000..72b37fe5 Binary files /dev/null and b/Prototype/Prototype/Prototype/ApplyDesign/Resources/PNG/character_smile.png differ diff --git a/Prototype/Prototype/Prototype/ApplyDesign/Resources/sample_character_3D.usdz b/Prototype/Prototype/Prototype/ApplyDesign/Resources/sample_character_3D.usdz new file mode 100644 index 00000000..34223b78 Binary files /dev/null and b/Prototype/Prototype/Prototype/ApplyDesign/Resources/sample_character_3D.usdz differ diff --git a/Prototype/Prototype/Prototype/Assets.xcassets/AccentColor.colorset/Contents.json b/Prototype/Prototype/Prototype/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..eb878970 --- /dev/null +++ b/Prototype/Prototype/Prototype/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Prototype/Prototype/Prototype/Assets.xcassets/AppIcon.appiconset/Contents.json b/Prototype/Prototype/Prototype/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..23058801 --- /dev/null +++ b/Prototype/Prototype/Prototype/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Prototype/Prototype/Prototype/Assets.xcassets/Contents.json b/Prototype/Prototype/Prototype/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Prototype/Prototype/Prototype/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/Contents.json b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/Contents.json b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/Contents.json new file mode 100644 index 00000000..8e9b4dc0 --- /dev/null +++ b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "bokeh.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/bokeh.png b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/bokeh.png new file mode 100644 index 00000000..c6805516 Binary files /dev/null and b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/bokeh.png differ diff --git a/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/Contents.json b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/Contents.json new file mode 100644 index 00000000..5fdc9eae --- /dev/null +++ b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "spark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/spark.png b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/spark.png new file mode 100644 index 00000000..3383a218 Binary files /dev/null and b/Prototype/Prototype/Prototype/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/spark.png differ diff --git a/Prototype/Prototype/Prototype/ContentView.swift b/Prototype/Prototype/Prototype/ContentView.swift new file mode 100644 index 00000000..1a37bde4 --- /dev/null +++ b/Prototype/Prototype/Prototype/ContentView.swift @@ -0,0 +1,41 @@ +// +// ContentView.swift +// Prototype +// +// Created by SeoJunYoung on 12/16/25. +// + +import SwiftUI +import SpriteKit + +struct ContentView: View { + let gameSceme: SKScene = { + let scene = StackGameScene() + scene.scaleMode = .resizeFill + return scene + }() + + var body: some View { + NavigationStack { + List { + NavigationLink("물리 엔진 검증") { + SpriteView(scene: gameSceme) + .ignoresSafeArea() + } + NavigationLink("자이로 센서 검증") { + MotionView() + } + NavigationLink("탭 이벤트 검증") { + VarifyTapEventCalculationView() + } + NavigationLink("디자인 리소스 적용 검증") { + ApplyDesignResourceView() + } + } + } + } +} + +#Preview { + ContentView() +} diff --git a/Prototype/Prototype/Prototype/Motion/Motion.swift b/Prototype/Prototype/Prototype/Motion/Motion.swift new file mode 100644 index 00000000..7194b258 --- /dev/null +++ b/Prototype/Prototype/Prototype/Motion/Motion.swift @@ -0,0 +1,181 @@ +// +// Motion.swift +// Prototype +// +// Created by 김성훈 on 12/17/25. +// + +import SwiftUI + +struct MotionView: View { + private enum Texts { + static let descriptionTitle = "Description" + static let descriptionContent = "기기를 기울여 Core Motion 변화를 확인합니다. 실기기에서만 테스트할 수 있습니다." + + static let selectedSensorTitle = "사용할 센서 값" + static let calibratedGravityX = "보정된 gravityX 입력값" + static let unselectedSensorTitle = "측정 센서 값들" + + static let gravityX = "gravityX" + static let gravityY = "gravityY" + static let gravityZ = "gravityZ" + + static let roll = "좌우 기울기(Roll)" + static let pitch = "앞뒤 기울기(Pitch)" + static let yaw = "수평 회전(Yaw)" + + static let rotationRateRoll = "Roll 속도" + static let rotationRatePitch = "Pitch 속도" + static let rotationRateYaw = "Yaw 속도" + + static let accelerationX = "가속도(x)" + static let accelerationY = "가속도(y)" + static let accelerationZ = "가속도(z)" + + static let recalibrateButton = "센서 초기값 다시 설정하기" + static let character = "캐릭터" + } + + @State private var motionManager = MotionManager() + + var body: some View { + VStack(alignment: .leading, spacing: 10) { + + // 1. Description + VStack(alignment: .leading, spacing: 20) { + Text(Texts.descriptionTitle) + .font(.title2) + Text(Texts.descriptionContent) + } + + Divider() + + // 2. 선택에 적합한 센서 값 + VStack(alignment: .leading, spacing: 5) { + Text(Texts.selectedSensorTitle) + .font(.title2) + .bold() + + HStack { + Text(Texts.calibratedGravityX) + Spacer() + Text(String(format: "%.3f", motionManager.calibratedGravityX)) + .foregroundStyle(.blue) + .bold() + } + } + + Divider() + + // 3. 측정한 센서 값 + VStack(alignment: .leading, spacing: 5) { + Text(Texts.unselectedSensorTitle) + .font(.title2) + .bold() + + // Gravity + HStack { + Text(Texts.gravityX) + Spacer() + Text(String(format: "%.3f", motionManager.gravityX)) + .foregroundStyle(abs(motionManager.gravityX) > 0.7 ? .red : .primary) + } + HStack { + Text(Texts.gravityY) + Spacer() + Text(String(format: "%.3f", motionManager.gravityY)) + } + HStack { + Text(Texts.gravityZ) + Spacer() + Text(String(format: "%.3f", motionManager.gravityZ)) + } + + // 기울기 + HStack { + Text(Texts.roll) + Spacer() + Text(String(format: "%.3f", motionManager.roll)) + } + HStack { + Text(Texts.pitch) + Spacer() + Text(String(format: "%.3f", motionManager.pitch)) + } + HStack { + Text(Texts.yaw) + Spacer() + Text(String(format: "%.3f", motionManager.yaw)) + } + + // 회전 속도 + HStack { + Text(Texts.rotationRateRoll) + Spacer() + Text(String(format: "%.3f", motionManager.rotationY)) + } + HStack { + Text(Texts.rotationRatePitch) + Spacer() + Text(String(format: "%.3f", motionManager.rotationX)) + } + HStack { + Text(Texts.rotationRateYaw) + Spacer() + Text(String(format: "%.3f", motionManager.rotationZ)) + } + + // 가속도 + HStack { + Text(Texts.accelerationX) + Spacer() + Text(String(format: "%.3f", motionManager.userAccelX)) + } + HStack { + Text(Texts.accelerationY) + Spacer() + Text(String(format: "%.3f", motionManager.userAccelY)) + } + HStack { + Text(Texts.accelerationZ) + Spacer() + Text(String(format: "%.3f", motionManager.userAccelZ)) + } + } + + Divider() + + // 4. 초기화 버튼 + Button(Texts.recalibrateButton) { + motionManager.recalibrate() + } + .buttonStyle(.bordered) + .frame(maxWidth: .infinity) + .disabled(!motionManager.isCalibratable) + + if !motionManager.isCalibratable { + Text("기기가 너무 기울어져서 재설정할 수 없습니다.") + .font(.caption) + .foregroundStyle(.red) + } + + Spacer() + + // 5. 캐릭터 + VStack { + Rectangle() + .fill(.gray) + .frame(width: 40, height: 40) + Text(Texts.character) + .font(.caption) + } + .offset(x: motionManager.characterX, y: 0) + .frame(maxWidth: .infinity) + } + .padding() + } +} + +#Preview { + MotionView() +} diff --git a/Prototype/Prototype/Prototype/Motion/MotionManager.swift b/Prototype/Prototype/Prototype/Motion/MotionManager.swift new file mode 100644 index 00000000..147e5335 --- /dev/null +++ b/Prototype/Prototype/Prototype/Motion/MotionManager.swift @@ -0,0 +1,89 @@ +// +// MotionManager.swift +// Prototype +// +// Created by 최범수 on 2025-12-18. +// + +import CoreMotion + +@Observable +class MotionManager { + private let motionManager = CMMotionManager() + + // 설정값 + private let updateInterval = 1.0 / 60.0 // 주사율 16.67 ms + private let threshold: Double = 0.05 // 데드존 (무반응 구간) + private let movementSpeed: CGFloat = 1000.0 // 곱할 속도 (민감도) + private let calibrationLimit: Double = 0.7 // 보정 허용 범위 + private var baselineGravityX: Double = 0 // 사용자 기준점 (0점) + + // View에서 사용할 데이터들 + var gravityX: Double = 0 + var gravityY: Double = 0 + var gravityZ: Double = 0 + var roll: Double = 0 + var pitch: Double = 0 + var yaw: Double = 0 + var userAccelX: Double = 0 + var userAccelY: Double = 0 + var userAccelZ: Double = 0 + var rotationX: Double = 0 + var rotationY: Double = 0 + var rotationZ: Double = 0 + var characterX: CGFloat = 0 + var calibratedGravityX: Double = 0 + var isCalibratable: Bool = true + + init() { startMotionUpdates() } + deinit { motionManager.stopDeviceMotionUpdates() } + + func startMotionUpdates() { + guard motionManager.isDeviceMotionAvailable else { return } + motionManager.deviceMotionUpdateInterval = updateInterval + + motionManager.startDeviceMotionUpdates(to: .main) { [weak self] motion, error in + guard let self = self, let motion = motion else { return } + + self.gravityX = motion.gravity.x + self.gravityY = motion.gravity.y + self.gravityZ = motion.gravity.z + + // 라디안 -> 각도 변환 + self.roll = motion.attitude.roll * 180 / .pi + self.pitch = motion.attitude.pitch * 180 / .pi + self.yaw = motion.attitude.yaw * 180 / .pi + + self.userAccelX = motion.userAcceleration.x + self.userAccelY = motion.userAcceleration.y + self.userAccelZ = motion.userAcceleration.z + + self.rotationX = motion.rotationRate.x + self.rotationY = motion.rotationRate.y + self.rotationZ = motion.rotationRate.z + + self.isCalibratable = abs(motion.gravity.x) <= self.calibrationLimit + + // 보정 및 클램핑 (-1.0 ~ 1.0 으로 보정) + let rawInput = motion.gravity.x - self.baselineGravityX + let clampedInput = max(-1.0, min(1.0, rawInput)) + self.calibratedGravityX = clampedInput + + // 캐릭터 이동 + if abs(clampedInput) > self.threshold { + self.characterX += CGFloat(clampedInput) * self.movementSpeed * CGFloat(self.updateInterval) + + // 화면 밖 방지 + let screenLimit: CGFloat = 150 + self.characterX = max(-screenLimit, min(screenLimit, self.characterX)) + } + } + } + + func recalibrate() { + if abs(self.gravityX) <= self.calibrationLimit { + self.baselineGravityX = self.gravityX + self.characterX = 0 + } + } +} diff --git a/Prototype/Prototype/Prototype/PrototypeApp.swift b/Prototype/Prototype/Prototype/PrototypeApp.swift new file mode 100644 index 00000000..d6e69dfa --- /dev/null +++ b/Prototype/Prototype/Prototype/PrototypeApp.swift @@ -0,0 +1,17 @@ +// +// PrototypeApp.swift +// Prototype +// +// Created by SeoJunYoung on 12/16/25. +// + +import SwiftUI + +@main +struct PrototypeApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/Prototype/Prototype/Prototype/StackGame/BlockNode.swift b/Prototype/Prototype/Prototype/StackGame/BlockNode.swift new file mode 100644 index 00000000..2f07217c --- /dev/null +++ b/Prototype/Prototype/Prototype/StackGame/BlockNode.swift @@ -0,0 +1,42 @@ +// +// BlockNode.swift +// Prototype +// +// Created by 최범수 on 2025-12-18. +// + +import SpriteKit + +final class BlockNode: SKSpriteNode { + private var action: SKAction? + + init(size: CGSize, color: UIColor) { + super.init(texture: nil, color: color, size: size) + self.name = "block" + } + + required init?(coder aDecoder: NSCoder) { + return nil + } + + func startMoving(distance: CGFloat) { + let duration = Double.random(in: 0.5...1.5) + let moveRight = SKAction.moveBy(x: distance, y: 0, duration: duration) + let moveLeft = SKAction.moveBy(x: -distance, y: 0, duration: duration) + let sequence = SKAction.sequence([moveRight, moveLeft]) + let repeatAction = SKAction.repeatForever(sequence) + self.action = repeatAction + self.run(repeatAction) + } + + func stopMoving() { + self.removeAllActions() + } + + func enableGravity() { + self.physicsBody = SKPhysicsBody(rectangleOf: self.size) + self.physicsBody?.isDynamic = true + self.physicsBody?.allowsRotation = true + self.physicsBody?.mass = 1 + } +} diff --git a/Prototype/Prototype/Prototype/StackGame/StackGameScene.swift b/Prototype/Prototype/Prototype/StackGame/StackGameScene.swift new file mode 100644 index 00000000..7d50b7c9 --- /dev/null +++ b/Prototype/Prototype/Prototype/StackGame/StackGameScene.swift @@ -0,0 +1,259 @@ +// +// StackGameScene.swift +// Prototype +// +// Created by 최범수 on 2025-12-17. +// + +import SpriteKit + +final class StackGameScene: SKScene { + private var isBlockProcessing: Bool = false + private var currentBlock: BlockNode? + private var previousBlock: BlockNode? + private var blocks: [BlockNode] = [] + + private let blockSize = CGSize(width: 80, height: 40) + private let blockColors: [UIColor] = [ + .systemRed, .systemBlue, .systemGreen, .systemYellow, + .systemPurple, .systemOrange, .systemPink, .systemTeal + ] + + private var score: Int = 0 + private var currentHeight: CGFloat = 40 + + private let scoreLabel: SKLabelNode = { + let label = SKLabelNode(fontNamed: "Chalkduster") + label.fontSize = 40 + label.fontColor = .black + label.text = 0.description + return label + }() + + override func didMove(to view: SKView) { + self.backgroundColor = .white + setupGravity() + setupGround() + setupCamera() + startGame() + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + guard currentBlock != nil, + !isBlockProcessing + else { return } + + dropBlock() + } + + private func setupGravity() { + self.physicsWorld.gravity = CGVector(dx: 0, dy: -9.8) + } + + private func setupGround() { + let size = CGSize(width: frame.size.width, height: 10) + let ground = SKSpriteNode(color: .gray, size: size) + ground.position = CGPoint(x: frame.midX, y: 0) + ground.physicsBody = SKPhysicsBody(rectangleOf: size) + ground.physicsBody?.isDynamic = false + self.addChild(ground) + } + + private func setupCamera() { + let cameraNode = SKCameraNode() + cameraNode.position = CGPoint(x: frame.midX, y: frame.midY) + cameraNode.addChild(scoreLabel) + addChild(cameraNode) + self.camera = cameraNode + } + + private func startGame() { + isBlockProcessing = false + blocks.removeAll() + score = 0 + currentHeight = 40 + + blocks.forEach { $0.removeFromParent() } + blocks.removeAll() + + camera?.position = CGPoint(x: frame.midX, y: frame.midY) + + putInitialBlock() + + spawnBlock() + } + + private func putInitialBlock() { + let firstBlock = BlockNode(size: blockSize, color: .gray) + firstBlock.physicsBody = SKPhysicsBody(rectangleOf: blockSize) + firstBlock.physicsBody?.isDynamic = false + firstBlock.position = CGPoint(x: frame.midX, y: currentHeight) + + previousBlock = firstBlock + currentHeight += firstBlock.size.height + addChild(firstBlock) + blocks.append(firstBlock) + } + + private func spawnBlock() { + isBlockProcessing = false + + let color = blockColors[score % blockColors.count] + let block = BlockNode(size: blockSize, color: color) + + let spawnY = (camera?.position.y ?? frame.midY) + frame.height / 2 - 100 + let leftEdge = blockSize.width / 2 + let rightEdge = frame.width - blockSize.width / 2 + + block.position = CGPoint(x: leftEdge, y: spawnY) + block.startMoving(distance: rightEdge - leftEdge) + + currentBlock = block + addChild(block) + } + + private func dropBlock() { + guard let block = currentBlock, + !isBlockProcessing + else { return } + + isBlockProcessing = true + + block.stopMoving() + block.enableGravity() + + evaluateBlock() + } + + private func evaluateBlock() { + guard let block = currentBlock, + let previous = previousBlock + else { return } + + let targetY = previous.position.y + previous.size.height + + if block.position.y <= targetY + blockSize.height { + checkAlignment() + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { [weak self] in + self?.evaluateBlock() + } + } + } + + private func checkAlignment() { + guard let current = currentBlock, + let previous = previousBlock + else { return } + + let previousLeft = previous.position.x - previous.size.width / 2 + let previousRight = previous.position.x + previous.size.width / 2 + let previousRange = previousLeft...previousRight + + if previousRange.contains(current.position.x) { + placeBlockSuccess() + } else { + placeBlockFail() + } + } + private func placeBlockSuccess() { + guard let block = currentBlock else { return } + + block.physicsBody?.isDynamic = false + block.position = CGPoint(x: block.position.x, y: currentHeight) + + score += 1 + scoreLabel.text = score.description + + showSuccessParticle(at: block.position) + + playSuccessSound() + + blocks.append(block) + previousBlock = block + currentHeight += blockSize.height + + let moveCamera = SKAction.moveBy(x: 0, y: blockSize.height, duration: 0.3) + moveCamera.timingMode = .easeInEaseOut + camera?.run(moveCamera) + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in + self?.spawnBlock() + } + } + + private func placeBlockFail() { + guard let block = currentBlock, + let previous = previousBlock + else { return } + + score = max(0, score - 5) + scoreLabel.text = score.description + + block.physicsBody?.isDynamic = true + block.physicsBody?.allowsRotation = true + block.physicsBody?.restitution = 0.3 + block.physicsBody?.friction = 0.7 + + let targetY = previous.position.y + previous.size.height + block.position.y = targetY + 5 + + showFailureParticle(at: block.position) + + playFailureSound() + + DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { [weak self] in + block.removeFromParent() + self?.spawnBlock() + } + } + + private func showSuccessParticle(at position: CGPoint) { + let emitter = SKEmitterNode() + emitter.particleTexture = SKTexture(imageNamed: "spark") + emitter.particleBirthRate = 200 + emitter.numParticlesToEmit = 50 + emitter.particleLifetime = 1.0 + emitter.emissionAngle = 0 + emitter.emissionAngleRange = .pi * 2 + emitter.particleSpeed = 100 + emitter.particleSpeedRange = 50 + emitter.particleScale = 0.3 + emitter.particleScaleRange = 0.2 + emitter.particleAlpha = 1.0 + emitter.particleAlphaSpeed = -1.0 + emitter.particleColorBlendFactor = 1.0 + emitter.particleColor = .systemYellow + emitter.position = position + + addChild(emitter) + } + + private func showFailureParticle(at position: CGPoint) { + let emitter = SKEmitterNode() + emitter.particleTexture = SKTexture(imageNamed: "bokeh") + emitter.particleBirthRate = 100 + emitter.numParticlesToEmit = 30 + emitter.particleLifetime = 1.5 + emitter.emissionAngle = 0 + emitter.emissionAngleRange = .pi * 2 + emitter.particleSpeed = 50 + emitter.particleSpeedRange = 30 + emitter.particleScale = 0.5 + emitter.particleScaleRange = 0.3 + emitter.particleAlpha = 0.8 + emitter.particleAlphaSpeed = -0.5 + emitter.particleColor = .red + emitter.position = position + + addChild(emitter) + } + + private func playSuccessSound() { + run(SKAction.playSoundFileNamed("success.wav", waitForCompletion: false)) + } + + private func playFailureSound() { + run(SKAction.playSoundFileNamed("failure.wav", waitForCompletion: false)) + } +} diff --git a/Prototype/Prototype/Prototype/StackGame/failure.wav b/Prototype/Prototype/Prototype/StackGame/failure.wav new file mode 100644 index 00000000..22275ad3 Binary files /dev/null and b/Prototype/Prototype/Prototype/StackGame/failure.wav differ diff --git a/Prototype/Prototype/Prototype/StackGame/success.wav b/Prototype/Prototype/Prototype/StackGame/success.wav new file mode 100644 index 00000000..20f8bff2 Binary files /dev/null and b/Prototype/Prototype/Prototype/StackGame/success.wav differ diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Currency.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Currency.swift new file mode 100644 index 00000000..56ff9d3c --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Currency.swift @@ -0,0 +1,37 @@ +// +// Currency.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +/// 게임 내 화폐 시스템을 위한 공통 프로토콜 +protocol Currency: AnyObject { + /// 화폐 수량의 타입 + associatedtype Value: SignedNumeric & Comparable + + /// 현재 보유 중인 화폐 수량 + var amount: Value { get set } + + /// 지정된 수량만큼 화폐를 획득합니다. + /// - Parameter value: 획득할 화폐 수량 + func earn(_ value: Value) + + /// 지정된 수량만큼 화폐를 소비합니다. + /// - Parameter value: 소비할 화폐 수량 + /// - Returns: 소비 성공 시 `true`, 잔액 부족 시 `false` + @discardableResult + func spend(_ value: Value) -> Bool +} + +extension Currency { + func earn(_ value: Value) { + amount += value + } + + func spend(_ value: Value) -> Bool { + guard amount >= value else { return false } + amount -= value + return true + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Diamond.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Diamond.swift new file mode 100644 index 00000000..2d4e39e2 --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Diamond.swift @@ -0,0 +1,14 @@ +// +// Diamond.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +final class Diamond: Currency { + var amount: Int32 + + init(amount: Int32) { + self.amount = amount + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Money.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Money.swift new file mode 100644 index 00000000..ef326027 --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Money.swift @@ -0,0 +1,14 @@ +// +// Money.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +final class Money: Currency { + var amount: Double + + init(amount: Double) { + self.amount = amount + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Wallet.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Wallet.swift new file mode 100644 index 00000000..6091da5b --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Currency/Wallet.swift @@ -0,0 +1,16 @@ +// +// Wallet.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +final class Wallet { + private(set) var money: Money + private(set) var diamond: Diamond + + init(money: Money, diamond: Diamond) { + self.money = money + self.diamond = diamond + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Item/ConsumableItem.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Item/ConsumableItem.swift new file mode 100644 index 00000000..7aa0684b --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Item/ConsumableItem.swift @@ -0,0 +1,26 @@ +// +// ConsumableItem.swift +// Prototype +// +// Created by SeoJunYoung on 12/18/25. +// + +import Foundation + +/// 소비 가능한 아이템 +final class ConsumableItem { + /// 아이템 이름 + let name: String + + /// 효과 지속 시간 (초) + let duration: TimeInterval + + /// 보상 배율 + let multiplier: Double + + init(name: String, duration: TimeInterval, multiplier: Double) { + self.name = name + self.duration = duration + self.multiplier = multiplier + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Item/Inventory.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Item/Inventory.swift new file mode 100644 index 00000000..3c25063c --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Item/Inventory.swift @@ -0,0 +1,41 @@ +// +// Inventory.swift +// Prototype +// +// Created by SeoJunYoung on 12/18/25. +// + +/// 아이템 인벤토리 +final class Inventory { + /// 보유한 아이템과 개수 [아이템 이름: 개수] + private(set) var items: [String: Int] = [:] + + /// 특정 아이템을 추가합니다. + /// - Parameters: + /// - item: 추가할 아이템 + /// - count: 추가할 개수 (기본값: 1) + func add(item: ConsumableItem, count: Int = 1) { + let currentCount = items[item.name] ?? 0 + items[item.name] = currentCount + count + } + + /// 특정 아이템을 사용합니다. + /// - Parameter item: 사용할 아이템 + /// - Returns: 사용 성공 시 `true`, 아이템이 없는 경우 `false` + @discardableResult + func use(item: ConsumableItem) -> Bool { + guard let currentCount = items[item.name], currentCount > 0 else { + return false + } + + items[item.name] = currentCount - 1 + return true + } + + /// 특정 아이템의 보유 개수를 반환합니다. + /// - Parameter item: 확인할 아이템 + /// - Returns: 보유 개수 + func count(of item: ConsumableItem) -> Int { + items[item.name] ?? 0 + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Policy.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Policy.swift new file mode 100644 index 00000000..d12f9f92 --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Policy.swift @@ -0,0 +1,57 @@ +// +// Policy.swift +// Prototype +// +// Created by SeoJunYoung on 12/18/25. +// + +struct Policy { + + /// 스킬 강화별 가중치 [스킬이름 : 레벨 : 가중치] + static let skillUpgradeWeights: [String: [Int: Int]] = [ + "웹 개발 초급": [ + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + 10: 10 + ], + "웹 개발 중급": [ + 1: 5, + 2: 10, + 3: 15, + 4: 20, + 5: 25, + 6: 30, + 7: 35, + 8: 40, + 9: 45, + 10: 50 + ], + "웹 개발 고급": [ + 1: 10, + 2: 20, + 3: 30, + 4: 40, + 5: 50, + 6: 60, + 7: 70, + 8: 80, + 9: 90, + 10: 100 + ] + ] + + /// 피버 단계별 배율 [단계 : 배율] + static let feverMultipliers: [Int: Double] = [ + 0: 1.0, // 기본 (가중치 없음) + 1: 1.2, // 20% 증가 + 2: 1.5, // 50% 증가 + 3: 2.0 // 100% 증가 (2배) + ] +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/RewardCalculator.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/RewardCalculator.swift new file mode 100644 index 00000000..a8017fd8 --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/RewardCalculator.swift @@ -0,0 +1,45 @@ +// +// RewardCalculator.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +struct RewardCalculator { + private let user: User + private let feverSystem: FeverSystem + private let buffSystem: BuffSystem + + init(user: User, feverSystem: FeverSystem, buffSystem: BuffSystem) { + self.user = user + self.feverSystem = feverSystem + self.buffSystem = buffSystem + } + + /// 탭 당 획득 가능한 재산을 계산합니다. + /// - Returns: 탭 당 재산 + func calculateMoneyPerTap() async -> Double { + let skillLevels = await user.skillSet.currentSkillLevels + let weights = Policy.skillUpgradeWeights + + var totalWeight = 0 + + for (skillName, level) in skillLevels { + guard + let skillWeights = weights[skillName], + let weight = skillWeights[level] + else { + continue + } + + totalWeight += weight + } + + // 기본 값에 스킬 가중치를 더하고 피버 배율, 버프 배율 적용 + let baseAmount = Double(totalWeight) + let feverMultiplier = feverSystem.getCurrentMultiplier() + let buffMultiplier = buffSystem.currentMultiplier + + return baseAmount * feverMultiplier * buffMultiplier + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Skill/Skill.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Skill/Skill.swift new file mode 100644 index 00000000..4511fd39 --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Skill/Skill.swift @@ -0,0 +1,20 @@ +// +// Skill.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +/// 게임 내 스킬 시스템을 위한 공통 구조체 +final class Skill { + /// 스킬 이름 + var title: String + + /// 최대 업그레이드 레벨 + var maxUpgradeLevel: Int + + init(title: String, maxUpgradeLevel: Int) { + self.title = title + self.maxUpgradeLevel = maxUpgradeLevel + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Skill/SkillSet.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Skill/SkillSet.swift new file mode 100644 index 00000000..7c634d1f --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/Skill/SkillSet.swift @@ -0,0 +1,65 @@ +// +// SkillSet.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +/// 사용자가 보유한 스킬들을 관리하는 구조체 +final class SkillSet { + /// 스킬 이름을 키로, 현재 레벨을 값으로 가지는 딕셔너리 + private(set) var currentSkillLevels: [String: Int] = [:] + + /// 특정 스킬의 레벨을 1 증가시킵니다. + /// - Parameter skill: 업그레이드할 스킬 + /// - Returns: 업그레이드 성공 시 `true`, 최대 레벨 도달 시 `false` + @discardableResult + func upgrade(skill: Skill) -> Bool { + let currentLevel = currentSkillLevels[skill.title] ?? 0 + + guard currentLevel < skill.maxUpgradeLevel else { + return false + } + + currentSkillLevels[skill.title] = currentLevel + 1 + return true + } + + /// 특정 스킬의 레벨을 1 감소시킵니다. + /// - Parameter skill: 다운그레이드할 스킬 + /// - Returns: 다운그레이드 성공 시 `true`, 레벨이 0이거나 스킬을 보유하지 않은 경우 `false` + @discardableResult + func downgrade(skill: Skill) -> Bool { + let currentLevel = currentSkillLevels[skill.title] ?? 0 + + guard currentLevel > 0 else { + return false + } + + currentSkillLevels[skill.title] = currentLevel - 1 + return true + } +} + +private extension SkillSet { + /// 특정 스킬의 현재 레벨을 반환합니다. + /// - Parameter skill: 레벨을 확인할 스킬 + /// - Returns: 현재 레벨 (보유하지 않은 스킬은 0) + func level(of skill: Skill) -> Int { + currentSkillLevels[skill.title] ?? 0 + } + + /// 특정 스킬을 보유하고 있는지 확인합니다. + /// - Parameter skill: 확인할 스킬 + /// - Returns: 보유 여부 + func hasSkill(_ skill: Skill) -> Bool { + currentSkillLevels[skill.title] != nil + } + + /// 특정 스킬이 최대 레벨에 도달했는지 확인합니다. + /// - Parameter skill: 확인할 스킬 + /// - Returns: 최대 레벨 도달 여부 + func isMaxLevel(skill: Skill) -> Bool { + level(of: skill) >= skill.maxUpgradeLevel + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/System/BuffSystem.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/System/BuffSystem.swift new file mode 100644 index 00000000..d9a11cee --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/System/BuffSystem.swift @@ -0,0 +1,64 @@ +// +// BuffSystem.swift +// Prototype +// +// Created by SeoJunYoung on 12/18/25. +// + +import Foundation + +/// 버프 효과를 관리하는 시스템 +final class BuffSystem { + /// 현재 활성화된 버프의 배율 + private(set) var currentMultiplier: Double = 1.0 + + /// 버프 타이머 + private var buffTimer: Timer? + + /// 버프가 활성화되어 있는지 확인 + var isActive: Bool { + buffTimer != nil + } + + /// 남은 버프 시간 (초) + private(set) var remainingTime: TimeInterval = 0 + + /// 버프를 활성화합니다. + /// - Parameter item: 사용할 소비 아이템 + /// - Returns: 활성화 성공 시 `true`, 이미 버프가 활성화된 경우 `false` + @discardableResult + func activate(item: ConsumableItem) -> Bool { + // 이미 버프가 활성화되어 있으면 실패 + guard !isActive else { + return false + } + + currentMultiplier = item.multiplier + remainingTime = item.duration + + // 1초마다 남은 시간 감소 + buffTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in + guard let self = self else { return } + + self.remainingTime -= 1 + + if self.remainingTime <= 0 { + self.deactivate() + } + } + + return true + } + + /// 버프를 비활성화합니다. + func deactivate() { + buffTimer?.invalidate() + buffTimer = nil + currentMultiplier = 1.0 + remainingTime = 0 + } + + deinit { + deactivate() + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/System/FeverSystem.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/System/FeverSystem.swift new file mode 100644 index 00000000..c7d1724e --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/System/FeverSystem.swift @@ -0,0 +1,47 @@ +// +// FeverSystem.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +final class FeverSystem { + /// 현재 피버 단계 (0~3) + private(set) var currentLevel: Int = 0 + + /// 최대 피버 단계 + let maxLevel: Int = 3 + + /// 현재 피버 단계의 배율을 반환합니다. + /// - Returns: 피버 배율 + func getCurrentMultiplier() -> Double { + Policy.feverMultipliers[currentLevel] ?? 1.0 + } + + /// 피버 단계를 1 증가시킵니다. + /// - Returns: 증가 성공 시 `true`, 최대 단계 도달 시 `false` + @discardableResult + func levelUp() -> Bool { + guard currentLevel < maxLevel else { + return false + } + currentLevel += 1 + return true + } + + /// 피버 단계를 1 감소시킵니다. + /// - Returns: 감소 성공 시 `true`, 이미 0단계인 경우 `false` + @discardableResult + func levelDown() -> Bool { + guard currentLevel > 0 else { + return false + } + currentLevel -= 1 + return true + } + + /// 피버를 초기화합니다. + func reset() { + currentLevel = 0 + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/System/TapGameSystem.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/System/TapGameSystem.swift new file mode 100644 index 00000000..b059ac34 --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/System/TapGameSystem.swift @@ -0,0 +1,26 @@ +// +// TapGameSystem.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +final class TapGameSystem { + let user: User + let rewardCalculator: RewardCalculator + let feverSystem: FeverSystem + + init(user: User, rewardCalculator: RewardCalculator, feverSystem: FeverSystem) { + self.user = user + self.rewardCalculator = rewardCalculator + self.feverSystem = feverSystem + } + + /// 탭 이벤트를 수행하고 획득한 재산을 반환합니다. + /// - Returns: 탭 당 획득한 돈 + func tap() async -> Double { + let earnedMoney = await rewardCalculator.calculateMoneyPerTap() + await user.wallet.money.earn(earnedMoney) + return earnedMoney + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/User.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/User.swift new file mode 100644 index 00000000..ff4c482c --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Models/User.swift @@ -0,0 +1,27 @@ +// +// User.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +actor User { + /// 닉네임 + let nickname: String + + /// 재화 지갑 + private(set) var wallet: Wallet + + /// 유저의 스킬 목록 + private(set) var skillSet: SkillSet + + /// 아이템 인벤토리 + private(set) var inventory: Inventory + + init(nickname: String, wallet: Wallet, skillSet: SkillSet, inventory: Inventory) { + self.nickname = nickname + self.wallet = wallet + self.skillSet = skillSet + self.inventory = inventory + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Presentation/VarifyTapEventCalculationView.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Presentation/VarifyTapEventCalculationView.swift new file mode 100644 index 00000000..620c510b --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Presentation/VarifyTapEventCalculationView.swift @@ -0,0 +1,220 @@ +// +// VarifyTapEventCalculationView.swift +// Prototype +// +// Created by SeoJunYoung on 12/17/25. +// + +import SwiftUI + +fileprivate enum Constant { + enum Text { + static let description: String = """ + 클릭커 게임이 동작할 수 있는 구조를 설계 및 확인 합니다. + """ + static let descriptionSectionHeader: String = "Description" + static let currentMoneyHeader: String = "현재 재산" + static let currencyPerTapHeader: String = "탭 당 획득 재산" + static let navigationTitle: String = "탭 이벤트 연산 확인" + static let tapArea: String = "Tap Button" + } + + enum Fonts { + static let large: Font = .system(size: 30, weight: .bold) + static let title: Font = .system(size: 25, weight: .bold) + static let subTitle: Font = .system(size: 20, weight: .semibold) + static let body: Font = .system(size: 18, weight: .regular) + } + + enum Spacing { + static let section: CGFloat = 16 + } + + enum Colors { + static let primary: Color = .blue + } + + enum Size { + static let tapButtonHeight: CGFloat = 50 + } +} + +struct VarifyTapEventCalculationView: View { + @State var viewModel = VarifyTapEventCalculationViewModel() + + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: Constant.Spacing.section) { + descriptionSection + Divider() + dashBoardSection + Divider() + feverSection + Divider() + buffSection + Divider() + skillSection + Divider() + tapButton + } + .navigationTitle(Constant.Text.navigationTitle) + .navigationBarTitleDisplayMode(.inline) + .padding() + .task { + await viewModel.loadInitialData() + } + } + } + + @ViewBuilder + var descriptionSection: some View { + Text(Constant.Text.descriptionSectionHeader) + .font(Constant.Fonts.body) + Text(Constant.Text.description) + .font(Constant.Fonts.body) + } + + @ViewBuilder + var feverSection: some View { + VStack(alignment: .leading, spacing: 8) { + Text("피버 시스템") + .font(Constant.Fonts.subTitle) + + HStack { + Text("현재 단계: \(viewModel.feverLevel)") + .font(Constant.Fonts.body) + Spacer() + Text("배율: x\(String(format: "%.1f", viewModel.feverMultiplier))") + .font(Constant.Fonts.body) + .foregroundStyle(Constant.Colors.primary) + } + + HStack(spacing: 8) { + Button("단계 올리기") { + viewModel.increaseFeverLevel() + } + .buttonStyle(.bordered) + + Button("단계 내리기") { + viewModel.decreaseFeverLevel() + } + .buttonStyle(.bordered) + + Button("초기화") { + viewModel.resetFever() + } + .buttonStyle(.bordered) + } + } + } + + @ViewBuilder + var buffSection: some View { + VStack(alignment: .leading, spacing: 8) { + Text("버프 시스템 (소비 아이템)") + .font(Constant.Fonts.subTitle) + + HStack { + Text("버프 배율: x\(String(format: "%.1f", viewModel.buffMultiplier))") + .font(Constant.Fonts.body) + Spacer() + if viewModel.buffRemainingTime > 0 { + Text("남은 시간: \(Int(viewModel.buffRemainingTime))초") + .font(Constant.Fonts.body) + .foregroundStyle(.orange) + } + } + + HStack { + Text(viewModel.doubleRewardItem.name) + .font(Constant.Fonts.body) + Spacer() + Text("보유: \(viewModel.itemCounts[viewModel.doubleRewardItem.name] ?? 0)개") + .font(Constant.Fonts.body) + } + + HStack(spacing: 8) { + Button("아이템 추가") { + viewModel.addItem() + } + .buttonStyle(.bordered) + + Button("아이템 사용") { + viewModel.useItem() + } + .buttonStyle(.borderedProminent) + .disabled(viewModel.buffRemainingTime > 0) + } + } + } + + @ViewBuilder + var skillSection: some View { + VStack(alignment: .leading, spacing: 8) { + Text("스킬 업그레이드") + .font(Constant.Fonts.subTitle) + + ForEach(viewModel.availableSkills, id: \.title) { skill in + HStack { + Text(skill.title) + Spacer() + Text("Lv. \(viewModel.skillLevels[skill.title] ?? 0)") + Button("+") { + viewModel.upgradeSkill(skill) + } + .buttonStyle(.bordered) + Button("-") { + viewModel.downgradeSkill(skill) + } + .buttonStyle(.bordered) + } + } + } + } + + @ViewBuilder + var dashBoardSection: some View { + VStack(alignment: .leading, spacing: 0) { + Text(Constant.Text.currentMoneyHeader) + .font(Constant.Fonts.subTitle) + + Text(String(format: "%.0f", viewModel.currentMoney)) + .font(Constant.Fonts.large) + .foregroundStyle(Constant.Colors.primary) + } + + VStack(alignment: .leading, spacing: 0) { + Text(Constant.Text.currencyPerTapHeader) + .font(Constant.Fonts.subTitle) + + Text(String(format: "%.0f", viewModel.moneyPerTap)) + .font(Constant.Fonts.large) + .foregroundStyle(Constant.Colors.primary) + } + } + + @ViewBuilder + var tapButton: some View { + Button { + viewModel.tap() + } label: { + Text(Constant.Text.tapArea) + .font(Constant.Fonts.subTitle) + .foregroundStyle(Color.white) + .frame( + maxWidth: .infinity, + maxHeight: Constant.Size.tapButtonHeight, + alignment: .center + ) + .background(Constant.Colors.primary) + .cornerRadius(10) + } + .frame(height: Constant.Size.tapButtonHeight) + } +} + +#Preview { + NavigationStack { + VarifyTapEventCalculationView() + } +} diff --git a/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Presentation/VarifyTapEventCalculationViewModel.swift b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Presentation/VarifyTapEventCalculationViewModel.swift new file mode 100644 index 00000000..ce406610 --- /dev/null +++ b/Prototype/Prototype/Prototype/VarifyTapEventCaluation/Presentation/VarifyTapEventCalculationViewModel.swift @@ -0,0 +1,171 @@ +// +// VarifyTapEventCalculationViewModel.swift +// Prototype +// +// Created by SeoJunYoung on 12/18/25. +// + +import Observation +import Foundation + +@Observable +final class VarifyTapEventCalculationViewModel { + private let user: User + private let tapSystem: TapGameSystem + private let feverSystem: FeverSystem + private let buffSystem: BuffSystem + + // UI 상태 + var currentMoney: Double = 0 + var moneyPerTap: Double = 0 + var skillLevels: [String: Int] = [:] + var feverLevel: Int = 0 + var feverMultiplier: Double = 1.0 + var buffMultiplier: Double = 1.0 + var buffRemainingTime: TimeInterval = 0 + var itemCounts: [String: Int] = [:] + + // 사용 가능한 스킬 목록 + let availableSkills: [Skill] = [ + Skill(title: "웹 개발 초급", maxUpgradeLevel: 10), + Skill(title: "웹 개발 중급", maxUpgradeLevel: 10), + Skill(title: "웹 개발 고급", maxUpgradeLevel: 10) + ] + + // 사용 가능한 아이템 + let doubleRewardItem = ConsumableItem(name: "2배 보상 물약", duration: 30, multiplier: 2.0) + + init() { + let user = User( + nickname: "ProtoType", + wallet: .init(money: .init(amount: 0), diamond: .init(amount: 0)), + skillSet: .init(), + inventory: .init() + ) + let feverSystem = FeverSystem() + let buffSystem = BuffSystem() + + self.user = user + self.feverSystem = feverSystem + self.buffSystem = buffSystem + self.tapSystem = TapGameSystem( + user: user, + rewardCalculator: .init(user: user, feverSystem: feverSystem, buffSystem: buffSystem), + feverSystem: feverSystem + ) + } + + /// 초기 데이터 로드 + func loadInitialData() async { + await updateUIState() + } + + /// 탭 이벤트 + func tap() { + Task { + let earned = await tapSystem.tap() + await updateUIState() + print("획득한 재산: \(earned)") + } + } + + /// 스킬 업그레이드 + func upgradeSkill(_ skill: Skill) { + Task { + let success = await user.skillSet.upgrade(skill: skill) + if success { + await updateUIState() + } + } + } + + /// 스킬 다운그레이드 + func downgradeSkill(_ skill: Skill) { + Task { + let success = await user.skillSet.downgrade(skill: skill) + if success { + await updateUIState() + } + } + } + + /// 피버 레벨 증가 + func increaseFeverLevel() { + feverSystem.levelUp() + Task { + await updateUIState() + } + } + + /// 피버 레벨 감소 + func decreaseFeverLevel() { + feverSystem.levelDown() + Task { + await updateUIState() + } + } + + /// 피버 초기화 + func resetFever() { + feverSystem.reset() + Task { + await updateUIState() + } + } + + /// 아이템 추가 (검증용) + func addItem() { + Task { + await user.inventory.add(item: doubleRewardItem, count: 1) + await updateUIState() + } + } + + /// 아이템 사용 + func useItem() { + Task { + // 이미 버프가 활성화되어 있으면 사용 불가 + guard !buffSystem.isActive else { + print("이미 버프가 활성화되어 있습니다.") + return + } + + // 인벤토리에서 아이템 사용 + let hasItem = await user.inventory.use(item: doubleRewardItem) + guard hasItem else { + print("아이템이 부족합니다.") + return + } + + // 버프 활성화 + buffSystem.activate(item: doubleRewardItem) + await updateUIState() + + // 1초마다 UI 업데이트 (남은 시간 표시) + startBuffTimer() + } + } + + /// 버프 타이머 시작 + private func startBuffTimer() { + Task { + while buffSystem.isActive { + try? await Task.sleep(nanoseconds: 1_000_000_000) // 1초 + await updateUIState() + } + } + } + + /// UI 상태 업데이트 + @MainActor + private func updateUIState() async { + currentMoney = await user.wallet.money.amount + moneyPerTap = await tapSystem.rewardCalculator.calculateMoneyPerTap() + skillLevels = await user.skillSet.currentSkillLevels + feverLevel = feverSystem.currentLevel + feverMultiplier = feverSystem.getCurrentMultiplier() + buffMultiplier = buffSystem.currentMultiplier + buffRemainingTime = buffSystem.remainingTime + itemCounts[doubleRewardItem.name] = await user.inventory.count(of: doubleRewardItem) + } +} diff --git a/README.md b/README.md index c331ae98..461c3850 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,126 @@ -# iOS01-Hmm +# iOS01-Hmm (흠) 흠이 없어....그래서 흠이야 + +## 팀원 소개 +| 이름 | Sophia 김선재 | Oliver 김성훈 | Raven 서준영 | Edward 최범수 | +|:----:|:------:|:------:|:------:|:------:| +| 캠퍼 ID | S004 | S005 | S016 | S037 | +| 사진 | image |image| image | image| +| 역할 | 팀원 | 🤴🏻 팀장 | 팀원 | 팀원 | + +# 🎮 개발자 키우기 +image + +# 📝 개요 + +> `개발자 키우기`는 백수에서 시작해 월드클래스 iOS 개발자로 성장하는 시뮬레이션 게임입니다. +> + +본 프로젝트는 단순한 탭 반복 위주의 방치형 게임에서 벗어나, +iOS 기기 고유의 입력 방식과 물리 시스템을 적극 활용한 게임 경험을 목표로 기획되었습니다. +사용자는 화면 터치뿐만 아니라 기기의 기울기를 직접 조작하며 다양한 미니게임을 플레이하게 됩니다. + +게임의 핵심 루프는 **`미니게임 → 재산 획득 → 스킬/아이템/부동산 강화 → 커리어 성장 및 미션 보상`** 으로 구성되어 있으며, +플레이가 누적될수록 더 효율적인 성장 전략을 설계할 수 있도록 설계되었습니다. +이를 통해 단순한 반복이 아닌, 선택과 전략이 개입되는 성장 구조를 제공합니다. + +기술적으로는 `CoreMotion`을 활용한 기기 기울기 입력 처리와 +`SpriteKit` 물리 엔진을 활용한 오브젝트 상호작용을 통해 +iOS 기기 특유의 ‘손맛’과 직관적인 조작감을 구현했습니다. + +또한 `SwiftUI` 기반 UI 구성과 `Actor`를 활용한 동시성 제어를 통해 +게임 로직과 상태 관리를 명확히 분리하고, 안정적이고 부드러운 플레이 경험을 제공하는 것을 목표로 했습니다. + +# 🔨 실행 방법 / 최소 지원 버전 +``` +타깃을 SoloDeveloperTraining으로 설정 후 빌드합니다. +``` +``` +Minimum Deployment Target: iOS 17.0 +``` + +# ⚔️ 사용 기술 스택 + +| 구분 | 스택 | +|---|---| +| **Language** | Swift 6.0 | +| **UI** | SwiftUI, Observable | +| **Framework** | CoreMotion, SpriteKit | +| **Async** | Swift Concurrency | +| **Tools** | SwiftLint | +| **CI/CD** | Github Actions | + +# 🦿 프로젝트 구조 +``` +SoloDeveloperTraining/ + ├── Prototype/ # 프로토타입 프로젝트 + └── SoloDeveloperTraining/ # 메인 프로젝트 + ├── SoloDeveloperTraining.xcodeproj + └── SoloDeveloperTraining/ + │ + ├── App/ # 앱 진입점 (AppDelegate, SceneDelegate 등) + │ + ├── DesignSystem/ # 디자인 시스템 + │ + ├── Extensions/ # Swift 확장 기능 + │ + ├── GameCore/ # 게임 핵심 로직 + │ └── Models/ + │ ├── Games/ # 미니게임 + │ ├── Items/ # 아이템 모델 + │ ├── Storages/ # 저장소 모델 + │ ├── Systems/ # 게임 시스템 + │ └── User/ # 유저 관련 + │ + ├── Production/ # 프로덕션 코드 + │ ├── Data/ # 데이터 레이어 + │ ├── Error/ # 에러 처리 + │ ├── FeedbackSystem/ # 피드백 시스템 (햅틱, 사운드 등) + │ ├── Presentation/ # UI 레이어 + │ └── Utility/ # 유틸리티 함수들 + │ + ├── Development/ # 개발용 코드 + │ └── Presentation/ # 개발용 UI + │ + └── Resources/ # 리소스 파일 + ├── Assets.xcassets/ # 이미지, 컬러 에셋 + ├── Audio/ # 오디오 파일 + └── Fonts/ # 폰트 파일 +``` +# 🚀 주요 기능 + +## 1. 커리어 성장 시스템 +- **9단계 커리어 등급** + - **`백수 → 노트북 보유자 → 개발자 지망생 → ... → 월드클래스 개발자`** +- **누적 재산 기반 자동 승급**: 플레이하며 자연스럽게 성장하는 시스템입니다. +- **등급별 콘텐츠 해금**: 새로운 미니게임 모드와 강화 콘텐츠를 해금할 수 있습니다. + +## 2. 4가지 미니게임 +| 코드짜기 | 언어 맞추기 | 버그 피하기 | 데이터 쌓기 | +| --- | --- | --- | --- | +|image|image|image|image| +| 반복적인 화면 터치(탭)를 통해 재산을 획득할 수 있습니다. | 올바른 언어 아이콘을 매칭 터치하여 재산을 획득할 수 있습니다. | CoreMotion 자이로 센서를 활용하여 기기 기울여 재산을 획득할 수 있습니다. | SpriteKit 물리 엔진을 기반으로 타이밍에 맞춰 터치하여 재산을 획득할 수 있습니다. | + +## 3. 피버 시스템 +- **3단계 피버 게이지**: 0~300%까지 노란색 → 주황색 → 빨간색으로 시각화 했습니다. +- **단계별 배율**: 100% 도달 시 x배, 200% 도달 시 y배, 300% 도달 시 z배 획득 할 수 있습니다. +- **게이지 변화**: 액션 성공 시 증가하고, n초마다 자동 감소합니다. + +| 0단계 | 1단계 | 2단계 | 3단계 | +| --- | --- | --- | --- | +|image|image|image|image| + + +## 4. 경제 시스템 + +| 스킬| 아이템 | 부동산 | +| --- | --- | --- | +|image|image|image| +| - 업무 4개 모드마다 초급/중급/고급의 스킬이 존재합니다.
- 레벨이 올라갈수록 각 업무의 액션 재산이 증가합니다. | - 커피, 박하스로 일시적 버프 효과를 획득합니다.
- 키보드, 마우스, 모니터, 의자 각각의 8등급의 강화 시스템이 존재합니다.
- 등급이 높아질수록 강화 성공 확률이 감소합니다. | - 길바닥 → 반지하 → … → 펜트하우스의 등급이 존재합니다.
- 배경을 변경할 수 있고, 부동산은 하나만 소유 가능합니다.| + + +## 5. 부가 콘텐츠 +| 퀴즈 | 미션 | 튜토리얼 | 설정 | +| --- | --- | --- | --- | +| image| image| image| image| +| 개발 밈과 관련된 퀴즈로 다이아 보상을 획득할 수 있습니다. | 다양한 목표 달성으로 지속적인 플레이를 보장하며 보상을 획득할 수 있습니다. | 게임 시스템의 기본적인 학습을 할 수 있습니다. | 사운드, 효과음, 햅틱에 대한 설정을 조절할 수 있습니다. | diff --git a/SoloDeveloperTraining/.swiftlint.yml b/SoloDeveloperTraining/.swiftlint.yml new file mode 100644 index 00000000..84209c78 --- /dev/null +++ b/SoloDeveloperTraining/.swiftlint.yml @@ -0,0 +1,8 @@ +disabled_rules: + - cyclomatic_complexity + +line_length: + warning: 150 + error: 200 + ignores_comments: true + ignores_urls: true diff --git a/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/project.pbxproj b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/project.pbxproj new file mode 100644 index 00000000..01aa4309 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/project.pbxproj @@ -0,0 +1,724 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXContainerItemProxy section */ + BCFC853D2F31FED800447A9A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08267F232F0D06BC005A0066 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08267F2A2F0D06BC005A0066; + remoteInfo = SoloDeveloperTraining; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 08267F2B2F0D06BC005A0066 /* SoloDeveloperTraining.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SoloDeveloperTraining.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2896AE422F100CD600D38732 /* SoloDeveloperTraining-Dev.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SoloDeveloperTraining-Dev.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + BCFC85392F31FED800447A9A /* SoloDeveloperTrainingTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SoloDeveloperTrainingTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 2896AE432F100CD600D38732 /* Exceptions for "SoloDeveloperTraining" folder in "SoloDeveloperTraining-Dev" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + "App/Info-Dev.plist", + App/Info.plist, + "Production/Error/PurchasingError+UserReadableError.swift", + "Production/Error/SkillError+UserReadableError.swift", + Production/Error/UserReadableError.swift, + Production/Presentation/CharacterScene.swift, + Production/Presentation/DodgeGameView.swift, + Production/Presentation/FeedbackSettingView.swift, + Production/Presentation/Intro/IntroView.swift, + Production/Presentation/Intro/NicknameSetupView.swift, + Production/Presentation/Intro/TutorialPageView.swift, + Production/Presentation/Intro/TutorialView.swift, + Production/Presentation/LanguageGameView.swift, + Production/Presentation/MainView.swift, + Production/Presentation/MissionView.swift, + Production/Presentation/MultiTouchView.swift, + Production/Presentation/QuizGameView.swift, + Production/Presentation/ShopView.swift, + Production/Presentation/SkillView.swift, + Production/Presentation/StackGameScene.swift, + Production/Presentation/StackGameView.swift, + Production/Presentation/TapGameView.swift, + Production/Presentation/WorkSelectedView.swift, + ); + target = 2896AE3A2F100CD600D38732 /* SoloDeveloperTraining-Dev */; + }; + BC6322A72F0F41BB00EAD3F7 /* Exceptions for "SoloDeveloperTraining" folder in "SoloDeveloperTraining" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + App/Info.plist, + Devlopment/CheatSystem/CheatManager.swift, + Devlopment/Presentation/ContentView.swift, + Devlopment/Presentation/DodgeGameTestView.swift, + Devlopment/Presentation/LanguageGameTestView.swift, + Devlopment/Presentation/MissionTestView.swift, + Devlopment/Presentation/QuizGameTestContentView.swift, + Devlopment/Presentation/QuizGameTestView.swift, + Devlopment/Presentation/ShopTestView.swift, + Devlopment/Presentation/SkillTestView.swift, + Devlopment/Presentation/StackGameScene.swift, + Devlopment/Presentation/StackGameTestView.swift, + Devlopment/Presentation/TabGameView.swift, + ); + target = 08267F2A2F0D06BC005A0066 /* SoloDeveloperTraining */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 08267F2D2F0D06BC005A0066 /* SoloDeveloperTraining */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + BC6322A72F0F41BB00EAD3F7 /* Exceptions for "SoloDeveloperTraining" folder in "SoloDeveloperTraining" target */, + 2896AE432F100CD600D38732 /* Exceptions for "SoloDeveloperTraining" folder in "SoloDeveloperTraining-Dev" target */, + ); + path = SoloDeveloperTraining; + sourceTree = ""; + }; + BCFC853A2F31FED800447A9A /* SoloDeveloperTrainingTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = SoloDeveloperTrainingTests; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 08267F282F0D06BC005A0066 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2896AE3C2F100CD600D38732 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BCFC85362F31FED800447A9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08267F222F0D06BC005A0066 = { + isa = PBXGroup; + children = ( + 08267F2D2F0D06BC005A0066 /* SoloDeveloperTraining */, + BCFC853A2F31FED800447A9A /* SoloDeveloperTrainingTests */, + 08267F2C2F0D06BC005A0066 /* Products */, + ); + sourceTree = ""; + }; + 08267F2C2F0D06BC005A0066 /* Products */ = { + isa = PBXGroup; + children = ( + 08267F2B2F0D06BC005A0066 /* SoloDeveloperTraining.app */, + 2896AE422F100CD600D38732 /* SoloDeveloperTraining-Dev.app */, + BCFC85392F31FED800447A9A /* SoloDeveloperTrainingTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 08267F2A2F0D06BC005A0066 /* SoloDeveloperTraining */ = { + isa = PBXNativeTarget; + buildConfigurationList = 08267F362F0D06BE005A0066 /* Build configuration list for PBXNativeTarget "SoloDeveloperTraining" */; + buildPhases = ( + 08267F272F0D06BC005A0066 /* Sources */, + 08267F282F0D06BC005A0066 /* Frameworks */, + 08267F292F0D06BC005A0066 /* Resources */, + B3D95AE82F0FA9850066BDF2 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 08267F2D2F0D06BC005A0066 /* SoloDeveloperTraining */, + ); + name = SoloDeveloperTraining; + packageProductDependencies = ( + ); + productName = SoloDeveloperTraining; + productReference = 08267F2B2F0D06BC005A0066 /* SoloDeveloperTraining.app */; + productType = "com.apple.product-type.application"; + }; + 2896AE3A2F100CD600D38732 /* SoloDeveloperTraining-Dev */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2896AE3F2F100CD600D38732 /* Build configuration list for PBXNativeTarget "SoloDeveloperTraining-Dev" */; + buildPhases = ( + 2896AE3B2F100CD600D38732 /* Sources */, + 2896AE3C2F100CD600D38732 /* Frameworks */, + 2896AE3D2F100CD600D38732 /* Resources */, + 2896AE3E2F100CD600D38732 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 08267F2D2F0D06BC005A0066 /* SoloDeveloperTraining */, + ); + name = "SoloDeveloperTraining-Dev"; + packageProductDependencies = ( + ); + productName = SoloDeveloperTraining; + productReference = 2896AE422F100CD600D38732 /* SoloDeveloperTraining-Dev.app */; + productType = "com.apple.product-type.application"; + }; + BCFC85382F31FED800447A9A /* SoloDeveloperTrainingTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = BCFC853F2F31FED800447A9A /* Build configuration list for PBXNativeTarget "SoloDeveloperTrainingTests" */; + buildPhases = ( + BCFC85352F31FED800447A9A /* Sources */, + BCFC85362F31FED800447A9A /* Frameworks */, + BCFC85372F31FED800447A9A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BCFC853E2F31FED800447A9A /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + BCFC853A2F31FED800447A9A /* SoloDeveloperTrainingTests */, + ); + name = SoloDeveloperTrainingTests; + packageProductDependencies = ( + ); + productName = SoloDeveloperTrainingTests; + productReference = BCFC85392F31FED800447A9A /* SoloDeveloperTrainingTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08267F232F0D06BC005A0066 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 2620; + LastUpgradeCheck = 2610; + TargetAttributes = { + 08267F2A2F0D06BC005A0066 = { + CreatedOnToolsVersion = 26.1.1; + }; + BCFC85382F31FED800447A9A = { + CreatedOnToolsVersion = 26.2; + TestTargetID = 08267F2A2F0D06BC005A0066; + }; + }; + }; + buildConfigurationList = 08267F262F0D06BC005A0066 /* Build configuration list for PBXProject "SoloDeveloperTraining" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 08267F222F0D06BC005A0066; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 08267F2C2F0D06BC005A0066 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 08267F2A2F0D06BC005A0066 /* SoloDeveloperTraining */, + 2896AE3A2F100CD600D38732 /* SoloDeveloperTraining-Dev */, + BCFC85382F31FED800447A9A /* SoloDeveloperTrainingTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 08267F292F0D06BC005A0066 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2896AE3D2F100CD600D38732 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BCFC85372F31FED800447A9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2896AE3E2F100CD600D38732 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [[ \"$(uname -m)\" == arm64 ]]\nthen\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif command -v swiftlint >/dev/null 2>&1\nthen\n swiftlint\nelse\n echo \"warning: `swiftlint` command not found - See https://github.com/realm/SwiftLint#installation for installation instructions.\"\nfi\n"; + }; + B3D95AE82F0FA9850066BDF2 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [[ \"$(uname -m)\" == arm64 ]]\nthen\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif command -v swiftlint >/dev/null 2>&1\nthen\n swiftlint\nelse\n echo \"warning: `swiftlint` command not found - See https://github.com/realm/SwiftLint#installation for installation instructions.\"\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 08267F272F0D06BC005A0066 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2896AE3B2F100CD600D38732 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BCFC85352F31FED800447A9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BCFC853E2F31FED800447A9A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 08267F2A2F0D06BC005A0066 /* SoloDeveloperTraining */; + targetProxy = BCFC853D2F31FED800447A9A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 08267F342F0D06BE005A0066 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + 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_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = 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_OBJC_ROOT_CLASS = YES_ERROR; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_SWIFT_FLAGS = ""; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 08267F352F0D06BE005A0066 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + 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_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = 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_OBJC_ROOT_CLASS = YES_ERROR; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = 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_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = ""; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 08267F372F0D06BE005A0066 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = app_icon_release; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = SoloDeveloperTraining/App/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "개발자 키우기"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen"; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 17; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.1.2; + PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp10.SoloDeveloperTraining; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 08267F382F0D06BE005A0066 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = app_icon_release; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = SoloDeveloperTraining/App/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "개발자 키우기"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen"; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 17; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.1.2; + PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp10.SoloDeveloperTraining; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 2896AE402F100CD600D38732 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = app_icon_dev; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "SoloDeveloperTraining/App/Info-Dev.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "개발자 키우기 (Dev)"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen"; + INFOPLIST_KEY_UIStatusBarStyle = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 17; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_SWIFT_FLAGS = "-DDEV_BUILD"; + PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp10.SoloDeveloperTraining.dev; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 2896AE412F100CD600D38732 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = app_icon_dev; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = B3PWYBKFUK; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "SoloDeveloperTraining/App/Info-Dev.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "개발자 키우기 (Dev)"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen"; + INFOPLIST_KEY_UIStatusBarStyle = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 17; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_SWIFT_FLAGS = "-DDEV_BUILD"; + PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp10.SoloDeveloperTraining.dev; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + BCFC85402F31FED800447A9A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = B3PWYBKFUK; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = sunghun.SoloDeveloperTrainingTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SoloDeveloperTraining.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/SoloDeveloperTraining"; + }; + name = Debug; + }; + BCFC85412F31FED800447A9A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = B3PWYBKFUK; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = sunghun.SoloDeveloperTrainingTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SoloDeveloperTraining.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/SoloDeveloperTraining"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 08267F262F0D06BC005A0066 /* Build configuration list for PBXProject "SoloDeveloperTraining" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08267F342F0D06BE005A0066 /* Debug */, + 08267F352F0D06BE005A0066 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 08267F362F0D06BE005A0066 /* Build configuration list for PBXNativeTarget "SoloDeveloperTraining" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08267F372F0D06BE005A0066 /* Debug */, + 08267F382F0D06BE005A0066 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2896AE3F2F100CD600D38732 /* Build configuration list for PBXNativeTarget "SoloDeveloperTraining-Dev" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2896AE402F100CD600D38732 /* Debug */, + 2896AE412F100CD600D38732 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BCFC853F2F31FED800447A9A /* Build configuration list for PBXNativeTarget "SoloDeveloperTrainingTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BCFC85402F31FED800447A9A /* Debug */, + BCFC85412F31FED800447A9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08267F232F0D06BC005A0066 /* Project object */; +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/xcshareddata/xcschemes/SoloDeveloperTraining.xcscheme b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/xcshareddata/xcschemes/SoloDeveloperTraining.xcscheme new file mode 100644 index 00000000..e8192f92 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/xcshareddata/xcschemes/SoloDeveloperTraining.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/xcshareddata/xcschemes/SoloDeveloperTrainingTests.xcscheme b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/xcshareddata/xcschemes/SoloDeveloperTrainingTests.xcscheme new file mode 100644 index 00000000..89673d20 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/xcshareddata/xcschemes/SoloDeveloperTrainingTests.xcscheme @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/xcshareddata/xcschemes/SoloDeveloperTrainingUITests.xcscheme b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/xcshareddata/xcschemes/SoloDeveloperTrainingUITests.xcscheme new file mode 100644 index 00000000..1e3b2199 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining.xcodeproj/xcshareddata/xcschemes/SoloDeveloperTrainingUITests.xcscheme @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/App/Info-Dev.plist b/SoloDeveloperTraining/SoloDeveloperTraining/App/Info-Dev.plist new file mode 100644 index 00000000..8948e570 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/App/Info-Dev.plist @@ -0,0 +1,12 @@ + + + + + UIAppFonts + + PFStardust-Regular.ttf + PFStardust-Bold.ttf + PFStardust-ExtraBold.ttf + + + diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/App/Info.plist b/SoloDeveloperTraining/SoloDeveloperTraining/App/Info.plist new file mode 100644 index 00000000..8948e570 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/App/Info.plist @@ -0,0 +1,12 @@ + + + + + UIAppFonts + + PFStardust-Regular.ttf + PFStardust-Bold.ttf + PFStardust-ExtraBold.ttf + + + diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/App/Launch Screen.storyboard b/SoloDeveloperTraining/SoloDeveloperTraining/App/Launch Screen.storyboard new file mode 100644 index 00000000..cbb70b75 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/App/Launch Screen.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/App/SoloDeveloperTrainingApp.swift b/SoloDeveloperTraining/SoloDeveloperTraining/App/SoloDeveloperTrainingApp.swift new file mode 100644 index 00000000..adbba718 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/App/SoloDeveloperTrainingApp.swift @@ -0,0 +1,181 @@ +// +// SoloDeveloperTrainingApp.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import SwiftUI + +private enum Constant { + enum Animation { + static let transitionDuration: Double = 0.5 // 화면 전환 + static let blinkingDuration: Double = 1.0 // 깜빡임 + } + + enum Padding { + static let nicknamePopupHorizontal: CGFloat = 25 + static let errorPopupVertical: CGFloat = 20 + } + + enum Opacity { + static let overlay: Double = 0.5 + } +} + +@main +struct SoloDeveloperTrainingApp: App { + @State private var hasSeenIntro = false + @State private var showNicknameSetup = false + @State private var showTutorial = false + @State private var user: User? + @State private var showErrorPopup = false + @State private var errorMessage: String = "" + @Environment(\.scenePhase) private var scenePhase + + private let userRepository: UserRepository = FileManagerUserRepository() + + var body: some Scene { + WindowGroup { +#if DEV_BUILD + // Dev 타깃용 루트뷰 + ContentView() +#else + // 운영 타깃용 뷰 + Group { + if hasSeenIntro, let user { + MainView(user: user) + .transition(.opacity) + } else { + IntroView( + hasSeenIntro: $hasSeenIntro, + showNicknameSetup: $showNicknameSetup, + user: user + ) + } + } + .animation(.easeOut(duration: Constant.Animation.transitionDuration), value: hasSeenIntro) + .overlay { + nicknameSetupOverlay + } + .overlay { + errorPopupOverlay + } + .fullScreenCover(isPresented: $showTutorial) { + TutorialView(isPresented: $showTutorial) { + user?.record.tutorialCompleted = true + hasSeenIntro = true + showTutorial = false + } + .onAppear { + Task { + try? await Task.sleep(nanoseconds: UInt64(Constant.Animation.transitionDuration * 1_000_000_000)) + hasSeenIntro = true + } + } + } + .onAppear { + loadUser() + } + .onChange(of: scenePhase) { _, newPhase in + if newPhase == .background || newPhase == .inactive { + saveUser() + } + } +#endif + } + } +} + +#if !DEV_BUILD +private extension SoloDeveloperTrainingApp { + /// 저장된 User를 로드합니다. + func loadUser() { + Task { + do { + if let loadedUser = try await userRepository.load() { + await MainActor.run { + self.user = loadedUser + } + } + } catch { + await MainActor.run { + self.errorMessage = "사용자 데이터를 불러오는데 실패했습니다.\n\(error.localizedDescription)" + self.showErrorPopup = true + } + } + } + } + + /// 현재 User를 저장합니다. + func saveUser() { + guard let user = user else { return } + Task { + do { + try await userRepository.save(user) + } catch { + await MainActor.run { + self.errorMessage = "사용자 데이터를 저장하는데 실패했습니다.\n\(error.localizedDescription)" + self.showErrorPopup = true + } + } + } + } + + @ViewBuilder + var nicknameSetupOverlay: some View { + if showNicknameSetup { + ZStack { + Color.black.opacity(Constant.Opacity.overlay) + .ignoresSafeArea() + + NicknameSetupView( + onStart: { nickname in + user = User(nickname: nickname) + showNicknameSetup = false + withAnimation(.easeOut(duration: Constant.Animation.transitionDuration)) { + hasSeenIntro = true + } + }, + onTutorial: { nickname in + user = User(nickname: nickname) + showNicknameSetup = false + showTutorial = true + } + ) + .padding(.horizontal, Constant.Padding.nicknamePopupHorizontal) + } + } + } + + @ViewBuilder + var errorPopupOverlay: some View { + if showErrorPopup { + ZStack { + Color.black.opacity(Constant.Opacity.overlay) + .ignoresSafeArea() + + Popup(title: "오류") { + VStack(spacing: 0) { + Text(errorMessage) + .textStyle(.body) + .foregroundColor(.black) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity, alignment: .center) + .padding(.vertical, Constant.Padding.errorPopupVertical) + + HStack(spacing: 0) { + Spacer() + MediumButton(title: "확인", isFilled: true) { + showErrorPopup = false + } + Spacer() + } + } + } + .padding(.horizontal, Constant.Padding.nicknamePopupHorizontal) + } + } + } +} +#endif diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/AppColors.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/AppColors.swift new file mode 100644 index 00000000..63f010ac --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/AppColors.swift @@ -0,0 +1,48 @@ +// +// AppColors.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/12/26. +// + +import SwiftUI + +enum AppColors { + + // MARK: - Gray 100 ~ 700 + static let gray100 = Color("Gray100") + static let gray200 = Color("Gray200") + static let gray300 = Color("Gray300") + static let gray400 = Color("Gray400") + static let gray500 = Color("Gray500") + static let gray600 = Color("Gray600") + static let gray700 = Color("Gray700") + + // MARK: - Orange 100 ~ 700 + static let orange100 = Color("Orange100") + static let orange200 = Color("Orange200") + static let orange300 = Color("Orange300") + static let orange400 = Color("Orange400") + static let orange500 = Color("Orange500") + static let orange600 = Color("Orange600") + static let orange700 = Color("Orange700") + + // MARK: - Beige 100 ~ 400 + static let beige100 = Color("Beige100") + static let beige200 = Color("Beige200") + static let beige300 = Color("Beige300") + static let beige400 = Color("Beige400") + + // MARK: - Accent Colors + static let lightGreen = Color("LightGreen") + static let accentGreen = Color("AccentGreen") + static let accentYellow = Color("AccentYellow") + static let lightOrange = Color("LightOrange") + static let accentRed = Color("AccentRed") + + // MARK: - Pastel Colors + static let pastelYellow = Color("PastelYellow") + static let pastelPink = Color("PastelPink") + static let pastelBlue = Color("PastelBlue") + static let pastelGreen = Color("PastelGreen") +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/BlockItem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/BlockItem.swift new file mode 100644 index 00000000..daecea7f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/BlockItem.swift @@ -0,0 +1,103 @@ +// +// BlockItem.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-13. +// + +import SpriteKit +import SwiftUI + +private enum Constant { + // 움직이는 속도(작을수록 빠름) + static let moveDurationRange = 0.5...1.0 + // 질량 + static let physicsMass: CGFloat = 1.0 + // 탄성 (0으로 설정하여 튀지 않도록) + static let physicsRestitution: CGFloat = 0.0 + // 마찰 (1.0으로 설정하여 미끄러지지 않도록) + static let physicsFriction: CGFloat = 1.0 +} + +final class BlockItem: SKSpriteNode { + private var moveAction: SKAction? + let blockType: BlockType + + init(type: BlockType = .blue) { + self.blockType = type + let texture = SKTexture(imageNamed: type.imageName) + super.init(texture: texture, color: .clear, size: type.size) + self.anchorPoint = CGPoint(x: 0.5, y: 0) + } + + required init?(coder aDecoder: NSCoder) { + return nil + } + + func startMoving(distance: CGFloat) { + let duration = Double.random(in: Constant.moveDurationRange) + let moveRight = SKAction.moveBy(x: distance, y: 0, duration: duration) + let moveLeft = SKAction.moveBy(x: -distance, y: 0, duration: duration) + let sequence = SKAction.sequence([moveRight, moveLeft]) + let repeatAction = SKAction.repeatForever(sequence) + self.moveAction = repeatAction + self.run(repeatAction, withKey: "moving") + } + + func stopMoving() { + self.removeAction(forKey: "moving") + self.moveAction = nil + } + + func enableGravity() { + self.physicsBody = SKPhysicsBody(rectangleOf: self.size) + self.physicsBody?.isDynamic = true + self.physicsBody?.allowsRotation = true + self.physicsBody?.mass = Constant.physicsMass + self.physicsBody?.restitution = Constant.physicsRestitution + self.physicsBody?.friction = Constant.physicsFriction + } + + func fixPosition() { + self.physicsBody?.isDynamic = false + self.physicsBody?.allowsRotation = false + } + + func setupPhysicsBody(isDynamic: Bool = false) { + self.physicsBody = SKPhysicsBody(rectangleOf: self.size) + self.physicsBody?.isDynamic = isDynamic + self.physicsBody?.allowsRotation = false + } +} + +#Preview { + VStack(spacing: 20) { + Text("BlockItem Preview") + .font(.headline) + + ForEach(BlockType.allCases, id: \.self) { type in + VStack(spacing: 8) { + Text(String(describing: type)) + .font(.caption) + .foregroundColor(.secondary) + + SpriteView( + scene: { + let scene = SKScene(size: type.size) + scene.backgroundColor = .clear + scene.scaleMode = .aspectFit + + let block = BlockItem(type: type) + block.position = CGPoint(x: scene.size.width / 2, y: scene.size.height / 2) + scene.addChild(block) + + return scene + }(), + options: [.allowsTransparency] + ) + .frame(width: type.size.width, height: type.size.height) + } + } + } + .padding() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/CareerProgressBar.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/CareerProgressBar.swift new file mode 100644 index 00000000..f9d4dc7c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/CareerProgressBar.swift @@ -0,0 +1,79 @@ +// +// CareerProgressBar.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/14/26. +// + +import SwiftUI + +private enum Constants { + enum Size { + static let barHeight: CGFloat = 22 + } + + enum Spacing { + static let vertical: CGFloat = 4 + static let leadingLabelSpacing: CGFloat = 4 + static let trailingLabelSpacing: CGFloat = 4 + } +} + +struct CareerProgressBar: View { + let career: Career + let totalEarnedMoney: Int + let progress: Double + + var body: some View { + VStack(spacing: Constants.Spacing.vertical) { + ZStack { + // 배경 + Rectangle() + .fill(.gray200) + + // 진행 바 + Rectangle() + .fill(.orange300) + .scaleEffect(x: progress, y: 1, anchor: .leading) + } + .frame(height: Constants.Size.barHeight) + HStack(alignment: .top) { + HStack(spacing: Constants.Spacing.leadingLabelSpacing) { + Text("누적").textStyle(.caption) + CurrencyLabel( + axis: .horizontal, + icon: .gold, + textStyle: .caption, + value: totalEarnedMoney + ) + } + Spacer() + VStack( + alignment: .trailing, + spacing: Constants.Spacing.trailingLabelSpacing + ) { + Text(career.nextCareer?.rawValue ?? "").textStyle(.caption) + CurrencyLabel( + axis: .horizontal, + icon: .gold, + textStyle: .caption, + value: career.nextCareer?.requiredWealth ?? 0 + ) + } + } + } + } +} + +#Preview { + CareerProgressBar( + career: .unemployed, + totalEarnedMoney: 0, + progress: 0.0 + ) + CareerProgressBar( + career: .laptopOwner, + totalEarnedMoney: 1200, + progress: 0.4 + ) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/CareerRow.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/CareerRow.swift new file mode 100644 index 00000000..1765055c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/CareerRow.swift @@ -0,0 +1,119 @@ +// +// CareerRow.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/15/26. +// + +import SwiftUI + +private enum Constant { + static let imageSize: CGSize = .init(width: 49, height: 49) + static let cornerRadius: CGFloat = 4 + static let borderWidth: CGFloat = 1 + static let profileOpacity: CGFloat = 0.6 + + enum Spacing { + static let horizontal: CGFloat = 8 + static let vertical: CGFloat = 6 + } +} + +struct CareerRow: View { + let career: Career + let userCareer: Career + + var body: some View { + HStack(alignment: .center, spacing: Constant.Spacing.horizontal) { + // 프로필 이미지 + Image(displayImageName) + .resizable() + .clipShape(RoundedRectangle(cornerRadius: Constant.cornerRadius)) + .frame(width: Constant.imageSize.width, height: Constant.imageSize.height) + .overlay( + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .stroke(borderColor, lineWidth: Constant.borderWidth) + ) + .opacity(state == .locked ? Constant.profileOpacity : 1.0) + + // 우측 컨텐츠 + VStack(alignment: .leading, spacing: Constant.Spacing.vertical) { + HStack(alignment: .bottom) { + Text(career.rawValue) + .foregroundStyle(textColor) + .textStyle(.subheadline) + Spacer() + if state == .completed { + Text("완료") + .foregroundStyle(.gray400) + .textStyle(.label) + } + } + Text(career.description) + .foregroundStyle(textColor) + .textStyle(.label) + } + } + } +} + +private extension CareerRow { + /// 커리어 Row 상태 + enum CareerState { + case completed + case inProgress + case locked + } + + /// 현재 상태 계산 + var state: CareerState { + let careerIndex = Career.allCases.firstIndex(of: career) ?? 0 + let userIndex = Career.allCases.firstIndex(of: userCareer) ?? 0 + + if career == userCareer { + return .inProgress + } else if careerIndex < userIndex { + return .completed + } else { + return .locked + } + } + + /// 테두리 색상 + var borderColor: Color { + state == .inProgress ? AppColors.accentYellow : AppColors.gray200 + } + + /// 텍스트 색상 + var textColor: Color { + state == .completed ? AppColors.gray400 : .black + } + + /// 표시할 이미지 + var displayImageName: String { + state == .locked ? "profile_locked" : career.imageName + } +} + +#Preview { + VStack(spacing: 12) { + // 완료된 직업 + CareerRow( + career: .unemployed, + userCareer: .aspiringDeveloper + ) + + // 현재 진행중인 직업 + CareerRow( + career: .aspiringDeveloper, + userCareer: .aspiringDeveloper + ) + + // 잠긴 직업 + CareerRow( + career: .juniorDeveloper, + userCareer: .aspiringDeveloper + ) + } + .padding(.horizontal) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/CurrencyLabel.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/CurrencyLabel.swift new file mode 100644 index 00000000..f0a46b45 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/CurrencyLabel.swift @@ -0,0 +1,71 @@ +// +// CurrencyLabel.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-12. +// + +import SwiftUI + +private enum Constants { + static let iconTextSpacing: CGFloat = 3 +} + +struct CurrencyLabel: View { + private let axis: Axis + private let icon: Icon + private let textStyle: TypographyStyle + private let value: Int + + init(axis: Axis, icon: Icon, textStyle: TypographyStyle = .caption, value: Int) { + self.axis = axis + self.icon = icon + self.textStyle = textStyle + self.value = value + } + + var body: some View { + switch axis { + case .vertical: + VStack(spacing: Constants.iconTextSpacing) { + switch icon { + case .diamond: Image(.iconDiamondGreen) + case .gold: Image(.iconCoinBag) + } + + Text(value.formatted) + .textStyle(textStyle) + } + + case .horizontal: + HStack(spacing: Constants.iconTextSpacing) { + switch icon { + case .diamond: Image(.iconDiamondGreen) + case .gold: Image(.iconCoinBag) + } + + Text(value.formatted) + .textStyle(textStyle) + } + } + } +} + +extension CurrencyLabel { + enum Axis { + case vertical + case horizontal + } + + enum Icon { + case diamond + case gold + } +} + +#Preview { + CurrencyLabel(axis: .vertical, icon: .diamond, textStyle: .body, value: 30540) + CurrencyLabel(axis: .vertical, icon: .gold, textStyle: .callout, value: 30540) + CurrencyLabel(axis: .horizontal, icon: .diamond, textStyle: .caption, value: 30540) + CurrencyLabel(axis: .horizontal, icon: .gold, textStyle: .headline, value: 30540) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/DefaultSegmentControl.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/DefaultSegmentControl.swift new file mode 100644 index 00000000..89a354cc --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/DefaultSegmentControl.swift @@ -0,0 +1,123 @@ +// +// DefaultSegmentControl.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/13/26. +// + +import SwiftUI + +private enum Constant { + static let segmentSpacing: CGFloat = 0 + static let segmentHeight: CGFloat = 40 + static let segmentPadding: CGFloat = 4 + static let lineWidth: CGFloat = 2 + + enum Color { + static let selectedBackground = AppColors.orange500 + static let unselectedBackground = AppColors.gray100 + static let selectedText = SwiftUI.Color.white + static let unselectedText = AppColors.gray500 + static let border = SwiftUI.Color.black + } +} + +struct DefaultSegmentControl: View { + /// 선택된 세그먼트 인덱스 + @Binding var selection: Int + + let segments: [String] + + var body: some View { + HStack(spacing: Constant.segmentSpacing) { + ForEach(0.. Void + + var body: some View { + Button(action: action) { + Text(title) + .textStyle(.subheadline) + .foregroundStyle(textColor) + .frame(maxWidth: .infinity) + .frame(maxHeight: Constant.segmentHeight) + .background(backgroundColor) + .animation(.none, value: isSelected) + } + .buttonStyle(.soundTap) + } + + var backgroundColor: SwiftUI.Color { + isSelected ? Constant.Color.selectedBackground : Constant.Color.unselectedBackground + } + + var textColor: SwiftUI.Color { + isSelected ? Constant.Color.selectedText : Constant.Color.unselectedText + } +} + +#Preview { + @Previewable @State var selection2 = 0 + @Previewable @State var selection3 = 0 + @Previewable @State var selection4 = 0 + + VStack(spacing: 40) { + VStack(spacing: 10) { + Text("2개 세그먼트") + .textStyle(.title) + DefaultSegmentControl( + selection: $selection2, + segments: ["아이템", "부동산"] + ) + Text("선택된 인덱스: \(selection2)") + .textStyle(.body) + } + + VStack(spacing: 10) { + Text("3개 세그먼트") + .textStyle(.title) + DefaultSegmentControl( + selection: $selection3, + segments: ["옵션 1", "옵션 2", "옵션 3"] + ) + Text("선택된 인덱스: \(selection3)") + .textStyle(.body) + } + + VStack(spacing: 10) { + Text("4개 세그먼트") + .textStyle(.title) + DefaultSegmentControl( + selection: $selection4, + segments: ["첫번째", "두번째", "세번째", "네번째"] + ) + Text("선택된 인덱스: \(selection4)") + .textStyle(.body) + } + } + .padding() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/DropItem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/DropItem.swift new file mode 100644 index 00000000..c43bceb8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/DropItem.swift @@ -0,0 +1,50 @@ +// +// DropItem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/13/26. +// + +import SwiftUI + +private enum Constant { + static let itemSize = CGSize(width: 24, height: 24) +} + +struct DropItem: View { + + let type: DropItemType + + var body: some View { + Image(type.imageResource) + .resizable() + .frame(width: Constant.itemSize.width, height: Constant.itemSize.height) + } +} + +extension DropItem { + enum DropItemType { + case smallGold + case largeGold + case bug + + var imageResource: ImageResource { + switch self { + case .smallGold: + return .dodgeDropSmallGold + case .largeGold: + return .dodgeDropLargeGold + case .bug: + return .dodgeDropBug + } + } + } +} + +#Preview { + HStack { + DropItem(type: .smallGold) + DropItem(type: .largeGold) + DropItem(type: .bug) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/EffectLabel.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/EffectLabel.swift new file mode 100644 index 00000000..a3a9053a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/EffectLabel.swift @@ -0,0 +1,125 @@ +// +// EffectLabel.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/13/26. +// + +import SwiftUI + +private enum Constant { + enum Size { + static let icon = CGSize(width: 18, height: 18) + } + + enum Spacing { + static let horizontal: CGFloat = 3 + } + + enum Animation { + // 단계 별 애니메이션 지속 시간 + static let durationSec: Double = 1.5 + // 각 단계의 간격 시간 + static let sleepNanosec: UInt64 = 150_000_000 + // 각 단계에 따른 투명도, offsetY + static let steps: [(Double, CGFloat)] = [ + (1.0, 0), + (0.5, -3), + (0.2, -6), + (0.1, -9), + (0.0, -12) + ] + } +} + +/// EffectLabel 데이터 모델 +struct EffectLabelData: Identifiable { + let id: UUID + let position: CGPoint + let value: Int +} + +struct EffectLabel: View { + let value: Int + let onComplete: () -> Void + + @State private var opacity: Double = 1.0 + @State private var offsetY: CGFloat = 0 + @State private var shouldShow = true + + init( + value: Int, + onComplete: @escaping () -> Void = {} + ) { + self.value = value + self.onComplete = onComplete + } + + private var isZero: Bool { + value == 0 + } + + private var isIncrease: Bool { + value > 0 + } + + private var color: Color { + isZero || isIncrease ? .lightGreen : .accentRed + } + + var body: some View { + if shouldShow { + HStack(spacing: Constant.Spacing.horizontal) { + if !isZero { + Image(isIncrease ? .iconPlus : .iconMinus) + .renderingMode(.template) + .resizable() + .frame( + width: Constant.Size.icon.width, + height: Constant.Size.icon.height + ) + .foregroundStyle(color) + } + + Image(.iconCoinStack) + .resizable() + .frame( + width: Constant.Size.icon.width, + height: Constant.Size.icon.height + ) + + Text(abs(value).formatted()) + .textStyle(.subheadline) + .foregroundStyle(color) + } + .opacity(opacity) + .offset(y: offsetY) + .onAppear { + runAnimation() + } + } + } + + private func runAnimation() { + Task { + for (opacityValue, offsetValue) in Constant.Animation.steps { + withAnimation( + .easeOut(duration: Constant.Animation.durationSec) + ) { + opacity = opacityValue + offsetY = offsetValue + } + try? await Task + .sleep(nanoseconds: Constant.Animation.sleepNanosec) + } + shouldShow = false + onComplete() + } + } +} + +#Preview { + EffectLabel(value: 100000) + EffectLabel(value: -200000) + EffectLabel(value: 0) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/GamePauseWrapper.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/GamePauseWrapper.swift new file mode 100644 index 00000000..bb2e50d9 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/GamePauseWrapper.swift @@ -0,0 +1,129 @@ +// +// GamePauseWrapper.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/27/26. +// + +import SwiftUI + +private enum Constant { + static let opacity: Double = 0.5 + static let animation: Animation = .easeOut(duration: 0.25) + static let blurRadius: CGFloat = 2 + static let iconSize: CGFloat = 28 + + enum Spacing { + static let buttonHorizontal: CGFloat = 50 + static let iconTextHorizontal: CGFloat = 8 + } + + enum ButtonText { + static let leave: String = "나가기" + static let resume: String = "계속하기" + } +} + +struct GamePauseWrapper: ViewModifier { + @Environment(\.scenePhase) private var scenePhase + @State private var isPaused: Bool = false + + @Binding var isGameViewDisappeared: Bool + + let height: CGFloat + let onLeave: () -> Void + let onPause: () -> Void + let onResume: () -> Void + + func body(content: Content) -> some View { + ZStack { + content + .blur(radius: isPaused ? Constant.blurRadius : 0) + if isPaused { + pauseOverlay + .transition(.opacity.combined(with: .scale(scale: 0.95))) + } + } + .onChange(of: scenePhase) { oldPhase, newPhase in + handleScenePhase(oldPhase: oldPhase, newPhase: newPhase) + } + .onChange(of: isGameViewDisappeared) { _, newValue in + if newValue { + handleGameViewDisappeard() + } + } + } +} + +// MARK: - Pause Overlay +private extension GamePauseWrapper { + var pauseOverlay: some View { + ZStack { + Rectangle() + .fill(.white.opacity(Constant.opacity)) + .frame(height: height) + .contentShape(Rectangle()) + .onTapGesture { } // 배경 터치 무효화 + + HStack(spacing: Constant.Spacing.buttonHorizontal) { + pauseButton( + title: Constant.ButtonText.leave, + iconImage: .iconCancel, + action: handleLeave + ) + + pauseButton( + title: Constant.ButtonText.resume, + iconImage: .iconPlay, + action: handleResume + ) + } + } + .frame(maxWidth: .infinity) + } + + func pauseButton( + title: String, + iconImage: ImageResource, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + HStack(spacing: Constant.Spacing.iconTextHorizontal) { + Image(iconImage) + .resizable() + .frame(width: Constant.iconSize, height: Constant.iconSize) + Text(title) + .textStyle(.title2) + .foregroundStyle(.black) + } + } + .buttonStyle(.soundTap) + } +} + +// MARK: - Actions +private extension GamePauseWrapper { + func handleGameViewDisappeard() { + isPaused = true + onPause() + } + + func handleScenePhase(oldPhase: ScenePhase, newPhase: ScenePhase) { + // 앱이 비활성 상태로 갈 때 즉시 일시정지 + if newPhase != .active { + handleGameViewDisappeard() + } + } + + func handleLeave() { + guard isPaused else { return } + isPaused = false + onLeave() + } + + func handleResume() { + guard isPaused else { return } + isPaused = false + onResume() + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/GameToolBar.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/GameToolBar.swift new file mode 100644 index 00000000..3150d79f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/GameToolBar.swift @@ -0,0 +1,297 @@ +// +// GameToolBar.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/12/26. +// + +import SwiftUI + +private enum Constant { + enum Size { + static let closeButton = CGSize(width: 31, height: 31) + static let coffeeIcon = CGSize(width: 22, height: 22) + static let energyDrinkIcon = CGSize(width: 20, height: 22) + } + + enum Spacing { + static let toolBar: CGFloat = 20 + static let consumableItem: CGFloat = 6 + static let itemIconText: CGFloat = 2 + } + + static let itemCountLabelWidth: CGFloat = 16 + static let feverBarHeight: CGFloat = 15 + static let disabledAlpha: CGFloat = 0.3 +} + +struct GameToolBar: View { + + // MARK: - Properties + /// 닫기 버튼 탭 핸들러 + let closeButtonDidTapHandler: () -> Void + /// 커피 버튼 탭 핸들러 + let coffeeButtonDidTapHandler: () -> Void + /// 에너지 드링크 버튼 탭 핸들러 + let energyDrinkButtonDidTapHandler: () -> Void + + /// 피버 상태 관리 객체 + let feverState: FeverState + + /// 버프 시스템 + let buffSystem: BuffSystem + + /// 커피 보유 개수 + let coffeeCount: Binding + /// 에너지 드링크 보유 개수 + let energyDrinkCount: Binding + + var body: some View { + HStack(spacing: Constant.Spacing.toolBar) { + closeButton + feverBar + HStack(spacing: Constant.Spacing.consumableItem) { + coffeeButton + energyDrinkButton + } + } + } +} + +// MARK: - SubViews +private extension GameToolBar { + /// 닫기 버튼 + var closeButton: some View { + Button { + closeButtonDidTapHandler() + SoundService.shared.stopAllSFX() + SoundService.shared.trigger(.buttonTap) + } label: { + Image(.iconClose) + .resizable() + .frame( + width: Constant.Size.closeButton.width, + height: Constant.Size.closeButton.height + ) + } + .buttonStyle(.soundTap) + } + + /// 피버 게이지 바 + var feverBar: some View { + GeometryReader { geometry in + ZStack(alignment: .leading) { + // 배경 바 (이전 단계 색상) + Rectangle() + .frame(height: Constant.feverBarHeight) + .foregroundStyle(feverBarBackgroundColor) + + // 전경 바 (현재 단계 색상, 진행도에 따라 너비 변경) + Rectangle() + .frame( + width: feverBarFillWidth(totalWidth: geometry.size.width), + height: Constant.feverBarHeight + ) + .foregroundStyle(feverBarFillColor) + + // 피버 배수 텍스트 + if feverState.feverStage != 0 { + Text(String(format: "Fever %.1fx !!", feverState.feverMultiplier)) + .textStyle(.caption2) + .foregroundStyle(.white) + .frame(maxWidth: .infinity) + } + } + } + .frame(height: Constant.feverBarHeight) + } + + /// 커피 아이템 버튼 + var coffeeButton: some View { + Button { + coffeeButtonDidTapHandler() + } label: { + HStack(spacing: Constant.Spacing.itemIconText) { + Image(.iconCoffee) + .resizable() + .frame( + width: Constant.Size.coffeeIcon.width, + height: Constant.Size.coffeeIcon.height + ) + .opacity(coffeeCount.wrappedValue == 0 ? Constant.disabledAlpha : 1.0) + .mask( + GeometryReader { geometry in + VStack(spacing: 0) { + Rectangle() + .opacity(Constant.disabledAlpha) + .frame(height: geometry.size.height * cooldownProgress(for: .coffee)) + Rectangle() + .opacity(1) + .frame(height: geometry.size.height * (1 - cooldownProgress(for: .coffee))) + } + } + ) + Text("\(coffeeCount.wrappedValue)") + .textStyle(.caption2) + .foregroundStyle(isCoffeeBuffActive ? .gray300 : .black) + .frame(width: Constant.itemCountLabelWidth) + } + } + .disabled(isCoffeeBuffActive || coffeeCount.wrappedValue == 0) + } + + /// 에너지 드링크 아이템 버튼 + var energyDrinkButton: some View { + Button { + energyDrinkButtonDidTapHandler() + } label: { + HStack(spacing: Constant.Spacing.itemIconText) { + Image(.iconEnergyDrink) + .resizable() + .frame( + width: Constant.Size.energyDrinkIcon.width, + height: Constant.Size.energyDrinkIcon.height + ) + .opacity(energyDrinkCount.wrappedValue == 0 ? Constant.disabledAlpha : 1.0) + .mask( + GeometryReader { geometry in + VStack(spacing: 0) { + Rectangle() + .opacity(Constant.disabledAlpha) + .frame(height: geometry.size.height * cooldownProgress(for: .energyDrink)) + Rectangle() + .opacity(1) + .frame(height: geometry.size.height * (1 - cooldownProgress(for: .energyDrink))) + } + } + ) + Text("\(energyDrinkCount.wrappedValue)") + .textStyle(.caption2) + .foregroundStyle(isEnergyDrinkBuffActive ? .gray300 : .black) + .frame(width: Constant.itemCountLabelWidth) + } + } + .disabled(isEnergyDrinkBuffActive || energyDrinkCount.wrappedValue == 0) + } +} + +// MARK: - Helper +private extension GameToolBar { + /// 커피 버프 활성화 여부 + var isCoffeeBuffActive: Bool { + buffSystem.coffeeDuration > 0 + } + + /// 에너지 드링크 버프 활성화 여부 + var isEnergyDrinkBuffActive: Bool { + buffSystem.energyDrinkDuration > 0 + } + + /// 피버 바 전경 색상 (현재 단계) + var feverBarFillColor: Color { + switch feverState.feverStage { + case 0: return .gray400 + case 1: return .accentYellow + case 2: return .lightOrange + case 3: return .accentRed + default: return .gray400 + } + } + + /// 피버 바 배경 색상 (이전 단계) + var feverBarBackgroundColor: Color { + switch feverState.feverStage { + case 0: return .gray200 + case 1: return .gray400 + case 2: return .accentYellow + case 3: return .lightOrange + default: return .accentRed + } + } + + /// 현재 피버 단계 내에서의 진행도에 따른 바 너비 계산 + /// - Parameter totalWidth: 피버 바 전체 너비 + /// - Returns: 현재 진행도에 따른 바 너비 + func feverBarFillWidth(totalWidth: CGFloat) -> CGFloat { + let currentPercent = feverState.feverPercent + // 현재 단계 내에서의 진행도 (0.0 ~ 1.0) + let progressRatio: Double + + switch currentPercent { + case 0..<100: + progressRatio = currentPercent / 100.0 + case 100..<200: + progressRatio = (currentPercent - 100) / 100.0 + case 200..<300: + progressRatio = (currentPercent - 200) / 100.0 + case 300...: + progressRatio = min((currentPercent - 300) / 100.0, 1.0) + default: + progressRatio = 0 + } + return totalWidth * progressRatio + } + + /// 소비 아이템 쿨타임 진행도 (0.0 ~ 1.0, 0이 쿨타임 완료, 1이 쿨타임 시작) + func cooldownProgress(for type: ConsumableType) -> Double { + let duration: Int + switch type { + case .coffee: + duration = buffSystem.coffeeDuration + case .energyDrink: + duration = buffSystem.energyDrinkDuration + } + + guard duration > 0 else { return 0.0 } + let totalDuration = Double(type.duration) + let remainingDuration = Double(duration) + return remainingDuration / totalDuration + } +} + +#Preview { + @Previewable @State var coffeeCount: Int = 10 + @Previewable @State var drinkCount: Int = 10 + let feverSystem = FeverSystem(decreaseInterval: 0.1, decreasePercentPerTick: 3) + let buffSystem = BuffSystem() + + VStack { + Button { + if !feverSystem.isRunning { + feverSystem.start() + } + feverSystem.gainFever(20) + } label: { + Text("GainFever") + } + + Button { + buffSystem.useConsumableItem(type: .coffee) + } label: { + Text("Use Coffee") + } + + Button { + buffSystem.useConsumableItem(type: .energyDrink) + } label: { + Text("Use Energy Drink") + } + + GameToolBar( + closeButtonDidTapHandler: { + print("Close") + }, + coffeeButtonDidTapHandler: { + coffeeCount -= 1 + }, + energyDrinkButtonDidTapHandler: { + drinkCount -= 1 + }, + feverState: feverSystem, + buffSystem: buffSystem, + coffeeCount: $coffeeCount, + energyDrinkCount: $drinkCount + ) + .padding() + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/HousingCard.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/HousingCard.swift new file mode 100644 index 00000000..cbe3d5d1 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/HousingCard.swift @@ -0,0 +1,123 @@ +// +// HousingCard.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/15/26. +// + +import SwiftUI + +private enum Constant { + static let cardWidth: CGFloat = 225 + static let cornerRadius: CGFloat = 6 + static let lineWidth: CGFloat = 3 + + enum Padding { + static let horizontal: CGFloat = 16 + static let top: CGFloat = 16 + static let bottom: CGFloat = 15 + static let textSpacing: CGFloat = 4 + static let titleSpacing: CGFloat = 15 + static let imageTop: CGFloat = 19 + static let buttonTop: CGFloat = 14 + } +} + +struct HousingCard: View { + let housing: Housing + let state: ItemState + let isSelected: Bool + let onTap: () -> Void + let onButtonTap: () -> Void + + var body: some View { + HousingCardContent( + housing: housing, + buttonTitle: state == .locked ? "장착중" : "이사하기", + isButtonEnabled: state == .available, + onButtonTap: onButtonTap + ) + .contentShape(RoundedRectangle(cornerRadius: Constant.cornerRadius)) + .overlay { + if isSelected { + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .stroke(Color.black, lineWidth: Constant.lineWidth) + } + } + .onTapGesture { onTap() } + } +} + +private struct HousingCardContent: View { + let housing: Housing + let buttonTitle: String + let isButtonEnabled: Bool + let onButtonTap: () -> Void + + var body: some View { + VStack(spacing: 0) { + VStack(spacing: 0) { + // 상단 텍스트 영역 + HStack(spacing: Constant.Padding.titleSpacing) { + Text(housing.displayTitle) + .textStyle(.callout) + + Text("₩\(housing.cost.gold.formatted)") + .textStyle(.caption2) + .frame(maxWidth: .infinity, alignment: .leading) + } + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.top, Constant.Padding.top) + + Text("초당 골드 획득량 \(housing.goldPerSecond.formatted)") + .textStyle(.label) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.top, Constant.Padding.textSpacing) + + // 이미지 영역 + Image(housing.imageName) + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: Constant.cardWidth) + .frame(maxHeight: .infinity) + .clipped() + .padding(.top, Constant.Padding.imageTop) + .padding(.bottom, Constant.Padding.buttonTop) + } + .contentShape(Rectangle()) + + // 버튼 영역 + LargeButton( + title: buttonTitle, + isEnabled: isButtonEnabled + ) { + onButtonTap() + } + .padding(.bottom, Constant.Padding.bottom) + } + .foregroundStyle(.black) + .frame(maxHeight: .infinity) + .frame(width: Constant.cardWidth) + .background(AppColors.gray100) + .cornerRadius(Constant.cornerRadius) + } +} + +#Preview { + @Previewable @State var isSelected = false + @Previewable @State var state: ItemState = .available + + HousingCard( + housing: .init(tier: .villa), + state: state, + isSelected: isSelected, + onTap: { + isSelected.toggle() + }, + onButtonTap: { + state = .locked + } + ) + .frame(height: 500) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/ItemRow.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/ItemRow.swift new file mode 100644 index 00000000..5e8be5ae --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/ItemRow.swift @@ -0,0 +1,116 @@ +// +// ItemRow.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/15/26. +// + +import SwiftUI + +private enum Constant { + + static let imageSize: CGSize = .init(width: 38, height: 38) + static let cornerRadius: CGFloat = 4 + static let priceButtonWidth: CGFloat = 95 + + enum Spacing { + static let horizontal: CGFloat = 8 + static let vertical: CGFloat = 4 + } + + enum Padding { + static let horizontal: CGFloat = 16 + static let vertical: CGFloat = 8 + } +} + +struct ItemRow: View { + + let title: String + let description: String + let imageName: String + let cost: Cost + let state: ItemState + let action: () -> Void + let onLongPressAction: (() -> Bool)? + + init( + title: String, + description: String, + imageName: String, + cost: Cost, + state: ItemState, + action: @escaping () -> Void, + onLongPressAction: (() -> Bool)? = nil + ) { + self.title = title + self.description = description + self.imageName = imageName + self.cost = cost + self.state = state + self.action = action + self.onLongPressAction = onLongPressAction + } + + var body: some View { + HStack(spacing: Constant.Spacing.horizontal) { + Image(imageName) + .resizable() + .clipShape(RoundedRectangle(cornerRadius: Constant.cornerRadius)) + .frame(width: Constant.imageSize.width, height: Constant.imageSize.height) + VStack(alignment: .leading, spacing: Constant.Spacing.vertical) { + Text(title) + .foregroundStyle(.black) + .textStyle(.subheadline) + Text(description) + .foregroundStyle(.black) + .textStyle(.label) + } + + Spacer() + + PriceButton( + cost: cost, + state: state, + axis: .vertical, + width: Constant.priceButtonWidth, + action: action, + onLongPressRepeat: onLongPressAction + ) + } + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.vertical, Constant.Padding.vertical) + } +} + +#Preview { + VStack { + ItemRow( + title: "강화 / 아이템 이름 이름 이름", + description: "항목 설명 설명 설명", + imageName: "housing_street", + cost: .init(gold: 1_000_0000000000, diamond: 99), + state: .available + ) { + print("Tapped") + } + ItemRow( + title: "강화 / 아이템 이름 이름 이름", + description: "항목 설명 설명 설명", + imageName: "housing_street", + cost: .init(gold: 1_000_000), + state: .locked + ) { + print("Tapped") + } + ItemRow( + title: "강화 / 아이템 이름 이름 이름", + description: "항목 설명 설명 설명", + imageName: "housing_street", + cost: .init(gold: 1_000_000), + state: .insufficient + ) { + print("Tapped") + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/LanguageButton.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/LanguageButton.swift new file mode 100644 index 00000000..67b3bd0a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/LanguageButton.swift @@ -0,0 +1,96 @@ +// +// LanguageButton.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/12/26. +// + +import SwiftUI + +private enum Constant { + static let vStackSpacing: CGFloat = 8 + static let cornerRadius: CGFloat = 12 + + enum Size { + static let imageWidth: CGFloat = 60 + static let imageHeight: CGFloat = 60 + static let buttonWidth: CGFloat = 77 + static let buttonHeight: CGFloat = 77 + } + + enum Offset { + static let pressedX: CGFloat = 2 + static let pressedY: CGFloat = 2 + static let shadowX: CGFloat = 3 + static let shadowY: CGFloat = 3 + } +} + +struct LanguageButton: View { + let languageType: LanguageType + let action: () -> Void + + @State private var isPressed: Bool = false + + var body: some View { + Button(action: action) { + ZStack(alignment: .bottomTrailing) { + VStack(spacing: Constant.vStackSpacing) { + ZStack { + // 그림자 + RoundedRectangle(cornerRadius: + Constant.cornerRadius) + .fill(AppColors.gray600) + .frame( + width: Constant.Size.imageWidth, + height: Constant.Size.imageHeight + ) + .offset( + x: Constant.Offset.shadowX, + y: Constant.Offset.shadowY + ) + + // 실제 이미지 + Image(languageType.imageName) + .resizable() + .scaledToFit() + .frame( + width: Constant.Size.imageWidth, + height: Constant.Size.imageHeight + ) + .offset( + x: isPressed ? Constant.Offset.pressedX : 0, + y: isPressed ? Constant.Offset.pressedY : 0 + ) + } + + Text(languageType.rawValue) + .textStyle(.caption) + } + .frame(width: Constant.Size.buttonWidth, height: Constant.Size.buttonHeight) + + .frame(width: Constant.Size.buttonWidth, height: Constant.Size.buttonHeight) + } + .animation(.none, value: isPressed) + } + .buttonStyle(.pressable(isPressed: $isPressed)) + } +} + +#Preview { + HStack(spacing: 20) { + LanguageButton(languageType: .swift) { + print("Swift 버튼이 눌렸습니다") + } + LanguageButton(languageType: .kotlin) { + print("Kotlin 버튼이 눌렸습니다") + } + LanguageButton(languageType: .dart) { + print("Dart 버튼이 눌렸습니다") + } + LanguageButton(languageType: .python) { + print("Python 버튼이 눌렸습니다") + } + } + .padding() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/LanguageItem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/LanguageItem.swift new file mode 100644 index 00000000..c06757de --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/LanguageItem.swift @@ -0,0 +1,104 @@ +// +// LanguageItem.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/12/26. +// + +import SwiftUI + +private enum Constant { + static let vStackSpacing: CGFloat = 15 + + enum IconSize { + static let normal: CGFloat = 44 + static let active: CGFloat = 60 + } + + enum Opacity { + static let completed: Double = 0.5 + static let normal: Double = 1.0 + static let empty: Double = 0.0 + } +} + +struct LanguageItem: View { + let languageType: LanguageType + let state: LanguageItemState + + var body: some View { + VStack(alignment: .center, spacing: Constant.vStackSpacing) { + ZStack { + if state != .empty { + Image(languageType.imageName) + .resizable() + .scaledToFit() + .opacity(opacity) + } + } + .frame(width: iconSize, height: iconSize) + + Text(languageType.rawValue) + .textStyle(textStyle) + .fixedSize(horizontal: true, vertical: false) + .opacity(opacity) + } + } + + // MARK: - Computed Properties + + private var iconSize: CGFloat { + switch state { + case .completed, .upcoming, .empty: + return Constant.IconSize.normal + case .active: + return Constant.IconSize.active + } + } + + private var opacity: Double { + switch state { + case .completed: + return Constant.Opacity.completed + case .active, .upcoming: + return Constant.Opacity.normal + case .empty: + return Constant.Opacity.empty + } + } + + private var textStyle: TypographyStyle { + switch state { + case .completed, .upcoming, .empty: + return .caption + case .active: + return .title3 + } + } +} + +#Preview { + VStack(spacing: 20) { + HStack(spacing: 20) { + LanguageItem(languageType: .swift, state: .upcoming) + LanguageItem(languageType: .kotlin, state: .upcoming) + LanguageItem(languageType: .dart, state: .upcoming) + LanguageItem(languageType: .python, state: .upcoming) + } + + HStack(spacing: 20) { + LanguageItem(languageType: .swift, state: .active) + LanguageItem(languageType: .kotlin, state: .active) + LanguageItem(languageType: .dart, state: .active) + LanguageItem(languageType: .python, state: .active) + } + + HStack(spacing: 20) { + LanguageItem(languageType: .swift, state: .completed) + LanguageItem(languageType: .kotlin, state: .completed) + LanguageItem(languageType: .dart, state: .completed) + LanguageItem(languageType: .python, state: .completed) + } + } + .padding() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/LargeButton.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/LargeButton.swift new file mode 100644 index 00000000..f02f6d68 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/LargeButton.swift @@ -0,0 +1,82 @@ +// +// LargeButton.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-14. +// + +import SwiftUI + +private enum Constant { + static let radius: CGFloat = 8 + + enum Size { + static let buttonWidth: CGFloat = 170 + static let buttonHeight: CGFloat = 46 + static let badgeWidth: CGFloat = 30 + static let badgeHeight: CGFloat = 30 + } + + enum Offset { + static let badgeOffsetX: CGFloat = 17 + static let badgeOffsetY: CGFloat = -15 + } + + enum Opacity { + static let pressed: Double = 0.8 + static let unPressed: Double = 1.0 + } +} + +struct LargeButton: View { + @State private var isPressed: Bool = false + + let title: String + var hasBadge: Bool = false + var isEnabled: Bool = true + let action: () -> Void + + var body: some View { + Button(action: action) { + Text(title) + .textStyle(.body) + .foregroundColor(.white) + .frame(width: Constant.Size.buttonWidth, height: Constant.Size.buttonHeight) + .background(isEnabled ? .orange500 : .beige400) + .cornerRadius(Constant.radius) + .opacity(isPressed ? Constant.Opacity.pressed : Constant.Opacity.unPressed) + .overlay(alignment: .topTrailing) { + if hasBadge { badge } + } + } + .disabled(!isEnabled) + .buttonStyle(.pressable(isPressed: $isPressed)) + } + + private var badge: some View { + Image(.iconDiamondPlus) + .resizable() + .frame(width: Constant.Size.badgeWidth, height: Constant.Size.badgeHeight) + .offset(x: Constant.Offset.badgeOffsetX, y: Constant.Offset.badgeOffsetY) + } +} + +#Preview { + VStack(spacing: 20) { + LargeButton(title: "버튼 텍스트") { + print("버튼 클릭1") + } + + LargeButton(title: "버튼 텍스트", isEnabled: false) { + print("버튼 클릭2") + } + + LargeButton(title: "버튼 텍스트", hasBadge: true, isEnabled: false) { + print("버튼 클릭3") + } + + LargeButton(title: "버튼 텍스트", hasBadge: true) { + print("버튼 클릭4") + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/MediumButton.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/MediumButton.swift new file mode 100644 index 00000000..100ab2ca --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/MediumButton.swift @@ -0,0 +1,113 @@ +// +// MediumButton.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-14. +// + +import SwiftUI + +private enum Constant { + static let radius: CGFloat = 8 + + enum Size { + static let buttonWidth: CGFloat = 89 + static let buttonHeight: CGFloat = 44 + static let badgeWidth: CGFloat = 30 + static let badgeHeight: CGFloat = 30 + } + + enum Offset { + static let badgeOffsetX: CGFloat = 17 + static let badgeOffsetY: CGFloat = -15 + } + + enum Opacity { + static let pressed: Double = 0.8 + static let unPressed: Double = 1.0 + } +} + +struct MediumButton: View { + @State private var isPressed: Bool = false + + let title: String + var isFilled: Bool = false + var hasBadge: Bool = false + var isEnabled: Bool = true + var isCancelButton: Bool = false + let action: () -> Void + + var body: some View { + Button(action: action) { + Text(title) + .textStyle(.caption) + .foregroundColor(isFilled ? .white : .black) + .frame(width: Constant.Size.buttonWidth, height: Constant.Size.buttonHeight) + .background(backgroundColor) + .cornerRadius(Constant.radius) + .opacity(isPressed ? Constant.Opacity.pressed : Constant.Opacity.unPressed) + .overlay { + if !isFilled { + RoundedRectangle(cornerRadius: Constant.radius) + .stroke() + } + } + .overlay(alignment: .topTrailing) { + if hasBadge { badge } + } + } + .disabled(!isEnabled) + .buttonStyle(.pressable(isPressed: $isPressed)) + } + + private var backgroundColor: Color { + if !isEnabled || isCancelButton { + return isFilled ? .gray200 : .white + } + return isFilled ? .orange500 : .white + } + + private var badge: some View { + Image(.iconDiamondPlus) + .resizable() + .frame(width: Constant.Size.badgeWidth, height: Constant.Size.badgeHeight) + .offset(x: Constant.Offset.badgeOffsetX, y: Constant.Offset.badgeOffsetY) + } +} + +#Preview { + VStack(spacing: 20) { + MediumButton(title: "버튼 텍스트", isFilled: true) { + print("버튼 클릭1") + } + + MediumButton(title: "버튼 텍스트", isFilled: true, isEnabled: false) { + print("버튼 클릭2") + } + + MediumButton(title: "버튼 텍스트", isFilled: true, hasBadge: true) { + print("버튼 클릭3") + } + + MediumButton(title: "버튼 텍스트", isFilled: true, hasBadge: true, isEnabled: false) { + print("버튼 클릭4") + } + + MediumButton(title: "버튼 텍스트", isFilled: false) { + print("버튼 클릭5") + } + + MediumButton(title: "버튼 텍스트", isFilled: false, hasBadge: true) { + print("버튼 클릭6") + } + + MediumButton(title: "취소", isFilled: true, isCancelButton: true) { + print("취소 버튼 클릭") + } + + MediumButton(title: "취소", isFilled: false, isCancelButton: true) { + print("취소 버튼 클릭") + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/MissionCard.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/MissionCard.swift new file mode 100644 index 00000000..10e3a81e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/MissionCard.swift @@ -0,0 +1,169 @@ +// +// MissionCard.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/15/26. +// + +import SwiftUI + +private enum Constant { + static let cardColor = AppColors.beige100 + + enum Size { + static let icon: CGFloat = 16 + static let cardHeight: CGFloat = 180 + static let imageHeight: CGFloat = 72 + static let progressHeight: CGFloat = 14 + } + + enum Padding { + static let content: CGFloat = 10 + } + + enum Spacing { + static let rewardIconText: CGFloat = 2 + static let vertical: CGFloat = 4 + } + + enum Typography { + static let titleLineLimit: Int = 1 + static let conditionLineLimit: Int = 2 + } +} + +struct MissionCard: View { + let title: String + let reward: Cost + let imageName: String + let condition: String + let buttonState: MissionCardButton.ButtonState + var onButtonTap: (() -> Void)? + + init( + title: String, + reward: Cost, + imageName: String, + condition: String, + buttonState: MissionCardButton.ButtonState, + onButtonTap: (() -> Void)? = nil + ) { + self.title = title + self.reward = reward + self.imageName = imageName + self.condition = condition + self.buttonState = buttonState + self.onButtonTap = onButtonTap + } + + var body: some View { + MissionCardContentView( + title: title, + reward: reward, + imageName: imageName, + condition: condition, + buttonState: buttonState, + onButtonTap: onButtonTap + ) + .padding(.all, Constant.Padding.content) + .frame(height: Constant.Size.cardHeight) + .background { Rectangle().fill(Constant.cardColor) } + .onTapGesture { + onButtonTap?() + } + } +} + +private struct MissionCardContentView: View { + let title: String + let reward: Cost + let imageName: String + let condition: String + let buttonState: MissionCardButton.ButtonState + var onButtonTap: (() -> Void)? + + var body: some View { + VStack(alignment: .center, spacing: Constant.Spacing.vertical) { + // 타이틀과 보상 (왼쪽 정렬) + VStack(alignment: .leading, spacing: Constant.Spacing.vertical) { + Text(title) + .textStyle(.subheadline) + .foregroundStyle(.black) + .lineLimit(Constant.Typography.titleLineLimit) + HStack(spacing: Constant.Spacing.rewardIconText) { + if reward.gold > 0 { + CurrencyLabel( + axis: .horizontal, + icon: .gold, + textStyle: .caption, + value: reward.gold + ) + .foregroundStyle(.black) + } + if reward.diamond > 0 { + CurrencyLabel( + axis: .horizontal, + icon: .diamond, + textStyle: .caption, + value: reward.diamond + ) + .foregroundStyle(.black) + } + } + } + .frame(maxWidth: .infinity, alignment: .leading) + // 이미지 (가운데 정렬) + Image(imageName) + .resizable() + .scaledToFill() + .frame(height: Constant.Size.imageHeight) + .frame(maxWidth: .infinity) + .clipped() + // 보상 조건 (가운데 정렬) + Text(condition) + .textStyle(.label) + .foregroundStyle(.black) + .frame(maxWidth: .infinity) + .frame(height: 30) + .lineLimit(Constant.Typography.conditionLineLimit) + .multilineTextAlignment(.center) + + // MissionCardButton (가운데 정렬) + MissionCardButton(buttonState: buttonState) { + onButtonTap?() + } + } + } +} + +#Preview { + HStack(spacing: 12) { + MissionCard( + title: "탭따구리", + reward: .init(gold: 15), + imageName: "mission_trophy_gold", + condition: "탭 10,000회 달성", + buttonState: .claimable, + onButtonTap: { + print("미션 1 보상 획득") + } + ) + + MissionCard( + title: "정상이라는 착각", + reward: .init(diamond: 15), + imageName: "mission_trophy_silver", + condition: "버그 피하기 1000회달성", + buttonState: .claimed + ) + + MissionCard( + title: "명탐정의 돋보기", + reward: .init(gold: 15), + imageName: "mission_trophy_bronze", + condition: "탭 10,000회 달성", + buttonState: .inProgress(currentValue: 7356, totalValue: 10000) + ) + } + .padding() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/MissionCardButton.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/MissionCardButton.swift new file mode 100644 index 00000000..a06a6947 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/MissionCardButton.swift @@ -0,0 +1,139 @@ +// +// MissionCardButton.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/15/26. +// + +import SwiftUI + +private enum Constant { + static let buttonHeight: CGFloat = 16 + static let buttonWidth: CGFloat = .infinity + + enum Title { + static let claimable = "획득하기" + static let claimed = "달성 완료" + } + + enum BackgroundColor { + static let claimable = AppColors.accentGreen + static let claimed = AppColors.gray100 + static let progressTotal = Color.white + static let progressCurrent = AppColors.orange200 + } + + enum ForegroundColor { + static let claimable = Color.white + static let claimed = Color.black + static let progress = Color.black + } +} + +struct MissionCardButton: View { + let buttonState: ButtonState + var onTap: (() -> Void)? + + @State private var isPressed: Bool = false + + var body: some View { + Button { + onTap?() + } label: { + ZStack { + if case .inProgress(let currentValue, let totalValue) = buttonState { + Rectangle().fill(buttonState.backgroundColor) + GeometryReader { geometry in + let progress = min(Double(currentValue) / Double(totalValue), 1.0) + Rectangle() + .fill(Constant.BackgroundColor.progressCurrent) + .frame(width: geometry.size.width * progress) + } + } else { + Rectangle().fill(buttonState.backgroundColor) + } + + Text(buttonState.title) + .textStyle(.label) + .foregroundStyle(buttonState.foregroundColor) + } + .frame(height: Constant.buttonHeight) + .frame(maxWidth: Constant.buttonWidth) + .animation(.none, value: buttonState) + } + .disabled(!buttonState.isEnabled) + .buttonStyle(.pressable(isPressed: $isPressed)) + } +} + +// MARK: - ButtonState +extension MissionCardButton { + enum ButtonState: Equatable { + case claimable + case claimed + case inProgress(currentValue: Int, totalValue: Int) + + var title: String { + switch self { + case .claimable: + return Constant.Title.claimable + case .claimed: + return Constant.Title.claimed + case .inProgress(let currentValue, let totalValue): + let percent = Double(currentValue) / Double(totalValue) * 100 + return String(format: "%.2f%%", percent) + } + } + + var backgroundColor: Color { + switch self { + case .claimable: + return Constant.BackgroundColor.claimable + case .claimed: + return Constant.BackgroundColor.claimed + case .inProgress: + return Constant.BackgroundColor.progressTotal + } + } + + var foregroundColor: Color { + switch self { + case .claimable: + return Constant.ForegroundColor.claimable + case .claimed: + return Constant.ForegroundColor.claimed + case .inProgress: + return Constant.ForegroundColor.progress + } + } + + var isEnabled: Bool { + switch self { + case .claimable: + return true + case .claimed, .inProgress: + return false + } + } + } +} + +#Preview { + ZStack { + Rectangle() + .fill(AppColors.gray200) + VStack { + MissionCardButton( + buttonState: .inProgress(currentValue: 19, totalValue: 2000) + ) { + print("획득하기 버튼 클릭") + } + MissionCardButton(buttonState: .claimable) { + print("획득하기 버튼 클릭") + } + MissionCardButton(buttonState: .claimed) + } + .padding(.horizontal, 16) + } + .padding() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/Popup.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/Popup.swift new file mode 100644 index 00000000..f3448ef9 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/Popup.swift @@ -0,0 +1,135 @@ +// +// Popup.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/16/26. +// + +import SwiftUI + +private enum Constant { + static let cornerRadius: CGFloat = 8 + static let lineWidth: CGFloat = 2 + static let contentVerticalSpacing: CGFloat = 11 + + enum Padding { + static let titleTop: CGFloat = 20 + static let contentBottom: CGFloat = 20 + } +} + +struct PopupConfiguration { + let title: String + let maxHeight: CGFloat? + let content: AnyView + + init( + title: String, + maxHeight: CGFloat? = nil, + @ViewBuilder content: () -> some View + ) { + self.title = title + self.maxHeight = maxHeight + self.content = AnyView(content()) + } +} + +struct Popup: View { + let title: String + let contentView: ContentView + + // ViewBuilder를 통한 클로저 방식 + init( + title: String, + @ViewBuilder contentView: () -> ContentView + ) { + self.title = title + self.contentView = contentView() + } + + // View 인스턴스를 직접 전달하는 방식 + init( + title: String, + contentView: ContentView + ) { + self.title = title + self.contentView = contentView + } + + var body: some View { + VStack(spacing: Constant.contentVerticalSpacing) { + Text(title) + .textStyle(.title3) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity, alignment: .center) + .padding(.top, Constant.Padding.titleTop) + + contentView + .padding(.bottom, Constant.Padding.contentBottom) + } + .background(Color.white) + .cornerRadius(Constant.cornerRadius) + .overlay { + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .stroke(Color.black, lineWidth: Constant.lineWidth) + } + } +} + +#Preview { + VStack(spacing: 30) { + // ViewBuilder를 통한 클로저 방식 + Popup(title: "튜토리얼") { + VStack(alignment: .leading, spacing: 10) { + Text("당신은 취직에 실패한 개발자. 이대로 물러설 수는 없다. 나의 꿈은 1인 개발자로 성공하기 ~! 내 이름은!!") + .textStyle(.body) + .foregroundColor(.black) + + TextField("닉네임", text: .constant("")) + .textFieldStyle(.roundedBorder) + + HStack(spacing: 10) { + Spacer() + MediumButton(title: "바로 시작", isFilled: false) { + print("바로 시작") + } + + MediumButton(title: "튜토리얼", isFilled: true) { + print("튜토리얼") + } + Spacer() + } + } + } + + // View 인스턴스를 직접 전달하는 방식 + let customContentView = VStack(alignment: .leading, spacing: 10) { + Text("팝업 내용 내용 내용 내용 내용 내용 내용 내용 내용 내용 내용") + .textStyle(.body) + .foregroundColor(.black) + + HStack(spacing: 10) { + Spacer() + MediumButton(title: "취소", isFilled: false) { + print("취소") + } + + MediumButton(title: "확인", isFilled: true) { + print("확인") + } + Spacer() + } + } + Popup(title: "팝업 타이틀", contentView: customContentView) + + // 간단한 텍스트만 있는 팝업 + Popup(title: "알림") { + Text("간단한 메시지 팝업입니다.") + .textStyle(.body) + .foregroundColor(.black) + .frame(maxWidth: .infinity, alignment: .center) + } + } + .padding() + .background(Color.gray.opacity(0.1)) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/PriceButton.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/PriceButton.swift new file mode 100644 index 00000000..2ed3d5c1 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/PriceButton.swift @@ -0,0 +1,210 @@ +// +// PriceButton.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/14/26. +// + +import SwiftUI + +private enum Constant { + enum Layout { + static let cornerRadius: CGFloat = 5 + static let buttonHeight: CGFloat = 44 + static let contentSpacing: CGFloat = 3 + static let horizontalPadding: CGFloat = 8 + } + + enum Shadow { + static let offsetX: CGFloat = 2 + static let offsetY: CGFloat = 3 + } + + enum Icon { + static let coinSize = CGSize(width: 15, height: 15) + static let lockSize = CGSize(width: 18, height: 18) + } + + enum Overlay { + static let disabledOpacity: Double = 0.4 + } +} + +struct PriceButton: View { + + @GestureState private var isPressed: Bool = false + @State private var isLongPressing: Bool = false + + let cost: Cost + let state: ItemState + let axis: Axis + let width: CGFloat? + let action: () -> Void + let onLongPressRepeat: (() -> Bool)? + + init( + cost: Cost, + state: ItemState, + axis: Axis, + width: CGFloat? = nil, + action: @escaping () -> Void, + onLongPressRepeat: (() -> Bool)? = nil + ) { + self.cost = cost + self.state = state + self.axis = axis + self.width = width + self.action = action + self.onLongPressRepeat = onLongPressRepeat + } + + private var isDisabled: Bool { + state != .available + } + + var body: some View { + buttonContent + .overlay { + if isDisabled { + disabledOverlay + } + } + .animation(.none, value: isDisabled) + .background( + RoundedRectangle(cornerRadius: Constant.Layout.cornerRadius) + .foregroundStyle(isDisabled ? .gray400 : .black) + .offset( + x: Constant.Shadow.offsetX, + y: Constant.Shadow.offsetY + ) + ) + .animation(.none, value: isDisabled) + .contentShape(Rectangle()) + .longPressRepeat( + isLongPressing: $isLongPressing, + isDisabled: isDisabled, + onLongPressRepeat: onLongPressRepeat + ) + .onTapGesture { + if isLongPressing { + isLongPressing = false + return + } + if !isDisabled { + SoundService.shared.trigger(.buttonTap) + action() + } + } + .simultaneousGesture( + DragGesture(minimumDistance: 0) + .updating($isPressed) { _, state, _ in + if !isDisabled { + state = true + } + } + ) + .animation(.none, value: isPressed) + } + + @ViewBuilder + var buttonContent: some View { + Group { + if axis == .horizontal { + HStack(spacing: Constant.Layout.contentSpacing) { + contentViews + } + } else { + VStack(spacing: Constant.Layout.contentSpacing) { + contentViews + } + } + } + .frame(width: width ?? .none, height: Constant.Layout.buttonHeight) + .padding(.horizontal, Constant.Layout.horizontalPadding) + .background(isDisabled ? .gray300 : .orange500) + .clipShape(RoundedRectangle(cornerRadius: Constant.Layout.cornerRadius)) + .offset( + x: (isPressed && !isDisabled) ? Constant.Shadow.offsetX : 0, + y: (isPressed && !isDisabled) ? Constant.Shadow.offsetY : 0 + ) + .animation(.none, value: cost) + .animation(.none, value: state) + } + + @ViewBuilder + var contentViews: some View { + Group { + if state == .reachedMax { + Text("Max") + .textStyle(.caption) + .foregroundStyle(.white) + } else { + if cost.gold > 0 { + CurrencyLabel( + axis: .horizontal, + icon: .gold, + textStyle: .caption, + value: cost.gold + ) + .foregroundStyle(.white) + .fixedSize() + } + if cost.diamond > 0 { + CurrencyLabel( + axis: .horizontal, + icon: .diamond, + textStyle: .caption, + value: cost.diamond + ) + .foregroundStyle(.white) + .fixedSize() + } + } + } + .fixedSize() + .drawingGroup() + .minimumScaleFactor(0.7) + .lineLimit(1) + } + + var disabledOverlay: some View { + ZStack { + RoundedRectangle(cornerRadius: Constant.Layout.cornerRadius) + .foregroundStyle(Color.gray200.opacity(Constant.Overlay.disabledOpacity)) + + if state == .locked { + Image(.iconLock) + .resizable() + .frame( + width: Constant.Icon.lockSize.width, + height: Constant.Icon.lockSize.height + ) + } + } + } +} + +#Preview { + VStack(alignment: .center, spacing: 20) { + PriceButton( + cost: .init(gold: 1_000_000), + state: .available, + axis: .horizontal + ) {} + PriceButton( + cost: .init(gold: 100_000, diamond: 50), + state: .available, + axis: .vertical + ) {} + PriceButton( + cost: .init(gold: 1_000_000_000), + state: .locked, + axis: .horizontal + ) {} + PriceButton( + cost: .init(diamond: 1_000), + state: .insufficient, + axis: .vertical + ) {} + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/ProgressBar.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/ProgressBar.swift new file mode 100644 index 00000000..69e2ffbc --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/ProgressBar.swift @@ -0,0 +1,48 @@ +// +// ProgressBar.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-14. +// + +import SwiftUI + +private enum Constants { + static let height: CGFloat = 20 +} + +struct ProgressBar: View { + let maxValue: Double + let currentValue: Double + let text: String + + private var progress: Double { + return currentValue / maxValue + } + + var body: some View { + ZStack { + // 배경 + Rectangle() + .fill(.beige300) + + // 진행 바 + Rectangle() + .fill(.orange300) + .scaleEffect(x: progress, y: 1, anchor: .leading) + + Text(text) + .textStyle(.caption) + .foregroundColor(.black) + } + .frame(height: Constants.height) + } +} + +#Preview { + ProgressBar(maxValue: 60, currentValue: 10, text: "10 s") + ProgressBar(maxValue: 60, currentValue: 30, text: "30 s") + ProgressBar(maxValue: 60, currentValue: 40, text: "40 s") + ProgressBar(maxValue: 60, currentValue: 59, text: "59 s") + ProgressBar(maxValue: 60, currentValue: 60, text: "제한 시간 종료") +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/QuizButton.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/QuizButton.swift new file mode 100644 index 00000000..b8387b91 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/QuizButton.swift @@ -0,0 +1,172 @@ +// +// QuizButton.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/15/26. +// + +import SwiftUI + +private enum Constant { + static let height: CGFloat = 56 + static let cornerRadius: CGFloat = 10 + + enum Color { + static let foreground = SwiftUI.Color.white + static let selectedBackground = AppColors.lightOrange + static let defaultBackground = AppColors.gray700 + static let disabledBackground = AppColors.gray200 + } +} + +struct QuizButton: View { + @State private var isPressed: Bool = false + + let style: QuizButtonStyle + let isSelected: Bool + let isEnabled: Bool + let title: String + let action: () -> Void + + init( + style: QuizButtonStyle = .option, + isSelected: Bool = false, + isEnabled: Bool = true, + title: String, + action: @escaping () -> Void + ) { + self.style = style + self.isSelected = isSelected + self.isEnabled = isEnabled + self.title = title + self.action = action + } + + var body: some View { + Button { + if isEnabled { + action() + } + } label: { + Text(title) + .textStyle(textStyle) + .foregroundStyle(Constant.Color.foreground) + .padding(.leading, textLeadingPadding) + .frame(maxWidth: .infinity, alignment: textAlignment) + .frame(height: Constant.height) + .background(backgroundColor) + .cornerRadius(Constant.cornerRadius) + .animation(.none, value: isSelected) + .animation(.none, value: isEnabled) + } + .buttonStyle(.pressable(isPressed: $isPressed)) + .disabled(!isEnabled) + } +} + +// MARK: - Helper +extension QuizButton { + enum QuizButtonStyle { + case option // 선택지 버튼용 + case submit // 제출 버튼용 + } + + /// 버튼 텍스트 왼쪽 여백 + private var textLeadingPadding: CGFloat { + switch style { + case .option: + return 10 + case .submit: + return 0 + } + } + + /// 버튼 정렬 + private var textAlignment: Alignment { + switch style { + case .option: + return .leading + case .submit: + return .center + } + } + + /// 버튼 배경색 + private var backgroundColor: SwiftUI.Color { + guard isEnabled else { + return Constant.Color.disabledBackground + } + switch style { + case .option: + return isSelected ? Constant.Color.selectedBackground : Constant.Color.defaultBackground + case .submit: + return Constant.Color.defaultBackground + } + } + + /// 버튼 폰트 스타일 + var textStyle: TypographyStyle { + switch style { + case .option: + return .subheadline + case .submit: + return .body + } + } +} + +#Preview { + struct PreviewWrapper: View { + @State private var selectedIndex: Int? + + var body: some View { + VStack(spacing: 20) { + // 선택지 버튼들 (토글 가능) + QuizButton( + style: .option, + isSelected: selectedIndex == 0, + title: "1. (함께 코드를 보며) 이 부분 빨리 수정 가능할까요?" + ) { + // 토글: 이미 선택된 버튼이면 해제, 아니면 선택 + selectedIndex = selectedIndex == 0 ? nil : 0 + } + + QuizButton( + style: .option, + isSelected: selectedIndex == 1, + title: "2. (함께 코드를 보며) 이 부분 빨리 수정 가능할까요?" + ) { + selectedIndex = selectedIndex == 1 ? nil : 1 + } + + QuizButton( + style: .option, + isSelected: selectedIndex == 2, + title: "3. (함께 코드를 보며) 이 부분 빨리 수정 가능할까요?" + ) { + selectedIndex = selectedIndex == 2 ? nil : 2 + } + + QuizButton( + style: .option, + isSelected: selectedIndex == 3, + title: "4. (함께 코드를 보며) 이 부분 빨리 수정 가능할까요?" + ) { + selectedIndex = selectedIndex == 3 ? nil : 3 + } + + // 제출 버튼 + QuizButton( + style: .submit, + isEnabled: selectedIndex != nil, + title: "제출하기" + ) { + print("제출됨: \(selectedIndex ?? -1)") + } + } + .padding() + } + } + + return PreviewWrapper() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/RunningCharacter.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/RunningCharacter.swift new file mode 100644 index 00000000..a7d08f36 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/RunningCharacter.swift @@ -0,0 +1,88 @@ +// +// RunningCharacter.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-15. +// + +import SwiftUI + +private enum Constant { + static let animationSpeed: TimeInterval = 0.15 +} + +struct RunningCharacter: View { + @State private var currentFrame = 0 + @State private var animationTimer: Timer? + + private let frameImages: [ImageResource] = [ + .dodgeCharacter1, + .dodgeCharacter2, + .dodgeCharacter3, + .dodgeCharacter2 + ] + + let isFacingLeft: Bool + let isGamePaused: Bool + + /// 달리기 애니메이션 캐릭터 초기화 + /// - Parameters: + /// - isFacingLeft: 왼쪽을 향할지 여부 (기본값: false, 오른쪽 향함) + init(isFacingLeft: Bool = false, isGamePaused: Bool) { + self.isFacingLeft = isFacingLeft + self.isGamePaused = isGamePaused + } + + var body: some View { + Image(frameImages[currentFrame]) + .resizable() + .aspectRatio(contentMode: .fit) + .scaleEffect(x: isFacingLeft ? -1 : 1, y: 1) + .onAppear { + handleAnimation() + } + .onDisappear { + stopAnimation() + } + .onChange(of: isGamePaused) { _, _ in + handleAnimation() + } + } + + private func handleAnimation() { + if isGamePaused { + stopAnimation() + } else { + startAnimation() + } + } + + private func startAnimation() { + animationTimer = Timer.scheduledTimer(withTimeInterval: Constant.animationSpeed, repeats: true) { _ in + currentFrame = (currentFrame + 1) % frameImages.count + } + } + + private func stopAnimation() { + animationTimer?.invalidate() + animationTimer = nil + } +} + +#Preview { + HStack(spacing: 40) { + VStack { + RunningCharacter(isFacingLeft: false, isGamePaused: false) + .frame(width: 40, height: 40) + Text("오른쪽 →") + .font(.caption) + } + + VStack { + RunningCharacter(isFacingLeft: true, isGamePaused: false) + .frame(width: 40, height: 40) + Text("← 왼쪽") + .font(.caption) + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/SettingSlider.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/SettingSlider.swift new file mode 100644 index 00000000..1dc0e329 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/SettingSlider.swift @@ -0,0 +1,119 @@ +// +// SettingSlider.swift +// SoloDeveloperTraining +// + +import SwiftUI + +private enum Constant { + static let thumbDiameter: CGFloat = 24 + static let thumbRadius: CGFloat = thumbDiameter / 2 + static let trackHeight: CGFloat = 12 + static let cornerRadius: CGFloat = 4 + static let strokeLineWidth: CGFloat = 1 + static let strokeOpacityEnabled: Double = 0.15 + static let strokeOpacityDisabled: Double = 0.08 + static let dragMinimumDistance: CGFloat = 0 +} + +struct SettingSlider: View { + @Binding var value: Double + var range: ClosedRange = 0 ... 100 + var step: Double = 1 + var isEnabled: Bool = true + + private var progress: Double { + let span = range.upperBound - range.lowerBound + guard span > 0 else { return 0 } + return max(0, min(1, (value - range.lowerBound) / span)) + } + + var body: some View { + GeometryReader { geometry in + let width = geometry.size.width + let thumbCenterX = width * progress + + ZStack(alignment: .leading) { + // 트랙 배경 + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .fill(trackBackgroundColor) + .frame(height: Constant.trackHeight) + + // 진행 + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .fill(fillColor) + .frame(width: max(0, thumbCenterX), height: Constant.trackHeight) + + // 썸 + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .fill(thumbColor) + .frame(width: Constant.thumbDiameter, height: Constant.thumbDiameter) + .overlay { + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .stroke( + Color.black.opacity(isEnabled ? Constant.strokeOpacityEnabled : Constant.strokeOpacityDisabled), + lineWidth: Constant.strokeLineWidth + ) + } + .offset(x: thumbCenterX - Constant.thumbRadius) + } + .frame(height: Constant.thumbDiameter) + .frame(maxWidth: .infinity) + .contentShape(Rectangle()) + .allowsHitTesting(isEnabled) + .gesture( + DragGesture(minimumDistance: Constant.dragMinimumDistance) + .onChanged { gesture in + guard isEnabled else { return } + applyValue(from: gesture.location.x, trackWidth: width) + } + ) + .onTapGesture { location in + guard isEnabled else { return } + applyValue(from: location.x, trackWidth: width) + } + } + .frame(height: Constant.thumbDiameter) + } +} + +private extension SettingSlider { + var trackBackgroundColor: Color { + AppColors.beige300 + } + + var fillColor: Color { + isEnabled ? AppColors.orange300 : AppColors.gray300 + } + + var thumbColor: Color { + isEnabled ? AppColors.orange500 : AppColors.gray400 + } + + func applyValue(from locationX: CGFloat, trackWidth: CGFloat) { + guard trackWidth > 0 else { return } + let progressRatio = max(0, min(1, locationX / trackWidth)) + var rawValue = range.lowerBound + progressRatio * (range.upperBound - range.lowerBound) + if step > 0 { + rawValue = (rawValue / step).rounded() * step + } + rawValue = max(range.lowerBound, min(range.upperBound, rawValue)) + value = rawValue + } +} + +#Preview { + struct PreviewHolder: View { + @State private var volume: Double = 60 + var body: some View { + VStack(spacing: 24) { + SettingSlider(value: $volume, range: 0 ... 100, step: 1) + .padding(.horizontal) + Text("\(Int(volume))") + .textStyle(.body) + } + .padding() + } + } + return PreviewHolder() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/SmallButton.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/SmallButton.swift new file mode 100644 index 00000000..0316aa02 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/SmallButton.swift @@ -0,0 +1,128 @@ +// +// SmallButton.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-14. +// + +import SwiftUI + +private enum Constant { + static let radius: CGFloat = 8 + + enum Size { + static let buttonWidth: CGFloat = 44 + static let buttonHeight: CGFloat = 44 + static let badgeWidth: CGFloat = 30 + static let badgeHeight: CGFloat = 30 + } + + enum Offset { + static let badgeOffsetX: CGFloat = 17 + static let badgeOffsetY: CGFloat = -15 + static let pressedX: CGFloat = 2 + static let pressedY: CGFloat = 3 + static let shadowX: CGFloat = 2 + static let shadowY: CGFloat = 3 + } + + enum Opacity { + static let pressed: Double = 0.8 + static let unPressed: Double = 1.0 + } +} + +struct SmallButton: View { + @State private var isPressed: Bool = false + + let title: String + var image: Image? + var hasBadge: Bool = false + var isEnabled: Bool = true + let action: () -> Void + + var body: some View { + Button(action: action) { + ZStack { + buttonContent + .opacity(isPressed ? Constant.Opacity.pressed : Constant.Opacity.unPressed) + .frame(width: Constant.Size.buttonWidth, height: Constant.Size.buttonHeight) + .background(backgroundColor) + .cornerRadius(Constant.radius) + .overlay(alignment: .topTrailing) { + if hasBadge { badge } + } + .offset( + x: isPressed ? Constant.Offset.pressedX : 0, + y: isPressed ? Constant.Offset.pressedY : 0 + ) + .layoutPriority(1) + + Rectangle() + .fill(Color.black) + .frame(width: Constant.Size.buttonWidth, height: Constant.Size.buttonHeight) + .cornerRadius(Constant.radius) + .offset(x: Constant.Offset.shadowX, y: Constant.Offset.shadowY) + .zIndex(-1) + } + } + .disabled(!isEnabled) + .buttonStyle(.pressable(isPressed: $isPressed)) + + } + + @ViewBuilder + private var buttonContent: some View { + if let image { + image + .resizable() + .scaledToFill() + .frame(width: Constant.Size.buttonWidth, height: Constant.Size.buttonHeight) + .contentShape(Rectangle()) + } else { + Text(title) + .textStyle(.body) + .foregroundColor(.white) + } + } + + private var backgroundColor: Color { + if image != nil { + return .clear + } + if !isEnabled { + return .gray200 + } + return hasBadge ? AppColors.lightOrange : .orange500 + } + + private var badge: some View { + Image(.iconDiamondPlus) + .resizable() + .frame(width: Constant.Size.badgeWidth, height: Constant.Size.badgeHeight) + .offset(x: Constant.Offset.badgeOffsetX, y: Constant.Offset.badgeOffsetY) + } +} + +#Preview { + VStack(spacing: 20) { + SmallButton(title: "버튼") { + print("버튼 클릭1") + } + + SmallButton(title: "버튼", isEnabled: false) { + print("버튼 클릭2") + } + + SmallButton(title: "버튼", hasBadge: true, isEnabled: false) { + print("버튼 클릭3") + } + + SmallButton(title: "버튼", hasBadge: true) { + print("버튼 클릭4") + } + SmallButton(title: "버튼", image: Image(.iconSetting)) { + print("버튼 클릭4") + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/StatusBar.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/StatusBar.swift new file mode 100644 index 00000000..779f69f5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/StatusBar.swift @@ -0,0 +1,84 @@ +// +// StatusBar.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/8/26. +// + +import SwiftUI + +struct StatusBar: View { + let career: Career + let nickname: String + let careerProgress: Double + let gold: Int + let diamond: Int + + var body: some View { + VStack { + HStack(spacing: 16) { + // 왼쪽: 프로필 + 커리어 + 진행바 + HStack(spacing: 6) { + Image(career.imageName) + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: 30, height: 30) + .clipShape(RoundedRectangle(cornerRadius: 4)) + + VStack(alignment: .leading, spacing: 4) { + Text("\(career.rawValue) \(nickname)") + .textStyle(.caption) + .foregroundStyle(.primary) + .lineLimit(1) + .minimumScaleFactor(0.5) + + ProgressBarView(progress: careerProgress) + } + } + + Spacer() + + // 오른쪽: 재산 + 다이아 + HStack(spacing: 12) { + CurrencyLabel(axis: .horizontal, icon: .gold, value: gold) + CurrencyLabel(axis: .horizontal, icon: .diamond, value: diamond) + } + } + .padding(.horizontal, 16) + .padding(.vertical, 24) + } + .frame(maxHeight: .infinity, alignment: .bottom) + .frame(height: 113) + .background(Color.white.opacity(0.8)) + } +} + +private struct ProgressBarView: View { + let progress: Double + let height: CGFloat = 10 + + var body: some View { + GeometryReader { geometry in + ZStack(alignment: .leading) { + RoundedRectangle(cornerRadius: 4) + .fill(Color.gray200) + .frame(height: height) + + RoundedRectangle(cornerRadius: 4) + .fill(Color.lightOrange) + .frame(width: geometry.size.width * progress, height: height) + } + } + .frame(width: 129, height: height) + } +} + +#Preview("Status Bar") { + StatusBar( + career: .laptopOwner, + nickname: "소피아", + careerProgress: 0.42, + gold: 1234, + diamond: 56 + ) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/TabBar.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/TabBar.swift new file mode 100644 index 00000000..6f38b10f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/TabBar.swift @@ -0,0 +1,133 @@ +// +// TabBarView.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/8/26. +// + +import SwiftUI + +private enum Constant { + enum Spacing { + static let hStack: CGFloat = 4 + static let vStack: CGFloat = 4 + } + + enum Padding { + static let horizontal: CGFloat = 16 + static let vertical: CGFloat = 10 + static let buttonVertical: CGFloat = 4.5 + static let badgeTrailing: CGFloat = 6 + static let badgeBottom: CGFloat = 40 + static let imageHeight: CGFloat = 24 + } + + enum Size { + static let imageWidth: CGFloat = 24 + static let imageHeight: CGFloat = 24 + static let badge: CGFloat = 14 + } + + enum Offset { + static let pressedX: CGFloat = 2 + static let pressedY: CGFloat = 3 + static let shadowX: CGFloat = 2 + static let shadowY: CGFloat = 3 + } +} + +enum TabItem: String, CaseIterable { + case work = "업무" + case skill = "스킬" + case shop = "상점" + case mission = "미션" + + var imageName: String { + switch self { + case .work: return "icon_work" + case .skill: return "icon_skill" + case .shop: return "icon_shop" + case .mission: return "icon_mission" + } + } +} + +struct TabBar: View { + private var hasCompletedMisson: Bool + @Binding var selectedTab: TabItem + + init(selectedTab: Binding, hasCompletedMisson: Bool) { + self._selectedTab = selectedTab + self.hasCompletedMisson = hasCompletedMisson + } + + var body: some View { + HStack(alignment: .center, spacing: Constant.Spacing.hStack) { + ForEach(TabItem.allCases, id: \.self) { tab in + TabBarButton( + tab: tab, + isSelected: selectedTab == tab, + hasBadge: tab == .mission && hasCompletedMisson + ) { + selectedTab = tab + } + } + } + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.vertical, Constant.Padding.vertical) + .background(AppColors.beige200) + } +} + +private struct TabBarButton: View { + let tab: TabItem + let isSelected: Bool + let hasBadge: Bool + let action: () -> Void + + @State private var isPressed: Bool = false + + var body: some View { + Button(action: action) { + ZStack(alignment: .bottomTrailing) { + VStack(spacing: Constant.Spacing.vStack) { + Image(tab.imageName) + .resizable() + .frame(width: Constant.Size.imageWidth, height: Constant.Size.imageHeight) + + Text(tab.rawValue) + .textStyle(.caption) + } + .padding(.vertical, Constant.Padding.buttonVertical) + .foregroundStyle(isSelected ? .white : AppColors.orange500) + .frame(maxWidth: .infinity) + .background( + Rectangle() + .fill(isSelected ? AppColors.orange300 : AppColors.beige300) + ) + .offset(x: isPressed ? Constant.Offset.pressedX : 0, y: isPressed ? Constant.Offset.pressedY : 0) + .layoutPriority(1) + + Rectangle() + .fill(Color.black) + .offset(x: Constant.Offset.shadowX, y: Constant.Offset.shadowY) + .zIndex(-1) + /// 미션 탭 배지 + if hasBadge { + Image(.iconNewBadge) + .resizable() + .frame(width: Constant.Size.badge, height: Constant.Size.badge) + .padding(.trailing, Constant.Padding.badgeTrailing) + .padding(.bottom, Constant.Padding.badgeBottom) + } + } + .animation(.none, value: isSelected) + } + .buttonStyle(.pressable(isPressed: $isPressed)) + } +} + +#Preview { + @Previewable @State var selectedTab: TabItem = .work + TabBar(selectedTab: $selectedTab, hasCompletedMisson: true) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/Toast.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/Toast.swift new file mode 100644 index 00000000..e34a42dd --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/Toast.swift @@ -0,0 +1,124 @@ +// +// Toast.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/22/26. +// + +import SwiftUI + +private enum Constant { + static let cornerRadius: CGFloat = 6 + + enum Padding { + static let horizontal: CGFloat = 16 + static let vertical: CGFloat = 10 + static let bottom: CGFloat = 20 + } + + enum Width { + static let maxRatio: CGFloat = 0.9 + } + + enum Shadow { + static let color: Color = AppColors.gray400 + static let radius: CGFloat = 4 + static let yOffset: CGFloat = 3 + } + + enum Animation { + static let showDuration: CGFloat = 0.3 + static let hideDuration: CGFloat = 0.3 + } +} + +struct Toast: ViewModifier { + @Binding var isShowing: Bool + let message: String + let duration: Double + + @State private var showContent: Bool = false + @State private var opacity: Double = 0 + + func body(content: Content) -> some View { + ZStack { + content + + if showContent { + VStack { + Spacer() + Text(message) + .textStyle(.callout) + .multilineTextAlignment(.center) + .lineLimit(nil) + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.vertical, Constant.Padding.vertical) + .background(AppColors.orange300) + .foregroundColor(.white) + .cornerRadius(Constant.cornerRadius) + .shadow(color: Constant.Shadow.color, + radius: Constant.Shadow.radius, + y: Constant.Shadow.yOffset) + .frame(maxWidth: UIScreen.main.bounds.width * Constant.Width.maxRatio) + .padding(.bottom, Constant.Padding.bottom) + .opacity(opacity) + } + } + } + .onChange(of: isShowing) { _, newValue in + if newValue { + // 토스트 나타날 때 + showContent = true + withAnimation(.easeOut(duration: Constant.Animation.showDuration)) { + opacity = 1 + } + + // duration 후 사라지게 함 + DispatchQueue.main.asyncAfter(deadline: .now() + duration) { + // 부드럽게 사라지는 애니메이션 + withAnimation(.easeIn(duration: Constant.Animation.hideDuration)) { + opacity = 0 + } + + // 애니메이션 완료 후 뷰 제거 및 바인딩 리셋 + DispatchQueue.main.asyncAfter(deadline: .now() + Constant.Animation.hideDuration) { + showContent = false + isShowing = false + } + } + } + } + } +} + +#Preview { + struct ToastPreview: View { + @State private var shortToast: Bool = false + @State private var longToast: Bool = false + + var body: some View { + VStack(spacing: 50) { + VStack(spacing: 10) { + Button("짧은 메시지 표시") { + shortToast = true + } + .withTapSound() + Text("짧은 메시지 테스트") + .toast(isShowing: $shortToast, message: "짧은 토스트 메시지입니다.") + } + + VStack(spacing: 10) { + Button("긴 메시지 표시") { + longToast = true + } + .withTapSound() + Text("긴 메시지 테스트") + .toast(isShowing: $longToast, message: "긴 토스트 메시지입니다. 이 메시지는 길어서 줄바꿈과 최대 너비가 적용되는지 확인하는 테스트용입니다.") + } + } + .padding() + } + } + + return ToastPreview() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/WorkItemButton.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/WorkItemButton.swift new file mode 100644 index 00000000..566b6a49 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/WorkItemButton.swift @@ -0,0 +1,192 @@ +// +// WorkItemButton.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/14/26. +// + +import SwiftUI + +private enum Constant { + static let buttonHeight: CGFloat = 218 + static let borderWidth: CGFloat = 2 + static let cornerRadius: CGFloat = 4 + static let lockIconSize = CGSize(width: 24, height: 24) + static let disabledOverlayOpacity: Double = 0.5 + + enum Padding { + static let titleTop: CGFloat = 22 + static let descriptionTop: CGFloat = 4 + static let imageTop: CGFloat = 20 + static let imageHorizontal: CGFloat = 11 + static let imageBottom: CGFloat = 10 + } +} + +struct WorkItemButton: View { + let title: String + let imageName: String + @Binding var buttonState: ButtonState + var onTap: (() -> Void)? + + var body: some View { + buttonContent + .disabled(buttonState.isDisabled) + .onTapGesture { + guard !buttonState.isDisabled else { return } + SoundService.shared.trigger(.buttonTap) + if let onTap = onTap { + onTap() + } else { + changeState() + } + } + } +} + +// MARK: - Subviews +private extension WorkItemButton { + + var buttonContent: some View { + ZStack(alignment: .top) { + backgroundShape + contentStack + } + .frame(height: Constant.buttonHeight) + } + + var backgroundShape: some View { + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .foregroundStyle(buttonState.backgroundColor) + .overlay { + if let borderColor = buttonState.borderColor { + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .stroke(borderColor, lineWidth: Constant.borderWidth) + } + } + } + + var contentStack: some View { + VStack(spacing: 0) { + titleLabel + itemImage + } + } + + var titleLabel: some View { + Text(title) + .foregroundStyle(.black) + .textStyle(.headline) + .padding(.top, Constant.Padding.titleTop) + } + + var itemImage: some View { + GeometryReader { geometry in + Image(imageName) + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: geometry.size.width, height: geometry.size.height) + .clipped() + .overlay { + RoundedRectangle(cornerRadius: Constant.cornerRadius) + .stroke(.black, lineWidth: Constant.borderWidth) + } + } + .padding(.top, Constant.Padding.imageTop) + .padding(.horizontal, Constant.Padding.imageHorizontal) + .padding(.bottom, Constant.Padding.imageBottom) + .overlay { + if buttonState == .disabled { + disabledOverlay + } + } + } + + var disabledOverlay: some View { + ZStack { + Color.black.opacity(Constant.disabledOverlayOpacity) + .padding(.top, Constant.Padding.imageTop) + .padding(.horizontal, Constant.Padding.imageHorizontal) + .padding(.bottom, Constant.Padding.imageBottom) + + Image(.iconLock) + .resizable() + .frame( + width: Constant.lockIconSize.width, + height: Constant.lockIconSize.height + ) + } + } +} + +// MARK: - Helper +private extension WorkItemButton { + func changeState() { + switch buttonState { + case .normal: + buttonState = .focused + case .focused: + buttonState = .normal + case .disabled: + break + } + } +} + +// MARK: - ButtonState +extension WorkItemButton { + enum ButtonState { + case focused + case normal + case disabled + + var backgroundColor: Color { + switch self { + case .focused, .normal: + return .beige100 + case .disabled: + return .beige400 + } + } + + var borderColor: Color? { + switch self { + case .focused: + return .black + default: + return nil + } + } + + var isDisabled: Bool { + return self == .disabled + } + } +} + +#Preview { + @Previewable @State var buttonState1: WorkItemButton.ButtonState = .normal + @Previewable @State var buttonState2: WorkItemButton.ButtonState = .focused + @Previewable @State var buttonState3: WorkItemButton.ButtonState = .disabled + + VStack(spacing: 20) { + HStack { + WorkItemButton( + title: "타이틀", + imageName: "housing_street", + buttonState: $buttonState1 + ) + WorkItemButton( + title: "타이틀", + imageName: "housing_street", + buttonState: $buttonState2 + ) + WorkItemButton( + title: "타이틀", + imageName: "housing_street", + buttonState: $buttonState3 + ) + } + } + .padding(.horizontal) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/WorkSegmentControl.swift b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/WorkSegmentControl.swift new file mode 100644 index 00000000..90a49d5e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/DesignSystem/Components/WorkSegmentControl.swift @@ -0,0 +1,117 @@ +// +// WorkSegmentControl.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/14/26. +// + +import SwiftUI + +private enum Constant { + static let itemSpacing: CGFloat = 2 +} + +struct WorkSegmentControl: View { + let items: [WorkItem] + var onLockedTap: ((Career) -> Void)? + @Binding var selectedIndex: Int + + var body: some View { + HStack(spacing: Constant.itemSpacing) { + ForEach(items.indices, id: \.self) { index in + WorkItemButton( + title: items[index].title, + imageName: items[index].imageName, + buttonState: .constant(buttonState(for: index)), + onTap: { + handleTap(at: index) + } + ) + .overlay { + if items[index].isDisabled { + Color.clear + .contentShape(Rectangle()) + .onTapGesture { + handleLockedTap(at: index) + } + } + } + } + } + } +} + +private extension WorkSegmentControl { + func handleTap(at index: Int) { + guard !items[index].isDisabled else { return } + selectedIndex = index + } + + func handleLockedTap(at index: Int) { + guard let requiredCareer = items[index].requiredCareer else { return } + onLockedTap?(requiredCareer) + } + + func buttonState(for index: Int) -> WorkItemButton.ButtonState { + if items[index].isDisabled { + return .disabled + } else if selectedIndex == index { + return .focused + } else { + return .normal + } + } +} + +struct WorkItem { + let title: String + let imageName: String + let isDisabled: Bool + let requiredCareer: Career? + + init( + title: String, + imageName: String, + isDisabled: Bool = false, + requiredCareer: Career? = nil + ) { + self.title = title + self.imageName = imageName + self.isDisabled = isDisabled + self.requiredCareer = requiredCareer + } +} + +#Preview { + @Previewable @State var selectedIndex: Int = 0 + + VStack(spacing: 20) { + Text("Selected Index: \(selectedIndex)") + .textStyle(.headline) + + WorkSegmentControl( + items: [ + WorkItem( + title: "테스트", + imageName: GameType.tap.imageName + ), + WorkItem( + title: "테스트", + imageName: GameType.tap.imageName + ), + WorkItem( + title: "테스트", + imageName: GameType.tap.imageName, + isDisabled: true + ), + WorkItem( + title: "테스트", + imageName: GameType.tap.imageName, + isDisabled: false + ) + ], + selectedIndex: $selectedIndex + ) + } + .padding() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/CheatSystem/CheatManager.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/CheatSystem/CheatManager.swift new file mode 100644 index 00000000..e40a1de1 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/CheatSystem/CheatManager.swift @@ -0,0 +1,20 @@ +// +// CheatManager.swift +// SoloDeveloperTraining-Dev +// +// Created by sunjae on 1/9/26. +// + +import Foundation + +enum CheatManager { + static func performCheatingActions(game: TapGame, count: Int) async { + /// 백그라운드에서 수행합니다. + await Task.detached(priority: .userInitiated) { + for _ in 0.. 0 ? "+\(goldChange)" : "\(goldChange)") + .font(.title) + .bold() + .foregroundColor(goldChange > 0 ? .green : .red) + .position( + x: gameAreaWidth / 2 + game.motionSystem.characterX, + y: gameAreaHeight - gameAreaHeight * 0.375 + ) + .transition(.move(edge: .top).combined(with: .opacity)) + } + } + .frame(width: gameAreaWidth, height: gameAreaHeight) + + Spacer() + + // 시뮬레이터 테스트용 슬라이더 + VStack(spacing: 10) { + Text("🎮 Simulator Control") + .font(.headline) + HStack(spacing: 12) { + Text("←") + .font(.title2) + Slider(value: .init(get: { + sliderValue + }, set: { value in + sliderValue = value + game.motionSystem.characterX = value * game.motionSystem.screenLimit + }), in: -1...1) + .frame(width: max(gameAreaWidth - 80, 200)) + Text("→") + .font(.title2) + } + } + .padding() + + // 게임 정보 표시 + VStack(spacing: 15) { + // 현재 골드 + HStack { + Text("💰 Gold:") + .font(.headline) + Text("\(currentGold)") + .font(.title2) + .bold() + } + + // 액션당 획득 골드 + HStack { + Text("📈 Per Action:") + .font(.headline) + Text("\(goldPerAction)") + .font(.title3) + .bold() + .foregroundColor(.blue) + } + + // 버프 사용 시간 + HStack { + Text("⚡️ Buff Time:") + .font(.headline) + Text("\(buffDuration)s") + .font(.title3) + .bold() + .foregroundColor(buffDuration > 0 ? .orange : .gray) + } + + // Start/Stop 버튼 + Button( + action: { + if game.gameCore.isRunning == true { + game.stopGame() + } else { + game.startGame() + } + }, + label: { + Text(game.gameCore.isRunning == true ? "⏸ Stop" : "▶️ Start") + .font(.headline) + .padding(.horizontal, 40) + .padding(.vertical, 12) + .background(game.gameCore.isRunning == true ? Color.red : Color.green) + .foregroundColor(.white) + .cornerRadius(10) + } + ) + .withTapSound() + .padding(.top, 5) + } + .padding() + } + .onChange(of: geometry.size) { _, newSize in + updateGameArea(for: newSize) + } + .onAppear { + setupGame(with: geometry.size) + } + } + } + + private func updateGameArea(for size: CGSize) { + // 게임 영역 크기 계산 + let availableWidth = size.width - 32 // padding 고려 + let availableHeight = size.height * 0.5 // 화면의 50% 사용 + + gameAreaWidth = availableWidth + gameAreaHeight = availableHeight + + // 게임 시스템에 크기 전달 (gameCore와 motionSystem 모두 업데이트) + game.configure(gameAreaSize: CGSize(width: availableWidth, height: availableHeight)) + } + + private func setupGame(with size: CGSize) { + // 게임 영역 크기 설정 + updateGameArea(for: size) + + // 골드 변화 콜백 설정 + game.setGoldChangedHandler { goldDelta in + showGoldChangeAnimation(goldDelta) + } + + // 초기 값 업데이트 + Task { + await updateGold() + await updateItemCounts() + } + + // 상태 변화 감지를 위한 타이머 + Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in + Task { + await self.updateGold() + await self.updateItemCounts() + await self.updateGoldPerAction() + await MainActor.run { + self.buffDuration = game.buffSystem.duration + } + } + } + } + + private func updateGoldPerAction() async { + let perAction = Calculator.calculateGoldPerAction( + game: .dodge, + user: game.user, + feverMultiplier: game.feverSystem.feverMultiplier, + buffMultiplier: game.buffSystem.multiplier + ) + await MainActor.run { + goldPerAction = perAction + } + } + + private func showGoldChangeAnimation(_ goldDelta: Int) { + // 이전 애니메이션 작업 취소 + goldAnimationTask?.cancel() + + // 새 골드 변화 설정 + recentGoldChange = goldDelta + + withAnimation(.easeIn(duration: 0.2)) { + showGoldAnimation = true + } + + // 새 애니메이션 작업 생성 + let task = DispatchWorkItem { + withAnimation(.easeOut(duration: 0.3)) { + showGoldAnimation = false + } + } + goldAnimationTask = task + + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: task) + } + + private func updateGold() async { + let gold = game.user.wallet.gold + await MainActor.run { + currentGold = gold + } + } + + private func updateItemCounts() async { + let coffee = game.user.inventory.count(.coffee) ?? 0 + let energyDrink = game.user.inventory.count(.energyDrink) ?? 0 + await MainActor.run { + coffeeCount = coffee + energyDrinkCount = energyDrink + } + } + + private func useCoffee() { + Task { + let success = game.user.inventory.drink(.coffee) + if success { + game.buffSystem.useConsumableItem(type: .coffee) + } + } + } + + private func useEnergyDrink() { + Task { + let success = game.user.inventory.drink(.energyDrink) + if success { + game.buffSystem.useConsumableItem(type: .energyDrink) + } + } + } +} + +#Preview { + let wallet = Wallet(gold: 1000, diamond: 0) + let inventory = Inventory( + equipmentItems: [], + consumableItems: [ + .init(type: .coffee, count: 5), + .init(type: .energyDrink, count: 5) + ], + housing: .init(tier: .street) + ) + let record = Record() + let user = User( + nickname: "TestUser", + wallet: wallet, + inventory: inventory, + record: record, + skills: [ + .init(key: SkillKey(game: .dodge, tier: .beginner), level: 1000) + ] + ) + DodgeGameTestView(user: user) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/LanguageGameTestView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/LanguageGameTestView.swift new file mode 100644 index 00000000..395d7e46 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/LanguageGameTestView.swift @@ -0,0 +1,108 @@ +// +// LanguageGameView.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/13/26. +// + +import SwiftUI + +private enum Constant { + enum Spacing { + static let vertical: CGFloat = 67 + static let itemHorizontal: CGFloat = 25 + static let buttonHorizontal: CGFloat = 17 + } +} + +struct LanguageGameTestView: View { + let user: User + let game: LanguageGame + let languageTypeList: [LanguageType] = [ + .swift, + .kotlin, + .dart, + .python + ] + + @State private var coffeeCount: Int + @State private var energyDrinkCount: Int + + init(user: User) { + self.user = user + coffeeCount = user.inventory.count(.coffee) ?? 0 + energyDrinkCount = user.inventory.count(.energyDrink) ?? 0 + + self.game = .init( + user: user, + feverSystem: .init( + decreaseInterval: 0.1, + decreasePercentPerTick: 10 + ), + buffSystem: .init(), + itemCount: 5 // 임시로 설정 + ) + self.game.startGame() + } + + var body: some View { + VStack(alignment: .center) { + GameToolBar( + closeButtonDidTapHandler: {}, + coffeeButtonDidTapHandler: { + useConsumableItem(.coffee) + }, + energyDrinkButtonDidTapHandler: { + useConsumableItem(.energyDrink) + }, + feverState: game.feverSystem, + buffSystem: game.buffSystem, + coffeeCount: $coffeeCount, + energyDrinkCount: $energyDrinkCount, + ) + + Text("총 재화: \(user.wallet.gold)") + Spacer() + + ScrollView(.horizontal) { + HStack(alignment: .center, spacing: Constant.Spacing.itemHorizontal) { + Spacer(minLength: 0) + ForEach(game.itemList.indices, id: \.self) { index in + let item = game.itemList[index] + LanguageItem( + languageType: item.languageType, + state: item.state + ) + } + Spacer(minLength: 0) + } + }.scrollIndicators(.never) + + Spacer() + + HStack(spacing: Constant.Spacing.buttonHorizontal) { + ForEach(languageTypeList, id: \.self) { type in + LanguageButton(languageType: type, action: { + Task { + _ = await game.didPerformAction(type) + } + }) + } + } + }.padding() + } +} + +private extension LanguageGameTestView { + func useConsumableItem(_ type: ConsumableType) { + let isSuccess = user.inventory.drink(.coffee) + if isSuccess { + self.updateConsumableItems() + } + } + + func updateConsumableItems() { + coffeeCount = user.inventory.count(.coffee) ?? 0 + energyDrinkCount = user.inventory.count(.energyDrink) ?? 0 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/MissionTestView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/MissionTestView.swift new file mode 100644 index 00000000..82124f8b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/MissionTestView.swift @@ -0,0 +1,822 @@ +// +// MissionTestView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-08. +// + +import SwiftUI + +// swiftlint:disable type_body_length + +struct MissionTestView: View { + // 시스템 객체들 + @State private var missionSystem: MissionSystem + @State private var record: Record + @State private var wallet: Wallet + + // UI 상태 + @State private var showAlert = false + @State private var alertMessage = "" + + init() { + // 팩토리를 사용하여 전체 미션 목록 생성 + let missions = MissionFactory.createAllMissions() + + _missionSystem = State(initialValue: MissionSystem(missions: missions)) + _record = State(initialValue: Record()) + _wallet = State(initialValue: Wallet()) + } + + var body: some View { + NavigationView { + ScrollView { + VStack(spacing: 20) { + // 상단: 재화 표시 + walletSection + + // 탭 카운터 섹션 + tapCounterSection + + // 언어 맞추기 섹션 + languageGameSection + + // 버그 피하기 섹션 + bugDodgeSection + + // 데이터 쌓기 섹션 + stackingGameSection + + // 소비 아이템 섹션 + consumableSection + + // 특수 달성 섹션 + specialAchievementSection + + // 미션 완료 알림 + if missionSystem.hasCompletedMission { + completionBanner + } + + // 미션 목록 + missionsSection + } + .padding() + } + .navigationTitle("미션 시스템 테스트") + .alert("알림", isPresented: $showAlert) { + Button("확인", role: .cancel) {} + .withTapSound() + } message: { + Text(alertMessage) + } + } + } + + // MARK: - Wallet Section + private var walletSection: some View { + HStack(spacing: 30) { + VStack { + Image(systemName: "dollarsign.circle.fill") + .font(.system(size: 40)) + .foregroundStyle(.yellow) + Text("골드") + .font(.caption) + Text("\(wallet.gold)") + .font(.title2) + .bold() + } + + VStack { + Image(systemName: "diamond.fill") + .font(.system(size: 40)) + .foregroundStyle(.cyan) + Text("다이아몬드") + .font(.caption) + Text("\(wallet.diamond)") + .font(.title2) + .bold() + } + } + .frame(maxWidth: .infinity) + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.background) + .shadow(color: .black.opacity(0.1), radius: 5) + ) + } + + // MARK: - Tap Counter Section + private var tapCounterSection: some View { + VStack(spacing: 15) { + Text("총 탭 횟수") + .font(.headline) + + Text("\(record.totalTapCount)") + .font(.system(size: 48, weight: .bold)) + .foregroundStyle(.blue) + + HStack(spacing: 15) { + Button { + performTap() + } label: { + Label("탭 +1", systemImage: "hand.tap.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.blue) + .foregroundStyle(.white) + .cornerRadius(10) + } + + Button { + performTap(count: 10) + } label: { + Label("탭 +10", systemImage: "hand.tap.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.purple) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + + HStack(spacing: 15) { + Button { + performTap(count: 100) + } label: { + Label("탭 +100", systemImage: "bolt.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.orange) + .foregroundStyle(.white) + .cornerRadius(10) + } + + Button { + performTap(count: 1000) + } label: { + Label("탭 +1000", systemImage: "bolt.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.red) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + + } + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.background) + .shadow(color: .black.opacity(0.1), radius: 5) + ) + } + + // MARK: - Language Game Section + private var languageGameSection: some View { + VStack(spacing: 15) { + Text("언어 맞추기 게임") + .font(.headline) + + HStack { + VStack { + Text("정답 횟수") + .font(.caption) + Text("\(record.languageCorrectCount)") + .font(.title3) + .bold() + .foregroundStyle(.green) + } + + Spacer() + + VStack { + Text("연속 정답") + .font(.caption) + Text("\(record.languageConsecutiveCorrect)") + .font(.title3) + .bold() + .foregroundStyle(.orange) + } + } + .padding(.vertical, 5) + + HStack(spacing: 15) { + Button { + performLanguageCorrect() + } label: { + Label("정답", systemImage: "checkmark.circle.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.green) + .foregroundStyle(.white) + .cornerRadius(10) + } + + Button { + performLanguageIncorrect() + } label: { + Label("오답 (리셋)", systemImage: "xmark.circle.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.red) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + } + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.background) + .shadow(color: .black.opacity(0.1), radius: 5) + ) + } + + // MARK: - Bug Dodge Section + private var bugDodgeSection: some View { + VStack(spacing: 15) { + Text("버그 피하기 게임") + .font(.headline) + + HStack { + VStack { + Text("골드 획득") + .font(.caption) + Text("\(record.dodgeGoldCollectedCount)") + .font(.title3) + .bold() + .foregroundStyle(.yellow) + } + + Spacer() + + VStack { + Text("최고 콤보") + .font(.caption) + Text("\(record.dodgeMaxCombo)") + .font(.title3) + .bold() + .foregroundStyle(.cyan) + } + } + .padding(.vertical, 5) + + HStack(spacing: 15) { + Button { + performDodgeGoldHit() + } label: { + Label("골드 획득 (성공)", systemImage: "checkmark.circle.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.yellow) + .foregroundStyle(.black) + .cornerRadius(10) + } + + Button { + performDodgeGoldHit(count: 100) + } label: { + Label("골드 +100", systemImage: "bolt.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.orange) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + + HStack(spacing: 15) { + Button { + performDodgeFail() + } label: { + Label("버그 충돌 (실패)", systemImage: "xmark.circle.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.red) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + } + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.background) + .shadow(color: .black.opacity(0.1), radius: 5) + ) + } + + // MARK: - Stacking Game Section + private var stackingGameSection: some View { + VStack(spacing: 15) { + Text("데이터 쌓기 게임") + .font(.headline) + + HStack { + VStack { + Text("성공 횟수") + .font(.caption) + Text("\(record.stackingSuccessCount)") + .font(.title3) + .bold() + .foregroundStyle(.purple) + } + + Spacer() + + VStack { + Text("연속 성공") + .font(.caption) + Text("\(record.stackConsecutiveSuccess)") + .font(.title3) + .bold() + .foregroundStyle(.indigo) + } + } + .padding(.vertical, 5) + + HStack(spacing: 15) { + Button { + performStackingSuccess() + } label: { + Label("성공 +1", systemImage: "checkmark.circle.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.purple) + .foregroundStyle(.white) + .cornerRadius(10) + } + + Button { + performStackingSuccess(count: 10) + } label: { + Label("성공 +10", systemImage: "bolt.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.indigo) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + + HStack(spacing: 15) { + Button { + performStackingFail() + } label: { + Label("실패 (리셋)", systemImage: "xmark.circle.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.red) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + } + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.background) + .shadow(color: .black.opacity(0.1), radius: 5) + ) + } + + // MARK: - Consumable Section + private var consumableSection: some View { + VStack(spacing: 15) { + Text("소비 아이템") + .font(.headline) + + HStack { + VStack { + Text("커피") + .font(.caption) + Text("\(record.coffeeUseCount)") + .font(.title3) + .bold() + .foregroundStyle(.brown) + } + + Spacer() + + VStack { + Text("박하스") + .font(.caption) + Text("\(record.energyDrinkUseCount)") + .font(.title3) + .bold() + .foregroundStyle(.mint) + } + } + .padding(.vertical, 5) + + HStack(spacing: 15) { + Button { + performCoffeeUse() + } label: { + Label("커피 +1", systemImage: "cup.and.saucer.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.brown) + .foregroundStyle(.white) + .cornerRadius(10) + } + + Button { + performCoffeeUse(count: 10) + } label: { + Label("커피 +10", systemImage: "bolt.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.brown.opacity(0.7)) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + + HStack(spacing: 15) { + Button { + performEnergyDrinkUse() + } label: { + Label("박하스 +1", systemImage: "bolt.circle.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.mint) + .foregroundStyle(.white) + .cornerRadius(10) + } + + Button { + performEnergyDrinkUse(count: 10) + } label: { + Label("박하스 +10", systemImage: "bolt.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.mint.opacity(0.7)) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + } + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.background) + .shadow(color: .black.opacity(0.1), radius: 5) + ) + } + + // MARK: - Special Achievement Section + private var specialAchievementSection: some View { + VStack(spacing: 15) { + Text("특수 달성") + .font(.headline) + + HStack { + VStack { + Text("튜토리얼") + .font(.caption) + Text(record.tutorialCompleted ? "완료" : "미완료") + .font(.caption) + .bold() + .foregroundStyle(record.tutorialCompleted ? .green : .gray) + } + + Spacer() + + VStack { + Text("하찮은 개발자") + .font(.caption) + Text(record.hasAchievedJuniorDeveloper ? "달성" : "미달성") + .font(.caption) + .bold() + .foregroundStyle(record.hasAchievedJuniorDeveloper ? .green : .gray) + } + } + .padding(.vertical, 5) + + HStack(spacing: 15) { + Button { + performTutorialComplete() + } label: { + Label("튜토리얼 완료", systemImage: "graduationcap.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.blue) + .foregroundStyle(.white) + .cornerRadius(10) + } + .disabled(record.tutorialCompleted) + + Button { + performCareerAchieve() + } label: { + Label("커리어 달성", systemImage: "star.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.purple) + .foregroundStyle(.white) + .cornerRadius(10) + } + .disabled(record.hasAchievedJuniorDeveloper) + } + + HStack(spacing: 15) { + Button { + addPlayTime(hours: 1) + } label: { + Label("플레이타임 +1시간", systemImage: "clock.fill") + .frame(maxWidth: .infinity) + .padding() + .background(Color.teal) + .foregroundStyle(.white) + .cornerRadius(10) + } + + Button { + addPlayTime(hours: 10) + } label: { + Label("플레이타임 +10시간", systemImage: "clock.arrow.circlepath") + .frame(maxWidth: .infinity) + .padding() + .background(Color.teal.opacity(0.7)) + .foregroundStyle(.white) + .cornerRadius(10) + } + } + + VStack(alignment: .leading, spacing: 4) { + Text("총 플레이 시간") + .font(.caption) + .foregroundStyle(.secondary) + Text("\(Int(record.totalPlayTime / 3600))시간") + .font(.title3) + .bold() + .foregroundStyle(.teal) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.background) + .shadow(color: .black.opacity(0.1), radius: 5) + ) + } + + // MARK: - Completion Banner + private var completionBanner: some View { + HStack { + Image(systemName: "trophy.fill") + .font(.title) + .foregroundStyle(.yellow) + + Text("완료된 미션이 있습니다!") + .font(.headline) + + Spacer() + } + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.yellow.opacity(0.2)) + .overlay( + RoundedRectangle(cornerRadius: 12) + .stroke(.yellow, lineWidth: 2) + ) + ) + } + + // MARK: - Missions Section + private var missionsSection: some View { + VStack(alignment: .leading, spacing: 15) { + Text("미션 목록") + .font(.title2) + .bold() + + ForEach(missionSystem.missions, id: \.id) { mission in + MissionCardTest( + mission: mission, + onAcquire: { + acquireMission(mission) + } + ) + } + } + } + + // MARK: - Actions + private func performTap(count: Int = 1) { + record.record(.tap(count: count)) + missionSystem.updateCompletedMissions(record: record) + } + + private func acquireMission(_ mission: Mission) { + guard mission.state == .claimable else { + alertMessage = "수령할 수 없는 업적입니다" + showAlert = true + return + } + + missionSystem.claimMissionReward(mission: mission, wallet: wallet) + + var message = "미션 '\(mission.title)' 보상을 수령했습니다!\n" + if mission.reward.gold > 0 { + message += "골드 +\(mission.reward.gold)\n" + } + if mission.reward.diamond > 0 { + message += "다이아몬드 +\(mission.reward.diamond)" + } + + alertMessage = message + showAlert = true + } + + private func performLanguageCorrect() { + record.record(.languageCorrect) + missionSystem.updateCompletedMissions(record: record) + } + + private func performLanguageIncorrect() { + record.record(.languageIncorrect) + missionSystem.updateCompletedMissions(record: record) + } + + private func performDodgeGoldHit(count: Int = 1) { + for _ in 0.. Void + + private var stateColor: Color { + switch mission.state { + case .inProgress: return .gray + case .claimable: return .green + case .claimed: return .blue + } + } + + private var stateIcon: String { + switch mission.state { + case .inProgress: return "clock.fill" + case .claimable: return "gift.fill" + case .claimed: return "checkmark.circle.fill" + } + } + + private var stateText: String { + switch mission.state { + case .inProgress: return "진행 중" + case .claimable: return "수령 가능" + case .claimed: return "완료" + } + } + + var body: some View { + VStack(alignment: .leading, spacing: 12) { + HStack { + VStack(alignment: .leading, spacing: 4) { + Text(mission.title) + .font(.headline) + + Text(mission.description) + .font(.caption) + .foregroundStyle(.secondary) + } + + Spacer() + + VStack { + Image(systemName: stateIcon) + .font(.title2) + .foregroundStyle(stateColor) + + Text(stateText) + .font(.caption2) + .foregroundStyle(stateColor) + } + } + + // 진행도 바 + VStack(alignment: .leading, spacing: 4) { + HStack { + Text("\(mission.currentValue) / \(mission.targetValue)") + .font(.caption) + .foregroundStyle(.secondary) + + Spacer() + + Text("\(Int(mission.progress * 100))%") + .font(.caption) + .foregroundStyle(.secondary) + } + + ProgressView(value: mission.progress) + .tint(stateColor) + } + + // 보상 표시 + HStack { + if mission.reward.gold > 0 { + Label("\(mission.reward.gold)", systemImage: "dollarsign.circle.fill") + .font(.caption) + .foregroundStyle(.yellow) + } + + if mission.reward.diamond > 0 { + Label("\(mission.reward.diamond)", systemImage: "diamond.fill") + .font(.caption) + .foregroundStyle(.cyan) + } + + Spacer() + + if mission.state == .claimable { + Button { + onAcquire() + } label: { + Text("수령") + .font(.caption) + .padding(.horizontal, 12) + .padding(.vertical, 6) + .background(Color.green) + .foregroundStyle(.white) + .cornerRadius(8) + } + } + } + } + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.background) + .overlay( + RoundedRectangle(cornerRadius: 12) + .stroke(stateColor.opacity(0.3), lineWidth: 2) + ) + .shadow(color: .black.opacity(0.05), radius: 3) + ) + } +} + +// MARK: - Preview +#Preview { + MissionTestView() +} + diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/QuizGameTestContentView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/QuizGameTestContentView.swift new file mode 100644 index 00000000..78ef1132 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/QuizGameTestContentView.swift @@ -0,0 +1,327 @@ +// +// QuizGameTestContentView.swift +// SoloDeveloperTraining +// +// Created by Claude on 1/21/26. +// + +import SwiftUI + +private enum Constant { + enum Padding { + static let horizontal: CGFloat = 16 + static let vertical: CGFloat = 20 + static let questionTop: CGFloat = 40 + static let optionsSpacing: CGFloat = 12 + static let submitTop: CGFloat = 24 + } + + enum Timer { + static let height: CGFloat = 8 + static let cornerRadius: CGFloat = 4 + } +} + +struct QuizGameTestContentView: View { + // MARK: - Properties + @State var game: QuizGame + + @Binding var isGameStarted: Bool + + // MARK: - State + @State private var showCompletionAlert = false + @State private var hasStarted = false + + init(user: User, isGameStarted: Binding) { + self._isGameStarted = isGameStarted + self._game = State(initialValue: QuizGame(user: user)) + } + + var body: some View { + let state = game.state + + ZStack { + Color.white.ignoresSafeArea() + + VStack(spacing: 0) { + // 헤더 (닫기 버튼, 진행도) + headerSection + + // 타이머 프로그래스 바 + timerProgressBar + + // 문제 및 선택지 + if state.phase == .questionInProgress || state.phase == .showingExplanation { + questionSection + } else if state.phase == .completed { + EmptyView() + } + + Spacer() + } + } + .onAppear { + if !hasStarted { + print("👀 View appeared, starting game") + game.startGame() + hasStarted = true + } + } + .alert("퀴즈 완료!", isPresented: $showCompletionAlert) { + Button("확인") { + isGameStarted = false + } + .withTapSound() + } message: { + Text("정답: \(state.correctAnswersCount)/3개\n획득 다이아: \(state.totalDiamondsEarned)개") + } + .onChange(of: state.phase) { _, newPhase in + if newPhase == .completed { + showCompletionAlert = true + } + } + } +} + +// MARK: - View Components +private extension QuizGameTestContentView { + var headerSection: some View { + let state = game.state + + return VStack(spacing: 8) { + HStack { + Button { + game.stopGame() + isGameStarted = false + } label: { + Image(systemName: "xmark") + .resizable() + .frame(width: 20, height: 20) + .foregroundStyle(.black) + } + + Spacer() + + Text(state.progressText) + .textStyle(.title3) + .foregroundStyle(.black) + + Spacer() + + // 대칭을 위한 투명 공간 + Color.clear.frame(width: 20, height: 20) + } + + // 현재 다이아 표시 + HStack { + Image(systemName: "diamond.fill") + .foregroundStyle(.blue) + Text("다이아: \(game.user.wallet.diamond)") + .textStyle(.body) + .foregroundStyle(.black) + } + } + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.vertical, Constant.Padding.vertical) + } + + var timerProgressBar: some View { + let state = game.state + + return GeometryReader { geometry in + ZStack(alignment: .leading) { + // 배경 + Rectangle() + .fill(Color.gray.opacity(0.2)) + .frame(height: Constant.Timer.height) + + // 진행 바 + Rectangle() + .fill(timerColor) + .frame( + width: geometry.size.width * state.timerProgress, + height: Constant.Timer.height + ) + .animation(.linear(duration: 1.0), value: state.timerProgress) + } + .cornerRadius(Constant.Timer.cornerRadius) + } + .frame(height: Constant.Timer.height) + .padding(.horizontal, Constant.Padding.horizontal) + } + + var timerColor: Color { + let progress = game.state.timerProgress + if progress > 0.5 { + return .blue + } else if progress > 0.2 { + return .yellow + } else { + return .red + } + } + + var questionSection: some View { + let state = game.state + + return VStack(alignment: .leading, spacing: Constant.Padding.optionsSpacing) { + // 문제 텍스트 + if let question = state.currentQuestion { + Text(question.question) + .textStyle(.headline) + .foregroundStyle(.black) + .padding(.top, Constant.Padding.questionTop) + .padding(.bottom, Constant.Padding.vertical) + + // 답안 선택지 + ForEach(0.. some View { + let state = game.state + + return QuizButton( + isSelected: state.selectedAnswerIndex == index, + title: "\(index + 1). \(text)" + ) { + if state.phase == .questionInProgress { + game.selectAnswer(index) + } + } + .overlay { + // 제출 후 정답/오답 표시 + if state.phase == .showingExplanation { + correctnessOverlay(for: index) + } + } + .disabled(state.phase != .questionInProgress) + } + + @ViewBuilder + func correctnessOverlay(for index: Int) -> some View { + let state = game.state + + return Group { + if let question = state.currentQuestion { + if index == question.correctAnswerIndex { + // 정답에 체크 표시 + HStack { + Spacer() + Image(systemName: "checkmark.circle.fill") + .foregroundStyle(.green) + .font(.system(size: 24)) + .padding() + } + } else if index == state.selectedAnswerIndex && state.currentAnswerResult != .correct { + // 선택한 오답에 X 표시 + HStack { + Spacer() + Image(systemName: "xmark.circle.fill") + .foregroundStyle(.red) + .font(.system(size: 24)) + .padding() + } + } + } + } + } + + var submitButton: some View { + let state = game.state + + return LargeButton( + title: "제출", + isEnabled: state.isSubmitEnabled + ) { + game.submitSelectedAnswer() + } + .frame(maxWidth: .infinity) + .padding(.top, Constant.Padding.submitTop) + } + + var explanationSection: some View { + let state = game.state + + return VStack(alignment: .leading, spacing: 16) { + // 정답/오답 표시 + HStack { + Image(systemName: resultIcon) + .foregroundStyle(resultColor) + .font(.system(size: 24)) + Text(resultText) + .textStyle(.title3) + .foregroundStyle(resultColor) + } + + // 해설 + if let question = state.currentQuestion { + Text("해설") + .textStyle(.headline) + .foregroundStyle(.black) + + Text(question.explanation) + .textStyle(.body) + .foregroundStyle(.gray) + } + + // 다음 버튼 + LargeButton( + title: state.nextButtonTitle + ) { + game.proceedToNextQuestion() + } + .frame(maxWidth: .infinity) + .padding(.top, 8) + } + .padding(.top, Constant.Padding.submitTop) + } + + var resultIcon: String { + switch game.state.currentAnswerResult { + case .correct: return "checkmark.circle.fill" + case .incorrect, .timeout: return "xmark.circle.fill" + case .none: return "" + } + } + + var resultColor: Color { + switch game.state.currentAnswerResult { + case .correct: return .green + case .incorrect, .timeout: return .red + case .none: return .black + } + } + + var resultText: String { + switch game.state.currentAnswerResult { + case .correct: return "정답입니다!" + case .incorrect: return "오답입니다." + case .timeout: return "시간 초과!" + case .none: return "" + } + } +} + +#Preview { + struct PreviewWrapper: View { + @State private var isGameStarted = true + + var body: some View { + QuizGameTestView() + } + } + + return PreviewWrapper() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/QuizGameTestView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/QuizGameTestView.swift new file mode 100644 index 00000000..9a9012e6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/QuizGameTestView.swift @@ -0,0 +1,52 @@ +// +// QuizGameTestView.swift +// SoloDeveloperTraining +// +// Created by Claude on 1/21/26. +// + +import SwiftUI + +struct QuizGameTestView: View { + @State private var isGameStarted = false + @State private var user: User + + init() { + self._user = State(initialValue: User( + nickname: "퀴즈 테스터", + wallet: Wallet(gold: 0, diamond: 100), + inventory: Inventory(), + record: Record(), + skills: [] + )) + } + + var body: some View { + ZStack { + Color.white.ignoresSafeArea() + + if isGameStarted { + QuizGameTestContentView(user: user, isGameStarted: $isGameStarted) + } else { + VStack(spacing: 20) { + Text("퀴즈 게임 테스트") + .textStyle(.title) + .foregroundStyle(.black) + + Text("현재 다이아: \(user.wallet.diamond)") + .textStyle(.headline) + .foregroundStyle(.gray) + + LargeButton(title: "퀴즈 시작") { + isGameStarted = true + } + .padding() + } + } + } + } +} + +#Preview { + QuizGameTestView() +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/ShopTestView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/ShopTestView.swift new file mode 100644 index 00000000..73ad9930 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/ShopTestView.swift @@ -0,0 +1,65 @@ +// +// ShopTestView.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/7/26. +// + +import SwiftUI + +struct ShopTestView: View { + let user: User + let shopSystem: ShopSystem + + init(user: User) { + self.user = user + self.shopSystem = .init(user: user) + } + var body: some View { + VStack { + Text("보유 골드: \(user.wallet.gold)") + Text("보유 다이아: \(user.wallet.diamond)") + Text("초당 획득 골드: \(Calculator.calculateGoldPerSecond(user: user))") + Text("부동산: \(user.inventory.housing.displayTitle)") + + ScrollView { + LazyVStack(spacing: 0) { + ForEach(shopSystem.itemList(itemTypes: [.consumable, .equipment, .housing])) { item in + ItemRow( + title: item.displayTitle + "\(item.isEquipped ? "-착용중" : "")", + description: item.description, + imageName: item.imageName, + cost: item.cost, + state: item.isPurchasable ? .available : .insufficient + ) { + do { + try shopSystem.buy(item: item) + } catch { + print(error) + } + } + } + } + } + .scrollBounceBehavior(.basedOnSize) + } + } +} + +#Preview { + let user = User( + nickname: "user", + wallet: .init(gold: 1000000, diamond: 100), + inventory: .init(), + record: .init(), + skills: [ + .init(key: .init(game: .tap, tier: .beginner), level: 1000), + .init( + key: .init(game: .tap, tier: .intermediate), + level: 1000 + ), + .init(key: .init(game: .tap, tier: .advanced), level: 1000) + ] + ) + ShopTestView(user: user) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/SkillTestView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/SkillTestView.swift new file mode 100644 index 00000000..1b7b49d8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/SkillTestView.swift @@ -0,0 +1,112 @@ +// +// SkillTestView.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/20/26. +// + +import SwiftUI + +struct SkillTestView: View { + let user: User + let skillSystem: SkillSystem + + init(user: User) { + self.user = user + self.skillSystem = .init(user: user, careerSystem: nil) + } + var body: some View { + VStack { + Text("보유 골드: \(user.wallet.gold)") + Text("보유 다이아: \(user.wallet.diamond)") + Text("초당 획득 골드: \(Calculator.calculateGoldPerSecond(user: user))") + + List(skillSystem.skillList(), id: \.skill) { skillState in + itemRowView(skillState) + } + } + } +} + +private extension SkillTestView { + func itemRowView(_ skillState: SkillState) -> some View { + + return HStack { + VStack(alignment: .leading, spacing: 4) { + HStack { + Text( + "\(skillState.skill.key.game.displayTitle) " + + "\(skillState.skill.key.tier.displayTitle) " + + "Lv.\(skillState.skill.level)" + ) + if skillState.itemState == .locked { + Image(systemName: "lock.fill") + .font(.caption) + .foregroundStyle(.secondary) + } + } + + Text("획득 재화 \(skillState.skill.gainGold.formatted())") + .font(.caption) + .foregroundStyle(.secondary) + + if skillState.itemState == .locked { + Text(unlockConditionText(skillState.skill)) + .font(.caption2) + .foregroundStyle(.red) + } + } + + Spacer() + + Button { + do { + try skillSystem.upgrade(skill: skillState.skill) + } catch { + print(error.localizedDescription) + } + } label: { + VStack(alignment: .trailing) { + Text("💰 \(skillState.skill.upgradeCost.gold)") + Text("💎 \(skillState.skill.upgradeCost.diamond)") + } + .padding(6) + .background( + RoundedRectangle(cornerRadius: 6) + .stroke(skillState.itemState == .locked ? .gray : .black) + ) + } + .disabled(skillState.itemState != .available) + } + .padding(.vertical, 6) + .opacity(skillState.itemState == .locked ? 0.45 : 1.0) + } + + func unlockConditionText(_ skill: Skill) -> String { + switch skill.key.tier { + case .beginner: + return "" + case .intermediate: + return "초급 Lv.1000 필요" + case .advanced: + return "중급 Lv.1000 필요" + } + } +} + +#Preview { + let user = User( + nickname: "user", + wallet: .init(gold: 1000000000, diamond: 100), + inventory: .init(), + record: .init(), + skills: Set( + GameType.allCases.flatMap { game in + SkillTier.allCases.map { tier in + Skill(key: .init(game: game, tier: tier), level: tier.levelRange.minValue) + } + } + ) + ) + SkillTestView(user: user) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/StackGameScene.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/StackGameScene.swift new file mode 100644 index 00000000..247a5937 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/StackGameScene.swift @@ -0,0 +1,291 @@ +// +// StackGameScene.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-13. +// + +import SpriteKit + +private enum Constant { + enum Physics { + static let gravity = CGVector(dx: 0, dy: -9.8) + } + + enum Offset { + static let spawnYOffset: CGFloat = 100 + } + + enum Time { + // 블록 평가 체크 간격 (초) + static let evaluationCheckInterval: TimeInterval = 0.05 + // 폭탄 블록 제거 딜레이 (초) + static let bombRemovalDelay: TimeInterval = 0.8 + // 카메라 이동 애니메이션 시간 (초) + static let cameraMoveAnimationDuration: TimeInterval = 0.3 + // 다음 블록 생성 딜레이 (초) + static let nextBlockSpawnDelay: TimeInterval = 0.3 + // 실패한 블록 제거 딜레이 (초) + static let failedBlockRemovalDelay: TimeInterval = 1.0 + } +} + +final class StackGameScene: SKScene { + private let stackGame: StackGame + + private var currentBlockView: BlockItem? + private var blockViews: [BlockItem] = [] + private var currentHeight: CGFloat = 20 + /// 블록 배치 처리 중 여부 (UI 인터랙션 차단용) + private var isProcessing = false + + init(stackGame: StackGame) { + self.stackGame = stackGame + super.init(size: .zero) + self.scaleMode = .resizeFill + } + + required init?(coder aDecoder: NSCoder) { + return nil + } + + override func didMove(to view: SKView) { + // 화면 크기를 게임 코어에 전달 + stackGame.screenSize = size + setupScene() + startGame() + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + guard currentBlockView != nil, !isProcessing else { return } + dropBlock() + } + + /// 씬의 초기 설정을 수행합니다. + /// - 배경색을 흰색으로 설정 + /// - 물리 엔진의 중력 설정 + /// - 카메라 초기화 + private func setupScene() { + backgroundColor = .white + physicsWorld.gravity = Constant.Physics.gravity + + setupCamera() + } + + /// 카메라 노드를 생성하고 초기 위치를 설정합니다. + private func setupCamera() { + let cameraNode = SKCameraNode() + cameraNode.position = CGPoint(x: size.width / 2, y: size.height / 2) + addChild(cameraNode) + camera = cameraNode + } + + /// 게임을 시작하고 초기 상태로 설정합니다. + /// - 블록 배열 초기화 + /// - 게임 코어 시작 처리 + /// - 카메라 위치 리셋 + /// - 초기 블록 배치 및 첫 번째 블록 생성 + func startGame() { + blockViews = [] + currentHeight = 20 + isProcessing = false + + stackGame.startGame() + camera?.position = CGPoint(x: size.width / 2, y: size.height / 2) + + putInitialBlock() + spawnBlock() + } + + /// 게임을 중지하고 모든 진행중인 동작을 멈춥니다. + /// - 게임 코어 중지 처리 + /// - 현재 블록의 모든 액션 제거 + /// - 물리 엔진 정지 + func stopGame() { + stackGame.stopGame() + isProcessing = true + currentBlockView?.removeAllActions() + physicsWorld.speed = 0 + } + + /// 게임 시작 시 가장 아래에 배치되는 초기 블록을 생성합니다. + /// - 고정된 물리 바디를 가진 파란색 블록 생성 + /// - 게임 코어에 초기 블록 등록 + private func putInitialBlock() { + let firstBlockView = BlockItem(type: .blue) + firstBlockView.setupPhysicsBody() + firstBlockView.position = CGPoint(x: size.width / 2, y: currentHeight) + + // 게임 코어에 초기 블록 등록 + stackGame.addInitialBlock() + + addChild(firstBlockView) + blockViews.append(firstBlockView) + } + + /// 새로운 블록을 화면 상단에 생성하고 좌우로 움직이게 합니다. + /// - 랜덤한 타입의 블록 생성 + /// - 카메라 기준 상단 위치에서 생성 + /// - 좌우 이동 애니메이션 시작 + private func spawnBlock() { + isProcessing = false + + let blockType = BlockType.allCases.randomElement() ?? .blue + let blockView = BlockItem(type: blockType) + + // 게임 코어에 블록 생성 알림 + stackGame.spawnBlock(type: blockType) + + let spawnY = (camera?.position.y ?? size.height / 2) + size.height / 2 - Constant.Offset.spawnYOffset + let leftEdge = blockView.size.width / 2 + let rightEdge = size.width - blockView.size.width / 2 + + blockView.position = CGPoint(x: leftEdge, y: spawnY) + blockView.startMoving(distance: rightEdge - leftEdge) + + currentBlockView = blockView + addChild(blockView) + } + + /// 현재 블록의 이동을 멈추고 중력을 적용하여 떨어뜨립니다. + /// - 블록의 좌우 이동 중지 + /// - 중력 활성화 + /// - 블록 평가 시작 + private func dropBlock() { + guard let block = currentBlockView else { return } + + isProcessing = true + block.stopMoving() + block.enableGravity() + + // 블록 평가 시작 + evaluateBlock() + } + + /// 떨어지는 블록이 목표 위치에 도달했는지 재귀적으로 확인합니다. + /// - 목표 높이에 도달하면 정렬 체크 수행 + /// - 아직 도달하지 않았으면 일정 시간 후 재확인 + private func evaluateBlock() { + guard + let block = currentBlockView, + let previousBlock = stackGame.previousBlock + else { return } + + // StackGame의 previousBlock 정보를 사용해 목표 Y 계산 + let targetY = previousBlock.positionY + previousBlock.height + + if block.position.y <= targetY + block.size.height { + // 목표 위치에 도달했으므로 정렬 체크 + // 정렬 성공/실패에 따라 물리 처리를 다르게 적용 + checkAlignmentAndHandle(targetY: targetY) + } else { + // 아직 도달하지 않았으면 재확인 + DispatchQueue.global().asyncAfter(deadline: .now() + Constant.Time.evaluationCheckInterval) { [weak self] in + self?.evaluateBlock() + } + } + } + + /// 정렬을 체크하고 결과에 따라 물리 처리를 다르게 적용합니다. + /// - 성공: 블록 고정 후 배치 + /// - 실패: 물리를 유지하여 자연스럽게 떨어지도록 + private func checkAlignmentAndHandle(targetY: CGFloat) { + guard let block = currentBlockView else { return } + + // 현재 블록 위치를 게임 모델에 업데이트 + stackGame.updateCurrentBlockPosition(positionX: block.position.x, positionY: targetY) + + let isAligned = stackGame.checkAlignment() + + if isAligned { + // 정렬 성공: 블록 고정 + block.fixPosition() + block.physicsBody?.velocity = CGVector.zero + block.physicsBody?.angularVelocity = 0 + block.position = CGPoint(x: block.position.x, y: targetY) + isProcessing = false + + placeBlockSuccess() + } else { + // 정렬 실패: 물리를 유지하여 계속 떨어지도록 + isProcessing = false + placeBlockFail() + } + } + + /// 블록이 성공적으로 배치되었을 때의 처리를 수행합니다. + /// - 폭탄 블록: 패널티 적용 후 블록 제거 + /// - 일반 블록: 스택에 추가, 점수 증가, 보상 적용, 카메라 이동 + private func placeBlockSuccess() { + guard + let block = currentBlockView, + let currentBlock = stackGame.currentBlock, + let previousView = blockViews.last + else { return } + + // 이전 블록의 정확한 위치를 기준으로 배치 + let targetY = previousView.position.y + previousView.size.height + block.position = CGPoint(x: block.position.x, y: targetY) + + // currentHeight 업데이트 + currentHeight = targetY + block.size.height + + // 폭탄 블록 체크 + if currentBlock.type.isBomb { + stackGame.placeBombSuccess() + + DispatchQueue.main.asyncAfter(deadline: .now() + Constant.Time.bombRemovalDelay) { [weak self] in + block.removeFromParent() + self?.spawnBlock() + } + } else { + blockViews.append(block) + + // 높이 증가 (렌더링 정보) + currentHeight += block.size.height + + // 코어에 블록 배치 성공 알림 (위치는 이미 업데이트됨) + stackGame.placeBlockSuccess() + + // 카메라 이동 + if let camera = camera { + let newCameraY = camera.position.y + block.size.height + let moveCamera = SKAction.moveTo(y: newCameraY, duration: Constant.Time.cameraMoveAnimationDuration) + moveCamera.timingMode = .easeInEaseOut + camera.run(moveCamera) + } + + DispatchQueue.main.asyncAfter(deadline: .now() + Constant.Time.nextBlockSpawnDelay) { [weak self] in + self?.spawnBlock() + } + } + + currentBlockView = nil + } + + /// 블록 배치에 실패했을 때의 처리를 수행합니다. + /// - 폭탄 블록: 실패시 오히려 보상 적용 + /// - 일반 블록: 패널티 적용 + /// - 물리 효과로 떨어지고 화면 밖으로 나가면 제거 + private func placeBlockFail() { + guard + let block = currentBlockView, + let currentBlock = stackGame.currentBlock + else { return } + + // 폭탄 블록 실패 = 보상, 일반 블록 실패 = 패널티 + if currentBlock.type.isBomb { + stackGame.placeBombFail() + } else { + stackGame.placeBlockFail() + } + + // 일정 시간 후 블록 제거 및 다음 블록 생성 + DispatchQueue.main.asyncAfter(deadline: .now() + Constant.Time.failedBlockRemovalDelay) { [weak self] in + block.removeFromParent() + self?.spawnBlock() + } + + currentBlockView = nil + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/StackGameTestView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/StackGameTestView.swift new file mode 100644 index 00000000..502656c0 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/StackGameTestView.swift @@ -0,0 +1,62 @@ +// +// StackGameTestView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-13. +// + +import SpriteKit +import SwiftUI + +struct StackGameTestView: View { + @State private var game: StackGame + private let scene: StackGameScene + + init(user: User) { + let game = StackGame(user: user) + let scene = StackGameScene(stackGame: game) + + self.scene = scene + self._game = State(wrappedValue: game) + } + + var body: some View { + VStack { + VStack { + Text("골드: \(game.user.wallet.gold)") + Text("다이아몬드: \(game.user.wallet.diamond)") + } + .frame(maxHeight: .infinity) + + ZStack(alignment: .top) { + SpriteView(scene: scene) + + GameToolBar( + closeButtonDidTapHandler: stopGame, + coffeeButtonDidTapHandler: useCoffee, + energyDrinkButtonDidTapHandler: useEnergyDrink, + feverState: game.feverSystem, + buffSystem: game.buffSystem, + coffeeCount: .constant(game.user.inventory.count(.coffee) ?? 0), + energyDrinkCount: .constant(game.user.inventory.count(.energyDrink) ?? 0) + ) + .padding() + } + .frame(maxHeight: .infinity) + } + } + + private func stopGame() {} + + private func useCoffee() { + if game.user.inventory.drink(.coffee) { + game.buffSystem.useConsumableItem(type: .coffee) + } + } + + private func useEnergyDrink() { + if game.user.inventory.drink(.energyDrink) { + game.buffSystem.useConsumableItem(type: .energyDrink) + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/TabGameView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/TabGameView.swift new file mode 100644 index 00000000..47eb820a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Devlopment/Presentation/TabGameView.swift @@ -0,0 +1,76 @@ +// +// TabGameView.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import SwiftUI + +struct TabGameView: View { + let user: User + let game: TapGame + + init(user: User) { + self.user = user + self.game = .init( + user: user, + feverSystem: .init( + decreaseInterval: 0.1, + decreasePercentPerTick: 10 + ), + buffSystem: .init() + ) + self.game.startGame() + } + + var body: some View { + VStack(spacing: 40) { + VStack { + Text("gold: \(user.wallet.gold)") + Text("fever: \(game.feverSystem.feverPercent)") + Text("feverStage: \(game.feverSystem.feverStage)") + } + HStack(spacing: 30) { + Button { + Task { + let gainGold = await game.didPerformAction(()) + print(gainGold) + } + } label: { + Text("탭 1번 수행하기") + } + Button { + Task { + await CheatManager.performCheatingActions(game: game, count: 10000) + } + } label: { + Text("탭 10,000번 수행하기") + } + } + Button { + if user.inventory.drink(.coffee) { + game.buffSystem.useConsumableItem(type: .coffee) + } + } label: { + Text("☕️ Coffee \(user.inventory.count(.coffee) ?? 0)") + } + } + .padding() + } +} + +#Preview { + let user = User( + nickname: "user", + wallet: .init(), + inventory: .init(), + record: .init(), + skills: [ + .init(key: .init(game: .tap, tier: .beginner), level: 1000), + .init(key: .init(game: .tap, tier: .intermediate), level: 1000), + .init(key: .init(game: .tap, tier: .advanced), level: 1000) + ] + ) + TabGameView(user: user) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/ButtonStyle+.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/ButtonStyle+.swift new file mode 100644 index 00000000..057a4afb --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/ButtonStyle+.swift @@ -0,0 +1,43 @@ +// +// ButtonStyle+.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/12/26. +// + +import SwiftUI + +struct PressableButtonStyle: ButtonStyle { + @Binding var isPressed: Bool + + func makeBody(configuration: Configuration) -> some View { + configuration.label + .onChange(of: configuration.isPressed) { _, newValue in + isPressed = newValue + if newValue { + SoundService.shared.trigger(.buttonTap) + } + } + } +} + +struct SoundTapButtonStyle: ButtonStyle { + func makeBody(configuration: Configuration) -> some View { + configuration.label + .onChange(of: configuration.isPressed) { _, newValue in + if newValue { + SoundService.shared.trigger(.buttonTap) + } + } + } +} + +extension ButtonStyle where Self == PressableButtonStyle { + static func pressable(isPressed: Binding) -> PressableButtonStyle { + PressableButtonStyle(isPressed: isPressed) + } +} + +extension ButtonStyle where Self == SoundTapButtonStyle { + static var soundTap: SoundTapButtonStyle { SoundTapButtonStyle() } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/Int+.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/Int+.swift new file mode 100644 index 00000000..b16e9401 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/Int+.swift @@ -0,0 +1,48 @@ +// +// Int+.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/8/26. +// + +import Foundation + +extension Int { + var formatted: String { + let absValue = abs(self) + let sign = self < 0 ? "-" : "" + + switch absValue { + case 0..<1_000: + return "\(sign)\(absValue)" + case 1_000..<1_000_000: + let value = Double(absValue) / 1_000.0 + return "\(sign)\(formatDecimal(value))K" + case 1_000_000..<1_000_000_000: + let value = Double(absValue) / 1_000_000.0 + return "\(sign)\(formatDecimal(value))M" + case 1_000_000_000..<1_000_000_000_000: + let value = Double(absValue) / 1_000_000_000.0 + return "\(sign)\(formatDecimal(value))B" + default: + let value = Double(absValue) / 1_000_000_000_000.0 + return "\(sign)\(formatDecimal(value))T" + } + } + + /// 소수점을 적절히 포맷팅합니다 (불필요한 0 제거) + private func formatDecimal(_ value: Double) -> String { + // 소수점 이하 2자리까지 표시 + var formatted = String(format: "%.2f", value) + + // 끝의 0 제거 + while formatted.contains(".") && formatted.hasSuffix("0") { + formatted = String(formatted.dropLast()) + } + if formatted.hasSuffix(".") { + formatted = String(formatted.dropLast()) + } + + return formatted + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/LongPressRepeatModifier.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/LongPressRepeatModifier.swift new file mode 100644 index 00000000..a5924221 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/LongPressRepeatModifier.swift @@ -0,0 +1,64 @@ +// +// LongPressRepeatModifier.swift +// SoloDeveloperTraining +// + +import SwiftUI + +private enum Constant { + static let minimumDuration: Double = 0.5 + static let repeatInterval: TimeInterval = 0.1 +} + +struct LongPressRepeatModifier: ViewModifier { + @Binding var isLongPressing: Bool + @State private var repeatTimer: Timer? + + let isDisabled: Bool + let onLongPressRepeat: (() -> Bool)? + + func body(content: Content) -> some View { + content + .onLongPressGesture( + minimumDuration: Constant.minimumDuration, + pressing: handlePressingChange, + perform: startRepeating + ) + .onDisappear { + repeatTimer?.invalidate() + repeatTimer = nil + } + } +} + +private extension LongPressRepeatModifier { + func handlePressingChange(_ pressing: Bool) { + guard !isDisabled, onLongPressRepeat != nil else { return } + if !pressing { stopRepeating() } + } + + func startRepeating() { + guard let onLongPressRepeat, repeatTimer == nil else { return } + + isLongPressing = true + if onLongPressRepeat() { SoundService.shared.trigger(.buttonTap) } + + let timer = Timer.scheduledTimer(withTimeInterval: Constant.repeatInterval, repeats: true) { [onLongPressRepeat, isLongPressingBinding = $isLongPressing] timer in + if onLongPressRepeat() { + SoundService.shared.trigger(.buttonTap) + } else { + timer.invalidate() + repeatTimer = nil + isLongPressingBinding.wrappedValue = false + } + } + RunLoop.current.add(timer, forMode: .common) + repeatTimer = timer + } + + func stopRepeating() { + repeatTimer?.invalidate() + repeatTimer = nil + isLongPressing = false + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/Typography.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/Typography.swift new file mode 100644 index 00000000..324e5ab5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/Typography.swift @@ -0,0 +1,242 @@ +// +// Typography.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/8/26. +// +// 사용 예시: +// +// 1. Text (lineSpacing 자동 포함) +// Text("안녕하세요") +// .textStyle(.caption) +// +// 2. TextField (단일 라인 - lineSpacing 불필요) +// TextField("입력", text: $text) +// .font(.pfFont(.body)) +// +// 3. TextEditor (다중 라인 - lineSpacing 필요) +// TextEditor(text: $longText) +// .font(.pfFont(.body)) +// .lineSpacing(TypographyStyle.body.lineSpacing) +// +// 4. 커스텀 크기 +// Text("특별한 크기") +// .font(.pfCustom(.extraBold, size: 25)) + +import SwiftUI + +// MARK: - Font Weight +enum PFFontWeight { + case regular + case bold + case extraBold + + var fontName: String { + switch self { + case .regular: return "PFStardust" + case .bold: return "PFStardustBold" + case .extraBold: return "PFStardustExtraBold" + } + } +} + +// MARK: - Typography Style +struct PFTextStyle: ViewModifier { + let fontName: String + let size: CGFloat + let lineHeight: CGFloat + + func body(content: Content) -> some View { + content + .font(.custom(fontName, size: size)) + .lineSpacing(size * (lineHeight - 1)) + } +} + +// MARK: - Typography Preset +enum Typography { + + /// LargeTitle – ExtraBold, 34pt, 130% + static let largeTitle = PFTextStyle( + fontName: PFFontWeight.extraBold.fontName, + size: 34, + lineHeight: 1.3 + ) + + /// Title – Bold, 28pt, 140% + static let title = PFTextStyle( + fontName: PFFontWeight.bold.fontName, + size: 28, + lineHeight: 1.4 + ) + + /// Title2 – Bold, 22pt, 140% + static let title2 = PFTextStyle( + fontName: PFFontWeight.bold.fontName, + size: 22, + lineHeight: 1.4 + ) + + /// Title3 – Bold, 20pt, 140% + static let title3 = PFTextStyle( + fontName: PFFontWeight.bold.fontName, + size: 20, + lineHeight: 1.4 + ) + + /// Headline – ExtraBold, 17pt, 140% + static let headline = PFTextStyle( + fontName: PFFontWeight.extraBold.fontName, + size: 17, + lineHeight: 1.4 + ) + + /// Body – Bold, 17pt, 140% + static let body = PFTextStyle( + fontName: PFFontWeight.bold.fontName, + size: 17, + lineHeight: 1.4 + ) + + /// Callout – Bold, 16pt, 140% + static let callout = PFTextStyle( + fontName: PFFontWeight.bold.fontName, + size: 16, + lineHeight: 1.4 + ) + + /// Subheadline – ExtraBold, 15pt, 140% + static let subheadline = PFTextStyle( + fontName: PFFontWeight.extraBold.fontName, + size: 15, + lineHeight: 1.4 + ) + + /// Caption – ExtraBold, 12pt, 140% + static let caption = PFTextStyle( + fontName: PFFontWeight.extraBold.fontName, + size: 12, + lineHeight: 1.4 + ) + + /// Caption2 – Bold, 12pt, 140% + static let caption2 = PFTextStyle( + fontName: PFFontWeight.bold.fontName, + size: 12, + lineHeight: 1.4 + ) + + /// Label – Bold, 11pt, 140% + static let label = PFTextStyle( + fontName: PFFontWeight.bold.fontName, + size: 11, + lineHeight: 1.4 + ) + + /// LabelLined – Regular, 11pt, 140% + static let labelLined = PFTextStyle( + fontName: PFFontWeight.regular.fontName, + size: 11, + lineHeight: 1.4 + ) +} + +enum TypographyStyle { + case largeTitle + case title + case title2 + case title3 + case headline + case body + case callout + case subheadline + case caption + case caption2 + case label + case labelLined + + var lineSpacing: CGFloat { + switch self { + case .largeTitle: return 34 * (1.3 - 1) + case .title: return 28 * (1.4 - 1) + case .title2: return 22 * (1.4 - 1) + case .title3: return 20 * (1.4 - 1) + case .headline: return 17 * (1.4 - 1) + case .body: return 17 * (1.4 - 1) + case .callout: return 16 * (1.4 - 1) + case .subheadline: return 15 * (1.4 - 1) + case .caption: return 12 * (1.4 - 1) + case .caption2: return 12 * (1.4 - 1) + case .label: return 11 * (1.4 - 1) + case .labelLined: return 11 * (1.4 - 1) + } + } +} + +// MARK: - Text Extension +extension Text { + func textStyle(_ style: TypographyStyle) -> some View { + switch style { + case .largeTitle: + self.modifier(Typography.largeTitle) + case .title: + self.modifier(Typography.title) + case .title2: + self.modifier(Typography.title2) + case .title3: + self.modifier(Typography.title3) + case .headline: + self.modifier(Typography.headline) + case .body: + self.modifier(Typography.body) + case .callout: + self.modifier(Typography.callout) + case .subheadline: + self.modifier(Typography.subheadline) + case .caption: + self.modifier(Typography.caption) + case .caption2: + self.modifier(Typography.caption2) + case .label: + self.modifier(Typography.label) + case .labelLined: + self.modifier(Typography.labelLined) + } + } +} + +// MARK: - Font Extension +extension Font { + static func pfFont(_ style: TypographyStyle) -> Font { + switch style { + case .largeTitle: + return .custom(PFFontWeight.extraBold.fontName, size: 34) + case .title: + return .custom(PFFontWeight.bold.fontName, size: 28) + case .title2: + return .custom(PFFontWeight.bold.fontName, size: 22) + case .title3: + return .custom(PFFontWeight.bold.fontName, size: 20) + case .headline: + return .custom(PFFontWeight.extraBold.fontName, size: 17) + case .body: + return .custom(PFFontWeight.bold.fontName, size: 17) + case .callout: + return .custom(PFFontWeight.bold.fontName, size: 16) + case .subheadline: + return .custom(PFFontWeight.extraBold.fontName, size: 15) + case .caption: + return .custom(PFFontWeight.extraBold.fontName, size: 12) + case .caption2: + return .custom(PFFontWeight.bold.fontName, size: 12) + case .label: + return .custom(PFFontWeight.bold.fontName, size: 11) + case .labelLined: + return .custom(PFFontWeight.regular.fontName, size: 11) + } + } + + static func pfCustom(_ weight: PFFontWeight, size: CGFloat) -> Font { + return .custom(weight.fontName, size: size) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/View+.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/View+.swift new file mode 100644 index 00000000..7476e977 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Extensions/View+.swift @@ -0,0 +1,48 @@ +// +// View+.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/22/26. +// + +import SwiftUI + +extension View { + func withTapSound() -> some View { + buttonStyle(.soundTap) + } + + func toast(isShowing: Binding, message: String, duration: Double = 1.5) -> some View { + self.modifier(Toast(isShowing: isShowing, message: message, duration: duration)) + } + + func pauseGameStyle( + isGameViewDisappeared: Binding, + height: CGFloat, + onLeave: @escaping () -> Void, + onPause: @escaping () -> Void, + onResume: @escaping () -> Void + ) -> some View { + self.modifier( + GamePauseWrapper( + isGameViewDisappeared: isGameViewDisappeared, + height: height, + onLeave: onLeave, + onPause: onPause, + onResume: onResume + ) + ) + } + + func longPressRepeat( + isLongPressing: Binding, + isDisabled: Bool, + onLongPressRepeat: (() -> Bool)? + ) -> some View { + modifier(LongPressRepeatModifier( + isLongPressing: isLongPressing, + isDisabled: isDisabled, + onLongPressRepeat: onLongPressRepeat + )) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/DodgeGame/DodgeGame.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/DodgeGame/DodgeGame.swift new file mode 100644 index 00000000..59e4342f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/DodgeGame/DodgeGame.swift @@ -0,0 +1,234 @@ +// +// DodgeGame.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +final class DodgeGame: Game { + typealias ActionInput = DropItem.DropItemType + + /// 게임 종류 + var kind: GameType = .dodge + /// 사용자 정보 + var user: User + /// 피버 시스템 + var feverSystem: FeverSystem = FeverSystem( + decreaseInterval: Policy.Fever.decreaseInterval, + decreasePercentPerTick: Policy.Fever.Dodge.decreasePercent + ) + /// 버프 시스템 + var buffSystem: BuffSystem = BuffSystem() + /// 캐릭터 애니메이션 시스템 + var animationSystem: CharacterAnimationSystem? + + // MARK: - Game Systems + /// 모션 시스템 (기기 기울기 감지 및 캐릭터 이동) + let motionSystem: MotionSystem + /// 게임 코어 시스템 (낙하물 생성, 충돌 감지) + let gameCore: DodgeGameCore + + // MARK: - Game State + /// 현재 연속 회피 콤보 + var currentCombo: Int = 0 + + /// 플레이어 위치 동기화 타이머 (120fps) + private var positionSyncTimer: Timer? + /// 골드 변화 시 호출되는 콜백 핸들러 + private var onGoldChangedHandler: (Int) -> Void + + init( + user: User, + gameAreaSize: CGSize, + onGoldChanged: @escaping (Int) -> Void, + animationSystem: CharacterAnimationSystem? = nil + ) { + self.user = user + self.onGoldChangedHandler = onGoldChanged + self.animationSystem = animationSystem + + // 게임 시스템 초기화 (크기 필수 전달) + self.motionSystem = MotionSystem(screenLimit: gameAreaSize.width / 2) + self.gameCore = DodgeGameCore(screenWidth: gameAreaSize.width, screenHeight: gameAreaSize.height) + + // 충돌 콜백 설정 + gameCore.onCollision = { [weak self] itemType in + guard let self = self else { return } + Task { + let goldDelta = await self.didPerformAction(itemType) + await MainActor.run { + self.onGoldChangedHandler(goldDelta) + } + } + } + + // 버그가 땅에 닿았을 때 콜백 설정 + gameCore.onBugReachedGround = { [weak self] in + guard let self = self else { return } + Task { + let goldDelta = self.didDodgeBug() + await MainActor.run { + self.onGoldChangedHandler(goldDelta) + } + } + } + + // 플레이어 위치 동기화 타이머 시작 (120fps) + positionSyncTimer = Timer.scheduledTimer(withTimeInterval: 1.0 / Policy.Game.Dodge.updateFPS, repeats: true) { [weak self] _ in + guard let self = self else { return } + self.gameCore.playerX = self.motionSystem.characterX + } + } + + deinit { + positionSyncTimer?.invalidate() + positionSyncTimer = nil + } + + /// 게임 시작 (피버 시스템 및 게임 코어 타이머 활성화) + func startGame() { + // 콤보 초기화 + currentCombo = 0 + feverSystem.start() + gameCore.start() + } + + /// 게임 중지 (모든 타이머 정지 및 낙하물 제거) + func stopGame() { + buffSystem.stop() + feverSystem.stop() + gameCore.stop() + } + + /// 게임 일시정지 (피버, 버프 시스템 보존) + func pauseGame() { + feverSystem.pause() + buffSystem.pause() + gameCore.stop() + } + + /// 게임 재개 + func resumeGame() { + feverSystem.resume() + buffSystem.resume() + gameCore.start() + } + + /// 게임 영역 크기 업데이트 (화면 크기 변경 시 호출) + func configure(gameAreaSize: CGSize) { + gameCore.screenWidth = gameAreaSize.width + gameCore.screenHeight = gameAreaSize.height + motionSystem.screenLimit = gameAreaSize.width / 2 + } + + /// 골드 변화 콜백 핸들러 설정 + func setGoldChangedHandler(_ handler: @escaping (Int) -> Void) { + self.onGoldChangedHandler = handler + } + + /// 버그 회피 성공 처리 + /// - Returns: 획득한 골드 + func didDodgeBug() -> Int { + // 콤보 증가 + currentCombo += 1 + + // 피버 증가 + feverSystem.gainFever(Policy.Fever.Dodge.gainPerBugDodge) + + // 기본 골드 계산 + let baseGold = getBaseGold() + + // 1.0배 획득 + let gainGold = Int(Double(baseGold) * Policy.Game.Dodge.bugDodgeGoldMultiplier) + user.wallet.addGold(gainGold) + /// 누적 재산 업데이트 + user.record.record(.earnMoney(gainGold)) + /// 버그 회피 기록 (콤보 전달) + user.record.record(.dodgeBugAvoid(currentCombo: currentCombo)) + + // 재화 획득 시 캐릭터 웃게 만들기 + animationSystem?.playSmile() + return gainGold + } + + /// 아이템 충돌 처리 + /// - Parameter type: 충돌한 아이템 타입 + /// - Returns: 획득/손실한 골드 (손실은 음수) + func didPerformAction(_ input: DropItem.DropItemType) async -> Int { + switch input { + case .smallGold: + // 피버 증가 + feverSystem.gainFever(Policy.Fever.Dodge.gainPerSmallGold) + + // 기본 골드 계산 + let baseGold = getBaseGold() + + // 0.8배 획득 + let gainGold = Int(Double(baseGold) * Policy.Game.Dodge.smallGoldMultiplier) + user.wallet.addGold(gainGold) + /// 골드 수집 기록 + user.record.record(.dodgeGoldCollect) + /// 누적 재산 업데이트 + user.record.record(.earnMoney(gainGold)) + + // 재화 획득 시 캐릭터 웃게 만들기 + animationSystem?.playSmile() + SoundService.shared.trigger(.coinCollect) + return gainGold + + case .largeGold: + // 피버 증가 + feverSystem.gainFever(Policy.Fever.Dodge.gainPerLargeGold) + + // 기본 골드 계산 + let baseGold = getBaseGold() + + // 1.2배 획득 + let gainGold = Int(Double(baseGold) * Policy.Game.Dodge.largeGoldMultiplier) + user.wallet.addGold(gainGold) + /// 골드 수집 기록 + user.record.record(.dodgeGoldCollect) + /// 누적 재산 업데이트 + user.record.record(.earnMoney(gainGold)) + + // 재화 획득 시 캐릭터 웃게 만들기 + animationSystem?.playSmile() + SoundService.shared.trigger(.coinCollect) + return gainGold + + case .bug: + // 콤보 리셋 + currentCombo = 0 + + // 피버 감소 + feverSystem.gainFever(Policy.Fever.Dodge.lossPerBugHit) + + // 기본 골드 계산 + let baseGold = getBaseGold() + + // 골드 손실 + let loseGold = Int(Double(baseGold) * Policy.Game.Dodge.bugHitLossGoldMultiplier) + user.wallet.spendGold(loseGold) + /// 실패 기록 + user.record.record(.dodgeFail) + + SoundService.shared.trigger(.bugHit) + HapticService.shared.trigger(.error) + return -loseGold + } + } +} + +private extension DodgeGame { + func getBaseGold() -> Int { + let baseGold = Calculator.calculateGoldPerAction( + game: kind, + user: user, + feverMultiplier: feverSystem.feverMultiplier, + buffMultiplier: buffSystem.multiplier + ) + return baseGold + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/DodgeGame/DodgeGameCore.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/DodgeGame/DodgeGameCore.swift new file mode 100644 index 00000000..01686301 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/DodgeGame/DodgeGameCore.swift @@ -0,0 +1,173 @@ +// +// DodgeGameCore.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/13/26. +// + +import Foundation +import SwiftUI + +private enum Constant { + static let itemRemovalOffset: CGFloat = 50 +} + +@Observable +final class DodgeGameCore { + // MARK: - 게임 설정 + /// 게임 업데이트 주사율 (120fps) + private let updateInterval: TimeInterval = 1.0 / Policy.Game.Dodge.updateFPS + /// 낙하물 생성 간격 (초) + private let spawnInterval: TimeInterval = Policy.Game.Dodge.spawnInterval + /// 낙하 속도 (120fps 기준) + private let fallSpeed: CGFloat = Policy.Game.Dodge.fallSpeed + /// 플레이어 크기 + private let playerSize: CGSize = CGSize(width: 40, height: 40) + + // MARK: - 게임 상태 + /// 현재 화면에 떨어지고 있는 아이템 목록 + var fallingItems: [FallingItem] = [] + /// 게임 실행 여부 + var isRunning: Bool = false + + /// 낙하물 생성 타이머 + private var spawnTimer: Timer? + /// 게임 업데이트 타이머 + private var updateTimer: Timer? + + // MARK: - Public Properties + /// 충돌 발생 시 호출되는 콜백 + var onCollision: ((DropItem.DropItemType) -> Void)? + /// 버그가 땅에 닿았을 때 호출되는 콜백 + var onBugReachedGround: (() -> Void)? + /// 플레이어의 X 위치 (MotionSystem에서 동기화) + var playerX: CGFloat = 0 + /// 게임 영역 너비 + var screenWidth: CGFloat + /// 게임 영역 높이 + var screenHeight: CGFloat + + init(screenWidth: CGFloat, screenHeight: CGFloat) { + self.screenWidth = screenWidth + self.screenHeight = screenHeight + } + + deinit { + stop() + } + + /// 게임 시작 (낙하물 생성 및 업데이트 타이머 활성화) + func start() { + guard !isRunning else { return } + isRunning = true + + // 낙하물 생성 타이머 (0.5초 간격) + spawnTimer = Timer.scheduledTimer(withTimeInterval: spawnInterval, repeats: true) { [weak self] _ in + self?.spawnItem() + } + + // 낙하물 업데이트 타이머 (120fps) + updateTimer = Timer.scheduledTimer(withTimeInterval: updateInterval, repeats: true) { [weak self] _ in + self?.updateItems() + } + } + + /// 게임 중지 (모든 타이머 정지 및 낙하물 제거) + func stop() { + isRunning = false + spawnTimer?.invalidate() + spawnTimer = nil + updateTimer?.invalidate() + updateTimer = nil + fallingItems.removeAll() + } +} + +// MARK: - Private Methods +private extension DodgeGameCore { + /// 새로운 낙하물 생성 + func spawnItem() { + // 랜덤 타입 생성 + let randomValue = Int.random(in: 0..<100) + let type: DropItem.DropItemType + if randomValue < Policy.Game.Dodge.largeGoldSpawnRate { + type = .largeGold + } else if randomValue < Policy.Game.Dodge.largeGoldSpawnRate + Policy.Game.Dodge.smallGoldSpawnRate { + type = .smallGold + } else { + type = .bug + } + + // 랜덤 X 위치 생성 (게임 영역 내) + let randomX = CGFloat.random(in: -screenWidth/2...screenWidth/2) + let item = FallingItem( + type: type, + position: CGPoint(x: randomX, y: -screenHeight/2) + ) + fallingItems.append(item) + } + + func updateItems() { + var indicesToRemove: [Int] = [] + let removalThreshold = screenHeight/2 + Constant.itemRemovalOffset + + // 위치 업데이트 및 제거 대상 수집 + for index in fallingItems.indices { + fallingItems[index].updatePosition(by: fallSpeed) + + if fallingItems[index].position.y > removalThreshold { + indicesToRemove.append(index) + } + } + + // 충돌 감지 (제거 전에 먼저 체크) + checkCollisions() + + // 버그가 땅에 닿았는지 확인 (충돌하지 않고 화면을 벗어난 경우) + for index in indicesToRemove where fallingItems[index].type == .bug { + onBugReachedGround?() + } + + // 역순으로 제거 + for index in indicesToRemove.reversed() { + fallingItems.remove(at: index) + } + } + + /// 플레이어와 낙하물 간의 충돌 감지 + func checkCollisions() { + var collidedIndices: [Int] = [] + + // 플레이어 Y 위치 계산 (화면 하단에서 25%) + let playerYOffset = screenHeight * 0.25 + + for (index, item) in fallingItems.enumerated() { + // 플레이어 영역 계산 + let playerRect = CGRect( + x: playerX - playerSize.width / 2, + y: screenHeight/2 - playerYOffset - playerSize.height / 2, + width: playerSize.width, + height: playerSize.height + ) + + // 아이템 영역 계산 + let itemRect = CGRect( + x: item.position.x - item.size.width / 2, + y: item.position.y - item.size.height / 2, + width: item.size.width, + height: item.size.height + ) + + // 충돌 확인 + if playerRect.intersects(itemRect) { + collidedIndices.append(index) + onCollision?(item.type) + } + } + + // 충돌한 아이템 제거 (역순으로 제거하여 인덱스 오류 방지) + for index in collidedIndices.reversed() { + fallingItems.remove(at: index) + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/DodgeGame/FallingItem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/DodgeGame/FallingItem.swift new file mode 100644 index 00000000..ccab2e6f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/DodgeGame/FallingItem.swift @@ -0,0 +1,25 @@ +// +// FallingItem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/14/26. +// + +import Foundation + +struct FallingItem: Identifiable { + /// 고유 식별자 + let id = UUID() + /// 아이템 타입 (smallGold, largeGold, bug) + let type: DropItem.DropItemType + /// 화면 상의 위치 (중심점 기준) + var position: CGPoint + /// 아이템 크기 + let size: CGSize = CGSize(width: 24, height: 24) + + /// 아이템 위치를 업데이트 + /// - Parameter offset: Y축 이동 오프셋 + mutating func updatePosition(by offset: CGFloat) { + position.y += offset + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/Game.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/Game.swift new file mode 100644 index 00000000..ac6d987d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/Game.swift @@ -0,0 +1,68 @@ +// +// Game.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +/// 게임 프로토콜 +protocol Game { + /// action parameter + associatedtype ActionInput + /// 게임 종류 + var kind: GameType { get set } + /// 유저 + var user: User { get set } + /// 피버 시스템 + var feverSystem: FeverSystem { get set } + /// 버프 시스템 + var buffSystem: BuffSystem { get set } + /// 캐릭터 애니메이션 시스템 + var animationSystem: CharacterAnimationSystem? { get set } + + /// 게임 시작 + func startGame() + /// 게임 종료 + func stopGame() + /// 게임 일시정지 + func pauseGame() + /// 게임 재개 + func resumeGame() + /// action 수행 + @discardableResult + func didPerformAction(_ input: ActionInput) async -> Int +} + +/// 게임 타입 +enum GameType: Int, CaseIterable { + case tap = 0 + case language = 1 + case dodge = 2 + case stack = 3 + + /// 화면에 표시될 제목 + var displayTitle: String { + switch self { + case .tap: "코드짜기" + case .language: "언어 맞추기" + case .dodge: "버그 피하기" + case .stack: "데이터 쌓기" + } + } + + /// 업무 이미지 명 + var imageName: String { + switch self { + case .tap: + return "work_tap" + case .language: + return "work_language" + case .dodge: + return "work_dodge" + case .stack: + return "work_stack" + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/LanguageGame.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/LanguageGame.swift new file mode 100644 index 00000000..01d1d6fa --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/LanguageGame.swift @@ -0,0 +1,208 @@ +// +// LanguageGame.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +enum LanguageType: String, CaseIterable { + case swift = "Swift" + case kotlin = "Kotlin" + case dart = "Dart" + case python = "Python" + case empty = "" + + var imageName: String { + switch self { + case .swift: return "language_swift" + case .kotlin: return "language_kotlin" + case .dart: return "language_dart" + case .python: return "language_python" + case .empty: return "" + } + } + + var backgroundColorName: String { + switch self { + case .swift: return "PastelYellow" + case .kotlin: return "PastelPink" + case .dart: return "PastelBlue" + case .python: return "PastelGreen" + case .empty: return "" + } + } + + static func random() -> Self { + return LanguageType.allCases + .filter { $0 != .empty}.randomElement() ?? .swift + } +} + +enum LanguageItemState { + case completed + case active + case upcoming + case empty +} + +@Observable +final class LanguageGame: Game { + typealias ActionInput = LanguageType + var kind: GameType = .language + var user: User + var feverSystem: FeverSystem + var buffSystem: BuffSystem + var animationSystem: CharacterAnimationSystem? + + let itemCount: Int + + // 한 화면에 보여지는 아이템 리스트 + var itemList: [LanguageItem] = [] + + // 활성화 아이템 외에 양쪽에 보여지는 아이템의 개수 + var leadingAndTrailingItemCount: Int { + itemCount / 2 + } + + init( + user: User, + feverSystem: FeverSystem = FeverSystem( + decreaseInterval: Policy.Fever.decreaseInterval, + decreasePercentPerTick: Policy.Fever.Language.decreasePercent + ), + buffSystem: BuffSystem, + itemCount: Int, + animationSystem: CharacterAnimationSystem? = nil + ) { + self.user = user + self.feverSystem = feverSystem + self.buffSystem = buffSystem + self.itemCount = itemCount + self.animationSystem = animationSystem + self.itemList = makeInitialItemList() + } + + func startGame() { + feverSystem.start() + if itemList.isEmpty { + itemList = makeInitialItemList() + } + } + + func stopGame() { + feverSystem.stop() + buffSystem.stop() + itemList = [] + } + + /// 게임 일시정지 (피버, 버프 시스템 보존) + func pauseGame() { + feverSystem.pause() + buffSystem.pause() + } + + /// 게임 재개 + func resumeGame() { + feverSystem.resume() + buffSystem.resume() + } + + func didPerformAction(_ input: LanguageType) async -> Int { + // Task가 취소되었으면 즉시 종료 + guard !Task.isCancelled else { return 0 } + + // 게임 종료 후 버튼 탭 크래시 방지 + guard itemList.count > leadingAndTrailingItemCount else { return 0 } + + let isSuccess = languageButtonTapHandler(tappedItemType: input) + + // 비즈니스 로직 실행 전 다시 한 번 취소 확인 + guard !Task.isCancelled else { return 0 } + + feverSystem + .gainFever( + isSuccess ? Policy.Fever.Language.gainPerCorrect : Policy.Fever.Language.lossPerIncorrect + ) + let gainGold = Calculator.calculateGoldPerAction( + game: kind, + user: user, + feverMultiplier: feverSystem.feverMultiplier, + buffMultiplier: buffSystem.multiplier + ) + if isSuccess { + user.wallet.addGold(gainGold) + /// 정답 횟수 기록 + user.record.record(.languageCorrect) + /// 누적 재산 업데이트 + user.record.record(.earnMoney(gainGold)) + // 재화 획득 시 캐릭터 웃게 만들기 + animationSystem?.playSmile() + return gainGold + } + user.wallet.spendGold(Int(Double(gainGold) * Policy.Game.Language.incorrectGoldLossMultiplier)) + /// 오답 횟수 기록 + user.record.record(.languageIncorrect) + return Int(Double(gainGold) * Policy.Game.Language.incorrectGoldLossMultiplier) * -1 + } + + private func languageButtonTapHandler(tappedItemType: LanguageType) -> Bool { + let activeItem = itemList[leadingAndTrailingItemCount] + + guard activeItem.languageType == tappedItemType else { + return false + } + + // 1. 복제 후 처음 요소 제거 + var newItems = itemList + newItems.removeFirst() + // 2. 새 요소를 마지막에 추가 + newItems.append(.init(languageType: LanguageType.random(), state: .upcoming)) + // 3. 요소 업데이트 + self.itemList = newItems + // 4. 상태 업데이트 + updateLanguageItemList() + + return true + } + + private func makeInitialItemList() -> [LanguageItem] { + var items: [LanguageItem] = [] + let activeIndex = leadingAndTrailingItemCount // 중앙 인덱스 + + for index in 0.. [QuizQuestion] { + guard let url = Bundle.main.url(forResource: fileName, withExtension: "tsv") else { + throw QuizDataLoaderError.fileNotFound + } + + do { + let data = try String(contentsOf: url, encoding: .utf8) + + // TSV 파싱: 탭으로 구분 + let lines = data.components(separatedBy: .newlines) + + // 헤더 제거 및 빈 줄 필터링 + let dataLines = lines.dropFirst().filter { !$0.trimmingCharacters(in: .whitespaces).isEmpty } + + var questions: [QuizQuestion] = [] + + for line in dataLines { + // 탭으로 분리 + let columns = line.components(separatedBy: "\t") + let trimColumns = columns.map { $0.trimmingCharacters(in: .whitespaces) } + + // TSV 형식: 문제 번호\t문제명\t선지1\t선지2\t선지3\t선지4\t정답\t해설 + guard columns.count == 8, + let id = Int(trimColumns[0]), + let correctAnswer = Int(trimColumns[6]) + else { + continue + } + + let question = QuizQuestion( + id: id, + question: trimColumns[1], + options: [trimColumns[2], trimColumns[3], trimColumns[4], trimColumns[5]], + correctAnswerIndex: correctAnswer - 1, // 1-based -> 0-based + explanation: trimColumns[7] + ) + questions.append(question) + } + + guard !questions.isEmpty else { throw QuizDataLoaderError.invalidQuestions } + return questions + } catch let error as QuizDataLoaderError { + throw error + } catch { + throw QuizDataLoaderError.decodingError(error) + } + } + + /// 문제 풀에서 N개의 랜덤 문제를 선택합니다 + /// - Parameters: + /// - questions: 사용 가능한 문제 풀 + /// - count: 선택할 문제 개수 + /// - Returns: 랜덤하게 선택된 문제 배열 + static func selectRandomQuestions(from questions: [QuizQuestion], count: Int) -> [QuizQuestion] { + return Array(questions.shuffled().prefix(count)) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizGame.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizGame.swift new file mode 100644 index 00000000..336ba6c5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizGame.swift @@ -0,0 +1,264 @@ +// +// QuizGame.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation +import Observation + +private enum Constant { + /// 퀴즈 데이터 파일명 (확장자 제외) + static let questionLoadFileName = "QuizData" +} + +@Observable +final class QuizGame { + /// 게임을 플레이하는 사용자 + var user: User + /// 리소스 파일에서 로드한 전체 문제 풀 + private var allQuestions: [QuizQuestion] = [] + /// 현재 게임 세션에서 출제된 문제들 (게임당 3문제) + private(set) var currentGameQuestions: [QuizQuestion] = [] + /// 현재 풀고 있는 문제의 인덱스 (0부터 시작, 0~2) + private(set) var currentQuestionIndex: Int = 0 + /// 현재 표시 중인 문제 + /// - currentQuestionIndex가 유효한 범위일 때만 반환 + var currentQuestion: QuizQuestion? { + guard currentQuestionIndex < currentGameQuestions.count else { return nil } + return currentGameQuestions[currentQuestionIndex] + } + /// 사용자가 선택한 답안의 인덱스 (0~3) + /// - nil이면 아직 답을 선택하지 않은 상태 + private(set) var selectedAnswerIndex: Int? + /// 현재 문제의 정답/오답/타임아웃 결과 + /// - 답안 제출 후에만 값이 설정됨 + private(set) var currentAnswerResult: QuizAnswerResult? + /// 문제당 타이머 + /// - 문제 시작 시 생성되고, 답안 제출 또는 타임아웃 시 중지됨 + private var questionTimer: Timer? + /// 현재 문제의 남은 시간 (초) + /// - 매 초마다 1씩 감소 + private(set) var remainingSeconds: Int = Policy.Game.Quiz.secondsPerQuestion + /// 게임의 현재 진행 단계 + private(set) var phase: QuizGamePhase = .loading + /// 현재 세션에서 맞춘 문제 개수 + private(set) var correctAnswersCount: Int = 0 + + /// 모든 상태 정보 + var state: QuizGameState { + QuizGameState( + totalDiamondsEarned: correctAnswersCount * Policy.Game.Quiz.diamondsPerCorrect, + progressText: "\(currentQuestionIndex + 1)/\(Policy.Game.Quiz.questionsPerGame)", + nextButtonTitle: currentQuestionIndex >= currentGameQuestions.count - 1 ? "보상받기" : "다음으로", + isSubmitEnabled: selectedAnswerIndex != nil && phase == .questionInProgress, + timerProgress: Double(remainingSeconds) / Double(Policy.Game.Quiz.secondsPerQuestion), + phase: phase, + currentQuestion: currentQuestion, + selectedAnswerIndex: selectedAnswerIndex, + currentAnswerResult: currentAnswerResult, + remainingSeconds: remainingSeconds, + correctAnswersCount: correctAnswersCount + ) + } + + init(user: User) { + self.user = user + loadQuestions() + } + + deinit { + stopTimer() + } + + /// 새로운 게임 세션 시작 + /// - 전체 문제 풀에서 랜덤하게 3문제 선택 + /// - 게임 상태 초기화 (점수, 인덱스 등) + /// - 첫 번째 문제 자동 시작 + func startGame() { + // 랜덤하게 3문제 선택 + currentGameQuestions = QuizDataLoader.selectRandomQuestions( + from: allQuestions, + count: Policy.Game.Quiz.questionsPerGame + ) + + // 게임 상태 초기화 + currentQuestionIndex = 0 + correctAnswersCount = 0 + phase = .ready + + // 첫 문제 시작 + startQuestion() + } + + /// 게임 강제 종료 + /// - 타이머를 중지하고 게임 상태를 완료로 변경 + /// - 사용자가 중도 포기하는 경우 호출 + func stopGame() { + stopTimer() + phase = .completed + } + + /// 답 선택 + /// - Parameter index: 선택한 답안의 인덱스 (0~3) + /// - Note: 문제 풀이 중일 때만 선택 가능 + func selectAnswer(_ index: Int) { + guard phase == .questionInProgress else { return } + guard (0...3).contains(index) else { return } + selectedAnswerIndex = index + } + + /// 선택한 답안 해제 + /// - Note: 문제 풀이 중일 때만 선택 해제 가능 + func deselectAnswer() { + guard phase == .questionInProgress else { return } + selectedAnswerIndex = nil + } + + /// 선택한 답안 제출 + /// - 문제 풀이 중이고, 답을 선택한 상태일 때만 제출 가능 + /// - 제출 후 타이머 중지 및 결과 표시 + func submitSelectedAnswer() { + guard phase == .questionInProgress else { return } + guard let answerIndex = selectedAnswerIndex else { return } + submitAnswer(answerIndex) + } + + /// 다음 문제로 진행 또는 게임 종료 + /// - 해설 표시 중일 때만 호출 가능 + /// - 마지막 문제가 아니면: 다음 문제 시작 + /// - 마지막 문제면: 게임 완료 및 보상 지급 + func proceedToNextQuestion() { + guard phase == .showingExplanation else { return } + + currentQuestionIndex += 1 + + if currentQuestionIndex >= currentGameQuestions.count { + // 모든 문제 완료 - 보상 지급 및 게임 종료 + completeGame() + } else { + // 다음 문제 시작 + startQuestion() + } + } +} + +private extension QuizGame { + + /// 리소스 파일에서 문제 데이터 로드 + /// - TSV 파일에서 모든 문제를 읽어와 allQuestions에 저장 + /// - 로드 성공 시 게임 상태를 ready로 변경 + /// - 실패 시 에러 메시지와 함께 error 상태로 변경 + func loadQuestions() { + do { + allQuestions = try QuizDataLoader.loadQuestions(from: Constant.questionLoadFileName) + phase = .ready + } catch { + phase = .error("문제를 불러오는데 실패했습니다: \(error.localizedDescription)") + } + } + + /// 새로운 문제 시작 + /// - 선택한 답안, 결과, 타이머를 초기화 + /// - 게임 상태를 questionInProgress로 변경 + /// - 타이머 시작 + func startQuestion() { + guard currentQuestion != nil else { + phase = .error("문제를 찾을 수 없습니다") + return + } + + // 상태 초기화 + selectedAnswerIndex = nil + currentAnswerResult = nil + remainingSeconds = Policy.Game.Quiz.secondsPerQuestion + phase = .questionInProgress + + // 타이머 시작 + startTimer() + } + + /// 답안 제출 처리 + /// - Parameter answerIndex: 제출할 답안의 인덱스 + /// - 타이머 중지 + /// - 정답 확인 후 결과 저장 + /// - 정답일 경우 correctAnswersCount 증가 + /// - 게임 상태를 showingExplanation으로 변경 + func submitAnswer(_ answerIndex: Int) { + stopTimer() + + guard let question = currentQuestion else { return } + + // 정답 확인 + let isCorrect = answerIndex == question.correctAnswerIndex + currentAnswerResult = isCorrect ? .correct : .incorrect + + if isCorrect { + correctAnswersCount += 1 + } + + SoundService.shared.trigger(isCorrect ? .languageCorrect : .languageWrong) + if !isCorrect { + HapticService.shared.trigger(.error) + } + phase = .showingExplanation + } + + /// 게임 완료 처리 + /// - 타이머 중지 + /// - 획득한 다이아를 사용자 지갑에 추가 + /// - 게임 상태를 completed로 변경 + func completeGame() { + stopTimer() + + // 다이아 보상 지급 (정답당 5개) + let diamondsToAward = correctAnswersCount * Policy.Game.Quiz.diamondsPerCorrect + user.wallet.addDiamond(diamondsToAward) + + phase = .completed + } + + /// 타이머 시작 + /// - 기존 타이머가 있으면 먼저 정지 + /// - 1초마다 timerTick() 호출하는 타이머 생성 + /// - weak self를 사용하여 메모리 누수 방지 + func startTimer() { + stopTimer() + + questionTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in + self?.timerTick() + } + } + + /// 타이머 중지 및 정리 + /// - 타이머 무효화 + /// - 타이머 참조 해제 + func stopTimer() { + questionTimer?.invalidate() + questionTimer = nil + } + + /// 매 초마다 호출되는 타이머 틱 + /// - 남은 시간 1초 감소 + /// - 시간이 0이 되면 타임아웃 처리 + func timerTick() { + remainingSeconds -= 1 + + if remainingSeconds <= 0 { + handleTimeout() + } + } + + /// 시간 초과 처리 + /// - 타이머 중지 + /// - 결과를 timeout으로 설정 + /// - 해설 화면으로 전환 (오답과 동일한 처리) + func handleTimeout() { + stopTimer() + + currentAnswerResult = .timeout + HapticService.shared.trigger(.error) + phase = .showingExplanation + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizGamePhase.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizGamePhase.swift new file mode 100644 index 00000000..71ba9cb3 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizGamePhase.swift @@ -0,0 +1,21 @@ +// +// QuizGamePhase.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/22/26. +// + +enum QuizGamePhase: Equatable { + /// 문제 로딩 중 + case loading + /// 게임 시작 준비 완료 + case ready + /// 문제 풀이 진행 중 (타이머 작동) + case questionInProgress + /// 해설 표시 중 + case showingExplanation + /// 게임 완료 (모든 문제 풀이 완료) + case completed + /// 에러 발생 + case error(String) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizGameState.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizGameState.swift new file mode 100644 index 00000000..c800460f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizGameState.swift @@ -0,0 +1,31 @@ +// +// QuizGameState.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/22/26. +// + +struct QuizGameState { + /// 현재 세션에서 획득한 총 다이아 개수 + let totalDiamondsEarned: Int + /// 진행도 텍스트 (예: "1/3", "2/3") + let progressText: String + /// 다음 버튼의 텍스트 ("다음" 또는 "결과 보기") + let nextButtonTitle: String + /// 제출 버튼 활성화 여부 + let isSubmitEnabled: Bool + /// 타이머 프로그래스 바 값 (0.0 ~ 1.0) + let timerProgress: Double + /// 게임 진행 단계 + let phase: QuizGamePhase + /// 현재 문제 + let currentQuestion: QuizQuestion? + /// 선택한 답안 인덱스 + let selectedAnswerIndex: Int? + /// 현재 답안 결과 + let currentAnswerResult: QuizAnswerResult? + /// 남은 시간 (초) + let remainingSeconds: Int + /// 맞춘 문제 개수 + let correctAnswersCount: Int +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizQuestion.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizQuestion.swift new file mode 100644 index 00000000..7809534d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/QuizGame/QuizQuestion.swift @@ -0,0 +1,25 @@ +// +// QuizQuestion.swift +// SoloDeveloperTraining +// +// Created by Claude on 1/21/26. +// + +import Foundation + +/// 퀴즈 문제 데이터 모델 +struct QuizQuestion: Codable, Identifiable { + let id: Int + let question: String + let options: [String] + let correctAnswerIndex: Int + let explanation: String + + enum CodingKeys: String, CodingKey { + case id + case question + case options + case correctAnswerIndex = "correct_answer" + case explanation + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/StackBlock.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/StackBlock.swift new file mode 100644 index 00000000..be28f6c7 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/StackBlock.swift @@ -0,0 +1,64 @@ +// +// StackBlock.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-14. +// + +import Foundation + +enum BlockType: CaseIterable { + case blue + case green + case orange + case purple + case red + case yellow + case bomb + case bomb2 + + var size: CGSize { + switch self { + case .blue: return CGSize(width: 60, height: 20) + case .green: return CGSize(width: 70, height: 22) + case .orange: return CGSize(width: 50, height: 17) + case .purple: return CGSize(width: 80, height: 25) + case .red: return CGSize(width: 40, height: 19) + case .yellow: return CGSize(width: 90, height: 21) + case .bomb: return CGSize(width: 40, height: 18) + case .bomb2: return CGSize(width: 30, height: 40) + } + } + + var imageName: String { + switch self { + case .blue: return "stack_block_blue" + case .green: return "stack_block_green" + case .orange: return "stack_block_orange" + case .purple: return "stack_block_purple" + case .red: return "stack_block_red" + case .yellow: return "stack_block_yellow" + case .bomb: return "stack_block_bomb" + case .bomb2: return "stack_block_bomb2" + } + } + + /// 폭탄 블록인지 확인 + var isBomb: Bool { + self == .bomb || self == .bomb2 + } +} + +struct StackBlock { + let type: BlockType + var positionX: CGFloat + var positionY: CGFloat + + var width: CGFloat { + type.size.width + } + + var height: CGFloat { + type.size.height + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/StackGame.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/StackGame.swift new file mode 100644 index 00000000..cff174d0 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/StackGame.swift @@ -0,0 +1,183 @@ +// +// StackGame.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 1/14/26. +// + +import Foundation + +private enum Constant { + enum Position { + static let initialBlockYPosition: CGFloat = 20 + } +} + +@Observable +final class StackGame: Game { + typealias ActionInput = BlockType + + var kind: GameType = .stack + var user: User + var feverSystem: FeverSystem = .init( + decreaseInterval: Policy.Fever.decreaseInterval, + decreasePercentPerTick: Policy.Fever.Stack.decreasePercent + ) + var buffSystem: BuffSystem = .init() + var animationSystem: CharacterAnimationSystem? + var screenSize: CGSize = .init(width: 0, height: 0) + + private(set) var score: Int = 0 + private(set) var blocks: [StackBlock] = [] + private(set) var currentBlock: StackBlock? + private(set) var previousBlock: StackBlock? + + init(user: User, animationSystem: CharacterAnimationSystem? = nil) { + self.user = user + self.animationSystem = animationSystem + } + + func startGame() { + feverSystem.start() + score = 0 + blocks = [] + currentBlock = nil + previousBlock = nil + } + + func stopGame() { + feverSystem.stop() + buffSystem.stop() + } + + /// 게임 일시정지 (피버, 버프 시스템 보존) + func pauseGame() { + feverSystem.pause() + buffSystem.pause() + } + + /// 게임 재개 + func resumeGame() { + feverSystem.resume() + buffSystem.resume() + } + + /// 액션 수행 (Game 프로토콜 요구사항) + @discardableResult + func didPerformAction(_ input: BlockType) async -> Int { 0 } + + /// 초기 블록을 추가합니다 + /// 화면 크기를 기반으로 화면 중앙 하단에 배치합니다 + func addInitialBlock() { + let blockType = BlockType.blue + let initialBlock = StackBlock( + type: blockType, + positionX: screenSize.width / 2, + positionY: Constant.Position.initialBlockYPosition + ) + + blocks.append(initialBlock) + previousBlock = initialBlock + } + + /// 떨어뜨릴 블록을 생성합니다 + func spawnBlock(type: BlockType) { + currentBlock = StackBlock( + type: type, + positionX: 0, + positionY: 0 + ) + } + + /// 블록 정렬 여부를 확인합니다 + func checkAlignment() -> Bool { + guard + let currentBlock = currentBlock, + let previousBlock = previousBlock + else { return false } + + let previousLeft = previousBlock.positionX - previousBlock.width / 2 + let previousRight = previousBlock.positionX + previousBlock.width / 2 + let previousRange = previousLeft...previousRight + + return previousRange.contains(currentBlock.positionX) + } + + /// 현재 블록의 위치를 업데이트합니다 + func updateCurrentBlockPosition(positionX: CGFloat, positionY: CGFloat) { + currentBlock?.positionX = positionX + currentBlock?.positionY = positionY + } + + /// 블록이 성공적으로 배치되었을 때 처리 + func placeBlockSuccess() -> Int { + guard let block = currentBlock else { return 0 } + + blocks.append(block) + previousBlock = block + currentBlock = nil + + score += 1 + return applyReward() + } + + /// 블록 배치에 실패했을 때 처리 + func placeBlockFail() -> Int { + currentBlock = nil + return applyPenalty() + } + + /// 폭탄 블록이 성공적으로 배치되었을 때 처리 (패널티) + func placeBombSuccess() -> Int { + currentBlock = nil + return applyPenalty() + } + + /// 폭탄 블록 배치에 실패했을 때 처리 (보상) + func placeBombFail() -> Int { + currentBlock = nil + return applyReward() + } + + /// 보상을 적용합니다 (골드 획득, 피버 증가) + private func applyReward() -> Int { + let goldEarned = calculateGold() + user.wallet.addGold(goldEarned) + /// 성공 수 기록 + user.record.record(.stackingSuccess) + /// 누적 재산 업데이트 + user.record.record(.earnMoney(goldEarned)) + feverSystem.gainFever(Policy.Fever.Stack.gainPerSuccess) + + // 재화 획득 시 캐릭터 웃게 만들기 + animationSystem?.playSmile() + + return goldEarned + #if DEV_BUILD + print("💰 골드 획득: \(goldEarned), 총액: \(user.wallet.gold)") + #endif + } + + /// 패널티를 적용합니다 (골드 손실, 피버 감소) + private func applyPenalty() -> Int { + let goldLost = calculateGold() + user.wallet.spendGold(goldLost) + /// 실패 수 기록 + user.record.record(.stackingFail) + feverSystem.gainFever(Policy.Fever.Stack.lossPerFailure) + return -goldLost + #if DEV_BUILD + print("💸 골드 손실: \(goldLost), 총액: \(user.wallet.gold)") + #endif + } + + /// 현재 상태에 따른 골드 획득량을 계산합니다 + private func calculateGold() -> Int { + return Calculator.calculateGoldPerAction( + game: .stack, + user: user, + feverMultiplier: feverSystem.feverMultiplier, + buffMultiplier: buffSystem.multiplier + ) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/TapGame.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/TapGame.swift new file mode 100644 index 00000000..568ed0a8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Games/TapGame.swift @@ -0,0 +1,89 @@ +// +// TapGame.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +/// 탭 게임 클래스 +final class TapGame: Game { + typealias ActionInput = Void + + /// 게임 종류 + var kind: GameType + /// 사용자 정보 + var user: User + /// 피버 시스템 + var feverSystem: FeverSystem + /// 버프 시스템 + var buffSystem: BuffSystem + /// 캐릭터 애니메이션 시스템 + var animationSystem: CharacterAnimationSystem? + /// 인벤토리 + let inventory: Inventory + /// 일시정지 여부 (일시정지 시 탭 사운드 미재생용) + private(set) var isPaused: Bool = false + + /// 탭 게임 초기화 + init( + user: User, + feverSystem: FeverSystem = FeverSystem( + decreaseInterval: Policy.Fever.decreaseInterval, + decreasePercentPerTick: Policy.Fever.Tap.decreasePercent + ), + buffSystem: BuffSystem, + animationSystem: CharacterAnimationSystem? = nil + ) { + self.kind = .tap + self.user = user + self.feverSystem = feverSystem + self.buffSystem = buffSystem + self.animationSystem = animationSystem + self.inventory = user.inventory + } + + /// 게임 시작 + func startGame() { + feverSystem.start() + } + + /// 게임 종료 + func stopGame() { + feverSystem.stop() + } + + /// 게임 일시정지 (피버, 버프 시스템 보존) + func pauseGame() { + isPaused = true + feverSystem.pause() + buffSystem.pause() + } + + /// 게임 재개 + func resumeGame() { + isPaused = false + feverSystem.resume() + buffSystem.resume() + } + + /// 탭 액션 수행 및 골드 획득 + @discardableResult + func didPerformAction(_ input: Void = ()) async -> Int { + feverSystem.gainFever(Policy.Fever.Tap.gainPerTap) + let gainGold = Calculator.calculateGoldPerAction( + game: kind, + user: user, + feverMultiplier: feverSystem.feverMultiplier, + buffMultiplier: buffSystem.multiplier + ) + user.wallet.addGold(gainGold) + /// 탭 횟수 기록 + user.record.record(.tap()) + /// 누적 재산 업데이트 + user.record.record(.earnMoney(gainGold)) + + // 재화 획득 시 캐릭터 웃게 만들기 + animationSystem?.playSmile() + return gainGold + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Consumable.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Consumable.swift new file mode 100644 index 00000000..ca75e8f9 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Consumable.swift @@ -0,0 +1,106 @@ +// +// Consumable.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/8/26. +// + +import Foundation + +/// 소비 아이템 클래스 +@Observable +final class Consumable: Item { + // MARK: - Item + var displayTitle: String { + return type.displayTitle + " (보유:\(count)개)" + } + var description: String { + return "사용시 골드 획득량 \(type.buffMultiplier)배 증가" + } + var cost: Cost { + return type.cost + } + var imageName: String { + return type.imageName + } + var category: ItemCategory = .consumable + + // MARK: - Consumable + /// 소비 아이템 타입 + let type: ConsumableType + /// 보유 개수 + private(set) var count: Int + + /// 소비 아이템 초기화 + init(type: ConsumableType, count: Int) { + self.type = type + self.count = count + } + + /// 아이템 갯수 1 증가 + func addItem() { + count += 1 + } + + /// 아이템 갯수 1 감소 + func spendItem() { + count -= 1 + } +} + +/// 소비 아이템 종류 +enum ConsumableType { + /// 커피 + case coffee + /// 에너지 드링크 + case energyDrink + + /// 화면에 표시될 제목 + var displayTitle: String { + switch self { + case .coffee: + return "커피" + case .energyDrink: + return "박하스" + } + } + + /// 버프 가중치 + var buffMultiplier: Double { + switch self { + case .coffee: + return Policy.Consumable.Coffee.buffMultiplier + case .energyDrink: + return Policy.Consumable.EnergyDrink.buffMultiplier + } + } + + /// 지속시간 + var duration: Int { + switch self { + case .coffee: + return Policy.Consumable.Coffee.duration + case .energyDrink: + return Policy.Consumable.EnergyDrink.duration + } + } + + /// 비용 + var cost: Cost { + switch self { + case .coffee: + return .init(diamond: Policy.Consumable.Coffee.priceDiamond) + case .energyDrink: + return .init(diamond: Policy.Consumable.EnergyDrink.priceDiamond) + } + } + + var imageName: String { + switch self { + case .coffee: + return "icon_coffee" + case .energyDrink: + return "icon_energy_drink" + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Cost.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Cost.swift new file mode 100644 index 00000000..d90af7b7 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Cost.swift @@ -0,0 +1,22 @@ +// +// Cost.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/7/26. +// + +import Foundation + +/// 아이템 비용 모델 +struct Cost: Equatable { + /// 골드 비용 + let gold: Int + /// 다이아몬드 비용 + let diamond: Int + + /// 비용 초기화 + init(gold: Int = 0, diamond: Int = 0) { + self.gold = gold + self.diamond = diamond + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Equipment.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Equipment.swift new file mode 100644 index 00000000..e49cfc2a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Equipment.swift @@ -0,0 +1,282 @@ +// +// Equipment.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +/// 장비 아이템 클래스 +final class Equipment: Item { + // MARK: - Item + var displayTitle: String { + return tier.displayTitle + " " + type.displayTitle + } + var description: String { + guard canUpgrade else { + return "초당 골드 획득량 \(goldPerSecond.formatted)" + } + let nextTier = EquipmentTier(rawValue: tier.rawValue + 1) ?? .nationalTreasure + let nextEquipment = Equipment(type: type, tier: nextTier) + return "강화시 초당 골드 획득량 \(goldPerSecond.formatted) -> \(nextEquipment.goldPerSecond.formatted)" + } + var cost: Cost { + return tier.cost + } + var imageName: String { + return "item_\(type.imageName)_\(tier.imageName)" + } + var category: ItemCategory = .equipment + + // MARK: - Equipment + /// 장비 타입 + var type: EquipmentType + /// 장비 등급 + var tier: EquipmentTier + + /// 장비 초기화 + init(type: EquipmentType, tier: EquipmentTier) { + self.type = type + self.tier = tier + } + + /// 업그레이드 가능 여부 + var canUpgrade: Bool { + return tier != .nationalTreasure + } + + /// 초 당 획득 골드 + var goldPerSecond: Int { + switch type { + case .keyboard: + switch tier { + case .broken: + return Policy.Equipment.Keyboard.brokenGoldPerSecond + case .cheap: + return Policy.Equipment.Keyboard.cheapGoldPerSecond + case .vintage: + return Policy.Equipment.Keyboard.vintageGoldPerSecond + case .decent: + return Policy.Equipment.Keyboard.decentGoldPerSecond + case .premium: + return Policy.Equipment.Keyboard.premiumGoldPerSecond + case .diamond: + return Policy.Equipment.Keyboard.diamondGoldPerSecond + case .limited: + return Policy.Equipment.Keyboard.limitedGoldPerSecond + case .nationalTreasure: + return Policy.Equipment.Keyboard.nationalTreasureGoldPerSecond + } + case .mouse: + switch tier { + case .broken: + return Policy.Equipment.Mouse.brokenGoldPerSecond + case .cheap: + return Policy.Equipment.Mouse.cheapGoldPerSecond + case .vintage: + return Policy.Equipment.Mouse.vintageGoldPerSecond + case .decent: + return Policy.Equipment.Mouse.decentGoldPerSecond + case .premium: + return Policy.Equipment.Mouse.premiumGoldPerSecond + case .diamond: + return Policy.Equipment.Mouse.diamondGoldPerSecond + case .limited: + return Policy.Equipment.Mouse.limitedGoldPerSecond + case .nationalTreasure: + return Policy.Equipment.Mouse.nationalTreasureGoldPerSecond + } + case .monitor: + switch tier { + case .broken: + return Policy.Equipment.Monitor.brokenGoldPerSecond + case .cheap: + return Policy.Equipment.Monitor.cheapGoldPerSecond + case .vintage: + return Policy.Equipment.Monitor.vintageGoldPerSecond + case .decent: + return Policy.Equipment.Monitor.decentGoldPerSecond + case .premium: + return Policy.Equipment.Monitor.premiumGoldPerSecond + case .diamond: + return Policy.Equipment.Monitor.diamondGoldPerSecond + case .limited: + return Policy.Equipment.Monitor.limitedGoldPerSecond + case .nationalTreasure: + return Policy.Equipment.Monitor.nationalTreasureGoldPerSecond + } + case .chair: + switch tier { + case .broken: + return Policy.Equipment.Chair.brokenGoldPerSecond + case .cheap: + return Policy.Equipment.Chair.cheapGoldPerSecond + case .vintage: + return Policy.Equipment.Chair.vintageGoldPerSecond + case .decent: + return Policy.Equipment.Chair.decentGoldPerSecond + case .premium: + return Policy.Equipment.Chair.premiumGoldPerSecond + case .diamond: + return Policy.Equipment.Chair.diamondGoldPerSecond + case .limited: + return Policy.Equipment.Chair.limitedGoldPerSecond + case .nationalTreasure: + return Policy.Equipment.Chair.nationalTreasureGoldPerSecond + } + } + } + + /// 강화 확률에 따라 업그레이드 + func upgraded() -> Bool { + guard canUpgrade else { return false } + + let randomValue = Double.random(in: 0...1) + + if randomValue <= tier.upgradeSuccessRate { + self.tier = EquipmentTier(rawValue: tier.rawValue + 1) ?? .nationalTreasure + return true + } else { + return false + } + } +} + +/// 장비 종류 +enum EquipmentType { + /// 키보드 + case keyboard + /// 마우스 + case mouse + /// 모니터 + case monitor + /// 의자 + case chair + + /// 화면에 표시될 제목 + var displayTitle: String { + switch self { + case .keyboard: + return "키보드" + case .mouse: + return "마우스" + case .monitor: + return "모니터" + case .chair: + return "의자" + } + } + + var imageName: String { + switch self { + case .keyboard: + return "keyboard" + case .mouse: + return "mouse" + case .monitor: + return "monitor" + case .chair: + return "chair" + } + } +} + +/// 장비 등급 +enum EquipmentTier: Int { + /// 고장난 + case broken = 0 + /// 싸구려 + case cheap = 1 + /// 빈티지 + case vintage = 2 + /// 쓸만한 + case decent = 3 + /// 고급 + case premium = 4 + /// 다이아 + case diamond = 5 + /// 한정판 + case limited = 6 + /// 국보급 + case nationalTreasure = 7 + + /// 화면에 표시될 제목 + var displayTitle: String { + switch self { + case .broken: "고장난" + case .cheap: "싸구려" + case .vintage: "빈티지" + case .decent: "쓸만한" + case .premium: "고오급" + case .diamond: "다이아" + case .limited: "한정판" + case .nationalTreasure: "국보급" + } + } + + /// 업그레이드 비용 (골드 + 다이아몬드) + var cost: Cost { + switch self { + case .broken: + return Cost(gold: Policy.Equipment.brokenUpgradeCost, diamond: Policy.Equipment.brokenUpgradeDiamond) + case .cheap: + return Cost(gold: Policy.Equipment.cheapUpgradeCost, diamond: Policy.Equipment.cheapUpgradeDiamond) + case .vintage: + return Cost(gold: Policy.Equipment.vintageUpgradeCost, diamond: Policy.Equipment.vintageUpgradeDiamond) + case .decent: + return Cost(gold: Policy.Equipment.decentUpgradeCost, diamond: Policy.Equipment.decentUpgradeDiamond) + case .premium: + return Cost(gold: Policy.Equipment.premiumUpgradeCost, diamond: Policy.Equipment.premiumUpgradeDiamond) + case .diamond: + return Cost(gold: Policy.Equipment.diamondUpgradeCost, diamond: Policy.Equipment.diamondUpgradeDiamond) + case .limited: + return Cost(gold: Policy.Equipment.limitedUpgradeCost, diamond: Policy.Equipment.limitedUpgradeDiamond) + case .nationalTreasure: + return Cost(gold: Policy.Equipment.nationalTreasureUpgradeCost, diamond: Policy.Equipment.nationalTreasureUpgradeDiamond) + } + } + + /// 업그레이드 성공 확률 (0.0 ~ 1.0) + var upgradeSuccessRate: Double { + switch self { + case .broken: + return Policy.Equipment.brokenSuccessRate + case .cheap: + return Policy.Equipment.cheapSuccessRate + case .vintage: + return Policy.Equipment.vintageSuccessRate + case .decent: + return Policy.Equipment.decentSuccessRate + case .premium: + return Policy.Equipment.premiumSuccessRate + case .diamond: + return Policy.Equipment.diamondSuccessRate + case .limited: + return Policy.Equipment.limitedSuccessRate + case .nationalTreasure: + return Policy.Equipment.nationalTreasureSuccessRate + } + } + + var imageName: String { + switch self { + case .broken: + return "broken" + case .cheap: + return "cheap" + case .vintage: + return "vintage" + case .decent: + return "decent" + case .premium: + return "premium" + case .diamond: + return "diamond" + case .limited: + return "limited" + case .nationalTreasure: + return "nationalTreasure" + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Housing.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Housing.swift new file mode 100644 index 00000000..180f6716 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Housing.swift @@ -0,0 +1,113 @@ +// +// Housing.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +struct Housing: Item { + // MARK: - Item + var displayTitle: String { + return tier.displayTitle + } + var description: String { + return "초당 골드 획득량 \(goldPerSecond)" + } + var cost: Cost { + return tier.cost + } + var imageName: String { + return tier.imageName + } + var category: ItemCategory = .housing + + // MARK: - Housing + /// 초 당 획득 골드 + var goldPerSecond: Int { + return tier.goldPerSecond + } + let tier: HousingTier +} + +enum HousingTier: Int, CaseIterable { + case street = 0 + case semiBasement = 1 + case rooftop = 2 + case villa = 3 + case apartment = 4 + case house = 5 + case pentHouse = 6 + + var imageName: String { + switch self { + case .street: return "housing_street" + case .semiBasement: return "housing_semiBasement" + case .rooftop: return "housing_rooftop" + case .villa: return "housing_villa" + case .apartment: return "housing_apartment" + case .house: return "housing_house" + case .pentHouse: return "housing_pentHouse" + } + } + + var displayTitle: String { + switch self { + case .street: + return "길바닥" + case .semiBasement: + return "반지하" + case .rooftop: + return "옥탑방" + case .villa: + return "빌라" + case .apartment: + return "아파트" + case .house: + return "단독주택" + case .pentHouse: + return "펜트 하우스" + } + } + + /// 구입 비용 + var cost: Cost { + switch self { + case .street: + return .init(gold: Policy.Housing.streetPurchaseCost) + case .semiBasement: + return .init(gold: Policy.Housing.semiBasementPurchaseCost) + case .rooftop: + return .init(gold: Policy.Housing.rooftopPurchaseCost) + case .villa: + return .init(gold: Policy.Housing.villaPurchaseCost) + case .apartment: + return .init(gold: Policy.Housing.apartmentPurchaseCost) + case .house: + return .init(gold: Policy.Housing.housePurchaseCost) + case .pentHouse: + return .init(gold: Policy.Housing.pentHousePurchaseCost) + } + } + + /// 초 당 획득 골드 + var goldPerSecond: Int { + switch self { + case .street: + return Policy.Housing.streetGoldPerSecond + case .semiBasement: + return Policy.Housing.semiBasementGoldPerSecond + case .rooftop: + return Policy.Housing.rooftopGoldPerSecond + case .villa: + return Policy.Housing.villaGoldPerSecond + case .apartment: + return Policy.Housing.apartmentGoldPerSecond + case .house: + return Policy.Housing.houseGoldPerSecond + case .pentHouse: + return Policy.Housing.pentHouseGoldPerSecond + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Item.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Item.swift new file mode 100644 index 00000000..5c4f7290 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/Item.swift @@ -0,0 +1,31 @@ +// +// Item.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/20/26. +// + +import Foundation + +protocol Item { + /// 화면에 표시될 제목 + var displayTitle: String { get } + /// 아이템 설명 + var description: String { get } + /// 아이템 구입 비용 + var cost: Cost { get } + /// 아이템 이미지 이름 + var imageName: String { get } + /// 아이템 카테고리 (소비/장비/부동산) + var category: ItemCategory { get } +} + +/// 아이템 카테고리 +enum ItemCategory { + /// 소비 아이템 (커피, 에너지 드링크 등) + case consumable + /// 장비 아이템 (노트북, 모니터 등) + case equipment + /// 부동산 (집, 사무실 등) + case housing +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/ItemState.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/ItemState.swift new file mode 100644 index 00000000..7f9f807a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Items/ItemState.swift @@ -0,0 +1,49 @@ +// +// ItemState.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-20. +// + +import Foundation + +enum ItemState { + case available // 구매 가능 + case locked // 잠김 + case insufficient // 비용 부족 + case reachedMax // 최고 레벨 + + init(item: DisplayItem) { + // 장비 최고 레벨 체크 + if let equipment = item.item as? Equipment, !equipment.canUpgrade { + self = .reachedMax + return + } + + // 주거 아이템이 이미 장착되어 있으면 잠김 + if item.isEquipped && item.category == .housing { + self = .locked + return + } + + // 구매 가능 여부 + if item.isPurchasable { + self = .available + } else { + self = .insufficient + } + } + + init(canUpgrade: Bool, canUnlock: Bool, canAfford: Bool) { + switch (canUpgrade, canUnlock, canAfford) { + case (false, _, _): + self = .reachedMax + case (true, false, _): + self = .locked + case (true, true, false): + self = .insufficient + case (true, true, true): + self = .available + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Policy.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Policy.swift new file mode 100644 index 00000000..b6e671f7 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Policy.swift @@ -0,0 +1,371 @@ +// +// Policy.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/26/26. +// + +import Foundation + +enum Policy { + // MARK: - 커리어 시스템 (기준점) + /// 단계별 필요 누적 재산 (밸런스에 맞춰 약 20× 상향) + enum Career { + static let unemployed = 0 + static let laptopOwner = 100_000 + static let aspiringDeveloper = 1_000_000 + static let juniorDeveloper = 20_000_000 + static let normalDeveloper = 2_000_000_000 + static let nightOwlDeveloper = 20_000_000_000 + static let skilledDeveloper = 200_000_000_000 + static let famousDeveloper = 2_000_000_000_000 + static let allRounderDeveloper = 100_000_000_000_000 // 100조 + static let worldClassDeveloper = 2_000_000_000_000_000 // 2000조: 만렙 + + /// 게임별 해금 조건 (2단계씩: 탭 0 → 언어 2 → 버그 4 → 데이터 6) + enum GameUnlock { + static let tap = unemployed // 0단계 + static let language = aspiringDeveloper // 2단계 + static let dodge = normalDeveloper // 4단계 + static let stack = skilledDeveloper // 6단계 + } + } + + // MARK: - 피버 시스템 (쾌감 증대) + enum Fever { + /// 공통 설정 + static let maxPercent: Double = 400.0 + static let decreaseInterval: TimeInterval = 0.05 + + /// 피버 단계 경계값 + enum StageThreshold { + static let stage0: Double = 0 + static let stage1: Double = 100 + static let stage2: Double = 200 + static let stage3: Double = 300 + } + + /// 피버 단계별 배수 (상향 조정: 피버 시 확실한 보상) + enum Multiplier { + static let stage0: Double = 1.0 // 0~100 + static let stage1: Double = 1.5 // 1.2 -> 1.5 + static let stage2: Double = 2.5 // 1.5 -> 2.5 + static let stage3: Double = 5.0 // 2.0 -> 5.0 + } + + /// 코드 짜기 (TapGame) — 피버 상승량 대폭 하향 + enum Tap { + static let decreasePercent: Double = 1.5 + static let gainPerTap: Double = 5.0 // 2.0 -> 5.0 + } + + /// 언어 맞추기 (LanguageGame) + enum Language { + static let decreasePercent: Double = 1.5 + static let gainPerCorrect: Double = 33.0 + static let lossPerIncorrect: Double = -33.0 + } + + /// 버그 피하기 (DodgeGame) + enum Dodge { + static let decreasePercent: Double = 1.2 + static let gainPerSmallGold: Double = 33.0 + static let gainPerLargeGold: Double = 50.0 + static let gainPerBugDodge: Double = 15.0 + static let lossPerBugHit: Double = -20.0 + } + + /// 데이터 쌓기 (StackGame) + enum Stack { + static let decreasePercent: Double = 1.0 + static let gainPerSuccess: Double = 80.0 + static let lossPerFailure: Double = -40.0 + } + } + + // MARK: - 게임별 상수 + enum Game { + /// 코드 짜기 (TapGame) + enum Tap {} // 특수 상수 없음 + + /// 언어 맞추기 (LanguageGame) + enum Language { + static let incorrectGoldLossMultiplier: Double = 0.5 // 오답시 골드 감소 (획득량의 0.5배) + } + + /// 버그 피하기 (DodgeGame) + enum Dodge { + // 골드 + static let smallGoldMultiplier: Double = 1.5 + static let largeGoldMultiplier: Double = 2.0 + static let bugHitLossGoldMultiplier: Double = 0.5 // 버그 맞으면 골드 감소 (획득량의 0.5배) + static let bugDodgeGoldMultiplier: Double = 0.5 // 버그 피하면 골드 획득 + + // GameCore 설정 + static let updateFPS: Double = 120.0 // 업데이트 주기: 120fps + static let spawnInterval: TimeInterval = 0.3 // 낙하물 생성 간격 + static let fallSpeed: CGFloat = 3.0 // 낙하 속도 + + // 생성 확률 (%) + static let smallGoldSpawnRate: Int = 7 + static let largeGoldSpawnRate: Int = 3 + static let bugSpawnRate: Int = 90 + + /// 모션 시스템 + enum Motion { + static let deadZoneThreshold: Double = 0.05 + static let maxSpeed: CGFloat = 2000.0 + static let minSpeed: CGFloat = 300.0 + } + } + + /// 데이터 쌓기 (StackGame) + enum Stack { + static let failureGoldLossMultiplier: Double = 0.5 // 실패시 골드 감소 (획득량의 0.5배) + } + + /// 퀴즈 게임 (QuizGame) + enum Quiz { + static let questionsPerGame: Int = 3 // 게임당 문제 수 + static let secondsPerQuestion: Int = 20 // 문제당 제한 시간 + static let diamondsPerCorrect: Int = 5 // 정답당 다이아 + } + } + + // MARK: - 스킬 시스템 (초반 성장 가속) + // *전략: 초반 스킬 비용을 낮추고 효율을 높여 '클리커'의 재미를 느끼게 함 + enum Skill { + // 공통 레벨 범위 (모든 게임 통일) + static let beginnerMinLevel: Int = 1 + static let beginnerMaxLevel: Int = 999 + static let intermediateMinLevel: Int = 0 + static let intermediateMaxLevel: Int = 999 + static let advancedMinLevel: Int = 0 + static let advancedMaxLevel: Int = 999 + + /// 코드 짜기 (TapGame) + enum Tap { + // 기본 골드 단위 (상향: 최소 1) + static let baseGold: Int = 1 + + // 티어별 골드 획득 증가량 + static let beginnerGoldMultiplier: Int = 1 + static let intermediateGoldMultiplier: Int = 10 + static let advancedGoldMultiplier: Int = 100 + + // 업그레이드 비용 증가량 + static let beginnerGoldCostMultiplier: Int = 10 + static let intermediateGoldCostMultiplier: Int = 150 + static let advancedGoldCostMultiplier: Int = 2500 + static let diamondCostDivider: Int = 100 + static let diamondCostMultiplier: Int = 10 + + // 스킬 해금 조건 + static let intermediateUnlockLevel: Int = 200 + static let advancedUnlockLevel: Int = 300 + } + + /// 언어 맞추기 (LanguageGame) + /// * 분당 골드 = 탭의 3배 (피버 2.5 기준): 40정답/분 → Lv1,0,0 합 180 + enum Language { + // 기본 골드 단위 + static let baseGold: Int = 45 + + // 티어별 골드 획득 증가량 + static let beginnerGoldMultiplier: Int = 45 + static let intermediateGoldMultiplier: Int = 450 + static let advancedGoldMultiplier: Int = 4500 + + // 업그레이드 비용 증가량 (Tap 대비 스킬 합 비율 45배) + static let beginnerGoldCostMultiplier: Int = 450 + static let intermediateGoldCostMultiplier: Int = 6750 + static let advancedGoldCostMultiplier: Int = 112_500 + static let diamondCostDivider: Int = 100 + static let diamondCostMultiplier: Int = 10 + + // 스킬 해금 조건 + static let intermediateUnlockLevel: Int = 200 + static let advancedUnlockLevel: Int = 300 + } + + /// 버그 피하기 (DodgeGame) + /// * 아무튼 개발자(20억) 해금 시 언어(초250·중300·고100) 분당 ~6천만 수준에 맞춤: Lv1,0,0 합 348,000 + enum Dodge { + // 기본 골드 단위 + static let baseGold: Int = 87_000 + + // 티어별 골드 획득 증가량 + static let beginnerGoldMultiplier: Int = 87_000 + static let intermediateGoldMultiplier: Int = 870_000 + static let advancedGoldMultiplier: Int = 8_700_000 + + // 업그레이드 비용 증가량 (스킬 합 비율에 맞춤) + static let beginnerGoldCostMultiplier: Int = 870_000 + static let intermediateGoldCostMultiplier: Int = 13_050_000 + static let advancedGoldCostMultiplier: Int = 217_500_000 + static let diamondCostDivider: Int = 100 + static let diamondCostMultiplier: Int = 10 + + // 스킬 해금 조건 + static let intermediateUnlockLevel: Int = 200 + static let advancedUnlockLevel: Int = 300 + } + + /// 데이터 쌓기 (StackGame) + /// * 유능한 개발자(2000억) 해금 시 버그 피하기 대비 보상 상향: Lv1,0,0 합 9,000,000 (순 8회/분 → 분당 ~1.8억) + enum Stack { + // 기본 골드 단위 + static let baseGold: Int = 2_250_000 + + // 티어별 골드 획득 증가량 + static let beginnerGoldMultiplier: Int = 2_250_000 + static let intermediateGoldMultiplier: Int = 22_500_000 + static let advancedGoldMultiplier: Int = 225_000_000 + + // 업그레이드 비용 증가량 (스킬 합 비율에 맞춤) + static let beginnerGoldCostMultiplier: Int = 22_500_000 + static let intermediateGoldCostMultiplier: Int = 3_375_000_000 + static let advancedGoldCostMultiplier: Int = 56_250_000_000 + static let diamondCostDivider: Int = 100 + static let diamondCostMultiplier: Int = 10 + + // 스킬 해금 조건 + static let intermediateUnlockLevel: Int = 200 + static let advancedUnlockLevel: Int = 300 + } + } + + // MARK: - 소비 아이템 (효과 강화) + enum Consumable { + /// 커피 (1초당 3씩 증가) + enum Coffee { + static let duration: Int = 15 + static let buffMultiplier: Double = 2.0 + static let priceDiamond: Int = 5 + } + + /// 박하스 (1초당 6씩 증가) + enum EnergyDrink { + static let duration: Int = 20 + static let buffMultiplier: Double = 3.0 + static let priceDiamond: Int = 10 + } + } + + // MARK: - 장비 아이템 + // *밸런스: 업그레이드 비용 20×, 초당 골드 5× (부동산과 동일 비율) + enum Equipment { + // 업그레이드 비용 (골드) + static let brokenUpgradeCost: Int = 100_000 + static let cheapUpgradeCost: Int = 2_000_000 + static let vintageUpgradeCost: Int = 40_000_000 + static let decentUpgradeCost: Int = 1_000_000_000 + static let premiumUpgradeCost: Int = 20_000_000_000 + static let diamondUpgradeCost: Int = 200_000_000_000 + static let limitedUpgradeCost: Int = 1_000_000_000_000 + static let nationalTreasureUpgradeCost: Int = 4_000_000_000_000 + + // 업그레이드 비용 (다이아몬드) — 강화 시 골드와 함께 소모 + static let brokenUpgradeDiamond: Int = 5 + static let cheapUpgradeDiamond: Int = 10 + static let vintageUpgradeDiamond: Int = 20 + static let decentUpgradeDiamond: Int = 35 + static let premiumUpgradeDiamond: Int = 50 + static let diamondUpgradeDiamond: Int = 80 + static let limitedUpgradeDiamond: Int = 120 + static let nationalTreasureUpgradeDiamond: Int = 0 + + // 업그레이드 성공 확률 (모든 장비 공통) + static let brokenSuccessRate: Double = 1.0 + static let cheapSuccessRate: Double = 0.8 + static let vintageSuccessRate: Double = 0.6 + static let decentSuccessRate: Double = 0.4 + static let premiumSuccessRate: Double = 0.3 + static let diamondSuccessRate: Double = 0.2 + static let limitedSuccessRate: Double = 0.1 + static let nationalTreasureSuccessRate: Double = 0.05 + + /// 초당 획득 골드량 (키보드·마우스·모니터·의자 동일) + enum Keyboard { + static let brokenGoldPerSecond: Int = 0 + static let cheapGoldPerSecond: Int = 1_250 + static let vintageGoldPerSecond: Int = 30_000 + static let decentGoldPerSecond: Int = 750_000 + static let premiumGoldPerSecond: Int = 17_500_000 + static let diamondGoldPerSecond: Int = 200_000_000 + static let limitedGoldPerSecond: Int = 1_250_000_000 + static let nationalTreasureGoldPerSecond: Int = 6_000_000_000 + } + + /// 마우스 + enum Mouse { + static let brokenGoldPerSecond: Int = 0 + static let cheapGoldPerSecond: Int = 1_250 + static let vintageGoldPerSecond: Int = 30_000 + static let decentGoldPerSecond: Int = 750_000 + static let premiumGoldPerSecond: Int = 17_500_000 + static let diamondGoldPerSecond: Int = 200_000_000 + static let limitedGoldPerSecond: Int = 1_250_000_000 + static let nationalTreasureGoldPerSecond: Int = 6_000_000_000 + } + + /// 모니터 + enum Monitor { + static let brokenGoldPerSecond: Int = 0 + static let cheapGoldPerSecond: Int = 1_250 + static let vintageGoldPerSecond: Int = 30_000 + static let decentGoldPerSecond: Int = 750_000 + static let premiumGoldPerSecond: Int = 17_500_000 + static let diamondGoldPerSecond: Int = 200_000_000 + static let limitedGoldPerSecond: Int = 1_250_000_000 + static let nationalTreasureGoldPerSecond: Int = 6_000_000_000 + } + + /// 의자 + enum Chair { + static let brokenGoldPerSecond: Int = 0 + static let cheapGoldPerSecond: Int = 1_250 + static let vintageGoldPerSecond: Int = 30_000 + static let decentGoldPerSecond: Int = 750_000 + static let premiumGoldPerSecond: Int = 17_500_000 + static let diamondGoldPerSecond: Int = 200_000_000 + static let limitedGoldPerSecond: Int = 1_250_000_000 + static let nationalTreasureGoldPerSecond: Int = 6_000_000_000 + } + } + + // MARK: - 부동산 아이템 (로망 실현 및 자동 사냥 기지) + // *밸런스: 가격·초당 골드를 분당 3배수 경제에 맞춤 (가격 20×, 초당 골드 5× → 회수 시간 약 4배) + enum Housing { + // 구입 비용 + static let streetPurchaseCost: Int = 0 + static let semiBasementPurchaseCost: Int = 10_000_000 + static let rooftopPurchaseCost: Int = 200_000_000 + static let villaPurchaseCost: Int = 10_000_000_000 + static let apartmentPurchaseCost: Int = 100_000_000_000 + static let housePurchaseCost: Int = 1_000_000_000_000 + static let pentHousePurchaseCost: Int = 4_000_000_000_000 + + // 초당 골드 획득 (분당 = ×60) + static let streetGoldPerSecond: Int = 0 + static let semiBasementGoldPerSecond: Int = 2_500 + static let rooftopGoldPerSecond: Int = 50_000 + static let villaGoldPerSecond: Int = 2_500_000 + static let apartmentGoldPerSecond: Int = 25_000_000 + static let houseGoldPerSecond: Int = 250_000_000 + static let pentHouseGoldPerSecond: Int = 1_000_000_000 + } + + // MARK: - 기타 시스템 + enum System { + /// 자동 획득 시스템 (AutoGainSystem) + enum AutoGain { + static let interval: TimeInterval = 1.0 // 자동 획득 주기 (초) + } + + /// 버프 시스템 (BuffSystem) + enum Buff { + static let decreaseInterval: TimeInterval = 1.0 // 버프 감소 주기 (초) + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Storages/KeyValueLocalStorage.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Storages/KeyValueLocalStorage.swift new file mode 100644 index 00000000..22767eab --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Storages/KeyValueLocalStorage.swift @@ -0,0 +1,16 @@ +// +// KeyValueLocalStorage.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/27/26. +// + +import Foundation + +protocol KeyValueLocalStorage { + func register(defaults: [String: Any]) + func set(_ value: Any, forKey: String) + func integer(key: String) -> Int + func bool(key: String) -> Bool + func any(key: String) -> Any? +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Storages/UserDefaultsStorage.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Storages/UserDefaultsStorage.swift new file mode 100644 index 00000000..8579b292 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Storages/UserDefaultsStorage.swift @@ -0,0 +1,36 @@ +// +// UserDefaultsStorage.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/27/26. +// + +import Foundation + +struct UserDefaultsStorage: KeyValueLocalStorage { + private let userDefaults: UserDefaults + + init(userDefaults: UserDefaults = .standard) { + self.userDefaults = userDefaults + } + + func register(defaults: [String: Any]) { + userDefaults.register(defaults: defaults) + } + + func set(_ value: Any, forKey: String) { + userDefaults.set(value, forKey: forKey) + } + + func integer(key: String) -> Int { + return userDefaults.integer(forKey: key) + } + + func bool(key: String) -> Bool { + return userDefaults.bool(forKey: key) + } + + func any(key: String) -> Any? { + return userDefaults.object(forKey: key) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/AutoGainSystem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/AutoGainSystem.swift new file mode 100644 index 00000000..f9cad2fb --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/AutoGainSystem.swift @@ -0,0 +1,51 @@ +// +// AutoGainSystem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/8/26. +// + +import Foundation + +/// 자동 골드 획득 시스템 +final class AutoGainSystem { + /// 사용자 정보 + private let user: User + /// 타이머 + private var timer: Timer? + + /// 자동 획득 시스템 초기화 + init(user: User) { + self.user = user + } + + /// 자동 획득 시스템 시작 + func startSystem() { + // 기존 타이머가 있으면 정리 + stopSystem() + + let timer = Timer.scheduledTimer(withTimeInterval: Policy.System.AutoGain.interval, repeats: true) { [weak self] _ in + self?.gainGold() + } + // 스크롤 중에도 타이머가 작동하도록 common 모드에 추가 + RunLoop.current.add(timer, forMode: .common) + self.timer = timer + } + + /// 자동 획득 시스템 중지 + func stopSystem() { + timer?.invalidate() + timer = nil + } + + /// 초당 골드 획득 처리 + private func gainGold() { + let goldPerSecond = Calculator.calculateGoldPerSecond(user: user) + user.wallet.addGold(goldPerSecond) + /// 누적 재산 업데이트 + user.record.record(.earnMoney(goldPerSecond)) + + // 플레이 타임 기록 + user.record.record(.playTime) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/BuffSystem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/BuffSystem.swift new file mode 100644 index 00000000..74bc4033 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/BuffSystem.swift @@ -0,0 +1,150 @@ +// +// BuffSystem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation +import Observation + +/// 버프 시스템 관리 클래스 +@Observable +final class BuffSystem { + /// 각 버프의 종료 시각 + private var endTimes: [ConsumableType: TimeInterval] = [:] + + /// 각 버프의 배수 + private var multipliers: [ConsumableType: Double] = [:] + + /// 버프 단일 타이머 + private var timer: Timer? + + /// 버프 시스템 일시정지 여부 + private(set) var isPaused: Bool = false + + /// pause 시작 시각 + private var pauseStartTime: TimeInterval? + + // MARK: - Computed Properties + + /// 하나라도 활성화된 버프가 있는지 + var isRunning: Bool { + !endTimes.isEmpty + } + + /// 전체 버프 배수 (모든 활성화된 버프의 배수를 곱한 값) + var multiplier: Double { + multipliers.values.reduce(1.0, *) + } + + /// 커피 버프 남은 시간 (초) + var coffeeDuration: Int { + remainingDuration(for: .coffee) + } + + /// 에너지 드링크 버프 남은 시간 (초) + var energyDrinkDuration: Int { + remainingDuration(for: .energyDrink) + } + + /// 가장 긴 버프 남은 시간 (하위 호환) + var duration: Int { + max(coffeeDuration, energyDrinkDuration) + } + + // MARK: - Public Methods + + /// 소비 아이템 사용 + func useConsumableItem(type: ConsumableType) { + let now = currentTime + endTimes[type] = now + TimeInterval(type.duration) + multipliers[type] = type.buffMultiplier + startTimer() + } + + /// 버프 시스템 종료 + func stop() { + stopTimer() + endTimes.removeAll() + multipliers.removeAll() + isPaused = false + pauseStartTime = nil + } + + /// 버프 시스템 일시정지 + func pause() { + guard isRunning, !isPaused else { return } + isPaused = true + pauseStartTime = currentTime + stopTimer() + } + + /// 버프 시스템 재개 + func resume() { + guard isRunning, isPaused, let pauseStartTime else { return } + + let now = currentTime + let pausedDuration = now - pauseStartTime + + // 모든 버프의 종료 시각을 pause된 시간만큼 뒤로 밀기 + for type in endTimes.keys { + endTimes[type]! += pausedDuration + } + + self.pauseStartTime = nil + isPaused = false + startTimer() + } + + // MARK: - Private Helpers + + /// 현재 시간 (절대) + private var currentTime: TimeInterval { + Date.timeIntervalSinceReferenceDate + } + + /// 남은 시간 계산 (초) + private func remainingDuration(for type: ConsumableType) -> Int { + guard let endTime = endTimes[type] else { return 0 } + let remaining = endTime - currentTime + return max(0, Int(ceil(remaining))) + } + + /// 타이머 시작 + private func startTimer() { + guard timer == nil else { return } + + timer = Timer.scheduledTimer( + withTimeInterval: 1, + repeats: true + ) { [weak self] _ in + self?.tick() + } + } + + /// 타이머 종료 + private func stopTimer() { + timer?.invalidate() + timer = nil + } + + /// 1초 주기로 종료된 버프 정리 + private func tick() { + let now = currentTime + + for (type, endTime) in endTimes where now >= endTime { + stopBuff(for: type) + } + + if endTimes.isEmpty { + stopTimer() + } + } + + /// 특정 버프 제거 + private func stopBuff(for type: ConsumableType) { + endTimes.removeValue(forKey: type) + multipliers.removeValue(forKey: type) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/Calculator.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/Calculator.swift new file mode 100644 index 00000000..2aac3718 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/Calculator.swift @@ -0,0 +1,25 @@ +// +// Calculator.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/7/26. +// + +import Foundation + +enum Calculator { + /// 게임 액션당 획득 골드 계산 + static func calculateGoldPerAction(game: GameType, user: User, feverMultiplier: Double, buffMultiplier: Double) -> Int { + let actionPerGainGold = user.skills.filter { $0.key.game == game }.map { $0.gainGold }.reduce(0, +) + let result = Double(actionPerGainGold) * feverMultiplier * buffMultiplier + return Int(result) + } + + /// 초당 획득 골드 계산 + static func calculateGoldPerSecond(user: User) -> Int { + let goldPerSecond = user.inventory.equipmentItems.map { $0.goldPerSecond }.reduce(0, +) + let housingGoldPerSecond = user.inventory.housing.goldPerSecond + // 장비 아이템 + 부동산 아이템 초당 골드 + return Int(goldPerSecond) + housingGoldPerSecond + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/CareerSystem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/CareerSystem.swift new file mode 100644 index 00000000..0841c5d8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/CareerSystem.swift @@ -0,0 +1,71 @@ +// +// CareerSystem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation +import Observation + +@Observable +final class CareerSystem { + private let user: User + var currentCareer: Career + var careerProgress: Double = 0.0 + var onCareerChanged: ((Career) -> Void)? + + init(user: User) async { + self.user = user + self.currentCareer = user.career + await updateProgress() + } + + /// 누적 재산을 기반으로 현재 달성한 커리어 계산 + func calculateCareer() async -> Career { + let totalWealth = user.record.totalEarnedMoney + + var achievedCareer: Career = .unemployed + for career in Career.allCases { + if totalWealth >= career.requiredWealth { + achievedCareer = career + } else { + break + } + } + return achievedCareer + } + + /// 커리어 업데이트 + func updateCareer() async { + let newCareer = await calculateCareer() + if currentCareer != newCareer { + currentCareer = newCareer + user.updateCareer(to: newCareer) + onCareerChanged?(newCareer) + + if newCareer == .juniorDeveloper { + user.record.record(.juniorDeveloperAchieve) + } + } + await updateProgress() + } +} + +// MARK: - Helper +private extension CareerSystem { + /// 현재 커리어의 진행도 계산 (0.0 ~ 1.0) + func updateProgress() async { + guard let nextCareer = currentCareer.nextCareer else { + careerProgress = 1.0 + return + } + + let totalWealth = user.record.totalEarnedMoney + let currentRequirement = currentCareer.requiredWealth + let nextRequirement = nextCareer.requiredWealth + + let progress = Double(totalWealth - currentRequirement) / Double(nextRequirement - currentRequirement) + careerProgress = max(0.0, min(1.0, progress)) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/CharacterAnimationSystem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/CharacterAnimationSystem.swift new file mode 100644 index 00000000..5c3b678a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/CharacterAnimationSystem.swift @@ -0,0 +1,19 @@ +// +// CharacterAnimationSystem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/21/26. +// + +final class CharacterAnimationSystem { + var onSmile: (() -> Void)? + var onIdle: (() -> Void)? + + func playSmile() { + onSmile?() + } + + func playIdle() { + onIdle?() + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/FeverSystem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/FeverSystem.swift new file mode 100644 index 00000000..ed937bff --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/FeverSystem.swift @@ -0,0 +1,144 @@ +// +// FeverSystem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation +import Observation + +protocol FeverState { + var feverStage: Int { get } + var feverPercent: Double { get } + var feverMultiplier: Double { get } +} + +@Observable +final class FeverSystem: FeverState { + + // MARK: - Properties + /// 피버 감소 주기 (초 단위) + private let decreaseInterval: TimeInterval + /// 피버 감소 퍼센트 (주기당) + private let decreasePercentPerTick: Double + /// 현재 피버 단계 (0: 일반, 1~3: 피버 단계) + private(set) var feverStage: Int = 0 + /// 현재 피버 퍼센트 (0 ~ 300) + private(set) var feverPercent: Double = 0.0 { + didSet { + updateFeverStage() + } + } + /// 피버 감소 타이머 + private var decreaseTimer: Timer? + /// 피버 시스템 자체의 실행 중 여부 + private(set) var isRunning: Bool = false + /// 피버 시스템 일시정지 여부 + private(set) var isPaused: Bool = false + /// 피버 단계별 배수 + var feverMultiplier: Double { + switch feverStage { + case 0: return Policy.Fever.Multiplier.stage0 + case 1: return Policy.Fever.Multiplier.stage1 + case 2: return Policy.Fever.Multiplier.stage2 + case 3: return Policy.Fever.Multiplier.stage3 + default: return Policy.Fever.Multiplier.stage0 + } + } + + // MARK: - Initialization + init(decreaseInterval: TimeInterval, decreasePercentPerTick: Double) { + self.decreaseInterval = decreaseInterval + self.decreasePercentPerTick = decreasePercentPerTick + } + + deinit { + stop() + } + + // MARK: - Public Methods + /// 피버 획득 + /// - Parameter amount: 획득할 피버량 + func gainFever(_ amount: Double) { + let sumPercent = feverPercent + amount + feverPercent = min(Policy.Fever.maxPercent, max(0, sumPercent)) + } + + /// 피버 시스템 시작 + func start() { + guard !isRunning else { return } + isRunning = true + startTimer() + } + + /// 피버 시스템 종료 + func stop() { + isRunning = false + stopTimer() + } + + /// 피버 시스템 일시정지 + func pause() { + guard isRunning && !isPaused else { return } + isPaused = true + stopTimer() + } + + /// 피버 시스템 재개 + func resume() { + guard isRunning && isPaused else { return } + isPaused = false + startTimer() + } + + // MARK: - Private Methods + + /// 타이머 생성 및 시작 + private func startTimer() { + decreaseTimer = Timer.scheduledTimer( + withTimeInterval: decreaseInterval, + repeats: true + ) { [weak self] _ in + self?.decreaseFever() + } + } + + /// 타이머 종료 + private func stopTimer() { + decreaseTimer?.invalidate() + decreaseTimer = nil + } + + /// 피버 감소 (매 주기마다 호출) + private func decreaseFever() { + guard feverPercent > 0 else { return } + if feverPercent - decreasePercentPerTick < 0 { + feverPercent = 0 + } else { + feverPercent -= decreasePercentPerTick + } + } + + /// 피버 단계 업데이트 + private func updateFeverStage() { + let newStage: Int + + switch feverPercent { + case Policy.Fever.StageThreshold.stage0.. Int { + switch self { + case .tap: + return { $0.totalTapCount } + case .languageMatch: + return { $0.languageCorrectCount } + case .bugDodge: + return { $0.dodgeGoldCollectedCount } + case .stackItem: + return { $0.stackingSuccessCount } + case .playTime: + return { Int($0.totalPlayTime) } + case .coffee: + return { $0.coffeeUseCount } + case .energyDrink: + return { $0.energyDrinkUseCount } + case .languageConsecutive: + return { $0.languageConsecutiveCorrect } + case .bugDodgeConsecutive: + return { $0.dodgeMaxCombo } + case .stackConsecutive: + return { $0.stackConsecutiveSuccess } + case .tutorial: + return { $0.tutorialCompleted ? 1 : 0 } + case .career: + return { $0.hasAchievedJuniorDeveloper ? 1 : 0 } + } + } + + /// 완료 조건 (nil이면 기본 체크: currentValue >= targetValue) + var completeCondition: ((Record) -> Bool)? { + switch self { + case .tutorial: + return { $0.tutorialCompleted } + case .career: + return { $0.hasAchievedJuniorDeveloper } + default: + return nil + } + } + + var level: MissionLevel { + switch self { + case .tap(let level), + .languageMatch(let level), + .bugDodge(let level), + .stackItem(let level), + .playTime(let level), + .coffee(let level), + .energyDrink(let level), + .languageConsecutive(let level), + .bugDodgeConsecutive(let level), + .stackConsecutive(let level), + .tutorial(let level), + .career(let level): + return level + } + } +} + +/// 미션 목록을 생성하는 팩토리 +struct MissionFactory { + + // MARK: - Mission Configuration + + /// 미션 생성을 위한 설정 구조체 + struct MissionConfig { + let id: Int + let title: String + let description: String + let targetValue: Int + let reward: Cost + let type: MissionType + } + + // MARK: - Factory Method + + /// 전체 미션 목록 생성 + /// - Returns: 모든 미션의 배열 (총 32개) + static func createAllMissions() -> [Mission] { + let configs: [MissionConfig] = [ + // MARK: - 코드짜기 (탭) + MissionConfig( + id: MissionConstants.CodeTap.id1, + title: MissionConstants.CodeTap.title1, + description: MissionConstants.CodeTap.description1, + targetValue: MissionConstants.CodeTap.target1, + reward: MissionConstants.CodeTap.reward1, + type: .tap(.bronze) + ), + MissionConfig( + id: MissionConstants.CodeTap.id2, + title: MissionConstants.CodeTap.title2, + description: MissionConstants.CodeTap.description2, + targetValue: MissionConstants.CodeTap.target2, + reward: MissionConstants.CodeTap.reward2, + type: .tap(.silver) + ), + MissionConfig( + id: MissionConstants.CodeTap.id3, + title: MissionConstants.CodeTap.title3, + description: MissionConstants.CodeTap.description3, + targetValue: MissionConstants.CodeTap.target3, + reward: MissionConstants.CodeTap.reward3, + type: .tap(.gold) + ), + + // MARK: - 언어맞추기 (맞춘 횟수) + MissionConfig( + id: MissionConstants.LanguageMatch.id1, + title: MissionConstants.LanguageMatch.title1, + description: MissionConstants.LanguageMatch.description1, + targetValue: MissionConstants.LanguageMatch.target1, + reward: MissionConstants.LanguageMatch.reward1, + type: .languageMatch(.bronze) + ), + MissionConfig( + id: MissionConstants.LanguageMatch.id2, + title: MissionConstants.LanguageMatch.title2, + description: MissionConstants.LanguageMatch.description2, + targetValue: MissionConstants.LanguageMatch.target2, + reward: MissionConstants.LanguageMatch.reward2, + type: .languageMatch(.silver) + ), + MissionConfig( + id: MissionConstants.LanguageMatch.id3, + title: MissionConstants.LanguageMatch.title3, + description: MissionConstants.LanguageMatch.description3, + targetValue: MissionConstants.LanguageMatch.target3, + reward: MissionConstants.LanguageMatch.reward3, + type: .languageMatch(.gold) + ), + + // MARK: - 버그피하기 (골드 획득) + MissionConfig( + id: MissionConstants.BugDodge.id1, + title: MissionConstants.BugDodge.title1, + description: MissionConstants.BugDodge.description1, + targetValue: MissionConstants.BugDodge.target1, + reward: MissionConstants.BugDodge.reward1, + type: .bugDodge(.bronze) + ), + MissionConfig( + id: MissionConstants.BugDodge.id2, + title: MissionConstants.BugDodge.title2, + description: MissionConstants.BugDodge.description2, + targetValue: MissionConstants.BugDodge.target2, + reward: MissionConstants.BugDodge.reward2, + type: .bugDodge(.silver) + ), + MissionConfig( + id: MissionConstants.BugDodge.id3, + title: MissionConstants.BugDodge.title3, + description: MissionConstants.BugDodge.description3, + targetValue: MissionConstants.BugDodge.target3, + reward: MissionConstants.BugDodge.reward3, + type: .bugDodge(.gold) + ), + + // MARK: - 데이터쌓기 + MissionConfig( + id: MissionConstants.StackItem.id1, + title: MissionConstants.StackItem.title1, + description: MissionConstants.StackItem.description1, + targetValue: MissionConstants.StackItem.target1, + reward: MissionConstants.StackItem.reward1, + type: .stackItem(.bronze) + ), + MissionConfig( + id: MissionConstants.StackItem.id2, + title: MissionConstants.StackItem.title2, + description: MissionConstants.StackItem.description2, + targetValue: MissionConstants.StackItem.target2, + reward: MissionConstants.StackItem.reward2, + type: .stackItem(.silver) + ), + MissionConfig( + id: MissionConstants.StackItem.id3, + title: MissionConstants.StackItem.title3, + description: MissionConstants.StackItem.description3, + targetValue: MissionConstants.StackItem.target3, + reward: MissionConstants.StackItem.reward3, + type: .stackItem(.gold) + ), + + // MARK: - 플레이타임 + MissionConfig( + id: MissionConstants.PlayTime.id1, + title: MissionConstants.PlayTime.title1, + description: MissionConstants.PlayTime.description1, + targetValue: MissionConstants.PlayTime.targetHours1 * 3600, + reward: MissionConstants.PlayTime.reward1, + type: .playTime(.bronze) + ), + MissionConfig( + id: MissionConstants.PlayTime.id2, + title: MissionConstants.PlayTime.title2, + description: MissionConstants.PlayTime.description2, + targetValue: MissionConstants.PlayTime.targetHours2 * 3600, + reward: MissionConstants.PlayTime.reward2, + type: .playTime(.silver) + ), + MissionConfig( + id: MissionConstants.PlayTime.id3, + title: MissionConstants.PlayTime.title3, + description: MissionConstants.PlayTime.description3, + targetValue: MissionConstants.PlayTime.targetHours3 * 3600, + reward: MissionConstants.PlayTime.reward3, + type: .playTime(.gold) + ), + + // MARK: - 커피 + MissionConfig( + id: MissionConstants.Coffee.id1, + title: MissionConstants.Coffee.title1, + description: MissionConstants.Coffee.description1, + targetValue: MissionConstants.Coffee.target1, + reward: MissionConstants.Coffee.reward1, + type: .coffee(.bronze) + ), + MissionConfig( + id: MissionConstants.Coffee.id2, + title: MissionConstants.Coffee.title2, + description: MissionConstants.Coffee.description2, + targetValue: MissionConstants.Coffee.target2, + reward: MissionConstants.Coffee.reward2, + type: .coffee(.silver) + ), + MissionConfig( + id: MissionConstants.Coffee.id3, + title: MissionConstants.Coffee.title3, + description: MissionConstants.Coffee.description3, + targetValue: MissionConstants.Coffee.target3, + reward: MissionConstants.Coffee.reward3, + type: .coffee(.gold) + ), + + // MARK: - 박하스 + MissionConfig( + id: MissionConstants.EnergyDrink.id1, + title: MissionConstants.EnergyDrink.title1, + description: MissionConstants.EnergyDrink.description1, + targetValue: MissionConstants.EnergyDrink.target1, + reward: MissionConstants.EnergyDrink.reward1, + type: .energyDrink(.bronze) + ), + MissionConfig( + id: MissionConstants.EnergyDrink.id2, + title: MissionConstants.EnergyDrink.title2, + description: MissionConstants.EnergyDrink.description2, + targetValue: MissionConstants.EnergyDrink.target2, + reward: MissionConstants.EnergyDrink.reward2, + type: .energyDrink(.silver) + ), + MissionConfig( + id: MissionConstants.EnergyDrink.id3, + title: MissionConstants.EnergyDrink.title3, + description: MissionConstants.EnergyDrink.description3, + targetValue: MissionConstants.EnergyDrink.target3, + reward: MissionConstants.EnergyDrink.reward3, + type: .energyDrink(.gold) + ), + + // MARK: - 언어맞추기 (연속 성공) + MissionConfig( + id: MissionConstants.LanguageConsecutive.id1, + title: MissionConstants.LanguageConsecutive.title1, + description: MissionConstants.LanguageConsecutive.description1, + targetValue: MissionConstants.LanguageConsecutive.target1, + reward: MissionConstants.LanguageConsecutive.reward1, + type: .languageConsecutive(.bronze) + ), + MissionConfig( + id: MissionConstants.LanguageConsecutive.id2, + title: MissionConstants.LanguageConsecutive.title2, + description: MissionConstants.LanguageConsecutive.description2, + targetValue: MissionConstants.LanguageConsecutive.target2, + reward: MissionConstants.LanguageConsecutive.reward2, + type: .languageConsecutive(.silver) + ), + MissionConfig( + id: MissionConstants.LanguageConsecutive.id3, + title: MissionConstants.LanguageConsecutive.title3, + description: MissionConstants.LanguageConsecutive.description3, + targetValue: MissionConstants.LanguageConsecutive.target3, + reward: MissionConstants.LanguageConsecutive.reward3, + type: .languageConsecutive(.gold) + ), + + // MARK: - 버그피하기 (연속 성공) + MissionConfig( + id: MissionConstants.BugDodgeConsecutive.id1, + title: MissionConstants.BugDodgeConsecutive.title1, + description: MissionConstants.BugDodgeConsecutive.description1, + targetValue: MissionConstants.BugDodgeConsecutive.target1, + reward: MissionConstants.BugDodgeConsecutive.reward1, + type: .bugDodgeConsecutive(.bronze) + ), + MissionConfig( + id: MissionConstants.BugDodgeConsecutive.id2, + title: MissionConstants.BugDodgeConsecutive.title2, + description: MissionConstants.BugDodgeConsecutive.description2, + targetValue: MissionConstants.BugDodgeConsecutive.target2, + reward: MissionConstants.BugDodgeConsecutive.reward2, + type: .bugDodgeConsecutive(.silver) + ), + MissionConfig( + id: MissionConstants.BugDodgeConsecutive.id3, + title: MissionConstants.BugDodgeConsecutive.title3, + description: MissionConstants.BugDodgeConsecutive.description3, + targetValue: MissionConstants.BugDodgeConsecutive.target3, + reward: MissionConstants.BugDodgeConsecutive.reward3, + type: .bugDodgeConsecutive(.gold) + ), + + // MARK: - 데이터 쌓기 (연속 성공) + MissionConfig( + id: MissionConstants.StackConsecutive.id1, + title: MissionConstants.StackConsecutive.title1, + description: MissionConstants.StackConsecutive.description1, + targetValue: MissionConstants.StackConsecutive.target1, + reward: MissionConstants.StackConsecutive.reward1, + type: .stackConsecutive(.bronze) + ), + MissionConfig( + id: MissionConstants.StackConsecutive.id2, + title: MissionConstants.StackConsecutive.title2, + description: MissionConstants.StackConsecutive.description2, + targetValue: MissionConstants.StackConsecutive.target2, + reward: MissionConstants.StackConsecutive.reward2, + type: .stackConsecutive(.silver) + ), + MissionConfig( + id: MissionConstants.StackConsecutive.id3, + title: MissionConstants.StackConsecutive.title3, + description: MissionConstants.StackConsecutive.description3, + targetValue: MissionConstants.StackConsecutive.target3, + reward: MissionConstants.StackConsecutive.reward3, + type: .stackConsecutive(.gold) + ), + + // MARK: - 커리어 + MissionConfig( + id: MissionConstants.Career.id, + title: MissionConstants.Career.title, + description: MissionConstants.Career.description, + targetValue: 1, + reward: MissionConstants.Career.reward, + type: .career(.special) + ), + + // MARK: - 튜토리얼 + MissionConfig( + id: MissionConstants.Tutorial.id, + title: MissionConstants.Tutorial.title, + description: MissionConstants.Tutorial.description, + targetValue: 1, + reward: MissionConstants.Tutorial.reward, + type: .tutorial(.special) + ) + ] + + return configs.map { createMission(from: $0) } + } + + // MARK: - Private Helper + + /// MissionConfig로부터 Mission 인스턴스를 생성합니다. + private static func createMission(from config: MissionConfig) -> Mission { + Mission( + id: config.id, + type: config.type, + title: config.title, + description: config.description, + targetValue: config.targetValue, + updateCondition: config.type.currentValue, + completeCondition: config.type.completeCondition, + reward: config.reward + ) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/MissionSystem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/MissionSystem.swift new file mode 100644 index 00000000..41e1749d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/MissionSystem.swift @@ -0,0 +1,57 @@ +// +// MissionSystem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +@Observable +final class MissionSystem { + /// 모든 미션 + private(set) var missions: [Mission] + /// 완료된 미션 유무 플래그 + private(set) var hasCompletedMission: Bool = false + + /// 총 미션 수 + var allCount: Int { + missions.count + } + /// 획득한 미션 수 + var claimedCount: Int { + missions.count { $0.state == .claimed } + } + + init(missions: [Mission]) { + self.missions = missions + sortMissions() + } + + /// 기록을 통하여 현재 미션의 상태들을 업데이트 합니다. + func updateCompletedMissions(record: Record) { + missions + .filter { $0.state == .inProgress } + .forEach { $0.update(record: record) } + + sortMissions() + checkHasCompletedMission() + } + + func claimMissionReward(mission: Mission, wallet: Wallet) { + let reward = mission.claim() + wallet.addGold(reward.gold) + wallet.addDiamond(reward.diamond) + + sortMissions() + checkHasCompletedMission() + } + + private func checkHasCompletedMission() { + hasCompletedMission = missions.contains { $0.state == .claimable } + } + + private func sortMissions() { + missions.sort { $0.state.rawValue < $1.state.rawValue } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/MotionSystem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/MotionSystem.swift new file mode 100644 index 00000000..47a8a8f3 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/MotionSystem.swift @@ -0,0 +1,72 @@ +// +// MotionSystem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/13/26. +// + +import CoreMotion +import Observation + +@Observable +final class MotionSystem { + // MARK: - Properties + /// CoreMotion 매니저 + private let motionManager = CMMotionManager() + + // MARK: - 설정값 + /// 모션 업데이트 주사율 (120fps) + private let updateInterval = 1.0 / Policy.Game.Dodge.updateFPS + /// 데드존 임계값 (이 값 이하의 기울기는 무시) + private let threshold: Double = Policy.Game.Dodge.Motion.deadZoneThreshold + /// 최대 이동 속도 (기울기 1.0일 때) + private let maxSpeed: CGFloat = Policy.Game.Dodge.Motion.maxSpeed + /// 최소 이동 속도 (기울기 threshold일 때) + private let minSpeed: CGFloat = Policy.Game.Dodge.Motion.minSpeed + + /// 캐릭터의 X 위치 + var characterX: CGFloat = 0 + /// 보정된 X축 기울기 값 (-1.0 ~ 1.0) + var calibratedGravityX: Double = 0 + /// 화면 제한 범위 (게임 영역 너비의 절반) + var screenLimit: CGFloat + + init(screenLimit: CGFloat) { + self.screenLimit = screenLimit + startMotionUpdates() + } + + deinit { + motionManager.stopDeviceMotionUpdates() + } + + /// 모션 업데이트 시작 (120fps) + /// - 기울기 강도에 따라 이동 속도가 비선형적으로 증가 + /// - 화면 밖으로 나가지 않도록 제한 + func startMotionUpdates() { + guard motionManager.isDeviceMotionAvailable else { return } + motionManager.deviceMotionUpdateInterval = updateInterval + + motionManager.startDeviceMotionUpdates(to: .main) { [weak self] motion, _ in + guard let self = self, let motion = motion else { return } + + // 기울기 값 클램핑 (-1.0 ~ 1.0) + let clampedInput = max(-1.0, min(1.0, motion.gravity.x)) + self.calibratedGravityX = clampedInput + + // 캐릭터 이동 (데드존 이상일 때만) + if abs(clampedInput) > self.threshold { + // 기울기 강도에 따라 속도 계산 (비선형적으로 증가) + let tiltStrength = abs(clampedInput) + let speedMultiplier = self.minSpeed + (self.maxSpeed - self.minSpeed) * CGFloat(pow(tiltStrength, 1.5)) + let direction = clampedInput > 0 ? 1.0 : -1.0 + + // 위치 업데이트 + self.characterX += CGFloat(direction) * speedMultiplier * CGFloat(self.updateInterval) + + // 화면 밖 방지 + self.characterX = max(-self.screenLimit, min(self.screenLimit, self.characterX)) + } + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/PurchasingError.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/PurchasingError.swift new file mode 100644 index 00000000..3e345eae --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/PurchasingError.swift @@ -0,0 +1,20 @@ +// +// ShopSystemError.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/19/26. +// + +import Foundation + +/// 구매 기능 관련 에러 +enum PurchasingError: Error { + /// 잠김 + case locked + /// 골드 부족 + case insufficientGold + /// 다이아몬드 부족 + case insufficientDiamond + /// 구매 실패 + case purchaseFailed +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/ShopSystem/DisplayItem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/ShopSystem/DisplayItem.swift new file mode 100644 index 00000000..2fb1370d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/ShopSystem/DisplayItem.swift @@ -0,0 +1,33 @@ +// +// DisplayItem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/19/26. +// + +import Foundation + +struct DisplayItem: Identifiable, Item { + // MARK: - Item + var displayTitle: String { + return item.displayTitle + } + var description: String { + return item.description + } + var cost: Cost { + return item.cost + } + var imageName: String { + return item.imageName + } + var category: ItemCategory { + return item.category + } + + // MARK: - DisplayItem + let id = UUID() + let item: Item + let isEquipped: Bool + let isPurchasable: Bool +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/ShopSystem/ShopSystem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/ShopSystem/ShopSystem.swift new file mode 100644 index 00000000..4c6db79e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/ShopSystem/ShopSystem.swift @@ -0,0 +1,207 @@ +// +// ShopSystem.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +/// 상점 시스템 관리 클래스 +final class ShopSystem { + /// 사용자 정보 + private let user: User + + /// 상점 시스템 초기화 + init(user: User) { + self.user = user + } + + /// 상점에 표시될 아이템 목록 생성 + /// - Parameter itemTypes: 표시할 아이템 카테고리 목록 + /// - Returns: 화면에 표시할 DisplayItem 배열 + func itemList(itemTypes: [ItemCategory]) -> [DisplayItem] { + return itemTypes.map { makeDisplayItems(for: $0) }.flatMap { $0 } + } + + /// 부동산 실제 비용 계산 + /// - Parameter item: 부동산 아이템 + /// - Returns: 실제 지불/환불 금액 (양수: 지불, 음수: 환불) + func calculateHousingNetCost(for item: DisplayItem) -> Int { + let refundAmount = user.inventory.housing.cost.gold / 2 + return item.cost.gold - refundAmount + } + + /// 아이템 구매 + /// - Parameter item: 구매할 아이템 + /// - Returns: 구매 성공 여부 (장비의 경우 강화 성공/실패, 다른 아이템은 항상 true) + /// - Throws: + /// - ShopSystemError.insufficientGold: 골드 부족 + /// - ShopSystemError.insufficientDiamond: 다이아몬드 부족 + /// - ShopSystemError.purchaseFailed: 구매 처리 실패 + func buy(item: DisplayItem) throws -> Bool { + // 부동산의 경우 실제 지불 금액으로 구매 가능 여부 확인 + if item.category == .housing { + let netGoldCost = calculateHousingNetCost(for: item) + + // 실제 지불 금액이 양수일 때만 구매 가능 여부 확인 (음수면 환불이므로 항상 가능) + if netGoldCost > 0 { + guard user.wallet.gold >= netGoldCost else { + throw PurchasingError.insufficientGold + } + } + + // 다이아몬드 비용 확인 + if item.cost.diamond > 0 { + guard user.wallet.diamond >= item.cost.diamond else { + throw PurchasingError.insufficientDiamond + } + } + } else { + // 장비 및 소비품: 일반 구매 가능 여부 확인 + guard user.wallet.canAfford(item.cost) else { + if item.cost.gold > 0 { + throw PurchasingError.insufficientGold + } else { + throw PurchasingError.insufficientDiamond + } + } + } + + // 아이템 카테고리에 따른 구매 로직 실행 + switch item.category { + case .consumable: + return try buyConsumable(displayItem: item) + case .equipment: + return try buyEquipment(displayItem: item) + case .housing: + return try buyHousing(displayItem: item) + } + } +} + +private extension ShopSystem { + /// 아이템 카테고리에 따른 DisplayItem 목록 생성 + /// - Parameter category: 아이템 카테고리 + /// - Returns: 해당 카테고리의 DisplayItem 배열 + func makeDisplayItems(for category: ItemCategory) -> [DisplayItem] { + switch category { + case .consumable: + // 소비 아이템 목록 생성 + let consumables = user.inventory.consumableItems + return consumables.map { consumable in + DisplayItem( + item: consumable, + isEquipped: true, + isPurchasable: user.wallet.canAfford(consumable.cost) + ) + } + + case .equipment: + // 장비 아이템 목록 생성 + let equipments = user.inventory.equipmentItems + return equipments.map { equipment in + DisplayItem( + item: equipment, + isEquipped: true, + isPurchasable: user.wallet.canAfford(equipment.cost) + ) + } + + case .housing: + // 부동산 아이템 목록 생성 (모든 티어 표시) + let currentHousingTier = user.inventory.housing.tier.rawValue + let allHousings = HousingTier.allCases.map { Housing(tier: $0) } + return allHousings.map { housing in + DisplayItem( + item: housing, + isEquipped: housing.tier.rawValue == currentHousingTier, + isPurchasable: user.wallet.canAfford(housing.cost) + ) + } + .sorted { $0.isEquipped && !$1.isEquipped } + } + } + + /// 소비 아이템 구매 (개수 증가) + /// - Parameter displayItem: 구매할 소비 아이템 + /// - Returns: 항상 true (구매 성공) + /// - Throws: ShopSystemError.purchaseFailed - 아이템 타입 변환 실패 + func buyConsumable(displayItem: DisplayItem) throws -> Bool { + // DisplayItem을 Consumable로 변환 + guard let consumable = displayItem.item as? Consumable else { + throw PurchasingError.purchaseFailed + } + + // 재화 지불 (골드/다이아몬드) + let cost = displayItem.cost + if cost.gold > 0 { + user.wallet.spendGold(cost.gold) + } + if cost.diamond > 0 { + user.wallet.spendDiamond(cost.diamond) + } + + // 인벤토리에 소비 아이템 개수 증가 + user.inventory.gain(consumable: consumable.type) + + return true + } + + /// 장비 아이템 구매 (강화 시도) + /// - Parameter displayItem: 구매할 장비 아이템 + /// - Returns: 강화 성공 여부 (true: 성공, false: 실패) + /// - Throws: ShopSystemError.purchaseFailed - 아이템 타입 변환 실패 + /// - Note: 비용 지불 후 강화를 시도하며, 성공 여부는 티어의 강화 확률에 따라 결정됨 + func buyEquipment(displayItem: DisplayItem) throws -> Bool { + // DisplayItem을 Equipment로 변환 + guard let equipment = displayItem.item as? Equipment else { + throw PurchasingError.purchaseFailed + } + + // 재화 지불 (골드/다이아몬드) + let cost = displayItem.cost + if cost.gold > 0 { + user.wallet.spendGold(cost.gold) + } + if cost.diamond > 0 { + user.wallet.spendDiamond(cost.diamond) + } + + // 장비 강화 시도 (성공 확률은 티어마다 다름) + return equipment.upgraded() + } + + /// 부동산 아이템 구매 (교체 및 환불) + /// - Parameter displayItem: 구매할 부동산 아이템 + /// - Returns: 항상 true (구매 성공) + /// - Throws: ShopSystemError.purchaseFailed - 아이템 타입 변환 실패 + /// - Note: 기존 부동산 구입 금액의 50%를 환불받고, 실제 비용만 지불함 + func buyHousing(displayItem: DisplayItem) throws -> Bool { + // DisplayItem을 Housing으로 변환 + guard let newHousing = displayItem.item as? Housing else { + throw PurchasingError.purchaseFailed + } + + // 실제 지불 금액 계산 + let netGoldCost = calculateHousingNetCost(for: displayItem) + + // 골드 지불 또는 환불 + if netGoldCost > 0 { + user.wallet.spendGold(netGoldCost) + } else { + // 환불액이 더 큰 경우 골드 추가 (다운그레이드 시) + user.wallet.addGold(-netGoldCost) + } + + // 다이아몬드 비용 지불 + if displayItem.cost.diamond > 0 { + user.wallet.spendDiamond(displayItem.cost.diamond) + } + + // 인벤토리의 부동산을 새 부동산으로 교체 + user.inventory.housing = newHousing + + return true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/SkillSystem.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/SkillSystem.swift new file mode 100644 index 00000000..b813ab0a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/Systems/SkillSystem.swift @@ -0,0 +1,143 @@ +// +// SkillSystem.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/20/26. +// + +import Foundation + +struct SkillState { + let skill: Skill + let itemState: ItemState +} + +final class SkillSystem { + private let user: User + private let careerSystem: CareerSystem? + + init( + user: User, + careerSystem: CareerSystem? + ) { + self.user = user + self.careerSystem = careerSystem + } + + /// 스킬 리스트를 정렬하여 반환 + func skillList() -> [SkillState] { + let gameTypeCount = GameType.allCases.count + let skillTierCount = SkillTier.allCases.count + + var buckets: [Skill?] = Array( + repeating: nil, + count: gameTypeCount * skillTierCount + ) + for skill in user.skills { + let gameIndex = skill.key.game.rawValue + let tierIndex = skill.key.tier.rawValue + let bucketIndex = gameIndex * skillTierCount + tierIndex + buckets[bucketIndex] = skill + } + return buckets + .compactMap { $0 } + .map { skill in SkillState( + skill: skill, + itemState: getItemState(for: skill)) + } + } + + /// 스킬 항목을 구매하여 레벨 업그레이드 + func upgrade(skill: Skill) throws { + guard canUnlock(skill: skill) else { + throw PurchasingError.locked + } + guard skill.upgradeCost.gold <= user.wallet.gold else { + throw PurchasingError.insufficientGold + } + guard skill.upgradeCost.diamond <= user.wallet.diamond else { + throw PurchasingError.insufficientDiamond + } + + let costBeforeUpgrade = skill.upgradeCost + try skill.upgrade() + pay(cost: costBeforeUpgrade) + } +} + +private extension SkillSystem { + func pay(cost: Cost) { + user.wallet.spendGold(cost.gold) + user.wallet.spendDiamond(cost.diamond) + } + + func getItemState(for skill: Skill) -> ItemState { + let canUpgrade = skill.level < skill.key.tier.levelRange.maxValue + let canUnlock = canUnlock(skill: skill) + let cost = skill.upgradeCost + let canAfford = cost.gold <= user.wallet.gold && cost.diamond <= user.wallet.diamond + + return ItemState(canUpgrade: canUpgrade, canUnlock: canUnlock, canAfford: canAfford) + } + + func canUnlock(skill: Skill) -> Bool { + let unlockLevel: Int + + switch skill.key.game { + case .tap: + switch skill.key.tier { + case .beginner: + guard let careerSystem = careerSystem else { return false } + return careerSystem.currentCareer.requiredWealth >= Policy.Career.GameUnlock.tap + case .intermediate: + unlockLevel = Policy.Skill.Tap.intermediateUnlockLevel + case .advanced: + unlockLevel = Policy.Skill.Tap.advancedUnlockLevel + } + case .language: + switch skill.key.tier { + case .beginner: + guard let careerSystem = careerSystem else { return false } + return careerSystem.currentCareer.requiredWealth >= Policy.Career.GameUnlock.language + case .intermediate: + unlockLevel = Policy.Skill.Language.intermediateUnlockLevel + case .advanced: + unlockLevel = Policy.Skill.Language.advancedUnlockLevel + } + case .dodge: + switch skill.key.tier { + case .beginner: + guard let careerSystem = careerSystem else { return false } + return careerSystem.currentCareer.requiredWealth >= Policy.Career.GameUnlock.dodge + case .intermediate: + unlockLevel = Policy.Skill.Dodge.intermediateUnlockLevel + case .advanced: + unlockLevel = Policy.Skill.Dodge.advancedUnlockLevel + } + case .stack: + switch skill.key.tier { + case .beginner: + guard let careerSystem = careerSystem else { return false } + return careerSystem.currentCareer.requiredWealth >= Policy.Career.GameUnlock.stack + case .intermediate: + unlockLevel = Policy.Skill.Stack.intermediateUnlockLevel + case .advanced: + unlockLevel = Policy.Skill.Stack.advancedUnlockLevel + } + } + + // intermediate나 advanced인 경우 + let previousTier: SkillTier = skill.key.tier == .intermediate ? .beginner : .intermediate + guard let previousSkill = getPreviousTierSkill(key: .init(game: skill.key.game, tier: previousTier)) else { + return false + } + return previousSkill.level >= unlockLevel + } + + func getPreviousTierSkill(key: SkillKey) -> Skill? { + guard let previousTierSkill = user.skills.first(where: {$0.key == key}) else { + return nil + } + return previousTierSkill + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Career.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Career.swift new file mode 100644 index 00000000..ad131604 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Career.swift @@ -0,0 +1,118 @@ +// +// Career.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +enum Career: String, CaseIterable { + case unemployed = "백수" + case laptopOwner = "노트북 보유자" + case aspiringDeveloper = "개발자 지망생" + case juniorDeveloper = "하찮은 개발자" + case normalDeveloper = "아무튼 개발자" + case nightOwlDeveloper = "밤 새는 개발자" + case skilledDeveloper = "유능한 개발자" + case famousDeveloper = "유명한 개발자" + case allRounderDeveloper = "올라운더 개발자" + case worldClassDeveloper = "월드클래스 개발자" + + var description: String { + switch self { + case .unemployed: + return "아직 아무것도 시작하지 않았지만, 시간은 가장 많다" + case .laptopOwner: + return "별다방 입장권 획득" + case .aspiringDeveloper: + return "헬로 월드(Hello World) 장인" + case .juniorDeveloper: + return "에러는 많고 자신감은 적다" + case .normalDeveloper: + return "이유는 몰라도 코드는 돌아간다" + case .nightOwlDeveloper: + return "해 뜨는게 퇴근 신호" + case .skilledDeveloper: + return "복붙의 신" + case .famousDeveloper: + return "개발자들의 연예인" + case .allRounderDeveloper: + return "맡다 보니 전부 다 하게 됐다" + case .worldClassDeveloper: + return "0과 1로 대화 가능" + } + } + + var imageName: String { + switch self { + case .unemployed: return "profile_unemployed" + case .laptopOwner: return "profile_laptop_owner" + case .aspiringDeveloper: return "profile_aspiring_developer" + case .juniorDeveloper: return "profile_junior_developer" + case .normalDeveloper: return "profile_normal_developer" + case .nightOwlDeveloper: return "profile_night_owl_developer" + case .skilledDeveloper: return "profile_skilled_developer" + case .famousDeveloper: return "profile_famous_developer" + case .allRounderDeveloper: return "profile_all_rounder_developer" + case .worldClassDeveloper: return "profile_world_class_developer" + } + } + + var characterImagePrefix: String { + switch self { + case .unemployed: return "character_unemployed" + case .laptopOwner: return "character_laptop_owner" + case .aspiringDeveloper: return "character_aspiring_developer" + case .juniorDeveloper: return "character_junior_developer" + case .normalDeveloper: return "character_normal_developer" + case .nightOwlDeveloper: return "character_night_owl_developer" + case .skilledDeveloper: return "character_skilled_developer" + case .famousDeveloper: return "character_famous_developer" + case .allRounderDeveloper: return "character_all_rounder_developer" + case .worldClassDeveloper: return "character_world_class_developer" + } + } + + /// 다음 단계로 업그레이드하기 위해 필요한 누적 재산 + var requiredWealth: Int { + switch self { + case .unemployed: + return Policy.Career.unemployed + case .laptopOwner: + return Policy.Career.laptopOwner + case .aspiringDeveloper: + return Policy.Career.aspiringDeveloper + case .juniorDeveloper: + return Policy.Career.juniorDeveloper + case .normalDeveloper: + return Policy.Career.normalDeveloper + case .nightOwlDeveloper: + return Policy.Career.nightOwlDeveloper + case .skilledDeveloper: + return Policy.Career.skilledDeveloper + case .famousDeveloper: + return Policy.Career.famousDeveloper + case .allRounderDeveloper: + return Policy.Career.allRounderDeveloper + case .worldClassDeveloper: + return Policy.Career.worldClassDeveloper + } + } + + /// 다음 Career 단계 + var nextCareer: Career? { + guard let currentIndex = Career.allCases.firstIndex(of: self), + currentIndex < Career.allCases.count - 1 + else { + return nil + } + return Career.allCases[currentIndex + 1] + } + + /// 현재 누적재산으로 업그레이드 가능한지 확인 + func canUpgrade(currentWealth: Int) -> Bool { + guard let next = nextCareer else { return false } + return currentWealth >= next.requiredWealth + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Inventory.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Inventory.swift new file mode 100644 index 00000000..120b4793 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Inventory.swift @@ -0,0 +1,60 @@ +// +// Inventory.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation +import Observation + +@MainActor +@Observable +final class Inventory { + + /// 장비 아이템 + let equipmentItems: [Equipment] + /// 소비 아이템 + let consumableItems: [Consumable] + /// 부동산 + var housing: Housing + + init( + equipmentItems: [Equipment] = [ + .init(type: .keyboard, tier: .broken), + .init(type: .mouse, tier: .broken), + .init(type: .monitor, tier: .broken), + .init(type: .chair, tier: .broken) + ], + consumableItems: [Consumable] = [ + .init(type: .coffee, count: 5), + .init(type: .energyDrink, count: 5) + ], + housing: Housing = .init(tier: .street) + ) { + self.equipmentItems = equipmentItems + self.consumableItems = consumableItems + self.housing = housing + } + + /// 소비 아이템을 사용합니다. + /// - Returns: 사용 성공 여부 + func drink(_ type: ConsumableType) -> Bool { + guard let targetItem = consumableItems.filter({ $0.type == type }).first else { return false } + guard targetItem.count > 0 else { return false } + targetItem.spendItem() + return true + } + + /// 소비 아이템 갯수 + /// - Parameter type: 소비 아이템 타입 + /// - Returns: 소비 아이템 갯수 + func count(_ type: ConsumableType) -> Int? { + guard let targetItem = consumableItems.filter({ $0.type == type }).first else { return nil } + return targetItem.count + } + + func gain(consumable: ConsumableType) { + consumableItems.filter { $0.type == consumable }.first?.addItem() + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Mission.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Mission.swift new file mode 100644 index 00000000..eca60e5c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Mission.swift @@ -0,0 +1,135 @@ +// +// Mission.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation +import Observation + +enum MissionCardState: Equatable { + case claimed + case claimable + case inProgress(currentValue: Int, totalValue: Int) +} + +enum MissionLevel { + /// 금 + case gold + /// 은 + case silver + /// 동 + case bronze + /// 특수 + case special + + var imageName: String { + switch self { + case .bronze: return "mission_trophy_bronze" + case .silver: return "mission_trophy_silver" + case .gold: return "mission_trophy_gold" + case .special: return "mission_trophy_special" + } + } +} + +@MainActor +@Observable +final class Mission { + enum State: Int { + /// "획득하기" + case claimable + /// "진행중" + case inProgress + /// "달성 완료" + case claimed + } + + /// 미션 아이디 + var id: Int + /// 미션 타입 + var type: MissionType + /// 업적 제목 + var title: String + /// 업적 설명 + var description: String + /// 목표 수치 + var targetValue: Int + /// 현재 수치 + var currentValue: Int + /// 진행 상태 + var progress: Double { + min(Double(currentValue) / Double(targetValue), 1.0) + } + /// 현재 미션 상태 + var state: State = .inProgress + /// 업데이트 조건 + var updateCondition: (Record) -> Int + /// 달성 조건 + var completeCondition: ((Record) -> Bool)? + /// 보상 + var reward: Cost + + /// 미션 카드 상태로 매핑 + var missionCardState: MissionCardState { + switch state { + case .claimed: + return .claimed + case .claimable: + return .claimable + case .inProgress: + return .inProgress( + currentValue: currentValue, + totalValue: targetValue + ) + } + } + + init( + id: Int, + type: MissionType, + title: String, + description: String, + targetValue: Int, + currentValue: Int = 0, + state: State = .inProgress, + updateCondition: @escaping (Record) -> Int, + completeCondition: ((Record) -> Bool)? = nil, + reward: Cost + ) { + self.id = id + self.type = type + self.title = title + self.description = description + self.targetValue = targetValue + self.currentValue = currentValue + self.state = state + self.updateCondition = updateCondition + self.completeCondition = completeCondition + self.reward = reward + } + + /// 최신 기록으로 업데이트하고, 완료 조건을 체크 + func update(record: Record) { + guard state == .inProgress else { return } + + // 현재 값 업데이트 + currentValue = updateCondition(record) + + // 완료 조건 체크 + let isComplete = completeCondition?(record) ?? (currentValue >= targetValue) + + if isComplete { + state = .claimable + } + } + + /// 미션을 완료하고 보상을 리턴합니다. + func claim() -> Cost { + guard state == .claimable else { return Cost() } + state = .claimed + + return reward + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Record.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Record.swift new file mode 100644 index 00000000..40853913 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Record.swift @@ -0,0 +1,185 @@ +// +// Record.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation +import Observation + +@MainActor +@Observable +final class Record { + /// 미션 시스템을 소유해서 기록을 반영합니다. + let missionSystem: MissionSystem + + init(missionSystem: MissionSystem = MissionSystem(missions: MissionFactory.createAllMissions())) { + self.missionSystem = missionSystem + } + + // MARK: - Financial Records + /// 누적 획득 재산 + var totalEarnedMoney: Int = 0 + /// 누적 소비 재산 + var totalSpentMoney: Int = 0 + /// 누적 스킬 업그레이드 비용 + var totalSkillUpgradeCost: Int = 0 + /// 누적 장비 강화 비용 + var totalEquipmentEnhancementCost: Int = 0 + /// 누적 소비 아이템 구입 비용 + var totalConsumablePurchaseCost: Int = 0 + /// 누적 부동산 이사 비용 + var totalHousingMoveCost: Int = 0 + + // MARK: - Tap Records + /// 총 탭 횟수 + var totalTapCount: Int = 0 + + // MARK: - Language Game Records + /// 언어 맞추기 성공 횟수 + var languageCorrectCount: Int = 0 + /// 언어 맞추기 연속 성공 횟수 + var languageConsecutiveCorrect: Int = 0 + + // MARK: - Bug Dodging Records + /// 버그피하기 골드 수집 횟수 + var dodgeGoldCollectedCount: Int = 0 + /// 버그피하기 최고 콤보 (역대 최고 연속 회피 횟수) + var dodgeMaxCombo: Int = 0 + /// 버그피하기 총 버그 회피 횟수 + var dodgeBugAvoidedCount: Int = 0 + /// 버그피하기 버그 수집 횟수 + var dodgeBugCollectCount: Int = 0 + + // MARK: - Stacking Game Records + /// 데이터 쌓기 성공 횟수 + var stackingSuccessCount: Int = 0 + /// 데이터 쌓기 연속 성공 횟수 + var stackConsecutiveSuccess: Int = 0 + + // MARK: - Consumable Usage Records + /// 커피 사용 횟수 + var coffeeUseCount: Int = 0 + /// 에너지 드링크 사용 횟수 + var energyDrinkUseCount: Int = 0 + + // MARK: - Play Time Records + /// 총 플레이 시간 + var totalPlayTime: TimeInterval = 0 + + // MARK: - Tutorial Records + /// 튜토리얼 클리어 여부 + var tutorialCompleted: Bool = false + + // MARK: - Career Records + /// 하찮은 개발자 달성 여부 + var hasAchievedJuniorDeveloper: Bool = false +} + +// MARK: - Record Event +extension Record { + enum Event { + // Tap + case tap(count: Int = 1) + + // Language Game + case languageCorrect + case languageIncorrect + + // Bug Dodging + case dodgeGoldCollect + case dodgeBugAvoid(currentCombo: Int) + case dodgeFail + + // Stacking Game + case stackingSuccess + case stackingFail + + // Consumables + case coffeeUse + case energyDrinkUse + + // Play Time + case playTime + + // Financial + case earnMoney(Int) + case spendMoney(Int) + case skillUpgrade(cost: Int) + case equipmentEnhancement(cost: Int) + case consumablePurchase(cost: Int) + case housingMove(cost: Int) + + // Achievements + case tutorialComplete + case juniorDeveloperAchieve + } + + /// Record Event 기록 + func record(_ event: Event) { + switch event { + case .tap(let count): + totalTapCount += count + + case .languageCorrect: + languageCorrectCount += 1 + languageConsecutiveCorrect += 1 + + case .languageIncorrect: + languageConsecutiveCorrect = 0 + + case .dodgeGoldCollect: + dodgeGoldCollectedCount += 1 + + case .dodgeBugAvoid(let currentCombo): + dodgeBugAvoidedCount += 1 + dodgeMaxCombo = max(currentCombo, dodgeMaxCombo) + + case .dodgeFail: + dodgeBugCollectCount += 1 + + case .stackingSuccess: + stackingSuccessCount += 1 + stackConsecutiveSuccess += 1 + + case .stackingFail: + stackConsecutiveSuccess = 0 + + case .coffeeUse: + coffeeUseCount += 1 + + case .energyDrinkUse: + energyDrinkUseCount += 1 + + case .playTime: + totalPlayTime += 1 + + case .earnMoney(let amount): + totalEarnedMoney += amount + + case .spendMoney(let amount): + totalSpentMoney += amount + + case .skillUpgrade(let cost): + totalSkillUpgradeCost += cost + + case .equipmentEnhancement(let cost): + totalEquipmentEnhancementCost += cost + + case .consumablePurchase(let cost): + totalConsumablePurchaseCost += cost + + case .housingMove(let cost): + totalHousingMoveCost += cost + + case .tutorialComplete: + tutorialCompleted = true + + case .juniorDeveloperAchieve: + hasAchievedJuniorDeveloper = true + } + /// 미션 상태 업데이트 + missionSystem.updateCompletedMissions(record: self) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Skill/Skill.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Skill/Skill.swift new file mode 100644 index 00000000..2bdc3423 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Skill/Skill.swift @@ -0,0 +1,180 @@ +// +// Skill.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +/// 스킬 정보를 키로 식별하여 관리 +struct SkillKey: Hashable { + let game: GameType + let tier: SkillTier +} + +final class Skill: Hashable { + /// 고유 스킬 정보 (게임 종류, 스킬 티어) + let key: SkillKey + + /// 스킬 레벨 + private(set) var level: Int + + /// 획득 재화량 + var gainGold: Double { + let baseGold: Int + let multiplier: Int + + switch key.game { + case .tap: + baseGold = Policy.Skill.Tap.baseGold + switch key.tier { + case .beginner: + multiplier = Policy.Skill.Tap.beginnerGoldMultiplier + case .intermediate: + multiplier = Policy.Skill.Tap.intermediateGoldMultiplier + case .advanced: + multiplier = Policy.Skill.Tap.advancedGoldMultiplier + } + case .language: + baseGold = Policy.Skill.Language.baseGold + switch key.tier { + case .beginner: + multiplier = Policy.Skill.Language.beginnerGoldMultiplier + case .intermediate: + multiplier = Policy.Skill.Language.intermediateGoldMultiplier + case .advanced: + multiplier = Policy.Skill.Language.advancedGoldMultiplier + } + case .dodge: + baseGold = Policy.Skill.Dodge.baseGold + switch key.tier { + case .beginner: + multiplier = Policy.Skill.Dodge.beginnerGoldMultiplier + case .intermediate: + multiplier = Policy.Skill.Dodge.intermediateGoldMultiplier + case .advanced: + multiplier = Policy.Skill.Dodge.advancedGoldMultiplier + } + case .stack: + baseGold = Policy.Skill.Stack.baseGold + switch key.tier { + case .beginner: + multiplier = Policy.Skill.Stack.beginnerGoldMultiplier + case .intermediate: + multiplier = Policy.Skill.Stack.intermediateGoldMultiplier + case .advanced: + multiplier = Policy.Skill.Stack.advancedGoldMultiplier + } + } + + return Double(baseGold + multiplier * level) + } + + /// 이미지 리소스 + var imageName: String { + let gameName: String = { + switch key.game { + case .tap: return "tap" + case .language: return "language" + case .dodge: return "dodge" + case .stack: return "stack" + } + }() + + let tierNumber: Int = { + switch key.tier { + case .beginner: return 1 + case .intermediate: return 2 + case .advanced: return 3 + } + }() + + return "skill_\(gameName)_\(tierNumber)" + } + + /// 스킬 타이틀 + var title: String { + return "\(key.game.displayTitle) \(key.tier.displayTitle) Lv.\(level)" + } + + /// 업그레이드 비용 + var upgradeCost: Cost { + let goldCostMultiplier: Int + let diamondCostDivider: Int + let diamondCostMultiplier: Int + + switch key.game { + case .tap: + switch key.tier { + case .beginner: + goldCostMultiplier = Policy.Skill.Tap.beginnerGoldCostMultiplier + case .intermediate: + goldCostMultiplier = Policy.Skill.Tap.intermediateGoldCostMultiplier + case .advanced: + goldCostMultiplier = Policy.Skill.Tap.advancedGoldCostMultiplier + } + diamondCostDivider = Policy.Skill.Tap.diamondCostDivider + diamondCostMultiplier = Policy.Skill.Tap.diamondCostMultiplier + case .language: + switch key.tier { + case .beginner: + goldCostMultiplier = Policy.Skill.Language.beginnerGoldCostMultiplier + case .intermediate: + goldCostMultiplier = Policy.Skill.Language.intermediateGoldCostMultiplier + case .advanced: + goldCostMultiplier = Policy.Skill.Language.advancedGoldCostMultiplier + } + diamondCostDivider = Policy.Skill.Language.diamondCostDivider + diamondCostMultiplier = Policy.Skill.Language.diamondCostMultiplier + case .dodge: + switch key.tier { + case .beginner: + goldCostMultiplier = Policy.Skill.Dodge.beginnerGoldCostMultiplier + case .intermediate: + goldCostMultiplier = Policy.Skill.Dodge.intermediateGoldCostMultiplier + case .advanced: + goldCostMultiplier = Policy.Skill.Dodge.advancedGoldCostMultiplier + } + diamondCostDivider = Policy.Skill.Dodge.diamondCostDivider + diamondCostMultiplier = Policy.Skill.Dodge.diamondCostMultiplier + case .stack: + switch key.tier { + case .beginner: + goldCostMultiplier = Policy.Skill.Stack.beginnerGoldCostMultiplier + case .intermediate: + goldCostMultiplier = Policy.Skill.Stack.intermediateGoldCostMultiplier + case .advanced: + goldCostMultiplier = Policy.Skill.Stack.advancedGoldCostMultiplier + } + diamondCostDivider = Policy.Skill.Stack.diamondCostDivider + diamondCostMultiplier = Policy.Skill.Stack.diamondCostMultiplier + } + + return .init( + gold: goldCostMultiplier * level, + diamond: level == 0 || ((level+1) % diamondCostDivider == 0) ? diamondCostMultiplier : 0 + ) + } + + init(key: SkillKey, level: Int? = nil) { + self.key = key + self.level = key.tier.levelRange.clamped(level ?? key.tier.levelRange.minValue) + } + + /// 해당 스킬의 레벨을 1 상승 시킵니다. + func upgrade() throws { + guard key.tier.levelRange.canUpgrade(from: level) else { + throw SkillError.levelExceeded + } + level += 1 + } + + static func == (lhs: Skill, rhs: Skill) -> Bool { + lhs.key == rhs.key + } + + func hash(into hasher: inout Hasher) { + hasher.combine(key) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Skill/SkillError.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Skill/SkillError.swift new file mode 100644 index 00000000..f3cd11f5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Skill/SkillError.swift @@ -0,0 +1,11 @@ +// +// SkillError.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/20/26. +// + +enum SkillError: Error { + /// 레벨 한도 초과 + case levelExceeded +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Skill/SkillTier.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Skill/SkillTier.swift new file mode 100644 index 00000000..18665cc3 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Skill/SkillTier.swift @@ -0,0 +1,55 @@ +// +// SkillTier.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/20/26. +// + +/// 스킬 등급 +enum SkillTier: Int, CaseIterable { + case beginner = 0 + case intermediate = 1 + case advanced = 2 + + var displayTitle: String { + switch self { + case .beginner: "초급" + case .intermediate: "중급" + case .advanced: "고급" + } + } + + var levelRange: LevelRange { + switch self { + case .beginner: + LevelRange( + minValue: Policy.Skill.beginnerMinLevel, + maxValue: Policy.Skill.beginnerMaxLevel + ) + case .intermediate: + LevelRange( + minValue: Policy.Skill.intermediateMinLevel, + maxValue: Policy.Skill.intermediateMaxLevel + ) + case .advanced: + LevelRange( + minValue: Policy.Skill.advancedMinLevel, + maxValue: Policy.Skill.advancedMaxLevel + ) + } + } +} + +/// 레벨 범위 표현을 위한 타입 +struct LevelRange { + let minValue: Int + let maxValue: Int + + func clamped(_ level: Int) -> Int { + max(minValue, min(maxValue, level)) + } + + func canUpgrade(from level: Int) -> Bool { + level < maxValue + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/User.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/User.swift new file mode 100644 index 00000000..24688128 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/User.swift @@ -0,0 +1,80 @@ +// +// User.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation + +@MainActor +final class User { + /// 유저 식별용 ID + let id: UUID + /// 유저 닉네임 + let nickname: String + /// 커리어 + var career: Career + /// 지갑 [재산, 다이아] + let wallet: Wallet + /// 인벤토리 [장비, 소비, 부동산] 아이템 + let inventory: Inventory + /// 게임 기록 + let record: Record + + /// 보유 스킬 + let skills: Set + + init( + id: UUID = UUID(), + nickname: String, + career: Career = .unemployed, + wallet: Wallet, + inventory: Inventory, + record: Record, + skills: Set = [] + ) { + self.id = id + self.nickname = nickname + self.career = career + self.wallet = wallet + self.inventory = inventory + self.record = record + self.skills = skills + } + + func updateCareer(to newCareer: Career) { + career = newCareer + } + + convenience init(nickname: String) { + self.init( + nickname: nickname, + wallet: .init(), + inventory: .init( + equipmentItems: [ + .init(type: .chair, tier: .broken), + .init(type: .keyboard, tier: .broken), + .init(type: .monitor, tier: .broken), + .init(type: .mouse, tier: .broken) + ], + housing: .init(tier: .street) + ), + record: .init(), + skills: [ + .init(key: SkillKey(game: .tap, tier: .beginner)), + .init(key: SkillKey(game: .tap, tier: .intermediate)), + .init(key: SkillKey(game: .tap, tier: .advanced)), + .init(key: SkillKey(game: .language, tier: .beginner)), + .init(key: SkillKey(game: .language, tier: .intermediate)), + .init(key: SkillKey(game: .language, tier: .advanced)), + .init(key: SkillKey(game: .dodge, tier: .beginner)), + .init(key: SkillKey(game: .dodge, tier: .intermediate)), + .init(key: SkillKey(game: .dodge, tier: .advanced)), + .init(key: SkillKey(game: .stack, tier: .beginner)), + .init(key: SkillKey(game: .stack, tier: .intermediate)), + .init(key: SkillKey(game: .stack, tier: .advanced)) + ] + ) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Wallet.swift b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Wallet.swift new file mode 100644 index 00000000..036cffa2 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/GameCore/Models/User/Wallet.swift @@ -0,0 +1,65 @@ +// +// Wallet.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/6/26. +// + +import Foundation +import Observation + +/// 게임 내 재화 관리 클래스 +@MainActor +@Observable +final class Wallet { + + // MARK: - Properties + /// 현재 보유 골드 + private(set) var gold: Int + /// 현재 보유 다이아몬드 + private(set) var diamond: Int + + // MARK: - Initialization + /// 지갑 초기화 + init(gold: Int = 0, diamond: Int = 0) { + self.gold = gold + self.diamond = diamond + } + + /// 비용 지불 가능 여부 확인 + func canAfford(_ cost: Cost) -> Bool { + return gold >= cost.gold && diamond >= cost.diamond + } + + /// 골드 획득 + func addGold(_ amount: Int) { + guard amount > 0 else { return } + gold += amount + } + + /// 골드 소모 + /// - Returns: 성공 여부 + @discardableResult + func spendGold(_ amount: Int) -> Bool { + guard amount > 0 else { return false } + guard gold >= amount else { return false } + gold -= amount + return true + } + + /// 다이아몬드 획득 + func addDiamond(_ amount: Int) { + guard amount > 0 else { return } + diamond += amount + } + + /// 다이아몬드 소모 + /// - Returns: 성공 여부 + @discardableResult + func spendDiamond(_ amount: Int) -> Bool { + guard amount > 0 else { return false } + guard diamond >= amount else { return false } + diamond -= amount + return true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/CareerDTO.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/CareerDTO.swift new file mode 100644 index 00000000..7aa87e67 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/CareerDTO.swift @@ -0,0 +1,20 @@ +// +// CareerDTO.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-26. +// + +import Foundation + +struct CareerDTO: Codable { + let rawValue: String + + init(from career: Career) { + self.rawValue = career.rawValue + } + + func toCareer() -> Career { + Career(rawValue: rawValue) ?? .unemployed + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/InventoryDTO.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/InventoryDTO.swift new file mode 100644 index 00000000..de79be08 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/InventoryDTO.swift @@ -0,0 +1,134 @@ +// +// InventoryDTO.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-26. +// + +import Foundation + +struct InventoryDTO: Codable { + let equipmentItems: [EquipmentDTO] + let consumableItems: [ConsumableDTO] + let housing: HousingDTO + + init(from inventory: Inventory) { + self.equipmentItems = inventory.equipmentItems.map { EquipmentDTO(from: $0) } + self.consumableItems = inventory.consumableItems.map { ConsumableDTO(from: $0) } + self.housing = HousingDTO(from: inventory.housing) + } + + func toInventory() -> Inventory { + Inventory( + equipmentItems: equipmentItems.map { $0.toEquipment() }, + consumableItems: consumableItems.map { $0.toConsumable() }, + housing: housing.toHousing() + ) + } +} + +struct EquipmentDTO: Codable { + let type: EquipmentTypeDTO + let tier: EquipmentTierDTO + + init(from equipment: Equipment) { + self.type = EquipmentTypeDTO(from: equipment.type) + self.tier = EquipmentTierDTO(from: equipment.tier) + } + + func toEquipment() -> Equipment { + Equipment(type: type.toEquipmentType(), tier: tier.toEquipmentTier()) + } +} + +struct EquipmentTypeDTO: Codable { + let rawValue: String + + init(from type: EquipmentType) { + switch type { + case .keyboard: self.rawValue = "keyboard" + case .mouse: self.rawValue = "mouse" + case .monitor: self.rawValue = "monitor" + case .chair: self.rawValue = "chair" + } + } + + func toEquipmentType() -> EquipmentType { + switch rawValue { + case "keyboard": return .keyboard + case "mouse": return .mouse + case "monitor": return .monitor + case "chair": return .chair + default: return .keyboard + } + } +} + +struct EquipmentTierDTO: Codable { + let rawValue: Int + + init(from tier: EquipmentTier) { + self.rawValue = tier.rawValue + } + + func toEquipmentTier() -> EquipmentTier { + EquipmentTier(rawValue: rawValue) ?? .broken + } +} + +struct ConsumableDTO: Codable { + let type: ConsumableTypeDTO + let count: Int + + init(from consumable: Consumable) { + self.type = ConsumableTypeDTO(from: consumable.type) + self.count = consumable.count + } + + func toConsumable() -> Consumable { + Consumable(type: type.toConsumableType(), count: count) + } +} + +struct ConsumableTypeDTO: Codable { + let rawValue: String + + init(from type: ConsumableType) { + switch type { + case .coffee: self.rawValue = "coffee" + case .energyDrink: self.rawValue = "energyDrink" + } + } + + func toConsumableType() -> ConsumableType { + switch rawValue { + case "coffee": return .coffee + case "energyDrink": return .energyDrink + default: return .coffee + } + } +} + +struct HousingDTO: Codable { + let tier: HousingTierDTO + + init(from housing: Housing) { + self.tier = HousingTierDTO(from: housing.tier) + } + + func toHousing() -> Housing { + Housing(tier: tier.toHousingTier()) + } +} + +struct HousingTierDTO: Codable { + let rawValue: Int + + init(from tier: HousingTier) { + self.rawValue = tier.rawValue + } + + func toHousingTier() -> HousingTier { + HousingTier(rawValue: rawValue) ?? .street + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/RecordDTO.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/RecordDTO.swift new file mode 100644 index 00000000..3f19970c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/RecordDTO.swift @@ -0,0 +1,151 @@ +// +// RecordDTO.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-26. +// + +import Foundation + +struct RecordDTO: Codable { + // Financial Records + let totalEarnedMoney: Int + let totalSpentMoney: Int + let totalSkillUpgradeCost: Int + let totalEquipmentEnhancementCost: Int + let totalConsumablePurchaseCost: Int + let totalHousingMoveCost: Int + + // Tap Records + let totalTapCount: Int + + // Language Game Records + let languageCorrectCount: Int + let languageConsecutiveCorrect: Int + + // Bug Dodging Records + let dodgeGoldCollectedCount: Int + let dodgeMaxCombo: Int + let dodgeBugAvoidedCount: Int + let dodgeBugCollectCount: Int + + // Stacking Game Records + let stackingSuccessCount: Int + let stackConsecutiveSuccess: Int + + // Consumable Usage Records + let coffeeUseCount: Int + let energyDrinkUseCount: Int + + // Play Time Records + let totalPlayTime: TimeInterval + + // Tutorial Records + let tutorialCompleted: Bool + + // Career Records + let hasAchievedJuniorDeveloper: Bool + + // Mission States + let missionStates: [MissionStateDTO] + + init(from record: Record) { + self.totalEarnedMoney = record.totalEarnedMoney + self.totalSpentMoney = record.totalSpentMoney + self.totalSkillUpgradeCost = record.totalSkillUpgradeCost + self.totalEquipmentEnhancementCost = record.totalEquipmentEnhancementCost + self.totalConsumablePurchaseCost = record.totalConsumablePurchaseCost + self.totalHousingMoveCost = record.totalHousingMoveCost + self.totalTapCount = record.totalTapCount + self.languageCorrectCount = record.languageCorrectCount + self.languageConsecutiveCorrect = record.languageConsecutiveCorrect + self.dodgeGoldCollectedCount = record.dodgeGoldCollectedCount + self.dodgeMaxCombo = record.dodgeMaxCombo + self.dodgeBugAvoidedCount = record.dodgeBugAvoidedCount + self.dodgeBugCollectCount = record.dodgeBugCollectCount + self.stackingSuccessCount = record.stackingSuccessCount + self.stackConsecutiveSuccess = record.stackConsecutiveSuccess + self.coffeeUseCount = record.coffeeUseCount + self.energyDrinkUseCount = record.energyDrinkUseCount + self.totalPlayTime = record.totalPlayTime + self.tutorialCompleted = record.tutorialCompleted + self.hasAchievedJuniorDeveloper = record.hasAchievedJuniorDeveloper + self.missionStates = record.missionSystem.missions.map { MissionStateDTO(from: $0) } + } + + func toRecord() -> Record { + let record = Record(missionSystem: MissionSystem(missions: MissionFactory.createAllMissions())) + + // Financial Records + record.totalEarnedMoney = totalEarnedMoney + record.totalSpentMoney = totalSpentMoney + record.totalSkillUpgradeCost = totalSkillUpgradeCost + record.totalEquipmentEnhancementCost = totalEquipmentEnhancementCost + record.totalConsumablePurchaseCost = totalConsumablePurchaseCost + record.totalHousingMoveCost = totalHousingMoveCost + + // Tap Records + record.totalTapCount = totalTapCount + + // Language Game Records + record.languageCorrectCount = languageCorrectCount + record.languageConsecutiveCorrect = languageConsecutiveCorrect + + // Bug Dodging Records + record.dodgeGoldCollectedCount = dodgeGoldCollectedCount + record.dodgeMaxCombo = dodgeMaxCombo + record.dodgeBugAvoidedCount = dodgeBugAvoidedCount + record.dodgeBugCollectCount = dodgeBugCollectCount + + // Stacking Game Records + record.stackingSuccessCount = stackingSuccessCount + record.stackConsecutiveSuccess = stackConsecutiveSuccess + + // Consumable Usage Records + record.coffeeUseCount = coffeeUseCount + record.energyDrinkUseCount = energyDrinkUseCount + + // Play Time Records + record.totalPlayTime = totalPlayTime + + // Tutorial Records + record.tutorialCompleted = tutorialCompleted + + // Career Records + record.hasAchievedJuniorDeveloper = hasAchievedJuniorDeveloper + + // Mission States 복원 + for missionState in missionStates { + if let mission = record.missionSystem.missions.first(where: { $0.id == missionState.id }) { + mission.currentValue = missionState.currentValue + mission.state = missionState.state.toMissionState() + } + } + + return record + } +} + +struct MissionStateDTO: Codable { + let id: Int + let currentValue: Int + let state: MissionStateRawDTO + + init(from mission: Mission) { + self.id = mission.id + self.currentValue = mission.currentValue + self.state = MissionStateRawDTO(from: mission.state) + } +} + +struct MissionStateRawDTO: Codable { + let rawValue: Int + + init(from state: Mission.State) { + self.rawValue = state.rawValue + } + + func toMissionState() -> Mission.State { + Mission.State(rawValue: rawValue) ?? .inProgress + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/SkillDTO.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/SkillDTO.swift new file mode 100644 index 00000000..93b50442 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/SkillDTO.swift @@ -0,0 +1,48 @@ +// +// SkillDTO.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-26. +// + +import Foundation + +struct SkillDTO: Codable { + let game: GameTypeDTO + let tier: SkillTierDTO + let level: Int + + init(from skill: Skill) { + self.game = GameTypeDTO(from: skill.key.game) + self.tier = SkillTierDTO(from: skill.key.tier) + self.level = skill.level + } + + func toSkill() -> Skill { + Skill(key: SkillKey(game: game.toGameType(), tier: tier.toSkillTier()), level: level) + } +} + +struct GameTypeDTO: Codable { + let rawValue: Int + + init(from type: GameType) { + self.rawValue = type.rawValue + } + + func toGameType() -> GameType { + GameType(rawValue: rawValue) ?? .tap + } +} + +struct SkillTierDTO: Codable { + let rawValue: Int + + init(from tier: SkillTier) { + self.rawValue = tier.rawValue + } + + func toSkillTier() -> SkillTier { + SkillTier(rawValue: rawValue) ?? .beginner + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/UserDTO.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/UserDTO.swift new file mode 100644 index 00000000..76b900ce --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/UserDTO.swift @@ -0,0 +1,18 @@ +// +// UserDTO.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-26. +// + +import Foundation + +struct UserDTO: Codable { + let id: UUID + let nickname: String + let career: CareerDTO + let wallet: WalletDTO + let inventory: InventoryDTO + let record: RecordDTO + let skills: [SkillDTO] +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/WalletDTO.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/WalletDTO.swift new file mode 100644 index 00000000..2d628c24 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/DTOs/WalletDTO.swift @@ -0,0 +1,22 @@ +// +// WalletDTO.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-26. +// + +import Foundation + +struct WalletDTO: Codable { + let gold: Int + let diamond: Int + + init(from wallet: Wallet) { + self.gold = wallet.gold + self.diamond = wallet.diamond + } + + func toWallet() -> Wallet { + Wallet(gold: gold, diamond: diamond) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/Repository/UserRepository.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/Repository/UserRepository.swift new file mode 100644 index 00000000..766671be --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Data/Repository/UserRepository.swift @@ -0,0 +1,67 @@ +// +// UserRepository.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 1/26/26. +// + +import Foundation + +protocol UserRepository { + func save(_ user: User) async throws + func load() async throws -> User? +} + +final class FileManagerUserRepository: UserRepository { + private let fileManager = FileManager() + private let fileName = "user_data.json" + + private var fileURL: URL { + let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] + return documentsDirectory.appendingPathComponent(fileName) + } + + func save(_ user: User) async throws { + let id = user.id + let nickname = user.nickname + let career = user.career + let wallet = user.wallet + let inventory = user.inventory + let record = user.record + let skills = Array(user.skills) + + let userDTO = UserDTO( + id: id, + nickname: nickname, + career: CareerDTO(from: career), + wallet: WalletDTO(from: wallet), + inventory: InventoryDTO(from: inventory), + record: RecordDTO(from: record), + skills: skills.map { SkillDTO(from: $0) } + ) + + let url = fileURL + let data = try JSONEncoder().encode(userDTO) + + Task.detached { + try data.write(to: url, options: [.atomic]) + } + } + + func load() async throws -> User? { + guard fileManager.fileExists(atPath: fileURL.path) else { return nil } + + let data = try Data(contentsOf: fileURL) + let userDTO = try JSONDecoder().decode(UserDTO.self, from: data) + + return User( + id: userDTO.id, + nickname: userDTO.nickname, + career: userDTO.career.toCareer(), + wallet: userDTO.wallet.toWallet(), + inventory: userDTO.inventory.toInventory(), + record: userDTO.record.toRecord(), + skills: Set(userDTO.skills.map { $0.toSkill() }) + ) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Error/PurchasingError+UserReadableError.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Error/PurchasingError+UserReadableError.swift new file mode 100644 index 00000000..005ec355 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Error/PurchasingError+UserReadableError.swift @@ -0,0 +1,17 @@ +// +// PurchasingError+UserReadableError.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/20/26. +// + +extension PurchasingError: UserReadableError { + var message: String { + switch self { + case .insufficientGold: "골드가 부족합니다." + case .insufficientDiamond: "다이아가 부족합니다." + case .locked: "해당 항목은 잠겨있습니다." + case .purchaseFailed: "구매에 실패했습니다." + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Error/SkillError+UserReadableError.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Error/SkillError+UserReadableError.swift new file mode 100644 index 00000000..52cf8107 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Error/SkillError+UserReadableError.swift @@ -0,0 +1,14 @@ +// +// SkillError+UserReadableError.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/20/26. +// + +extension SkillError: UserReadableError { + var message: String { + switch self { + case .levelExceeded: "이미 최대 레벨입니다." + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Error/UserReadableError.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Error/UserReadableError.swift new file mode 100644 index 00000000..29549f73 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Error/UserReadableError.swift @@ -0,0 +1,10 @@ +// +// UserReadableError.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/20/26. +// + +protocol UserReadableError { + var message: String { get } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/HapticService.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/HapticService.swift new file mode 100644 index 00000000..a2cda69c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/HapticService.swift @@ -0,0 +1,44 @@ +// +// HapticService.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/22/26. +// + +import SwiftUI + +private enum Constant { + static let hapticEnabledKey: String = "isHapticEnabled" +} + +@Observable +final class HapticService { + static let shared = HapticService() + private let localStorage: KeyValueLocalStorage = UserDefaultsStorage() + + var isEnabled: Bool { + didSet { + localStorage.set(isEnabled, forKey: Constant.hapticEnabledKey) + } + } + + private init() { + // 저장된 키가 없을 경우 기본값 등록 + localStorage.register(defaults: [Constant.hapticEnabledKey: true]) + + self.isEnabled = localStorage.bool(key: Constant.hapticEnabledKey) + } + + func toggle() { + isEnabled.toggle() + // 활성화 되었음을 알리기 위해 햅틱 트리거 + if isEnabled { + HapticType.medium.trigger() + } + } + + func trigger(_ type: HapticType) { + guard isEnabled else { return } + type.trigger() + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/HapticType.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/HapticType.swift new file mode 100644 index 00000000..2f751ebf --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/HapticType.swift @@ -0,0 +1,60 @@ +// +// HapticType.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/22/26. +// + +import UIKit + +enum HapticType { + // Impact + /// 가볍고 작게 1번 + case light + /// 중간 1번 + case medium + /// 둔탁하게 1번 + case heavy + // Notification + /// 빠르게 2번, 점점 세기 강해짐 + case success + /// 빠르게 4번 + case warning + /// 빠르게 2번, 점점 세기 약해짐 + case error + + // 모든 타입을 실제 피드백 발생으로 매핑 + func trigger() { + switch self { + // MARK: - Impact + case .light, .medium, .heavy: + let generator = UIImpactFeedbackGenerator(style: style) + generator.prepare() + generator.impactOccurred() + + // MARK: - Notification + case .success: + let generator = UINotificationFeedbackGenerator() + generator.prepare() + generator.notificationOccurred(.success) + case .warning: + let generator = UINotificationFeedbackGenerator() + generator.prepare() + generator.notificationOccurred(.warning) + case .error: + let generator = UINotificationFeedbackGenerator() + generator.prepare() + generator.notificationOccurred(.error) + } + } + + /// Impact 스타일 매핑 + private var style: UIImpactFeedbackGenerator.FeedbackStyle { + switch self { + case .light: return .light + case .medium: return .medium + case .heavy: return .heavy + default: return .medium + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/SoundService.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/SoundService.swift new file mode 100644 index 00000000..2c5f3268 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/SoundService.swift @@ -0,0 +1,144 @@ +// +// HapticService.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/22/26. +// + +import SwiftUI +import AVFoundation + +private enum Constant { + static let sfxEnabledKey: String = "isSFXEnabled" + static let bgmEnabledKey: String = "isBGMEnabled" + static let bgmVolumeKey: String = "bgmVolume" + static let sfxVolumeKey: String = "sfxVolume" + static let volumeRange: ClosedRange = 0 ... 100 + static let defaultVolume: Int = 100 + /// 효과음 동시 재생 상한 (중첩 허용) + static let maxConcurrentSFX: Int = 10 +} + +@Observable +final class SoundService { + static let shared = SoundService() + + private var sfxPlayers: [AVAudioPlayer] = [] + private var bgmPlayer: AVAudioPlayer? + private let sfxDelegate = SoundPlayerDelegate() + private let localStorage: KeyValueLocalStorage = UserDefaultsStorage() + + var isSFXEnabled: Bool { + didSet { + localStorage.set(isSFXEnabled, forKey: Constant.sfxEnabledKey) + } + } + + var isBGMEnabled: Bool { + didSet { + localStorage.set(isBGMEnabled, forKey: Constant.bgmEnabledKey) + if isBGMEnabled { + playBGM() + } else { + stopBGM() + } + } + } + + var bgmVolume: Int { + didSet { + localStorage.set(bgmVolume, forKey: Constant.bgmVolumeKey) + bgmPlayer?.volume = Float(bgmVolume) / 100 + } + } + + var sfxVolume: Int { + didSet { + localStorage.set(sfxVolume, forKey: Constant.sfxVolumeKey) + } + } + + private init() { + localStorage.register(defaults: [ + Constant.sfxEnabledKey: true, + Constant.bgmEnabledKey: true, + Constant.bgmVolumeKey: Constant.defaultVolume, + Constant.sfxVolumeKey: Constant.defaultVolume + ]) + + self.isSFXEnabled = localStorage.bool(key: Constant.sfxEnabledKey) + self.isBGMEnabled = localStorage.bool(key: Constant.bgmEnabledKey) + let storedBgm = localStorage.integer(key: Constant.bgmVolumeKey) + let storedSfx = localStorage.integer(key: Constant.sfxVolumeKey) + self.bgmVolume = Constant.volumeRange.contains(storedBgm) ? storedBgm : Constant.defaultVolume + self.sfxVolume = Constant.volumeRange.contains(storedSfx) ? storedSfx : Constant.defaultVolume + + try? AVAudioSession.sharedInstance().setCategory( + .playback, // 무음모드 무시 + options: [.mixWithOthers] + ) + sfxDelegate.onFinish = { [weak self] player in + self?.removeFinishedSFXPlayer(player) + } + } + + func removeFinishedSFXPlayer(_ player: AVAudioPlayer) { + sfxPlayers.removeAll { $0 === player } + } + + func trigger(_ sound: SoundType) { + guard isSFXEnabled else { return } + guard let url = sound.url else { return } + if sfxPlayers.count >= Constant.maxConcurrentSFX { return } + do { + let player = try AVAudioPlayer(contentsOf: url) + player.volume = Float(sfxVolume) / 100 + player.delegate = sfxDelegate + player.prepareToPlay() + player.play() + sfxPlayers.append(player) + } catch { + print("소리를 재생할 수 없음", error) + } + } + + /// 재생 중인 효과음 전부 정지 (게임 일시정지·뷰 이탈 시 등) + func stopAllSFX() { + sfxPlayers.forEach { $0.stop() } + sfxPlayers.removeAll() + } + + // MARK: - BGM + + func playBGM() { + guard isBGMEnabled else { return } + guard let url = SoundType.bgm.url else { return } + stopBGM() + do { + let player = try AVAudioPlayer(contentsOf: url) + player.numberOfLoops = -1 + player.volume = Float(bgmVolume) / 100 + player.prepareToPlay() + player.play() + bgmPlayer = player + } catch { + print("BGM 재생 실패", error) + } + } + + func stopBGM() { + bgmPlayer?.stop() + bgmPlayer = nil + } +} + +// MARK: - SFX 재생 완료 처리 (중첩 재생용) +private final class SoundPlayerDelegate: NSObject, AVAudioPlayerDelegate { + var onFinish: ((AVAudioPlayer) -> Void)? + + func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { + DispatchQueue.main.async { [weak self] in + self?.onFinish?(player) + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/SoundType.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/SoundType.swift new file mode 100644 index 00000000..607e022d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/FeedbackSystem/SoundType.swift @@ -0,0 +1,68 @@ +// +// SoundType.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/22/26. +// + +import Foundation + +enum SoundType: String { + /// 전체 버튼 클릭음 + case buttonTap + + // MARK: - BGM + case bgm + + // MARK: - 언어 맞추기 + /// 맞았을 때 + case languageCorrect + /// 틀렸을 때 + case languageWrong + + // MARK: - 버그 피하기 + /// 코인 먹는 소리 + case coinCollect + /// 버그 맞는 소리 + case bugHit + + // MARK: - 데이터 쌓기 + /// 블록 쌓기 + case blockStack + /// 블록 떨굼 + case blockDrop + /// 폭탄 쌓기 + case bombStack + + // MARK: - 퀴즈 + /// 끝나기 3초 전 째깍 + case quizCountdown + /// 퀴즈 시간 초과 + case quizTimeOver + /// 퀴즈 정답 + case quizCorrect + /// 퀴즈 오답 + case quizWrong + + // MARK: - 아이템 소비 + /// 커피/박하스 클릭 시 + case itemConsume + + // MARK: - 장비 강화 + /// 강화 성공 (팝업 뜰 때) + case upgradeSuccess + /// 강화 실패 (팝업 뜰 때) + case upgradeFailure + + // MARK: - 미션 + /// 미션 획득 시 + case missionAcquired + + /// 탭게임 탭 시 + case tapGameTyping + + /// wav 우선, 없으면 mp3 로드 + var url: URL? { + Bundle.main.url(forResource: rawValue, withExtension: "wav") + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/CareerPopupView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/CareerPopupView.swift new file mode 100644 index 00000000..0463dca5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/CareerPopupView.swift @@ -0,0 +1,52 @@ +// +// CareerPopupView.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/22/26. +// + +import SwiftUI + +private enum Constant { + static let contentHorizontalPadding: CGFloat = 16 + static let progressBarTopPadding: CGFloat = 18 + static let progressBarBottomPadding: CGFloat = 18 + static let careerRowSpacing: CGFloat = 10 + static let scrollViewBottomPadding: CGFloat = 45 +} + +struct CareerPopupView: View { + let careerSystem: CareerSystem + let user: User + let onClose: () -> Void + + var body: some View { + VStack(alignment: .center, spacing: 0) { + CareerProgressBar( + career: careerSystem.currentCareer, + totalEarnedMoney: user.record.totalEarnedMoney, + progress: careerSystem.careerProgress + ) + .padding(.bottom, Constant.progressBarBottomPadding) + .padding(.top, Constant.progressBarTopPadding) + + ScrollView { + VStack(spacing: Constant.careerRowSpacing) { + ForEach(Career.allCases, id: \.self) { career in + CareerRow( + career: career, + userCareer: careerSystem.currentCareer + ) + } + } + } + .scrollIndicators(.never) + .padding(.bottom, Constant.scrollViewBottomPadding) + + MediumButton(title: "닫기", isFilled: true) { + onClose() + } + } + .padding(.horizontal, Constant.contentHorizontalPadding) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/CharacterScene.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/CharacterScene.swift new file mode 100644 index 00000000..b85b8eff --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/CharacterScene.swift @@ -0,0 +1,117 @@ +// +// CharacterScene.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/20/26. +// + +import SpriteKit +import SwiftUI + +private enum Constant { + static let characterSize = CGSize(width: 100, height: 100) + static let blinkDuration: TimeInterval = 0.1 + static let blinkInterval: TimeInterval = 3.5 + static let smileDuration: TimeInterval = 0.5 +} + +final class CharacterScene: SKScene { + + // MARK: - Properties + private var characterSprite: SKSpriteNode? + private var user: User + + init(size: CGSize, user: User) { + self.user = user + super.init(size: size) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Computed Properties (텍스처) + private var idleTexture: SKTexture { + SKTexture(imageNamed: "\(user.career.characterImagePrefix)_default") + } + + private var blinkTexture: SKTexture { + SKTexture(imageNamed: "\(user.career.characterImagePrefix)_close") + } + + private var smileTexture: SKTexture { + SKTexture(imageNamed: "\(user.career.characterImagePrefix)_smile") + } + + private enum AnimationKey { + static let blink = "blink" + static let smile = "smile" + } + + override func didMove(to view: SKView) { + backgroundColor = .clear + let sprite = SKSpriteNode(texture: idleTexture) + sprite.position = CGPoint(x: size.width / 2, y: size.height / 2) + sprite.size = Constant.characterSize + addChild(sprite) + characterSprite = sprite + startBlinking() + } + + /// 캐릭터를 웃게 만들기 + func playSmile() { + guard let sprite = characterSprite else { return } + // 깜빡임 애니메이션 일시 중지 + sprite.removeAction(forKey: AnimationKey.blink) + // 웃는 애니메이션 + let smile = SKAction.sequence([ + SKAction.setTexture(smileTexture), + SKAction.wait(forDuration: Constant.smileDuration), + SKAction.setTexture(idleTexture), + SKAction.run { [weak self] in + // 웃음 애니메이션 끝나면 다시 깜빡임 시작 + self?.startBlinking() + } + ]) + sprite.run(smile, withKey: AnimationKey.smile) + } + + /// 기본 상태로 돌아가기 + func playIdle() { + guard let sprite = characterSprite else { return } + sprite.removeAction(forKey: AnimationKey.smile) + sprite.texture = idleTexture + startBlinking() + } + + /// 커리어 변경 시 캐릭터 이미지 업데이트 + func updateCareerAppearance(to newCareer: Career) { + guard let sprite = characterSprite else { return } + + // 새로운 텍스처로 업데이트 + let newIdleTexture = SKTexture(imageNamed: "\(newCareer.characterImagePrefix)_default") + sprite.texture = newIdleTexture + + // 애니메이션 재시작 + sprite.removeAllActions() + startBlinking() + } + + // MARK: - Private Methods + private func startBlinking() { + guard let sprite = characterSprite else { return } + // 이미 깜빡이는 중이면 무시 + if sprite.action(forKey: AnimationKey.blink) != nil { return } + let blink = SKAction.sequence([ + // 대기 + SKAction.wait(forDuration: Constant.blinkInterval), + // 눈 감기 + SKAction.setTexture(blinkTexture), + SKAction.wait(forDuration: Constant.blinkDuration), + // 눈 뜨기 + SKAction.setTexture(idleTexture), + SKAction.wait(forDuration: Constant.blinkDuration) + ]) + sprite.run(.repeatForever(blink), withKey: AnimationKey.blink) + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/DodgeGameView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/DodgeGameView.swift new file mode 100644 index 00000000..cc569db6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/DodgeGameView.swift @@ -0,0 +1,270 @@ +// +// DodgeGameView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-15. +// + +import SwiftUI + +private enum Constant { + enum Size { + static let ground: CGFloat = 60 + static let character: CGSize = CGSize(width: 40, height: 40) + } + + enum Position { + /// 캐릭터의 Y 위치 비율 (화면 하단 기준) + static let characterYRatio: CGFloat = 0.25 + /// 이펙트가 캐릭터 위로 올라가는 오프셋 + static let effectOffset: CGFloat = 30 + } + + enum Threshold { + /// 캐릭터 방향 전환을 위한 최소 이동 거리 + static let directionChange: CGFloat = 0.1 + } + + enum Padding { + static let horizontal: CGFloat = 16 + static let toolBarBottom: CGFloat = 10 + } +} + +struct DodgeGameView: View { + @State private var game: DodgeGame + @State private var gameAreaWidth: CGFloat = 0 + @State private var gameAreaHeight: CGFloat = 0 + @State private var isFacingLeft: Bool = false + @State private var goldEffects: [EffectLabelData] = [] + // 일시정지 상태 추가 + @State private var isGamePaused: Bool = false + + @Binding var isGameStarted: Bool + @Binding var isGameViewDisappeared: Bool + + init( + user: User, + isGameStarted: Binding, + isGameViewDisappeared: Binding, + animationSystem: CharacterAnimationSystem? = nil + ) { + self._isGameStarted = isGameStarted + self._isGameViewDisappeared = isGameViewDisappeared + self.game = DodgeGame( + user: user, + gameAreaSize: CGSize.zero, + onGoldChanged: { _ in }, + animationSystem: animationSystem + ) + } + + var body: some View { + GeometryReader { geometry in + VStack(spacing: 0) { + // 상단 툴바 (닫기, 아이템 버튼, 피버 게이지) + toolbarSection + // 게임 영역 (바닥, 플레이어, 낙하물, 골드 이펙트) + gameAreaSection + } + .onAppear { + setupGame(with: geometry.size) + } + .onDisappear { + game.stopGame() + } + .pauseGameStyle( + isGameViewDisappeared: $isGameViewDisappeared, + height: geometry.size.height, + onLeave: { handleCloseButton() }, + onPause: { + isGamePaused = true + game.pauseGame() + }, + onResume: { + isGamePaused = false + game.resumeGame() + } + ) + } + } +} + +// MARK: - View Components +private extension DodgeGameView { + /// 상단 툴바 + var toolbarSection: some View { + GameToolBar( + closeButtonDidTapHandler: handleCloseButton, + coffeeButtonDidTapHandler: { useConsumableItem(.coffee) }, + energyDrinkButtonDidTapHandler: { useConsumableItem(.energyDrink) }, + feverState: game.feverSystem, + buffSystem: game.buffSystem, + coffeeCount: .constant(game.user.inventory.count(.coffee) ?? 0), + energyDrinkCount: .constant(game.user.inventory.count(.energyDrink) ?? 0) + ) + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.bottom, Constant.Padding.toolBarBottom) + } + + /// 게임 영역 + var gameAreaSection: some View { + ZStack(alignment: .bottom) { + // 바닥 + groundView + // 플레이어 + playerView + // 낙하물 + fallingItemsView + // 골드 변화 이펙트 + goldEffectsView + } + } + + /// 바닥 + var groundView: some View { + Image(.dodgeGround) + .resizable() + .frame(height: Constant.Size.ground) + } + + /// 플레이어 + var playerView: some View { + RunningCharacter(isFacingLeft: isFacingLeft, isGamePaused: isGamePaused) + .frame( + width: Constant.Size.character.width, + height: Constant.Size.character.height + ) + .position( + x: gameAreaWidth / 2 + (isGamePaused ? 0 : game.motionSystem.characterX), + y: gameAreaHeight * (1 - Constant.Position.characterYRatio) + ) + .onChange(of: game.motionSystem.characterX) { oldPositionX, newPositionX in + updateCharacterDirection(oldPositionX: oldPositionX, newPositionX: newPositionX) + } + } + + /// 낙하물 + var fallingItemsView: some View { + ForEach(game.gameCore.fallingItems) { item in + DropItem(type: item.type) + .position( + x: gameAreaWidth / 2 + item.position.x, + y: gameAreaHeight / 2 + item.position.y + ) + } + } + + /// 골드 변화 이펙트 + var goldEffectsView: some View { + ForEach(goldEffects) { effect in + EffectLabel( + value: effect.value, + onComplete: { removeEffectLabel(id: effect.id) } + ) + .position(effect.position) + } + } +} + +// MARK: - Actions +private extension DodgeGameView { + /// 닫기 버튼 클릭 처리 + func handleCloseButton() { + game.stopGame() + isGameStarted = false + } + + /// 소비 아이템 사용 처리 + func useConsumableItem(_ type: ConsumableType) { + if game.user.inventory.drink(type) { + SoundService.shared.trigger(.itemConsume) + HapticService.shared.trigger(.success) + game.buffSystem.useConsumableItem(type: type) + game.user.record.record(type == .coffee ? .coffeeUse : .energyDrinkUse) + } + } +} + +// MARK: - Helper Methods +private extension DodgeGameView { + /// 게임 초기 설정 + func setupGame(with size: CGSize) { + gameAreaWidth = size.width + gameAreaHeight = size.height + + game.setGoldChangedHandler(showGoldChangeEffect) + + game.configure(gameAreaSize: CGSize(width: size.width, height: size.height)) + game.startGame() + } + + /// 골드 변화 이펙트 표시 + func showGoldChangeEffect(_ goldDelta: Int) { + let effect = EffectLabelData( + id: UUID(), + position: CGPoint( + x: gameAreaWidth / 2 + game.motionSystem.characterX, + y: gameAreaHeight * (1 - Constant.Position.characterYRatio) - Constant.Position.effectOffset + ), + value: goldDelta + ) + + goldEffects.append(effect) + } + + /// 효과 라벨 제거 (애니메이션 완료 시 콜백으로 호출) + /// - Parameter id: 제거할 효과 라벨의 ID + func removeEffectLabel(id: UUID) { + goldEffects.removeAll { $0.id == id } + } + + /// 캐릭터의 진행 방향을 업데이트 합니다. + func updateCharacterDirection(oldPositionX: CGFloat, newPositionX: CGFloat) { + guard !isGamePaused else { return } + if abs(newPositionX - oldPositionX) > Constant.Threshold.directionChange { + isFacingLeft = newPositionX < oldPositionX + } + } +} + +#Preview { + @Previewable @State var isGameStarted = true + @Previewable @State var isGameViewDisappeared = true + + let wallet = Wallet(gold: 1000, diamond: 0) + let inventory = Inventory( + equipmentItems: [], + consumableItems: [ + .init(type: .coffee, count: 5), + .init(type: .energyDrink, count: 5) + ], + housing: .init(tier: .street) + ) + let record = Record() + let user = User( + nickname: "TestUser", + wallet: wallet, + inventory: inventory, + record: record, + skills: [ + .init(key: SkillKey(game: .dodge, tier: .beginner), level: 1000) + ] + ) + + GeometryReader { geometry in + VStack(spacing: 0) { + Spacer() + .frame(maxHeight: .infinity) + .background(Color.gray.opacity(0.2)) + + DodgeGameView( + user: user, + isGameStarted: $isGameStarted, + isGameViewDisappeared: $isGameViewDisappeared + ) + .ignoresSafeArea() + .frame(height: geometry.size.height / 2 - Constant.Size.ground) + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/FeedbackSettingView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/FeedbackSettingView.swift new file mode 100644 index 00000000..e7890073 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/FeedbackSettingView.swift @@ -0,0 +1,108 @@ +// +// FeedbackSettingView.swift +// SoloDeveloperTraining +// + +import SwiftUI + +private enum Constant { + static let title: String = "설정" + static let rowSpacing: CGFloat = 30 + static let horizontalPadding: CGFloat = 20 + static let volumeRange: ClosedRange = 0 ... 100 + static let volumeStep: Double = 1 +} + +struct FeedbackSettingView: View { + let onClose: (() -> Void)? + + var body: some View { + Popup(title: "") { + Text("설정") + .textStyle(.largeTitle) + VStack(alignment: .leading, spacing: Constant.rowSpacing) { + soundSettingSection( + title: "배경음", + isOn: SoundService.shared.isBGMEnabled, + setOn: { SoundService.shared.isBGMEnabled = $0 }, + volume: bgmVolumeBinding + ) + soundSettingSection( + title: "효과음", + isOn: SoundService.shared.isSFXEnabled, + setOn: { SoundService.shared.isSFXEnabled = $0 }, + volume: sfxVolumeBinding + ) + settingRow( + title: "햅틱", + isOn: HapticService.shared.isEnabled, + setOn: { HapticService.shared.isEnabled = $0 } + ) + closeButton + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, Constant.horizontalPadding) + } + } +} + +private extension FeedbackSettingView { + var bgmVolumeBinding: Binding { + Binding( + get: { Double(SoundService.shared.bgmVolume) }, + set: { SoundService.shared.bgmVolume = min(max(Int($0), 0), 100) } + ) + } + + var sfxVolumeBinding: Binding { + Binding( + get: { Double(SoundService.shared.sfxVolume) }, + set: { SoundService.shared.sfxVolume = min(max(Int($0), 0), 100) } + ) + } + + var closeButton: some View { + HStack { + Spacer() + MediumButton(title: "닫기", isFilled: true) { + onClose?() + } + Spacer() + } + } + + func soundSettingSection( + title: String, + isOn: Bool, + setOn: @escaping (Bool) -> Void, + volume: Binding + ) -> some View { + VStack(alignment: .leading, spacing: 15) { + settingRow(title: title, isOn: isOn, setOn: setOn) + SettingSlider(value: volume, range: Constant.volumeRange, step: Constant.volumeStep, isEnabled: isOn) + } + } + + func settingRow(title: String, isOn: Bool, setOn: @escaping (Bool) -> Void) -> some View { + HStack { + Text(title) + .textStyle(.title2) + Spacer() + MediumButton(title: isOn ? "ON" : "OFF", isFilled: isOn) { + var transaction = Transaction() + transaction.animation = nil + withTransaction(transaction) { + setOn(!isOn) + } + } + .transaction { $0.animation = nil } + } + } +} + +#Preview { + FeedbackSettingView { + + } + .padding(25) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/IntroView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/IntroView.swift new file mode 100644 index 00000000..dd2d53d9 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/IntroView.swift @@ -0,0 +1,88 @@ +// +// IntroView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-21. +// + +import SwiftUI + +private enum Constant { + enum Animation { + static let transitionDuration: Double = 0.5 // 화면 전환 + static let blinkingDuration: Double = 1.0 // 깜빡임 + } + + enum Layout { + static let bottomPadding: CGFloat = 100 + } + + enum Opacity { + static let blinking: Double = 0.3 + static let normal: Double = 1.0 + } + + enum Text { + static let touchPrompt = "화면을 터치해 주세요" + } +} + +struct IntroView: View { + @State private var isBlinking = true + @Binding var hasSeenIntro: Bool + @Binding var showNicknameSetup: Bool + let user: User? + + var body: some View { + ZStack { + backgroundImage + touchPromptView + } + .onTapGesture { + if user == nil { + showNicknameSetup = true + } else { + withAnimation(.easeOut(duration: Constant.Animation.transitionDuration)) { + hasSeenIntro = true + } + } + } + .ignoresSafeArea() + .onAppear { + isBlinking = false + } + } +} + +private extension IntroView { + var backgroundImage: some View { + GeometryReader { geometry in + Image(.appLaunchScreen) + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: geometry.size.width, height: geometry.size.height) + .clipped() + } + } + + var touchPromptView: some View { + VStack { + Spacer() + + Text(Constant.Text.touchPrompt) + .textStyle(.title2) + .foregroundColor(.white) + .opacity(isBlinking ? Constant.Opacity.blinking : Constant.Opacity.normal) + .animation(.easeInOut(duration: Constant.Animation.blinkingDuration).repeatForever(autoreverses: true), value: isBlinking) + .padding(.bottom, Constant.Layout.bottomPadding) + } + } +} + +#Preview { + IntroView( + hasSeenIntro: .constant(false), + showNicknameSetup: .constant(false), + user: nil + ) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/NicknameSetupView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/NicknameSetupView.swift new file mode 100644 index 00000000..8b4941e4 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/NicknameSetupView.swift @@ -0,0 +1,149 @@ +// +// NicknameSetupView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-21. +// + +import SwiftUI + +private enum Constant { + enum Spacing { + static let content: CGFloat = 10 + static let textGroup: CGFloat = 4 + static let button: CGFloat = 15 + } + + enum Size { + static let textFieldHeight: CGFloat = 40 + static let cornerRadius: CGFloat = 10 + static let strokeLineWidth: CGFloat = 1 + static let errorTextMinHeight: CGFloat = 15 + } + + enum Padding { + static let textFieldHorizontalPadding: CGFloat = 17 + static let textFieldBottomPadding: CGFloat = 9 + static let contentPadding: CGFloat = 20 + } + + enum Opacity { + static let background: Double = 0.3 + static let stroke: Double = 0.3 + } + + enum Text { + static let popupTitle = "닉네임 설정" + static let story = "당신은 취직에 실패한 개발자.\n... 이대로 물러설 수는 없다.\n나의 꿈은 1인 개발자로 성공하기 ~!\n\n내 이름은!!" + static let nicknamePlaceholder = "닉네임" + static let startButton = "바로 시작" + static let tutorialButton = "튜토리얼" + } +} + +struct NicknameSetupView: View { + @State private var nickname: String = "" + @State private var errorMessage: String = "" + private let validator = Validator() + let onStart: (String) -> Void + let onTutorial: (String) -> Void + + var body: some View { + Popup(title: Constant.Text.popupTitle) { + VStack(alignment: .leading, spacing: Constant.Spacing.content) { + storyTexts + nicknameTextField + errorText + buttons + } + .padding(Constant.Padding.contentPadding) + } + } +} + +private extension NicknameSetupView { + var storyTexts: some View { + Text(Constant.Text.story) + .textStyle(.body) + .foregroundColor(.black) + } + + var nicknameTextField: some View { + TextField(Constant.Text.nicknamePlaceholder, text: $nickname) + .font(.pfFont(.body)) + .padding(.horizontal, Constant.Padding.textFieldHorizontalPadding) + .frame(height: Constant.Size.textFieldHeight) + .background(AppColors.gray100.opacity(Constant.Opacity.background)) + .cornerRadius(Constant.Size.cornerRadius) + .foregroundColor(.black) + .overlay { + RoundedRectangle(cornerRadius: Constant.Size.cornerRadius) + .stroke( + errorMessage.isEmpty + ? Color.gray.opacity(Constant.Opacity.stroke) + : Color.red.opacity(0.7), + lineWidth: Constant.Size.strokeLineWidth + ) + } + .padding(.bottom, Constant.Padding.textFieldBottomPadding) + .onChange(of: nickname) { _, newValue in + updateValidationState(for: newValue) + } + } + + var errorText: some View { + Text(errorMessage) + .font(.pfFont(.caption)) + .foregroundColor(.red) + .frame(minHeight: Constant.Size.errorTextMinHeight, alignment: .leading) + } + + var buttons: some View { + HStack(spacing: Constant.Spacing.button) { + MediumButton( + title: Constant.Text.startButton, + isFilled: !validator.isValid(nickname), + isEnabled: validator.isValid(nickname), + isCancelButton: true + ) { + onStart(nickname) + } + + MediumButton( + title: Constant.Text.tutorialButton, + isFilled: true, + hasBadge: true, + isEnabled: validator.isValid(nickname) + ) { + onTutorial(nickname) + } + } + .frame(maxWidth: .infinity) + } + + func updateValidationState(for value: String) { + switch validator.validate(value) { + case .empty, .valid: + errorMessage = "" + case .invalid(let message): + errorMessage = message + } + } +} + +#Preview { + ZStack { + Color.gray.opacity(0.5) + .ignoresSafeArea() + + NicknameSetupView( + onStart: { nickname in + print("시작: \(nickname)") + }, + onTutorial: { nickname in + print("튜토리얼: \(nickname)") + } + ) + .padding() + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/TutorialPageView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/TutorialPageView.swift new file mode 100644 index 00000000..acebdb4f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/TutorialPageView.swift @@ -0,0 +1,75 @@ +// +// TutorialPageView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-22. +// + +import SwiftUI + +private enum Constant { + enum Spacing { + static let content: CGFloat = 30 + static let textGroup: CGFloat = 16 + } + + enum Size { + static let imageMaxWidth: CGFloat = 300 + static let imageMaxHeight: CGFloat = 300 + static let placeholderWidth: CGFloat = 300 + static let placeholderHeight: CGFloat = 300 + static let cornerRadius: CGFloat = 4 + static let strokeWidth: CGFloat = 2 + } + + enum Layout { + static let textHorizontalPadding: CGFloat = 40 + } +} + +struct TutorialPage { + let title: String + let description: String + let imageName: ImageResource +} + +struct TutorialPageView: View { + let page: TutorialPage + + var body: some View { + VStack(spacing: Constant.Spacing.content) { + textGroup + imageView + .frame(maxWidth: .infinity, maxHeight: .infinity) + .padding(.bottom, Constant.Size.strokeWidth) + } + } +} + +private extension TutorialPageView { + var imageView: some View { + Image(page.imageName) + .resizable() + .scaledToFit() + .frame(maxHeight: .infinity) + .overlay { + RoundedRectangle(cornerRadius: Constant.Size.cornerRadius) + .stroke(.black, lineWidth: Constant.Size.strokeWidth) + } + } + + var textGroup: some View { + VStack(spacing: Constant.Spacing.textGroup) { + Text(page.title) + .textStyle(.largeTitle) + .foregroundColor(.black) + .multilineTextAlignment(.center) + + Text(page.description) + .textStyle(.body) + .foregroundColor(AppColors.gray600) + .multilineTextAlignment(.center) + .padding(.horizontal, Constant.Layout.textHorizontalPadding) + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/TutorialView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/TutorialView.swift new file mode 100644 index 00000000..28da90b7 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/Intro/TutorialView.swift @@ -0,0 +1,156 @@ +// +// TutorialView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-21. +// + +import SwiftUI + +private enum Constant { + enum Spacing { + static let content: CGFloat = 10 + static let indicator: CGFloat = 8 + static let button: CGFloat = 15 + } + + enum Size { + static let indicatorCircle: CGFloat = 8 + static let placeholderButtonWidth: CGFloat = 89 + static let placeholderButtonHeight: CGFloat = 44 + } + + enum Padding { + static let buttonHorizontal: CGFloat = 25 + static let buttonVertical: CGFloat = 25 + } +} + +struct TutorialView: View { + @State private var currentPage: Int = 0 + @Binding var isPresented: Bool + + let onComplete: () -> Void + + private let tutorialPages: [TutorialPage] = [ + TutorialPage( + title: "게임 플레이", + description: "다양한 미니게임을 통해 골드를 획득하세요.", + imageName: .tutorialWork + ), + TutorialPage( + title: "스킬 업그레이드", + description: "스킬을 업그레이드하여 게임 효율을 높이세요.", + imageName: .tutorialSkill + ), + TutorialPage( + title: "장비 강화", + description: "장비를 강화하여 더 많은 보상을 받으세요.", + imageName: .tutorialItem + ), + TutorialPage( + title: "부동산 구매", + description: "부동산을 구매하여 더 많은 보상을 받으세요.", + imageName: .tutorialHousing + ), + TutorialPage( + title: "퀴즈 풀기", + description: "퀴즈를 풀고 다이아를 획득하세요.", + imageName: .tutorialQuiz + ), + TutorialPage( + title: "미션 완료", + description: "미션을 완료하여 추가 보상을 받으세요.", + imageName: .tutorialMission + ), + TutorialPage( + title: "커리어 성장", + description: "커리어를 발전시켜 더 높은 직급에 도전하세요.", + imageName: .tutorialCareer + ) + ] + + var body: some View { + ZStack { + AppTheme.backgroundColor + .ignoresSafeArea() + + VStack(spacing: Constant.Spacing.content) { + tutorialContent + buttonGroup + } + .ignoresSafeArea() + } + } +} + +private extension TutorialView { + var indicator: some View { + HStack(spacing: Constant.Spacing.indicator) { + ForEach(0.. 0 { + MediumButton(title: "이전", isFilled: true, isCancelButton: true) { + withAnimation { + currentPage -= 1 + } + } + } else { + Color.clear + .frame( + width: Constant.Size.placeholderButtonWidth, + height: Constant.Size.placeholderButtonHeight + ) + } + + Spacer() + + indicator + + Spacer() + + if currentPage < tutorialPages.count - 1 { + MediumButton(title: "다음", isFilled: true) { + withAnimation { + currentPage += 1 + } + } + } else { + MediumButton(title: "시작하기", isFilled: true) { + onComplete() + } + } + } + .padding(.horizontal, Constant.Padding.buttonHorizontal) + .padding(.vertical, Constant.Padding.buttonVertical) + } +} + +#Preview { + TutorialView( + isPresented: .constant(true), + onComplete: { + print("튜토리얼 완료") + } + ) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/LanguageGameView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/LanguageGameView.swift new file mode 100644 index 00000000..ff4ba899 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/LanguageGameView.swift @@ -0,0 +1,232 @@ +// +// LanguageGameView.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/15/26. +// + +import SwiftUI + +private enum Constant { + enum Padding { + static let horizontal: CGFloat = 16 + static let toolBarBottom: CGFloat = 10 + } + + enum Spacing { + static let itemHorizontal: CGFloat = 25 + static let buttonHorizontal: CGFloat = 17 + } + + enum Game { + static let itemCount: Int = 5 + static let feverDecreaseInterval: Double = 0.1 + static let feverDecreasePercentPerTick: Double = 5 + } + + enum EffectLabel { + static let offsetY: CGFloat = -34 + } +} + +struct LanguageGameView: View { + // MARK: Properties + let user: User + + /// 게임에 사용되는 언어 타입 목록 + private let languageTypeList: [LanguageType] = [ + .swift, + .kotlin, + .dart, + .python + ] + + // MARK: State Properties + /// 게임 시작 상태 (부모 뷰와 바인딩) + @Binding var isGameStarted: Bool + @Binding var isGameViewDisappeared: Bool + + /// 상태를 유지 + @State private var game: LanguageGame + + /// 획득한 골드를 표시하기 위한 효과 라벨 배열 + @State private var effectValues: [(id: UUID, value: Int)] = [] + + /// 현재 진행 중인 언어 버튼 탭 Task + @State private var currentActionTask: Task? + + init( + user: User, + isGameStarted: Binding, + isGameViewDisappeared: Binding, + animationSystem: CharacterAnimationSystem? = nil + ) { + self._isGameStarted = isGameStarted + self._isGameViewDisappeared = isGameViewDisappeared + self.user = user + + // 게임 초기화 + let game = LanguageGame( + user: user, + feverSystem: .init( + decreaseInterval: Constant.Game.feverDecreaseInterval, + decreasePercentPerTick: Constant.Game.feverDecreasePercentPerTick + ), + buffSystem: .init(), + itemCount: Constant.Game.itemCount, + animationSystem: animationSystem + ) + self._game = State(initialValue: game) + self.game.startGame() + } + + var body: some View { + GeometryReader { geometry in + VStack(alignment: .center, spacing: 0) { + // 상단 툴바 (닫기, 아이템 버튼, 피버 게이지) + toolbarSection + Spacer() + // 중앙 언어 아이템 영역 (획득 골드 효과 포함) + languageItemsSection + Spacer() + // 하단 언어 선택 버튼 영역 + languageButtonsSection + Spacer() + } + .pauseGameStyle( + isGameViewDisappeared: $isGameViewDisappeared, + height: geometry.size.height, + onLeave: { handleCloseButton() }, + onPause: { game.pauseGame() }, + onResume: { game.resumeGame() } + ) + } + } +} + +// MARK: - View Components +private extension LanguageGameView { + /// 상단 툴바 + var toolbarSection: some View { + GameToolBar( + closeButtonDidTapHandler: handleCloseButton, + coffeeButtonDidTapHandler: { useConsumableItem(.coffee) }, + energyDrinkButtonDidTapHandler: { useConsumableItem(.energyDrink) }, + feverState: game.feverSystem, + buffSystem: game.buffSystem, + coffeeCount: .constant(game.user.inventory.count(.coffee) ?? 0), + energyDrinkCount: .constant(game.user.inventory.count(.energyDrink) ?? 0) + ) + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.bottom, Constant.Padding.toolBarBottom) + } + + /// 중앙 언어 아이템 영역 + var languageItemsSection: some View { + HStack(alignment: .bottom, spacing: Constant.Spacing.itemHorizontal) { + ForEach(Array(game.itemList.enumerated()), id: \.offset) { _, item in + LanguageItem( + languageType: item.languageType, + state: item.state + ) + } + } + .frame(maxWidth: .infinity) + .overlay(alignment: .top) { + // 획득한 골드를 표시하는 효과 라벨 + ZStack { + ForEach(effectValues, id: \.id) { effect in + EffectLabel(value: effect.value) { + removeEffectLabel(id: effect.id) + } + } + } + .offset(y: Constant.EffectLabel.offsetY) + } + } + + /// 하단 언어 선택 버튼 영역 + var languageButtonsSection: some View { + HStack(spacing: Constant.Spacing.buttonHorizontal) { + ForEach(languageTypeList, id: \.self) { type in + LanguageButton(languageType: type) { + handleLanguageButtonTap(type) + } + } + } + } +} + +// MARK: - Actions +private extension LanguageGameView { + /// 닫기 버튼 클릭 처리 + func handleCloseButton() { + // 진행 중인 액션 Task 취소 + currentActionTask?.cancel() + currentActionTask = nil + + game.stopGame() + isGameStarted = false + } + + /// 언어 버튼 클릭 처리 + func handleLanguageButtonTap(_ type: LanguageType) { + // 이전 액션이 진행 중이면 취소 + currentActionTask?.cancel() + + currentActionTask = Task { + let gainedGold = await game.didPerformAction(type) + + // Task가 취소되었으면 UI 업데이트 생략 + guard !Task.isCancelled else { return } + + SoundService.shared.trigger(gainedGold > 0 ? .languageCorrect : .languageWrong) + if gainedGold <= 0 { + HapticService.shared.trigger(.error) + } + showEffectLabel(gainedGold: gainedGold) + } + } + + /// 소비 아이템 사용 처리 + func useConsumableItem(_ type: ConsumableType) { + if game.user.inventory.drink(type) { + SoundService.shared.trigger(.itemConsume) + HapticService.shared.trigger(.success) + game.buffSystem.useConsumableItem(type: type) + game.user.record.record(type == .coffee ? .coffeeUse : .energyDrinkUse) + } + } +} + +// MARK: - Helper Methods +private extension LanguageGameView { + /// 획득한 골드를 표시하는 효과 라벨 추가 + /// - Parameter gainedGold: 획득한 골드 (음수일 경우 손실) + func showEffectLabel(gainedGold: Int) { + let effectId = UUID() + effectValues.append((id: effectId, value: gainedGold)) + } + + /// 효과 라벨 제거 (애니메이션 완료 시 콜백으로 호출) + /// - Parameter id: 제거할 효과 라벨의 ID + func removeEffectLabel(id: UUID) { + effectValues.removeAll { $0.id == id } + } +} + +#Preview { + @Previewable @State var isGameStarted = true + @Previewable @State var isGameViewDisappeared = true + let user = User( + nickname: "Test", + wallet: .init(), + inventory: .init(), + record: .init(), + skills: [ + .init(key: SkillKey(game: .language, tier: .beginner), level: 1000) + ] + ) + + LanguageGameView(user: user, isGameStarted: $isGameStarted, isGameViewDisappeared: $isGameViewDisappeared, animationSystem: nil) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/MainView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/MainView.swift new file mode 100644 index 00000000..1a4cb98b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/MainView.swift @@ -0,0 +1,300 @@ +// +// MainView.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/8/26. +// + +import SwiftUI +import SpriteKit + +enum AppTheme { + static let backgroundColor: Color = AppColors.beige200 +} + +private enum Constant { + static let characterSceneSize = CGSize(width: 100, height: 100) + static let spriteViewSize = CGSize(width: 200, height: 200) + static let topAreaHeightRatio: CGFloat = 0.5 + + enum Padding { + static let horizontalPadding: CGFloat = 25 + } + + enum Color { + static let overlay = SwiftUI.Color.black.opacity(0.3) + } + + enum CareerPopup { + static let title: String = "커리어" + static let maxHeight: CGFloat = 650 + } + + enum TopButton { + static let top: CGFloat = 128 + static let horizontal: CGFloat = 16 + } +} + +struct MainView: View { + @Environment(\.scenePhase) var scenePhase + @State private var selectedTab: TabItem = .work + @State private var popupContent: PopupConfiguration? + @State private var careerSystem: CareerSystem? + @State private var isWorkGameInProgress: Bool = false + @State private var showQuizView: Bool = false + @State private var showSettingsView: Bool = false + + private var autoGainSystem: AutoGainSystem + private let user: User + private let scene: CharacterScene + private let animationSystem: CharacterAnimationSystem + + init(user: User) { + self.autoGainSystem = AutoGainSystem(user: user) + self.user = user + + self.scene = CharacterScene(size: Constant.characterSceneSize, user: user) + self.scene.scaleMode = .aspectFit + self.scene.playIdle() + + // 애니메이션 시스템 생성 및 클로저 연결 + self.animationSystem = CharacterAnimationSystem() + self.animationSystem.onSmile = { [weak scene] in + scene?.playSmile() + } + self.animationSystem.onIdle = { [weak scene] in + scene?.playIdle() + } + } + + var body: some View { + GeometryReader { geometry in + VStack(spacing: 0) { + topAreaContent + .frame(height: geometry.size.height * Constant.topAreaHeightRatio) + .background(housingBackgroundView) + tabBar + tabContentView + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + } + .ignoresSafeArea(edges: [.top, .bottom]) + .background(AppTheme.backgroundColor) + .onAppear(perform: setupOnAppear) + .onDisappear { SoundService.shared.stopBGM() } + .onChange(of: scenePhase, handleScenePhaseChange) + .task(id: user.record.totalEarnedMoney) { + await careerSystem?.updateCareer() + } + .overlay { popupOverlayView } + .overlay { settingsOverlayView } + .fullScreenCover(isPresented: $showQuizView) { + QuizGameView(user: user) + } + } + } +} + +private extension MainView { + var topAreaContent: some View { + ZStack(alignment: .top) { + topAreaMainContent + topButtonOverlay + } + } + + var topAreaMainContent: some View { + VStack(spacing: 0) { + StatusBar( + career: careerSystem?.currentCareer ?? .unemployed, + nickname: user.nickname, + careerProgress: careerSystem?.careerProgress ?? 0.0, + gold: user.wallet.gold, + diamond: user.wallet.diamond + ) + .onTapGesture { showCareerPopup() } + Spacer() + characterSceneView + } + } + + var tabBar: some View { + TabBar( + selectedTab: $selectedTab, + hasCompletedMisson: user.record + .missionSystem.hasCompletedMission + ) + } + + var characterSceneView: some View { + SpriteView(scene: scene, options: [.allowsTransparency]) + .frame(width: Constant.spriteViewSize.width, height: Constant.spriteViewSize.height) + .background(Color.clear) + } + + var housingBackgroundView: some View { + Image(user.inventory.housing.imageName) + .resizable() + .aspectRatio(contentMode: .fill) + } + + var topButtonOverlay: some View { + VStack { + HStack { + SmallButton(title: "설정", image: Image(.iconSetting)) { + showSettingsView = true + } + Spacer() + SmallButton(title: "퀴즈", hasBadge: true) { + showQuizView = true + } + } + .padding(.top, Constant.TopButton.top) + .padding(.horizontal, Constant.TopButton.horizontal) + Spacer() + } + } + + var tabContentView: some View { + ZStack { + if isWorkGameInProgress { + workGameOverlayView + } + if !isWorkGameInProgress || selectedTab != .work { + tabContentSwitchView + } + } + } + + var workGameOverlayView: some View { + WorkSelectedView( + user: user, + animationSystem: animationSystem, + isGameStarted: $isWorkGameInProgress, + isGameViewDisappeared: Binding( + get: { selectedTab != .work || showQuizView }, + set: { _ in } + ), + careerSystem: $careerSystem + ) + .opacity(selectedTab == .work ? 1 : 0) + .allowsHitTesting(selectedTab == .work) + } + + @ViewBuilder + var tabContentSwitchView: some View { + switch selectedTab { + case .work: + if !isWorkGameInProgress { + WorkSelectedView( + user: user, + animationSystem: animationSystem, + isGameStarted: $isWorkGameInProgress, + isGameViewDisappeared: Binding( + get: { selectedTab != .work || showQuizView }, + set: { _ in } + ), + careerSystem: $careerSystem + ) + } + case .skill: + SkillView(user: user, careerSystem: careerSystem, popupContent: $popupContent) + case .shop: + ShopView(user: user, popupContent: $popupContent) + case .mission: + MissionView(user: user) + } + } + + @ViewBuilder + var popupOverlayView: some View { + if let popupContent { + ZStack { + Constant.Color.overlay + .ignoresSafeArea() + .onTapGesture { self.popupContent = nil } + + Popup(title: popupContent.title, contentView: popupContent.content) + .frame(maxHeight: popupContent.maxHeight) + .padding(.horizontal, Constant.Padding.horizontalPadding) + } + } + } + + @ViewBuilder + var settingsOverlayView: some View { + if showSettingsView { + ZStack { + Constant.Color.overlay + .ignoresSafeArea() + .onTapGesture { showSettingsView = false } + + FeedbackSettingView(onClose: { showSettingsView = false }) + .padding(.horizontal, Constant.Padding.horizontalPadding) + } + } + } + + func setupOnAppear() { + SoundService.shared.playBGM() + autoGainSystem.startSystem() + Task { + if careerSystem == nil { + careerSystem = await CareerSystem(user: user) + careerSystem?.onCareerChanged = { [weak scene] newCareer in + scene?.updateCareerAppearance(to: newCareer) + } + } + } + } + + func handleScenePhaseChange(_ oldValue: ScenePhase, _ newValue: ScenePhase) { + if newValue == .active { + autoGainSystem.startSystem() + } else if newValue == .inactive || newValue == .background { + autoGainSystem.stopSystem() + } + } + + func showCareerPopup() { + guard let careerSystem else { return } + + popupContent = PopupConfiguration( + title: Constant.CareerPopup.title, + maxHeight: Constant.CareerPopup.maxHeight + ) { + CareerPopupView( + careerSystem: careerSystem, + user: user, + onClose: { + popupContent = nil + } + ) + } + } +} + +#Preview { + let user = User( + nickname: "소피아", + career: .unemployed, + wallet: .init(), + inventory: Inventory( + equipmentItems: [ + .init(type: .chair, tier: .broken), + .init(type: .keyboard, tier: .broken), + .init(type: .monitor, tier: .broken), + .init(type: .mouse, tier: .broken) + ], + housing: .init(tier: .street) + ), + record: .init(), + skills: [ + .init(key: SkillKey(game: .tap, tier: .beginner), level: 10), + .init(key: SkillKey(game: .language, tier: .beginner), level: 1), + .init(key: SkillKey(game: .dodge, tier: .beginner), level: 1), + .init(key: SkillKey(game: .stack, tier: .beginner), level: 1) + ] + ) + MainView(user: user) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/MissionView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/MissionView.swift new file mode 100644 index 00000000..eca9e860 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/MissionView.swift @@ -0,0 +1,98 @@ +// +// MissionView.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/21/26. +// + +import SwiftUI + +private enum Constant { + static let vertical: CGFloat = 15 + static let gridVeticalSpacing: CGFloat = 14 + static let minWidth: CGFloat = 115 +} + +struct MissionView: View { + private let user: User + private let missionSystem: MissionSystem + + @State private var showToast: Bool = false + @State private var toastMessage: String = "" + + init(user: User) { + self.user = user + self.missionSystem = user.record.missionSystem + } + + var body: some View { + VStack(spacing: Constant.vertical) { + ProgressBar( + maxValue: Double(missionSystem.allCount), + currentValue: Double(missionSystem.claimedCount), + text: "\(missionSystem.claimedCount) / \(missionSystem.allCount)" + ) + ScrollView { + LazyVGrid( + columns: [GridItem(.adaptive(minimum: Constant.minWidth))], + spacing: Constant.gridVeticalSpacing + ) { + ForEach(missionSystem.missions, id: \.id) { mission in + MissionCard( + title: mission.title, + reward: mission.reward, + imageName: mission.type.level.imageName, + condition: mission.description, + buttonState: toButtonState( + missionCardState: mission + .missionCardState), + onButtonTap: { + missionCardDidTapHandler( + mission: mission + ) + } + ) + } + } + } + .scrollIndicators(.never) + } + .padding(.horizontal) + .toast(isShowing: $showToast, message: toastMessage) + + } +} + +private extension MissionView { + func toButtonState(missionCardState: MissionCardState) -> MissionCardButton.ButtonState { + switch missionCardState { + case .claimed: + .claimed + case .claimable: + .claimable + case .inProgress(let currentValue, let totalValue): + .inProgress(currentValue: currentValue, totalValue: totalValue) + } + } + + func missionCardDidTapHandler(mission: Mission) { + if mission.missionCardState == .claimable { + missionSystem.claimMissionReward(mission: mission, wallet: user.wallet) + SoundService.shared.trigger(.missionAcquired) + showToast = false + let reward = mission.reward + if reward.gold > 0 && reward.diamond > 0 { + toastMessage = "미션을 달성했습니다.\n보상: \(reward.gold.formatted) 골드, \(reward.diamond.formatted) 다이아" + } else if reward.gold > 0 { + toastMessage = "미션을 달성했습니다.\n보상: \(reward.gold.formatted) 골드" + } else { + toastMessage = "미션을 달성했습니다.\n보상: \(reward.diamond.formatted) 다이아" + } + showToast = true + } else { + showToast = false + toastMessage = mission.missionCardState == .claimed ? "이미 보유한 미션입니다." : "아직 달성하지 못한 미션입니다." + showToast = true + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/MultiTouchView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/MultiTouchView.swift new file mode 100644 index 00000000..2a6928d5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/MultiTouchView.swift @@ -0,0 +1,51 @@ +// +// MultiTouchView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-23. +// + +import SwiftUI +import UIKit + +struct MultiTouchView: UIViewRepresentable { + let onTap: (CGPoint) -> Void + + func makeUIView(context: Context) -> MultiTouchUIView { + let view = MultiTouchUIView() + view.onTap = onTap + return view + } + + func updateUIView(_ uiView: MultiTouchUIView, context: Context) { + uiView.onTap = onTap + } +} + +final class MultiTouchUIView: UIView { + var onTap: ((CGPoint) -> Void)? + + override init(frame: CGRect) { + super.init(frame: frame) + isMultipleTouchEnabled = true + isUserInteractionEnabled = true + backgroundColor = .clear + } + + required init?(coder: NSCoder) { nil } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + super.touchesBegan(touches, with: event) + + // 모든 터치에 대해 처리 + for touch in touches { + let location = touch.location(in: self) + let safeAreaBottom = safeAreaInsets.bottom + let maxY = bounds.height - safeAreaBottom + + if location.y <= maxY { + onTap?(location) + } + } + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/QuizGameView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/QuizGameView.swift new file mode 100644 index 00000000..9ff01503 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/QuizGameView.swift @@ -0,0 +1,314 @@ +// +// QuizGameView.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/22/26. +// + +import SwiftUI + +private enum Constant { + static let totalQuizCount: Int = 3 + static let rewardCount: Int = 5 + + enum Padding { + static let horizontal: CGFloat = 16 + static let top: CGFloat = 15 + static let titleBottom: CGFloat = 14 + static let quizCountBottom: CGFloat = 6 + static let remainSecondsBottom: CGFloat = 30 + static let questionTitleBottom: CGFloat = 8 + static let rewardBottom: CGFloat = 8 + static let optionsBottom: CGFloat = 30 + static let submitBottom: CGFloat = 15 + } + + enum Spacing { + static let title: CGFloat = 2 + static let quizButton: CGFloat = 16 + } + + enum Size { + static let closeButtonWidth: CGFloat = 28 + static let closeButtonHeight: CGFloat = 28 + } +} + +struct QuizGameView: View { + @Environment(\.dismiss) private var dismiss + @State private var quizGame: QuizGame + @State private var showRewardPopup: Bool = false + + init(user: User) { + _quizGame = State(initialValue: QuizGame(user: user)) + } + + var body: some View { + let state = quizGame.state + + VStack(spacing: 0) { + + /// 문제 헤더 영역 + QuizHeaderView( + currentQuizNumber: state.currentQuestion != nil ? quizGame.currentQuestionIndex + 1 : 0, + totalQuizCount: Constant.totalQuizCount, + remainingSeconds: state.remainingSeconds, + quizTitle: state.currentQuestion?.question ?? "", + rewardCount: Constant.rewardCount, + onClose: { + dismiss() + } + ) + + /// 해설 영역 + QuizExplanationView( + isSubmitted: state.phase == .showingExplanation, + explanation: state.currentQuestion?.explanation ?? "", + isCorrect: state.currentAnswerResult?.isCorrect ?? false, + correctAnswerIndex: state.currentQuestion?.correctAnswerIndex + ) + + /// 선지, 제출버튼 영역 + QuizOptionsView( + options: state.currentQuestion?.options ?? [], + selectedIndex: state.selectedAnswerIndex, + isShowingExplanation: state.phase == .showingExplanation, + submitButtonTitle: state.phase == .showingExplanation ? state.nextButtonTitle : "제출하기", + onSelect: { index in + if state.selectedAnswerIndex == index { + quizGame.deselectAnswer() + } else { + quizGame.selectAnswer(index) + } + }, + onSubmit: { + if state.phase == .showingExplanation { + if state.nextButtonTitle == "보상받기" { + showRewardPopup = true + } else { + quizGame.proceedToNextQuestion() + } + } else { + quizGame.submitSelectedAnswer() + } + } + ) + } + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.top, Constant.Padding.top) + .background(AppColors.beige100) + .onAppear { + if quizGame.state.phase == .ready { + quizGame.startGame() + } + } + .onChange(of: state.remainingSeconds) { _, newValue in + if newValue == 3 { + SoundService.shared.trigger(.quizCountdown) + } else if newValue == 0 { + SoundService.shared.trigger(.quizTimeOver) + } + } + .onDisappear { SoundService.shared.stopAllSFX() } + .overlay { + if showRewardPopup { + ZStack { + Color.black.opacity(0.4) + .ignoresSafeArea() + + RewardPopupView( + totalDiamondsEarned: state.totalDiamondsEarned, + onClose: { + quizGame.proceedToNextQuestion() + showRewardPopup = false + dismiss() + } + ) + } + } + } + } +} + +// MARK: - 퀴즈 헤더 뷰 +private struct QuizHeaderView: View { + let currentQuizNumber: Int + let totalQuizCount: Int + let remainingSeconds: Int + let quizTitle: String + let rewardCount: Int + let onClose: () -> Void + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + // 타이틀 + HStack(spacing: Constant.Spacing.title) { + Image(.quizDogFace) + Image(.quizDogFoot) + Text("개발 퀴즈") + .textStyle(.largeTitle) + Spacer() + Button { + onClose() + } label: { + Image(systemName: "xmark.square.fill") + .resizable() + .foregroundStyle(.black) + .frame( + width: Constant.Size.closeButtonWidth, + height: Constant.Size.closeButtonHeight + ) + } + .buttonStyle(.soundTap) + } + .padding(.bottom, Constant.Padding.titleBottom) + + // 문제 개수 + HStack { + Spacer() + Text("\(currentQuizNumber) / \(totalQuizCount)") + .textStyle(.headline) + } + .padding(.bottom, Constant.Padding.quizCountBottom) + + // Progress + ProgressBar( + maxValue: Double(Policy.Game.Quiz.secondsPerQuestion), + currentValue: Double(remainingSeconds), + text: remainingSeconds > 0 ? "\(remainingSeconds)s" : "제한 시간 종료" + ) + .padding(.bottom, Constant.Padding.remainSecondsBottom) + + // 문제 + Text(quizTitle) + .textStyle(.title2) + .padding(.bottom, Constant.Padding.questionTitleBottom) + .fixedSize(horizontal: false, vertical: true) + + // 보상 + HStack { + Spacer() + CurrencyLabel(axis: .horizontal, icon: .diamond, textStyle: .body, value: rewardCount) + } + .padding(.bottom, Constant.Padding.rewardBottom) + } + } +} + +// MARK: - 해설 뷰 +private struct QuizExplanationView: View { + let isSubmitted: Bool + let explanation: String + let isCorrect: Bool + let correctAnswerIndex: Int? + + var body: some View { + VStack(spacing: 0) { + if isSubmitted { + Text(resultPrefix+explanation) + .textStyle(.callout) + .foregroundColor( + isCorrect ? AppColors.accentGreen : AppColors.accentRed + ) + .frame(maxWidth: .infinity, alignment: .leading) + .fixedSize(horizontal: false, vertical: true) + .minimumScaleFactor(0.8) + } + + Spacer(minLength: 0) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + + private var resultPrefix: String { + if isCorrect { + return "정답\n" + } else { + let answerNumber = (correctAnswerIndex ?? 0) + 1 // 0-based → 1-based + return "오답 / 정답은 \(answerNumber)번이다.\n" + } + } +} + +// MARK: - 선지, 제출버튼 뷰 +private struct QuizOptionsView: View { + let options: [String] + let selectedIndex: Int? + let isShowingExplanation: Bool + let submitButtonTitle: String + let onSelect: (Int) -> Void + let onSubmit: () -> Void + + var body: some View { + VStack(spacing: 0) { + + // 선지 + VStack(spacing: Constant.Spacing.quizButton) { + ForEach(options.indices, id: \.self) { index in + QuizButton( + isSelected: selectedIndex == index, + title: "\(index + 1). \(options[index])" + ) { + onSelect(index) + } + .disabled(isShowingExplanation) + } + } + .padding(.bottom, Constant.Padding.optionsBottom) + + // 제출 버튼 + QuizButton( + style: .submit, + isEnabled: isShowingExplanation ? true : selectedIndex != nil, + title: submitButtonTitle + ) { + onSubmit() + } + .padding(.bottom, Constant.Padding.submitBottom) + } + } +} + +// MARK: - 보상 팝업 뷰 +private struct RewardPopupView: View { + let totalDiamondsEarned: Int + let onClose: () -> Void + + var body: some View { + Popup(title: "보상 획득") { + VStack(alignment: .center, spacing: 0) { + VStack(alignment: .leading, spacing: 0) { + Text("퀴즈 풀이를 완료했습니다!\n진정한 개발자에 한걸음 더 가까워졌습니다.") + .textStyle(.body) + .padding(.top, 11) + .padding(.bottom, 20) + + HStack(spacing: 4) { + Text("획득한 다이아: ") + .textStyle(.body) + CurrencyLabel( + axis: .horizontal, + icon: .diamond, + textStyle: .body, + value: totalDiamondsEarned + ) + } + .padding(.bottom, 20) + } + MediumButton(title: "종료하기", isFilled: true) { + onClose() + } + } + } + .padding(.horizontal, 40) + } +} + +#Preview { + QuizGameView(user: User( + nickname: "Preview User", + wallet: Wallet(), + inventory: Inventory(), + record: Record() + )) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/ShopPurchaseHelper.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/ShopPurchaseHelper.swift new file mode 100644 index 00000000..0c06d48f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/ShopPurchaseHelper.swift @@ -0,0 +1,119 @@ +// +// ShopPurchaseHelper.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-21. +// + +import Foundation +import SwiftUI + +private enum Constant { + enum Spacing { + static let popupContent: CGFloat = 11 + static let popupButton: CGFloat = 15 + } + + enum Padding { + static let popupTop: CGFloat = 11 + static let popupHorizontal: CGFloat = 25 + } +} + +enum ShopPurchaseHelper { + /// 확인 팝업 표시 (취소/확인 버튼) + static func showConfirm( + popupContent: Binding, + title: String, + message: String, + confirmTitle: String, + onConfirm: @escaping () -> Void + ) { + var didPurchasingButtonTapped = false + + popupContent.wrappedValue = PopupConfiguration( + title: title, + maxHeight: nil + ) { + VStack(spacing: Constant.Spacing.popupContent) { + Text(message) + .textStyle(.body) + .foregroundColor(.black) + .multilineTextAlignment(.center) + + HStack(spacing: Constant.Spacing.popupButton) { + MediumButton(title: "취소", isFilled: true, isCancelButton: true) { + popupContent.wrappedValue = nil + } + MediumButton(title: confirmTitle, isFilled: true) { + guard !didPurchasingButtonTapped else { return } + didPurchasingButtonTapped = true + onConfirm() + popupContent.wrappedValue = nil + } + } + } + .padding(.top, Constant.Padding.popupTop) + } + } + + /// 알림 팝업 표시 (확인 버튼만) + static func showAlert( + popupContent: Binding, + title: String, + message: String + ) { + popupContent.wrappedValue = PopupConfiguration( + title: title, + maxHeight: nil + ) { + VStack(spacing: Constant.Spacing.popupContent) { + Text(message) + .textStyle(.body) + .foregroundColor(.black) + .multilineTextAlignment(.center) + + MediumButton(title: "확인", isFilled: true) { + popupContent.wrappedValue = nil + } + } + .padding(.top, Constant.Padding.popupTop) + } + } + + /// 구매 정보 생성 + static func purchaseInfo(for item: DisplayItem) -> (title: String, message: String, buttonTitle: String) { + switch item.category { + case .equipment: + let successRate = (item.item as? Equipment).map { Int($0.tier.upgradeSuccessRate * 100) } + let message = successRate.map { "강화하시겠습니까?\n(성공 확률: \($0)%)" } ?? "강화하시겠습니까?" + return ("장비 강화", message, "강화") + case .housing: + return ("부동산 구매", "구매하시겠습니까?", "구매") + case .consumable: + return ("아이템 구매", "구매하시겠습니까?", "구매") + } + } + + /// 구매 메시지 생성 + static func createPurchaseMessage(item: DisplayItem, baseMessage: String, shopSystem: ShopSystem) -> String { + let priceText = createPriceText(for: item, shopSystem: shopSystem) + let prefix = item.category == .housing && shopSystem.calculateHousingNetCost(for: item) < 0 ? "를 환불받고" : "를 사용하여" + return "\(priceText)\(prefix)\n\(baseMessage)" + } + + /// 가격 텍스트 생성 + static func createPriceText(for item: DisplayItem, shopSystem: ShopSystem) -> String { + var components: [String] = [] + + if item.category == .housing { + let netCost = shopSystem.calculateHousingNetCost(for: item) + components.append("\(abs(netCost).formatted) 골드") + } else { + if item.cost.gold > 0 { components.append("\(item.cost.gold.formatted) 골드") } + if item.cost.diamond > 0 { components.append("\(item.cost.diamond.formatted) 다이아") } + } + + return "[\(components.joined(separator: ", "))]" + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/ShopView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/ShopView.swift new file mode 100644 index 00000000..f33c3261 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/ShopView.swift @@ -0,0 +1,190 @@ +// +// ShopView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-21. +// + +import SwiftUI + +private enum Constant { + enum Text { + static let itemSegment = "아이템" + static let housingSegment = "부동산" + + static let enhanceSuccessTitle = "강화 성공" + static let enhanceFailureTitle = "강화 실패" + static let enhanceSuccessMessage = "강화에 성공했습니다!" + static let enhanceFailureMessage = "강화에 실패했습니다.\n비용은 소모되었습니다." + + static let purchaseFailureTitle = "구매 실패" + static let purchaseFailureMessage = "구매에 실패했습니다." + } + + enum ID { + static let housingScrollStart = "housingScrollStart" + } + + enum Spacing { + static let itemCard: CGFloat = 12 + } + + enum Padding { + static let horizontal: CGFloat = 16 + static let housingTop: CGFloat = 15 + static let housingBottom: CGFloat = 23 + } +} + +struct ShopView: View { + private let user: User + private let shopSystem: ShopSystem + + @State private var selectedCategoryIndex: Int = 0 + @State private var selectedHousingTier: HousingTier? + + @Binding var popupContent: PopupConfiguration? + + init(user: User, popupContent: Binding) { + self.user = user + self.shopSystem = ShopSystem(user: user) + self._popupContent = popupContent + } + + var body: some View { + VStack { + DefaultSegmentControl( + selection: $selectedCategoryIndex, + segments: [Constant.Text.itemSegment, Constant.Text.housingSegment] + ) + .padding(.horizontal, Constant.Padding.horizontal) + + if selectedCategoryIndex == 0 { + itemView + } else { + housingView + } + } + } +} + +private extension ShopView { + var displayItems: [DisplayItem] { + if selectedCategoryIndex == 0 { + return shopSystem.itemList(itemTypes: [.consumable, .equipment]) + } else { + return shopSystem.itemList(itemTypes: [.housing]) + } + } + + var itemView: some View { + ScrollView { + LazyVStack(spacing: Constant.Spacing.itemCard) { + ForEach(displayItems) { item in + ItemRow( + title: item.displayTitle, + description: item.description, + imageName: item.imageName, + cost: item.cost, + state: ItemState(item: item) + ) { + purchase(item: item) + } + } + } + .padding(.bottom) + } + .scrollIndicators(.never) + } + + var housingView: some View { + ScrollViewReader { proxy in + ScrollView(.horizontal) { + LazyHStack(spacing: Constant.Spacing.itemCard) { + ForEach(displayItems) { item in + if let housing = item.item as? Housing { + HousingCard( + housing: housing, + state: ItemState(item: item), + isSelected: selectedHousingTier == housing.tier, + onTap: { + selectedHousingTier = housing.tier + }, + onButtonTap: { + selectedHousingTier = housing.tier + purchase(item: item, scrollProxy: proxy) + } + ) + .id(item.id) + } + } + } + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.top, Constant.Padding.housingTop) + .padding(.bottom, Constant.Padding.housingBottom) + .id(Constant.ID.housingScrollStart) + } + .scrollIndicators(.never) + } + } + + /// 아이템 구매 확인 팝업 표시 + func purchase(item: DisplayItem, scrollProxy: ScrollViewProxy? = nil) { + let (title, message, buttonTitle) = ShopPurchaseHelper.purchaseInfo(for: item) + let fullMessage = ShopPurchaseHelper.createPurchaseMessage(item: item, baseMessage: message, shopSystem: shopSystem) + + ShopPurchaseHelper.showConfirm( + popupContent: $popupContent, + title: title, + message: fullMessage, + confirmTitle: buttonTitle + ) { + executePurchase(item: item, scrollProxy: scrollProxy) + } + } + + /// 실제 구매 실행 + func executePurchase(item: DisplayItem, scrollProxy: ScrollViewProxy? = nil) { + do { + let isSuccess = try shopSystem.buy(item: item) + if isSuccess { + // 성공 시 가로 스크롤을 맨 처음으로 이동 + if let proxy = scrollProxy, selectedCategoryIndex == 1 { + withAnimation { + proxy.scrollTo(Constant.ID.housingScrollStart, anchor: .leading) + } + } + } + if item.category == .equipment { + SoundService.shared.trigger(isSuccess ? .upgradeSuccess : .upgradeFailure) + if !isSuccess { + HapticService.shared.trigger(.error) + } + let title = isSuccess ? Constant.Text.enhanceSuccessTitle : Constant.Text.enhanceFailureTitle + let message = isSuccess ? Constant.Text.enhanceSuccessMessage : Constant.Text.enhanceFailureMessage + ShopPurchaseHelper.showAlert(popupContent: $popupContent, title: title, message: message) + } + } catch let error as PurchasingError { + HapticService.shared.trigger(.error) + ShopPurchaseHelper.showAlert(popupContent: $popupContent, title: Constant.Text.purchaseFailureTitle, message: error.message) + } catch { + HapticService.shared.trigger(.error) + ShopPurchaseHelper.showAlert(popupContent: $popupContent, title: Constant.Text.purchaseFailureTitle, message: Constant.Text.purchaseFailureMessage) + } + } +} + +#Preview { + let user = User( + nickname: "테스트", + wallet: .init(gold: 1_000_000, diamond: 100), + inventory: .init(), + record: .init(), + skills: [ + .init(key: SkillKey(game: .tap, tier: .beginner), level: 1) + ] + ) + Spacer() + .frame(height: 500) + ShopView(user: user, popupContent: .constant(nil)) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/SkillView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/SkillView.swift new file mode 100644 index 00000000..fd9c2433 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/SkillView.swift @@ -0,0 +1,129 @@ +// +// SkillView.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-20. +// + +import SwiftUI + +private enum Constant { + static let horizontalPadding: CGFloat = 16 + static let popupHorizontalPadding: CGFloat = 25 + static let itemCardSpacing: CGFloat = 12 + static let popupContentSpacing: CGFloat = 20 +} + +struct SkillView: View { + private let user: User + private let careerSystem: CareerSystem? + private let skillSystem: SkillSystem + + @Binding var popupContent: PopupConfiguration? + + init( + user: User, + careerSystem: CareerSystem?, + popupContent: Binding + ) { + self.user = user + self.careerSystem = careerSystem + self.skillSystem = SkillSystem(user: user, careerSystem: careerSystem) + self._popupContent = popupContent + } + + var body: some View { + ScrollView { + LazyVStack(spacing: Constant.itemCardSpacing) { + ForEach(skillSystem.skillList(), id: \.skill) { skillState in + ItemRow( + title: skillState.skill.title, + description: "액션당 \(Int(skillState.skill.gainGold).formatted()) 골드 획득", + imageName: skillState.skill.imageName, + cost: skillState.skill.upgradeCost, + state: skillState.itemState, + action: { upgrade(skill: skillState.skill) }, + onLongPressAction: { upgradeRepeating(skill: skillState.skill) } + ) + } + } + } + .padding(.bottom) + .scrollIndicators(.never) + } +} + +private extension SkillView { + func upgrade(skill: Skill) { + do { + try skillSystem.upgrade(skill: skill) + } catch let error as UserReadableError { + popupContent = PopupConfiguration(title: "스킬") { + VStack(spacing: Constant.popupContentSpacing) { + Text(error.message) + .textStyle(.body) + .foregroundColor(.black) + .multilineTextAlignment(.center) + + MediumButton(title: "확인", isFilled: true) { + popupContent = nil + } + } + } + } catch { + // UserReadableError를 채택하지 않은 예상치 못한 에러 + // 실제로는 발생하지 않지만 Swift 컴파일러 요구사항 + popupContent = PopupConfiguration(title: "스킬") { + VStack(spacing: Constant.popupContentSpacing) { + Text(error.localizedDescription) + .textStyle(.body) + .foregroundColor(.black) + .multilineTextAlignment(.center) + + MediumButton(title: "확인", isFilled: true) { + popupContent = nil + } + } + } + } + } + + /// 롱프레스 연속 구매용. 성공 시 `true`, 실패(재화 부족 등) 시 `false` 반환해 연속 호출 중단. + func upgradeRepeating(skill: Skill) -> Bool { + do { + try skillSystem.upgrade(skill: skill) + return true + } catch { + return false + } + } +} + +#Preview { + let user = User( + nickname: "테스트", + wallet: .init(gold: 110, diamond: 100), + inventory: .init(), + record: .init(), + skills: [ + // 코드짜기 + .init(key: SkillKey(game: .tap, tier: .beginner), level: 1), + .init(key: SkillKey(game: .tap, tier: .intermediate), level: 1), + .init(key: SkillKey(game: .tap, tier: .advanced), level: 1), + // 언어 맞추기 + .init(key: SkillKey(game: .language, tier: .beginner), level: 1), + .init(key: SkillKey(game: .language, tier: .intermediate), level: 1), + .init(key: SkillKey(game: .language, tier: .advanced), level: 1), + // 버그 피하기 + .init(key: SkillKey(game: .dodge, tier: .beginner), level: 1), + .init(key: SkillKey(game: .dodge, tier: .intermediate), level: 1), + .init(key: SkillKey(game: .dodge, tier: .advanced), level: 1), + // 데이터 쌓기 + .init(key: SkillKey(game: .stack, tier: .beginner), level: 1), + .init(key: SkillKey(game: .stack, tier: .intermediate), level: 1), + .init(key: SkillKey(game: .stack, tier: .advanced), level: 1) + ] + ) + + SkillView(user: user, careerSystem: nil, popupContent: .constant(nil)) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/StackGameScene.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/StackGameScene.swift new file mode 100644 index 00000000..8680ced1 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/StackGameScene.swift @@ -0,0 +1,323 @@ +// +// StackGameScene.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/15/26. +// + +import SwiftUI +import SpriteKit + +private enum Constant { + enum Physics { + static let gravity = CGVector(dx: 0, dy: -9.8) + } + + enum Offset { + // 최상단에서 블록을 살짝 안쪽으로 내려서 생성하기 위한 여백 + static let spawnYOffset: CGFloat = 24 + } + + enum Time { + // 블록 평가 체크 간격 (초) + static let evaluationCheckInterval: TimeInterval = 0.05 + // 폭탄 블록 제거 딜레이 (초) + static let bombRemovalDelay: TimeInterval = 0.8 + // 카메라 이동 애니메이션 시간 (초) + static let cameraMoveAnimationDuration: TimeInterval = 0.3 + // 다음 블록 생성 딜레이 (초) + static let nextBlockSpawnDelay: TimeInterval = 0.3 + // 실패한 블록 제거 딜레이 (초) + static let failedBlockRemovalDelay: TimeInterval = 1.0 + } +} + +final class StackGameScene: SKScene { + private let stackGame: StackGame + + private var currentBlockView: BlockItem? + private var blockViews: [BlockItem] = [] + /// 첫 블록의 바닥 기준 높이 + private var currentHeight: CGFloat = 0 + /// 블록 배치 처리 중 여부 (UI 인터랙션 차단용) + private var isProcessing = false + /// 자체 게임 상태 관리 변수 + private var isGamePaused = false + + var onBlockDropped: ((Int) -> Void) + + init(stackGame: StackGame, onBlockDropped: @escaping ((Int) -> Void)) { + self.stackGame = stackGame + self.onBlockDropped = onBlockDropped + super.init(size: .zero) + self.scaleMode = .resizeFill + } + + required init?(coder aDecoder: NSCoder) { + return nil + } + + override func didMove(to view: SKView) { + // 화면 크기를 게임 코어에 전달 + stackGame.screenSize = size + setupScene() + startGame() + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + guard currentBlockView != nil, !isProcessing, !isGamePaused else { return } + dropBlock() + } + + /// 씬의 초기 설정을 수행합니다. + /// - 배경색을 앱 테마 배경색으로 설정 + /// - 물리 엔진의 중력 설정 + /// - 카메라 초기화 + private func setupScene() { + backgroundColor = UIColor(AppTheme.backgroundColor) + physicsWorld.gravity = Constant.Physics.gravity + + setupCamera() + } + + /// 카메라 노드를 생성하고 초기 위치를 설정합니다. + private func setupCamera() { + let cameraNode = SKCameraNode() + cameraNode.position = CGPoint(x: size.width / 2, y: size.height / 2) + addChild(cameraNode) + camera = cameraNode + } + + /// 게임을 시작하고 초기 상태로 설정합니다. + /// - 블록 배열 초기화 + /// - 게임 코어 시작 처리 + /// - 카메라 위치 리셋 + /// - 초기 블록 배치 및 첫 번째 블록 생성 + func startGame() { + blockViews = [] + currentHeight = 0 + isProcessing = false + + stackGame.startGame() + camera?.position = CGPoint(x: size.width / 2, y: size.height / 2) + + putInitialBlock() + spawnBlock() + } + + /// 게임을 중지하고 모든 진행중인 동작을 멈춥니다. + /// - 게임 코어 중지 처리 + /// - 현재 블록의 모든 액션 제거 + /// - 물리 엔진 정지 + func stopGame() { + stackGame.stopGame() + isProcessing = true + currentBlockView?.removeAllActions() + physicsWorld.speed = 0 + } + + /// 게임 Scene 일시정지 + func pauseGame() { + stackGame.pauseGame() + isGamePaused = true + physicsWorld.speed = 0 + currentBlockView?.removeAllActions() + currentBlockView?.removeFromParent() + currentBlockView = nil + } + + /// 게임 Scene 재개 + func resumeGame() { + stackGame.resumeGame() + isGamePaused = false + physicsWorld.speed = 1 + if currentBlockView == nil { + spawnBlock() + } + } + + /// 게임 시작 시 가장 아래에 배치되는 초기 블록을 생성합니다. + /// - 고정된 물리 바디를 가진 파란색 블록 생성 + /// - 게임 코어에 초기 블록 등록 + private func putInitialBlock() { + let firstBlockView = BlockItem(type: .blue) + firstBlockView.setupPhysicsBody() + firstBlockView.position = CGPoint(x: size.width / 2, y: currentHeight) + + // 게임 코어에 초기 블록 등록 + stackGame.addInitialBlock() + + addChild(firstBlockView) + blockViews.append(firstBlockView) + } + + /// 새로운 블록을 화면 상단에 생성하고 좌우로 움직이게 합니다. + /// - 랜덤한 타입의 블록 생성 + /// - 카메라 기준 상단 위치에서 생성 + /// - 좌우 이동 애니메이션 시작 + private func spawnBlock() { + // 일시정지 상태에서는 동작을 막음 + guard !isGamePaused else { return } + + isProcessing = false + + let blockType = BlockType.allCases.randomElement() ?? .blue + let blockView = BlockItem(type: blockType) + + // 게임 코어에 블록 생성 알림 + stackGame.spawnBlock(type: blockType) + + let spawnY = (camera?.position.y ?? size.height / 2) + size.height / 2 - ( + Constant.Offset.spawnYOffset + blockView.size.height / 2) + let leftEdge = blockView.size.width / 2 + let rightEdge = size.width - blockView.size.width / 2 + + blockView.position = CGPoint(x: leftEdge, y: spawnY) + blockView.startMoving(distance: rightEdge - leftEdge) + + currentBlockView = blockView + addChild(blockView) + } + + /// 현재 블록의 이동을 멈추고 중력을 적용하여 떨어뜨립니다. + /// - 블록의 좌우 이동 중지 + /// - 중력 활성화 + /// - 블록 평가 시작 + private func dropBlock() { + guard let block = currentBlockView else { return } + + isProcessing = true + block.stopMoving() + block.enableGravity() + + // 블록 평가 시작 + evaluateBlock() + } + + /// 떨어지는 블록이 목표 위치에 도달했는지 재귀적으로 확인합니다. + /// - 목표 높이에 도달하면 정렬 체크 수행 + /// - 아직 도달하지 않았으면 일정 시간 후 재확인 + private func evaluateBlock() { + guard + let block = currentBlockView, + let previousBlock = stackGame.previousBlock, + !isPaused + else { return } + + // StackGame의 previousBlock 정보를 사용해 목표 Y 계산 + let targetY = previousBlock.positionY + previousBlock.height + + if block.position.y <= targetY { + // 목표 위치에 도달했으므로 정렬 체크 + // 정렬 성공/실패에 따라 물리 처리를 다르게 적용 + checkAlignmentAndHandle(targetY: targetY) + } else { + // 아직 도달하지 않았으면 재확인 + DispatchQueue.main.asyncAfter(deadline: .now() + Constant.Time.evaluationCheckInterval) { [weak self] in + self?.evaluateBlock() + } + } + } + + /// 정렬을 체크하고 결과에 따라 물리 처리를 다르게 적용합니다. + /// - 성공: 블록 고정 후 배치 + /// - 실패: 물리를 유지하여 자연스럽게 떨어지도록 + private func checkAlignmentAndHandle(targetY: CGFloat) { + guard let block = currentBlockView else { return } + + // 현재 블록 위치를 게임 모델에 업데이트 + stackGame.updateCurrentBlockPosition(positionX: block.position.x, positionY: targetY) + + let isAligned = stackGame.checkAlignment() + + if isAligned { + // 정렬 성공: 블록 고정 + block.fixPosition() + block.physicsBody?.velocity = CGVector.zero + block.physicsBody?.angularVelocity = 0 + block.position = CGPoint(x: block.position.x, y: targetY) + isProcessing = false + + placeBlockSuccess() + } else { + // 정렬 실패: 물리를 유지하여 계속 떨어지도록 + isProcessing = false + placeBlockFail() + } + } + + /// 블록이 성공적으로 배치되었을 때의 처리를 수행합니다. + /// - 폭탄 블록: 패널티 적용 후 블록 제거 + /// - 일반 블록: 스택에 추가, 점수 증가, 보상 적용, 카메라 이동 + private func placeBlockSuccess() { + guard + let block = currentBlockView, + let currentBlock = stackGame.currentBlock, + let previousView = blockViews.last + else { return } + + // 이전 블록의 정확한 위치를 기준으로 배치 + let targetY = previousView.position.y + previousView.size.height + block.position = CGPoint(x: block.position.x, y: targetY) + + // currentHeight 업데이트 + currentHeight = targetY + block.size.height + + // 폭탄 블록 체크 + if currentBlock.type.isBomb { + onBlockDropped(stackGame.placeBombSuccess()) + SoundService.shared.trigger(.bombStack) + HapticService.shared.trigger(.error) + DispatchQueue.main.asyncAfter(deadline: .now() + Constant.Time.bombRemovalDelay) { [weak self] in + block.removeFromParent() + self?.spawnBlock() + } + } else { + blockViews.append(block) + // 코어에 블록 배치 성공 알림 (위치는 이미 업데이트됨) + onBlockDropped(stackGame.placeBlockSuccess()) + SoundService.shared.trigger(.blockStack) + // 카메라 이동 + if let camera = camera { + let newCameraY = camera.position.y + block.size.height + let moveCamera = SKAction.moveTo(y: newCameraY, duration: Constant.Time.cameraMoveAnimationDuration) + moveCamera.timingMode = .easeInEaseOut + camera.run(moveCamera) + } + + DispatchQueue.main.asyncAfter(deadline: .now() + Constant.Time.nextBlockSpawnDelay) { [weak self] in + self?.spawnBlock() + } + } + currentBlockView = nil + } + + /// 블록 배치에 실패했을 때의 처리를 수행합니다. + /// - 폭탄 블록: 실패시 오히려 보상 적용 + /// - 일반 블록: 패널티 적용 + /// - 물리 효과로 떨어지고 화면 밖으로 나가면 제거 + private func placeBlockFail() { + guard + let block = currentBlockView, + let currentBlock = stackGame.currentBlock + else { return } + + // 폭탄 블록 실패 = 보상, 일반 블록 실패 = 패널티 + if currentBlock.type.isBomb { + onBlockDropped(stackGame.placeBombFail()) + SoundService.shared.trigger(.blockDrop) + } else { + onBlockDropped(stackGame.placeBlockFail()) + SoundService.shared.trigger(.blockDrop) + HapticService.shared.trigger(.error) + } + + // 일정 시간 후 블록 제거 및 다음 블록 생성 + DispatchQueue.main.asyncAfter(deadline: .now() + Constant.Time.failedBlockRemovalDelay) { [weak self] in + block.removeFromParent() + self?.spawnBlock() + } + + currentBlockView = nil + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/StackGameView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/StackGameView.swift new file mode 100644 index 00000000..00990a7c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/StackGameView.swift @@ -0,0 +1,169 @@ +// +// StackGameView.swift +// SoloDeveloperTraining +// +// Created by sunjae on 1/15/26. +// + +import SwiftUI +import SpriteKit + +private enum Constant { + static let effectLabelXRatios: [CGFloat] = [0.3, 0.4, 0.7] + static let effectLabelYPositions: [CGFloat] = [150, 200, 250] + + enum Padding { + static let horizontal: CGFloat = 16 + static let toolBarBottom: CGFloat = 10 + } +} + +struct StackGameView: View { + @State private var stackGame: StackGame + @State private var scene: StackGameScene + @State private var effectLabels: [EffectLabelData] = [] + + /// 게임 시작 상태 (부모 뷰와 바인딩) + @Binding var isGameStarted: Bool + @Binding var isGameViewDisappeared: Bool + + init( + user: User, + isGameStarted: Binding, + isGameViewDisappeared: Binding, + animationSystem: CharacterAnimationSystem? = nil + ) { + let stackGame = StackGame(user: user, animationSystem: animationSystem) + self._stackGame = State(initialValue: stackGame) + self._isGameStarted = isGameStarted + self._isGameViewDisappeared = isGameViewDisappeared + + let initialScene = StackGameScene( + stackGame: stackGame, + onBlockDropped: { _ in } + ) + self._isGameStarted = isGameStarted + self._stackGame = State(initialValue: stackGame) + self._scene = State(initialValue: initialScene) + } + + var body: some View { + GeometryReader { geometry in + VStack(spacing: 0) { + // 상단 툴바 (닫기, 아이템 버튼, 피버 게이지) + toolbarSection + // 게임 영역 (SpriteKit 씬, 골드 이펙트) + gameAreaSection + } + .background(AppTheme.backgroundColor) + .navigationBarBackButtonHidden(true) // 임시로 숨김 + .onAppear { + setupGameCallbacks(with: geometry) + } + .pauseGameStyle( + isGameViewDisappeared: $isGameViewDisappeared, + height: geometry.size.height, + onLeave: { handleCloseButton() }, + onPause: { scene.pauseGame() }, + onResume: { scene.resumeGame() } + ) + } + } +} + +// MARK: - View Components +private extension StackGameView { + /// 상단 툴바 + var toolbarSection: some View { + GameToolBar( + closeButtonDidTapHandler: handleCloseButton, + coffeeButtonDidTapHandler: { useConsumableItem(.coffee) }, + energyDrinkButtonDidTapHandler: { useConsumableItem(.energyDrink) }, + feverState: stackGame.feverSystem, + buffSystem: stackGame.buffSystem, + coffeeCount: .constant(stackGame.user.inventory.count(.coffee) ?? 0), + energyDrinkCount: .constant(stackGame.user.inventory.count(.energyDrink) ?? 0) + ) + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.bottom, Constant.Padding.toolBarBottom) + } + + /// 게임 영역 + var gameAreaSection: some View { + ZStack { + SpriteView(scene: scene) + + ForEach(effectLabels) { effectLabel in + EffectLabel( + value: effectLabel.value, + onComplete: { removeEffectLabel(id: effectLabel.id) } + ) + .position(effectLabel.position) + } + } + } +} + +// MARK: - Actions +private extension StackGameView { + /// 닫기 버튼 클릭 처리 + func handleCloseButton() { + stackGame.stopGame() + isGameStarted = false + } + + /// 소비 아이템 사용 처리 + func useConsumableItem(_ type: ConsumableType) { + if stackGame.user.inventory.drink(type) { + SoundService.shared.trigger(.itemConsume) + HapticService.shared.trigger(.success) + stackGame.buffSystem.useConsumableItem(type: type) + stackGame.user.record.record(type == .coffee ? .coffeeUse : .energyDrinkUse) + } + } +} + +// MARK: - Helper Methods +private extension StackGameView { + /// 게임 콜백 설정 + func setupGameCallbacks(with geometry: GeometryProxy) { + scene.onBlockDropped = { gold in + showEffectLabel( + at: CGPoint( + x: geometry.size.width * randomEffectXRatio, + y: randomEffectYOffset + ), + value: gold + ) + } + } + + /// 효과 라벨 추가 + /// - Parameters: + /// - location: 표시할 위치 + /// - value: 표시할 값 + func showEffectLabel(at location: CGPoint, value: Int) { + let labelData = EffectLabelData( + id: UUID(), + position: location, + value: value + ) + effectLabels.append(labelData) + } + + /// 효과 라벨 제거 (애니메이션 완료 시 콜백으로 호출) + /// - Parameter id: 제거할 효과 라벨의 ID + func removeEffectLabel(id: UUID) { + effectLabels.removeAll { $0.id == id } + } + + /// 랜덤 효과 라벨 X 위치 비율 + var randomEffectXRatio: CGFloat { + Constant.effectLabelXRatios.randomElement() ?? 0.4 + } + + /// 랜덤 효과 라벨 Y 오프셋 + var randomEffectYOffset: CGFloat { + Constant.effectLabelYPositions.randomElement() ?? 200 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/TapGameView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/TapGameView.swift new file mode 100644 index 00000000..862deffa --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/TapGameView.swift @@ -0,0 +1,202 @@ +// +// TapGameView.swift +// SoloDeveloperTraining +// +// Created by 김성훈 on 1/14/26. +// + +import SwiftUI + +private enum Constant { + enum Padding { + static let horizontal: CGFloat = 16 + static let toolBarBottom: CGFloat = 10 + } + /// 탭 사운드 최소 재생 간격 (초) + static let tapSoundThrottleInterval: TimeInterval = 0.05 +} + +struct TapGameView: View { + // MARK: - Properties + /// 게임 시작 상태 (부모 뷰와 바인딩) + @Binding var isGameStarted: Bool + @Binding var isGameViewDisappeared: Bool + + // MARK: - State + /// 의존 게임 + @State private var tapGame: TapGame + /// 터치한 위치에 표시될 EffectLabel들의 위치와 값 + @State private var effectLabels: [EffectLabelData] = [] + /// 탭 사운드 쓰로틀용 마지막 재생 시각 + @State private var lastTapSoundTime: Date = .distantPast + + init( + user: User, + isGameStarted: Binding, + isGameViewDisappeared: Binding, + animationSystem: CharacterAnimationSystem? + ) { + let tapGame = TapGame( + user: user, + buffSystem: BuffSystem(), + animationSystem: animationSystem + ) + self._tapGame = State(initialValue: tapGame) + self._isGameStarted = isGameStarted + self._isGameViewDisappeared = isGameViewDisappeared + self.tapGame.startGame() + } + + var body: some View { + GeometryReader { geometry in + VStack(spacing: 0) { + // 상단 툴바 (닫기, 아이템 버튼, 피버 게이지) + toolbarSection + // 터치 가능한 게임 영역 + tapAreaSection(geometry: geometry) + } + .pauseGameStyle( + isGameViewDisappeared: $isGameViewDisappeared, + height: geometry.size.height, + onLeave: { handleCloseButton() }, + onPause: { + tapGame.pauseGame() + SoundService.shared.stopAllSFX() + lastTapSoundTime = .distantPast + }, + onResume: { tapGame.resumeGame() } + ) + } + } +} + +// MARK: - View Components +private extension TapGameView { + /// 상단 툴바 + var toolbarSection: some View { + GameToolBar( + closeButtonDidTapHandler: handleCloseButton, + coffeeButtonDidTapHandler: { useConsumableItem(.coffee) }, + energyDrinkButtonDidTapHandler: { useConsumableItem(.energyDrink) }, + feverState: tapGame.feverSystem, + buffSystem: tapGame.buffSystem, + coffeeCount: Binding( + get: { tapGame.inventory.count(.coffee) ?? 0 }, + set: { _ in } + ), + energyDrinkCount: Binding( + get: { tapGame.inventory.count(.energyDrink) ?? 0 }, + set: { _ in } + ) + ) + .padding(.horizontal, Constant.Padding.horizontal) + .padding(.bottom, Constant.Padding.toolBarBottom) + } + + /// 터치 가능한 게임 영역 + func tapAreaSection(geometry: GeometryProxy) -> some View { + ZStack { + // 배경 이미지 + Image(.tapBackground) + .resizable() + .aspectRatio(contentMode: .fill) + + // 효과 라벨들 + ForEach(effectLabels) { effectLabel in + EffectLabel( + value: effectLabel.value, + onComplete: { removeEffectLabel(id: effectLabel.id) } + ) + .position(effectLabel.position) + } + + // 멀티터치 뷰 + MultiTouchView { location in + Task { await handleTap(at: location) } + } + } + } +} + +// MARK: - Actions +private extension TapGameView { + /// 닫기 버튼 클릭 처리 + func handleCloseButton() { + tapGame.stopGame() + isGameStarted = false + } + + /// 터치 이벤트 처리 + /// - Parameter location: 터치한 위치 + @MainActor + func handleTap(at location: CGPoint) async { + let now = Date() + if !tapGame.isPaused, + now.timeIntervalSince(lastTapSoundTime) >= Constant.tapSoundThrottleInterval { + SoundService.shared.trigger(.tapGameTyping) + lastTapSoundTime = now + } + let gainGold = await tapGame.didPerformAction() + showEffectLabel(at: location, value: gainGold) + } + + /// 소비 아이템 사용 처리 + func useConsumableItem(_ type: ConsumableType) { + if tapGame.inventory.drink(type) { + SoundService.shared.trigger(.itemConsume) + HapticService.shared.trigger(.success) + tapGame.buffSystem.useConsumableItem(type: type) + tapGame.user.record.record(type == .coffee ? .coffeeUse : .energyDrinkUse) + } + } +} + +// MARK: - Helper Methods +private extension TapGameView { + /// 터치 위치에 효과 라벨 추가 + /// - Parameters: + /// - location: 터치한 위치 + /// - value: 표시할 값 + func showEffectLabel(at location: CGPoint, value: Int) { + let labelData = EffectLabelData( + id: UUID(), + position: location, + value: value + ) + effectLabels.append(labelData) + } + + /// 효과 라벨 제거 (애니메이션 완료 시 콜백으로 호출) + /// - Parameter id: 제거할 효과 라벨의 ID + func removeEffectLabel(id: UUID) { + effectLabels.removeAll { $0.id == id } + } +} + +#Preview { + @Previewable @State var isGameStarted: Bool = true + @Previewable @State var isGameViewDisappeared: Bool = true + + let user = User( + nickname: "Preview User", + wallet: Wallet(gold: 10000, diamond: 50), + inventory: Inventory( + consumableItems: [ + Consumable(type: .coffee, count: 5), + Consumable(type: .energyDrink, count: 3) + ] + ), + record: Record(), + skills: [ + Skill(key: SkillKey(game: .tap, tier: .beginner), level: 10), + Skill(key: SkillKey(game: .tap, tier: .intermediate), level: 5) + ] + ) + + TapGameView( + user: user, + isGameStarted: $isGameStarted, + isGameViewDisappeared: $isGameViewDisappeared, + animationSystem: nil + ) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/WorkSelectedView.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/WorkSelectedView.swift new file mode 100644 index 00000000..a6cd2209 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Presentation/WorkSelectedView.swift @@ -0,0 +1,251 @@ +// +// WorkSelectedView.swift +// SoloDeveloperTraining +// +// Created by SeoJunYoung on 1/15/26. +// + +import SwiftUI + +private enum Constant { + enum Padding { + static let horizontal: CGFloat = 16 + static let selectionViewBottom: CGFloat = 30 + } + + enum UserDefaults { + static let lastSelectedWorkIndexKey = "lastSelectedWorkIndex" + } + + enum Description { + static let tapGame = "모니터를 최대한 많이 누르세요." + static let languageGame = "올바른 버튼을 누르세요." + static let dodgeGame = "기기를 기울여 버그를 피하고 골드를 획득하세요." + static let stackGame = "최대한 높은 데이터를 쌓으세요." + } + + static let contentSpacing: CGFloat = 17 + static let descriptionSpacing: CGFloat = 10 +} + +struct WorkSelectedView: View { + + let user: User + let animationSystem: CharacterAnimationSystem? + @State var selectedIndex: Int = 0 + @State var workItems: [WorkItem] = [] + @State private var showToast: Bool = false + @State private var toastMessage: String = "" + @Binding var isGameStarted: Bool + @Binding var isGameViewDisappeared: Bool + @Binding var careerSystem: CareerSystem? + + private let localStorage: KeyValueLocalStorage = UserDefaultsStorage() + + init( + user: User, + animationSystem: CharacterAnimationSystem?, + isGameStarted: Binding, + isGameViewDisappeared: Binding, + careerSystem: Binding + ) { + self.user = user + self.animationSystem = animationSystem + self._isGameStarted = isGameStarted + self._isGameViewDisappeared = isGameViewDisappeared + self._careerSystem = careerSystem + } + + var body: some View { + Group { + if isGameStarted { + gameView(for: selectedIndex) + } else { + selectionView + } + } + .onAppear { + workItems = createWorkItems(career: careerSystem?.currentCareer) + loadLastSelectedIndex() + } + .onChange(of: selectedIndex) { _, newValue in + saveLastSelectedIndex(newValue) + } + .onChange(of: careerSystem?.currentCareer) { _, newValue in + workItems = createWorkItems(career: newValue) + } + } +} + +// MARK: - Subviews +private extension WorkSelectedView { + + var selectionView: some View { + VStack(spacing: Constant.contentSpacing) { + workSegmentControl + descriptionStack + Spacer() + startButton + } + .padding(.horizontal, Constant.Padding.horizontal) + .toast(isShowing: $showToast, message: toastMessage) + } + + var workSegmentControl: some View { + WorkSegmentControl( + items: workItems, + onLockedTap: { requiredCareer in + toastMessage = "\(requiredCareer.rawValue)부터 플레이할 수 있습니다." + showToast = true + } + , selectedIndex: $selectedIndex + ) + } + + var descriptionStack: some View { + VStack(alignment: .leading, spacing: Constant.descriptionSpacing) { + Text(actionDescription(for: selectedIndex)) + .foregroundStyle(.gray300) + .textStyle(.subheadline) + .frame(maxWidth: .infinity, alignment: .leading) + } + } + + var startButton: some View { + LargeButton(title: "시작하기") { + isGameStarted = true + } + .frame(maxWidth: .infinity, alignment: .bottom) + .padding(.bottom, Constant.Padding.selectionViewBottom) + } +} + +// MARK: - Helper +private extension WorkSelectedView { + + func createWorkItems(career: Career?) -> [WorkItem] { + let currentCareer = career ?? .unemployed + let currentWealth = currentCareer.requiredWealth + + let tapUnlocked = currentWealth >= Policy.Career.GameUnlock.tap + let languageUnlocked = currentWealth >= Policy.Career.GameUnlock.language + let dodgeUnlocked = currentWealth >= Policy.Career.GameUnlock.dodge + let stackUnlocked = currentWealth >= Policy.Career.GameUnlock.stack + + return [ + .init( + title: "코드짜기", + imageName: GameType.tap.imageName, + isDisabled: !tapUnlocked, + requiredCareer: findCareer(for: Policy.Career.GameUnlock.tap) + ), + .init( + title: "언어 맞추기", + imageName: GameType.language.imageName, + isDisabled: !languageUnlocked, + requiredCareer: findCareer(for: Policy.Career.GameUnlock.language) + ), + .init( + title: "버그 피하기", + imageName: GameType.dodge.imageName, + isDisabled: !dodgeUnlocked, + requiredCareer: findCareer(for: Policy.Career.GameUnlock.dodge) + ), + .init( + title: "데이터 쌓기", + imageName: GameType.stack.imageName, + isDisabled: !stackUnlocked, + requiredCareer: findCareer(for: Policy.Career.GameUnlock.stack) + ) + ] + } + + func findCareer(for requiredWealth: Int) -> Career? { + return Career.allCases.first { $0.requiredWealth == requiredWealth } + } + + @ViewBuilder + func gameView(for index: Int) -> some View { + switch index { + case 0: + TapGameView( + user: user, + isGameStarted: $isGameStarted, + isGameViewDisappeared: $isGameViewDisappeared, + animationSystem: animationSystem + ) + case 1: + LanguageGameView( + user: user, + isGameStarted: $isGameStarted, + isGameViewDisappeared: $isGameViewDisappeared, + animationSystem: animationSystem + ) + case 2: + DodgeGameView( + user: user, + isGameStarted: $isGameStarted, + isGameViewDisappeared: $isGameViewDisappeared, + animationSystem: animationSystem + ) + case 3: + StackGameView( + user: user, + isGameStarted: $isGameStarted, + isGameViewDisappeared: $isGameViewDisappeared, + animationSystem: animationSystem + ) + default: + EmptyView() + } + } + + func actionDescription(for index: Int) -> String { + switch index { + case 0: + return Constant.Description.tapGame + case 1: + return Constant.Description.languageGame + case 2: + return Constant.Description.dodgeGame + case 3: + return Constant.Description.stackGame + default: + return "" + } + } + + func loadLastSelectedIndex() { + let savedIndex = localStorage.integer(key: Constant.UserDefaults.lastSelectedWorkIndexKey) + if savedIndex >= 0 && savedIndex < workItems.count { + selectedIndex = savedIndex + } else { + selectedIndex = 0 + } + } + + func saveLastSelectedIndex(_ index: Int) { + localStorage.set(index, forKey: Constant.UserDefaults.lastSelectedWorkIndexKey) + } +} + +#Preview { + @Previewable @State var isGameStarted = false + @Previewable @State var isGameViewDisappeared = false + @Previewable @State var careerSystem: CareerSystem? = nil + + let user = User( + nickname: "Test", + wallet: .init(), + inventory: .init(), + record: .init() + ) + + WorkSelectedView( + user: user, + animationSystem: nil, + isGameStarted: $isGameStarted, + isGameViewDisappeared: $isGameViewDisappeared, + careerSystem: $careerSystem + ) +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Production/Utility/Validator.swift b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Utility/Validator.swift new file mode 100644 index 00000000..0d692afd --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Production/Utility/Validator.swift @@ -0,0 +1,71 @@ +// +// Validator.swift +// SoloDeveloperTraining +// +// Created by 최범수 on 2026-01-21. +// + +import Foundation + +enum ValidationResult { + case empty + case valid + case invalid(String) +} + +private enum Constant { + static let pattern: String = "^[가-힣a-zA-Z0-9]+$" + + enum Length { + static let min: Int = 2 + static let max: Int = 7 + } + + enum Text { + static let invalidCharacter = "한글, 숫자, 영어만 사용 가능하며 공백은 사용할 수 없습니다." + static let tooShort = "닉네임은 최소 \(Length.min)자 이상이어야 합니다." + static let tooLong = "닉네임은 최대 \(Length.max)자까지 입력 가능합니다." + } +} + +final class Validator { + private var nicknameRegex: NSRegularExpression? { + try? NSRegularExpression(pattern: Constant.pattern, options: []) + } + + /// 닉네임을 검증하고 결과를 반환합니다. + func validate(_ nickname: String) -> ValidationResult { + if nickname.isEmpty { + return .empty + } + + // 한글, 숫자, 영어만 허용 (공백 불가) + guard let regex = nicknameRegex, + regex.firstMatch(in: nickname, options: [], range: NSRange(location: 0, length: nickname.utf16.count)) != nil + else { + return .invalid(Constant.Text.invalidCharacter) + } + + if nickname.count < Constant.Length.min { + return .invalid(Constant.Text.tooShort) + } + + if nickname.count > Constant.Length.max { + return .invalid(Constant.Text.tooLong) + } + + return .valid + } + + /// 닉네임이 유효한지 확인합니다. + func isValid(_ nickname: String) -> Bool { + // 한글, 숫자, 영어만 허용 (공백 불가) + guard let regex = nicknameRegex, + regex.firstMatch(in: nickname, options: [], range: NSRange(location: 0, length: nickname.utf16.count)) != nil + else { + return false + } + + return nickname.count >= Constant.Length.min && nickname.count <= Constant.Length.max && !nickname.isEmpty + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentColor.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..274babba --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentGreen.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentGreen.colorset/Contents.json new file mode 100644 index 00000000..6996c6e7 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentGreen.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x55", + "green" : "0xB7", + "red" : "0x59" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x55", + "green" : "0xB7", + "red" : "0x59" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentRed.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentRed.colorset/Contents.json new file mode 100644 index 00000000..5b16437d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentRed.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2F", + "green" : "0x2F", + "red" : "0xD3" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2F", + "green" : "0x2F", + "red" : "0xD3" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentYellow.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentYellow.colorset/Contents.json new file mode 100644 index 00000000..e6938a59 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/AccentYellow.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2D", + "green" : "0xC0", + "red" : "0xFB" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2D", + "green" : "0xC0", + "red" : "0xFB" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige100.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige100.colorset/Contents.json new file mode 100644 index 00000000..c1b9a9d4 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige100.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF0", + "green" : "0xF9", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF0", + "green" : "0xF9", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige200.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige200.colorset/Contents.json new file mode 100644 index 00000000..09de815f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige200.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE3", + "green" : "0xED", + "red" : "0xF4" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE3", + "green" : "0xED", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige300.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige300.colorset/Contents.json new file mode 100644 index 00000000..ae777ee4 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige300.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD5", + "green" : "0xE1", + "red" : "0xEE" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD5", + "green" : "0xE1", + "red" : "0xEE" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige400.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige400.colorset/Contents.json new file mode 100644 index 00000000..fbf34f2a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Beige400.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xA3", + "green" : "0xAE", + "red" : "0xBC" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xA3", + "green" : "0xAE", + "red" : "0xBC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray100.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray100.colorset/Contents.json new file mode 100644 index 00000000..18d09c3b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray100.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xDC", + "green" : "0xDC", + "red" : "0xDC" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xDC", + "green" : "0xDC", + "red" : "0xDC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray200.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray200.colorset/Contents.json new file mode 100644 index 00000000..3ab4aeb1 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray200.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xB4", + "red" : "0xB4" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xB4", + "red" : "0xB4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray300.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray300.colorset/Contents.json new file mode 100644 index 00000000..7ebc6ad1 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray300.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x8E", + "green" : "0x8E", + "red" : "0x8E" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x8E", + "green" : "0x8E", + "red" : "0x8E" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray400.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray400.colorset/Contents.json new file mode 100644 index 00000000..af3f890a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray400.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x6A", + "green" : "0x6A", + "red" : "0x6A" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x6A", + "green" : "0x6A", + "red" : "0x6A" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray500.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray500.colorset/Contents.json new file mode 100644 index 00000000..09168b3a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray500.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x48", + "green" : "0x48", + "red" : "0x48" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x48", + "green" : "0x48", + "red" : "0x48" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray600.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray600.colorset/Contents.json new file mode 100644 index 00000000..71930475 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray600.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x28", + "green" : "0x28", + "red" : "0x28" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x28", + "green" : "0x28", + "red" : "0x28" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray700.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray700.colorset/Contents.json new file mode 100644 index 00000000..f9d5e17f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Gray700.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x11", + "green" : "0x11", + "red" : "0x11" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x11", + "green" : "0x11", + "red" : "0x11" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/LightGreen.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/LightGreen.colorset/Contents.json new file mode 100644 index 00000000..54587806 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/LightGreen.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x48", + "green" : "0xFF", + "red" : "0x4E" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x48", + "green" : "0xFF", + "red" : "0x4E" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/LightOrange.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/LightOrange.colorset/Contents.json new file mode 100644 index 00000000..f01c8e45 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/LightOrange.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x7C", + "red" : "0xF5" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x7C", + "red" : "0xF5" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange100.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange100.colorset/Contents.json new file mode 100644 index 00000000..e94797aa --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange100.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xCF", + "green" : "0xD8", + "red" : "0xF9" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xCF", + "green" : "0xD8", + "red" : "0xF9" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange200.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange200.colorset/Contents.json new file mode 100644 index 00000000..e3e0255e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange200.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x87", + "green" : "0xA4", + "red" : "0xF3" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x87", + "green" : "0xA4", + "red" : "0xF3" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange300.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange300.colorset/Contents.json new file mode 100644 index 00000000..346cf4c0 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange300.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x77", + "red" : "0xD9" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x77", + "red" : "0xD9" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange400.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange400.colorset/Contents.json new file mode 100644 index 00000000..4361175e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange400.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x30", + "green" : "0x59", + "red" : "0xA4" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x30", + "green" : "0x59", + "red" : "0xA4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange500.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange500.colorset/Contents.json new file mode 100644 index 00000000..ea9d1af5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange500.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1E", + "green" : "0x3C", + "red" : "0x72" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1E", + "green" : "0x3C", + "red" : "0x72" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange600.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange600.colorset/Contents.json new file mode 100644 index 00000000..522b0e97 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange600.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x0E", + "green" : "0x21", + "red" : "0x44" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange700.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange700.colorset/Contents.json new file mode 100644 index 00000000..55c35845 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/Orange700.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x04", + "green" : "0x0C", + "red" : "0x1F" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x04", + "green" : "0x0C", + "red" : "0x1F" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelBlue.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelBlue.colorset/Contents.json new file mode 100644 index 00000000..e5102683 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelBlue.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF8", + "green" : "0xCF", + "red" : "0xC7" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF8", + "green" : "0xCF", + "red" : "0xC7" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelGreen.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelGreen.colorset/Contents.json new file mode 100644 index 00000000..5bc8e2f8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelGreen.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xBC", + "green" : "0xF8", + "red" : "0xB0" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xBC", + "green" : "0xF8", + "red" : "0xB0" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelPink.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelPink.colorset/Contents.json new file mode 100644 index 00000000..ca7ee4ab --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelPink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0x9A", + "red" : "0xF6" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0x9A", + "red" : "0xF6" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelYellow.colorset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelYellow.colorset/Contents.json new file mode 100644 index 00000000..f4ebbd1e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/AppColors/PastelYellow.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x9A", + "green" : "0xDF", + "red" : "0xFA" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x9A", + "green" : "0xDF", + "red" : "0xFA" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character1.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character1.imageset/Contents.json new file mode 100644 index 00000000..061375da --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "dodge_character1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character1.imageset/dodge_character1.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character1.imageset/dodge_character1.png new file mode 100644 index 00000000..1105375f Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character1.imageset/dodge_character1.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character2.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character2.imageset/Contents.json new file mode 100644 index 00000000..86f6b032 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "dodge_character2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character2.imageset/dodge_character2.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character2.imageset/dodge_character2.png new file mode 100644 index 00000000..5917214e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character2.imageset/dodge_character2.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character3.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character3.imageset/Contents.json new file mode 100644 index 00000000..fc496672 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "dodge_character3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character3.imageset/dodge_character3.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character3.imageset/dodge_character3.png new file mode 100644 index 00000000..96670027 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_character3.imageset/dodge_character3.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_bug.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_bug.imageset/Contents.json new file mode 100644 index 00000000..cd25626b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_bug.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "dropItemError.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_bug.imageset/dropItemError.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_bug.imageset/dropItemError.png new file mode 100644 index 00000000..17d681a5 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_bug.imageset/dropItemError.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_large_gold.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_large_gold.imageset/Contents.json new file mode 100644 index 00000000..a4c41a18 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_large_gold.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "dropItemLargeGold.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_large_gold.imageset/dropItemLargeGold.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_large_gold.imageset/dropItemLargeGold.png new file mode 100644 index 00000000..39d70c7c Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_large_gold.imageset/dropItemLargeGold.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_small_gold.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_small_gold.imageset/Contents.json new file mode 100644 index 00000000..5c5d7d59 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_small_gold.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "dropItemSmallGold.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_small_gold.imageset/dropItemSmallGold.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_small_gold.imageset/dropItemSmallGold.png new file mode 100644 index 00000000..0594f736 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_drop_small_gold.imageset/dropItemSmallGold.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_ground.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_ground.imageset/Contents.json new file mode 100644 index 00000000..bda8fab8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_ground.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "dodge_ground.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_ground.imageset/dodge_ground.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_ground.imageset/dodge_ground.png new file mode 100644 index 00000000..990e1342 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Dodge/dodge_ground.imageset/dodge_ground.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_dart.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_dart.imageset/Contents.json new file mode 100644 index 00000000..420745f0 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_dart.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "language_dart@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_dart.imageset/language_dart@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_dart.imageset/language_dart@2x.png new file mode 100644 index 00000000..7691b743 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_dart.imageset/language_dart@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_kotlin.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_kotlin.imageset/Contents.json new file mode 100644 index 00000000..2c4a0bbd --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_kotlin.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "language_kotlin@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_kotlin.imageset/language_kotlin@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_kotlin.imageset/language_kotlin@2x.png new file mode 100644 index 00000000..c37e2310 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_kotlin.imageset/language_kotlin@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_python.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_python.imageset/Contents.json new file mode 100644 index 00000000..5dae1ac0 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_python.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "language_python@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_python.imageset/language_python@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_python.imageset/language_python@2x.png new file mode 100644 index 00000000..35117422 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_python.imageset/language_python@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_swift.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_swift.imageset/Contents.json new file mode 100644 index 00000000..c9407c60 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_swift.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "language_swift@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_swift.imageset/language_swift@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_swift.imageset/language_swift@2x.png new file mode 100644 index 00000000..c960b57d Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Language/language_swift.imageset/language_swift@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_bronze.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_bronze.imageset/Contents.json new file mode 100644 index 00000000..2338ebb2 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_bronze.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mission_trophy_bronze@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_bronze.imageset/mission_trophy_bronze@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_bronze.imageset/mission_trophy_bronze@2x.png new file mode 100644 index 00000000..ff779b4f Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_bronze.imageset/mission_trophy_bronze@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_gold.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_gold.imageset/Contents.json new file mode 100644 index 00000000..d5811d97 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_gold.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mission_trophy_gold@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_gold.imageset/mission_trophy_gold@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_gold.imageset/mission_trophy_gold@2x.png new file mode 100644 index 00000000..8f2ba60c Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_gold.imageset/mission_trophy_gold@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_silver.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_silver.imageset/Contents.json new file mode 100644 index 00000000..f2231c3e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_silver.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mission_trophy_silver@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_silver.imageset/mission_trophy_silver@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_silver.imageset/mission_trophy_silver@2x.png new file mode 100644 index 00000000..b7f76371 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_silver.imageset/mission_trophy_silver@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_special.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_special.imageset/Contents.json new file mode 100644 index 00000000..a4a0ff0a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_special.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mission_trophy_special@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_special.imageset/mission_trophy_special@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_special.imageset/mission_trophy_special@2x.png new file mode 100644 index 00000000..46f78e71 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Mission/mission_trophy_special.imageset/mission_trophy_special@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_face.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_face.imageset/Contents.json new file mode 100644 index 00000000..fe47524b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_face.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "quiz_dog_face@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_face.imageset/quiz_dog_face@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_face.imageset/quiz_dog_face@2x.png new file mode 100644 index 00000000..9f681523 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_face.imageset/quiz_dog_face@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_foot.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_foot.imageset/Contents.json new file mode 100644 index 00000000..155f4c8d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_foot.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "quiz_dog_foot@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_foot.imageset/quiz_dog_foot@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_foot.imageset/quiz_dog_foot@2x.png new file mode 100644 index 00000000..9e468513 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Quiz/quiz_dog_foot.imageset/quiz_dog_foot@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_blue.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_blue.imageset/Contents.json new file mode 100644 index 00000000..a90b2269 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_blue.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "block_blue.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_blue.imageset/block_blue.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_blue.imageset/block_blue.png new file mode 100644 index 00000000..be673954 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_blue.imageset/block_blue.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb.imageset/Contents.json new file mode 100644 index 00000000..d0132c92 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "block_bomb.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb.imageset/block_bomb.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb.imageset/block_bomb.png new file mode 100644 index 00000000..1d5940c5 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb.imageset/block_bomb.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb2.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb2.imageset/Contents.json new file mode 100644 index 00000000..7a827890 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "block_bomb2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb2.imageset/block_bomb2.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb2.imageset/block_bomb2.png new file mode 100644 index 00000000..24d09174 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_bomb2.imageset/block_bomb2.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_green.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_green.imageset/Contents.json new file mode 100644 index 00000000..53113fd5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_green.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "block_green.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_green.imageset/block_green.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_green.imageset/block_green.png new file mode 100644 index 00000000..a4e76e10 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_green.imageset/block_green.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_orange.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_orange.imageset/Contents.json new file mode 100644 index 00000000..32c3996a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_orange.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "block_orange.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_orange.imageset/block_orange.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_orange.imageset/block_orange.png new file mode 100644 index 00000000..9b71b589 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_orange.imageset/block_orange.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_purple.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_purple.imageset/Contents.json new file mode 100644 index 00000000..fcdef825 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_purple.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "block_purple.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_purple.imageset/block_purple.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_purple.imageset/block_purple.png new file mode 100644 index 00000000..63d3d376 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_purple.imageset/block_purple.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_red.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_red.imageset/Contents.json new file mode 100644 index 00000000..966e3a26 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_red.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "block_red.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_red.imageset/block_red.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_red.imageset/block_red.png new file mode 100644 index 00000000..4e7ef8d8 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_red.imageset/block_red.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_yellow.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_yellow.imageset/Contents.json new file mode 100644 index 00000000..7c59ed1c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_yellow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "block_yellow.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_yellow.imageset/block_yellow.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_yellow.imageset/block_yellow.png new file mode 100644 index 00000000..fc99beda Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Stack/stack_block_yellow.imageset/block_yellow.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Tap/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Tap/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Tap/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Tap/tap_background.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Tap/tap_background.imageset/Contents.json new file mode 100644 index 00000000..0f4265b6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Tap/tap_background.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "background_tapGame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Tap/tap_background.imageset/background_tapGame@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Tap/tap_background.imageset/background_tapGame@2x.png new file mode 100644 index 00000000..a489a7bb Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Game/Tap/tap_background.imageset/background_tapGame@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_apartment.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_apartment.imageset/Contents.json new file mode 100644 index 00000000..19784b23 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_apartment.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "housing_apartment.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_apartment.imageset/housing_apartment.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_apartment.imageset/housing_apartment.png new file mode 100644 index 00000000..cd98d8f4 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_apartment.imageset/housing_apartment.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_house.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_house.imageset/Contents.json new file mode 100644 index 00000000..435981bf --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_house.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "housing_house.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_house.imageset/housing_house.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_house.imageset/housing_house.png new file mode 100644 index 00000000..2ba67833 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_house.imageset/housing_house.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_pentHouse.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_pentHouse.imageset/Contents.json new file mode 100644 index 00000000..24c153e3 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_pentHouse.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "housing_pentHouse.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_pentHouse.imageset/housing_pentHouse.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_pentHouse.imageset/housing_pentHouse.png new file mode 100644 index 00000000..2288ebfa Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_pentHouse.imageset/housing_pentHouse.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_rooftop.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_rooftop.imageset/Contents.json new file mode 100644 index 00000000..984787b7 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_rooftop.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "housing_rooftop.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_rooftop.imageset/housing_rooftop.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_rooftop.imageset/housing_rooftop.png new file mode 100644 index 00000000..7b9ffec6 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_rooftop.imageset/housing_rooftop.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_semiBasement.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_semiBasement.imageset/Contents.json new file mode 100644 index 00000000..e8da3e2f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_semiBasement.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "housing_semiBasement.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_semiBasement.imageset/housing_semiBasement.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_semiBasement.imageset/housing_semiBasement.png new file mode 100644 index 00000000..3a97fed0 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_semiBasement.imageset/housing_semiBasement.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_street.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_street.imageset/Contents.json new file mode 100644 index 00000000..bb227808 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_street.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "housing_street.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_street.imageset/housing_street.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_street.imageset/housing_street.png new file mode 100644 index 00000000..b35c32e2 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_street.imageset/housing_street.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_villa.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_villa.imageset/Contents.json new file mode 100644 index 00000000..15ec5ec4 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_villa.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "housing_villa.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_villa.imageset/housing_villa.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_villa.imageset/housing_villa.png new file mode 100644 index 00000000..69fcfab5 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Housing/housing_villa.imageset/housing_villa.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_cancel.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_cancel.imageset/Contents.json new file mode 100644 index 00000000..6aa30ea2 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_cancel.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Gemini_Generated_Image_ppwnj4ppwnj4ppwn-Photoroom 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_cancel.imageset/Gemini_Generated_Image_ppwnj4ppwnj4ppwn-Photoroom 1@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_cancel.imageset/Gemini_Generated_Image_ppwnj4ppwnj4ppwn-Photoroom 1@2x.png new file mode 100644 index 00000000..717ff453 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_cancel.imageset/Gemini_Generated_Image_ppwnj4ppwnj4ppwn-Photoroom 1@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_close.imageset/Contents.json new file mode 100644 index 00000000..90432ad5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_close.imageset/close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_close.imageset/close.png new file mode 100644 index 00000000..2e444534 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_close.imageset/close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coffee.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coffee.imageset/Contents.json new file mode 100644 index 00000000..0ff63661 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coffee.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "coffee.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coffee.imageset/coffee.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coffee.imageset/coffee.png new file mode 100644 index 00000000..958c8f77 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coffee.imageset/coffee.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_bag.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_bag.imageset/Contents.json new file mode 100644 index 00000000..81a13d6f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_bag.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_coin_bag@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_bag.imageset/icon_coin_bag@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_bag.imageset/icon_coin_bag@2x.png new file mode 100644 index 00000000..70d40c79 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_bag.imageset/icon_coin_bag@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_stack.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_stack.imageset/Contents.json new file mode 100644 index 00000000..7de9e89a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_stack.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_coin_stack.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_stack.imageset/icon_coin_stack.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_stack.imageset/icon_coin_stack.png new file mode 100644 index 00000000..74a15da9 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_coin_stack.imageset/icon_coin_stack.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_green.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_green.imageset/Contents.json new file mode 100644 index 00000000..125d5a9a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_green.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_diamond_green@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_green.imageset/icon_diamond_green@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_green.imageset/icon_diamond_green@2x.png new file mode 100644 index 00000000..6ac17e4b Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_green.imageset/icon_diamond_green@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_plus.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_plus.imageset/Contents.json new file mode 100644 index 00000000..a7c214e6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_plus.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_diamond_plus.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_plus.imageset/icon_diamond_plus.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_plus.imageset/icon_diamond_plus.png new file mode 100644 index 00000000..66e593d2 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_diamond_plus.imageset/icon_diamond_plus.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_energy_drink.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_energy_drink.imageset/Contents.json new file mode 100644 index 00000000..ac827ca6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_energy_drink.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "energyDrink.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_energy_drink.imageset/energyDrink.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_energy_drink.imageset/energyDrink.png new file mode 100644 index 00000000..2661371d Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_energy_drink.imageset/energyDrink.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_lock.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_lock.imageset/Contents.json new file mode 100644 index 00000000..06b999aa --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_lock.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "lock.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_lock.imageset/lock.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_lock.imageset/lock.png new file mode 100644 index 00000000..f18eb180 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_lock.imageset/lock.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_minus.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_minus.imageset/Contents.json new file mode 100644 index 00000000..84a4bae8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_minus.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "minus.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_minus.imageset/minus.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_minus.imageset/minus.png new file mode 100644 index 00000000..6ca92687 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_minus.imageset/minus.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_mission.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_mission.imageset/Contents.json new file mode 100644 index 00000000..a19280c3 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_mission.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle 245-3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_mission.imageset/Rectangle 245-3.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_mission.imageset/Rectangle 245-3.png new file mode 100644 index 00000000..e150f213 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_mission.imageset/Rectangle 245-3.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_new_badge.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_new_badge.imageset/Contents.json new file mode 100644 index 00000000..ef2f6dde --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_new_badge.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_new_badge@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_new_badge.imageset/icon_new_badge@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_new_badge.imageset/icon_new_badge@2x.png new file mode 100644 index 00000000..fa193a6a Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_new_badge.imageset/icon_new_badge@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_play.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_play.imageset/Contents.json new file mode 100644 index 00000000..fa6ee137 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_play.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Gemini_Generated_Image_ppwnj4ppwnj4ppwn-Photoroom 2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_play.imageset/Gemini_Generated_Image_ppwnj4ppwnj4ppwn-Photoroom 2@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_play.imageset/Gemini_Generated_Image_ppwnj4ppwnj4ppwn-Photoroom 2@2x.png new file mode 100644 index 00000000..57fdfc3d Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_play.imageset/Gemini_Generated_Image_ppwnj4ppwnj4ppwn-Photoroom 2@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_plus.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_plus.imageset/Contents.json new file mode 100644 index 00000000..52e243f5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_plus.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "add.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_plus.imageset/add.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_plus.imageset/add.png new file mode 100644 index 00000000..11d0a648 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_plus.imageset/add.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_setting.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_setting.imageset/Contents.json new file mode 100644 index 00000000..5ff478a0 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_setting.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_setting.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_setting.imageset/icon_setting.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_setting.imageset/icon_setting.png new file mode 100644 index 00000000..5f66f3fb Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_setting.imageset/icon_setting.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_shop.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_shop.imageset/Contents.json new file mode 100644 index 00000000..06f184ff --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_shop.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle 245-2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_shop.imageset/Rectangle 245-2.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_shop.imageset/Rectangle 245-2.png new file mode 100644 index 00000000..55837b28 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_shop.imageset/Rectangle 245-2.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_skill.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_skill.imageset/Contents.json new file mode 100644 index 00000000..b4aabe09 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_skill.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle 245-1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_skill.imageset/Rectangle 245-1.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_skill.imageset/Rectangle 245-1.png new file mode 100644 index 00000000..e2b23a84 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_skill.imageset/Rectangle 245-1.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_work.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_work.imageset/Contents.json new file mode 100644 index 00000000..f0b85321 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_work.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle 245.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_work.imageset/Rectangle 245.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_work.imageset/Rectangle 245.png new file mode 100644 index 00000000..3f0b83c6 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Icons/icon_work.imageset/Rectangle 245.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_broken.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_broken.imageset/Contents.json new file mode 100644 index 00000000..d791335e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_broken.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_chair_broken.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_broken.imageset/item_chair_broken.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_broken.imageset/item_chair_broken.png new file mode 100644 index 00000000..bfc63adb Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_broken.imageset/item_chair_broken.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_cheap.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_cheap.imageset/Contents.json new file mode 100644 index 00000000..53107657 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_cheap.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_chair_cheap.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_cheap.imageset/item_chair_cheap.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_cheap.imageset/item_chair_cheap.png new file mode 100644 index 00000000..5d9ef74e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_cheap.imageset/item_chair_cheap.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_decent.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_decent.imageset/Contents.json new file mode 100644 index 00000000..c4f155b1 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_decent.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_chair_decent.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_decent.imageset/item_chair_decent.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_decent.imageset/item_chair_decent.png new file mode 100644 index 00000000..212550f4 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_decent.imageset/item_chair_decent.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_diamond.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_diamond.imageset/Contents.json new file mode 100644 index 00000000..990f6257 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_diamond.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_chair_diamond.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_diamond.imageset/item_chair_diamond.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_diamond.imageset/item_chair_diamond.png new file mode 100644 index 00000000..d2094524 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_diamond.imageset/item_chair_diamond.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_limited.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_limited.imageset/Contents.json new file mode 100644 index 00000000..9626801b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_limited.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_chair_limited.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_limited.imageset/item_chair_limited.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_limited.imageset/item_chair_limited.png new file mode 100644 index 00000000..0042927a Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_limited.imageset/item_chair_limited.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_nationalTreasure.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_nationalTreasure.imageset/Contents.json new file mode 100644 index 00000000..294996a6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_nationalTreasure.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_chair_nationalTreasure.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_nationalTreasure.imageset/item_chair_nationalTreasure.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_nationalTreasure.imageset/item_chair_nationalTreasure.png new file mode 100644 index 00000000..29497f43 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_nationalTreasure.imageset/item_chair_nationalTreasure.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_premium.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_premium.imageset/Contents.json new file mode 100644 index 00000000..80c17cf6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_premium.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_chair_premium.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_premium.imageset/item_chair_premium.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_premium.imageset/item_chair_premium.png new file mode 100644 index 00000000..e3121855 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_premium.imageset/item_chair_premium.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_vintage.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_vintage.imageset/Contents.json new file mode 100644 index 00000000..ee3ed275 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_vintage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_chair_vintage.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_vintage.imageset/item_chair_vintage.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_vintage.imageset/item_chair_vintage.png new file mode 100644 index 00000000..2bd38fa4 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/chair/item_chair_vintage.imageset/item_chair_vintage.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_broken.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_broken.imageset/Contents.json new file mode 100644 index 00000000..73046ef2 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_broken.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_keyboard_broken.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_broken.imageset/item_keyboard_broken.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_broken.imageset/item_keyboard_broken.png new file mode 100644 index 00000000..737bac78 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_broken.imageset/item_keyboard_broken.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_cheap.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_cheap.imageset/Contents.json new file mode 100644 index 00000000..84086187 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_cheap.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_keyboard_limited.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_cheap.imageset/item_keyboard_limited.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_cheap.imageset/item_keyboard_limited.png new file mode 100644 index 00000000..bff03939 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_cheap.imageset/item_keyboard_limited.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_decent.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_decent.imageset/Contents.json new file mode 100644 index 00000000..c5aeb80e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_decent.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_keyboard_decent.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_decent.imageset/item_keyboard_decent.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_decent.imageset/item_keyboard_decent.png new file mode 100644 index 00000000..e4fab853 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_decent.imageset/item_keyboard_decent.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_diamond.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_diamond.imageset/Contents.json new file mode 100644 index 00000000..6d82f01b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_diamond.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_keyboard_diamond.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_diamond.imageset/item_keyboard_diamond.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_diamond.imageset/item_keyboard_diamond.png new file mode 100644 index 00000000..d16f97b5 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_diamond.imageset/item_keyboard_diamond.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_limited.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_limited.imageset/Contents.json new file mode 100644 index 00000000..1c54a97d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_limited.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_keyboard_vintage.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_limited.imageset/item_keyboard_vintage.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_limited.imageset/item_keyboard_vintage.png new file mode 100644 index 00000000..87e30c7e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_limited.imageset/item_keyboard_vintage.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_nationalTreasure.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_nationalTreasure.imageset/Contents.json new file mode 100644 index 00000000..67997b1d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_nationalTreasure.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_keyboard_nationalTreasure.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_nationalTreasure.imageset/item_keyboard_nationalTreasure.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_nationalTreasure.imageset/item_keyboard_nationalTreasure.png new file mode 100644 index 00000000..9b6eb701 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_nationalTreasure.imageset/item_keyboard_nationalTreasure.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_premium.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_premium.imageset/Contents.json new file mode 100644 index 00000000..bd4535ee --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_premium.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_keyboard_premium.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_premium.imageset/item_keyboard_premium.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_premium.imageset/item_keyboard_premium.png new file mode 100644 index 00000000..cf9f4556 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_premium.imageset/item_keyboard_premium.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_vintage.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_vintage.imageset/Contents.json new file mode 100644 index 00000000..823e0778 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_vintage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_keyboard_cheap.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_vintage.imageset/item_keyboard_cheap.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_vintage.imageset/item_keyboard_cheap.png new file mode 100644 index 00000000..c0cc6260 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/keyboard/item_keyboard_vintage.imageset/item_keyboard_cheap.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_broken.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_broken.imageset/Contents.json new file mode 100644 index 00000000..a0fb8123 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_broken.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_monitor_broken.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_broken.imageset/item_monitor_broken.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_broken.imageset/item_monitor_broken.png new file mode 100644 index 00000000..2c89d49c Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_broken.imageset/item_monitor_broken.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_cheap.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_cheap.imageset/Contents.json new file mode 100644 index 00000000..656a1e75 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_cheap.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_monitor_cheap.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_cheap.imageset/item_monitor_cheap.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_cheap.imageset/item_monitor_cheap.png new file mode 100644 index 00000000..0cbff4ab Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_cheap.imageset/item_monitor_cheap.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_decent.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_decent.imageset/Contents.json new file mode 100644 index 00000000..cc7dab47 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_decent.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_monitor_decent.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_decent.imageset/item_monitor_decent.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_decent.imageset/item_monitor_decent.png new file mode 100644 index 00000000..d28b86bb Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_decent.imageset/item_monitor_decent.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_diamond.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_diamond.imageset/Contents.json new file mode 100644 index 00000000..0f658aa8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_diamond.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_monitor_diamond.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_diamond.imageset/item_monitor_diamond.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_diamond.imageset/item_monitor_diamond.png new file mode 100644 index 00000000..fa0f8b6b Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_diamond.imageset/item_monitor_diamond.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_limited.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_limited.imageset/Contents.json new file mode 100644 index 00000000..cf88eb78 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_limited.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_monitor_limited.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_limited.imageset/item_monitor_limited.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_limited.imageset/item_monitor_limited.png new file mode 100644 index 00000000..ce7af1bc Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_limited.imageset/item_monitor_limited.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_nationalTreasure.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_nationalTreasure.imageset/Contents.json new file mode 100644 index 00000000..8f6cf330 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_nationalTreasure.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_monitor_nationalTreasure.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_nationalTreasure.imageset/item_monitor_nationalTreasure.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_nationalTreasure.imageset/item_monitor_nationalTreasure.png new file mode 100644 index 00000000..c95690bc Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_nationalTreasure.imageset/item_monitor_nationalTreasure.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_premium.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_premium.imageset/Contents.json new file mode 100644 index 00000000..b6a82799 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_premium.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_monitor_premium.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_premium.imageset/item_monitor_premium.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_premium.imageset/item_monitor_premium.png new file mode 100644 index 00000000..f113dbe9 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_premium.imageset/item_monitor_premium.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_vintage.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_vintage.imageset/Contents.json new file mode 100644 index 00000000..61a30163 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_vintage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_monitor_vintage.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_vintage.imageset/item_monitor_vintage.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_vintage.imageset/item_monitor_vintage.png new file mode 100644 index 00000000..b3cd9ba2 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/monitor/item_monitor_vintage.imageset/item_monitor_vintage.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_broken.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_broken.imageset/Contents.json new file mode 100644 index 00000000..ab38e460 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_broken.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_mouse_broken.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_broken.imageset/item_mouse_broken.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_broken.imageset/item_mouse_broken.png new file mode 100644 index 00000000..cb7cbe32 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_broken.imageset/item_mouse_broken.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_cheap.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_cheap.imageset/Contents.json new file mode 100644 index 00000000..a967cd05 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_cheap.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_mouse_cheap.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_cheap.imageset/item_mouse_cheap.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_cheap.imageset/item_mouse_cheap.png new file mode 100644 index 00000000..38fdb790 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_cheap.imageset/item_mouse_cheap.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_decent.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_decent.imageset/Contents.json new file mode 100644 index 00000000..93869765 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_decent.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_mouse_decent.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_decent.imageset/item_mouse_decent.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_decent.imageset/item_mouse_decent.png new file mode 100644 index 00000000..0c19e084 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_decent.imageset/item_mouse_decent.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_diamond.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_diamond.imageset/Contents.json new file mode 100644 index 00000000..726284d1 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_diamond.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_mouse_diamond.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_diamond.imageset/item_mouse_diamond.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_diamond.imageset/item_mouse_diamond.png new file mode 100644 index 00000000..74633ac9 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_diamond.imageset/item_mouse_diamond.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_limited.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_limited.imageset/Contents.json new file mode 100644 index 00000000..bc708abc --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_limited.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_mouse_limited.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_limited.imageset/item_mouse_limited.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_limited.imageset/item_mouse_limited.png new file mode 100644 index 00000000..19d45726 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_limited.imageset/item_mouse_limited.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_nationalTreasure.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_nationalTreasure.imageset/Contents.json new file mode 100644 index 00000000..861e8f30 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_nationalTreasure.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "nationalTreasure.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_nationalTreasure.imageset/nationalTreasure.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_nationalTreasure.imageset/nationalTreasure.png new file mode 100644 index 00000000..19980578 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_nationalTreasure.imageset/nationalTreasure.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_premium.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_premium.imageset/Contents.json new file mode 100644 index 00000000..071fa110 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_premium.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_mouse_premium.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_premium.imageset/item_mouse_premium.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_premium.imageset/item_mouse_premium.png new file mode 100644 index 00000000..883d6466 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_premium.imageset/item_mouse_premium.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_vintage.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_vintage.imageset/Contents.json new file mode 100644 index 00000000..6778f89e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_vintage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_mouse_vintage.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_vintage.imageset/item_mouse_vintage.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_vintage.imageset/item_mouse_vintage.png new file mode 100644 index 00000000..e7bc33b4 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Item/mouse/item_mouse_vintage.imageset/item_mouse_vintage.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_all_rounder_developer.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_all_rounder_developer.imageset/Contents.json new file mode 100644 index 00000000..dc72569b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_all_rounder_developer.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_allRounderDeveloper.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_all_rounder_developer.imageset/profile_allRounderDeveloper.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_all_rounder_developer.imageset/profile_allRounderDeveloper.png new file mode 100644 index 00000000..72937834 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_all_rounder_developer.imageset/profile_allRounderDeveloper.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_aspiring_developer.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_aspiring_developer.imageset/Contents.json new file mode 100644 index 00000000..847672e9 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_aspiring_developer.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_aspiringDeveloper.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_aspiring_developer.imageset/profile_aspiringDeveloper.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_aspiring_developer.imageset/profile_aspiringDeveloper.png new file mode 100644 index 00000000..52162f43 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_aspiring_developer.imageset/profile_aspiringDeveloper.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_famous_developer.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_famous_developer.imageset/Contents.json new file mode 100644 index 00000000..a5ddcc42 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_famous_developer.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_famousDeveloper.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_famous_developer.imageset/profile_famousDeveloper.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_famous_developer.imageset/profile_famousDeveloper.png new file mode 100644 index 00000000..93e501fe Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_famous_developer.imageset/profile_famousDeveloper.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_junior_developer.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_junior_developer.imageset/Contents.json new file mode 100644 index 00000000..16facf01 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_junior_developer.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_juniorDeveloper.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_junior_developer.imageset/profile_juniorDeveloper.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_junior_developer.imageset/profile_juniorDeveloper.png new file mode 100644 index 00000000..9e9ed8df Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_junior_developer.imageset/profile_juniorDeveloper.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_laptop_owner.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_laptop_owner.imageset/Contents.json new file mode 100644 index 00000000..8462b57c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_laptop_owner.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_laptopOwner.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_laptop_owner.imageset/profile_laptopOwner.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_laptop_owner.imageset/profile_laptopOwner.png new file mode 100644 index 00000000..36df91d0 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_laptop_owner.imageset/profile_laptopOwner.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_locked.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_locked.imageset/Contents.json new file mode 100644 index 00000000..09dfffc8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_locked.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_locked.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_locked.imageset/profile_locked.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_locked.imageset/profile_locked.png new file mode 100644 index 00000000..70326e62 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_locked.imageset/profile_locked.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_night_owl_developer.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_night_owl_developer.imageset/Contents.json new file mode 100644 index 00000000..8ac41250 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_night_owl_developer.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_nightOwlDeveloper.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_night_owl_developer.imageset/profile_nightOwlDeveloper.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_night_owl_developer.imageset/profile_nightOwlDeveloper.png new file mode 100644 index 00000000..049d2d83 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_night_owl_developer.imageset/profile_nightOwlDeveloper.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_normal_developer.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_normal_developer.imageset/Contents.json new file mode 100644 index 00000000..98df45aa --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_normal_developer.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_normalDeveloper.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_normal_developer.imageset/profile_normalDeveloper.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_normal_developer.imageset/profile_normalDeveloper.png new file mode 100644 index 00000000..1c8908cc Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_normal_developer.imageset/profile_normalDeveloper.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_skilled_developer.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_skilled_developer.imageset/Contents.json new file mode 100644 index 00000000..2df39e02 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_skilled_developer.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_skilledDeveloper.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_skilled_developer.imageset/profile_skilledDeveloper.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_skilled_developer.imageset/profile_skilledDeveloper.png new file mode 100644 index 00000000..d42c896b Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_skilled_developer.imageset/profile_skilledDeveloper.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_unemployed.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_unemployed.imageset/Contents.json new file mode 100644 index 00000000..c001c728 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_unemployed.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_unemployed.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_unemployed.imageset/profile_unemployed.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_unemployed.imageset/profile_unemployed.png new file mode 100644 index 00000000..1289387f Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_unemployed.imageset/profile_unemployed.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_world_class_developer.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_world_class_developer.imageset/Contents.json new file mode 100644 index 00000000..11d0d3b6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_world_class_developer.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "profile_worldClassDeveloper.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_world_class_developer.imageset/profile_worldClassDeveloper.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_world_class_developer.imageset/profile_worldClassDeveloper.png new file mode 100644 index 00000000..4686a578 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Profiles/profile_world_class_developer.imageset/profile_worldClassDeveloper.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245-1.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245-1.png new file mode 100644 index 00000000..e2b23a84 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245-1.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245-2.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245-2.png new file mode 100644 index 00000000..55837b28 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245-2.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245-3.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245-3.png new file mode 100644 index 00000000..e150f213 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245-3.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245.png new file mode 100644 index 00000000..3f0b83c6 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Rectangle 245.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_1.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_1.imageset/Contents.json new file mode 100644 index 00000000..24995c7f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_dodge_1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_1.imageset/skill_dodge_1.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_1.imageset/skill_dodge_1.png new file mode 100644 index 00000000..8019f5d1 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_1.imageset/skill_dodge_1.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_2.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_2.imageset/Contents.json new file mode 100644 index 00000000..c7c8a3df --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_dodge_2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_2.imageset/skill_dodge_2.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_2.imageset/skill_dodge_2.png new file mode 100644 index 00000000..efb16c02 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_2.imageset/skill_dodge_2.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_3.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_3.imageset/Contents.json new file mode 100644 index 00000000..91875a90 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_dodge_3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_3.imageset/skill_dodge_3.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_3.imageset/skill_dodge_3.png new file mode 100644 index 00000000..5a126eb8 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_dodge_3.imageset/skill_dodge_3.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_1.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_1.imageset/Contents.json new file mode 100644 index 00000000..bcc58d16 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_language_1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_1.imageset/skill_language_1.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_1.imageset/skill_language_1.png new file mode 100644 index 00000000..3848a4c6 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_1.imageset/skill_language_1.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_2.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_2.imageset/Contents.json new file mode 100644 index 00000000..81598679 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_language_2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_2.imageset/skill_language_2.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_2.imageset/skill_language_2.png new file mode 100644 index 00000000..e3200d48 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_2.imageset/skill_language_2.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_3.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_3.imageset/Contents.json new file mode 100644 index 00000000..11eb05cf --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_language_3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_3.imageset/skill_language_3.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_3.imageset/skill_language_3.png new file mode 100644 index 00000000..b0191f06 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_language_3.imageset/skill_language_3.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_1.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_1.imageset/Contents.json new file mode 100644 index 00000000..20fbb971 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_stack_1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_1.imageset/skill_stack_1.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_1.imageset/skill_stack_1.png new file mode 100644 index 00000000..52e27754 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_1.imageset/skill_stack_1.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_2.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_2.imageset/Contents.json new file mode 100644 index 00000000..9c354157 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_stack_2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_2.imageset/skill_stack_2.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_2.imageset/skill_stack_2.png new file mode 100644 index 00000000..73986b05 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_2.imageset/skill_stack_2.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_3.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_3.imageset/Contents.json new file mode 100644 index 00000000..994caecf --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_stack_3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_3.imageset/skill_stack_3.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_3.imageset/skill_stack_3.png new file mode 100644 index 00000000..112e3649 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_stack_3.imageset/skill_stack_3.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_1.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_1.imageset/Contents.json new file mode 100644 index 00000000..bbef6a5c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_tap_1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_1.imageset/skill_tap_1.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_1.imageset/skill_tap_1.png new file mode 100644 index 00000000..a97ce954 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_1.imageset/skill_tap_1.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_2.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_2.imageset/Contents.json new file mode 100644 index 00000000..73c006c2 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_tap_2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_2.imageset/skill_tap_2.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_2.imageset/skill_tap_2.png new file mode 100644 index 00000000..20231af4 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_2.imageset/skill_tap_2.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_3.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_3.imageset/Contents.json new file mode 100644 index 00000000..317ac0b3 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "skill_tap_3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_3.imageset/skill_tap_3.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_3.imageset/skill_tap_3.png new file mode 100644 index 00000000..7e4d47dd Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Skill/skill_tap_3.imageset/skill_tap_3.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_career.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_career.imageset/Contents.json new file mode 100644 index 00000000..480cb66e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_career.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "tutorial_career.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_career.imageset/tutorial_career.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_career.imageset/tutorial_career.png new file mode 100644 index 00000000..1dc8349e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_career.imageset/tutorial_career.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_housing.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_housing.imageset/Contents.json new file mode 100644 index 00000000..6dcc84a9 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_housing.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "tutorial_housing.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_housing.imageset/tutorial_housing.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_housing.imageset/tutorial_housing.png new file mode 100644 index 00000000..462d42ea Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_housing.imageset/tutorial_housing.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_item.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_item.imageset/Contents.json new file mode 100644 index 00000000..d0a09aa5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_item.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "tutorial_item.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_item.imageset/tutorial_item.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_item.imageset/tutorial_item.png new file mode 100644 index 00000000..e8044062 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_item.imageset/tutorial_item.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_mission.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_mission.imageset/Contents.json new file mode 100644 index 00000000..c52729d5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_mission.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "tutorial_mission.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_mission.imageset/tutorial_mission.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_mission.imageset/tutorial_mission.png new file mode 100644 index 00000000..2d91a8da Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_mission.imageset/tutorial_mission.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_quiz.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_quiz.imageset/Contents.json new file mode 100644 index 00000000..ed2ccfc2 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_quiz.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "tutorial_quiz.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_quiz.imageset/tutorial_quiz.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_quiz.imageset/tutorial_quiz.png new file mode 100644 index 00000000..ad7772be Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_quiz.imageset/tutorial_quiz.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_skill.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_skill.imageset/Contents.json new file mode 100644 index 00000000..6117cb62 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_skill.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "tutorial_skill.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_skill.imageset/tutorial_skill.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_skill.imageset/tutorial_skill.png new file mode 100644 index 00000000..65900c5c Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_skill.imageset/tutorial_skill.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_work.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_work.imageset/Contents.json new file mode 100644 index 00000000..0df250d0 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_work.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "tutorial_work.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_work.imageset/tutorial_work.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_work.imageset/tutorial_work.png new file mode 100644 index 00000000..810df77a Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/Tutorial/tutorial_work.imageset/tutorial_work.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_dev.appiconset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_dev.appiconset/Contents.json new file mode 100644 index 00000000..6ba9ffdd --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_dev.appiconset/Contents.json @@ -0,0 +1,36 @@ +{ + "images" : [ + { + "filename" : "app_icon_dev.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_dev.appiconset/app_icon_dev.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_dev.appiconset/app_icon_dev.png new file mode 100644 index 00000000..4f91f5f9 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_dev.appiconset/app_icon_dev.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_release.appiconset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_release.appiconset/Contents.json new file mode 100644 index 00000000..b9a1c351 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_release.appiconset/Contents.json @@ -0,0 +1,36 @@ +{ + "images" : [ + { + "filename" : "app_icon_release.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_release.appiconset/app_icon_release.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_release.appiconset/app_icon_release.png new file mode 100644 index 00000000..04e6cff5 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_icon_release.appiconset/app_icon_release.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_launch_screen.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_launch_screen.imageset/Contents.json new file mode 100644 index 00000000..ece3083b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_launch_screen.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "app_launch_screen@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_launch_screen.imageset/app_launch_screen@2x.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_launch_screen.imageset/app_launch_screen@2x.png new file mode 100644 index 00000000..d41f267e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/app_launch_screen.imageset/app_launch_screen@2x.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_close.imageset/Contents.json new file mode 100644 index 00000000..7e437a54 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_all_rounder_developer_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_close.imageset/character_all_rounder_developer_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_close.imageset/character_all_rounder_developer_close.png new file mode 100644 index 00000000..1f6fc1b9 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_close.imageset/character_all_rounder_developer_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_default.imageset/Contents.json new file mode 100644 index 00000000..15176cd2 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_all_rounder_developer_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_default.imageset/character_all_rounder_developer_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_default.imageset/character_all_rounder_developer_default.png new file mode 100644 index 00000000..98ffd096 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_default.imageset/character_all_rounder_developer_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_smile.imageset/Contents.json new file mode 100644 index 00000000..853252a5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_all_rounder_developer_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_smile.imageset/character_all_rounder_developer_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_smile.imageset/character_all_rounder_developer_smile.png new file mode 100644 index 00000000..16b4bc12 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_all_rounder_developer_smile.imageset/character_all_rounder_developer_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_close.imageset/Contents.json new file mode 100644 index 00000000..d4b554cc --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_aspiring_developer_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_close.imageset/character_aspiring_developer_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_close.imageset/character_aspiring_developer_close.png new file mode 100644 index 00000000..ce09dc9b Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_close.imageset/character_aspiring_developer_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_default.imageset/Contents.json new file mode 100644 index 00000000..903259df --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_aspiring_developer_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_default.imageset/character_aspiring_developer_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_default.imageset/character_aspiring_developer_default.png new file mode 100644 index 00000000..a908ef62 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_default.imageset/character_aspiring_developer_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_smile.imageset/Contents.json new file mode 100644 index 00000000..71022938 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_aspiring_developer_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_smile.imageset/character_aspiring_developer_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_smile.imageset/character_aspiring_developer_smile.png new file mode 100644 index 00000000..47b565ef Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_aspiring_developer_smile.imageset/character_aspiring_developer_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_close.imageset/Contents.json new file mode 100644 index 00000000..54fb09a2 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_famous_developer_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_close.imageset/character_famous_developer_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_close.imageset/character_famous_developer_close.png new file mode 100644 index 00000000..cc0509a5 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_close.imageset/character_famous_developer_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_default.imageset/Contents.json new file mode 100644 index 00000000..5c118bb8 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_famous_developer_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_default.imageset/character_famous_developer_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_default.imageset/character_famous_developer_default.png new file mode 100644 index 00000000..ced12e66 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_default.imageset/character_famous_developer_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_smile.imageset/Contents.json new file mode 100644 index 00000000..a31604cd --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_famous_developer_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_smile.imageset/character_famous_developer_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_smile.imageset/character_famous_developer_smile.png new file mode 100644 index 00000000..d82db87e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_famous_developer_smile.imageset/character_famous_developer_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_close.imageset/Contents.json new file mode 100644 index 00000000..d85ffcba --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_junior_developer_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_close.imageset/character_junior_developer_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_close.imageset/character_junior_developer_close.png new file mode 100644 index 00000000..d3f9bca0 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_close.imageset/character_junior_developer_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_default.imageset/Contents.json new file mode 100644 index 00000000..45f8fc00 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_junior_developer_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_default.imageset/character_junior_developer_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_default.imageset/character_junior_developer_default.png new file mode 100644 index 00000000..65a2cc7e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_default.imageset/character_junior_developer_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_smile.imageset/Contents.json new file mode 100644 index 00000000..43198a1c --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_junior_developer_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_smile.imageset/character_junior_developer_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_smile.imageset/character_junior_developer_smile.png new file mode 100644 index 00000000..30710aa8 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_junior_developer_smile.imageset/character_junior_developer_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_close.imageset/Contents.json new file mode 100644 index 00000000..c0b33307 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_laptop_owner_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_close.imageset/character_laptop_owner_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_close.imageset/character_laptop_owner_close.png new file mode 100644 index 00000000..989275bd Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_close.imageset/character_laptop_owner_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_default.imageset/Contents.json new file mode 100644 index 00000000..e7dffb5a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_laptop_owner_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_default.imageset/character_laptop_owner_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_default.imageset/character_laptop_owner_default.png new file mode 100644 index 00000000..d1bc1716 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_default.imageset/character_laptop_owner_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_smile.imageset/Contents.json new file mode 100644 index 00000000..8f3e0922 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_laptop_owner_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_smile.imageset/character_laptop_owner_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_smile.imageset/character_laptop_owner_smile.png new file mode 100644 index 00000000..8ecd875a Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_laptop_owner_smile.imageset/character_laptop_owner_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_close.imageset/Contents.json new file mode 100644 index 00000000..3d37474a --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_night_owl_developer_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_close.imageset/character_night_owl_developer_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_close.imageset/character_night_owl_developer_close.png new file mode 100644 index 00000000..9b18b468 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_close.imageset/character_night_owl_developer_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_default.imageset/Contents.json new file mode 100644 index 00000000..914c051b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_night_owl_developer_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_default.imageset/character_night_owl_developer_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_default.imageset/character_night_owl_developer_default.png new file mode 100644 index 00000000..daeca1a2 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_default.imageset/character_night_owl_developer_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_smile.imageset/Contents.json new file mode 100644 index 00000000..0776abd0 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_night_owl_developer_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_smile.imageset/character_night_owl_developer_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_smile.imageset/character_night_owl_developer_smile.png new file mode 100644 index 00000000..ca12101d Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_night_owl_developer_smile.imageset/character_night_owl_developer_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_close.imageset/Contents.json new file mode 100644 index 00000000..38a04268 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_normal_developer_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_close.imageset/character_normal_developer_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_close.imageset/character_normal_developer_close.png new file mode 100644 index 00000000..336ba4d7 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_close.imageset/character_normal_developer_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_default.imageset/Contents.json new file mode 100644 index 00000000..d5175cf3 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_normal_developer_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_default.imageset/character_normal_developer_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_default.imageset/character_normal_developer_default.png new file mode 100644 index 00000000..be2fa743 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_default.imageset/character_normal_developer_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_smile.imageset/Contents.json new file mode 100644 index 00000000..ce827ead --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_normal_developer_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_smile.imageset/character_normal_developer_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_smile.imageset/character_normal_developer_smile.png new file mode 100644 index 00000000..8b0e942f Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_normal_developer_smile.imageset/character_normal_developer_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_close.imageset/Contents.json new file mode 100644 index 00000000..f5beabe5 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_skilled_developer_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_close.imageset/character_skilled_developer_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_close.imageset/character_skilled_developer_close.png new file mode 100644 index 00000000..63817316 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_close.imageset/character_skilled_developer_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_default.imageset/Contents.json new file mode 100644 index 00000000..f6bb9afb --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_skilled_developer_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_default.imageset/character_skilled_developer_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_default.imageset/character_skilled_developer_default.png new file mode 100644 index 00000000..fbe75b2c Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_default.imageset/character_skilled_developer_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_smile.imageset/Contents.json new file mode 100644 index 00000000..973093de --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_skilled_developer_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_smile.imageset/character_skilled_developer_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_smile.imageset/character_skilled_developer_smile.png new file mode 100644 index 00000000..aed04068 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_skilled_developer_smile.imageset/character_skilled_developer_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_close.imageset/Contents.json new file mode 100644 index 00000000..48d39f82 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_unemployed_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_close.imageset/character_unemployed_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_close.imageset/character_unemployed_close.png new file mode 100644 index 00000000..7e3ddc31 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_close.imageset/character_unemployed_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_default.imageset/Contents.json new file mode 100644 index 00000000..dba4843d --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_unemployed_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_default.imageset/character_unemployed_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_default.imageset/character_unemployed_default.png new file mode 100644 index 00000000..26264c69 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_default.imageset/character_unemployed_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_smile.imageset/Contents.json new file mode 100644 index 00000000..ab3a1170 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_unemployed_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_smile.imageset/character_unemployed_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_smile.imageset/character_unemployed_smile.png new file mode 100644 index 00000000..638350e1 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_unemployed_smile.imageset/character_unemployed_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_close.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_close.imageset/Contents.json new file mode 100644 index 00000000..79e261c6 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_world_class_developer_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_close.imageset/character_world_class_developer_close.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_close.imageset/character_world_class_developer_close.png new file mode 100644 index 00000000..3b7e9728 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_close.imageset/character_world_class_developer_close.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_default.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_default.imageset/Contents.json new file mode 100644 index 00000000..b55d7e0f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_default.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_world_class_developer_default.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_default.imageset/character_world_class_developer_default.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_default.imageset/character_world_class_developer_default.png new file mode 100644 index 00000000..18ed6d28 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_default.imageset/character_world_class_developer_default.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_smile.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_smile.imageset/Contents.json new file mode 100644 index 00000000..00b6b2ee --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_smile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "character_world_class_developer_smile.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_smile.imageset/character_world_class_developer_smile.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_smile.imageset/character_world_class_developer_smile.png new file mode 100644 index 00000000..36ac14ba Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/character/character_world_class_developer_smile.imageset/character_world_class_developer_smile.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_dodge.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_dodge.imageset/Contents.json new file mode 100644 index 00000000..99c5fbcc --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_dodge.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "work_dodge.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_dodge.imageset/work_dodge.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_dodge.imageset/work_dodge.png new file mode 100644 index 00000000..09f7a66f Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_dodge.imageset/work_dodge.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_language.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_language.imageset/Contents.json new file mode 100644 index 00000000..ac14400b --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_language.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "work_language.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_language.imageset/work_language.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_language.imageset/work_language.png new file mode 100644 index 00000000..9a72a04e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_language.imageset/work_language.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_stack.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_stack.imageset/Contents.json new file mode 100644 index 00000000..5ca176b4 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_stack.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "work_stack.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_stack.imageset/work_stack.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_stack.imageset/work_stack.png new file mode 100644 index 00000000..4e922911 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_stack.imageset/work_stack.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_tap.imageset/Contents.json b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_tap.imageset/Contents.json new file mode 100644 index 00000000..af88405e --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_tap.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "work_tap.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_tap.imageset/work_tap.png b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_tap.imageset/work_tap.png new file mode 100644 index 00000000..2c2b568c Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Assets.xcassets/work/work_tap.imageset/work_tap.png differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/bgm.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/bgm.wav new file mode 100644 index 00000000..ed74e0ab Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/bgm.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/blockDrop.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/blockDrop.wav new file mode 100644 index 00000000..8351f1de Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/blockDrop.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/blockStack.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/blockStack.wav new file mode 100644 index 00000000..31c7c2ec Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/blockStack.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/bombStack.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/bombStack.wav new file mode 100644 index 00000000..4cf958c3 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/bombStack.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/bugHit.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/bugHit.wav new file mode 100644 index 00000000..7a1eebbe Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/bugHit.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/buttonTap.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/buttonTap.wav new file mode 100644 index 00000000..03532701 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/buttonTap.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/coinCollect.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/coinCollect.wav new file mode 100644 index 00000000..aae8bbeb Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/coinCollect.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/itemConsume.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/itemConsume.wav new file mode 100644 index 00000000..b93d194e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/itemConsume.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/languageCorrect.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/languageCorrect.wav new file mode 100644 index 00000000..f8a0b826 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/languageCorrect.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/languageWrong.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/languageWrong.wav new file mode 100644 index 00000000..166fe4a1 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/languageWrong.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/missionAcquired.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/missionAcquired.wav new file mode 100644 index 00000000..0a8f2375 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/missionAcquired.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizCorrect.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizCorrect.wav new file mode 100644 index 00000000..afefb6a5 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizCorrect.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizCountdown.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizCountdown.wav new file mode 100644 index 00000000..df84a5e3 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizCountdown.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizTimeOver.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizTimeOver.wav new file mode 100644 index 00000000..fa0791bf Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizTimeOver.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizWrong.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizWrong.wav new file mode 100644 index 00000000..cb1cfe07 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/quizWrong.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/tapGameTyping.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/tapGameTyping.wav new file mode 100644 index 00000000..d6807bd7 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/tapGameTyping.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/upgradeFailure.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/upgradeFailure.wav new file mode 100644 index 00000000..e791409e Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/upgradeFailure.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/upgradeSuccess.wav b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/upgradeSuccess.wav new file mode 100644 index 00000000..0d27eb30 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Audio/upgradeSuccess.wav differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Fonts/PFStardust-Bold.ttf b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Fonts/PFStardust-Bold.ttf new file mode 100644 index 00000000..808da50b Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Fonts/PFStardust-Bold.ttf differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Fonts/PFStardust-ExtraBold.ttf b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Fonts/PFStardust-ExtraBold.ttf new file mode 100644 index 00000000..e4e3f924 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Fonts/PFStardust-ExtraBold.ttf differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Fonts/PFStardust-Regular.ttf b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Fonts/PFStardust-Regular.ttf new file mode 100644 index 00000000..a1312352 Binary files /dev/null and b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/Fonts/PFStardust-Regular.ttf differ diff --git a/SoloDeveloperTraining/SoloDeveloperTraining/Resources/QuizData.tsv b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/QuizData.tsv new file mode 100644 index 00000000..fe3dd773 --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTraining/Resources/QuizData.tsv @@ -0,0 +1,137 @@ +문제 번호 문제명 선지1 선지2 선지3 선지4 정답 해설 +0 오늘은 중요한 기능을 배포하는 날이다. 다음 중 개발자가 가장 들으면 안되는 말은? (함께 코드를 보며) 이 부분 빨리 수정 가능할까요? (깜깜한 새벽, 혼자 모니터링을 하며) 어? 음...어떡하죠? (퇴근 후 슬랙 멘션이 울린다) @님 지금 어디세요? 4 이 일의 담당자인 개발자가 퇴근 후 업무 슬랙으로 호출당했다는 것만큼 급한 상황은 없다. +1 개발자가 갑자기 모니터를 껐다 켰다 한다. 가장 그럴듯한 이유는? 전기를 아끼려는 환경운동 새로 산 모니터를 구경하려고 이러면 왠지 될 것 같아서 눈이 피로해서 3 개발자 밈 국룰: “껐다 켜봤어?” +2 개발자가 “이건 진짜 금방 끝나요”라고 말했다. 실제로 걸리는 시간은? 30분 오늘 퇴근 전에 이번 주 금요일 퇴근 전에 아무도 모른다. 4 “금방”은 개발자 세계에서 상대적인 시간 단위다. +3 개발자를 괴롭히던 에러가 갑자기 사라졌다. 개발자의 반응은? 문제를 정확히 분석한다. 재현 테스트를 작성한다. 상사에게 정리해 상세히 보고한다. 다음 작업을 진행한다. 4 “됐으면 됐다…” +4 “이건 진짜 간단해요”라는 말을 믿으면 안 되는 이유는? 문제의 크기를 아직 몰라서 담당자의 실력이 없어서 설명하기 귀찮아서 농담을 좋아해서 1 간단한 줄 알았던 일이 대형 프로젝트로 진화하는 순간 +5 개발자가 커피를 마시는 이유는? 맛있어서 밤샘으로 지친 컨디션을 회복하기 위해 분위기 때문에 코드가 돌아가길 기원하며 4 커피 == 부적 +6 “어제까지 잘 됐는데요?” 이 말을 들은 사람의 직업은? 마술사 의사 개발자 에어컨 수리 기사 3 개발자 세계 3대 미스터리 중 하나 +7 아무것도 안 바꿨는데 문제가 생겼다. 이때 개발자의 머릿속은? 시스템 오류다. 두 달 전의 내가 저질렀다. 동료의 잘못이다. AI 잘못이다. 2 과거의 내가 쓴 코드는 나도 모른다. +8 개발자가 에러를 보고 가장 먼저 하는 행동은? 에러 메시지를 그대로 복사한다. 매뉴얼을 찾아본다. 코드를 처음부터 다시 짠다. 동료에게 도움을 구한다. 1 구글은 개발자의 두 번째 뇌. 첫 번째는 기억 안 남 +9 개발자가 코드에 주석을 안 남긴 이유는? 천재라서 바빠서 미래의 누군가 고생하길 바라서 귀찮아서 3 “이 코드 누가 짰어” -> 과거의 나 +10 개발자가 가장 신뢰하는 테스트 방법은? 자동 테스트 QA 팀 검증 시뮬레이터 테스트 내 컴퓨터에서 되면 OK 4 “내 컴퓨터에선 되는데요?” 개발자 방어 주문 1단계 +11 개발자가 가장 공포를 느끼는 색깔은? 검은색 초록색 빨간색 파란색 3 화면 가득 오류가 뜨는 빨간 줄은 개발자의 심박수를 급격히 올립니다. +12 개발자가 퇴근하려는데 상사가 "이거 간단한 건데"라고 잡았다. 이때 개발자의 속마음은? 아싸, 빨리 끝내고 가야지 진짜 간단하겠지? 오늘 퇴근은 글렀구나 ~ 상사가 날 아끼는구나 3 개발자 사전에 "간단한건데" == "구조를 다 뜯어고쳐야 하는 복잡한 일" +13 숫자를 셀 때 개발자는 몇 부터 시작할까? 0 1 2 3 1 배열의 인덱스는 0부터 시작하는 것이 국룰 +14 개발자가 코드를 짤 때 가장 많이 하는 행동은? 수학 공식 계산하기 타자 연습 복사 붙여넣기 모니터 청소하기 3 우리의 코드는 AI가 작성하고 이제 복사 붙여넣기 해야죠 +15 신입 개발자가 들어왔을 때 사수가 가장 먼저 알려주는 것은? 회사의 비전 탕비실 위치 복잡한 서버 구조 코딩 스타일 가이드 2 카페인과 당 충전은 코드 품질과 직결되기 때문입니다. +16 경고 메시지를 본 개발자의 반응은? 심각하게 분석한다 즉시 고친다 못본 척 무시한다 동료에게 알린다 3 에러만 아니면 됩니다. 노란색 경고 따위는 가볍게 무시! +17 코드 리뷰에서 LGTM은 무슨 뜻일까요? Let's Go To Market (쇼핑 ㄱㄱ) Looks Good To Me (좋아 보이네요) Let's Get This Money (돈 벌자) Love Good Tears Money 2 문제가 없어보일 때 많이 사용되는 줄임말입니다 +18 다음 중 개발자가 "라이브러리"라고 부르는 것은? 책 읽는 도서관 미리 작성된 코드 모음집 회사 휴게실 사내 식당 2 남이 잘 짜준 코드를 가져와서 조립하는 것, 이게 바로 현대 개발 +19 AI가 코드를 짜주기 시작했다. 개발자의 반응은? 내 밥그릇 ㅠㅠ 오 개꿀 (복붙) 기획자로 전향한다 퇴사한다 2 AI는 훌륭한 부사수입니다 +20 개발자가 "이게 왜 돌아가지"라고 말하는 상황은? 코드가 완벽할 때 버그가 있어야 하는데 정상 동작할 때 컴퓨터가 회전할 때 의자가 돌아갈 때 2 내가 짠 논리대로라면 에러가 나야 하는데 잘 되면 더 불안합니다. +21 개발자가 “이건 설정 문제예요”라고 말할 때 가장 가까운 의미는? 옵션 하나만 바꾸면 된다 환경마다 다르게 터진다 코드가 잘못됐다 다시 설치하면 된다 2 내 컴퓨터에선 되는데 다른 환경에선 안 되는 그 문제. +22 개발자가 “이건 리팩터링이에요”라고 말하면 실제로는? 성능 개선 코드 정리 기능 변경 다 뜯어고침 4 리팩터링은 종종 이사 + 인테리어 + 철거다. +23 개발자가 가장 오래 붙잡고 있는 파일은? 최신 파일 가장 큰 파일 이름이 애매한 파일 테스트 파일 3 util, temp, final_final 같은 이름은 정체 불명이다. +24 개발자가 기능을 만들고 “이건 쓰지 마세요”라고 말하는 이유는? 미완성이라서 위험해서 언제 터질지 몰라서 본인도 이해 못 해서 4 만든 사람도 설명 못 하면 금지 구역이 된다. +25 개발자가 회의에서 가장 자주 쓰는 말은? 네 일단 해볼게요 가능은 한데요 다 맞습니다 3 “가능은 한데요” 뒤에는 조건·시간·위험이 숨어 있다. +26 개발자가 기능 설명을 하다 갑자기 말이 느려지는 순간은? 중요한 부분이라서 긴장해서 기억이 안 나서 아직 구현 안 해서 4 설명하면서 구현 안 한 게 떠오르는 순간이다. +27 개발자가 파일 이름에 숫자를 붙이기 시작했다면? 버전 관리를 잘한다 실험 중이다 이전 버전이 망했다 정리가 끝났다 3 final2, final3은 희생의 흔적이다. +28 개발자가 코드를 보며 가장 먼저 확인하는 것은? 디자인 주석 함수 이름 누가 썼는지 4 작성자를 알면 마음의 준비를 할 수 있다. +29 개발자가 “이건 임시로 넣어둔 거예요”라고 말하면? 곧 삭제된다 테스트용이다 중요하지 않다 계속 사용된다 4 임시는 개발 세계에서 가장 영구적인 상태다. +30 개발자가 가장 안심하는 순간은 언제일까? 코드가 컴파일될 때 테스트가 통과할 때 에러가 안 날 때 하루 동안 아무 연락이 없을 때 4 진짜 평화는 아무도 연락 안 오는 날이다. +31 USB를 한 번에 꽂을 확률은? 50% 100% 0% (반드시 3번 돌려야 들어감) 99% 3 앞면으로 꽂음(안 들어감) -> 뒷면으로 돌림(안 들어감) -> 다시 앞면(들어감). 과학으로 설명할 수 없는 현상입니다. +32 개발자가 스트레스를 풀기 위해 장만하는 대표적인 '장비빨' 아이템은? 기계식 키보드 5천원짜리 마우스 노트와 펜 계산기 1 타건음(딸깍딸깍)은 개발자의 심신 안정에 도움을 줍니다. +33 개발자가 가장 어려워하고 머리 쥐어짜는 난제는? 복잡한 수학 계산 1000줄 코딩하기 변수 이름 짓기 야식 메뉴 고르기 3 data, temp, a... 짓다가 하루가 다 갑니다. +34 명절에 친척들이 개발자 조카에게 가장 많이 부탁하는 것은? 최신 앱 개발 인공지능 알고리즘 설명 프린터 연결 및 컴퓨터 수리 서버 구축 3 "컴퓨터 전공이니까 컴퓨터 잘 고치지?"는 개발자의 숙명입니다. +35 프로그래밍 언어를 배울 때 가장 먼저 출력해보는 문구는? I am God Hello World Show me the money Error 404 2 개발자의 탄생을 알리는 국룰 인사법입니다. +36 전 세계 개발자들의 코딩 선생님이자 구세주인 사이트는? 싸이월드 스택 오버플로우 (Stack Overflow) 배달의 민족 넷플릭스 2 개발의 절반은 구글링과 복사+붙여넣기(Ctrl+C, V)입니다. +37 개발자들의 눈 건강을 지켜주는, 간지의 상징인 화면 모드는? 다크 모드 (Dark Mode) 화이트 모드 핑크 모드 투명 모드 1 흰 배경에 검은 글씨는 개발자의 눈을 공격합니다. +38 코드가 안 풀릴 때, 책상 위 인형에게 코드를 설명하며 답을 찾는 방법을 무엇이라 할까요? 독백 디버깅 러버덕(고무오리) 디버깅 인형 놀이 혼잣말 대잔치 2 남에게 설명하다 보면 스스로 답을 찾게 되는 마법입니다. +39 개발자가 버그를 발견했을 때 우겨보는 말은? "이건 버그가 아니라 OOO입니다." 바이러스 의도 기능 (Feature) 실수 3 "It's not a bug, it's a feature." (버그가 아니라 의도된 기능입니다.) +40 개발자가 가장 싫어하는 문서는? 월급명세서 휴가 신청서 변경된 기획서 합격 통지서 3 개발 다 끝났는데 기획이 바뀌는 순간... (절망) +41 웹사이트를 찾을 수 없을 때 발생하는 '404 Not Found' 에러는 현실 세계의 '이것'에서 유래했다는 설이 있습니다. (사실 여부는 불분명하지만 유명한 이야기입니다) 서버실의 방 번호 (Room 404) 404번 버스 4월 4일 개발자의 몸무게 1 CERN의 404호 방에 데이터베이스가 있었다는 설이 있지만, 실제로는 4층 자체가 없었다는 반박도 있습니다. 그럼에도 가장 유명한 전설입니다. +42 개발자가 가장 싫어하는, 얽히고설킨 난해한 코드를 음식에 비유하면? 피자 코드 스파게티 코드 햄버거 코드 김밥 코드 2 "이 변수가 어디서 바뀌었지?"를 찾으려면 스파게티 면발(로직)을 하나하나 다 따라가야 합니다. +43 프로그래밍 언어 커뮤니티에서 "이것은 프로그래밍 언어입니까?"라는 논쟁으로 개발자를 가장 화나게 할 수 있는 것은? C++ Python HTML Swift 3 컴퓨터 공학적 관점에서 엄밀히 따지면 HTML은 '마크업 언어'이지 '프로그래밍 언어'가 아닙니다. +44 키보드에서 개발자의 지문이 가장 많이 묻어있는 세 개의 키 조합은? Ctrl, Alt, Del Ctrl, C, V W, A, S, D F1, F2, F3 2 실제로 개발자들을 위한 선물로 키가 딱 3개(Ctrl, C, V)만 있는 미니 키보드가 판매되기도 할 정도로 유명한 자학 개그 +45 개발자가 에러를 고치고 가장 먼저 하는 생각은? 왜 이런 실수를 했지 다시는 이런 일 없게 하자 기록으로 남겨야지 다른 데서 터지진 않겠지 4 하나 고치면 어딘가 하나는 흔들린다. +46 개발자가 갑자기 한숨을 쉰 이유는? 피곤해서 방금 뭔가 잘못 눌렀다는 것을 깨달아서 회의 생각나서 퇴근하고 싶어서 2 클릭 한 번에 하루를 날린다. +47 개발자가 가장 싫어하는 성격 유형은? 급한 사람 잘난 체하는 사람 변덕쟁이 답답한 사람 3 요구 사항이 계속 바뀜 == 지옥 +48 개발자가 코드에서 TODO 주석을 발견했다. 가장 가능성 높은 상황은? 곧바로 처리한다 이슈를 생성한다 해당 줄을 조심히 피해서 지나간다 주석을 지운다 3 TODO는 미래의 나에게 떠넘기는 책임이다. +49 “이거 왜 이렇게 짰어요?”라는 질문을 들은 개발자의 반응은? 즉시 리팩터링을 약속한다 조용히 커밋 히스토리를 본다 설명을 시작하다가 말이 느려진다 웃으면서 넘긴다 3 말이 느려질수록 본인도 확신이 없다. +50 장애 공지 문구를 작성할 때 개발자가 가장 고민하는 것은? 정확한 원인 재발 방지 대책 언제까지 복구될지 누가 썼는지 안 들키는 표현 4 “시스템 이슈”라는 말에 수많은 감정이 담겨 있다. +51 개발자가 배포 직전에 가장 자주 하는 말은? 이건 안전해요 테스트 다 했어요 설마 문제 있겠어? 기도하자 4 배포는 과학이 아니라 신앙의 영역입니다. 테스트를 다 해도 기도는 필수 +52 개발자가 가장 무서워하는 문장은? 이 기능 언제 돼요? 간단한 수정이에요 급한 건 아닌데요 기획이 조금 바뀌었어요 4 조금 바뀐 기획은 보통 전체 구조 변경을 의미한다 +53 개발자가 가장 자주 미루는 작업은? 핵심 기능 구현 코드 리뷰 문서 작성 배포 3 문서는 항상 나중에 쓴다. 그 나중은 거의 오지 않는다. +54 개발자가 가장 믿지 않는 말은? 공식 문서 에러 메시지 QA 결과 금방 끝나요 4 이 말은 시공간을 왜곡한다. +55 개발자에게 "여자(남자)친구 있어요?"라고 물었을 때 가장 개발자스러운 답변은? "있는데 안 만나요." "404 Not Found" "Null Pointer Exception" "지금 빌드 중입니다." 2 요청하신 리소스를 찾을 수 없습니다. +56 다음 중 가장 믿을 수 없는 '시간 단위'는? 전자레인지 30초 컵라면 3분 군대의 국방부 시계 개발자의 "5분이면 수정해요." 4 개발자의 '5분'은 지구의 시간이 아닐 수 있습니다. (인터스텔라급 왜곡 발생) +57 3시간 동안 버그를 찾지 못해 헤매던 중, 알고 보니 원인이 '세미콜론(;)' 하나 빠진 것이었을 때 느끼는 감정은? "아, 다행이다. 해결했네." "다음부터는 조심해야지." "이 멍청한 컴퓨터는 융통성이라곤 없구나." (허탈한 웃음과 함께) 키보드를 반으로 접고 싶은 충동 4 고작 점 하나 때문에 내 3시간이 증발했다는 사실을 받아들이는 데는 시간이 필요합니다. +58 동료의 코드를 리뷰(Code Review)할 때, 코드가 너무 길고 복잡해서 읽기 귀찮을 때 남기는 마법의 약어는? WIP (Work In Progress) ASAP (As Soon As Possible) LGTM (Looks Good To Me) FYI (For Your Information) 3 "제 눈엔 좋아 보이네요"라는 뜻이지만, 사실 "에라 모르겠다 일단 합치자(Merge)"라는 뜻일 확률이 높습니다. +59 개발자가 "이번엔 제대로 짰어요"라고 자신있게 말한 후 가장 먼저 일어나는 일은? 칭찬받는다 승진한다 프로덕션에서 500 에러가 터진다 동료들이 박수친다 3 자신감 넘치는 배포 후엔 항상 뭔가 터진다. 머피의 법칙은 개발자를 비켜가지 않는다. +60 개발자가 "이 코드 누가 짰어?"라고 분노하며 Git Blame을 돌렸을 때 가장 자주 나오는 결과는? 퇴사한 전임자 인턴 6개월 전의 나 AI 3 과거의 나는 남이다. 그것도 원수 같은 남. +61 개발자가 주말에 가장 하고 싶지 않은 알림은? "배포 롤백했습니다" "서버 다운됐어요" "긴급 회의 소집" "아 그거 테스트 안 해봤는데..." 2 일요일 저녁 서버 장애 알림은 개발자의 영혼을 탈탈 털어갑니다. 주말은 이미 끝났다. +62 개발자가 가장 믿는 기록 방식은? 메모 녹음 로그 기억 3 기억은 지워져도 로그는 남는다. +63 개발자가 가장 좋아하는 정리 상태는? 깔끔함 미니멀 정돈됨 정렬됨 4 순서만 맞아도 마음이 편안 +64 다음 중 버그가 가장 생기기 쉬운 상황은? 코드가 짧을때 기능이 단순할때 테스트가 많을때 조건문이 많을때 4 if가 늘어날수록 경우의 수는 폭발한다. +65 다음 중 “잘 돌아가는 코드”의 기준으로 가장 중요한 것은? 멋있는 코드 이해 가능한 코드 짧은 코드 빠른 코드 2 나중에 고칠 사람은 거의 항상 "나"다. +66 리팩토링(Refactoring) 이라는 말의 느낌과 가장 가까운 것은? 성능을 폭발시킨다 기능을 추가한다 모양을 다시 다듬는다 완전히 새로 만든다 3 Re(다시) + Factor(구조, 요소) +67 디버그(Debug) 라는 말의 어원에 가장 가까운 설명은? 벌레를 잡는다 벌레랑 싸운다 벌레를 먹는다 벌레를 살려준다 1 Debug = De(제거) + Bug(벌레) +68 다음 중 print("여기")가 가장 자주 사용되는 목적은? 성능 측정 기도 로그 수집 디버깅 1 사실상 “여기까지는 실행됐겠지?”라는 존재 확인 의식. 논리적 디버깅이라기보다 “제발 여기까지만이라도 와줘…” 라는 마음가짐이 핵심이다. +69 다음 중 컴공생의 시간 감각을 가장 왜곡시키는 것은? 알고리즘 문제 리팩터링 환경설정 디버깅 3 “이거 5분이면 돼~” → 3시간. +70 컴공생이 가장 많이 하는 거짓말은? 금방 끝나요 이해했습니다 테스트 했어요 주석에 써놨어요 4 주석은 있다. 다만 오래됨/틀림/코드와 불일치/혹은 아무 말도 안 함 그래도 그래도 “써놨다”고 말하게 된다. +71 개발자의 하루 일과 중 가장 많은 시간을 차지하는 것은? 코딩 회의 구글링 왜 안되는지 고민 4 코드 짜는 시간보다 "왜 안 돼?"를 외치는 시간이 3배 😭 +72 "코드 리팩토링 하겠습니다"의 진짜 의미는? 코드를 개선하겠다 전부 다시 짜겠다 이해가 안 된다 시간이 남았다 2 리팩토링 = 갈아엎기 🔥 결국 새로 짜는 거죠 +73 테스트 코드를 작성하는 시점은? 개발 전 개발 중 개발 후 배포 후 버그 터졌을 때 4 "이제 테스트 코드 짜야지" (다음 생에) +74 이거 누가 짠 거야?"라고 물었을 때의 답은? 제가 짰어요 전임자요 모르겠는데요 git blame 돌려보세요 4 전임자에게 모든 걸 떠넘기기 🏃 (본인이 짠 거라도) +75 프로그래머가 운동을 시작하는 이유는? 건강을 위해 스트레스 해소 허리가 아파서 아직 안 시작함 4 "내일부터 할 거야..." (이미 3년째) 🏋️ +76 주말에 갑자기 서버가 다운되면? 즉시 복구한다 월요일까지 기다린다 전화를 못 본 척한다 "연락 못 받았어요" 3 주말엔 핸드폰이 고장 나는 법 📱🔇 +77 개발자의 변명 중 가장 많이 쓰는 것은? 시간이 부족했어요 요구사항이 애매했어요 테스트 환경이 달랐어요 위의 모든 것 4 변명의 성삼위일체 ✨ 상황에 따라 픽 +78 "이건 나중에 정리할게요"라는 말의 실제 의미는? 이번 주 안에 처리한다 다음 주 안에 처리한다 시간 날 때 처리한다 영원히 처리하지 않는다 4 나중에 = 미래의 나에게 떠넘기기. 그 미래는 오지 않는다 +79 개발자가 갑자기 불안해지는 순간은? 에러가 발생했을 때 테스트가 실패했을 때 갑자기 모든 게 잘 될 때 코드 리뷰 요청이 왔을 때 3 에러가 나야 정상인데 너무 잘 돌아가면 오히려 무섭다 +80 컴퓨터 화면에 빨간 글씨가 잔뜩 뜰 때 첫 번째 행동은? 침착하게 읽어본다 하나씩 해결해본다 모니터를 멀리한다 아무 일 없었던 척한다 4 본능적으로 거리부터 확보한다. +81 어제까지 잘 되던 게 오늘 갑자기 안 될 때 가장 많이 나오는 말은? "내가 잘못했나?" "컴퓨터가 이상해" "누가 건드렸어?" "원래 이런 거야" 2 사람은 자신의 실수보다는 기계를 먼저 의심한다 +82 갑자기 컴퓨터를 껐다 켜는 사람의 이유는? 전기를 아끼려고 고장이 난 것 같아서 왠지 이러면 될 것 같아서 화면이 지겨워서 3 논리보다 믿음이 앞서는 순간입니다. +83 퇴근 후 단체 메신저에서 이름이 불렸을 때의 기분은? 반갑다 별일 아니겠지 심장이 철렁한다 행복하다 3 퇴근 후 호출은 대부분 긴급 상황이다. +84 잘 안 되던 일이 갑자기 잘 되기 시작했을 때 반응은? 이유를 분석한다 다시 한 번 확인한다 주변에 자랑한다 넘어간다 4 "됐으면 됐다" 더 건드리면 다시 망가질 수 있다. +85 가장 효과적인 오류 해결 방법은? 원하는 대답이 나올 때까지 AI를 괴롭힌다 지우고 처음부터 다시 한다 비슷한 사례를 분석한다 동료에게 토스한다 4 기존 코드의 정신적 부채를 전부 날려버리는 전략. “왜 안 되지?” → “아 처음부터 이렇게 하면 되네” +86 어렵기로 소문난 전공 수업을 들은 후 가장 먼저 드는 생각은? 컴퓨터가 더 친숙해졌다 세상이 논리적으로 보인다 이게 왜 돌아가는지 모르겠다 내가 똑똑해진 것 같다 3 이해는 못 했지만 컴퓨터는 여전히 잘 돌아간다. → 그래서 더 무섭다. +87 “이 코드는 이해되면 안 된다”의 의미는? 코드가 너무 난해하다 작성자가 없다 이미 너무 오래 돌아가고 있다 관련 문서가 없다 3 이해하려는 순간 책임이 생긴다. +88 개발자가 가장 행복해 보이는 순간은? 배포 직후 에러가 사라졌을 때 회의가 취소됐을 때 아무 알림도 없을 때 4 진짜 평화는 "아무 일도 안 일어나는 날" +89 개발자가 회의에서 고개를 끄덕일 때 실제 의미는? 완전히 이해했다 일단 해결 방법이 있다 일단 듣고는 있다 동의한다 3 끄덕이지만 뇌는 아직 로딩 중이다. +90 개발자가 문제를 설명하다가 갑자기 말이 빨라지는 이유는? 자신 있어서 시간이 없어서 이미 여러 번 겪어서 대충 넘기고 싶어서 4 말하면 더 큰 얘기가 나온다. +91 개발자가 가장 무서워하는 테스트 결과는? 실패 경고 성공 아무 결과도 안 나옴 4 아무 반응이 없다는 건 뭔가 더 큰 문제가 숨어 있다는 뜻이다. +92 다음 중 개발자가 "버그"에 대해 느끼는 가장 가까운 의미는? 없을 수록 좋다 없으면 좋지만 있어도 괜찮다 있어도 안되고 없어도 안된다 무조건 없어야 한다 3 있다? 고쳐야 됨. 없다? 언제 문제가 터질지 모름. +93 컴공생이 말하는 “시간 복잡도”의 실제 의미는? 알고리즘 효율 실행 시간 입력 크기 이거 커지면 망한다 4 아슬아슬한 시간 복잡도를 보면 불안감이 먼저 온다. +94 ‘추상화(abstraction)’가 필요한 가장 솔직한 이유는? 유연성을 위해 확장성을 위해 재사용성을 위해 다 생각하기 싫어서 4 인간의 뇌는 디테일을 버텨내지 못한다. +95 개발자가 “일단 이렇게 가죠”라고 말하는 순간은? 합리적인 판단 최선의 선택 안정적인 방향 지쳤다 4 “일단”은 에너지 고갈 신호다. +96 개발자가 “이 로직은 건드리면 안 돼요”라고 한다. 이유는? 최적의 로직이라서 자기도 몰라서 모두 검증되어서 권한이 없어서 2 이 코드는 지뢰다. +97 개발자가 갑자기 조용해졌을 때 가장 가능성 높은 상황은? 에러 메시지 읽는 중 어려운 설계 중 코드에 몰입 중 자는 중 1 에러 메시지는 말이 많아서 읽느라 조용해진다. +98 개발자가 “이건 구조상 어쩔 수 없어요”라고 말하는 순간 가장 가까운 진실은? 최적의 설계다 이미 너무 깊이 들어왔다 회사 정책 때문이다 처음부터 잘못됐다 2 지금 고치면 다 무너진다. 이미 돌아가고 있으니 신성불가침이 됐다. +99 개발자가 버그를 재현하지 못했을 때 가장 자주 드는 생각은? 사용자 환경 문제다 로그를 더 심어야겠다 다시 시도해보자 내가 미쳤나? 4 방금 전까진 분명 터졌는데… 나만 봤나? +100 개발자가 “이거 리스크는 있어요”라고 말했는데도 일이 진행됐다. 가장 높은 확률로 일어나는 일은? 아무 문제 없이 끝난다 예상한 문제가 그대로 터진다 전혀 다른 문제가 터진다 아무도 책임지지 않는다 3 예상한 문제는 빙산의 일각. 진짜는 수면 아래 있다. +101 개발자가 가장 자주 까먹는 것은? 변수명 함수명 Git 커밋 자신이 한 일 4 자신이 짠 코드는 3일만 지나면 낮설다. +102 개발자가 자주 사용하는 채팅 앱은? Slack Discord Telegram KakaoTalk 1 Slack = 회사생활 +103 개발자가 새로 배운 기술을 실제 프로젝트에 적용하고 싶어하는 시점은? 바로 적용 테스트 후 적용 신중하게 고민 후 적용 새 프로젝트가 생기면 4 기존 프로젝트에 신기술 = 리스크, 새 프로젝트가 안전 +104 개발자가 코드를 짜다가 "이건 너무 복잡한데 일단 동작하게 하자"라고 생각하는 순간은? 초기 설계 단계 중간 개발 단계 마지막 단계 항상 4 모든 코드는 "일단 동작하게"에서 시작한다 +105 개발자가 문서를 읽기 전에 먼저 하는 일은? 예제 코드 찾기 직접 실행해보기 스택오버플로우 검색 포기하기 2 문서보다 직접 해보는게 확실하다. +106 개발자가 코드를 완성한 후 느끼는 감정은? 성취감 자신감 의심 뭔가 놓친게 있다 4 100%는 거짓말이다. 항상 놓치는 게 있다 +107 개발자가 데드라인 3일 전에 느끼는 감정은? 여유롭다 걱정된다 당황한다 이미 늦었다 1 아직 3일이나 남았네? +108 개발자가 동료의 코드를 보면서 가장 자주 하는 생각은? 이거 개선하면 좋을 것 같아요 나쁘지 않네요 왜 이렇게 했을까? 고치고 싶지만 말하면 귀찮아질 것 같다 4 남의 코드를 만지면 일이 더 늘어난다. +109 개발자가 에러 핸들링을 제대로 안 했을 때의 변명은? 나중에 추가할 예정이에요 에러가 안 날 것 같아서 try-catch만 할면 될 것 같아서 에러? 그게 뭐에요? 4 에러 핸들링은 미래의 나에게 맡긴다 +110 개발자가 새로운 IDE나 에디터를 배울 때 하는 것은? 단축키 확인 플러그인 추천받기 튜토리얼 다시 원래로 들어가기 4 새 에디터는 며칠 쓰다가 기존 에디터로 복귀 +111 개발자가 새로 온 동료에게 프로젝트를 설명할 때 가장 어려운 부분은? 전체 구조 왜 이렇게 설계했는지 각 모듈의 역할 전체 4 설명하다 보면 내가 왜 이렇게 짰는지도 모르겠다 +112 개발자가 "이건 표준을 따라 작성했어요"라고 말하는 실제 의미는? 업계 표준 회사 표준 내가 생각하는 표준 표준이 뭐에요? 3 표준은 주관적이다. +113 개발자가 코드를 작성하다가 갑자기 "이건 너무 과한 것 같은데?"라고 생각할 때의 반응은? 간소화한다 일단 둔다 다시 작성한다 과한게 뭐 어때서 4 과한것도 동작하면 OK! +114 개발자가 프로젝트 마감일이 다가올 때 가장 많이 삭제하는 것은? 불필요한 기능 주석 테스트 코드 모두 3 마감일 = 테스트 코드의 생명줄이 끊기는 날 +115 개발자가 메모리 누수를 발견했을 때 가장 먼저 하는 행동은? 즉시 수정한다 로그를 남긴다 무시한다 나중에 수정한다 3 메모리? 그건 가상의 개념이야 (무시) +116 개발자가 갑자기 키보드를 빠르게 치기 시작했다. 가장 그럴듯한 이유는? 타자 연습 중이다. 중요한 아이디어가 떠올랐다. 코드가 안 돌아간다. 카톡 중이다. 4 빠르게 키보드를 치는 것은 메신저를 하고 있을 때 뿐이다. +117 개발자가 가장 자주 저장하는 파일 이름은? final final_real final_final final_final_진짜마지막 4 숫자와 수식어가 늘어날수록 프로젝트의 고통도 함께 올라간다. +118 개발자가 문제를 설명하다가 갑자기 "어.. 잠깐만요"라고 말한다. 무슨 상황일까? 설명이 너무 길어졌다. 질문을 이해 못했다. 말하다 보니 문제를 발견했다. 배가 고프다. 3 남에게 설명하다 보면 본인이 놓친 버그를 스스로 발견하는 경우가 많다. +119 개발자가 가장 안심하는 문장은? 고생 많으셨어요 이거 언제 돼요? 아무 일 없었어요 기획이 조금 바뀌었어요 3 진짜 평화는 칭찬이 아니라 아무 소식도 없는 상태이다. +120 개발자가 "일단 이렇게 두죠"라고 말하는 이유는? 최고의 선택이라서 시간이 부족해서 더 생각하기 싫어서 이미 지쳤기 때문에 4 "일단"은 체력과 멘탈이 동시에 바닥났다는 신호이다. +121 개발자가 가장 진지해지는 순간은? 일정 조율 네이밍 새로운 기능 제안 디자인 논의 2 이름은 한 번 정하면 평생 간다. +122 “이거 구현은 쉬운데…”라는 말 뒤에 가장 자주 오는 것은? 조건 설명 20분 테스트 코드 작성 금방 끝남 1 구현은 쉽지만 조건이 지옥이다. +123 개발자가 문서를 안 믿게되는 순간은? 문서가 길다 문서가 영어다 문서대로 안 된다 문서가 없다 3 한 번 배신하면 다신 안 믿는다. +124 “이건 나중에 정리할게요”가 의미하는 일정은? 오늘 이번 주 다음 스프린트 프로젝트 종료 직전 4 정리는 항상 마지막이다. 그리고 마지막은 잘 오지 않는다. +125 개발자가 만든 앱에 성능 문제가 없는 이유는? AI를 써서 구현에 흠잡을 데가 없어서 테스트로 검증이 완료되어서 사용자가 없어서 4 지금은 요청이 거의 없어서 문제가 안 보일 뿐이다. 유저가 늘어나는 순간, 이 말은 회고록이 된다. +126 잘 돌아가던 프로그램이 갑자기 돌아가지 않는다. 가장 효과적인 해결책은? AI에게 질문한다 가장 최근에 짠 코드부터 의심한다 옆에 있는 동료에게 떠넘긴다 처음부터 다시 한다 2 코드는 거짓말 안 한다. 방금 손댄 사람이 문제다. 그리고 대부분 그 사람이 나다. +127 개발자가 회의에서 가장 자주 쓰는 방어 스킬은? 침묵 "케이스 바이 케이스죠" 질문 고개 끄덕임 2 정답을 미루는 만능 주문. +128 개발자가 가장 안심하는 순간은? 코드가 깔끔할 때 테스트에 성공했을 때 아무 변화 없을 때 리뷰에 통과했을 때 3 아무 변화 없음 == 사고 없음. +129 개발자가 갑자기 웃을 때 가장 위험한 이유는? 포기해서 해결해서 아이디어가 떠올라서 농담이 생각나서 1 웃음은 정신적 마감 신호다. +130 금요일 오후 5시, 아주 사소한 코드 수정을 마쳤다. 이때 개발자가 절대 해서는 안 될 행동은? 코드 리뷰 요청하기 로컬에서 테스트하기 운영 서버에 바로 배포하고 퇴근하기 다음 주 할 일 목록 작성하기 3 금요일 오후 배포 금지"는 개발계의 성경과 같습니다. 월화수목 잘 돌아가던 서버가 내가 퇴근하는 순간 멈추는 마법을 경험하고 싶지 않다면 말이죠. +131 개발자가 코드를 작성하는 시간보다 더 많이 쓰는 시간은? 기획안 읽기 변수 이름 고민하기 키보드 청소하기 탕비실에서 간식 먹기 2 data1, temp_list, final_result... 적절한 이름을 짓는 것은 알고리즘 설계보다 더 큰 창작의 고통을 수반합니다. +132 시니어 개발자가 코드를 삭제할 때 짓는 표정은? 아까워하며 눈물을 흘린다. 분노하며 키보드를 친다. 그 어느 때보다 인자하고 행복해 보인다. 아무 생각이 없다. 3 코드를 100줄 추가하는 것보다, 불필요한 코드 100줄을 지우고 똑같이 동작하게 만드는 것이 진정한 고수의 희열입니다. +133 개발자가 기능을 지우는 데 죄책감을 느끼지 않는 순간은? 아무도 안 쓸 때 버그일 때 성능 문제 기획 변경 1 코드는 애착이 아니라 도구다. +134 “이 방식도 나쁘지 않아요”의 숨은 의미는? 좋은 선택 합리적 판단 대안 인정 딱히 더 나은게 없다 4 찬성이 아닌 포기다. +135 “이 정도면 충분하죠”가 나오는 정확한 타이밍은? 완벽할 때 요구사항 충족 시 더 하면 끝이 없을 때 태스트 통과 후 3 \ No newline at end of file diff --git a/SoloDeveloperTraining/SoloDeveloperTrainingTests/ConcurrencyIssueTests.swift b/SoloDeveloperTraining/SoloDeveloperTrainingTests/ConcurrencyIssueTests.swift new file mode 100644 index 00000000..625b6c6f --- /dev/null +++ b/SoloDeveloperTraining/SoloDeveloperTrainingTests/ConcurrencyIssueTests.swift @@ -0,0 +1,35 @@ +// +// ConcurrencyIssueTests.swift +// SoloDeveloperTrainingTests +// +// Created by SeoJunYoung on 2/2/26. +// + +import Testing +import Foundation +@testable import SoloDeveloperTraining + +struct ConcurrencyIssueTests { + + @Test("Wallet Task.detached Concurrent - race condition 재현") + func walletTaskDetachedRaceCondition() async throws { + let user = await User(nickname: "test") + let wallet = await user.wallet + let iterations = 10000 + + await withTaskGroup(of: Void.self) { group in + for _ in 0..