diff --git a/AGENTS.md b/AGENTS.md
index 808130b..0f4b15c 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -174,7 +174,7 @@ The other 25 are present on disk but not yet wired into the evolution system.
| filename | label | type | group |
|----------------------------------|-------------|---------|----------|
-| dna-bold-duotone.svg | DNA | good | biology |
+| cell.svg | cell | good | biology |
| bug-bold-duotone.svg | Bug | bad | tech |
| buildings-3-bold-duotone.svg | Buildings | good | economy |
| chat-round-dots-bold-duotone.svg | Chat | neutral | social |
@@ -202,7 +202,7 @@ Create a new group in `icons.groups` if needed.
## Current spawn behaviour
-Only `dna-bold-duotone` spawns by default; the spawn logic is the next target for extension.
+Only `cell` spawns by default; the spawn logic is the next target for extension.
---
diff --git a/index.html b/index.html
index 637ec4b..9b0a07f 100644
--- a/index.html
+++ b/index.html
@@ -60,9 +60,9 @@
entities
-
-
- dna
+
+
+ cell
base lifeform
0
@@ -94,7 +94,7 @@
+
-
+
→
bug infects
@@ -104,13 +104,13 @@
+
→
-
+
bug cures virus
+
-
+
→
90%
virus kills
@@ -118,7 +118,7 @@
+
-
+
→
10%
diff --git a/src/data/icons.json b/src/data/icons.json
index acf6472..84d59d5 100644
--- a/src/data/icons.json
+++ b/src/data/icons.json
@@ -2,7 +2,7 @@
"_comment": "Icon registry for the evolution system. Each icon has a type (good/bad/neutral/viral) and belongs to a group. Types define the visual colour tint. Spawn config controls initial entity creation and rare spawns.",
"groups": [
- { "id": "biology", "label": "Biology", "icons": ["dna-bold-duotone", "bacteria"] },
+ { "id": "biology", "label": "Biology", "icons": ["cell", "bacteria"] },
{ "id": "tech", "label": "Technology", "icons": ["database-bold-duotone", "display-line-duotone", "bug-bold-duotone"] },
{ "id": "social", "label": "Social", "icons": ["chat-round-dots-bold-duotone", "chat-round-unread-bold-duotone"] },
{ "id": "economy", "label": "Economy", "icons": ["chat-round-money-bold-duotone", "delivery-bold-duotone", "buildings-3-bold-duotone"] },
@@ -10,15 +10,8 @@
],
"icons": {
- "dna-bold-duotone": { "label": "DNA", "type": "good", "group": "biology" },
+ "cell": { "label": "Cell", "type": "good", "group": "biology" },
"bug-bold-duotone": { "label": "Bug", "type": "bad", "group": "tech" },
- "buildings-3-bold-duotone": { "label": "Buildings", "type": "good", "group": "economy" },
- "chat-round-dots-bold-duotone": { "label": "Chat", "type": "neutral", "group": "social" },
- "chat-round-money-bold-duotone": { "label": "Chat Money", "type": "neutral", "group": "economy" },
- "chat-round-unread-bold-duotone": { "label": "Unread Chat", "type": "neutral", "group": "social" },
- "database-bold-duotone": { "label": "Database", "type": "good", "group": "tech" },
- "delivery-bold-duotone": { "label": "Delivery", "type": "good", "group": "economy" },
- "display-line-duotone": { "label": "Display", "type": "neutral", "group": "tech" },
"bug": { "label": "Bug (rare)", "type": "bad", "group": "threat", "isRare": true, "behavior": "infect", "infectWith": "virus-filled" },
"virus-filled": { "label": "Virus", "type": "viral", "group": "threat" },
"bacteria": { "label": "Bacteria", "type": "mutant", "group": "biology" }
@@ -33,7 +26,7 @@
},
"spawn": {
- "initial": "dna-bold-duotone",
+ "initial": "cell",
"rare": "bug",
"rareChance": 0.08
}
diff --git a/src/icons/cell.svg b/src/icons/cell.svg
new file mode 100644
index 0000000..81d5f5a
--- /dev/null
+++ b/src/icons/cell.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/js/evolution.js b/src/js/evolution.js
index 1b64918..7fd99ab 100644
--- a/src/js/evolution.js
+++ b/src/js/evolution.js
@@ -4,7 +4,7 @@
*
* 1. Spawning — after a random interval (SPAWN_DELAY_MIN … SPAWN_DELAY_MAX),
* an icon appears at a random viewport position. Most spawns produce the
- * "initial" icon (dna-bold-duotone); with rareChance probability the rare
+ * "initial" icon (cell); with rareChance probability the rare
* "bug" icon spawns instead.
*
* 2. Physics loop — a single rAF loop drives all live entities each frame.
@@ -126,7 +126,7 @@ export class EvolutionController {
* Manually spawn a specific icon by name at a random viewport position.
* Used by the guide panel when the user clicks an entity row.
*
- * @param {string} iconName Key from icons.json (e.g. 'dna-bold-duotone', 'bug')
+ * @param {string} iconName Key from icons.json (e.g. 'cell', 'bug')
*/
async spawnNamed(iconName) {
if (!this.#container || !this.#iconsData) return;
@@ -384,22 +384,22 @@ export class EvolutionController {
: '#ff4d6d';
// bug + normal entity → infects with virus
- // bug + virus-filled → backwards-transforms virus back to DNA (cure)
- const dnaMeta = this.#iconsData.icons['dna-bold-duotone'];
- const dnaColor = dnaMeta
- ? (this.#iconsData.types[dnaMeta.type]?.color ?? '#a8ffb8')
+ // bug + virus-filled → backwards-transforms virus back to cell (cure)
+ const cellMeta = this.#iconsData.icons['cell'];
+ const cellColor = cellMeta
+ ? (this.#iconsData.types[cellMeta.type]?.color ?? '#a8ffb8')
: '#a8ffb8';
const bugImmune = new Set(['bug', 'bacteria']);
if (a.entityKey === 'bug') {
if (b.entityKey === 'virus-filled') {
- b.infectWith('dna-bold-duotone', dnaColor, { force: true });
+ b.infectWith('cell', cellColor, { force: true });
} else if (!bugImmune.has(b.entityKey)) {
b.infectWith('virus-filled', virusColor);
}
} else if (b.entityKey === 'bug') {
if (a.entityKey === 'virus-filled') {
- a.infectWith('dna-bold-duotone', dnaColor, { force: true });
+ a.infectWith('cell', cellColor, { force: true });
} else if (!bugImmune.has(a.entityKey)) {
a.infectWith('virus-filled', virusColor);
}
diff --git a/src/js/iconLoader.js b/src/js/iconLoader.js
index 022b36c..ff5dab0 100644
--- a/src/js/iconLoader.js
+++ b/src/js/iconLoader.js
@@ -34,7 +34,7 @@ function normalizeSvg(raw) {
* Load and cache an SVG icon by name.
* Subsequent calls for the same name are synchronous (cache hit).
*
- * @param {string} name Filename without extension, e.g. 'dna-bold-duotone'
+ * @param {string} name Filename without extension, e.g. 'cell'
* @returns {Promise} Normalised SVG markup
*/
export async function loadIcon(name) {