void testRemoveAllFrom() {
   EnumSet<SeaBird> likes = mPetrels;
   likes -= mPetrelProcellariidae;
   MOZ_ASSERT(likes.size() == 2);
   MOZ_ASSERT(likes.contains(DIVING_PETREL));
   MOZ_ASSERT(likes.contains(STORM_PETREL));
 }
 void testIntersect() {
   EnumSet<SeaBird> likes = mPetrels;
   likes &= mPetrelProcellariidae;
   MOZ_ASSERT(likes.size() == 2);
   MOZ_ASSERT(likes.contains(GADFLY_PETREL));
   MOZ_ASSERT(likes.contains(TRUE_PETREL));
 }
 void testRemove() {
   EnumSet<SeaBird> likes = mPetrels - TRUE_PETREL -
                            DIVING_PETREL;
   MOZ_ASSERT(likes.size() == 2);
   MOZ_ASSERT(likes.contains(GADFLY_PETREL));
   MOZ_ASSERT(likes.contains(STORM_PETREL));
 }
Exemple #4
0
string Item::getModifiers(bool shorten) const {
  EnumSet<AttrType> printAttr;
  if (!shorten) {
    for (auto attr : ENUM_ALL(AttrType))
      if (attributes->modifiers[attr] != 0)
        printAttr.insert(attr);
  } else
    switch (getClass()) {
      case ItemClass::RANGED_WEAPON:
        printAttr.insert(getRangedWeapon()->getDamageAttr());
        break;
      case ItemClass::WEAPON:
        printAttr.insert(getWeaponInfo().meleeAttackAttr);
        break;
      case ItemClass::ARMOR:
        printAttr.insert(AttrType::DEFENSE);
        break;
      default: break;
    }
  vector<string> attrStrings;
  for (auto attr : printAttr)
    attrStrings.push_back(withSign(attributes->modifiers[attr]) + (shorten ? "" : " " + ::getName(attr)));
  if (attributes->damageReduction > 0)
    attrStrings.push_back(toString(int(attributes->damageReduction * 100)) + "%");
  string attrString = combine(attrStrings, true);
  if (!attrString.empty())
    attrString = "(" + attrString + ")";
  if (attributes->uses > -1 && attributes->displayUses) 
    appendWithSpace(attrString, "(" + toString(attributes->uses) + " uses left)");
  return attrString;
}
 void testDuplicates() {
   EnumSet<SeaBird> likes = mPetrels;
   likes += GADFLY_PETREL;
   likes += TRUE_PETREL;
   likes += DIVING_PETREL;
   likes += STORM_PETREL;
   MOZ_ASSERT(likes.size() == 4);
   MOZ_ASSERT(likes == mPetrels);
 }
    void testUnion() {
      EnumSet<SeaBird> procellariidae = mPetrelProcellariidae +
                                        mNonPetrelProcellariidae;
      MOZ_ASSERT(procellariidae.size() == 5);

      // Both procellariidae and mPetrels include GADFLY_PETREL and TRUE_PETREL
      EnumSet<SeaBird> procellariiformes = mDiomedeidae + procellariidae +
                                           mPetrels;
      MOZ_ASSERT(procellariiformes.size() == 8);
    }
    void testCopy() {
      EnumSet<SeaBird> likes = mPetrels;
      likes -= TRUE_PETREL;
      MOZ_ASSERT(mPetrels.size() == 4);
      MOZ_ASSERT(mPetrels.contains(TRUE_PETREL));

      MOZ_ASSERT(likes.size() == 3);
      MOZ_ASSERT(likes.contains(GADFLY_PETREL));
      MOZ_ASSERT(likes.contains(DIVING_PETREL));
      MOZ_ASSERT(likes.contains(STORM_PETREL));
    }
    void testAddAll() {
      EnumSet<SeaBird> procellariidae;
      procellariidae += mPetrelProcellariidae;
      procellariidae += mNonPetrelProcellariidae;
      MOZ_ASSERT(procellariidae.size() == 5);

      // Both procellariidae and mPetrels include GADFLY_PERTEL and TRUE_PETREL
      EnumSet<SeaBird> procellariiformes;
      procellariiformes += mDiomedeidae;
      procellariiformes += procellariidae;
      procellariiformes += mPetrels;
      MOZ_ASSERT(procellariiformes.size() == 8);
    }
Exemple #9
0
void MapGui::drawFoWSprite(Renderer& renderer, Vec2 pos, int sizeX, int sizeY, EnumSet<Dir> dirs) {
  const Tile& tile = Tile::fromViewId(ViewId::FOG_OF_WAR); 
  const Tile& tile2 = Tile::fromViewId(ViewId::FOG_OF_WAR_CORNER); 
  Vec2 coord = tile.getSpriteCoord(dirs.intersection({Dir::N, Dir::S, Dir::E, Dir::W}));
  Vec2 sz = Renderer::tileSize[tile.getTexNum()];
  renderer.drawSprite(pos.x, pos.y, coord.x * sz.x, coord.y * sz.y, sz.x, sz.y,
      Renderer::tiles[tile.getTexNum()], sizeX, sizeY);
  for (Dir dir : dirs.intersection({Dir::NE, Dir::SE, Dir::NW, Dir::SW})) {
    switch (dir) {
      case Dir::NE: if (!dirs[Dir::N] || !dirs[Dir::E]) continue;
      case Dir::SE: if (!dirs[Dir::S] || !dirs[Dir::E]) continue;
      case Dir::NW: if (!dirs[Dir::N] || !dirs[Dir::W]) continue;
      case Dir::SW: if (!dirs[Dir::S] || !dirs[Dir::W]) continue;
      default: break;
    }
    Vec2 coord = tile2.getSpriteCoord({dir});
    renderer.drawSprite(pos.x, pos.y, coord.x * sz.x, coord.y * sz.y, sz.x, sz.y,
        Renderer::tiles[tile2.getTexNum()], sizeX, sizeY);
  }
}
 void testAdd() {
   EnumSet<SeaBird> seen = mPetrels + CORMORANT +
                                      STORM_PETREL;
   MOZ_ASSERT(mPetrels.size() == 4);
   MOZ_ASSERT(!mPetrels.contains(CORMORANT));
   MOZ_ASSERT(seen.size() == 5);
   MOZ_ASSERT(seen.contains(GADFLY_PETREL));
   MOZ_ASSERT(seen.contains(TRUE_PETREL));
   MOZ_ASSERT(seen.contains(DIVING_PETREL));
   MOZ_ASSERT(seen.contains(STORM_PETREL));
   MOZ_ASSERT(seen.contains(CORMORANT));
 }
Exemple #11
0
string Item::getModifiers(bool shorten) const {
  string artStr;
  if (attributes->artifactName) {
    artStr = *attributes->artifactName;
    if (!shorten)
      artStr = " named " + artStr;
  }
  EnumSet<ModifierType> printMod;
  switch (getClass()) {
    case ItemClass::WEAPON:
      printMod.insert(ModifierType::ACCURACY);
      printMod.insert(ModifierType::DAMAGE);
      break;
    case ItemClass::ARMOR:
      printMod.insert(ModifierType::DEFENSE);
      break;
    case ItemClass::RANGED_WEAPON:
    case ItemClass::AMMO:
      printMod.insert(ModifierType::FIRED_ACCURACY);
      break;
    default: break;
  }
  if (!shorten)
    for (auto mod : ENUM_ALL(ModifierType))
      if (attributes->modifiers[mod] != 0)
        printMod.insert(mod);
  vector<string> attrStrings;
  for (auto mod : printMod)
    attrStrings.push_back(withSign(attributes->modifiers[mod]) +
        (shorten ? "" : " " + Creature::getModifierName(mod)));
  if (!shorten)
    for (auto attr : ENUM_ALL(AttrType))
      if (attributes->attrs[attr] != 0)
        attrStrings.push_back(withSign(attributes->attrs[attr]) + " " + Creature::getAttrName(attr));
  string attrString = combine(attrStrings, true);
  if (!attrString.empty())
    attrString = " (" + attrString + ")";
  if (attributes->uses > -1 && attributes->displayUses) 
    attrString += " (" + toString(attributes->uses) + " uses left)";
  return artStr + attrString;
}
Exemple #12
0
void MapGui::drawObjectAbs(Renderer& renderer, int x, int y, const ViewObject& object,
    int sizeX, int sizeY, Vec2 tilePos) {
  if (object.hasModifier(ViewObject::Modifier::PLAYER)) {
    renderer.drawFilledRectangle(x, y, x + sizeX, y + sizeY, Color::Transparent, colors[ColorId::LIGHT_GRAY]);
  }
  if (object.hasModifier(ViewObject::Modifier::DRAW_MORALE))
    drawMorale(renderer, Rectangle(x, y, x + sizeX, y + sizeY), object.getAttribute(ViewObject::Attribute::MORALE));
  if (object.hasModifier(ViewObject::Modifier::TEAM_HIGHLIGHT)) {
    renderer.drawFilledRectangle(x, y, x + sizeX, y + sizeY, Color::Transparent, colors[ColorId::DARK_GREEN]);
  }
  const Tile& tile = Tile::getTile(object, spriteMode);
  Color color = Renderer::getBleedingColor(object);
  if (object.hasModifier(ViewObject::Modifier::INVISIBLE) || object.hasModifier(ViewObject::Modifier::HIDDEN))
    color = transparency(color, 70);
  else
    if (tile.translucent > 0)
      color = transparency(color, 255 * (1 - tile.translucent));
    else if (object.hasModifier(ViewObject::Modifier::ILLUSION))
      color = transparency(color, 150);
  if (object.hasModifier(ViewObject::Modifier::PLANNED))
    color = transparency(color, 100);
  double waterDepth = object.getAttribute(ViewObject::Attribute::WATER_DEPTH);
  if (waterDepth > 0) {
    int val = max(0.0, 255.0 - min(2.0, waterDepth) * 60);
    color = Color(val, val, val);
  }
  if (tile.hasSpriteCoord()) {
    Vec2 move;
    Vec2 sz = Renderer::tileSize[tile.getTexNum()];
    Vec2 off = (Renderer::nominalSize -  sz).mult(Vec2(sizeX, sizeY)).div(Renderer::nominalSize * 2);
    int width = sz.x * sizeX / Renderer::nominalSize.x;
    int height = sz.y* sizeY / Renderer::nominalSize.y;
    if (sz.y > Renderer::nominalSize.y)
      off.y *= 2;
    EnumSet<Dir> dirs;
    EnumSet<Dir> borderDirs;
    if (!object.hasModifier(ViewObject::Modifier::PLANNED))
      if (auto connectionId = getConnectionId(object))
        for (Vec2 dir : getConnectionDirs(object.id())) {
          if (tileConnects(*connectionId, tilePos + dir))
            dirs.insert(dir.getCardinalDir());
          else
            borderDirs.insert(dir.getCardinalDir());
        }
    Vec2 coord = tile.getSpriteCoord(dirs);
    if (object.hasModifier(ViewObject::Modifier::MOVE_UP))
      move.y = -4* sizeY / Renderer::nominalSize.y;
    if ((object.layer() == ViewLayer::CREATURE && object.id() != ViewId::BOULDER)
        || object.hasModifier(ViewObject::Modifier::ROUND_SHADOW)) {
      renderer.drawSprite(x, y - 2, 2 * Renderer::nominalSize.x, 22 * Renderer::nominalSize.y,
          Renderer::nominalSize.x, Renderer::nominalSize.y, Renderer::tiles[0],
          min(Renderer::nominalSize.x, width), min(Renderer::nominalSize.y, height));
      move.y = -4* sizeY / Renderer::nominalSize.y;
    }
    if (auto background = tile.getBackgroundCoord()) {
      renderer.drawSprite(x + off.x, y + off.y, background->x * sz.x,
          background->y * sz.y, sz.x, sz.y, Renderer::tiles[tile.getTexNum()], width, height, color);
      if (shadowed.count(tilePos))
        renderer.drawSprite(x, y, 1 * Renderer::nominalSize.x, 21 * Renderer::nominalSize.y,
            Renderer::nominalSize.x, Renderer::nominalSize.y, Renderer::tiles[5], width, height);
    }
    if (coord.x < 0)
      return;
    if (auto dir = object.getAttachmentDir())
      move = getAttachmentOffset(*dir, width, height);
    renderer.drawSprite(x + off.x + move.x, y + move.y + off.y, coord.x * sz.x,
        coord.y * sz.y, sz.x, sz.y, Renderer::tiles[tile.getTexNum()], width, height, color);
    if (tile.hasCorners()) {
      for (Vec2 coord : tile.getCornerCoords(dirs))
        renderer.drawSprite(x + off.x + move.x, y + move.y + off.y, coord.x * sz.x,
            coord.y * sz.y, sz.x, sz.y, Renderer::tiles[tile.getTexNum()], width, height, color);
    }
    if (tile.floorBorders) {
      drawFloorBorders(renderer, borderDirs, x, y);
    }
    if (contains({ViewLayer::FLOOR, ViewLayer::FLOOR_BACKGROUND}, object.layer()) && 
        shadowed.count(tilePos) && !tile.noShadow)
      renderer.drawSprite(x, y, 1 * Renderer::nominalSize.x, 21 * Renderer::nominalSize.y,
          Renderer::nominalSize.x, Renderer::nominalSize.y, Renderer::tiles[5], width, height);
    if (object.getAttribute(ViewObject::Attribute::BURNING) > 0) {
      renderer.drawSprite(x, y, Random.get(10, 12) * Renderer::nominalSize.x, 0 * Renderer::nominalSize.y,
          Renderer::nominalSize.x, Renderer::nominalSize.y, Renderer::tiles[2], width, height);
    }
    if (object.hasModifier(ViewObject::Modifier::LOCKED))
      renderer.drawSprite(x + (Renderer::nominalSize.x - Renderer::tileSize[3].x) / 2, y,
          5 * Renderer::tileSize[3].x, 6 * Renderer::tileSize[3].y,
          Renderer::tileSize[3].x, Renderer::tileSize[3].y, Renderer::tiles[3], width / 2, height / 2);
  } else {
    renderer.drawText(tile.symFont ? Renderer::SYMBOL_FONT : Renderer::TILE_FONT, sizeY, Tile::getColor(object),
        x + sizeX / 2, y - 3, tile.text, true);
    double burningVal = object.getAttribute(ViewObject::Attribute::BURNING);
    if (burningVal > 0) {
      renderer.drawText(Renderer::SYMBOL_FONT, sizeY, getFireColor(), x + sizeX / 2, y - 3, L'ѡ', true);
      if (burningVal > 0.5)
        renderer.drawText(Renderer::SYMBOL_FONT, sizeY, getFireColor(), x + sizeX / 2, y - 3, L'Ѡ', true);
    }
  }
}