Archived on 2026-10-24. The Godot rewrite is cancelled. This handoff is historical evidence, not an active Unity task or verified runtime behavior. See the current documentation.
Phase 5 Soldier Weapon Data Migration Manifest¶
Output scope¶
This package contains only static evidence for Soldier/Alex's unmodified starting weapon and normal projectile. It does not contain Unity source assets, art, effects, audio, Frenzy, abilities, upgrades, shop modifiers, or evolved content.
Source asset and GUID mapping¶
| Unity source | GUID / serialized reference | Evidence used | Output fields |
|---|---|---|---|
Assets/Resources/Character/Soldier.asset |
Character asset; id: SOLDIER; weapon GUID 52b0d040dc8b2bf478cadb6aea14369c |
weapon, criticalDamage: 50, criticalChance: 1, attackRange: 12, charName: Alex |
character_id, attack_range, damage/crit calculation notes |
Assets/Prefab/Player/Soldier/Soldier_Gun.prefab.meta |
guid: 52b0d040dc8b2bf478cadb6aea14369c |
Resolves the Soldier character's weapon reference | weapon source_prefab_path, source_prefab_guid |
Assets/Prefab/Player/Soldier/Soldier_Gun.prefab |
Root Soldier_Gun; PlayerWeapon script GUID eed4f582563b39c49877746e9864a736 |
ammo: 10, weaponDamage: 10, projectileSpeed: 25, reloadTime: 0.4, attackSpeed: 1.5, isRanged: 1, defaultProjectile, null secondaryProjectile, targetPriority: 0, muzzle transforms, all fixed modifiers 1 |
all base weapon data, targeting mode, muzzle offset, projectile reference |
Assets/Prefab/Player/Soldier/Soldier_Bullet.prefab.meta |
guid: 5eb121939ac384146ab1f6e36fd83848 |
Resolves defaultProjectile |
projectile source identity |
Assets/Prefab/Player/Soldier/Soldier_Bullet.prefab |
PlayerAttack script GUID 8a7ea87b0f85d5346ae8fcf40aa0a3ac |
Dynamic Rigidbody2D; trigger CircleCollider2D radius 0.3; layer 0; Untagged; lifeTime: 3; damagingLifeTime: 3; knockbackStrength: 1; knockbackFromPlayer: 1; isFlip: 1; maxEnemyHit: 1; root scale 0.65 |
projectile motion metadata, lifetime, collision, max hits, knockback notes, rotation notes |
Assets/Prefab/Player/Skill/ExplodingBullet.prefab.meta |
guid: c736b737fb94f074da18f2529d653a95 |
Direct explosion reference serialized on Soldier_Bullet; used only when the excluded IsExplodingBullet flag is true |
documented only; no receiving JSON production field |
Assets/Prefab/Player/Soldier/Bullet_HitEffect.prefab.meta |
guid: f303d69cf74d3a240ab6d1302112af66 |
Direct hitEffect reference serialized on Soldier_Bullet; spawned visually after a valid hit |
documented only; excluded from data package |
ProjectSettings/TagManager.asset |
Layer/tag definitions | Layer 0 is Default; confirms Enemy tag exists |
unity_layer, required_tags context |
ProjectSettings/Physics2DSettings.asset |
Project collision matrix | Confirms collision filtering also depends on project-wide Physics2D settings | unresolved unity_layer_mask explanation |
The weapon has no serialized stable weapon id/name field beyond the prefab/GameObject name, and the projectile has no serialized stable id. The JSON uses explicit unresolved identifiers rather than inventing ids.
Relevant weapon-prefab components are: root Transform and PlayerWeapon; aiming/visual child Transform, SpriteRenderer, and Animator; muzzle Transform; reload UI Canvas, CanvasScaler, GraphicRaycaster, RectTransform, CanvasRenderer, and Image. Only gameplay-relevant component values were transferred.
Inspected runtime evidence¶
| Script | Method / member | Proven behavior |
|---|---|---|
Assets/Script/Game/Entities/Player/Stats/PlayerModifier.cs |
SetupPlayer() |
Copies weapon damage, reload value, attack-speed value, ammo, Soldier crit stats, and Soldier range into base modifier fields before calculation. Shop fields are copied too, but are treated as zero for this explicitly unmodified handoff. |
Assets/Script/Game/Entities/Player/Stats/PlayerModifier.cs |
Calculate() |
Computes final damage, interval-form attack speed, reload seconds, ammo, crit stats, projectile speed, and range. |
Assets/Script/Game/Entities/Player/Core/Player.cs |
UpdateEnemyLocations(), SortEnemyLocationsByDistance() |
Sorts hitpoints by effective distance (center distance minus hitpoint size); invulnerable targets receive an effective distance of 1000. |
Assets/Script/Game/Entities/Player/Core/Player.cs |
GetTargetByPriority(int), GetEnemyByPriority(int) |
Priority 0 resolves the nearest valid enemy hitpoint; cursor/last-horizontal fallback exists for aiming, while fire readiness returns without firing if no valid enemy exists. |
Assets/Script/Game/Entities/Player/Weapons/PlayerWeapon.cs |
SetWeaponInStartAfterSpawned() |
Selects defaultProjectile and fills current ammo from finalWeaponAmmo. |
Assets/Script/Game/Entities/Player/Weapons/PlayerWeapon.cs |
HandAimCursor() |
Direction is (target - weapon root).normalized; aiming parent local +X/right is aligned to it and local Y scale is mirrored based on direction X. |
Assets/Script/Game/Entities/Player/Weapons/PlayerWeapon.cs |
WeaponTimer(), ReloadAmmo(float) |
Starts reload at zero ammo, counts timers down with Time.deltaTime, waits the calculated seconds, and refills to final ammo. |
Assets/Script/Game/Entities/Player/Weapons/PlayerWeapon.cs |
CheckReadyFireWeapon() |
Automatic fire requires a valid non-invulnerable enemy, effective range <= final range, not dashing/paused/reloading, ammo, and an elapsed attack timer. |
Assets/Script/Game/Entities/Player/Weapons/PlayerWeapon.cs |
FireWeapon(), SpawnAttack() |
Base shot spawns once at bulletSpawnPoint.position, uses aiming-parent rotation, applies velocity finalProjectileSpeed * direction, and resets the fire timer. No direct weapon-level Instantiate fallback exists. |
Assets/Script/Game/Entities/Player/Weapons/PlayerWeapon.cs |
AttackModify(), DamageCalculation(bool) |
Sets Player, spell amp, crit result, damage type, and final damage at fire time. |
Assets/Script/Game/Entities/Player/Combat/PlayerAttack.cs |
Awake(), OnEnable(), Reset(), RotateSprite() |
Caches physics components, initializes pooled state/timers, and applies the serialized 180-degree visual flip. |
Assets/Script/Game/Entities/Player/Combat/PlayerAttack.cs |
OnTriggerEnter2D(Collider2D) |
Requires tag Enemy, prevents duplicate hits with a per-activation list, ignores invulnerable targets, applies damage/knockback, and stops after max hits. |
Assets/Script/Game/Entities/Player/Combat/PlayerAttack.cs |
DestroyAfterTime(), DisableDamaging(), ReturnPool() |
Defines lifetime cleanup and the actual partial reset/release behavior. |
Assets/Script/Game/Managers/PoolManager.cs |
GetFromPool(...), RegisterNewObject(...), SpawnNewObject(...), DeactivateObject(...), GetObjectNameWithoutClone(...) |
Pool key is prefab name without (Clone). Pools are lazy with no prewarm; missing or empty pools instantiate another object, while releases enqueue and deactivate. |
Assets/Script/Game/Entities/Enemies/Enemy.cs |
TakeDamage(...) |
Neutral damage is subtracted as damage - damage * DamageResistance / 100; zero resistance therefore receives the assigned value unchanged. |