From cf5c6125faec4a52647048de21bc6c2afbbbccf3 Mon Sep 17 00:00:00 2001 From: Jeremy Janella Date: Fri, 14 Mar 2025 01:56:40 -0400 Subject: [PATCH] images and styling --- .svelte-kit/ambient.d.ts | 18 ++++++----- .svelte-kit/generated/server/internal.js | 2 +- src/lib/game/chunkfunc.webp | Bin 0 -> 1378 bytes src/lib/game/flying.webp | Bin 0 -> 22584 bytes src/routes/+page.svelte | 39 ++++++++++++++++------- src/style.css | 6 ++-- 6 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 src/lib/game/chunkfunc.webp create mode 100644 src/lib/game/flying.webp diff --git a/.svelte-kit/ambient.d.ts b/.svelte-kit/ambient.d.ts index 80f82c3..f762020 100644 --- a/.svelte-kit/ambient.d.ts +++ b/.svelte-kit/ambient.d.ts @@ -33,6 +33,7 @@ declare module '$env/static/private' { export const COLORTERM: string; export const XDG_CONFIG_DIRS: string; export const npm_config_cache: string; + export const XDG_SESSION_PATH: string; export const XDG_MENU_PREFIX: string; export const TERM_PROGRAM_VERSION: string; export const ICEAUTHORITY: string; @@ -59,10 +60,8 @@ declare module '$env/static/private' { export const XAUTHORITY: string; export const VSCODE_GIT_ASKPASS_NODE: string; export const MOTD_SHOWN: string; - export const GDM_LANG: string; export const GTK2_RC_FILES: string; export const HOME: string; - export const USERNAME: string; export const LANG: string; export const LC_PAPER: string; export const XDG_CURRENT_DESKTOP: string; @@ -70,6 +69,7 @@ declare module '$env/static/private' { export const MEMORY_PRESSURE_WATCH: string; export const WAYLAND_DISPLAY: string; export const GIT_ASKPASS: string; + export const XDG_SEAT_PATH: string; export const INVOCATION_ID: string; export const MANAGERPID: string; export const INIT_CWD: string; @@ -78,7 +78,6 @@ declare module '$env/static/private' { export const npm_lifecycle_script: string; export const VSCODE_GIT_ASKPASS_EXTRA_ARGS: string; export const XKB_DEFAULT_LAYOUT: string; - export const XDG_ACTIVATION_TOKEN: string; export const npm_config_npm_version: string; export const XDG_SESSION_CLASS: string; export const LC_IDENTIFICATION: string; @@ -89,6 +88,7 @@ declare module '$env/static/private' { export const VSCODE_GIT_IPC_HANDLE: string; export const QT_WAYLAND_RECONNECT: string; export const KDE_SESSION_VERSION: string; + export const PAM_KWALLET5_LOGIN: string; export const DISPLAY: string; export const npm_lifecycle_event: string; export const GSK_RENDERER: string; @@ -98,8 +98,10 @@ declare module '$env/static/private' { export const XDG_VTNR: string; export const XDG_SESSION_ID: string; export const npm_config_user_agent: string; + export const ROCM_PATH: string; export const npm_execpath: string; export const XDG_RUNTIME_DIR: string; + export const MKLROOT: string; export const DEBUGINFOD_URLS: string; export const npm_package_json: string; export const LC_TIME: string; @@ -113,7 +115,6 @@ declare module '$env/static/private' { export const BROWSER: string; export const PATH: string; export const npm_config_node_gyp: string; - export const GDMSESSION: string; export const ORIGINAL_XDG_CURRENT_DESKTOP: string; export const DBUS_SESSION_BUS_ADDRESS: string; export const npm_config_global_prefix: string; @@ -162,6 +163,7 @@ declare module '$env/dynamic/private' { COLORTERM: string; XDG_CONFIG_DIRS: string; npm_config_cache: string; + XDG_SESSION_PATH: string; XDG_MENU_PREFIX: string; TERM_PROGRAM_VERSION: string; ICEAUTHORITY: string; @@ -188,10 +190,8 @@ declare module '$env/dynamic/private' { XAUTHORITY: string; VSCODE_GIT_ASKPASS_NODE: string; MOTD_SHOWN: string; - GDM_LANG: string; GTK2_RC_FILES: string; HOME: string; - USERNAME: string; LANG: string; LC_PAPER: string; XDG_CURRENT_DESKTOP: string; @@ -199,6 +199,7 @@ declare module '$env/dynamic/private' { MEMORY_PRESSURE_WATCH: string; WAYLAND_DISPLAY: string; GIT_ASKPASS: string; + XDG_SEAT_PATH: string; INVOCATION_ID: string; MANAGERPID: string; INIT_CWD: string; @@ -207,7 +208,6 @@ declare module '$env/dynamic/private' { npm_lifecycle_script: string; VSCODE_GIT_ASKPASS_EXTRA_ARGS: string; XKB_DEFAULT_LAYOUT: string; - XDG_ACTIVATION_TOKEN: string; npm_config_npm_version: string; XDG_SESSION_CLASS: string; LC_IDENTIFICATION: string; @@ -218,6 +218,7 @@ declare module '$env/dynamic/private' { VSCODE_GIT_IPC_HANDLE: string; QT_WAYLAND_RECONNECT: string; KDE_SESSION_VERSION: string; + PAM_KWALLET5_LOGIN: string; DISPLAY: string; npm_lifecycle_event: string; GSK_RENDERER: string; @@ -227,8 +228,10 @@ declare module '$env/dynamic/private' { XDG_VTNR: string; XDG_SESSION_ID: string; npm_config_user_agent: string; + ROCM_PATH: string; npm_execpath: string; XDG_RUNTIME_DIR: string; + MKLROOT: string; DEBUGINFOD_URLS: string; npm_package_json: string; LC_TIME: string; @@ -242,7 +245,6 @@ declare module '$env/dynamic/private' { BROWSER: string; PATH: string; npm_config_node_gyp: string; - GDMSESSION: string; ORIGINAL_XDG_CURRENT_DESKTOP: string; DBUS_SESSION_BUS_ADDRESS: string; npm_config_global_prefix: string; diff --git a/.svelte-kit/generated/server/internal.js b/.svelte-kit/generated/server/internal.js index 9687de8..3c4257f 100644 --- a/.svelte-kit/generated/server/internal.js +++ b/.svelte-kit/generated/server/internal.js @@ -21,7 +21,7 @@ export const options = { app: ({ head, body, assets, nonce, env }) => "\n\n \n \n \n \n \n \n
" + body + "
\n \n\n\n", error: ({ status, message }) => "\n\n\t\n\t\t\n\t\t" + message + "\n\n\t\t\n\t\n\t\n\t\t
\n\t\t\t" + status + "\n\t\t\t
\n\t\t\t\t

" + message + "

\n\t\t\t
\n\t\t
\n\t\n\n" }, - version_hash: "1d3uu3c" + version_hash: "ott1tf" }; export async function get_hooks() { diff --git a/src/lib/game/chunkfunc.webp b/src/lib/game/chunkfunc.webp new file mode 100644 index 0000000000000000000000000000000000000000..14316ff70198b1d0de98233ebc72a53903cda923 GIT binary patch literal 1378 zcmV-o1)cg*Nk&Fm1pok7MM6+kP&iCY1pojqKftE|A29#(KmYR|crx(qU~k>pwr%|c z%znB`1;Y1Xfa-e%(D#!4A&-*Cl2+Tf-$e9(0{(gY*T45a1OHHcu~z-}ENkt*0B`UE zMJHRw-(=D9*0ZIbi}a3q*T=TMCa%{0=j8g>zI3&`Wu2i;wysV_i_VA+pBb7R2vsJb z<3?EH5o(mbXtc_|%B~ijd$gip3-5w9e9n}9xE8#iWvB{-I^MZkSWDaI>9)<|guZAL zY%@8e0~t@atsoq3Ri}ZMq~&pX?9SP{I_qw<@?+I6x>{~6eX9Hs?_Aax zbn+u}=#S@SV6RJvH!U+UA>b$4=6279Q6U3!A5;3@x0XplJzFaRzhe3lO?0 zW6>valS`y;Tp9*^8?l5|;Eiq4cF**U4kj&_Hhvxapmjjh1YUSZ8YP)DYg(+9;5D@p zqL8*A<>ou4?+{YPGO=VM7IrS>lHdaf=`p|u$6Hz`O4(Awlnu3PDZ9q$y~`yAj3o*& z;C=cwcn%PL3X!3gYb-HC%8(9l(40$-khB2^Er}#n+nJOtPA-koG$p1ixF)LLnjvWy zFSrRQcVID=QMk0sle8qqw@LGg9m1VyLoK@R|XZ zU<2^+BESb&ZUEjkz!yv4m6qW1gq+iNAQHe9r|<%}H>2<~9kb)5SVo0+>jg1OPPZ4W zU#t0(`!lSyekNnU-LjHTu-W2^^JD#Y>(%PdkNwP#&fT+CLS$tPb$s)BRVI+)u1V8p zEZmzUCVPWWQZ!)qQUU@@OGpq48wx;DK z=7HC8+hP(v7vK2u7>foF(hOz6rHL|@xl5!C%R@r?4n7txDWn@bH!exp0`OUhSuhEU zLD6QIN-|uzi9t*W?Lvtoy$`M=rs7!;Jmp>qJ!Lu|y-Y%yz`aZ_na(U($i-F6D5Q04 zkxoPVxr4)ikP^H$3oOa$J8*BtW&n7C=VqQFl}N(?OF)`Pb2A_$Az|Q3UdS|+XcL<5 zlBVrU%#ifdMv{+32TPl5Y~uxOq#JC>LxR?E&|#j&ZnP3Sm&9~QIt`F-Vj?LEfNusT zZ6GSDxugl8yYr%OFUNyEV2uw|O0=?Nx?P@0tf0!s*_%cKM(04bL@u`#7glBO*# z<*hS>H0^N}T$0i|#h;glcL?j?jY%}d7tne&(&Y`)a}(0F%VoOKwcnT&tw%|w;%0g$ z?~bsRHxib#gNS9cB}8eOc0bHZ*XnC3sC>Ew!wXE&TxAnIB8* z40VpbBC?kq_4XgjpWOIZw)9Jp_A%AcdfHwevqSxd@sH7p&7<(#%)-7$>oz~+W?CHf k^F`;;va2y%4e6`0HLNpR-@kSA_*nJ-JPF)lZPd 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 f`0@Yo{{D1sciyr_0fCLjU literal 0 HcmV?d00001 diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index fa0fb1b..dfc95c6 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -20,9 +20,24 @@ -
+

Subterstrike Game Development

-

I am currently developing an underground-submarine openworld multiplayer physics inspired game. As a gamer and enjoyer of large, rich maps and depth to gameplay, I would really like to say thats what I started out trying to create. Instead, the story goes that I had this random idea for terrain manipulation. Games like Minecraft and Terraria use squares and cubes, which just feels boring in my opinion. I thought I could do something much more visceral As a sort of tech-demo/proof of concept I programmed a shape that could be modified by boolean geomerty operations, mainly union and subtract with a second polygon. This led to a very interesting, but quickly boring "game" to hop around in. However, since I could drill through and place prettymuch any shape I wanted to, it felt like I could "fly" through the land, much like a submarine "flies" through water.

I implemented some modularly built vehicles with use of graphs theory and object oriented programming, and terrain generation using cellular noise. The reason I used cellular noise is because if you look at the lines between cells, they form a network without dead ends. Then by applying an algorithm using a density function on depth I am able to fine tune the width and density of the caves without impacting their interconnectedness. By using this method chunks can generate completely independant of their neighbor, which is optimal.

"Multiplayer is the hardest part of game dev, maybe release that later" I have been told by a lot of people. However, as a hobby-server configurer and network security nerd, I thought I could take it on. I was right, however as a network security nerd I have more layers of firewalls than I do braincells. Every single time I have an issue with networking, its a firewall. Once I found which ports were blocked, yes multiplayer was easy.

The result? I could fly drilling vehicles through terrain, pop out of the ground or into random caves, mine materials, play hide and seek with friends, and even orbit the planet. One of the things important to me in this game was accurate phyiscs: thrust, torque, gravity, mass, all the fun stuff. While I am a physics minor, I am more importantly a heavy player of physics and rocket science games such as Kerbal Space Program. I was able to glide through AP physics simply because it just part of the games world, it included everything we would learn in the classroom. Realistic phyiscs also added to the depth of gameplay I was looking for.

After some formal computer science education, I discovered new ways to more efficiently implement many of the algorithms I had initially generated and rewrote them ...multiple times. Currently everything runs buttery smooth and framerates are high due to efficienct caching of unloaded chunks, multithreaded chunk generation, gpu accelerated compute shaders to modify chunk density, enhanced use of object oriented programing and graph algorithms to build massive modular vehicles, authoritative server networking to disable hackers, and other performance tweaks.

So this sounds amazing, wheres the game? Well, a game needs graphics, audio, a sound track. As much as I'd love to release it now, its unplayable for these reasons along with a few minor implementations left such as NPC's and reworking the tech tree. Currently I am contracting a graphical artist and sound designer. Alpha tests have been a lot of fun, and investors have appeared. The finish line is close.

+
+ Zoomed out chunk generation +

+ Prototype terrain sample zoomed far out +

+
+

+ I am currently developing an underground-submarine openworld multiplayer physics inspired game. As a gamer and enjoyer of large, rich maps and depth to gameplay, I would really like to say thats what I started out trying to create. Instead, the story goes that I had this random idea for terrain manipulation. Games like Minecraft and Terraria use squares and cubes, which just feels boring in my opinion. I thought I could do something much more visceral As a sort of tech-demo/proof of concept I programmed a shape that could be modified by boolean geometry operations, mainly union and subtract with a second polygon. This led to a very interesting, but quickly boring "game" to hop around in. However, since I could drill through and place prettymuch any shape I wanted to, it felt like I could "fly" through the land, much like a submarine "flies" through water.

I implemented some modularly built vehicles with use of graphs theory and object oriented programming, and terrain generation using cellular noise. The reason I used cellular noise is because if you look at the lines between cells, they form a network without dead ends. Then by applying an algorithm using a density function on depth I am able to fine tune the width and density of the caves without impacting their interconnectedness. By using this method chunks can generate completely independent of their neighbor, which is optimal.

"Multiplayer is the hardest part of game dev, maybe release that later" I have been told by a lot of people. However, as a hobby-server configurer and network security nerd, I thought I could take it on. I was right, however as a network security nerd I have more layers of firewalls than I do braincells. Every single time I have an issue with networking, its a firewall. Once I found which ports were blocked, yes multiplayer was easy.

The result? I could fly drilling vehicles through terrain, pop out of the ground or into random caves, mine materials, play hide and seek with friends, and even orbit the planet. One of the things important to me in this game was accurate physics: thrust, torque, gravity, mass, all the fun stuff. While I am a physics minor, I am more importantly a heavy player of physics and rocket science games such as Kerbal Space Program. I was able to glide through AP physics simply because it just part of the games world, it included everything we would learn in the classroom. Realistic physics also added to the depth of gameplay I was looking for.

After some formal computer science education, I discovered new ways to more efficiently implement many of the algorithms I had initially generated and rewrote them ...multiple times. Currently everything runs buttery smooth and framerates are high due to efficient caching of unloaded chunks, multithreaded chunk generation, gpu accelerated compute shaders to modify chunk density, enhanced use of object oriented programing and graph algorithms to build massive modular vehicles, authoritative server networking to disable hackers, and other performance tweaks.

So this sounds amazing, where's the game? Well, a game needs graphics, audio, a sound track. As much as I'd love to release it now, its unplayable for these reasons along with a few minor implementations left such as NPC's and reworking the tech tree. Currently I am contracting a graphical artist and sound designer. Alpha tests have been a lot of fun, and investors have appeared. The finish line is close. +

+ +
+ Flying Vehicle +

+ A grid flying through caves, preceding graphics +

+
@@ -31,7 +46,7 @@
  • NGINX Reverse Proxy

    -

    This server is the internets access to all of my other servers, and the glue holding them together. I was using IPTables breifly but have moved to NGINX to forward traffic from specified ports onto private servers connected to it.

    +

    This server is the internets access to all of my other servers, and the glue holding them together. I was using IPTables briefly but have moved to NGINX to forward traffic from specified ports onto private servers connected to it.

  • Lightweight Server

    @@ -45,28 +60,28 @@
-
+
Testing Input Response

- Testing Input Response + Testing Input
Response

Internal View

Internal View

-

Designed and Built a UAV

+

Building a UAV

I chose to build a drone from scratch for my AP Physics final project. We were given an open ended assignment to build something cool and I wanted a drone. My choice was much more ambitious than the course required, and took quite a while to complete.

- For the drones frame I finally had an excuse to purchase a 3d printer. I modelled the frame and arms modularly to support future upgrades and replacements from damage, reducing the cost of operation. Initially I was using some 3d printed torodial propellers due to their higher efficiency and lower sounds usage. Due to safety concerns of the propellers not withstanding tension at higher RPMs and exploding I switched to arcylic propellers. A challenge in designing the frame was leaving enough room to contain the volume of the wires. I went with the Elegoo Neptune 3 as the printer was open-source and had a much better cost-to-utility than proprietary printers such as the Ender series. I am not sponsored I just really like the printer.

+ For the drones frame I finally had an excuse to purchase a 3d printer. I modelled the frame and arms modularly to support future upgrades and replacements from damage, reducing the cost of operation. Initially I was using some 3d printed torodial propellers due to their higher efficiency and lower sounds usage. Due to safety concerns of the propellers not withstanding tension at higher RPMs and exploding I switched to some generic acrylic propellers I bought. A challenge in designing the frame was leaving enough room to contain the volume of the wires. I went with the Elegoo Neptune 3 as the printer was open-source and had a much better cost-to-utility than proprietary printers such as the Ender series. I am not sponsored I just really like the printer.

The flight computer was the most difficult part to program. Using an ultrasonic distance sensor, gyroscope, and accelerometer the drone has enough information to probably never crash. The autopilot is implemented on an Arduino UNO using a PID controller for stabolization. The autopilot quality is currently impacted every time the drones mass distribution changes, which can be fixed with a reinforcement machine learning algorithm. For the higher level programming such as flight automation, video transmission and WiFi communications I used a Raspberry Pi Pico. There is also a 2.4GHz line of sight receiver for manual control. A future upgrade may contain a SIM card for near-infinite remote control connection, but drone regulations would make this difficult.

- The power system is the most physically challenging portion of the drone. The motors took 14.6 Volts, while the UNO microcontroller took 5 Volts, and the Pico and most sensors run at 3.3 Volts. All of the power to the motors ran through the power distribution board, which I modified to also output the lower voltages and used Bidirectional Logic Level Converters to shift between 3.3 and 5V signals where needed. A potentional flaw with having all the power coming from the same source is spikes in energy consumption to the motors may cause the microcomputers to receive too little power, which could be fixed with a capacitor. Luckily, I havn't experienced this yet as the 2C discharge rate on the 2.5Ah capacity battery is more than enough. Having a battery this big does mean it takes up about half the internal electronics volume and is half of the drones mass, but it can also maintain full throttle for half an hour making for long flights.

+ The power system is the most physically challenging portion of the drone. The motors took 14.6 Volts, while the UNO microcontroller took 5 Volts, and the Pico and most sensors run at 3.3 Volts. All of the power to the motors ran through the power distribution board, which I modified to also output the lower voltages and used Bidirectional Logic Level Converters to shift between 3.3 and 5V signals where needed. A potential flaw with having all the power coming from the same source is spikes in energy consumption to the motors may cause the microcomputers to receive too little power, which could be fixed with a capacitor. Luckily, I haven't experienced this yet as the 2C discharge rate on the 2.5Ah capacity battery is more than enough. Having a battery this big does mean it takes up about half the internal electronics volume and is half of the drones mass, but it can also maintain full throttle for half an hour making for long flights.

- The motors I used were a bit overkill for a 1.1kg drone, as going past 20% throttle sends it shooting through the sky -- which is not a bad issue to have. Here's the technical numbers behind that: I have propellers with a 6cm radius on motors with a 2450KV rating (2450 rpm per volt) at peaking at 14.6 Volts. From this the tip speed is computer to be 225m/s under no load at max throttle, quite a lot more than what is safe or nessecary to get into the air. + The motors I used were a bit overkill for a 1.1kg drone, as going past 20% throttle sends it shooting through the sky -- which is not a bad issue to have. Here's the technical numbers behind that: I have propellers with a 6cm radius on motors with a 2450KV rating (2450 rpm per volt) at peaking at 14.6 Volts. From this the tip speed is computer to be 225m/s under no load at max throttle, quite a lot more than what is safe or necessary to get into the air.

@@ -78,10 +93,10 @@

Parkside Pool needed to automate their systems, and I had already worked as the head lifeaurd and Director of Operations so I knew exactly what needed to be done. We needed to automate:

  1. Receiving swimming lesson applications and payments
  2. -
  3. Design schedules based on many parameters include age, level, class size, siblings in adjacent classes, given availibility, and more soft requirements
  4. +
  5. Design schedules based on many parameters include age, level, class size, siblings in adjacent classes, given availability, and more soft requirements
  6. Send swimming lesson application confirmations
-

Implementing the reception and confirmation of lessons was striaghtforward enough with a Flask site using Stripe for payments, and Firebase service for sending confirmation emails. The difficult part was building the schedule, which is a form of the NP-Hard Nurse Scheduling Problem. As there were at max a few hundred students per schedule, I solved this using a recursive algorithm and scoring system to choose the best generated option.

+

Implementing the reception and confirmation of lessons was straightforward enough with a Flask site using Stripe for payments, and Firebase service for sending confirmation emails. The difficult part was building the schedule, which is a form of the NP-Hard Nurse Scheduling Problem. As there were at max a few hundred students per schedule, I solved this using a recursive algorithm and scoring system to choose the best generated option.

@@ -93,7 +108,7 @@ - +