Commit Graph

15 Commits

Author SHA1 Message Date
Joshua Deville
f7d0b17be8 Add build-mode toggle and grid-snap raycast on BP_PlayerCharacter
B key toggles bBuildMode. While active, Tick line-traces from the
character's eye height along its forward vector, breaks the hit
result, and snaps the impact point to a 200-unit grid via
Vector_SnappedToGrid, storing the result in SnappedLocation. No
visual feedback or placement yet (next: ghost preview, then
place/remove).

Uses BreakHitResult (a multi-output-pin CallFunction on
GameplayStatics) to extract struct fields, since a dedicated
"BreakStruct" node type isn't supported by this tool -- works fine
as a plain function call.
2026-07-08 21:02:19 -04:00
Joshua Deville
fb74e789af Verify block stat aggregation with one of each block attached
One Hull/Thruster/Power/Storage block placed near the ship spawn and
wired into the corresponding Slot_* references. Verified via Python
(direct RecalculateStats call + property reads): MaxHull 150,
MaxPower 150, StorageCapacity 30, ShipMovement.MaxSpeed 4500 -- all
exactly base + block bonus. Confirms the block-slot aggregation
system works end-to-end. Smoke-tested in PIE: no runtime errors.
2026-07-08 16:28:07 -04:00
Joshua Deville
a4da93cc63 Add block-slot stat aggregation to BP_ShipPawn (Phase 2a)
Four typed slot variables (Slot_Hull/Thruster/Power/Storage, one per
block class) plus a RecalculateStats event that reads each slot (via
IsValid + external-member Get on the slot's block instance) and
derives MaxHull, ShipMovement.MaxSpeed, MaxPower/Power, and
StorageCapacity from base values plus whatever's attached. Called at
the end of BeginPlay. All slots empty = base values, matching current
gameplay exactly.

New technique discovered: VariableGet/VariableSet support an external
member reference via a "variable_class" field (full asset path
required for Blueprint-generated classes, not just the short class
name) -- this is how block-instance properties and component
properties (e.g. FloatingPawnMovement.MaxSpeed) get read/written at
runtime without needing a formal Function or the broken array/loop
path.
2026-07-08 16:25:06 -04:00
Joshua Deville
2f161b0105 Add ship block Blueprint classes (Phase 2a)
BP_Block_Hull, BP_Block_Thruster, BP_Block_Power, BP_Block_Storage:
simple Actors with a mesh and a single contribution variable each
(HullBonus/ThrustBonus/PowerBonus/StorageBonus). Distinct shapes/
scales for visual identification.

Array variables and the ForEachLoop macro don't reliably work
through this MCP plugin's Blueprint graph builder (confirmed via a
throwaway test: the macro's wildcard Array pin never resolves its
type, compile fails every time) -- so aggregation will use one typed
slot per block type on the ship rather than a generic block list.
2026-07-08 16:17:43 -04:00
Joshua Deville
f2f759e912 Add basic resource gathering into ship storage
ResourceNode_01 placed in the landing zone. E key on the character:
checks distance to the resource node (via a typed ResourceNodeRef
variable, same object-reference technique as the ship/character
cross-refs), and if within 300 units calls AddStorage on the ship
(through ShipPawnRef) and destroys the node. AddStorage increments
StorageAmount up to StorageCapacity, printing feedback either way.
Smoke-tested in PIE: no runtime errors.
2026-07-08 16:03:12 -04:00
Joshua Deville
090b19440d Fix A/D turning on BP_PlayerCharacter
ACharacter defaults bUseControllerRotationYaw to true, which makes
the Controller's rotation overwrite the actor's rotation every tick
-- stomping our manual AddActorLocalRotation calls almost immediately
(visible as a barely-perceptible tick instead of a turn). Plain Pawn
(the ship) doesn't have this default, which is why the same rotation
logic worked fine there. Disabled it on both the class default and
the placed instance.
2026-07-08 15:57:13 -04:00
Joshua Deville
0744be80bd Wire up ship exit/enter possession transition
F key on the ship: teleports the player character to just above the
ship's location and possesses it. F key on the character: possesses
the ship back. Same controller, so possessing one pawn automatically
unpossesses the other.

Notable implementation detail: GameplayStatics::GetActorOfClass
looked like the obvious way to find "the other pawn" at runtime, but
this MCP plugin's pin_defaults mechanism can't correctly set a Class-
type pin (it accepts the string silently but the compiler later
rejects it as an invalid default) -- there's no supported node type
for a class-literal either. Worked around it by adding real object-
reference variables (PlayerCharacterRef / ShipPawnRef) via
unreal.BlueprintEditorLibrary.get_object_reference_type() directly
through the Python escape hatch, marking them instance-editable, and
wiring the actual actor references between the two placed level
instances. Avoids needing any runtime class lookup at all.
2026-07-08 15:48:29 -04:00
Joshua Deville
d6f7271bed Add on-foot player character with suit oxygen
BP_PlayerCharacter (Character-based): first-person camera, WASD
movement + A/D turning (same input scheme as the ship), SuitOxygen
stat that depletes each tick, clamped at 0. Not auto-possessed yet --
that's the ship exit/enter transition (next task). Placed one
instance in L_TestFlight near the ship spawn.

Also reverted level gravity to default (-980): FloatingPawnMovement
(ship) never reads world gravity regardless of its value, but
CharacterMovementComponent (this character) needs real gravity to
walk normally. Zero gravity was an unnecessary leftover from Phase 0
that would have broken on-foot movement.
2026-07-08 15:38:15 -04:00
Joshua Deville
2dd36c6537 Add landable zone to L_TestFlight
Added a landing zone as a region of the existing test level (at
X=8000) rather than a separate level/L_Landing01 -- avoids needing
level-streaming and cross-level pawn-transfer machinery that Phase 1
doesn't need yet. Ground platform (scaled plane), 3 scattered rock
obstacles, and a flat landing pad marker disc.
2026-07-08 15:33:55 -04:00
Joshua Deville
4cc950f222 Implement hull damage/repair on BP_ShipPawn
DamageHull and RepairHull custom events (this MCP plugin's Blueprint
graph builder can't author formal parameterized Functions yet, only
CustomEvents, so amounts are fixed rather than passed in):
- DamageHull: Hull -= 10, clamped to 0.
- RepairHull: if StorageAmount > 0, consumes 1 storage and restores
  20 hull (clamped to MaxHull); otherwise no-ops.
Bound to H/R test keys with on-screen PrintString feedback, since
there's no HUD yet to show the actual Hull/Storage values.
No real damage trigger (e.g. collision) wired up yet -- nothing to
collide with in the level yet. Smoke-tested in PIE: no runtime
errors.
2026-07-08 15:30:33 -04:00
Joshua Deville
6af5407788 Fix chase camera parenting; add reference markers to test level
CameraBoom was parented to ShipMesh, which is rotated 90deg to point
the placeholder cone forward -- the camera inherited that rotation,
producing a badly skewed near-edge-on view. Reparented CameraBoom to
the actor root instead, so its pitch is relative to actor-forward,
not the mesh's cosmetic rotation.

Also added 5 marker cubes around the spawn point: the level was
completely empty, so with a rigidly-attached chase camera, forward/
backward translation had zero visual reference and could look like
nothing was happening even if movement was working correctly.
2026-07-08 15:17:48 -04:00
Joshua Deville
e0fd4c28a7 Add basic lighting to L_TestFlight
The level had zero actors besides the ship, so it rendered fully
black (no directional light, no sky light). Added a DirectionalLight
and a real-time-capture SkyLight so the placeholder ship is actually
visible during PIE testing.
2026-07-08 15:13:38 -04:00
Joshua Deville
a5a068d1cf Wire up basic flight controls on BP_ShipPawn
W/S thrust forward/back, A/D yaw left/right, via direct key-binding
(InputKey nodes) rather than Enhanced Input -- this MCP plugin's
Blueprint graph builder doesn't support authoring Enhanced Input
Action nodes yet, only raw key events. Tick applies ThrustAxis/
YawAxis each frame via AddMovementInput/AddActorLocalRotation.
Bumped FloatingPawnMovement Max Speed/Acceleration for a snappier
placeholder feel. Smoke-tested in PIE: no runtime errors.
2026-07-08 15:08:59 -04:00
Joshua Deville
987f4cc0ef Add placeholder ship pawn Blueprint
BP_ShipPawn: cone mesh, FloatingPawnMovement for gravity-free flight,
spring-arm chase camera. Placed in L_TestFlight and set to
auto-possess Player 0 for PIE testing. No input wiring yet.
2026-07-08 15:01:28 -04:00
Joshua Deville
496320cc8c Add empty test level and Unreal MCP tooling
- L_TestFlight: empty, zero-gravity level for Phase 0 flight testing,
  set as editor/game default map.
- Enable UnrealMCPython + Python Editor Script Plugin, third-party
  MCP plugin (GenOrca/unreal-mcp v2.2.0) giving direct editor control
  (actors, blueprints, levels, materials, etc.) alongside Epic's
  built-in Unreal MCP plugin.
- Vendor the mcp-server Python source used to bridge to the plugin.
- .mcp.json intentionally gitignored (machine-specific absolute paths).
2026-07-08 14:56:57 -04:00