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)); }
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); }
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)); }
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; }
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); } } }