Giter Club home page Giter Club logo

dwrandomizer's People

Contributors

bunder2015 avatar caitsith2 avatar dvj avatar mcgrew avatar shmikew 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

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

dwrandomizer's Issues

New items in chests

Add the ability to have other weapons & armor in chests (flame sword, silver shield, ?) Setting this for 2.1 since I don't know how difficult it will be.

v1.1 crash

I can't seem to get a new version out in version 1.1. Can you take a look at this error, please?

...
Setting enemy HP to approximate remake levels...
Lowering MP requirements to remake levels...
Setting XP requirements for levels to 50% of normal...
Moving REPEL to level 8...
Ultra randomizing level spells are learned...
Updating title screen...
Traceback (most recent call last):
File "dwrandomizer.py", line 996, in
main()
File "dwrandomizer.py", line 763, in main
randomize(args)
File "dwrandomizer.py", line 983, in randomize
rom.update_title_screen(args.seed, flags)
File "dwrandomizer.py", line 688, in update_title_screen
new_text += b'\x5f' * needed_bytes + padding(32 - needed_bytes) + b'\xfc'
File "dwrandomizer.py", line 669, in
padding = lambda s: struct.pack('BBB', 0xf7, s, 0x5f)
struct.error: ubyte format requires 0 <= number <= 255

Thanks!

Ways to speed up the game

I found a few ways you can speed up the randomizer. This is totally up to you if you want to implement this or not... by my estimation, it will speed up the game by an average of about 3 minutes / game.

This uses the ROM addresses found in the standard headered Dragon Warrior (U) (PRG0) [!].nes file.

E41A, B, C -> EA EA EA
E44D, E, F -> EA EA EA
C53F, 40, 41 -> EA EA EA

This will instantly load the monster to fight, saving approximately 1.3 seconds / encounter.

EF49 - 05 -> 01 (One monster flash instead of 5 when the enemy is hit, saving 8 frames / hit. This does the same when the enemy casts a spell, but it doesn't speed up spell casting because it waits for the spell sound to finish)

ED45 - 08 -> 01 (One shake of the screen instead of eight when the player is hit, saving 14 frames / hit)

4D3C = 00
4D4B, 4D, 4F, 51, 53, 55, 57 = 01
These royally speeds up the death tune, trimming 4+ seconds every time you die.

463F, 41, 43, 45, 47, 49, 4B, 4D = 01
4653, 55, 57, 59, 5B, 5D, 5F, 62 = 01
Speeds up the level up tune, saving nearly 2 seconds every time you level up.

472A, C, and E = 01 - Speeds up the won battle tune... it saves a little bit of time, but it's somewhat negligible.

Again, I'll leave it up to you if you want to implement any of this, especially the musical speedups(I would like to figure out how to skip the tune entirely), but I'm hopeful that you will. :) But if not, you can promptly close the issue; I would totally understand.

halp

How do i actually use this? I have Python, tried opening all of the files, nothing worked.

More speed hacks!

Fairy flute shortcut:
0x4cb1, 0x4cb3 = 0x01
0x4cc5, 7, 9, and d = 0x01
0x4ce2, 4, 6, 8, a, and c = 0x01

Inn shortcut:
0x46e4, 6, 8, a, c, e = 0x01
0x46f0, 2, 4, 8 = 0x01
0x4701, 3, 5, 7, 9, b, d, f = 0x01
0x4711, 5 = 0x01

Speedy spell casting:
0x436b = 0x9e
0xdb49-e = 0xea
0xdb54-c = 0xea

This is going to speed this game up even further! Probably another 2+ minutes!

Possible Unwinnable Seed

(https://github.com/mcgrew/dwrandomizer/files/60008/DWRandomizer.242119881.ctepwrmw.PRG0.-.Copy.nes.txt)

Renamed the .nes file as a .txt so I could attach it so you could view the seed yourself and confirm in case I've just overlooked something.

Using version .93 (current latest).

The places I've gone to check: Erdrick's cave (leads to Swamp cave Northern stairwell,
, swamp cave southern exit leads to swamp cave northern Tunnel Overworld). Checked all other caves and entrances on Intial island, and couldnt find an exit that leads to southern swamp cave overworld exit. Only place I haven't checked is Garin cave in Garinham, but that town is on the second island, as I have checked all of the other towns and none of them are Garinham.

Furthermore, some other issues that don't make the game unwinnable that may be worth looking into: I obtained multiple Gwailyn's Loves and Staff of rain, etc. as I looted the chests they were placed in multiple times. As these items cannot be dropped or sold when you have duplicates it can ruin your inventory space very quickly. Recommend at the least that you remove Gwailyn's Love from chest loot, especially if you aren't going to relocate Gwailyn.

Note: this wouldn't be an issue if i hadn't been going back through caves multiple times to make sure I didn't overlook a potential exit to get to the south island, but in the process I did end up opening the chests that had respawned forgetting what was inside.

multiply experience gain for specific exp amounts to go over 255 cap

Thought of an idea if we wanted to increase the amount of exp some of the monsters gave if we wanted them to be more than 255. In the hud.lua script there is the following function

function Player.add_experience (self, amount)
return self:set_experience(self.experience + amount)
end

we could modify the remake_xp array that is passed into the following statement from the dwrandomizer.py file such that for enemies we want to loop through, make sure they have a unique exp value

self.enemy_stats[6::16] = bytearray(remake_xp)

going back to the add_experience function with the unique value set, use an if statement long the lines of

if amount == 250 then amount = amount * 2

then you can still just return self:set_experience(self.experience + amount), or if you can't multiply amount you can do
if amount == 250 then return self:set_experience(self.experience + amount + amount)

would there be any kind of problems with this? just thought i'd mention it in case it was not thought of and something worth doing. If it was already thought of then no harm done :)

Menu wraparound

Here's another enhancement you can implement if you want to. The Python code is as follows:

0x69f0: (0x4c, 0xa0, 0xbe, 0xea),
0x6a33: (0x4c, 0xba, 0xbe, 0xea),
0x7eb0: (0xa5, 0xd9, 0xd0, 0x13, 0xad, 0xe5, 0x64, 0xe9, 0x03, 0x4a, 0xe9, 0x01, 0x85, 0xd9, 0x0a, 0x69, 0x02, 0x8d, 0xf3, 0x64, 0x4c, 0x27, 0xaa, 0x4c, 0xe4, 0xa9),
0x7eca: (0xc5, 0xd9, 0xd0, 0x0c, 0xa9, 0x01, 0x85, 0xd9, 0xa9, 0x04, 0x8d, 0xf3, 0x64, 0x4c, 0xe4, 0xa9, 0x4c, 0x27, 0xaa),

Basically if you press up on the first item, instead of staying on the first item, it goes to the last item instead, and vice versa. It's mainly useful when you have to cast Hurtmore or Healmore, but it really helps out the interface. I'd say this trims... maybe 30-60 seconds from the average randomizer time.

The only problem with this is that when you wraparound, the pointer from the first/last item might stay on the screen. It's only a minor graphical issue though, and therefore it might not matter when it comes to racing, because people want to cast the spells quickly anyway.

Adjust heal and hurt to remix values

This issue proposes a change of heal restoration and hurt damage values to as close as the remix values as we can make it.

0xdbce = 0x07
0xdbd1 = 0x17

This adjusts the heal spell to 23-30. The SFC remix actually has it at 25-30, but AND #$05 wouldn't work very well. :(

0xe74a = 0x03
0xe74d = 0x10

This adjusts the hurt spell to 16-19. The SFC remix is the slightest bit different, 16-20, but, again, placing an AND #$04 wouldn't work so well. You could make 0xe74d = 0x11 and make it 17-20 if you wanted to.

This change, in addition with putting it in line with the remix, increases the chances of sustainability, especially in the early going if you get one of those spells to start with.

Thanks again for your consideration; it's always appreciated!

I forget how I got this to work before ...

Hey, can anyone help me with a step-by-step way to use Python 3.5.2 to use this randomizer? I did it before but I lost my instructions and I can't remember or figure out how to get it working now. Thanks guys!

Drakeema EXP/GP check

According to the SNES and GBC versions, Drakeemas score 20 XP and 25 GP, not 12XP and 20GP as programmed in the current randomizer. Is there another version that has the reduced Drakeema XP?

Music disable option

I noticed that there's no hack to disable music. Here's a patch that is going somewhat in the right direction, but doesn't fully work.

Change the byte pattern 303A0A85 (.nes file offset 0x41B6 in my ROM) to 10393038.

This causes only sound effects to play, but isn't perfect. When exiting a town, the noise channel will continue until the next sound is played. Also, the game freezes after completing a battle. The patch clearly needs more work.

I can only hope that this helps! =^-^=

random% requests

This is an enhancement request, and I anticipate this being long-term. I am willing to help out with these requests once the rewrite is completed.

Due to the success of the Zelda 1 Randomizer random% tournament, I came up with ideas where we could do something similar. (I concede that some of these ideas may be in your upcoming chaos mode)

  • Monster stats: 1 (the number 1, meaning really easy), 1/3, 1/2, regular, double, triple - these could be linked or separate
  • Charlock required or not
  • Charlock starting point at B4 or B7, maybe with a shortcut to the DL himself on B7.
  • Magic keys required or not (not sure if that can be programmed; I bet it could be though.) Replace magic key boxes with 500+ gold
  • Resized world maps. 240x240, 180x180, 120x120, 90x90, 45x45. The former two will required intense work, including an increase of the ROM size...
  • Randomized herb and key limits (3-9)
  • Randomized store prices, from 33%-300%
  • Regular map... with terrain scrambled (except steep mountains probably)
  • No equipment allowed. Meaning we remove all the merchants or seal them or something like that. Wicked!
  • No damage breaking / always damage breaking

Again, these are just thoughts spilling out of my head. All of these, should we try to implement them, should be strictly optional. (i.e. so those who want to play DWR the "normal" way can do so if they want)

Gold adjustment suggestion

This is strictly another suggestion, and not a bug. I can totally understand this not being implemented, but here goes.
0xea51: (0xad, 0x07, 0x01, 0xea, 0xea),

This automatically gives out the maximum gold for all encounters. You will have to decrease all the monster gold by 1 if you implement this. The reason I'm placing this suggestion down is because in the remix, monsters always give out the maximum gold, so this will replicate that rule change.

I'd also like to suggest that if the XP is halved, the gold requirements for weapons, items, and inns should be halved as well. This increases the chances of "earning" the Silver Shield, etc. instead of hoping to gold grind in Tantegel.

Thanks for considering this.

RNG "fixes"

Seems that your code doesn't actually run under 2.7 (at least not on my version) due to syntax errors, so you can probably remove that from your README and just standardize on 3.x. To guard against further changes to RNG algorithms in general, I ported my randomizer's PRNG to Python for you to use if you'd like.

Monster HP Adjustment for strategic purposes

As we discussed earlier, adjust the Goldman HP to 30-35, due to the 255 GP maximum. (it normally awards 600+ and it has 99 HP)

This is probably still up for discussion, but I'm thinking it will open up the game a bit.

... and possibly adjust the Droll HP since it has so little XP? (maybe 20 or 25 instead of 38?)

Shuffle Searchable Items Flag Always Set

Hey there. I wanted to bring an issue with the randomizer to your attention McGrew. Whether or not the box marked Shuffle Searchable Items is ticked or not, the randomizer always sets the I Flag, and randomizes the co-ordinates for the 3rd searchable item spot. I feel this must be a bug, and I would like to see if you can try to correct it for the next build. And I really like the new GUI version of the randomizer!

1.2-beta-2016.08.02 crash

I'm crashing because there's no "border_tile_patch"... please see below.

... dwrandomizer.py -U -F -H dw1.nes

DWRandomizer 1.2-beta-2016.08.02
Randomizing dw1.nes using random seed 551353823...
Verifying checksum...
Processing Dragon Warrior PRG0 ROM...
Generating new overworld map...
Error: Charlock is obstructed, retrying...
Optimizing compressed map... (Saved 23 bytes)
Traceback (most recent call last):
File "dwrandomizer.py", line 1007, in
main()
File "dwrandomizer.py", line 788, in main
randomize(args)
File "dwrandomizer.py", line 901, in randomize
while not rom.generate_map():
File "dwrandomizer.py", line 231, in generate_map
for i in self.owmap.border_tile_patch:
AttributeError: 'WorldMap' object has no attribute 'border_tile_patch'

Thanks!

Enemy patterns not randomizing

In 1.3-dev, line 1102, I don't think the enemy patterns are randomizing. I think it should be "if not no_patterns" or something like that. Thanks again!

Swamp surrounding Tantegel Castle

Sparkover and I in our first race on June 1 had an issue where Tantegel Castle was surrounded by a swamp and we couldn't get out without dying. (11 HP with 6 spaces before getting out) I really don't think we should have seeds that start out that way. This was done in version 1.0, but I don't think you've done anything to the randomized map making since then.

Axe Knight still can't have DL fire

This restriction in your code made sense in Ultra Randomizer mode when the Axe Knight/Erdrick's Armor location wasn't randomized, but since it now is, it's probably more appropriate to remove that restriction.

Monster Zone adjustments (proposed enhancement)

I did two things with this, one of which was discussed near the end of the tournament, another was somewhat touched with one question.

  1. I made a "zone 1" and "zone 2". Both of these randomize monsters up to Metal Scorpions. Zone 1 is placed next to Tantegel's Zone 0 to the north and south (if possible), while zone 2 does the same, except east and west.

  2. Remember me asking if one zone could theoretically dominate the entire map? Well, with the remaining 59 zones, I "deal out" zones 3-15 like a deck of cards, so no one zone dominates the map.

Please review the attached code and implement if you'd like.

Thanks again!

`
def randomize_zone_layout(self):
"""
Randomizes enemy zone layout on the overworld map.
"""
zones = [3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10,
11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15]
random.shuffle(zones)

#for i in range(len(self.zone_layout)):
#  self.zone_layout[i] = random.randint(3,15) << 4 | \
#                        random.randint(3,15)
for i in range(len(self.zone_layout)):
  self.zone_layout[i] = zones[i * 2] << 4 | zones[(i * 2) + 1]
# set tantegel's zone to 0
tx,ty = self.owmap.warps_from[self.owmap.tantegel_warp][1:]
tantegel_zone_index = (ty // 15 * 8) + tx // 15
if tantegel_zone_index % 2:
  self.zone_layout[tantegel_zone_index // 2] &= 240 # second nybble
else:
  self.zone_layout[tantegel_zone_index // 2] &= 15 # first nybble	  
tz1 = tantegel_zone_index + 8
tz2 = tantegel_zone_index - 8
if (tz1 < 64):
  if (tz1 % 2):
    self.zone_layout[tz1 // 2] &= 240 # second nybble
    self.zone_layout[tz1 // 2] += 1
  else:
    self.zone_layout[tz1 // 2] &= 15 # second nybble
    self.zone_layout[tz1 // 2] += 16

if (tz2 < 64):
  if (tz2 % 2):
    self.zone_layout[tz2 // 2] &= 240 # second nybble
    self.zone_layout[tz2 // 2] += 1
  else:
    self.zone_layout[tz2 // 2] &= 15 # second nybble
    self.zone_layout[tz2 // 2] += 16

tz1 = tantegel_zone_index + 1
tz2 = tantegel_zone_index - 1
if (tz1 % 8 != 0):
  if (tz1 % 2):
    self.zone_layout[tz1 // 2] &= 240 # second nybble
    self.zone_layout[tz1 // 2] += 2
  else:
    self.zone_layout[tz1 // 2] &= 15 # second nybble
    self.zone_layout[tz1 // 2] += 32

if (tz1 % 8 != 7):
  if (tz2 % 2):
    self.zone_layout[tz2 // 2] &= 240 # second nybble
    self.zone_layout[tz2 // 2] += 2
  else:
    self.zone_layout[tz2 // 2] &= 15 # second nybble
    self.zone_layout[tz2 // 2] += 32

def randomize_zones(self, ultra=False):
"""
Randomizes which enemies are present in each zone.

:Parameters:
  ultra : bool
    Whether or not to apply ultra randomization
"""
new_zones = list()
if ultra:
  # randomize zone locations
  if self.owmap.generated:
    self.randomize_zone_layout()
  # zone 0-2
  for i in range(0,5):
    new_zones.append(random.randint(0, 6))
  for i in range(0,5):
    new_zones.append(random.randint(0, 13))
  for i in range(0,5):
    new_zones.append(random.randint(0, 13))
  # zones 3-15
  for i in range(0,65):
    new_zones.append(random.randint(0, 37))
  # zones 16-18 (Charlock)
  for i in range(0,15):
    new_zones.append(random.randint(29,37))
  # zone 19
  for i in range(0,5):
    new_zones.append(random.randint(0, 37))

  # randomize forced encounter enemies:
  # Golem, Axe Knight, Blue Dragon, Stoneman, Armored Knight, Red Dragon
  for i in range(3):
    self.encounter_enemies[i] = random.choice((24, 33, 34, 35, 36, 37))
  self.encounter_2_kill[0] = self.encounter_enemies[1]
  self.encounter_3_kill[0] = self.encounter_enemies[2]
else:
  #zone 0
  for j in range(5): 
    new_zones.append(int(random.randint(0, 6)/2))

  # zones 1-13 (Overworld)
  for i in range(1, 14):
    for j in range(5):
      enemy = random.randint(i * 2 - 2, min(37,round(i*3)))
      while enemy == 24: # don't add golem
        enemy = random.randint(i * 2 - 2, min(37,round(i*3)))
      new_zones.append(enemy)

  #zone 14 - Garin's Grave?
  for j in range(5): 
    new_zones.append(random.randint(7, 17))

  #zone 15 - Lower Garin's Grave
  for j in range(5): 
    new_zones.append(random.randint(15, 23))

  # zone 16-18 - Charlock
  for i in range(16, 19):
    for j in range(5):
      new_zones.append(random.randint(13+i, 37))

  # zone 19 - Rimuldar Tunnel
  for j in range(5):
    new_zones.append(random.randint(3, 11))
self.zones = new_zones

`

Enhancement: Instant stairs command

I think all you need is five changes:

B2CE, B3D2, B4C3, B5F4 -> 20 AF D9 (instead of completing movement procedure, jump to the stairs command instead)
DA16 -> 4C C3 B4 -> After checking for stairs, instead of showing a text box, complete the movement

I do foresee two problems:

  1. If you select stairs, you stay in the menu instead of being told that there aren't any stairs. I personally am OK with this because you would no longer need to select stairs.
  2. The more important issue is running into stairs in normal cave movement. The mountain cave and the useless stairs on your way to the 5 treasure chests is the biggest offender. One possible fix, however, is to simply remove those stairs.

There also may be some softlocks... don't implement this yet...

Death Necklace not working when used in combat?

Miaut said in his comments in the last race that he tried to use the death necklace while facing the DL during combat, and he didn't get the stat adjustments. Can you verify this, please? Thanks again!

msvcr110d.dll is missing

when i try to start the Randomizer i get this issue. I've tried redownloading it and moving it into my sys32 folder but it's still showing up. I'm using windows 10 if that makes a difference.

Charlock Obstructed by Mountain

Hi!

I was watching a race of dwrandomizer and saw that there was a mountain blocking Charlock so players couldn't enter.

Just thought I'd give you a heads up, thanks for this fun program!

Caleb

Enhancement: Stop a NPC from moving

So I did a seed yesterday, and after collecting the chests, the moving soldier somehow got in front of the door and stayed there for a while.
It could get annoying. I was thinking that, if possible, the prperties of the NPC could be tweaked so that they no longer move? I am thinking about

  • the old man in Graniham(near the item shop)
  • the guard near the king throne
  • the shopper at that one town where you can get the coordinates of the search tile(forgot the name)

I don't mind about it at all honestly. But I though it would be neat.

Enhancement: Gwaelin's love in the ranzomized items

So I played a seed today. And I thought about something:

The other day, I talked with some DWR racers, and they told me that they almost never free the princess. So I thought about that during my game today. I thought that if you include that item in the randomized list, it would encourage players to free her and hope for a key item or something?

NPC freezing

A few NPCs can get extremely annoying due to moving around. These can affect race outcomes and probably shouldn't. Consider freezing their movement.

Current list:

  • Old man in item shop in Garinham
  • Soldier in the throne room
  • Weapon shop owner in Cantlin

Downloaded DWRando V1.2.1

I seem to have it working, but it doesn't seem to be making a copy of the ROM with the modified stuff. Is it stored somewhere other than where I ran the DW Randomizer program? I was up all night trying to get it working with Python when I'd have errors and now it seems to be working but not making a copy of the modified ROM ...

Monster HP Adjustments?

I'm thinking that the Specter should have 33 HP, not 48 HP that's programmed. Can you take a look in the GBC/SNES ROM to verify this please?

No good path

Using the most recent DW Randomizer (0.9.4, released on 12/30/2015), I did a seed of 1049683387 with no switches, started at the King's Room per usual, then when I went down the stairs, instead of floor 1 of Tantegel Castle, I wound up in Erdrick's Cave. I got the Stones Of Sunlight, but was unable to continue past this point.

When I tried it with seed 21626551, the stairs took me straight to Kol, but when I left Kol, I went back to the King's room. Once again, I'm stuck. :(

Thanks for looking into this!

Monster adjustments

I'm sorry I keep adding issues, Mcgrew. This one regards to the Droll HP. You currently have it set for 43 HP, which is the HP listed in the Dragon Warrior Strategy Wikipedia. However, after some research on the SNES rom, I discovered that ROM address 0x0BDAB3 listed the Droll HP at 35. There are two places on the internet that further confirms that number, and I'm thinking that's the case for the small 18 XP reward Drolls give out.

Can you look into this one as well, please? Thanks once again; it's very much appreciated! :)

Sprite swaps

Main character sprite swaps. Current ideas:

  • Gwaelin
  • Link
  • Trogdor

Chaos mode

A new randomization mode for extra challenge. Still hammering out the details.

Windows 10 Pro: dwrandomizer.exe is not able to launch correctly.

Windows 10 Pro x64
CPU: AMD FX-8350 Eight Core 4.03 GHz
RAM: 8 Gigs Gskill
Graphics: AMD Radeon HD 7800 series
DW Randomizer: 1.0-rc1 Windows EXE

When I drag and drop the rom to the exe file the only thing that happens I get the spinning blue circle next to my mouse cursor. Then Explorer.exe locks up and I have to open my task manager and close the process and restart it. I never get a command window or anything for the randomizer. I also don't get a randomized rom. The application does appear to be running in some capacity because when I attempt to delete the .exe file windows throws the "this application is still in use error." I can't seem to find any processes linking to it in my task manager though. At this point the randomizer is completely unusable to me. Also worth noting that when I just regularly double click the exe without dragging a rom to it the same thing happens. Also going to note it works fine through .py files so it's just the windows exe.

  1. Open dwrandomizer.exe on a Win 10 Pro x64 machine.
  2. Notice no windows open up and explore.exe locks up.

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.