Giter Site home page Giter Site logo

zealvurte / simsimmissionwin Goto Github PK

View Code? Open in Web Editor NEW
4.0 2.0 2.0 960 KB

WoW addon for the Shadowlands command table

License: GNU General Public License v3.0

Lua 100.00%
world-of-warcraft world-of-warcraft-addon wow wow-addon shadowlands command-table followers encounters missions

simsimmissionwin's People

Contributors

zealvurte avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

simsimmissionwin's Issues

Logs for verifications

logs.txt

and here is a collection for targets of random-target spell you might interest in
database.txt

I've collected this before to check out the targets of random-target-spell from real logs I did

data like

  [298] = {
    [7] = {
      "{\"targets\":\"random-ally\",\"targetUnit\":\"7\",\"encounters\":\"679abc\",\"followers\":\"01234\",\"sourceUnit\":7,\"effectIndex\":0}",

which 298 means the spell ID
the second key 7 means the caster index
and in third line, targets means the value of key target of spell 298 in my own vs-spell.lua
targetUnit means the target of the spell in real log
encounters and followers means the current survival units in fields
sourceUnit is the same to the key in second line
effectIndex may be 0 or 1 which means damage or heal effect? I'm not sure of this,so I just save it from real log

some targets seems to be strange from the collections
like spell 231 and 232
spell 231 most of times selects the target 1 in fields
while spell 298 selects the target 7 in most of times

Followers required for spell verification

Below is the current list of follower logs required for verification of spells:

{
	[1240]=true,	-- Kyrian Phalanx
	[1242]=true,	-- Maldraxxus Shock Trooper
	[1243]=true,	-- Maldraxxus Plaguesinger
	[1262]=true,	-- Bonesmith Heirmir
	[1263]=true,	-- Emeni
	[1271]=true,	-- Pelodis
	[1289]=true,	-- Kyrian Phalanx
	[1290]=true,	-- Kyrian Phalanx
	[1300]=true,	-- Secutor Mevix
	[1301]=true,	-- Gunn Gorgebone
	[1302]=true,	-- Rencissa the Dynamo
	[1303]=true,	-- Khaliiq
	[1304]=true,	-- Plaguey
	[1305]=true,	-- Rathan
	[1306]=true,	-- Gorgelimb
	[1307]=true,	-- Talethi
	[1308]=true,	-- Velkein
	[1309]=true,	-- Assembler Xertora
	[1310]=true,	-- Rattlebag
	[1311]=true,	-- Ashraka
	[1312]=true,	-- Maldraxxus Shock Trooper
	[1313]=true,	-- Maldraxxus Shock Trooper
	[1314]=true,	-- Maldraxxus Plaguesinger
	[1315]=true,	-- Maldraxxus Plaguesinger
	[1320]=true,	-- Kyrian Phalanx
	[1321]=true,	-- Maldraxxus Shock Trooper
	[1324]=true,	-- Maldraxxus Plaguesinger
	[1328]=true,	-- ELGU - 007
	[1329]=true,	-- Kiaranyka
	[1330]=true,	-- Ryuja Shockfist
	[1331]=true,	-- Kinessa the Absorbent
	[1332]=true,	-- Steadyhands
	[1334]=true,	-- Lyra Hailstorm
	[1335]=true,	-- Enceladus
	[1336]=true,	-- Deathfang
	[1343]=true,	-- Auric Spiritguide
}

This same list is implemented in VP (modified) to cause a report to be saved when a mission with one of these followers is completed, regardless of outcome or sim accuracy.

Effect.Target logic

Effect.Target values are somewhat complex, unintuitive, and hindered with some errors in the game's implementation.

I've attempted to document and implement them in a way that helps me visualise and debug them easier. This is very much an incomplete work in progress and somewhat speculative in places.

{
	[0]={	-- NONE
		text="nothing"
	},
	[1]={	-- SELF
		text="self",
		targets=function (source) return source end,
	},
	[2]={	-- ADJACENT_FRIENDLY
		text="closest ally",
		targets={
			-- [source]=targetByPriority
			[-1]={5,6,7,8,9,10,11,12},
			[0]={2,3,1,4},			{0,3,4,2},
			{0,3,1,4},			{2,0,1,4},		{3,1,2,0},
			{5,6,10,7,9,11,8,12},		{5,10,7,11,6,9,12,8},	{6,11,10,12,8,7,5,9},	{7,6,8,11,12,9,5,10},
			{5,10,6,9,7,8,11,12},		{9,6,11,5,7,10,8,12},	{10,7,8,12,6,9,11,5},	{8,11,7,12,6,5,10,9},
		},
	},
	[3]={	-- ADJACENT_HOSTILE
		text="closest enemy",
		targets={
			-- [source]=targetByPriority
			[-1]={0,1,2,3,4},
			[0]={5,6,10,7,9,11,8,12}, 	{6,7,11,8,10,12,5,9},
			{5,6,9,10,7,11,8,12},		{6,7,5,10,9,11,8,12},	{7,8,6,11,10,12,5,9},
			{2,0,3,1,4},			{2,3,0,1,4},		{3,4,2,0,1},		{4,3,1,2,0},
			{2,3,0,1,4},			{2,3,4,0,1},		{2,3,4,0,1},		{4,3,2,0,1},
		},
	},
	[4]={	-- RANGED_FRIENDLY	(Unused)
		text="furthest ally",
		targets={
			-- [source]=targetByPriority
			
		},
	},
	[5]={	-- RANGED_HOSTILE
		text="furthest enemy",
		targets={
			-- [source]=targetByPriority
			[-1]={4,3,2,1,0},
			[0]={12,8,9,11,10,5,7,6},	{9,5,10,12,11,6,8,7},
			{12,8,11,7,9,10,5,6},		{9,12,5,8,10,11,6,7},	{9,5,10,6,11,12,7,8},
			{4,1,3,0,2},			{4,1,0,2,3},		{2,0,1,3,4},		{2,0,3,1,4},
			{4,1,0,3,2},			{1,0,4,2,3},		{0,1,2,3,4},		{2,0,1,3,4},
		},
	},
	[6]={	-- ALL_FRIENDLIES
		text="all allies",
		targets={
			-- [source.type(environment|follower|encounter)]=targets
			[-1]={-1}
			[0]={0,1,2,3,4}
			[1]={5,6,7,8,9,10,11,12}
		},
	},
	[7]={	-- ALL_HOSTILES
		text="all enemies",
		targets={
			-- [source.type(environment|follower|encounter)]=targets
			[-1]={0,1,2,3,4}
			[0]={5,6,7,8,9,10,11,12}
			[1]={0,1,2,3,4}
		},
	},
	[8]={	-- ALL_ADJACENT_FRIENDLIES	(closest ally, then additional targets)
		text="closest allies",
		targets={
			-- [source]={[target]=additionalTargets}
		}
	},
	[9]={
		text="closest enemies",	-- ALL_ADJACENT_HOSTILES	(closest enemy, then additional targets)
		targets={
			-- [source]={[target]=additionalTargets}
			[0]={[5]=6,	[10]={7,9,11},	[7]={9,11},	[9]=11,		[8]=12},
			[1]={[6]=7,	[11]={8,10,12},	[8]={10,12},	[10]=12,	[5]=9},
			[2]={[5]=6,	[9]=10,		[7]=11,		[8]=12},
			[3]={[6]=7,	[5]={9,10,11},	[10]={9,11},	[9]=11,		[8]=12},
			[4]={[7]=8,	[6]={10,11,12},	[11]={10,12},	[10]=12,	[5]=9}
			[5]={[2]=nil,	[0]=3,		[1]=4},
			[6]={[2]=3,	[0]=nil,	[1]=4},
			[7]={[3]=4,	[2]={0,1},	[0]=1},
			[8]={[4]=nil,	[3]=1,		[2]=0},
			[9]={[2]=nil,	[3]=nil,	[0]=nil,	[1]=4},
			[10]={[2]=nil,	[3]=nil,	[0]=1,		[4]=nil},
			[11]={[2]=3,	[4]=nil,	[0]=1},
			[12]={[3]=4,	[2]=nil,	[0]=1},
		},
	},
	[10]="closest cone of allies",	-- CONE_FRIENDLIES	(closest ally, then cone selection) #Note: All known cases are from encounters where the closest ally is in the back row with the cone targeting towards the back of the encounters side, so this just acts like closest ally for those
	[11]="closest cone of enemies",	-- CONE_HOSTILES	(closest enemy, then cone selection)
	[12]="closest column of allies",	-- LINE_FRIENDLIES	(closest ally, then column selection)
	[13]="closest column of enemies",	-- LINE_HOSTILES	(closest enemy, then column selection) #Bug: Column does not work on followers, so this acts like closest enemy for encounters
	[14]="frontmost row of allies",	-- ALL_FRONT_ROW_FRIENDLIES	(closest row with allies selection)
	[15]="frontmost row of enemies",	-- ALL_FRONT_ROW_HOSTILES	(closest row with enemies selection)
	[16]="backmost row of allies",	-- ALL_BACK_ROW_FRIENDLIES	(furthest row with allies selection)
	[17]="backmost row of enemies",	-- ALL_BACK_ROW_HOSTILES	(furthest row with enemies selection)
	[18]="all targets",	-- ALL_TARGETS
	[19]="random target",	-- RANDOM_TARGET
	[20]="random follower",	-- RANDOM_ALLY
	[21]="random encounter",	-- RANDOM_ENEMY
	[22]="all-other allies",	-- ALL_FRIENDLIES_BUT_SELF
	[23]="all followers",	-- UNKNOWN
	[24]="all encounters",	-- UNKNOWN
}

VP switches up some of the target values, uses different names for others, and simply doesn't implement some that see no usage. The targeting logic it used for effect.target=9 is (now?) incorrect and has required changes, which are also reflected above. For VP I decided to rewrite the handling for this and use a single table of target values similar to the above, which ends up being the below:

{
		-- #Mod-Start: Improve cleave targeting
		[0x05]=6,	[0x0a]={7,9,11},	[0x07]={9,11},	[0x09]=11,	[0x08]=12,
		[0x16]=7,	[0x1b]={8,10,12},	[0x18]={10,12},	[0x1a]=12,	[0x15]=9,
		[0x25]=6,	[0x29]=10,		[0x27]=11,	[0x28]=12,
		[0x36]=7,	[0x35]={9,10,11},	[0x3a]={9,11},	[0x39]=11,	[0x38]=12,
		[0x47]=8,	[0x46]={10,11,12},	[0x4b]={10,12},	[0x4a]=12,	[0x45]=9,
		[0x52]=nil,	[0x50]=3,		[0x51]=4,
		[0x62]=3,	[0x60]=nil,		[0x61]=4,
		-- #Bug: [0x63]=2 is unused (VERIFIED)
		-- #Fix: Remove [0x63] (VERIFIED)
		-- #Bug: [0x61]=4 is missing (UNVERIFIED)
		-- #Fix: Add [0x61]=4 (UNVERIFIED)
		[0x73]=4,	[0x72]={0,1},		[0x70]=1,
		[0x84]=nil,	[0x83]=1,		[0x82]=0,
		[0x92]=nil,	[0x93]=nil,		[0x90]=nil,	[0x91]=4,
		-- #Bug: [0x91]=4 is missing (VERIFIED)
		-- #Fix: Add [0x91]=4 (VERIFIED)
		[0xa2]=nil,	[0xa3]=nil,		[0xa0]=1,	[0xa4]=nil,
		-- #Bug: [0xa2]=3 is incorrect (VERIFIED)
		-- #Fix: Change to [0xa2]=nil (VERIFIED)
		-- #Bug: [0xa3]=2 is incorrect (UNVERIFIED)
		-- #Fix: Change to [0xa3]=nil (UNVERIFIED)
		-- #Bug: [0xa0]=1 is missing (UNVERIFIED)
		-- #Fix: Add [0xa0]=1 (UNVERIFIED)
		[0xb2]=3,	[0xb4]=nil,		[0xb0]=1,
		-- #Bug: [0xb2]=3 is missing (VERIFIED)
		-- #Fix: Add [0xb2]=3 (VERIFIED)
		-- #Bug: [0xb3]=4 is incorrect (VERIFIED)
		-- #Fix: Remove [0xb3] (VERIFIED)
		-- #Bug: [0xb4]=3 is incorrect (VERIFIED)
		-- #Fix: Remove [0xb4] (VERIFIED)
		-- #Bug: [0xb0]=1 is missing (VERIFIED)
		-- #Fix: Add [0xb0]=1 (VERIFIED)
		[0xc3]=4,	[0xc2]=nil,		[0xc0]=1,
		-- #Bug: [0xc3]=4 is missing (VERIFIED)
		-- #Fix: Add [0xc3]=4 (VERIFIED)
		-- #Bug: [0xc0]=1 is missing (VERIFIED)
		-- #Fix: Add [0xc0]=1 (VERIFIED)
		-- #Mod-End: Improve cleave targeting
}

Effect.Points logic

Effect.Types and Effect.Flags can change the behaviour of Effect.Points as described below.

When Effect.Flags doesn't have 2^0 -- USE_ATTACK_FOR_POINTS:

{
	[0]="Do nothing to",	-- NONE (effect.points unused)
	[1]="Damage",	-- DAMAGE (effect.points)
	[2]="Heal",	-- HEAL (effect.points)
	[3]="Damage",	-- DAMAGE_PCT (effect.points as %)
	[4]="Heal",	-- HEAL_PCT (effect.points as %)
	[5]="Damage (tick)",	-- DOT (effect.points)
	[6]="Heal (tick)",	-- HOT (effect.points)
	[7]="Damage (tick)",	-- DOT_PCT (effect.points as %)
	[8]="Heal (tick)",	-- HOT_PCT (effect.points as %)
	[9]="Taunt",	-- TAUNT (effect.points unused)
	[10]="Detaunt",	-- DETAUNT (effect.points unused)
	[11]="Mod damage done of",	-- MOD_DAMAGE_DONE (effect.points)
	[12]="Mod damage done of",	-- MOD_DAMAGE_DONE_PCT (effect.points as %)
	[13]="Mod damage taken of",	-- MOD_DAMAGE_TAKEN (effect.points)
	[14]="Mod damage taken of",	-- MOD_DAMAGE_TAKEN_PCT (effect.points as %)
	[15]="Damage attacker of",	-- DEAL_DAMAGE_TO_ATTACKER (effect.points)
	[16]="Damage attacker of",	-- DEAL_DAMAGE_TO_ATTACKER_PCT (effect.points as %)
	[17]="Mod max health of",	-- INCREASE_MAX_HEALTH (effect.points)
	[18]="Mod max health of",	-- INCREASE_MAX_HEALTH_PCT (effect.points as %)
	[19]="Mod damage done of",	-- MOD_DAMAGE_DONE_PCT_OF_FLAT (effect.points as %)
	[20]="Mod damage taken of"	-- MOD_DAMAGE_TAKEN_PCT_OF_FLAT (effect.points as %)
}

When Effect.Flags has 2^0 -- USE_ATTACK_FOR_POINTS:

{
	[0]="Do nothing to",	-- NONE (effect.points unused)
	[1]="Damage",	-- DAMAGE (use source.attack instead)
	[2]="Heal",	-- HEAL (use source.attack instead)
	[3]="Damage",	-- DAMAGE_PCT (effect.points*source.attack)
	[4]="Heal",	-- HEAL_PCT (effect.points*source.attack)
	[5]="Damage (tick)",	-- DOT (use source.attack instead)
	[6]="Heal (tick)",	-- HOT (use source.attack instead)
	[7]="Damage (tick)",	-- DOT_PCT (effect.points*source.attack)
	[8]="Heal (tick)",	-- HOT_PCT (effect.points*source.attack)
	[9]="Taunt",	-- TAUNT (effect.points unused)
	[10]="Detaunt",	-- DETAUNT (effect.points unused)
	[11]="Mod damage done of",	-- MOD_DAMAGE_DONE (use source.attack instead)
	[12]="Mod damage done of",	-- MOD_DAMAGE_DONE_PCT (effect.points as %)
	[13]="Mod damage taken of",	-- MOD_DAMAGE_TAKEN (use source.attack instead)
	[14]="Mod damage taken of",	-- MOD_DAMAGE_TAKEN_PCT (effect.points as %)
	[15]="Damage attacker of",	-- DEAL_DAMAGE_TO_ATTACKER (use source.attack instead)
	[16]="Damage attacker of",	-- DEAL_DAMAGE_TO_ATTACKER_PCT (effect.points*source.attack)
	[17]="Mod max health of",	-- INCREASE_MAX_HEALTH (use source.attack instead)
	[18]="Mod max health of",	-- INCREASE_MAX_HEALTH_PCT (effect.points*source.attack)
	[19]="Mod damage done of",	-- MOD_DAMAGE_DONE_PCT_OF_FLAT (effect.points*source.attack)
	[20]="Mod damage taken of"	-- MOD_DAMAGE_TAKEN_PCT_OF_FLAT (effect.points*source.attack)
}

As you can see, Effect.Type 19 and 20 only exist because 12 and 14 ignore this flag in the game.

I've implemented this logic as a pair of functions. The first mutates the effect with the correct flags value when first processing the spell effect info, and second returns a new effect with the correct effect.type and effect.points values whenever it is cast:

{
	[2^0]={	-- USE_ATTACK_FOR_POINTS
		info=function (spell,effect)
			if effect.type == 12 or effect.type == 14 then
				effect.flags = bit.band(effect.flags,bit.bnot(2^0))	-- Flag is never used
				if effect.flags = 0 then effect.flags = nil end
			end
		end,
		cast=function (spell,effect,source,target)
			e = {}
			for k, v in pairs(effect)
				e[k] = v
			end
			if e.type == 1 or e.type == 2 or e.type == 5 or e.type == 11 or e.type == 13 e.type == 6 or e.type == 15 then
				e.points = source.attack	-- Points is the source's attack
			else
				e.points = e.points*source.attack	-- Points is modified by the source's attack
			end
			return e
		end,
	},
	-- ...
}

Missions required for spell verification

Below is the current list of missions logs required for verification of spells:

{
	-- No missions currently required
}

This same list is implemented in VP (modified) to indicate which missions should be marked with a warning as they need verification, and also cause a report to be saved when completed, regardless of outcome or sim accuracy.

[Feature Request] One button to auto do All or Favourited missions

Hi there, first off, just wanna say a big thank you for picking up the mantle to continue where Venture Plan has left off.

With that being said, I think there has been a frequent request (amongst my friends and guild at least) for Venture Plan to have a button to auto assign / simulate and do multiple missions. So I reckon I would post it here because the best time for development requests is early in the development cycle.

For eg. I would like to do all gold missions and anima missions while skipping certain ones like experience or enchanting mats ones. Not sure if doing All missions is feasible given the complexity in calculating all combinations, but perhaps certain favourited categories could be automated.

Once again, thank you and good luck with the new addon. Really looking forward to it. Cheers.

logs you listed for verification

Do you still need these logs you listed in last issue for verification?
I have a character that doesn't finish any campaign yet(but followers are too weak to do many of them)
Here are two logs you listed
logs.txt
[2261]
[2262]

Role based auto-attack selection for followers needs overriding

Due to a lack of autoCombatant data for followers from the game's API, role based selection of auto-attack spellID is an optimal solution; however, there are some cases where a using a follower's role to determine the auto-attack spellID would result in the wrong spellID being selected.

The list of cases where this occurs can be obtained by filtering GarrAutoCombatant for:

  • AttackSpellID=11 & Role=2|3|4
  • AttackSpellID=15 & Role=1|5
  • (Cases where AttackSpellID or Role are any other values can be ignored, as this will be environments, encounters, or unused test followers)
    The follower id for each can be obtained by doing a foreign key search of GarrAutoCombatant::ID as GarrFollower::AutoCombatantID, and noting the corresponding GarrFollower::ID

I've decided to handle this using the combination of the follower id and role as a key, with the value being the correct spellID. This means if the role ever changes, then the override will not be used. It also allows me to more directly see which followers are actually being overridden.

Below is the current implementation of this.

{
	-- ["id-role"] = spellID
	["1212-4"] = 11,	-- [UNUSED] [1212] Anjali, with role [4] Heal/Support, has [11] Auto Attack
	["1239-2"] = 11,	-- [UNUSED] [1239] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack
	["1243-2"] = 11,	-- [UNUSED] [1243] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack
	["1248-2"] = 11,	-- [UNUSED] [1248] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack
	["1249-2"] = 11,	-- [UNUSED] [1249] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack
	["1258-4"] = 11,	-- [1258] Mikanikos, with role [4] Heal/Support, has [11] Auto Attack
	["1311-4"] = 11,	-- [1311] Ashraka, with role [4] Heal/Support, has [11] Auto Attack
	["1314-2"] = 11,	-- [UNUSED] [1314] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack
	["1315-2"] = 11,	-- [UNUSED] [1315] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack
	["1323-2"] = 11,	-- [1323] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack
	["1324-2"] = 11,	-- [1324] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack
	["1327-4"] = 11,	-- [1327] Ella, with role [4] Heal/Support, has [11] Auto Attack
	["1338-4"] = 11,	-- [1338] Elwyn, with role [4] Heal/Support, has [11] Auto Attack
	["1340-4"] = 11,	-- [UNUSED] [1340] Ella, with role [4] Heal/Support, has [11] Auto Attack
	["1342-4"] = 11,	-- [1342] Cromas the Mystic, with role [4] Heal/Support, has [11] Auto Attack
	["1345-4"] = 11,	-- [1345] Chachi the Artiste, with role [4] Heal/Support, has [11] Auto Attack
}

For verification with VP (modified), this is implemented as:

{[57]=0, [181]=0, [341]=0, [777]=0, [1213]=0, [1225]=0, [1237]=0, [1257]=0, [1301]=0}	-- #Mod: Improve auto attack overrides
-- #Bug: [1212] Anjali, with role [4] Heal/Support, has [11] Auto Attack [UNUSED]
-- #Fix: Add [57]=0 [UNUSED]
-- #Bug: [(1239,1248,1249,)1323] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack [UNVERIFIED]
-- #Fix: Add [181]=0 [UNVERIFIED]
-- #Bug: [1258] Mikanikos, with role [4] Heal/Support, has [11] Auto Attack [VERIFIED]
-- #Fix: Add [341]=0 [VERIFIED]
-- #Bug: [1311] Ashraka, with role [4] Heal/Support, has [11] Auto Attack [UNVERIFIED]
-- #Fix: Add [777]=0 [UNVERIFIED]
-- #Bug: [(1243,1314,1315,)1324] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack [UNVERIFIED]
-- #Fix: Add [1213]=0 [UNVERIFIED]
-- #Bug: [1338] Elwyn, with role [4] Heal/Support, has [11] Auto Attack [VERIFIED]
-- #Fix: Add [1225]=0 [VERIFIED]
-- #Bug: [1327(,1340)] Ella, with role [4] Heal/Support, has [11] Auto Attack [VERIFIED]
-- #Fix: Add [1237]=0 [VERIFIED]
-- #Bug: [1342] Cromas the Mystic, with role [4] Heal/Support, has [11] Auto Attack [VERIFIED]
-- #Fix: Add [1257]=0 [VERIFIED]
-- #Bug: [1345] Chachi the Artiste, with role [4] Heal/Support, has [11] Auto Attack [UNVERIFIED]
-- #Fix: Add [1301]=0 [UNVERIFIED]

logs for verification

logs.txt
I've added a table you listed in #2 to collect these logs

By the way,
It seems that the spell 9 works well in sim using the key healPercent ,
which you said it should be healPerc in this issue
I've checked the source code in vs.lua.
Surprisingly,it uses healPercent in heal(spell 9) but healPerc in aura(spell 10).
Perhaps you have modified them to a same key before the last valid version because it's so strange to use two different keys to implement the same function

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.