FoundryInk Academy Academy / Making your work
Making your work

Point-and-click adventures

This is the deep one. A point-and-click adventure is the richest thing you can build here: rooms you walk, hotspots you examine, inventory you combine against the world, conversations that branch, and a script that ties it together. If you are coming from Adventure Game Studio, most of your mental model transfers, and this page is explicit about where ours differs, what is simpler, and what genuinely is not here yet.

Read time about 25 min

1The shape of an adventure

An adventure is four ideas stacked together, and once you see them you can build anything. Rooms are the places you walk. Hotspots are the things you click. Inventory is what you carry between them. And the Story is the branching backbone that remembers what you did. Pick the Point-and-click adventure genre and the editor opens twelve tabs built around exactly that: Scenes, Room, Objects, Rules, Inventory, Cutscenes, Story, Script, Import, Media, Settings, Validate, plus Play. Feeling lost? The Adventure guide wizard walks the whole loop in six steps, from Add a room to Script a cutscene. Like AGS, we layer interactivity. Unlike AGS, your logic is written in FoundryScript, not a C-like room script.

The Adventure guide's first step, Add a room: every adventure is a set of rooms.
The Adventure guide's first step, Add a room: every adventure is a set of rooms.See the full screen
The Play tab's helper text talks about arrow keys and jumping. That is generic engine copy left over from other genres and it does not apply here. The pointclick control scheme has no keyboard input and no physics, so do not design a puzzle around a jump that will never happen.
Pro note
Sketch your rooms on paper first, with arrows for every exit. A map you can see beats a map you can only remember, and it saves you rebuilding hotspots later.

2Find every editor

Half the editors here have no tab. Click Explore Project and the shell splits three ways: your document in the middle, the project tree left, a Properties grid right. That tree is the real table of contents: General Settings, Colors, Sprites, GUIs, Inventory items, Dialogs, Views, Characters, Mouse cursors, Fonts, Audio, Global variables, Scripts, Import AGS project, then Rooms, which expands to every room as {n}: {label}. Nodes badged soon are not built yet, so leave Colors and Fonts alone. Properties edits the game itself: Start room, Width, Height, Game speed (fps), Background, Show HUD, Gravity; Name, Genre and the counts are read-only. AGS keeps its tree pinned open. Ours hides behind a button, and Characters, Views, GUIs, Dialogs, Mouse cursors and Global variables exist nowhere else. Skip the rail and you will never reach the character editor. Full screen gives the three panes the whole viewport.

The Explore Project tree: General Settings, Colors, Sprites, GUIs, Inventory items, Dialogs and more.
The Explore Project tree: General Settings, Colors, Sprites, GUIs, Inventory items, Dialogs and more.See the full screen
The Properties grid under the tree, showing the game's name, genre, start room and display.
The Properties grid under the tree, showing the game's name, genre, start room and display.See the full screen
The engine default for Gravity is 1600, which is meant for platformers, not for people walking around a room. Open Properties and set it to 0 before you test anything, or you will spend an hour blaming your sprites.
Pro note
Label your rooms the moment you create them. The tree renders each one as '3: Harbour at night', and a column of nameless numbers is a maze you built for yourself.

3Rooms and the walk area

Rooms live on the Room tab, and the Room picker chooses which one you are editing. As the intro puts it: "Draw where the actor may walk, carve holes around furniture, and place hotspots the reader clicks to look, use, take, or talk." Pick Walk area, click to drop points (the counter reads {n} points. Click to add), then hit Finish shape with at least three points, or just double-click. cancel throws the shape away. Use Hole to punch out the sofa. Green is walkable, red is not. clear walk area and clear holes start you over, and the tally sits in Walk polygons: n · Holes: n. Unlike AGS, there are no fifteen numbered areas with per-area scaling here: you get one region, polygons minus holes. Simpler mental model, fewer indexes to remember. Edits autosave.

Walk area picked, with the point count and Finish shape beside the drawing tools.
Walk area picked, with the point count and Finish shape beside the drawing tools.See the full screen
Leave the walk area empty and the actor may walk anywhere in the scene, so a half-finished room looks fine until your hero strolls across the ceiling. Also: RemoveWalkableArea and RestoreWalkableArea exist in script but are stubs that do nothing, so never build a puzzle on them. Pathfinding is A-star over a 16 pixel grid, 8-connected and smoothed by line-of-sight, and the walk speed is 160 pixels per second.
Pro note
Draw the walk area slightly *inside* the floor, not right up to the wall. The actor's feet sit at the polygon edge, so a couple of pixels of margin keeps him from looking like he's standing in the skirting board.

4Hotspots, verbs and approach points

A hotspot is the part of a room that answers back. Draw one with the Hotspot tool (blue in the legend), select it, then give it a Name and a Default verb. Your verbs are fixed: Walk to, Look at, Use / Open, Take, Talk to. Facing on arrival offers Right or Left only, because the engine has two facings, unlike AGS loops. With the hotspot selected, the Approach tool sets where your character walks before interacting. That is AGS's walk-to point, and it is the difference between opening a drawer and opening it from across the room. Then + Interaction per response: a verb, needs an item, divert to an Ink knot, a script fn (AGS event), and actions.

The Hotspot tool, between Hole and Region, above a room with a blue Door hotspot.
The Hotspot tool, between Hole and Region, above a room with a blue Door hotspot.See the full screen
The Door hotspot selected: Name, Default verb set to Look at, and Facing on arrival.
The Door hotspot selected: Name, Default verb set to Look at, and Facing on arrival.See the full screen
The Approach tool only offers itself once a hotspot is selected, so select first, then click to place the point (the panel will keep reading No approach point set. Use the Approach tool until you do). Also: hotspot showWhen conditions exist in the data model but have no editor yet, so do not design a puzzle around hiding a hotspot.
Pro note
Place the approach point where a person would really stand, just off the object and slightly below it, never dead centre on the art. Feet sell the pose.

5Regions and walk-behinds

Three tools, three jobs, and the difference is worth burning into your brain. A hotspot waits to be clicked. A Region (yellow in the legend, tooltip "Draw a region (tint / scale / walk-on events)") never gets clicked at all, it reacts to your actor stepping into it. Give the row a name, then use Scale (%) to shrink your character as they wander upstage, Tint to wash them in the colour of the room they just entered, and onWalksOnto fn to fire the script. Scale defaults to 100 (range 1-200), tint amount to 30 (0-100). A Walk-behind (purple, dashed edge) does the other half of depth: it draws scenery in FRONT of the actor. Each polygon appears under Walk-behinds (n) as Area 1, Area 2 and so on, with one Baseline Y field. That baseline is a horizontal line: above it, your character is drawn behind the pillar; below it, in front. One number, and the flat painting becomes a room.

The room's Regions list with Scale, Tint and onWalksOnto, and the Walk-behinds list below it.
The room's Regions list with Scale, Tint and onWalksOnto, and the Walk-behinds list below it.See the full screen
The Baseline Y defaults to the polygon's lowest point, which is right often enough to fool you and wrong exactly when it matters. Also: the editor only exposes onWalksOnto fn. The data model and the runtime both support onWalksOff and onStanding, and the runtime genuinely fires all three, but there is no field for them here. Unlike AGS, which gives you all three events in the room editor, those two only reach FoundryInk via AGS import or hand-edited data.
Pro note
Draw your walk-behind tight to the object's silhouette, not a lazy box around it, then set Baseline Y to where the object actually meets the floor, not where its art ends. A pillar's base is the line, the capital is just decoration.

6Depth, scale and split-screen

Distance is a lie you tell with scale. Tick Depth scaling and four fields appear: Near y, Near scale, Far y, Far scale. Defaults put near y at room height with scale 1, far y at 0 with scale 0.6, so your character shrinks as they walk up the room. AGS pins scaling to each walkable area; we use one linear band across the whole room. Simpler, less granular, and that is the trade. Depth sort (walk behind scenery) is separate, so tick it when props should overlap.

Then Screen layout: Single or Split. Split reveals Room width (0-1) (default 0.62) and Detail scene. AGS has no equivalent. The close-up panel, driven by showDetail and clearDetail, keeps the room visible while you push a padlock, or a face, right up into the reader's eye.

Depth scaling ticked, showing Near y, Near scale, Far y and Far scale.
Depth scaling ticked, showing Near y, Near scale, Far y and Far scale.See the full screen
Choosing Split while Detail scene is still (empty) gives you a blank panel beside the room, and nothing in play fills it until a showDetail action runs. Pick the scene, or wire the action, before you blame the layout.
Pro note
Set Far scale by eye, not by maths. Walk your character to the back wall and nudge until they look like they belong in the paint. 0.6 is a starting guess, not a law.

7Characters and views

Open Characters in the Explore Project rail. Hit New character and you get six fields, no more: Script name (letters, numbers and underscores only, so cEgo), Real name, Starting room, Normal view, Speech view and Speech colour. Exactly one character wears the star. Press Make player character to move it. A view, over in Views, is a stack of loops, and each loop is a strip of frames: Loop 0 (down), Loop 1 (left), Loop 2 (right), Loop 3 (up), just like AGS. New view gives you four empty loops; fill them with New frame, set Dly per frame, tick Run next loop to chain. Be honest with yourself about scope: Speech view is stored but not played yet, walk speed is fixed by the control scheme at 160 px/s, and idle, blink, thinking and diagonal loops are import-only. Following does not exist. No art means a 32 x 64 placeholder body.

New character, above a character's Script name, Real name, Starting room and views.
New character, above a character's Script name, Real name, Starting room and views.See the full screen
A view's Loop 0 (down) with three frames and New frame.
A view's Loop 0 (down) with three frames and New frame.See the full screen
Starting room is a scene ORDINAL, its index in your scene list, not an AGS room number. Reorder your scenes and your cast wakes up somewhere new. There is also no view preview in the editor, so use the Play tab to watch an animation actually run.
Pro note
Name the script name before you draw a single frame. Rename a character later and every line of FoundryScript that talks to it goes hunting for a ghost.

8Inventory and puzzles

The Inventory tab holds Inventory items: the catalog of things the reader can pick up and use. A hotspot can give an item, require one to work, or take it away. Hit Add, then fill in Name, an Icon (sprite assets only), a Swatch colour, and Description (Look at) so examining it says something worth reading.

The puzzle mechanic is exactly one thing: use an item on a hotspot, wired through that hotspot interaction's needs field. Key on door. That is the entire grammar, and it is enough for a real game.

Unlike AGS, there is no item-on-item combining here. No rope plus hook. Design around locks, not craft benches, and plant the clue in the world before the reader meets the lock.

Inventory items: a Brass key with its Name, Icon, Swatch and Description (Look at).
Inventory items: a Brass key with its Name, Icon, Swatch and Description (Look at).See the full screen
This panel does not autosave like the Room editor does. Save inventory only appears when you have unsaved changes, so if you tab away without spotting it, your new item is gone.
Pro note
Give every item a Look at line with a hint buried in it. Readers examine things when they are stuck, and that is your cheapest hint system.

9Conversations: dialogs and the story

FoundryInk has two conversation systems, and only one of them branches. Learn the difference now and save yourself a wasted afternoon.

The Story tab is Ink, a real branching narrative engine. Choices, state, saving and resuming (inkState) all live here. You write Ink, press Compile, and get knots. A hotspot interaction can divert straight to a knot, so a door, a corpse, or a nosy neighbour can all drop the player into real narrative.

The Dialogs panel in the Explore Project rail is a flat menu, not a tree. New dialog makes dDialog{n}; Create new option makes New option. Columns are Option text, Show, Say. At runtime the shown options draw with a Stop talking row. Clicking one speaks the line if Say is on, then redraws the same list. Nothing branches. Only Stop talking exits.

Unlike AGS, your conversation logic belongs in Ink. Treat Dialogs as a menu and an import fidelity surface.

The Story tab's Story script (Ink), with the knots knock and owl, and Compile.
The Story tab's Story script (Ink), with the knots knock and owl, and Compile.See the full screen
A dialog, dOwl, with its option text and Create new option.
A dialog, dOwl, with its option text and Create new option.See the full screen
An imported AGS dialog's script (the @S / @1 blocks) is stored but never executed, and you cannot edit it. Dialog. SetOptionState and RunDialog are stubs, and AGS's text parser does not exist here. If your imported game leaned on dialog scripting to gate options or jump topics, rebuild that logic in the Story tab.
Pro note
Prototype the whole conversation in Ink first, plain text, no art. If the branches do not read well as a script, no amount of hotspot polish will save them.

10Cursors and the verb bar

Open Mouse cursors in the rail and you get Mouse cursors (interaction modes), the list that holds your pointer graphics. Hit Add default modes first thing (it only appears while the list is empty) to seed Walk to, Look at, Interact, Talk to, Use inv, Pick up, Pointer and Wait. Why the rush? Because the verb bar only renders when at least one cursor exists. Zero cursors, no bar, and a player with nothing to click. Use New cursor for extras, set a Graphic, and tick Std mode so a click actually fires the matching interaction. Here we part ways with AGS: its nine modes are extensible with custom verbs, ours are fixed at five (Walk to, Look at, Use / Open, Take, Talk to). No verb coin either.

Mouse cursors (interaction modes): Walk to, Look at, Interact, Talk to and more, with New cursor.
Mouse cursors (interaction modes): Walk to, Look at, Interact, Talk to and more, with New cursor.See the full screen
Adding a ninth cursor does not add a ninth verb. The bar is always those same five, and graphics bind to them by name keyword: walk matches walk, look matches look or eye, use matches interact, use or hand, take matches pick, take or grab, talk matches talk or speak. Pick up works purely because of the word "pick". Rename it "Grab it" and it still binds; rename it "Snag" and your graphic stops appearing.
Pro note
Name your cursors around the keyword, then decorate: "Pick up crowbar-style" binds fine, "Snatch" does not. Draw each pointer with its hotspot at the very tip, not the middle, or players will swear your hotspots are misaligned when it is really the art.

11Building GUIs by hand

Open GUIs in the Explore Project rail and press New GUI. You get gGui1, visible, parked at 0,0, sized 200 x 120. Six control kinds live here: button, label, slider, listbox, textbox and invwindow, carrying the script-name prefixes btn, lbl, sld, lst, txt and inv. Every new control arrives as an 80 x 24 box at 0,0.

Here we part company with AGS, plainly: there is no visual drag layout yet, so you type x, y, width and height yourself. This panel is structural for now, with drag layout landing in a later installment. The GUI still renders at runtime in screen space, honoring visibility, and a click on btnSave invokes the FoundryScript function btnSave_Click. The name is the wiring, so choose it deliberately.

A GUI screen, gGui1, with its position, size, Visible at start box and controls.
A GUI screen, gGui1, with its position, size, Visible at start box and controls.See the full screen
Plenty of AGS parity fields (popup style, transparency, z-order, click action, slider min and max, listbox colours, text windows) exist in the data model but have no editor UI. They come across intact on AGS import and cannot be changed here, so do not go hunting for a field that was never drawn.
Pro note
Since every control spawns at 0,0, they stack into one invisible pile. Lay them out on paper first and step your coordinates in multiples of 8, then hand-typed numbers still line up like you meant it.

12Scripting with FoundryScript

The Script tab opens on Script (FoundryScript), a C-like language that compiles to bytecode and runs on our own sandboxed VM. No file, network, or page access, and your source never leaves the studio; Compile tells you in seconds whether it holds together. The mental model is deliberately small: only three things get called. game_start() runs once, repeatedly_execute() every tick, and named functions run only where you wire them, a hotspot's script fn field, a region's onWalksOnto, or a GUI button's {scriptName}_Click. AGS's wider lifecycle (room_Load, on_key_press, on_mouse_click) is never called here. You get player and mouse, plus entities by script name (cEgo, oDoor, iKey). About 50 of roughly 130 API members are genuinely wired; the rest compile and do nothing so imported scripts survive. SetVar, GotoScene, GiveItem, Character. Say and Dialog. Start work. RunDialog, Object. Animate and AudioClip. Play do not.

The Room script collapsible inside the Room tab compiles, but the runtime never loads it: it only ever runs the global program from the Script tab. Treat it as a fix-up buffer for imported room scripts, and paste the logic into the Script tab if you want it to actually run.
Pro note
Two million instructions per call feels endless until a loop sits there waiting for something a single tick can never deliver. Do your waiting in repeatedly_execute() with a state variable, never inside one long call.

13Cutscenes

Open Cutscenes, choose a scene in Cutscenes for, and name the sequence in Cutscene name. A cutscene is an ordered list of steps: move an actor, flash narration, wait, play a sound, or divert the story. Steps run top to bottom, so the list is the timeline. Mark a step with previous to run it alongside the step above, which is how an actor walks while narration reads. Each step shows only the fields it needs: an (actor) plus x and y, right or left facing, a clip name, narration, an (object), a (scene), and ms or ms cap for timing. Reorder or remove steps in place, then fire the whole thing from a hotspot or a rule with the playSequence action. AGS hands you blocking script instead; we hand you a sequencer. showDetail and clearDetail drive the split-screen.

Cutscenes for Room 1: the Owl wakes up cutscene and its ordered steps.
Cutscenes for Room 1: the Owl wakes up cutscene and its ordered steps.See the full screen
A step can play a sound clip alongside narration text, and that covers what "voiced" means here: put a playSound step with previous against your showText step. There is no voice-acting feature, no speech-file naming convention and no lipsync, so do not plan a recording pipeline around one.
Pro note
Narration defaults to 1800 ms, which is about six words at comfortable reading speed. Anything wordier needs its ms raised by hand, or your best line blinks out before anyone finishes it.

14Importing an AGS project

Already have a game in the AGS Editor? Open the Import tab, under the heading Import an Adventure Game Studio project. Hit Choose AGS project folder and point at the folder holding Game.agf, alongside your .asc scripts, acsprset.spr, and roomN.crm files. It reads the files in your browser, so nothing is uploaded. Rooms land as scenes, sprite and room art comes across, Music/ and Sound/ audio comes with it, and scripts convert to FoundryScript. The pipeline narrates itself: Reading Game.agf, Converting scripts, Importing sprites, Compiling converted script. The report then hands you chips for Characters, Views, GUIs, Dialogs and Cursors, plus Compile errors and Lines needing manual conversion. Unlike AGS, hotspot events are lossy: only Look, Interact, Talk, PickUp and AnyClick map to verbs, capped at eight per hotspot. Open View converted FoundryScript before you trust it.

The Import tab: Import an Adventure Game Studio project and Choose AGS project folder.
The Import tab: Import an Adventure Game Studio project and Choose AGS project folder.See the full screen
Import replaces everything: the panel spells out Current project contents, import DESTROYS these before replacing them, and step one is Clearing the current project. It is confirm-guarded, but import into a scratch project, never on top of work you care about. Also, a lone .agt file is a packaged template rather than a project, so open it once in the AGS Editor (File, then New game from template) and pick the folder it creates.
Pro note
Read the report before you read the game. Anything it flags is usually cheaper to fix on the AGS side, then re-import the same folder and it refreshes.

15Validate and publish

The Validate tab is your pre-flight check. Open it, read the Validation heading, and press Re-check after any change. A pass reads "This game is structurally valid and ready to publish (add a cover too)." A fail reads "Fix these before publishing:" and lists the real blockers: no scenes, no start scene set, placed objects pointing at a missing object type, referenced media missing from the library, and scene jumps that lead nowhere. Below that, "Suggestions (won't block publishing):" flags empty scenes, rules referencing an undeclared variable, and the big one, "No scene places a player object, so the game may not be controllable." You also need a cover image before you can publish. Unlike AGS, saves are one automatic save per reader per game. No slots, no save menu, so write a story that resumes gracefully rather than one expecting the player to manage saves.

The Validate tab: a pass with Re-check, and suggestions that won't block publishing.
The Validate tab: a pass with Re-check, and suggestions that won't block publishing.See the full screen
Before you publish, always press Compile on the Story tab and again on the Script tab. A broken Ink or FoundryScript source blocks publishing, but the Validate tab cannot surface those two errors yet, so you can get a red "Fix these before publishing:" box with nothing listed in it and a publish that fails without telling you why. Those two Compile buttons are the only place the actual error text appears.
Pro note
Fix the suggestions anyway. A scene with no objects and no tilemap is almost never a deliberate choice, it's the room you wandered away from at midnight and forgot.

Build your first room

The loop, in order. Links into the app. Saved on this device.

→
→
→
→
→
→
→
→

Coming from Adventure Game Studio?

Behind the Explore Project rail. AGS keeps its project tree pinned open; ours hides behind a button, and those editors (plus Mouse cursors and Global variables) exist nowhere else. It is the first thing to click.

There is one walk area: a union of polygons minus holes. Scaling is one linear band per room (Near y / Near scale / Far y / Far scale) rather than per-area. Simpler, and less to keep track of, but if your design leaned on numbered areas you will rework it. RemoveWalkableArea and RestoreWalkableArea compile but do nothing.

No, and this catches everyone. The Room tab's Room script box compiles so you can fix imported code, but the runtime only ever loads the global program from the Script tab. Paste room logic into Script to make it run.

It will run without crashing, which is the design goal. About 50 of roughly 130 API members are wired to real behaviour; the rest compile and safely do nothing. So an imported game boots and plays, but check the import report and expect to rewire the parts that no-op.

Because the Dialogs panel is a flat option list, not a tree: clicking an option speaks it and re-renders the same list. Ink, on the Story tab, is the real branching engine with choices and state. Write conversations in Ink and use Dialogs as a menu.

Neither, currently. The verb set is fixed at five (Walk to, Look at, Use / Open, Take, Talk to), and the only item mechanic is use-item-on-hotspot. There is no item-on-item combining and no verb coin.

None of those exist. Use an exit object or GotoScene instead of edges. There is no FollowCharacter. Saving is one automatic save per reader per game, with no slots and no save menu, so write a story that resumes.

Split-screen (a close-up detail panel beside the room), Ink for branching narrative with save and resume, the Cutscenes step sequencer with parallel steps, the Rules engine, and a browser-side AGS importer that converts your scripts and reports on every one.

Go build a world

Rooms, hotspots, inventory, a branching story, and script when you need it. That is a real adventure game, and it plays in a browser with nothing to install.