src/player_face.h
author peter1138
Tue, 22 Jan 2008 07:27:06 +0000
changeset 8374 7a1b6c89cb89
parent 8236 8a5dd0b42e47
child 9235 1517b0d83518
permissions -rw-r--r--
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
6190
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
     1
/* $Id$ */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
     2
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
     3
/** @file player_face.h Functionality related to the player's face */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
     4
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
     5
#ifndef PLAYER_FACE_H
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
     6
#define PLAYER_FACE_H
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
     7
8131
160939e24ed3 (svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents: 7928
diff changeset
     8
#include "core/random_func.hpp"
8236
8a5dd0b42e47 (svn r11800) -Codechange: move some functions to a more logical location + some type safety.
rubidium
parents: 8131
diff changeset
     9
#include "core/bitmath_func.hpp"
8131
160939e24ed3 (svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents: 7928
diff changeset
    10
6190
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    11
/** The gender/race combinations that we have faces for */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    12
enum GenderEthnicity {
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    13
	GENDER_FEMALE    = 0, ///< This bit set means a female, otherwise male
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    14
	ETHNICITY_BLACK  = 1, ///< This bit set means black, otherwise white
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    15
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    16
	GE_WM = 0,                                         ///< A male of Caucasian origin (white)
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    17
	GE_WF = 1 << GENDER_FEMALE,                        ///< A female of Caucasian origin (white)
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    18
	GE_BM = 1 << ETHNICITY_BLACK,                      ///< A male of African origin (black)
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    19
	GE_BF = 1 << ETHNICITY_BLACK | 1 << GENDER_FEMALE, ///< A female of African origin (black)
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    20
	GE_END,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    21
};
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    22
DECLARE_ENUM_AS_BIT_SET(GenderEthnicity); ///< See GenderRace as a bitset
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    23
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    24
/** Bitgroups of the PlayerFace variable */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    25
enum PlayerFaceVariable {
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    26
	PFV_GENDER,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    27
	PFV_ETHNICITY,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    28
	PFV_GEN_ETHN,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    29
	PFV_HAS_MOUSTACHE,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    30
	PFV_HAS_TIE_EARRING,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    31
	PFV_HAS_GLASSES,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    32
	PFV_EYE_COLOUR,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    33
	PFV_CHEEKS,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    34
	PFV_CHIN,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    35
	PFV_EYEBROWS,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    36
	PFV_MOUSTACHE,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    37
	PFV_LIPS,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    38
	PFV_NOSE,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    39
	PFV_HAIR,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    40
	PFV_JACKET,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    41
	PFV_COLLAR,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    42
	PFV_TIE_EARRING,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    43
	PFV_GLASSES,
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    44
	PFV_END
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    45
};
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    46
DECLARE_POSTFIX_INCREMENT(PlayerFaceVariable);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    47
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    48
/** Information about the valid values of PlayerFace bitgroups as well as the sprites to draw */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    49
struct PlayerFaceBitsInfo {
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    50
	byte     offset;               ///< Offset in bits into the PlayerFace
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    51
	byte     length;               ///< Number of bits used in the PlayerFace
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    52
	byte     valid_values[GE_END]; ///< The number of valid values per gender/ethnicity
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    53
	SpriteID first_sprite[GE_END]; ///< The first sprite per gender/ethnicity
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    54
};
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    55
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    56
/** Lookup table for indices into the PlayerFace, valid ranges and sprites */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    57
static const PlayerFaceBitsInfo _pf_info[] = {
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    58
	/* Index                   off len   WM  WF  BM  BF         WM     WF     BM     BF */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    59
	/* PFV_GENDER          */ {  0, 1, {  2,  2,  2,  2 }, {     0,     0,     0,     0 } }, ///< 0 = male, 1 = female
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    60
	/* PFV_ETHNICITY       */ {  1, 2, {  2,  2,  2,  2 }, {     0,     0,     0,     0 } }, ///< 0 = (Western-)Caucasian, 1 = African(-American)/Black
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    61
	/* PFV_GEN_ETHN        */ {  0, 3, {  4,  4,  4,  4 }, {     0,     0,     0,     0 } }, ///< Shortcut to get/set gender _and_ ethnicity
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    62
	/* PFV_HAS_MOUSTACHE   */ {  3, 1, {  2,  0,  2,  0 }, {     0,     0,     0,     0 } }, ///< Females do not have a moustache
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    63
	/* PFV_HAS_TIE_EARRING */ {  3, 1, {  0,  2,  0,  2 }, {     0,     0,     0,     0 } }, ///< Draw the earring for females or not. For males the tie is always drawn.
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    64
	/* PFV_HAS_GLASSES     */ {  4, 1, {  2,  2,  2,  2 }, {     0,     0,     0,     0 } }, ///< Whether to draw glasses or not
7734
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
    65
	/* PFV_EYE_COLOUR      */ {  5, 2, {  3,  3,  1,  1 }, {     0,     0,     0,     0 } }, ///< Palette modification
6190
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    66
	/* PFV_CHEEKS          */ {  0, 0, {  1,  1,  1,  1 }, { 0x325, 0x326, 0x390, 0x3B0 } }, ///< Cheeks are only indexed by their gender/ethnicity
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    67
	/* PFV_CHIN            */ {  7, 2, {  4,  1,  2,  2 }, { 0x327, 0x327, 0x391, 0x3B1 } },
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    68
	/* PFV_EYEBROWS        */ {  9, 4, { 12, 16, 11, 16 }, { 0x32B, 0x337, 0x39A, 0x3B8 } },
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    69
	/* PFV_MOUSTACHE       */ { 13, 2, {  3,  0,  3,  0 }, { 0x367,     0, 0x397,     0 } }, ///< Depends on PFV_HAS_MOUSTACHE
6345
d04400b59b30 (svn r9376) -Fix (r8969): off-by-one error for the amount of mouth pieces for men.
rubidium
parents: 6190
diff changeset
    70
	/* PFV_LIPS            */ { 13, 4, { 12, 10,  9,  9 }, { 0x35B, 0x351, 0x3A5, 0x3C8 } }, ///< Depends on !PFV_HAS_MOUSTACHE
6190
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    71
	/* PFV_NOSE            */ { 17, 3, {  8,  4,  4,  5 }, { 0x349, 0x34C, 0x393, 0x3B3 } }, ///< Depends on !PFV_HAS_MOUSTACHE
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    72
	/* PFV_HAIR            */ { 20, 4, {  9,  5,  5,  4 }, { 0x382, 0x38B, 0x3D4, 0x3D9 } },
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    73
	/* PFV_JACKET          */ { 24, 2, {  3,  3,  3,  3 }, { 0x36B, 0x378, 0x36B, 0x378 } },
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    74
	/* PFV_COLLAR          */ { 26, 2, {  4,  4,  4,  4 }, { 0x36E, 0x37B, 0x36E, 0x37B } },
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    75
	/* PFV_TIE_EARRING     */ { 28, 3, {  6,  3,  6,  3 }, { 0x372, 0x37F, 0x372, 0x3D1 } }, ///< Depends on PFV_HAS_TIE_EARRING
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    76
	/* PFV_GLASSES         */ { 31, 1, {  2,  2,  2,  2 }, { 0x347, 0x347, 0x3AE, 0x3AE } }  ///< Depends on PFV_HAS_GLASSES
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    77
};
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    78
assert_compile(lengthof(_pf_info) == PFV_END);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    79
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    80
/**
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    81
 * Gets the player's face bits for the given player face variable
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    82
 * @param pf  the face to extract the bits from
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    83
 * @param pfv the face variable to get the data of
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    84
 * @param ge  the gender and ethnicity of the face
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    85
 * @pre _pf_info[pfv].valid_values[ge] != 0
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    86
 * @return the requested bits
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    87
 */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    88
static inline uint GetPlayerFaceBits(PlayerFace pf, PlayerFaceVariable pfv, GenderEthnicity ge)
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    89
{
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    90
	assert(_pf_info[pfv].valid_values[ge] != 0);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    91
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    92
	return GB(pf, _pf_info[pfv].offset, _pf_info[pfv].length);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    93
}
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    94
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    95
/**
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    96
 * Sets the player's face bits for the given player face variable
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    97
 * @param pf  the face to write the bits to
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    98
 * @param pfv the face variable to write the data of
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
    99
 * @param ge  the gender and ethnicity of the face
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   100
 * @param val the new value
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   101
 * @pre val < _pf_info[pfv].valid_values[ge]
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   102
 */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   103
static inline void SetPlayerFaceBits(PlayerFace &pf, PlayerFaceVariable pfv, GenderEthnicity ge, uint val)
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   104
{
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   105
	assert(val < _pf_info[pfv].valid_values[ge]);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   106
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   107
	SB(pf, _pf_info[pfv].offset, _pf_info[pfv].length, val);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   108
}
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   109
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   110
/**
7734
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   111
 * Increase/Decrease the player face variable by the given amount.
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   112
 * If the new value greater than the max value for this variable it will be set to 0.
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   113
 * Or is it negativ (< 0) it will be set to max value.
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   114
 *
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   115
 * @param pf     the player face to write the bits to
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   116
 * @param pfv    the player face variable to write the data of
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   117
 * @param ge     the gender and ethnicity of the player face
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   118
 * @param amount the amount which change the value
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   119
 *
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   120
 * @pre 0 <= val < _pf_info[pfv].valid_values[ge]
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   121
 */
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   122
static inline void IncreasePlayerFaceBits(PlayerFace &pf, PlayerFaceVariable pfv, GenderEthnicity ge, int8 amount)
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   123
{
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   124
	int8 val = GetPlayerFaceBits(pf, pfv, ge) + amount; // the new value for the pfv
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   125
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   126
	/* scales the new value to the correct scope */
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   127
	if (val >= _pf_info[pfv].valid_values[ge]) {
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   128
		val = 0;
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   129
	} else if (val < 0) {
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   130
		val = _pf_info[pfv].valid_values[ge] - 1;
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   131
	}
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   132
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   133
	SetPlayerFaceBits(pf, pfv, ge, val); // save the new value
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   134
}
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   135
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   136
/**
6190
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   137
 * Checks whether the player bits have a valid range
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   138
 * @param pf  the face to extract the bits from
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   139
 * @param pfv the face variable to get the data of
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   140
 * @param ge  the gender and ethnicity of the face
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   141
 * @return true if and only if the bits are valid
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   142
 */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   143
static inline bool ArePlayerFaceBitsValid(PlayerFace pf, PlayerFaceVariable pfv, GenderEthnicity ge)
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   144
{
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   145
	return GB(pf, _pf_info[pfv].offset, _pf_info[pfv].length) < _pf_info[pfv].valid_values[ge];
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   146
}
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   147
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   148
/**
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   149
 * Scales a player face bits variable to the correct scope
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   150
 * @param pfv the face variable to write the data of
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   151
 * @param ge  the gender and ethnicity of the face
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   152
 * @param val the to value to scale
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   153
 * @pre val < (1U << _pf_info[pfv].length), i.e. val has a value of 0..2^(bits used for this variable)-1
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   154
 * @return the scaled value
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   155
 */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   156
static inline uint ScalePlayerFaceValue(PlayerFaceVariable pfv, GenderEthnicity ge, uint val)
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   157
{
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   158
	assert(val < (1U << _pf_info[pfv].length));
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   159
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   160
	return (val * _pf_info[pfv].valid_values[ge]) >> _pf_info[pfv].length;
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   161
}
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   162
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   163
/**
7734
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   164
 * Scales all player face bits to the correct scope
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   165
 *
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   166
 * @param pf the player face to write the bits to
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   167
 */
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   168
static inline void ScaleAllPlayerFaceBits(PlayerFace &pf)
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   169
{
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   170
	IncreasePlayerFaceBits(pf, PFV_ETHNICITY, GE_WM, 0); // scales the ethnicity
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   171
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   172
	GenderEthnicity ge = (GenderEthnicity)GB(pf, _pf_info[PFV_GEN_ETHN].offset, _pf_info[PFV_GEN_ETHN].length); // gender & ethnicity of the face
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   173
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   174
	/* Is a male face with moustache. Need to reduce CPU load in the loop. */
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7754
diff changeset
   175
	bool is_moust_male = !HasBit(ge, GENDER_FEMALE) && GetPlayerFaceBits(pf, PFV_HAS_MOUSTACHE, ge) != 0;
7734
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   176
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   177
	for (PlayerFaceVariable pfv = PFV_EYE_COLOUR; pfv < PFV_END; pfv++) { // scales all other variables
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   178
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   179
		/* The moustache variable will be scaled only if it is a male face with has a moustache */
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   180
		if (pfv != PFV_MOUSTACHE || is_moust_male) {
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   181
			IncreasePlayerFaceBits(pf, pfv, ge, 0);
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   182
		}
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   183
	}
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   184
}
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   185
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   186
/**
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   187
 * Make a random new face.
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   188
 * If it is for the advanced player face window then the new face have the same gender
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   189
 * and ethnicity as the old one, else the gender is equal and the ethnicity is random.
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   190
 *
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   191
 * @param pf  the player face to write the bits to
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   192
 * @param ge  the gender and ethnicity of the old player face
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   193
 * @param adv if it for the advanced player face window
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   194
 *
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   195
 * @pre scale 'ge' to a valid gender/ethnicity combination
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   196
 */
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   197
static inline void RandomPlayerFaceBits(PlayerFace &pf, GenderEthnicity ge, bool adv)
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   198
{
7754
b8558299d724 (svn r11292) -Fix [FS#1350]: don't desync when generating random faces. Patch by SmatZ.
rubidium
parents: 7741
diff changeset
   199
	pf = InteractiveRandom(); // random all player face bits
7734
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   200
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   201
	/* scale ge: 0 == GE_WM, 1 == GE_WF, 2 == GE_BM, 3 == GE_BF (and maybe in future: ...) */
7741
10282edeb81f (svn r11278) -Fix [FS#1342] (r11269): modulo result can be negative for signed int
glx
parents: 7734
diff changeset
   202
	ge = (GenderEthnicity)((uint)ge % GE_END);
7734
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   203
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   204
	/* set the gender (and ethnicity) for the new player face */
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   205
	if (adv) {
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   206
		SetPlayerFaceBits(pf, PFV_GEN_ETHN, ge, ge);
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   207
	} else {
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7754
diff changeset
   208
		SetPlayerFaceBits(pf, PFV_GENDER, ge, HasBit(ge, GENDER_FEMALE));
7734
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   209
	}
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   210
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   211
	/* scales all player face bits to the correct scope */
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   212
	ScaleAllPlayerFaceBits(pf);
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   213
}
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   214
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   215
/**
6190
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   216
 * Gets the sprite to draw for the given player face variable
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   217
 * @param pf  the face to extract the data from
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   218
 * @param pfv the face variable to get the sprite of
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   219
 * @param ge  the gender and ethnicity of the face
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   220
 * @pre _pf_info[pfv].valid_values[ge] != 0
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   221
 * @return sprite to draw
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   222
 */
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   223
static inline SpriteID GetPlayerFaceSprite(PlayerFace pf, PlayerFaceVariable pfv, GenderEthnicity ge)
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   224
{
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   225
	assert(_pf_info[pfv].valid_values[ge] != 0);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   226
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   227
	return _pf_info[pfv].first_sprite[ge] + GB(pf, _pf_info[pfv].offset, _pf_info[pfv].length);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   228
}
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   229
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   230
void DrawPlayerFace(PlayerFace face, int color, int x, int y);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   231
PlayerFace ConvertFromOldPlayerFace(uint32 face);
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   232
bool IsValidPlayerFace(PlayerFace pf);
7734
627817106768 (svn r11269) -Feature: user customisable faces. Patch by BigBB.
rubidium
parents: 6345
diff changeset
   233
void DrawFaceStringLabel(const Window *w, byte widget_index, StringID str, uint8 val, bool is_bool_widget);
6190
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   234
01a2b579b668 (svn r8969) -Codechange: rework of the player face bits.
rubidium
parents:
diff changeset
   235
#endif /* PLAYER_FACE_H */