sprites for entities, with text glyph fallback

This commit is contained in:
Llywelwyn 2023-09-26 17:23:25 +01:00
parent 2c4b4ca143
commit d6ba6c628c
17 changed files with 1486 additions and 1397 deletions

View file

@ -2,7 +2,7 @@
{ {
"id": "npc_barkeep", "id": "npc_barkeep",
"name": "barkeep", "name": "barkeep",
"renderable": { "glyph": "@", "fg": "#EE82EE", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "@", "sprite": "@", "fg": "#EE82EE", "bg": "#000000", "order": 1 },
"flags": ["NEUTRAL", "IS_HUMAN"], "flags": ["NEUTRAL", "IS_HUMAN"],
"vision_range": 4, "vision_range": 4,
"quips": ["Drink?", "Something to eat?", "Don't go out on an empty stomach."] "quips": ["Drink?", "Something to eat?", "Don't go out on an empty stomach."]
@ -10,7 +10,7 @@
{ {
"id": "npc_townsperson", "id": "npc_townsperson",
"name": "townsperson", "name": "townsperson",
"renderable": { "glyph": "@", "fg": "#9fa86c", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "@", "sprite": "@", "fg": "#9fa86c", "bg": "#000000", "order": 1 },
"flags": ["NEUTRAL", "RANDOM_PATH", "IS_HUMAN"], "flags": ["NEUTRAL", "RANDOM_PATH", "IS_HUMAN"],
"vision_range": 4, "vision_range": 4,
"quips": ["Hello!", "Good morning.", "<a quiet complaint about chores>"] "quips": ["Hello!", "Good morning.", "<a quiet complaint about chores>"]
@ -18,7 +18,7 @@
{ {
"id": "npc_drunk", "id": "npc_drunk",
"name": "drunk", "name": "drunk",
"renderable": { "glyph": "@", "fg": "#a0a83c", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "@", "sprite": "@", "fg": "#a0a83c", "bg": "#000000", "order": 1 },
"flags": ["NEUTRAL", "IS_HUMAN"], "flags": ["NEUTRAL", "IS_HUMAN"],
"vision_range": 4, "vision_range": 4,
"quips": ["Hic!", "H-Hic'.", "Get me 'nother, would you?"] "quips": ["Hic!", "H-Hic'.", "Get me 'nother, would you?"]
@ -26,7 +26,7 @@
{ {
"id": "npc_fisher", "id": "npc_fisher",
"name": "fisher", "name": "fisher",
"renderable": { "glyph": "@", "fg": "#3ca3a8", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "@", "sprite": "@", "fg": "#3ca3a8", "bg": "#000000", "order": 1 },
"flags": ["NEUTRAL", "IS_HUMAN"], "flags": ["NEUTRAL", "IS_HUMAN"],
"vision_range": 4, "vision_range": 4,
"quips": ["Hey."] "quips": ["Hey."]
@ -34,7 +34,7 @@
{ {
"id": "npc_dockworker", "id": "npc_dockworker",
"name": "dock worker", "name": "dock worker",
"renderable": { "glyph": "@", "fg": "#68d8de", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "@", "sprite": "@", "fg": "#68d8de", "bg": "#000000", "order": 1 },
"flags": ["NEUTRAL", "IS_HUMAN"], "flags": ["NEUTRAL", "IS_HUMAN"],
"vision_range": 4, "vision_range": 4,
"quips": ["No boat for a few days.", "Not much for us to do."] "quips": ["No boat for a few days.", "Not much for us to do."]
@ -42,7 +42,7 @@
{ {
"id": "npc_priest", "id": "npc_priest",
"name": "priest", "name": "priest",
"renderable": { "glyph": "@", "fg": "#FFFFFF", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "@", "sprite": "@", "fg": "#FFFFFF", "bg": "#000000", "order": 1 },
"flags": ["NEUTRAL", "IS_HUMAN"], "flags": ["NEUTRAL", "IS_HUMAN"],
"vision_range": 4, "vision_range": 4,
"quips": ["Light's givings.", "<a quiet prayer>", "Bless you."] "quips": ["Light's givings.", "<a quiet prayer>", "Bless you."]
@ -50,7 +50,7 @@
{ {
"id": "npc_miner", "id": "npc_miner",
"name": "miner", "name": "miner",
"renderable": { "glyph": "@", "fg": "#946123", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "@", "sprite": "@", "fg": "#946123", "bg": "#000000", "order": 1 },
"flags": ["NEUTRAL", "IS_HUMAN"], "flags": ["NEUTRAL", "IS_HUMAN"],
"vision_range": 4, "vision_range": 4,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d8" }], "attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d8" }],
@ -59,7 +59,7 @@
{ {
"id": "npc_guard", "id": "npc_guard",
"name": "smalltown guard", "name": "smalltown guard",
"renderable": { "glyph": "@", "fg": "#034efc", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "@", "sprite": "@", "fg": "#034efc", "bg": "#000000", "order": 1 },
"flags": ["NEUTRAL", "RANDOM_PATH", "IS_HUMAN"], "flags": ["NEUTRAL", "RANDOM_PATH", "IS_HUMAN"],
"level": 2, "level": 2,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d8" }], "attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d8" }],
@ -69,7 +69,7 @@
{ {
"id": "rat", "id": "rat",
"name": "rat", "name": "rat",
"renderable": { "glyph": "r", "fg": "#aa6000", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "r", "sprite": "r", "fg": "#aa6000", "bg": "#000000", "order": 1 },
"flags": [], "flags": [],
"bac": 6, "bac": 6,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }], "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }],
@ -78,7 +78,7 @@
{ {
"id": "chicken", "id": "chicken",
"name": "chicken", "name": "chicken",
"renderable": { "glyph": "c", "fg": "#BB6000", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "c", "sprite": "c", "fg": "#BB6000", "bg": "#000000", "order": 1 },
"flags": ["HERBIVORE"], "flags": ["HERBIVORE"],
"bac": 8, "bac": 8,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }] "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }]
@ -86,7 +86,7 @@
{ {
"id": "deer_little", "id": "deer_little",
"name": "fawn", "name": "fawn",
"renderable": { "glyph": "q", "fg": "#a57037", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "q", "sprite": "q", "fg": "#a57037", "bg": "#000000", "order": 1 },
"flags": ["HERBIVORE"], "flags": ["HERBIVORE"],
"bac": 8, "bac": 8,
"attacks": [{ "name": "kicks", "hit_bonus": 0, "damage": "1d2" }] "attacks": [{ "name": "kicks", "hit_bonus": 0, "damage": "1d2" }]
@ -94,7 +94,7 @@
{ {
"id": "sheep_little", "id": "sheep_little",
"name": "lamb", "name": "lamb",
"renderable": { "glyph": "q", "fg": "#e7e7e7", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "q", "sprite": "q", "fg": "#e7e7e7", "bg": "#000000", "order": 1 },
"flags": ["HERBIVORE", "SMALL_GROUP"], "flags": ["HERBIVORE", "SMALL_GROUP"],
"bac": 10, "bac": 10,
"attacks": [{ "name": "kicks", "hit_bonus": 0, "damage": "1d2" }] "attacks": [{ "name": "kicks", "hit_bonus": 0, "damage": "1d2" }]
@ -102,7 +102,7 @@
{ {
"id": "chicken_little", "id": "chicken_little",
"name": "chick", "name": "chick",
"renderable": { "glyph": "c", "fg": "#fae478", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "c", "sprite": "c", "fg": "#fae478", "bg": "#000000", "order": 1 },
"flags": ["HERBIVORE"], "flags": ["HERBIVORE"],
"bac": 10, "bac": 10,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }] "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }]
@ -110,7 +110,7 @@
{ {
"id": "horse_little", "id": "horse_little",
"name": "pony", "name": "pony",
"renderable": { "glyph": "u", "fg": "#b36c29", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "u", "sprite": "u", "fg": "#b36c29", "bg": "#000000", "order": 1 },
"flags": ["HERBIVORE", "MULTIATTACK"], "flags": ["HERBIVORE", "MULTIATTACK"],
"level": 3, "level": 3,
"bac": 6, "bac": 6,
@ -124,7 +124,7 @@
{ {
"id": "horse", "id": "horse",
"name": "horse", "name": "horse",
"renderable": { "glyph": "u", "fg": "#744d29", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "u", "sprite": "u", "fg": "#744d29", "bg": "#000000", "order": 1 },
"flags": ["MULTIATTACK"], "flags": ["MULTIATTACK"],
"level": 5, "level": 5,
"bac": 5, "bac": 5,
@ -137,7 +137,7 @@
{ {
"id": "horse_large", "id": "horse_large",
"name": "warhorse", "name": "warhorse",
"renderable": { "glyph": "u", "fg": "#8a3520", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "u", "sprite": "u", "fg": "#8a3520", "bg": "#000000", "order": 1 },
"flags": ["MULTIATTACK"], "flags": ["MULTIATTACK"],
"level": 7, "level": 7,
"bac": 4, "bac": 4,
@ -150,7 +150,7 @@
{ {
"id": "rat_giant", "id": "rat_giant",
"name": "giant rat", "name": "giant rat",
"renderable": { "glyph": "r", "fg": "#bb8000", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "r", "sprite": "r", "fg": "#bb8000", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP"], "flags": ["SMALL_GROUP"],
"level": 1, "level": 1,
"bac": 7, "bac": 7,
@ -160,7 +160,7 @@
{ {
"id": "dog_little", "id": "dog_little",
"name": "little dog", "name": "little dog",
"renderable": { "glyph": "d", "fg": "#FFFFFF", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "d", "sprite": "d", "fg": "#FFFFFF", "bg": "#000000", "order": 1 },
"flags": ["NEUTRAL"], "flags": ["NEUTRAL"],
"level": 2, "level": 2,
"bac": 6, "bac": 6,
@ -171,7 +171,7 @@
{ {
"id": "dog", "id": "dog",
"name": "dog", "name": "dog",
"renderable": { "glyph": "d", "fg": "#EEEEEE", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "d", "sprite": "d", "fg": "#EEEEEE", "bg": "#000000", "order": 1 },
"flags": [], "flags": [],
"level": 4, "level": 4,
"bac": 5, "bac": 5,
@ -181,7 +181,7 @@
{ {
"id": "dog_large", "id": "dog_large",
"name": "large dog", "name": "large dog",
"renderable": { "glyph": "d", "fg": "#DDDDDD", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "d", "sprite": "d", "fg": "#DDDDDD", "bg": "#000000", "order": 1 },
"flags": [], "flags": [],
"level": 6, "level": 6,
"bac": 4, "bac": 4,
@ -191,7 +191,7 @@
{ {
"id": "gnome", "id": "gnome",
"name": "gnome", "name": "gnome",
"renderable": { "glyph": "G", "fg": "#AA5500", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "G", "sprite": "g2", "fg": "#AA5500", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP", "IS_GNOME"], "flags": ["SMALL_GROUP", "IS_GNOME"],
"level": 1, "level": 1,
"speed": 6, "speed": 6,
@ -201,7 +201,7 @@
{ {
"id": "zombie_gnome", "id": "zombie_gnome",
"name": "gnome zombie", "name": "gnome zombie",
"renderable": { "glyph": "z", "fg": "#AA5500", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "z", "sprite": "z", "fg": "#AA5500", "bg": "#000000", "order": 1 },
"flags": ["MINDLESS"], "flags": ["MINDLESS"],
"level": 1, "level": 1,
"speed": 6, "speed": 6,
@ -212,7 +212,7 @@
{ {
"id": "goblin", "id": "goblin",
"name": "goblin", "name": "goblin",
"renderable": { "glyph": "g", "fg": "#00FF00", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "g", "sprite": "g", "fg": "#00FF00", "bg": "#000000", "order": 1 },
"flags": [], "flags": [],
"level": 1, "level": 1,
"speed": 9, "speed": 9,
@ -221,7 +221,7 @@
{ {
"id": "kobold", "id": "kobold",
"name": "kobold", "name": "kobold",
"renderable": { "glyph": "k", "fg": "#AA5500", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "k", "sprite": "k", "fg": "#AA5500", "bg": "#000000", "order": 1 },
"flags": [], "flags": [],
"level": 1, "level": 1,
"speed": 6, "speed": 6,
@ -231,7 +231,7 @@
{ {
"id": "zombie_kobold", "id": "zombie_kobold",
"name": "kobold zombie", "name": "kobold zombie",
"renderable": { "glyph": "z", "fg": "#AA5500", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "z", "sprite": "z", "fg": "#AA5500", "bg": "#000000", "order": 1 },
"flags": ["MINDLESS"], "flags": ["MINDLESS"],
"level": 1, "level": 1,
"speed": 6, "speed": 6,
@ -242,7 +242,7 @@
{ {
"id": "kobold_large", "id": "kobold_large",
"name": "large kobold", "name": "large kobold",
"renderable": { "glyph": "k", "fg": "#70461b", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "k", "sprite": "k", "fg": "#70461b", "bg": "#000000", "order": 1 },
"flags": [], "flags": [],
"level": 1, "level": 1,
"speed": 6, "speed": 6,
@ -253,7 +253,7 @@
{ {
"id": "zombie_orc", "id": "zombie_orc",
"name": "orc zombie", "name": "orc zombie",
"renderable": { "glyph": "z", "fg": "#dbd830", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "z", "sprite": "z", "fg": "#dbd830", "bg": "#000000", "order": 1 },
"flags": ["MINDLESS"], "flags": ["MINDLESS"],
"level": 2, "level": 2,
"bac": 9, "bac": 9,
@ -265,7 +265,7 @@
{ {
"id": "dwarf", "id": "dwarf",
"name": "dwarf", "name": "dwarf",
"renderable": { "glyph": "h", "fg": "#d61b1b", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "h", "sprite": "h", "fg": "#d61b1b", "bg": "#000000", "order": 1 },
"flags": ["IS_DWARF"], "flags": ["IS_DWARF"],
"level": 2, "level": 2,
"bac": 10, "bac": 10,
@ -277,7 +277,7 @@
{ {
"id": "zombie_dwarf", "id": "zombie_dwarf",
"name": "dwarf zombie", "name": "dwarf zombie",
"renderable": { "glyph": "z", "fg": "#d61b1b", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "z", "sprite": "z", "fg": "#d61b1b", "bg": "#000000", "order": 1 },
"flags": ["MINDLESS"], "flags": ["MINDLESS"],
"level": 2, "level": 2,
"bac": 9, "bac": 9,
@ -289,7 +289,7 @@
{ {
"id": "kobold_captain", "id": "kobold_captain",
"name": "kobold captain", "name": "kobold captain",
"renderable": { "glyph": "k", "fg": "#9331ac", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "k", "sprite": "k", "fg": "#9331ac", "bg": "#000000", "order": 1 },
"flags": [], "flags": [],
"level": 2, "level": 2,
"speed": 6, "speed": 6,
@ -300,7 +300,7 @@
{ {
"id": "spider_cave", "id": "spider_cave",
"name": "cave spider", "name": "cave spider",
"renderable": { "glyph": "s", "fg": "#6b6b6b", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "s", "sprite": "s", "fg": "#6b6b6b", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP"], "flags": ["SMALL_GROUP"],
"level": 1, "level": 1,
"bac": 3, "bac": 3,
@ -311,7 +311,7 @@
{ {
"id": "ant_worker", "id": "ant_worker",
"name": "worker ant", "name": "worker ant",
"renderable": { "glyph": "a", "fg": "#ca7631", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "a", "sprite": "a", "fg": "#ca7631", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP"], "flags": ["SMALL_GROUP"],
"level": 2, "level": 2,
"bac": 3, "bac": 3,
@ -322,7 +322,7 @@
{ {
"id": "ant_soldier", "id": "ant_soldier",
"name": "soldier ant", "name": "soldier ant",
"renderable": { "glyph": "a", "fg": "#ca3f26", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "a", "sprite": "a", "fg": "#ca3f26", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP", "POISON_RES"], "flags": ["SMALL_GROUP", "POISON_RES"],
"level": 3, "level": 3,
"bac": 3, "bac": 3,
@ -336,7 +336,7 @@
{ {
"id": "caterpillar_cave", "id": "caterpillar_cave",
"name": "caterpillar", "name": "caterpillar",
"renderable": { "glyph": "a", "fg": "#6b6b6b", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "a", "sprite": "a", "fg": "#6b6b6b", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP"], "flags": ["SMALL_GROUP"],
"level": 1, "level": 1,
"bac": 3, "bac": 3,
@ -347,7 +347,7 @@
{ {
"id": "caterpillar_giant", "id": "caterpillar_giant",
"name": "giant caterpillar", "name": "giant caterpillar",
"renderable": { "glyph": "a", "fg": "#b9aeae", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "a", "sprite": "a", "fg": "#b9aeae", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP"], "flags": ["SMALL_GROUP"],
"level": 2, "level": 2,
"bac": 7, "bac": 7,
@ -358,7 +358,7 @@
{ {
"id": "jackal", "id": "jackal",
"name": "jackal", "name": "jackal",
"renderable": { "glyph": "d", "fg": "#AA5500", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "d", "sprite": "d", "fg": "#AA5500", "bg": "#000000", "order": 1 },
"flags": ["CARNIVORE", "SMALL_GROUP"], "flags": ["CARNIVORE", "SMALL_GROUP"],
"bac": 7, "bac": 7,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }] "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }]
@ -366,7 +366,7 @@
{ {
"id": "fox", "id": "fox",
"name": "fox", "name": "fox",
"renderable": { "glyph": "d", "fg": "#FF0000", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "d", "sprite": "d", "fg": "#FF0000", "bg": "#000000", "order": 1 },
"flags": ["CARNIVORE"], "flags": ["CARNIVORE"],
"bac": 7, "bac": 7,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }] "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }]
@ -374,7 +374,7 @@
{ {
"id": "coyote", "id": "coyote",
"name": "coyote", "name": "coyote",
"renderable": { "glyph": "d", "fg": "#6E3215", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "d", "sprite": "d", "fg": "#6E3215", "bg": "#000000", "order": 1 },
"flags": ["CARNIVORE", "SMALL_GROUP"], "flags": ["CARNIVORE", "SMALL_GROUP"],
"level": 1, "level": 1,
"bac": 7, "bac": 7,
@ -383,7 +383,7 @@
{ {
"id": "wolf", "id": "wolf",
"name": "wolf", "name": "wolf",
"renderable": { "glyph": "d", "fg": "#5E4225", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "d", "sprite": "d", "fg": "#5E4225", "bg": "#000000", "order": 1 },
"flags": ["CARNIVORE"], "flags": ["CARNIVORE"],
"level": 5, "level": 5,
"bac": 4, "bac": 4,
@ -392,7 +392,7 @@
{ {
"id": "goblin_chieftain", "id": "goblin_chieftain",
"name": "goblin chieftain", "name": "goblin chieftain",
"renderable": { "glyph": "g", "fg": "#9331ac", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "g", "sprite": "g", "fg": "#9331ac", "bg": "#000000", "order": 1 },
"flags": [], "flags": [],
"level": 2, "level": 2,
"speed": 9, "speed": 9,
@ -402,7 +402,7 @@
{ {
"id": "orc", "id": "orc",
"name": "orc", "name": "orc",
"renderable": { "glyph": "o", "fg": "#00FF00", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "o", "sprite": "o", "fg": "#00FF00", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP"], "flags": ["SMALL_GROUP"],
"level": 1, "level": 1,
"speed": 9, "speed": 9,
@ -412,7 +412,7 @@
{ {
"id": "orc_hill", "id": "orc_hill",
"name": "hill orc", "name": "hill orc",
"renderable": { "glyph": "o", "fg": "#dbd830", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "o", "sprite": "o", "fg": "#dbd830", "bg": "#000000", "order": 1 },
"flags": ["LARGE_GROUP"], "flags": ["LARGE_GROUP"],
"level": 2, "level": 2,
"speed": 9, "speed": 9,
@ -422,7 +422,7 @@
{ {
"id": "orc_captain", "id": "orc_captain",
"name": "orc captain", "name": "orc captain",
"renderable": { "glyph": "o", "fg": "#9331ac", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "o", "sprite": "o", "fg": "#9331ac", "bg": "#000000", "order": 1 },
"flags": ["MULTIATTACK"], "flags": ["MULTIATTACK"],
"level": 5, "level": 5,
"speed": 5, "speed": 5,
@ -435,7 +435,7 @@
{ {
"id": "warg", "id": "warg",
"name": "warg", "name": "warg",
"renderable": { "glyph": "d", "fg": "#8b7164", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "d", "sprite": "d", "fg": "#8b7164", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP"], "flags": ["SMALL_GROUP"],
"level": 7, "level": 7,
"bac": 4, "bac": 4,
@ -446,7 +446,7 @@
{ {
"id": "jaguar", "id": "jaguar",
"name": "jaguar", "name": "jaguar",
"renderable": { "glyph": "f", "fg": "#d3b947", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "f", "sprite": "f", "fg": "#d3b947", "bg": "#000000", "order": 1 },
"flags": ["MULTIATTACK"], "flags": ["MULTIATTACK"],
"level": 4, "level": 4,
"bac": 6, "bac": 6,
@ -461,7 +461,7 @@
{ {
"id": "lynx", "id": "lynx",
"name": "lynx", "name": "lynx",
"renderable": { "glyph": "f", "fg": "#b5d347", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "f", "sprite": "f", "fg": "#b5d347", "bg": "#000000", "order": 1 },
"flags": ["MULTIATTACK"], "flags": ["MULTIATTACK"],
"level": 5, "level": 5,
"bac": 6, "bac": 6,
@ -476,7 +476,7 @@
{ {
"id": "panther", "id": "panther",
"name": "panther", "name": "panther",
"renderable": { "glyph": "f", "fg": "#58554e", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "f", "sprite": "f", "fg": "#58554e", "bg": "#000000", "order": 1 },
"flags": ["MULTIATTACK"], "flags": ["MULTIATTACK"],
"level": 5, "level": 5,
"bac": 6, "bac": 6,
@ -491,7 +491,7 @@
{ {
"id": "ogre", "id": "ogre",
"name": "ogre", "name": "ogre",
"renderable": { "glyph": "O", "fg": "#10A70d", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "O", "sprite": "o2", "fg": "#10A70d", "bg": "#000000", "order": 1 },
"flags": ["SMALL_GROUP"], "flags": ["SMALL_GROUP"],
"level": 5, "level": 5,
"bac": 5, "bac": 5,
@ -502,7 +502,7 @@
{ {
"id": "treant_small", "id": "treant_small",
"name": "treant sapling", "name": "treant sapling",
"renderable": { "glyph": "♠️", "fg": "#10570d", "bg": "#000000", "order": 1 }, "renderable": { "glyph": "♠️", "sprite": "spade", "fg": "#10570d", "bg": "#000000", "order": 1 },
"flags": ["LARGE_GROUP", "GREEN_BLOOD", "FIRE_WEAK"], "flags": ["LARGE_GROUP", "GREEN_BLOOD", "FIRE_WEAK"],
"level": 2, "level": 2,
"bac": 12, "bac": 12,

View file

@ -2,13 +2,13 @@
{ {
"id": "door", "id": "door",
"name": "door", "name": "door",
"renderable": { "glyph": "+", "sprite": 17, "fg": "#00FFFF", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "+", "sprite": "door_wood_h_closed", "colour_sprite": false, "fg": "#00FFFF", "bg": "#000000", "order": 2 },
"flags": ["DOOR"] "flags": ["DOOR"]
}, },
{ {
"id": "prop_altar", "id": "prop_altar",
"name": "altar", "name": "altar",
"renderable": { "glyph": "_", "fg": "#FFFFFF", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "_", "sprite": "tombstone", "colour_sprite": false, "fg": "#FFFFFF", "bg": "#000000", "order": 2 },
"flags": ["ENTRY_TRIGGER"], "flags": ["ENTRY_TRIGGER"],
"effects": { "heal": "8d8" } "effects": { "heal": "8d8" }
}, },
@ -21,64 +21,64 @@
{ {
"id": "prop_table", "id": "prop_table",
"name": "table", "name": "table",
"renderable": { "glyph": "-", "sprite": 52, "fg": "#AAAAAA", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "-", "sprite": "table", "colour_sprite": false, "fg": "#AAAAAA", "bg": "#000000", "order": 2 },
"flags": [] "flags": []
}, },
{ {
"id": "prop_hay", "id": "prop_hay",
"name": "hay", "name": "hay",
"renderable": { "glyph": "%", "fg": "#c7ad39", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "%", "sprite": "%", "fg": "#c7ad39", "bg": "#000000", "order": 2 },
"flags": [] "flags": []
}, },
{ {
"id": "prop_statue", "id": "prop_statue",
"name": "statue", "name": "statue",
"renderable": { "glyph": "@", "sprite": 29, "fg": "#ffffff", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "@", "sprite": "statue_warrior", "colour_sprite": false, "fg": "#ffffff", "bg": "#000000", "order": 2 },
"flags": [] "flags": []
}, },
{ {
"id": "prop_bed", "id": "prop_bed",
"name": "bed", "name": "bed",
"renderable": { "glyph": "=", "sprite": 50, "fg": "#AAAAAA", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "=", "sprite": "bed", "colour_sprite": false, "fg": "#AAAAAA", "bg": "#000000", "order": 2 },
"flags": [] "flags": []
}, },
{ {
"id": "prop_chair", "id": "prop_chair",
"name": "chair", "name": "chair",
"renderable": { "glyph": "└", "sprite": 51, "fg": "#AAAAAA", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "└", "sprite": "chair", "colour_sprite": false, "fg": "#AAAAAA", "bg": "#000000", "order": 2 },
"flags": [] "flags": []
}, },
{ {
"id": "prop_candle", "id": "prop_candle",
"name": "candle", "name": "candle",
"renderable": { "glyph": "Ä", "sprite": 3, "fg": "#FFA500", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "Ä", "sprite": "candles_a1", "colour_sprite": false, "fg": "#FFA500", "bg": "#000000", "order": 2 },
"flags": [] "flags": []
}, },
{ {
"id": "trap_bear", "id": "trap_bear",
"name": "bear trap", "name": "bear trap",
"renderable": { "glyph": "^", "fg": "#e6e6e6", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "^", "sprite": "trap", "colour_sprite": false, "fg": "#e6e6e6", "bg": "#000000", "order": 2 },
"flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
"effects": { "damage": "2d4" } "effects": { "damage": "2d4" }
}, },
{ {
"id": "trap_mini_mine", "id": "trap_mini_mine",
"name": "mini-mine", "name": "mini-mine",
"renderable": { "glyph": "^", "fg": "#ff1e00", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "^", "sprite": "^", "fg": "#ff1e00", "bg": "#000000", "order": 2 },
"flags": ["ENTRY_TRIGGER", "SINGLE_ACTIVATION"], "flags": ["ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
"effects": { "damage": "2d4", "aoe": "3" } "effects": { "damage": "2d4", "aoe": "3" }
}, },
{ {
"id": "trap_stonefall", "id": "trap_stonefall",
"name": "stonefall trap", "name": "stonefall trap",
"renderable": { "glyph": "^", "fg": "#beb5a7", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "^", "sprite": "^", "fg": "#beb5a7", "bg": "#000000", "order": 2 },
"flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
"effects": { "damage": "2d10" } "effects": { "damage": "2d10" }
}, },
{ {
"id": "trap_confusion", "id": "trap_confusion",
"name": "magic trap", "name": "magic trap",
"renderable": { "glyph": "^", "fg": "#df07df", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "^", "sprite": "magic_e1", "colour_sprite": false, "fg": "#df07df", "bg": "#000000", "order": 2 },
"flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
"effects": { "confusion": "3" } "effects": { "confusion": "3" }
} }

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before After
Before After

View file

@ -168,7 +168,7 @@ pub fn render_camera(ecs: &World, ctx: &mut BTerm) {
} }
} }
if draw { if draw {
if let Some(sprite) = render.sprite { /* if let Some(sprite) = render.sprite {
ctx.set_active_console(0); ctx.set_active_console(0);
ctx.add_sprite( ctx.add_sprite(
Rect::with_size( Rect::with_size(
@ -182,7 +182,7 @@ pub fn render_camera(ecs: &World, ctx: &mut BTerm) {
sprite sprite
); );
ctx.set_active_console(ENTITY_LAYER); ctx.set_active_console(ENTITY_LAYER);
} else { } else */ {
ctx.set( ctx.set(
entity_offset_x + bounds.x_offset, entity_offset_x + bounds.x_offset,
entity_offset_y + bounds.y_offset, entity_offset_y + bounds.y_offset,

View file

@ -41,7 +41,8 @@ pub struct OtherLevelPosition {
#[derive(Component, ConvertSaveload, Clone)] #[derive(Component, ConvertSaveload, Clone)]
pub struct Renderable { pub struct Renderable {
pub glyph: FontCharType, pub glyph: FontCharType,
pub sprite: Option<usize>, pub sprite: Option<String>,
pub colour_sprite: bool,
pub fg: RGB, pub fg: RGB,
pub bg: RGB, pub bg: RGB,
pub render_order: i32, pub render_order: i32,

View file

@ -18,12 +18,12 @@ pub fn render(draw: bool, gfx: &mut Graphics, font: &notan::draw::Font) {
} }
} }
/// Render with specific params. /// Render with specificied params.
pub fn render_log(gfx: &mut Graphics, font: &notan::draw::Font, pos: &(f32, f32), width: f32) { pub fn render_log(gfx: &mut Graphics, font: &notan::draw::Font, pos: &(f32, f32), width: f32) {
let mut text = gfx.create_text(); let mut text = gfx.create_text();
let log = LOG.lock().unwrap(); let log = LOG.lock().unwrap();
let latest: Vec<_> = log.iter().rev().take(5).collect(); let latest: Vec<_> = log.iter().rev().take(5).collect();
let mut init = false; let mut initialised = false;
let mut y = pos.1; let mut y = pos.1;
for (_, entries) in latest { for (_, entries) in latest {
let mut written_on_line = false; let mut written_on_line = false;
@ -37,14 +37,14 @@ pub fn render_log(gfx: &mut Graphics, font: &notan::draw::Font, pos: &(f32, f32)
.color(Color::from_rgb(frag.colour.r, frag.colour.g, frag.colour.b)) .color(Color::from_rgb(frag.colour.r, frag.colour.g, frag.colour.b))
.v_align_bottom(); .v_align_bottom();
written_on_line = true; written_on_line = true;
init = true; initialised = true;
} else { } else {
text.chain(&frag.text) text.chain(&frag.text)
.color(Color::from_rgb(frag.colour.r, frag.colour.g, frag.colour.b)) .color(Color::from_rgb(frag.colour.r, frag.colour.g, frag.colour.b))
.size(FONTSIZE); .size(FONTSIZE);
} }
} }
if init { if initialised {
y = text.last_bounds().min_y(); y = text.last_bounds().min_y();
} }
} }

View file

@ -275,6 +275,7 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) {
.insert(*player, Renderable { .insert(*player, Renderable {
glyph: to_cp437(DWARF_GLYPH), glyph: to_cp437(DWARF_GLYPH),
sprite: None, // TODO: Dwarf sprite sprite: None, // TODO: Dwarf sprite
colour_sprite: true,
fg: RGB::named(DWARF_COLOUR), fg: RGB::named(DWARF_COLOUR),
bg: RGB::named(BLACK), bg: RGB::named(BLACK),
render_order: 0, render_order: 0,
@ -287,6 +288,7 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) {
.insert(*player, Renderable { .insert(*player, Renderable {
glyph: to_cp437(ELF_GLYPH), glyph: to_cp437(ELF_GLYPH),
sprite: None, // TODO: Elf sprite sprite: None, // TODO: Elf sprite
colour_sprite: true,
fg: RGB::named(ELF_COLOUR), fg: RGB::named(ELF_COLOUR),
bg: RGB::named(BLACK), bg: RGB::named(BLACK),
render_order: 0, render_order: 0,
@ -313,6 +315,7 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) {
.insert(*player, Renderable { .insert(*player, Renderable {
glyph: to_cp437(CATFOLK_GLYPH), glyph: to_cp437(CATFOLK_GLYPH),
sprite: None, // TODO: Catfolk sprite sprite: None, // TODO: Catfolk sprite
colour_sprite: true,
fg: RGB::named(CATFOLK_COLOUR), fg: RGB::named(CATFOLK_COLOUR),
bg: RGB::named(BLACK), bg: RGB::named(BLACK),
render_order: 0, render_order: 0,

View file

@ -253,6 +253,27 @@ fn draw_camera(
} }
// TODO: Use sprites here, not text drawing. Put bitmap font into atlas. // TODO: Use sprites here, not text drawing. Put bitmap font into atlas.
let renderable = renderables.get(entry.1.e).unwrap(); let renderable = renderables.get(entry.1.e).unwrap();
if let Some(sprite_id) = &renderable.sprite {
let sprite = if let Some(sprite) = atlas.get(sprite_id) {
sprite
} else {
panic!("No entity sprite found for ID: {}", sprite_id);
};
draw.image(sprite)
.position((entry.0.x as f32) * TILESIZE, (entry.0.y as f32) * TILESIZE)
.color(
if renderable.colour_sprite {
Color::from_rgb(
renderable.fg.r,
renderable.fg.g,
renderable.fg.b
)
} else {
Color::WHITE
}
);
} else {
// Fallback to drawing text.
draw.text( draw.text(
&font, &font,
&format!("{}", bracket_lib::terminal::to_char(renderable.glyph as u8)) &format!("{}", bracket_lib::terminal::to_char(renderable.glyph as u8))
@ -261,14 +282,38 @@ fn draw_camera(
((entry.0.x as f32) + 0.5) * TILESIZE, ((entry.0.x as f32) + 0.5) * TILESIZE,
((entry.0.y as f32) + 0.5) * TILESIZE ((entry.0.y as f32) + 0.5) * TILESIZE
) )
.color(Color::from_rgb(renderable.fg.r, renderable.fg.g, renderable.fg.b)) .color(
Color::from_rgb(renderable.fg.r, renderable.fg.g, renderable.fg.b)
)
.size(FONTSIZE) .size(FONTSIZE)
.h_align_center() .h_align_center()
.v_align_middle(); .v_align_middle();
// Draw entity }
} }
DrawType::VisibleAndRemember => { DrawType::VisibleAndRemember => {
// TODO: PUT THIS INTO A FUNCTION!
let renderable = renderables.get(entry.1.e).unwrap(); let renderable = renderables.get(entry.1.e).unwrap();
if let Some(sprite_id) = &renderable.sprite {
let sprite = if let Some(sprite) = atlas.get(sprite_id) {
sprite
} else {
panic!("No entity sprite found for ID: {}", sprite_id);
};
draw.image(sprite)
.position((entry.0.x as f32) * TILESIZE, (entry.0.y as f32) * TILESIZE)
.color(
if renderable.colour_sprite {
Color::from_rgb(
renderable.fg.r,
renderable.fg.g,
renderable.fg.b
)
} else {
Color::WHITE
}
);
} else {
// Fallback to drawing text.
draw.text( draw.text(
&font, &font,
&format!("{}", bracket_lib::terminal::to_char(renderable.glyph as u8)) &format!("{}", bracket_lib::terminal::to_char(renderable.glyph as u8))
@ -277,10 +322,13 @@ fn draw_camera(
((entry.0.x as f32) + 0.5) * TILESIZE, ((entry.0.x as f32) + 0.5) * TILESIZE,
((entry.0.y as f32) + 0.5) * TILESIZE ((entry.0.y as f32) + 0.5) * TILESIZE
) )
.color(Color::from_rgb(renderable.fg.r, renderable.fg.g, renderable.fg.b)) .color(
Color::from_rgb(renderable.fg.r, renderable.fg.g, renderable.fg.b)
)
.size(FONTSIZE) .size(FONTSIZE)
.h_align_center() .h_align_center()
.v_align_middle(); .v_align_middle();
}
// TODO: Update map memory. // TODO: Update map memory.
} }
_ => {} _ => {}
@ -318,7 +366,12 @@ fn render_map_in_view(
&*map, &*map,
Some(*ecs.fetch::<Point>()) Some(*ecs.fetch::<Point>())
); );
draw.image(atlas.get(id).unwrap()) let sprite = if let Some(sprite) = atlas.get(id) {
sprite
} else {
panic!("No sprite found for ID: {}", id);
};
draw.image(sprite)
.position( .position(
((x + bounds.x_offset) as f32) * TILESIZE, ((x + bounds.x_offset) as f32) * TILESIZE,
((y + bounds.y_offset) as f32) * TILESIZE ((y + bounds.y_offset) as f32) * TILESIZE

View file

@ -7,14 +7,11 @@ use std::ops::{ Add, Mul };
use notan::prelude::*; use notan::prelude::*;
pub fn get_sprite_for_id(idx: usize, map: &Map, other_pos: Option<Point>) -> (&str, Color) { pub fn get_sprite_for_id(idx: usize, map: &Map, other_pos: Option<Point>) -> (&str, Color) {
let x = (idx as i32) % map.width; let f = map.colour_offset[idx].0.0; // Using offset as a source of random.
let y = (idx as i32) / map.width; let sprite = match map.tiles[idx] {
let sprite = map.tiles[idx].sprite(); TileType::Wall => map.tiles[idx].sprite(check_if_base(idx, map), f),
/*let base = match tile { _ => map.tiles[idx].sprite(false, f),
TileType::Wall => wall_sprite(tile.sprite(), map, x, y),
_ => tile.sprite(),
}; };
let sprite_id = pick_variant(base, tile.variants(), idx, map);*/
let tint = if !map.visible_tiles[idx] { let tint = if !map.visible_tiles[idx] {
Color::from_rgb(0.75, 0.75, 0.75) Color::from_rgb(0.75, 0.75, 0.75)
} else { } else {
@ -159,18 +156,13 @@ fn is_revealed_and_wall(map: &Map, x: i32, y: i32, debug: Option<bool>) -> bool
(if debug.is_none() { map.revealed_tiles[idx] } else { true }) (if debug.is_none() { map.revealed_tiles[idx] } else { true })
} }
fn wall_sprite(id: usize, map: &Map, x: i32, y: i32) -> usize { fn check_if_base(idx: usize, map: &Map) -> bool {
if y > map.height - (2 as i32) { let x = (idx as i32) % map.width;
return id; let y = (idx as i32) / map.width;
}
if is_revealed_and_wall(map, x, y + 1, None) { if is_revealed_and_wall(map, x, y + 1, None) {
return id + 6; return false;
} }
return id; return true;
}
fn pick_variant(base: usize, variants: usize, idx: usize, map: &Map) -> usize {
return base + ((map.colour_offset[idx].0.0 * (variants as f32)) as usize);
} }
fn wall_glyph(map: &Map, x: i32, y: i32, debug: Option<bool>) -> FontCharType { fn wall_glyph(map: &Map, x: i32, y: i32, debug: Option<bool>) -> FontCharType {

View file

@ -1,5 +1,5 @@
use serde::{ Deserialize, Serialize }; use serde::{ Deserialize, Serialize };
use crate::consts::sprites::*; use bracket_lib::random::RandomNumberGenerator;
#[derive(PartialEq, Eq, Hash, Copy, Clone, Serialize, Deserialize, Debug)] #[derive(PartialEq, Eq, Hash, Copy, Clone, Serialize, Deserialize, Debug)]
pub enum TileType { pub enum TileType {
@ -30,52 +30,84 @@ pub enum TileType {
} }
impl TileType { impl TileType {
pub fn sprite(&self) -> &str { pub fn sprite(&self, base: bool, float: f32) -> &str {
match self { if base {
TileType::ImpassableMountain => "statue_warrior", return self.h(float);
TileType::Wall => "wall_cave_h_a",
TileType::DeepWater => "water",
TileType::Fence => "wall_cave_h_a",
TileType::Bars => "wall_cave_h_a",
TileType::Floor => "floor_cobble_a",
TileType::WoodFloor => "floor_wood_a",
TileType::Gravel => "floor_cobble_b",
TileType::Road => "floor_cobble_c",
TileType::Grass => "floor_grass_a",
TileType::Foliage => "floor_grass_b",
TileType::HeavyFoliage => "floor_grass_c",
TileType::Sand => "floor_cobble_c",
TileType::ShallowWater => "water",
TileType::Bridge => "floor_cobble_a",
TileType::DownStair => "wall_cave_stair_down",
TileType::UpStair => "wall_cave_stair_up",
TileType::ToLocal(_) => "wall_crypt_stair_down",
TileType::ToOvermap(_) => "wall_crypt_stair_up",
} }
return self.v(float);
} }
fn h(&self, float: f32) -> &str {
pub fn variants(&self) -> usize { let options = match self {
match self { TileType::Wall =>
TileType::ImpassableMountain => 1, vec![
TileType::Wall => 4, "wall_cave_h_a",
TileType::DeepWater => 2, "wall_cave_h_b",
TileType::Fence => 1, "wall_cave_h_c",
TileType::Bars => 1, "wall_cave_h_d",
TileType::Floor => 6, "wall_cave_h_crack"
TileType::WoodFloor => 3, ],
TileType::Gravel => 1, _ => unreachable!("Tried to get a h (base) sprite for a non-wall tile."),
TileType::Road => 4, };
TileType::Grass => 6, return options[(float * (options.len() as f32)) as usize];
TileType::Foliage => 1,
TileType::HeavyFoliage => 1,
TileType::Sand => 1,
TileType::ShallowWater => 2,
TileType::Bridge => 1,
TileType::DownStair => 1,
TileType::UpStair => 1,
TileType::ToLocal(_) => 1,
TileType::ToOvermap(_) => 1,
} }
fn v(&self, float: f32) -> &str {
let options = match self {
TileType::ImpassableMountain => vec!["statue_warrior"],
TileType::Wall =>
vec![
"wall_cave_v_a",
"wall_cave_v_b",
"wall_cave_v_c",
"wall_cave_v_d",
"wall_cave_v_crack"
],
TileType::DeepWater => vec!["water", "water_a1", "water_a2"],
TileType::Fence => vec!["wall_cave_h_a"],
TileType::Bars => vec!["wall_cave_h_a"],
TileType::Floor =>
vec![
"floor_cobble_a",
"floor_cobble_b",
"floor_cobble_c",
"floor_cobble_d",
"floor_cobble_e",
"floor_cobble_f"
],
TileType::WoodFloor =>
vec!["floor_wood_a", "floor_wood_b", "floor_wood_c", "floor_wood_d"],
TileType::Gravel => vec!["floor_cobble_b"],
TileType::Road =>
vec![
"floor_tile_a",
"floor_tile_b",
"floor_tile_c",
"floor_tile_d",
"floor_mossy_a",
"floor_mossy_b",
"floor_mossy_c",
"floor_mossy_d",
"floor_mossy_e"
],
TileType::Grass =>
vec![
"floor_grass_a",
"floor_grass_b",
"floor_grass_c",
"floor_grass_d",
"floor_grass_e",
"floor_grass_f"
],
TileType::Foliage => vec!["floor_grass_b"],
TileType::HeavyFoliage => vec!["floor_grass_c"],
TileType::Sand => vec!["floor_cobble_c"],
TileType::ShallowWater => vec!["water"],
TileType::Bridge => vec!["floor_cobble_a"],
TileType::DownStair => vec!["wall_cave_stair_down"],
TileType::UpStair => vec!["wall_cave_stair_up"],
TileType::ToLocal(_) => vec!["wall_crypt_stair_down"],
TileType::ToOvermap(_) => vec!["wall_crypt_stair_up"],
};
return options[(float * (options.len() as f32)) as usize];
} }
} }

View file

@ -83,6 +83,7 @@ fn create_delayed_particles(ecs: &mut World, ctx: &App) {
renderables renderables
.insert(p, Renderable { .insert(p, Renderable {
sprite: None, // TODO: Particle sprite sprite: None, // TODO: Particle sprite
colour_sprite: false,
fg: handled.fg, fg: handled.fg,
bg: handled.bg, bg: handled.bg,
glyph: handled.glyph, glyph: handled.glyph,
@ -309,6 +310,7 @@ impl<'a> System<'a> for ParticleSpawnSystem {
renderables renderables
.insert(p, Renderable { .insert(p, Renderable {
sprite: None, // TODO: Particle sprite sprite: None, // TODO: Particle sprite
colour_sprite: false,
fg: new_particle.fg, fg: new_particle.fg,
bg: new_particle.bg, bg: new_particle.bg,
glyph: new_particle.glyph, glyph: new_particle.glyph,

View file

@ -136,7 +136,7 @@ pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState {
let mut renderables = ecs.write_storage::<Renderable>(); let mut renderables = ecs.write_storage::<Renderable>();
let render_data = renderables.get_mut(potential_target).unwrap(); let render_data = renderables.get_mut(potential_target).unwrap();
render_data.glyph = to_cp437('+'); // Nethack open door, maybe just use '/' instead. render_data.glyph = to_cp437('+'); // Nethack open door, maybe just use '/' instead.
render_data.sprite = Some(17); // TODO: Enum render_data.sprite = Some("door_wood_h_closed".to_string()); // TODO: Enum
door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y)); door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y));
} }
result = RunState::Ticking; result = RunState::Ticking;
@ -234,7 +234,7 @@ pub fn open(i: i32, j: i32, ecs: &mut World) -> RunState {
let mut renderables = ecs.write_storage::<Renderable>(); let mut renderables = ecs.write_storage::<Renderable>();
let render_data = renderables.get_mut(potential_target).unwrap(); let render_data = renderables.get_mut(potential_target).unwrap();
render_data.glyph = to_cp437('▓'); // Nethack open door, maybe just use '/' instead. render_data.glyph = to_cp437('▓'); // Nethack open door, maybe just use '/' instead.
render_data.sprite = Some(18); // TODO: Enum render_data.sprite = Some("door_wood_h_open".to_string()); // TODO: Enum
door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y)); door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y));
} }
result = RunState::Ticking; result = RunState::Ticking;

View file

@ -30,7 +30,8 @@ pub struct Equippable {
#[derive(Deserialize, Debug)] #[derive(Deserialize, Debug)]
pub struct Renderable { pub struct Renderable {
pub glyph: String, pub glyph: String,
pub sprite: Option<usize>, pub sprite: Option<String>,
pub colour_sprite: Option<bool>,
pub fg: String, pub fg: String,
pub bg: String, pub bg: String,
pub order: i32, pub order: i32,

View file

@ -691,10 +691,11 @@ fn get_renderable_component(
) -> crate::components::Renderable { ) -> crate::components::Renderable {
crate::components::Renderable { crate::components::Renderable {
glyph: to_cp437(renderable.glyph.chars().next().unwrap()), glyph: to_cp437(renderable.glyph.chars().next().unwrap()),
sprite: if let Some(sprite) = &renderable.sprite { sprite: renderable.sprite.clone(),
Some(sprite.clone()) colour_sprite: if renderable.colour_sprite.is_some() {
renderable.colour_sprite.clone().unwrap()
} else { } else {
None true
}, },
fg: RGB::from_hex(&renderable.fg).expect("Invalid RGB"), fg: RGB::from_hex(&renderable.fg).expect("Invalid RGB"),
bg: RGB::from_hex(&renderable.bg).expect("Invalid RGB"), bg: RGB::from_hex(&renderable.bg).expect("Invalid RGB"),

View file

@ -57,7 +57,8 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity {
.with(BlocksTile {}) .with(BlocksTile {})
.with(Renderable { .with(Renderable {
glyph: to_cp437('@'), glyph: to_cp437('@'),
sprite: None, // TODO: Player sprite sprite: Some("@".to_string()), // TODO: Player sprite
colour_sprite: true,
fg: RGB::named(YELLOW), fg: RGB::named(YELLOW),
bg: RGB::named(BLACK), bg: RGB::named(BLACK),
render_order: 0, render_order: 0,

View file

@ -362,7 +362,10 @@ impl State {
) )
); );
self.mapgen_timer += ctx.timer.delta_f32(); self.mapgen_timer += ctx.timer.delta_f32();
if self.mapgen_timer > 10.0 / (self.mapgen_history.len() as f32) { if
self.mapgen_timer > 10.0 / (self.mapgen_history.len() as f32) ||
self.mapgen_timer > 1.0
{
self.mapgen_timer = 0.0; self.mapgen_timer = 0.0;
self.mapgen_index += 1; self.mapgen_index += 1;
if self.mapgen_index >= self.mapgen_history.len() { if self.mapgen_index >= self.mapgen_history.len() {