Exemplo n.º 1
0
  @Override
  public int getChance(int unitType, Pilot pilot) {
    if (pilot.getSkills().has(this)) {
      return 0;
    }

    String chance = "chancefor" + getAbbreviation() + "for" + Unit.getTypeClassDesc(unitType);

    SHouse house = CampaignMain.cm.getHouseFromPartialString(pilot.getCurrentFaction());

    if (house == null) {
      return CampaignMain.cm.getIntegerConfig(chance);
    }

    return house.getIntegerConfig(chance);
  }
Exemplo n.º 2
0
  public void process(StringTokenizer command, String Username) {

    if (accessLevel != 0) {
      int userLevel = CampaignMain.cm.getServer().getUserLevel(Username);
      if (userLevel < getExecutionLevel()) {
        CampaignMain.cm.toUser(
            "AM:Insufficient access level for command. Level: "
                + userLevel
                + ". Required: "
                + accessLevel
                + ".",
            Username,
            true);
        return;
      }
    }

    /*
     * A command which builds a new mech for a player if: 1)he has enough
     * money and influence, and the room in which to place a new unit 2)the
     * given factory is open to make that weight unit, and the PP to do so
     *
     * Note that players may define the planet they want to produce with, if
     * not, the planet is selected at random from the avaliable pool of
     * producing planets. This is in order to allow players to select world
     * with specific tech biases, or specific faction tables, if they so
     * desire (ie - a Marik really wants a unit from that captured Steiner
     * assault world).
     *
     * USAGE: /c request#Weighclass#Unit Type#Planet#Factory Name - Planet &
     * Factory are optional, but fac must be given if a planet is given
     */

    // get the player
    SPlayer p = CampaignMain.cm.getPlayer(Username);

    // set some defaults ...
    SPlanet planet = null;
    SUnitFactory factory = null;
    boolean needsMoreTechs = false; // used to make clickthrough

    String result = "";

    // get the requested weightclass
    String weightstring = command.nextToken();

    // check to see if the player is in SOL and trying to get new units
    if (p.getMyHouse().isNewbieHouse()) {

      if (weightstring.equals("resetunits")) {
        NewbieHouse nh = (NewbieHouse) p.getMyHouse();
        CampaignMain.cm.toUser(nh.requestNewMech(p, false, null), Username, true);
        return;
      }

      // else
      result =
          CampaignMain.cm.getConfig("NewbieHouseName")
              + " players may not purchase new units; however, they may reset their units.";
      result +=
          "<br><a href=\"MEKWARS/c request#resetunits\">Click here to request a reset of your units.</a>";
      CampaignMain.cm.toUser(result, Username, true);
      return;
    }

    // boot the player's request if he has unmaintained units
    if (p.hasUnmaintainedUnit()) {
      CampaignMain.cm.toUser(
          "AM:Your faction refuses to assign new units to you force while units in your hangar are unmaintained!",
          Username,
          true);
      return;
    }

    // if the player qualifies for welfare, give him a unit.
    if (p.mayAcquireWelfareUnits()) {
      SHouse house = p.getMyHouse();
      SUnit unit = buildWelfareMek(house.getName());

      SPilot pilot = house.getNewPilot(unit.getType());
      unit.setPilot(pilot);
      p.addUnit(unit, true);
      CampaignMain.cm.toUser(
          "AM:High Command has given you a new unit from its welfare rolls to help you get back on your feet!",
          Username,
          true);
      if (CampaignMain.cm.isKeepingUnitHistory()) {
        CampaignMain.cm.MySQL.addHistoryEntry(
            HistoryHandler.HISTORY_TYPE_UNIT,
            unit.getDBId(),
            HistoryHandler.UNIT_CREATED,
            unit.getProducer());
        CampaignMain.cm.MySQL.addHistoryEntry(
            HistoryHandler.HISTORY_TYPE_UNIT,
            unit.getDBId(),
            HistoryHandler.UNIT_PRODUCED_BY_WELFARE,
            "Activated from garrison duty and assigned to combat duty.");
        CampaignMain.cm.MySQL.addHistoryEntry(
            HistoryHandler.HISTORY_TYPE_PILOT,
            pilot.getDBId(),
            HistoryHandler.PILOT_ASSIGNED,
            "Assigned to " + unit.getModelName());
        CampaignMain.cm.MySQL.addHistoryEntry(
            HistoryHandler.HISTORY_TYPE_UNIT,
            unit.getDBId(),
            HistoryHandler.PILOT_ASSIGNED,
            pilot.getName() + " assigned to unit");
      }
      return;
    }

    int weightclass;
    try { // try as an int (eg - 4 for assault)
      weightclass = Integer.parseInt(weightstring);
    } catch (Exception ex) { // formatting error. look for a string.
      weightclass = Unit.getWeightIDForName(weightstring.toUpperCase());
    }

    // get the requested unit type
    int type_id = Unit.MEK; // default to Mek
    String typestring = command.nextToken();
    try { // try as int
      type_id = Integer.parseInt(typestring);
    } catch (Exception ex) { // ex, so retry as string
      type_id = Unit.getTypeIDForName(typestring);
    }

    // break out if player lacks experience to buy weightclass
    if (!p.mayUse(weightclass)) {
      CampaignMain.cm.toUser(
          "AM:You are not experienced enough to use "
              + Unit.getWeightClassDesc(weightclass)
              + " units.",
          Username,
          true);
      return;
    }

    if (!Boolean.parseBoolean(
        p.getSubFaction()
            .getConfig(
                "CanBuyNew"
                    + Unit.getWeightClassDesc(weightclass)
                    + Unit.getTypeClassDesc(type_id)))) {
      CampaignMain.cm.toUser(
          "AM:Sorry as a member of "
              + p.getSubFactionName()
              + " you are unable to purchase this unit.",
          Username);
      return;
    }

    if (!p.hasRoomForUnit(type_id, weightclass)) {
      CampaignMain.cm.toUser(
          "AM:Sorry, you already have the maximum number of "
              + Unit.getWeightClassDesc(weightclass)
              + " "
              + Unit.getTypeClassDesc(type_id)
              + "s",
          Username);
      return;
    }

    /*
     * Check to see if a planet and factory names are specified. If they
     * are, fetch the planet and factory and make sure the user entered a
     * legal combo.
     */
    String planetName = "";
    String factoryName = "";

    if (command.hasMoreElements()) {

      planetName = command.nextToken();
      planet = (SPlanet) CampaignMain.cm.getData().getPlanetByName(planetName);
      if (planet == null) {
        CampaignMain.cm.toUser("AM:Could not find planet: " + planetName + ".", Username, true);
        return;
      }

      // make sure the player's faction owns the world
      if (!planet.getOwner().equals(p.getMyHouse())) {
        CampaignMain.cm.toUser(
            "AM:Your faction does not control " + planetName + ".", Username, true);
        return;
      }

      // make sure the planet makes units of the desired weightclass
      if (planet.getFactoriesOfWeighclass(weightclass).size() == 0) {
        CampaignMain.cm.toUser(
            planetName + " does not produce units of the weight class specified.", Username, true);
        return;
      }

      // check for a factory name token
      try {
        factoryName = command.nextToken();
      } catch (NoSuchElementException e) {
        CampaignMain.cm.toUser(
            "AM:You requested a unit from "
                + planetName
                + ", but did not specifiy which factory to use.",
            Username,
            true);
        return;
      }

      // make sure the named factory exists
      Vector<SUnitFactory> namedFactories = planet.getFactoriesByName(factoryName);
      if (namedFactories.size() == 0) {
        CampaignMain.cm.toUser(
            "AM:There is no " + factoryName + " on " + planetName + ".", Username, true);
        return;
      }

      /*
       * make sure one of the named factories produces units of the right
       * size NOTE: Because of how this is being done, the same name can
       * be used for more than one factory on a planet, but only if
       * they're produce unique weightclasses. Any name duping in a
       * weightclass will cause odd behaviour.
       */
      for (SUnitFactory currFac : namedFactories) {

        if (currFac.getWeightclass() == weightclass) {
          factory = currFac;
          break;
        }
      }
      if (factory == null) {
        CampaignMain.cm.toUser(
            factoryName
                + " on "
                + planetName
                + " does not produce units of the requested weightclass.",
            Username,
            true);
        return;
      }

      if (factory.getAccessLevel() > p.getSubFactionAccess()) {
        CampaignMain.cm.toUser(
            "You do not have sufficient rank to purchase a unit from "
                + factoryName
                + " on "
                + planetName
                + ".",
            Username);
        return;
      }

      // make sure the named factory can produce the requested type
      if (!factory.canProduce(type_id)) {
        CampaignMain.cm.toUser(
            factoryName + " on " + planetName + " does not produce units of the requested type.",
            Username,
            true);
        return;
      }

      // return if the factory is refreshing
      if (factory.getTicksUntilRefresh() > 0) {
        CampaignMain.cm.toUser(
            factoryName
                + " is currently refreshing. "
                + factory.getTicksUntilRefresh()
                + " miniticks remaining.",
            Username,
            true);
        return;
      }
    }

    /*
     * No more tokens were given. Pick a random factory from those which
     * originally belonged to the the faction. If we cannot find a factory,
     * we should return a failure.
     */
    else {
      factory = p.getMyHouse().getNativeFactoryForProduction(type_id, weightclass, true);
      if (factory != null) {
        planet = factory.getPlanet();
      }
    }
    if (planet == null || factory == null) {
      CampaignMain.cm.toUser(
          "AM:No "
              + p.getMyHouse().getName()
              + " factory is available to fill your order at this time (Click on icon in House Status to use captured factories).",
          Username,
          true);
      return;
    }

    // get prices for the unit
    int mechCbills = factory.getPriceForUnit(weightclass, type_id);
    int mechInfluence = factory.getInfluenceForUnit(weightclass, type_id);
    int mechPP = factory.getPPCost(weightclass, type_id);

    // adjust by multipliers if this is a non-original owner.
    SHouse playerHouse = p.getMyHouse();
    if (!factory.getFounder().equalsIgnoreCase(playerHouse.getName())) {
      mechCbills =
          Math.round(mechCbills * CampaignMain.cm.getFloatConfig("NonOriginalCBillMultiplier"));
      mechInfluence =
          Math.round(
              mechInfluence * CampaignMain.cm.getFloatConfig("NonOriginalInfluenceMultiplier"));
      mechPP =
          Math.round(mechPP * CampaignMain.cm.getFloatConfig("NonOriginalComponentMultiplier"));
    }

    // Add penalty if the player is over a sliding limit
    if (p.willHaveHangarPenalty(type_id, weightclass)) {
      int costPenalty = p.calculateHangarPenaltyForNextPurchase(type_id, weightclass);
      mechCbills += costPenalty;
    }

    // reduce flu cost to ceiling if over
    if (mechInfluence > CampaignMain.cm.getIntegerConfig("InfluenceCeiling")) {
      mechInfluence = CampaignMain.cm.getIntegerConfig("InfluenceCeiling");
    }

    // check to see if the player & house can afford the unit
    boolean hasEnoughMoney = false;
    boolean hasEnoughInfluence = false;
    boolean factionHasEnoughPP = false;

    if (p.getMoney() >= mechCbills) {
      hasEnoughMoney = true;
    }
    if (p.getInfluence() >= mechInfluence) {
      hasEnoughInfluence = true;
    }
    if (playerHouse.getPP(weightclass, type_id) >= mechPP) {
      factionHasEnoughPP = true;
    }

    if (hasEnoughMoney && hasEnoughInfluence && factionHasEnoughPP) {

      // check to make sure the player has enough support for the unit
      // requested
      int spaceTaken =
          SUnit.getHangarSpaceRequired(type_id, weightclass, 0, "null", p.getMyHouse());
      if (spaceTaken > p.getFreeBays()) {
        needsMoreTechs = true;
      }

      // find out if your are using advanced repair if so buy bays instead
      // of hiring techs.
      boolean useBays = CampaignMain.cm.isUsingAdvanceRepair();

      // if the player needs more techs/bays, make a compound link and
      // return
      if (needsMoreTechs) {

        int techCost = p.getTechHiringFee();
        if (useBays) {
          techCost = CampaignMain.cm.getIntegerConfig("CostToBuyNewBay");
        }

        int numTechs = spaceTaken - p.getFreeBays();
        techCost = techCost * numTechs;
        int totalCost = techCost + mechCbills;
        StringBuilder toSend = new StringBuilder();

        // if the player can't afford to pay for more support, tell him
        // so and return w/o a link.
        if (totalCost > p.getMoney()) {

          toSend.append(
              "AM:Command will not release a new unit to you unless support is in place; however, you cannot afford to buy the unit *and* ");
          if (useBays) {
            toSend.append(" purchase the necessary bayspace");
          } else {
            toSend.append(" hire technicians");
          }
          toSend.append(
              ". The total cost would be "
                  + CampaignMain.cm.moneyOrFluMessage(true, true, totalCost)
                  + ", but you only have "
                  + CampaignMain.cm.moneyOrFluMessage(true, true, p.getMoney())
                  + ".");

          CampaignMain.cm.toUser(toSend.toString(), Username, true);
          return;
        }

        toSend.append(
            "AM:Quartermaster command will not send a new unit to your force until support resources are in place. You will need to ");
        if (useBays) {
          toSend.append("purchase " + numTechs + " more bays");
        } else {
          toSend.append("hire " + numTechs + " more technicians");
        }

        toSend.append(
            " at a cost of "
                + CampaignMain.cm.moneyOrFluMessage(true, true, techCost)
                + ". Combined cost of the new unit and necessary ");
        if (useBays) {
          toSend.append("bays");
        } else {
          toSend.append("techs");
        }
        toSend.append(
            " is "
                + CampaignMain.cm.moneyOrFluMessage(true, true, (mechCbills + techCost))
                + " and "
                + CampaignMain.cm.moneyOrFluMessage(false, true, mechInfluence)
                + ".");
        toSend.append(
            "<br><a href=\"MEKWARS/c hireandrequestnew#"
                + numTechs
                + "#"
                + Unit.getWeightClassDesc(weightclass)
                + "#"
                + type_id
                + "#"
                + planet.getName()
                + "#"
                + factory.getName()
                + "\">Click here to purchase both the unit and the needed support.</a>");

        CampaignMain.cm.toUser(toSend.toString(), Username, true);

        return;
      }

      SPilot pilot = playerHouse.getNewPilot(type_id);
      CampaignData.mwlog.dbLog(
          "Pulled pilot: " + pilot.toFileFormat("$", false) + " (DBId: " + pilot.getDBId() + ")");

      if (CampaignMain.cm.isUsingMySQL()) {
        pilot.toDB(type_id, -1);
      }

      CampaignData.mwlog.dbLog(
          "Pilot saved: " + pilot.toFileFormat("$", false) + " (DBId: " + pilot.getDBId() + ")");

      Vector<SUnit> mechs = factory.getMechProduced(type_id, pilot);
      StringBuffer results = new StringBuffer();
      if (playerHouse.getBooleanConfig("UseCalculatedCosts")) {
        mechCbills = 0;
      }
      for (SUnit mech : mechs) {
        if (playerHouse.getBooleanConfig("UseCalculatedCosts")) {
          double unitCost = mech.getEntity().getCost(false);
          if (unitCost < 1) {
            unitCost = playerHouse.getPriceForUnit(mech.getWeightclass(), mech.getType());
          }
          double costMod = playerHouse.getDoubleConfig("CostModifier");

          mechCbills += (int) Math.round(unitCost * costMod);
          if (mechCbills > p.getMoney()) {
            CampaignMain.cm.toUser(
                "You could not afford the selected unit. Please try again", Username);
            return;
          }
        }

        if (CampaignMain.cm.getBooleanConfig("AllowPersonalPilotQueues")
            && mech.isSinglePilotUnit()) {
          SPilot pilot1 = (SPilot) mech.getPilot();
          SPilot pilot2 = new SPilot("Vacant", 99, 99);
          mech.setPilot(pilot2);

          if (!pilot1.getName().equalsIgnoreCase("Vacant")) {
            playerHouse.getPilotQueues().addPilot(mech.getType(), pilot1, true);
          }
        }

        p.addUnit(mech, true); // give the actual unit...
        results.append(mech.getModelName());
        results.append(", ");

        // Add unit history, if it's being kept
        if (CampaignMain.cm.isKeepingUnitHistory()) {
          CampaignMain.cm.MySQL.addHistoryEntry(
              HistoryHandler.HISTORY_TYPE_UNIT,
              mech.getDBId(),
              HistoryHandler.UNIT_CREATED,
              mech.getProducer());
          CampaignMain.cm.MySQL.addHistoryEntry(
              HistoryHandler.HISTORY_TYPE_UNIT,
              mech.getDBId(),
              HistoryHandler.UNIT_BOUGHT_FROM_FACTORY,
              "Purchased from " + factory.getName() + " on " + factory.getPlanet().getName());
        }
      }

      results.delete(results.length() - 2, results.length());
      p.addMoney(-mechCbills); // then take away money
      p.addInfluence(-mechInfluence); // and take away influence

      // we're going to build the unit. set up a houseupdate string.
      StringBuilder hsUpdates = new StringBuilder();

      // set the refresh miniticks
      hsUpdates.append(
          factory.addRefresh(
              (CampaignMain.cm.getIntegerConfig(
                          Unit.getWeightClassDesc(factory.getWeightclass()) + "Refresh")
                      * 100)
                  / factory.getRefreshSpeed(),
              false));
      hsUpdates.append(playerHouse.addPP(weightclass, type_id, -mechPP, false)); // remove
      // PP
      // from
      // the
      // faction

      result = "AM:You've been granted the following " + results.toString() + ". (-";
      result +=
          CampaignMain.cm.moneyOrFluMessage(true, false, mechCbills)
              + " / -"
              + CampaignMain.cm.moneyOrFluMessage(false, true, mechInfluence)
              + ")";
      CampaignData.mwlog.mainLog(
          p.getName()
              + " bought the following "
              + results.toString()
              + " from "
              + factory.getName()
              + " on "
              + planet.getName());
      CampaignMain.cm.toUser(result, Username, true);
      CampaignMain.cm.doSendHouseMail(
          playerHouse,
          "NOTE",
          p.getName()
              + " bought the following "
              + results.toString()
              + " from "
              + factory.getName()
              + " on "
              + planet.getName()
              + "!");

      // send update to all players
      CampaignMain.cm.doSendToAllOnlinePlayers(playerHouse, "HS|" + hsUpdates.toString(), false);

      return;
    } // end if(enough money/influence/pp)
    else if (!hasEnoughMoney || !hasEnoughInfluence) { // tell the player
      // what he needs to
      // buy the unit
      result =
          "AM:You need at least "
              + CampaignMain.cm.moneyOrFluMessage(true, false, mechCbills)
              + " and "
              + CampaignMain.cm.moneyOrFluMessage(false, true, mechInfluence)
              + " to request a "
              + Unit.getTypeClassDesc(type_id)
              + " of this weight class from a factory.";
      CampaignMain.cm.toUser(result, Username, true);
      return; // break out ...
    } // end else(player has too few money or too little Influence)
    else if (!factionHasEnoughPP) { // tell the player that the faction needs
      // more PP
      result =
          "AM:Your faction does not have the components needed to produce such a unit at this time. Wait for your faction to gather more resources.";
      CampaignMain.cm.toUser(result, Username, true);
      return; // break out ...
    } // end else (not enough PP in faction)
  } // end process()