Skip to content

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

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

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

Conversation

@4ian

@4ian 4ian commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Adds expanded versions of four first-person starters: the same game, on a map made with the 3D terrain extension, modeled on the 3D GTA Expanded. The original starters are unchanged.

The expanded starters are named starting-expanded-<starter> and " Expanded": they are more than starters (a map for now, maybe more later), and their slug tells them apart from the starters.

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-expanded-first-person-farming — "3D First Person Farming Expanded" 6144 px: a farm (barn, silo, windmill, coop) with flat fields of dirt plots, a pond, paths and hills around.
starting-expanded-first-person-horror — "3D First-Person Horror Game Expanded" 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-expanded-first-person-shooter-horror — "3D FPS Horror game with Gun Expanded" 4096 px: a graveyard with crypts on top of a hill, a dead forest on rolling hills. Fog and lighting kept.
starting-expanded-first-person-shooter-enemies — "3D FPS with enemies Expanded" 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, the walking monsters are kinematic too (the player bumps into them without pushing them), and a shot monster is still thrown back by the impulse at the impact of the starter: the "Body type" action of the 3D physics (Add an action to change the body type of 3D physics objects 4ian/GDevelop#9270) makes its body dynamic right before the impulse;
  • no Ground box under the terrain: the patrol of the monsters (and the monsters appearing in the FPS horror) picked random points inside the ground box of the starter. They now pick them on the terrain, away from the mountains around it: inside the terrain, without an eighth of it on each side (Terrain.BoundingBoxLeft() + Terrain.Width() / 8…, with a comment in the events). The ground box and its textures are removed;
  • 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 picked on the terrain like in the horror starters, and put on it (Terrain.GroundZ). The terrain and the cover hide the player from the enemies and stop the bullets. As in the starter, the walking enemies are kinematic and a shot enemy becomes dynamic, to be thrown back by the impulse at the impact.

The "Body type" action needs GDevelop 5.6.285 (released on October 21): an older GDevelop doesn't know it and would skip it, and a shot enemy or monster wouldn't be thrown. So the database asks for GDevelop 5.6.285 or later for the examples using it (scripts/lib/ExampleGDevelopVersion.js, also in #1097; an older GDevelop shows "Download the latest version of GDevelop to check out this example!").

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 on the whole terrain (one Grass instance: it only grows where its layer is painted and on gentle slopes, drawn in chunks of 500 px, the far ones hidden), 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.

The pond of the farming starter is a Water3D with an opacity of 120, wave crests 231;248;255, foam 0.05, ripples from assets/WaterNormalMap with a size of 600, wave height 2, wave length 150 and wave speed 1.8.

The events of these starters are unfolded, except the groups (which can stay folded).

The objects are in folders: World (terrain, limits, grass, water), Nature (the scattered trees, rocks and plants), and a folder for the objects of the map around the player, with PushableBox in it: Decoration (horror), Graveyard (FPS horror), Training ground (FPS with enemies).

Tests

The tests of the starters are kept and run on the map, with tests added for the gameplay the map changes (in bold):

  • Farming: walking and strafing; harvesting a seed patch; a seed can be placed on the terrain.
  • Horror: walking and strafing; the monster comes after the player.
  • FPS horror: walking and strafing; shooting leaves an impact; a shot monster is thrown back and tumbles.
  • FPS with enemies: the two tests of the submission (moving and shooting, killing an enemy); a shot enemy is thrown back and tumbles; a patrolling enemy walks toward the player; an enemy that sees the player catches them.

Removed, because they check how the map is made, which a game made from the starter will change (they would break as soon as the map is edited):

  • Farming: "The player and the plots start on the ground", "The player walks up a hill", "The scattered trees and plants grow on the ground".
  • Horror: "The player and the monster start on the ground", "The monster goes around the cabin to catch the player", "The player walks up a mound of the forest", "The scattered trees and plants grow on the ground".
  • FPS horror: "The player walks up the hill of the graveyard", "Monsters appear on the ground" (the monsters appear at random places, and one appearing on a grave stood above the terrain: it failed once on CircleCI), "The scattered trees and plants grow on the ground".
  • FPS with enemies: "The player and the enemies start on the ground", "An enemy goes up the ramp to catch the player on the plateau", "The player walks up the ramp to the plateau", "The scattered trees and plants grow on the ground".
  • In the tests kept, the checks of how the physics body is set (kinematic while walking, dynamic when shot) and of the height of an enemy above the ground: the tests check that a shot monster is thrown back, and that an enemy walks to the player.

The tests render at 160×90 without shadows, with the grass and the scattered models hidden, and with a 60 s timeout (120 s for the two tests of the FPS submission, as in the starter: one took 58 s of its 60 s). 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 13 tests pass with node scripts/run-gameplay-tests.js and the latest build of GDevelop's master (the one the CI uses). ExampleGDevelopVersion.spec.js checks the GDevelop version asked for the examples; jest, tsc and prettier pass.

Events compared to the starters

What changed in the events of each starter, compared to the starter it expands:

Starter Instructions (starter → expanded) Changes in the events
Farming 171 → 171 None. The terrain replaces the ground in the RaycastSurface group.
Horror 60 → 66 (+14, −8) The monster walks with navmesh pathfinding: the actions of the grid pathfinding become MoveTo of the navmesh (patrol, chase), the chase re-paths every 0.5 s instead of pushing the monster with forces, and the random places of the patrol are on the terrain (without an eighth of it on each side) instead of the ground box.
FPS horror 98 → 106 (+19, −11) The same as the horror for the monsters, and: the monsters appear on the terrain and are put on the ground (PutOnGround); a shot monster becomes dynamic (Body type action) before the impulse.
FPS with enemies 99 → 99 (3 changed) The random destinations of the patrol are on the terrain (Terrain.GroundZ), instead of the ground box.

Screenshots

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

3D First Person Farming Expanded
farming

3D First-Person Horror Game Expanded
horror

3D FPS Horror game with Gun Expanded
fps horror

3D FPS with enemies Expanded
fps with enemies

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

The horror maps lit up (without the fog, with a bright light), to show the grass covering them:

3D First-Person Horror Game Expanded, lit up
horror lit

3D FPS Horror game with Gun Expanded, lit up
fps horror lit

With themes applied (built from GDevelopApp/GDevelop-assets#704), first view and overview. These were taken before the grass covered the whole terrain and before the new water settings:

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

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), after the examples are read. 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
…ples using it

The 3D physics "Body type" action is not known by GDevelop 5.6.284 and
before, which would skip it. An example using it asks for GDevelop 5.6.285
or later, instead of 5.5.220 or later for the other 3D physics examples.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj
The FPS with enemies with a map (built from the FPS with enemies) and the
FPS horror with a map use the new "Body type" action of the 3D physics: an
enemy or monster moved by the navmesh is kinematic (the player bumps into
it without pushing it), and becomes dynamic when it is shot, to be thrown
by the impulse at the impact. It replaces the dynamic body without
gravity, without the collisions with the static objects and 100 times
heavier, whose settings were restored, and the behavior deactivated and
activated again, before the impulse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj
…, folders, fewer tests

- The Ground box hidden under the terrain is removed from the horror, FPS
  horror and FPS with enemies maps: the random places of the patrol (and
  of the monsters appearing) are picked on the terrain, without an eighth
  of it on each side, away from the mountains. Its textures are removed.
- The grass covers the whole terrain (one Grass instance): it only grows
  on its layer and on gentle slopes, and the far chunks are hidden.
- The pond of the farming uses the water settings of the other maps:
  opacity 120, crests 231;248;255, foam 0.05, ripples 600 px, waves 2 px
  high, 150 px long, at a speed of 1.8.
- Folders: the scattered trees, rocks and plants are in "Nature", and
  PushableBox is with the objects of the map around it ("Decoration",
  "Graveyard", "Training ground").
- The tests checking how the map is made (objects starting on the ground,
  climbing a given hill, paths around a given building, the copies of the
  scattered models, the body type and height of a walking enemy) are
  removed: a game made from the starter changes the map. The tests of the
  gameplay are kept. The two tests of the FPS submission get 120 s, like
  in the starter.
- New previews.

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

The monsters appear at random places of the map, and one can stand on a
grave, above the terrain: the test checked how the map is made, and
failed on CircleCI when a monster appeared on a broken gravestone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj
The starters with a map are more than starters (a map for now, maybe
more later): their slug is "starting-expanded-<starter>" instead of
"starting-<starter>-with-a-map", which tells them apart from the
starters, and their name is "<starter name> Expanded" instead of
"<starter name> with a map". The project UUIDs are kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wa8uKpYuQrYqGYnqGCsquj
@4ian 4ian changed the title Add the first-person farming, horror, FPS horror and FPS with enemies starters with a map Add the expanded first-person farming, horror, FPS horror and FPS with enemies starters Oct 23, 2026
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