Ejemplo n.º 1
0
    /////////////////////
    /// Constructors ///
    ////////////////////

    public Citizen(string name, int money, float healthValue, float happinessValue,
                   CityPart.PLACE livingPlace, ENVIROMENTAL_COMMITMENT envCommitment, City city)
    {
        this.enviromentalCommitment = envCommitment;
        this.city   = city;
        ID          = idCount++;
        this.name   = name;
        this.money  = money;
        Health      = new DependentIndex("Salud", "Salud de " + name, healthValue);
        Happiness   = new DependentIndex("Felicidad", "Felicidad de " + name, happinessValue);
        LivingPlace = livingPlace;
        acceptedJob = new IndustrySector.AcceptedJob(new Coords(), Job.TYPE.NONE, 0, 0, 0, 999, CityPart.PLACE.CENTER);
        ResetDailySchedule();
    }
Ejemplo n.º 2
0
    public SCHEDULED_ACTIVITY[] ProcessDay() // TODO: Currently if the places where the citizen lives and works are different the time to travel
    {                                        // is calculated without taking into the consideration the TransportSector of the place where he worls
        ResetDailySchedule();                // All hours are set to NONE
        int lastWorkHour = -1;

        if (acceptedJob.JobType == Job.TYPE.NONE) // If the citizen is unenployed
        {
            acceptedJob = city.CityParts[(int)LivingPlace].IndustrySector.GetWorkOffer();
            if (acceptedJob.JobType == Job.TYPE.NONE) // If the citizen cannot find a job in his neightbourhood...
            {                                         // tries a second time. This time can be in any part of the city
                acceptedJob = city.CityParts[(int)LivingPlace].IndustrySector.GetWorkOffer();
            }
        }

        if (acceptedJob.JobType != Job.TYPE.NONE)               // If the citizen has a job
        {
            for (int i = 0; i < acceptedJob.TimeRequiered; i++) // Sets the working hours in the schedule
            {
                int j = acceptedJob.Enter + i;
                if (j > 23)
                {
                    j -= 24;
                }
                dailySchedule[j] = SCHEDULED_ACTIVITY.WORK;
            }

            // This parts calculates how mucha hours the citizen needs to travel to work
            int distanceToJob = 0;
            if (LivingPlace == acceptedJob.CityPlace)
            {
                distanceToJob += Math.Abs(acceptedJob.Coords.X - Home.X) + Math.Abs(acceptedJob.Coords.Y - Home.Y); // Manhatan distance
            }
            else
            {
                distanceToJob += acceptedJob.Coords.X + acceptedJob.Coords.Y + Home.X + Home.Y;
            }
            float enviromentalConmmitmentValue = Global.Values.citizenEnviromentalTransportPreferences[(int)enviromentalCommitment];
            int   transportHoursLimit          = Global.Values.citizenTransportTimePreferences[(int)timeManagement];
            if (transportHoursLimit > 24 - acceptedJob.TimeRequiered)
            {
                transportHoursLimit = 24 - acceptedJob.TimeRequiered;
            }
            float rand = Global.Methods.GetRandomPercentage();
            TransportSector.TransportPlan transportPlan;
            if (rand < enviromentalConmmitmentValue)  // If the citizen is pro-enviroment will probably choose the least polluting option
            {
                transportPlan =
                    city.CityParts[(int)LivingPlace].TransportSector.GetLeastPolluting(distanceToJob, transportHoursLimit);
            }
            else // otherwise will choose between safety and speed
            {
                if (Health.GetIndexState() < Index.STATE.MEDIUM)  // If the citizen's health is low, he will go for the safest option
                {
                    transportPlan =
                        city.CityParts[(int)LivingPlace].TransportSector.GetSafest(distanceToJob, transportHoursLimit);
                }
                else // if that's not the case, he will choose the fastest
                {
                    transportPlan =
                        city.CityParts[(int)LivingPlace].TransportSector.GeFastest(distanceToJob, transportHoursLimit);
                }
            }

            if (transportPlan.Transport == Transport.TYPE.NONE) // If the citizen can't go to work he gets sad, and A PANALTY
            {
                Happiness.ChangeIndexValue(Index.CHANGE.LOW_DROP);
                RemoveMoney(Global.Values.failingToWorkPenalty);
                ResetDailySchedule(); // If there is not transport there is not work either
            }
            else
            {   // Using the transport has a cost in health
                Health.ChangeIndexValue(-(1 - transportPlan.Safety));
                lastWorkHour = acceptedJob.Enter + acceptedJob.TimeRequiered;
            }

            // If the citizens has no transport plan (because there are not viable options) => transportPlan.TimeRequiered = -1
            for (int i = 1; i < transportPlan.TimeRequiered + 1; i++)  // Sets the moving to work hours in the schedule
            {
                int j = acceptedJob.Enter - i;
                if (j < 0)
                {
                    j += 24;
                }
                dailySchedule[j] = SCHEDULED_ACTIVITY.MOVE_TO_WORK;
            }

            acceptedJob.RemainingDays--;
            if (acceptedJob.RemainingDays < 0)  // The day 0 is included
            {
                acceptedJob = city.CityParts[(int)LivingPlace].IndustrySector.FreeWorkOffer(acceptedJob.Coords);
            }
        }

        LeisureSector.LeisurePlan leisurePlan = LeisureSector.GetNullPlan();
        if (Health.GetIndexState() > Index.STATE.LOW) // If the citizen is not sick he will try to have fun
        {
            int firstAvailableHour = lastWorkHour + 1;
            int lastAvailableHour  = acceptedJob.Enter - 1;
            if (lastWorkHour < 0)
            {
                firstAvailableHour = 0;
                lastAvailableHour  = 23;
            }

            float rand = Global.Methods.GetRandomPercentage();
            float moneyExpendingValue = Global.Values.citizenMoneyExpendingPreferences[(int)moneyManagement];
            if (rand < moneyExpendingValue)
            {
                leisurePlan = city.CityParts[(int)LivingPlace].LeisureSector.GetCheapestPlan(Nature, firstAvailableHour, lastAvailableHour);
            }
            else
            {
                leisurePlan = city.CityParts[(int)LivingPlace].LeisureSector.GetMostSatisfyingPlan(Nature, firstAvailableHour, lastAvailableHour);
            }
        }

        if (leisurePlan.Place != Leisure.PLACE.NONE)
        {
            RemoveMoney(leisurePlan.Cost);
            Happiness.ChangeIndexValue(leisurePlan.Satisfaction);

            for (int i = 0; i < leisurePlan.TimeExpended; i++)
            {
                int j = leisurePlan.Enter + i;
                if (j > 23)
                {
                    j -= 24;
                }
                dailySchedule[j] = SCHEDULED_ACTIVITY.HAVE_FUN;
            }
        }

        // If the citizen's schedule contains enough continious hours without activitys this ours become resting hours. Theese ones are healthy
        int continiousNoneActivutyHours = 0;
        int firstActivityHour           = -1;

        for (int i = 0; i < 24; i++)
        {
            SCHEDULED_ACTIVITY s = dailySchedule[i];
            if (s == SCHEDULED_ACTIVITY.NONE)
            {
                continiousNoneActivutyHours++;
            }
            else if (firstActivityHour < 0)
            {
                firstActivityHour = i;
            }
            if (continiousNoneActivutyHours == Global.Values.minContiniousHoursToRest)
            {
                for (int j = i; j > i - continiousNoneActivutyHours; j--)
                {
                    dailySchedule[j] = SCHEDULED_ACTIVITY.REST;
                }
                continiousNoneActivutyHours = 0;
            }
        }
        if (continiousNoneActivutyHours + firstActivityHour + 1 >= Global.Values.minContiniousHoursToRest && firstActivityHour + 1 < Global.Values.minContiniousHoursToRest)
        {
            for (int i = 0; i < continiousNoneActivutyHours + firstActivityHour + 1; i++)
            {
                int j = continiousNoneActivutyHours + i;
                if (j > 23)
                {
                    j -= 24;
                }
                dailySchedule[j] = SCHEDULED_ACTIVITY.REST;
            }
        }

        foreach (SCHEDULED_ACTIVITY s in dailySchedule)
        {
            if (s == SCHEDULED_ACTIVITY.REST)
            {
                Health.ChangeIndexValue(Global.Values.restingHourBonus);
            }
        }

        return(dailySchedule);
    }