├── src ├── assets │ ├── .gitignore │ └── img │ │ ├── 226.png │ │ ├── 227.png │ │ ├── 431.png │ │ ├── 432.png │ │ ├── 433.png │ │ ├── 434.png │ │ ├── 435.png │ │ ├── 436.png │ │ ├── 437.png │ │ ├── 438.png │ │ ├── 439.png │ │ ├── 440.png │ │ ├── 441.png │ │ ├── 442.png │ │ ├── 443.png │ │ ├── 444.png │ │ ├── 445.png │ │ ├── 446.png │ │ ├── 447.png │ │ ├── 448.png │ │ ├── 449.png │ │ ├── 450.png │ │ ├── 451.png │ │ ├── 452.png │ │ ├── 453.png │ │ ├── 454.png │ │ ├── 455.png │ │ ├── 456.png │ │ ├── 457.png │ │ ├── 458.png │ │ ├── 459.png │ │ ├── 460.png │ │ ├── 461.png │ │ ├── 462.png │ │ ├── 463.png │ │ ├── 464.png │ │ ├── 465.png │ │ ├── 466.png │ │ ├── 467.png │ │ ├── 468.png │ │ ├── 469.png │ │ ├── 470.png │ │ ├── 471.png │ │ ├── 472.png │ │ ├── 473.png │ │ ├── 474.png │ │ ├── 475.png │ │ ├── 476.png │ │ ├── 477.png │ │ ├── 478.png │ │ ├── 479.png │ │ ├── 496.png │ │ ├── 497.png │ │ ├── 498.png │ │ ├── 499.png │ │ ├── 500.png │ │ ├── 501.png │ │ ├── 502.png │ │ ├── 503.png │ │ ├── 504.png │ │ ├── 505.png │ │ ├── 507.png │ │ ├── 508.png │ │ ├── 509.png │ │ ├── 510.png │ │ ├── 511.png │ │ ├── 512.png │ │ ├── 513.png │ │ ├── 514.png │ │ ├── Booms.png │ │ ├── Logs.png │ │ ├── THE S.png │ │ ├── A Stick.png │ │ ├── Hamlet.png │ │ ├── Stapler.png │ │ ├── The D20.png │ │ ├── The D8.png │ │ ├── The Key.png │ │ ├── Wee pin.png │ │ ├── 69 Charm.png │ │ ├── A Bald Egg.png │ │ ├── A Bandana.png │ │ ├── A Beanie.png │ │ ├── A Bed Rock.png │ │ ├── A Garrote.png │ │ ├── A Manhole.png │ │ ├── A Pet Rock.png │ │ ├── A Rocket.png │ │ ├── A Triangle.png │ │ ├── A Walkman.png │ │ ├── Amplifier.png │ │ ├── Chef's Hat.png │ │ ├── Cloth Hat.png │ │ ├── Clown Hat.png │ │ ├── Dunce Cap.png │ │ ├── Edgy Chest.png │ │ ├── Edgy Pants.png │ │ ├── Fanny Pack.png │ │ ├── Gaudy Hat.png │ │ ├── Gross Ring.png │ │ ├── King Looty.png │ │ ├── Mega Boots.png │ │ ├── Mega Chest.png │ │ ├── Mossy Ring.png │ │ ├── Neck Bolts.png │ │ ├── No Pants.png │ │ ├── Not Drugs.png │ │ ├── Nunchuks.png │ │ ├── Office Hat.png │ │ ├── Paper Fan.png │ │ ├── Party Hat.png │ │ ├── Rock Candy.png │ │ ├── Space Gun.png │ │ ├── THE CUBE.png │ │ ├── The Joker.png │ │ ├── The Pen-Is.png │ │ ├── Tommy Gun.png │ │ ├── Trap Pants.png │ │ ├── A Broomstick.png │ │ ├── A Cream Pie.png │ │ ├── A Gas Giant.png │ │ ├── A Power Pill.png │ │ ├── A Red Shirt.png │ │ ├── A Skateboard.png │ │ ├── Alarm Clock.png │ │ ├── Assful Chaps.png │ │ ├── Asslest Vest.png │ │ ├── Bearded Axe.png │ │ ├── Bell Bottoms.png │ │ ├── Broken Drum.png │ │ ├── Cement Boots.png │ │ ├── Chef's Apron.png │ │ ├── Chess Plate.png │ │ ├── Cloth Boots.png │ │ ├── Cloth Shirt.png │ │ ├── Cool Shades.png │ │ ├── Crappy Boots.png │ │ ├── Cursed Ring.png │ │ ├── Disco Shirt.png │ │ ├── Dragon Wings.png │ │ ├── Edgy Helmet.png │ │ ├── Edgy Jaw Axe.png │ │ ├── Eye of ELXU.png │ │ ├── Forest Boots.png │ │ ├── Fuzzy Boots.png │ │ ├── Gaudy Boots.png │ │ ├── Gaudy Pants.png │ │ ├── Gaudy Shirt.png │ │ ├── Hat of Greed.png │ │ ├── Havarti Ring.png │ │ ├── Kokiri Blade.png │ │ ├── Mega Helmet.png │ │ ├── Mobster Hat.png │ │ ├── Mobster Vest.png │ │ ├── Mole Hammer.png │ │ ├── Nerdy Shoes.png │ │ ├── Office Pants.png │ │ ├── Office Shirt.png │ │ ├── Office Shoes.png │ │ ├── Pizza Boots.png │ │ ├── Rusty Sword.png │ │ ├── Slimy Boots.png │ │ ├── Slimy Chest.png │ │ ├── Slimy Helmet.png │ │ ├── Slimy Pants.png │ │ ├── Slinky Boots.png │ │ ├── Space Boots.png │ │ ├── Space Helmet.png │ │ ├── Spooky Sword.png │ │ ├── Stealthy Hat.png │ │ ├── The Number 7.png │ │ ├── Violin Case.png │ │ ├── 'The Cricket'.png │ │ ├── A 10 Litre Hat.png │ │ ├── A 9mm Beretta.png │ │ ├── A Bag of Trash.png │ │ ├── A Battle Corgi.png │ │ ├── A Crappy Tutu.png │ │ ├── A Giant Apple.png │ │ ├── A Giant Bazooka.png │ │ ├── A Giant Scythe.png │ │ ├── A Pink Bandana.png │ │ ├── A Regular Tie.png │ │ ├── A Rolling Pin.png │ │ ├── A Rolling Stone.png │ │ ├── A Small Gerbil.png │ │ ├── Anime Figurine.png │ │ ├── Anime Hero Wig.png │ │ ├── BOTH Edgy Boots.png │ │ ├── Badly Drawn Gun.png │ │ ├── Bloody Cleaver.png │ │ ├── Brass Knuckles.png │ │ ├── Cheddar Amulet.png │ │ ├── Chocolate Boots.png │ │ ├── Chocolate Chest.png │ │ ├── Chocolate Pants.png │ │ ├── Circle Helmet.png │ │ ├── Clockwork Boots.png │ │ ├── Clockwork Chest.png │ │ ├── Clockwork Hat.png │ │ ├── Clockwork Pants.png │ │ ├── Cloth Leggings.png │ │ ├── Combat Cheese.png │ │ ├── Cracked Amulet.png │ │ ├── Crappy Helmet.png │ │ ├── Crappy Leggings.png │ │ ├── Dorky Glasses.png │ │ ├── Emperor Looty.png │ │ ├── Empty Head Slot.png │ │ ├── Forest Helmet.png │ │ ├── Forest Leggings.png │ │ ├── Forest Pendant.png │ │ ├── Ghostly Chest.png │ │ ├── Gossamer Chest.png │ │ ├── Infinity Charm.png │ │ ├── Leather Jacket.png │ │ ├── Left Edgy Boot.png │ │ ├── Left Fairy Wing.png │ │ ├── Limburger Boots.png │ │ ├── Magitech Amulet.png │ │ ├── Magitech Blade.png │ │ ├── Magitech Boots.png │ │ ├── Magitech Helmet.png │ │ ├── Magitech Ring.png │ │ ├── Mega Blue Jeans.png │ │ ├── Mobster Pants.png │ │ ├── My Blue Heart 3.png │ │ ├── My Grey Heart 3.png │ │ ├── My Pink Heart 3.png │ │ ├── My Red Heart 3.png │ │ ├── Non Slip Shoes.png │ │ ├── Numerical Boots.png │ │ ├── Numerical Chest.png │ │ ├── Numerical Head.png │ │ ├── Numerical Legs.png │ │ ├── Pandora's Box.png │ │ ├── Pants of Horror.png │ │ ├── Party Whistle.png │ │ ├── Plastic Red Cup.png │ │ ├── Platform Boots.png │ │ ├── Pogmail Chest.png │ │ ├── Polygon Boots.png │ │ ├── Rectangle Pants.png │ │ ├── Regular Pants.png │ │ ├── Right Edgy Boot.png │ │ ├── Ring of Apathy.png │ │ ├── Ring of Greed.png │ │ ├── Ring of Might.png │ │ ├── Ring of Utility.png │ │ ├── Roller Skates.png │ │ ├── School Jersey.png │ │ ├── Skeleton Shirt.png │ │ ├── Space Suit Legs.png │ │ ├── Spectral Boots.png │ │ ├── Spinning Tophat.png │ │ ├── Spoopy Helmet.png │ │ ├── Stealthy Chest.png │ │ ├── Swiss Leggings.png │ │ ├── Tear Away Pants.png │ │ ├── The Ass-cessory.png │ │ ├── The Black Lotus.png │ │ ├── The Credit Card.png │ │ ├── The Six Shooter.png │ │ ├── The Skip Card.png │ │ ├── ULTRAWIDE Pants.png │ │ ├── Wanderer's Cane.png │ │ ├── Wanderer's Hat.png │ │ ├── taH s'rerednaW.png │ │ ├── A Gigantic Zipper.png │ │ ├── A Pretty Pink Bow.png │ │ ├── A Rusty Old Sabre.png │ │ ├── A Skipping Stone.png │ │ ├── A Worn Out Fedora.png │ │ ├── AAA Battery Legs.png │ │ ├── An Ordinary Apple.png │ │ ├── Anime Bodypillow.png │ │ ├── Badly Drawn Chest.png │ │ ├── Badly Drawn Foot.png │ │ ├── Badly Drawn Pants.png │ │ ├── Beam Laser Sword.png │ │ ├── Bread Bowl Helmet.png │ │ ├── Buster Sword Top.png │ │ ├── Chocolate Crowbar.png │ │ ├── Chocolate Helmet.png │ │ ├── Crappy Chestplate.png │ │ ├── Disco Ball Helmet.png │ │ ├── Empty Armor Slot.png │ │ ├── Empty Boots Slot.png │ │ ├── Empty Pants Slot.png │ │ ├── Empty Weapon Slot.png │ │ ├── Evil Rubber Ducky.png │ │ ├── Extra Spiky Spurs.png │ │ ├── Flour Sack Pants.png │ │ ├── Forest Chestplate.png │ │ ├── Giant Drumsticks.png │ │ ├── Giant Sticky Foot.png │ │ ├── Gingerbread Boots.png │ │ ├── Gouda Chestplate.png │ │ ├── High Heeled Boots.png │ │ ├── Looty McLootFace.png │ │ ├── Magitech Leggings.png │ │ ├── Molotov Cocktail.png │ │ ├── My Brown Heart 3.png │ │ ├── My Green Heart 3.png │ │ ├── My Orange Heart 3.png │ │ ├── My Purple Heart 3.png │ │ ├── My Rainbow Heart.png │ │ ├── My Yellow Heart 3.png │ │ ├── Raw Slab of Meat.png │ │ ├── Red Meeple Thingy.png │ │ ├── Right Fairy Wing.png │ │ ├── Seal of the Exile.png │ │ ├── Shoes With Wheels.png │ │ ├── Space Suit Chest.png │ │ ├── Square Chestpiece.png │ │ ├── Stonehenge Pants.png │ │ ├── THE MALF SLAMMER.png │ │ ├── The Sands of Time.png │ │ ├── Wanderer's Boots.png │ │ ├── Wanderer's Chest.png │ │ ├── Wanderer's Pants.png │ │ ├── stnaP s'rerednaW.png │ │ ├── stooB s'rerednaW.png │ │ ├── tsehC s'rerednaW.png │ │ ├── 1 Day-Old Baguette.png │ │ ├── A Funky Klein Bottle.png │ │ ├── A Spoonful of Yeast.png │ │ ├── A Vinyl Record Shard.png │ │ ├── Antlers of the Exile.png │ │ ├── Ascended x4 Pendant.png │ │ ├── Ascended x5 Pendant.png │ │ ├── Ascended x6 Pendant.png │ │ ├── Ascended x7 Pendant.png │ │ ├── Ascended x8 Pendant.png │ │ ├── Blue Cheese Helmet.png │ │ ├── Braided Beard Legs.png │ │ ├── Buster Sword Bottom.png │ │ ├── Buster Sword Lower.png │ │ ├── Buster Sword Upper.png │ │ ├── Buster of the Exile.png │ │ ├── Empty Accessory Slot.png │ │ ├── Fabulous Super Chest.png │ │ ├── Flamin' Hot Shorts.png │ │ ├── Floppy Elastic Ruler.png │ │ ├── Generic Paperweight.png │ │ ├── Giant Alien Bug Nest.png │ │ ├── Heart Shaped Panties.png │ │ ├── Magitech Chestplate.png │ │ ├── Pretty Pink Slippers.png │ │ ├── Some Rolling Paper.png │ │ ├── The Disk of Dueling.png │ │ ├── The Fists of Flubber.png │ │ ├── The Glove of Power.png │ │ ├── The Godmother's Ring.png │ │ ├── The Godmother's Wand.png │ │ ├── The Lonely Flubber.png │ │ ├── The Triple Flubber.png │ │ ├── UUG's 'Special' Ring.png │ │ ├── A Bit of White Powder.png │ │ ├── A Cheap Plastic Amulet.png │ │ ├── A Roll of Toilet Paper.png │ │ ├── A Shrunken Voodoo Doll.png │ │ ├── An Ordinary Calculator.png │ │ ├── Antennae of the Exile.png │ │ ├── GALACTIC HERALD LOOTY.png │ │ ├── Groucho Marx Disguise.png │ │ ├── Paper Thin Crepe Cape.png │ │ ├── Tentacle of the Exile.png │ │ ├── The Stealthiest Armour.png │ │ ├── A Broken Pair Of Scissors.png │ │ ├── A handful of Krazy Bonez.png │ │ ├── An Inanimate Carbon Rod.png │ │ ├── Ascended Forest Pendant.png │ │ ├── Badly Drawn Smiley Face.png │ │ ├── Rare Foil Pokeyman Card.png │ │ ├── Superior Japanese Katana.png │ │ ├── Sweat-Stained NGU Shirt.png │ │ ├── The Candy Cane of Destiny.png │ │ ├── Blue Eyes White Chestplate.png │ │ ├── Demonic Flurbie Chestplate.png │ │ ├── Ring of Way Too Much Energy.png │ │ ├── Ring of Way Too Much Magic.png │ │ ├── SUPREME INTELLIGENCE LOOTY.png │ │ ├── Suspicious Sausage Necklace.png │ │ ├── The God of Thunder's Hammer.png │ │ ├── A Priceless Van-Gogh Painting.png │ │ ├── Blue Eyes Ultimate Chestplate.png │ │ ├── Fuzzy Orange Cheeto Slippers.png │ │ ├── Gift Shop Buster Sword Replica.png │ │ ├── Not Sweat-Stained Underpants.png │ │ ├── Portable Stairway (To Heaven).png │ │ ├── Ascended Ascended Forest Pendant.png │ │ ├── 4G's Merge and Boost Tutorial Cube.png │ │ ├── A Comically Oversized Minute-Hand.png │ │ ├── All the other Titans' Missing Shoes.png │ │ ├── Ascended Ascended Ascended Pendant.png │ │ ├── Sir Looty McLootington III, Esquire.png │ │ ├── Amulet of Sunshine, Sparkles, and Gore.png │ │ ├── An Infinitely Long Strand of Beard Hair.png │ │ └── King Circle's Amulet of Helping Random Stuff.png ├── _version_stub.js ├── _git_commit_stub.js ├── actions │ ├── Undo.js │ ├── DeleteSlot.js │ ├── OptimizingGear.js │ ├── HideZone.js │ ├── LoadStateLocalStorage.js │ ├── UnequipItem.js │ ├── Terminate.js │ ├── MassUpdateItems.js │ ├── LoadSlot.js │ ├── EditFactor.js │ ├── ToggleModal.js │ ├── SaveStateLocalStorage.js │ ├── DropEquipItem.js │ ├── ToggleSaved.js │ ├── Crement.js │ ├── LockItem.js │ ├── Hack.js │ ├── Wish.js │ ├── EditItem.js │ ├── OptimizeGear.js │ ├── OptimizeSaves.js │ ├── DisableItem.js │ ├── EquipItem.js │ ├── SaveSlot.js │ ├── Settings.js │ └── Augment.js ├── constants.js ├── components │ ├── AppLayout │ │ ├── DarkModeContext.js │ │ └── AppLayout.css │ ├── ImportSaveForm │ │ ├── jsBinaryFormatDataStructure │ │ │ ├── src │ │ │ │ ├── DeferredReference.js │ │ │ │ ├── MemberReferenceRecord.js │ │ │ │ ├── ClassSerializationRecord.js │ │ │ │ ├── DeferredItem.js │ │ │ │ ├── ArrayInfo.js │ │ │ │ ├── ClassTypeInfo.js │ │ │ │ ├── ClassWithIdRecord.js │ │ │ │ ├── BinaryLibraryRecord.js │ │ │ │ ├── BinaryObjectStringRecord.js │ │ │ │ ├── ObjectNullMultipleRecord.js │ │ │ │ ├── ArraySingleObjectRecord.js │ │ │ │ ├── ArraySingleStringRecord.js │ │ │ │ ├── ClassWithMembersRecord.js │ │ │ │ ├── MemberPrimitiveTypedRecord.js │ │ │ │ ├── ArraySinglePrimitiveRecord.js │ │ │ │ ├── SystemClassWithMembersAndTypesRecord.js │ │ │ │ ├── BinaryArrayType.js │ │ │ │ ├── ClassInfo.js │ │ │ │ ├── ClassWithMembersAndTypesRecord.js │ │ │ │ ├── SerializationHeaderRecord.js │ │ │ │ ├── SystemClassWithMembersRecord.js │ │ │ │ ├── MemberTypeInfo.js │ │ │ │ ├── BinaryType.js │ │ │ │ ├── BinaryObject.js │ │ │ │ ├── Decimal.js │ │ │ │ ├── PrimitiveType.js │ │ │ │ ├── RecordType.js │ │ │ │ ├── PrimitiveReader.js │ │ │ │ └── BinaryArrayRecord.js │ │ │ ├── README.md │ │ │ └── LICENSE │ │ └── deserializeDotNet.js │ ├── Item │ │ ├── Item.css │ │ └── Item.js │ ├── OptimizeButton │ │ └── OptimizeButton.js │ ├── About │ │ ├── About.css │ │ └── About.js │ ├── ResetItemsButton │ │ └── ResetItemsButton.js │ ├── ItemTable │ │ └── ItemTable.css │ ├── Crement │ │ └── Crement.js │ ├── VersionForm │ │ └── VersionForm.js │ ├── WishForm │ │ └── WishForm.js │ ├── Content │ │ └── Optimizer.css │ ├── ExportForm │ │ └── ExportForm.js │ ├── SaveForm │ │ └── SaveForm.js │ ├── PortForm │ │ └── PortForm.js │ ├── ResourcePriorityForm │ │ └── ResourcePriorityForm.js │ ├── ItemForm │ │ └── ItemForm.js │ ├── FactorForm │ │ └── FactorForm.js │ └── ModifierForm │ │ └── ModifierForm.js ├── reducers │ └── index.js ├── containers │ ├── App.test.js │ └── App.js ├── stylesheets │ ├── index.css │ └── App.css ├── index.js ├── Hack.js ├── sagas │ ├── index.js │ └── optimize.worker.js └── Augment.js ├── data ├── .gitignore ├── gatherItems.sh ├── decode.sh └── wishtime.py ├── .env ├── public ├── favicon-720.png ├── manifest.json └── index.html ├── config-overrides.js ├── .gitignore ├── package.json └── README.md /src/assets/.gitignore: -------------------------------------------------------------------------------- 1 | tmp/ 2 | -------------------------------------------------------------------------------- /src/_version_stub.js: -------------------------------------------------------------------------------- 1 | export default {"version": "x.y.z"} 2 | -------------------------------------------------------------------------------- /data/.gitignore: -------------------------------------------------------------------------------- 1 | level0 2 | ItemNameDesc.cs 3 | *.old 4 | *.png 5 | *.rar 6 | -------------------------------------------------------------------------------- /src/_git_commit_stub.js: -------------------------------------------------------------------------------- 1 | export default {"logMessage": "aabbccd Release x.y.z"} 2 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | REACT_APP_VERSION=$npm_package_version 2 | REACT_APP_NAME=$npm_package_name 3 | -------------------------------------------------------------------------------- /data/gatherItems.sh: -------------------------------------------------------------------------------- 1 | mv Items.js Items.js.old 2 | python gatherItems.py > Items.js 3 | -------------------------------------------------------------------------------- /public/favicon-720.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/public/favicon-720.png -------------------------------------------------------------------------------- /src/assets/img/226.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/226.png -------------------------------------------------------------------------------- /src/assets/img/227.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/227.png -------------------------------------------------------------------------------- /src/assets/img/431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/431.png -------------------------------------------------------------------------------- /src/assets/img/432.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/432.png -------------------------------------------------------------------------------- /src/assets/img/433.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/433.png -------------------------------------------------------------------------------- /src/assets/img/434.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/434.png -------------------------------------------------------------------------------- /src/assets/img/435.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/435.png -------------------------------------------------------------------------------- /src/assets/img/436.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/436.png -------------------------------------------------------------------------------- /src/assets/img/437.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/437.png -------------------------------------------------------------------------------- /src/assets/img/438.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/438.png -------------------------------------------------------------------------------- /src/assets/img/439.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/439.png -------------------------------------------------------------------------------- /src/assets/img/440.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/440.png -------------------------------------------------------------------------------- /src/assets/img/441.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/441.png -------------------------------------------------------------------------------- /src/assets/img/442.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/442.png -------------------------------------------------------------------------------- /src/assets/img/443.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/443.png -------------------------------------------------------------------------------- /src/assets/img/444.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/444.png -------------------------------------------------------------------------------- /src/assets/img/445.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/445.png -------------------------------------------------------------------------------- /src/assets/img/446.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/446.png -------------------------------------------------------------------------------- /src/assets/img/447.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/447.png -------------------------------------------------------------------------------- /src/assets/img/448.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/448.png -------------------------------------------------------------------------------- /src/assets/img/449.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/449.png -------------------------------------------------------------------------------- /src/assets/img/450.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/450.png -------------------------------------------------------------------------------- /src/assets/img/451.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/451.png -------------------------------------------------------------------------------- /src/assets/img/452.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/452.png -------------------------------------------------------------------------------- /src/assets/img/453.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/453.png -------------------------------------------------------------------------------- /src/assets/img/454.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/454.png -------------------------------------------------------------------------------- /src/assets/img/455.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/455.png -------------------------------------------------------------------------------- /src/assets/img/456.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/456.png -------------------------------------------------------------------------------- /src/assets/img/457.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/457.png -------------------------------------------------------------------------------- /src/assets/img/458.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/458.png -------------------------------------------------------------------------------- /src/assets/img/459.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/459.png -------------------------------------------------------------------------------- /src/assets/img/460.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/460.png -------------------------------------------------------------------------------- /src/assets/img/461.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/461.png -------------------------------------------------------------------------------- /src/assets/img/462.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/462.png -------------------------------------------------------------------------------- /src/assets/img/463.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/463.png -------------------------------------------------------------------------------- /src/assets/img/464.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/464.png -------------------------------------------------------------------------------- /src/assets/img/465.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/465.png -------------------------------------------------------------------------------- /src/assets/img/466.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/466.png -------------------------------------------------------------------------------- /src/assets/img/467.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/467.png -------------------------------------------------------------------------------- /src/assets/img/468.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/468.png -------------------------------------------------------------------------------- /src/assets/img/469.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/469.png -------------------------------------------------------------------------------- /src/assets/img/470.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/470.png -------------------------------------------------------------------------------- /src/assets/img/471.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/471.png -------------------------------------------------------------------------------- /src/assets/img/472.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/472.png -------------------------------------------------------------------------------- /src/assets/img/473.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/473.png -------------------------------------------------------------------------------- /src/assets/img/474.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/474.png -------------------------------------------------------------------------------- /src/assets/img/475.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/475.png -------------------------------------------------------------------------------- /src/assets/img/476.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/476.png -------------------------------------------------------------------------------- /src/assets/img/477.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/477.png -------------------------------------------------------------------------------- /src/assets/img/478.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/478.png -------------------------------------------------------------------------------- /src/assets/img/479.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/479.png -------------------------------------------------------------------------------- /src/assets/img/496.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/496.png -------------------------------------------------------------------------------- /src/assets/img/497.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/497.png -------------------------------------------------------------------------------- /src/assets/img/498.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/498.png -------------------------------------------------------------------------------- /src/assets/img/499.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/499.png -------------------------------------------------------------------------------- /src/assets/img/500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/500.png -------------------------------------------------------------------------------- /src/assets/img/501.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/501.png -------------------------------------------------------------------------------- /src/assets/img/502.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/502.png -------------------------------------------------------------------------------- /src/assets/img/503.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/503.png -------------------------------------------------------------------------------- /src/assets/img/504.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/504.png -------------------------------------------------------------------------------- /src/assets/img/505.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/505.png -------------------------------------------------------------------------------- /src/assets/img/507.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/507.png -------------------------------------------------------------------------------- /src/assets/img/508.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/508.png -------------------------------------------------------------------------------- /src/assets/img/509.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/509.png -------------------------------------------------------------------------------- /src/assets/img/510.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/510.png -------------------------------------------------------------------------------- /src/assets/img/511.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/511.png -------------------------------------------------------------------------------- /src/assets/img/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/512.png -------------------------------------------------------------------------------- /src/assets/img/513.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/513.png -------------------------------------------------------------------------------- /src/assets/img/514.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/514.png -------------------------------------------------------------------------------- /src/assets/img/Booms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Booms.png -------------------------------------------------------------------------------- /src/assets/img/Logs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Logs.png -------------------------------------------------------------------------------- /src/assets/img/THE S.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/THE S.png -------------------------------------------------------------------------------- /src/assets/img/A Stick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Stick.png -------------------------------------------------------------------------------- /src/assets/img/Hamlet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Hamlet.png -------------------------------------------------------------------------------- /src/assets/img/Stapler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Stapler.png -------------------------------------------------------------------------------- /src/assets/img/The D20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The D20.png -------------------------------------------------------------------------------- /src/assets/img/The D8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The D8.png -------------------------------------------------------------------------------- /src/assets/img/The Key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Key.png -------------------------------------------------------------------------------- /src/assets/img/Wee pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Wee pin.png -------------------------------------------------------------------------------- /src/assets/img/69 Charm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/69 Charm.png -------------------------------------------------------------------------------- /src/assets/img/A Bald Egg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Bald Egg.png -------------------------------------------------------------------------------- /src/assets/img/A Bandana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Bandana.png -------------------------------------------------------------------------------- /src/assets/img/A Beanie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Beanie.png -------------------------------------------------------------------------------- /src/assets/img/A Bed Rock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Bed Rock.png -------------------------------------------------------------------------------- /src/assets/img/A Garrote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Garrote.png -------------------------------------------------------------------------------- /src/assets/img/A Manhole.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Manhole.png -------------------------------------------------------------------------------- /src/assets/img/A Pet Rock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Pet Rock.png -------------------------------------------------------------------------------- /src/assets/img/A Rocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Rocket.png -------------------------------------------------------------------------------- /src/assets/img/A Triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Triangle.png -------------------------------------------------------------------------------- /src/assets/img/A Walkman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Walkman.png -------------------------------------------------------------------------------- /src/assets/img/Amplifier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Amplifier.png -------------------------------------------------------------------------------- /src/assets/img/Chef's Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Chef's Hat.png -------------------------------------------------------------------------------- /src/assets/img/Cloth Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Cloth Hat.png -------------------------------------------------------------------------------- /src/assets/img/Clown Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Clown Hat.png -------------------------------------------------------------------------------- /src/assets/img/Dunce Cap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Dunce Cap.png -------------------------------------------------------------------------------- /src/assets/img/Edgy Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Edgy Chest.png -------------------------------------------------------------------------------- /src/assets/img/Edgy Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Edgy Pants.png -------------------------------------------------------------------------------- /src/assets/img/Fanny Pack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Fanny Pack.png -------------------------------------------------------------------------------- /src/assets/img/Gaudy Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Gaudy Hat.png -------------------------------------------------------------------------------- /src/assets/img/Gross Ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Gross Ring.png -------------------------------------------------------------------------------- /src/assets/img/King Looty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/King Looty.png -------------------------------------------------------------------------------- /src/assets/img/Mega Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Mega Boots.png -------------------------------------------------------------------------------- /src/assets/img/Mega Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Mega Chest.png -------------------------------------------------------------------------------- /src/assets/img/Mossy Ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Mossy Ring.png -------------------------------------------------------------------------------- /src/assets/img/Neck Bolts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Neck Bolts.png -------------------------------------------------------------------------------- /src/assets/img/No Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/No Pants.png -------------------------------------------------------------------------------- /src/assets/img/Not Drugs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Not Drugs.png -------------------------------------------------------------------------------- /src/assets/img/Nunchuks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Nunchuks.png -------------------------------------------------------------------------------- /src/assets/img/Office Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Office Hat.png -------------------------------------------------------------------------------- /src/assets/img/Paper Fan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Paper Fan.png -------------------------------------------------------------------------------- /src/assets/img/Party Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Party Hat.png -------------------------------------------------------------------------------- /src/assets/img/Rock Candy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Rock Candy.png -------------------------------------------------------------------------------- /src/assets/img/Space Gun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Space Gun.png -------------------------------------------------------------------------------- /src/assets/img/THE CUBE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/THE CUBE.png -------------------------------------------------------------------------------- /src/assets/img/The Joker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Joker.png -------------------------------------------------------------------------------- /src/assets/img/The Pen-Is.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Pen-Is.png -------------------------------------------------------------------------------- /src/assets/img/Tommy Gun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Tommy Gun.png -------------------------------------------------------------------------------- /src/assets/img/Trap Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Trap Pants.png -------------------------------------------------------------------------------- /src/actions/Undo.js: -------------------------------------------------------------------------------- 1 | export const UNDO = 'Undo equipment change.'; 2 | 3 | export const Undo = () => ({type: UNDO}); 4 | -------------------------------------------------------------------------------- /src/assets/img/A Broomstick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Broomstick.png -------------------------------------------------------------------------------- /src/assets/img/A Cream Pie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Cream Pie.png -------------------------------------------------------------------------------- /src/assets/img/A Gas Giant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Gas Giant.png -------------------------------------------------------------------------------- /src/assets/img/A Power Pill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Power Pill.png -------------------------------------------------------------------------------- /src/assets/img/A Red Shirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Red Shirt.png -------------------------------------------------------------------------------- /src/assets/img/A Skateboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Skateboard.png -------------------------------------------------------------------------------- /src/assets/img/Alarm Clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Alarm Clock.png -------------------------------------------------------------------------------- /src/assets/img/Assful Chaps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Assful Chaps.png -------------------------------------------------------------------------------- /src/assets/img/Asslest Vest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Asslest Vest.png -------------------------------------------------------------------------------- /src/assets/img/Bearded Axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Bearded Axe.png -------------------------------------------------------------------------------- /src/assets/img/Bell Bottoms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Bell Bottoms.png -------------------------------------------------------------------------------- /src/assets/img/Broken Drum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Broken Drum.png -------------------------------------------------------------------------------- /src/assets/img/Cement Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Cement Boots.png -------------------------------------------------------------------------------- /src/assets/img/Chef's Apron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Chef's Apron.png -------------------------------------------------------------------------------- /src/assets/img/Chess Plate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Chess Plate.png -------------------------------------------------------------------------------- /src/assets/img/Cloth Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Cloth Boots.png -------------------------------------------------------------------------------- /src/assets/img/Cloth Shirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Cloth Shirt.png -------------------------------------------------------------------------------- /src/assets/img/Cool Shades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Cool Shades.png -------------------------------------------------------------------------------- /src/assets/img/Crappy Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Crappy Boots.png -------------------------------------------------------------------------------- /src/assets/img/Cursed Ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Cursed Ring.png -------------------------------------------------------------------------------- /src/assets/img/Disco Shirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Disco Shirt.png -------------------------------------------------------------------------------- /src/assets/img/Dragon Wings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Dragon Wings.png -------------------------------------------------------------------------------- /src/assets/img/Edgy Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Edgy Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Edgy Jaw Axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Edgy Jaw Axe.png -------------------------------------------------------------------------------- /src/assets/img/Eye of ELXU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Eye of ELXU.png -------------------------------------------------------------------------------- /src/assets/img/Forest Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Forest Boots.png -------------------------------------------------------------------------------- /src/assets/img/Fuzzy Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Fuzzy Boots.png -------------------------------------------------------------------------------- /src/assets/img/Gaudy Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Gaudy Boots.png -------------------------------------------------------------------------------- /src/assets/img/Gaudy Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Gaudy Pants.png -------------------------------------------------------------------------------- /src/assets/img/Gaudy Shirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Gaudy Shirt.png -------------------------------------------------------------------------------- /src/assets/img/Hat of Greed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Hat of Greed.png -------------------------------------------------------------------------------- /src/assets/img/Havarti Ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Havarti Ring.png -------------------------------------------------------------------------------- /src/assets/img/Kokiri Blade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Kokiri Blade.png -------------------------------------------------------------------------------- /src/assets/img/Mega Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Mega Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Mobster Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Mobster Hat.png -------------------------------------------------------------------------------- /src/assets/img/Mobster Vest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Mobster Vest.png -------------------------------------------------------------------------------- /src/assets/img/Mole Hammer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Mole Hammer.png -------------------------------------------------------------------------------- /src/assets/img/Nerdy Shoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Nerdy Shoes.png -------------------------------------------------------------------------------- /src/assets/img/Office Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Office Pants.png -------------------------------------------------------------------------------- /src/assets/img/Office Shirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Office Shirt.png -------------------------------------------------------------------------------- /src/assets/img/Office Shoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Office Shoes.png -------------------------------------------------------------------------------- /src/assets/img/Pizza Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Pizza Boots.png -------------------------------------------------------------------------------- /src/assets/img/Rusty Sword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Rusty Sword.png -------------------------------------------------------------------------------- /src/assets/img/Slimy Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Slimy Boots.png -------------------------------------------------------------------------------- /src/assets/img/Slimy Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Slimy Chest.png -------------------------------------------------------------------------------- /src/assets/img/Slimy Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Slimy Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Slimy Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Slimy Pants.png -------------------------------------------------------------------------------- /src/assets/img/Slinky Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Slinky Boots.png -------------------------------------------------------------------------------- /src/assets/img/Space Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Space Boots.png -------------------------------------------------------------------------------- /src/assets/img/Space Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Space Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Spooky Sword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Spooky Sword.png -------------------------------------------------------------------------------- /src/assets/img/Stealthy Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Stealthy Hat.png -------------------------------------------------------------------------------- /src/assets/img/The Number 7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Number 7.png -------------------------------------------------------------------------------- /src/assets/img/Violin Case.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Violin Case.png -------------------------------------------------------------------------------- /src/assets/img/'The Cricket'.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/'The Cricket'.png -------------------------------------------------------------------------------- /src/assets/img/A 10 Litre Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A 10 Litre Hat.png -------------------------------------------------------------------------------- /src/assets/img/A 9mm Beretta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A 9mm Beretta.png -------------------------------------------------------------------------------- /src/assets/img/A Bag of Trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Bag of Trash.png -------------------------------------------------------------------------------- /src/assets/img/A Battle Corgi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Battle Corgi.png -------------------------------------------------------------------------------- /src/assets/img/A Crappy Tutu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Crappy Tutu.png -------------------------------------------------------------------------------- /src/assets/img/A Giant Apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Giant Apple.png -------------------------------------------------------------------------------- /src/assets/img/A Giant Bazooka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Giant Bazooka.png -------------------------------------------------------------------------------- /src/assets/img/A Giant Scythe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Giant Scythe.png -------------------------------------------------------------------------------- /src/assets/img/A Pink Bandana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Pink Bandana.png -------------------------------------------------------------------------------- /src/assets/img/A Regular Tie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Regular Tie.png -------------------------------------------------------------------------------- /src/assets/img/A Rolling Pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Rolling Pin.png -------------------------------------------------------------------------------- /src/assets/img/A Rolling Stone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Rolling Stone.png -------------------------------------------------------------------------------- /src/assets/img/A Small Gerbil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Small Gerbil.png -------------------------------------------------------------------------------- /src/assets/img/Anime Figurine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Anime Figurine.png -------------------------------------------------------------------------------- /src/assets/img/Anime Hero Wig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Anime Hero Wig.png -------------------------------------------------------------------------------- /src/assets/img/BOTH Edgy Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/BOTH Edgy Boots.png -------------------------------------------------------------------------------- /src/assets/img/Badly Drawn Gun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Badly Drawn Gun.png -------------------------------------------------------------------------------- /src/assets/img/Bloody Cleaver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Bloody Cleaver.png -------------------------------------------------------------------------------- /src/assets/img/Brass Knuckles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Brass Knuckles.png -------------------------------------------------------------------------------- /src/assets/img/Cheddar Amulet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Cheddar Amulet.png -------------------------------------------------------------------------------- /src/assets/img/Chocolate Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Chocolate Boots.png -------------------------------------------------------------------------------- /src/assets/img/Chocolate Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Chocolate Chest.png -------------------------------------------------------------------------------- /src/assets/img/Chocolate Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Chocolate Pants.png -------------------------------------------------------------------------------- /src/assets/img/Circle Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Circle Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Clockwork Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Clockwork Boots.png -------------------------------------------------------------------------------- /src/assets/img/Clockwork Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Clockwork Chest.png -------------------------------------------------------------------------------- /src/assets/img/Clockwork Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Clockwork Hat.png -------------------------------------------------------------------------------- /src/assets/img/Clockwork Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Clockwork Pants.png -------------------------------------------------------------------------------- /src/assets/img/Cloth Leggings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Cloth Leggings.png -------------------------------------------------------------------------------- /src/assets/img/Combat Cheese.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Combat Cheese.png -------------------------------------------------------------------------------- /src/assets/img/Cracked Amulet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Cracked Amulet.png -------------------------------------------------------------------------------- /src/assets/img/Crappy Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Crappy Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Crappy Leggings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Crappy Leggings.png -------------------------------------------------------------------------------- /src/assets/img/Dorky Glasses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Dorky Glasses.png -------------------------------------------------------------------------------- /src/assets/img/Emperor Looty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Emperor Looty.png -------------------------------------------------------------------------------- /src/assets/img/Empty Head Slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Empty Head Slot.png -------------------------------------------------------------------------------- /src/assets/img/Forest Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Forest Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Forest Leggings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Forest Leggings.png -------------------------------------------------------------------------------- /src/assets/img/Forest Pendant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Forest Pendant.png -------------------------------------------------------------------------------- /src/assets/img/Ghostly Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ghostly Chest.png -------------------------------------------------------------------------------- /src/assets/img/Gossamer Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Gossamer Chest.png -------------------------------------------------------------------------------- /src/assets/img/Infinity Charm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Infinity Charm.png -------------------------------------------------------------------------------- /src/assets/img/Leather Jacket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Leather Jacket.png -------------------------------------------------------------------------------- /src/assets/img/Left Edgy Boot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Left Edgy Boot.png -------------------------------------------------------------------------------- /src/assets/img/Left Fairy Wing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Left Fairy Wing.png -------------------------------------------------------------------------------- /src/assets/img/Limburger Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Limburger Boots.png -------------------------------------------------------------------------------- /src/assets/img/Magitech Amulet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Magitech Amulet.png -------------------------------------------------------------------------------- /src/assets/img/Magitech Blade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Magitech Blade.png -------------------------------------------------------------------------------- /src/assets/img/Magitech Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Magitech Boots.png -------------------------------------------------------------------------------- /src/assets/img/Magitech Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Magitech Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Magitech Ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Magitech Ring.png -------------------------------------------------------------------------------- /src/assets/img/Mega Blue Jeans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Mega Blue Jeans.png -------------------------------------------------------------------------------- /src/assets/img/Mobster Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Mobster Pants.png -------------------------------------------------------------------------------- /src/assets/img/My Blue Heart 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Blue Heart 3.png -------------------------------------------------------------------------------- /src/assets/img/My Grey Heart 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Grey Heart 3.png -------------------------------------------------------------------------------- /src/assets/img/My Pink Heart 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Pink Heart 3.png -------------------------------------------------------------------------------- /src/assets/img/My Red Heart 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Red Heart 3.png -------------------------------------------------------------------------------- /src/assets/img/Non Slip Shoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Non Slip Shoes.png -------------------------------------------------------------------------------- /src/assets/img/Numerical Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Numerical Boots.png -------------------------------------------------------------------------------- /src/assets/img/Numerical Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Numerical Chest.png -------------------------------------------------------------------------------- /src/assets/img/Numerical Head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Numerical Head.png -------------------------------------------------------------------------------- /src/assets/img/Numerical Legs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Numerical Legs.png -------------------------------------------------------------------------------- /src/assets/img/Pandora's Box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Pandora's Box.png -------------------------------------------------------------------------------- /src/assets/img/Pants of Horror.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Pants of Horror.png -------------------------------------------------------------------------------- /src/assets/img/Party Whistle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Party Whistle.png -------------------------------------------------------------------------------- /src/assets/img/Plastic Red Cup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Plastic Red Cup.png -------------------------------------------------------------------------------- /src/assets/img/Platform Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Platform Boots.png -------------------------------------------------------------------------------- /src/assets/img/Pogmail Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Pogmail Chest.png -------------------------------------------------------------------------------- /src/assets/img/Polygon Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Polygon Boots.png -------------------------------------------------------------------------------- /src/assets/img/Rectangle Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Rectangle Pants.png -------------------------------------------------------------------------------- /src/assets/img/Regular Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Regular Pants.png -------------------------------------------------------------------------------- /src/assets/img/Right Edgy Boot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Right Edgy Boot.png -------------------------------------------------------------------------------- /src/assets/img/Ring of Apathy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ring of Apathy.png -------------------------------------------------------------------------------- /src/assets/img/Ring of Greed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ring of Greed.png -------------------------------------------------------------------------------- /src/assets/img/Ring of Might.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ring of Might.png -------------------------------------------------------------------------------- /src/assets/img/Ring of Utility.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ring of Utility.png -------------------------------------------------------------------------------- /src/assets/img/Roller Skates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Roller Skates.png -------------------------------------------------------------------------------- /src/assets/img/School Jersey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/School Jersey.png -------------------------------------------------------------------------------- /src/assets/img/Skeleton Shirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Skeleton Shirt.png -------------------------------------------------------------------------------- /src/assets/img/Space Suit Legs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Space Suit Legs.png -------------------------------------------------------------------------------- /src/assets/img/Spectral Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Spectral Boots.png -------------------------------------------------------------------------------- /src/assets/img/Spinning Tophat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Spinning Tophat.png -------------------------------------------------------------------------------- /src/assets/img/Spoopy Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Spoopy Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Stealthy Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Stealthy Chest.png -------------------------------------------------------------------------------- /src/assets/img/Swiss Leggings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Swiss Leggings.png -------------------------------------------------------------------------------- /src/assets/img/Tear Away Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Tear Away Pants.png -------------------------------------------------------------------------------- /src/assets/img/The Ass-cessory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Ass-cessory.png -------------------------------------------------------------------------------- /src/assets/img/The Black Lotus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Black Lotus.png -------------------------------------------------------------------------------- /src/assets/img/The Credit Card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Credit Card.png -------------------------------------------------------------------------------- /src/assets/img/The Six Shooter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Six Shooter.png -------------------------------------------------------------------------------- /src/assets/img/The Skip Card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Skip Card.png -------------------------------------------------------------------------------- /src/assets/img/ULTRAWIDE Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/ULTRAWIDE Pants.png -------------------------------------------------------------------------------- /src/assets/img/Wanderer's Cane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Wanderer's Cane.png -------------------------------------------------------------------------------- /src/assets/img/Wanderer's Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Wanderer's Hat.png -------------------------------------------------------------------------------- /src/assets/img/taH s'rerednaW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/taH s'rerednaW.png -------------------------------------------------------------------------------- /src/constants.js: -------------------------------------------------------------------------------- 1 | // Localstorage name used by the application. 2 | export const LOCALSTORAGE_NAME = 'gear-optimizer-state'; 3 | -------------------------------------------------------------------------------- /src/assets/img/A Gigantic Zipper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Gigantic Zipper.png -------------------------------------------------------------------------------- /src/assets/img/A Pretty Pink Bow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Pretty Pink Bow.png -------------------------------------------------------------------------------- /src/assets/img/A Rusty Old Sabre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Rusty Old Sabre.png -------------------------------------------------------------------------------- /src/assets/img/A Skipping Stone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Skipping Stone.png -------------------------------------------------------------------------------- /src/assets/img/A Worn Out Fedora.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Worn Out Fedora.png -------------------------------------------------------------------------------- /src/assets/img/AAA Battery Legs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/AAA Battery Legs.png -------------------------------------------------------------------------------- /src/assets/img/An Ordinary Apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/An Ordinary Apple.png -------------------------------------------------------------------------------- /src/assets/img/Anime Bodypillow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Anime Bodypillow.png -------------------------------------------------------------------------------- /src/assets/img/Badly Drawn Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Badly Drawn Chest.png -------------------------------------------------------------------------------- /src/assets/img/Badly Drawn Foot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Badly Drawn Foot.png -------------------------------------------------------------------------------- /src/assets/img/Badly Drawn Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Badly Drawn Pants.png -------------------------------------------------------------------------------- /src/assets/img/Beam Laser Sword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Beam Laser Sword.png -------------------------------------------------------------------------------- /src/assets/img/Bread Bowl Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Bread Bowl Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Buster Sword Top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Buster Sword Top.png -------------------------------------------------------------------------------- /src/assets/img/Chocolate Crowbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Chocolate Crowbar.png -------------------------------------------------------------------------------- /src/assets/img/Chocolate Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Chocolate Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Crappy Chestplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Crappy Chestplate.png -------------------------------------------------------------------------------- /src/assets/img/Disco Ball Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Disco Ball Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Empty Armor Slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Empty Armor Slot.png -------------------------------------------------------------------------------- /src/assets/img/Empty Boots Slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Empty Boots Slot.png -------------------------------------------------------------------------------- /src/assets/img/Empty Pants Slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Empty Pants Slot.png -------------------------------------------------------------------------------- /src/assets/img/Empty Weapon Slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Empty Weapon Slot.png -------------------------------------------------------------------------------- /src/assets/img/Evil Rubber Ducky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Evil Rubber Ducky.png -------------------------------------------------------------------------------- /src/assets/img/Extra Spiky Spurs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Extra Spiky Spurs.png -------------------------------------------------------------------------------- /src/assets/img/Flour Sack Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Flour Sack Pants.png -------------------------------------------------------------------------------- /src/assets/img/Forest Chestplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Forest Chestplate.png -------------------------------------------------------------------------------- /src/assets/img/Giant Drumsticks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Giant Drumsticks.png -------------------------------------------------------------------------------- /src/assets/img/Giant Sticky Foot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Giant Sticky Foot.png -------------------------------------------------------------------------------- /src/assets/img/Gingerbread Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Gingerbread Boots.png -------------------------------------------------------------------------------- /src/assets/img/Gouda Chestplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Gouda Chestplate.png -------------------------------------------------------------------------------- /src/assets/img/High Heeled Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/High Heeled Boots.png -------------------------------------------------------------------------------- /src/assets/img/Looty McLootFace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Looty McLootFace.png -------------------------------------------------------------------------------- /src/assets/img/Magitech Leggings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Magitech Leggings.png -------------------------------------------------------------------------------- /src/assets/img/Molotov Cocktail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Molotov Cocktail.png -------------------------------------------------------------------------------- /src/assets/img/My Brown Heart 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Brown Heart 3.png -------------------------------------------------------------------------------- /src/assets/img/My Green Heart 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Green Heart 3.png -------------------------------------------------------------------------------- /src/assets/img/My Orange Heart 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Orange Heart 3.png -------------------------------------------------------------------------------- /src/assets/img/My Purple Heart 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Purple Heart 3.png -------------------------------------------------------------------------------- /src/assets/img/My Rainbow Heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Rainbow Heart.png -------------------------------------------------------------------------------- /src/assets/img/My Yellow Heart 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/My Yellow Heart 3.png -------------------------------------------------------------------------------- /src/assets/img/Raw Slab of Meat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Raw Slab of Meat.png -------------------------------------------------------------------------------- /src/assets/img/Red Meeple Thingy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Red Meeple Thingy.png -------------------------------------------------------------------------------- /src/assets/img/Right Fairy Wing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Right Fairy Wing.png -------------------------------------------------------------------------------- /src/assets/img/Seal of the Exile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Seal of the Exile.png -------------------------------------------------------------------------------- /src/assets/img/Shoes With Wheels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Shoes With Wheels.png -------------------------------------------------------------------------------- /src/assets/img/Space Suit Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Space Suit Chest.png -------------------------------------------------------------------------------- /src/assets/img/Square Chestpiece.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Square Chestpiece.png -------------------------------------------------------------------------------- /src/assets/img/Stonehenge Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Stonehenge Pants.png -------------------------------------------------------------------------------- /src/assets/img/THE MALF SLAMMER.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/THE MALF SLAMMER.png -------------------------------------------------------------------------------- /src/assets/img/The Sands of Time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Sands of Time.png -------------------------------------------------------------------------------- /src/assets/img/Wanderer's Boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Wanderer's Boots.png -------------------------------------------------------------------------------- /src/assets/img/Wanderer's Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Wanderer's Chest.png -------------------------------------------------------------------------------- /src/assets/img/Wanderer's Pants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Wanderer's Pants.png -------------------------------------------------------------------------------- /src/assets/img/stnaP s'rerednaW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/stnaP s'rerednaW.png -------------------------------------------------------------------------------- /src/assets/img/stooB s'rerednaW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/stooB s'rerednaW.png -------------------------------------------------------------------------------- /src/assets/img/tsehC s'rerednaW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/tsehC s'rerednaW.png -------------------------------------------------------------------------------- /src/actions/DeleteSlot.js: -------------------------------------------------------------------------------- 1 | export const DELETE_SLOT = 'Delete save.'; 2 | 3 | export const DeleteSlot = () => ({type: DELETE_SLOT}); 4 | -------------------------------------------------------------------------------- /src/assets/img/1 Day-Old Baguette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/1 Day-Old Baguette.png -------------------------------------------------------------------------------- /src/assets/img/A Funky Klein Bottle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Funky Klein Bottle.png -------------------------------------------------------------------------------- /src/assets/img/A Spoonful of Yeast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Spoonful of Yeast.png -------------------------------------------------------------------------------- /src/assets/img/A Vinyl Record Shard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Vinyl Record Shard.png -------------------------------------------------------------------------------- /src/assets/img/Antlers of the Exile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Antlers of the Exile.png -------------------------------------------------------------------------------- /src/assets/img/Ascended x4 Pendant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ascended x4 Pendant.png -------------------------------------------------------------------------------- /src/assets/img/Ascended x5 Pendant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ascended x5 Pendant.png -------------------------------------------------------------------------------- /src/assets/img/Ascended x6 Pendant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ascended x6 Pendant.png -------------------------------------------------------------------------------- /src/assets/img/Ascended x7 Pendant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ascended x7 Pendant.png -------------------------------------------------------------------------------- /src/assets/img/Ascended x8 Pendant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ascended x8 Pendant.png -------------------------------------------------------------------------------- /src/assets/img/Blue Cheese Helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Blue Cheese Helmet.png -------------------------------------------------------------------------------- /src/assets/img/Braided Beard Legs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Braided Beard Legs.png -------------------------------------------------------------------------------- /src/assets/img/Buster Sword Bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Buster Sword Bottom.png -------------------------------------------------------------------------------- /src/assets/img/Buster Sword Lower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Buster Sword Lower.png -------------------------------------------------------------------------------- /src/assets/img/Buster Sword Upper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Buster Sword Upper.png -------------------------------------------------------------------------------- /src/assets/img/Buster of the Exile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Buster of the Exile.png -------------------------------------------------------------------------------- /src/assets/img/Empty Accessory Slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Empty Accessory Slot.png -------------------------------------------------------------------------------- /src/assets/img/Fabulous Super Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Fabulous Super Chest.png -------------------------------------------------------------------------------- /src/assets/img/Flamin' Hot Shorts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Flamin' Hot Shorts.png -------------------------------------------------------------------------------- /src/assets/img/Floppy Elastic Ruler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Floppy Elastic Ruler.png -------------------------------------------------------------------------------- /src/assets/img/Generic Paperweight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Generic Paperweight.png -------------------------------------------------------------------------------- /src/assets/img/Giant Alien Bug Nest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Giant Alien Bug Nest.png -------------------------------------------------------------------------------- /src/assets/img/Heart Shaped Panties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Heart Shaped Panties.png -------------------------------------------------------------------------------- /src/assets/img/Magitech Chestplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Magitech Chestplate.png -------------------------------------------------------------------------------- /src/assets/img/Pretty Pink Slippers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Pretty Pink Slippers.png -------------------------------------------------------------------------------- /src/assets/img/Some Rolling Paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Some Rolling Paper.png -------------------------------------------------------------------------------- /src/assets/img/The Disk of Dueling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Disk of Dueling.png -------------------------------------------------------------------------------- /src/assets/img/The Fists of Flubber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Fists of Flubber.png -------------------------------------------------------------------------------- /src/assets/img/The Glove of Power.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Glove of Power.png -------------------------------------------------------------------------------- /src/assets/img/The Godmother's Ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Godmother's Ring.png -------------------------------------------------------------------------------- /src/assets/img/The Godmother's Wand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Godmother's Wand.png -------------------------------------------------------------------------------- /src/assets/img/The Lonely Flubber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Lonely Flubber.png -------------------------------------------------------------------------------- /src/assets/img/The Triple Flubber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Triple Flubber.png -------------------------------------------------------------------------------- /src/assets/img/UUG's 'Special' Ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/UUG's 'Special' Ring.png -------------------------------------------------------------------------------- /src/assets/img/A Bit of White Powder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Bit of White Powder.png -------------------------------------------------------------------------------- /src/assets/img/A Cheap Plastic Amulet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Cheap Plastic Amulet.png -------------------------------------------------------------------------------- /src/assets/img/A Roll of Toilet Paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Roll of Toilet Paper.png -------------------------------------------------------------------------------- /src/assets/img/A Shrunken Voodoo Doll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Shrunken Voodoo Doll.png -------------------------------------------------------------------------------- /src/assets/img/An Ordinary Calculator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/An Ordinary Calculator.png -------------------------------------------------------------------------------- /src/assets/img/Antennae of the Exile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Antennae of the Exile.png -------------------------------------------------------------------------------- /src/assets/img/GALACTIC HERALD LOOTY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/GALACTIC HERALD LOOTY.png -------------------------------------------------------------------------------- /src/assets/img/Groucho Marx Disguise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Groucho Marx Disguise.png -------------------------------------------------------------------------------- /src/assets/img/Paper Thin Crepe Cape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Paper Thin Crepe Cape.png -------------------------------------------------------------------------------- /src/assets/img/Tentacle of the Exile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Tentacle of the Exile.png -------------------------------------------------------------------------------- /src/assets/img/The Stealthiest Armour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Stealthiest Armour.png -------------------------------------------------------------------------------- /src/assets/img/A Broken Pair Of Scissors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Broken Pair Of Scissors.png -------------------------------------------------------------------------------- /src/assets/img/A handful of Krazy Bonez.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A handful of Krazy Bonez.png -------------------------------------------------------------------------------- /src/assets/img/An Inanimate Carbon Rod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/An Inanimate Carbon Rod.png -------------------------------------------------------------------------------- /src/assets/img/Ascended Forest Pendant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ascended Forest Pendant.png -------------------------------------------------------------------------------- /src/assets/img/Badly Drawn Smiley Face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Badly Drawn Smiley Face.png -------------------------------------------------------------------------------- /src/assets/img/Rare Foil Pokeyman Card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Rare Foil Pokeyman Card.png -------------------------------------------------------------------------------- /src/assets/img/Superior Japanese Katana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Superior Japanese Katana.png -------------------------------------------------------------------------------- /src/assets/img/Sweat-Stained NGU Shirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Sweat-Stained NGU Shirt.png -------------------------------------------------------------------------------- /src/assets/img/The Candy Cane of Destiny.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The Candy Cane of Destiny.png -------------------------------------------------------------------------------- /src/assets/img/Blue Eyes White Chestplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Blue Eyes White Chestplate.png -------------------------------------------------------------------------------- /src/assets/img/Demonic Flurbie Chestplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Demonic Flurbie Chestplate.png -------------------------------------------------------------------------------- /src/assets/img/Ring of Way Too Much Energy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ring of Way Too Much Energy.png -------------------------------------------------------------------------------- /src/assets/img/Ring of Way Too Much Magic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ring of Way Too Much Magic.png -------------------------------------------------------------------------------- /src/assets/img/SUPREME INTELLIGENCE LOOTY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/SUPREME INTELLIGENCE LOOTY.png -------------------------------------------------------------------------------- /src/assets/img/Suspicious Sausage Necklace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Suspicious Sausage Necklace.png -------------------------------------------------------------------------------- /src/assets/img/The God of Thunder's Hammer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/The God of Thunder's Hammer.png -------------------------------------------------------------------------------- /src/actions/OptimizingGear.js: -------------------------------------------------------------------------------- 1 | export const OPTIMIZING_GEAR = 'Optimizing gear.'; 2 | 3 | export const OptimizingGear = () => ({type: OPTIMIZING_GEAR}); 4 | -------------------------------------------------------------------------------- /src/assets/img/A Priceless Van-Gogh Painting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Priceless Van-Gogh Painting.png -------------------------------------------------------------------------------- /src/assets/img/Blue Eyes Ultimate Chestplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Blue Eyes Ultimate Chestplate.png -------------------------------------------------------------------------------- /src/assets/img/Fuzzy Orange Cheeto Slippers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Fuzzy Orange Cheeto Slippers.png -------------------------------------------------------------------------------- /src/assets/img/Gift Shop Buster Sword Replica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Gift Shop Buster Sword Replica.png -------------------------------------------------------------------------------- /src/assets/img/Not Sweat-Stained Underpants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Not Sweat-Stained Underpants.png -------------------------------------------------------------------------------- /src/assets/img/Portable Stairway (To Heaven).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Portable Stairway (To Heaven).png -------------------------------------------------------------------------------- /src/assets/img/Ascended Ascended Forest Pendant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ascended Ascended Forest Pendant.png -------------------------------------------------------------------------------- /src/assets/img/4G's Merge and Boost Tutorial Cube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/4G's Merge and Boost Tutorial Cube.png -------------------------------------------------------------------------------- /src/assets/img/A Comically Oversized Minute-Hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/A Comically Oversized Minute-Hand.png -------------------------------------------------------------------------------- /src/assets/img/All the other Titans' Missing Shoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/All the other Titans' Missing Shoes.png -------------------------------------------------------------------------------- /src/assets/img/Ascended Ascended Ascended Pendant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Ascended Ascended Ascended Pendant.png -------------------------------------------------------------------------------- /src/assets/img/Sir Looty McLootington III, Esquire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Sir Looty McLootington III, Esquire.png -------------------------------------------------------------------------------- /src/components/AppLayout/DarkModeContext.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const DarkModeContext = React.createContext(false); 4 | 5 | export default DarkModeContext; -------------------------------------------------------------------------------- /src/assets/img/Amulet of Sunshine, Sparkles, and Gore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/Amulet of Sunshine, Sparkles, and Gore.png -------------------------------------------------------------------------------- /src/assets/img/An Infinitely Long Strand of Beard Hair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/An Infinitely Long Strand of Beard Hair.png -------------------------------------------------------------------------------- /src/assets/img/King Circle's Amulet of Helping Random Stuff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmiclotte/gear-optimizer/HEAD/src/assets/img/King Circle's Amulet of Helping Random Stuff.png -------------------------------------------------------------------------------- /src/actions/HideZone.js: -------------------------------------------------------------------------------- 1 | export const HIDE_ZONE = '(un)Hide zone.'; 2 | 3 | export const HideZone = (idx) => ({ 4 | type: HIDE_ZONE, 5 | payload: { 6 | idx: idx 7 | } 8 | }); 9 | -------------------------------------------------------------------------------- /src/actions/LoadStateLocalStorage.js: -------------------------------------------------------------------------------- 1 | export const LOAD_STATE_LOCALSTORAGE = 'Load state from LocalStorage'; 2 | 3 | export const LoadStateLocalStorage = () => ({type: LOAD_STATE_LOCALSTORAGE, payload: {}}); 4 | -------------------------------------------------------------------------------- /src/actions/UnequipItem.js: -------------------------------------------------------------------------------- 1 | export const UNEQUIP_ITEM = 'Unequip item.'; 2 | 3 | export const UnequipItem = itemId => ({ 4 | type: UNEQUIP_ITEM, 5 | payload: { 6 | id: itemId 7 | } 8 | }); 9 | -------------------------------------------------------------------------------- /src/actions/Terminate.js: -------------------------------------------------------------------------------- 1 | export const TERMINATE = 'Terminate optimization.'; 2 | export const TERMINATE_ASYNC = 'Terminate optimization async.'; 3 | 4 | export const Terminate = () => ({type: TERMINATE_ASYNC}); 5 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/DeferredReference.js: -------------------------------------------------------------------------------- 1 | class DeferredReference { 2 | constructor(id) { 3 | this.id = id; 4 | } 5 | } 6 | 7 | export default DeferredReference; -------------------------------------------------------------------------------- /src/reducers/index.js: -------------------------------------------------------------------------------- 1 | import {combineReducers} from 'redux'; 2 | 3 | import ItemsReducer from './Items'; 4 | 5 | const AppReducer = combineReducers({optimizer: ItemsReducer}); 6 | 7 | export default AppReducer; 8 | -------------------------------------------------------------------------------- /src/actions/MassUpdateItems.js: -------------------------------------------------------------------------------- 1 | export const MASSUPDATE = 'Mass Update Items.'; 2 | 3 | export const MassUpdate = (itemdata) => ({ 4 | type: MASSUPDATE, 5 | payload: { 6 | data: itemdata 7 | } 8 | }); 9 | -------------------------------------------------------------------------------- /src/actions/LoadSlot.js: -------------------------------------------------------------------------------- 1 | export const LOAD_SLOT = 'Load.'; 2 | export const LOAD_FACTORS = 'Load factors.'; 3 | 4 | export const LoadSlot = () => ({type: LOAD_SLOT}); 5 | export const LoadFactors = () => ({type: LOAD_FACTORS}); 6 | -------------------------------------------------------------------------------- /src/actions/EditFactor.js: -------------------------------------------------------------------------------- 1 | export const EDIT_FACTOR = 'Edit factor.'; 2 | 3 | export const EditFactor = (idx, name) => ({ 4 | type: EDIT_FACTOR, 5 | payload: { 6 | name: name, 7 | idx: idx 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /src/actions/ToggleModal.js: -------------------------------------------------------------------------------- 1 | export const TOGGLE_MODAL = 'Toggle modal.'; 2 | 3 | export const ToggleModal = (name, data) => ({ 4 | type: TOGGLE_MODAL, 5 | payload: { 6 | name: name, 7 | data: data 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /src/actions/SaveStateLocalStorage.js: -------------------------------------------------------------------------------- 1 | export const SAVE_STATE_LOCALSTORAGE = 'Saving state to Local Storage'; 2 | 3 | export const SaveStateLocalStorage = state => ({ 4 | type: SAVE_STATE_LOCALSTORAGE, payload: { 5 | state 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /src/actions/DropEquipItem.js: -------------------------------------------------------------------------------- 1 | export const DROP_EQUIP_ITEM = 'Drop equip item.'; 2 | 3 | export const DropEquipItem = (source, target) => ({ 4 | type: DROP_EQUIP_ITEM, 5 | payload: { 6 | source: source, 7 | target: target 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /src/actions/ToggleSaved.js: -------------------------------------------------------------------------------- 1 | export const TOGGLE_SAVED = 'Show/hide saved loadout.'; 2 | export const TOGGLE_UNUSED = 'Show/hide unused items.'; 3 | 4 | export const ToggleSaved = () => ({type: TOGGLE_SAVED}); 5 | 6 | export const ToggleUnused = () => ({type: TOGGLE_UNUSED}); 7 | -------------------------------------------------------------------------------- /src/actions/Crement.js: -------------------------------------------------------------------------------- 1 | export const CREMENT = '[in|de]crement value.'; 2 | 3 | export const Crement = (name, val, min, max) => ({ 4 | type: CREMENT, 5 | payload: { 6 | name: name, 7 | val: val, 8 | min: min, 9 | max: max 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /src/actions/LockItem.js: -------------------------------------------------------------------------------- 1 | export const LOCK_ITEM = 'Lock item.'; 2 | 3 | export const LockItem = (lock, slot, idx) => { 4 | return { 5 | type: LOCK_ITEM, 6 | payload: { 7 | lock: lock, 8 | slot: slot, 9 | idx: idx 10 | } 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /src/actions/Hack.js: -------------------------------------------------------------------------------- 1 | export const HACK = 'Optimize hacks.'; 2 | export const HACK_ASYNC = 'Optimize hacks async.'; 3 | 4 | export const Hack = (vals) => ({ 5 | type: HACK, 6 | payload: { 7 | vals: vals 8 | } 9 | }); 10 | 11 | export const HackAsync = () => ({type: HACK_ASYNC, payload: {}}); 12 | -------------------------------------------------------------------------------- /src/actions/Wish.js: -------------------------------------------------------------------------------- 1 | export const WISH = 'Optimize wishes.'; 2 | export const WISH_ASYNC = 'Optimize wishes async.'; 3 | 4 | export const Wish = (vals) => ({ 5 | type: WISH, 6 | payload: { 7 | vals: vals 8 | } 9 | }); 10 | 11 | export const WishAsync = () => ({type: WISH_ASYNC, payload: {}}); 12 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/MemberReferenceRecord.js: -------------------------------------------------------------------------------- 1 | class MemberReferenceRecord { 2 | constructor() { 3 | this.idRef = 0; 4 | } 5 | 6 | read(reader) { 7 | this.idRef = reader.readInt32(); 8 | } 9 | } 10 | 11 | export default MemberReferenceRecord; -------------------------------------------------------------------------------- /src/containers/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /src/components/Item/Item.css: -------------------------------------------------------------------------------- 1 | .disable-item { 2 | opacity: .20; 3 | } 4 | 5 | .lock-item { 6 | outline: 2px solid red; 7 | outline-offset: -2px; 8 | } 9 | 10 | .unused-item { 11 | outline: 2px solid red; 12 | outline-offset: -2px; 13 | } 14 | 15 | .item-container { 16 | display: inline-block; 17 | } -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ClassSerializationRecord.js: -------------------------------------------------------------------------------- 1 | class ClassSerializationRecord { 2 | constructor() { 3 | this.classInfo = null; 4 | this.memberTypeInfo = null; 5 | this.value = null; 6 | this.libraryId = null; 7 | } 8 | } 9 | 10 | export default ClassSerializationRecord; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/DeferredItem.js: -------------------------------------------------------------------------------- 1 | class DeferredItem { 2 | constructor(owner, member, id, deferredAction) { 3 | this.owner = owner; 4 | this.member = member; 5 | this.id = id; 6 | this.deferredAction = deferredAction; 7 | } 8 | } 9 | 10 | export default DeferredItem; -------------------------------------------------------------------------------- /src/actions/EditItem.js: -------------------------------------------------------------------------------- 1 | export const EDIT_ITEM = 'Edit item.'; 2 | 3 | export const EditItem = (itemId, level) => { 4 | return { 5 | type: EDIT_ITEM, 6 | payload: { 7 | itemId: itemId, 8 | level: level === undefined 9 | ? 0 10 | : Number(level) 11 | } 12 | } 13 | }; 14 | -------------------------------------------------------------------------------- /src/actions/OptimizeGear.js: -------------------------------------------------------------------------------- 1 | export const OPTIMIZE_GEAR = 'Optimize gear.'; 2 | export const OPTIMIZE_GEAR_ASYNC = 'Optimize gear async.'; 3 | 4 | export const OptimizeGear = state => ({ 5 | type: OPTIMIZE_GEAR, payload: { 6 | state 7 | } 8 | }); 9 | 10 | export const OptimizeGearAsync = () => ({type: OPTIMIZE_GEAR_ASYNC, payload: {}}); 11 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ArrayInfo.js: -------------------------------------------------------------------------------- 1 | class ArrayInfo { 2 | constructor() { 3 | this.objectId = 0; 4 | this.length = 0; 5 | } 6 | 7 | read(reader) { 8 | this.objectId = reader.readInt32(); 9 | this.length = reader.readInt32(); 10 | } 11 | } 12 | 13 | export default ArrayInfo; -------------------------------------------------------------------------------- /src/actions/OptimizeSaves.js: -------------------------------------------------------------------------------- 1 | export const OPTIMIZE_SAVES = 'Optimize saves.'; 2 | export const OPTIMIZE_SAVES_ASYNC = 'Optimize saves async.'; 3 | 4 | export const OptimizeSaves = state => ({ 5 | type: OPTIMIZE_SAVES, payload: { 6 | state 7 | } 8 | }); 9 | 10 | export const OptimizeSavesAsync = () => ({type: OPTIMIZE_SAVES_ASYNC, payload: {}}); 11 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ClassTypeInfo.js: -------------------------------------------------------------------------------- 1 | class ClassTypeInfo { 2 | constructor() { 3 | this.typeName = ''; 4 | this.libraryId = 0; 5 | } 6 | 7 | read(reader) { 8 | this.typeName = reader.readString(); 9 | this.libraryId = reader.readInt32(); 10 | } 11 | } 12 | 13 | export default ClassTypeInfo; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ClassWithIdRecord.js: -------------------------------------------------------------------------------- 1 | class ClassWithIdRecord { 2 | constructor() { 3 | this.objectId = 0; 4 | this.metadataId = 0; 5 | } 6 | 7 | read(reader) { 8 | this.objectId = reader.readInt32(); 9 | this.metadataId = reader.readInt32(); 10 | } 11 | } 12 | 13 | export default ClassWithIdRecord; -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Gear Optimizer", 3 | "name": "Gear Optimizer for NGU Idle", 4 | "icons": [ 5 | { 6 | "src": "favicon-720.png", 7 | "sizes": "720x720", 8 | "type": "image/png" 9 | } 10 | ], 11 | "start_url": ".", 12 | "scope": "/", 13 | "display": "standalone", 14 | "theme_color": "#333", 15 | "background_color": "#fff" 16 | } 17 | -------------------------------------------------------------------------------- /src/actions/DisableItem.js: -------------------------------------------------------------------------------- 1 | export const DISABLE_ITEM = 'Disable item.'; 2 | export const DISABLE_ZONE = 'Disable zone.'; 3 | 4 | export const DisableItem = itemId => ({ 5 | type: DISABLE_ITEM, 6 | payload: { 7 | id: itemId 8 | } 9 | }); 10 | 11 | export const DisableZone = zoneId => ({ 12 | type: DISABLE_ZONE, 13 | payload: { 14 | id: zoneId 15 | } 16 | }); -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/BinaryLibraryRecord.js: -------------------------------------------------------------------------------- 1 | class BinaryLibraryRecord { 2 | constructor() { 3 | this.libraryId = 0; 4 | this.libraryName = ''; 5 | } 6 | 7 | read(reader) { 8 | this.libraryId = reader.readInt32(); 9 | this.libraryName = reader.readString(); 10 | } 11 | } 12 | 13 | export default BinaryLibraryRecord; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/BinaryObjectStringRecord.js: -------------------------------------------------------------------------------- 1 | class BinaryObjectStringRecord { 2 | constructor() { 3 | this.objectId = 0; 4 | this.value = ''; 5 | } 6 | 7 | read(reader) { 8 | this.objectId = reader.readInt32(); 9 | this.value = reader.readString(); 10 | } 11 | } 12 | 13 | export default BinaryObjectStringRecord; -------------------------------------------------------------------------------- /data/decode.sh: -------------------------------------------------------------------------------- 1 | mv level0.decode level0.decode.old 2 | 3 | ngupos=$(LANG=C grep -obUaP '\xe7\x84\x11\x55\xe7\x84\x11\x55\xe7\x84\x11\x55\xe7\x84\x11\x55' level0) 4 | hackpos=$(grep "Attack/Defense H" -abom1 level0) 5 | wishpos=$(grep "I wish" -abom1 level0) 6 | 7 | echo python decode.py $(echo ${hackpos} ${wishpos} ${ngupos} | grep [0-9]* -o) 8 | python decode.py $(echo ${hackpos} ${wishpos} ${ngupos} | grep [0-9]* -o) > level0.decode 9 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ObjectNullMultipleRecord.js: -------------------------------------------------------------------------------- 1 | class ObjectNullMultipleRecord { 2 | constructor() { 3 | this.nullCount = 0; 4 | } 5 | 6 | read(reader, is256) { 7 | if (is256) { 8 | this.nullCount = reader.readByte(); 9 | } else { 10 | this.nullCount = reader.readInt32(); 11 | } 12 | } 13 | } 14 | 15 | export default ObjectNullMultipleRecord; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ArraySingleObjectRecord.js: -------------------------------------------------------------------------------- 1 | import ArrayInfo from './ArrayInfo'; 2 | 3 | class ArraySingleObjectRecord { 4 | static className = "ArraySingleObjectRecord"; 5 | constructor() { 6 | this.arrayInfo = null; 7 | } 8 | 9 | read(reader) { 10 | this.arrayInfo = new ArrayInfo(); 11 | this.arrayInfo.read(reader); 12 | } 13 | } 14 | 15 | export default ArraySingleObjectRecord; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ArraySingleStringRecord.js: -------------------------------------------------------------------------------- 1 | import ArrayInfo from './ArrayInfo'; 2 | 3 | class ArraySingleStringRecord { 4 | static className = "ArraySingleStringRecord"; 5 | constructor() { 6 | this.arrayInfo = null; 7 | } 8 | 9 | read(reader) { 10 | this.arrayInfo = new ArrayInfo(); 11 | this.arrayInfo.read(reader); 12 | } 13 | } 14 | 15 | export default ArraySingleStringRecord; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/README.md: -------------------------------------------------------------------------------- 1 | # jsBinaryFormatDataStructure 2 | JavaScript Library for parsing [MS-NRBF](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrbf/75b9fe09-be15-475f-85b8-ae7b7558cfe5) streams. 3 | This is a port of the .NET library [BinaryFormatDataStructure](https://github.com/bbowyersmyth/BinaryFormatDataStructure) to JavaScript. 4 | 5 | This library allows the parsing of MS-NRBF files to JavaScript objects. 6 | -------------------------------------------------------------------------------- /src/actions/EquipItem.js: -------------------------------------------------------------------------------- 1 | export const EQUIP_ITEM = 'Equip item.'; 2 | export const EQUIP_ITEMS = 'Equip items.'; 3 | 4 | export const EquipItem = itemId => { 5 | return { 6 | type: EQUIP_ITEM, 7 | payload: { 8 | id: itemId 9 | } 10 | } 11 | }; 12 | 13 | export const EquipItems = itemIds => { 14 | return { 15 | type: EQUIP_ITEMS, 16 | payload: { 17 | ids: itemIds 18 | } 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ClassWithMembersRecord.js: -------------------------------------------------------------------------------- 1 | import ClassInfo from "./ClassInfo"; 2 | 3 | class ClassWithMembersRecord { 4 | constructor() { 5 | this.classInfo = null; 6 | this.libraryId = 0; 7 | } 8 | 9 | read(reader) { 10 | this.classInfo = new ClassInfo(); 11 | this.classInfo.read(reader); 12 | this.libraryId = reader.readInt32(); 13 | } 14 | } 15 | 16 | export default ClassWithMembersRecord; -------------------------------------------------------------------------------- /src/actions/SaveSlot.js: -------------------------------------------------------------------------------- 1 | export const SAVE_SLOT = 'Save.'; 2 | export const SAVE_NAME = 'Save name.'; 3 | export const SAVE_SELECT = 'Save select.'; 4 | 5 | export const SaveSlot = () => ({type: SAVE_SLOT}); 6 | 7 | export const SaveName = (name) => ({ 8 | type: SAVE_NAME, 9 | payload: { 10 | name: name 11 | } 12 | }); 13 | 14 | export const SaveSelect = (loc, idx) => ({ 15 | type: SAVE_SELECT, 16 | payload: { 17 | loc: loc, 18 | idx: idx 19 | } 20 | }); 21 | -------------------------------------------------------------------------------- /src/stylesheets/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 12 | monospace; 13 | } 14 | 15 | body, html, #app { 16 | height: 100%; 17 | } -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/MemberPrimitiveTypedRecord.js: -------------------------------------------------------------------------------- 1 | import PrimitiveReader from './PrimitiveReader'; 2 | 3 | class MemberPrimitiveTypedRecord { 4 | constructor() { 5 | this.primitiveType = null; 6 | this.value = null; 7 | } 8 | 9 | read(reader) { 10 | this.primitiveType = reader.readByte(); 11 | this.value = PrimitiveReader.read(this.primitiveType, reader); 12 | } 13 | } 14 | 15 | export default MemberPrimitiveTypedRecord; -------------------------------------------------------------------------------- /config-overrides.js: -------------------------------------------------------------------------------- 1 | module.exports = function override(config, env) { 2 | config.module.rules.push({ 3 | test: /\.worker\.js$/i, 4 | use: [ 5 | { 6 | loader: 'worker-loader' 7 | }, { 8 | loader: 'babel-loader' 9 | } 10 | ] 11 | }); 12 | config.output['globalObject'] = 'this'; 13 | 14 | return config; 15 | } 16 | -------------------------------------------------------------------------------- /src/actions/Settings.js: -------------------------------------------------------------------------------- 1 | export const SETTINGS = 'Configure settings.'; 2 | export const TITAN = 'Go to titan.'; 3 | 4 | export const Settings = (statname, stats) => ({ 5 | type: SETTINGS, 6 | payload: { 7 | statname: statname, 8 | stats: stats 9 | } 10 | }); 11 | 12 | export const Go2Titan = (titan, looty, pendant, accslots) => ({ 13 | type: TITAN, 14 | payload: { 15 | titan: titan, 16 | looty: looty, 17 | pendant: pendant, 18 | accslots: accslots 19 | } 20 | }); 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | 25 | *.out 26 | items/items.ts 27 | 28 | _git_commit.js 29 | _version.js 30 | 31 | .tags* 32 | licenses.json 33 | 34 | .idea 35 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ArraySinglePrimitiveRecord.js: -------------------------------------------------------------------------------- 1 | import ArrayInfo from './ArrayInfo'; 2 | 3 | class ArraySinglePrimitiveRecord { 4 | static className = "ArraySinglePrimitiveRecord"; 5 | constructor() { 6 | this.arrayInfo = null; 7 | this.primitiveType = null; 8 | } 9 | 10 | read(reader) { 11 | this.arrayInfo = new ArrayInfo(); 12 | this.arrayInfo.read(reader); 13 | this.primitiveType = reader.readByte(); 14 | } 15 | } 16 | 17 | export default ArraySinglePrimitiveRecord; -------------------------------------------------------------------------------- /src/actions/Augment.js: -------------------------------------------------------------------------------- 1 | export const AUGMENT = 'Optimize augments.'; 2 | export const AUGMENT_ASYNC = 'Optimize augments async.'; 3 | export const AUGMENT_SETTINGS = 'Configure augments.'; 4 | 5 | export const AugmentSettings = (lsc, time) => ({ 6 | type: AUGMENT_SETTINGS, 7 | payload: { 8 | lsc: lsc, 9 | time: time 10 | } 11 | }); 12 | 13 | export const Augment = (vals) => ({ 14 | type: AUGMENT, 15 | payload: { 16 | vals: vals 17 | } 18 | }); 19 | 20 | export const AugmentAsync = () => ({type: AUGMENT_ASYNC, payload: {}}); 21 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/SystemClassWithMembersAndTypesRecord.js: -------------------------------------------------------------------------------- 1 | import MemberTypeInfo from "./MemberTypeInfo"; 2 | import SystemClassWithMembersRecord from "./SystemClassWithMembersRecord"; 3 | 4 | class SystemClassWithMembersAndTypesRecord extends SystemClassWithMembersRecord { 5 | read(reader) { 6 | const library = super.read(reader); 7 | this.memberTypeInfo = new MemberTypeInfo(); 8 | this.memberTypeInfo.read(this.classInfo.memberCount, reader); 9 | return library; 10 | } 11 | } 12 | 13 | export default SystemClassWithMembersAndTypesRecord; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/BinaryArrayType.js: -------------------------------------------------------------------------------- 1 | const BinaryArrayType = { 2 | Single: 0, // A single-dimensional Array. 3 | Jagged: 1, // An Array whose elements are Arrays. The elements of a jagged Array can be of different dimensions and sizes. 4 | Rectangular: 2, // A multi-dimensional rectangular Array. 5 | SingleOffset: 3, // A single-dimensional offset. 6 | JaggedOffset: 4, // A jagged Array where the lower bound index is greater than 0. 7 | RectangularOffset: 5 // Multi-dimensional Arrays where the lower bound index of at least one of the dimensions is greater than 0. 8 | }; 9 | 10 | export default BinaryArrayType; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ClassInfo.js: -------------------------------------------------------------------------------- 1 | class ClassInfo { 2 | constructor() { 3 | this.objectId = 0; 4 | this.name = ''; 5 | this.memberCount = 0; 6 | this.memberNames = []; 7 | } 8 | 9 | read(reader) { 10 | this.objectId = reader.readInt32(); 11 | this.name = reader.readString(); 12 | this.memberCount = reader.readInt32(); 13 | this.memberNames = new Array(this.memberCount); 14 | 15 | for (let i = 0; i < this.memberNames.length; i++) { 16 | this.memberNames[i] = reader.readString(); 17 | } 18 | } 19 | } 20 | 21 | export default ClassInfo; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/ClassWithMembersAndTypesRecord.js: -------------------------------------------------------------------------------- 1 | import ClassSerializationRecord from './ClassSerializationRecord'; 2 | import ClassInfo from './ClassInfo'; 3 | import MemberTypeInfo from './MemberTypeInfo'; 4 | 5 | class ClassWithMembersAndTypesRecord extends ClassSerializationRecord { 6 | read(reader) { 7 | this.classInfo = new ClassInfo(); 8 | this.classInfo.read(reader); 9 | this.memberTypeInfo = new MemberTypeInfo(); 10 | this.memberTypeInfo.read(this.classInfo.memberCount, reader); 11 | this.libraryId = reader.readInt32(); 12 | } 13 | } 14 | 15 | export default ClassWithMembersAndTypesRecord; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/SerializationHeaderRecord.js: -------------------------------------------------------------------------------- 1 | class SerializationHeaderRecord { 2 | constructor() { 3 | this.rootId = 0; 4 | this.headerId = 0; 5 | this.majorVersion = 0; 6 | this.minorVersion = 0; 7 | } 8 | 9 | readAndValidate(reader) { 10 | this.rootId = reader.readInt32(); 11 | this.headerId = reader.readInt32(); 12 | this.majorVersion = reader.readInt32(); 13 | this.minorVersion = reader.readInt32(); 14 | 15 | if (this.majorVersion !== 1 || this.minorVersion !== 0) { 16 | throw new Error("Invalid NRBF stream"); 17 | } 18 | } 19 | } 20 | 21 | export default SerializationHeaderRecord; -------------------------------------------------------------------------------- /src/components/OptimizeButton/OptimizeButton.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | export default class OptimizeButton extends Component { 5 | static propTypes = { 6 | running: PropTypes.bool.isRequired, 7 | abort: PropTypes.func.isRequired, 8 | optimize: PropTypes.func.isRequired 9 | }; 10 | 11 | render() { 12 | if (this.props.running) { 13 | return (); 16 | } else { 17 | return (); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/components/About/About.css: -------------------------------------------------------------------------------- 1 | .center { 2 | margin: auto; 3 | text-align: center; 4 | } 5 | 6 | .half { 7 | width: 50%; 8 | } 9 | 10 | .hide { 11 | display: none; 12 | } 13 | 14 | .port-modal { 15 | position: absolute; 16 | top: 50%; 17 | left: 50%; 18 | right: auto; 19 | bottom: auto; 20 | border: 1px solid rgb(204, 204, 204); 21 | background: rgb(255, 255, 255); 22 | overflow: auto; 23 | border-radius: 4px; 24 | outline: none; 25 | padding: 20px; 26 | margin-right: -50%; 27 | transform: translate(-50%, -50%); 28 | } 29 | 30 | .port-overlay { 31 | position: fixed; 32 | top: 0px; 33 | left: 0px; 34 | right: 0px; 35 | bottom: 0px; 36 | background-color: rgba(0, 0, 0, 0.75); 37 | } -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Gear Optimizer 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /src/components/ResetItemsButton/ResetItemsButton.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {useDispatch, useSelector} from 'react-redux'; 3 | import {MassUpdate} from '../../actions/MassUpdateItems'; 4 | 5 | const ResetItemsButton = () => { 6 | const dispatch = useDispatch(); 7 | const itemdata = useSelector(state => state.optimizer.itemdata); 8 | const onClick = () => { 9 | let newItemData = {...itemdata} 10 | for (let i of Object.keys(newItemData)) { 11 | newItemData[i].disable = false 12 | newItemData[i].level = 100 13 | } 14 | 15 | dispatch(MassUpdate(newItemData)) 16 | } 17 | 18 | return ( 19 | 20 | ) 21 | } 22 | 23 | ResetItemsButton.propTypes = {} 24 | export default ResetItemsButton; 25 | -------------------------------------------------------------------------------- /src/components/ItemTable/ItemTable.css: -------------------------------------------------------------------------------- 1 | .item-table { 2 | width: 48vw; 3 | height: 72vh; 4 | margin: auto; 5 | overflow-y: auto; 6 | overflow-x: hidden; 7 | border: 2px solid black; 8 | border-radius: 5px; 9 | margin: 0vh 1vw; 10 | } 11 | 12 | .stats-section { 13 | margin: 5px; 14 | } 15 | 16 | .item-section { 17 | display: inline-block; 18 | overflow: hidden; 19 | min-width: 50px; 20 | max-width: 45vw; 21 | display: block; 22 | margin: 5px; 23 | border: 1px solid black; 24 | border-radius: 5px; 25 | } 26 | 27 | .increase-stat { 28 | color: green; 29 | } 30 | 31 | .dark-mode .increase-stat { 32 | color: #1fb52e; 33 | } 34 | 35 | .same-stat { 36 | color: black; 37 | } 38 | 39 | .dark-mode .same-stat { 40 | color: white; 41 | } 42 | 43 | .decrease-stat { 44 | color: red; 45 | } 46 | 47 | .priority-stat { 48 | font-weight: bold; 49 | } 50 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/SystemClassWithMembersRecord.js: -------------------------------------------------------------------------------- 1 | import ClassSerializationRecord from "./ClassSerializationRecord"; 2 | import ClassInfo from "./ClassInfo"; 3 | 4 | class SystemClassWithMembersRecord extends ClassSerializationRecord { 5 | read(reader) { 6 | this.classInfo = new ClassInfo(); 7 | this.classInfo.read(reader); 8 | 9 | // The libraryId is stored in the class name, so we need to parse it out 10 | const className = this.classInfo.name; 11 | const regex = /^(.*)`(\d+)\[\[(.*)\]\]$/; 12 | this.libraryId = -1; 13 | if (!className.match(regex)) { 14 | return {}; 15 | } 16 | const [_, typeName, libraryId, library] = className.match(regex); 17 | this.classInfo.name = typeName; 18 | this.libraryId = libraryId; 19 | return library; 20 | } 21 | } 22 | 23 | export default SystemClassWithMembersRecord; -------------------------------------------------------------------------------- /data/wishtime.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def ticks2time(ticks): 5 | ticks = int(ticks) 6 | d = max(0, ticks // (24 * 60 * 60 * 50)) 7 | ticks -= d * 24 * 60 * 60 * 50 8 | h = max(0, ticks // (60 * 60 * 50)) 9 | ticks -= h * 60 * 60 * 50 10 | m = max(0, ticks // (60 * 50)) 11 | ticks -= m * 60 * 50 12 | s = max(0, ticks // 50) 13 | ticks -= s * 50 14 | return (d, h, m, s, ticks) 15 | 16 | 17 | d, h, m, s, t = 1, 12, 54, 10.6, 0 18 | 19 | time = d 20 | time = time * 24 + h 21 | time = time * 60 + m 22 | time = time * 60 + s 23 | time = time * 50 + t 24 | 25 | progress = np.float32(0) 26 | ticks = 0 27 | 28 | ppt = np.float32(np.float32(1) / np.float32(time)) 29 | 30 | target = np.float32(1) 31 | 32 | while progress < target: 33 | next = progress + ppt 34 | if next == progress: 35 | print(f'early exit at {100 * progress:.2f}%') 36 | time *= progress 37 | break 38 | progress = next 39 | ticks += 1 40 | 41 | print(ticks2time(time)) 42 | print(ticks2time(ticks)) 43 | print(ticks2time(abs(ticks - time))) 44 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import {applyMiddleware, compose, createStore} from 'redux'; 4 | import {Provider} from 'react-redux'; 5 | import createSagaMiddleware from 'redux-saga' 6 | 7 | import AppReducer from './reducers'; 8 | import rootSaga from './sagas' 9 | 10 | import './stylesheets/index.css'; 11 | 12 | import App from './containers/App'; 13 | 14 | import * as serviceWorker from './serviceWorker'; 15 | 16 | const sagaMiddleware = createSagaMiddleware(); 17 | const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; 18 | const store = createStore(AppReducer, composeEnhancers(applyMiddleware(sagaMiddleware))); 19 | sagaMiddleware.run(rootSaga);/* inject our sagas into the middleware */ 20 | 21 | ReactDOM.render( 22 | 23 | , document.getElementById('app'),); 24 | 25 | // If you want your app to work offline and load faster, you can change 26 | // unregister() to register() below. Note this comes with some pitfalls. 27 | // Learn more about service workers: https://bit.ly/CRA-PWA 28 | serviceWorker.register(); 29 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 gmiclotte 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/components/Crement/Crement.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | export default class Crement extends Component { 5 | static propTypes = { 6 | header: PropTypes.string.isRequired, 7 | handleClick: PropTypes.func.isRequired 8 | }; 9 | 10 | render() { 11 | const isInfinity = this.props.value === Infinity; 12 | return ( 13 |
14 | 18 | 22 | {this.props.header + ': '} 23 | 24 | {isInfinity ? '∞' : this.props.value} 25 | 26 |
27 | ); 28 | } 29 | } -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/MemberTypeInfo.js: -------------------------------------------------------------------------------- 1 | import BinaryType from './BinaryType'; 2 | import ClassTypeInfo from './ClassTypeInfo'; 3 | 4 | class MemberTypeInfo { 5 | constructor() { 6 | this.binaryType = []; 7 | this.additionalInfos = []; 8 | } 9 | 10 | read(count, reader) { 11 | this.binaryType = new Array(count); 12 | 13 | for (let i = 0; i < count; i++) { 14 | this.binaryType[i] = reader.readByte(); 15 | } 16 | 17 | this.additionalInfos = new Array(count); 18 | 19 | for (let i = 0; i < count; i++) { 20 | if (this.binaryType[i] === BinaryType.Primitive || this.binaryType[i] === BinaryType.PrimitiveArray) { 21 | this.additionalInfos[i] = reader.readByte(); 22 | } else if (this.binaryType[i] === BinaryType.SystemClass) { 23 | this.additionalInfos[i] = reader.readString(); // System class name 24 | } else if (this.binaryType[i] === BinaryType.Class) { 25 | const typeInfo = new ClassTypeInfo(); 26 | typeInfo.read(reader); 27 | this.additionalInfos[i] = typeInfo; 28 | } 29 | } 30 | } 31 | } 32 | 33 | export default MemberTypeInfo; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/BinaryType.js: -------------------------------------------------------------------------------- 1 | const BinaryType = Object.freeze({ 2 | Primitive: 0, // The Remoting Type is defined in PrimitiveTypeEnumeration and the Remoting Type is not a string. 3 | String: 1, // The Remoting Type is a LengthPrefixedString. 4 | Object: 2, // The Remoting Type is System.Object. 5 | SystemClass: 3, // The Remoting Type is one of the following: 6 | // A Class (2) in the System Library 7 | // An Array whose Ultimate Array Item Type is a Class (2) in the System Library 8 | // An Array whose Ultimate Array Item Type is System.Object, String, or a Primitive Type but does not meet the definition of ObjectArray, StringArray, or PrimitiveArray. 9 | Class: 4, // The Remoting Type is a Class (2) or an Array whose Ultimate Array Item Type is a Class (2) that is not in the System Library. 10 | ObjectArray: 5, // The Remoting Type is a single-dimensional Array of System.Object with a lower bound of 0. 11 | StringArray: 6, // The Remoting Type is a single-dimensional Array of String with a lower bound of 0. 12 | PrimitiveArray: 7 // The Remoting Type is a single-dimensional Array of Primitive Type with a lower bound of 0. 13 | }); 14 | 15 | export default BinaryType; -------------------------------------------------------------------------------- /src/components/VersionForm/VersionForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class VersionForm extends React.Component { 4 | constructor(props) { 5 | super(props); 6 | this.state = { 7 | value: this.props.version 8 | }; 9 | this.handleChange = this.handleChange.bind(this); 10 | this.handleSubmit = this.handleSubmit.bind(this); 11 | } 12 | 13 | handleChange(event) { 14 | this.setState({value: event.target.value}); 15 | this.props.handleChange(event, 'version'); 16 | } 17 | 18 | handleSubmit(event) { 19 | event.preventDefault(); 20 | } 21 | 22 | render() { 23 | //HACK: this sets the dropdown to the correct value after loading 24 | if (this.state.value !== this.props.augstats.version) { 25 | /* eslint-disable-next-line react/no-direct-mutation-state */ 26 | this.state.value = this.props.augstats.version; 27 | } 28 | const version_names = ['normal', 'evil', 'sadistic']; 29 | return (); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/BinaryObject.js: -------------------------------------------------------------------------------- 1 | class BinaryObject { 2 | constructor(typeName, assemblyName) { 3 | if (!typeName || !assemblyName) { 4 | throw new Error(`BinaryObject typeName ${typeName} or assemblyName ${assemblyName} are invalid`); 5 | } 6 | this._members = new Map(); 7 | this.typeName = typeName; 8 | this.assemblyName = assemblyName; 9 | this.referenceObject = null; 10 | } 11 | 12 | get count() { 13 | return this._members.size; 14 | } 15 | 16 | get keys() { 17 | return Array.from(this._members.keys()); 18 | } 19 | 20 | get(memberName) { 21 | return this._members.get(memberName) || null; 22 | } 23 | 24 | containsKey(memberName) { 25 | return this._members.has(memberName); 26 | } 27 | 28 | [Symbol.iterator]() { 29 | return this._members[Symbol.iterator](); 30 | } 31 | 32 | tryGetValue(memberName) { 33 | if (this._members.has(memberName)) { 34 | return {found: true, value: this._members.get(memberName)}; 35 | } 36 | return {found: false, value: null}; 37 | } 38 | 39 | addMember(memberName, value) { 40 | this._members.set(memberName, value); 41 | } 42 | } 43 | 44 | export default BinaryObject; -------------------------------------------------------------------------------- /src/stylesheets/App.css: -------------------------------------------------------------------------------- 1 | /* 2 | .App { 3 | text-align: center; 4 | } 5 | 6 | .App-logo { 7 | height: 5vmin; 8 | pointer-events: none; 9 | } 10 | 11 | .App-header { 12 | background-color: #280034; 13 | min-height: 1vh; 14 | display: flex; 15 | flex-direction: column; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: calc(10px + 2vmin); 19 | color: white; 20 | } 21 | 22 | .App-body { 23 | background-color: #282c34; 24 | min-height: 1vh; 25 | display: flex; 26 | flex-direction: column; 27 | align-items: center; 28 | justify-content: center; 29 | font-size: calc(10px + 2vmin); 30 | color: white; 31 | } 32 | 33 | .App-footer { 34 | background-color: #280034; 35 | min-height: 1vh; 36 | display: flex; 37 | flex-direction: column; 38 | align-items: center; 39 | justify-content: center; 40 | font-size: calc(10px + 2vmin); 41 | color: white; 42 | } 43 | 44 | .App-link { 45 | color: #61dafb; 46 | } 47 | 48 | @keyframes App-logo-spin { 49 | from { 50 | transform: rotate(0deg); 51 | } 52 | 53 | to { 54 | transform: rotate(360deg); 55 | } 56 | } 57 | */ -------------------------------------------------------------------------------- /src/components/WishForm/WishForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import {Wishes} from '../../assets/ItemAux' 4 | 5 | export default class WishForm extends React.Component { 6 | constructor(props) { 7 | super(props); 8 | this.state = { 9 | value: this.props.wishidx 10 | }; 11 | this.handleChange = this.handleChange.bind(this); 12 | this.handleSubmit = this.handleSubmit.bind(this); 13 | } 14 | 15 | handleChange(event) { 16 | this.setState({value: event.target.value}); 17 | this.props.handleChange(event, 'wishidx', this.props.idx); 18 | } 19 | 20 | handleSubmit(event) { 21 | event.preventDefault(); 22 | } 23 | 24 | render() { 25 | //HACK: this sets the dropdown to the correct value after loading 26 | if (this.state.value !== this.props.wishidx) { 27 | /* eslint-disable-next-line react/no-direct-mutation-state */ 28 | this.state.value = this.props.wishidx; 29 | } 30 | return (); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/Decimal.js: -------------------------------------------------------------------------------- 1 | import BigInt from "core-js/features/bigint"; 2 | 3 | // Decimal mimicks a C# decimal structure, which is a 128-bit value. 4 | // The toNumber method converts the C# decimal to a JavaScript number, this leads to a loss of precision. 5 | // No other operations have been implemented. 6 | export default class Decimal { 7 | constructor(buffer) { 8 | if (buffer.length !== 16) { 9 | throw new Error("Buffer length must be 16 bytes to represent a C# decimal"); 10 | } 11 | this.buffer = buffer; 12 | } 13 | 14 | toNumber() { 15 | // Extract parts of the C# decimal structure 16 | const low = this.buffer.readUInt32LE(0); 17 | const mid = this.buffer.readUInt32LE(4); 18 | const high = this.buffer.readUInt32LE(8); 19 | const flags = this.buffer.readUInt32LE(12); 20 | 21 | // Extract sign and scale 22 | const sign = (flags & 0x80000000) ? -1 : 1; 23 | const scale = (flags >> 16) & 0x7F; 24 | 25 | // Combine the parts to form the full value 26 | let value = (BigInt(high) << 64n) + (BigInt(mid) << 32n) + BigInt(low); 27 | 28 | // Apply sign 29 | value = value * BigInt(sign); 30 | 31 | // Apply scaling 32 | return Number(value) / Math.pow(10, scale); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/PrimitiveType.js: -------------------------------------------------------------------------------- 1 | // Enum for primitive types 2 | const PrimitiveType = Object.freeze({ 3 | None: 0, 4 | Boolean: 1, // Identifies a BOOLEAN as specified in [MS-DTYP] section 2.2.4. 5 | Byte: 2, // Identifies a BYTE as specified in [MS-DTYP] section 2.2.6. 6 | Char: 3, // Identifies a Char (section 2.1.1.1) type. 7 | // 4 The value is not used in the protocol. 8 | Decimal: 5, // Identifies a Decimal (section 2.1.1.7). 9 | Double: 6, // Identifies a Double (section 2.1.1.2). 10 | Int16: 7, // Identifies an INT16 as specified in [MS-DTYP] section 2.2.21. 11 | Int32: 8, // Identifies an INT32 as specified in [MS-DTYP] section 2.2.22. 12 | Int64: 9, // Identifies an INT64 as specified in [MS-DTYP] section 2.2.23. 13 | SByte: 10, // Identifies an INT8 as specified in [MS-DTYP] section 2.2.20. 14 | Single: 11, // Identifies a Single (section 2.1.1.3). 15 | TimeSpan: 12, // Identifies a TimeSpan (section 2.1.1.4). 16 | DateTime: 13, // Identifies a DateTime (section 2.1.1.5). 17 | UInt16: 14, // Identifies a UINT16 as specified in [MS-DTYP] section 2.2.48. 18 | UInt32: 15, // Identifies a UINT32 as specified in [MS-DTYP] section 2.2.49. 19 | UInt64: 16, // Identifies a UINT64 as specified in [MS-DTYP] section 2.2.50. 20 | Null: 17, // Identifies a Null Object. 21 | String: 18 // Identifies a LengthPrefixedString (section 2.1.1.6) value. 22 | }); 23 | 24 | export default PrimitiveType; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/RecordType.js: -------------------------------------------------------------------------------- 1 | // Enum for record types 2 | const RecordType = Object.freeze({ 3 | SerializedStreamHeader: 0, // Identifies the SerializationHeaderRecord. 4 | ClassWithId: 1, // Identifies a ClassWithId record. 5 | SystemClassWithMembers: 2, // Identifies a SystemClassWithMembers record. 6 | ClassWithMembers: 3, // Identifies a ClassWithMembers record. 7 | SystemClassWithMembersAndTypes: 4, // Identifies a SystemClassWithMembersAndTypes record. 8 | ClassWithMembersAndTypes: 5, // Identifies a ClassWithMembersAndTypes record. 9 | BinaryObjectString: 6, // Identifies a BinaryObjectString record. 10 | BinaryArray: 7, // Identifies a BinaryArray record. 11 | MemberPrimitiveTyped: 8, // Identifies a MemberPrimitiveTyped record. 12 | MemberReference: 9, // Identifies a MemberReference record. 13 | ObjectNull: 10, // Identifies an ObjectNull record. 14 | MessageEnd: 11, // Identifies a MessageEnd record. 15 | BinaryLibrary: 12, // Identifies a BinaryLibrary record. 16 | ObjectNullMultiple256: 13, // Identifies an ObjectNullMultiple256 record. 17 | ObjectNullMultiple: 14, // Identifies an ObjectNullMultiple record. 18 | ArraySinglePrimitive: 15, // Identifies an ArraySinglePrimitive record. 19 | ArraySingleObject: 16, // Identifies an ArraySingleObject record. 20 | ArraySingleString: 17, // Identifies an ArraySingleString record. 21 | MethodCall: 21, // Identifies a BinaryMethodCall record. 22 | MethodReturn: 22 // Identifies a BinaryMethodReturn record. 23 | }); 24 | 25 | export default RecordType; -------------------------------------------------------------------------------- /src/components/Content/Optimizer.css: -------------------------------------------------------------------------------- 1 | .content__container { 2 | display: flex; 3 | justify-content: center; 4 | align-items: center; 5 | } 6 | 7 | .button-section { 8 | width: 30vw; 9 | height: 20vh; 10 | display: block; 11 | overflow-y: auto; 12 | overflow-x: hidden; 13 | margin: 1vh 1vw; 14 | } 15 | 16 | .edit-item-modal { 17 | position: absolute; 18 | top: 50%; 19 | left: 50%; 20 | right: auto; 21 | bottom: auto; 22 | border: 1px solid rgb(204, 204, 204); 23 | background: rgb(255, 255, 255); 24 | overflow: auto; 25 | border-radius: 4px; 26 | outline: none; 27 | padding: 20px; 28 | margin-right: -50%; 29 | transform: translate(-50%, -50%); 30 | } 31 | 32 | .edit-item-overlay { 33 | position: fixed; 34 | top: 0px; 35 | left: 0px; 36 | right: 0px; 37 | bottom: 0px; 38 | background-color: rgba(0, 0, 0, 0.75); 39 | } 40 | 41 | .cubetable { 42 | border-spacing: 0px 0px; 43 | } 44 | 45 | .cubetable td { 46 | padding: 0px; 47 | } 48 | 49 | .loadSave label { 50 | margin-left: 3px 51 | } 52 | 53 | .factor-form-row { 54 | display: flex; 55 | align-items: center; 56 | gap: 1px; 57 | flex-wrap: wrap; 58 | } 59 | 60 | .factor-form-select, 61 | .factor-form-crement { 62 | flex: 1 1 100%; 63 | } 64 | 65 | @media (min-width: 600px) { 66 | .factor-form-select, 67 | .factor-form-crement { 68 | flex: 1; 69 | } 70 | } 71 | 72 | .crement-container { 73 | display: flex; 74 | align-items: center; 75 | white-space: nowrap; 76 | } 77 | 78 | .crement-button { 79 | height: 25px; 80 | width: 25px; 81 | min-width: 25px; 82 | } 83 | 84 | .crement-value { 85 | margin-left: 2px; 86 | } -------------------------------------------------------------------------------- /src/components/ExportForm/ExportForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class ExportForm extends React.Component { 4 | handleFocus(event) { 5 | event.target.select(); 6 | } 7 | 8 | handleClose() { 9 | this.fresh = true; 10 | this.props.closeExportModal(); 11 | } 12 | 13 | render() { 14 | return (
15 | 16 | 17 | 18 | 20 | 29 | 30 | 31 | 32 | 34 | 45 | 46 | 47 | 48 | 49 | 52 | 53 | 54 |
{'Current loadout: '} 19 | 21 | 28 |
{'Saved loadout: '} 33 | 35 | 36 | 44 |
50 | 51 |
55 |
); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/deserializeDotNet.js: -------------------------------------------------------------------------------- 1 | import {NRBFReader} from './jsBinaryFormatDataStructure/src/BinaryFormatterReader'; 2 | 3 | export class Deserializer { 4 | /** 5 | * @param {string} input 6 | */ 7 | static fromFile(input) { 8 | try { 9 | const content = Buffer.from(input, 'base64') 10 | // nrbfreader 11 | const wrapper = NRBFReader.readBuffer(content); 12 | const wrappedData = Buffer.from(wrapper[1].value._members.get("playerData"), 'base64'); 13 | return NRBFReader.readBuffer(wrappedData); 14 | } catch (error) { 15 | console.error('Could not parse file', error) 16 | } 17 | } 18 | 19 | static isMembersArray(obj) { 20 | return obj 21 | && obj.size === 3 22 | && obj.has("_items") 23 | && obj.has("_size") 24 | && obj.has("_version"); 25 | } 26 | 27 | static membersArrayToArray(tag, obj) { 28 | const arr = obj.get("_items").map((x, i) => Deserializer.convertData(tag + i, x)); 29 | return arr.filter((_, index) => index in arr) 30 | } 31 | 32 | static convertData(tag, entry) { 33 | if (typeof entry === "bigint") { 34 | return Number(entry); 35 | } 36 | if (!entry) { 37 | return entry; 38 | } 39 | if (entry.value) { 40 | return Deserializer.convertData(tag, entry.value); 41 | } 42 | if (!entry._members) { 43 | return entry; 44 | } 45 | // convert to array 46 | if (Deserializer.isMembersArray(entry._members)) { 47 | return Deserializer.membersArrayToArray(tag, entry._members); 48 | } 49 | // convert to dict 50 | const dict = {}; 51 | entry._members.forEach((value, key) => { 52 | dict[key] = Deserializer.convertData(key, value); 53 | }); 54 | return dict; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/components/AppLayout/AppLayout.css: -------------------------------------------------------------------------------- 1 | .nav-bar-list { 2 | list-style-type: none; 3 | margin: 0; 4 | padding: 0; 5 | overflow: hidden; 6 | width: 100%; 7 | height: 5vh; 8 | background-color: #333; 9 | display: flex; 10 | } 11 | 12 | .nav-bar-item { 13 | display: inline; 14 | float: left; 15 | border-right: 1px solid #fff; 16 | } 17 | 18 | .nav-bar-item-separator { 19 | margin-left: auto; 20 | } 21 | 22 | .nav-bar-item:last-child { 23 | border-right: none; 24 | padding-right: 10px; 25 | } 26 | 27 | .nav-link { 28 | display: block; 29 | color: white; 30 | text-align: center; 31 | height: 3vh; 32 | padding: 1vh 1vw; 33 | text-decoration: none; 34 | } 35 | 36 | .active { 37 | background-color: #33b; 38 | } 39 | 40 | /* Dark mode styling */ 41 | 42 | .app_container.dark-mode { 43 | min-height: 100%; 44 | background-color: #222; 45 | color: white; 46 | } 47 | 48 | div.ReactModal__Content.dark-mode { 49 | background-color: #222; 50 | color: white; 51 | } 52 | 53 | .dark-mode .howto { 54 | padding-bottom: 1px; 55 | } 56 | 57 | .dark-mode input, .dark-mode button, .dark-mode select { 58 | color: white; 59 | background-color: rgba(255, 255, 255, 0.02); 60 | border-color: white; 61 | } 62 | 63 | .dark-mode select option { 64 | color: white; 65 | background-color: #333; 66 | } 67 | 68 | .dark-mode div.basic-single *, .dark-mode div.select__menu * { 69 | color: white; 70 | background-color: #222; 71 | } 72 | 73 | .dark-mode div.select__input-container { 74 | color: white; 75 | background: transparent; 76 | } 77 | 78 | .dark-mode div.select__option--is-selected { 79 | background-color: #555; /* Your chosen background color for the selected item */ 80 | color: white; /* Ensures text color is white for readability */ 81 | } 82 | 83 | /* Styling for the focused item in the dropdown */ 84 | .dark-mode div.select__option--is-focused { 85 | background-color: #333; /* Custom background color for focused item */ 86 | color: white; /* Ensure text color is white */ 87 | } -------------------------------------------------------------------------------- /src/components/SaveForm/SaveForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class SaveForm extends React.Component { 4 | constructor(props) { 5 | super(props); 6 | this.state = { 7 | value: this.props.saveIdx 8 | }; 9 | this.handleChange = this.handleChange.bind(this); 10 | this.handleSubmit = this.handleSubmit.bind(this); 11 | } 12 | 13 | handleChange(event) { 14 | this.setState({value: event.target.value}); 15 | let stats; 16 | if (this.props.loc.length === 1) { 17 | stats = Number(event.target.value); 18 | } else if (this.props.loc.length === 2) { 19 | stats = { 20 | ...this.props[this.props.loc[0]], 21 | [this.props.loc[1]]: Number(event.target.value) 22 | } 23 | } else { 24 | console.log('not implemented SaveForm loc: ', this.props.loc); 25 | } 26 | console.log(this.props.loc, stats) 27 | this.props.handleSettings(this.props.loc[0], stats); 28 | } 29 | 30 | handleSubmit(event) { 31 | event.preventDefault(); 32 | } 33 | 34 | render() { 35 | //HACK: this sets the dropdown to the correct value after loading 36 | if (this.state.value !== this.props.saveIdx) { 37 | /* eslint-disable-next-line react/no-direct-mutation-state */ 38 | this.state.value = this.props.saveIdx; 39 | } 40 | return (); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/PrimitiveReader.js: -------------------------------------------------------------------------------- 1 | import PrimitiveType from './PrimitiveType'; 2 | 3 | class PrimitiveReader { 4 | static readTimeSpan(reader) { 5 | return new Date(reader.readInt64()); 6 | } 7 | 8 | static readDateTime(reader) { 9 | const TicksMask = 0x3FFFFFFFFFFFFFFFn; 10 | const dateData = reader.readInt64(); 11 | const ticks = dateData & TicksMask; 12 | return new Date(Number(ticks)); 13 | } 14 | 15 | static read(type, reader) { 16 | switch (type) { 17 | case PrimitiveType.Boolean: 18 | return reader.readBoolean(); 19 | case PrimitiveType.Byte: 20 | return reader.readByte(); 21 | case PrimitiveType.Char: 22 | return reader.readChar(); 23 | case PrimitiveType.Double: 24 | return reader.readDouble(); 25 | case PrimitiveType.Int16: 26 | return reader.readInt16(); 27 | case PrimitiveType.Int32: 28 | return reader.readInt32(); 29 | case PrimitiveType.Int64: 30 | return reader.readInt64(); 31 | case PrimitiveType.SByte: 32 | return reader.readSByte(); 33 | case PrimitiveType.Single: 34 | return reader.readSingle(); 35 | case PrimitiveType.UInt16: 36 | return reader.readUInt16(); 37 | case PrimitiveType.UInt32: 38 | return reader.readUInt32(); 39 | case PrimitiveType.UInt64: 40 | return reader.readUInt64(); 41 | case PrimitiveType.Decimal: 42 | return parseFloat(reader.readString()); 43 | case PrimitiveType.TimeSpan: 44 | return PrimitiveReader.readTimeSpan(reader); 45 | case PrimitiveType.DateTime: 46 | return PrimitiveReader.readDateTime(reader); 47 | default: 48 | throw new Error("Invalid primitive type: " + type); 49 | } 50 | } 51 | } 52 | 53 | export default PrimitiveReader; -------------------------------------------------------------------------------- /src/components/ImportSaveForm/jsBinaryFormatDataStructure/src/BinaryArrayRecord.js: -------------------------------------------------------------------------------- 1 | import BinaryArrayType from './BinaryArrayType'; 2 | import BinaryType from './BinaryType'; 3 | import ClassTypeInfo from './ClassTypeInfo'; 4 | import PrimitiveType from "./PrimitiveType"; 5 | 6 | class BinaryArrayRecord { 7 | static className = "BinaryArrayRecord"; 8 | constructor() { 9 | this.objectId = 0; 10 | this.binaryArrayType = null; 11 | this.rank = 0; 12 | this.lengths = []; 13 | this.lowerBounds = []; 14 | this.binaryType = null; 15 | this.primitiveType = PrimitiveType.None; 16 | this.systemClassName = ''; 17 | this.classTypeInfo = null; 18 | } 19 | 20 | read(reader) { 21 | this.objectId = reader.readInt32(); 22 | this.binaryArrayType = reader.readByte(); 23 | this.rank = reader.readInt32(); 24 | this.lengths = new Array(this.rank); 25 | for (let i = 0; i < this.rank; i++) { 26 | this.lengths[i] = reader.readInt32(); 27 | } 28 | if (this.binaryArrayType === BinaryArrayType.SingleOffset || 29 | this.binaryArrayType === BinaryArrayType.JaggedOffset || 30 | this.binaryArrayType === BinaryArrayType.RectangularOffset) { 31 | this.lowerBounds = new Array(this.rank); 32 | for (let i = 0; i < this.rank; i++) { 33 | this.lowerBounds[i] = reader.readInt32(); 34 | } 35 | } 36 | this.binaryType = reader.readByte(); 37 | switch (this.binaryType) { 38 | case BinaryType.Primitive: 39 | case BinaryType.PrimitiveArray: 40 | this.primitiveType = reader.readByte(); 41 | break; 42 | case BinaryType.SystemClass: 43 | this.systemClassName = reader.readString(); 44 | break; 45 | case BinaryType.Class: 46 | this.classTypeInfo = new ClassTypeInfo(); 47 | this.classTypeInfo.read(reader); 48 | break; 49 | default: 50 | throw new Error(`Unsupported binary type: ${this.binaryType}`); 51 | } 52 | } 53 | } 54 | 55 | export default BinaryArrayRecord; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "homepage": "https://gmiclotte.github.io/gear-optimizer", 3 | "name": "gear-optimizer", 4 | "version": "0.10.2", 5 | "private": true, 6 | "dependencies": { 7 | "buffer": "^6.0.3", 8 | "core-js": "^3.8.0", 9 | "gh-pages": "^2.2.0", 10 | "python-struct": "^1.1.3", 11 | "react": "^16.14.0", 12 | "react-cookie-banner": "^4.1.0", 13 | "react-dnd": "^14.0.3", 14 | "react-dnd-html5-backend": "^14.0.1", 15 | "react-dom": "^16.14.0", 16 | "react-ga": "^2.7.0", 17 | "react-modal": "^3.12.1", 18 | "react-redux": "^7.2.2", 19 | "react-router-dom": "^5.2.0", 20 | "react-scripts": "^3.4.4", 21 | "react-select": "^5.8.0", 22 | "react-tooltip": "^3.11.6", 23 | "redux": "^4.0.5", 24 | "redux-saga": "^1.1.3", 25 | "worker-loader": "^2.0.0" 26 | }, 27 | "scripts": { 28 | "git-info": "echo export default \"{\\\"logMessage\\\": \\\"$(git log -1 --oneline)\\\"}\" > src/_git_commit.js", 29 | "start": "react-app-rewired start", 30 | "build": "npm run release-it; npm run git-info; react-app-rewired build", 31 | "local": "export NODE_OPTIONS=--openssl-legacy-provider; HOST=localhost; rm -fr build/; react-app-rewired build; mv build gear-optimizer; mkdir build; mv gear-optimizer/ build/; cd build; mv gear-optimizer/index.html .; python -m http.server 8000", 32 | "test": "react-app-rewired test --env=jsdom", 33 | "eject": "react-scripts eject", 34 | "predeploy": "npm run build", 35 | "deploy": "gh-pages -d build", 36 | "release-it": "release-it; npm run version", 37 | "version": "echo export default \"{$(grep version -m1 package.json)}\" > src/_version.js", 38 | "init": "npm run git-info; npm run version" 39 | }, 40 | "eslintConfig": { 41 | "extends": "react-app" 42 | }, 43 | "browserslist": { 44 | "production": [ 45 | ">0.2%", 46 | "not dead", 47 | "not op_mini all" 48 | ], 49 | "development": [ 50 | "last 1 chrome version", 51 | "last 1 firefox version", 52 | "last 1 safari version" 53 | ] 54 | }, 55 | "release-it": { 56 | "npm": { 57 | "release": false 58 | } 59 | }, 60 | "devDependencies": { 61 | "react-app-rewired": "^2.1.6", 62 | "release-it": "^12.6.3" 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/components/PortForm/PortForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {LOCALSTORAGE_NAME} from '../../constants'; 3 | 4 | export default class PortForm extends React.Component { 5 | constructor(props) { 6 | super(props); 7 | this.handleChange = this.handleChange.bind(this); 8 | this.handleSubmit = this.handleSubmit.bind(this); 9 | this.state = { 10 | save: btoa(null) 11 | }; 12 | this.fresh = true; 13 | } 14 | 15 | handleSubmit(event) { 16 | event.preventDefault(); 17 | this.handleClose(); 18 | } 19 | 20 | handleChange(event, save) { 21 | if (save === undefined) { 22 | save = null; 23 | try { 24 | save = atob(this.state.save); 25 | } catch (e) { 26 | console.log('Error: invalid local storage imported.'); 27 | this.handleClose(); 28 | return; 29 | } 30 | } 31 | window.localStorage.setItem(LOCALSTORAGE_NAME, save); 32 | this.props.handleLoadStateLocalStorage(); 33 | 34 | } 35 | 36 | handleFocus(event) { 37 | event.target.select(); 38 | } 39 | 40 | handleClose() { 41 | this.fresh = true; 42 | this.props.closePortModal(); 43 | } 44 | 45 | render() { 46 | const save = btoa(window.localStorage.getItem(LOCALSTORAGE_NAME)); 47 | if (this.fresh) { 48 | //HACK: this sets the import field to the current value when opening the modal 49 | /* eslint-disable-next-line react/no-direct-mutation-state */ 50 | this.state.save = save; 51 | this.fresh = false; 52 | } 53 | return (
54 | 62 |
63 | 64 | {' '} 65 | 66 | {' '} 67 | 68 |
); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Gear Optimizer 2 | 3 | Gear Optimizer computes the optimal gear layout for specific features in [NGU Idle](https://www.kongregate.com/games/somethingggg/ngu-idle). [All artwork in this project](src/assets/img) is owned by the owner of NGU Idle and used here with permission, the license of this project does not apply to these files. 4 | 5 | ## How to 6 | 7 | Select up to 5 priorities, priority 1 is highest priority, if slots remain then the computation is continued with the remaining slots for priority 2 etc. Each priority has an explicit limit on allowed accessory slots. 8 | Increase or decrease number of allowed slots, and the total number of accessory slots. Move to your highest zone to prevent the optimization from taking items into account that you have no access to. 9 | 10 | Equip an item by clicking it once in the items list. Click an item in the equipment list to unequip it. 11 | Rightclick an item to change its level or to filter it, filtered items will be ignored for the optimalisation, but you can still manually equip them. Items with level `< 100` and filtered items are shown at the bottom of the left column, clicking items here always opens the edit window. Click the name of a zone in the items list to hide all its items. 12 | 13 | Start the computation by clicking the `Optimize Gear` button. It should finish in milliseconds to minutes. Sometimes it can be a lot slower if many items are available. Luckily you can simply choose to abort the current computation, or just come back tomorrow and hope it finished. 14 | 15 | ## Algorithm 16 | 17 | Basis of the algorithm is pareto optimal filtering and dynamic programming knapsack algorithm. 18 | Fast algorithm iteratively replaces the worst candidate accessories with the best alternative, until no more swaps improve the build. 19 | 20 | ## Acknowledgements 21 | 22 | Many thanks to the NGU community on Discord for the helpful discussions. 23 | 24 | ## Dev notes 25 | 26 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). [React-app-rewired](https://github.com/timarney/react-app-rewired) is used to handle web worker integration. 27 | 28 | ## How to install and compile 29 | 30 | ``` 31 | git clone https://github.com/gmiclotte/gear-optimizer.git 32 | cd gear-optimizer 33 | npm i 34 | npm run init 35 | npm run start 36 | 37 | # with Node 17+ you might have to set the OpenSSL Legacy Provider 38 | export NODE_OPTIONS=--openssl-legacy-provider 39 | # you might have to set HOST env variable to localhost 40 | HOST=localhost 41 | 42 | ``` 43 | `npm run start` hosts a local copy, `npm run deploy` builds and deploys to `gh-pages` branch 44 | -------------------------------------------------------------------------------- /src/components/ResourcePriorityForm/ResourcePriorityForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {resource_priorities} from '../../assets/ItemAux'; 3 | 4 | export default class ResourcePriorityForm extends React.Component { 5 | constructor(props) { 6 | super(props); 7 | this.state = { 8 | rp_idx: this.props.rp_idx, 9 | spare_policy: this.props.spare_policy 10 | }; 11 | this.handleChange = this.handleChange.bind(this); 12 | this.handleSubmit = this.handleSubmit.bind(this); 13 | } 14 | 15 | handleChange(event, setting) { 16 | this.setState({[setting]: event.target.value}); 17 | this.props.handleChange(event, [setting], this.props.rp_idx); 18 | } 19 | 20 | handleSubmit(event) { 21 | event.preventDefault(); 22 | } 23 | 24 | render() { 25 | if (this.props.wishstats.equalResources) { 26 | return <> 27 | } 28 | //HACK: this sets the dropdown to the correct value after loading 29 | if (this.state.rp_idx !== this.props.wishstats.rp_idx) { 30 | /* eslint-disable-next-line react/no-direct-mutation-state */ 31 | this.state.rp_idx = this.props.wishstats.rp_idx; 32 | } 33 | //HACK: this sets the dropdown to the correct value after loading 34 | if (this.state.spare_policy !== this.props.wishstats.spare_policy) { 35 | /* eslint-disable-next-line react/no-direct-mutation-state */ 36 | this.state.spare_policy = this.props.wishstats.spare_policy; 37 | } 38 | const resource_names = 'EMR'; 39 | const policy_names = ['save', 'speed up cheapest', 'speed up in order']; 40 | return (
41 |
48 | 54 |
); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/Hack.js: -------------------------------------------------------------------------------- 1 | import {Factors, Hacks} from './assets/ItemAux'; 2 | import {speedmodifier} from './util'; 3 | 4 | export class Hack { 5 | constructor(state) { 6 | this.hackstats = state.hackstats; 7 | this.state = state; 8 | } 9 | 10 | speed() { 11 | let speed = this.hackstats.hackspeed; 12 | speed *= speedmodifier(this.hackstats, this.state, Factors.HACK, { 13 | rBetaPot: 2, 14 | rDeltaPot: 3 15 | }); 16 | return speed; 17 | } 18 | 19 | bonus(level, idx) { 20 | const hack = Hacks[idx]; 21 | return (level * hack[2] + 100) * hack[3] ** this.milestones(level, idx); 22 | } 23 | 24 | milestones(level, idx) { 25 | const hack = Hacks[idx]; 26 | const reducer = this.hackstats.hacks[idx].reducer; 27 | return Math.floor(level / (hack[4] - reducer)); 28 | } 29 | 30 | milestoneLevel(level, idx) { 31 | const hack = Hacks[idx]; 32 | const reducer = this.hackstats.hacks[idx].reducer; 33 | return Math.floor(level / (hack[4] - reducer)) * (hack[4] - reducer); 34 | } 35 | 36 | reachable(level, mins, idx) { 37 | const cap = this.hackstats.rcap; 38 | const pow = this.hackstats.rpow; 39 | let speed = this.speed(); 40 | let ticks = mins * 60 * 50; 41 | const base = Hacks[idx][1]; 42 | let sf = 1; 43 | if (idx === 13) { 44 | sf = this.bonus(level, idx) 45 | } 46 | speed /= sf; 47 | while (ticks > 0) { 48 | ticks -= Math.ceil(base * (level + 1) * 1.0078 ** level / (cap * pow * speed * sf)); 49 | level++; 50 | if (idx === 13) { 51 | // update speed factor 52 | sf = this.bonus(level, idx) 53 | } 54 | } 55 | if (ticks < 0) { 56 | level--; 57 | } 58 | return level; 59 | } 60 | 61 | time(level, target, idx) { 62 | const cap = this.hackstats.rcap; 63 | const pow = this.hackstats.rpow; 64 | let speed = this.speed(); 65 | let ticks = 0; 66 | const base = Hacks[idx][1]; 67 | let sf = 1; 68 | if (idx === 13) { 69 | sf = this.bonus(level, idx) 70 | } 71 | speed /= sf; 72 | while (level < target) { 73 | ticks += Math.ceil(base * (level + 1) * 1.0078 ** level / (cap * pow * speed * sf)); 74 | level++; 75 | if (idx === 13) { 76 | // update speed factor 77 | sf = this.bonus(level, idx) 78 | } 79 | } 80 | return ticks; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/components/ItemForm/ItemForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {getLock, getSlot} from '../../util' 3 | 4 | class LockButton extends React.Component { 5 | render() { 6 | const id = this.props.editItem[1]; 7 | const lockable = this.props.editItem[3]; 8 | if (!lockable || this.props.itemdata[id].empty) { 9 | return <> 10 | } 11 | const slot = getSlot(id, this.props.itemdata); 12 | const idx = this.props.equip[slot[0]].indexOf(id); 13 | const locked = getLock(slot[0], idx, this.props.locked); 14 | return 19 | } 20 | } 21 | 22 | export default class ItemForm extends React.Component { 23 | constructor(props) { 24 | super(props); 25 | this.state = { 26 | value: this.props.editItem[2] 27 | }; 28 | 29 | this.handleChange = this.handleChange.bind(this); 30 | this.handleSubmit = this.handleSubmit.bind(this); 31 | } 32 | 33 | handleSubmit(event) { 34 | this.props.handleEditItem(this.props.editItem[1], this.state.value) 35 | event.preventDefault(); 36 | this.props.closeEditModal(); 37 | } 38 | 39 | handleChange(event) { 40 | let val = event.target.value; 41 | while (val[0] === '0') { 42 | val = val.substr(1); 43 | } 44 | if (val.length === 0) { 45 | val = 0; 46 | } else { 47 | val = Number(val); 48 | } 49 | if (isNaN(val)) { 50 | val = 100; 51 | } 52 | this.setState({value: val}); 53 | } 54 | 55 | handleFocus(event) { 56 | event.target.select(); 57 | } 58 | 59 | render() { 60 | const item = this.props.itemdata[this.props.editItem[1]]; 61 | let able = 'Disable'; 62 | if (item !== undefined && item.disable) { 63 | able = 'Enable' 64 | } 65 | let header = ''; 66 | if (item !== undefined) { 67 | header = '(' + item.id + ') ' + item.name; 68 | } 69 | return (
70 | {header}
71 | 79 |
80 | {' '} 81 | 82 | {' '} 83 | 84 |
85 | 86 | ); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/components/FactorForm/FactorForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Select from 'react-select'; 3 | import {Factors} from '../../assets/ItemAux'; 4 | import {default as Crement} from '../Crement/Crement'; 5 | 6 | export default class FactorForm extends React.Component { 7 | constructor(props) { 8 | super(props); 9 | this.state = { 10 | selectedOption: { 11 | value: Factors[this.props.factors[this.props.idx]][0], 12 | label: Factors[this.props.factors[this.props.idx]][0] 13 | } 14 | }; 15 | this.handleChange = this.handleChange.bind(this); 16 | this.handleSubmit = this.handleSubmit.bind(this); 17 | } 18 | 19 | handleChange(selectedOption) { 20 | this.setState({selectedOption}); 21 | this.props.handleEditFactor(this.props.idx, Object.getOwnPropertyNames(Factors).find(factor => Factors[factor][0] === selectedOption.value)); 22 | } 23 | 24 | handleSubmit(event) { 25 | event.preventDefault(); 26 | } 27 | 28 | render() { 29 | const factor = Factors[this.props.factors[this.props.idx]]; 30 | const options = Object.getOwnPropertyNames(Factors).map(factor => ({ 31 | value: Factors[factor][0], 32 | label: Factors[factor][0] 33 | })); 34 | 35 | const selectedValue = options.find(option => option.value === factor[0]); 36 | 37 | const accslots = this.props.equip.accessory.length; 38 | 39 | return ( 40 |
41 |
42 | this.props.handleSettings(name, { 11 | ...this.props[name], 12 | [this.props.plShort + type + 'Pot']: !this.props[name][this.props.plShort + type + 'Pot'] 13 | })}/>{type} 14 | ); 15 | } 16 | } 17 | 18 | class PotionLine extends React.Component { 19 | render() { 20 | return ( 23 | {this.props.plName} 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | ); 33 | } 34 | } 35 | 36 | export default class ModifierForm extends React.Component { 37 | render() { 38 | const name = this.props.name; 39 | return ( 40 | 41 | 42 | 43 | 49 | 50 | 51 | 54 | 55 | 56 | 58 | 59 | 60 | 61 | 63 | 64 | 67 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 |
{'Advanced modifiers'} 44 | this.props.handleSettings(name, { 46 | ...this.props[name], 47 | modifiers: !this.props[name].modifiers 48 | })}/>
Current loadout 57 |
Dedicated loadout
68 | 76 | {'Current'}{'Dedicated'}
); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/components/Item/Item.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import {getLock} from '../../util' 4 | import {useDrag, useDrop} from 'react-dnd'; 5 | 6 | import './Item.css'; 7 | 8 | function importAll(r) { 9 | let images = {}; 10 | r.keys().map((item, index) => { 11 | images[item.replace('./', '').replace(/\.[^/.]+$/, '')] = r(item); 12 | return undefined; 13 | }); 14 | return images; 15 | } 16 | 17 | const images = importAll(require.context('../../assets/img/', false, /\.(png|jpe?g|svg)$/)); 18 | 19 | export const SourceItem = (props) => { 20 | const [, drag] = useDrag(() => ({ 21 | type: 'item', 22 | item: props.item, 23 | collect: (monitor) => ({ 24 | isDragging: !!monitor.isDragging() 25 | }) 26 | })); 27 | return (
); 28 | } 29 | 30 | export const TargetItem = (props) => { 31 | const [, drop] = useDrop(() => ({ 32 | accept: 'item', 33 | drop: (item) => props.handleDropItem(item, props.item), 34 | canDrop: (item) => item.slot[0] === props.item.slot[0] 35 | })); 36 | return (
); 37 | } 38 | 39 | class Item extends Component { 40 | static propTypes = { 41 | item: PropTypes.shape({name: PropTypes.string.isRequired, level: PropTypes.number}), 42 | handleClickItem: PropTypes.func.isRequired, 43 | handleRightClickItem: PropTypes.func.isRequired 44 | }; 45 | 46 | render() { 47 | let item = this.props.item; 48 | let classNames = 'item' + this.props.className; 49 | const locked = this.props.lockable && getLock(this.props.item.slot[0], this.props.idx, this.props.locked); 50 | if (locked) { 51 | classNames += ' lock-item' 52 | } 53 | if (item === undefined) { 54 | return (Empty 55 | ); 56 | } 57 | let tt = '(' + item.id + ') ' + item.name + ( 58 | item.empty 59 | ? '' 60 | : ' lvl ' + item.level) + '
'; 61 | item.statnames.map((stat, idx) => { 62 | const formatted = (val) => { 63 | if (stat === 'Power' || stat === 'Toughness') { 64 | return val.toLocaleString(undefined, {maximumFractionDigits: 2}); 65 | } 66 | return val.toLocaleString(undefined, {maximumFractionDigits: 2}) + '%'; 67 | }; 68 | tt += '
' + stat + ': ' + formatted(item[stat]); 69 | return undefined; 70 | }) 71 | classNames += item.disable 72 | ? ' disable-item' 73 | : ''; 74 | classNames += ' ' + item.slot[0] 75 | let imgname = item.id; 76 | if (images[imgname] === undefined) { 77 | imgname = item.name; 78 | imgname = imgname.replace(/ { 83 | if ((e.ctrlKey || e.altKey) && this.props.handleCtrlClickItem !== undefined) { 84 | this.props.handleCtrlClickItem(item.id); 85 | } else if (e.shiftKey && this.props.handleShiftClickItem !== undefined) { 86 | this.props.handleShiftClickItem(item.id); 87 | } else { 88 | this.props.handleClickItem(item.id); 89 | } 90 | }} 91 | onContextMenu={(e) => { 92 | if (!item.empty) { 93 | console.log(item) 94 | this.props.handleRightClickItem(item.id); 95 | } 96 | e.preventDefault(); 97 | }} 98 | data-tip={tt} src={images[imgname]} alt={item.id} key='item'/>); 99 | } 100 | } -------------------------------------------------------------------------------- /src/components/About/About.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import ReactGA from 'react-ga'; 3 | import './About.css'; 4 | import Modal from 'react-modal'; 5 | 6 | import GitCommit from '../../_git_commit'; 7 | import GOVersion from '../../_version'; 8 | import {default as PortForm} from '../PortForm/PortForm' 9 | import DarkModeContext from '../AppLayout/DarkModeContext'; 10 | 11 | const customStyles = { 12 | content: { 13 | top: '50%', 14 | left: '50%', 15 | right: 'auto', 16 | bottom: 'auto', 17 | marginRight: '-50%', 18 | transform: 'translate(-50%, -50%)' 19 | } 20 | }; 21 | 22 | class AboutComponent extends Component { 23 | static contextType = DarkModeContext; 24 | 25 | constructor(props) { 26 | super(props); 27 | this.state = { 28 | open: false, 29 | latest: null 30 | }; 31 | this.fresh = true; 32 | } 33 | 34 | getLatestVersionNumber() { 35 | // create a new XMLHttpRequest 36 | var xhr = new XMLHttpRequest() 37 | // get a callback when the server responds 38 | xhr.addEventListener('load', () => { 39 | // update the state of the component with the result 40 | let result = null; 41 | try { 42 | result = JSON.parse(xhr.responseText)[0].name; 43 | } catch (e) { 44 | result = null; 45 | } 46 | if (result !== null) { 47 | this.setState({latest: result}) 48 | } 49 | }) 50 | // open the request with the verb and the url 51 | xhr.open('GET', 'https://api.github.com/repos/gmiclotte/gear-optimizer/tags') 52 | // send the request 53 | xhr.send() 54 | } 55 | 56 | render() { 57 | ReactGA.pageview('/about'); 58 | if (this.fresh) { 59 | try { 60 | this.getLatestVersionNumber(); 61 | } catch (e) { 62 | this.setState({latest: null}); 63 | } 64 | this.fresh = false; 65 | } 66 | return
67 |

68 | {'NGU Idle Gear Optimizer v' + GOVersion.version} 69 |
{ 70 | 'Latest version: ' + ( 71 | this.state.latest === null 72 | ? 'loading...' 73 | : ('v' + this.state.latest)) 74 | } 75 |
{ 76 | this.state.latest !== null && GOVersion.version !== this.state.latest 77 | ? 'Update by closing and reopening the optimizer once or twice.' 78 | : '' 79 | } 80 |
{'Git hash: ' + GitCommit.logMessage.slice(0, 8)} 81 |
82 | 84 | Report an issue. 85 | 86 |
87 |
{'Not affiliated with '} 88 | 90 | NGU Idle 91 | {'.'} 92 |
93 |
{'All art copyright by '} 94 | 95 | 4G 96 | {'.'} 97 |
98 |
99 | 100 |

101 | (this.setState({open: false}))} style={customStyles} 104 | contentLabel='Import / Export' autoFocus={false}> 105 | (this.setState({open: false}))}/> 106 | 107 |
108 | }; 109 | } 110 | 111 | export default AboutComponent; 112 | -------------------------------------------------------------------------------- /src/sagas/optimize.worker.js: -------------------------------------------------------------------------------- 1 | import {ItemNameContainer} from '../assets/ItemAux' 2 | import {Optimizer} from '../Optimizer' 3 | import {Augment} from '../Augment' 4 | import {Wish} from '../Wish' 5 | import {cleanState} from '../reducers/Items' 6 | 7 | // eslint-disable-next-line 8 | self.addEventListener("message", choose); 9 | 10 | function choose(e) { 11 | if (e.data.command === 'optimize') { 12 | optimize.call(this, e); 13 | } else if (e.data.command === 'optimizeSaves') { 14 | optimizeSaves.call(this, e); 15 | } else if (e.data.command === 'augment') { 16 | augment.call(this, e); 17 | } else if (e.data.command === 'wishes') { 18 | augment.call(this, e); 19 | } else { 20 | console.log('Error: invalid web worker command: ' + e.data.command + '.') 21 | } 22 | } 23 | 24 | function optimize(e) { 25 | let start_time = Date.now(); 26 | let state = e.data.state; 27 | let optimizer = new Optimizer(state); 28 | // construct base layout from locks 29 | let base_layout = optimizer.construct_base(state.locked, state.equip); 30 | // optimize the priorities 31 | for (let idx = 0; idx < state.factors.length; idx++) { 32 | base_layout = optimizer.compute_optimal(base_layout, idx); 33 | } 34 | // select random remaining layout 35 | base_layout = base_layout[Math.floor(Math.random() * base_layout.length)]; 36 | let equip = optimizer.sort_locks(state.locked, state.equip, base_layout); 37 | this.postMessage({equip: equip}); 38 | console.log(Math.floor((Date.now() - start_time) / 10) / 100 + ' seconds'); 39 | this.close(); 40 | } 41 | 42 | function optimizeSaves(e) { 43 | let start_time = Date.now(); 44 | const savedequip = e.data.state.savedequip.map(save => { 45 | if (save.factors === undefined || save.factors.length === 0) { 46 | console.log('quit early') 47 | return save; 48 | } 49 | let state = e.data.state; 50 | const hasNoFactors = save.factors === undefined && save.maxslots === undefined; 51 | let equip = ItemNameContainer(state.equip.accessory.length, state.offhand); 52 | let locked = {}; 53 | if (save.locked === undefined) { 54 | save.locked = {}; 55 | } 56 | Object.getOwnPropertyNames(save.locked).forEach(slot => { 57 | equip[slot] = save.locked[slot].concat(equip[slot].slice(save.locked[slot].length)); 58 | locked[slot] = save.locked[slot].map((_, idx) => idx); 59 | }); 60 | // overwrite state 61 | const tmp = { 62 | equip: equip, 63 | locked: locked, 64 | factors: hasNoFactors 65 | ? state.factors 66 | : save.factors, 67 | maxslots: hasNoFactors 68 | ? state.maxslots 69 | : save.maxslots 70 | }; 71 | Object.getOwnPropertyNames(tmp).forEach(property => { 72 | state[property] = tmp[property]; 73 | }); 74 | state = cleanState(state, true); 75 | let optimizer = new Optimizer(state); 76 | // construct base layout from locks 77 | let base_layout = optimizer.construct_base(state.locked, state.equip); 78 | // optimize the priorities 79 | for (let idx = 0; idx < state.factors.length; idx++) { 80 | base_layout = optimizer.compute_optimal(base_layout, idx); 81 | } 82 | // select random remaining layout 83 | base_layout = base_layout[Math.floor(Math.random() * base_layout.length)]; 84 | // merge and return base_layout with save 85 | Object.getOwnPropertyNames(base_layout).forEach(property => { 86 | save[property] = base_layout[property]; 87 | }); 88 | return save; 89 | }); 90 | this.postMessage({savedequip: savedequip}); 91 | console.log(Math.floor((Date.now() - start_time) / 10) / 100 + ' seconds'); 92 | this.close(); 93 | } 94 | 95 | function augment(e) { 96 | const start_time = Date.now(); 97 | const state = e.data.state; 98 | const augment = new Augment(state.augment.lsc, state.augment.time); 99 | let vals = augment.optimize(); 100 | this.postMessage({vals: vals}); 101 | console.log(Math.floor((Date.now() - start_time) / 10) / 100 + ' seconds'); 102 | this.close(); 103 | } 104 | 105 | function wish(e) { 106 | const base = [1] 107 | const start_time = Date.now(); 108 | const state = e.data.state; 109 | const wish = new Wish(state); 110 | let vals = wish.optimize(); 111 | this.postMessage({vals: vals}); 112 | console.log(Math.floor((Date.now() - start_time) / 10) / 100 + ' seconds'); 113 | this.close(); 114 | } 115 | -------------------------------------------------------------------------------- /src/containers/App.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import {connect} from 'react-redux'; 3 | import ReactGA from 'react-ga'; 4 | 5 | import {default as AppLayout} from '../components/AppLayout/AppLayout'; 6 | 7 | import {AugmentAsync, AugmentSettings} from '../actions/Augment' 8 | import {HackAsync} from '../actions/Hack' 9 | import {WishAsync} from '../actions/Wish' 10 | import {Go2Titan, Settings} from '../actions/Settings' 11 | import {Crement} from '../actions/Crement' 12 | import {DisableItem, DisableZone} from '../actions/DisableItem'; 13 | import {ToggleModal} from '../actions/ToggleModal'; 14 | import {EditItem} from '../actions/EditItem'; 15 | import {EditFactor} from '../actions/EditFactor'; 16 | import {EquipItem, EquipItems} from '../actions/EquipItem'; 17 | import {HideZone} from '../actions/HideZone' 18 | import {LockItem} from '../actions/LockItem' 19 | import {OptimizeGearAsync} from '../actions/OptimizeGear'; 20 | import {OptimizeSavesAsync} from '../actions/OptimizeSaves'; 21 | import {Terminate} from '../actions/Terminate' 22 | import {Undo} from '../actions/Undo' 23 | import {UnequipItem} from '../actions/UnequipItem'; 24 | import {DeleteSlot} from '../actions/DeleteSlot' 25 | import {LoadFactors, LoadSlot} from '../actions/LoadSlot' 26 | import {SaveName, SaveSlot} from '../actions/SaveSlot' 27 | import {ToggleSaved, ToggleUnused} from '../actions/ToggleSaved' 28 | import {LoadStateLocalStorage} from '../actions/LoadStateLocalStorage'; 29 | import {SaveStateLocalStorage} from '../actions/SaveStateLocalStorage'; 30 | 31 | import '../stylesheets/App.css'; 32 | import {DropEquipItem} from '../actions/DropEquipItem'; 33 | 34 | ReactGA.initialize('UA-141463995-1'); 35 | 36 | class App extends Component { 37 | componentDidMount = () => { 38 | this.props.handleLoadStateLocalStorage(); 39 | window.appHandlers = this.props; 40 | } 41 | componentDidUpdate = () => this.props.handleSaveStateLocalStorage(this.props); 42 | 43 | render() { 44 | return ; 45 | } 46 | } 47 | 48 | const mapStateToProps = state => { 49 | window.appState = state.optimizer; 50 | return { 51 | itemdata: state.optimizer.itemdata, 52 | items: state.optimizer.items, 53 | offhand: state.optimizer.offhand, 54 | equip: state.optimizer.equip, 55 | locked: state.optimizer.locked, 56 | lastequip: state.optimizer.lastequip, 57 | savedequip: state.optimizer.savedequip, 58 | savedidx: state.optimizer.savedidx, 59 | maxsavedidx: state.optimizer.maxsavedidx, 60 | showsaved: state.optimizer.showsaved, 61 | showunused: state.optimizer.showunused, 62 | editItem: state.optimizer.editItem, 63 | ignoreDisabled: state.optimizer.ignoreDisabled, 64 | factors: state.optimizer.factors, 65 | maxslots: state.optimizer.maxslots, 66 | running: state.optimizer.running, 67 | zone: state.optimizer.zone, 68 | titanversion: state.optimizer.titanversion, 69 | looty: state.optimizer.looty, 70 | pendant: state.optimizer.pendant, 71 | hidden: state.optimizer.hidden, 72 | hidenotmaxed: state.optimizer.hidenotmaxed, 73 | hidedisabled: state.optimizer.hidedisabled, 74 | compactbonus: state.optimizer.compactbonus, 75 | compactitemlist: state.optimizer.compactitemlist, 76 | augstats: state.optimizer.augstats, 77 | basestats: state.optimizer.basestats, 78 | capstats: state.optimizer.capstats, 79 | cubestats: state.optimizer.cubestats, 80 | ngustats: state.optimizer.ngustats, 81 | hackstats: state.optimizer.hackstats, 82 | wishstats: state.optimizer.wishstats, 83 | version: state.optimizer.version, 84 | loaded: state.optimizer.loaded 85 | } 86 | } 87 | 88 | const mapDispatchToProps = { 89 | handleCrement: Crement, 90 | handleDisableItem: DisableItem, 91 | handleToggleModal: ToggleModal, 92 | handleEditItem: EditItem, 93 | handleLockItem: LockItem, 94 | handleEditFactor: EditFactor, 95 | handleEquipItem: EquipItem, 96 | handleEquipItems: EquipItems, 97 | handleDisableZone: DisableZone, 98 | handleHideZone: HideZone, 99 | handleOptimizeGear: OptimizeGearAsync, 100 | handleOptimizeSaves: OptimizeSavesAsync, 101 | handleTerminate: Terminate, 102 | handleUndo: Undo, 103 | handleUnequipItem: UnequipItem, 104 | handleDropEquipItem: DropEquipItem, 105 | handleDeleteSlot: DeleteSlot, 106 | handleLoadFactors: LoadFactors, 107 | handleLoadSlot: LoadSlot, 108 | handleSaveName: SaveName, 109 | handleSaveSlot: SaveSlot, 110 | handleToggleSaved: ToggleSaved, 111 | handleToggleUnused: ToggleUnused, 112 | handleAugmentSettings: AugmentSettings, 113 | handleAugmentAsync: AugmentAsync, 114 | handleHackAsync: HackAsync, 115 | handleWishAsync: WishAsync, 116 | handleSettings: Settings, 117 | handleGo2Titan: Go2Titan, 118 | handleSaveStateLocalStorage: SaveStateLocalStorage, 119 | handleLoadStateLocalStorage: LoadStateLocalStorage 120 | }; 121 | 122 | export default connect(mapStateToProps, mapDispatchToProps)(App); 123 | -------------------------------------------------------------------------------- /src/Augment.js: -------------------------------------------------------------------------------- 1 | export class Augment { 2 | constructor(augstats, augs) { 3 | this.augstats = augstats; 4 | this.augs = augs; 5 | } 6 | 7 | exponent(idx) { 8 | let lsc = Number(this.augstats.lsc); 9 | let difference = 0.1; 10 | if (lsc > 0) { 11 | difference += 0.05; 12 | } 13 | if (lsc >= 20) { 14 | difference += 0.05; 15 | lsc = 20; 16 | } 17 | difference += lsc * 0.01; 18 | return 1 + difference * idx; 19 | } 20 | 21 | goldCost(idx, isUpgrade) { 22 | var result; 23 | if (idx > 4 && !isUpgrade) { 24 | if (idx === 5) { 25 | result = 1.8e16 26 | } 27 | if (idx === 6) { 28 | result = 2.3e19 29 | } 30 | } else { 31 | var base, 32 | a, 33 | b, 34 | e; 35 | if (isUpgrade) { 36 | base = 1e7; 37 | a = 50; 38 | b = 1e3; 39 | e = 6; 40 | } else { 41 | base = 1e4; 42 | a = 20; 43 | b = 1e3; 44 | e = 4; 45 | } 46 | result = base * Math.pow(a, Math.min(e, idx)) * Math.pow(b, Math.max(0, idx - 4)); 47 | } 48 | const nacfactor = this.augstats.nac >= 5 49 | ? 0.5 50 | : 1; 51 | return result * nacfactor 52 | } 53 | 54 | cost(idx, version, isUpgrade, isGold) { 55 | if (isGold) { 56 | return this.goldCost(idx, isUpgrade) 57 | } 58 | const base = [ 59 | 2e7, 5e19, 5e34 / 1.2 //HACK: why do we need to divide by 1.2 here ?? 60 | ][version]; 61 | const a = isUpgrade 62 | ? 12 63 | : 17; 64 | const b = isUpgrade 65 | ? 8e2 66 | : 1.4e3; 67 | return base * Math.pow(a, Math.min(4, idx)) * Math.pow(b, Math.max(0, idx - 4)); 68 | } 69 | 70 | energy(idx) { 71 | const ratio = Math.max(0, Number(this.augstats.augs[idx].ratio)); 72 | const cap = Number(this.augstats.ecap); 73 | return [ 74 | cap * ratio / (ratio + 1), 75 | cap / (ratio + 1) 76 | ]; 77 | } 78 | 79 | reachable(idx, isUpgrade) { 80 | const version = Number(this.augstats.version); 81 | let level = 0 82 | let ticks = Number(this.augstats.time) * 60 * 50; 83 | if (ticks > 365 * 4.32e6) { 84 | ticks = 365 * 4.32e6; 85 | } 86 | const speed = Number(this.augstats.augspeed); 87 | const cap = isUpgrade 88 | ? this.energy(idx)[1] 89 | : this.energy(idx)[0]; 90 | const base = this.cost(idx, version, isUpgrade, false); 91 | const basegold = this.cost(idx, version, isUpgrade, true); 92 | const gpt = Number(this.augstats.gps) / 50; 93 | let gold = Number(this.augstats.gold) + gpt; //add 1 tick worth of gold 94 | const bbtill = cap * speed / base; 95 | const totalgold = gold + gpt * ticks; 96 | if (totalgold > Math.pow( 97 | ticks, isUpgrade 98 | ? 3 99 | : 2) / 2 * basegold && 500 * bbtill > level) { 100 | // handle bar fills up to 0.1s 101 | for (let i = 1; i < 501; i++) { 102 | if (i * bbtill >= level + Math.floor(ticks / i)) { 103 | return [ 104 | Math.min(1e9, level + Math.floor(ticks / i)), 105 | false 106 | ]; 107 | } else if (Math.floor(i * bbtill) > level) { 108 | ticks -= i * (Math.floor(i * bbtill) - level); 109 | level = Math.floor(i * bbtill); 110 | } 111 | } 112 | } 113 | //handle slow bar fills 114 | let goldlimited = false; 115 | while (ticks > 0 && level < 1e9) { 116 | const cost = isUpgrade 117 | ? basegold * Math.pow(level + 1, 2) 118 | : basegold * (level + 1); 119 | if (gold < cost) { 120 | goldlimited = true; 121 | if (gpt <= 0) { 122 | break; 123 | } 124 | const reqticks = Math.ceil((cost - gold) / gpt); 125 | ticks -= reqticks; 126 | if (ticks < 0) { 127 | ticks = 0; 128 | } 129 | gold += reqticks * gpt; 130 | } else { 131 | const reqticks = Math.ceil(base * (level + 1) / (cap * speed)); 132 | ticks -= reqticks; 133 | gold += reqticks * gpt - cost; 134 | level++; 135 | } 136 | } 137 | //correct overfill 138 | if (ticks < 0) { 139 | level--; 140 | } 141 | return [ 142 | Math.min(1e9, level), 143 | goldlimited 144 | ]; 145 | } 146 | 147 | boost(idx, auglevel, upglevel) { 148 | const factor = 1; //[1, 1, 1e12][Number(this.augstats.version)]; 149 | const augbonus = this.augs[idx].boost * Math.pow(auglevel, this.exponent(idx)); 150 | const upgbonus = 1 + Math.pow(upglevel, 2); 151 | return Math.max(1, Math.floor(augbonus * upgbonus / factor)); 152 | } 153 | } 154 | --------------------------------------------------------------------------------