= před 4 roky
rodič
revize
9ff6a1c8a9

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
Assets/Plugins/TextMesh Pro/Resources/Fonts & Materials/SOURCEHANSANSCN-NORMAL SDF.asset


+ 1 - 1
Assets/Resources/Dice/DiceEntity.cs

@@ -68,7 +68,7 @@ public class DiceEntity : MonoBehaviour {
         endObj.GetComponent<DiceUI>().UpdateColor();
         endObj.GetComponent<DiceUI>().UpdateColor();
         yield return new WaitForSeconds(0.1f);
         yield return new WaitForSeconds(0.1f);
         // 销毁
         // 销毁
-        transform.localScale = Vector3.zero; Destroy(gameObject, 1);
+        Modules.DestroyGameObject(gameObject);
     }
     }
 
 
 
 

+ 10 - 2
Assets/Resources/Entities/Bullet.cs

@@ -1,12 +1,20 @@
+using DG.Tweening;
 using System.Collections;
 using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine;
 
 
 public class Bullet : MonoBehaviour {
 public class Bullet : MonoBehaviour {
 
 
+    public GameObject bulletHit;
     private void OnCollisionEnter2D(Collision2D collision) {
     private void OnCollisionEnter2D(Collision2D collision) {
-        if (!collision.gameObject.CompareTag("Border")) AudioM.Play("bullet_explode", 0.2f);
-        transform.localScale = Vector3.zero; Destroy(gameObject, 1);
+        if (!collision.gameObject.CompareTag("Border")) {
+            AudioM.Play("bullet_explode", 0.2f);
+            var newBulletHit = GameObject.Instantiate(bulletHit);
+            newBulletHit.transform.position = collision.contacts[0].point;
+            newBulletHit.transform.DOScale(Vector3.zero, 0.2f)
+                .onComplete += () => { Modules.DestroyGameObject(newBulletHit); };
+        }
+        Modules.DestroyGameObject(gameObject);
     }
     }
 
 
 }
 }

+ 1 - 0
Assets/Resources/Entities/Bullet.prefab

@@ -146,3 +146,4 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 4da3bc50a479fb74f89432d9e58aa1be, type: 3}
   m_Script: {fileID: 11500000, guid: 4da3bc50a479fb74f89432d9e58aa1be, type: 3}
   m_Name: 
   m_Name: 
   m_EditorClassIdentifier: 
   m_EditorClassIdentifier: 
+  bulletHit: {fileID: 1388621396339534014, guid: 926cca79d57bb3645bf2438be6beeed4, type: 3}

+ 86 - 0
Assets/Resources/Entities/BulletHit.prefab

@@ -0,0 +1,86 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1388621396339534014
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7067060048847563739}
+  - component: {fileID: 5794859609598766711}
+  m_Layer: 0
+  m_Name: BulletHit
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &7067060048847563739
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1388621396339534014}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 1000, y: 1000, z: 0}
+  m_LocalScale: {x: 0.6, y: 0.6, z: 0.6}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &5794859609598766711
+SpriteRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1388621396339534014}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 0
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 0
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 3
+  m_Sprite: {fileID: -2413806693520163455, guid: a86470a33a6bf42c4b3595704624658b, type: 3}
+  m_Color: {r: 0.9686275, g: 0.5568628, b: 0.10980393, a: 1}
+  m_FlipX: 0
+  m_FlipY: 0
+  m_DrawMode: 0
+  m_Size: {x: 1, y: 1}
+  m_AdaptiveModeThreshold: 0.5
+  m_SpriteTileMode: 0
+  m_WasSpriteAssigned: 1
+  m_MaskInteraction: 0
+  m_SpriteSortPoint: 0

+ 7 - 0
Assets/Resources/Entities/BulletHit.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 926cca79d57bb3645bf2438be6beeed4
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
Assets/Resources/Entities/EnemyArrow.cs

@@ -10,7 +10,7 @@ public class EnemyArrow : EnemyBase {
     internal override bool isPressingRight() => !movingLeft;
     internal override bool isPressingRight() => !movingLeft;
 
 
     internal override void OnHitEnemy(Collision2D collision) {
     internal override void OnHitEnemy(Collision2D collision) {
-        transform.localScale = Vector3.zero; Destroy(gameObject, 1);
+        Modules.DestroyGameObject(gameObject);
     }
     }
 
 
 }
 }

+ 2 - 4
Assets/Resources/Entities/EnemyBase.cs

@@ -17,9 +17,7 @@ public abstract class EnemyBase : EntityBase {
     public bool movingLeft = false;
     public bool movingLeft = false;
     internal override void OnHitBorder() {
     internal override void OnHitBorder() {
         // ËÀÍö
         // ËÀÍö
-        transform.position = new Vector3(1000, 1000);
-        gameObject.SetActive(false);
-        Destroy(gameObject, 1);
+        Modules.DestroyGameObject(gameObject);
     }
     }
 
 
     public int hp; internal int currentHp = -1;
     public int hp; internal int currentHp = -1;
@@ -31,7 +29,7 @@ public abstract class EnemyBase : EntityBase {
         currentHp--;
         currentHp--;
         if (currentHp <= 0) {
         if (currentHp <= 0) {
             AudioM.Play("enemy_die", 0.7f);
             AudioM.Play("enemy_die", 0.7f);
-            OnHitBorder();
+            Modules.DestroyGameObject(gameObject);
         }
         }
     }
     }
 
 

+ 1 - 1
Assets/Resources/Entities/EnemyShooterBullet.cs

@@ -10,7 +10,7 @@ public class EnemyShooterBullet : EnemyBase {
     internal override bool isPressingRight() => !movingLeft;
     internal override bool isPressingRight() => !movingLeft;
 
 
     internal override void OnHitEnemy(Collision2D collision) {
     internal override void OnHitEnemy(Collision2D collision) {
-        transform.localScale = Vector3.zero; Destroy(gameObject, 1);
+        Modules.DestroyGameObject(gameObject);
     }
     }
 
 
 }
 }

+ 10 - 3
Assets/Resources/Entities/Player.cs

@@ -72,7 +72,7 @@ public class Player : EntityBase {
     public GameObject bullet; public TMPro.TextMeshProUGUI textBullet;
     public GameObject bullet; public TMPro.TextMeshProUGUI textBullet;
     internal override void OnUpdate() {
     internal override void OnUpdate() {
         // 反向
         // 反向
-        if ((towardsRight && isPressingLeft()) || (!towardsRight && isPressingRight())) {
+        if ((towardsRight && isPressingLeft() && !isPressingRight()) || (!towardsRight && isPressingRight() && !isPressingLeft())) {
             towardsRight = !towardsRight;
             towardsRight = !towardsRight;
             transform.DOScaleX(towardsRight ? 1 : -1, 0.15f);
             transform.DOScaleX(towardsRight ? 1 : -1, 0.15f);
         }
         }
@@ -106,6 +106,11 @@ public class Player : EntityBase {
             Vector2 fromPos = transform.position + Vector3.up * ((canCrouch && isPressingCrouch()) ? 0.55f : 1.3f);
             Vector2 fromPos = transform.position + Vector3.up * ((canCrouch && isPressingCrouch()) ? 0.55f : 1.3f);
             Vector2 toPos = AspectUtility.cam.ScreenToWorldPoint(Input.mousePosition);
             Vector2 toPos = AspectUtility.cam.ScreenToWorldPoint(Input.mousePosition);
             Vector2 shootVector = (toPos - fromPos).normalized;
             Vector2 shootVector = (toPos - fromPos).normalized;
+            // 随机散布
+            shootVector.x *= 1f + (float) (Modules.randomDefault.NextDouble() * 0.4f - 0.2f);
+            shootVector.y *= 1f + (float) (Modules.randomDefault.NextDouble() * 0.4f - 0.2f);
+            shootVector.Normalize();
+            // 生成
             GameObject newBullet = Instantiate(bullet, fromPos, Quaternion.identity);
             GameObject newBullet = Instantiate(bullet, fromPos, Quaternion.identity);
             newBullet.GetComponent<Rigidbody2D>().velocity = bulletSpeed * shootVector;
             newBullet.GetComponent<Rigidbody2D>().velocity = bulletSpeed * shootVector;
             newBullet.transform.eulerAngles = (shootVector.x > 0 ? -1 : 1) * Vector2.Angle(shootVector, Vector2.up) * Vector3.forward;
             newBullet.transform.eulerAngles = (shootVector.x > 0 ? -1 : 1) * Vector2.Angle(shootVector, Vector2.up) * Vector3.forward;
@@ -114,8 +119,10 @@ public class Player : EntityBase {
         } else if (currentShootDelay > 0) {
         } else if (currentShootDelay > 0) {
             currentShootDelay -= Time.deltaTime;
             currentShootDelay -= Time.deltaTime;
         }
         }
-        if (Input.GetKeyDown(InputM.GetKeyRaw(InputM.KeyType.Fire)) && currentBullet == 0 && currentReloadDelay <= 0f) {
-            AudioM.Play("butte_empty");
+        string fireKey = InputM.GetKeyRaw(InputM.KeyType.Fire);
+        bool isFireDown = fireKey == "l" ? Input.GetMouseButton(0) : (fireKey == "r" ? Input.GetMouseButton(1) : Input.GetKey(fireKey));
+        if (isFireDown && currentBullet == 0 && currentReloadDelay <= 0f) {
+            AudioM.Play("bullet_empty", 0.7f);
         }
         }
         // 更新 UI
         // 更新 UI
         textBullet.text = currentReloadDelay > 0f ?
         textBullet.text = currentReloadDelay > 0f ?

+ 6 - 0
Assets/Resources/System/Modules.cs

@@ -33,4 +33,10 @@ public static class Modules {
         return list;
         return list;
     }
     }
 
 
+    public static void DestroyGameObject(GameObject obj) {
+        obj.transform.position = new Vector3(1000, 1000);
+        obj.SetActive(false);
+        GameObject.Destroy(obj, 1);
+    }
+
 }
 }

+ 59 - 29
Assets/Resources/System/StoryM.cs

@@ -58,15 +58,18 @@ public class StoryM : MonoBehaviour {
         }
         }
         // 实际刷怪
         // 实际刷怪
         spawners[type].Shuffle();
         spawners[type].Shuffle();
+        int id = 0;
         for (int i = 0; i < count; i++) {
         for (int i = 0; i < count; i++) {
-            if (i >= spawners[type].Count) i = 0;
-            spawners[type][i].Spawn();
+            if (id >= spawners[type].Count) id = 0;
+            spawners[type][id].Spawn();
+            id++;
         }
         }
     }
     }
 
 
     // 流程控制
     // 流程控制
     IEnumerator WaitUntilClear(int remain, float waitTime = -1, string textCn = "", string textEn = "") {
     IEnumerator WaitUntilClear(int remain, float waitTime = -1, string textCn = "", string textEn = "") {
-        while (GetEnemyCount() > remain && !respawning) {
+        int targetStage = stage;
+        while (GetEnemyCount() > remain && !respawning && targetStage == stage) {
             if (waitTime >= 0f && waitTime < 0.3f) SetStoryText(textCn, textEn);
             if (waitTime >= 0f && waitTime < 0.3f) SetStoryText(textCn, textEn);
             waitTime -= 0.3f;
             waitTime -= 0.3f;
             yield return new WaitForSeconds(0.3f);
             yield return new WaitForSeconds(0.3f);
@@ -74,7 +77,8 @@ public class StoryM : MonoBehaviour {
     }
     }
     int GetEnemyCount() => FindObjectsOfType<EnemyBase>().Length - FindObjectsOfType<EnemyArrow>().Length;
     int GetEnemyCount() => FindObjectsOfType<EnemyBase>().Length - FindObjectsOfType<EnemyArrow>().Length;
     IEnumerator WaitUntilPickDice(float waitTime = -1, string textCn = "", string textEn = "") {
     IEnumerator WaitUntilPickDice(float waitTime = -1, string textCn = "", string textEn = "") {
-        while (GetDiceCount() > 0 && !respawning) {
+        int targetStage = stage;
+        while (GetDiceCount() > 0 && !respawning && targetStage == stage) {
             if (waitTime >= 0f && waitTime < 0.3f) SetStoryText(textCn, textEn);
             if (waitTime >= 0f && waitTime < 0.3f) SetStoryText(textCn, textEn);
             waitTime -= 0.3f;
             waitTime -= 0.3f;
             yield return new WaitForSeconds(0.3f);
             yield return new WaitForSeconds(0.3f);
@@ -126,13 +130,13 @@ public class StoryM : MonoBehaviour {
                 0 => SetStoryText("完了,寄咯!", "Woops, you died!"),
                 0 => SetStoryText("完了,寄咯!", "Woops, you died!"),
                 1 => SetStoryText("哦吼,下辈子加油吧", "Ouch, work harder next life!"),
                 1 => SetStoryText("哦吼,下辈子加油吧", "Ouch, work harder next life!"),
                 2 => SetStoryText("诶,怎么回事?", "Yo, what's happening?"),
                 2 => SetStoryText("诶,怎么回事?", "Yo, what's happening?"),
-                3 => SetStoryText("还好没开极限模式……", "Luckily I didn't have hardcore mode on..."),
+                3 => SetStoryText("还好我没开极限模式……", "Luckily I didn't have hardcore mode on..."),
                 _ => throw new System.NotImplementedException(),
                 _ => throw new System.NotImplementedException(),
             };
             };
         } else {
         } else {
             _ = Modules.randomDefault.Next(0, 3) switch {
             _ = Modules.randomDefault.Next(0, 3) switch {
-                0 => SetStoryText("不是吧?这也能死?", "What? How you die from that?"),
-                1 => SetStoryText("你是特么故意的吧!", "Excuse me? Are you doing this on purpose?"),
+                0 => SetStoryText("不是吧?不至于吧?", "What? How you die from that?"), //TODO: t 改了
+                1 => SetStoryText("你是特么故意的吧!", "Excuse me? Are you doing this on purpose?"), //TODO: t 肯定语气
                 2 => SetStoryText("嗯?", "Hey!"),
                 2 => SetStoryText("嗯?", "Hey!"),
                 _ => throw new System.NotImplementedException(),
                 _ => throw new System.NotImplementedException(),
             };
             };
@@ -142,7 +146,7 @@ public class StoryM : MonoBehaviour {
         panDeath.DOFade(1, 0.3f); panDeath.GetComponentInChildren<TMPro.TextMeshProUGUI>().DOFade(1, 1f);
         panDeath.DOFade(1, 0.3f); panDeath.GetComponentInChildren<TMPro.TextMeshProUGUI>().DOFade(1, 1f);
         yield return new WaitForSeconds(0.3f);
         yield return new WaitForSeconds(0.3f);
         // 复原
         // 复原
-        FindObjectsOfType<EnemyBase>().ToList().ForEach(e => GameObject.Destroy(e.gameObject, 1f));
+        FindObjectsOfType<EnemyBase>().ToList().ForEach(e => Modules.DestroyGameObject(e.gameObject));
         Player.hp = 3;
         Player.hp = 3;
         Player.instance.currentBullet = Player.instance.maxBullet;
         Player.instance.currentBullet = Player.instance.maxBullet;
         yield return new WaitForSeconds(3f);
         yield return new WaitForSeconds(3f);
@@ -170,12 +174,12 @@ public class StoryM : MonoBehaviour {
     IEnumerator Stage2() {
     IEnumerator Stage2() {
         arrowMax = 1; noDifficulty = false;
         arrowMax = 1; noDifficulty = false;
         Spawn(Spawner.EnemyType.Mover, 2);
         Spawn(Spawner.EnemyType.Mover, 2);
-        yield return StartCoroutine(WaitForStoryText("哦,教程最后一条……", "Oh, a final reminder before I leave...")); //TODO t 不会leave...
-        Spawn(Spawner.EnemyType.Mover, 2);
-        yield return StartCoroutine(WaitForStoryText("弹药不够的时候记得右键换弹!", "Don't forget to reload the weapon before you run out of ammo!")); //TODO t
+        yield return StartCoroutine(WaitForStoryText("哦,还剩下最后一条教程……", "Oh, a final reminder before I leave...")); //TODO t
+        Spawn(Spawner.EnemyType.Mover, deathInStage <= 0 ? 2 : 1);
+        yield return StartCoroutine(WaitForStoryText("“弹药不够的时候记得右键换弹!”", "Don't forget to reload the weapon before you run out of ammo!")); //TODO t
         Spawn(Spawner.EnemyType.Shooter, 1);
         Spawn(Spawner.EnemyType.Shooter, 1);
         Spawn(Spawner.EnemyType.Mover, 1);
         Spawn(Spawner.EnemyType.Mover, 1);
-        SetStoryText("加油,教程结束了!", "There you go, that's end of the tutrial!");
+        SetStoryText("加油,新手教程结束了!", "There you go, that's end of the tutrial!");
         yield return StartCoroutine(WaitUntilClear(1, 8f, "仔细一看,这个角色的手上连枪都没有……", "Hmm... He does not even have a gun in his hand after a closer look."));
         yield return StartCoroutine(WaitUntilClear(1, 8f, "仔细一看,这个角色的手上连枪都没有……", "Hmm... He does not even have a gun in his hand after a closer look."));
         if (Player.hp < 3) {
         if (Player.hp < 3) {
             Player.hp = 3;
             Player.hp = 3;
@@ -187,20 +191,20 @@ public class StoryM : MonoBehaviour {
     IEnumerator Stage3() {
     IEnumerator Stage3() {
         arrowMax = 3; noDifficulty = false;
         arrowMax = 3; noDifficulty = false;
         Spawn(Spawner.EnemyType.Mover, 1);
         Spawn(Spawner.EnemyType.Mover, 1);
-        yield return StartCoroutine(WaitForStoryText("说实话啊,我觉得这个游戏有点无聊", "To be honest, I think this game is kind of boring..."));
+        yield return StartCoroutine(WaitForStoryText("说实话啊,我感觉这个游戏有点……敷衍", "To be honest, I think this game is kind of boring...")); //TODO: t 文案改了
         Spawn(Spawner.EnemyType.Mover, 1);
         Spawn(Spawner.EnemyType.Mover, 1);
         yield return StartCoroutine(WaitForStoryText("我看了看,这游戏往后的新内容就只剩一种换皮怪了!", "Let's see... We only have one more skin to replace our monsters!"));
         yield return StartCoroutine(WaitForStoryText("我看了看,这游戏往后的新内容就只剩一种换皮怪了!", "Let's see... We only have one more skin to replace our monsters!"));
         Spawn(Spawner.EnemyType.Mover, 1);
         Spawn(Spawner.EnemyType.Mover, 1);
-        yield return StartCoroutine(WaitForStoryText("然后就是“在无限的怪物中生存下来吧!”的无尽模式……", "And then, all we have is endless mode of \"Survive with infinite monsters!\"..."));
-        Spawn(Spawner.EnemyType.Mover, 1);
-        yield return StartCoroutine(WaitForStoryText("没有升级,没有装备,没有峰回路转的牛逼剧情", "No upgrade, no equipments, no twist to the plot or any boss to fight."));
+        yield return StartCoroutine(WaitForStoryText("然后就只剩无尽模式了……但无尽模式谁玩啊?", "And then, all we have is endless mode of \"Survive with infinite monsters!\"...")); //TODO: t 文案改了
         Spawn(Spawner.EnemyType.Shooter, 1);
         Spawn(Spawner.EnemyType.Shooter, 1);
-        yield return StartCoroutine(WaitForStoryText("并且最重要的是,“丢骰子”的主题呢?", "And most importantly, where's our \"Roll of the Dice\" theme?"));
-        yield return StartCoroutine(WaitForStoryText("骰子、骰子……哪儿有骰子……?", "Dice... Dice... Where is the dice...?"));
-        SetStoryText("这里一个骰子都没有!", "Not a single dice here!");
-        arrowMax = 0;
+        yield return StartCoroutine(WaitForStoryText("没有升级,没有装备,没有峰回路转的牛逼剧情", "No upgrade, no equipments, no twist to the plot or any boss to fight."));
         Spawn(Spawner.EnemyType.Mover, 1);
         Spawn(Spawner.EnemyType.Mover, 1);
-        yield return StartCoroutine(WaitUntilClear(0, 5f, "切题呢?作者到底咋想的?", "What's the point? What's wrong with this author?"));
+        yield return StartCoroutine(WaitForStoryText("并且最重要的是,说好的“丢骰子”呢?", "And most importantly, where's our \"Roll of the Dice\" theme?")); //TODO t
+        yield return StartCoroutine(WaitForStoryText("骰子、骰子……让我找找哪儿有骰子……?", "Dice... Dice... Where is the dice...?")); //TODO: t
+        SetStoryText("这个游戏里一个骰子都没有!", "Not a single dice here!"); //TODO: t
+        arrowMax = 0;
+        Spawn(Spawner.EnemyType.Mover, deathInStage <= 0 ? 2 : 1);
+        yield return StartCoroutine(WaitUntilClear(0, 6f, "切题呢?作者到底咋想的?", "What's the point? What's wrong with this author?"));
         noDifficulty = true;
         noDifficulty = true;
         yield return StartCoroutine(WaitForStoryText("要不然这样,我们随便拿个东西,把它弄成骰子算了", "How about we just grab something and make it a dice?"));
         yield return StartCoroutine(WaitForStoryText("要不然这样,我们随便拿个东西,把它弄成骰子算了", "How about we just grab something and make it a dice?"));
         yield return new WaitForSeconds(2f);
         yield return new WaitForSeconds(2f);
@@ -232,15 +236,15 @@ public class StoryM : MonoBehaviour {
     IEnumerator Stage6() {
     IEnumerator Stage6() {
         arrowMax = 1; noDifficulty = false;
         arrowMax = 1; noDifficulty = false;
         Spawn(Spawner.EnemyType.Mover, 3);
         Spawn(Spawner.EnemyType.Mover, 3);
-        yield return StartCoroutine(WaitUntilClear(1, 6f, "骰子有六面,按键有六个,完美!", "Six sides to six buttons, perfect!"));
+        yield return StartCoroutine(WaitUntilClear(1, 6f, "骰子有六面,按键有六个,简直完美!", "Six sides to six buttons, perfect!"));
         Spawn(Spawner.EnemyType.Shooter, 1);
         Spawn(Spawner.EnemyType.Shooter, 1);
         yield return StartCoroutine(WaitForStoryText("感觉如何?", "How do you feel?"));
         yield return StartCoroutine(WaitForStoryText("感觉如何?", "How do you feel?"));
-        arrowMax = 3;
+        arrowMax = deathInStage <= 1 ? 3 : 1;
         yield return StartCoroutine(WaitForStoryText("是不是还想马上再来一颗?", "Want to have another dice now?"));
         yield return StartCoroutine(WaitForStoryText("是不是还想马上再来一颗?", "Want to have another dice now?"));
         Spawn(Spawner.EnemyType.Mover, 2);
         Spawn(Spawner.EnemyType.Mover, 2);
         yield return StartCoroutine(WaitForStoryText("但如果给你太多骰子,那岂不是显得它很……普通", "But if I give you too many dices, it will look... ordinary."));
         yield return StartCoroutine(WaitForStoryText("但如果给你太多骰子,那岂不是显得它很……普通", "But if I give you too many dices, it will look... ordinary."));
         arrowMax = 1;
         arrowMax = 1;
-        Spawn(Spawner.EnemyType.Mover, 1);
+        Spawn(Spawner.EnemyType.Shooter, 1);
         yield return StartCoroutine(WaitForStoryText("不如让我们先等等,我先给你看看之前说的新敌人", "Why don't we wait while I show you the new enemy we were talking about...?"));
         yield return StartCoroutine(WaitForStoryText("不如让我们先等等,我先给你看看之前说的新敌人", "Why don't we wait while I show you the new enemy we were talking about...?"));
         SetStoryText("额……就是换皮的那个", "Ugh... That monster with new skin!");
         SetStoryText("额……就是换皮的那个", "Ugh... That monster with new skin!");
         Spawn(Spawner.EnemyType.Mover, 1);
         Spawn(Spawner.EnemyType.Mover, 1);
@@ -265,7 +269,7 @@ public class StoryM : MonoBehaviour {
         } else {
         } else {
             yield return StartCoroutine(WaitForStoryText("唉,惹麻烦了……", ""));
             yield return StartCoroutine(WaitForStoryText("唉,惹麻烦了……", ""));
         }
         }
-        yield return StartCoroutine(WaitUntilClear(2, 6f, "我的锯片……", ""));
+        yield return StartCoroutine(WaitUntilClear(2, 7f, "我的锯片……", ""));
         yield return StartCoroutine(WaitForStoryText("要不然……我再给你一颗特制按键骰子™作为补偿?", ""));
         yield return StartCoroutine(WaitForStoryText("要不然……我再给你一颗特制按键骰子™作为补偿?", ""));
         yield return new WaitForSeconds(1f);
         yield return new WaitForSeconds(1f);
         InputM.DropDice(new List<InputM.KeyType>() { InputM.KeyType.Left, InputM.KeyType.Right, InputM.KeyType.Crouch }.RandomOne());
         InputM.DropDice(new List<InputM.KeyType>() { InputM.KeyType.Left, InputM.KeyType.Right, InputM.KeyType.Crouch }.RandomOne());
@@ -274,15 +278,41 @@ public class StoryM : MonoBehaviour {
     }
     }
     IEnumerator Stage8() {
     IEnumerator Stage8() {
         arrowMax = 0; noDifficulty = true;
         arrowMax = 0; noDifficulty = true;
-        yield return StartCoroutine(WaitUntilPickDice(5f, "难道说你不喜欢特制按键骰子™吗?别吧", ""));
+        yield return StartCoroutine(WaitUntilPickDice(6f, "难道说你不喜欢特制按键骰子™吗?别吧", ""));
         stageCompleted = true;
         stageCompleted = true;
     }
     }
     IEnumerator Stage9() {
     IEnumerator Stage9() {
-        arrowMax = 1; noDifficulty = false;
+        arrowMax = 0; noDifficulty = true;
         yield return new WaitForSeconds(7f);
         yield return new WaitForSeconds(7f);
-        yield return StartCoroutine(WaitForStoryText("唔,看起来特制按键骰子™的威力还挺大", ""));
+        stageCompleted = true;
+    }
+    IEnumerator Stage10() {
+        arrowMax = deathInStage <= 2 ? 0 : 2; noDifficulty = false;
+        yield return StartCoroutine(WaitForStoryText("唔,看起来特制按键骰子™的威力还挺大……", ""));
+        Spawn(Spawner.EnemyType.Mover, deathInStage <= 0 ? 4 : 3);
+        yield return new WaitForSeconds(1.5f);
+        SetStoryText("呼,圆锯片看起来也还剩了不少", "");
+        yield return StartCoroutine(WaitUntilClear(1, 10f, "哇哦……", ""));
+        Spawn(Spawner.EnemyType.Shooter, deathInStage <= 1 ? 3 : 2);
+        yield return StartCoroutine(WaitForStoryText("看起来我低估了特制按键骰子™的……", ""));
+        SetStoryText("刺激程度", "");
+        yield return StartCoroutine(WaitUntilClear(2, 10f, "这不比原来好玩多了嘛!", ""));
+        stageCompleted = true;
     }
     }
-    
+    IEnumerator Stage11() {
+        arrowMax = 2; noDifficulty = false;
+        yield return StartCoroutine(WaitForStoryText("既然骰子™能为游戏的玩法带来颠覆性的体验", ""));
+        SetStoryText("那我们为啥不再立即多来几颗呢?", "");
+        yield return new WaitForSeconds(2f);
+        Spawn(Spawner.EnemyType.Heavy, 1);
+        yield return new WaitForSeconds(1f);
+        yield return StartCoroutine(WaitForStoryText("什么?", ""));
+        Spawn(Spawner.EnemyType.Heavy, 1);
+        yield return StartCoroutine(WaitForStoryText("那是我之前说的最后一种换皮怪!", ""));
+        yield return StartCoroutine(WaitForStoryText("它怎么在这个时候漏下来了?", ""));
+        Spawn(Spawner.EnemyType.Heavy, 2);
+    }
+
 
 
     int arrowMax = 0; float arrowTime = 4f;
     int arrowMax = 0; float arrowTime = 4f;
     IEnumerator ArrowSpawner() {
     IEnumerator ArrowSpawner() {

+ 2 - 2
Assets/Scenes/SceneMain.unity

@@ -1621,10 +1621,10 @@ MonoBehaviour:
   horizontalA: 0.07
   horizontalA: 0.07
   jumpThreshold: 0.05
   jumpThreshold: 0.05
   downA: 0.5
   downA: 0.5
-  fallA: 0.6
+  fallA: 0.4
   filpSpeed: 0.6
   filpSpeed: 0.6
   jumpBufferTime: 0.15
   jumpBufferTime: 0.15
-  jumpWolfTime: 0.2
+  jumpWolfTime: 0.15
   baseMass: 1
   baseMass: 1
   hearts:
   hearts:
   - {fileID: 181884992}
   - {fileID: 181884992}

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů