public Behaviour jobFor(Actor actor) {
    if ((! structure.intact()) || (! personnel.onShift(actor))) return null ;
    final Choice choice = new Choice(actor) ;
    final float powerCut = stocks.shortagePenalty(POWER) * 5 ;
    final int
      loomBonus = (5 * structure.upgradeLevel(POLYMER_LOOM)) / 2,
      bondBonus = 1 + structure.upgradeLevel(ORGANIC_BONDING) ;
    
    final Manufacture o = stocks.nextSpecialOrder(actor) ;
    if (o != null) {
      if (o.made().type == DECOR) {
        o.checkBonus = (5 * structure.upgradeLevel(DESIGN_STUDIO)) / 2 ;
        if (stocks.amountOf(TROPHIES) > 0) o.checkBonus += bondBonus / 2 ;
      }
      else if (o.made().type == FINERY) {
        o.checkBonus = structure.upgradeLevel(CUTTING_FLOOR) + 2 ;
        o.checkBonus += (1 + structure.upgradeLevel(DESIGN_STUDIO)) / 2 ;
      }
      else {
        o.checkBonus = structure.upgradeLevel(CUTTING_FLOOR) + 2 ;
        o.checkBonus += structure.upgradeLevel(POLYMER_LOOM) ;
      }
      o.checkBonus -= powerCut ;
      o.timeMult = 5 ;
      choice.add(o) ;
    }
    
    final Manufacture m = stocks.nextManufacture(actor, CARBS_TO_PLASTICS) ;
    if (m != null) {
      m.checkBonus = (loomBonus / 2) + bondBonus ;
      m.checkBonus -= powerCut ;
      choice.add(m) ;
    }
    
    return choice.weightedPick() ;
  }