diff --git a/404.html b/404.html
new file mode 100644
index 0000000..f8414f0
--- /dev/null
+++ b/404.html
@@ -0,0 +1,3 @@
+
+
404 Not Found
+
404 Not Found
diff --git a/CNAME b/CNAME
new file mode 100644
index 0000000..8694d4d
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+soulware.us
\ No newline at end of file
diff --git a/about/index.html b/about/index.html
new file mode 100644
index 0000000..859c5b1
--- /dev/null
+++ b/about/index.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+ soulware.us
+
+
+
+
+
+
+
+
+
+
+ about me
+
+
+
hey! i'm sam, i go by "soulware" in most corners of the web (that i can get the username), and "qsa" in still other parts. here are some things about me
+
i love computer science. it's really fun to solve problems and understand the tech we use daily inside and out. i've been especially interested in compilers and type theory lately. i'm also a big fan of reverse engineering and decompilation projects
+
i really like playing, analyzing, and making games. some of them are on itch.io and github. i also love speedrunning but so far i've been more of a spectator. i have one submitted run on speedrun.com and have completed the game DUET as fast as possible on iOS. i've also dabbled in speedrunning both "Seedling" and "The End is Nigh".
+
i also like listening to music a lot. my last.fm is here. at the moment i'm enjoying digital hardcore, breakcore, general dnb stuff, "ethereal" music, and various rap genres. some of my favorite artists right now are Machine Girl, miya lowe/evaboy, Sudan Archives, pink siifu, Grouper, Death Grips, Bladee (generally drain gang), Lauren Bousfield, and The Garden.
+
wow! here's an image of albums made in the 2020s that i really like:
+
+
+
here's some websites where i consume media! i use backloggd to journal games i play. that site is mainly ripped from letterboxd which is what i use to track movies and (some) tv shows.
along with this post comes a general overhaul of the site's content as i move it towards something i appreciate on a personal level. after looking at a lot of really cool personal sites i decided it would be no fun if my own website was just a bland reflection of who i am.
+
i'm still trying to figure out how to fracture myself across this wonderful internet. at the moment i'm planning to use this as a kind of "devlog", both as motivation for myself to complete things (by documenting what i do) and to share information with the rest of the world. i might at some point soon add a tagging system. my plan is to post media analysis stuff to a tumblr which i am also setting up but i might as well just post it here too, if i can...
+
will also be documenting my projects here soon, in their very own little tab on the side. need to get a handle on which ones are good enough, as well as start and finish a few, since they are quite scattered at the moment.
+
i also have some WIP blogposts. i'll probably be putting up my minecraft server setup guide. there's plenty of information on this i'm sure, but it really should be easy to get something up running and sustainable, and you can do it all from the CLI! this guide is as much for myself as for anyone else, but after trying to follow it i've noticed it's a bit lacking..
+
planning to have some other cool stuff to show off or talk about by the end of this year so stay tuned. :-)
+
+
+
+
diff --git a/color/dark.css b/color/dark.css
new file mode 100644
index 0000000..575a485
--- /dev/null
+++ b/color/dark.css
@@ -0,0 +1 @@
+:root{--background: #282c34;--foreground: #bbc2cf;--border-color: rgba(255, 255, 255, 0.3);--link-color: rgb(81, 175, 239);--link-visited: rgb(105, 158, 160);--link-hover: rgb(211, 134, 155);--link-active: rgb(177, 98, 134);--accent: rgb(142, 192, 124);--accent-visited: #7e9872}
\ No newline at end of file
diff --git a/color/light.css b/color/light.css
new file mode 100644
index 0000000..da1e30c
--- /dev/null
+++ b/color/light.css
@@ -0,0 +1 @@
+:root{--background: #282828;--foreground: #ebdbb2;--border-color: rgba(255, 255, 255, .1);--link-color: rgb(129, 162, 190);--link-visited: rgb(84, 150, 153)}
\ No newline at end of file
diff --git a/fonts/FiraCode-Bold.woff b/fonts/FiraCode-Bold.woff
new file mode 100644
index 0000000..dd7abb6
Binary files /dev/null and b/fonts/FiraCode-Bold.woff differ
diff --git a/fonts/FiraCode-Regular.woff b/fonts/FiraCode-Regular.woff
new file mode 100644
index 0000000..5e4106f
Binary files /dev/null and b/fonts/FiraCode-Regular.woff differ
diff --git a/images/souleng.png b/images/souleng.png
new file mode 100644
index 0000000..0fb21c7
Binary files /dev/null and b/images/souleng.png differ
diff --git a/images/ss1.png b/images/ss1.png
new file mode 100644
index 0000000..d17f7b1
Binary files /dev/null and b/images/ss1.png differ
diff --git a/images/ss2.png b/images/ss2.png
new file mode 100644
index 0000000..1b26baa
Binary files /dev/null and b/images/ss2.png differ
diff --git a/images/ss3.png b/images/ss3.png
new file mode 100644
index 0000000..6cc3d55
Binary files /dev/null and b/images/ss3.png differ
diff --git a/images/topsters2020-2022.png b/images/topsters2020-2022.png
new file mode 100644
index 0000000..b006947
Binary files /dev/null and b/images/topsters2020-2022.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..ab8df75
--- /dev/null
+++ b/index.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+ soulware.us
+
+
+
+
+
+
+
+
+
+
+ sam (soulware)
+
+
+ studying computer science and mathematics at Northeastern University
+
+ Souleng is a component-based game engine which allows for the creation of games
+ entirely in Python, utilizing the modern pybind11 fork
+ pybind11k
+ to allow users to derive their own custom Components in Python and effortlessly interface with
+ the C++ side of things.
+
+
+
+
+
+
+
+
+
+
+
Running the engine
+
+
+ You can build the engine on Linux with build.sh, provided in the
+ engine directory.
+
+
+ You can run the engine with run.sh, which will automatically set the
+ LD_LIBRARY_PATH to be the lib/ directory. You can also set this
+ variable yourself and run the binary directly. The expected format is
+
+
+
+ $ ./run.sh <scene>
+
+
+ where the scene is either
+
+
+ a path to a Python file without the .py extension, ie. running
+ $ ./run.sh games/mario would load and run the scene in the file
+ games/mario.py
+
+
+ a path to a file with the .scenes extension. This file should contain the
+ relative path from itself to any number of Python files, specified as in the above bullet
+ points. For example, the file mario.scenes with content
+
+
+ ui/mario_menu
+ mario
+ ui/game_over
+
+
+ would load the scenes in ui/mario_menu.py, mario, and
+ ui/game_over, and would start running the scene in ui/mario_menu.py
+
+
+
+
Python scripting
+
+
+ To create a scene in Python, at minimum the following functions must be present in the script:
+
+ Custom functions can be written as well, but these functions must be overridden for the
+ component to run code every frame, as the C++ engine will only call these functions.
+
+
+
+ Three additional submodules exist, to allow the user to interface with different systems in the
+ game engine:
+
+
+
+
+ input - allows the user to query the input manager for keys pressed and mouse
+ clicks
+
+
+ get_key(key: str) - returns an object for the key showing if
+ it's been pressed, held, or released this frame
+
+
+ get_mouse_click() - returns an object with mouse click data from the current
+ frame
+
+
+ pressed - True if the mouse button was
+ first pressed this frame
+
+
+ held - True if the mouse button was held
+ down this frame
+
+
+ released - True if the mouse button was
+ released this frame
+
+
+ clicks - number of times the mouse was clicked this
+ frame
+
+
+ pos - vector with x and y for the current mouse position
+
+
+ button - the mouse button pressed this frame
+
+
+
+
+ get_mouse_motion() - returns an object with mouse motion data from the
+ current frame
+
+
+ motion - vector with x and y for the amount the mouse
+ moved in each direction since the last time it was polled
+
+
+ pos - vector with x and y for the current mouse position
+
+
+
+
+
+
+ render - allows the user to call rendering methods necessary to run a scene,
+ interfacing with SDL
+
+
+ set_render_draw_color(r: int, g: int, b: int, a: int) - sets the background
+ color. equivalent to SDL_SetRenderDrawColor
+
+
+ render_clear() - clears the rendering target. equivalent to
+ SDL_RenderClear
+
+
+ render_present() - presents rendered data to the screen. equivalent to
+ SDL_RenderPresent
+
+
+
+
+ director - allows the user to change scenes
+
+
+ change_scene(name: str) - changes the current scene to the one specified by
+ name
+
+
+
+
+
+
+ The full list of available Python methods can be found in engine/src/bindings.cpp.
+
+
+
Process and Postmortem
+
+
+ My main inspiration for making Souleng was the video for the Eternal engine, linked as a good
+ sample game engine in the final project repository. In their video demonstration, they showed
+ games using Python components such that most of the game could just be scripted in Python.
+ However, these components were a bit ad-hoc: they required the module and class name of the
+ Python module to link properly. I wanted to improve on this idea, to create a seamless
+ integration between the scripting side of the game engine and the actual components.
+
+
+
+ In order to do this, I looked more closely at how Pybind worked, and tried to understand exactly
+ why it was not possible to inherit from components in Python, and then use them in C++. I ran
+ into the issue of this not being possible when adapting Space Invaders for this new engine, but
+ researching it shows that this would only happen if Python no longer held any references to the
+ object being passed to C++. It would "slice" components, so that any Python specific logic was
+ lost. A more modern fork of pybind11 addressed this issue, so I opted to use that
+ library and included it in my game engine.
+
+
+
+ Ultimately, my game engine accomplished what it set out to do, and I'm happy with that component
+ of it. The game development process in Python has as much power as it did in C++, but all of the
+ parts of the engine which require high performance can still run in C++, including the game loop
+ itself. This engine also adds some smaller features onto the previous iteration, including
+ support for spritesheets (swapping textures), loading multiple scenes, and much more
+ comprehensive input handling (handling all keys, and mouse clicks/motion).
+
+
+
+ There was still a lot I wish I could've accomplished for this project, as much of it was spent
+ understanding the internals of pybind rather than focusing on more user-friendly features.
+ Scenes in the game engine can be layed out in scene_startup in Python, but there is
+ no GUI editor to accomplish this. Additionally, I would've liked to had this GUI editor parse
+ the AST for any Python scenes, to detect any custom components and allow users to add them
+ through the editor, as with a game engine like Unity. I would also add some more builtin
+ components, for things like sound and animation- sound would be something that C++ is needed
+ for, but even something like animation could be implemented from Python, which would be a good
+ showcase of the potential of this scripting feature. I would give more thought to the memory
+ model used for the game engine, possibly using a memory arena to manage lifetimes rather than
+ shared pointers, to allow for more granular control over the lifetimes of game objects. Finally,
+ I would like to evaluate the way I was using singleton data structures- they felt necessary at
+ times, but there might've been room for some other construct (maybe even just static classes,
+ since they need to live for the lifetime of the program).
+
+
+
+
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..b6fdc5c
--- /dev/null
+++ b/style.css
@@ -0,0 +1 @@
+#navbar{position:fixed;display:flex;top:0;bottom:0;left:0;width:10rem;color:#fbf1c7}nav li{list-style:none;line-height:2em}nav a{text-decoration:none;color:var(--foreground)}nav a:hover,nav a:visited:hover{color:var(--link-hover);text-decoration:underline}nav a:visited{color:var(--link-visited)}nav a:active{color:var(--link-active)}@font-face{font-display:swap;font-family:"Fira Code";font-style:normal;font-weight:400;src:url("fonts/FiraCode-Regular.woff") format("woff")}@font-face{font-display:swap;font-family:"Fira Code";font-style:normal;font-weight:800;src:url("fonts/FiraCode-Bold.woff") format("woff")}body{font-family:verdana,sans-serif;font-size:1rem;line-height:1.4;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiasing;background:var(--background);color:var(--foreground)}main{max-width:45rem;padding:2rem;margin:auto}main p{padding-bottom:1rem}main a{color:var(--link-color)}main a:visited{color:var(--link-visited)}main li{margin:0 0 10px 0}main article:not(:last-of-type){border-bottom:1px solid var(--border-color)}@media only screen and (max-device-width: 736px){main{padding:0rem}}.container{display:flex;justify-content:space-between}.post-preview{display:flex;flex-direction:column}.post-preview p{margin-top:.5rem}.post-title{color:var(--accent);position:relative;font-size:1.5rem;margin-bottom:.25rem}.post-title a{color:inherit;text-underline-position:under}.post-title a:visited{color:var(--accent-visited)}.post-excerpt{margin-top:0rem}
\ No newline at end of file
diff --git a/videos/finalvid.mp4 b/videos/finalvid.mp4
new file mode 100644
index 0000000..31e66df
Binary files /dev/null and b/videos/finalvid.mp4 differ