swarm-game / swarm

Resource gathering + programming game
Other
833 stars 52 forks source link

I/O console or canvas entity #683

Open byorgey opened 1 year ago

byorgey commented 1 year ago

My original motivation was contemplating the idea of sending robots into places you can't see (off the screen, into structures #112 or sub-worlds #144 ...) and programming them to wander around, build a map of the area (probably using some kind of mutable array #98 ), then come back and give you the map. How would you actually view the resulting map?

I propose having a "virtual I/O console" (perhaps in a different "tab" in the same window as the world view, so you can switch back and forth between them, or perhaps in the same window as the REPL) and adding some commands to output to the console. One might think of adding built-in commands like putStr, but actually, since I'd like to keep the number of new primitives to a minimum, and because I want to be able to do cool things like draw color maps, we might contemplate going even lower-level like a command to set the color and a command to put a character at a specific (row,column) position. Then you could build your own functions like putStr on top of that.

I am not sure how reading keyboard input would work, or whether we should, but just doing output to the virtual console seems like a good place to start.

Edit: a simpler, useful thing to start could be just a simple command like print : text -> cmd unit (and perhaps an input : cmd text to go with it) which outputs (respectively, reads) a string from the REPL console. This wouldn't be as useful for printing maps etc. but it would be useful for displaying information, debugging, etc. Edit 2: not sure how useful print/input would be on their own anymore, since we have log for outputting information and key input handlers for (a limited form of) input.

xsebek commented 1 year ago

To tie it back to the map idea, maybe you could "place entities" on some (finite) canvas?

You would not actually put the entity there, just print the entity character with its attributes.

So the resulting command could be print :: entity -> (int*int) -> entity -> cmd () where the entity type is from #455 and the third argument would be the particular "map canvas" in inventory.

byorgey commented 1 year ago

The "canvas" idea is cool, but it seems like that would require doing #455 first; at the current rate I don't know how soon that will actually happen. For now it seems like it could be a relatively straightforward, "low hanging fruit"-type task to add a couple commands to print to the virtual console and then make a way to visualize it in the UI.