Add rank, friends, fishing, and camp treasure with T2 studio models and skill presentation.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
udx
2026-10-21 23:01:31 +08:00
co-authored by Cursor
parent 89e0fa246f
commit 079313fb06
677 changed files with 395371 additions and 9692 deletions
+12 -6
View File
@@ -20,16 +20,16 @@ public static class BuildPrototype
/// <summary>Validated formal partner art by pet id; other ids keep primitive stand-ins until their art passes review.</summary>
static readonly System.Collections.Generic.Dictionary<int, string> FormalPets = new System.Collections.Generic.Dictionary<int, string>
{
[0] = Animal + "RockBall/RockBall_Rigged.prefab", [1] = Animal + "FireCat/FireCat_Companion.prefab", [2] = Animal + "BudBud/BudBud_Companion.prefab",
[3] = Animal + "SparkBird/SparkBird_Companion.prefab", [4] = Animal + "BubbleTurtle/BubbleTurtle_Companion.prefab",
[5] = Animal + "RockRhino/RockRhino_Companion.prefab", [6] = Animal + "FlameLion/FlameLion_Companion.prefab",
[7] = Animal + "VineSprite/VineSprite_Companion.prefab", [8] = Animal + "ThunderLeopard/ThunderLeopard_Companion.prefab", [9] = Animal + "TideWhale/TideWhale_Companion.prefab",
[0] = Animal + "RockBallStudio/RockBallStudio_Companion.prefab", [1] = Animal + "FireCatStudio/FireCatStudio_Companion.prefab", [2] = Animal + "BudBudStudio/BudBudStudio_Companion.prefab",
[3] = Animal + "SparkBirdStudio/SparkBirdStudio_Companion.prefab", [4] = Animal + "BubbleTurtle/BubbleTurtle_Companion.prefab",
[5] = Animal + "RockRhinoStudio/RockRhinoStudio_Companion.prefab", [6] = Animal + "FlameLion/FlameLion_Companion.prefab",
[7] = Animal + "VineSpriteStudio/VineSpriteStudio_Companion.prefab", [8] = Animal + "ThunderLeopardStudio/ThunderLeopardStudio_Companion.prefab", [9] = Animal + "TideWhaleStudio/TideWhaleStudio_Companion.prefab",
};
/// <summary>Battle height in arena units; the authored models are ~0.55m and the lanes are 3 units apart.</summary>
public const float FormalHeight = 1.5f;
const string Enemy = "Assets/Bundles/Characters/Enemy/";
/// <summary>Formal enemy art by enemy type id (greenfield.json enemies 0..4), nested under every Enemies/EnemyN slot as Type{t}.</summary>
static readonly string[] FormalEnemies = { Enemy + "Hornlet/Hornlet_Enemy.prefab", Enemy + "Dashlet/Dashlet_Enemy.prefab", Enemy + "Shellhorn/Shellhorn_Enemy.prefab", Enemy + "HornCaptain/HornCaptain_Enemy.prefab", Enemy + "GreatHorn/GreatHorn_Enemy.prefab" };
static readonly string[] FormalEnemies = { Enemy + "HornletStudio/HornletStudio_Enemy.prefab", Enemy + "DashletStudio/DashletStudio_Enemy.prefab", Enemy + "ShellhornStudio/ShellhornStudio_Enemy.prefab", Enemy + "HornCaptainStudio/HornCaptainStudio_Enemy.prefab", Enemy + "GreatHornStudio/GreatHornStudio_Enemy.prefab" };
/// <summary>Base enemy height in arena units; the runtime still scales captains x1.2 and bosses x1.55.</summary>
public const float EnemyHeight = 1.2f;
static Material _cream, _rock, _orange, _leaf, _dark, _white, _cyan, _grass, _path, _monster, _yellow, _water, _ember, _violet;
@@ -305,6 +305,12 @@ public static class BuildPrototype
if (child.name == "Ground" || child.name == "Lane" || child.name == "LeftBorder" || child.name == "RightBorder" || child.name == "BattleLight") child.gameObject.SetActive(false);
}
var enemyFeedback = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Effects/EnemyCombat/EnemyCombatPresentation.prefab");
var skillFeedback = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Combat/BattleSkillPresentation.prefab");
if(skillFeedback!=null)
{
foreach(string group in new[]{"Heroes","Enemies"})foreach(Transform actor in root.transform.Find(group)){var muzzle=new GameObject("SkillMuzzle").transform;muzzle.SetParent(actor,false);muzzle.localPosition=new Vector3(0,group=="Heroes"?.85f:.8f,-.48f);muzzle.gameObject.layer=30;}
PrefabUtility.InstantiatePrefab(skillFeedback,root.transform);
}
if (enemyFeedback != null) PrefabUtility.InstantiatePrefab(enemyFeedback, root.transform);
PrefabUtility.SaveAsPrefabAsset(root, World + "/PrototypeArena.prefab");
}
@@ -390,7 +396,7 @@ public static class BuildPrototype
var enemies = root.transform.Find("Enemies") ?? throw new Exception("Arena missing Enemies");
foreach (Transform slot in enemies)
{
foreach (var child in slot.Cast<Transform>().Where(c => c.name != "SlowMark").ToArray()) UnityEngine.Object.DestroyImmediate(child.gameObject);
foreach (var child in slot.Cast<Transform>().Where(c => c.name != "SlowMark" && c.name != "SkillMuzzle").ToArray()) UnityEngine.Object.DestroyImmediate(child.gameObject);
if (!FormalEnemyVisuals(slot)) throw new Exception("Formal enemy prefabs incomplete: " + string.Join(", ", FormalEnemies.Where(p => AssetDatabase.LoadAssetAtPath<GameObject>(p) == null)));
}
PrefabUtility.SaveAsPrefabAsset(root, World + "/PrototypeArena.prefab");