OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
 
master @ 81 LINES
 
[ HISTORY ]  [ UP ]
 

{lib, inputs, ...}: let
  wowsimsDb = lib.importJSON "${inputs.wowsims}/assets/database/db.json";

  professionEnchantsByProfession = let
    enchantsByEffectId = lib.listToAttrs (map (enchant: {
      name = toString enchant.effectId;
      value = enchant;
    }) wowsimsDb.enchants);
  in {
    "Engineering" = lib.filter (e: e.requiredProfession or null == 4) wowsimsDb.en
chants;
    "Tailoring" = lib.filter (e: e.requiredProfession or null == 11) wowsimsDb.enc
hants;
    "Leatherworking" = lib.filter (e: e.requiredProfession or null == 8) wowsimsDb
.enchants;
    "Inscription" = lib.filter (e: e.requiredProfession or null == 6) wowsimsDb.en
chants;
    "Enchanting" = lib.filter (e: e.requiredProfession or null == 3) wowsimsDb.enc
hants;
  };

  professionEnchantEffectIds = lib.mapAttrs (prof: enchants:
    map (e: e.effectId) enchants
  ) professionEnchantsByProfession;
  # Remove trinkets from gearset (set slots 12-13 to empty objects)
  removeTrinkets = gearset:
    if !(gearset ? items)
    then gearset
    else
      gearset
      // {
        items =
          lib.imap0 (
            index: item:
              if index == 12 || index == 13
              then {}
              else item
          )
          gearset.items;
      };

  # Add a single trinket to slot 13 (index 12) of a gearset
  addTrinket = gearset: trinketId:
    if !(gearset ? items)
    then gearset
    else
      gearset
      // {
        items =
          lib.imap0 (
            index: item:
              if index == 12
              then {id = trinketId;}
              else item
          )
          gearset.items;
      };

  # Generate multiple gearsets with different trinkets
  # Takes a baseline gearset (should have no trinkets) and a list of trinket IDs
  # Returns a list of gearsets, each with one trinket in slot 13
  generateTrinketGearsets = baselineGearset: trinketIds:
    map (trinketId: addTrinket baselineGearset trinketId) trinketIds;

  # Remove profession-specific enchants from gearset
  # Note: This operates on raw equipment BEFORE enrichment, so item.enchant is jus
t a number (effectId)
  removeProfessionEnchants = gearset: professionName:
    if !(gearset ? items) || !(professionEnchantEffectIds ? ${professionName})
    then gearset
    else let
      enchantIds = professionEnchantEffectIds.${professionName};
      hasProfessionEnchant = item:
        (item ? enchant) && (builtins.elem item.enchant enchantIds);
    in
      gearset
      // {
        items = map (item:
          if hasProfessionEnchant item
          then builtins.removeAttrs item ["enchant"]
          else item
        ) gearset.items;
      };
in {
  inherit removeTrinkets addTrinket generateTrinketGearsets removeProfessionEnchan
ts;
}

{lib, inputs, ...}: let
  wowsimsDb = lib.importJSON "${inputs.wowsi
ms}/assets/database/db.json";

  professionEnchantsByProfession = let
    enchantsByEffectId = lib.listToAttrs (ma
p (enchant: {
      name = toString enchant.effectId;
      value = enchant;
    }) wowsimsDb.enchants);
  in {
    "Engineering" = lib.filter (e: e.require
dProfession or null == 4) wowsimsDb.enchants
;
    "Tailoring" = lib.filter (e: e.requiredP
rofession or null == 11) wowsimsDb.enchants;
    "Leatherworking" = lib.filter (e: e.requ
iredProfession or null == 8) wowsimsDb.encha
nts;
    "Inscription" = lib.filter (e: e.require
dProfession or null == 6) wowsimsDb.enchants
;
    "Enchanting" = lib.filter (e: e.required
Profession or null == 3) wowsimsDb.enchants;
  };

  professionEnchantEffectIds = lib.mapAttrs 
(prof: enchants:
    map (e: e.effectId) enchants
  ) professionEnchantsByProfession;
  # Remove trinkets from gearset (set slots 
12-13 to empty objects)
  removeTrinkets = gearset:
    if !(gearset ? items)
    then gearset
    else
      gearset
      // {
        items =
          lib.imap0 (
            index: item:
              if index == 12 || index == 13
              then {}
              else item
          )
          gearset.items;
      };

  # Add a single trinket to slot 13 (index 1
2) of a gearset
  addTrinket = gearset: trinketId:
    if !(gearset ? items)
    then gearset
    else
      gearset
      // {
        items =
          lib.imap0 (
            index: item:
              if index == 12
              then {id = trinketId;}
              else item
          )
          gearset.items;
      };

  # Generate multiple gearsets with differen
t trinkets
  # Takes a baseline gearset (should have no
 trinkets) and a list of trinket IDs
  # Returns a list of gearsets, each with on
e trinket in slot 13
  generateTrinketGearsets = baselineGearset:
 trinketIds:
    map (trinketId: addTrinket baselineGears
et trinketId) trinketIds;

  # Remove profession-specific enchants from
 gearset
  # Note: This operates on raw equipment BEF
ORE enrichment, so item.enchant is just a nu
mber (effectId)
  removeProfessionEnchants = gearset: profes
sionName:
    if !(gearset ? items) || !(professionEnc
hantEffectIds ? ${professionName})
    then gearset
    else let
      enchantIds = professionEnchantEffectId
s.${professionName};
      hasProfessionEnchant = item:
        (item ? enchant) && (builtins.elem i
tem.enchant enchantIds);
    in
      gearset
      // {
        items = map (item:
          if hasProfessionEnchant item
          then builtins.removeAttrs item ["e
nchant"]
          else item
        ) gearset.items;
      };
in {
  inherit removeTrinkets addTrinket generate
TrinketGearsets removeProfessionEnchants;
}
 
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET