|
@@ -36,35 +36,35 @@ void DrawPlayerFace(uint32 face, int col
|
|
|
if ((((((face >> 7) ^ face) >> 7) ^ face) & 0x8080000) == 0x8000000)
|
|
|
flag |= 2;
|
|
|
|
|
|
/* draw the gradient */
|
|
|
DrawSprite( (color<<16) + 0x0307836A, x, y);
|
|
|
|
|
|
/* draw the cheeks */
|
|
|
DrawSprite(cheeks_table[flag&3], x, y);
|
|
|
|
|
|
/* draw the chin */
|
|
|
/* FIXME: real code uses -2 in zoomlevel 1 */
|
|
|
{
|
|
|
uint val = (face >> 4) & 3;
|
|
|
uint val = GB(face, 4, 2);
|
|
|
if (!(flag & 2)) {
|
|
|
DrawSprite(0x327 + (flag&1?0:val), x, y);
|
|
|
} else {
|
|
|
DrawSprite((flag&1?0x3B1:0x391) + (val>>1), x, y);
|
|
|
}
|
|
|
}
|
|
|
/* draw the eyes */
|
|
|
{
|
|
|
uint val1 = (face >> 6)&15;
|
|
|
uint val2 = (face >> 20)&7;
|
|
|
uint val1 = GB(face, 6, 4);
|
|
|
uint val2 = GB(face, 20, 3);
|
|
|
uint32 high = 0x314<<16;
|
|
|
|
|
|
if (val2 >= 6) {
|
|
|
high = 0x30F<<16;
|
|
|
if (val2 != 6)
|
|
|
high = 0x30D<<16;
|
|
|
}
|
|
|
|
|
|
if (!(flag & 2)) {
|
|
|
if (!(flag & 1)) {
|
|
|
DrawSprite(high+((val1 * 12 >> 4) + 0x832B), x, y);
|
|
|
} else {
|
|
@@ -72,25 +72,25 @@ void DrawPlayerFace(uint32 face, int col
|
|
|
}
|
|
|
} else {
|
|
|
if (!(flag & 1)) {
|
|
|
DrawSprite(high+((val1 * 11 >> 4) + 0x839A), x, y);
|
|
|
} else {
|
|
|
DrawSprite(high+(val1 + 0x83B8), x, y);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* draw the mouth */
|
|
|
{
|
|
|
uint val = (face >> 10) & 63;
|
|
|
uint val = GB(face, 10, 6);
|
|
|
uint val2;
|
|
|
|
|
|
if (!(flag&1)) {
|
|
|
val2 = ((val&0xF) * 15 >> 4);
|
|
|
|
|
|
if (val2 < 3) {
|
|
|
DrawSprite((flag&2 ? 0x397 : 0x367) + val2, x, y);
|
|
|
/* skip the rest */
|
|
|
goto skip_mouth;
|
|
|
}
|
|
|
|
|
|
val2 -= 3;
|
|
@@ -118,62 +118,62 @@ void DrawPlayerFace(uint32 face, int col
|
|
|
DrawSprite(0x393 + (val&3), x, y);
|
|
|
} else {
|
|
|
DrawSprite(0x3B3 + (val*5>>3), x, y);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
skip_mouth:;
|
|
|
}
|
|
|
|
|
|
|
|
|
/* draw the hair */
|
|
|
{
|
|
|
uint val = (face >> 16) & 15;
|
|
|
uint val = GB(face, 16, 4);
|
|
|
if (!(flag&2)) {
|
|
|
if (!(flag&1)) {
|
|
|
DrawSprite(0x382 + (val*9>>4), x, y);
|
|
|
} else {
|
|
|
DrawSprite(0x38B + (val*5>>4), x, y);
|
|
|
}
|
|
|
} else {
|
|
|
if (!(flag&1)) {
|
|
|
DrawSprite(0x3D4 + (val*5>>4), x, y);
|
|
|
} else {
|
|
|
DrawSprite(0x3D9 + (val*5>>4), x, y);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* draw the tie */
|
|
|
{
|
|
|
uint val = (face >> 20) & 0xFF;
|
|
|
uint val = GB(face, 20, 8);
|
|
|
|
|
|
if (!(flag&1)) {
|
|
|
DrawSprite(0x36B + ((val&3)*3>>2), x, y);
|
|
|
DrawSprite(0x36E + ((val>>2)&3), x, y);
|
|
|
DrawSprite(0x372 + ((val>>4)*6>>4), x, y);
|
|
|
} else {
|
|
|
DrawSprite(0x378 + ((val&3)*3>>2), x, y);
|
|
|
DrawSprite(0x37B + ((val>>2)&3), x, y);
|
|
|
|
|
|
val >>= 4;
|
|
|
if (val < 3) {
|
|
|
DrawSprite((flag&2 ? 0x3D1 : 0x37F) + val, x, y);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* draw the glasses */
|
|
|
{
|
|
|
uint val = (face >> 28) & 7;
|
|
|
uint val = GB(face, 28, 3);
|
|
|
|
|
|
if (!(flag&2)) {
|
|
|
if (val<=1) {
|
|
|
DrawSprite(0x347 + val, x, y);
|
|
|
}
|
|
|
} else {
|
|
|
if (val<=1) {
|
|
|
DrawSprite(0x3AE + val, x, y);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -362,25 +362,25 @@ static byte GeneratePlayerColor(void)
|
|
|
int i,j,n;
|
|
|
uint32 r;
|
|
|
Player *p;
|
|
|
|
|
|
// Initialize array
|
|
|
for(i=0; i!=16; i++)
|
|
|
colors[i] = i;
|
|
|
|
|
|
// And randomize it
|
|
|
n = 100;
|
|
|
do {
|
|
|
r = Random();
|
|
|
COLOR_SWAP(r & 0xF, (r >> 4) & 0xF);
|
|
|
COLOR_SWAP(GB(r, 0, 4), GB(r, 4, 4));
|
|
|
} while (--n);
|
|
|
|
|
|
// Bubble sort it according to the values in table 1
|
|
|
i = 16;
|
|
|
do {
|
|
|
for(j=0; j!=15; j++) {
|
|
|
if (_color_sort[colors[j]] < _color_sort[colors[j+1]]) {
|
|
|
COLOR_SWAP(j,j+1);
|
|
|
}
|
|
|
}
|
|
|
} while (--i);
|
|
|
|
|
@@ -745,26 +745,26 @@ int32 CmdPlayerCtrl(int x, int y, uint32
|
|
|
SetDParam(0, p->name_1);
|
|
|
SetDParam(1, p->name_2);
|
|
|
AddNewsItem( (StringID)(p->index + 16*3), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
|
|
|
|
|
|
/* Remove the company */
|
|
|
ChangeOwnershipOfPlayerItems(p->index, OWNER_SPECTATOR);
|
|
|
p->money64 = p->player_money = 100000000; // XXX - wtf?
|
|
|
p->is_active = false;
|
|
|
}
|
|
|
} break;
|
|
|
|
|
|
case 3: { /* Merge a company (#1) into another company (#2), elimination company #1 */
|
|
|
PlayerID pid_old = p2 & 0xFFFF;
|
|
|
PlayerID pid_new = (p2 >> 16) & 0xFFFF;
|
|
|
PlayerID pid_old = GB(p2, 0, 16);
|
|
|
PlayerID pid_new = GB(p2, 16, 16);
|
|
|
|
|
|
if (pid_old >= MAX_PLAYERS || pid_new >= MAX_PLAYERS) return CMD_ERROR;
|
|
|
|
|
|
if (!(flags & DC_EXEC)) return CMD_ERROR;
|
|
|
|
|
|
ChangeOwnershipOfPlayerItems(pid_old, pid_new);
|
|
|
DeletePlayerStuff(pid_old);
|
|
|
} break;
|
|
|
default: return CMD_ERROR;
|
|
|
}
|
|
|
|
|
|
return 0;
|