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..f69d25e --- /dev/null +++ b/about/index.html @@ -0,0 +1,65 @@ + + + + + + + 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.

+

last updated 9 Dec 2022

+ +
+ + diff --git a/blog/first/index.html b/blog/first/index.html new file mode 100644 index 0000000..831ca44 --- /dev/null +++ b/blog/first/index.html @@ -0,0 +1,59 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ hello world! +

+

2021-04-01

+

first blog post to get this site started.

+ +

I set this site up with zola, which is a pretty nice static site generator.

+ +
+ + diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..2209df9 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,77 @@ + + + + + + + soulware.us + + + + + + + + +
+
+

+ blog posts +

+
+
+ +
+
+ + diff --git a/blog/test/index.html b/blog/test/index.html new file mode 100644 index 0000000..a092d75 --- /dev/null +++ b/blog/test/index.html @@ -0,0 +1,63 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ hello new world +

+

2022-12-09

+

another blog post! finally.

+ +

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..a6853ba --- /dev/null +++ b/index.html @@ -0,0 +1,81 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ sam (soulware) +

+

+ studying computer science and mathematics at Northeastern University +

+ + + +
+
+

+ hello new world +

+
+

another blog post! finally.

+ +
+ +
+
+

+ hello world! +

+
+

first blog post to get this site started.

+ +
+ + +
+ + diff --git a/math/index.html b/math/index.html new file mode 100644 index 0000000..4537d58 --- /dev/null +++ b/math/index.html @@ -0,0 +1,272 @@ + + + + + + + + +

Super Magic Box

+

+ Put in a value for D to compute its Super Magic Box: + +

+ + + + + + + + + + + + + + + + + + + + + + +
+ + n + +
+ + + + A + n + + = + + a + + n + + 1 + + + + C + + n + + 1 + + + + + A + + n + + 1 + + + + +
+ + + + C + n + + = + ( + D + + + A + n + 2 + + ) + / + + C + + n + + 1 + + + + +
+ + + + a + n + + = + + + ( + + A + n + + + + + a + 0 + + ) + / + + C + n + + + + + +
+ + + + p + n + + = + + a + n + + + p + + n + + 1 + + + + + + p + + n + + 2 + + + + +
+ + + + q + n + + = + + a + n + + + q + + n + + 1 + + + + + + q + + n + + 2 + + + + +
+ + + + p + n + 2 + + + D + + q + n + 2 + + + +
+

+ The fundamental unit in + + + + [ + + D + + ] + + + is + + + a + + + b + + D + + , with norm N +

+

+ A factorization of D is given + by + + + g + c + d + ( + p + + + C + , + D + ) + = + d + + D + = + d + * + + ( + p + + + C + ) + + + +

+ + diff --git a/processed_images/ss1.6293e3bf5ed1ed6b.png b/processed_images/ss1.6293e3bf5ed1ed6b.png new file mode 100644 index 0000000..4d1b707 Binary files /dev/null and b/processed_images/ss1.6293e3bf5ed1ed6b.png differ diff --git a/processed_images/ss2.e15c7e64d75dfe0f.png b/processed_images/ss2.e15c7e64d75dfe0f.png new file mode 100644 index 0000000..cecf36a Binary files /dev/null and b/processed_images/ss2.e15c7e64d75dfe0f.png differ diff --git a/processed_images/ss3.363f9777023a044f.png b/processed_images/ss3.363f9777023a044f.png new file mode 100644 index 0000000..53772dc Binary files /dev/null and b/processed_images/ss3.363f9777023a044f.png differ diff --git a/processed_images/topsters2020-2022.c512c423d7967f87.png b/processed_images/topsters2020-2022.c512c423d7967f87.png new file mode 100644 index 0000000..48863f8 Binary files /dev/null and b/processed_images/topsters2020-2022.c512c423d7967f87.png differ diff --git a/resume/index.html b/resume/index.html new file mode 100644 index 0000000..5759ea3 --- /dev/null +++ b/resume/index.html @@ -0,0 +1,57 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ resume +

+

+

currently working on this. if you need my resume feel free to contact me.

+ +
+ + diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..24c0d9b --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://soulware.us/sitemap.xml diff --git a/scripts/smb.js b/scripts/smb.js new file mode 100644 index 0000000..b104cf3 --- /dev/null +++ b/scripts/smb.js @@ -0,0 +1,184 @@ +// algorithm for smb: +// n = -2 (so, 0 index for array of pn, qn) +// p = 0, q = 1 +// n = -1 (so, 1 index for array of pn, qn) +// p = 1, 1 = 0 +// n = 0 (so, 0 index for An and Cn) -> A = 0, C = 1 +// then, algorithm on loop: +// a[n] = Math.floor((A[n] + a0) / C[n]) +// p[n + 2] = a[n] (term just computed) * p[n + 1] + p[n] +// q[n + 2] = a[n] (term just computed) * q[n + 1] + q[n] +// A[n + 1] = a[n] * C[n] - A[n] +// C[n + 1] = (D - A[n]^2) / C[n] + +let smbTable = { + table: document.getElementById("smb"), + n: document.getElementById("smb-n"), + A: document.getElementById("smb-An"), + C: document.getElementById("smb-Cn"), + a: document.getElementById("smb-an"), + p: document.getElementById("smb-pn"), + q: document.getElementById("smb-qn"), + pell: document.getElementById("smb-pell"), +}; + +let fundDvalues = document.getElementsByClassName("smb-fund-D-value"); +let fundAvalue = document.getElementById("smb-fund-a-value"); +let fundBvalue = document.getElementById("smb-fund-b-value"); +let fundNormValue = document.getElementById("smb-fund-norm-value"); + +let factpValue = document.getElementById("smb-fact-p-value"); +let factCValue = document.getElementById("smb-fact-C-value"); +let factdvalues = document.getElementsByClassName("smb-fact-d-value"); +let factOtherValue = document.getElementById("smb-fact-other-value"); + +let gcd = function (x, y) { + let a = Math.max(x, y); + let b = Math.min(x, y); + while (b != 0) { + let temp = a; + a = b; + b = temp % b; + } + return a; +}; + +let smb = function (D, maxIteration = 1000) { + let p = [0, 1]; + let q = [1, 0]; + let A = [0]; + let C = [1]; + let a = [Math.floor(Math.sqrt(D))]; + let pell = []; + + let n = 0; + let found = false; + while (!found) { + p[n + 2] = a[n] * p[n + 1] + p[n]; + q[n + 2] = a[n] * q[n + 1] + q[n]; + pell[n] = p[n + 2] * p[n + 2] - D * q[n + 2] * q[n + 2]; + A[n + 1] = a[n] * C[n] - A[n]; + C[n + 1] = (D - A[n + 1] * A[n + 1]) / C[n]; + a[n + 1] = Math.floor((A[n + 1] + a[0]) / C[n + 1]); + found = n > 0 && C[n] === 1; + n++; + if (n > maxIteration) { + break; + } + console.log(C[n]); + } + + // finish off the row that we ended on + if (found) { + p[n + 2] = a[n] * p[n + 1] + p[n]; + q[n + 2] = a[n] * q[n + 1] + q[n]; + pell[n] = p[n + 2] * p[n + 2] - D * q[n + 2] * q[n + 2]; + } + + return { + n: n, + p: p, + q: q, + A: A, + C: C, + a: a, + pell: pell, + }; +}; + +let clearTable = function () { + let rows = smbTable.table.rows; + for (let i = 0; i < rows.length; i++) { + let cellCount = rows[i].cells.length; + for (let j = 1; j < cellCount; j++) { + rows[i].deleteCell(1); + } + } +}; + +let populate = function (D) { + // clear all rows except for the first, which describe the equation + clearTable(); + if (D === " " || Math.sqrt(D) % 1 === 0 || D <= 0) { + console.log("D must be a positive, squarefree integer."); + return; + } + + let superMagicBox = smb(D); + + for (let n = -2; n < 0; n++) { + let nCol = smbTable.n.insertCell(); + nCol.innerHTML = n; + let ACol = smbTable.A.insertCell(); + ACol.innerHTML = ""; + let CCol = smbTable.C.insertCell(); + CCol.innerHTML = ""; + let aCol = smbTable.a.insertCell(); + aCol.innerHTML = ""; + let pCol = smbTable.p.insertCell(); + pCol.innerHTML = superMagicBox.p[n + 2]; + let qCol = smbTable.q.insertCell(); + qCol.innerHTML = superMagicBox.q[n + 2]; + let pellCol = smbTable.pell.insertCell(); + pellCol.innerHTML = ""; + } + + // then we can just insert everything based on a proper index + for (let n = 0; n < superMagicBox.n; n++) { + let nCol = smbTable.n.insertCell(); + nCol.innerHTML = n; + let ACol = smbTable.A.insertCell(); + ACol.innerHTML = superMagicBox.A[n]; + let CCol = smbTable.C.insertCell(); + CCol.innerHTML = superMagicBox.C[n]; + let aCol = smbTable.a.insertCell(); + aCol.innerHTML = superMagicBox.a[n]; + let pCol = smbTable.p.insertCell(); + pCol.innerHTML = superMagicBox.p[n + 2]; + let qCol = smbTable.q.insertCell(); + qCol.innerHTML = superMagicBox.q[n + 2]; + let pellCol = smbTable.pell.insertCell(); + pellCol.innerHTML = superMagicBox.pell[n]; + } + + // List what the fundamental value is. + for (let i = 0; i < fundDvalues.length; i++) { + fundDvalues[i].innerHTML = D; + } + let a = superMagicBox.p[superMagicBox.n]; + let b = superMagicBox.q[superMagicBox.n]; + fundAvalue.innerHTML = superMagicBox.p[superMagicBox.n]; + fundBvalue.innerHTML = superMagicBox.q[superMagicBox.n]; + fundNormValue.innerHTML = a * a - D * b * b; + + let factorizationFound = false; + for (let n = 1; n < superMagicBox.C.length; n++) { + let candidate = superMagicBox.C[n]; + if ( + Math.sqrt(candidate) % 1 === 0 && + (n - 1) % 2 === 1 && + !factorizationFound + ) { + factorizationFound = true; + let p = superMagicBox.p[n + 1]; + let candidateRoot = Math.sqrt(candidate); + let d = gcd(p + candidateRoot, D); + let otherFactor = D / d; + factpValue.innerHTML = p; + factCValue.innerHTML = candidateRoot; + for (let i = 0; i < factdvalues.length; i++) { + factdvalues[i].innerHTML = d; + } + factOtherValue.innerHTML = "" + otherFactor + ""; + break; + } + } + // TODO: maybe do somthing here if we don't find a factor. not sure if necessary +}; + +let dForm = document.getElementById("input-D"); +if (window.addEventListener) { + dForm.addEventListener("keyup", () => populate(dForm.value), false); +} else if (window.attachEvent) { + dForm.attachEvent("onkeyup", () => populate(dForm.value)); +} diff --git a/scripts/souleng.js b/scripts/souleng.js new file mode 100644 index 0000000..e69de29 diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..50641b5 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,50 @@ + + + + https://soulware.us/ + + + https://soulware.us/about/ + + + https://soulware.us/blog/ + + + https://soulware.us/blog/first/ + 2021-04-01 + + + https://soulware.us/blog/test/ + 2022-12-09 + + + https://soulware.us/math/ + + + https://soulware.us/resume/ + + + https://soulware.us/souleng/ + + + https://soulware.us/writing/ + + + https://soulware.us/writing/REPLACE/ + + + https://soulware.us/writing/apartment/ + + + https://soulware.us/writing/cyber-heaven9/ + + + https://soulware.us/writing/exegenamine/ + + + https://soulware.us/writing/salvation/ + + + https://soulware.us/writing/skeleton/ + + diff --git a/smb.css b/smb.css new file mode 100644 index 0000000..42da45e --- /dev/null +++ b/smb.css @@ -0,0 +1 @@ +input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}table{border-collapse:collapse;border:2px solid #000;letter-spacing:1px}td{border:1px solid #000;padding:4px 8px;justify-content:center}table td:first-child{position:sticky;left:0;background:#fff;z-index:1} \ No newline at end of file diff --git a/souleng.css b/souleng.css new file mode 100644 index 0000000..e69de29 diff --git a/souleng/index.html b/souleng/index.html new file mode 100644 index 0000000..1dd9252 --- /dev/null +++ b/souleng/index.html @@ -0,0 +1,256 @@ + + + + + + + + +

Souleng

+ +
+
+ +

+ 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 + + +

Python scripting

+ +

+ To create a scene in Python, at minimum the following functions must be present in the script: +

+ + +

Custom components can be created as follows:

+ +

+    import souleng as sw
+    class Foo(sw.ScriptComponent):
+      def __init__():
+        super().__init__()
+        ...
+
+      def input():
+        ... # handle input here
+
+      def update(dt: float):
+        ...
+
+      def render():
+        ...
+  
+ +

+ 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: +

+ + + +

+ 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 diff --git a/writing/REPLACE/index.html b/writing/REPLACE/index.html new file mode 100644 index 0000000..fcaae8d --- /dev/null +++ b/writing/REPLACE/index.html @@ -0,0 +1,56 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ IV. REPLACE +

+

+ +
+ + diff --git a/writing/apartment/index.html b/writing/apartment/index.html new file mode 100644 index 0000000..09700c7 --- /dev/null +++ b/writing/apartment/index.html @@ -0,0 +1,66 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ I. Apartment +

+

+

2027-07-25

+

there's something wrong with you. it's built into your skeleton, you suspect. you drink and look at yourself in the mirror on a tuesday night. just the same as your parents

+

you leave the bathroom and find the hallway as dark as you left it, but less populated. everybody's left, the chatter has ceased. it's not like you were a part of it anyways. your apartment is often lively, and at one point the cast of familiar faces provided a relief from the ins and outs of your life. but slowly it just became part of the latter and the only real escape was getting to be alone.

+

you search around the apartment for a hand to hold. maybe your girlfriend is still here, and you can take salvation there. you heard her laugh while your eyes glared scarlet into themselves, but she did say she had to go home. it's not unusual for her to make a sudden exit, and you know she doesn't like it when you get like this, all drunk, all messy. She has strict principles, that's what you like about her, and also what you hate about her, that she gets so easily frustrated. You sometimes wish that you had a different relationship, like the ones of your friends, who seem to drink and do drugs together with an elegance and an underlying care that doesn't need to be surfaced as often as she does so. But you also consider that maybe all of those relationships have guidelines and troubles too, and you've just not seen them aired out in public. Maybe everyone really does have problems with each other

+

Your friend roxie is asleep on the couch. she was watching an anime. this will do, you guess. you stumble into the kitchen first, taking the Brita filter out of the fridge. the crust on it stares back at you and its red light blinks with a violence. REPLACE, it demands, but you and your roommates haven't for months. nothing here is clean. the floor of the kitchen appears to be, but just underneath the lip of the floor cabinets are untold crumbs and their consumers, flitting around in search of a meal. you haven't seen any rodents yet, at least, so you don't worry too much. you wash a glass from the sink and pour it full of chilled, (un)filtered water. This is mainly so the next part doesn't make you puke

+

You return to the couch and empty out some small crystals onto the mirror on the living room table. this is exegenamine, an NMDA receptor antagonist, which has been making the rounds amongst your friends recently. it's got the dissociation which everyone wants nowadays, and of course, music sounds great. Exegenamine (hereon, exg) also, however, behaved in an oddly uniform way. it would provide a "narrative evaluation", so to speak. any "visions" or "discoveries" on exg would only manifest as direct commentaries on its user's self-narrative - their understanding of who they were, and how they came to be, and etc. Notably, it did not change this understanding- this was an exercise left to the reader, so to speak. you and your friends appreciated this - dabbling with acid and shrooms some years back was certainly fun, but there was only so much you could really get from them, you felt, and the collective understanding of these drugs- socially and scientifically- made subsequent uses feel less effective. Exg was under study regarding how it could deliver the same effects to every user, a textual self-criticism, but this was somewhat impeded by all the Schedule II red tape. It was also not very available, as its synthesis was known only to whomever kept putting it on the market. Bad exg existed of course, but it wasn't much different from ketamine - if you did enough, you'd realize it wasn't what you wanted. Fortunately, you knew someone who worked at the university's bio lab studying exegenamine, and he'd taken it upon himself to acquire a large batch for "research purposes".

+

you cut up the crystals with an old gift card- reserved explicitly for cutting up drugs, since you didn't want the residue all over your credit card. you took a few lines, each spaced out by a few minutes, and leaned back on the couch to catch up on whatever roxie was watching.

+

an episode had gone by since you began watching. Oh, you recognized the protagonist - this was Cyber Heaven9, but you'd never seen it. you just knew that it was generally acclaimed on the internet, that people would always take profile pictures of the main android, Exe, or otherwise Emp3, her sometimes sidekick/love interest (depending on who you asked). This episode Exe was climbing up a large cylindrical shaft, filled with computer terminals. It was a largely introspective episode, and as Exe continued her climb and questioned her place, you began yours, since the scanlines of the terminals began to dance in front of you as the exg kicked in.

+

it was time for a reflective episode, you had figured, thinking about the recommendations that julian had given you. you'd talked to him about the mirror thing before, how you'd stare into it and hate what you saw, and that actually prompted him to recommend you exg. you'd been trying to figure out the angle for it, since you didn't really know how freely he gave it out, being a research assistant and all- you should have figured the guy loved to have people try it. Anyways, talking with him at that house party, shoved into the corner of a couch with bodies all around you, you'd spoken to him honestly, and he'd understood. The same thing had happened to him. He'd hurt someone in the past, he said, and after that, looking in the mirror, it just made him see a violent, hideous man, a junkie, an addict, a zombie. This was exactly it. But exg had helped him, in a way the other research chemicals hadn't really. Since he had to come back to that moment in the mirror, and exg laid it all out for him. You appreciated that he didn't explain what he learned, though. talking with people who did drugs could sometimes ruin the whole thing. he'd said to take 5 lines to start, as it wasn't readily bioavailable through insufflation. he'd handed you the gram before leaving the party, and you wished you'd gotten his number.

+

you laid back and watched the chasm fade behind Exe, the critical process becoming clearer and clearer.

+ +
+ + diff --git a/writing/cyber-heaven9/index.html b/writing/cyber-heaven9/index.html new file mode 100644 index 0000000..d60df13 --- /dev/null +++ b/writing/cyber-heaven9/index.html @@ -0,0 +1,56 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ VI. Cyber Heaven9 +

+

+ +
+ + diff --git a/writing/exegenamine/index.html b/writing/exegenamine/index.html new file mode 100644 index 0000000..4040ee9 --- /dev/null +++ b/writing/exegenamine/index.html @@ -0,0 +1,56 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ V. Exegenamine +

+

+ +
+ + diff --git a/writing/index.html b/writing/index.html new file mode 100644 index 0000000..d6d5bf2 --- /dev/null +++ b/writing/index.html @@ -0,0 +1,69 @@ + + + + + + + soulware.us + + + + + + + + +
+
+

+ writing +

+
+
+ +
+
+ + diff --git a/writing/salvation/index.html b/writing/salvation/index.html new file mode 100644 index 0000000..7d1dd31 --- /dev/null +++ b/writing/salvation/index.html @@ -0,0 +1,56 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ III. Salvation +

+

+ +
+ + diff --git a/writing/skeleton/index.html b/writing/skeleton/index.html new file mode 100644 index 0000000..a8f0fe6 --- /dev/null +++ b/writing/skeleton/index.html @@ -0,0 +1,56 @@ + + + + + + + soulware.us + + + + + + + + +
+

+ II. Skeleton +

+

+ +
+ +