1 #include "main.h"
2 #include "map.h"
3 #include "gfx.h"
4 
5 BITMAP *tiles[TILE_NUM];
6 BITMAP *anims[CHAR_NUM];
7 
8 BITMAP *title = NULL;
9 BITMAP *tileset_bmp = NULL;
10 BITMAP *charset_bmp = NULL;
11 
12 int layout = 0;
13 int tileset = 0;
14 int charset = 0;
15 int scheme = 0;
16 int doublesize = 0;
17 
18 
19 char scheme_name[100];
20 char tileset_name[100];
21 char charset_name[100];
22 char layout_name[100];
23 
24 int sprite_w, sprite_h;
25 
26 static BITMAP *
load_8bit(char const * name)27 load_8bit (char const *name)
28 {
29 	PALETTE pal;
30 	BITMAP *bmp = load_bitmap (name, pal);
31 	if (!bmp)
32 		return NULL;
33 	if (bitmap_color_depth (screen) == 8)
34 	{
35 		BITMAP *tmp = create_bitmap_ex (32, bmp->w, bmp->h);
36 		select_palette (pal);
37 		blit (bmp, tmp, 0, 0, 0, 0, bmp->w, bmp->h);
38 		unselect_palette ();
39 		generate_332_palette (pal);
40 		select_palette (pal);
41 		blit (tmp, bmp, 0, 0, 0, 0, bmp->w, bmp->h);
42 		unselect_palette ();
43 		destroy_bitmap (tmp);
44 	}
45 	return bmp;
46 }
47 
48 static int colors[COLOR_COUNT];
49 
50 int
layout_color(int n)51 layout_color (int n)
52 {
53 	return colors[n];
54 }
55 
56 static void
read_layout_colors(char const * name)57 read_layout_colors (char const *name)
58 {
59 	char const *color_names[] =
60 	{
61 		"color_title",
62 		"color_menu",
63 		"color_selected",
64 		"color_message",
65 		"color_help",
66 		"color_gold",
67 		"color_healthy",
68 		"color_health",
69 		"color_hurt",
70 		"color_stats",
71 		"color_info",
72 		"color_dungeon",
73 		"color_empty",
74 		"color_beacons",
75 		"color_beacon",
76 		"color_sacks",
77 		"color_potions",
78 		"color_nopotions",
79 		"color_nospell",
80 		"color_spell",
81 		"color_cast",
82 		"color_time",
83 		"color_blink",
84 		"color_highlight"
85 	};
86 	int i;
87 	for (i = 0; i < COLOR_COUNT; i++)
88 	{
89 		char const *rgb = get_config_string (name, color_names[i], "#ffffff");
90 		int v = strtol (rgb + 1, NULL, 16);
91 		colors[i] = makecol (v >> 16, (v >> 8) & 255, v & 255);
92 	}
93 };
94 
95 int
graphics_init(void)96 graphics_init (void)
97 {
98 	int i;
99 	char const *name;
100 	char section[256];
101 
102 	if (!exists ("data/sof.cfg"))
103 	{
104 		printf ("Cannot find data/sof.cfg.\n");
105 		return 1;
106 	}
107 	set_config_file ("data/sof.cfg");
108 
109 	sprintf (section, "scheme%i", tileset);
110 	strcpy (scheme_name, get_config_string (section, "name", "default"));
111 
112 	name = get_config_string (section, "tileset", "gfx/tiles.bmp");
113 
114 	strcpy (tileset_name, get_config_string (section, "name", "default"));
115 	if (tileset_bmp)
116 		destroy_bitmap (tileset_bmp);
117 	tileset_bmp = load_8bit (name);
118 	if (!tileset_bmp)
119 	{
120 		printf ("Could not find %s.\n", name);
121 		return 1;
122 	}
123 	for (i = 0; i < TILE_NUM; i++)
124 	{
125 		if (tiles[i])
126 			destroy_bitmap (tiles[i]);
127 		tiles[i] = create_sub_bitmap (tileset_bmp, i * 16, 0, 16, 24);
128 	}
129 
130 	sprintf (section, "scheme%i", charset);
131 	name = get_config_string (section, "sprites", "gfx/chars.bmp");
132 	strcpy (charset_name, get_config_string (section, "name", "default"));
133 	if (charset_bmp)
134 		destroy_bitmap (charset_bmp);
135 	charset_bmp = load_8bit (name);
136 	if (!charset_bmp)
137 	{
138 		printf ("Could not find %s.\n", name);
139 		return 1;
140 	}
141 	if (doublesize)
142 	{
143 		BITMAP *bmp = create_bitmap (charset_bmp->w * 2, charset_bmp->h * 2);
144 		stretch_blit (charset_bmp, bmp, 0, 0, charset_bmp->w, charset_bmp->h,
145 			0, 0, charset_bmp->w * 2, charset_bmp->h * 2);
146 		destroy_bitmap (charset_bmp);
147 		charset_bmp = bmp;
148 	}
149 	sprite_w = charset_bmp->w / 21;
150 	sprite_h = charset_bmp->h;
151 	for (i = 0; i < CHAR_NUM; i++)
152 	{
153 		if (anims[i])
154 			destroy_bitmap (anims[i]);
155 		anims[i] = create_sub_bitmap (charset_bmp, i * sprite_w, 0, sprite_w, sprite_h);
156 	}
157 
158 	sprintf (section, "scheme%i", layout);
159 	name = get_config_string (section, "layout", "gfx/layout.bmp");
160 
161 	read_layout_colors (section);
162 	strcpy (layout_name, get_config_string (section, "name", "default"));
163 	if (title)
164 		destroy_bitmap (title);
165 	title = load_8bit (name);
166 	if (!title)
167 	{
168 		printf ("Could not find %s.\n", name);
169 		return 1;
170 	}
171 
172 	return 0;
173 }
174