
Show HN: RESTful Doom – HTTP+JSON API inside Doom - jeff_harris
http://1amstudios.com/2017/08/01/restful-doom/
======
pjc50
I'm reminded of "psdoom", a version of doom that let you kill processes with
the shotgun: [http://psdoom.sourceforge.net/](http://psdoom.sourceforge.net/)

~~~
jeff_harris
Yes, I think subconsciously I was also. I remember being amazed by that back
in the day also!

------
juststeve
So nerdy but so awesome - my jaw dropped when i watched the video :)

i think this could open up possibilities with live stats if each player runs
their own server and the results are combined on into a seperate website?
otherwise it could be used to create new game modes or a scoring system?

------
coroxout
That's pretty cool! Well done.

Now I'm wondering whether the game clock could be suspended unless ticks were
sent via API, to turn it into a turn-based game to be played only via API
calls...

~~~
JazzXP
Sounds like an API version of Superhot.

~~~
jeff_harris
wow I hadn't seen that game, the trailer looks amazing!

------
rpazyaquian
Now to add Twitch integration.

~~~
jeff_harris
Haha yes... although I would be _slightly_ nervous to expose my janky C code
to the internet. Where I'm confident it would crash and burn in a very short
amount of time :)

~~~
Xeoncross
Use a proxy. Openresty (nginx+lua) or a Go app would do. Only allow
whitelisted commands through like the basic control commands and then pass it
on to your C code.

~~~
jeff_harris
yep, that would definitely be a good idea!

------
cdevs
Well now I'm screwed at work tomorrow, I want to tie in so much of our logging
into this some how like psdoom. Q: Are the files done processing ? Me: I don't
know check if the door is open in doom.

~~~
jeff_harris
haha yes!

------
netvarun
Since this has 'native' integration it could be a great testbed for
learning/applying reinforcement learning algorithms in a fun setting without
having to deal with the 'heavier' (but more comprehensive) vnc based tooklits
such as openai universe.

Awesome work, btw!

------
qualitytime
Great work and fantastic project idea and method of execution.

~~~
jeff_harris
thanks! It was a lot of fun. Big thanks to chocolate-doom project also which I
built on top of :)

------
bmn__
This isn't REST, there are no hyperlinks and no hypermedia controls. It is
designed pretty wrong. Just look at this brittle coupling!

    
    
        POST /api/player/actions
        Content-Type: application/json
    
        { "type": "shoot" }
    

How do I know what "type" of action is available to me? It isn't documented.
Why should I need to know or try to look it up in the documentation in the
first place, anyway? The server should just tell me what I can do, and then I
act on it! Why should I need to know all these special URLs, except a single
central entry point (a.k.a. bookmark)? The server should just tell me from
each resource where I can go to! A more useful attempt:

    
    
        GET /
        Content-Type: text/html
    
        <p>The <a href="equipment#shotty">shotgun</a> is equipped.
        There is a <a href="items/157">green armor</a> ahead.</p>
    
        <p>You see a <a href="monsters/2018">baron of hell</a> attacking
        an <a href="monsters/1170">imp</a>.</p>
    
        <p>There is a <a href="doors/104">yellow-framed door</a>,
        attempt to <form action="doors/104" method="post">
        <input type="submit" value="open" /></form> it.</p>
    
        <form action="position" method="post">
            <input type="hidden" name="x" value="-225" />
            <input type="submit" value="move forward" /></form>,
        <form action="orientation" method="post">
            <input type="hidden" name="angle" value="90" />
            <input type="submit" value="turn left" /></form>
        …
    

(HTML used for ease of illustration on HN, alas JSON proper - being a dumb
serialisation format - it deficient of hyperlinks or hypermedia controls, but
there are extensions for it. This audience is less likely to be familiar with
them.)

It really bothers me that programmers call things REST, and when you look at
it it isn't REST at all because they don't know the first thing about it.

~~~
MuffinFlavored
In a traditional REST API, where do non-RESTful things (like other API calls,
or "business logic") tend to go?

Is there /db/restEndpoints and /rpc/nonRESTfulEndpoints?

~~~
Dashron
Business logic should be hidden behind the API and the representation. Just
like a website, actions are presented when the business logic allows it.

Other API calls depend on the purpose. If its part of the business logic, it's
probably back end and hidden as described above.

If the other API call simply powers the UI, you might keep it in the client.
One example is autocomple for facebook friends. The client can call facebook
for a list, let the user select their friend, and then send that friends info
to your API.

With that said, I'm not sure how either of those are "non-RESTful" so maybe I
missed the point of the question?

------
OutsmartDan
Amazing work!

------
cschep
this is SO cool, thank you!

------
Impossible
This is a fun little project. I'm anxiously awaiting obligatory HN comments
about how C is unsafe, you should never write a web application that uses
strcmp, and maybe this would be ok if he rewrote Doom in Rust first :).

~~~
dang
Please don't post like this. Analogously to how antivirus and virus software
are kind of the same thing, it perpetuates what you're complaining about.

------
fedebongio
I saw this presentation twice, and everytime is better. I love it.

