Code Monkey home page Code Monkey logo

gem's People

Contributors

nvs 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

Watchers

 avatar  avatar  avatar

Forkers

notwa gadaho

gem's Issues

Games take too long

The average game takes around 55 to 65 minutes. That's a pretty big investment of time. Now, I do not see it possible to really shave this down much without stripping the current Race mode. However, if another mode was added, that could designed to target a different game length.

Add damage detection system

This would allow tracking the amount of damage done, allowing such features as displaying the percentage of life removed from units in the round.

Remove `Classic` mode

Even before the hosting bots only offered versions that force Extreme/Race I hardly played 'Classic', let alone any other difficulty. To be fair, I can count the number of times I've played 'Classic' on both hands. I just prefer Race, and it seems most other people do as well.

Supporting only a single mode and difficulty makes the map easier to balance and maintain.

Kill Bonuses / Experience

Some things are too strong when they get kills, in particular, certain slates. And beyond these few structures, everything else doesn't really benefit much at all, unless it has a high base DPS.

I see two general options:

  1. Deal with structures on a case by case basis, balancing as needed. This is a less drastic option. In a sense, improving on what is already there, given that kill buffs in their current form seem almost incomplete. One idea is to implement a kill buff ceiling that increases as a player progresses further into the game. This would aid immensely in balancing structures, while still giving the player the ability to buff them strategically.
  2. Rework the kill buff system more drastically. For example, tying all gems of a certain type together, having the number of kills determine aura effectiveness rather than gem quality. Quality, however, would still dictate range. This is possible, albeit more difficult to pull off both in terms of enabling it behind the scenes as well as displaying it to the player. Another idea is to unlock abilities as a gem type levels up.

I'm leaning in favor of the first option, as it is easier to implement for me, and easier to understand for the player given it is a small change from what currently exists.

Collecting multiple copies of the same base part can break combining

Basically, getting multiples of the same slate or gem can sometimes break combining, leaving pieces impossible to combine later. Probably my most hated bug; however, it is possible to play around it. But that is a hassle. I will most likely have to rewrite this part of the code base from scratch.

Not every kill gets added to kill bonuses

This is essentially the same exact bug as #4. However, this one is not game breaking. It has happened for people, but they never noticed. That is because if this happened, then the one corrected in #4 also occurred, and their game broke. It is a minor issue by comparison, but will require more work than the other to resolve.

Address performance issues

This should be a large undertaking, and will represent most of the work put into Version 1.1. This should resolve a number of performance issues that exist, and touch upon numerous other related bugs. This list will be updated as time goes on.

  • Special effects #136

Then again, perhaps it will not take as long as I am anticipating.

Remove the gamblers

The long-term goal is to bring gambling to the player, for example with the addition of a luck resource (#94). However, it is time for the gamblers to go. Perhaps they will reappear in another form. For now, I do not want to have to consider them when addressing the game balance.

Not enough creeps spawn

Okay, so this may not be a bug that even exists, as the behavior in #4 could be what is making people think too few units spawned. But I cannot rule out a bug in the spawn system just yet.

Towers that have on hit effects (e.g. Stun) can be abused

It's not really a groundbreaking bug, however it can make Dark Emeralds a bit more useful. The real culprit is the On Attack event that Warcraft 3 uses, which gets called every time a unit acquires its target, not when it actually performs the attack. So spamming Stop causes the event to run much more frequently than is expected.

A solution to this would probably involve damage detection.

Remove the leaderboard

The only function it serves is to display the gems that are available for each individual player on a given round. Nothing more. For the most part the multiboard is far more useful, and can be hidden by the player if they desire. In Race mode the multiboard is always available. In Classic, however, it is hidden while the leaderboard, and its underwhelming presence, is shown.

Okay, no discussion needed. The leaderboard is going.

Improper start locations

A side effect of f092d1d, even though the start locations exist, they are not being forced by SetGamePlacement (MAP_PLACEMENT_FIXED) as I assumed.

Make use of the Grim Extension Pack

This is a collection of Lua scripts that allow numerous actions to be performed without having to open the World Editor (specifically manipulating Object Editor data). The code used to perform changes can be documented in the repository.

Increase Replay Value

Various ideas already exist, and I'm sure many others haven't even been considered.

  • Randomized mazing #42
  • Reworking kill bonuses #21
  • Rethinking armor types.
  • Make races more competitive until the very end. This can be difficult, given how easy it is to essentially gauge another player's strength.
  • Adding more variety to wave types (i.e. numbers, strength, armor types)
  • Rethink extra chancing. Perhaps make people 'align' with a builder type or something, thus making gems/structures of that type more common. This would prevent people focusing a single strategy, but also make 'luck' have more impact late game.
  • Allow people to adjust their own luck for quality manually. A user adjustable 'flexibility' to the quality of gems produced, depending on their investment into quality.
  • Allow people to adjust the orientation of their start location.
  • More slates (both base and combinations).
  • Ability to have custom rules (cannot remove rocks, etc.)
  • Add more modes (still support the 'original' mode, however, as a setting)

Creeps get stuck at the spawn

Okay, so Bryvx added the -debug command to address this. Still, stuff like this shouldn't be happening. Pretty sure I know what causes it. A rework of the entire spawn system will fix memory leaks and other issues, as well as probably dealing with this too.

Determine and document the build process

Not just for the script, but for the whole map itself. A few tools to aid in this process are:

  • Widgetizer
  • Map Optimizer

A goal is to keep the map size down, but ensure that the map loads fast. The Widgetizer presents potential problems regarding desyncs, but gives the best chance of decreasing load times.

Ultimately the process to build the map will be laid out, along with any options needed or avoided in any necessary tools.

Balancing the Map

Some people might ask "Why balance?" I will reply by saying that Gem is far from balanced. There are not multiple viable end game strategies. And getting an imbalanced structure early enough can more or less ensure victory for a single player. A reason to balance is to encourage races that remain closer for longer, even if two players opt for different strategies. Without a doubt there is certainly is room for improvement.

  • The 'Glitch' #16
  • Slates #39
  • Difficulty Scaling #120
  • Kill Buffs #21
  • The 'Victory' Condition #115

Randomized mazing

Perhaps implement a system that causes each game to randomize the paths to some extent, forcing players to adapt, or at least have more than just one maze in mind. Would some setups be more difficult than others? Yes, of course. But others would be easier. The key would be forcing players to adapt to the situation and perhaps augment their strategies, rather than jumping into the game and pulling the handle of the luck machine mindlessly.

Game will not start until game modes are selected

Very annoying, and often requires restarting Warcraft 3.

This is kind of a two part solution, and involves a bit of work. Here is how I hope things to function:

  • The first part deals with hosting bots. Supporting HCL will give the host bot the ability to select the game mode itself. When a bot does this the game will just start with whatever mode it selects, no player intervention required. But when hosted without a bot, players will still be able to select any mode.
  • The second part deals with how players can select modes. The option to select the game mode will be offered to the first player (regardless of color). It will go to the next player if too much passes, or if the option to Pass is selected. If no player selects the game modes, then a default mode will be selected automatically.

Touch upon slate balance

Slate Balance

Ancient Slate

Issues

  • They are required in almost all viable strategies. The fact that a single structure is essentially required to 'beat the game' represents one of the biggest balance failings in the map.
  • The ability to stun lock is highly effective in the late game, especially versus bosses.
  • There is an expectation of being able to kill the Damage Test, and ancients are the only reliable method to achieve this feat.
  • The massive armor reduction, on top of the above, adds further value.

Solutions

  • With the possible removal of the ReRunner (#234), that would leave the Damage Test as the primary target to stun lock. So, you make the Damage Test multiple units. Now the slate has had its value reduced immensely. See #90 for thoughts on changing the nature/purpose of the Damage Test. However, I realize that both these changes will probably not be done right away, given I would like to introduce more wave variety first (#43).
  • Decrease the armor reduction value. Let's be honest. It is gigantic. This is a more immediate way to address this particular slate's balance.

Wraith Slate

Issues

  • Does more damage (600 DPS) than Great Pink Diamond (523 DPS), but is attainable as early as Round 6 (versus 11).
  • It does not require a gold cost. Great Pink Diamond requires 175 gold.
  • The explosions are extremely effective early game.
  • It has a 10% speed aura.
  • The small range it possesses is typically but a small hindrance given most players are aiming for stun lock.

Solutions

  • Have the damage scale with the current round, instead of being a flat amount. This can be set to a value that makes more sense than having 600 DPS potentially on Round 6.

Viper Slate

Issues

  • In general, however, this is not the largest balance offender. Typically, only when it is acquired very early does it become a concern.
  • However, when maxed out early it is quite effective and scales into the late game very well due to a huge potential +60% damage aura.

Solutions

  • Rein in the maximum potential for the damage aura slightly.
  • Given that part of the AoE damage is broken (#55), this slate needs a bit of a rework anyway.

Elder Slate

Issues

  • Probably the biggest offender, outside of Ancient Slates, in regards to balance. Sure, it is not required to beat the game (unlike, say, Ancient Slates). However, it gives too much.
  • The extra gold alone, especially on an early slate, gives the player an immense advantage in progression.
  • The triggered damage ignores armor and scales all the way into the end game. But before then, this spell damage is highly effective given the primary mode played is Extreme, and early on most people have not begun to stack, let alone even have access to, armor reduction.
  • The armor reduction can become ridiculous. Consider that a maxed out Elder on top of Ancient Slates, Gold, and Paraiba adds +90% damage to the target due to reduced armor. That's a bit extreme.

Solutions

  • The gold bonus must be addressed. Options:
    • Remove it.
    • Decrease the chance to activate.
    • Make the amount awarded dependent on the round (similar to Jade).
    • Implement a limit indicating the maximum amount received per round.
  • The armor reduction must also be addressed. Partially, the fault lies in the fact that the de facto mode is Extreme. It has such a high amount of armor added to the monsters that the effectiveness of armor stacking becomes quite noticeable. This is not as big of an issue on lower difficulties. Options:
    • Reduce it.
    • Make the amount reduced dependent on the round.

The original issue about the 'glitch'

The 'Glitch'

Note: I have spent quite a bit of time thinking about this issue, and I have added over multiple months to this particular comment, so it is on the longer side. It mostly reflects my thought process in wrapping my head around the 'glitch', why my stance has changed over the years, and both the pros and cons. Most people probably care more about the Solutions post which comes later.

Okay, from my perspective of auditing the code it definitely looks like a bug/oversight. I checked and it has existed since at least v1.1, the earliest map I could find. Due to the timer in Classic mode (the only mode that existed back then), it would have been difficult for players to use the 'glitch' at all. I doubt it was honestly discovered until Race mode was introduced.

Now, Bryvx definitely knew about the 'glitch' and used it, as multiple people, including myself, have reported seeing. But I cannot comment on when he definitively found out about it, nor whether he had any plans to address it further. According to DMVPDemonMOM (an original Gem TD tester), he didn't really want people to know about it either. Make of that what you will.

Regardless, it looks like a coding error, and I'm sticking to that belief. I highly doubt Bryvx knew a lot of the intricacies of Warcraft 3 mechanics and built his combine system around them, given how many issues and bugs there are throughout the code base. Especially those related to the very same behavior that allows the 'glitch' to occur in the first place: units not existing on the map and returning null in checks. A number of these errors literally broke parts of the game, sometimes rendering it impossible to complete.

Still, for a very long time use of the 'glitch' was pretty rare, even when bot hosting came onto the scene. I'll admit I definitely played a part in helping knowledge of it spread, as did many other good gem players, especially those who originated on USWest. Now we're at a point where the use of it is fairly widespread and generally accepted, and right now it is less of a bug and more of a balance issue. And boy is it one hell of a balance issue.

Controversy

Honestly, if you've ever tried explaining the 'glitch' it even sounds like a bug. Kill all but the gem you want to 'glitch', wait thirty seconds, then combine. Want to know why that works? When looking for four of a kind the code checks every combination of the five gems you were given that round. Guess what happens to destroyed gems after thirty seconds? They're removed from the map after the default decay period for the corpses of structures. You combine and the check then finds four null units, and returns true. Congratulations, the gem you left alive skips a quality.

Of course, new players generally assume it is some sort of cheat, which it isn't. But they don't understand how it works, nor can they wrap their head around it without more information. For the most part, unless a player has someone explain how it works to them or is a bit more clever than the average squirrel, they're not going to figure it out. And that is honestly a big deal.

Gem should be simple. Everything in gem should be obvious. The 'glitch' is not simple, nor obvious. It's not logical. Why should killing your own stuff give you better stuff after you wait an arbitrary period of time? There is nothing within the map to explain that it exists, let alone how it works. At the very least it needs to be explained, or better, simply revamped.

Game Changing

There was a time when I sparingly used the 'glitch'. I told myself that I would only use it if someone else did, mostly because running into another player who used it was unusual. And it remained rare for a long time, as many old players will tell you. When the 'glitch' was used people would claim it was a cheat, or demand to know how it worked; explaining the move was honestly a chore.

But as the years passed and an increasing number of people became familiar with the move I found myself needing to use it more and more, simply in an effort to stay competitive in races. Why? Because the Greats and the Stone of Bryvx have that much of an effect, especially early game where very few other structures beyond slates can provide the same impact. After a while, I began to use the 'glitch' almost religiously and started to curse myself when someone else had 'better luck' than me. Gem had become less of a gradual build up, and more defined by one-off instances of amazing luck.

Becoming the map fixer, maintainer, balancer, etc. has caused my perspective to shift, and I am starting to see the 'glitch' in a different light. Previously it was awesome, a way for me to catch up, a means for me to extend a lead, an option to allow me to salvage a surely lost game, and in general just a way to kick ass. It let me typically be more risky with my strategies than I normally would be without. In the hands of a skilled player, the 'glitch' is a formidable tool, of that there is no doubt.

The 'Crutch'

But it is a double edge sword. As easily as it helps people, it is also hurting them, as well as the community surrounding the map. First, let's just clarify that it is possible to beat the game without using the 'glitch' at all. Many people have done it countless times with extremely high success rates, myself included. However, it requires a good knowledge of the map, strategies involved, mazing, etc. A bit of time investment is needed to reach a point where you can recover from the multitude of bad situations luck will hand you on a fairly consistent basis. I'll admit, though, that the 'glitch' makes the game easier. Perhaps too easy.

Now, let's look at inexperienced players. There have always been, and will always hopefully be, inexperienced players. They don't know how to maze well or even understand why the maze they use works, let alone its shortcomings. They don't know how to place their slates effectively. They don't know which auras stack. They don't even know all the recipes. But guess what they seem to know now that they didn't know in the past? The 'glitch'. Great, right?

Perhaps not. Now, don't get me wrong, I'm not saying all inexperienced players are just suddenly using the 'glitch'. And even the ones that do use it still fail because they don't grasp the map properly. But the structures the 'glitch' makes easier to get are powerful. Inexperienced players can get farther into the map than they probably should. They begin to rely on the Greats and the Stone of Bryvx to progress and attribute a lack of them to bad luck. In a sense, the 'glitch' is hurting these players by giving them a 'crutch' that they can lean on.

But this 'crutch' doesn't just stop with new players, it extends to more experienced ones as well. Now that I'm paying attention I am noticing lots of players, skilled or not, complaining about their bad luck. Yes, some people are crying about leaking even though they failed to recognize the weakness of their choices. And yes, some are crying because they opted for a risky maze and do not know how to adapt properly. But primarily they are crying because they are not getting an imbalanced structure, of which the 'glitch' is a major facilitator.

Now, commenting that you aren't having great luck is one thing. But they're serious: they see the lack of having overpowered structures in the early game as bad luck. Hell, some of them just up and leave, opting to restart due to their lack of having one, or due to the fact that someone else got one first. This hurts the Gem community as a whole and is primarily a problem with expectations and the balance of the map. The 'glitch' does not help this issue at all.

It's Not All Bad

Still, I do see the 'glitch' as beneficial, just in a different way than the typical player. Most players see the 'glitch' for the power spike it gives, a moment of good luck that feels rewarding. And rightfully so, as many structures it provides, especially early game, can be quite powerful, if not overpowered.

But strip that away, and simply consider how it works. Probably the biggest boon of the 'glitch' is the fact that it gives players another tool to wield when approaching whatever luck throws their way. Luck defines Gem, and in general, we are at its mercy. However, there do exist ways to attempt to change the flow: the increasing of gem quality, as well as the ability to extra chance. In my mind the 'glitch' functions as an additional method to augment your luck, giving players more options. That would be a good thing if the 'glitch' was properly balanced.

Balanced?

If the 'glitch' was balanced, I don't think I'd really have too much of an issue with it. But, sadly, it is far from balanced in its current state. Now, when I refer to balance I'm mostly talking about using it to get a Great or a Stone of Bryvx. Even the wimpiest Greats do as much damage as a Star Yellow Sapphire. Most are far, far better.

Now, consider how early you can possibly get these structures provided by the 'glitch', as that is the main way it throws off the balance of the map: as soon as Round 10-13 for a Great, and Round 19-20 for a Stone of Bryvx in the average game. These are one-hits with very limited downsides. The possibility of opening a hole in your maze by killing stuff is hardly worth talking about; skilled players already take this into consideration when they build. As for the wait, this is hardly an issue at any time beyond very late game in a close race. Like I said, it's a one-hit, and most people would be fools not to take it.

Now let's use Great Diamond as an example real quick. It does 650 DPS. The soonest you can get a comparable structure (excluding slates) without the 'glitch' would be the exact same point as the Great itself, being a Pink Diamond by combining two Flawless. Before upgrading the Pink it only does 303 DPS and requires 175 gold to reach its full potential of 523 DPS. So pretty much you won't have it upgraded until sometime after Round 20 (assuming you prioritize maximizing your quality first). Oh, and the Great is a one-hit, instead of having to use three rounds to collect pieces. The soonest you would typically one-hit a Pink Diamond is Round 20. Sadly, Pink Diamond is not even in the same class.

And what about the Stone of Bryvx? Okay, Round 20 for that one, give or take. It does 625 DPS unbuffed (more than Great Pink Diamond) and gives a 50% bonus damage aura (more than a Mystic Black Opal). Essentially it is six rounds in one without a 450 gold drop to reach max potential. Having that on Round 20 is such a huge power spike that very few players would be able to keep up. More or less an 'I win' button in the average game. I'm intentionally not comparing it to Greats because, frankly, they're not balanced either given how early you can get them.

But the fact that the Greats and the Stone of Bryvx are powerful is not the problem. The defining issue is how easy and early one can get them by using the 'glitch'. Getting one early game essentially eclipses your opponents, unless they too have something that is drastically overpowered for that point in the game. On top of that, it is much easier to get a Great or a Stone of Bryvx than it is to one-hit another type of special tower, as you only need two pieces! Yet for something that is easier to get, they are some of the most powerful structures in the game, essentially beating almost any other choice in a single round hand down.

Probability

Each gem selected is an independent event. Mind you, I'm intentionally ignoring Extra Chances here.
At maximum quality the following chances exist to get a particular quality AND type:

  • Perfect: 1 / 80
  • Flawless: 3 / 80
  • Normal: 3 / 80
  • Flawed: 3 / 80

Anyways, these are the probabilities to fulfill the following events in a single round (one-hit) with quality maximized.

  • A 3-piece Special: ≈ 1 / 1_036
  • A 4-piece Special: ≈ 1 / 13_485
  • A Great (at least 2 Flawless): ≈ 1 / 77
  • A Great (at least 4 Flawless): ≈ 1 / 104_264
  • A Stone of Bryvx (at least 2 Perfects): ≈ 1 / 656
  • A Stone of Bryvx (at least 4 Perfects): ≈ 1 / 8_274_747

Conclusion

There should be no hidden moves in Gem, and as such the 'glitch' already fails. It throws off the balance of the map, whether people realize it or not. It does give people more options when assessing their gem choices, so it is not all bad. Still, it needs to be addressed, but the question is how?

Damage Test spawns as Level 1

Just happened in my game. Was only Level 1 with 530,000 life (normally Level 50 with two million life). Interesting to say the least!

Add pjass

Adding the Wine version of the executable, as this is more portable than expecting people to compile the source (which is not difficult either).

Remove the 'laugh' sound

It was only used in the cheats that were removed, but an oversight when resolving #14 kept it in. I should clarify that even though the sound isn't created in the JASS script anymore, a copy of it exists inside the map (as do all other objects as they were created with GUI triggers inside the World Editor, and that's what it does). It's up to me to figure out which aren't used and remove them.

Introduce a warning/error system

It would be nice to be able to have a standardized way of displaying errors and warnings of issues within the code to players. It should provide enough information that a screenshot can be useful in identifying the problem.

Create a script building program

Needs the following functionality:

  • Support the common.j and blizzard.j according to various patch levels.
  • Take a externally defined list of scripts that exist within the project. There are no dependency checks, as the order of the scripts is all that matters.
  • Ability to check the scripts, which amounts to nothing more than ensuring they exist and telling pjass to check all of them together.
  • Ability to build a single script from the multiple scripts. This is pretty up in the air, but involves gathering like content in order, then writing it out to a new file. After this, the new script is checked with pjass.

Add base version of the map

Basically a clean *.w3x map file that can be used to build the latest version of the map. Initially this should be equivalent to what is offered in v3.1. This will be referenced in #20 as part of the build process. Release that this is not a full release of the map, but a shell without the JASS script included. For the corresponding v3.1 JASS script (war3map.j) see da039f8.

Later versions will be released as well, but infrequently. Changes will be documented with a specific label (particuarly the Area: Map label added in #27), to keep from adding too many binary files to the repository. Also, a file to document these changes will be created (see #28).

But for the most part the *.w3x map file will remain external to the repository.

Creeps get stuck on each other

Bryvx added the Anti-Stuck feature to address this issue. However, that presents its own problems (e.g. removal of collision). It would be nice to implement a more user friendly means of dealing with this issue.

Kills not registering can prevent the next round from starting

So this bug requires very specific conditions, so it is pretty rare. Specifically that Combine is hit as a part of a combination lands a killing blow. Basically the killing unit does not exist because it has been replaced, so the kill cannot be properly registered.

Need to look into hiding units, as that might be a suitable fix.

Air unit paths are not entirely symmetrical

Depending on the color, air may be a hair bit too far in one direction or another. As a result the exact same maze does not perform exactly the same in all colors.

Probably minor adjustments in the rect values should fix this.

Remove the 'intro'

I can probably count on my hand the number of people I've seen watch it. If the information in game was better, it may not be needed at all.

The great tooltip update of 1.6!

It sounds more glamorous than it really is. We're hijacking this related issue to make a list! With boxes! And in this list will go names of things to check and update. Just getting it done, and will reference the issue when it is done. The following still applies.

A quick rundown of what these mean:

  • Information: The gold pluses on the unit that describes what it does.
  • Unit: The unit description itself. This is used in upgrades and in the recipes area.

We can utilized the deterministic behavior of the build process to ensure that tooltips are always modified after everything else. This lets us simply set them in one place and forget. Later, this process can be revamped. But, for now, this is the easiest way to proceed.

TODO

Information

  • Gems
  • Slates
  • Special

Recipes

  • Slates
  • Specials

Upgrades

  • Specials

Buffs

  • Buffs

Add unit indexing

This will allow more flexibility when reworking much of the code.

Document plan and workflow better

A bit more information in the README. Can pull from the post on the ENT forums. Also, explain how I plan to use milestones as well.

Add documentation of map file changes

This is needed as the map file within the repository will updated very infrequently. This will allow someone to take a specific version, apply the changes, and essentially end up with a parity version.

Update map name and version

What should the version be after the bug fixes are finished? The last official versions was v3.1, but there have been multiple non-official versions after. Also, should the name change at all?

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.