Creating Custom Maps

Jasmine 'Jazzrabbit' Stephens edited this page Apr 6, 2024 · 2 revisions

Intro

This guide assumes you've already followed the steps in the Mod Setup Basics page.

You can also see this page for a template level mod containing some basic levels to help you get started.

All maps should be put in the Maps subfolder of your mod folder.

The standard map editor for Celeste 64 modding is Trenchbroom.

Download Trenchbroom and create a new map. Select Generic in the list of games. You'll have to follow these steps to get the Celeste 64 content loaded:

  1. In View > Preferences, select "Generic" in the game list.
  2. Click the three dots next to Game Path
  3. Locate the Content folder in your Celeste 64 installation.
  4. Click Select Folder. This will load Celeste 64 data such as textures, completing the first part of setup
  5. Click Entity on the right side panel.
  6. In External at the bottom, click Browse...
  7. Once again navigate to your Celeste 64 installation. In Content, select the Celeste64.fgd file. Click Open.

You've now loaded the entities and textures of Celeste 64 and you're ready to make maps!

Learning how to use Trenchbroom is out of scope for this wiki. Please look up a tutorial or use the official manual - they'll probably have it covered better than we could.

Tip

You can press CTRL+R while playing your map to instantly reload the map. This will update it to the latest saved version!

Making your map visible

Back in your mod folder, you'll need a Levels.json file to register your maps in Fuji. Fill it in using this template:

[
{
"ID": "<Unique level id>",
"Name": "<Human-readable name of the level. This shows up ingame>",
"Label": "<Human-readable description of the level. This shows up ingame>",
"Strawberries": 1,
"Preview": "<Postcards/texture-filename>",
"Map": "<The file name of your .map file>"
}
]

Note that for postcards, Fuji looks in your mod folder's Textures folder. So a value of Postcards/ForesakenCity equals YourModFolder/Textures/Postcards/ForsakenCity

You'll also have to manually count the amount of berries in your map.

To add multiple levels, simply copy and paste the level definition and fill it in again accordingly. The Levels.json file MUST be valid JSON. To validate JSON as you develop, you can use an online validator or your preferred text editor's integrated tools, if provided.

For starters, you must have a comma , between each level definition (the pair of curly braces). The square brace must wrap around the entire file contents. Indenting is optional but it helps. Insert line breaks in text strings by writing \n.

Important

Once you're done and ready to release your map, follow the instructions for mod release in Mod Setup Basics.

Note

For reference, a sample Levels.json file is provided below

[
{
"ID": "ModAuthor_MadelinesAdventure_1",
"Name": "Madeline's Adventure: Foresaken City",
"Label": "My level description",
"Strawberries": 16,
"Preview": "Postcards/MadelinesAdventure_1",
"Map": "ch1"
},
{
"ID": "ModAuthor_MadelinesAdventure_2",
"Name": "Madeline's Adventure: Old Site",
"Label": "My level description again",
"Strawberries": 11,
"Preview": "Postcards/MadelinesAdventure_2",
"Map": "ch2"
}
]

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Creating Custom Maps

Jasmine 'Jazzrabbit' Stephens edited this page Apr 6, 2024 · 2 revisions

Intro

This guide assumes you've already followed the steps in the Mod Setup Basics page.

You can also see this page for a template level mod containing some basic levels to help you get started.

All maps should be put in the Maps subfolder of your mod folder.

The standard map editor for Celeste 64 modding is Trenchbroom.

Download Trenchbroom and create a new map. Select Generic in the list of games. You'll have to follow these steps to get the Celeste 64 content loaded:

  1. In View > Preferences, select "Generic" in the game list.
  2. Click the three dots next to Game Path
  3. Locate the Content folder in your Celeste 64 installation.
  4. Click Select Folder. This will load Celeste 64 data such as textures, completing the first part of setup
  5. Click Entity on the right side panel.
  6. In External at the bottom, click Browse...
  7. Once again navigate to your Celeste 64 installation. In Content, select the Celeste64.fgd file. Click Open.

You've now loaded the entities and textures of Celeste 64 and you're ready to make maps!

Learning how to use Trenchbroom is out of scope for this wiki. Please look up a tutorial or use the official manual - they'll probably have it covered better than we could.

Tip

You can press CTRL+R while playing your map to instantly reload the map. This will update it to the latest saved version!

Making your map visible

Back in your mod folder, you'll need a Levels.json file to register your maps in Fuji. Fill it in using this template:

[
{
"ID": "<Unique level id>",
"Name": "<Human-readable name of the level. This shows up ingame>",
"Label": "<Human-readable description of the level. This shows up ingame>",
"Strawberries": 1,
"Preview": "<Postcards/texture-filename>",
"Map": "<The file name of your .map file>"
}
]

Note that for postcards, Fuji looks in your mod folder's Textures folder. So a value of Postcards/ForesakenCity equals YourModFolder/Textures/Postcards/ForsakenCity

You'll also have to manually count the amount of berries in your map.

To add multiple levels, simply copy and paste the level definition and fill it in again accordingly. The Levels.json file MUST be valid JSON. To validate JSON as you develop, you can use an online validator or your preferred text editor's integrated tools, if provided.

For starters, you must have a comma , between each level definition (the pair of curly braces). The square brace must wrap around the entire file contents. Indenting is optional but it helps. Insert line breaks in text strings by writing \n.

Important

Once you're done and ready to release your map, follow the instructions for mod release in Mod Setup Basics.

Note

For reference, a sample Levels.json file is provided below

[
{
"ID": "ModAuthor_MadelinesAdventure_1",
"Name": "Madeline's Adventure: Foresaken City",
"Label": "My level description",
"Strawberries": 16,
"Preview": "Postcards/MadelinesAdventure_1",
"Map": "ch1"
},
{
"ID": "ModAuthor_MadelinesAdventure_2",
"Name": "Madeline's Adventure: Old Site",
"Label": "My level description again",
"Strawberries": 11,
"Preview": "Postcards/MadelinesAdventure_2",
"Map": "ch2"
}
]

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Creating Custom Maps

Jasmine 'Jazzrabbit' Stephens edited this page Apr 6, 2024 · 2 revisions

Intro

This guide assumes you've already followed the steps in the Mod Setup Basics page.

You can also see this page for a template level mod containing some basic levels to help you get started.

All maps should be put in the Maps subfolder of your mod folder.

The standard map editor for Celeste 64 modding is Trenchbroom.

Download Trenchbroom and create a new map. Select Generic in the list of games. You'll have to follow these steps to get the Celeste 64 content loaded:

  1. In View > Preferences, select "Generic" in the game list.
  2. Click the three dots next to Game Path
  3. Locate the Content folder in your Celeste 64 installation.
  4. Click Select Folder. This will load Celeste 64 data such as textures, completing the first part of setup
  5. Click Entity on the right side panel.
  6. In External at the bottom, click Browse...
  7. Once again navigate to your Celeste 64 installation. In Content, select the Celeste64.fgd file. Click Open.

You've now loaded the entities and textures of Celeste 64 and you're ready to make maps!

Learning how to use Trenchbroom is out of scope for this wiki. Please look up a tutorial or use the official manual - they'll probably have it covered better than we could.

Tip

You can press CTRL+R while playing your map to instantly reload the map. This will update it to the latest saved version!

Making your map visible

Back in your mod folder, you'll need a Levels.json file to register your maps in Fuji. Fill it in using this template:

[
{
"ID": "<Unique level id>",
"Name": "<Human-readable name of the level. This shows up ingame>",
"Label": "<Human-readable description of the level. This shows up ingame>",
"Strawberries": 1,
"Preview": "<Postcards/texture-filename>",
"Map": "<The file name of your .map file>"
}
]

Note that for postcards, Fuji looks in your mod folder's Textures folder. So a value of Postcards/ForesakenCity equals YourModFolder/Textures/Postcards/ForsakenCity

You'll also have to manually count the amount of berries in your map.

To add multiple levels, simply copy and paste the level definition and fill it in again accordingly. The Levels.json file MUST be valid JSON. To validate JSON as you develop, you can use an online validator or your preferred text editor's integrated tools, if provided.

For starters, you must have a comma , between each level definition (the pair of curly braces). The square brace must wrap around the entire file contents. Indenting is optional but it helps. Insert line breaks in text strings by writing \n.

Important

Once you're done and ready to release your map, follow the instructions for mod release in Mod Setup Basics.

Note

For reference, a sample Levels.json file is provided below

[
{
"ID": "ModAuthor_MadelinesAdventure_1",
"Name": "Madeline's Adventure: Foresaken City",
"Label": "My level description",
"Strawberries": 16,
"Preview": "Postcards/MadelinesAdventure_1",
"Map": "ch1"
},
{
"ID": "ModAuthor_MadelinesAdventure_2",
"Name": "Madeline's Adventure: Old Site",
"Label": "My level description again",
"Strawberries": 11,
"Preview": "Postcards/MadelinesAdventure_2",
"Map": "ch2"
}
]

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Creating Custom Maps

Jasmine 'Jazzrabbit' Stephens edited this page Apr 6, 2024 · 2 revisions

Intro

This guide assumes you've already followed the steps in the Mod Setup Basics page.

You can also see this page for a template level mod containing some basic levels to help you get started.

All maps should be put in the Maps subfolder of your mod folder.

The standard map editor for Celeste 64 modding is Trenchbroom.

Download Trenchbroom and create a new map. Select Generic in the list of games. You'll have to follow these steps to get the Celeste 64 content loaded:

  1. In View > Preferences, select "Generic" in the game list.
  2. Click the three dots next to Game Path
  3. Locate the Content folder in your Celeste 64 installation.
  4. Click Select Folder. This will load Celeste 64 data such as textures, completing the first part of setup
  5. Click Entity on the right side panel.
  6. In External at the bottom, click Browse...
  7. Once again navigate to your Celeste 64 installation. In Content, select the Celeste64.fgd file. Click Open.

You've now loaded the entities and textures of Celeste 64 and you're ready to make maps!

Learning how to use Trenchbroom is out of scope for this wiki. Please look up a tutorial or use the official manual - they'll probably have it covered better than we could.

Tip

You can press CTRL+R while playing your map to instantly reload the map. This will update it to the latest saved version!

Making your map visible

Back in your mod folder, you'll need a Levels.json file to register your maps in Fuji. Fill it in using this template:

[
{
"ID": "<Unique level id>",
"Name": "<Human-readable name of the level. This shows up ingame>",
"Label": "<Human-readable description of the level. This shows up ingame>",
"Strawberries": 1,
"Preview": "<Postcards/texture-filename>",
"Map": "<The file name of your .map file>"
}
]

Note that for postcards, Fuji looks in your mod folder's Textures folder. So a value of Postcards/ForesakenCity equals YourModFolder/Textures/Postcards/ForsakenCity

You'll also have to manually count the amount of berries in your map.

To add multiple levels, simply copy and paste the level definition and fill it in again accordingly. The Levels.json file MUST be valid JSON. To validate JSON as you develop, you can use an online validator or your preferred text editor's integrated tools, if provided.

For starters, you must have a comma , between each level definition (the pair of curly braces). The square brace must wrap around the entire file contents. Indenting is optional but it helps. Insert line breaks in text strings by writing \n.

Important

Once you're done and ready to release your map, follow the instructions for mod release in Mod Setup Basics.

Note

For reference, a sample Levels.json file is provided below

[
{
"ID": "ModAuthor_MadelinesAdventure_1",
"Name": "Madeline's Adventure: Foresaken City",
"Label": "My level description",
"Strawberries": 16,
"Preview": "Postcards/MadelinesAdventure_1",
"Map": "ch1"
},
{
"ID": "ModAuthor_MadelinesAdventure_2",
"Name": "Madeline's Adventure: Old Site",
"Label": "My level description again",
"Strawberries": 11,
"Preview": "Postcards/MadelinesAdventure_2",
"Map": "ch2"
}
]

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Creating Custom Maps

Jasmine 'Jazzrabbit' Stephens edited this page Apr 6, 2024 · 2 revisions

Intro

This guide assumes you've already followed the steps in the Mod Setup Basics page.

You can also see this page for a template level mod containing some basic levels to help you get started.

All maps should be put in the Maps subfolder of your mod folder.

The standard map editor for Celeste 64 modding is Trenchbroom.

Download Trenchbroom and create a new map. Select Generic in the list of games. You'll have to follow these steps to get the Celeste 64 content loaded:

  1. In View > Preferences, select "Generic" in the game list.
  2. Click the three dots next to Game Path
  3. Locate the Content folder in your Celeste 64 installation.
  4. Click Select Folder. This will load Celeste 64 data such as textures, completing the first part of setup
  5. Click Entity on the right side panel.
  6. In External at the bottom, click Browse...
  7. Once again navigate to your Celeste 64 installation. In Content, select the Celeste64.fgd file. Click Open.

You've now loaded the entities and textures of Celeste 64 and you're ready to make maps!

Learning how to use Trenchbroom is out of scope for this wiki. Please look up a tutorial or use the official manual - they'll probably have it covered better than we could.

Tip

You can press CTRL+R while playing your map to instantly reload the map. This will update it to the latest saved version!

Making your map visible

Back in your mod folder, you'll need a Levels.json file to register your maps in Fuji. Fill it in using this template:

[
{
"ID": "<Unique level id>",
"Name": "<Human-readable name of the level. This shows up ingame>",
"Label": "<Human-readable description of the level. This shows up ingame>",
"Strawberries": 1,
"Preview": "<Postcards/texture-filename>",
"Map": "<The file name of your .map file>"
}
]

Note that for postcards, Fuji looks in your mod folder's Textures folder. So a value of Postcards/ForesakenCity equals YourModFolder/Textures/Postcards/ForsakenCity

You'll also have to manually count the amount of berries in your map.

To add multiple levels, simply copy and paste the level definition and fill it in again accordingly. The Levels.json file MUST be valid JSON. To validate JSON as you develop, you can use an online validator or your preferred text editor's integrated tools, if provided.

For starters, you must have a comma , between each level definition (the pair of curly braces). The square brace must wrap around the entire file contents. Indenting is optional but it helps. Insert line breaks in text strings by writing \n.

Important

Once you're done and ready to release your map, follow the instructions for mod release in Mod Setup Basics.

Note

For reference, a sample Levels.json file is provided below

[
{
"ID": "ModAuthor_MadelinesAdventure_1",
"Name": "Madeline's Adventure: Foresaken City",
"Label": "My level description",
"Strawberries": 16,
"Preview": "Postcards/MadelinesAdventure_1",
"Map": "ch1"
},
{
"ID": "ModAuthor_MadelinesAdventure_2",
"Name": "Madeline's Adventure: Old Site",
"Label": "My level description again",
"Strawberries": 11,
"Preview": "Postcards/MadelinesAdventure_2",
"Map": "ch2"
}
]

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Creating Custom Maps

Jasmine 'Jazzrabbit' Stephens edited this page Apr 6, 2024 · 2 revisions

Intro

This guide assumes you've already followed the steps in the Mod Setup Basics page.

You can also see this page for a template level mod containing some basic levels to help you get started.

All maps should be put in the Maps subfolder of your mod folder.

The standard map editor for Celeste 64 modding is Trenchbroom.

Download Trenchbroom and create a new map. Select Generic in the list of games. You'll have to follow these steps to get the Celeste 64 content loaded:

  1. In View > Preferences, select "Generic" in the game list.
  2. Click the three dots next to Game Path
  3. Locate the Content folder in your Celeste 64 installation.
  4. Click Select Folder. This will load Celeste 64 data such as textures, completing the first part of setup
  5. Click Entity on the right side panel.
  6. In External at the bottom, click Browse...
  7. Once again navigate to your Celeste 64 installation. In Content, select the Celeste64.fgd file. Click Open.

You've now loaded the entities and textures of Celeste 64 and you're ready to make maps!

Learning how to use Trenchbroom is out of scope for this wiki. Please look up a tutorial or use the official manual - they'll probably have it covered better than we could.

Tip

You can press CTRL+R while playing your map to instantly reload the map. This will update it to the latest saved version!

Making your map visible

Back in your mod folder, you'll need a Levels.json file to register your maps in Fuji. Fill it in using this template:

[
{
"ID": "<Unique level id>",
"Name": "<Human-readable name of the level. This shows up ingame>",
"Label": "<Human-readable description of the level. This shows up ingame>",
"Strawberries": 1,
"Preview": "<Postcards/texture-filename>",
"Map": "<The file name of your .map file>"
}
]

Note that for postcards, Fuji looks in your mod folder's Textures folder. So a value of Postcards/ForesakenCity equals YourModFolder/Textures/Postcards/ForsakenCity

You'll also have to manually count the amount of berries in your map.

To add multiple levels, simply copy and paste the level definition and fill it in again accordingly. The Levels.json file MUST be valid JSON. To validate JSON as you develop, you can use an online validator or your preferred text editor's integrated tools, if provided.

For starters, you must have a comma , between each level definition (the pair of curly braces). The square brace must wrap around the entire file contents. Indenting is optional but it helps. Insert line breaks in text strings by writing \n.

Important

Once you're done and ready to release your map, follow the instructions for mod release in Mod Setup Basics.

Note

For reference, a sample Levels.json file is provided below

[
{
"ID": "ModAuthor_MadelinesAdventure_1",
"Name": "Madeline's Adventure: Foresaken City",
"Label": "My level description",
"Strawberries": 16,
"Preview": "Postcards/MadelinesAdventure_1",
"Map": "ch1"
},
{
"ID": "ModAuthor_MadelinesAdventure_2",
"Name": "Madeline's Adventure: Old Site",
"Label": "My level description again",
"Strawberries": 11,
"Preview": "Postcards/MadelinesAdventure_2",
"Map": "ch2"
}
]

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Creating Custom Maps

Jasmine 'Jazzrabbit' Stephens edited this page Apr 6, 2024 · 2 revisions

Intro

This guide assumes you've already followed the steps in the Mod Setup Basics page.

You can also see this page for a template level mod containing some basic levels to help you get started.

All maps should be put in the Maps subfolder of your mod folder.

The standard map editor for Celeste 64 modding is Trenchbroom.

Download Trenchbroom and create a new map. Select Generic in the list of games. You'll have to follow these steps to get the Celeste 64 content loaded:

  1. In View > Preferences, select "Generic" in the game list.
  2. Click the three dots next to Game Path
  3. Locate the Content folder in your Celeste 64 installation.
  4. Click Select Folder. This will load Celeste 64 data such as textures, completing the first part of setup
  5. Click Entity on the right side panel.
  6. In External at the bottom, click Browse...
  7. Once again navigate to your Celeste 64 installation. In Content, select the Celeste64.fgd file. Click Open.

You've now loaded the entities and textures of Celeste 64 and you're ready to make maps!

Learning how to use Trenchbroom is out of scope for this wiki. Please look up a tutorial or use the official manual - they'll probably have it covered better than we could.

Tip

You can press CTRL+R while playing your map to instantly reload the map. This will update it to the latest saved version!

Making your map visible

Back in your mod folder, you'll need a Levels.json file to register your maps in Fuji. Fill it in using this template:

[
{
"ID": "<Unique level id>",
"Name": "<Human-readable name of the level. This shows up ingame>",
"Label": "<Human-readable description of the level. This shows up ingame>",
"Strawberries": 1,
"Preview": "<Postcards/texture-filename>",
"Map": "<The file name of your .map file>"
}
]

Note that for postcards, Fuji looks in your mod folder's Textures folder. So a value of Postcards/ForesakenCity equals YourModFolder/Textures/Postcards/ForsakenCity

You'll also have to manually count the amount of berries in your map.

To add multiple levels, simply copy and paste the level definition and fill it in again accordingly. The Levels.json file MUST be valid JSON. To validate JSON as you develop, you can use an online validator or your preferred text editor's integrated tools, if provided.

For starters, you must have a comma , between each level definition (the pair of curly braces). The square brace must wrap around the entire file contents. Indenting is optional but it helps. Insert line breaks in text strings by writing \n.

Important

Once you're done and ready to release your map, follow the instructions for mod release in Mod Setup Basics.

Note

For reference, a sample Levels.json file is provided below

[
{
"ID": "ModAuthor_MadelinesAdventure_1",
"Name": "Madeline's Adventure: Foresaken City",
"Label": "My level description",
"Strawberries": 16,
"Preview": "Postcards/MadelinesAdventure_1",
"Map": "ch1"
},
{
"ID": "ModAuthor_MadelinesAdventure_2",
"Name": "Madeline's Adventure: Old Site",
"Label": "My level description again",
"Strawberries": 11,
"Preview": "Postcards/MadelinesAdventure_2",
"Map": "ch2"
}
]

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Creating Custom Maps

Jasmine 'Jazzrabbit' Stephens edited this page Apr 6, 2024 · 2 revisions

Intro

This guide assumes you've already followed the steps in the Mod Setup Basics page.

You can also see this page for a template level mod containing some basic levels to help you get started.

All maps should be put in the Maps subfolder of your mod folder.

The standard map editor for Celeste 64 modding is Trenchbroom.

Download Trenchbroom and create a new map. Select Generic in the list of games. You'll have to follow these steps to get the Celeste 64 content loaded:

  1. In View > Preferences, select "Generic" in the game list.
  2. Click the three dots next to Game Path
  3. Locate the Content folder in your Celeste 64 installation.
  4. Click Select Folder. This will load Celeste 64 data such as textures, completing the first part of setup
  5. Click Entity on the right side panel.
  6. In External at the bottom, click Browse...
  7. Once again navigate to your Celeste 64 installation. In Content, select the Celeste64.fgd file. Click Open.

You've now loaded the entities and textures of Celeste 64 and you're ready to make maps!

Learning how to use Trenchbroom is out of scope for this wiki. Please look up a tutorial or use the official manual - they'll probably have it covered better than we could.

Tip

You can press CTRL+R while playing your map to instantly reload the map. This will update it to the latest saved version!

Making your map visible

Back in your mod folder, you'll need a Levels.json file to register your maps in Fuji. Fill it in using this template:

[
{
"ID": "<Unique level id>",
"Name": "<Human-readable name of the level. This shows up ingame>",
"Label": "<Human-readable description of the level. This shows up ingame>",
"Strawberries": 1,
"Preview": "<Postcards/texture-filename>",
"Map": "<The file name of your .map file>"
}
]

Note that for postcards, Fuji looks in your mod folder's Textures folder. So a value of Postcards/ForesakenCity equals YourModFolder/Textures/Postcards/ForsakenCity

You'll also have to manually count the amount of berries in your map.

To add multiple levels, simply copy and paste the level definition and fill it in again accordingly. The Levels.json file MUST be valid JSON. To validate JSON as you develop, you can use an online validator or your preferred text editor's integrated tools, if provided.

For starters, you must have a comma , between each level definition (the pair of curly braces). The square brace must wrap around the entire file contents. Indenting is optional but it helps. Insert line breaks in text strings by writing \n.

Important

Once you're done and ready to release your map, follow the instructions for mod release in Mod Setup Basics.

Note

For reference, a sample Levels.json file is provided below

[
{
"ID": "ModAuthor_MadelinesAdventure_1",
"Name": "Madeline's Adventure: Foresaken City",
"Label": "My level description",
"Strawberries": 16,
"Preview": "Postcards/MadelinesAdventure_1",
"Map": "ch1"
},
{
"ID": "ModAuthor_MadelinesAdventure_2",
"Name": "Madeline's Adventure: Old Site",
"Label": "My level description again",
"Strawberries": 11,
"Preview": "Postcards/MadelinesAdventure_2",
"Map": "ch2"
}
]

Clone this wiki locally