
Show HN: Angeldust – a fast and efficient video game - ItsFirefly
After years of solo development I&#x27;m presenting: Angeldust, an <i>omni-compatible</i> action RPG and building game!<p>Website: <a href="http:&#x2F;&#x2F;angeldu.st" rel="nofollow">http:&#x2F;&#x2F;angeldu.st</a><p>My single server hosts 250+K active players in one giant, dynamic fantasy world. Angeldust&#x27;s game server is pervasively multithreaded, implementing John Carmack&#x27;s dream of processing an immutable world state each tick.<p>Both world handling and network traffic routing uses any number of threads. For networking, a typical game session only uses ~3Kbps of bandwidth, enabling decent play even over 2G&#x2F;EDGE networks.<p>The client is programmed in C++ with bits of C, Objective-C, Java and PHP. It runs really well on very low-end and obsolete hardware, all the way up to modern systems with fast GPUs.<p>Angeldust works perfectly on Windows XP+, even without hardware OpenGL; Mac OS X 10.6+, even on the first 2006 32-bit Intel GMA945 MacBook1,1; Linux 64-bit glibc 2.17+; Android v2.2.3+, supporting Bluetooth game controllers; and iOS 6+, though iTunes App Store forces iOS 8+ (any way around this?).<p>I live stream weekly on YouTube and Twitch, even right now! Come ask me your development questions! I often see developers playing together with their kids.<p>YouTube channel: <a href="https:&#x2F;&#x2F;www.youtube.com&#x2F;AngeldustLive" rel="nofollow">https:&#x2F;&#x2F;www.youtube.com&#x2F;AngeldustLive</a><p>One more thing: the Angeldust website ( <a href="https:&#x2F;&#x2F;angeldu.st" rel="nofollow">https:&#x2F;&#x2F;angeldu.st</a> ) uses plain HTML and CSS to offer interactive, game-related actions. It&#x27;s fully functional even without JavaScript enabled.
======
suby
This looks impressive. Can you go into how you implemented the immutable world
state each tick a bit more?

I'm developing a game myself, and figuring out a good method of multithreading
it took a lot of work. While I am content with the results, I wouldn't say I
arrived at a good solution.

It sounds like you went with a purely functional approach? Did you rebuild the
entire gamestate each tick, or keep a list of changes you needed to make to
the relevant data?

~~~
ItsFirefly
This question was the most asked one during my livestream. It's a good one!
Even though it's 01:33 right now after a 7 hour livestream, I'll try to answer
it as clearly as possible, building from the foundation up to the high level.

The Angeldust game world is tracked in an "active chunk set". A chunk is a 2D
part of the world, 32x32x64 in-game blocks (meters). The active chunk set
tracks only the chunks that contain, or are near, players. This chunk set is
processed in parallel on any number of threads/cores configured in the server
settings file.

Angeldust tracks two states for the data contained in each chunk, kind of like
an array of size 2. Each tick, one state in the array is the immutable
"read"-state and the other is the mutable "write"-state. Every tick these
states ping-pong between the roles.

During processing the server processes the read state and copies over
unchanged entity/world data by simply pushing pointers to that data into
std::vector<>s in the write state. For things that did change I push a new
pointer into the write state and clear up the old pointer in the next tick.
Pushing pointers saves memory bandwidth since you don't have to copy all
entity data for every tick. And still you can guarantee that the "read"-state
will be unmodified so that other CPUs/cores/threads can freely access all of
the data and pointers.

On the livestream I discussed a few cases where I do use (largely uncontested)
mutexes for data synchronization: for friend chat and private chat I do a
lookup of destination hero pointers in the "hero map" and then lock/unlock the
hero's mutex for pushing chat messages into a vector.

Does this make sense? Let me know if I should elaborate. I will probably take
a nap now, but I'll answer you (and others) tomorrow.

I'll also do another livestream tomorrow, because I feel everyone on HN has
very useful questions, feedback and ideas.

~~~
dreamingincode
Thanks for the explanation! I happened to be thinking of similar
multithreading ideas (chunks and ping-ponging states) recently, but was stuck
on what happens when computation happens across chunks in multiple threads.
e.g. an object move across chunk border, or an object interaction affecting
two objects in different chunks. Could you elavorate on your approach about
these? I'm really curious

~~~
ItsFirefly
Good follow-up question! As for the read state, you're already golden in the
sense that you only read data and don't update it. If a chunk needs world or
entity data from a neighboring chunk—or even halfway across the world—you can
just follow pointers there and you know the data is available and accurate.

For the write state, you're absolutely right that entities will need to
transition between chunks. The server looks up the destination in the "active
chunk set" I mentioned and then uses per-chunk std::vector<>s guarded by a
mutex to push "migrating" entities. This requires a mutex since multiple
CPUs/cores/threads/chunks can be pushing entities to the same destination
chunk. These mutexes largely have zero to little contention.

Does that answer your question in an acceptable way?

~~~
dreamingincode
Thanks! The idea of having a list of migrating entities per chunk is good, and
it avoids locking on the list of all entities in a chunk. But I still have
some confusion about it:

> The server looks up the destination in the "active chunk set" I mentioned

but what if the entity teleports to an inactive chunk?

> and then uses per-chunk std::vector<>s guarded by a mutex to push
> "migrating" entities.

Will these migrating entities participate in later calculation within the same
tick, or are they excluded? If excluded, what happens when there are two
mechanisms that mutates that entity, but the first one put it into the
migrating list of another chunk? If included, the thread of which chunk will
continue this calculation?

And when some kind of mechanism mutates two entities in different chunks,
which thread is chosen to run this mutation? And how does it mutate the state
for an entity in the other chunk?

Meanwhile since you mentioned ticks, (just to be sure) are you using a barrier
per tick to wait for all threads to finish the same tick? When are the
migrating entities merged into the main list, and are you using another
barrier for that?

~~~
ItsFirefly
Really getting into the nitty-gritty here. If an entity migrates to an
inactive chunk, I keep the entity "on hold" and add a "chunk set mutation" to
the active chunk set so that the set is expanded in the next tick. The
processing thread for this newly added chunk sees that no data exists yet and
synchronizes the state from the backend during the subsequent tick. On this
tick the entity gets added to the new chunk write state and disappears quietly
from the old chunk in the next tick since it isn't "on hold" or copied
anymore.

As for the processing per tick: the entire active chunk set gets semi-randomly
processed by threads. You'd be absolutely right that the order of operations
isn't always deterministic. An entity not being processed for a tick doesn't
happen since the old chunk will still process entities that are "on hold", but
only perform a subset of operations. Double-processing does occur and this is
sometimes visible while playing with a chat message being duplicated. This
happens pretty rarely and I took care to make sure occasional double-
processing doesn't interfere with gameplay mechanics.

As for synchronization: yes, each tick all processing threads join together
and the server performs minor central processing and scheduling. Then the next
tick begins and all threads are started again.

~~~
dreamingincode
I see. It seems sometimes we do have to live with non-deterministic behaviors
or even small errors.

I'm still unsure about the following question from your answers: > when some
kind of mechanism mutates two entities in different chunks, which thread is
chosen to run this mutation? And how does it mutate the state for the entity
in the other chunk? My initial thought was this would require adding locking
on every entity, since it might be accessed from another chunk/thread. But
that's clearly not ideal. Maybe have a separate list for outside-chunk
changes, and merge them with internal changes later?

And regarding having two states: How/when are you sending world state to
clients? My thought was to clone the current state periodically and send it to
clients (can sending takes less than one tick? I don't have an idea). Sending
state to clients seems to be needed if the game needs client side predication,
hence this question.

~~~
ItsFirefly
I think your first question is actually supposed to be: what if a _single_
(not two) entity is modified from multiple chunks?

All external effects that can happen to an entity are written to an atomic
integer that tracks healing points, damage points and effects like poison and
stunning. Angeldust currently runs on CPUs supporting atomic integers
everywhere, so this doesn't have to fall back to mutexes. On
platforms/compilers without atomic integers I have a software-fallback that
uses mutexes for this, but currently it's not used anywhere.

Most world state is compiled into flat byte arrays each tick to save
processing time, since many clients can be in the same area at once. The
server bundles these world state byte arrays for chunks near a client together
and sends them over the network. The client interpolates from these updates.
What you see on screen lags behind subtly to make sure animations are smooth.
I think this happens in most online games since you don't really want to
extrapolate.

Angeldust's game pace and mechanics are designed so that the interpolation
doesn't affect your aiming accuracy or game experience too much.

~~~
dreamingincode
Thank you again for all the explanations!

------
echelon
How did you afford taking off years of work to develop this? Did you have a
lot of capital / runway? Low cost of living?

Kudos for this extremely well polished project. This is the dream many of us
have but can't or won't embark upon. This is very inspirational.

~~~
ItsFirefly
Good question. I started working right after what we call "middle school" in
the Netherlands which translates to high school I think. During the daytime I
would work my job and in the evening self-study for the "Open University" we
have here.

I lived with my parents during this time and could save up money as a buffer.
Thanks to that support I could financially bridge these past years of
development without worrying too much. Also: keeping expenses as low as
possible. My product is old school and so are my computers.

~~~
echelon
You're killing it!

Great choices, fantastic execution.

You're going to go far. Keep it up!

~~~
ItsFirefly
Thanks! A slight word of warning though, something that also came up during
yesterday's livestream:

I've been really lucky to be able to successfully fulfill my childhood dream
by making this game. But like Freddie Mercury sung: it's [not always] been a
bed of roses or a pleasure cruise. I've sacrificed progress in other areas of
my life to see this through to the end. I hope to catch up there starting as
early as next year. Nonetheless I definitely wouldn't be the same without
having taken on this adventure. I've grown so much as a developer, an
entertainer and even as a person by creating Angeldust.

~~~
w0utert
>> _I 've sacrificed progress in other areas of my life to see this through to
the end_

>> _I 've grown so much as [..] and even as a person by creating Angeldust_

These are words of wisdom that prove your point, and I think it's a great
thing you've posted them here!

------
ItsFirefly
Thanks so much everyone for all the positivity so far! I'm still streaming
right now. After the stream I'll catch up with all questions and comments
here, I've had a blast talking about my work so far.

And if any of you can get me in touch with John Carmack that'd be very awesome
;)!

~~~
jheriko
send him e-mail!! worked for me :)

~~~
ItsFirefly
Both you and Exuma: thanks for the down to earth answers! I'll give it my best
shot.

------
shamelessApathy
For the senior citizens viewing this they might relate the term "AngelDust"
with the dissociative PCP, let me assure them though, it hasn't been called
AngelDust since the 70s. You'd be much more likely to hear it referred to as
"wet" or "sherm". IF you went to the ghetto and tried t buy Angel Dust they'd
think you were a cop. It's like calling weed "dope". Just a little
disambiguation from a drug name etymologist :)

~~~
LeftHandPath
> For the senior citizens viewing this they might relate the term "AngelDust"
> with the dissociative PCP, let me assure them though, it hasn't been called
> AngelDust since the 70s.

I don't see that connection as an issue with the game or your post. It
certainly isn't doing anyone any harm, despite what others suggested in
earlier comments.

That said... I'm 21 years old, and I still associate "angel dust" with PCP.
The name is still used by popular rappers including Mac Miller [0] and Run the
Jewels [1]. It is still defined as PCP in 6 of the top 7 results, vs 5 of the
top 7 for "sherm" and 0.3/7 for "wet" on Urban Dictionary [2,8,9]. Angel dust
is the most common synonym for PCP on Urban Dictionary [10]. The name "angel
dust" was used to refer to PCP in a 2011 episode of Its Always Sunny in
Philadelphia [3]. The name is still in common parlance on Reddit [4,5,6].
However, the drug seems to have experienced a decline in popularity,
accounting for less than 0.1% of all documented hallucinogenic drug use in the
United States in 2017 [7] - suggesting that the term "angel dust" is not well
known simply because the drug isn't commonly used, and not because the term
has been abandoned.

I just don't want anyone to get into trouble thinking that they can use the
phrase "Angel Dust" without it being seen as a reference to hard drugs by the
general public.

I am also surprised that this association is being rejected, considering that
the creator of the game is going by "Frank Lucas" [11], which is the name of a
famous drug trafficker [12].

[0]:
[https://www.youtube.com/watch?v=rIQqzTNRmoc](https://www.youtube.com/watch?v=rIQqzTNRmoc)

[1]:
[https://www.youtube.com/watch?v=R_esHn4X03U](https://www.youtube.com/watch?v=R_esHn4X03U)

[2]:
[https://www.urbandictionary.com/define.php?term=Angel%20Dust](https://www.urbandictionary.com/define.php?term=Angel%20Dust)

[3]:
[https://itsalwayssunny.fandom.com/wiki/The_Gang_Goes_to_the_...](https://itsalwayssunny.fandom.com/wiki/The_Gang_Goes_to_the_Jersey_Shore)

[4]:
[https://www.reddit.com/r/PCP/comments/ba1754/two_dimes_of_pc...](https://www.reddit.com/r/PCP/comments/ba1754/two_dimes_of_pcp_angel_dust/)

[5]:
[https://www.reddit.com/r/Drugs/comments/5tru38/what_is_angel...](https://www.reddit.com/r/Drugs/comments/5tru38/what_is_angel_dust_and_what_is_the_high_like/)

[6]:
[https://www.reddit.com/r/serialpodcast/comments/2qove1/how_l...](https://www.reddit.com/r/serialpodcast/comments/2qove1/how_long_does_an_angel_dust_pcp_trip_last/)

[7]: [https://www.drugabuse.gov/drugs-
abuse/hallucinogens](https://www.drugabuse.gov/drugs-abuse/hallucinogens)

[8]:
[https://www.urbandictionary.com/define.php?term=sherm](https://www.urbandictionary.com/define.php?term=sherm)

[9]:
[https://www.urbandictionary.com/define.php?term=Wet](https://www.urbandictionary.com/define.php?term=Wet)

[10]:
[https://www.urbandictionary.com/define.php?term=PCP](https://www.urbandictionary.com/define.php?term=PCP)

[11]: [https://angeldu.st/en/game#play-now-
button-3](https://angeldu.st/en/game#play-now-button-3)

[12]:
[https://en.wikipedia.org/wiki/Frank_Lucas](https://en.wikipedia.org/wiki/Frank_Lucas)

~~~
lostgame
I love your username. Do you follow any particular current of Western
Ceremonial Magick?

~~~
LeftHandPath
I do not! (Sorry to disappoint - I’m a run of the mill atheist).

My name was inspired by a Gilfoyle line in Silicon Valley, which references
Magick:

[https://getyarn.io/yarn-
clip/9481dd82-17de-4791-b110-0e58434...](https://getyarn.io/yarn-
clip/9481dd82-17de-4791-b110-0e584342f7df)

(Since you’re on HN there is a good chance you’re familiar with the show - but
if you’re not, the Gilfoyle character is a self-proclaimed LaVeyan Satanist)

------
colatkinson
This looks incredible. Gives me vibes of old school Runescape, mixed with
Minecraft. Plus the performance as you've detailed it sounds like quite a
feat! Also very cool to see a project that supports old hardware--I remember
being a kid with hand-me-down computers struggling to play even some Flash
games.

Gonna give this a play tonight. Rock on, dude!

~~~
ItsFirefly
Thanks for the feedback, I hope you enjoy playing. I'll be livestreaming again
today at 17.00h UTC, feel free to swing by to hunt together, or talk
technology!

------
ArchReaper
Do you have any plans to open-source all or parts of the game or underlying
platform? Do you plan on developing this into it's own 'game engine' or plan
on going further than this initial game? I've been following a few multi-
threaded game projects and they are always very interesting to read up on,
best of luck!

~~~
ItsFirefly
Yes, open sourcing at least the client part of the game is something that I'm
very interested in. I'm not entirely sure when or how this will happen just
yet, it will depend greatly on the commercial success of the game. But it's
definitely my preferred course of action for the future.

EDIT: I'm not really interested in separating or spinning off the engine, but
you will have few problems turning the game into something entirely different.

~~~
ossworkerrights
While I would advise against open sourcing the core of the game, opening the
client api may be a good idea - perhaps others can write clients for it, but
there may be issuing around people making bots to cheat the game.

~~~
ItsFirefly
I wrote a "bot" myself in the form of a network simulator for general and load
testing of the server. If players were to automate the game I'd be more than
happy to make a special server where we could show off their work. Making an
agent navigate an open 3D space and performing planned tasks would make for an
impressive demo for all parties involved.

~~~
exikyut
That might make a good first open source release actually, if it implements a
good chunk of the game protocol you might be able to use it to get a rough
idea for the types of ideas people would want to run with, and it would also
allow people to hit the ground running actually implementing ideas against the
engine quickly.

A separate test server would be a _very_ good companion idea.

~~~
ItsFirefly
I hadn't even considered this before, but I see your point! Getting a "core"
part of the game's "API" released first allowing players to fiddle around
writing a bot sounds like a beautiful gift for the technically inclined
players. Because of the small(er) scope it could help iron out wrinkles in the
open-sourcing of the client as a whole later on. Thanks!

------
nikkwong
This is the most interesting thing I've seen in a while. Props man. Good work.

~~~
ItsFirefly
Thanks so much! Finally sharing the end result of all my hard work feels
really good. And seeing so many visitors swing by on the livestream is insane!

~~~
nikkwong
Yeah. I'm definitely going to follow you for more updates. It will be
interesting to slowly learn from you via osmosis as I've been interesting in
developing browser games for a long time. Seriously impressive to see what
today's tools enable creative people like you to do as a team of one.

~~~
ItsFirefly
"Today's tools" do not necessarily allow you to make anything like this. I'd
even go as far as to say that an array of ancient hardware and software are
the main reason for being able to make a product focusing on compatibility and
performance. Not aiming for a moral high ground, but just looking at it
practically.

I started Angeldust on my trusty, white MacBook1,1 mentioned in the starting
post. Having only an Intel GMA945 for powering a 1280x800 display and trying
to get a decent frame rate forces some design decisions. I quickly ran into
optimizing for GPU overdraw and resources instead of being bottlenecked by the
dual-core Intel CPU.

Then I ported the engine to iPhone 3GS where you get the exact opposite
situation: the GPU can push lots of pixels to a 480x320 screen, but the ARM
CPU is struggling to keep up. Just this 2006/2009 era combination of hardware
alone forced me to be efficient with both CPU and GPU. Eventually I even got
the engine running smoothly on a first-gen Raspberry Pi on a 1280x1024 display
which is no small feat.

I think if you start from "today's tools" on "today's hardware" it's entirely
too easy to consider any older platform inaccessible or obsolete, while if you
work the other way around you appreciate the sheer power older devices have
when used properly. Then moving onto newer hardware is just icing on the cake
and just shows you how ridiculously powerful a modern 6-core Ryzen with an
appropriate GPU is.

~~~
radres
Your stories are great to listen to. Is there any other place I can follow you
other than YouTube channel?

~~~
ItsFirefly
Pick your poison; I also have a Twitch channel:

[https://www.twitch.tv/AngeldustLive](https://www.twitch.tv/AngeldustLive)

I'm not a social media user and I currently don't keep a public blog. There
are many interesting aspects of Angeldust to talk about and I have many war
stories from this and previous projects that would make for an interesting
read or listen.

Just this evening I talked on my livestream about my rough introduction to
SIGPIPE randomly killing my server processes. I can understand that a YouTube
or Twitch livestream isn't the most convenient format for hearing these
stories, but it's currently my most warm and entertaining way to share them.

Streaming is a highlight in my life, while writing out stories feels like
work. Very faintly I'm crystallizing a plan to share knowledge in a written
way, but for now I think the livestream is going to be my preferred way for
requesting and telling stories.

------
smt88
> _programmed in C++ with bits of C, Objective-C, Java and PHP_

I am very curious how and why this happened

~~~
ItsFirefly
On the livestream I detailed this a bit. Angeldust has a single "domain model"
containing all item, entity and object properties contained in a PHP code
generator that generates C++ source code and header files for use in the
client, server and asset tools. It also generates PHP files for use in the
interactive and tied-to-the-game website. The website is also in PHP.

The client uses Objective-C to integrate certain platform features into the
C++ codebase on iOS and macOS. Java is used for some functionality not
provided by the Android NDK.

------
unixsheikh
Congratulations, amazing work!

I absolutely love how you have opted out for frameworks on the website and
that it just work. Kudos!

The same for your considerations for making it work on old hardware and you
comments on your live stream today about your old Mac and making it run on
Windows XP as well.

More developers need that attitude.

I wish you all the best and I hope this becomes a Minecraft size success!

~~~
ItsFirefly
(Michael Scott:) Finally! Thank you. The "old school" PHP -> HTML + CSS with
minimal JavaScript website is a thing of beauty I think. It's heartwarming
that HN didn't dismiss my website just because it's not Web 2.0 or 3.0. From a
technical perspective it's very much Web 1.0. But I see it as being elegant,
functional, very fast and maintainable. It's tied in to the game at a core
level as well, with real-time updates of in-game action. Also: I didn't even
see a CPU spike during HN's peak hug, so try harder, soldiers!

As for the older hardware and building something for performance: in my dreams
this past night I realized that HN as a website closely fits my design
philosophy. This website is just completely transparent and gets out of your
way. You get a box. You enter text. Boom. It's beautiful. I hadn't posted on
here before, but the entire experience has been delightful.

Tangent: sometimes it feels like the home computer I grew up with was faster
than any modern device that I use. I'm glad I'm at least able to recreate that
feeling of raw performance on older hardware. Computers have always been
insanely fast, I'm not sure where we lost sight of that.

------
ItsFirefly
Still streaming, sorry, it's a crazy and crazily cool moment for me right now.
I promise I'll be back with answers soon! :D

------
findyoucef
Have you thought about porting this to Nintendo switch? Indie community is
huge so many games do well on the platform.

~~~
ItsFirefly
Yes. A lot! Unfortunately I've always considered "the big three" consoles
completely out of reach for my project. Many players have asked about a port
to the Switch and other consoles. I'm confident I'd be able to pull it off
technically without too many issues. But I have zero experience dealing with
parties like Nintendo and adhering to their (I imagine) very strict policies
for games. Being a mostly-multiplayer cross-platform-play title complicates
things too I think.

During my stream yesterday I also discussed Switch compatibility. I think
Angeldust is a _perfect_ fit for the Switch. Nintendo's design philosophy very
closely matches mine. Angeldust is big, bold, colorful, cheery. Let's get it
on there stat I'd say!

If you have pointers on getting started with indie development on the Switch,
I'd happily start reading up. Now's a good time as any. And with most things
in the game I learned everything by just starting and winging it. Hopefully
this'll be another case of being able to quickly internalize things and get
going.

~~~
friendlybus
These guys help indies port to consoles, maybe they have a few tips?

[https://do-games.com/](https://do-games.com/)

~~~
ItsFirefly
Thanks, I took a look. They look geared specifically to getting Unity engine
projects "ported". Porting my (non-Unity) code is the least of my worries; I'm
already maintaining about ten different build toolchains.

I anticipate most problems in the Nintendo Switch platform rules and
guidelines that I'm completely unfamiliar with as of yet. And I lack the
hardware to test. But now that I'm forced to think more about it, both seem
like solvable problems. Thanks for the inspiration :)

~~~
friendlybus
I found that company via a gdc talk by the guy who did The First Tree (the
talk was called No Time, No Budget or something alike). He used them mostly to
get through the hurdles of rules and guidelines. Glad I could inspire good
luck with your game!

------
appleflaxen
How did you choose the name?

For a native english speaker, the only association I have is with really hard
street drugs (specifically PCP), and that association is very strong.

Is there a special meaning for your game?

~~~
ItsFirefly
Since your message popped up right at the top I'm going to reply to it,
hopefully summarizing my view on this and addressing the lively discussion
about the game's name.

There is a special meaning for the game. The short backstory is included on
the game's website. Here's the gist: in the game's lore Violet and Crimson are
angel siblings. Violet is the angel of creation, Crimson the angel of
destruction. Due to unforeseen circumstances both angels shatter to dust. This
dust dwindles towards the planet where the game takes place. Subsequently
parts of the game world and its inhabitants have been permanently infused with
magical energy. Energy derived from the dust of angels. Angeldust.

"Angeldust" is beautifully fitting and it's a beautiful name in my opinion. I
wouldn't want it any other way. There's an entire design language behind the
lore, the names and composition of the game world. To a casual observer this
might not be apparent or make sense. But everything ties together perfectly.

I've seen discussion and jokes about the name before when reaching a larger
audience. It's great that people have an opinion on the name and some of it's
(in my view) lesser known historical usages. As far as I'm concerned Angeldust
is a pretty cool video game product with unique properties. In no way, shape
or form do I want to endorse or conjure connection to other, past uses of
"Angeldust". I hope you can appreciate the context, connection and product
that "Angeldust" refers to for me.

And then I get there's a bit of confirmation-bias and pattern-matching going
on with my name. I wouldn't have expected otherwise from the smart hackers
here. I have no good argument against this. I wasn't aware that I share my
name with a (for you all, well known?) dude from the past. Given finite first
and last names, collisions are bound to happen. Maybe we should start using
MD5- or SHA-hashes as names to prevent this in the future.

~~~
vectorEQ
i like the name and don't associate games with drugs, so for me personally the
name, even though used for some drug as a nickname (official name of the drug
is obviously not angeldust) doesn't make that click. I think personally plenty
of people will not relate it, and for most who do it might just be a bit of a
giggle / afterthought if they do.

If it's really related to the in-game content and lore i'm sure players will
figure that out and create a new more positive association to the word.

For example, a male donkey is called a "Jack", yet people still name their
kids Jack, not relating that to a male donkey... (maybe a little more benign
example.)

Personally i wouldn't worry about it too much! it's not like the game is
called CrystalMeth or something....

~~~
nkrisc
Well, traditionally, Jack was a nickname for John. So they likely named their
kids John. Though I guess more often these days people give their children a
nickname as their fully-qualified given name.

------
iTokio
What are the advantages of using your custom engine instead of unity, unreal
engine?

~~~
ItsFirefly
My vision was to make an "all-inclusive" product where people with ancient
hardware would be able to enjoy a modern-day product. All existing engines
focus on modern specs like OpenGL 3.x, 64-bit processors and operating system
versions that I am not even able to run on some of my own devices.

In addition I have complex, dynamic geometry to render. And I wrote a custom,
fixed-precision integer math library to prevent rounding errors for the almost
infinite game world. Other products have weird rounding errors near the start,
the middle or end of their worlds because of inconsistent floating-point
accuracy. Moving to doubles only mitigates the problem instead of solving it.

And then it's just efficiency too. I have no idea how or why Unity or Unreal
will treat my assets. As demonstrated on the stream: the game instantly
switches between visual styles and texture quality. It lazily loads all
resources so the main thread is only stalled when doing bulk uploads to the
GPU. This makes the game start up in less than a second, something I couldn't
pull off with a COTS engine.

Let me know if this answer didn't address your question fully.

~~~
jammygit
How long did the client side engine take to build, if you had been able to do
it full time?

~~~
ItsFirefly
It's ridiculously hard to come up with an answer to this seemingly simple
question. I've tracked my time usage pretty meticulously by version number,
but for most features I had to develop the server-side, client-side, website
and network simulator code simultaneously. Developing this (or any) game I
think isn't a process where you build the server first, then build the
simulator and then build the client. It's building v0.0 for all parts, then
v0.1 for all parts and onwards where all parts gain features in lockstep.

For Angeldust I've done dozens of updates, each and every single one building
upon the existing base. Looking back it's amazing to see that the product
evolved in an almost linear fashion from v0.0 all the way to the current
version without ever having to drop or redo features. But because the product
evolved as a whole I can not really distill a time estimate for only the
"client side engine".

I mean: would you consider _testing_ the client side engine part of client
side engine development? For testing you need a working server. For which you
"need" a working network simulator. It's dependencies all the way down.

And how about translation work for in-engine strings, updating shared
libraries and frameworks, issue tracking, writing the asset conversion
toolchain (which needs assets, which need integration). It's very hard to come
up with any solid number. Maybe if you can severely limit your question's
scope I can come up with an educated guess.

~~~
jammygit
I think all that counts. I guess I’m just tempted to make a game engine as a
hobby project. I made an OpenGL renderer in uni once (it was fun), but I don’t
really know what the scope would be to extend it substantially - obviously,
not to “unreal” levels or anything even close

~~~
ItsFirefly
Go for it! If you already have OpenGL experience—doesn't matter what level—you
"only" have to add a bit of basic 3D world math and input handling. I found
SDL ([http://libsdl.org](http://libsdl.org)) to be a very good core framework
to build upon regarding input handling.

For the 3D world, start with a checkerboard pattern or so. In fact, this is
almost exactly what I did to start Angeldust. I once showed off some early
game prototypes on my stream, take a look at this one for example:
[https://www.youtube.com/watch?v=qMs8YpkSrg0&t=3289](https://www.youtube.com/watch?v=qMs8YpkSrg0&t=3289)

If you keep watching that stream you'll see other in-progress versions so you
can see how my product evolved.

~~~
jammygit
Any other resources you would recommend? I read that physics is particularly
time consuming for example. Thanks for the replies so far; it’s very fun to
see your work

~~~
ItsFirefly
I didn't really use many external resources during development, most of the
time I'm just "winging it" and acting towards a goal that I have in my mind.
Coming up with a naive solution first, then trying to optimize it a bit in my
head, then writing the code for it.

Angeldust's physics are relatively straightforward since it's based on a voxel
grid. All game world intersections are approximated using axis-aligned
bounding boxes (AABBs). I wrote the physics engine myself from scratch to
reduce the number of game world data lookups, because that's pretty much the
hot path in the code.

In the YouTube video from my earlier comment you can see that initially I
started out with just game world boundary clipping and simple plane physics on
the checkerboard. As I expanded my game world model, the physics engine grew
along. So my advice would be (again) to start simple and grow from there.
You'll do fine!

------
travbrack
Is there a Mac installer available for download? App store says the game isn't
available in my region (USA)

~~~
ItsFirefly
Quick answer—both Steam and Itch.io offer DRM-free, standalone macOS versions:

Itch.io:
[https://metagaming.itch.io/angeldust](https://metagaming.itch.io/angeldust)

Steam:
[https://store.steampowered.com/app/488440/](https://store.steampowered.com/app/488440/)

Long answer—you are the fourth hacker to report that the game isn't available
for you on one of Apple's App Stores. I've contacted Apple right after my
stream yesterday, now waiting for a reply. If anyone can help me diagnose this
or get it working, that'd be greatly appreciated. I recently switched from a
free tier to a paid tier for the product launch, so I might be messing up
something.

~~~
sickmartian
It's showing up for me in the App Store, macOS Mojave 10.14.6 (18G1012) from
Argentina. Hope it helps with diagnosing somehow, and good luck with the
project, looks impressive.

------
mysterydip
Assuming "works perfectly on XP even without hardware OpenGL" means you have a
software renderer as backup, can you explain more about how you get
performance out of one on modern OSes (where DOS techniques of direct
framebuffer access don't apply)?

~~~
monocasa
Windows XP IIRC shipped with a soft OpenGL that'd look like a hardware
version. I imagine they's not doing anything special other than not having
requirements that a soft renderer can't fulfill.

~~~
ItsFirefly
Right on. Software OpenGL 1.1 works on XP (and other Windowses) and the render
engine falls back to minimal features if it detects this.

------
ossworkerrights
How long did it take you to reach 250k players, and has there been marketing
involved?

~~~
ItsFirefly
This HN post is kind of the first attempt at getting the game out to "the
public" aside from passively being present on app stores like Steam, Itch and
Google Play.

~~~
ossworkerrights
Sounds good - keep up the good work!

------
tanyatik
This looks cool!

250K players is impressive. Are those real players or bots?

Interesting to know more about performance too, what is your rate of update
per second? How long does it take to process a tick?

Do you have a tech blog? Would be really interesting to learn more.

~~~
ItsFirefly
You might have noticed I already took a looong time to formulate a reply to
your questions. And I'm still not sure how to approach them, so I'll reply to
the last part first.

Currently I only have my livestreams as a public presence. I find it a very
comfortable and pleasant medium for conveying who I am. It lets me share
stories and ideas including non-verbal cues and that's a major plus for me. So
if you want to learn more, definitely subscribe or follow on YouTube and/or
Twitch:

[https://www.youtube.com/AngeldustLive](https://www.youtube.com/AngeldustLive)

[https://www.twitch.tv/AngeldustLive](https://www.twitch.tv/AngeldustLive)

I honestly appreciate talking about technical things a lot, even though I
might be playing what appears to be a silly video game. As for streaming: I
just did three consecutive days, but will take a short break. I'll be back
this Thursday.

------
winrid
Awesome job. I'm working on a game with some similar technical challenges
(landscape is based on actual Earth though) and backend is in Java. I'll see
if I can get my friends to play.

~~~
ItsFirefly
I read somewhere about doing your project in a "release early, release often"
style of development. While developing Angeldust I got others involved and
playing after just a few months of part-time development. Getting feedback,
ideas and issues early definitely helped me build a rock-solid base on which I
could build the overarching gameplay.

So if you have friends (you're already doing great there!), get them playing
today! Or tomorrow! It also forces you to have a working build pipeline and
packaging process for getting builds out to others instead of toying around on
your own machine. Also: don't take my advice as gospel, but judge its merit
for yourself.

~~~
latchkey
[https://en.wikipedia.org/wiki/Release_early,_release_often](https://en.wikipedia.org/wiki/Release_early,_release_often)

------
keyle
Impressive for a solo indie game dev.

------
odrzutowiec
Hello, very impressive project, great job! I have two qestions, somehow
related but not fully.

1) How did you handle such big distance draw? Are you using lod and occlusion
culling? Was it PVS or rather depth buffer based solution? Did you use bsp or
octrees or something else?

2) what data structures did you use to hold the world and it's objects? And
how much of it is kept on the server vs client?

~~~
ItsFirefly
Angeldust has practically zero level of detail (LoD) and has no occlusion
culling. "Almost zero LoD" means that geometry is always rendered at full
resolution, but subtle vertex-shaded effects like the waving of grass are not
applied for distant geometry. So you will see grass everywhere, but it won't
wave when it's "unnoticeably" far away. Other than that I just push millions
of mostly buffered triangles and vertices each frame at high view distance
without a hitch. Turns out computers are pretty fast these days.

Note that I'm working on a newer render engine that actually uses more GPU
shading capabilities and this engine runs even smoother than the current one,
since it balances the workload a lot better between CPU and GPU.

As for data structures: both client- and server-side it's pretty much a simple
std::map<coordinate, chunk*>. Its O(log(n)) lookup is adequate and I don't
want or need to do complicated things to ensure decent performance. On top of
the map I do spatially-aware caching to prevent say 99% of actual map lookups
which turns the majority of lookups into O(1) which seems pretty much optimal.

As for keeping data: the server is authoritative in everything. The server
keeps the data. You can take any device, install Angeldust and sign in with
your credentials and you'll find yourself back in the same world, same
friends, same progress, same everything that you had on another device.

Same with game state: the server tells the client everything. The client is
basically just a dumb graphical terminal application that renders 3D visuals
instead of VT100 text.

------
synthecypher
Awesome were you inspired by Ace of Spades at all or have heard of it?

I remember that original voxel-based engine and web server list that launched
the client using their custom URI.

It was awesome how small the game was and how fun it was the simple concept
(Minecraft with guns and no floating blocks).

~~~
ItsFirefly
I once saw a trailer for AoS, but to be honest I don't really play many games
myself these days. I find that working on Angeldust is in itself a reward that
alleviates the need to play games as escapism or entertainment.

~~~
friendlybus
Just curious, what would you say to your customers that are playing you game
for the sake of escapism or entertainment?

~~~
ItsFirefly
I'd say: have fun! With Angeldust being a shared, persistent, open online
world it's a pretty cool place to make friends and work on building projects
together. You can leave a permanent mark in a place where you can be someone
else compared to real life.

But I always advise enthusiastic players to keep an eye out on real life. Mind
your health and your relationships. Real life, family, friends—they all come
first. Of course you can be friends in-game and even build meaningful
relationships there, but that's no substitute for living a well-balanced
"real" life.

I've been an avid gamer in the past, and right now I'm a very avid developer.
I try to balance that in real life by playing sports and exercising three or
four times per week. Going out on walks, to the movies, meeting up with
friends. "Balance in all things" as a character from Baldur's Gate would say.

------
blunte
This game is not available in the Dutch Apple App Store :(

~~~
McDev
Same for the UK.

~~~
ItsFirefly
Sorry for taking a while to reply—I contacted Apple support and it seems like
the issue is out of my control. For both you and the GP comment I'd like to
refer you to my reply here with background and more information:

[https://news.ycombinator.com/item?id=21872869](https://news.ycombinator.com/item?id=21872869)

------
bdibs
Looks fantastic! When did you originally start development?

~~~
ItsFirefly
I'm going to give a sentimental answer instead of a fully accurate one. This
also came up during the livestream, so it's a great question!

When I was a five or six years old kid I used to program on our home computer,
a Philips P2000. Monochrome green on black CRT, Zilog Z80 CPU, different ROMs
for running BASIC or Pascal or whatever you hacked onto it. My very first
program drew Christmas trees on screen. Very appropriate to share this story
right now. I immediately showed my mom, who wasn't really impressed, because
she didn't understand what I had done. I had told my computer what to do—wow!

Then one day I was walking around the schoolyard imagining the world around me
being digitized and available as large, 3D blocks inside my computer. "My"
P2000 wasn't advanced enough to pull it off and similarly _I_ wasn't advanced
enough to program something like that. But the idea of having a coarse, 3D
replica of my world and being able to have fun in there with my school buddies
always stuck with me.

Many years later, at an intellectual dead-end in my job I took a month-long
vacation to regain focus on my life and myself. And I suddenly remembered my
childhood dream, or fantasy, of that 3D world. And I realized that computers
were now advanced enough and _I_ was advanced enough. So I decided to take on
the journey, channelling my inner five-year old.

Some players have joked about this with me. That they're actually investing
their time in the figments of a five year old's imagination. And that's not
far from the truth. Even though Angeldust is better, more beautiful and more
professional that I had ever imagined, it is the actual implementation of my
childhood dream.

So the answer to your question is that I started development somewhere between
being five years old and now. Hopefully this answer still gives you some joy
and insight!

------
angrais
What's your plans for commercialising AngleDust?

~~~
ItsFirefly
Attaching a price tag it (done!) and trying to spread the word through
relevant channels (in progress). Posting on Hacker News has been a thoroughly
enjoyable process so far and I look forward to meeting more great minds.

------
jameslin
I tried to download the game from appstore but it's not available in NZ, maybe
you can provide actual package to download without app store.

~~~
ItsFirefly
Of course! I can't distribute iOS apps outside of the iTunes App Store, but I
do have DRM-free, standalone versions of Angeldust for macOS here:

Itch.io:
[https://metagaming.itch.io/angeldust](https://metagaming.itch.io/angeldust)

Steam:
[https://store.steampowered.com/app/488440/](https://store.steampowered.com/app/488440/)

If anyone nows a way to distribute iOS 6.1+ apps that doesn't violate my
agreements with Apple, get in touch with me :D!

------
Narishma
Is there a way to close an account?

~~~
ItsFirefly
Sure, ping me on the e-mail address listed on the support page.

------
p410n3
Wow. It works everywhere. Amazing

------
ehhhhhhhh
Does fast & efficient = fun?

~~~
setr
Makes it more likely.

I've noticed a first-pass test for video game quality is to watch the speed of
menu transitions -- a slow transition time is indicative of other problems
(menus are the least interesting, and very common, interface a game provides
you; no one wants to spend any more time in the menu than they have to, except
the designers).

Speed correlates highly to quality in game implementations.

Additionally, being a multiplayer game, fun also comes almost for free -- as
long as you give decent tools for supporting the social interaction, the
players will bring the fun in themselves. (For some reason, a lot of games
fear their player base, and strangle the interaction opportunities as much as
possible).

------
martinesko36
What are your server costs?

~~~
ItsFirefly
It of course depends on the demand, but very low in general. During periods
where I don't have a lot of player activity even a single vCPU is enough to
host about 2.000 simultaneous players.

~~~
yazaddaruvala
> It of course depends on the demand

Do you require downtime to scale or is it seamless?

~~~
ItsFirefly
Migrating requires downtime since the game server runs as a monolithic entity.
I migrate between dedicated servers and VPSes based on expected demand. Right
now we're running on big metal to be able accommodate many players coming
while I'm more actively promoting it.

When the hype settles down I'll probably move back to a small VPS. I always
joke that Angeldust and the server would even run on your toaster. I bet it
would even be able to serve hundreds of simultaneous players before turning
into toast.

~~~
plasma
Not sure how your backend works, but I read a neat technique by I think Second
Life, where each actor is in a zone, and a zone is managed by a server.

If a player leaves the zone, their entire code stack and current state is
shipped to the next zone (script hand off) without the player noticing. They
mentioned because each actor is running in a VM/scripting language, the
servers can pause/resume the VM for that actor on any machine they move to -
pretty neat.

~~~
ItsFirefly
You can read a bit about the Angeldust backend architecture in this comment
chain (I have no idea what to call this):
[https://news.ycombinator.com/item?id=21858618](https://news.ycombinator.com/item?id=21858618)

The Second Life approach sounds like a very good solution if you're having to,
and willing to use multiple servers because of performance reasons. I think
Angeldust's architecture is a bit cleaner and more straightforward due to
different design goals. I specifically wanted to reduce complexity and keep a
simple infrastructure so that I could code, debug and manage everything on my
own.

I also have the luxury of using a single, big, many-core server if necessary.
When Second Life started I don't think 32+-core servers were a thing, so their
scaling model was probably also born out of sheer necessity.

------
lbj
Amazing job man, well done

------
anthk
No OpenBSD support :p.

~~~
ItsFirefly
Don't sweat it! I did get an older version of Angeldust running on OpenBSD
with pledge and unveil without problems. It's just not a market I can
comfortably cater to at the moment. Kick back and relax for a moment and
there'll probably be a binary or source distribution for *BSDs too. Same with
Raspberry Pi. Game runs beautifully, but I have no great packaging and
distribution process yet.

In addition I also ran Angeldust on Haiku. There is no reason why a product
like this wouldn't run everywhere.

(Also shoutout to theo and/or tedu if you're here.)

------
doyoulikeworms
this looks incredible, thank you for sharing!!

------
JshWright
Tried registering, but the password input in the Android app doesn't support
pasting text...

~~~
ItsFirefly
Yes, I'm sorry that the UI support on Android is a bit limited. Input support
is a bit lowest-common-denominator there to work around keyboard bugs.

~~~
matthewcanty
I would also add that I get a little ticked off when I have to adjust my
password manager's defaults - in this case reducing from 64 to 32 characters.

In the past I have very-often stopped exploring a new thing at this point but
this time I am continuing! Looks great and I also eagerly await more details
of it's implementation.

~~~
ItsFirefly
Honestly, thanks for the feedback. I never realized / got feedback that
players would indeed use a password manager for a game like mine. "It's just a
game!" is not the best defense here and the workflow of getting an external
password into the game afterwards is also pretty subpar. I'll need to think on
this for a good solution.

~~~
izietto
When you use a password manager, you use it for everything has a password.

------
jdkee
How is this not Minecraft without extra steps?

------
Paperweight
This comment will get downvoted but, dude, you are a GOD tier programmer. How?

~~~
ItsFirefly
Thanks for the kind words! I'm not sure if I can give you a recipe or an
answer. I do me like you do you. Everyday I give it my best and eventually you
end up with a product like this. Just get started and work on your dreams!

------
nnq
The graphic style - oh, my eyes!!! Please team up with a designer, or with a
_different designer!_

...I don't mean the quality, it's understandable resources are constrained. I
mean the _actual artistic decisions_... it burns your visual cortex with all
those colors and textures fighting each other. What's the theme,
"kindergardeners on acid meeting Elvis"?! or "South Park but in Fortnite drawn
while drunk"?

~~~
ItsFirefly
Oof! I'm the designer and art director myself. Please elaborate a bit as
"colors and textures fighting each other" doesn't give me the slightest clue
as to what you perceive as problematic. Can you post annotated screenshots so
I can learn from this? Then I'll go and fire myself!

I've been playing the game in both the "Cartoon" and "3D" visual style for
years and it's been a very pleasant and eye-pleasing experience for me. Please
open your world a bit for me. Maybe share some of your design work for
inspiration. Thanks in advance for your feedback.

~~~
nnq
Heh, sorry, I've been to harsh with the comment I guess... it's probably just
me personally being "highly allergic" to this particular toony-style. I think
it sort of falls in some "uncanny valley" of design, being neither
stylized/abstract/low-poly-ish enough, nor realistic enough, nor fully-
pixelated/blocky/minecrafty, but just in-between.

In general I like styles that either:

\- just go all the way in the stylized direction, like Bad North [1], The
Witness [2] or even Clash of Clans [3] (to be honest I also dislike CoC-style
popular with mobile games nowadays, but at least it's consistent/harmonious in
its candy-plasticky look)

\- OR they actually try to do the realistic-style part, like the classic Age
of Empires, or toony-ish-ralisticky like more modern Northgard [4]

\- OR they fully embrace the blocky style like Minecraft, or the
8-bit/pixelated style of clearly retro-style games

"In between" styles just look... _annoying_ , giving a "sand in your eye"
mental sensation of the early 90s games that were too shallow and childish. It
lacks some "higher harmony" thing that I can't describe any better. I get this
"allergic" reaction also when I see this style in clothing or architecture or
whatever.

Anyway, keep up the work if you and others enjoy it, don't be discouraged by
people that just prefer smth else!

I'm just a bit sad bc I probably would've liked the game mechanics, but the
style totally turns me off.

[1]
[https://store.steampowered.com/app/688420/Bad_North_Jotunn_E...](https://store.steampowered.com/app/688420/Bad_North_Jotunn_Edition/)

[2]
[https://store.steampowered.com/app/210970/The_Witness/](https://store.steampowered.com/app/210970/The_Witness/)

[3]
[https://play.google.com/store/apps/details?id=com.supercell....](https://play.google.com/store/apps/details?id=com.supercell.clashofclans&hl=en_GB)

[4]
[https://store.steampowered.com/app/466560/Northgard/](https://store.steampowered.com/app/466560/Northgard/)

~~~
ItsFirefly
Thanks for the elaboration, I get that the design just doesn't do it for you
personally. Did you already see that the game's also available in a highly
abstract "Cartoon" visual style featuring hand-drawn, 2D animated sprites à la
Paper Mario 64? Here's the trailer in the "Cartoon" visual style:

[https://www.youtube.com/watch?v=J7LK0s8LgmQ](https://www.youtube.com/watch?v=J7LK0s8LgmQ)

Maybe this style appeals more to you?

------
johnnylambada
Uninstalled. Looks like fun but I let Google choose a hard password and
there's no way to paste it into the Android app. I tried typing it but had to
swap back and forth between apps to get all the pieces of the password. The
game clears the password when I got back. Last chance change password but I
don't see how.

~~~
geddy
Totally valid criticism but kind of dickish delivery. The guy built a game,
for free, I think it's worth more than an "Uninstalled."!

~~~
johnnylambada
Totally justified remark. I was frustrated after trying it. I'll reinstall
after the password fix. Thanks for keeping me honest :)

------
edoo
Culturally speaking getting kids into a game called "Angel Dust" which is
street slang for PCP is not going to do society any favors.

~~~
bananamerica
It also won’t harm society at all. It might harm the game, but I doubt it.

~~~
StavrosK
Tell that to the slightly hard-of-hearing bookstore employee who, when I asked
for Minecraft, gave me a copy of Mein Kampf.

------
lostgame
You seriously may want to reconsider the name. ‘Angel Dust’ is a slang for the
narcotic PCP - I immediately was confused and only clicked so I could tell
what it actually was.

Not sure how this didn’t come up before? At any point in development? O.o

Edit: whoa, downvotes, really? Care to say why? This is a legitimate concern?

~~~
oops
Minor nit: PCP is a dissociative hallucinogen, not a narcotic.

~~~
LeftHandPath
"Narcotic" has shifted, at least in American vernacular, from meaning drugs
that induce sleep to meaning any illegal or Schedule-I drug.

Merriam-Webster: [https://www.merriam-
webster.com/dictionary/narcotic](https://www.merriam-
webster.com/dictionary/narcotic)

Collin's Dictionary:
[https://www.collinsdictionary.com/dictionary/english/narcoti...](https://www.collinsdictionary.com/dictionary/english/narcotic)

Edit, regarding "no one calls marijuana a narcotic":

Not sure why I was downvoted, considering that we are discussing angel dust
rather than marijuana.

The United States Government calls marijuana a narcotic:

[1]:
[https://www.federalregister.gov/documents/2019/08/29/2019-18...](https://www.federalregister.gov/documents/2019/08/29/2019-18714/international-
drug-scheduling-convention-on-psychotropic-substances-single-convention-on-
narcotic)

[2]: [https://www.incb.org/incb/en/narcotic-
drugs/index.html](https://www.incb.org/incb/en/narcotic-drugs/index.html)

As do The UN and the World Health Organization (in process of amendment):

[1]: [https://www.healthpolicy-watch.org/who-recommends-
cannabis-s...](https://www.healthpolicy-watch.org/who-recommends-cannabis-
should-be-reclassified-in-un-convention-on-narcotic-drugs/)

[2]: [https://www.who.int/medicines/access/controlled-
substances/U...](https://www.who.int/medicines/access/controlled-
substances/UNSG_letter_ECDD41_recommendations_cannabis_24Jan19.pdf?ua=1)

And the Australian Government:
[https://www.legislation.gov.au/Details/F2018L00106](https://www.legislation.gov.au/Details/F2018L00106)

As well as the Swiss Government:
[https://www.ch.ch/en/cannabis/](https://www.ch.ch/en/cannabis/)

And the Government of Singapore:
[https://www.cnb.gov.sg/](https://www.cnb.gov.sg/)

And the European Union: [http://www.emcdda.europa.eu/publications/topic-
overviews/cla...](http://www.emcdda.europa.eu/publications/topic-
overviews/classification-of-controlled-drugs/html_en)

It's important to note the apparent legal definition of "narcotic" when
discussing drugs, as it drastically differs from the traditional use, and
includes a much longer list of substances.

~~~
tibbon
No one calls weed a narcotic.

~~~
heavyset_go
Cops sure do.

