Skip to content

Add the first-person farming, horror, FPS horror and FPS with enemies starters with a map - #1087

Open
4ian wants to merge 6 commits into
mainfrom
claude/awesome-knuth-vaoj1s-first-person-maps
Open

4ian wants to merge 6 commits into
mainfrom
claude/awesome-knuth-vaoj1s-first-person-maps

Conversation

@4ian

@4ian 4ian commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Adds "with a map" variants of four first-person starters, on maps made with the 3D terrain extension, modeled on the 3D GTA with a map. The original starters are unchanged.

The FPS variant is built from the 3D FPS game with enemies of #1076 (with its enemies walking with navmesh pathfinding, done there). It is a project of its own: this PR doesn't need #1076 to be merged first.

Uses the theme support for custom objects, the terrain.* slots and the model slots for scattered models of #1082 (merged). Based on the latest main (the skyboxes in the standard cube orientation of #1069 included). Same approach as #1086.

The starters

Starter Map
starting-first-person-farming-with-a-map — "3D First Person Farming with a map" 6144 px: a farm (barn, silo, windmill, coop) with flat fields of dirt plots, a pond, paths and hills around.
starting-first-person-horror-with-a-map — "3D First-Person Horror Game with a map" 4096 px: a dark, foggy forest of dead trees and pines on mounds and hollows, a cabin in a clearing. The lighting of the starter (fog, flashlight) is kept.
starting-first-person-shooter-horror-with-a-map — "3D FPS Horror game with Gun with a map" 4096 px: a graveyard with crypts on top of a hill, a dead forest on rolling hills. Fog and lighting kept.
starting-first-person-shooter-enemies-with-a-map — "3D FPS with enemies with a map" 4096 px: a canyon with cover on uneven ground, crates, a container, a ramp up to a plateau, and six enemies looking for the player.

Each variant is built from the starter as it is on main. What changed in the events is only what the map needs:

  • the terrain (3D physics) replaces the ground box and is added to the groups the starters raycast against (RaycastSurface of the farming starter, the obstacles the monsters see through, what bullets hit), so seeds are placed and bullets hit on the terrain;
  • the monsters walk with navmesh pathfinding (NavMeshPathfinding), instead of the grid pathfinding of the starters with an invisible obstacle at each tree. The terrain, the trunks of the scattered trees, rocks, logs and stumps (their trunk collisions give a surface to the navmesh), the cabin, the crypts, the walls and the graves have the navmesh obstacle behavior: the navmesh follows the forest if it is painted again. The monsters keep their state machine, and the chase also follows the navmesh (the path to the player is updated twice per second) instead of pushing the monster with forces. Their 3D physics body is kinematic in the horror starter (moved by the navmesh, it still collides with the player). In the FPS horror, a shot monster is still thrown back by the impulse at the impact of the starter: while the navmesh moves it, its physics body (dynamic, as in the starter) has no gravity, doesn't collide with the static objects (the terrain, the trees, the graves) and is 100 times heavier, so the player bumps into it; when it is shot, it gets its density, the gravity and these collisions back, and takes the impulse. The horror starters keep their Ground box, hidden under the terrain, because the patrol picks random points inside it;
  • the monsters of the FPS horror starter are put on the ground when they appear (PutOnGround action of the terrain);
  • FPS with enemies: the enemies already walk with navmesh pathfinding in the starter. On the map, the navmesh is built from the terrain (slopes over 40° can't be walked on), the rocks and the cacti (scattered models with trunk collisions) and the cover (obstacles only): the enemies walk around the cover and up the ramp to the plateau. The random destinations of the patrol are put on the terrain (Terrain.GroundZ); the ground box of the starter, where they are picked, is kept hidden under the terrain. The terrain and the cover hide the player from the enemies and stop the bullets. As in the starter, a shot enemy is thrown back by the impulse at the impact, and the player bumps into the walking enemies (same physics body as the FPS horror monsters).

Each variant has its forests, bushes, rocks and plants as scattered models (Terrain3D::ScatteredModels, GPU instancing, their Model mapped to the nature.* model slots), mountains around the playable area and invisible walls at the limits, its shape in the Edits property of the terrain (generated by a script running the terrain and scatter code of the extension), ambientCG ground textures with normal maps, grass only where it is seen up close, CC0 asset-store models credited in its README, a new project UUID, a preview.png from a 1280×720 screenshot, the latest version of every extension it uses (including GDevelopApp/GDevelop-extensions#2310), and its objects mapped to theme slots.

Tests

The tests of the starters are kept, and tests of the map are added:

  • Farming: the player and the plots start on the ground; the player walks up a hill; a seed can be placed on the terrain.
  • Horror: the player and the monster start on the ground; the player walks up a mound; the monster goes around the cabin to catch the player (its path has corners, it never enters the cabin, it stays within 6 px of the ground, and catching the player restarts the scene).
  • FPS horror: monsters appear on the ground; a shot monster is thrown back and tumbles; the player walks up the hill of the graveyard.
  • FPS with enemies: the player and the enemies start on the ground; a shot enemy is thrown back and tumbles; a patrolling enemy walks toward the player (on the ground); an enemy that sees the player catches them; an enemy goes up the ramp to catch the player on the plateau; the player walks up the ramp to the plateau.
  • All: each scattered models object has the copies placed by the generation script, standing on the ground.

The tests render at 160×90 without shadows, with the grass and the scattered models hidden, and with a 60 s timeout. For the tests of the starters, which act at the center of the screen, the 2D layers (mobile controls, UI, crosshair) are zoomed out to show what they show at 1280×720. All 27 tests pass with node scripts/run-gameplay-tests.js (GDevelop 5.6.284).

Screenshots

Views of the maps (1280×720, scaled down):

3D First Person Farming with a map
farming

3D First-Person Horror Game with a map
horror

3D FPS Horror game with Gun with a map
fps horror

3D FPS with enemies with a map
fps with enemies

With themes applied (built from GDevelopApp/GDevelop-assets#704), first view and overview:

Farming: farm, winter Horror: halloween, winter
FPS horror: zombie, graveyard FPS with enemies: military, space

The horror maps are dark, as in the starters (fog, flashlight).

Not done / to check

  • The chase re-paths twice per second, and each new path puts the monster back on the navmesh, which resets its speed: the monsters run at about 150 px/s on average (the max speed is 200 for the horror monster, 150 for the FPS ones).
  • On slopes, the navmesh is up to ~4 px above the terrain, so a walking monster can float that much.
  • The starters are not added to the AI prompts (GDevelop-ai-prompts).
  • npm run build (database) stops in this sandbox when fetching the deployed themes (proxy). The theme slots were checked with checkStarterThemeSlots, and every theme was applied to every new starter with applyThemeToStarter.
  • Performance was not measured on a phone.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj

@4ian
4ian force-pushed the claude/awesome-knuth-vaoj1s branch from b8b5ef0 to 49a896c Compare October 14, 2026 09:43
@4ian
4ian force-pushed the claude/awesome-knuth-vaoj1s-first-person-maps branch from 850a2f1 to edac405 Compare October 14, 2026 12:16
@4ian
4ian force-pushed the claude/awesome-knuth-vaoj1s branch from 49a896c to 6541de0 Compare October 14, 2026 12:17
@4ian
4ian force-pushed the claude/awesome-knuth-vaoj1s-first-person-maps branch from edac405 to 6130e91 Compare October 14, 2026 13:25
@4ian
4ian changed the base branch from claude/awesome-knuth-vaoj1s to main October 14, 2026 13:47
@4ian
4ian force-pushed the claude/awesome-knuth-vaoj1s-first-person-maps branch from 6130e91 to afd1210 Compare October 14, 2026 13:48

4ian commented Oct 14, 2026

Copy link
Copy Markdown
Contributor Author

ci/circleci: install failed (job 10014). The failure isn't in this PR: the job died in cd GDevelop/newIDE/app && npm install with npm ERR! code ECONNRESET / network aborted, a network error while downloading packages, before any test ran. The same job is running normally on #1086 and #1088, whose heads have the same base.

No code fix applies. Re-running the workflow from CircleCI should clear it. I can't re-run CircleCI jobs from here, and I won't push an empty commit to retrigger it. I'm keeping this PR watched until it's green.


Generated by Claude Code

Variants of the four first-person starters on maps made with the 3D
terrain extension, built from the starters as they are on main, with the
latest versions of their extensions. Forests, rocks and plants are
scattered models. The monsters of the horror starters walk with navmesh
pathfinding, around the trunks (trunk collisions of the scattered models),
the cabin, the crypts and the graves, instead of a grid with invisible
obstacles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj
@4ian
4ian force-pushed the claude/awesome-knuth-vaoj1s-first-person-maps branch from afd1210 to 9e554ed Compare October 14, 2026 17:06
They get the skybox of their starters in the standard cube orientation
(#1069). In the FPS horror, a shot monster is lowered as it falls over: it
rotates around its center, and lay above the ground.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj
…a map

Built from the 3D FPS game with enemies (#1076),
whose enemies walk with navmesh pathfinding, on the same map: a canyon with
cover on uneven ground and a ramp up to a plateau, with six enemies.

The navmesh is built from the terrain (5 px cells, slopes over 40 degrees
are not walkable), the rocks and the cacti (scattered models with trunk
collisions) and the cover (obstacles only). The random destinations of the
patrol are put on the terrain; the ground box of the starter, where they are
picked, is kept hidden under the terrain. The terrain and the cover hide the
player from the enemies and stop the bullets.

Tests: the tests of the starter (moving, shooting, killing an enemy), and
on the map, the player and the enemies start on the ground, a patrolling
enemy walks toward the player on the ground, an enemy that sees the player
catches them, an enemy goes up the ramp to catch the player on the plateau,
and the player walks up the ramp.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj
@4ian
4ian force-pushed the claude/awesome-knuth-vaoj1s-first-person-maps branch from 2413453 to 2ff5306 Compare October 19, 2026 13:17
@4ian 4ian changed the title Add the first-person farming, horror and shooter starters with a map Add the first-person farming, horror, FPS horror and FPS with enemies starters with a map Oct 19, 2026
…gain

In the FPS with enemies and the FPS horror with a map, a walking enemy or
monster is moved by the navmesh: its physics body (dynamic, as in the
starters) is deactivated, and it is activated when it is shot, to take the
impulse at the impact of the starters. A shot enemy or monster is thrown
back and tumbles again, instead of falling over. Touching the player, which
was a collision of the physics bodies, is checked with the distance between
them.

The test of a shot monster falling over is replaced by a test of a shot
enemy or monster thrown back and tumbling.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj
The previous change deactivated the physics body of a walking enemy, so that
the player could walk into it, and touching the player was checked with a
distance. The body now stays: while the navmesh moves it, it has no gravity,
doesn't collide with the static objects (mask 1: the ground, the walls),
which the navmesh keeps it on and away from, and is 100 times heavier, so
that the player bumps into it without pushing it. Touching the player is the
collision of the physics bodies again, as in the starter. When it is shot, it
gets its density, the gravity and the collisions back (deactivating and
activating the behavior creates the body again with them), and takes the
impulse at the impact.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants