GithubHelp home page GithubHelp logo

d2lootfilter's Introduction

d2lootfilter

d2lootfilter is a plugin that can be used with PlugY or other mod systems to filter loot on 1.10f, 1.13c, and 1.14d. The syntax for filtering loot was made to be similar to Path of Exile.

This has not been heavily tested, crashes may happen, and items may be lost

Features

  • Filter loot by various attributes (still a work in progress)
  • Notifications for loot
  • Minimap icons for loot
  • Custom name/descriptions/background colors for ground and inventory loot.

Still todo:

  • Error handling. Filter just silently ignores errors right now.
  • Disable sound for hidden drops
  • Tier system to change filter levels in game.

Example with custom item name/border/background color/inventory background color and chat notification.

image

See what rules in your config caused the item to be shown. Set background colors for charms/items to quickly find charms that need to be replaced etc...

image

Installing

Steps to install on PlugY:

  • Download the latest dll and item.filter
  • Copy both files to your PlugY directory.
  • Change DllToLoad= to DllToLoad=d2lootfilter.dll in PlugY.ini

Basic Syntax

The basic syntax is a collection of Show and Hide condition blocks. If an item matches all conditions on the block, the item will respectively be hidden or shown. Continue may be added to the end of a condition block if you would like the item to continue trying to match other condition blocks, otherwise processing stops after the first block is matched. A sample filter can be found here.

# hides all inferior items
Hide
    Rarity Inferior

# append the rune number to all runes
Show
    Class Rune
    SetName {Name} {Red}{Rune Number}
Continue

# since continue was specified on the last condiition block
# this one will also match. the name carries over from the
# previous condiition block
Show
    Rune >= Vex
    ChatNotify True
    MinimapIcon Purple

Operators

The operators are as followed. If no operator is specified = is implied.

Operator Description
= Equals
!= Not Equals
< Less Than
<= Less Than Equals
> Greater Than
>= Greater Than Equals
in X-Y Between values X and Y

Conditions

  • , essentially works as an or operator. i.e. Type Swirling Crystal, Dimensional Shard would match either item.
Name Valid Values
Type <Operator> <Value> Name of item in strings.txt lookup from weapons.txt, armor.txt, or misc.txt . i.e. Swirling Crystal. For 1.13c and 1.14d these can be found here.
Code <Operator> <Value> 3 character item code found in weapons.txt, armor.txt, or misc.txt. For 1.13c and 1.14d these can be found here.
Class <Operator> <Value> ItemType column from itemtypes.txt. For 1.13c and 1.14d these can be found here.
Ethereal <Boolean> Boolean True or False
Rarity <Rarity> Inferior, Normal, Superior, Magic, Set, Rare, Unique, Crafted
Runeword <Boolean> Boolean True or False
Prefix <Operator> <Value> Prefix ID from magicprefix.txt (todo... human readable name)
Suffix <Operator> <Value> Suffix ID from magicsuffix.txt (todo... human readable name)
ItemLevel <Operator> <Value> Number
Quality <Operator> <Quality> Normal, Exceptional, Elite
CharacterLevel <Operator> <Value> Number
Difficulty <Operator> <Value> Normal, Nightmare, Hell
Rune <Operator> <Value> Rune Name or Number. For 1.13c and 1.14d these can be found here.
Id <Operator> <Value> Unique or Set ID from sets.txt or uniques.txt
Gold <Operator> <Value> Gold value
Defense <Operator> <Value> Defense
Price <Operator> <Value> Price when vendoring item
Identified <Boolean> Boolean True or False
Armor <Boolean> Boolean True or False. True if item is any armor.
Weapon <Boolean> Boolean True or False. True if item is any weapon.
Sockets <Operator> <Number> Number of sockets
Width <Operator> <Number> Width of item in inventory
Height <Operator> <Number> Height of item in inventory
Stats <Expression> Expression that evaluates to true or false to filter an item based on stats. More details can be found in Stats

Stats

Stats are expressions that evaluate to true or false. i.e "All Resists > 0 and "Life" > 0 would match items with both all resists and life. A list of keywords that can be used in stats expressions can be found here. Stats, Skills. These keywords must be quoted ".

Functions Description
Stat Use other stats that are not in Stats. 2 arg function. The first arg is the stat id from itemcoststats.txt. The second arg is optional layer (used for skill stats). Returns the unsigned value of the stat.
ChargedSkill Check the skill level of a charged skill. i.e. ChargedSkill(54) > 0 will check if an item has charges of teleport
ClassSkill Check if an item has a certain class skill. i.e. ClassSkill(1) > 0 will check if an item has +To All Sorc skills.
TabSkill Check if an item has a certain tab skill. i.e. TabSkill(34) > 0 will check if an item has +To to Warcries skills.
Class Check if an item is a certain type/class. 1 arg function of the class from itemtypes.txt.
Min varargs. returns the minimum (non-zero, exclude stats that don't exist) value from a list
MinIn varargs. returns the minimum (including zeros, i.e. stats that don't exist on the item) value from a list
Max varargs. returns the maximum (non-zero, exclude stats that don't exist) value from a list

e.x. Max(Stat(39), Stat(43), Stat(41), Stat(45)) > 0 can be used to filter the existance of any resistance and MinIn(Stat(39), Stat(43), Stat(41), Stat(45)) > 0 for all resistances

Actions

  • Name and Description can use the following color tokens. {White}, {Red}, {Green}, {Blue}, {Gold}, {Gray}, {Black}, {Tan}, {Orange}, {Yellow}, {Purple}, {Dark Green}.
  • Name and Description can use the following special tokens: {Price} (Item Price), {Sockets} (Number of sockets)
Name Valid Values
SetStyle <Value> Sets the styling for an item. A style is a group of actions that will be applied. See Styles.
SetName <Value> Sets the name for an item. Special token {Name} is the base name for the item. When using continue it will append from the previous condition block.
SetDescription <Value> Sets the description for an item. Special token {Description} is the base name for the item. When using continue it will append from the previous condition block.
SetBackgroundColor <Value> Sets the background color of the item when on the ground. Pallette index color or White, Red, Green, Blue, Gold, Gray, Black, Tan, Orange, Yellow, Purple, Dark Green
SetInventoryColor <Value> Sets the background color of the item when in your inventory. Value is a pallette index color.
SetBorderColor <Value> Sets the border color of the item when on the ground. Value is a pallette index color.
ChatNotify <Boolean> Notify when the item drops in chat. True or False
MinimapIcon <Value> Sets the color of the item on your minimap when on the ground. Value is a pallette index color.

Styles

Lets you apply a group of actions to an item. i.e.

Style Tier 1 Items
    SetName {Purple}T1 {Name}
    ChatNotify True
    MinimapIcon Purple
    SetInventoryColor Purple

Show
    Type Diadem
    Rarity Unique
    SetStyle Tier 1 Items

Show
    Type Unearthed Wand
    Rarity Unique
    SetStyle Tier 1 Items

will apply all of the Tier 1 Items styles to the items.

Settings

The first time you join a game with the plugin loaded it should create a d2lootfilter.ini settings file in your Diablo II directory. These are the following settings that can be changed.

Setting Description
Path Path to your filter file. Default: ./item.filter
FilterLevel Used to dynamically change how strict your filter while playing. (Currently unused, still a planned feature) Default: 6
PingLevel Used to dynamically change how strict drop notification are while playing. Default: 6

In Game Commands

The filter has a few in-game commands for changing settings.

Command Description
/reload Reloads your filter.
/debug Toggles debugging.
/test <number> Tests a specific rule (by line number) against your currently hovered mouse item.
/filterlevel <number> Change the filter level.
/pinglevel <number> Change the ping/notification level.

Credits

Special thanks to everyone that has shared their work at Phrozen-Keep (Discord).

To name a few Necrolis, Lectem, Kingpin, whist, Revan, etc...

Thanks to coffin_spirit on Discord for the 1.10f implementation.

d2lootfilter's People

Contributors

coffinspirit avatar dschu012 avatar gonx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

d2lootfilter's Issues

Adding Small and Grand Charms to droplist

Hello and thanks a bunch for your awesome lootfilter!

I got a couple of questions:

  1. Are you planning any further releases for this software? If so, do you have a rough estimate on when?
  2. Could you tell me how I can add Small and Grand Charms to the visibility/droplist of items that get displayed? In the Item.finder file it says "show Grand Charms" etc..., but I didn't find any charms after around 100 LK runs which seems fishy to say the least.
  3. Could you tell me the same as in #2 but for flawless amethysts and topazes?

Cheers and take care :)

Suggestions for improvement

Hi, dschu012. I appreciate your great job and enjoying it over other Diablo 2 loot filters. It has great potential but I'd like to do few friendly suggestions for further improvements:

  1. New Check statement
    In metadata section of filter file, many Show .... Continue constructs are used. But the name Show is confusing and Continue at end is not graceful. Once you use Show statement it should actually show something. I suggest to introduce new Check statement. Check is equivalent of Show .... Continue construct without confusing Continue statement. Example:
Show
    Class Amethyst
    SetName {Purple}0 {White}{Name}
Continue

become clean and clear

Check
    Class Amethyst
    SetName {Purple}0 {White}{Name}
  1. New Or condition
    Currently all conditions are combined with And relationship. But it would be nice to have condition statements combined with Or prefix. For example:
Show 
      Class Healing Potion, Mana Potion, Rejuve Potion
      Or Type Antidote Potion, Thawing Potion, Stamina Potion
.....  do something 

Then we can combine two or more Show statements with same action can be combined into single action part. Multiple level of And - Or is not needed. Simply, Or condition should have just one level higher precedence over next And conditions. Multiple consecutive Or's have same level.

  1. More color selections and case-sensitivity in names
    I found that current 12 color names are bit limited. I'd like to have more light and soft(unsaturated) colors like light gray (silver), light azure, light green(lime), light coral etc. Make them16 colors out of Diablo II color pallet. The color of {Tan} is too close to {Gold} so it is easily mistaken.
    Here is list of colors for Diablo text: {Brown}, {Dark Blue}, {Light Blue}, {Light Green}, {Sky Blue}, {Azure} (renamed to avoid clash with existing "Magic" {blue}) may be added to existing name color value.
ÿc1 (Red)
ÿc2 ("Set" Green)
ÿc3 ("Magic" Blue)
ÿc4 ("Unique" Gold)
ÿc5 (Grey)
ÿc6 (Black ~ Not visible on the profile)
ÿc7 ("Unique" Gold ~ There are two)
ÿc8 ("Crafted" Amber)
ÿc9 ("Rare" Yellow)
ÿc0 (White ~ There are two)
ÿc! (Brown)
ÿc" (Dark Blue)
ÿc+ (Light Blue)
ÿc< (Light Green)
ÿc; (Purple) 
ÿc. (Sky Blue)
ÿc* (Blue)

At least some way to use Dia2 palette color index in hexa code in SetName and SetDesciption (ex: SetName {X9E}{Name}{White} ) Or alternatively, user can define new named color like DefineColor PaleBlue, X9F and {PaleBlue} name will be available in SetName and color value. Meta color name {Original} can refer original text color name before change color of item name text to cancel any change of color of name. And the color names should be case-ignored. i.e. {white} should be same as {White} And remove other unnecessary case-sensitiveness in various symbol names.

  1. Inconsistent ChatNotify argument
    ChatNotify takes <boolean> argument. But it is used like ChatNotify "Ping Level" >= 5. Why use quoted string and inconsistant name "Ping Level", not "PingLevel"? I think that it would be better to ChatNotify {PingLevel} >= 5 or simply number range argument like ChatNotify 1-5. I don't see need of boolean conditional test or range evaluation. I prefer even simpler just minimum Ping level number like ChatNotify 5. More versatile is taking variable args like ChatNotify [n] [message] ... . Both args are optional. If 1st arg is number, it is minimum ping level number. If 1st arg is not number, it is unconditional (regardless of ping level) chat massage string without quote. If message arg is omitted, default to {Name}.

  2. Provision for multiple Diablo characters sharing same filter file.
    Currently all game characters share same filter set and file. We can not selectively apply the filter rule to subset of characters. At least, there must be some condition value like {CharacterName} to access which character is playing.
    Or It would be nice to have filter file selection in d2lootfilter.ini like this:

[Setting]
; Shared common filter
Path=common-filter.txt
FilterLevel=4
PingLevel=4
Characters = MySorc, MyAmazon, MypalaBaby
[MySorc]
Path =sorcress-filter.txt
FilterLevel=3
PingLevel=3
[MyPalaBaby]
Path=lowlevel-filter.txt
FilterLevel=6
PingLevel=6

But it seems little bit complicated. I can live with the {CharacterName} variable and means to change ping level and filter level in filter file statement itself Like SetVarble "PingLevel" 5

  1. Extending Difficulty with Act numbering
    Difficulty condition is one of Normal, Nightmare, Hell. It can be extended to include act number like Difficulty in Nightmare Act1-Act3 or just Act number like Difficulty in Act2, Act3 regardless of difficulty.

  2. AreaLevel, InTown(InField), AreaName
    Similar to Difficulty condition, It would be nice to have access to area level and game area name. At least, area level should be available for testing. AreaLevel in Town should be same as nearest field area, not zero. For example, Act II Town (Lut Gholein) in Nightmare difficulty should be same as Sewers Level 1 in Nightmare difficulty, that is level 43. And simple boolean InTown (or InField) condition that test character is in town like Rogue Encampment or in wild field.
    Ex) AreaLevel in 36-47, InTown, AreaName Den of Evil

  3. Place of the item
    Condition where the item is placed in. One of Ground, (Equipped, Hiring), Inventory, Stash, Vendor.

  4. Requirement condition
    A boolean condition that tests whether the character meets item use/equip requirements (like level, strength, dexterity, class and item durability /quantity > 0 etc, but regardless of unidentified item) and can be equipped or used or not. ex) Usable <boolean>

  5. Special Token {Type}, {ItemLevel}
    Like named token {Price}, {Soket}, string value Type name {Type} and item level {ItemLevel} will be available in SetName or SetDescription

  6. Debugging Provision
    Debugging <boolean> condition: A condition that checks "/deugging" switch is set or not. And "/filterlevel 0" chat command to show all "hidden" items. All hidden item will be shown with special tag that denotes that the item will be hidden. Same as Show SetName {Name} {Gray}*{White} just before final Hide (all) at end of item filter file.

  7. Easier automatic filter reload
    As I suggested in previous issue (#22), there must be easier way to reload filter file other than current "/reload" command. I suggest automatic reloading of filter file on start of new game session.

  8. line continuation in condition list
    As I suggested in previous issue (#30), condition list should be able to span multiple lines with trailing comma.

Show
    Type Balrog Blade, Cryptic Sword, Feral Axe, Small Crescent, 
             Conquest Sword, Highland Blade, Champion Sword
	Rarity < Magic
............
  1. Condition Armor and Weapon is not so useful. It is hardly used in filter file and can be replaced with Class Any Armor and Class Weapon. Condition Hight and Width are too. I suggest to remove them. Add more useful Condition like (average) Damage sum (excluding DOT damage like poison ) My suggestion: Category {Weapon, Armor, Charm, Socketable (Rune, Gem, Jewel), and Consumable} Throwable Potions should be categorized as Consumable, not weapon, And Size condition that counts number of square it occupies.

  2. Rarity Normal should not include items without any real rarity like potion and consumables. Rarity of Potion and others should be something like Misc or Consumable. Other than Weapons Armors and Jewel, Consumable and Throwable Potion, Rune, Gem should not be of Normal Rarity.

Keeping doing good work.

flawless gem, perfect gem not showing

#always show flawless/perf gems
Show
    Class Gem
    Class Flawless Gem, Perfect Gem

The above code in your sample filter does not seem to work. I've tried removing the first part "Class Gem" and tried removing also perfect gem so there would be no comma but none of it makes the item show.

Please note this likely affects more than this entry (like the chipped gems entry maybe.) also unlike when invalid entries normally causee the game not to load at all, the game DOES load with this entry it just seems to completely ignore it.

This is pretty concerning because who knows what else it's hiding (like the gems) that it says it's showing :~(

Show all, then decide what to hide?

Hi, I'm new to D2 and I'd like to have a good loot filter I can customize with time and patience. Since my gear is still at beginning, if I drop anything on the ground, even charms, they will disappear. Is it possible to enable everything and then decide what to hide (white and blue items, for example)?

I don't know if this problem may be related to localization. I'm playing in italian so items have a different (translated) names (but potions works).

It's all a bit confusing. :)

Reproducable crash with d2lootfilter + d2dx

oGkspAz posted in d2dx issue but I will post here:
"I currently run my Diablo II as such:
Basemod v1.13.8_2
Plugy v14.03
d2lootfilter v0.6b
D2DX v0.99.529 or SGD2FreeRes v3.0.2.3.

If both D2DX & d2lootfilter are loaded; as soon as I move my cursor over the Defence stat on the character screen, the game crashes. Without fail. Plain SGD2FreeRes does not do this, so I can only imagine it is on D2DX's side."

i reprocuded without basemod:
d2 1.14d
plugy 14.03
d2lootfilter 0.6b
and latest d2dx

Filter syntax error/warning

Is there any way to have an error/warning dialog when we read the filter(/missing filter file) instead of silent crash(or ingame msg if it boots) with the line number?

Condition Type not work

Condintion Type not work

my code (not work)

Hide
    Type Arrows, Bolts

code works

Hide
    Code aqv, cqv

Magic item is unique?

Note: Using Plugy and Basemod. Plugy loads basemod AND d2lootfilter via plugy.ini (if that helps)
Line 631+:

Show
    Rarity Unique
    SetName {Gold}{Name}
    SetBorderColor Gold
Continue

Line 2093+:

Hide
    Quality Unique

2021-08-31 14_40_34-Diablo II DX  1680x720, scale 200%

condition Class != Potion causes crash

It seems that the condition Class != Potion or similar Class != expression causes hard crash on loading the filter file.
Type != Super Healing Potion does not cause crash.
And Class condition with non-existent class (due to spell error etc) always success and issues no error message. It make hard to track down error. Non existing class condition should issue warning.

Bug report: Crash when restatting character

In case you plan to update the lootfilter, here's a bug report.

When you try to restat a character using the plugy restatting feature ingame, the game instantly crashes.

Can not see some quests drops

We need a

Show
Class Quest

Somewhere, because act 3 has a few drops that the filter I tested with (0.2) was hiding.

On naming tiers and filtering/ping level

Currently d2lootfilrer filtering names high valued items as Tier 1 and ping level 1, and lower value items as Tier 6 and ping level 6.

IMHO this naming scheme should be revered as lower value item as tier 1 and minimal filtering as ping level 1 and high value item and very aggressive filtering to be Tier 6 and ping level 6. Higher tier should mean higher valued item and more aggressive filtering.

Reason for such reversal is future expandability. As user get more experienced in Diablo and filtering, user will feel need of more detailed level expansion (more than 6 tier) Then Tier 1 is top tier as current scheme, there is no head room to expand in higher value tiers and whole tier system should be revised to make head room for advanced tier. Naming top tier as tier 6 solves such problem. Just adding more advanced tier will be much eaier without rewriting whole filtering file. So Default PingLevel should be leve 1 and ChatNotify should used like ChatNotify "Ping Level" <= 2 which is same as ChatNotify "Pig Level" >= 5 in current scheme.

Request: Already own

It would be amazing if i could put something on a section that makes it so if i already have an item in my stash that matches the filter it matches.

like

Show
    Rarity Unique, Set
    OwnedType >= 1
    SetDescription {description} (OWNED ALREADY)
Continue

This would be AWESOME for grail collectors and would of course also be ideal if it could work even with plugy infinite stash and shared stash (not sure how this works/would work)

Of course this becomes complicated when it comes to unid vs id. This is why i called it "OwnedType" so it could match based on the item type + your filter (in this case unique and sets only)

potions

is there a way to make all potions show up or potions >= 4 without having like:
Show
Code hp4
Show
Code hp5
for both mana and health pots? perhaps with one line like
Show
potion >= 4
??

Highrunes aren't showing up in the vanilla item.filter droplist?!

So I've done about 200 LK runs and haven't found a single rune with the lootfinder. So in order to test the drop getting displayed, I dropped both a Gul and a Vex rune from my stash and they weren't displayed.

Does that mean that High Runes aren't being displayed in the vanilla lootfilter? That would be extremely bad...

The Rarity ordering broken

The rarity condition statement does not works as many people expects.

The Rarity ordering of d2lootfilter is | Rarity <Rarity> | Inferior, Normal, Superior, Magic, Set, Rare, Unique, Crafted | as documented and works as documented. Rare is between Set and Unique.
But it is different from what many user perceives generally. Ordering should be "Inferior, Normal, Superior, Magic, Rare, Set, Unique, Crafted". i.e, order of Rare and Set should be switched. Internal numerical ordering does not matter. This causes some unexpected behavior of filter and confuse user.
Condition Rarity < Rare should not include Set and Rarity in Rare-Unique should include Set.

And the documentation of Rarity condition is not clear. It says "Rarity <Rarity>" excluding <Opeartor>. It should be Rarity [<Operator>] <Rarity>, I guess.

And second problem is that Rarity of unidentified items in gambling vendor is always evaluated as "Inferior". Rarity of ordinary sales item of vendor is evaluated correctly, but Rarity of Gambling item of same vendor is evaluated incorrectly as Inferior. Other unidentified items in inventory is evaluated correctly as Magic or Rare. If this is game feature to prevents gambling cheat, there must be way to discern true Inferior item and Gambling item. My suggestion is re-map item rarity index to Inferior =0 , Normal =1 , Superior =2 , Magic = 3 , Set =4 , Rare = 5, Unique = 6, Crafted = 7 Gambling = 8, to fix order of Set and Rare .

SetName Color options not working in .4?

First I just wanted to say fantastic loot filter and thanks for making it compatible with 1.14d, seems to be the only filter available with compatibility. I am currently modifying the example filter to better suit me and having issues with the item.filter config coloring the {Name} parameter.

For instance the default filter has:

Show
Rune in El-Fal
SetName {Orange}{Name}

But all my runes are displaying with white names.
image

If I add characters between Orange and Name it will properly change those characters.
image

Not sure if this is an issue with my syntax, the filter file, or something different in .4?

Faster cast rate

Is there a way to show Faster Cast Rate items(Attack speed and attack rating too)?
something like :
Show
Class Any
Rarity <=Magic
Stats "Faster Cast Rate" >=10
Continue

Accidental line break causes crash

Original "item. filter" line 2551:

# 0/4os Eth Oath Bases (Oath)
Show
    Type Balrog Blade, Cryptic Sword, Feral Axe, Small Crescent, 
Conquest Sword, Highland Blade, Champion Sword
	Rarity < Magic
	Runeword False
	Ethereal True
	Sockets 0, 4
	SetStyle T6

I accidentally break the long "Types" line in middle into 2 lines, like
":... , Small Cescent," <newline> " Conquest Sword, ...."
then D2 crash on entering new session. Hard crash. No parse error message.
It is OK to insist Type line should be in single line, but it should not crash D2.

And it would be nice to have Type or Class in multi lines. Above example should be accepted as valid.
If parser see a comma symbol and no more non-blank symbol till end of line, then the list should continue to next line.

Sub-Gem class not working as expected

Existing (but not working):
Show
Class Gem
Class Chipped Gem, Flawed Gem, Standard Gem
CharacterLevel <= 50

Working (but not intuitive)
Show
Class Gem
Class Chipped, Flawed, Standard
CharacterLevel <= 50

We should either update item.filter and class.md with "Chipped" instead of "Chipped Gem"
Or
Update code to correctly match "Class Chipped Gem"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.