/*
* Copyright (C) 2016 MegaMek team
*
* This file is part of MekHQ.
*
* MekHQ is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* MekHQ is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MekHQ. If not, see <http://www.gnu.org/licenses/>.
*/
package mekhq.campaign.handler;
import java.util.Calendar;
import megamek.common.Compute;
import megamek.common.event.Subscribe;
import mekhq.campaign.Campaign;
import mekhq.campaign.ExtraData;
import mekhq.campaign.event.NewDayEvent;
import mekhq.campaign.event.OptionsChangedEvent;
import mekhq.campaign.personnel.Person;
/**
* Event handler for all kind of XP calculations
*/
public class XPHandler {
private static final ExtraData.Key<Integer> NEXT_ADMIN_XP_DELAY = new ExtraData.IntKey("next_admin_xp_delay");
private int adminXP;
private int adminXPPeriod;
@Subscribe
public void campaignOptionsHandler(OptionsChangedEvent event) {
this.adminXP = event.getOptions().getAdminXP();
this.adminXPPeriod = event.getOptions().getAdminXPPeriod();
}
@Subscribe
public void processAdminXP(NewDayEvent event) {
final Campaign campaign = event.getCampaign();
if((adminXP <= 0) || (campaign.getCalendar().get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY)) {
return;
}
for (Person person : campaign.getPersonnel()) {
if (person.isAdminPrimary()) {
if(adminXPPeriod > 1) {
Integer weeksLeft = person.getExtraData().get(NEXT_ADMIN_XP_DELAY);
if(null == weeksLeft) {
// Assign a random value between 1 and the max
weeksLeft = Compute.randomInt(adminXPPeriod) + 1;
}
-- weeksLeft;
if(weeksLeft == 0) {
person.awardXP(adminXP);
weeksLeft = adminXPPeriod;
}
person.getExtraData().set(NEXT_ADMIN_XP_DELAY, weeksLeft);
} else {
person.awardXP(adminXP);
}
}
}
}
}