Skip to content

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.