Coder Social home page Coder Social logo

arms's Introduction

ARMS

ARMS is a mod for Space Engineers that provides a simple interface for automated sequences of piloting actions like navigation, engagement, collision avoidance, docking, and more.

It also includes radar functionality for picking up non-broadcasting objects depending on their radar signature and distance. Radar information is distributed across antenna networks.

Please see the [steam page] (http://steamcommunity.com/sharedfiles/filedetails/?id=363880940) for a full feature list.

Getting started

If you'd simply like to use the mod, please subscribe to it via the Steam Workshop as you normally would and download Load-ARMS and follow the readme instructions.

To work with a local development copy of this mod instead, follow the steps listed on the wiki.

Roadmap

Please see the [steam page] (http://steamcommunity.com/sharedfiles/filedetails/?id=363880940) for the current Roadmap.

Contributing

Please submit bug reports and feature requests on the [steam page] (http://steamcommunity.com/sharedfiles/filedetails/?id=363880940) and its related discussions.

License

CC0 1.0 Universal (CC0 1.0), see LICENSE.

arms's People

Contributors

foxwyvern avatar rynchodon avatar zrisher avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar

arms's Issues

weapon control

hi. may be i wrong, but looks like something wrong with targeting. i have some small ship with 3 turret on top of it. each turret have command line [(Turret, Rocket, Gatling) ; AllGrid ; Range 1500] so they will fire in any enemy weapons (i also have fMaxWeaponRange=3000 in settings, so 1500 in turrets command will be ok). btw, any turret wont fire even when Weapon Platform Gatling (Space Pirates, you know) come at 800m and start firing. there nothing between my turrets and Weapon Platform Gatling, for sure. so, i comment out System.Diagnostics.Conditional to get debug in log and found turrets actually try target but Gatling Turret on Platform is blacklisted. can you check what wrong and fix it if possible?
here log

Renaming Autopilot

Some suggestions:
R.A.A.T.H. Avionics
N.A.R.T.H. Avionics
Autopilot & Advance Systems
Autopilot & A.I. Ships

Atmospheric flight does not work as intended (compared to space)

the flight when a ship tries to move around a planet is not very ideal, currently it just b lines without taking into consideration gravitaional effects.

the remote control block does however fully take this into consideration so leveraging its source code for implementation might be useful.

more types of radar

I've been looking through various radar designs and it seems like these are most commonly used in space avionics and modern military roles due to their ability to track multiple targets and redundancy of detective surfaces:

http://intercepts.defensenews.com/wp-content/uploads/2014/11/0012-DSC_4632b.jpg
http://media.defenceindustrydaily.com/images/ELEC_CEA_Radars_Active_on_ANZAC_Concept_lg.jpg
http://www.nato.int/nato_static/assets/pictures/2012_12_121203b-patriot/20121204_121121a-014.jpg
https://www.ll.mit.edu/news/images/MPARillustration.jpg
http://www.latinaero.com/news/defence/2012_10/images/nws_dfc_121002_01-003.jpg
http://www.airforce-technology.com/projects/mig-31/images/2-mig-31-foxhound.jpg

Plus if you cover all sides it never has to rotate.

I can't help loving the current radar model because of what it allows me to do, but it does look and act a bit like a placeholder. If we ever revisited the model, we should consider using a phased array design.

Autopilot crashes with a System.ArgumentException

@Rynchodon, I got this error this morning after about 10 hours running autopilot with 1-4 people:

2015-04-27 11:50:06.394 - Thread:   6 ->  Exception occured: System.ArgumentException: An item with the same key has already been added.
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at Rynchodon.AntennaRelay.RemoteControl..ctor(IMyCubeBlock block)
   at Rynchodon.Update.UpdateManager.<RegisterScripts>b__5(IMyCubeBlock block)
   at Rynchodon.Update.UpdateManager.Grid_OnBlockAdded(IMySlimBlock block)
   at System.Action`1.Invoke(T obj)
   at Sandbox.Game.Entities.MyCubeGrid.AddBlockInternal(=Q6WknzTZKSlxBUSpPd9birHnHM= block)
   at Sandbox.Game.Entities.MyCubeGrid.MoveBlocks(MyCubeGrid from, MyCubeGrid to, List`1 cubeBlocks, Int32 offset, Int32 count)
   at Sandbox.Game.Entities.MyCubeGrid.CreateSplitForGroup(MyCubeGrid originalGrid, List`1 splitBlocks, =CltAozIeGZUP6CBv1M6w1Cr40Rd=& group)
   at Sandbox.Game.Entities.MyCubeGrid.CreateSplits(MyCubeGrid originalGrid, List`1 splitBlocks, List`1 groups, Boolean sync)
   at =48YcmBIQHJDORnZoKHwb5Pw9MM=.Disconnect(MyCubeGrid )
   at Sandbox.Game.Entities.MyCubeGrid.DetectDisconnects()
   at Sandbox.Game.Entities.MyCubeGrid.DoLazyUpdates()
   at Sandbox.Game.Entities.MyCubeGrid.UpdateBeforeSimulation()
   at Sandbox.Game.Entities.MyEntities.UpdateBeforeSimulation()
   at =zrstbH1ZeDq5UBSIpg1qnDziYP=.UpdateBeforeSimulation()
   at =GND6z8idGdIAcWcb2YBaSnRMp7=.UpdateComponents()
   at =GND6z8idGdIAcWcb2YBaSnRMp7=.Update(MyTimeSpan )
   at =JbLZcQ0hj347engCZ44EtlRZjA=.Update()
   at =f3Z6Ndh0u8AiCd1RYvZsU5Dv7T=.UpdateInternal()
   at =cuDXH07IPdNc3nh2dfXC4sNbx5=.=v0NoMtrPy2fhNeFawOHPKRCSMn=.<Run>b__1()
   at =mEhFnRRYUxEvoh0t4KZxxONkWU=.Run(=ikvYbcjVoXAAj7Kp0pbE1O7j9B= )
   at =cuDXH07IPdNc3nh2dfXC4sNbx5=.Run(=ikvYbcjVoXAAj7Kp0pbE1O7j9B= )
   at =JbLZcQ0hj347engCZ44EtlRZjA=.Run(Boolean , Action )
   at Sandbox.AppCode.App.MyProgram.RunInternal()
   at Sandbox.AppCode.App.MyProgram.RunMain(String instanceName, String customPath, Boolean isService, Boolean showConsole)
   at Sandbox.AppCode.App.WindowsService.MainThreadStart(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart(Object obj)

There's nothing in the Autopilot log for this date.

Radar block model isn't compiling

Might be a problem with my build.py run. It didn't give me any errors, but when I get in game I got this when placing a radar block:

2015-03-19_00001

Cannot place Radar block

Since the last patch, I am unable to place either type of radar block. I have tried the released version as well, to no avail.

Is anyone else having this problem or know of what it might be?

Hacker Block

Based off the landing gear, it's a block that hacks the blocks of the ship it is attached to. A hacked block is a temporary condition where the ownership is changed and the function is affected in some way. I plan on adding an option to E command so that it can land a hacker block or landing gear on an enemy.
The hacker gains 50 points of hackyness every 11 seconds and hacks last 17 seconds. Most hacks cost 1.

Blocks that can be hacked:

  • Air vents - set to depressurize
  • Doors - closed & ownership changed to hacker
  • Gravity - reversed
  • Turrets - disabled (costs 15)
  • Turrets - turn traitor (costs 40)
  • Cryo Chamber - kill player
  • Jump Drive - drain power
  • Medical Room - ownership changed to hacker

Other hacks that I might add:

  • Connector / landing gear / merge block - disconnect
  • Connector / ejector - throw out
  • Thruster / Gyro - override

Thoughts? Opinions? Wild accusations?

Demo world mining drone derps out & LoadARMS bug

Now that the ore scanner's fixed, I've noticed the mining bot is failing to dock with the mining station after it goes on a mining run. It docks correctly before it goes on any runs, but after it goes to the asteroid it approaches the docking port at the wrong angle, gets within 50 meters, turns around, boosts away from the station for a good 100 meters or so at a different angle, approaches the port at another wrong angle, and repeats ad infinitum.

This seems specific to only the mining drone, as the other two docking drones (retriever and ingot transport) seem to dock just fine.

log-0.txt

There's also a bug with LoadARMS that's preventing the use of a locally compiled version of ARMS, so the above log is lacking debug info because I can't figure out how to enable debug logging without a locally compiled version, sorry ๐Ÿ˜ข

LoadARMS log:

11/2/2016 9:56:50 PM: Game launched
11/2/2016 9:56:50 PM: Downloading update: v1.76.2.0-stable-unstable
System.AggregateException: One or more errors occurred. ---> System.IO.IOException: The file 'C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\ARMS.dll' already exists.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at System.IO.Compression.ZipFileExtensions.ExtractToFile(ZipArchiveEntry source, String destinationFileName, Boolean overwrite)
   at System.IO.Compression.ZipFileExtensions.ExtractToDirectory(ZipArchive source, String destinationDirectoryName)
   at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName, Encoding entryNameEncoding)
   at Rynchodon.ArmsUpdater.DownloadAsset(Release bestRelease, Asset asset)
   at Rynchodon.ArmsUpdater.UpdateArms()
   at System.Threading.Tasks.Task.Execute()
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at Rynchodon.Injector.DllInjector.Run()
   at Rynchodon.Injector.DllInjector.Main(String[] args)
---> (Inner Exception #0) System.IO.IOException: The file 'C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\ARMS.dll' already exists.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at System.IO.Compression.ZipFileExtensions.ExtractToFile(ZipArchiveEntry source, String destinationFileName, Boolean overwrite)
   at System.IO.Compression.ZipFileExtensions.ExtractToDirectory(ZipArchive source, String destinationDirectoryName)
   at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName, Encoding entryNameEncoding)
   at Rynchodon.ArmsUpdater.DownloadAsset(Release bestRelease, Asset asset)
   at Rynchodon.ArmsUpdater.UpdateArms()
   at System.Threading.Tasks.Task.Execute()<---

Instance Reference Error

2015-06-21 03:06:55.823 - Thread:   1 ->     MOD_ERROR: 363880940.sbm_Autopilot
2015-06-21 03:06:55.823 - Thread:   1 ->       in file: 363880940.sbm_Autopilot
2015-06-21 03:06:55.823 - Thread:   1 ->       Compilation of 363880940.sbm_Autopilot failed:
2015-06-21 03:06:55.823 - Thread:   1 ->        MOD_ERROR: 363880940.sbm_Autopilot
2015-06-21 03:06:55.823 - Thread:   1 ->          in file: 363880940.sbm_Autopilot
2015-06-21 03:06:55.823 - Thread:   1 ->          c:\Users\Rob\AppData\Local\Temp\355lacp0.9.cs(72,4) : error CS0176: Member 'Rynchodon.Logger.debugNotify(string, int, Rynchodon.Logger.severity)' cannot be accessed with an instance reference; qualify it with a type name instead

This results in the autopilot block just sitting there, dead as a doorknob.

2015-06-21 03:05:22.956 - Thread:   1 ->  App Version: 01_087_007
2015-06-21 03:05:22.956 - Thread:   1 ->  Steam build: Always true
2015-06-21 03:05:22.956 - Thread:   1 ->  Is official: True [NO][IS][NAMP]
2015-06-21 03:05:22.956 - Thread:   1 ->  Environment.ProcessorCount: 8
2015-06-21 03:05:22.956 - Thread:   1 ->  Environment.OSVersion: Microsoft Windows NT 6.1.7601 Service Pack 1
2015-06-21 03:05:22.956 - Thread:   1 ->  Environment.CommandLine: "F:\SteamLibrary\steamapps\common\SpaceEngineers\Bin64\SpaceEngineers.exe"
2015-06-21 03:05:22.956 - Thread:   1 ->  Environment.Is64BitProcess: True
2015-06-21 03:05:22.956 - Thread:   1 ->  Environment.Is64BitOperatingSystem: True
2015-06-21 03:05:22.956 - Thread:   1 ->  Environment.Version: 4.0.30319.34209
2015-06-21 03:05:22.956 - Thread:   1 ->  Environment.CurrentDirectory: F:\SteamLibrary\steamapps\common\SpaceEngineers\Bin64
2015-06-21 03:05:22.956 - Thread:   1 ->  MainAssembly.ProcessorArchitecture: Amd64
2015-06-21 03:05:22.956 - Thread:   1 ->  ExecutingAssembly.ProcessorArchitecture: Amd64
2015-06-21 03:05:22.956 - Thread:   1 ->  IntPtr.Size: 8
2015-06-21 03:05:22.956 - Thread:   1 ->  Default Culture: en-US
2015-06-21 03:05:22.956 - Thread:   1 ->  Default UI Culture: en-US
2015-06-21 03:05:22.957 - Thread:   1 ->  IsAdmin: False

log rotation

It would be awesome if the Logger time-stamped the log files, or at least kept a few in rotation. I'm trying to debug #60 right now, but my server checks if its down and restarts every 15 min so if the crash happens close to then and I'm not fast enough, there's no way to get at the autopilot logging info.

Harvesting

Alright I'm taking a stab at harvesting and here's how I was thinking of implementing:

We add a command H that works like M but targets ore voxels. E takes precedence (so you can have military harvesters...) and if we ever implement a "flee" functionality that would take precedence too.

H can be called with no arguments to target all ore types besides stone, or a prioritized list of ore types by periodic symbol i.e. Co, Si, Ag, Au, Ni. If you wanted to actually harvest stone, you'd need to specify this list and include it (maybe as So or St) like Co, Si, So. Clearly this should require a connected ore detector, but we could also eventually add the ability to run it with just a sensor and ignore the ore type arguments.

Harvesting would occur whenever a targeted ore is detected within the range of the currently used detector and would continue every time such ores exist until inventory is full or another command takes over.

Example - Fly out to an asteroid at 1000,1000,1000, stopping to mine any Uranium that comes into detector range everywhere between here and there until full. Once there and full or no more U detected, fly back to 0,0,0, dock, unload, and repeat.

[H U : C 1000,1000,1000 : C 0,0,0  : L Connector : B Connector : G Platform : W60 ] 

Do the same thing, but engage detected enemies 1km away along the way:

[E 1000 : H U : C 1000,1000,1000 : C 0,0,0  : L Connector : B Connector : G Platform : W60 ] 

@Rynchodon What do you think?

In terms of implementation, I'd add a case for 'h' into Navigator.addInstruction that would hook into the CNS at a lower priority than E or M (or F for flee later?), and would function very similarly to a missile but with different search and engagement algorithms.

I haven't gotten much farther than trying to get my arguments parsed and logged (not very experienced with C#), but I'm working on it. : )

I think engagement will be moderately straight forward - approach voxel at range, then slowly go forward towards it with drills on, pulsing forward so as to minimize shake due to asteroid collision. Remember vector in, follow it directly out when voxel no longer in front or inv full, resume unless inventory full.

But search - that's a bit of a mystery to me. How can I find the part of an asteroid voxel that is of a particular type of ore? The ore detector does it and finds their centers, so I know it's possible. I see we get voxels a few different ways and IMyVoxel exists, but I can't find any examples of finding parts of an asteroid by material. Are the ore patches seperate voxels? How do I get material type?

@Rynchodon Any guidance on implementation at this point would be highly appreciated.

Server crashes when certain players join

Ever since this morning's update, whenever either of two specific players join my server it crashes as soon as they get to the second loading screen. I believe they may both have/ be near autopiloted ships, in contrast to the people who are able to join just fine. This appears in the main log:

2015-06-21 14:08:20.080 - Thread:   6 ->  World request received: Raideur Ng
2015-06-21 14:08:20.080 - Thread:   6 ->  ...responding
2015-06-21 14:08:26.242 - Thread:   6 ->  GC Memory: 311,380,472 B
2015-06-21 14:08:56.257 - Thread:   6 ->  GC Memory: 313,428,544 B
2015-06-21 14:09:17.323 - Thread:   6 ->  Exception occured: System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
   at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   at Sandbox.Engine.Multiplayer.MyTransportLayer.SendMessage[TMessage](TMessage& msg, List`1 recipients, MyTransportMessageEnum messageType, Boolean includeSelf)
   at Sandbox.Game.Multiplayer.MySyncLayer.SendMessageToRecipients[TMsg](TMsg& msg, MyTransportMessageEnum messageType, Boolean includeSelf)
   at Sandbox.Game.Multiplayer.MySyncGlobal.SendSimulationInfo()
   at Sandbox.Engine.Multiplayer.MyMultiplayerBase.Tick()
   at Sandbox.Engine.Multiplayer.MyDedicatedServer.Tick()
   at Sandbox.Game.World.MySession.Update(MyTimeSpan updateTime)
   at Sandbox.MySandboxGame.Update()
   at Sandbox.Engine.Platform.Game.UpdateInternal()
   at Sandbox.Engine.Platform.FixedRenderLoop.<>c__DisplayClass2.<Run>b__1()
   at Sandbox.Engine.Platform.GenericRenderLoop.Run(VoidAction tickCallback)
   at Sandbox.Engine.Platform.FixedRenderLoop.Run(VoidAction tickCallback)
   at Sandbox.MySandboxGame.Run(Boolean customRenderLoop, Action disposeSplashScreen)
   at VRage.Dedicated.DedicatedServer.RunInternal()
   at VRage.Dedicated.DedicatedServer.RunMain(String instanceName, String customPath, Boolean isService, Boolean showConsole)
   at VRage.Dedicated.WindowsService.MainThreadStart(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart(Object obj)

If I disable Autopilot, they're able to join without issue.

Sorry for not grabbing the autopilot log, I thought this was an issue with another mod until I realized that. If this isn't an obvious fix I can have those players jump on a test world later tonight or tomorrow to suss this out.

scripts not working

no matter what i do following the read me to every word the autopilot wont work for the demo world or my world i don't know what i'm doing wrong

guided missiles

It would be awesome if we had some blocks that would allow us to launch guided missiles. Looking through some real-life examples, there is a ton of complexity behind this ecosystem. There's missiles pre-guidance via GPS or Radar, in-flight guidance or lack of, tons of types of on-missile guidance with different capabilities and weaknesses, lots of different sizes, payloads, cruising speeds, etc.

Furthermore, a lot of the real-life terminology doesn't quite apply since we're dealing with atmosphere and geographic coordinates a lot less often.

So I think we should take the most interesting parts of the current missile systems and distill them down into a simple but interesting game system.

Here's my initial thoughts on how we could set it up:

Guided missile launcher
These are designed to be launched from a ship/base and destroy a fast-moving target. They are smaller and more maneuverable than ballistic missiles, with lower top speed, better acceleration, and less damage.

  • Tier I - launches straight ahead but will lock onto targets within small radius from its nose, high chance to be fooled by countermeasures
  • Tier II - can launch straight ahead or be guided by radar with lock-on, larger self-guidance radius, lower chance to be fooled by countermeasures, larger damage radius
  • Tier III - can launch straight ahead or be guided by radar with lock-on, faster lock-on, larger self-guidance radius, lowest chance to be fooled by countermeasures, same damage as Tier II (just better tracking)

Guided missile (electronic) countermeasure block
These are designed to scramble the tracking of guided missiles
Small ship and Large ship, tiers I & II

Ballistic missile launcher
These are designed to be launched from a ship/base and destroy a slow-moving or static high-value target a large distance away. They are larger and less maneuverable than ballistic missiles, with less acceleration and less accurate tracking, but a much higher top speed, greater damage, and immune to countermeasures (they must instead be intercepted). They do not track their targets once launched - they go to a static point determined from radar targeting. They are very expensive.

  • Tier I - "Ballistic missile" - fair acceleration, high top speed, large damage radius
  • Tier II - "ICBM" - lower acceleration, highest top speed, huge damage radius

Ballistic missile interceptor launcher
These are designed to be launched from a ship/base and destroy a very fast-moving, high-value target traveling in a predictable path (i.e. a ballistic missile). They are specially tuned to intercept ballistic missiles with a fair amount of accuracy and a large explosion radius.

  • Tier I - less maneuverable than guided missile but more than ballistic, fair top speed, medium explosion radius
  • Tier II - more maneuverable, faster, larger explosion radius

I think we could start with the guided missiles and countermeasures, as those will get the most use and be the easiest to balance. Then we could move on to long range ballistic missiles and their interceptors if that's even something people find valuable (it takes a looooong time to build stuff in this game right now, that much destructive potential could suck).

Radar max range is same for small and large block and doesn't match value in Radar.sbc

I've noticed that the max range for both the small and large radar blocks in-game is 50km, but the MaxRange value specified for the large block in AntennaRelay/Data/Radar.sbc is only 40km. Are we able to limit the range of the beacon block? If not, do you think we could manually take the maximum of set range and a default we set for each block?

I'd like the small radar block to have maybe half the range of the large? There's a few people on my server asking for that and it does seem to make sense.

Jump Drive

The ship powers-up for a period of time and then teleports to the destination.

In order to jump, a sufficient amount of energy needs to be stored in Jump Chargers (special batteries), the amount required is based on distance and ship mass. Jump Chargers can be charged from any power source but will only ever release energy while the ship is powering-up.

While powering-up, the chargers release energy and the drives consume it. More chargers decrease the amount of time to power-up (up to 10 chargers per drive can be used), ship mass and distance increase the time.

I was thinking that the blocks should be small and have a simple design but should look nice when stacked.

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.