View Single Post
Old December 9, 2016, 00:47   #1
Join Date: May 2016
Posts: 261
t4nk is on a distinguished road
Angband color rooms

Too much C for main forum! I think it belongs here.

Originally Posted by droof View Post
I tried changing the room templates from level 5 to 1 in dungeon_profile.txt, but that change also doesn't trigger the function. So to test this, I need to dive to level 5 and use words of recall?
Yes, they start on level 5 (this is actually in dungeon_profile.txt, see "room:room template:" lines).
Of course, you shoudn't use words of recall Press Ctrl-A, that enables debug commands. Some useful commands: 'A' - get max experience (so your @ becomes level 50); 'j' - jump to some level, 'w' - reveal whole level (like with scroll of magic map).

From what little I understand from the code, each terrain type has a terrain index from terrain.txt and a color index from z-color. Terrain bits from build_room_template() are set through square_set_feat(). This sets the appropriate terrain feature to a chunk / cave x y coordinate.
Right (except it's y, x coordinate instead of x, y! good source of bugs ) So you'll need to implement square_set_color(), which should be similar to square_set_feat(), but for colors.

And this information somehow ends up in grid_data_as_text() where the color of the feature type is displayed.
When the core wants to update something on the map, it calls square_light_spot(); that tells the ui that a grid shoud be redrawn. The ui then calls map_info(), that fills struct grid_data with all information that a player is allowed to know. grid_data_as_text() then translates grid_data to text (or to tiles).

To color room templates, maybe I can pass along the color_map color with the feature index in build_room_template() and store both at the cave square coordinate. Is this what you meant with the additional attribute for cave.h:132, t4nk?
So struct square (in cave.h) looks like this:
struct square {
	byte feat;
	bitflag *info;
	byte noise;
	byte scent;
	s16b mon;
	struct object *obj;
	struct trap *trap;
I suggest to add another field to it:
struct square {
    byte feat;
    byte color;
   /* and all other stuff... */
And initialize color field much like how feat is initialized (functions in cave-square.c). Roughly:
void square_set_color(struct chunk *c, int y, int x, byte color)
    assert(square_in_bounds(c, y, x));
    c->squares[y][x].color = color;
Then just call square_set_color() when appropriate in room builder.

But grid_data_as_text() doesn't have current square coordinates or the cave object to look up and overrule the feature color for display.
See ui-map.c:
    /* Determine what is there */
    map_info(y, x, &g);
    grid_data_as_text(&g, &a, &c, &ta, &tc);
    Term_queue_char(t, vx, vy, a, c, ta, tc);
The Term stuff then passes characters and their colors to a frontend, e.g., to ncurses client.
t4nk is offline   Reply With Quote