Add duty free systems and travel stage updates

This commit is contained in:
jongjae0305
2026-07-09 02:50:48 +09:00
parent 445d74d462
commit 750e9ce0a6
340 changed files with 21825 additions and 1197 deletions
+22
View File
@@ -0,0 +1,22 @@
using System;
[Serializable]
public class CourseProfile {
public CourseStep[] openingSteps;
public CourseStep[] loopSteps;
public CourseStep[] GetOpeningSteps() {
return CourseStepFactory.CloneSteps(openingSteps);
}
public CourseStep[] GetLoopSteps() {
return CourseStepFactory.CloneSteps(loopSteps);
}
public static CourseProfile Create(CourseStep[] openingSteps, CourseStep[] loopSteps) {
return new CourseProfile {
openingSteps = CourseStepFactory.CloneSteps(openingSteps),
loopSteps = CourseStepFactory.CloneSteps(loopSteps)
};
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b89f600e13ac4d13a6ed5691d11e8e0d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+1 -3
View File
@@ -6,7 +6,5 @@ public enum CourseStepKind {
ForceHit,
HealthItem,
InvincibleItem,
ShieldItem,
SpeedItem,
MileageCardItem
EnergyDrinkItem
}
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 29d088f4951c41a7a41a6c85a5fd94ff
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,37 @@
using static CourseStepFactory;
public static class AmericaCourseProfile {
public static CourseProfile Create() {
return CourseProfile.Create(
new CourseStep[] {
Basic(GroundY, 0.60f, Platform.MileagePattern.SafeLine),
Jump(Platform.PlatformPattern.LowMid, 0.58f),
Slide(SlideObstaclePattern.SlideLayout.WidePair, 0.58f),
Basic(GroundY, 0.56f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.EnergyDrink),
Aerial(AerialY + 0.20f, 1.35f),
Basic(GroundY, 0.58f, Platform.MileagePattern.SafeLine)
},
new CourseStep[] {
Basic(GroundY, 0.56f, Platform.MileagePattern.SafeLine),
Jump(Platform.PlatformPattern.LowLeft, 0.54f),
Slide(SlideObstaclePattern.SlideLayout.RightPair, 0.52f),
Basic(GroundY, 0.50f, Platform.MileagePattern.JumpArc),
Jump(Platform.PlatformPattern.LowRight, 0.52f),
Basic(GroundY, 0.50f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.HealthSushi),
Aerial(AerialY + 0.22f, 1.24f),
Slide(SlideObstaclePattern.SlideLayout.WidePair, 0.50f),
Basic(GroundY, 0.48f, Platform.MileagePattern.SlideLine),
Jump(Platform.PlatformPattern.LowMid, 0.50f),
Slide(SlideObstaclePattern.SlideLayout.LeftPair, 0.48f),
Basic(GroundY, 0.50f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.EnergyDrink),
Jump(Platform.PlatformPattern.LowLeft, 0.50f),
Jump(Platform.PlatformPattern.LowRight, 0.50f),
Basic(GroundY, 0.52f, Platform.MileagePattern.SafeLine),
Aerial(AerialY + 0.12f, 1.18f),
Basic(GroundY, 0.50f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.InvincibleRamen),
Slide(SlideObstaclePattern.SlideLayout.CenterPair, 0.48f),
Jump(Platform.PlatformPattern.LowMid, 0.50f),
Basic(GroundY, 0.58f, Platform.MileagePattern.SafeLine)
});
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3473696a9ce54b0cbecb0b7c3aa8aebd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,34 @@
using static CourseStepFactory;
public static class ChinaCourseProfile {
public static CourseProfile Create() {
return CourseProfile.Create(
new CourseStep[] {
Basic(GroundY, 0.66f, Platform.MileagePattern.SafeLine),
Jump(Platform.PlatformPattern.LowRight, 0.68f),
Basic(GroundY, 0.62f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.HealthSushi),
Slide(SlideObstaclePattern.SlideLayout.LeftPair, 0.66f),
Basic(GroundY, 0.62f, Platform.MileagePattern.SafeLine),
Aerial(AerialY + 0.12f, 1.72f),
Basic(GroundY, 0.66f, Platform.MileagePattern.SafeLine)
},
new CourseStep[] {
Basic(GroundY, 0.62f, Platform.MileagePattern.SafeLine),
Jump(Platform.PlatformPattern.LowLeft, 0.64f),
Basic(GroundY, 0.58f, Platform.MileagePattern.JumpArc),
Slide(SlideObstaclePattern.SlideLayout.RightPair, 0.62f),
Basic(GroundY, 0.60f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.EnergyDrink),
Jump(Platform.PlatformPattern.LowRight, 0.60f),
Basic(GroundY, 0.58f, Platform.MileagePattern.SafeLine),
Aerial(AerialY + 0.14f, 1.55f),
Basic(GroundY, 0.62f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.InvincibleRamen),
Slide(SlideObstaclePattern.SlideLayout.LeftPair, 0.60f),
Basic(GroundY, 0.58f, Platform.MileagePattern.SlideLine),
Jump(Platform.PlatformPattern.LowMid, 0.60f),
Slide(SlideObstaclePattern.SlideLayout.CenterPair, 0.58f),
Basic(GroundY, 0.64f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.HealthSushi),
Aerial(AerialY + 0.05f, 1.70f),
Basic(GroundY, 0.66f, Platform.MileagePattern.SafeLine)
});
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 513d2fc410734352ab7a51ff2f8b5d9f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,55 @@
using static CourseStepFactory;
public static class FallbackCourseProfile {
public static CourseProfile CreateTutorialFallback() {
return CourseProfile.Create(
new CourseStep[] {
Jump(GameManager.TutorialGuideType.Jump, "점프", "가방 장애물이 보이면 왼쪽 클릭으로 뛰어넘습니다."),
Basic(GroundY, LandingSpacing),
Aerial(GameManager.TutorialGuideType.DoubleJump, "2단 점프", "다음 발판이 멀리 있으면 공중에서 한 번 더 왼쪽 클릭합니다."),
Basic(GroundY, LandingSpacing),
Slide(GameManager.TutorialGuideType.Slide, "슬라이드", "천장 표지판이 보이면 오른쪽 클릭을 누르고 지나갑니다."),
Basic(GroundY, LandingSpacing),
ForceHit(GameManager.TutorialGuideType.Damage, "피격", "이번 구간은 일부러 맞아 목숨과 속도 감소를 확인합니다."),
Basic(GroundY, LandingSpacing, Platform.MileagePattern.None, GameManager.TutorialGuideType.Items, GameplayItemCatalog.GetDisplayName(GameManager.TutorialItemType.HealthSushi, Platform.PlatformSkin.Airport), "김밥을 먹으면 잃은 목숨을 1 회복합니다.", Platform.ItemPattern.HealthSushi),
Basic(GroundY, BasicSpacing, Platform.MileagePattern.None, GameManager.TutorialGuideType.Items, GameplayItemCatalog.GetDisplayName(GameManager.TutorialItemType.InvincibleRamen, Platform.PlatformSkin.Airport), "바나나우유를 먹고 다음 충돌을 피해 없이 지나가 봅니다.", Platform.ItemPattern.InvincibleRamen),
ForceHit(GameManager.TutorialGuideType.None, "", ""),
Basic(GroundY, LandingSpacing),
Basic(GroundY, BasicSpacing),
Basic(GroundY, BasicSpacing),
ForceHit(GameManager.TutorialGuideType.None, "", ""),
Basic(GroundY, BasicSpacing, Platform.MileagePattern.None, GameManager.TutorialGuideType.Items, GameplayItemCatalog.GetDisplayName(GameManager.TutorialItemType.EnergyDrink, Platform.PlatformSkin.Airport), "에너지 드링크는 속도를 조금 회복해 일정이 늦어지는 것을 줄입니다.", Platform.ItemPattern.EnergyDrink),
Basic(GroundY, BasicSpacing),
Basic(GroundY, BasicSpacing)
},
CreateGeneralFallbackLoop());
}
public static CourseProfile CreateGeneralFallback() {
return CourseProfile.Create(
new CourseStep[] {
Basic(),
Basic()
},
CreateGeneralFallbackLoop());
}
private static CourseStep[] CreateGeneralFallbackLoop() {
return new CourseStep[] {
Basic(),
Jump(),
Basic(GroundY, LandingSpacing),
Slide(SlideObstaclePattern.SlideLayout.WidePair),
Basic(),
Jump(Platform.PlatformPattern.LowLeft),
Slide(SlideObstaclePattern.SlideLayout.LeftPair),
Basic(),
Jump(Platform.PlatformPattern.LowRight),
Aerial(AerialY, AerialSpacing),
Slide(SlideObstaclePattern.SlideLayout.RightPair),
Jump(Platform.PlatformPattern.LowMid),
Basic(),
Slide(SlideObstaclePattern.SlideLayout.CenterPair)
};
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c10f2b5787bb465ab16291a98eb7a51d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,34 @@
using static CourseStepFactory;
public static class JapanCourseProfile {
public static CourseProfile Create() {
return CourseProfile.Create(
new CourseStep[] {
Basic(GroundY, 0.72f, Platform.MileagePattern.SafeLine),
Basic(GroundY, 0.70f, Platform.MileagePattern.SafeLine),
Jump(Platform.PlatformPattern.LowMid, 0.78f),
Basic(GroundY, 0.70f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.HealthSushi),
Basic(GroundY, 0.68f, Platform.MileagePattern.SafeLine),
Slide(SlideObstaclePattern.SlideLayout.CenterPair, 0.76f),
Basic(GroundY, 0.70f, Platform.MileagePattern.SafeLine)
},
new CourseStep[] {
Basic(GroundY, 0.68f, Platform.MileagePattern.SafeLine),
Jump(Platform.PlatformPattern.LowMid, 0.74f),
Basic(GroundY, 0.70f, Platform.MileagePattern.JumpArc),
Basic(GroundY, 0.66f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.HealthSushi),
Slide(SlideObstaclePattern.SlideLayout.CenterPair, 0.74f),
Basic(GroundY, 0.70f, Platform.MileagePattern.SlideLine),
Aerial(AerialY, 2.05f),
Basic(GroundY, 0.72f, Platform.MileagePattern.SafeLine),
Jump(Platform.PlatformPattern.LowLeft, 0.72f),
Basic(GroundY, 0.66f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.InvincibleRamen),
Basic(GroundY, 0.68f, Platform.MileagePattern.SafeLine),
Slide(SlideObstaclePattern.SlideLayout.RightPair, 0.72f),
Basic(GroundY, 0.66f, Platform.MileagePattern.None, GameManager.TutorialGuideType.None, "", "", Platform.ItemPattern.EnergyDrink),
Jump(Platform.PlatformPattern.LowRight, 0.72f),
Basic(GroundY, 0.72f, Platform.MileagePattern.SafeLine),
Basic(GroundY, 0.76f, Platform.MileagePattern.SafeLine)
});
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0ec45d923be242e3bf69387973545026
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,37 @@
using static CourseStepFactory;
public static class TutorialCourseProfile {
public static CourseProfile Create() {
return CourseProfile.Create(
new CourseStep[] {
Basic(),
Basic(),
Basic(GroundY, BasicSpacing),
Jump(GameManager.TutorialGuideType.Jump, "점프 구간", "가방 장애물이 오면 왼쪽 클릭으로 뛰어넘습니다."),
Basic(GroundY, LandingSpacing),
Basic(GroundY, BasicSpacing),
Aerial(GameManager.TutorialGuideType.DoubleJump, "2단 점프 구간", "다음 발판이 멀리 떨어져 있습니다.\n공중에서 왼쪽 클릭을 한 번 더 누릅니다."),
Basic(GroundY, LandingSpacing),
Basic(GroundY, BasicSpacing),
Slide(GameManager.TutorialGuideType.Slide, "슬라이드 구간", "천장 장애물이 오면 오른쪽 클릭을 누르고 지나갑니다."),
Basic(GroundY, LandingSpacing),
Basic(GroundY, BasicSpacing),
ForceHit(GameManager.TutorialGuideType.None, "", ""),
Basic(GroundY, LandingSpacing, Platform.MileagePattern.None, GameManager.TutorialGuideType.Items, "김밥", "잃은 목숨을 1 회복합니다.\n방금 줄어든 목숨을 채워 봅니다.", Platform.ItemPattern.HealthSushi),
Basic(GroundY, LandingSpacing),
Basic(GroundY, BasicSpacing, Platform.MileagePattern.None, GameManager.TutorialGuideType.Items, "바나나우유", "잠깐 무적이 됩니다.\n먹은 뒤 다음 장애물에 일부러 부딪혀 봅니다.", Platform.ItemPattern.InvincibleRamen),
ForceHit(GameManager.TutorialGuideType.None, "", ""),
Basic(GroundY, LandingSpacing),
Basic(GroundY, LandingSpacing),
ForceHit(GameManager.TutorialGuideType.None, "", ""),
Basic(GroundY, BasicSpacing, Platform.MileagePattern.None, GameManager.TutorialGuideType.Items, "에너지 드링크", "느려진 속도를 조금 회복합니다.\n방금 떨어진 속도를 되돌려 봅니다.", Platform.ItemPattern.EnergyDrink),
Basic(GroundY, LandingSpacing, Platform.MileagePattern.None, GameManager.TutorialGuideType.Items, "실전 연습", "시간이 지나면 달리기 속도는 조금씩 빨라지고, 장애물에 맞으면 느려집니다.\n방금 먹은 에너지 드링크로 회복한 뒤 출국 게이트까지 달려보세요."),
Basic(GroundY, BasicSpacing, Platform.MileagePattern.SafeLine),
Basic(),
Basic(),
Basic(),
Basic(GroundY, LandingSpacing)
},
CreateEasyLoop());
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 755fb689f3ff4855a3193f4711b10fa5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: