Ejemplo n.º 1
0
command_result weather (color_ostream &con, vector <string> & parameters)
{
    int val_override = -1;
    bool lock = false;
    bool unlock = false;
    bool snow = false;
    bool rain = false;
    bool clear = false;
    for(size_t i = 0; i < parameters.size();i++)
    {
        if(parameters[i] == "rain")
            rain = true;
        else if(parameters[i] == "snow")
            snow = true;
        else if(parameters[i] == "clear")
            clear = true;
        else if(parameters[i] == "lock")
            lock = true;
        else if(parameters[i] == "unlock")
            unlock = true;
        else
        {
            val_override = atoi(parameters[i].c_str());
            if(val_override == 0)
                return CR_WRONG_USAGE;
        }
    }
    if(lock && unlock)
    {
        con << "Lock or unlock? DECIDE!" << std::endl;
        return CR_FAILURE;
    }
    int cnt = 0;
    cnt += rain;
    cnt += snow;
    cnt += clear;
    if(cnt > 1)
    {
        con << "Rain, snow or clear sky? DECIDE!" << std::endl;
        return CR_FAILURE;
    }
    bool something = lock || unlock || rain || snow || clear || val_override != -1;

    CoreSuspender suspend;

    DFHack::World * w = Core::getInstance().getWorld();
    if(!w->wmap)
    {
        con << "Weather support seems broken :(" << std::endl;
        return CR_FAILURE;
    }
    if(!something)
    {
        // paint weather map
        con << "Weather map (C = clear, R = rain, S = snow):" << std::endl;
        for(int y = 0; y<5;y++)
        {
            for(int x = 0; x<5;x++)
            {
                switch((*w->wmap)[x][y])
                {
                case CLEAR:
                    con << "C ";
                    break;
                case RAINING:
                    con << "R ";
                    break;
                case SNOWING:
                    con << "S ";
                    break;
                default:
                    con << (int) (*w->wmap)[x][y] << " ";
                    break;
                }
            }
            con << std::endl;
        }
    }
    else
    {
        // weather changing action!
        if(rain)
        {
            con << "Here comes the rain." << std::endl;
            w->SetCurrentWeather(RAINING);
        }
        if(snow)
        {
            con << "Snow everywhere!" << std::endl;
            w->SetCurrentWeather(SNOWING);
        }
        if(clear)
        {
            con << "Suddenly, sunny weather!" << std::endl;
            w->SetCurrentWeather(CLEAR);
        }
        if(val_override != -1)
        {
            con << "I have no damn idea what this is... " << val_override << std::endl;
            w->SetCurrentWeather(val_override);
        }
        // FIXME: weather lock needs map ID to work reliably... needs to be implemented.
    }
    return CR_OK;
}
Ejemplo n.º 2
0
DFhackCExport command_result weather (Core * c, vector <string> & parameters)
{
    Console & con = c->con;
    bool lock = false;
    bool unlock = false;
    bool snow = false;
    bool rain = false;
    bool clear = false;
    bool help = false;
    for(int i = 0; i < parameters.size();i++)
    {
        if(parameters[i] == "rain")
            rain = true;
        else if(parameters[i] == "snow")
            snow = true;
        else if(parameters[i] == "clear")
            clear = true;
        else if(parameters[i] == "lock")
            lock = true;
        else if(parameters[i] == "unlock")
            unlock = true;
        else if(parameters[i] == "help" || parameters[i] == "?")
            help = true;
    }
    if(help)
    {
        c->con.print("Prints the current weather map by default.\n"
                     "Options:\n"
                     "snow   - make it snow everywhere.\n"
                     "rain   - make it rain.\n"
                     "clear  - clear the sky.\n"
        );
        return CR_OK;
    }
    if(lock && unlock)
    {
        con << "Lock or unlock? DECIDE!" << std::endl;
        return CR_FAILURE;
    }
    int cnt = 0;
    cnt += rain;
    cnt += snow;
    cnt += clear;
    if(cnt > 1)
    {
        con << "Rain, snow or clear sky? DECIDE!" << std::endl;
        return CR_FAILURE;
    }
    bool something = lock || unlock || rain || snow || clear;
    c->Suspend();
    DFHack::World * w = c->getWorld();
    if(!w->wmap)
    {
        con << "Weather support seems broken :(" << std::endl;
        c->Resume();
        return CR_FAILURE;
    }
    if(!something)
    {
        // paint weather map
        con << "Weather map (C = clear, R = rain, S = snow):" << std::endl;
        for(int y = 0; y<5;y++)
        {
            for(int x = 0; x<5;x++)
            {
                switch((*w->wmap)[x][y])
                {
                    case DFHack::CLEAR:
                        con << "C ";
                        break;
                    case DFHack::RAINING:
                        con << "R ";
                        break;
                    case DFHack::SNOWING:
                        con << "S ";
                        break;
                    default:
                        con << (int) (*w->wmap)[x][y] << " ";
                        break;
                }
            }
            con << std::endl;
        }
    }
    else
    {
        // weather changing action!
        if(rain)
        {
            con << "Here comes the rain." << std::endl;
            w->SetCurrentWeather(RAINING);
        }
        if(snow)
        {
            con << "Snow everywhere!" << std::endl;
            w->SetCurrentWeather(SNOWING);
        }
        if(clear)
        {
            con << "Suddenly, sunny weather!" << std::endl;
            w->SetCurrentWeather(CLEAR);
        }
        // FIXME: weather lock needs map ID to work reliably... needs to be implemented.
    }
    c->Resume();
    return CR_OK;
}