78 flag |= 1; |
78 flag |= 1; |
79 if ((((((face >> 7) ^ face) >> 7) ^ face) & 0x8080000) == 0x8000000) |
79 if ((((((face >> 7) ^ face) >> 7) ^ face) & 0x8080000) == 0x8000000) |
80 flag |= 2; |
80 flag |= 2; |
81 |
81 |
82 /* draw the gradient */ |
82 /* draw the gradient */ |
83 DrawSprite(GENERAL_SPRITE_COLOR(color) + SPRITE_PALETTE(SPR_GRADIENT), x, y); |
83 DrawSprite(SPR_GRADIENT, GENERAL_SPRITE_COLOR(color), x, y); |
84 |
84 |
85 /* draw the cheeks */ |
85 /* draw the cheeks */ |
86 DrawSprite(cheeks_table[flag&3], x, y); |
86 DrawSprite(cheeks_table[flag&3], PAL_NONE, x, y); |
87 |
87 |
88 /* draw the chin */ |
88 /* draw the chin */ |
89 /* FIXME: real code uses -2 in zoomlevel 1 */ |
89 /* FIXME: real code uses -2 in zoomlevel 1 */ |
90 { |
90 { |
91 uint val = GB(face, 4, 2); |
91 uint val = GB(face, 4, 2); |
92 if (!(flag & 2)) { |
92 if (!(flag & 2)) { |
93 DrawSprite(0x327 + (flag&1?0:val), x, y); |
93 DrawSprite(0x327 + (flag&1?0:val), PAL_NONE, x, y); |
94 } else { |
94 } else { |
95 DrawSprite((flag&1?0x3B1:0x391) + (val>>1), x, y); |
95 DrawSprite((flag&1?0x3B1:0x391) + (val>>1), PAL_NONE, x, y); |
96 } |
96 } |
97 } |
97 } |
98 /* draw the eyes */ |
98 /* draw the eyes */ |
99 { |
99 { |
100 uint val1 = GB(face, 6, 4); |
100 uint val1 = GB(face, 6, 4); |
101 uint val2 = GB(face, 20, 3); |
101 uint val2 = GB(face, 20, 3); |
102 uint32 high = 0x314 << PALETTE_SPRITE_START; |
102 SpriteID pal; |
103 |
103 |
104 if (val2 >= 6) { |
104 if (val2 < 6) { |
105 high = 0x30F << PALETTE_SPRITE_START; |
105 pal = PALETTE_TO_BROWN; |
106 if (val2 != 6) |
106 } else if (val2 == 6) { |
107 high = 0x30D << PALETTE_SPRITE_START; |
107 pal = PALETTE_TO_BLUE; |
|
108 } else { |
|
109 pal = PALETTE_TO_GREEN; |
108 } |
110 } |
109 |
111 |
110 if (!(flag & 2)) { |
112 if (!(flag & 2)) { |
111 if (!(flag & 1)) { |
113 if (!(flag & 1)) { |
112 DrawSprite(high+((val1 * 12 >> 4) + SPRITE_PALETTE(0x32B)), x, y); |
114 DrawSprite(0x32B + (val1 * 12 >> 4), pal, x, y); |
113 } else { |
115 } else { |
114 DrawSprite(high+(val1 + SPRITE_PALETTE(0x337)), x, y); |
116 DrawSprite(0x337 + val1, pal, x, y); |
115 } |
117 } |
116 } else { |
118 } else { |
117 if (!(flag & 1)) { |
119 if (!(flag & 1)) { |
118 DrawSprite(high+((val1 * 11 >> 4) + SPRITE_PALETTE(0x39A)), x, y); |
120 DrawSprite(0x39A + (val1 * 11 >> 4), pal, x, y); |
119 } else { |
121 } else { |
120 DrawSprite(high+(val1 + SPRITE_PALETTE(0x3B8)), x, y); |
122 DrawSprite(0x3B8 + val1, pal, x, y); |
121 } |
123 } |
122 } |
124 } |
123 } |
125 } |
124 |
126 |
125 /* draw the mouth */ |
127 /* draw the mouth */ |
129 |
131 |
130 if (!(flag&1)) { |
132 if (!(flag&1)) { |
131 val2 = ((val&0xF) * 15 >> 4); |
133 val2 = ((val&0xF) * 15 >> 4); |
132 |
134 |
133 if (val2 < 3) { |
135 if (val2 < 3) { |
134 DrawSprite((flag&2 ? 0x397 : 0x367) + val2, x, y); |
136 DrawSprite((flag&2 ? 0x397 : 0x367) + val2, PAL_NONE, x, y); |
135 /* skip the rest */ |
137 /* skip the rest */ |
136 goto skip_mouth; |
138 goto skip_mouth; |
137 } |
139 } |
138 |
140 |
139 val2 -= 3; |
141 val2 -= 3; |
140 if (flag & 2) { |
142 if (flag & 2) { |
141 if (val2 > 8) val2 = 0; |
143 if (val2 > 8) val2 = 0; |
142 val2 += 0x3A5 - 0x35B; |
144 val2 += 0x3A5 - 0x35B; |
143 } |
145 } |
144 DrawSprite(val2 + 0x35B, x, y); |
146 DrawSprite(val2 + 0x35B, PAL_NONE, x, y); |
145 } else if (!(flag&2)) { |
147 } else if (!(flag&2)) { |
146 DrawSprite(((val&0xF) * 10 >> 4) + 0x351, x, y); |
148 DrawSprite(((val&0xF) * 10 >> 4) + 0x351, PAL_NONE, x, y); |
147 } else { |
149 } else { |
148 DrawSprite(((val&0xF) * 9 >> 4) + 0x3C8, x, y); |
150 DrawSprite(((val&0xF) * 9 >> 4) + 0x3C8, PAL_NONE, x, y); |
149 } |
151 } |
150 |
152 |
151 val >>= 3; |
153 val >>= 3; |
152 |
154 |
153 if (!(flag&2)) { |
155 if (!(flag&2)) { |
154 if (!(flag&1)) { |
156 if (!(flag&1)) { |
155 DrawSprite(0x349 + val, x, y); |
157 DrawSprite(0x349 + val, PAL_NONE, x, y); |
156 } else { |
158 } else { |
157 DrawSprite( mouth_table[(val*3>>3)], x, y); |
159 DrawSprite( mouth_table[(val*3>>3)], PAL_NONE, x, y); |
158 } |
160 } |
159 } else { |
161 } else { |
160 if (!(flag&1)) { |
162 if (!(flag&1)) { |
161 DrawSprite(0x393 + (val&3), x, y); |
163 DrawSprite(0x393 + (val&3), PAL_NONE, x, y); |
162 } else { |
164 } else { |
163 DrawSprite(0x3B3 + (val*5>>3), x, y); |
165 DrawSprite(0x3B3 + (val*5>>3), PAL_NONE, x, y); |
164 } |
166 } |
165 } |
167 } |
166 |
168 |
167 skip_mouth:; |
169 skip_mouth:; |
168 } |
170 } |
171 /* draw the hair */ |
173 /* draw the hair */ |
172 { |
174 { |
173 uint val = GB(face, 16, 4); |
175 uint val = GB(face, 16, 4); |
174 if (flag & 2) { |
176 if (flag & 2) { |
175 if (flag & 1) { |
177 if (flag & 1) { |
176 DrawSprite(0x3D9 + (val * 5 >> 4), x, y); |
178 DrawSprite(0x3D9 + (val * 5 >> 4), PAL_NONE, x, y); |
177 } else { |
179 } else { |
178 DrawSprite(0x3D4 + (val * 5 >> 4), x, y); |
180 DrawSprite(0x3D4 + (val * 5 >> 4), PAL_NONE, x, y); |
179 } |
181 } |
180 } else { |
182 } else { |
181 if (flag & 1) { |
183 if (flag & 1) { |
182 DrawSprite(0x38B + (val * 5 >> 4), x, y); |
184 DrawSprite(0x38B + (val * 5 >> 4), PAL_NONE, x, y); |
183 } else { |
185 } else { |
184 DrawSprite(0x382 + (val * 9 >> 4), x, y); |
186 DrawSprite(0x382 + (val * 9 >> 4), PAL_NONE, x, y); |
185 } |
187 } |
186 } |
188 } |
187 } |
189 } |
188 |
190 |
189 /* draw the tie */ |
191 /* draw the tie */ |
190 { |
192 { |
191 uint val = GB(face, 20, 8); |
193 uint val = GB(face, 20, 8); |
192 |
194 |
193 if (!(flag&1)) { |
195 if (!(flag&1)) { |
194 DrawSprite(0x36B + (GB(val, 0, 2) * 3 >> 2), x, y); |
196 DrawSprite(0x36B + (GB(val, 0, 2) * 3 >> 2), PAL_NONE, x, y); |
195 DrawSprite(0x36E + (GB(val, 2, 2) * 4 >> 2), x, y); |
197 DrawSprite(0x36E + (GB(val, 2, 2) * 4 >> 2), PAL_NONE, x, y); |
196 DrawSprite(0x372 + (GB(val, 4, 4) * 6 >> 4), x, y); |
198 DrawSprite(0x372 + (GB(val, 4, 4) * 6 >> 4), PAL_NONE, x, y); |
197 } else { |
199 } else { |
198 DrawSprite(0x378 + (GB(val, 0, 2) * 3 >> 2), x, y); |
200 DrawSprite(0x378 + (GB(val, 0, 2) * 3 >> 2), PAL_NONE, x, y); |
199 DrawSprite(0x37B + (GB(val, 2, 2) * 4 >> 2), x, y); |
201 DrawSprite(0x37B + (GB(val, 2, 2) * 4 >> 2), PAL_NONE, x, y); |
200 |
202 |
201 val >>= 4; |
203 val >>= 4; |
202 if (val < 3) DrawSprite((flag & 2 ? 0x3D1 : 0x37F) + val, x, y); |
204 if (val < 3) DrawSprite((flag & 2 ? 0x3D1 : 0x37F) + val, PAL_NONE, x, y); |
203 } |
205 } |
204 } |
206 } |
205 |
207 |
206 /* draw the glasses */ |
208 /* draw the glasses */ |
207 { |
209 { |
208 uint val = GB(face, 28, 3); |
210 uint val = GB(face, 28, 3); |
209 |
211 |
210 if (flag & 2) { |
212 if (flag & 2) { |
211 if (val <= 1) DrawSprite(0x3AE + val, x, y); |
213 if (val <= 1) DrawSprite(0x3AE + val, PAL_NONE, x, y); |
212 } else { |
214 } else { |
213 if (val <= 1) DrawSprite(0x347 + val, x, y); |
215 if (val <= 1) DrawSprite(0x347 + val, PAL_NONE, x, y); |
214 } |
216 } |
215 } |
217 } |
216 } |
218 } |
217 |
219 |
218 void InvalidatePlayerWindows(const Player *p) |
220 void InvalidatePlayerWindows(const Player *p) |