#include <pksm.h>
#include <stdlib.h>

/*
 * Pokémon Soleil / Lune / Ultra-Soleil / Ultra-Lune
 *
 * Modification de la couleur de peau du personnage.
 *
 * PlayerSkinColor7 (PKHeX) :
 *
 *   PaleM    = 0
 *   PaleF    = 1
 *   DefaultM = 2
 *   DefaultF = 3
 *   TanM     = 4
 *   TanF     = 5
 *   DarkM    = 6
 *   DarkF    = 7
 *
 * La valeur PlayerSkinColor7 occupe les bits 2 à 4
 * de l'octet "dress up skin color".
 *
 * Soleil / Lune       : 0x1254
 * Ultra-Soleil / Lune : 0x1454
 *
 * Versions PKSM :
 *   30 = Soleil
 *   31 = Lune
 *   32 = Ultra-Soleil
 *   33 = Ultra-Lune
 */

#define SM_SKIN_OFFSET    0x1254
#define USUM_SKIN_OFFSET  0x1454

#define SKIN_PALE         0
#define SKIN_DEFAULT      2
#define SKIN_TAN          4
#define SKIN_DARK         6

int main(int argc, char **argv)
{
    unsigned char version;
    int offset;
    int gender;
    int choice;
    int skinColor;
    char *menu[5];

    /*
     * Les scripts officiels PKSM-Scripts utilisent actuellement
     * *argv[0] pour récupérer la version du jeu.
     */
    version = *argv[0];

    /*
     * Vérification de la version.
     *
     * 30 = Soleil
     * 31 = Lune
     * 32 = Ultra-Soleil
     * 33 = Ultra-Lune
     */
    if (version != 30 &&
        version != 31 &&
        version != 32 &&
        version != 33)
    {
        gui_warn("Jeu non compatible.");
        return 1;
    }

    /*
     * Déterminer l'offset selon le jeu.
     *
     * Soleil / Lune       : 0x1254
     * Ultra-Soleil / Lune : 0x1454
     */
    if (version == 30 || version == 31)
        offset = SM_SKIN_OFFSET;
    else
        offset = USUM_SKIN_OFFSET;

    /*
     * Récupérer le sexe du personnage.
     *
     * 0     = masculin
     * non-0 = féminin
     */
    gender = sav_get_value(SAV_GENDER);

    /*
     * Menu.
     */
    menu[0] = "Quitter";
    menu[1] = "Pâle";
    menu[2] = "Standard";
    menu[3] = "Bronzée";
    menu[4] = "Foncée";

    choice = gui_menu_20x2("Couleur de peau", 5, menu);

    if (choice == 0)
        return 0;

    /*
     * Valeur PlayerSkinColor7 pour le personnage masculin.
     */
    switch (choice)
    {
        case 1:
            skinColor = SKIN_PALE;
            break;

        case 2:
            skinColor = SKIN_DEFAULT;
            break;

        case 3:
            skinColor = SKIN_TAN;
            break;

        case 4:
            skinColor = SKIN_DARK;
            break;

        default:
            return 0;
    }

    /*
     * Les valeurs féminines sont immédiatement supérieures
     * aux valeurs masculines correspondantes :
     *
     *   PaleM    = 0    PaleF    = 1
     *   DefaultM = 2    DefaultF = 3
     *   TanM     = 4    TanF     = 5
     *   DarkM    = 6    DarkF    = 7
     */
    skinColor += gender;

    /*
     * PlayerSkinColor7 occupe les bits 2 à 4.
     *
     * 0x1C = 00011100
     * 0xE3 = 11100011
     *
     * On conserve donc les bits qui ne concernent pas
     * la couleur de peau.
     */
    {
        char value;

        value = (skinColor << 2);

        /*
         * Écriture du champ.
         *
         * Cette première version écrit la valeur calculée
         * dans l'octet concerné.
         */
        sav_set_data(&value, 1, offset, 0);
    }

    gui_warn("La couleur de peau a été modifiée.");

    return 0;
}