Compare commits

..

No commits in common. "master" and "commissions" have entirely different histories.

201 changed files with 3148 additions and 5774 deletions

View file

@ -1,30 +0,0 @@
on:
push:
branches: [master]
jobs:
web:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Setup Ruby
uses: https://github.com/ruby/setup-ruby@v1
with:
ruby-version: 3.2.2
bundler-cache: true
- name: Build
run: bundle exec jekyll build
- name: Deploy
run: |
apt update && apt install -y rsync
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && sudo dpkg -i cloudflared.deb
echo "${{ secrets.ELLBOT_KEY }}" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
rsync -rv --delete -e 'ssh -o "ProxyCommand cloudflared access ssh --hostname %h" -o "StrictHostKeyChecking=no"' _site/ ellbot@ssh.ellpeck.de:/var/www/ellpeck
- name: Purge Cloudflare cache
uses: https://github.com/NathanVaughn/actions-cloudflare-purge@v3.1.0
with:
cf_zone: ${{ secrets.CLOUDFLARE_ZONE }}
cf_auth: ${{ secrets.CLOUDFLARE_TOKEN }}

9
.gitignore vendored
View file

@ -1,3 +1,6 @@
.jekyll-*
_site
.idea
node_modules
sitemap.xml
feed.json
rss.xml
atom.xml
blog-*.html

View file

@ -1,36 +1,29 @@
ExpiresActive On
ExpiresDefault A31536000
ExpiresByType text/html A600
ExpiresByType text/javascript A2592000
ExpiresByType application/javascript A2592000
Options +MultiViews -Indexes
ErrorDocument 404 /404.html
Options -Indexes
RewriteEngine On
RewriteBase /
# legacy redirects (for deleted stuff)
RewriteRule ^blog-(.*)$ "blog/$1" [R=301,L]
RewriteRule ^blog/(.*)\.html$ "blog/$1" [R=301,L]
RewriteRule ^minecraft-stuff/?$ "projects" [R=301,L]
RewriteRule ^mc/?$ "projects" [R=301,L]
RewriteRule ^press(/.*)?$ "https://press.ellpeck.de$1" [R=301,L]
RewriteRule ^tinylife/?$ "https://tinylifegame.com" [R=301,L]
RewriteRule ^foefrenzy/?$ "https://store.steampowered.com/app/1194170/" [R=301,L]
RewriteRule ^actaddchangelog/?$ "https://ell.lt/aachangelog" [R=301,L]
RewriteRule ^actadddownload/?$ "https://ell.lt/aadl" [R=301,L]
RewriteRule ^actaddlicense/?$ "https://ell.lt/aalicense" [R=301,L]
RewriteRule ^actadd/?$ "https://ell.lt/aa" [R=301,L]
RewriteRule ^discord/?$ "https://ell.lt/discord" [R=301,L]
RewriteRule ^wishlist/?$ "https://ell.lt/wishlist" [R=301,L,NE]
RewriteRule ^reedsy/?$ "https://ell.lt/reedsy" [R=301,L]
RewriteRule ^sims4gallery/?$ "https://ell.lt/s4gallery" [R=301,L,NE]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule (.*) $1.html [L]
# anchor redirects
RewriteRule ^projects/?$ "#projects" [R=301,L,NE]
RewriteRule ^social/?$ "#social" [R=301,L,NE]
RewriteRule ^about/?$ "#about" [R=301,L,NE]
RewriteRule ^blog/?$ "#blog" [R=301,L,NE]
RewriteRule ^support/?$ "#support" [R=301,L,NE]
RewriteRule ^💸/?$ "#support" [R=301,L,NE]
RewriteRule ^discord/?$ "https://discord.gg/Uy2ZM9X" [R=301,L]
RewriteRule ^actaddchangelog/?$ "https://github.com/Ellpeck/ActuallyAdditions/blob/main/update/changelog.md" [R=301,L]
RewriteRule ^actadddownload/?$ "https://minecraft.curseforge.com/projects/actually-additions/files" [R=301,L]
RewriteRule ^actaddlicense/?$ "https://github.com/Ellpeck/ActuallyAdditions/blob/main/LICENSE.md" [R=301,L]
RewriteRule ^actadd/?$ "https://minecraft.curseforge.com/projects/actually-additions" [R=301,L]
RewriteRule ^projects/?$ "https://ellpeck.de/#projects" [NE,R=301,L]
RewriteRule ^impressum/?$ "https://ellpeck.de/#impressum" [NE,R=301,L]
RewriteRule ^privacy/?$ "https://ellpeck.de/#privacy" [NE,R=301,L]
RewriteRule ^mc/?$ "https://ellpeck.de/minecraft-stuff" [R=301,L]
RewriteRule ^minecraft-stuff/?$ "https://ellpeck.de/projects" [R=301,L]
RewriteRule ^yt/?$ "https://www.youtube.com/c/ellpeck" [R=301,L]
RewriteRule ^wishlist/?$ "https://www.amazon.de/hz/wishlist/ls/LZO9Y2Z3VJ5Q?&sort=default" [R=301,L]
RewriteRule ^fftranslate/?$ "https://poeditor.com/join/project/ElzC23ecB6" [R=301,L]
ErrorDocument 404 /404.html
<FilesMatch "^(blog|sitemap|feed|atom|rss)">
ExpiresActive On
ExpiresDefault A1
Header append Cache-Control must-revalidate
</FilesMatch>

View file

@ -5,13 +5,12 @@
<meta charset="UTF-8">
<title>404</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto&display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">
<link rel="icon" href="favicon.ico">
<style>
body {
font-family: Roboto, sans-serif;
font-display: swap;
font-family: Roboto;
background-color: #383838;
}
@ -48,7 +47,7 @@
<body>
<div class="content">
<h1>💔 Four Oh Four</h1>
<h1>Four Oh Four</h1>
<p>
There's nothing here, I'm sorry.
</p>
@ -56,18 +55,18 @@
<span id="message"></span>
<script>
const messages = [
"Maybe try a different place?",
"Do you want to know a secret?",
"This is a magical place",
"What were you trying to find?",
"Now my day is ruined",
"There's a place like this somewhere",
"I shall overcome this obstacle.",
"Why are you like this?",
"this is so sad alexa play despacito",
"The server is at a loss for what you were trying to find",
"oh no :(",
"The world is quiet here.",
'Maybe try a different place?',
'Do you want to know a secret?',
'This is a magical place',
'What were you trying to find?',
'Now my day is ruined',
'There\'s a place like this somewhere',
'I shall overcome this obstacle.',
'Why are you like this?',
'this is so sad alexa play despacito',
'The server is at a loss for what you were trying to find',
'oh no :(',
'The world is quiet here.',
"Instructions unclear, got site stuck in debug mode",
"Please fix",
"If we get this video to 400 likes, I'll put the site back up",
@ -75,7 +74,7 @@
];
let message = Math.floor(Math.random() * messages.length);
document.getElementById("message").innerHTML = `<em>${messages[message]}</em>`;
document.getElementById('message').innerHTML = '<em>' + messages[message] + '</em>';
</script>
</p>
<p class="go-home">
@ -87,4 +86,4 @@
</div>
</body>
</html>
</html>

View file

@ -1,9 +0,0 @@
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
gem "jekyll"
gem "jekyll-feed"
gem "jekyll-postfiles"

View file

@ -1,91 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
colorator (1.1.0)
concurrent-ruby (1.2.3)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
eventmachine (1.2.7)
eventmachine (1.2.7-x64-mingw32)
ffi (1.16.3)
forwardable-extended (2.6.0)
google-protobuf (4.26.1)
rake (>= 13)
http_parser.rb (0.8.0)
i18n (1.14.5)
concurrent-ruby (~> 1.0)
jekyll (4.3.3)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (>= 2.0, < 4.0)
jekyll-watch (~> 2.0)
kramdown (~> 2.3, >= 2.3.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (>= 0.3.6, < 0.5)
pathutil (~> 0.9)
rouge (>= 3.0, < 5.0)
safe_yaml (~> 1.0)
terminal-table (>= 1.8, < 4.0)
webrick (~> 1.7)
jekyll-feed (0.17.0)
jekyll (>= 3.7, < 5.0)
jekyll-postfiles (3.1.0)
jekyll (>= 3.8.6, < 5)
jekyll-sass-converter (3.0.0)
sass-embedded (~> 1.54)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.4)
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (5.0.5)
rake (13.2.1)
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.8)
strscan (>= 3.0.9)
rouge (4.2.1)
safe_yaml (1.0.5)
sass-embedded (1.77.2)
google-protobuf (>= 3.25, < 5.0)
rake (>= 13.0.0)
sass-embedded (1.77.2-x64-mingw-ucrt)
google-protobuf (>= 3.25, < 5.0)
sass-embedded (1.77.2-x64-mingw32)
google-protobuf (>= 3.25, < 5.0)
sass-embedded (1.77.2-x86_64-linux-gnu)
google-protobuf (>= 3.25, < 5.0)
strscan (3.1.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
unicode-display_width (2.5.0)
webrick (1.8.1)
PLATFORMS
x64-mingw-ucrt
x64-mingw32
x64-unknown
x86_64-linux
DEPENDENCIES
jekyll
jekyll-feed
jekyll-postfiles
BUNDLED WITH
2.2.22

24
Jenkinsfile vendored Normal file
View file

@ -0,0 +1,24 @@
pipeline {
agent any
stages {
stage('Pull') {
when {
branch 'master'
}
steps {
sh '''cd /var/www/ellpeck
git pull'''
}
}
stage('Node') {
when {
branch 'master'
}
steps {
sh '''cd /var/www/ellpeck/node
node blog.js
node rss.js'''
}
}
}
}

View file

@ -1,23 +0,0 @@
permalink: blog/:title/
plugins:
- jekyll-feed
- jekyll-postfiles
# markdown formatting
kramdown:
header_offset: 1
typographic_syms:
hellip: ...
mdash: ---
ndash: --
laquo: "<<"
raquo: ">>"
# atom feed information
url: https://ellpeck.de
title: Ellpeck.de
description: Ell's Little Internet Place
author: Ellpeck
feed:
posts_limit: 10000

View file

@ -1,46 +0,0 @@
[
{
"q": "What are your pronouns?",
"a": "I'm assigned male at birth and quite comfortable with that, so I go by he/him most of the time. My own gender isn't really that important to me, though, and I usually also include they/them as an option."
},
{
"q": "How old are you?",
"a": "I'm <span id=\"age\"></span> years old. This automatically updates now, too, so I won't ever forget to update it again!"
},
{
"q": "Where are you from?",
"a": "I am from Neuss, Germany and I currently live in Neu-Ulm, Germany. I lived in Aachen, Germany for a while as well."
},
{
"q": "Why are you called Ellpeck?",
"a": "When I was little, I decided to make a YouTube channel with the grammatically questionable title \"LetsPlayEveryGames.\" Shortly after, I also made a Minecraft account that I was going to call the same thing. At the time, though, there was a limit for how many characters your name could have, and so I opted for calling myself \"LPEG\" instead. Some people tried to pronounce that name as if it were a normal word rather than an acronym. I liked that pronunciation, and so I turned it into a name."
},
{
"q": "What should I call you?",
"a": "In general, most of my friends online call me Ell nowadays, which is also what I go by on Twitter and Discord in terms of my display names. My boyfriend calls me Peck online, but I generally don't like it when other people do so. If we meet in real life, you can call me Ell or Julian, the latter of which is my real name."
},
{
"q": "What languages do you speak?",
"a": "I speak German, English, Java and C# fluently. I'm okay at JavaScript, TypeScript and Python, and I can just about get something to happen in R, C, PHP and Lua."
},
{
"q": "How do you make games?",
"a": "I usually use the .NET-based framework <a href=\"https://www.monogame.net/\">MonoGame</a> together with some libraries, including my own, MLEM."
},
{
"q": "When are you updating your Minecraft mods?",
"a": "If you're asking about Actually Additions, <a href=\"https://ellpeck.de/blog/future_actually_additions\">I don't work on it anymore</a>. If you're asking about any of my other mods: I generally try to keep them updated to the most recent major Minecraft version. It might take me a few months to get there, though."
},
{
"q": "What's your job/occupation?",
"a": "I'm currently studying computer science at <a href=\"https://www.uni-ulm.de/en/\">Ulm University</a>, and I work there part-time as a research assistant. Other than that, I make money through Tiny Life sales, as well as Modrinth and CurseForge monetization from my Minecraft mods."
},
{
"q": "What do you use to code?",
"a": "For Java, I use IntelliJ IDEA. For C#, I use JetBrains Rider. For anything web-related, I use PhpStorm. For most of my other projects, which are usually rather small, I use Visual Studio Code."
},
{
"q": "What's your favorite programming language?",
"a": "C#."
}
]

View file

@ -1,200 +0,0 @@
[
{
"name": "🏡 Tiny Life",
"desc": "Tiny Life is a fun simulation game that tries to capture the essence of games like The Sims, but in an isometric pixelart style. It's published by Top Hat Studios, and it's currently in Steam Early Access.",
"status": "In development",
"links": [
{
"name": "Check it out",
"link": "https://tinylifegame.com"
},
{
"name": "Get it on Steam",
"link": "https://store.steampowered.com/app/1651490/Tiny_Life/"
}
],
"icon": "tiny",
"slug": "tiny-life"
},
{
"name": "💡 Actually Additions",
"desc": "Actually Additions is a rather popular Minecraft mod that I used to work on. It's become widely known in the modding community and has reached over 30 million downloads by now, which is crazy. I don't work on it anymore myself, but it's being maintained for current versions by someone else.",
"links": [
{
"name": "Modrinth page",
"link": "https://modrinth.com/mod/actually-additions"
},
{
"name": "CurseForge page",
"link": "https://ellpeck.de/actadd"
},
{
"name": "Report an issue",
"link": "https://github.com/Ellpeck/ActuallyAdditions/issues"
},
{
"name": "Online manual",
"link": "https://ellpeck.de/actaddmanual/"
}
],
"status": "Maintained",
"icon": "aa",
"slug": "actually-additions"
},
{
"name": "🌲 Nature's Aura",
"desc": "Nature's Aura is a Minecraft mod about collecting, using and replenishing the Aura naturally present in the world to create useful devices and unique mechanics.",
"status": "Side project",
"links": [
{
"name": "Modrinth page",
"link": "https://modrinth.com/mod/natures-aura"
},
{
"name": "CurseForge page",
"link": "https://minecraft.curseforge.com/projects/natures-aura"
},
{
"name": "Report an issue",
"link": "https://github.com/Ellpeck/NaturesAura/issues"
}
],
"icon": "na",
"slug": "natures-aura"
},
{
"name": "🚋 Pretty Pipes",
"desc": "Pretty Pipes is a simple to use, all-inclusive item transport mod for Minecraft. It features simple pipes that can be upgraded using modules to accomplish much more advanced tasks.",
"status": "Side project",
"links": [
{
"name": "Modrinth page",
"link": "https://modrinth.com/mod/pretty-pipes"
},
{
"name": "CurseForge page",
"link": "https://www.curseforge.com/minecraft/mc-mods/pretty-pipes"
},
{
"name": "Report an issue",
"link": "https://github.com/Ellpeck/PrettyPipes/issues"
}
],
"icon": "pp",
"slug": "pretty-pipes"
},
{
"name": "🖼️ Custom Frames",
"desc": "Custom Frames is an <a href=\"https://obsidian.md/\">Obsidian</a> plugin that turns web apps into panes using iframes with custom styling. Also comes with presets for Google Keep and more.",
"links": [
{
"name": "Check it out",
"link": "https://github.com/Ellpeck/ObsidianCustomFrames"
},
{
"name": "Install it",
"link": "https://obsidian.md/plugins?id=obsidian-custom-frames"
}
],
"status": "Side project",
"icon": "obsidian.svg",
"slug": "custom-frames"
},
{
"name": "⏱️ Super Simple Time Tracker",
"desc": "Super Simple Time Tracker is an <a href=\"https://obsidian.md/\">Obsidian</a> plugin that adds multi-purpose, easy-to-use time trackers to your notes that continue running even when you close Obsidian.",
"links": [
{
"name": "Check it out",
"link": "https://github.com/Ellpeck/ObsidianSimpleTimeTracker"
},
{
"name": "Install it",
"link": "https://obsidian.md/plugins?id=simple-time-tracker"
}
],
"status": "Side project",
"icon": "obsidian.svg",
"slug": "super-simple-time-tracker"
},
{
"name": "🕹️ MLEM",
"desc": "MLEM Library for Extending MonoGame is an addition to the game framework <a href=\"https://www.monogame.net/\">MonoGame</a> that provides extension methods, quality of life improvements and additional features like a Ui system and easy input handling.",
"links": [
{
"name": "Get it on NuGet",
"link": "https://www.nuget.org/packages?q=ellpeck+mlem"
},
{
"name": "See the website",
"link": "https://mlem.ellpeck.de/"
}
],
"status": "Side project",
"icon": "mlem",
"slug": "mlem"
},
{
"name": "🐧 Waddle",
"desc": "Waddle is a work-in-progress educational game that teaches young people about programming, created by a group of penguin enthusiasts at Uni Ulm's <a href=\"https://www.uni-ulm.de/en/in/sp\">SP Institute</a>. I create the game's pixelart and contribute to the game's design and programming.",
"links": [
{
"name": "Check it out (German)",
"link": "https://exia.informatik.uni-ulm.de/waddle"
}
],
"status": "Team member",
"icon": "waddle",
"slug": "waddle"
},
{
"name": "🌸 flowR",
"desc": "flowR is a dataflow analyzer and program slicer created by <a href=\"https://eagleoutice.github.io/portfolio/\">Florian Sihler</a> for the R programming language. I work on it as a research assistant, and I've created the VSCode extension and RStudio addin for it, as well as contributed to the core codebase.",
"links": [
{
"name": "GitHub organization",
"link": "https://github.com/flowr-analysis"
},
{
"name": "VSCode extension",
"link": "https://marketplace.visualstudio.com/items?itemName=code-inspect.vscode-flowr"
}
],
"status": "Team member",
"icon": "flowr.svg",
"slug": "flowr"
},
{
"name": "🎟️ Touchy Tickets",
"desc": "Touchy Tickets is a fun idle game for Android that has you selling tickets with various theme park attractions. You can download it for free on the Google Play Store, as well as see its public source code.",
"links": [
{
"name": "Google Play Store",
"link": "https://ell.lt/touchytickets"
},
{
"name": "See the code",
"link": "https://git.ellpeck.de/Ellpeck/TouchyTickets"
}
],
"status": "Released",
"icon": "tt",
"slug": "touchy-tickets"
},
{
"name": "⚔️ Foe Frenzy",
"desc": "Foe Frenzy is a small party game where you battle up to three of your friends with random, short-lasting items. I initially released this game as local-only right before the pandemic, so it never had a chance to become popular. I'm still quite fond of it though, and you can buy it for a few bucks and even play online now, too.",
"links": [
{
"name": "Steam",
"link": "https://store.steampowered.com/app/1194170/Foe_Frenzy/"
}, {
"name": "itch.io",
"link": "https://ellpeck.itch.io/foefrenzy"
}
],
"status": "Released",
"icon": "ff",
"slug": "foe-frenzy"
}
]

View file

@ -1,45 +0,0 @@
[
{
"name": "Twitter",
"link": "https://twitter.com/Ellpeck"
},
{
"name": "Bluesky",
"link": "https://bsky.app/profile/ellpeck.bsky.social"
},
{
"name": "GitHub",
"link": "https://github.com/Ellpeck/",
"darkIcon": true
},
{
"name": "Forgejo",
"link": "https://git.ellpeck.de/Ellpeck"
},
{
"name": "itch.io",
"link": "https://ellpeck.itch.io/",
"darkIcon": true
},
{
"name": "NuGet",
"link": "https://www.nuget.org/profiles/Ellpeck"
},
{
"name": "Twitch",
"link": "https://twitch.tv/ellpeck"
},
{
"name": "YouTube",
"link": "https://www.youtube.com/c/ellpeck"
},
{
"name": "Instagram",
"link": "https://instagram.com/Ellopecko"
},
{
"name": "Email",
"link": "mailto:me@ellpeck.de",
"darkIcon": true
}
]

View file

@ -1,26 +0,0 @@
[
{
"name": "🪙 Buy Stuff I Made",
"text": "Some of the stuff I make is directly for sale, and buying it is an easy way to support me! For example, you can buy my game Tiny Life on Steam.",
"link": "#projects"
},
{
"name": "☕ Buy me a Coffee",
"text": "Ko-fi is a great site that allows you to send me just enough money to buy a coffee. And I love those. You can also use it to send monthly payments, but the other sites in this list are usually better for that.",
"link": "https://ko-fi.com/ellpeck"
},
{
"name": "⭐ Become a Patron",
"text": "Patreon allows you to support me on a monthly basis with an amount of money of your choosing. You can also get fun rewards, like player accessories to impress your friends when using my Minecraft mods!",
"link": "https://patreon.com/Ellpeck"
},
{
"name": "💻 Sponsor on GitHub",
"text": "GitHub Sponsors is basically Patreon for programmers, and it provides a monthly support option, but it also allows you to make one-time payments. Here, you can get the same rewards as you get on Patreon.",
"link": "https://github.com/sponsors/Ellpeck"
},
{
"name": "💖 Support All of Us",
"text": "If you need a good way to get rid of your extra cash while benefitting all of us, I recommend donating to charities like <a href=\"https://outrightinternational.org/\">Outright International</a>, <a href=\"https://blacklivesmatter.com/\">Black Lives Matter</a>, the <a href=\"https://www.globalfundforwomen.org/\">Global Fund for Women</a>, or the <a href=\"https://autisticadvocacy.org/\">Autistic Self Advocacy Network</a>."
}
]

View file

@ -1,20 +0,0 @@
<div class="list-display rounded">
<h1 id="about">💬 About</h1>
<p>
Sometimes, some people ask me some questions about myself or my projects, so I decided to compile a list of some of the answers in a Q&A-like fashion so that I don't have to keep repeating them. If you're curious about me, this might be interesting to you!
</p>
<div id="about-list">
{% for item in site.data.about %}
<p>
<strong>Q: {{ item.q }}</strong><br>
<strong>A:</strong> {{ item.a }}
</p>
{% endfor %}
</div>
<script>
let birthdayMillis = Date.UTC(1999, 5 - 1, 21);
let todayMillis = Date.now();
let ageSinceStart = new Date(todayMillis - birthdayMillis);
$("#age").html(ageSinceStart.getUTCFullYear() - 1970);
</script>
</div>

View file

@ -1,175 +0,0 @@
{% capture headingsWorkspace %}
{% comment %}
Copyright (c) 2018 Vladimir "allejo" Jimenez
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
{% endcomment %}
{% comment %}
Version 1.0.13
https://github.com/allejo/jekyll-anchor-headings
"Be the pull request you wish to see in the world." ~Ben Balter
Usage:
{% include anchor_headings.html html=content anchorBody="#" %}
Parameters:
* html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
Optional Parameters:
* beforeHeading (bool) : false - Set to true if the anchor should be placed _before_ the heading's content
* headerAttrs (string) : '' - Any custom HTML attributes that will be added to the heading tag; you may NOT use `id`;
the `%heading%` and `%html_id%` placeholders are available
* anchorAttrs (string) : '' - Any custom HTML attributes that will be added to the `<a>` tag; you may NOT use `href`, `class` or `title`;
the `%heading%` and `%html_id%` placeholders are available
* anchorBody (string) : '' - The content that will be placed inside the anchor; the `%heading%` placeholder is available
* anchorClass (string) : '' - The class(es) that will be used for each anchor. Separate multiple classes with a space
* anchorTitle (string) : '' - The `title` attribute that will be used for anchors
* h_min (int) : 1 - The minimum header level to build an anchor for; any header lower than this value will be ignored
* h_max (int) : 6 - The maximum header level to build an anchor for; any header greater than this value will be ignored
* bodyPrefix (string) : '' - Anything that should be inserted inside of the heading tag _before_ its anchor and content
* bodySuffix (string) : '' - Anything that should be inserted inside of the heading tag _after_ its anchor and content
* generateId (true) : false - Set to true if a header without id should generate an id to use.
Output:
The original HTML with the addition of anchors inside of all of the h1-h6 headings.
{% endcomment %}
{% assign minHeader = include.h_min | default: 1 %}
{% assign maxHeader = include.h_max | default: 6 %}
{% assign beforeHeading = include.beforeHeading %}
{% assign headerAttrs = include.headerAttrs %}
{% assign nodes = include.html | split: '<h' %}
{% capture edited_headings %}{% endcapture %}
{% for _node in nodes %}
{% capture node %}{{ _node | strip }}{% endcapture %}
{% if node == "" %}
{% continue %}
{% endif %}
{% assign nextChar = node | replace: '"', '' | strip | slice: 0, 1 %}
{% assign headerLevel = nextChar | times: 1 %}
<!-- If the level is cast to 0, it means it's not a h1-h6 tag, so let's see if we need to fix it -->
{% if headerLevel == 0 %}
<!-- Split up the node based on closing angle brackets and get the first one. -->
{% assign firstChunk = node | split: '>' | first %}
<!-- If the first chunk does NOT contain a '<', that means we've broken another HTML tag that starts with 'h' -->
{% unless firstChunk contains '<' %}
{% capture node %}
<h{{ node }}{% endcapture %}
{% endunless %}
{% capture edited_headings %}{{ edited_headings }}{{ node }}{% endcapture %}
{% continue %}
{% endif %}
{% capture _closingTag %}</h{{ headerLevel }}>{% endcapture %}
{% assign _workspace = node | split: _closingTag %}
{% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
{% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
{% assign escaped_header = header | strip_html | strip %}
{% assign _classWorkspace = _workspace[0] | split: 'class="' %}
{% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
{% assign _html_class = _classWorkspace[0] %}
{% if _html_class contains "no_anchor" %}
{% assign skip_anchor = true %}
{% else %}
{% assign skip_anchor = false %}
{% endif %}
{% assign _idWorkspace = _workspace[0] | split: 'id="' %}
{% if _idWorkspace[1] %}
{% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
{% assign html_id = _idWorkspace[0] %}
{% assign h_attrs = headerAttrs %}
{% elsif include.generateId %}
<!-- If the header did not have an id we create one. -->
{% assign html_id = escaped_header | slugify %}
{% if html_id == "" %}
{% assign html_id = false %}
{% endif %}
<!-- Append the generated id to other potential header attributes. -->
{% capture h_attrs %}{{ headerAttrs }} id="%html_id%"{% endcapture %}
{% endif %}
<!-- Build the anchor to inject for our heading -->
{% capture anchor %}{% endcapture %}
{% if skip_anchor == false and html_id and headerLevel >= minHeader and headerLevel <= maxHeader %}
{% if h_attrs %}
{% capture _hAttrToStrip %}{{ _hAttrToStrip | split: '>' | first }} {{ h_attrs | strip | replace: '%heading%', escaped_header | replace: '%html_id%', html_id }}>{% endcapture %}
{% endif %}
{% capture anchor %}href="#{{ html_id }}"{% endcapture %}
{% if include.anchorClass %}
{% capture anchor %}{{ anchor }} class="{{ include.anchorClass }}"{% endcapture %}
{% endif %}
{% if include.anchorTitle %}
{% capture anchor %}{{ anchor }} title="{{ include.anchorTitle | replace: '%heading%', escaped_header }}"{% endcapture %}
{% endif %}
{% if include.anchorAttrs %}
{% capture anchor %}{{ anchor }} {{ include.anchorAttrs | replace: '%heading%', escaped_header | replace: '%html_id%', html_id }}{% endcapture %}
{% endif %}
{% capture anchor %}<a {{ anchor }}>{{ include.anchorBody | replace: '%heading%', escaped_header | default: '' }}</a>{% endcapture %}
<!-- In order to prevent adding extra space after a heading, we'll let the 'anchor' value contain it -->
{% if beforeHeading %}
{% capture anchor %}{{ anchor }} {% endcapture %}
{% else %}
{% capture anchor %} {{ anchor }}{% endcapture %}
{% endif %}
{% endif %}
{% capture new_heading %}
<h{{ _hAttrToStrip }}
{{ include.bodyPrefix }}
{% if beforeHeading %}
{{ anchor }}{{ header }}
{% else %}
{{ header }}{{ anchor }}
{% endif %}
{{ include.bodySuffix }}
</h{{ headerLevel }}>
{% endcapture %}
<!--
If we have content after the `</hX>` tag, then we'll want to append that here so we don't lost any content.
-->
{% assign chunkCount = _workspace | size %}
{% if chunkCount > 1 %}
{% capture new_heading %}{{ new_heading }}{{ _workspace | last }}{% endcapture %}
{% endif %}
{% capture edited_headings %}{{ edited_headings }}{{ new_heading }}{% endcapture %}
{% endfor %}
{% endcapture %}{% assign headingsWorkspace = '' %}{{ edited_headings | strip }}

View file

@ -1,39 +0,0 @@
<div class="list-display rounded">
<h1 id="blog">
<span id="blog-all"></span>
{% for tag in site.tags %}
<span id="blog-{{ tag[0] | slugify }}"></span>
{% endfor %}
📔 Blog
</h1>
<p>
This is my blog, where I post about gaming, programming and life. The featured posts are the ones you'll probably be most interested in, but you can select a different category to see every post.
</p>
<p>📫 You can also subscribe to this blog through the <a href="https://ell.lt/lists">mailing list</a> or the <a href="/feed.xml">Atom feed</a>.</p>
<div id="blog-cats">
{% include tagbtn.html tag="All" %}
{%- assign sorted = site.tags | sort -%}
{%- for tag in sorted -%}
{%- assign name = tag[0] -%}
{% include tagbtn.html tag=name %}
{%- endfor -%}
</div>
<div id="blog-list">
{% for post in site.posts %}
{% if post.archived != true %}
{% include post.html post=post %}
{% endif %}
{% endfor %}
</div>
<button type="button" class="btn btn-link" id="blog-archive-button">Show archived posts</button>
<div id="blog-archive">
{% for post in site.posts %}
{% if post.archived == true %}
{% include post.html post=post %}
{% endif %}
{% endfor %}
<em id="no-archived-posts" hidden>There are no archived posts in this category.</em>
</div>
<script src="/scripts/blog.js"></script>
</div>

View file

@ -1,14 +0,0 @@
<!-- Footer -->
<div class="footer rounded-top">
<div class="footer-section">
<a href="https://git.ellpeck.de/Ellpeck/Web">&copy; 2018-2024 Ellpeck</a> &ndash; <a href="/impressum">Impressum</a> &ndash; <a href="/privacy">Privacy</a> &ndash; <a href="https://status.ellpeck.de">Status</a>
</div>
<div class="footer-section" style="text-align: right;">
<span id="quote-text" style="margin-right: 10px;"></span>
<script src="/scripts/quote.js"></script>
<img src="/res/blobheart.png" id="blobheart" alt="A blob emoji holding a heart" width="30" height="30">
<script>
$("#blobheart").on("click", () => $("#navbar-image").attr("src", "res/heart.jpeg"));
</script>
</div>
</div>

View file

@ -1,22 +0,0 @@
{% assign tag = page.tags[0] %}
{% assign posts = site.tags[tag] | where_exp: "post", "post.archived != true" %}
{% for post in posts %}
{% if post.url != page.url %}
{% continue %}
{% endif %}
{% if forloop.last == false %}
{% assign prev = forloop.index0 | plus: 1 %}
{% endif %}
{% if forloop.first == false %}
{% assign next = forloop.index0 | minus: 1 %}
{% endif %}
{% break %}
{% endfor %}
<a class="nav-item nav-link" href="../../#blog-{{ tag | slugify }}">🏠 Back to Main Page</a>
{% if prev %}
<a class="nav-item nav-link" href="{{ posts[prev].url }}">⏮️ Previous in {{ tag }}</a>
{% endif %}
{% if next %}
<a class="nav-item nav-link" href="{{ posts[next].url }}">⏭️ Next in {{ tag }}</a>
{% endif %}

View file

@ -1,5 +0,0 @@
<a class="nav-item nav-link" href="#projects">💻 Projects</a>
<a class="nav-item nav-link" href="#social">🔗 Social</a>
<a class="nav-item nav-link" href="#about">💬 About</a>
<a class="nav-item nav-link" href="#blog">📔 Blog</a>
<a class="nav-item nav-link" href="#support">💸 Support Me</a>

View file

@ -1 +0,0 @@
<a class="nav-item nav-link" href="/">🏠 Back to Main Page</a>

View file

@ -1,48 +0,0 @@
<nav class="navbar fixed-top navbar-expand-lg navbar-light bg-light rounded-bottom" id="navbar">
<script>
if (dark) {
let navbar = $("#navbar");
navbar.removeClass("navbar-light bg-light");
navbar.addClass("navbar-dark bg-dark");
}
</script>
<!-- Navbar brand and logo -->
<a class="navbar-brand mb-0 h1" href="#">
<img src="/res/logo.png" width="40" height="40" alt="A pixelart version of Ellpeck"> Ellpeck.de
</a>
<!-- Responsive navbar menu opener -->
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar-content" aria-label="Navbar toggler">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar content -->
<div class="collapse navbar-collapse" id="navbar-content">
<div class="navbar-nav mr-auto" id="nav-items">
{% if page.nav %}
{% include {{ page.nav }} %}
{% elsif layout.nav %}
{% include {{ layout.nav }} %}
{% endif %}
</div>
<span class="navbar-text custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="dark-mode">
<label class="custom-control-label" for="dark-mode">🌙 Dark Mode</label>
<script>
let mode = $("#dark-mode");
mode.prop("checked", dark);
mode.on("click", function () {
localStorage.setItem("dark", $(this).prop("checked"));
location.hash = "";
location.reload();
});
</script>
</span>
<script>
$(".navbar-collapse a").on("click", () => $(".navbar-collapse").collapse("hide"));
</script>
</div>
</nav>

View file

@ -1,13 +0,0 @@
<div class="card bg-light blog-entry rounded-0 {% for tag in include.post.tags %} blog-tag-{{ tag | slugify }} {% endfor %}">
<div class="card-body">
<span class="blog-meta text-muted">{{ include.post.tags | join: ", " }}<br>{{ include.post.date | date_to_string }}</span>
<h4 class="card-title"><a class="title-button" href="{{ include.post.url }}">{{ include.post.title }}</a></h4>
<div class="card-text">
{{ include.post.description }}
{% if include.post.mature %}
<p style="margin-top: 0.5rem; margin-bottom: 0">⚠️ This post contains mature content.</p>
{% endif %}
</div>
</div>
</div>

View file

@ -1,40 +0,0 @@
<div class="list-display rounded">
<h1 id="projects">💻 Projects</h1>
<p>
Here is a list of some of my bigger projects as well as some things you might know me from.<br>
For a more exhaustive list of my projects, you can also check out some of the sites in the <a href="#social">Social</a> section.
</p>
<div id="project-list">
{% for item in site.data.projects %}
<div class="card bg-light project rounded-0">
<div class="card-body">
{% assign icon = item.icon %}
{% unless icon contains "." %}
{% assign icon = icon | append: ".png" %}
{% endunless %}
<img class="project-image" src="res/projects/{{ icon }}" alt="">
{% if item.status %}
<span class="text-muted project-status">{{ item.status }}</span>
{% endif %}
<h4 class="card-title" id="project-{{ item.slug }}">{{ item.name }}</h4>
<p class="card-text">{{ item.desc }}</p>
{%- for link in item.links -%}
<a href="{{ link.link }}" class="card-link btn rounded-0 btn-outline-dark">{{ link.name }}</a>
{%- endfor -%}
</div>
</div>
{% endfor %}
</div>
<script>
if (dark) {
$("#project-list").find(".btn-outline-dark").each(function () {
let e = $(this);
e.removeClass("btn-outline-dark");
e.addClass("btn-outline-light");
});
}
</script>
</div>

View file

@ -1,51 +0,0 @@
<div class="list-display rounded">
<h1 id="social">🔗 Social</h1>
<p>
These are other websites where you can find me and the things I do, including the pages where I publish my code and games and where I sometimes stream and upload videos. This list also includes a lot of ways to reach me.
</p>
<p>⚠️ Some of these sites may contain mature content.</p>
<div class="row">
<div class="col">
<div id="social-list">
{% for item in site.data.socials %}
<a class="btn btn-light social-button rounded-0" href="{{ item.link }}">
<img class="social-image social-image-light" src="res/social/{{ item.name | downcase }}.png" alt="Social icon">
{% if item.darkIcon %}
{% assign dark = item.name | downcase | append: "_dark" %}
{% else %}
{% assign dark = item.name | downcase %}
{% endif %}
<img class="social-image social-image-dark" src="res/social/{{ dark }}.png" alt="Social icon" hidden>
{{ item.name }}
</a>
{% endfor %}
</div>
Additionally, here are some miscellaneous socials:
<ul>
<li>I post most of my Sims 4 builds on <a href="https://ellpeck.de/sims4gallery">the gallery</a> as <strong>Ellpeck</strong>. I also post screenshots on my <a href="https://www.instagram.com/ellssimsbuilds/">Simstagram</a>.</li>
<li>My Nintendo Switch friend code is <strong>SW-5281-8834-6801</strong>.</li>
</ul>
</div>
<div class="col-md-auto" id="discord-div">
<iframe id="discord-widget" title="Ellpeck's Discord server" width="300" height="500" allowtransparency="true" frameborder="0"></iframe>
<span class="discord-landing">Or check out <a href="https://link.ellpeck.de/discordweb">the landing page</a></span>
</div>
<script>
if (dark) {
$(".social-image-light").attr("hidden", true);
$(".social-image-dark").attr("hidden", false);
$("#social-list").find(".btn-light").each(function () {
let e = $(this);
e.removeClass("btn-light");
e.addClass("btn-dark");
});
}
let theme = dark ? "dark" : "light";
$("#discord-widget").attr("src", `https://discordapp.com/widget?id=181435613147430913&theme=${theme}`);
</script>
</div>
</div>

View file

@ -1,31 +0,0 @@
<div class="list-display rounded">
<h1 id="support">💸 Support Me</h1>
<p>
Many of the projects you know me from, I work on in my free time. By supporting me, you help out with all of my projects equally. A bit of extra cash is always helpful, and it feels especially good when it comes from something that I enjoy doing. ❤️
</p>
<div id="support-list">
{% for item in site.data.support %}
<div class="card bg-light support-entry rounded-0">
<div class="card-body">
<h4 class="card-title">
{% if item.link %}
<a class="title-button" href="{{ item.link }}">{{ item.name }}</a>
{% else %}
{{ item.name }}
{% endif %}
</h4>
<p class="card-text">{{ item.text }}</p>
</div>
</div>
{% endfor %}
</div>
<script>
if (dark) {
$("#support-list").find(".btn-outline-dark").each(function () {
let e = $(this);
e.removeClass("btn-outline-dark");
e.addClass("btn-outline-light");
});
}
</script>
</div>

View file

@ -1 +0,0 @@
<button type="button" class="btn btn-link blog-cat-button" id="{{ include.tag | slugify }}">{{ include.tag }}</button>

View file

@ -1,57 +0,0 @@
---
layout: default
nav: nav/blognav.html
---
<style>
html {
scroll-padding-top: 70px;
}
h1 .anchor-heading, h2 .anchor-heading, h3 .anchor-heading, h4 .anchor-heading, h5 .anchor-heading, h6 .anchor-heading {
visibility: hidden;
}
h1:hover .anchor-heading, h2:hover .anchor-heading, h3:hover .anchor-heading, h4:hover .anchor-heading, h5:hover .anchor-heading, h6:hover .anchor-heading {
visibility: visible;
}
</style>
{% if page.book %}
<link rel="stylesheet" href="/style/book.css">
{% else %}
<script>
let style = dark ? "mocha" : "latte";
$("head").append($("<link/>", {
rel: "stylesheet",
href: `https://cdn.jsdelivr.net/gh/catppuccin/python@gh-pages/pygments/catppuccin-${style}.css`
}));
</script>
{% endif %}
<div class="list-display rounded">
<div class="blog-isolated">
<h1>{{ page.title }}</h1>
{% if page.archived %}
<p>🧓 This post has been archived.</p>
{% endif %}
{% if page.mature %}
<p>⚠️ This post contains mature content.</p>
{% endif %}
{% if page.reedsy %}
<p>📘 This story was inspired by a Reedsy Prompt and submitted to their competition. As such, it has also been published on <a href="{{ page.reedsy }}">their website</a>.</p>
{% endif %}
<div class="post-content">
{% include anchor_headings.html html=content anchorBody="#" anchorClass="anchor-heading" %}
</div>
<span class="text-muted project-status blog-isolated-status">{{ page.date | date_to_string }}</span>
{% if page.discuss %}
🧵 <a href="{{ page.discuss }}" class="blog-discuss">Discuss this post</a>
{% endif %}
</div>
</div>

View file

@ -1,67 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script>
// redirect legacy anchors
if (/^#privacy\/?$/.test(location.hash))
location.href = "/privacy";
if (/^#impressum\/?$/.test(location.hash))
location.href = "/impressum";
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ page.title }}</title>
<meta name="author" content="Ellpeck">
<meta name="description" content="{{ page.description }}">
<meta name="keywords" content="Ellpeck, Actually Additions, Programming, Minecraft, Game Development, Nature's Aura, C#, Java, Blog, Tutorial, Pretty Pipes, Tiny Life, Ellpeck Games">
<meta property="og:title" content="{{ page.title }}">
<meta property="og:description" content="{{ page.description }}">
<meta property="og:image" content="https://ellpeck.de/res/logoSmall.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@Ellpeck">
<meta name="twitter:creator" content="@Ellpeck">
{% feed_meta %}
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
const darkCookie = localStorage.getItem("dark");
const dark = darkCookie === null ? window.matchMedia("(prefers-color-scheme: dark)").matches : darkCookie === "true";
</script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto&display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Slab&display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=JetBrains+Mono&display=swap">
<link rel="stylesheet" href="/style/style.css">
<link rel="stylesheet" href="/style/dark.css">
<link rel="icon" href="/favicon.ico">
</head>
<body data-spy="scroll" data-target="#navbar" data-offset="140">
<script>
if (dark)
$("body").addClass("dark-mode");
</script>
{% include nav/navbar.html %}
<!-- Cookie notification -->
<div id="cookieinfo"></div>
<script src="/scripts/cookieinfo.js"></script>
<!-- Content -->
<div class="container main">
{{ content }}
</div>
{% include footer.html %}
</body>
</html>

View file

@ -1,146 +0,0 @@
---
layout: blog
title: 🍝 Ketchup, Mayo and Barbecue Sauce
description: "Sally can't quite decide what skirt to buy. When she starts going out for lunch with David, an old crush from high school, she can't quite decide what to order. But she's sure about one thing: She likes David. A lot."
tags: [Short Stories]
book: true
reedsy: https://blog.reedsy.com/short-story/lkkg7n/
discuss: https://twitter.com/Ellpeck/status/1398049729582407686
---
Sally strolled along the shopping street with her favorite, rainbow-colored bag swung over her left shoulder. Looking around the shops, she wondered if she'd gotten everything from her list. Unsure, but willing to be *absolutely certain*, she pulled her phone out of her shiny bag and opened her notes. There was one item left on it, unticked: *short skirt, blue, summer*. She held the bag open with one hand and started rummaging through it with the other. Sally had already bought a skirt, but it wasn't blue, and it wasn't fit for summer either. It was longer, and the colors made her think of the fall. Of dancing around in the rain, of jumping straight into a pile of leaves. Of *Joey*.
Oh, God.
She took the skirt out of its protective casing and checked the price tag, which was still firmly attached to the waistband. Forty-seven dollars, it said. That was a lot of money to pay for a skirt, wasn't it? She jerked around on the busy street in an instant, almost bumping into a stranger, while trying to locate the store where she'd gotten this stupid thing.
Ah, there it was. Without thinking much, she stuffed the skirt back into her bag and headed straight for the entrance of the small boutique.
As she started scanning the other skirts on the racks close to the entrance, she concluded that this store was clearly ill-fitting for her goal of completing the last item on her to-do list. There were no skirts in fun, summery colors. Slightly outraged, and about ready to head to the counter to return the expensive fall skirt, she noticed a familiar face in line for the register.
Was it really--? No, it couldn't have been. As the long-haired guy turned around, she quickly ducked behind one of the racks as to not make it seem like she'd just been staring at him. Naturally. What could be a better way to make it seem like you're *totally* minding your own business than hiding under some random clothes rack like a nine-year-old?
Oh, well. It was too late now to seem normal.
As she raised her head carefully above the rack, just enough to be able to spy-- look at David, she realized how much he'd changed since the last time she saw him. He was wearing a flashy jacket, not the weird high school varsity kind, but a punky sort of dark, possibly faux-leather looking thing. His shoulders were--wow, his shoulders were broad, and they looked strong as hell. How much had he been lifting? Did he carry boulders for fun? For only a quick second, definitely absolutely not for longer, she imagined him scooping her up and carrying her like a princess. She imagined herself, staring up into his dark brown eyes, wondering what it would be like to look into them before she fell asleep.
Joey would've never done anything like that with her. It wasn't that he hadn't been strong enough to carry her or anything, it's that he just wasn't the *romantic* type. The type of person to kiss her out of nowhere, the type to turn around while walking next to her and pull her into a tight, warm embrace. But David, *oh, David*, maybe he could be that, for her.
After a few more minutes of dreaming, and possibly a tiny bit of *drooling*, she caught herself doing exactly the thing that she promised herself she'd never do again: *Pining* for someone, someone who probably didn't even remember she existed. Someone she hadn't even *talked to* yet. Jesus Christ.
She needed to get her act together, she thought to herself. And what better way to do that than to return that ugly fall skirt she'd bought and get a perfect, blue summer one just like her to-do list demanded of her. She sat up, turned away from David, who looked like he was almost finished checking out by now, and pulled the stupid skirt back out of her bag. But looking at it, she realized again how beautiful the pattern on it was. How the thin lines connected to form what looked like a network of pathways, or maybe a tree with thousands of small branches.
She stuffed the skirt right back into her bag and deliberated. She could always just get the blue summer skirt *on top* of the fall one, and keep both. But surely, she'd never *wear* both of them, because she already had so many other skirts, and dresses, and jeans. Why did she have *so many clothes*? She didn't even need to buy any more today. This whole thing was so unnecessary, she realized.
Determined to keep the skirt (because of the beautiful lines, et cetera), but not buy another skirt (because of the full closet), she headed straight for the exit with big, confident strides. So confident, in fact, that she ran right into the backside of none other than David, who had stopped in the doorway of the store, probably to check his phone or something.
Oh, fucking hell.
David leapt forward immediately and scrambled to keep his phone in his hand. He turned around and shot Sally a weird look.
"I'm so sorry," she mumbled, sounding overly apologetic. "I didn't look where I was going."
"It's no problem," he said and the corner of his mouth tilted upwards a little. "Wait, don't I know you from somewhere?"
Sally paused. A person who *hadn't* just stalked her old high school classmate from behind a fucking skirt rack would probably be confused for a second before, like her, immediately saying "Yea, hi, I'm Sally, back from school."
He arched an eyebrow. "Sally...," he began. "Sally, like, debate team Sally?"
"Is that what you thought of me as?", she said almost instinctively. "I didn't even do it for that long."
"Well," David began awkwardly and stuffed his phone into his pocket. "The other Sally made it hard to think of you as just 'Sally'", he explained.
Ah, that made a lot of sense, actually. Sally (the other one) was one of the popular girls, and *this* Sally was never that popular at school, or anywhere, really. She hung around the debate team for a while, but quit fairly quickly and moved on to a different club. And right now, still standing in the doorway of the store, awkwardly looking at David, she pulled a face and tried to remember what she *did* after she quit the debate team.
"Anyway," David said with a blank expression. "I was about to grab lunch..."
He paused, and Sally just kind of stared. She was still thinking about that damn club.
"You want to come?" David finally said.
"Uh, what?" Sally began awkwardly. It took a second for her brain to process what David had just said. "Oh, yea, sure, that sounds great!", and it really *did* sound great to her, too.
***
Sally couldn't quite believe it, but David had actually given her his *phone number* after their lunch date thing. They'd walked to a nearby fast food place and both ordered a burger and fries, and, while waiting for the food to arrive, they'd talked about what both of them had started doing after finishing school.
Sally was sitting in her bed now and looking down at her phone, the bright screen displaying David's contact information. He'd entered his first name only, along with his phone number. For a moment, Sally wondered if he might have given her some sort of fake number, but that wouldn't make much sense, because *he* was the one who'd invited her to lunch, after all.
She hovered over the green call button with her thumb, considering her options. Maybe she should just text him? What would she say, though? A call just seemed easier. Plus, it was cheaper, right? With her contract and all. Finally, she tapped the button with a shaky finger.
"Hello?" a familiar voice said on the other end of the line.
"Hey, it's me, Sally, from lunch," she said awkwardly. "Do you want to go out again, maybe?"
Wow, that was *bold* of her, wasn't it? What had gotten into her all of a sudden? She never used to be like this with Joey, or anyone else, for that matter. She shook her head and followed up with a *super* smooth "Only if you want, though. Of course." Fucking hell.
"I'd love to! I'm so glad you asked," he said. "I was worried you weren't going to call."
He was... *worried*? That was a surprise to Sally. And a nice thing to say, too, in a weird sort of way.
They decided to meet up for lunch again the next day, and David picked out another fast food place in town that sold Asian takeout. Sally wasn't sure if she was going to like it, but she knew she liked *David*, and that was the main thing that mattered to her.
Later that night, she lay awake, staring at the ceiling, thinking about David. About how nice he'd been on the phone. About lunch. *Had* he been really nice, or had she just forgotten what talking to a nice person was like? The thought was a little depressing to her, so she dismissed it as quickly as it came. No, he *had* been very nice to her, she concluded. He was a great lunch buddy.
***
David checked himself in the mirror and pulled a face. He wet his hand in the sink and tried to smooth over a rogue curl in his otherwise silky smooth, brown hair. As he let go, the stupid thing bounced back up, and he quickly admitted defeat. *Fine*, he thought to himself with a kind of confidence that he didn't normally seem to possess. *This day will go great either way.*
Sally had suggested a place that he'd never been to this time around, a place that--from the images online--looked to be a small restaurant with a large outdoor seating area. For a moment, he thought to himself if maybe she picked this place because it looked romantic.
He shrugged off the thought as a notification made his phone vibrate in his pocket. For a second, he wondered if this was Sally canceling their date-- lunch meeting-- *friendly hangout session*.
It was, indeed, Sally. Evidently, she hadn't messaged him to cancel, though.
The little banner notification at the top of his screen captured the start of her message: *been deliberating. do you mind if we go to the thai place i talked abo...* David chuckled to himself as he tapped the notification. She'd already presented him with about seventeen choices last night, asking him which one *he* would choose. What was up with that girl?
*Whatever you want*, he texted back. Damn it, did that sound too disinterested? *You're choosing today*, he added. He liked the idea of doing what Sally wanted. Of seeing her happy. Of *making* her happy. Why was he so into her all of a sudden?
*damn it*, she texted back. *reading online now that the thai place is closed, nvm*.
Fair enough.
***
David looked around the big seating area to spot Sally, sitting at a far table for two, awkwardly waving at him. He waved back briefly and made his way over to her. Sitting down at the table, he asked sarcastically, "Is this the place you want to eat, or should we check out some others instead?"
She pulled a tiny frown and rolled her eyes. "Shut up."
They continued bantering as they ordered food and until after their drinks arrived. This seemed to be their rapport now: Making fun of each other over drinks and varying cuisine. It was good. No, actually. It was *great*.
While eating his burger (and fries with mayonnaise, of course), he looked up to meet Sally's eyes for a quick moment, who smiled back before returning her focus to her own burger, also with fries and mayo. And ketchup. *And* barbecue sauce.
Jesus Christ.
He continued looking at Sally for another few seconds, studying her features, taking in her eyes, which were nestled neatly between the rims of her glasses and below her long, blonde bangs. It was warm today, and Sally was wearing a flowy, bright top and a short, blue skirt that looked like she'd just bought it the same day.
Sally looked back up at him. "You know," she began. "I've really been enjoying our dates."
*Our dates*. Did she mean their lunch meetups? Or did she really mean *dates*? He gave her the benefit of the doubt, because for him, too, it was difficult to come up with names for this... arrangement.
"Me too," he shot back before stuffing a couple of fries into his mouth. After he swallowed, he raised an eyebrow and asked: "Dates?"
She looked back up at him and smiled. "I mean, if you like. We're eating, we're talking, we're... having fun." She paused. "Isn't that what a date is?"
David let what that sink in for a moment. He looked at her and smiled. Of course, he admitted to himself, he'd been *hoping* that these were proper dates. And sitting across from Sally, right here, right now, *knowing* that she also thought of them as *dates*... it made him feel a sort of happiness that he hadn't felt in a long time. He quietly smiled to himself and looked down at his plate again, stuffing another handful of fries into his mouth.
***
As she arrived home and unlocked the front door, Sally realized that she'd been thinking about David, and David alone, for the last few days. Whenever she watched TV and saw a cute scene, she thought of David. When chatting with her friends about their relationships, she thought of David. And, yes, she admitted to herself, she'd also thought of David while touching herself. Once or twice.
But that wasn't bad, she concluded. In fact, she accepted all of it as what it was: A sign that she really liked David. She smiled to herself as she went up to her room, throwing her jacket onto a chair in the corner.
She let herself drop backwards onto the bed like a brick and pulled out her phone, holding it over her head. She opened her message thread with David and typed the words *Today was fun.* Then, she followed up with another message: *I really like you, David.*
This was, for the first time since Sally could remember, something she was absolutely certain about. She didn't have to think twice before sending those messages. She didn't even *want* to think twice about them, because it was so unusually clear to her. She liked David, and there would be nothing she could tell herself, no question she could ask herself, to change that.
Before he even read the message, Sally moved into her contact list with a few quick swipes, scrolling down to the entries that started with the letter J. *J*, as in *Joey*, of course. She tapped his name and immediately felt a weird sense of unease, a dread that she'd always felt when she had to think about him. She scrolled down past the phone numbers and his address until, right there, in the center of her screen, was a big red button with a trash can icon and the word *Delete* next to it.
She thought of the lunches with David again, the way he stuffed fries into his mouth. The way he snickered when she asked the waiter for three different condiments. The way his smooth hair dissolved into more and more curls the longer he was outside in the dry summer heat. The way things seemed so *easy* with him. All of a sudden, the dread that Joey's name brought up in her vanished, just like that.
And then she pressed the button.
As she watched Joey's name slide off-screen in the contact list, all the other J names shuffling up and down neatly to fill the gap, a banner notification came down from the top of her screen. It was David.
*I like you too, Sally. Really like you.*
Another notification came down. *Lunch again tomorrow?*

View file

@ -1,190 +0,0 @@
---
layout: blog
title: 🎉 Vince, a Party and Brandon
description: "Vincent is an anxious introvert who is desperate to find a guy to have some fun with. At his best friend's party, he gets the chance to do just that, but his anxiety threatens to screw it all up."
tags: [Short Stories]
book: true
mature: true
reedsy: https://blog.reedsy.com/short-story/48z252/
discuss: https://twitter.com/Ellpeck/status/1419838270909865985
---
After dreading it for multiple hours now, it was finally time for Vincent to read the messages that his friend had been blowing up his phone with. It was a little difficult for him, because the conversation that he'd anxiously, but silently, opted out of was regarding the party that Myra was throwing later today. Vince rolled over in his bed and reached blindly for his phone, which he was sure had fallen onto the ground at some point in the afternoon. Unlocking it, he was immediately bombarded by about thirty-seven thousand messages from his friend.
**are you coming tonight**
**hey, stop ignorign me**
**read my messages you cheap ass**
He groaned and rolled over again, kicking the blanket onto the floor with his feet. For a moment, he considered just saying no. But he wasn't going to let himself give up that easily. Not again.
*i dont know ok*
*youre just gonna talk to someone else*
*and ill be all by myself*
The little tick marks turned blue, and his face followed suit quickly when his phone began to vibrate violently in his hand. A call? Really?
"If you don't come, I will literally cry, Vincent. What the fuck am I going to do without you?"
Myra genuinely sounded a little annoyed, but Vince knew this game: She'd pretend to be pissed at him for a minute until he started feeling genuinely bad, and then she had to explain to him that she was just joking, like always. It was less of a game and more of a *Myra being a normal friend while Vince stumbles around his inability to be a functioning person*. So, pretty much like always.
"Damn it, Vince, you know I'm not being serious, right?" There it was. "You're the only person who it's fun to drink with."
Admittedly, he *was* pretty fun when he managed to leave his anxiety behind at the bottom of a glass. And drunk Vince and drunk Myra would always start deep, meaninglessly meaningful conversations that made them think deeply and then cackle embarrassingly again and again.
And if he said no to this party, he would've not only denied his best friend, who was there for him pretty much constantly, but he'd just have to have another sad Saturday night consisting of chips, memes and maybe a, uh, *fun toy* and some porn. Admittedly, that sounded a lot more fun than some jock-infested party.
"Look, listen," Myra began after enduring the awkward silence for longer than she reasonably should have. "There's this guy coming to the party who is really sweet, and he looks pretty cute too. Dan even said that he might be, you know, *a top*, and I know how desperate you've been for that sort of thing recently."
Damn it. Why did Vincent tell anyone anything, ever?
"Why do I tell you anything, ever?" He half-whispered into his phone and sat up into a surprisingly graceful cross-legged situation and picked up the dildo that he spotted at the foot of his bed. He really had to take better care of his belongings.
"I'm not sure. It's weird. But no judgement, babe. I know what it's like."
"You literally just said that it's weird, how is that *not* judgement?"
"Listen. Are you coming or not? I'm not going to spend the rest of the evening getting your sad ass laid."
Vince rolled his eyes and sighed, deliberately loud enough for her to hear it clearly.
"Stop rolling your eyes at me. Yes or no?"
She knew him too well. He looked at the toy in his hand and fondled it a little. *Non-sexually* fondled it. He really *did* want to do stuff with a guy again, but he also quite enjoyed the idea of not having to go out and meet new people.
"Fuck, fine," he said and flopped back onto his back. Goddamn it.
"There we go," Myra exclaimed loudly and immediately hung up.
There we fucking go.
***
Myra's party turned out to be happening at a different house that apparently belonged to a friend of hers or something. Vince was kind of relieved, as Myra's apartment didn't feature a lot of space to hide from sweaty crowds of drunken people in. The night was unfurling as people around him started showing clear signs of a buzz, and of course, Myra was absolutely nowhere to be found. Great.
In his frustration, Vince decided to sit down on one of the chic living room sofas that were very clearly too expensive to house his poor ass. Nevertheless, it seemed to invite him to take a little break from the crowds and the anxiety and just *breathe* for a second.
If he was being honest with himself, Vincent wasn't at all interested in this party or the people at it. He sipped his drink tentatively, a vodka and coke that tasted more like a vodka and vodka with a side of coke, and looked around the bustling living room. Not only had Myra seemingly disappeared, any other people that he may know and be able to interact with were also nowhere to be found. And while this meant that there were *also* no people around that he might want to run-away-slash-hide from, it was still kind of a bummer to be wasting his night at this place and still sit around alone.
A few more minutes went by, and Vince started spotting one or two people that he *did* know, but none of which he wanted to talk to. There was a guy that he'd briefly hooked up with at another one of Myra's parties about a year ago (he was one of the "straight, but I have needs, too" guys), and there was a girl who had flirted with him a lot before Vince found out that he was, in fact, not at all interested in her or her gender. They'd still continue talking every now and again after that, but it seemed to Vince like she'd only been interested in him as a potential romantic (or sexual) partner, which was fair enough.
Myra finally reappeared by tapping Vincent on the shoulder from behind the sofa. She was radiating confidence and also, maybe, probably, a slight bit of drunkenness. Those tended to go hand in hand for her.
"Hey, stranger," she said to him as if they hadn't talked for, like, months, and not literally less than half an hour.
"Is this a rickroll situation, and you just forgot the actual lyrics, or what's going on with you?" He said to her with a snarky grin.
"Shut up," she said, jumped over the backrest and landed on the soft, brown leather beside him. She came a little closer and tilted her head to whisper into Vince's ear.
"Okay, listen. Brandon is here," she said.
Vince made one of his famous faces. "Who the hell is Brandon?"
"The guy I was telling you about! The cute one with a dick that isn't made of silicone?"
Ah, yes. The human dick man.
"Couldn't you guess from the *name*?" She laughed. He did not.
He chose a smooth "How much have you had to drink?" as his reply and then pushed her head off of his shoulder. "Where is he?"
"He's, uh..." She narrowed her eyes and began to investigate the crowd.
"Right there!" She exclaimed and jumped up from the couch. "Go to him! Come on!"
***
Brandon was, in fact, quite cute. Actually, Vince might have been drooling over him just a tiny bit while waiting for Myra to resurface earlier, even before he knew that he was the cute, gay friend in question. Well, he might have been bi or pan or something. That wasn't important right now.
What *was* important right now was getting Brandon out of the hot tub and into one of the spare bedrooms. Why was there even a *hot tub*? Had someone taken this house from a high school movie? Though, in the hot tub's defense, it did allow Vince to see Brandon's not-quite-chiseled chest and his not-so-short hair that was flowing over his surprisingly broad shoulders. He hadn't quite decided if he found Brandon cute or hot yet, but he *had* decided that he would quite enjoy spending some more time with him to figure it out.
Vincent, being the perfect-at-social-interaction smooth talker that he was, stood in front of the hot tub like an idiot, just staring at Brandon's beautiful fucking face. How did humans do that *speaking* thing again?
Brandon turned around and saw Vince standing there like an idiotic statue. He looked at him for a second and then turned to jump out of the hot tub gracefully, with little streams of water running down his chest and over his abs and dripping off of his Bermudas. That's just what water usually did, but it looked fantastic on this guy. Of course.
"Oh hey," Brandon began, to Vince's absolute surprise. He tried to snap out of his continued statueing and blinked. "You're Vince, right? Myra told me all about you."
"Yup, yea, that's... that's me. Hi." He stood there awkwardly, debating whether he should extend his hand? Go in for a hug? No, he was dripping wet. The--- *Brandon* was dripping wet. Yes.
Not too long after the most awkward thirty-five seconds of his life, Vince found himself sitting next to Brandon on a bed in a room that Vince was pretty sure was at least twice as big as his own apartment. Brandon had, despite Vincent's wordless disapproval, towel dried himself off and put on a shirt.
After staring at each other for a few seconds, their thighs rubbing together on the bed, things started going pretty fast. Brandon took of Vince's shirt and then his own, and Vincent started making use of his free hands to feel Brandon's rather muscular body. Brandon took off his Bermudas and they both realized that he was not wearing anything else underneath, revealing his rock hard---and very human---cock. Vince also took off his pants after struggling with his belt buckle for an embarrassing amount of time, and then he found himself laying on his back with Brandon's chest pressed against his, their cocks rubbing against each other. Brandon got up from the bed and grabbed Vince's legs, pulling him towards the edge of the bed.
Vincent knew where this was going, and he really, *really* wanted to like it. But as Brandon was pulling Vincent closer to his throbbing cock and bending his lower legs to rest them on his own shoulders, some sort of switch flicked inside Vince's head. Yes, of course he wanted to have his brains fucked out by a hot guy. By *this* hot guy. But he didn't want it right now, like this, so fast and without a single question asked.
Brandon was fumbling with a condom wrapper and Vincent quickly decided to use the moment to slide up a bit towards the head of the bed, taking his legs back and starting to hug them.
"Can we," He began. "Can we slow down a bit? I don't think I'm ready for that yet." Vincent frowned and looked at Brandon, whose expression was unreadable to him.
"What?" Brandon asked, still expressionless. His tone wasn't aggressive, but it wasn't all that calm, either. Had Vincent said something wrong?
"I thought this is what you wanted. That's what Myra said!"
What the fuck? Was Myra, his best friend, just going around telling random guys that Vincent was desperate to be *fucked* by some stranger stud?
Vincent started breathing heavily. It took a second for him to start speaking, but then he did. "Oh, and you just signed the fuck up right away, didn't you? Just ready to fuck some random guy and then never talk to him again? Is that what you do every weekend?"
Brandon frowned and closed his eyes. He sighed. He didn't say anything for a solid thirty seconds, which gave Vincent plenty of time to develop his famous instant regrets. Even if Brandon *was* that sort of guy, what did it matter to Vince? He *was* a little desperate to be fucked, and this stranger seemed a hell of a lot better to him than any of the other strangers at this party. And Myra had said that he was *sweet*, too. Maybe something could have happened here. But he just ruined it, officially and irrevocably. Right?
"Fuck," Vincent began again. He shook his head slowly and frowned. "I'm sorry, that came out wrong."
Brandon just stood there. "It did, didn't it?"
Then he walked away.
***
When Vincent trotted slowly down the stairs, the party was still in full swing, and he absolutely hated it. Not only were there a million humans that all reeked of alcohol and just generally existed, which was usually bad enough, Vincent had also ruined a very good opportunity to have sex with a very hot and, according to Myra, very sweet guy. A guy whom, even after looking around the living room and the kitchen, he wasn't able to find anywhere.
This was, as Vincent told himself, the perfect time to give up. Find Myra, say goodbye, and head home to his bed and his stupid toys. He didn't deserve human dick anyway, because all he could do was *be* a human dick.
If he talked to Myra right now, all she'd tell him would be to stop wallowing in self-pity and do something about the problem or some crap. Maybe she'd instruct him to find Brandon, or find some other guy, or apologize through text because she probably had his number, too. But Vincent wasn't ready for rationality right now. Being mad at himself felt good, in a fucked up way. And maybe it had its purpose, or at least that's what he began telling himself as he was walking outside to check the hot tub for any signs of the guy he'd just hurt for no reason.
Brandon was, in fact, in the hot tub. He sat there with his hands by his sides, less happy and less confident than the first time he saw him here.
Vincent slowly walked up to him. He closed his eyes for a second and started feeling sick to his stomach. If he was going to leave, he should leave *right now*. But that's what he usually did, and he wasn't going to mess this up again. He wanted to give this guy a chance. He wanted to give *himself* a chance, too.
"Hey, uh, Brandon?" He said and Brandon turned around. He narrowed his eyes as he looked into Vincent's. "Can we talk?"
***
Vincent and Brandon were sitting on a log bench at the far side of the unreasonably large backyard.
"Fuck, I'm so sorry," Vincent said apologetically, again. "I just... I thought about something stupid and then I snapped. I really didn't mean what I said."
Brandon looked at him and frowned, his eyes twitching back and forth between the ground and Vincent's face.
"No, you were right, man. I should have asked if you wanted to do the stuff we did. I was too fast." He didn't sound disingenuous. If anything, he sounded like he was mad at himself.
"I *did* want to do the stuff you did. I really wanted to. I *still* want to." After saying that, Vincent decided it was probably time to shut up. Was he being too vulnerable or honest now? Was Brandon just going to walk back to the hot tub, or go inside and fuck any of the twenty other cute guys that were less of an emotional mess than Vincent was?
Brandon chuckled and smiled.
"Okay," He said. "Let's do it, then."
"Wait, really?" Vincent blurted out and raised his eyebrows to the fucking sky.
"Yea. I still want to, too. Plus, I haven't really gotten to take a proper look at your ass yet."
"Hey now, I'm not *just* an ass, Brandon." Vincent said and smiled.
"So far, you were," Brandon whispered into his ear, and Vincent knew that it was true, but he wasn't sure if this was Brandon dirty talking or just... telling him how much of an ass he was.
It didn't take long until he found out, because Brandon turned Vincent's head towards his own.
"Can I make out with you?" He asked quietly and bit his lip.
"Yes," Vincent replied with a grin, and he kissed Brandon on the lips and didn't let go.
Eventually, their tongues were intertwined and only momentarily separated as Brandon made sure that he was doing everything exactly as Vincent wanted him to. They went slower this time, but still did all the things that they'd both wanted to do.
When they were done, they were both sweaty and out of breath. They cleaned themselves (and the bench) up with some tissues that Vincent found in his back pocket and kissed a final time before walking back towards the house-slash-mansion together.
Vincent looked at Brandon, who was walking next to him, and quietly said a genuine, vulnerable "Thanks."
Brandon looked back and chuckled. "It was fun." He said. Then he came a little closer.
"Hey, Vincent," He began. "Can I take your hand?"

View file

@ -1,91 +0,0 @@
---
layout: blog
title: 📚 My Favorite Reads of 2021
description: I've been using 2021 to read some more again. As it turns out, there are quite a few really good books out there. Here are some of my favorites I read in 2021.
tags: [Reading]
mature: true
discuss: https://twitter.com/Ellpeck/status/1467156754194653191
---
2021 has been a rough year. For all of us. I decided to use it to do some more reading again. This is a list of some of my favorite books I read this year. As you'll be able to tell pretty quickly, my main interest is very gay romance books. *What a surprise.*
I compiled this list by going through my [StoryGraph](https://app.thestorygraph.com/profile/ellpeck) 5⭐ reviews and picking the ones that I thought it would be most interesting to talk about. There won't be many, if any, spoilers, but I'll definitely be summarizing the plot of these books in this post and putting a few funny quotes. These also aren't in any particular order, either.
# 🪲 Boyfriend Material, by Alexis Hall
[Boyfriend Material](https://app.thestorygraph.com/books/4ecc34c0-04e1-420f-a303-2a900063397e) was the first book written by Alexis Hall that I had the pleasure of reading. And I found out pretty quickly that he is an absolutely *fantastic* author. His writing is incredibly funny, but also deeply emotional and touching in certain places. It's an amazing mix.
Boyfriend Material is about two guys who have absolutely no business falling in love... falling in love. Luc works at a charity for some sort of beetle that has (surprisingly) little significance in the story, and Oliver is some sort of fancy lawyer-type person. Luc's friends are incredibly funny (not just their personalities, but also the way they're presented), and the way that Luc and Oliver interact is delightfully embarrassing, but also incredibly cute.
There's also two characters called James Royce-Royce and James Royce-Royce. I promise I'm not making that up.
> I met James Royce and James Royce (now James Royce-Royce and James Royce-Royce) at a university LGBTQ+ event. In some ways, its strange the two of them work so well together because their name is pretty much the only thing theyve ever had in common.
The book is a great first step in discovering the amazing, witty and hilarious writing of Alexis Hall. There's at least three of his other books that I'd love to talk about here. I promise I won't. But actually, I will. Two more of his books are coming up.
# 🚇 One Last Stop, by Casey McQuiston
[One Last Stop](https://app.thestorygraph.com/books/28386517-30cc-4ce4-bb90-9336c370a9dd) falls into a genre that I usually can't quite get myself to enjoy: Somewhat far-fetched science fiction. I'd previously read one of Casey McQuiston's books, namely [Red, White and Royal Blue](https://app.thestorygraph.com/books/d9b32ad2-41d2-4663-a19c-f65ffc7b0091) and absolutely adored it, and so I thought it was a good opportunity to discover some more of their writing.
One Last Stop is about a girl, whom I will refer to exclusively as Coffee Girl, who moves to a big city and immediately falls in love with a girl she meets on the train, whom I will refer to as Subway Girl. There's a bit of a problem, though: Subway Girl is *not from this time*. Spooky. She's actually stuck in the train due to some sort of time... problem that I shan't go into because, to me, it is very far from the most interesting part of the book.
What I enjoy most is the way that the main character struggles with this issue, and the way her emotions are depicted, not only in relation to Subway Girl, but also in relation to her hilarious queer friends, her chaotic and possibly not-very-good mother, and the ever-present dread of having to go to University instead of hanging out with the girl on the train for all eternity.
> “I swear to God, if a ghost kills me, Ill haunt the shower,” Wes says. “You guys will never have hot water again.” “We dont have hot water now,” August points out. “Fine, Ill haunt the toilet.” “Why do you want to haunt a bathroom, man?” Isaiah asks. “Its where people are most vulnerable,” Wes says, like its obvious. Isaiah frowns thoughtfully and nods.
Please read this book, *especially* if you enjoy the sci-fi aspect more than me. Which I'm sure you do, given I ignored it as best I could.
# 🕍 Jews Don't Count, by David Baddiel
[Jews Don't Count](https://app.thestorygraph.com/books/e13bcb3b-a0ea-474e-8259-e55d1b0fe4ef) is the only non-fiction book on this list, because it turns out that I enjoy fiction far more, given it's usually a lot less depressing.
Now, I'm not jewish. I feel the need to point this out right off the bat because I'm not a big fan of talking about political problems that I don't have any personal experience with. That being said, I *am* from Germany, and the troubles surrounding antisemitism have been absolutely drilled into our heads as schoolchildren. Even moreso did it make me feel very uncomfortable about my own observation skills, as well as my own (lack of) political interest in this topic, that this book proves that antisemitism goes mostly ignored when it comes to debate around racism, religious freedom and cultural identity.
If you want to educate yourself on political topics that you don't have much personal experience with (as you should!), Jews Don't Count is a great read. It's aimed at leftists like me and probably you, and it aims to shine a light on the way that antisemitism is treated in the Western world in the current times. As it turns out: It's treated very poorly. The book, however, treats the topic it's about with respect, brings up a lot of current day examples to illustrate the issues, and is only about 150 pages long, making it deliver a very quick, but also very powerful, message.
# 🎂 Rosaline Palmer Takes the Cake, by Alexis Hall
I've talked about Alexis Hall before. In fact, it was this very blog post. Just... a few minutes ago, actually. But here I am, yet again, talking about his absolutely brilliant writing.
[The book](https://app.thestorygraph.com/books/bbac9ac1-8d25-4413-8cbd-acb82e79cb67), whose title is far too long, is about Rosaline Palmer, a bisexual single mother who makes the terrible (but great) decision of joining what is essentially a not-so-trademarked version of the British Bake-Off, only with exactly the same amount of chaos and hilarity. When that isn't currently the main thing messing up her life, it's also about her relationship with a very, uh, *lovely* man, the relationship with her daughter, and the relationship with her excellent and sexy friend Anvita (her words, not mine).
Here's a lot of quotes, because *Jesus Christ, this book is funny*. But also very real. I'm not quoting the real parts, because they're not as funny. But it gets very emotional, and very "there's a lot of problems with the way bisexuality is perceived by straight people", and very "life is hard sometimes". But this is just some funny parts. Don't wanna bring you down.
> Grace Forsythe tried to give her a reassuring look from the opposite side of a cake that was rapidly turning into a landslide. “Its fine. Ill just stand here holding it for the rest of my life. You can tell the judges Im an especially elaborate fondant decoration. Which, now I think about it, is what my ex-girlfriend used to call me.”
> To her horror, she was actually crying. And the next thing she knew, Grace Forsythe was gently removing the spoon from her hands. “Fuck shit piss wank bollocks drink Coca-Cola buy Smeg ovens legalise cannabis abolish the monarchy. Oh sorry, did I ruin the segment? What a shame. Maybe go film someone else for a bit.” The producer and camera operator dutifully departed. Rosaline drew in a shaky breath and wiped her eyes. “God, thank you.”
Hi Alexis, if you're somehow reading this: I am *begging you* to make a second book that is just about Grace Forsythe and her life. Please. I'll do anything.
# 🏨 Act Your Age, Eve Brown, by Talia Hibbert
Talia Hibbert is also one of my favorite authors. She writes brilliantly about diverse people, be that sexuality, race, personality or illnesses. Out of the three Brown Sisters books, [Act Your Age, Eve Brown](https://app.thestorygraph.com/books/8a97c89d-1436-4563-bc1f-e44836a750b9) is by far my favorite.
Act Your Age, Eve Brown is about Eve Brown, who stumbles into a... hotel-slash-inn ran by a particularly charming, but also (to her) extremely irritating, young man named Jacob. As it turns out, Jacob doesn't quite like Eve either... *at first*. If you know what I mean.
The book is written from both perspectives on a per-scene and per-chapter basis, and it is a fantastic read. The relationship between the two main characters is hilarious, and with Eve actually *getting a job* from the very guy whom she *ran over* with her car (yes, really), it is quite the rollercoaster, to say the least.
Also, the writing is hilarious. Just look.
> Jacob Wayne was never screwed. Well, not like that—obviously he was sometimes screwed in other, better ways. Although not as often as hed like, but—you know—ah, fuck it, never mind.
> There was that voice again, strange and yet familiar. His mind was hot and sticky like fudge. Yum, fudge. Was this a guest, maybe? A yummy, fudgy guest? Fuck. No lying around in the street in front of guests. It was inappropriate and irresponsible and very bad business.
Yum, fudge.
# 🔎 Murder Most Actual, by Alexis Hall
[Murder Most Actual](https://app.thestorygraph.com/books/3f146f4d-136e-4c75-9cd7-4bdd50aa25b3) is the last of these books I read. It's by Alexis Hall, whom you may have heard of from the last seventeen thousand times I talked about him. He's brilliant, blah blah blah, you've heard this already, but what you haven't heard yet is the fact that I downloaded an e-book from a site I'd never used before, made an account and everything, and then painstakingly shoved it onto my Kindle, so I could read it. As it turns out, it was worth it. Very. In fact, this is probably his best book yet. Maybe. I'm not sure.
Murder Most Actual is about murder, but in a most actual way. Yes. It follows a couple of lesbians (as in "a lesbian couple", not, like, 3 stray lesbians), because everyone in Alexis Hall's books is gay (which is not criticism, it's exactly the way I want it to be), as they arrive at a hotel that is hosting a fun murder mystery dinner. The only problem is that it's not so much a murder mystery dinner as *multiple murders*, *multiple mysteries* and an ever-growing shortness of dinner. Over the course of the book, the relationship between the two main characters redevelops into something absolutely adorable, and they also solve the murders. Somewhat. With the help of a particularly disgruntled police guy, who I think should also get his own spin-off eventually.
It's also, and I know I'm starting to sound like I'm repeating myself, *incredibly funny*. Getting these quotes onto my computer was an absolute nightmare, by the way, becasue the notes and highlighted sections from my Kindle don't sync with my computer because it's not a... proper Kindle... Amazon... book. Thing.
> Liza was suddenly aware of an absence at her side as Hanna stepped forward to join the free-for-all. “Just a wacky, out-there suggestion somebody might want to jump on. Could we, maybe, call the police?”
> Now Sir Richard was looking genuinely crestfallen. “You know, between the two of you, youre almost taking all the fun out of this.” “Out of the dead man?” Hanna clarified.
> Neither the professor nor the killer had been courteous enough to wear shoes that were notably large or small, or characterised with a distinctive tread, or perhaps conveniently embossed with the name of a manufacturer who only ever made three pairs of shoes a year for a very select list of clients.
Also, I love Hanna. Just wanted to say that. *Also*, each chapter has a fun Clue(do)-style title with a person, and an object, and a location. It's great. I love it.
# So Yea,
I think the main thing we learn from this list is that I love romantic fiction, and I love Alexis Hall. I'm sorry, it's just all so good.
Anyway, I hope this post was interesting to at least a small subset of you. I know that this isn't what I regularly talk about, and this post contains a surprising lack of programming-related things (there you go, now it contains programming-related things, sort of), but reading is also something I really enjoy doing. Although I do have to admit that I'm not very good at doing it consistently.
Either way, thanks so much for reading, and if you're Alexis Hall, please write more books. No pressure, though.

View file

@ -1,64 +0,0 @@
---
layout: blog
title: 💻 Your Minecraft Modding Questions, Answered
description: I asked yall to send me your modding and programming questions on Twitter and Discord, and in this post, I try to answer all of those.
tags: [Minecraft, Featured]
discuss: https://twitter.com/Ellpeck/status/1373660751060160512
---
Hi, I'm Ellpeck. I'm the creator of a bunch of Minecraft mods, including Actually Additions, Nature's Aura and Pretty Pipes. A while ago, I also started taking [commissions](https://ellpeck.de/commissions), so the list of Minecraft mods I've created is slowly, but surely, growing.
I asked all of you on Twitter and in [my Discord server](https://link.ellpeck.de/discordweb) if there are any modding and programming-related questions you'd like me to answer. Since most of the questions yall ended up asking were related to Minecraft modding, I thought I'd make the post exclusively about that after all. It also means that you might find this post interesting even if you don't program or make Minecraft mods yourself, because the questions ended up being pretty general.
Here goes.
# How do you keep yourself interested
> ...in an idea or project, so you won't abandon it after two days of enjoying it? (canitzp)
Hahaaa. I really wish I had an answer for that. I have *countless* abandoned projects, as do most people that work in creative fields in some capacity. I recently made most of them public on my [GitHub](https://github.com/ellpeck), so if you go there and scroll back far enough, you'll find some old games and unfinished mods.
So how *do* I keep myself interested? After all, I've made and finished a bunch of stuff. Since I suffer pretty massively from depression and anxiety, it's especially hard for me to commit and pull through on anything, really. However, there's a huge thing I've learned: If you start losing motivation for something, *don't* try to fight it. If you do, you'll just force yourself to work on the project without actually being interested, causing you to burn out with it even more. Instead, accept that you're losing interest and move on to something else. While the first strategy has lead me to abandon projects entirely several times, the latter only caused me to take fairly long breaks, but so far, I've always returned to projects that I didn't try to push myself to work on.
# Good tips before diving into modded Minecraft?
> (Afkman57)
I'm not sure if you mean *playing* modded Minecraft or *creating* mods, so I'll just answer the question for both!
Before diving into *playing*, I think it's really important to know what you're getting yourself into, because expectations can pretty drastically change your experience of things. (Most) Minecraft mods are *not* commercial products, and they *don't* have quality control. Authors don't get paid for creating mods, and they don't *owe* you anything just because you downloaded their mods. I think this is very important to realize because I've interacted with so many people before that think if you download a mod, it's like you're buying a product with the promise of life-long support. If something breaks in a certain way, or something works in a way that you dislike, but the mod's author doesn't agree with what you see as a problem, they have *no* obligation to change it for you. On the other hand, modded Minecraft can be *incredibly* fun. With well-made mods, there is so much new stuff to discover and create that it feels like you got yourself an entirely different, new game.
Before diving into *creating mods*... well. The most important piece of advice I personally have for you is: **Learn the language first**. If you're creating mods for Java Edition, *please* have at least a basic understanding of Java first. The first time I tried my hand at programming was for a Minecraft mod (Actually Additions' sort of roots, actually) and it went horribly, because I didn't understand what was part of the language I was using and what was part of the rather complex Minecraft and Forge API. For example, because Minecraft makes heavy use of method chaining[^1], when I first started out, I used to think that that was just an inherent property of the language (which obviously makes very little sense). I don't know if that was just me being a bit slow, or if that's the kind of misunderstanding that comes from not really learning a language before diving head-first into a project that uses it.
# Maybe some good guidelines
> ...on code-format or even conventions for forge-modding. (Afkman57)
Oh boy. Talking about conventions is always a tough one, because people disagree so fundamentally on what is good code and what isn't. A great example was when I learned that, in professional software engineering, early returns[^2] are apparently considered "bad practice" because they "decrease readability." How decreasing the amount of nesting (and thus, the amount you have to scroll to the right by) also decreases *readability*, when I think it massively *increases* readability, I'm not sure. Maybe that was just my software engineering professor having a field day, though. I really hope it's that.
When it comes to programming in languages that don't *rely* on formatting for their syntax (like Python), the actual formatting you use doesn't matter, even though some people might have you believe that it's *extremely important* to put opening braces on a new line. For me, the only important thing is that **you keep it consistent**. If you use an IDE, your best bet is to configure its auto-formatter exactly the way you like, and then using the format button every now and again (or even turning on format on save!) to make sure that, no matter how horrible your formatting is, at least it's consistently so.
# Any useful tools, resources, utilities etc.
> ...for modding would be good too. (Afkman57)
I think the best, and most important tool, for modding, and any kind of programming, is a git server, be it GitHub, Bitbucket or whatever else. Source control is amazing, because not only does it allow you to see exactly what you (and your colleagues) changed an when, but it also allows you to revert any of your changes or merge them together.
The other very useful thing about git websites like GitHub is that you can *look at other people's code* and take it as an implicit sort of tutorial. There are countless times where I looked at the code of other, bigger mods in an attempt to find useful information on how to realize certain things in my own mods. In the very first version of Actually Additions that had [Laser Relays](https://ellpeck.de/actaddmanual/#laserRelays), they were pretty much an exact copy of [Immersive Engineering](https://www.curseforge.com/minecraft/mc-mods/immersive-engineering)'s wire system, in terms of their inner workings. When you look at and especially copy other people's code, though, make sure of two things:
- *Understand* the code you're copying. If you don't understand it, you might as well just be mindlessly copying random code from random places.
- Keep the code's *license* in mind. Some licenses allow you to copy code freely, some require you to give credit and some don't allow you to copy any code at all. Even if a project allows you to copy code without giving credit, it's always good practice to do so anyway.
# How much work did it take to make Actually Additions
> ...from start to finish? Also how long did it take you to go from an idea to a first "prototype"? (Spo0ok)
This is an incredibly tough question, because of course I didn't record an exact measurement of how many hours I sunk into creating Actually Additions. What I do know, however, is this: It look *a long time*. Actually Additions was one of my first mods, and as previously discussed, I was not very good at any kind of programming when I started out, so I made al ot of mistakes, and I copied a lot of code without understanding it. That being said, I can give a rough estimate based on data that I already discussed in my [post about its features](https://ellpeck.de/blog/actually_additions).
The first file I uploaded to CurseForge was [this one](https://www.curseforge.com/minecraft/mc-mods/actually-additions/files/2229705), on *March 15, 2015*. I know that, before I started uploading the mod to CurseForge, I had a Minecraft Forum page (it was still that time in 2015), and I would release early versions of the mod on Mediafire or some other site. That wouldn't have lasted that long, though, and looking at the commit history for the mod, the first time I referred to it as Actually Additions wasn't long after the repository was first created, [in March 2015](https://github.com/Ellpeck/ActuallyAdditions/commit/2a2308c0ce35fe8a5ac9dcea100b9aeb941c495a). I made my last real contribution [in June 2017](https://github.com/Ellpeck/ActuallyAdditions/commits/main?after=896a082d747a3e19755ded1973544d59fa992787+244).
That means, to create all of the features that the mod currently has, it took me about two years. I know that measurement is pretty reasonable, because I took almost no breaks when I first created the mod. This information also means that I have now *not* worked on the mod for longer than I originally *did* work on it. It's been like that for a long while actually, because 2017 is surprisingly far in the past. That's honestly kind of scary. I'm getting old, aren't I?
---
So yea, that's about it in terms of modding-related questions. I hope you found this post enjoyable. If you did, and if you have more questions for me to answer, you can always reply to the discussion tweet linked right at the end of this post, and if there are enough additional questions, I might make a second one.
Anyway, thanks for reading! ❤
[^1]: Method chaining is a concept that is used in a few languages, but especially Java. The idea is that, when you create non-static methods that change certain properties about an object, you make the method return *the object itself*. This allows for multiple method calls to be done in one line, which is especially useful when creating a system where you apply a bunch of settings to an object. `new Block().setHardness(3).setLightLevel(15);`
[^2]: Short-circuiting out of methods using `return` instead of having a bunch of nested checks

View file

@ -1,143 +0,0 @@
---
layout: blog
title: ❤️ Em & Ben
description: Ben hates public gatherings because he suffers from anxiety. He's also in love with his best friend Emily, who frequently tries to drag him out of his shell. At the spring festival, he has a panic attack. Will Emily manage to support him?
tags: [Short Stories]
book: true
reedsy: https://blog.reedsy.com/short-story/n20s94/
discuss: https://twitter.com/Ellpeck/status/1374770369169653767
---
# Chapter 1
There'd never been a day quite like Tuesday, February 17. It was a warm, spring day, and the newly awakened sun was warming Ben's freckle-ridden face. He didn't know it just yet, but this would be the day that Ben would almost die. Well, that's the way he'd think of it *afterwards*, anyway.
The park was unusually packed with people, and for a second, Ben debated whether turning back was a good idea after all. He'd had these thoughts a lot recently; wanting to just turn back and run away from things. He ran a hand through his long, silky hair and turned around. *Damn it*, he thought, before he snapped back to facing the center of the park. *I have to do this.*
From afar, he could just about make out what was going on around the large fountain. The water was splashing out of what he'd always just assumed to be a large fish, though he didn't have the ability to tell for sure, because the fountain was old and rugged and had probably been just-about-fixed one too many times before. Ben squinted a bit before raising his glasses in an attempt to make out the faces of the people he saw, sitting and standing around the fountain, talking. He was looking for his best friend, Emily. She was really the kind of person that would drag him to outings like this; public gatherings and any sort of parties were terrifying to Ben. It was natural then that he would find a best friend that is his absolute polar opposite: Popular, blonde and, of course, an absolute party animal. *Damn it, Em, where are you?*, he mumbled to no one in particular.
He started approaching the fountain and the square around it. Several small crowds of people were standing around little stalls that emitted vastly different smells. Amidst all of this mess, he was almost certain he could smell bubblegum ice cream. Hectically looking around in an attempt to find his friend, he tried to suppress any memory related to bubble gum. To ice cream. To the life that he'd had before he changed. *Fuck*, he quietly said to himself.
The smell of the bubblegum ice cream started getting too strong for him to handle, and memories started welling up inside of him. His brain was unfolding like a book, too heavy to close. Ben pictured a red, rickety swing set in the middle of a park much like the one he was in right now. He pictured Emily, and for a moment, he pictured the way it had felt. The way the wind blew through his hair as he threw his legs back and forth on the swings, laughing with Em about wanting to do a three hundred and sixty degree turn. Had he already called her *Em* back then?
He immediately snapped back into reality when he felt the tap of something on his shoulder. Immediately might have been generous, because the tap really did feel like a heavy knock. Maybe it had taken him a few seconds to come back. His eyes felt a bit watery and his knees were shaking, but he told himself that he was probably just hungry (he wasn't) and turned around to discover the source of the heavy tapping.
"Ben!", Emily exclaimed right behind him. She was a beautiful woman with curly hair and a smile that probably tasted like bubblegum ice cream. *Tasted?*
"Hey, Emily, why'd you take so long?", he asked in the flattest possible tone.
"Shut up", she returned with a snarky grin. *Damn*, she looked extra beautiful today. Ben looked down at her flowy, blue skirt and matching light purple ballerinas. Even though his eyes were still watery, he couldn't help but smile at the look of her, standing there right in front of him. This is exactly what she did to him.
"Oh man, I want some fro-yo right about now!", Emily sighed yearningly as she grasped Ben's upper arm and started pulling him towards one of the stalls by the fountain. "You want some too? I can pay."
"Are you kidding me? You're *broke*, I'm not letting you pay for *anything*!"
"*Broke*? Come on, that's a bit harsh", she countered and frowned. She stopped dead in her tracks, let go of his upper arm and, after a few seconds of fondling with her cardigan, produced a thirty-dollar bill out of what he could only assume to be a hidden pocket somewhere. "See?"
Not entirely convinced of Emily's sudden wealth, he raised an eyebrow and tilted his head slightly in disapproval. "Fine."
# Chapter 2
Over the next few hours, Ben was dragged back and forth between stalls and attractions. For every single one, he was apprehensive at first but rather quickly changed his mind once Emily frowned. It was such a heart-melting frown, worse than the faces that his aunt's dogs would make when they wanted to be taken for a long walk. Every single thing about Emily was just so beautiful that he could be happy doing anything with her. Even going to a shoddy, uncomfortable carnival in the middle of February.
They'd already stopped at almost every ride and stall, and so Ben decided that now was enough. He wasn't usually the type of person to make decisions like this (he'd just leave it up to whoever else was actually in charge), but this time, he'd put his foot down. He would, absolutely.
"Em, I'm getting tired."
"Are you serious? We haven't even eaten any churros yet!" Emily smiled devilishly at him while tugging on his blue sweatshirt's right sleeve. She was staring at him, as if trying to extract the information directly from his eyes. Her blonde locks were flowing over her brow and almost into her eyes, but that didn't seem to bother her. He guessed that, after a while, you'd probably get used to it, like you do with seeing your own nose. He really liked seeing her nose, though.
"You *love* churros," she pointed out with an overly exaggerated *o* in *love*.
*In love*, he thought. This time, he was going to put his foot down, right? That's what he'd decided. He didn't want people to control him anymore. But was that really what Emily was doing here? No. She was his best friend, she knew what was good for him. Right? She was looking at him, in obvious anticipation of his answer. He did really like churros. But did he love them? He wasn't sure about that. Okay, he did love them, but did he love them enough to warrant another thirty minutes at this godforsaken carnival?
He loved Emily, that was for certain.
Wait, what? Had he really just thought that? No, he couldn't have. That was just one of those jokes his brain made up sometimes. Amusing, albeit slightly infuriating. *Fuck off*, he said to himself.
"What?", Emily replied, clearly confused as to what he was saying. He wasn't saying anything though, right? What had he said?
"I'm, the," he mumbled, trying to make sense of what Emily could've just heard him say. Maybe she didn't hear anything, maybe it was just the wind. What could he have said to her? Surely he didn't say the love part out loud, right?
He stared at her face. Her brown eyes were intensely focusing on him, her lips slightly curled into a smile. She tugged on his sweatshirt one last time.
"So, churros?" Oh Thank God.
"*Fine.*"
***
As they were eating their churros, Ben couldn't help but notice how much chocolate sauce Emily had on hers with every bite. They'd ordered a little square box filled with twelve or so standing churros, along with a small tub of chocolate sauce that tasted criminally close to Nutella without actually being Nutella.
"You know this sauce is for dipping, right?", he said to her with a grin before taking another huge bite. "It's not supposed to be a full-on coating."
"What do you know, huh? Where does it say that?" She tutted and shoved her churro into the tub of sauce with ostentation. While pulling out the excessively coated pastry, she got ready to put her other hand under it as to prevent any of the chocolate sauce from dripping down onto her dress.
"Try it!", she said with an impish smile and held the dripping mess right up to Ben's mouth.
"No, I don't—" He tried to interject, but Emily had already rammed the chocolate-covered churro directly into his face. He resisted opening his mouth, so the chocolate sauce smeared all over this face and chin and then continued to drip onto his sweatshirt in big, brown globs. "Damn it, Em."
"I'm sorry, but why didn't you open your mouth?", she asked jokingly while holding back laughter.
"Fuck," he said angrily and fumbled around his pockets, trying to find a tissue or something. In the scramble, the smells of the chocolate on his face and the odor of bubblegum ice cream in the air mixed to create something awfully unpleasant in his nose. He was trying really hard to find a tissue now.
"Damn it, Em, why do you always have to do that?"
"Oh, *come on*, that isn't fair! I was just trying to have fun!"
"Fun? You know I hate these kinds of things. I hate *people*!"
She tutted. "Lighten up a bit, Ben!"
"Lighten the *fuck* up?" His brain was unfolding again, this time like floodgates, unable to be stopped by the water pushing against them. "You don't understand me at all!"
He was yelling now, and some people around them were beginning to notice. Fuck. He finally looked over at Emily, his face still covered in chocolate sauce, but she wasn't smiling anymore. Instead, she had this look on her face that she'd sometimes get. When watching a sad documentary, or when her mom prepared food that she didn't particularly enjoy. It wasn't a frown, it was more of a neutral expression of… disapproval? Disgust?
"Why is everything such a big fucking deal to you, Ben?", she yelled, tears starting to escape from her half-shut, pained eyes.
That was the moment a switch in his brain finally flicked. A switch that was probably in a back room, guarded by multiple doors with multiple, separate keys. Use only in emergencies, a sign somewhere close to the switch probably said. Don't use even, maybe. Ben tried to force his eyes shut with extreme determination. No, he wouldn't cry.
But he did. Tears started running down his face like waterfalls, and he tried to cover them up and wipe them away with the sleeve of his sweatshirt. He wiped his cheeks with the sleeves of his blue sweatshirt, and large amounts of chocolate sauce transferred from his face to the sleeves. God fucking damn it, he muttered to himself. The world around him was turning into a very small part of his vision, the rest filled with blurry streams of tears. He tried to get up from the bench they were sitting on and stumbled around the square where the festival was happening. He was sure he'd bumped into a few people on the way, but couldn't tell for absolute certain. After what felt like an hour and a half, he finally arrived at a tree a few meters away from the fountain square.
He rested one hand against the bark and tried to catch his breath. The thought of bubblegum ice cream was fresh in his mind again, the thought of the red, rickety swing set was morphing and mixing with the thought of churros, the thought of chocolate sauce in his face. The thought of Emily's smile, the thought of her frown, the thought of her sad movie face. Fuck.
He tried telling himself to breathe. *Five in, six hold, seven out.* That's what his therapist had told him. *One, two, three.* What's the worst that could realistically happen?, that's what he was supposed to ask himself. *Four, five.* Well. *One, two, three.* Emily might never talk to him again. *Four, five, six.* She might hate him, now that she'd just tried to be cute by shoving a churro into his face, and now that he'd reacted like a total fucking asshole. *One, two.* Was he already breathing in again? *Fuck.* He kept telling his body to calm down, his mind to stop racing. His heart to stop racing. He started leaning against the bark and then slowly slid down the tree trunk, sitting down on the ground with his knees close to his chest. He observed the rickety swing set in the middle of the field, and saw himself and Emily swinging back and forth again, talking about three hundred and sixty degree swings. He saw himself, laughing and giggling and occasionally licking a cone of
bubble gum soft serve he had in his left hand. He saw Emily doing the same. He saw himself wobbling a bit on the swing, trying to hold himself steady with just his right hand. He tried to breathe again. *One, two, three.* He saw himself, still holding the cone, sliding out of the swing's seat and yelling something. He saw himself landing in the rough, wet sand, the cone having left his hand and landing face-down in the sand next to him. *Four, five.* Tears were still running down his face. He saw himself turning around as Emily jumped off of her swing and came to his rescue.
"Are you alright?", he heard her say in her beautiful, melodic voice. *One, two, three.*
"I would've been, if you hadn't forced me to get this stupid ice cream!", he heard himself shoot back aggressively.
He felt something tap on his shoulder again.
"Are you alright?", he heard someone say. "I'm sorry, I shouldn't have said that."
It was Emily, standing next to him, bending down a bit to reach his shoulders. She slid down the tree trunk next to him. "I'm really sorry."
Ben tried to catch his breath, but with Emily here, it felt much easier all of a sudden. It's like a tension had been lifted from him, like someone had come to push on the floodgates from the other side. "It's alright. I'm sorry I yelled, too."
Emily tutted.
"You know, sometimes I think of that day on the swings."
"What day?"
"The day we had our first fight. Don't you remember?"
Emily tutted again. She placed her hand back on his shoulder, which he liked, because it was Emily's hand. That's all that mattered to him.
He wiped the remaining tears and chocolate sauce off of his face, his sweatshirt's sleeves now completely covered in both. "I keep remembering that day, being scared that I'll re-live it. That we'll have another fight. That you'll leave."
"*Leave*? Come on."
"I'm serious."
"I am, too. I'm not leaving."
She scooched closer and rested her head on his shoulder. "You know, I think about stuff too."
"Like what?", he asked while also resting his head on her head, which made him feel really close to her. Intertwined, even.
"You", she said quietly and grunted. "I really like hanging out with you, you know?"
"I do too," he said almost immediately. Did this mean what he thought it meant?
"Do you want to go home? I'm sure my mom has cookies."
He nodded. Maybe it did.

View file

@ -1,148 +0,0 @@
---
layout: blog
title: 👫 Emily's Fake Boyfriend
description: Emily's aunt keeps going on about her love life. To solve this problem, she pretends to be in a relationship with her best friend, Ben, who'd much rather have a real relationship with her. How will an evening with the three of them at the same table play out?
tags: [Short Stories]
book: true
discuss: https://twitter.com/Ellpeck/status/1378014977999659016
---
# Chapter 1
For Emily, Saturdays always seemed to be the days when most things went wrong. She didn't exactly know why, but she was almost certain that there was some pattern, some sort of spiteful spirit that hated Saturdays, hated her, or both. This Saturday would be one of the most bizarre ones so far, but she didn't know that yet.
The alarm rang, its screeching noises filling Emily's bedroom. With a huge sigh, she pulled the cover off of her body and jumped out of bed. As she picked up her phone from the nightstand, she sighed again. *Oh God*, she thought. *What now?* She tapped various locations of the device's large screen until she ended up in a text message chain with her mom, her brother and her younger sister. Her eyes kept trying to entice her to fall back asleep while she was scanning the lines of the last ten or so messages as carefully as she could.
*Damn it*, she thought as she got to the last message. *That's today*? She quickly gathered her things, put on her favorite, pastel pink cardigan, messily fluffed up her hair as she ran past her large mirror and made her way downstairs.
"Good morning!" Her mom said with a slight smile. She was standing in the kitchen, as she usually did, preparing homemade waffles. Emily's mother was a very good cook and baker, but waffles weren't her strong suit, for some reason. Every time she tried (and she tried too much), they'd end up burnt or somehow taste of licorice. The thought made Emily grimace as she walked past the kitchen.
"Morning, mom!" she hastily said and made her way to the front door.
"Not so fast," her mom shouted back from the kitchen. "Don't forget your waffles!"
*Oh, God.* "Of course," Emily replied with a sigh.
***
Ben was sitting on the side of his bed with his laptop firmly planted on his crossed legs. With the speed of a twenty-fingered person, he was typing away on an essay for school. He heard a knock on his room door and, while *very* annoyed by this, he still managed to calmly shout "Come in!"
"Emily's here," his mom said while peeking her head through the slightly opened door. "She says it's important."
Almost immediately, far too many thoughts started sprinting through his head: It's *important*? What could that possibly mean? Was Em, his best friend since kindergarten, *dying*? No, that's unlikely. But what if she *was*? Why wouldn't she just *call*? Oh God, no, a call would be *even worse*. Still begging his brain to shut up, he trotted down the stairs and arrived in the house's main hallway. A myriad of family photos plastered the walls, most of them from when Ben was still a child. His mom *loved* showing off pictures of his "little baby boy," evidently in the most embarrassing ways possible.
"Ben!" Emily said hastily as he opened the door. "I need you to be my boyfriend!"
*His what*? His mind began racing again. Not only was that a very weird way to phrase that sort of thing, but it was also an extremely unexpected request in general. Emily, while insanely beautiful and extremely charming, wasn't really known to start relationships with anyone. Ben occasionally talked to her about it. It didn't seem to be her favorite topic, so usually, he'd lay off after only two or three questions. They weren't necessarily the easiest of questions for him to ask her, either, because he was *obsessed* with her, almost uncomfortably so. Not in a stalker-y, watch-her-every-night, masturbate-to-her-daily sort of way, but in an I-love-you-and-I-want-to-marry-you kind of way. Of course, Ben (being who he is) was far too self-conscious to *ever* bring it up.
"You need to *what*?", he responded quickly.
"Well," she said and took a deep breath. "My aunt is coming to town and I may or may not have told her that we're, uh, together."
"You did *what*?"
"I know, I know. It's bad." She tutted. "The thing is that my aunt can be really *annoying*. She always goes on and on about my love life, about how I haven't found a boyfriend yet, even though I'm already 19, and how that is *absolutely unacceptable*. So, I decided to put a stop to it."
Ben closed his eyes. *Fuck.* Of course, it wasn't what he'd hoped it was. *Of course*, she didn't want to be his *actual* girlfriend. Who'd want to be? Nobody. Especially not her.
She was standing there, her blonde locks swaying back and forth in the breeze that the open front door let in, and Ben was lost for words.
She tutted again. "Aren't you going to say anything?"
"Well," he started. How could he say yes to this? If anything, wouldn't it just cause him more pain to have an entirely fake relationship than none at all? Maybe. But maybe, this could lead to something. Maybe, he thought, this could be like those cheesy romance films that he sometimes watched when he was in a *particular* mood. Maybe this could really be the start of something.
"What do you need me to do?" He asked.
***
Emily breathed a huge sigh of relief. "Let's sit down somewhere," she said quietly.
As she finally entered the house, and they started making their way over to Ben's living room, she felt a kind of unease course through her body. It wasn't the *bad Saturday waffles* kind. She couldn't quite put her finger on what this feeling was, but she felt her heart beating faster when they sat down on a rickety, brown sofa.
She knew, of course, that Ben didn't enjoy this whole situation. She knew that he wasn't the best liar, and she knew that he didn't *enjoy* lying all that much either. But this was different, she thought to herself. Emily never understood what, if anything, Ben felt for her. It wasn't that he was secretive about his feelings, it's that she was incredibly bad at reading them. To her, it was weird that so many people automatically *assumed* that she was amazing at talking to people, making conversation, and understanding what other people want. But this wasn't really the case. While Emily *did* love hanging out with people, the part of her brain that was meant for understanding people's feelings was probably being repurposed to store excessive amounts of Ariana Grande quotes. And it made her feel bad, too, because her best friend Ben was absolutely *packed* with feelings.
While poking at a small hole in the brown fabric she was sitting on, she recalled a situation from a few months ago. She and Ben were in the park, and there was some sort of spring festival going on. She had dragged him out to it because, even though she didn't necessarily *like* taking this role in his life, she'd often try to take him out of his shell and help him fight his anxiety. During that festival, he had a full-on *panic attack* (the kind of thing that she, as an avid Ariana Grande listener, did not understand), which caused him to run off and hide.
Was this really such a good idea?
"Okay, so," she said and let out a big sigh. "Let's talk relationship. What kind of boyfriend do you want to be?"
"I'm sorry?" He said, flustered.
"Well, I didn't tell my aunt that many lies about you, so the whole thing is pretty open. You can be super caring, or, you know, the bad boy type."
"The *bad boy type*?"
"Yea, like, uncaring and aloof, you know? Maybe wear a leather jacket."
"A leather- have you *met me*?" He responded in playful disgust.
"Okay, super caring it is, then," she laughed and moved her hands around in the air as if writing something down on a giant, invisible notebook.
Honestly, *super caring* was exactly the kind of boyfriend that she actually wanted. Of course, she would never say this out loud, but occasionally she dreamed of the perfect storybook romance. *Romeo and Juliet*, just without all the tragic stuff. Just like that one Taylor Swift song. While she'd fooled around with some of her girlfriends once or twice, she'd never actually had a relationship with anyone, especially not a guy. She didn't really know why, either. She briefly wondered if any guys had ever been visibly into her. Maybe she'd just missed it.
She'd also never admit *this*, of course, but Ben seemed like a fairly good candidate for the position of the super caring boyfriend. He was innocent, sweet, and he had the mane of an extremely gentle lion.
Uncomfortable silence had set in between the two, as it sometimes seemed to do. It didn't help that Emily had one of those weird thoughts again. Very occasionally, she'd have this intrusive image in her head: Ben, lion-like as he looked, not-so-gently on top of her. Sometimes he'd touch her breasts; sometimes they'd be kissing. Was she sexualizing her friendship? Maybe. Was that bad? She didn't know. She also didn't know if she cared yet. After all, she didn't *mean to*. It just kind of happened every now and again. If anything, didn't that speak to her fondness of Ben?
In an attempt to quickly change the subject on her mind, she started telling a story about her aunt.
"You're going to *love* my aunt," she said sarcastically. He looked at her with a sense of dread in his eyes. "Okay, one time, we were at this restaurant, the whole family all packed into this corner booth, and she would not stop pestering the poor waiter with question after question about the most ridiculous stuff! Every time she waved him back over to our table, he looked more and more tired of her shit."
"That's actually kind of horrifying," he responded and shook his head slowly.
"Right?"
# Chapter 2
In the early evening, Ben found himself sitting at a big dinner table, straight across from an overly cheerful looking lady. If he had to guess, Em's aunt was probably around fifty-five years old, maybe a little older. She was slightly hunched over the table, resting one of her arms on it. *That's not how you sit at a table, young man*, he heard his own aunt's voice echoing in his head. Clearly, Emily's aunt didn't care, and from what he'd been told, this wasn't surprising.
When Emily's mom came into the room from the kitchen, she was carrying a large tray that held a variety of sweet pastries and cookies. Homemade, Ben assumed, waiting to bite into one of those chocolate croissants. Emily's mom set the tray down in the center of the table and pointed at it with an open hand as if to say *There you go, dig in*. So Emily and her sister did. After they finished selecting something they liked, Ben also felt comfortable taking a croissant.
A chocolate cookie in her delicate fingers, Emily's aunt turned to Emily. "So," she began while raising her thickly overdrawn, black eyebrows. "How have you been, my love?"
"Well, school's been going pretty well. I've only gotten good grades this semester, and my classes have been bearable."
Her aunt started smiling wide. "A perfect student as always! I expected nothing less of you, dear."
Emily provocatively rolled her eyes and sighed. Her aunt didn't seem affected by that at all. Instead, she continued smiling as she bit into her cookie. "And you, love?"
Confused for a second, Ben realized that she was talking to him now.
"Me? Oh, well," he stuttered. "School is also going great for me. Emily and I are pretty much on the same level in terms of grades and stuff."
"On the same level, you say? Maybe that's why you two get along so well! For years now, I've been *absolutely positive* that you two would make the cutest couple. And now it's *finally* happened, God bless."
Emily sighed, louder this time. Ben let out a stifled chuckle. *I wish*, he thought to himself.
***
As the conversation continued over dinner, followed by coffee, Ben felt himself zoning out from time to time. As he continued to observe Em and her aunt conversing, he felt his mind wander to a different world without his control.
A world where him and Em really *were* a couple. A world where, against all odds, they'd happily been together for years, with their own apartment, with floor-length windows and a balcony. They'd sit outside in the evenings, eating ice cream and sipping on cocktails. They would laugh and share stories of their day while watching the sunset over the park. They'd go into town on the weekends and eat at that little Italian place he keeps wanting to go to. They'd never fight anymore, because they'd be happy. He'd never cry alone, never wonder why he was too *stupid* to tell her how he felt.
Emily grabbed his hand. "We're going upstairs now," she said and got up from her chair.
Even though he knew it was fake; even though he knew that her hand in his meant *nothing*, it felt good. He craved contact like this, with someone he really cared about. He'd hug Emily more if it wasn't for his fear of being overbearing. Of being a nuisance. Why did he have to feel that way?
Emily dragged Ben behind her as she walked up the stairs, her palm still resting in his. When they got to the door of her room, she still hadn't let go of his hand. Why? Was Ben just reading into things again, or did she *enjoy* holding his hand? *Surely not. She'd never enjoy that*, he told himself. Then, as he frequently did, he told himself to stop telling himself things like that.
Emily finally let go of his hand upon entering her room. This was one of Ben's favorite places to be. Sometimes, he'd imagine him and Em cuddled up together on her bed, sharing a blanket, watching a movie or playing *GTA*.
He thought about this kind of thing a lot. Of course, he also thought a lot about the fact that he thought about this kind of thing so frequently. Was it bad to have these thoughts? Was he risking ruining his perfect friendship with Emily by making some big romance out of it in his head? Was it unfair to her to keep quiet about it? As they sat down next to each other on the bed, he tried to let these thoughts fade.
"Thank you *so damn much*, man," Emily said and let out a sigh of relief. "What a nightmare."
"Oh come on, it wasn't *that* bad."
"Did you hear what she *said*?" Emily put on a very bad, fake British accent. "I was *absolutely positive*," she mocked. "*My dear.*"
Ben couldn't help but laugh. "She's not that bad! I thought she was nice."
"Oh shut up, I *know* you." Did she? "People like her drive you *mad*! You never miss out on an opportunity to hide in your room. You don't *like* her."
Maybe she did know him. And maybe it was this realization that made him unable to think about the words flying out of his mouth. He let out a quiet, but emotional sigh, and said "I like *you*, though."
Emily turned and looked into his eyes. As he stared back, he could see a tiny reflection of his face in her brown irises. "I like you too, Ben. You know that," she said.
Maybe she didn't know him after all. He focused intensely on her face. What if this was the moment to be honest? What if, in the light of this fake relationship, he could finally be true to how he felt? Anxiety boiled up inside him. This was a panic attack just waiting to happen. But he had to try. Right?
"No," he said and gently took her hand. "I *really* like you, Em."

View file

@ -1,172 +0,0 @@
---
layout: blog
title: 📅 Jed's Things to Avoid in Life
description: "Jed's rules are clear: No relationships. They interfere too much with his life, and he's not made for them anyway. But then, he sees his old crush from school in his hometown. Will he break his own rules for Davy?"
tags: [Short Stories]
book: true
mature: true
reedsy: https://blog.reedsy.com/short-story/jnromp/
discuss: https://twitter.com/Ellpeck/status/1385686796911185920
---
Jed didn't do relationships. That was just one of his rules. Actually, it had become such an important rule to him that he added it to his very official, *highly* scientific List of Things to Avoid in Life. They were too complicated, and the touchy-feely stuff usually left him feeling inadequate about his ability to be there for someone. He also just didn't have the time, with his fifty-hour work week and all that. So not wasting his time trying to care for another person, especially considering that they'd probably notice pretty quickly how little he was able to care for them and ultimately leave him to be on his own again. So why bother, right?
He was sitting on a crowded, noisy train on his way to visit his parents in his childhood hometown. He didn't necessarily enjoy going there again, but this weekend was his mom's birthday, and he loved her too much to skip it. Even though his grandma would also be there, who he had a particular grudge with after finding out a few years ago about her dislike of a *pretty important* part of his life. So he wasn't particularly looking forward to talking to her about "the girls she envisions him marrying."
He looked out the window, the lush, pine-plastered mountains in the distance slowly creeping by, and imagined what it would be like if he really *was* as much into girls as his grandma wished he was. It's not like he hadn't thought about it. Of course, it would be easier for him to be straight. In fact, maybe his rules about relationships were only so airtight because he was afraid of being bullied. He didn't enjoy the thought of holding hands with his boyfriend, only to be attacked by some idiot in an alley. But his other reasons were good, too, right? He *was* a little emotionally unavailable at times. He *did* have that horrible work week. *Yes*, he thought to himself. *Those are good enough reasons to avoid the perfect, storybook romance you dreamed of as a kid, damn it.*
After leaving the train, he stopped in the middle of the platform and looked around to get his bearings again. Out of the corner of his eye, he noticed something odd. He turned to face the front window of a small bakery, the glass protecting delicious looking pastries and cakes that were quietly sitting in a large vitrine. But that wasn't the odd thing.
He started closely inspecting the head of the person standing behind the register, currently handing a glazed donut to an old lazy. After a few seconds, the person turned in his direction, and started looking directly at him. And there he was, standing in the middle of a train station, locking eyes with the *last* person he wanted to see in this town. He smiled and waved awkwardly, and the person behind the register did the same, before turning back to the old lady and finishing their transaction.
Jed, clearly having lost his mind, thought it would only be right to go inside and say hello. A little bell that was mounted behind the door rang. Now, he was standing right in front of him. His long, wavy brown hair had the same elegance as it did the last time Jed saw him, as if nothing had changed. Davy must've been sat in a time capsule for the last four years, because he still looked exactly as beautiful as he did all those years ago at school. No, better. Davy had broad shoulders and a wide frame. His arms were thick and muscular and Jed imagined them again, wrapped around his body, warming him. Protecting him.
"Jed! I didn't know you still lived in town," he said with a smile that penetrated all of Jed's defenses.
"I don't, actually," he stuttered. "I'm visiting my parents."
"Ah, that makes sense. Train station." Davy laughed awkwardly and pushed the hair out of his face with his hand. His motions were smooth and soft, and Jed couldn't help but notice the veins in his arms twitching as he moved his hands. *Jesus Christ*, he said to himself. *Get a grip.*
"How have you been?" Davy asked and raised an eyebrow.
"I've been pretty good, actually," Jed mumbled, still mesmerized by Davy's movements. The grip clearly hadn't been gotten yet. "I'm working at a pretty big software company."
"That's awesome," Davy said with a very real, supportive air of enthusiasm.
"And you?"
"Been working here to help with uni. That shit's really expensive, man." Davy chuckled.
Jed nodded his head slightly. "Yea, I can imagine," he said.
"Anyway, it's cool that you're here. Do you maybe want to catch up some time?"
Jed froze. *Oh my God*, he thought. Had Davy really just asked him on a date? Okay, well. Not a *proper* date, but...
"Uh, yea, that sounds great," he mumbled. If Davy was a mirror, he'd probably see his entire face turn into a tomato right now. *Oh, God.* "I'm free the whole weekend," he continued.
They exchanged phone numbers, and Jed breathed a sigh of relief when he exited the bakery. Thankfully, Davy didn't seem to have noticed how awkwardly Jed was acting around him. Was he even acting that awkwardly? Possibly. Probably.
***
Only a few days later, Jed arrived at a coffee shop that he used to go to with his friends after school sometimes. It was small, filled with small nooks with comfortable looking armchairs that had colorful blankets thrown over them. Taking in the romance that this place clearly emitted, he sighed to himself. *Oh God, this is a* proper *date, isn't it?*
He waited in the entryway of the café until Davy arrived. And *boy*, did he arrive. He walked into the room wearing a jean jacket over a black logo tee and jeans. His hair was blowing in the wind let in by the open door, and it reminded Jed of their first encounter at the train station. The whole outfit made Davy seem strong. For a second, Jed imagined what it would be like to be scooped up by his strong, muscular arms like a princess. Like a *prince*.
*Get a grip*, he thought to himself.
"Hey man," Davy said with a smile as he saw Jed. *Hey, 'man'?*, he repeated in his head.
"Hey Davy," said Jed with an awkward half-smile. He tried to wipe it off. "You look," he started, but he didn't know how to finish.
"Gay?" Davy suggested. "I know. I just love this jacket so much."
"That's not-", Jed stuttered. "I didn't ... you look *good*." He hesitated. Why did he *say* that?
"Thanks. You don't look too bad yourself," Davy said and started making his way towards one of the seating nooks. He brushed Jed's arm with his own while passing him, and it made that place tingle with... with something.
Jed realized that he didn't even know for sure if Davy was into guys. He wondered for a second if that comment about his jacket was confirmation that he was, in fact, gay. Was anything he'd done so far confirmation that he was?
A weird feeling of unease creeped up in Jed's chest, and it immediately entered his heart. *What if he's not even into guys?*, he thought to himself. He didn't do relationships anyway, though, so why would it matter -- right? They were too complicated, too time-consuming, and too draining of the small amount of emotions that Jed had. So it was of no value to know whether Davy was into him or not.
He really enjoyed the idea though. As he watched Davy sit down on a sofa in one of the nooks, he imagined what it'd be like to be on that sofa with him. Sitting next to him. Close. Kissing him. Davy's hand moving closer to Jed's--
"Are you coming?", Davy called and waved. *Oh God*, Jed thought to himself. *Hopefully not.*
Jed started walking towards him, and Davy started patting the spot next to him on the sofa. He wanted Jed to sit next to him. *Great.*
Of course, being the gentleman he was, it was only right of Jed to actually go ahead and sit down next to Davy. That was the only reason, *of course*.
They both ordered drinks (hot chocolate) and food (cheesecake and apple pie) and started chatting about how they'd been since school. Davy talked about his university courses and the bakery job and how he'd sometimes see his old friends at the train station, and Jed was *fascinated*. It wasn't that Davy's stories were actually *fascinating*, but somehow, because *he* was the one telling them, they seemed more alive than Jed ever thought a story could be.
When Jed started talking about his job, about the long work hours and about his family, Davy turned a bit to face him. Now they were sitting closer, almost opposite one another, and Davy's gaze seemed to be locked onto Jed's eyes while he told his stories. He'd never met someone, Jed thought to himself, who seemed so genuinely interested in his life. Somehow, the two of them were just fascinated with each other, it seemed. But Jed's rule was clear: *No relationships*. They were a waste of time, and that was a final, reasonable, and educated decision.
That was, of course, until they started talking about Jed's homophobic grandma. As soon as he mentioned that his grandma didn't 'approve' of his sexuality, Davy's smile faded, and he rolled his eyes. The sight made Jed chuckle.
"Relatable?", Jed asked with a tiny grin.
Davy tutted. "Oh God, don't get me *started*."
He shifted a little on the sofa, and they were sitting even closer to each other now. Was he doing this on purpose?
"My mom's the same way."
"Your *mom*? That's terrible!", Jed hissed.
"Eh, I've been getting by alright. I don't need her, you know? It's her loss." Davy began smiling again. "I've got enough people in my life who support me."
"That's good," Jed responded. Overwhelmed with the flood of endearing sentiments rushing through his chest -- the homophobic mom, the sweet sentiment about Davy's chosen family, and just how close to each other they were sitting right now -- Jed couldn't stop himself from saying more. "I'd support you too, you know."
"You know what," Davy began. *Oh God*, Jed thought to himself. This was it. He'd ruined it. *You're getting a bit creepy*, that's what Davy was about to say. Right? He'd said too much. But Davy's smile didn't fade. Instead, he chuckled and put his hand on Jed's shoulder.
"You're great to hang out with, Jed," Davy continued. "But I really have to go now, sadly. I really want to see you again, though."
Jed's cheeks warmed up, and he began to smile again. "Me, too," he said shakily.
Over the next few days, Jed kept daydreaming about Davy. His cute smile, his wavy hair and his muscular, strong arms. He kept picturing, over and over, how Davy grabbed his arm when they sat so close in the café. He should've kissed him then and there. No, it would've been too soon. Plus, they had another date lined up. Because he hadn't seen town in a while, Davy came up with the idea of hiking to the top of the nearby mountain and looking down at the cityscape from there.
But maybe he shouldn't get closer to Davy, he thought. He didn't want to give him the wrong idea. His list of rules was very strict, and Jed intended to continue following it. No relationships, because they are too complicated and time-consuming. But Davy could've happily consumed all of his time without Jed even remembering that his list of rules *exists*.
***
There he was. Strong as always, wearing a t-shirt that made his muscular upper arms even more pronounced than usual. Today, his long, silky hair wasn't flowing over his shoulders, though. He had tied it up into a ponytail, presumably so it wouldn't bother him during their hike.
Jed approached him on the parking lot close to the hike trail leading up the mountain, and Davy turned around slowly.
"Hey," he said in a rough voice. He cleared his throat, before saying "hey" again, less raspy this time.
"Hi. I'm excited!" Jed blurted out with an unusual amount of confidence. *The rules, damn it*, he thought to himself. *Get a grip.*
"Me too. I packed some snacks for us, as well," said Davy and pointed to his backpack. He shifted his upper body and laughed, causing what sounded to be loose food items to rustle in the bag.
Halfway up the trail, Jed started getting exhausted. It wasn't that he was out of shape (he'd been working out occasionally because of the part of his List of Things to Avoid in Life that read *getting out of shape*, of course), but something about this hike was different to him. Stopping on the trail, he grabbed a bottle of water out of his backpack and started gulping it down without hesitation. Davy stopped as well, and observed Jed as he almost finished the entire bottle.
"Want to take a break?", he asked slyly.
"Shut up, I can do this!", Jed blurted out without much thought. *Oops.* "I'm just-"
Davy cut him off. "Well, I know you can, but you can also relax with me for a little while."
Relaxing sounded like a great idea to Jed. He wiped his mouth and chin with his forearm and looked over at Davy, who had already found a nice bit of grass to sit down on. *Laying down on the grass together*, he thought, remembering this very fantasy having been stuck in his head for the last few days. *Of course. Damn it.*
Jed walked up to Davy and looked down questioningly. Davy looked back up at him and smiled.
"Come sit," he said with a grin, pointing to the ground right next to him. Jed did as he was told.
And now, there they were, just like in Jed's *stupid* fantasies. Sitting next to each other, looking out over the forest and a small part of town, with Jed feeling the cool, green grass underneath him.
"You know," Davy began. "I used to think that you were kind of weird. In school, you know. I only realized afterwards that..." He hesitated. Jed turned his head to see the expression on Davy's face, but there wasn't much being expressed there at all. Eventually, Davy continued.
"I think I realized that I had the tiniest bit of a crush on you."
On... *what*? Jed's heart skipped a beat. What had Davy just said? Clearly, Davy was out of his mind. Or Jed was. Was he dreaming? Was he passed out from exhaustion somewhere, laying on the path, with Davy wondering what he'd gotten himself into? Jed shook his head. *No.* This seemed to real to be a dream.
"You... you did?", Jed stuttered. Davy chuckled.
"I think so, yea. You were always kind of cute, and seeing you at the train station the other day... I don't know, it felt like a sign."
*A sign*, Jed thought to himself. He could kind of see that. The hunky, adorable student who worked in a bakery, with his long hippy-like hair, believing in *signs* and probably *soulmates* and what have you. This made sense to Jed. But the fact that Davy was saying all of this to *him* made no sense at all.
"Are you serious? I--", Jed paused, trying to formulate a coherent sentence in his mind. Davy was looking at him with a sense of desperation in his eyes. *Tell me that you like me too*, they seemed to say.
At this point, Jed went over the options in his mind. The rules, the meeting at the train station, the *coincidence* of it all. Maybe he believed in signs, too. Maybe he believed that, out of all the people he could've met that day, Davy was just the perfect one. Maybe, he thought to himself, his rules didn't actually matter that much after all.
"I actually really liked you too. In school. I always saw you with all of those girls and I thought, you know. I thought I'd never have a chance. Especially since you seemed so..." Davy cut him off.
"So straight?", he said and laughed.
"I guess, yea."
"Well, I'm not. I mean, I am. I'm bi, actually," he explained.
"That makes sense," Jed responded, not really sure what else to say. They were both silent for a moment, but their gazes were still interlocked. They were sitting close enough together now for Jed to feel both of their breathing warming up the air between them.
"Do you want to..." Davy began, but he paused. Jed wanted a lot of things right now. He imagined moving closer to Davy, putting his hand on his thigh, maybe lower, deeper, and going through Davy's hair with his hand. He didn't, however, know what Davy wanted. So he didn't do anything.
"Can I kiss you?", Davy asked after an uncomfortably long silence. Jed didn't answer with words -- how could he possibly answer that question without melting into a puddle then and there -- but apparently, his wide smile was enough indication to Davy that Jed *did* want to kiss him.
Davy moved in closer, grasping Jed's hip with one hand, and as Davy leaned in closer with his head, Jed could see the veins in his arm twitching as he moved.
Jed closed his eyes, and he felt Davy's lips touch his own. He felt him reaching around Jed's body with his other hand, fully enclosing him in his strong embrace now. It felt good. Jed wanted to continue, forever, staying here and kissing Davy until the end of time.
This was good. To Jed, it was the perfect place to be.

View file

@ -1,69 +0,0 @@
---
layout: blog
title: 🐶 Dog-Earing and Other Terrible Reading Habits
description: Since I've been reading a lot more in recent history, I thought I'd start writing some blog posts about the reading. So first up, here are some of my terrible reading habits that would probably make a lot of book lovers angry. This isn't clickbait. I'm just terrible.
tags: [Reading]
discuss: https://twitter.com/Ellpeck/status/1408565191218978818
---
So recently, I've been reading a lot more again. Since I got my first Kindle [and talked about it](https://ellpeck.de/blog/reading) a while ago, I have now also started tracking my reading progress on [the StoryGraph](https://app.thestorygraph.com/profile/ellpeck). I also started watching some more book- and reading-related YouTube videos, and I came across this tag that I thought would be *perfect* for me to talk about for one specific reason, which I'll get to shortly.
To sum it up: My boyfriend thinks dog-earing books (that you own!) is the worst, and he despises me for doing it. But I want all of you to *hear my case* about this. So read on. Please.
# Do you have a certain place at home for reading?
A while ago, I actually got one of those cheap-but-nice IKEA chairs that everyone seems to have and set it up as a little reading nook in a corner.
But then I realized that reading in bed, before going to sleep, actually works a lot better for me because I take sleeping pills, but they take a while to start working. So I got into the habit of taking them, and then reading for an hour or so in bed, and then putting the book away and dozing off right when I feel the medication starting to make me drowsy.
# Bookmark or random piece of paper?
Okay, hear me out: *Dog-earing*. Of course, if you get a library book or read a friend's book, this is not a nice thing to do, because, after all, it *is* damaging someone else's property. In that case, a random piece of paper is a pretty good way to go, in my opinion.
*But.*
A book that looks like it's been read, with the pages a little warped and the spine maybe, possibly a little broken, and the marks of dog ears on some pages looks *so much nicer* than a book that looks all new and fancy and clean.
Listen, okay? Dog ears tell a *story*. Not only do they show you where you (or other people) took a reading break, but they also show you which parts of the book might have been difficult or otherwise slow to read, because those parts would have a lot more dog ears than other parts of the book.
Okay, maybe this is just me defending something that is objectively terrible. I like it, though.
# Can you just stop reading or do you have to stop after a chapter/ a certain amount of pages?
I absolutely can't stop reading in the middle of a chapter. For me, it's not necessarily that I want to know how the chapter ends or that I enjoy stopping at the end of a chapter because it's a cliffhanger, and it'll make me feel excited to get back into the book later.
My real reason is a lot more boring, because it's just that... for some reason, it feels *wrong* stopping before the end of a chapter, similarly to how it feels wrong for some reason to stop watching a show in the middle of an episode.
Chapters were made for a reason, and the author probably thought about the pacing of the book and, as a result, the placement of the chapters. It doesn't feel like my place to just disrupt that pacing. And that placement.
# Do you eat or drink while reading?
I don't think I've ever eaten while reading. It seems... unfitting. Especially because there are so many foods that make your fingers greasy or smudgy or... crumby. I wouldn't want to get that on my precious book. Or Kindle.
I do sometimes drink while reading, though. Especially when I prepared a little place and time to read, like when it's a nice day out, and I set aside some time to read and get a sunburn I mean suntan. I'll usually get a big glass of something nice. Yea.
# Multitasking: Music or TV while reading?
I... do people do that? How? I don't have the mental capacity for that.
# One book at a time or several at once?
I really *want* to be reading several books at once. I like the idea of reading one fiction book and one non-fiction book and then choosing which one to read based on how science-y I feel on any particular day. But whenever I try to start another book while I'm already reading one, I get one of two feelings: *The other book is so much more fun to read* or *This one is so much better than the other one*, both of which just make me end up reading just a single book again.
# Reading at home or everywhere?
Since I mostly read on my Kindle, it would make a lot of sense for me to read in other, non-home places too. But I rarely do. Partly because, when focusing on something like a screen or a book for too long while riding a bus or a train makes me feel *incredibly* dizzy. But also partly because I read a lot of somewhat raunchy romance novels, talking about which, and showing the covers of which, in public sounds like *a time* for an introverted person like me.
# Reading out loud or silently in your head?
I didn't realize there were people that read out loud, to be honest. It sounds kind of fun. I should try that.
# Do you read ahead or even skip pages?
I used to read the end of a book right away when I was a little kid, because I was scared that the book would have a sad ending. Actually, I used to also *change* the endings of sad books by writing a nicer ending into the book to ease my mind. I was wholesome like that. I was also, like, 9. So ease off with the pitchforks.
Nowadays, I don't even really have the urge to find out what happens later on in the book. After all, the current part is already interesting, and I'll find out soon enough what happens in the future, I guess.
# Breaking the spine or keeping it like new?
I will *absolutely* break the spine of any book I read (if I own it), because otherwise books are just too V-shaped to hold comfortably. It's not my fault that books are as flexible as a rock, okay? Do some yoga or something.
# Do you write in your books?
Depends on the book. If it's a science-y book that I want to go back to, I'll definitely write notes and highlight sections in it. Since I mostly read on the Kindle, I'll actually highlight sections that I find funny or interesting to be able to get back to them later. Or to be able to share them with my boyfriend, who isn't *the least bit interested*.
# Conclusion
I think my reading habits can be summed up pretty accurately as "book murderer". Which I'm honestly fine with.
I don't do it to books that aren't mine, though. I'm not, like, a library... hater. Or anything. Libraries are cool.
Since I've been reading a lot more again in recent history, I also want to start writing more blog posts about my reading habits and the books I enjoy. If you're interested in that sort of thing, you can head back to [the post list](https://ellpeck.de/#blog-reading) to see other posts in the Reading category, and you can also subscribe to the blog's RSS feed there too. If anyone still does that. I think RSS is dead. Right?

View file

@ -1,140 +0,0 @@
---
layout: blog
title: 📦 Of Abby, Love and Butt-Shaped Pillows
description: "Jeremy had just moved into a new house when he found a mysterious, heart-shaped box in the attic. Intrigued by its contents, he started asking his neighbors about it, and he would soon discover a secret love story."
tags: [Short Stories]
book: true
reedsy: https://blog.reedsy.com/short-story/qtt69j/
discuss: https://twitter.com/Ellpeck/status/1494068545105416196
---
Jeremy was sitting in his kitchen as suddenly, the room went dark.
Great. Two months living here, and the house is already falling apart. That was just Jeremy's luck, wasn't it?
He got up from one of his brand-new kitchen chairs and started making his way up the stairs to the attic, which is where he'd probably stored the light bulbs he brought from his old apartment. He didn't actually remember, mind you, because Jeremy hardly ever remembered anything. Jeremy was a man of few words, and a man of few thoughts.
Now standing on the wobbly ladder that folded down from the ceiling, he used most of the strength his body allowed him to lift a thick wooden board out of the way to reveal a hole in the ceiling to the attic. He climbed the scary ladder all the way and breathed in the stale air that had accumulated over all of those years that the house had stood on its own. After shuffling around some boxes with various words on them (like "kitchen" and "bathroom" and "heavy shit"), he finally spotted a small, transparent plastic box that contained a few light bulbs. Crouching into the corner to retrieve them, he noticed something he hadn't seen the few times that he'd been up here: A small, heart-shaped box, almost hidden entirely by the layers and layers of dust that were covering it.
Ready to reveal an old family secret or a bomb or, more realistically, just some weed in a little bag, he shuffled closer to the box and reached out to grab it. It was dusty. And kind of disgustingly sticky. Why was it *sticky*?
***
Light bulb changed, box dusted and un-sticked with a sponge that he now *desperately* wanted to throw away, Jeremy was ready to open it and reveal the weed-covered family bombs inside. The box was made of a thick cardboard-y substance (that was the technical term, he was sure), and dusting it revealed that it had been pink all this time.
The box contained several pieces of paper, a tiny, butt-shaped pillow that was probably supposed to look like a heart, and a silver necklace that represented half of a heart. Presumably, it was one of those where another person wore another one that was the opposite half, and it was a metaphor for their undying love, or a metaphor for the fact that a lot of people get divorced. Jeremy was never really sure. All in all, it was a lot of heart-shaped, love-related items, though.
But who had the other half of the necklace?
Clearly, this box had been meant for someone else. Obviously, it was not meant for *Jeremy*, but he knew that. He thought that it must've been meant for someone other than the person that had put it in his attic. Which was probably the previous owner of the house. Reading them, Jeremy quickly realized that the pieces of paper were actually letters. Love letters to someone named *Barb*. Was that even a *name*? Maybe it was short for Barbara?
There was one letter that stood out to him in particular. Most of the other ones seemed like they were just kind of *in* the box without actually belonging there (they were short notes about making plans and meeting up and holidays), but there was one that was clearly about this very box.
*My beloved Barb,*
*Before you, I never met anyone who was quite as intoxicating, as filled with love, as passionate as you. I want you to know that, now and forever, I love you.*
*I did not tell you this before, because I was scared. I was worried that you would not feel the same about me. I was worried about so many things. But now that our paths are about to part, and now that we might never see each other again, I need to give you this.*
*It is all the things I could never give you. It is all the things I bought, and made, and wrote, and then stowed away instead of giving them to you. Because I was scared.*
*But I will not be scared this time.*
*I love you, Barb.*
Well. To say that Jeremy was moved by this letter was an understatement. Jeremy, as few words and thoughts as he had, he really had a lot of space in his heart. And clearly, Barb, whoever they were, had never received this box... right? In his head, he calculated how old this box could *possibly* be. None of the letters seemed to be dated, and none of the other items were food, so they didn't have expiration dates. The butt pillow had a little sign attached to it that was filled with washing instructions and small print, but also had the number 95 on it. Was it made in 1995? Maybe. Probably not, though. No one post-1995 was named Barbara, let alone *Barb*. And the previous owner had never mentioned a Barb, or a Barbara, or a barbarian, or anyone like that.
More importantly, what was he even going to do with this knowledge? And this box? Was he really going to spend his afternoon trying to figure out how to get it to its rightful recipient? And what were the ethics of doing that, anyway? What if this anonymous romantic had already moved on from Barb, probably to a person with a human name?
No, he was determined now. Jeremy loved love. He'd have done anything for love. Even chase down a person that might not exist based on some information from a sticky pink box.
One thing he knew for sure was the house's previous owner's name: Mariland Smith. Also not a human name, he noted. Maybe Mariland knew something about this box of butts and secrets.
Mariland was easy enough to reach, given he'd already talked to them a few times about the bathrooms and the piping and the power bills and the keys and how to get up to the attic. Weird then that they'd never mentioned a mystery box up there, though.
"A Barb, you say? Hmm," Mariland began after Jeremy told the story. Of course, Mariland didn't point out how peculiar the name Barb was because they had an equally ridiculous name. Instead, they pointed out that they'd rarely used the attic and that that was probably the reason they never saw the package. Made sense, Jeremy guessed.
After some silence, Mariland gasped.
"Actually, one of the neighbors did talk about a Barb from time to time. I think it was Mr. Garcia just down the road. You know, honey, I'm really sorry, but I didn't really know many of the people there."
Jeremy smiled. That was surprisingly helpful. "Thank you so much, that is honestly really helpful," he said earnestly, and after some goodbye-ing of the regular sort, he hung up.
***
Mr. Garcia, while being very old and exceptionally grumpy, actually had quite a bit of useful information for Jeremy. It wasn't the wild goose chase he feared to find out that Barb was, amazingly, short for *Abigail*, which seemed like some made-up shit to Jeremy. Maybe they read the first two letters backwards? And then added more random letters? Whatever.
A-barb-igail turned out to be an older lady that also used to live in the neighborhood, but Mr. Garcia didn't know whether she still did, or whether she was even still *alive*. How reassuring. He also made sure to point out to Jeremy that he'd never liked people like her, too eccentric, too loud, and too fully of energy. Thanks, Mr. Grumpy.
He made his way down the street to where Abigail-slash-Barb's house was meant to be. With Jeremy's luck, he'd probably find some ruins there, or a small forest, or a full-on black hole. What he really found was a small bungalow with washed-out, light blue side panels. It looked a lot smaller than his new house, but the roof looked a little less steep and the foundation seemed different, so he didn't know for sure.
He rang the doorbell, *praying* for the person opening to be Barb, with a sign hanging around her neck that says "Hello, I am Barb, and you don't have to speak to more people. This whole adventure was not a mistake, and it is now over, you have successfully found me." A short woman with a long ponytail opened the door. Jeremy introduced himself, and tried to get to the point as quickly as possible.
This was not Barb. Of course, it wasn't. It was Lucy. Jeremy told the story of the box, and the butt-shaped pillow, and the adorable note, and the half-heart-shaped necklace, and Lucy listened with wide eyes, and she was beaming.
"My gran... she never *knew*," she suddenly said. Wait, her *grandma*?
"Wait, y-your *grandma*?", he stammered.
She laughed. "Abigail. Yeah. I would always call her 'Granny Abby', but she tried to get everyone to call her Barb. I don't know why."
Jeremy sighed. She couldn't have said this at the start? When he asked about a Barb? Well, at least *Lucy* had a normal name.
"Down the road, you said? The green house?", she asked.
His new house wasn't really green anymore, since nobody had repainted it in a few years, probably even a decade. Jeremy didn't mind, because he never saw the outside much himself, and he couldn't care less what some strangers down the road thought of the state and dilapidation of his house.
"Yea, Maple 17," he replied.
"Evelyn Sherwood", she muttered somberly. "Her and Abby were best friends. Ever since I can remember, they spend most of their time together. Of course, no one thought about it at the time because an old lady like that--people thought she'd have herself figured out, I guess. Maybe they just didn't talk about it much back then, either."
Lucy had been staring into the hallway from where she was sitting, with a kind of intensity that implied she was focusing on something. But there was nothing there. What was she picturing?
"Yea, people had to be a lot quieter about it back then." He paused for a second to arrange his thoughts. All of a sudden, he had a lot of those. Emotions, too.
"The letter makes so much more sense to me now," he finally said. "She said that she was too scared to tell your grandma. Maybe it wasn't just about the anxiety for her."
"Yea," she said under her breath, which had become heavier. "I can't believe she never-"
Lucy let her head drop gently onto her folded arms, which were resting on the table. Jeremy sat there quietly, not knowing what to do. Surely, anything would be better than just sitting there like a fucking idiot, he thought. So he took the leap and trusted his instinct.
"I'm so sorry, Lucy," he said. He waited a second in an attempt to figure out if she heard him or not. "When did she pass?", he asked finally.
It took a few moments for Lucy to catch her breath. Awkwardly, she used the sleeves of her purple sweater to wipe away her tears, along with most of her makeup.
"It's been almost a year now," she muttered. "We're still not fine. I know it's- I know it seems pathetic, but my mom hasn't recovered yet, either. She never spent more than a week away."
Jeremy hastily searched his jacket and jeans pockets for a pack of tissues. Once he finally found it, he placed it on the table in front of her.
"It's not pathetic at all," he managed. He was awful at social situations, let alone situations in which someone was crying because they suffered a tragic loss. Jeremy was completely out of his depth here, but somehow, he still felt like he was managing fine.
"I know," she said sniffly. "It's just hard for us." She took one of the tissues. "Thanks."
Jeremy looked at Lucy as she blew her nose and used a second tissue to pat her face dry. It was a mess now, with her black eyeshadow having spread lines all over her face. But he didn't mind at all. He understood emotions well (at least he liked to think so), and he understood how hard it was to lose a loved one.
They sat for a little longer before Lucy recovered somewhat and went to make some tea for the two of them.
***
A few days had passed, and Jeremy found out a lot more about Barb, Evelyn and their story. He and Lucy had been talking frequently, and with every time she talked about their story, she seemed to lighten up more. It started out just like that first day, with her crying, and Jeremy feeling awful about asking in the first place. But as their conversations went on, Lucy started to seem excited about the love story that could have been.
That day, she called him on the phone while he was in the kitchen, sitting over his laptop and eating a bowl of cereal. He picked up the phone.
"Oh my *God*," Lucy immediately began on the other end, with a kind of excitement in her voice that Jeremy didn't think he'd heard from her yet. "I completely forgot that they went to the same *retirement home*!"
Retirement home? "Retirement home?", he asked out loud.
"Abby and Ev! Like five years ago, my mom got busier with her job because of some big promotion, and obviously I was at school all day, so my grandma decided to move into a home, and she visited home every weekend. But she talked about that place all the time, because Evelyn lived there and talked about it all the time! *That's* why she said in the letter that they might never meet again!"
Jeremy finally understood what she was implying, and he was smiling now. "Wait, and so you think-"
She didn't interrupt him, per se, as that was exactly what he'd wanted her to do. "*They shared a room*, Jer," she said, as if this was some big life-changing revelation for her. Maybe it was.
"Shared a *room*? I didn't even know you could do that in a retirement home," he said, half-surprised, half-excited.
"There is *no way* that Ev didn't admit it to her all that time. Absolutely no way. Jer, they were *literally roommates*, and none of us got it. Oh my God." Lucy seemed like she couldn't stop talking. It was all just flowing out of her, but Jeremy really enjoyed hearing her like this.
They talked for a little longer, and Lucy told more stories about Ev and Abby, and Jeremy loved listening to it all. He imagined her grandma and Evelyn, going on dates, and holding hands at the lake, and eating dinner together. Lucy imagined them sitting together, outside, on a porch swing, with their hands intertwined, looking out at the sunset. It was a perfect date straight out of a movie, the way she seemed to picture it.
After they both hung up, he finally finished his cereal, and he started thinking about the box again. Once he was done eating, he fetched it from on top of his kitchen cabinet, where he'd put it to avoid having to enter the attic again.
He grabbed the small, heart-shaped pillow out of the box and held it in his hand, squeezing it slightly. It was still kind of sticky, but this time around, Jeremy didn't seem to mind. Right now, he was feeling inexplicably brave.
He picked up his phone and started typing up a message to Lucy.
"Speaking of perfect dates," he started. "Wanna see a movie tonight?"

View file

@ -1,189 +0,0 @@
---
layout: blog
title: 🚢 The Cruise That Changed it All
description: "Tom didn't like his mom's friend's son Jaz, though he wasn't entirely sure why. But stuck on a ship with him, he found out a lot about him, and even more about himself."
tags: [Short Stories, Featured]
book: true
reedsy: https://blog.reedsy.com/short-story/pyifvi/
discuss: https://twitter.com/Ellpeck/status/1550207100785147906
---
Tom was not normally one to dwell on specifics, but when his mother reminded him that he'd promised he would join her on this cruise, he got just the tiniest bit defensive. Because while, yes, he'd *technically* promised her he'd join her, it wasn't necessarily without any coercion or guilt-tripping, both of which his mom was absolutely famous for. Because what his mom hadn't told him was that this cruise would be *two weeks long* and that her best friend Suzy and her incredibly annoying son Jaz would be joining them.
"Honey, you have to give Jaz a chance," Tom's mom was saying in what he perceived to be an overly accusatory tone. "I don't even understand why you don't like him."
She knew *exactly* why Tom didn't like him. "You know *exactly* why I don't like Jaz", he replied, in a similarly accusatory tone. Tom threw a half folded t-shirt at her, and she picked it up and sighed.
Jaz had always been a little too much for him, admittedly. Because, while Tom was somewhat outgoing and *did* occasionally like to go on parties, or hang out with friends, or get a little drunk, Jaz did all of those things *constantly* and never stopped talking about them, ever. We get it, dude, you're so good with the guys that there isn't a single one you haven't seen naked yet.
There was, Tom had to admit to himself, a little jealously hidden in that criticism of Jaz. Because occasionally Tom asked himself why he hasn't had sex yet---as any 20-something guy would, or so he thought. The only difference being that, according to what he heard from his friends---and Jaz---, usually people actually *wanted* to have sex, and enjoyed the idea of doing so.
Not Tom. Admittedly, he never quite understood what all the fuss was about. He felt kind of ashamed about it, too, in a way. He didn't really enjoy talking to his friends about sex, either. They'd all go on and on about how amazing it was, and how much they'd been looking forward to their first time. Meanwhile, Tom would always feel like there was something wrong with him for not being interested in pursuing that.
Maybe that contributed to his hatred of Jaz.
Or maybe Jaz was just really annoying.
***
Tom had his own cabin adjacent to his mom's one. A few days had passed on the ship and, despite his expectations, Tom was actually enjoying himself. Jaz's cabin was just down the hall from his, and occasionally they'd cross paths, but they wouldn't speak much. Tom didn't really want to, and it seemed like Jaz probably knew that he didn't want to.
One evening, after the four of them had eaten dinner together and their moms had stayed to grab drinks at the bar, Tom was stopped by Jaz in the hallway unexpectedly.
"Hey, dude, I wanna talk to you," he said after tapping him from the shoulder from behind. He sounded out of breath. Was he *running* after Tom? Kinda creepy.
Tom immediately felt himself pulling a face. "What? Why?", he demanded.
"Well," Jaz began while scratching the back of his head. He was just standing there now, looking... confused? Guilty? Worried? Tom couldn't tell.
"I feel like you don't like me, Tom," he said, before looking up again and meeting eyes with him. "And I want to know why."
Tom froze. Oh God, this was it. This was the type of situation that he *really* didn't know how to deal with.
"What?", he said after a couple seconds of deliberating whether to tell the truth. Apparently, his brain had accidentally decided not to tell the truth. Great. "I like you! Why wouldn't I?", he said.
Tom had averted his gaze, but now turned to meet eyes with Jaz again. Jaz looked *sad*. "You sure?", he asked. His eyes narrowed before he continued, "It's not because I'm trans, is it? Because my mom always gave me the impression that you'd be totally cool with that."
Jaz was...? He-- what? Tom just stood there and said nothing for a good ten seconds or so. Jaz closed his eyes and sighed.
"Wait, what?", Tom finally asked.
"Wait," Jaz began again. "You didn't *know*?"
Tom was embarrassed now. He felt his face heat up and Jaz could probably observe it turning bright red like a goddamn tomato.
"Oh my God, you're the first person in the *world* that didn't immediately realize. Are you *serious*?"
"I-- I'm sorry," Tom heard himself say.
"Dude! Sorry for *what*? I'm passing, I'm fucking *passing* and I didn't even *realize*. This is *amazing*!", Jaz exclaimed, and immediately pulled Tom in for a hug.
Tom felt some of his worries ease away, sure that Jaz had forgotten about the whole *Tom hates me and doesn't want to tell me why* situation. Tom reciprocated the hug, and they just stood there in the hallway for a minute, hugging like a couple of idiots.
But Tom felt vulnerable now. And, to him, vulnerable meant honest.
"Actually," Tom began after Jaz finally pulled away. "I used to think you were kind of... annoying?" Tom ended with a rising tone, as if to inquire whether Jaz understood what he meant. Instead, Jaz frowned. Oh, no.
"I-- don't get me wrong, I think you're really cool, and-- this is not about you being trans *at all*, but I just-- you always talk so much about the--", he stammered. He was making a fucking fool out of himself.
"Oh God," Jaz interjected. He turned bright red and averted his eyes. "You think I'm just some horny fuckboy, don't you?"
Weirdly, Tom was happy that Jaz just said clearly what Tom had tried so hard to eloquently describe. But how to continue this hell of a conversation now was the tricky part. So he didn't, and he just stared instead.
Jaz, out of nowhere, started to laugh. "I mean, you know... I kind of *am*. I don't blame you."
For some twisted reason, Jaz seemed to be totally fine with Tom essentially insulting his entire *lifestyle* just then, and so Tom decided that he absolutely had to fix this situation. Just *how*, he wondered.
"N-- no, it's not really that. I mean, kind of? It has to do with that. I-- whenever you talk about this-- whenever my *friends* talk about this--", he began, and immediately wished he hadn't. But there was no turning back now.
"It's not about the *amount* of sex you have. Like, at all. It's just that... you all seem so *excited* about having sex, and I'm happy that you are, but I've never felt that way about it. Talking about it just makes me feel kind of... weird? Like, why am I not interested in this? Why is everyone excited by the idea, and I'm not? Is there something wrong with me? I don't--" Tom started to cry now. Tears were flowing from his stupid eyes like a stupid goddamn waterfall, and he was just standing there like a stupid fucking idiot.
And then Jaz laid his hand on Tom's shoulder and frowned again. "Dude," he said. "There's nothing wrong with you. Not everyone's interested in sex."
Tom tried to wipe his eyes on his sweatshirt sleeve without much success. "Clearly, you haven't talked to a human before."
Jaz chuckled. "I'll have you know that I've talked to plenty of asexual people in my life."
Asexual people?
"Asexual people?", Tom asked, puzzled.
"Ah," Jaz said and smiled. "Well. When someone identifies as asexual, they usually aren't interested in having sex, or they're only interested in having sex in certain situations, like with a partner they feel emotionally connected to. Well, it's a spectrum, really. But it's not *weird* or *broken*. At all."
Wow. Well... that was a whole-ass *revelation* to Tom. He stared at Jaz, who was looking back and still smiling. "Oh my God," Tom finally said. "I'm such an idiot."
Jaz laughed, again, because apparently that was all he did nowadays. "Dude, it's okay," he said. "Not everyone knows everything."
That was true, Tom had to admit. But how had he not known about this? Jaz made it sound like there was this entire *community* of people that probably felt exactly like he did, and he never cared to do *any* research about this? He felt like a proper idiot now.
"I guess," he began again. "I never did any research on this because... I just felt so strange about it," he admitted to himself and to Jaz.
Jaz nodded, and pulled him in for a hug again.
Before this, Tom had never known how thoughtful Jaz was. How caring.
***
Tom did not want to admit it, but that interaction had really changed things for him. He was tossing and turning in his bed, going back to grabbing his phone and looking up asexuality on the internet over and over again. He blamed himself. He couldn't believe that it had taken him this long to find out about it. He knew that people always say that "it's never too late to find yourself", and that you shouldn't blame yourself for struggling with your identity. But he blamed himself anyway, because that's just what he did.
When it got to the morning hours and the light started creeping into his cabin, Tom pulled himself out of bed and put on the first coherent outfit he could find. Like someone from those teen movies he occasionally watched with his mom, he mulled it over in the mirror before switching to a different one. While undressing, he wondered why he was even doing this---something he didn't recall ever doing before.
It wasn't for Jaz. That much was clear.
It was for a totally different occasion that had nothing to do with Jaz.
Yea.
***
The two families met up for breakfast, just like they'd done every day while on the cruise, and Jaz sat down opposite Tom and smiled. After engaging in various conversations about the previous few days, the night and the plans for the day ahead of them, their moms left to go to the bathroom. Tom was about to get up to get more orange juice, but he hesitated when he noticed that Jaz seemed to be intently staring at him.
Jaz's light blue eyes were fixed to his, and after a few seconds, Jaz started to smile. Sitting there across from Jaz, Tom noticed for the first time how beautiful his eyes looked, and how his dark brown bangs were covering his eyebrows. He wasn't sure if Jaz styled them or if they were naturally this curly, but he felt it'd be weird to inquire about that now. Eventually, Jaz picked up his own glass and started walking away, presumably to get more juice for himself. Too mesmerized by Jaz's eyes, and movements, and his stupid curly bangs bouncing as he moved, he totally forgot to ask Jaz to get him a refill too, or to just tag along to the juice bar. What was going on with him?
After Jaz was out of eyeshot, Tom decided to get his act together and started focusing on his breakfast again, slowly working away at the massive pile of tasty things he'd picked up from the buffet. When Jaz came back a minute or so later, he plonked down a full glass of orange juice next to Tom's empty one, and then placed down another one next to his own plate. Tom was confused for a moment, because social cues weren't necessarily his strong suit, but after a moment of silence, Jaz smiled down at him and said, "Thought you might want some more juice."
"Thanks," Tom said quietly and lowered his head again, trying to focus on the massive tower of vegetables, bread rolls and cold cuts in front of him.
Jaz was really thoughtful, he thought to himself then, and felt his face getting warmer. He was blushing. How embarrassing. This was just a meaningless gesture, right? Nothing to blush over. Nothing to obsess about. Right?
After their moms came back, Tom sat in relative silence for the rest of the meal.
***
After breakfast, Tom's mom suggested going to the pool on the roof. Jaz's mom seemed skeptical at first, but was easily swayed by her son's suggestion of a big glass of lemonade and a deck chair.
Tom did not like the pool idea. He'd always been insecure about his looks, especially his belly and his legs, which was why he rarely ever wore shorts in the summer. Meanwhile, Jaz always rocked crop tops and cute hats, and yea, maybe Tom was a little jealous of that. Sometimes, he wished he could have the effortless confidence that Jaz seemed to have.
When they got to the pool, their moms immediately pulled off their bright summer tops and jumped into the water, but Tom hesitated, because of course he did. He stood for a minute or two and just observed the water, the little waves and ripples it created and the effects that the bright midday sun had on it. He noticed that Jaz hadn't pulled his shirt off yet either, and that he was standing almost as awkwardly as Tom was. He'd never seen Jaz like this, he thought. Tom observed Jaz pulling his shirt up slightly, but then stopping just shy of his chest and letting go of the fabric again. It took him a few seconds, but eventually he understood why.
He understood anxiety like this. This was his *thing*, and for once, he felt like he knew how to talk about it.
"Hey, are you okay?", he asked quietly as he put a hand on Jaz's shoulder.
"Yea, I'm good. Just don't wanna take off this shirt, you know?", Jaz replied sheepishly and lowered his head again.
Tom asked why, even though he was almost certain that he knew why.
"Well, the...", Jaz started, but then hesitated. He turned a bit so Tom and Jaz were facing each other straight on, and then pulled up his shirt slightly higher than he had previously, revealing two horizontal scars on his lower chest. His top surgery scars, Tom thought to himself.
"These," Jaz said and pointed at one of them with his other hand. "They're from my top surgery a few years ago," he added.
"Oh," Tom said, trying to appear somewhat surprised. "They look cute, though."
For a second, Tom wasn't sure if he'd just said that out loud or just thought it in his head. But when Jaz started blushing and then smirking, he knew that he'd definitely said it out loud.
Oh, no.
"Well, I mean-- not *cute*, but-- well, not *not* cute-- they're like, when-- they--" Tom stopped for a second and took a deep breath. Jaz was still smirking, a little wider now.
"They're like--", Tom tried again. "They show that you went through something and came out on top, you know?" On *top*? Come on, Tom.
"Well, not-- on *top*, but like--", he began again. But Jaz put a hand on Tom's shoulder and laughed. "Don't worry, I get it."
Probably thinking about Tom's little wisdom, Jaz ran his hand along one of the scars. Finally, he said, "You're kind of right, you know? I shouldn't be embarrassed about them."
Tom breathed a sigh of relief before quietly telling him that, no, he doesn't have to be.
"Thanks, though," Jaz said and laughed again. "Wanna jump in together?"
***
At the end of the day, Jaz tapped Tom's shoulder in the hallway again, just like he did that one night, the night Tom noticed that there was something between them. Something other than hate or ambivalence.
Tom turned around and saw Jaz, his curly hair still messy ever since the pool, beaming the same way he did after Tom had talked to him about the scars. "Today was fun," Jaz said.
"Yea," Tom replied. "You're fun to spend time with," he added without thinking about it.
For some reason, he didn't feel like he had to take it back this time, though. Not only did he feel that it was true, he felt that Jaz had to *know* how Tom felt about him.
"Yea," Jaz said quietly, before taking a step closer to Tom. He seemed kind of insecure now, the way he was at the pool. Was there something else about his surgery? About his scars?
No, this seemed like a different kind of insecurity.
"So, uh," Jaz began, before moving in even closer. "We don't have to do anything else, but..." He gently took Tom's hand. "Do you maybe want to, uh, kiss?", he asked.
Jaz asked to kiss him, right then, in the hallway, where they had their first ever honest conversation. Where Tom learned that Jaz wasn't just some dumb idiot, but that he was funny, and caring, and *complex*.
Tom didn't reply; he just drew Jaz in for the kiss instead. And then they stood there, their hands intertwined, with their eyes closed and their lips touching for the first time.
Maybe it'd been meant to be like this all along.

View file

@ -1,117 +0,0 @@
---
layout: blog
title: 📚 My Favorite Reads of 2022
description: I read so many books this year! Here are some of my favorites, what I liked about them, and why you might like them too.
tags: [Reading, Featured]
mature: true
discuss: https://twitter.com/Ellpeck/status/1602678787220684802
---
2022 has been an interesting year, to say the least. I moved to a new city at the other side of the country, I continued my studies at a new university, and I read a *ton* of books.
Well, okay, not necessarily a ton by some people's standards. But seeing as I've only read about twelve books [last year](https://ellpeck.de/blog/reading_faves_2021/), and zero books the year before that, I think this year's twenty-nine[^1] books is a pretty good amount.
I'm tracking my reads using [the StoryGraph](https://app.thestorygraph.com/profile/ellpeck), which is an incredibly helpful tool for helping myself remember what I even read and how much I liked it. My favorite genre is romance, as you can quite clearly see looking at my [statistics](https://app.thestorygraph.com/stats/ellpeck?year=), but I try to read a nonfiction book from time to time, too.
Here's a list of some of the books I read this year that I enjoyed most. I'll try not to include any major spoilers in them, but I will talk about the story a bit to highlight the parts that I particularly enjoyed, and I'll also include some quotes I found funny, cute or otherwise relevant.
These aren't the *only* books I read this year that I'd recommend, by any means, but they're the ones I'd perhaps recommend most if you happen to like similar stuff to what I like. These are in no particular order, so this isn't a ranked list by any means.
# 📱 They Both Die at the End (and The First to Die at the End)
So, right off the bat, I need you to know that I don't usually read books with sad endings. While I agree that crying can be freeing, I also have a pesky habit of getting depressed about fictional dead characters for a week after they die. Which I don't particularly enjoy.
But when I saw *They Both Die at the End* by Adam Silvera, I didn't *know* it was going to be as bittersweet as it was. Well, I had some idea based on the title, of course, but for some reason I didn't clock that it was going to be a romance. A romance where both characters die at the end. *I cried so much.*
*They Both Die at the End*, and its prequel, *The First to Die at the End*, are set in a fictionalized universe where a service exists that will tell you about the day you're going to die. On the day, they call you on the phone and deliver the frankly disturbingly true prediction. They don't tell you why, or how, you're going to die, but they tell you that you *will* definitely die on that day. The stories are told from multiple people's perspectives, with each chapter being told either by one of the two main characters, or occasionally by some of the many side characters. The people dying, called "Deckers" (for a somewhat silly reason that will become apparent in the prequel), are encouraged to make their last day beautiful, and fill it with as many memorable moments as possible. In both books, this includes a boy falling in love with another boy (who may or may not also die today). They have a beautiful one-day romance, until death happens at the end and the reader cries themselves
to sleep, replaying the scene in their head for hours.
If you like close-to-reality sci-fi, and heartbreakingly tragic queer romance stories, then I really recommend these two books.
> "What the hell am I supposed to say?" I ask. "Speak from your heart," Dalma says. "Not your dick." "Speak from my heart, not my dick; speak from my heart, not my dick," I mutter like a mantra.
> He's got to be thinking I'm prepping for a kiss, which I mean, I'm not, but also, I wouldn't be mad at all. Damn, maybe I am thinking with my dick.
> "You're positive about a movie theater in the afterlife but not if you'll have your glasses? Seems like an oversight in your heavenly blueprint." He removes my glasses and puts them on. "Wow. Your eyes suck."
# ⚱️ I'm Glad My Mom Died
*If you struggle with physically or emotionally abusive relatives or severe eating disorders, this book and this section of the blog post may not be for you.*
We all know Jennette McCurdy, right? If you don't, she's an ex-actress (now writer and director) who used to work for Nickelodeon, with her most popular role having been Sam Puckett in *iCarly* and later *Sam & Cat*.
I'm Glad My Mom Died is her memoir about her childhood and early adulthood, which was hugely influenced by her abusive mother who forced her daughter into eating disorders and acting, neither of which McCurdy was particularly interested in herself. The book is deeply tragic, but also hopeful, and it depicts the actress, her family, her characters, and the people she worked for, in a raw and heartbreaking way.
I don't want to say that much more about the book's content here because I don't want to glamorize or romanticize McCurdy's experiences, but I do want to invite you to read the book for yourself. It really gives you another insight into how much of people's trauma isn't visible to the outside world, and how seemingly impossible it is to get out of an abusive situation when that situation your entire life. It also gives you a deep appreciation for honesty, openness, and mental health support through intimate friendships and therapy. It's also incredibly well written, making you feel like you're reading a diary that isn't meant to be read by anyone but the one who wrote it. The book's second section is also deeply hopeful, showing McCurdy's escape and subsequent healing from her traumatizing past.
# 🚀 Love on the Brain
Ali Hazelwood is a romance author who seems to primarily write stories related to academia in some form. Being a student, this should be deeply relatable to me, but being an antisocial mess, I rarely ever actually interact with people at university. Nevertheless, I read two of Ali's books this year: The Love Hypothesis in the first half, and Love on the Brain, her most recent release.
While I think they are both amazing, I'm passionate about Love on the Brain because it contains two adorable romances, a cast of hilarious characters, and a cute cat that may or may not be real. In the book, the main character Bee starts a job at NASA along with her assistant, where she meets her apathetic, but secretly adorable, love interest Levi.
If you love a good wacky romance, a punky queer feminist, and a chaotic story, you'll love... on the Brain.
> "Sorry." I scratch the back of my neck. "Just to be clear, you two were having intercourse with..." "With each other," she tells me proudly. "How did Boris even ... find you?" "Guy cam into our office looking for something, found us on your desk, ratted us out." "On *my*---why did you have to do it on *my*---" I stop. Take a deep breath. "To be clear." I look between them. "This was ... consensual?" "Very," they answer in unison, locking eyes and smiling like idiots.
> As I wait for the crowd to disperse, I take stock of the room. His team appears to be WurstFest™ material. The well-known Meatwave. A Dicksplosion in the Testosteroven. The good old Brodeo.
# ✊🏿 We Are Not Like Them
The story of We Are Not Like Them, by Christine Pride and Jo Piazza, is... *intense*, to say the least. The book is told from the perspectives of a pair of childhood friends: Riley, a black news anchor, and Jen, a white woman with a policeman husband named Kevin.
I think you can see where this is going.
After Kevin shoots an unarmed black teenager, Jen has to reevaluate her relationship with her husband while Riley covers the events and aftermath on the news. The book perfectly delivers the heartfelt, troubling accounts of both women, their interactions with each other, and the difficult question of what it all means for their relationship. In emotionally packed and heartbreaking descriptions, we also see Riley reporting on, and subsequently getting closer to, the mother of the victim and the rest of their family.
If you're into troubling, but deeply honest depictions of racial issues, and the effect they have not only on the victims and their families, but also on everyone around them, I highly recommend We Are Not Like Them.
> "They think it's so cool that my best friend is black." She rolled her eyes as she said it, but it was still clear that it was some sort of weird badge of honor for her, like I was a trendy accessory---otherwise why mention it at all?
> "You know, I used to think you were such a weirdo for getting annoyed when people want to touch your hair, but now that I've got this"---she places a hand on either side of her stomach---"I get it now. I'm like Aladdin's lamp. No one asks. They just rub." It isn't the same thing at all, but I let it go.
# 🏳️‍⚧️ Meet Cute Diary
Okay. Okay. Let's get back to *adorable stories*. The Meet Cute Diary, by Emery Lee, is a story about Noah, a trans boy who runs a blog that features stories about trans people finding love through adorable meet cutes. The only problem: They're all fake, and no one knows Noah is making them up.
It's a beautiful and sometimes heartbreaking story about what trans people go through, and the struggles that extend far beyond strangers and straight into personal relationships. It's also incredibly hopeful, though, depicting Noah as someone who gets more comfortable with himself and his identity while figuring out who is the one for him.
The story also includes a character who is trying to figure out which pronouns suit them best, and the book cleverly incorporates this process into the story by using the pronouns they're currently trying while talking about them.[^2]
> "They're your pronouns. You don't have to consider anyone else before you pick them." His eyes widen, and then I don't know hat changes, but he smlies like all his problems have melted away, and it really is a beautiful smile. "Thanks. Do you mind using they/them for me from now on?" I roll my eyes. "No, I don't mind. They're your pronouns." And they smile again, and for a moment, my heart feels heavy.
> He smirks over at me and says, "This is Noah, my boyfriend. Noah, this is Matt. We used to ski together." "Damn, dude, I didn't know you were gay," Matt says. Drew laughs. "I'm not. Noah's special." And I know he means it as a compliment, but it makes me feel kind of dirty, like I'm just not enough of a boy or too much of an anomaly to really be anything at all. I mean, it's not like he's a trans rights activist. He doesn't know better, so I'll just mention it when I get a chance. No big deal.
(*It is a big deal, though. This is awful. Don't be like this, please.*)
# 🌧️ The Sky Blues
The Sky Blues, by Robbie Couch, is a beautiful coming-of-age story about a high school student named Sky, who ends up starting a revolution at his school. After deciding to ask out a guy to Prom, his secret plans get leaked and an e-blast is spread around the school, containing and subsequently causing a wildfire of homophobic and racist rhetoric. But Sky doesn't back down, and his friends and allies quickly assemble a protest that threatens to get the prom canceled, but that might also save Sky's leaked promposal plans.
I absolutely adore this book. However, I do have to admit that some parts felt hard to read because they reminded me of my high school years, where I was still closeted due to the very fears that come true in The Sky Blues. It also gave me hope though, that younger people can feel empowered by the story and rise up for themselves or their queer friends as well.
It also contains the best teacher that has ever existed (or, well, *fictionally* existed), and I want her to have been my teacher in high school.
> "Please, for the love of God, don't tell me you were masturbating." "Stop!" "You totally were, weren't you?" "I can barely tie my shoes before eight a.m. I don't have the motivation to do that before school. I was shower-dreaming about him, sure. But that's it." "Shower-dreaming?" She tils her head, confused. "Is that gay for 'masturbating'?"
> "Principal Burger." Winter smiles. "Surely we can figure this out without taking prom away from students?" "Ms. Winter." Burger returns the smile, but maliciously. "How about this? Unless you plan on chaperoning your own prom for your Yearbook class, you'll need to enforce the ban." "Well," Winter sighs, thinking. "Okay, then." Burger blinks. "Okay you'll enforce the ban?" "Okay I'll be chaperoning my own prom for my Yearbook students," she says.
# 🔥 Smoke Gets In Your Eyes
Lastly, but certainly not least...ly, a great nonfiction book by one of my favorite YouTubers and activists: Caitlin Doughty, a mortician from Los Angeles who specializes in advocating for people having access to the body disposition options they want after their death.
Smoke Gets In Your Eyes is her first book (and my favorite of the three she's published so far), and it's about her early twenties, where she worked as a crematory operator. It's packed with funny, heartfelt, and sometimes rather serious stories, but also contains a ton of fascinating information about the funeral industry. As almost all of her content, it's also delightfully macabre in an incredibly endearing way.
If learning about deathcare traditions in various cultures is more your stlye, I also thoroughly recommend her From Here to Eternity, which, as the subtitle suggests, is all about traveling the world to find the good death.
> To my great annoyance I found him stacked below Mr. Willard, Mrs. Nagasaki, and Mr. Shelton. That meant stacking and restacking the cardboard boxes like a game of body-fridge Tetris.
> “Yes, Mother?” I probably called her Mom or Mommy, but in my memories Im a very polite British child with exquisite manners.
> But young lovers take note: above all else, the phrase every girl truly wants to hear is “Hi, this is Amy from Science Support; Im dropping off some heads.”
> The anxiety I felt was no longer caused by the fear of an afterlife, of pain, of a void of nothingness, or even a fear of my own decomposing corpse. All my plans and projects would come to an end. The last thing preventing me from accepting death was, ironically, my desire to help people accept death.
# Closing Remarks
I hope you enjoyed this little look into some of the books I really enjoyed this year. As I said at the top, for a more in-depth look at my kind of books, you can check out my profile on [the StoryGraph](https://app.thestorygraph.com/profile/ellpeck).
I also write my own short stories occasionally, so if you're into cutesy romantic stuff, you can check them out [here on the blog](https://ellpeck.de/#blog-short-stories) as well.
Feel free to let me know what you think about my picks, and also feel free to let me know what you read this year, and if you have any recommendations for what I should read next year. ❤️
[^1]: And counting! *The year is not done yet.*
[^2]: They don't end up using they/them pronouns in the end, but I feel it would take away from the storytelling to tell you the pronouns they do end up using.

View file

@ -1,190 +0,0 @@
---
layout: blog
title: 🤡 One Year of Tiny Life, and Cursed Comment Time
description: It's been exactly one year since I started working on my isometric Sims-style life simulation game Tiny Life, and since then, a lot has happened, especially in the realm of weird, funny and cursed comments in the code.
tags: [Programming, Featured]
discuss: https://ellpeck.itch.io/tiny-life/devlog/256839/one-year-of-tiny-life-and-cursed-comment-time
---
On this day, exactly one year ago, I made my first commit to the Tiny Life repository. Since that first commit, which included some code for the isometric perspective that the game uses, Tiny Life has come *a long way*.
![](commit.png)
If you don't recall just how long of a way it has come, or you don't even know about the game yet: Tiny Life is, as I wrote on its [itch page](https://ellpeck.itch.io/tiny-life):
> Tiny Life is a fun simulation game that tries to capture the essence of games like The Sims, but in an isometric pixelart style.
>
> In the game, you control a set of people that live together in a household. You take care of their daily needs, build their skills, forge new relationships... or just mess up their entire life in whatever way you can think of!
So, to celebrate, and because of a Twitter poll I did a while ago that made it clear that yall are interested in something like this, let's go through Tiny Life's current code and fish out some funny, cursed and weird code comments that just naturally come about when making a game that tries to simulate the personalities and behaviors of human people.
While this blog post *does* include a lot of programming-related humor, most of the comments are still funny and a bit ridiculous out of context, so you don't have to be a programmer to laugh along by any means.
![](search.png)
That should do for now. *Oh, boy.* Note that I'll just be going through them using the order they appear in these search results, so the funniest ones won't be at the start or the end, but just... somewhere in between.
First up, this is one that most of you will probably find pretty relatable.
```cs
// we want people to clean dishes when they're hungry to make space for food
Ai = {
SolvedNeeds = new[] {NeedType.Hunger},
}
```
This one is for the introverts (to whom I most certainly belong) out there.
```cs
// we only want to visit someone when we're currently at home for long enough
if (a)
return i.Person.LotVisitCooldown <= TimeSpan.Zero && i.Person.LastVisitedLot == i.Person.HomeLot ? Valid : Hidden;
```
Teenagers should probably remember this one. Consent is (very unironically) important, yall!
```cs
// automatic romance interactions should only happen if we're already romantic towards each other
return relationship?.RomanceLevel > 0 ? Valid : Hidden;
```
Fair enough.
```cs
// eat food if we're hungry
if (person.GetNeedPercentage(NeedType.Hunger) <= 0.5F && obj.ServingSize <= 1)
return ActionType.Eat.Construct(person.GetHeldActionInfo());
```
Especially in the city! Don't linger around too long, kids.
```cs
// move to the sidewalk once we're done driving
var road = this.Map.GetClosestRoad(car.Position.ToPoint(), Map.RoadRadius + 1);
```
You: Oh no, my car broke down!
Me:
```cs
// if the driving fails, we always want to walk to the goal in the end
return base.ShouldFail(completedAction, completion) && completedAction is not DriveAction;
```
Do yall also do this thing where you're like "I cleaned *a single dish*, now I can take a break"?
```cs
// should we start to take a break between actions?
if (this.OnBetweenActions(time, passedInGame, speed, current, completion)) {
this.isBetweenActions = true;
return true;
}
```
It might be sad to hear, but this is something *you* have to do as well.
```cs
// we want to prioritize going to work over sleeping automatically
if (this.StartedAutomatically && this.Person.Job != null && this.Person.Job.Type.IsTimeToWork(GameImpl.Instance.CurrentTime + TimeSpan.FromHours(1)))
return CompletionType.Canceled;
```
A bit creepy, don't you think?
```cs
// follow our partner until we reach them
if (this.IsMain) {
this.followTimer -= time.ElapsedGameTime;
```
Jesus Christ, mom, how many more times do you want to tell me that *same story*?
```cs
// we add the recent social to the relationship of the recipient
// so it represents an "I've heard this story already" list
relationship.AddRecentSocial(action.Type);
```
Also... fair enough.
```cs
// make lots more interesting if we have friends on them
lot = Random.GetRandomWeightedEntry(lots, l => l.Type.GetVisitPriority(l, this.Person));
```
It really *is* based on our mood how efficiently we work.
```cs
// if we're currently working, we should increase job performance based on our mood
var performance = this.Person.Needs.Values.Count(n => n.Percentage >= 0.75F) * 0.004F;
```
Does this also apply to *sleepovers*?
```cs
// the bed that we last slept in should be the one we try to sleep in again
if (this.HasCategory(person, ObjectCategory.Bed) && categories.HasFlag(ObjectCategory.Bed) && this.Id == person.LastBedSleptIn)
return 10;
```
Fair... enough.
```cs
// pee puddles should be more disgusting
DecorativeRating = f => f.Colors[0] == 1 ? -30 : -10
```
For this one, I especially like that I chose to name the variable `naked`.
```cs
// if someone isn't wearing pants and they aren't romantic with us, we should get (them) embarrassed
var naked = room.GetObjects<Person>()
.Where(p => p != this && p.GetRelationship(this, false)?.RomancePercentage < 0.25F && !p.WornLayers.HasFlag(ClothesLayer.Pants))
.ToArray();
```
This comment is, of course, in the `Person.Die` method.
```cs
// make friends sad
foreach (var rel in this.Relationships) {
```
You: I'm bored!
Me:
```cs
// if we don't have anything else to do, also try random actions
if (this.person.ActionQueue.Count <= 0 && this.person.CurrentActions.Count <= 0)
avail.AddRange(RandomActions);
```
Drunk people, anyone?
```cs
// don't do stuff that's inappropriate here
if (type.Settings.IsInappropriateElsewhere) {
```
Am I wrong? I say no.
```cs
// the front door is the closest door to the mailbox that connects outside and inside
var mailbox = this.GetObjects<Furniture>().FirstOrDefault(f => f.Type == FurnitureType.Mailbox);
```
Oh no, I *really* hope it isn't.
```cs
// is it just turning monday now?
var game = GameImpl.Instance;
if (game.Weekday == DayOfWeek.Sunday && (game.CurrentTime + passedInGame).Days != game.CurrentTime.Days) {
```
Clearly.
```cs
// if we're not loading from disk, we want to replace the floor with concrete
if (initializeRooms) {
```
*Am I wrong?*
```cs
// drywall should be considered ugly
if (wall.Wallpapers[side].BaseName == "Default")
rating--;
```
I said it once (multiple times, actually), and I'll say it again: *Am I wrong?*
```cs
// energetic people should be able to stay awake longer than others
public static readonly NeedType Energy = Register(new NeedType("Energy", 0.5F, p => ActionType.PassOut, p => p.HasPersonality(PersonalityType.Energetic) ? TimeSpan.FromHours(1) : TimeSpan.Zero, 10));
```
There we go, that's most of the funny human-related comments I could find with the very simple search I did. I definitely think some of these are *very funny* out of context, but what makes it even better is that some of them are also pretty funny *in* context. Humans really do act very weirdly sometimes, don't they?
All of that being said, thanks so much for reading this blog post. If you haven't already, you should definitely check out the game, as it is very much a passion project of mine, and I think it currently has enough content to be quite a bit of fun to play already.
You can download the game for free (or for a price of your choosing) on its [itch page](https://ellpeck.itch.io/tiny-life).
❤, everyone.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

View file

@ -5,44 +5,45 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto&display=swap">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">
<link rel="stylesheet" href="style.css">
<title>Actually Additions Manual</title>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<script src="../scripts/util.js"></script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-150032076-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
let gtag = function () {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'UA-150032076-2');
</script>
<script data-ad-client="ca-pub-5754829579653773" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
</head>
<body>
<div id="notices">
<!-- Cookie notification -->
<div id="cookieinfo"></div>
<script src="../scripts/cookieinfo.js"></script>
<!-- Notification about the fact that the manual is currently stuck on 1.12 -->
<div class="alert alert-warning alert-dismissible fade show" role="alert">
<strong>This manual currently uses information from the 1.12.2 version of the mod.</strong> To get information about Actually Additions for 1.20 and later versions, please use the in-game manual for the time being.
<button type="button" class="close" data-dismiss="alert" id="version-notif-close">
<span>&times;</span>
</button>
</div>
</div>
<div id="sidebar">
<a href="https://ellpeck.de">🏠 Main Site</a>
<a href="https://ellpeck.de/support">💸 Support</a>
<!-- Sponsor buttons -->
<div class="sellout">
<iframe src="https://github.com/sponsors/Ellpeck/button" title="Sponsor Ellpeck" height="32" width="116" style="border: 0;"></iframe>
<a href="https://www.patreon.com/bePatron?u=2494595" data-patreon-widget-type="become-patron-button"></a>
<script async src="https://c6.patreon.com/becomePatronButton.bundle.js"></script>
</div>
<hr>
<div id="sidebar-content"></div>
<hr>
<a href="https://ellpeck.de/impressum">📜 Impressum</a>
<a href="https://ellpeck.de/privacy">🙈 Privacy</a>
<a href="https://status.ellpeck.de">🚦 Status</a>
<a href="https://git.ellpeck.de/Ellpeck/Web">&copy; Ellpeck</a>
</div>
<div id="content">
<div id="entries"></div>
<div id="entries">
<!-- Cookie notification -->
<script src="../scripts/cookieinfo.js"></script>
</div>
<script src="index.js"></script>
</div>
<div id="footer">
@ -54,4 +55,4 @@
</div>
</body>
</html>
</html>

View file

@ -1,22 +1,22 @@
const replacements = new Map();
replacements.set(/<imp>([^<]*)<r>/g, function (content) {
return `<span class="imp">${content}</span>`;
return `<span class="imp">${content}</span>`
});
replacements.set(/<item>([^<]*)<r>/g, function (content) {
return `<span class="item">${content}</span>`;
return `<span class="item">${content}</span>`
});
replacements.set(/<n>/g, function (_content) {
return "<br>";
return "<br>"
});
replacements.set(/<i>([^<]*)<r>/g, function (content) {
return `<em>${content}</em>`;
return `<em>${content}</em>`
});
replacements.set(/<tifisgrin>([^<]*)<r>/g, function (content) {
return `<span class="tifisgrin">${content}</span>`;
return `<span class="tifisgrin">${content}</span>`
});
$.ajax({
url: "https://cdn.jsdelivr.net/gh/Ellpeck/ActuallyAdditions@1.12.2/src/main/resources/assets/actuallyadditions/lang/en_US.lang",
url: "https://gitcdn.xyz/repo/Ellpeck/ActuallyAdditions/main/src/main/resources/assets/actuallyadditions/lang/en_US.lang",
cache: false,
success: populateManual
});
@ -26,16 +26,17 @@ function populateManual(lang) {
let data = lang.substring(startIndex + 18);
let entries = $("#entries");
let sidebar = $("#sidebar-content");
let sidebar = $("#sidebar");
for (let topic of data.split("\n\n")) {
let lines = topic.split("\n");
let t = "<div class=\"entry rounded\">";
let t = '<div class="entry rounded">';
// first line is name
let name = lines[0].substring(lines[0].indexOf("=") + 1);
let id = lines[0].match(/chapter\.([^.]*)\.name/)[1];
let id = lines[0].match(/chapter\.([^\.]*)\.name/)[1];
sidebar.append(`<a href=#${id}>${name}</a>`);
t += `<h1 id="${id}">${name}</h1>`;
t += `<a class="anchor" id="${id}"></a>`;
t += `<h1>${name}</h1>`;
// following lines are content
for (let i = 1; i < lines.length; i++) {
let text = lines[i].substring(lines[i].indexOf("=") + 1);
@ -45,23 +46,21 @@ function populateManual(lang) {
entries.append(t);
}
// force-scroll to proper anchor
if (location.hash.startsWith("#")) {
let element = $(location.hash);
if (element.length) {
$("html, body").animate({
scrollTop: element.offset().top
}, 0);
}
}
sidebar.append("<hr>");
sidebar.append(`<a href="https://ellpeck.de">Main Site</a>`)
sidebar.append(`<a href="https://ellpeck.de/impressum">Impressum</a>`);
sidebar.append(`<a href="https://ellpeck.de/privacy">Privacy</a>`);
sidebar.append(`<a href="https://git.ellpeck.de/Ellpeck/Web">&copy; Ellpeck</a>`);
sidebar.append("<hr>");
forceToAnchor();
}
function replaceFormatting(text) {
for (let [k, v] of replacements.entries()) {
const finalV = v;
text = text.replace(k, function (_substring, group) {
return finalV(group);
return v(group);
});
}
return text;
}
}

View file

@ -1,9 +1,5 @@
html {
scroll-padding-top: 40px;
}
body {
font-family: Roboto, sans-serif;
font-family: Roboto;
margin-top: 30px;
margin-bottom: 30px;
background-color: #e2e2e2;
@ -24,7 +20,10 @@ body {
margin-top: 20px;
margin-left: auto;
margin-right: auto;
padding: 30px 40px;
padding-top: 30px;
padding-bottom: 30px;
padding-left: 40px;
padding-right: 40px;
background-color: white;
}
@ -74,18 +73,19 @@ body {
padding: 15px;
}
.sellout {
display: flex;
align-items: center;
flex-direction: column;
.anchor {
display: block;
position: relative;
top: -40px;
visibility: hidden;
}
#notices {
position: fixed;
top: 20px;
left: 50%;
transform: translateX(-50%);
z-index: 100;
.sellout {
display: block;
position: relative;
margin-left: auto;
margin-right: auto;
text-align: center;
}
@media (max-width: 768px) {
@ -129,4 +129,4 @@ body {
padding-left: 15px;
padding-right: 15px;
}
}
}

View file

@ -1 +0,0 @@
google.com, pub-5754829579653773, DIRECT, f08c47fec0942fa0

View file

@ -1,16 +1,8 @@
---
layout: blog
title: ⛔ Oh God, Please Don't Port Actually Additions
description: As Actually Additions celebrates its fifth birthday, I break down what I like and dislike about it.
tags: [Minecraft]
discuss: https://twitter.com/Ellpeck/status/1259600490377216002
---
On March 7 of this year, my overwhelmingly popular Minecraft mod Actually Additions [celebrated its fifth birthday](https://www.curseforge.com/minecraft/mc-mods/actually-additions/files/2229705). I personally made my last real contribution to the project [around mid-June 2017](https://github.com/Ellpeck/ActuallyAdditions/commits/main?after=896a082d747a3e19755ded1973544d59fa992787+244), so basically three years ago. Every now and again, though (and by that, I mean almost constantly), I still get asked about the project. The main question I get is: "Will you port Actually Additions to Minecraft 1.15?"
Here's the short answer: No, I won't. I haven't worked on the project in *three years*. But this post isn't about that. It's about why *you* probably shouldn't port it either.
I've grown a lot in the last five years. Yes, I've literally grown in the last five years - I'm 20 years old now. But I've also grown as a programmer, and more importantly, as a game designer. In this post, I'm going to reminisce about some features of Actually Additions, tell you why I added them, how I added them and what I'd do differently if I made the mod today. Since I can't be bothered opening a modpack instance, I'm just going to go off of the information from the [online manual](https://ellpeck.de/actaddmanual/) for this list.
I've grown a lot in the last five years. Yes, I've literally grown in the last five years - I'm 20 years old now. But I've also grown as a programmer, and more importantly, as a game designer. In this post, I'm going to reminisce about some features of Actually Additions, tell you why I added them, how I added them and what I'd do differently if I made the mod today. Since I can't be bothered opening a modpack instance, I'm just going to go off of the information from the [online manual](https://www.ellpeck.de/actaddmanual/) for this list.
# "Actually Additions"
When first starting out with the mod, it was called something like "Some Pretty Techy Stuff". I realized that was a *terrible* name choice though, so I changed it to "Some Pretty *Random* Stuff" pretty quickly. That wasn't much better, so after some (evidently not very much) consideration, I apparently settled on *the worst possible mod name*, "Actually Additions". It makes no grammatical sense unless you add a comma, and it's annoying to say for me because, as any non-native English speaker knows, saying "Actually" is very hard.
@ -38,7 +30,7 @@ If you really, *really* want to port Actually Additions to 1.15, at least remove
I still, to this day, *adore* the way I implemented Phantomfaces. They look good, they work well, they have unique functionality, but... **everyone uses them wrong**. They're not supposed to be a means of item transportation. How could I make them be more restricted to their intended use case? I don't really know, honestly.
# The Coffee Maker
Etho is my favorite YouTuber of all time, and always has been. When he first used the Coffee Maker in his HermitCraft modded series, I legitimately cried of happiness. Following that point, he made and used it in every modded series that it was available in.
Etho is my favorite YouTuber of all time, and always has been. When he first used the Coffee Maker in his HermitCraft modded series, I legitimately cried of happiness. Following that point, he made and used it in every modded series that it was available in.
I still think it's a great block with awesomely unique functionality, and I have been considering implementing something similar in functionality into my newer mod Nature's Aura.
@ -62,7 +54,7 @@ I personally especially love the item laser relays, because they can do almost a
The crystals, though... I don't think I'd want them to work the same nowadays. The names were ridiculous, the textures were weird and the materials used to make them were generic and boring. Actually, I originally picked the ridiculous anagram-ish names specifically because I *knew* YouTubers would have trouble saying them, and the thought of that was hilarious to me.
# Lush Caves
They don't fit the mod (because it's not a biome/world gen mod), so most modpacks disable them. I don't really understand why, though, because they add so much to the world!
They don't fit the mod (because it's not a biome/world gen mod), so most modpacks disable them. I don't really understand why, though, because they add so much to the world!
This game desperately needs a cave update.
@ -73,7 +65,7 @@ That's why the visual style of the mod is inconsistent and honestly pretty gross
Altogether, when playing the mod now, the texture and overall visual style of the mod make me feel like I'm playing some bizarre combination of old ruins, a tech mod and a confused magic mod.
# Honorable-ish Mentions
# Honorable-ish Mentions
**Black Quartz**. Why didn't I make it drop the item directly instead of the ore? I don't know. Weird choice, though.
**Smiley Clouds**. God, they're creepy. Yes, they were just supposed to be a clone of Botania's Tiny Potato. Were they as well designed? No. Were they as cool? No. Would I ever want them in my life ever again? Definitely not.
@ -95,6 +87,6 @@ Altogether, when playing the mod now, the texture and overall visual style of th
# What Do We Learn From This?
Well, I don't know if you learn anything from this, but there's one thing I learned for sure: I'm a lot better of a programmer and a lot better of a game designer now.
Sure, I'd still consider Actually Additions to be a pretty good mod, and it's definitely a nice project to be known for. But I don't think I'd do almost anything in the mod the same way nowadays.
Sure, I'd still consider Actually Additions to be a pretty good mod, and it's definitely a nice project to be known for. But I don't think I'd do almost anything in the mod the same way nowadays.
Also, I kind of think that Actually Additions has run its course in some way; it's lived its life. It's important to remember that there is a huge amount of new, unexplored mod ideas still out there, and that there are already some great mods that implement unique, new ideas. Shouldn't we let those mods step into the spotlight now?
Also, I kind of think that Actually Additions has run its course in some way; it's lived its life. It's important to remember that there is a huge amount of new, unexplored mod ideas still out there, and that there are already some great mods that implement unique, new ideas. Shouldn't we let those mods step into the spotlight now?

View file

@ -1,21 +1,13 @@
---
layout: blog
title: ⚔️ Big Projects
description: "How a once small project I even created a post about turned into the first game I'm selling: Foe Frenzy"
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1173247686654517249
---
So I'm releasing a game soon. In December, to be exact. Here's some stuff I did and learned after telling myself that [Foe Frenzy](https://ellpeck.itch.io/FoeFrenzy) would be a [Small Project](https://ellpeck.de/#blog-small_projects) until it suddenly became the first game I'd ever release as a commercial product.
# In Discord
After deciding that I'd only be selling my game on itch.io, I quickly realized that that might not be the best of ideas in the long run, because few people actually know about the platform - despite it being pretty great.
So I decided to also sell the game on Discord - the Skype-Teamspeak-IRC-hybrid that recently also became a game store. As it turns out, this was *surprisingly* easy: All you have to do is pay $25, go through a really well organized checklist that is provided in Discord's usual jokey writing style and submit. Tada! Your game's on Discord now.
By the way, in case you actually want to see what Foe Frenzy's Discord store page currently looks like before release, you should [join my Discord](https://link.ellpeck.de/discordweb) and check out its `#ff-store` channel (on Desktop). It looks pretty snazzy!
By the way, in case you actually want to see what Foe Frenzy's Discord store page currently looks like before release, you should [join my Discord](https://ellpeck.de/discord) and check out its `#ff-store` channel (on Desktop). It looks pretty snazzy!
## Oh, also:
As it turns out, Discord has a game SDK. And Achievement support. And Lobbies, and Multiplayer, and Invites.
As it turns out, Discord has a game SDK. And Achievement support. And Lobbies, and Multiplayer, and Invites.
And surprisingly, integrating all of that with Foe Frenzy wasn't necessarily the breeziest breeze ever, as I didn't really have any example implementations or anything of the sort at hand, but it worked out in the end!
@ -33,7 +25,7 @@ So for a rather long time now, I've been watching a YouTuber called [ThinMatrix]
So after some contemplating (and a lot of anxiety), I decided to send him an email, and quite quickly, he replied and said that, yes indeed, he would love to create the soundtrack for Foe Frenzy. So that's what he's doing now, and it's super awesome.
In case you haven't seen it yet, here's the announcement trailer for the game which features the awesome trailer theme that he created:
In case you haven't seen it yet, here's the announcement trailer for the game which features the awesome trailer theme that he created:
<iframe width="560" height="315" src="https://www.youtube.com/embed/Z7ZeuVBNuf4" frameborder="0" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
@ -51,4 +43,4 @@ So a feeling I have almost *constantly* is the fear that my game won't go well.
But also, in case you *do* buy the game once it comes out, and in case you also like it, please tell me. It would mean the world to me. Thanks so much.
Also, thanks for reading. <3
Also, thanks for reading. <3

View file

@ -1,12 +1,3 @@
---
layout: blog
title: ✨ Blogs are Cool, I Think
description: The first post and how I created it
tags: [Miscellaneous]
discuss: https://twitter.com/Ellpeck/status/1096937184601538566
archived: true
---
So I've been wanting to make a blog for a while, but never found the motivation to do so. Especially with all of the blog softwares out there, it was hard to figure out which one to use to make it fit this website and its design nicely.
I didn't really want to make a whole different page just for the blog because it would kind of throw the design off, so I took some inspiration from [Vazkii's blog](https://vazkii.us/#blog) and made mine work in a similar fashion. This still made it work with the single page design.

View file

@ -1,11 +1,4 @@
---
layout: blog
title: 🤷 But Do You Really Care?
description: On taking a break from social media
tags: [Miscellaneous]
---
Over the years, my views on social media and its purpose have changed many times. When I first started out using the internet, playing Minecraft and watching YouTube videos about it, I didn't really care about social media in general. Eventually, I created a Twitter account, just to be able to follow people and see their tweets, to see what the people I cared about were... caring about. Eventually, as Discord rolled around, I first just used it to talk to my friends, but I eventually decided that a server would probably be a good idea. So I created the "Ellpeck and Friends" server, which eventually evolved into the server [that it is today](https://link.ellpeck.de/discordweb).
Over the years, my views on social media and its purpose have changed many times. When I first started out using the internet, playing Minecraft and watching YouTube videos about it, I didn't really care about social media in general. Eventually, I created a Twitter account, just to be able to follow people and see their tweets, to see what the people I cared about were... caring about. Eventually, as Discord rolled around, I first just used it to talk to my friends, but I eventually decided that a server would probably be a good idea. So I created the "Ellpeck and Friends" server, which eventually evolved into the server [that it is today](https://ellpeck.de/discord).
So, the more I used Discord and Twitter, the more... *obsessive* I became about them. Every time I'd write a tweet, I'd sit there, staring at my screen for the better part of half an hour, seeing if anyone would reply, if anyone would like the tweet, if anyone would retweet, if anyone had an opinion on what I was saying. *If anyone approved*. Every time I'd say something in my Discord server, I'd actively wait for people to respond. To answer my question, to react to my joke. I wanted to know *if anyone approved*. Every time I saw that little red dot appear next to the Discord icon in the taskbar, I'd instantly stop whatever I was doing and figuratively *run* into my server to see what was going on. Did someone need my help? Did someone *finally* reply to that one message I posted two hours ago? No, it was just a new server member who joined, triggering one of those weird "a new user joined" messages.
@ -19,4 +12,4 @@ I realized that I shouldn't care that much what other people think about me; nei
So... if you're feeling like there's a lot of pressure on you whenever you tweet, or send a message in a Discord server, or write a Facebook post, then maybe you should try just not doing that for a little while. It might make you feel a bit better.
*This post won't have a discussion link, for obvious reasons.*
*This post won't have a discussion link, for obvious reasons.*

View file

@ -1,16 +1,7 @@
---
layout: blog
title: 😔 About Cross-Platform and Motivation
description: How moving from Java to C# taught me how horrible it is to create a cross-platform application with little to no knowledge or documentation
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1147502654236573697
archived: true
---
As originally a java kid, I've never had much trouble with making any of my programs work on Windows, Linux and Mac. With Java, all you have to do is make a jar and then tell people to install Java on their machine. That's it. But oh boy, am I getting hit in the face hard now that I'm making a game with MonoGame and .NET Framework.
# The story, with all its horrible parts
Imagine you're me. Imagine you're just happily making a game and eventually you decide that you want to distribute it to testers.
Imagine you're me. Imagine you're just happily making a game and eventually you decide that you want to distribute it to testers.
## The documentation
So you check the documentation of the framework you're using: MonoGame, in my case. It advertises itself as being amazing at cross-platform, so I look around to find a simple tutorial on what to do to get my game working on Mac and Linux.
@ -34,9 +25,9 @@ So then it finally works, and I have a... yea, no. Apparently now, mkbundle can'
Yea, just kidding. Now it crashes because it can't find `stdint.h`. It's neither telling me where it's trying to look for it, nor why it even needs it, what it is or really anything of use at all. Dead end.
## .NET Core
After some more looking, I find that .NET Core is basically a better version of .NET Framework (it's actually a lot different, but that doesn't matter in the scope of this post) that actually runs on multiple platforms natively.
After some more looking, I find that .NET Core is basically a better version of .NET Framework (it's actually a lot different, but that doesn't matter in the scope of this post) that actually runs on multiple platforms natively.
So I go through the process of upgrading my game project from .NET Framework to .NET Core, and everything finally works. I can really easily use my IDE (Rider) to publish packaged builds of the game for Windows, Linux and Mac that don't even need the user to have .NET Core installed.
So I go through the process of upgrading my game project from .NET Framework to .NET Core, and everything finally works. I can really easily use my IDE (Rider) to publish packaged builds of the game for Windows, Linux and Mac that don't even need the user to have .NET Core installed.
Except that it doesn't run on my Laptop for some strange reason. It runs fine on my PC, and it runs fine on my boyfriend's computer and his Linux VM, but my Laptop has some obscure issue about MonoGame not being able to load the shaders it requires. There are also no traces of the issue online, and after some looking around, I realize that MonoGame's .NET Core implementation is, according to the repository, just a hack that also hasn't been updated in over a year. Dead end.
@ -71,4 +62,4 @@ A couple weeks ago, I picked up this project again after taking a long break fro
And then this whole thing happened, and now my motivation is back to zero. It's just extra frustrating to me because I was so excited about finally getting back the motivation that I had previously lost.
So yea. Thanks for reading, I guess. <3
So yea. Thanks for reading, I guess. <3

View file

@ -1,31 +1,6 @@
---
layout: blog
title: 🔮 The Future of Actually Additions
description: Not wanting to accept the fate of Actually Additions, someone has come to its rescue. 1.16, here we come?
tags: [Minecraft]
discuss: https://twitter.com/Ellpeck/status/1330938597785169925
---
*TLDR: Actually Additions for 1.16.4 in the future. No ETA. No Fabric port. No 1.13, 1.14 or 1.15. Beautiful art overhaul. Don't ask Ellpeck anything ever. Stay awesome.*
# Updates to This Post
## June 2024
**The initial version of the 1.20.4 port has been released!** You can find it on [Modrinth](https://modrinth.com/mod/actually-additions/version/1.2.13+mc1.20.4) or [CurseForge](https://www.curseforge.com/minecraft/mc-mods/actually-additions/files/5416363). It still has a few features missing and some things are incomplete, but it's a very good foundation for the future of the mod.
I'd like to once again thank [Flanks](https://github.com/Flanks255), who was essentially the lead developer of the port for the last few months, as well as [Mrbysco](https://github.com/Mrbysco) and [MiKeY](https://github.com/MichaelHillcox), who did some amazing porting work, and of course [Ridanisaurus](https://github.com/Ridanisaurus), who made the amazing new artwork for the mod. Yall made this possible. ❤️
## March 2024
Development is [happening again](https://github.com/Ellpeck/ActuallyAdditions/commits/1.20.4/)! The, frankly, truly mad [Mrbysco](https://github.com/Mrbysco) has taken it upon himself to take porting matters into his own hands. [Flanks](https://github.com/Flanks255) is also helping. It's a whole thing. But yay!
## November 2023
Honestly, I don't know anymore. Progress has slowed to a halt, and with all the old-mod-renaissance stuff going on in 1.20, I'm semi-considering getting back into Actually Additions myself. I dunno. Let me know if you're interested in helping out or whatever.
## February 2023
Yes, the port is still being worked on. As pointed out numerous times, you can stay up to date with the port through [the `1.16` branch](https://github.com/Ellpeck/ActuallyAdditions/tree/1.16). Do not ask when the port will be finished. We don't know yet. It's a big task and the people working on it do so in their free time.
## November 2021
The port is still being actively worked on. You can stay up to date with the progress through [the `1.16` branch](https://github.com/Ellpeck/ActuallyAdditions/tree/1.16) on the GitHub repository.
# Why?
Before I start this post, I want to re-iterate that I haven't had a direct programming-related connection to Actually Additions in [over three years](https://github.com/Ellpeck/ActuallyAdditions/commits/main?after=896a082d747a3e19755ded1973544d59fa992787+244). I don't plan on changing this. This means that, if you have *anything* to say about the mod, be it issue reports or feature requests, **do not talk to me about that**. Go to [the issue tracker](https://github.com/Ellpeck/ActuallyAdditions/issues) or [my Discord](https://link.ellpeck.de/discordweb)'s `#minecraft` channel.
Before I start this post, I want to re-iterate that I haven't had a direct programming-related connection to Actually Additions in [over three years](https://github.com/Ellpeck/ActuallyAdditions/commits/main?after=896a082d747a3e19755ded1973544d59fa992787+244). I don't plan on changing this. This means that, if you have *anything* to say about the mod, be it issue reports or feature requests, **do not talk to me about that**. Go to [the issue tracker](https://github.com/Ellpeck/ActuallyAdditions/issues) or [my Discord](https://ellpeck.de/discord)'s `#minecraft` channel.
Okay, now that that's out of the way... let's talk about the future of Actually Additions. In [my last post](https://ellpeck.de/blog-actually_additions), I talked about the things I disliked about the mod and, in that same vein, the reasons that I don't want it to be updated beyond Minecraft 1.12. What I didn't necessarily make clear in that post is that this isn't really my decision, because I haven't touched Actually Additions in *a long time*. For the last few years, **Shadows-of-Fire** has been maintaining the mod (that is, fixing issues and publishing updates), which is also the reason that there haven't been any new features during that time. So what about now?
@ -39,15 +14,15 @@ So, as a result of that, **MiKeY** is basically the new, official maintainer of
A little while later, another person approached me: [Ridanisaurus](https://github.com/Ridanisaurus), who apparently really likes making beautiful art for mods. He asked me if I want new art for Actually Additions, and since I have some *opinions* about the current state of Actually Additions' graphics and visual consistency, I naturally said yes immediately. So yea, **Ridanisaurus** is basically the new, official artist of Actually Additions.
# What?
MiKeY and Rid are going to port Actually Additions to **Forge** for **Minecraft 1.16.4**. They are re-doing all of the art for the mod and they will also modify some of the features that I dislike, based on my personal feedback and the information outlined in [my diss track](https://ellpeck.de/blog-actually_additions).
MiKeY and Rid are going to port Actually Additions to **Forge** for **Minecraft 1.16.4**. They are re-doing all of the art for the mod and they will also modify some of the features that I dislike, based on my personal feedback and the information outlined in [my diss track](https://ellpeck.de/blog-actually_additions).
The art overhaul has already started (and even been finished, I believe), and because it is *gorgeous*, I'm going to show you some of the preview pictures that Rid has sent me right now. Enjoy.
![](faa_1.png)
![](blog/res/future_actually_additions/1.png =100%x*)
![](faa_2.png)
![](blog/res/future_actually_additions/2.png =100%x*)
![](faa_3.png)
![](blog/res/future_actually_additions/3.png =100%x*)
Don't they look *so good*?
@ -58,12 +33,12 @@ Since I know a lot of people will ask questions about this, here is a list of so
- We will *not* be keeping all of the features in the mod the same, especially not the Storage Crate, which will be getting a major overhaul.
- There will be *no* entirely new features, only changes to existing ones. Since this has been the case for the last few years as well, I don't think it's very surprising.
MiKeY has expressed great interest in helping me overhaul the features that I dislike and, as a result, making Actually Additions a better and more refined mod than it used to be.
MiKeY has expressed great interest in helping me overhaul the features that I dislike and, as a result, making Actually Additions a better and more refined mod than it used to be.
# When?
# When?
We don't know yet. *Please* don't ask.
# Thank You
So yea, that's about it for the news. I hope all of you are as excited about the port and the upcoming changes as I am. If you want to be kept up to date with the changes, you can check the [GitHub repository](https://github.com/Ellpeck/ActuallyAdditions) every once in a while (specifically [its `1.16` branch](https://github.com/Ellpeck/ActuallyAdditions/tree/1.16)) and join [my Discord server](https://link.ellpeck.de/discordweb), where we might post some updates from time to time.
So yea, that's about it for the news. I hope all of you are as excited about the port and the upcoming changes as I am. If you want to be kept up to date with the changes, you can check the [GitHub repository](https://github.com/Ellpeck/ActuallyAdditions) every once in a while (especially [its `clean-start` branch](https://github.com/Ellpeck/ActuallyAdditions/tree/clean-start)) and join [my Discord server](https://ellpeck.de/discord), where we might post some updates from time to time.
As an additional note, I would like to thank all of you for the continued support of not only Actually Additions, but all of my mods and even my non-Minecraft-related projects. Of course, there have also been some rude people, but all in all, yall have been an amazing community and I am so grateful that you enjoy the things I create. I love yall. ❤️
As an additional note, I would like to thank all of you for the continued support of not only Actually Additions, but all of my mods and even my non-Minecraft-related projects. Of course, there have also been some rude people, but all in all, yall have been an amazing community and I am so grateful that you enjoy the things I create. I love yall. ❤️

View file

@ -1,12 +1,3 @@
---
layout: blog
title: "☕ Java Tutorial, Part 1: Hello World"
description: The first part of my post series for programming beginners where I explain how to write code in Java.
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1182080078827737088
archived: true
---
So you want to learn to code. In my opinion, a good language for beginners is Java, because it's a rather easy to understand language, and it's cross-platform, meaning it can run on any operating system without the need for the programmer (you!) to change anything based on the platform. Also, Java is object-oriented (more on that later), meaning it's pretty good for writing any sort of simple or complex program.[^1]
So let's start!
@ -63,7 +54,7 @@ public class Main {
}
}
```
As you can see from line 6 and 7, to declare a variable, you need to put the variable's type first (`String` meaning text, `int` meaning an integer; a number without a decimal point), followed by the variable's name, which you can choose yourself.
As you can see from line 6 and 7, to declare a variable, you need to put the variable's type first (`String` meaning text, `int` meaning an integer; a number without a decimal point), followed by the variable's name, which you can choose yourself.
For now, these variables don't have a value assigned to them yet. That's done in line 9 and 10. To assign a value to a variable, you first put the variable's name, followed by an equals sign `=`, followed by your desired value. For numbers, you can simply put them down, but text has to be wrapped in quotes `""` (which is also why the text in lines 3 and 4 is wrapped in quotes).
@ -72,7 +63,7 @@ To actually do something with the variables, let's have them be printed out to t
System.out.println(someText);
System.out.println(someNumber);
```
As you can see, to print a variable's value to the console, all you have to do is put its name where you would usually put a piece of text directly.
As you can see, to print a variable's value to the console, all you have to do is put its name where you would usually put a piece of text directly.
# Variable Manipulation
Obviously, this isn't really that exciting yet: Our program isn't really doing anything so far. Let's manipulate our variables. I've added the following code:
@ -99,6 +90,8 @@ Before you click away, I'd like to ask you some questions that you can answer by
Anyway, thanks a lot for reading and happy coding! <3
***
[^1]: Also, it's what Minecraft mods are written in, which is probably the reason most of you are here.
[^2]: Compiling is what occurs when code written by you is converted into something that the computer can actually understand. More on that later, probably.
[^2]: Compiling is what occurs when code written by you is converted into something that the computer can actually understand. More on that later, probably.

View file

@ -1,13 +1,4 @@
---
layout: blog
title: "☕ Java Tutorial, Part 2: Intro to Conditions and Loops"
description: The second part of my post series for programming beginners. This one is all about conditions and loops.
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1182354544707198976
archived: true
---
If you're reading this, then I assume you have already read the first part of this tutorial series, in which we covered setting up a program, making it print "Hello World" to the console, as well as how to declare and set the values of variables.
If you're reading this, then I assume you have already read the first part of this tutorial series, in which we covered setting up a program, making it print "Hello World" to the console, as well as how to declare and set the values of variables.
Today, we'll be talking about conditions and loops.[^1] As with the last tutorial, I'll be writing most of the code snippets first and then explaining what exactly they mean and do right after.
@ -124,7 +115,7 @@ The current index is 0
The current index is 1
The current index is 2
```
As you might be able to tell from that, a `for` loop causes any number of instructions in it to be executed a certain amount of times.
As you might be able to tell from that, a `for` loop causes any number of instructions in it to be executed a certain amount of times.
Its structure is pretty similar to the `if` statement's: First, you write the word `for`, followed by some loop instructions inside parentheses `()`, and then you open curly braces `{}` which contain the instructions that should be executed multiple times. The loop instructions contain three parts, which are separated by semicolons `;`:
- `int index = 0;` is the declaration of the *loop variable*: This is the instruction that will be executed *before* the loop starts running.
@ -161,10 +152,12 @@ If you're stuck, you can check out my solution [here](https://gist.github.com/El
Thanks for reading this tutorial and I hope it helped you out! If you have any feedback or questions about it, you can click the discussion link below and ask me on Twitter, or join my Discord server using the widget on the main page. Happy coding!
***
[^1]: I'm covering this topic *before* I cover what exactly classes and methods are. I think that conditions and loops take importance here, because they're used broadly in every language as well as most programs, whereas object orientation is a feature specific to some languages, as well as specific to more "complex" programs. It's also somewhat complicated, and I want to explain it right, because when I learned Java, I didn't even remotely understand it correctly at first.
[^2]: Note that, when *comparing* two numbers, two equals signs `==` are used. This is different from *assigning a value* to a variable, which only uses one equals sign `=`.
[^3]: Why exactly this is the case will be discussed later when we get into object orientation. The different behavior mentioned here is the case for any variable types which aren't so-called *native types*. Any variable whose type starts with an uppercase letter is not a native type, because it derives from a *class*.
[^3]: Why exactly this is the case will be discussed later when we get into object orientation. The different behavior mentioned here is the case for any variable types which aren't so-called *native types*. Any variable whose type starts with an uppercase letter is not a native type, because it derives from a *class*.
[^4]: Named after [George Boole](https://en.wikipedia.org/wiki/George_Boole), a mathematician.
[^4]: Named after [George Boole](https://en.wikipedia.org/wiki/George_Boole), a mathematician.

View file

@ -1,12 +1,3 @@
---
layout: blog
title: "☕ Java Tutorial, Part 3: (Static) Methods"
description: In this Java tutorial for beginners, we cover what (static) methods, parameters and return types are.
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1182775985885847558
archived: true
---
I've been thinking about how to structure this tutorial a lot, and I decided to teach you all about methods *before* I get into object orientation, so you'll have to wait a little while longer before we get into the real nitty-gritty. To understand this one, you should've already read and understood tutorials 1 and 2. If you haven't, you can get to them by clicking the "Previous Post" button in the navigation bar.
So, here goes!
@ -138,7 +129,7 @@ As you can see, I created a method `square` that returns its parameter `i`, but
- The method's *return type* has to be declared. For methods that don't return anything, the return type is `void`. For methods that return something, just replace `void` with the *type of variable* that it returns.
- To actually return a specific value after it has been calculated, just type `return`, followed by the value and a semicolon `;`.
Now, this method can be used as if it were just another number: We can set variables to it and print it out. But instead of it being just another number, it actually executes the code inside it every time.
Now, this method can be used as if it were just another number: We can set variables to it and print it out. But instead of it being just another number, it actually executes the code inside it every time.
## Stopping execution
A thing that should be noted about returning is that any code that comes after a return statement will *not* be executed. In other words: After returning a value, a method will stop its execution, no matter what comes next.
@ -177,8 +168,8 @@ public static boolean isIGreaterThanJ(int i, int j) {
Because when `i` is *not* greater than `j`, the print statement will be executed but then, the method doesn't know what value to return, so this code will give out an error before it even tries to execute.
# Conclusion
So yea, that's pretty much everything important there is to know about (static) methods. In one of the next tutorials, we'll finally get into actual object orientation and we'll soon be taking a look at non-static methods, which are even more useful than static methods.
So yea, that's pretty much everything important there is to know about (static) methods. In one of the next tutorials, we'll finally get into actual object orientation and we'll soon be taking a look at non-static methods, which are even more useful than static methods.
As a little exercise, you might want to create some methods with different return types and different parameters and call them. Have some fun!
I hope you enjoyed reading, and of course: Happy coding!
I hope you enjoyed reading, and of course: Happy coding!

View file

@ -1,12 +1,3 @@
---
layout: blog
title: "☕ Java Tutorial, Part 4: Classes and Objects"
description: In this Java tutorial for beginners, we cover the basics of creating classes with a constructor, some fields and some methods and creating objects of them.
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1183857460660101133
archived: true
---
So you've gotten far enough into Java now that you'll finally be able to learn about what this "object orientation" jazz is that everyone keeps talking about. I feel like this is a somewhat complicated topic to explain, so bear with me.
# Classes
@ -148,7 +139,7 @@ myOtherTable.printLegAmount();
...then the result will be the same as before: `My table has 4 legs`, followed by `My other table has 25 legs`, because in `myTable.printLegAmount()`, `this` will be `myTable`, and in `myOtherTable.printLegAmount()`, `this` will be `myOtherTable`.
# Constructors
Constructors are a special kind of method in Java. You can't really execute them manually, but instead, they're automatically called every time a new instance is created (so every time you use the `new` keyword).
Constructors are a special kind of method in Java. You can't really execute them manually, but instead, they're automatically called every time a new instance is created (so every time you use the `new` keyword).
Let's look at the following example, which adds a constructor to our `Table` class that automatically sets the `legAmount` variable to 4.
```java
@ -205,6 +196,8 @@ If you're stuck, you can [get some hints](https://gist.github.com/Ellpeck/462022
Next time, we'll be talking about arrays and lists.[^5] Happy coding!
***
[^1]: Java's default `Math` class already has an `abs` method that does this same thing, but for the sake of this tutorial, we'll ignore it (because I can't think of any other utility method to add, in all honesty).
[^2]: Note that I explain why we're omitting the `static` keyword from now on a bit later in this tutorial.
@ -213,4 +206,4 @@ Next time, we'll be talking about arrays and lists.[^5] Happy coding!
[^4]: This example is one that almost every instructor uses. It might be a bit boring and ridiculous, but it's simple and helps understanding the concept, so I also like using it when teaching people how to code.
[^5]: Note that there is also another huge topic to talk about when it comes to object orientation, which is *pointers* and how Java manages objects and their assignment to variables (including pass-by-reference and the like). I'll cover that soon. I promise. <3
[^5]: Note that there is also another huge topic to talk about when it comes to object orientation, which is *pointers* and how Java manages objects and their assignment to variables (including pass-by-reference and the like). I'll cover that soon. I promise. <3

View file

@ -1,12 +1,3 @@
---
layout: blog
title: "☕ Java Tutorial, Part 5: Things I Left Out So Far"
description: In this Java tutorial for beginners, we cover some shorthands, some more data types, the difference between pass-by-reference and pass-by-value, null, as well as arrays and lists.
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1184894859133509632
archived: true
---
After that complicated stuff we did in the last tutorial, how about we take it down a notch in this one and talk about some additional things that I haven't mentioned this far, but that will still be very useful to you as a programmer. Most of these things won't really have much connection to each other, but I'll give you an example at the end of this tutorial that combines some of them into a single use case.
# Shorthands
@ -164,10 +155,12 @@ If you're stuck, you can [get some hints](https://gist.github.com/Ellpeck/3bdc69
Happy coding!
***
[^1]: Java's pointers work a lot differently from pointers in lower-level languages like C, because they're implicit: You don't create or manage them yourself. They're still called pointers though, so yea.
[^2]: Java has multiple types of lists (including, but not limited to `ArrayList` and `LinkedList`), but for the purpose of this tutorial, we'll only be looking at `ArrayList` since it's the most commonly used one and it also goes hand in hand with arrays.
[^3]: More on those in a later tutorial, probably. They're pretty useful.
[^4]: Which is also just another annoying property of Java that could've been implemented a lot better (like in C#), but oh well, it is what it is.
[^4]: Which is also just another annoying property of Java that could've been implemented a lot better (like in C#), but oh well, it is what it is.

View file

@ -1,12 +1,3 @@
---
layout: blog
title: "☕ Java Tutorial, Part 6: Inheritance"
description: In this Java tutorial for beginners, we cover classes extending other classes and the instanceof keyword.
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1189904487722487809
archived: true
---
For this tutorial, let's expand on the car dealership example from the end of the last tutorial: You have a car dealership, and you want to expand it to sell various other types of motor vehicles; let's say... motorbikes and trucks as well. Obviously, these different kinds of vehicles all have different properties: A motorbike requires the use of a helmet, and an important piece of information about a truck might be how big its storage area is.
Now, this is where object-oriented languages like Java shine.
@ -75,7 +66,7 @@ As you can see, the `Truck` class now uses the `amountOfWheels` field from its s
## `super`
Now, you've probably been wondering what line 5 means: `super(amountOfWheels)`. As we defined earlier, our `Vehicle` class takes one argument in its constructor: The amount of wheels that it has. As we also previously discussed, a constructor *has to be called* when a new object is created. So, when creating a `Truck` object, the `Truck` constructor is called, but, in turn, it needs to also implicitly call the `Vehicle` constructor.
When placing a `super()` call at the start of the constructor of a class, the constructor of the class that is being extended will be called. If that class takes a set of arguments in its constructor, we have to pass it those arguments, similarly to if we were creating an object of that class.
When placing a `super()` call at the start of the constructor of a class, the constructor of the class that is being extended will be called. If that class takes a set of arguments in its constructor, we have to pass it those arguments, similarly to if we were creating an object of that class.
That's what our `super(amountOfWheels)` is doing here: It's calling the constructor of `Vehicle` with the `amountOfWheels` argument.
@ -153,6 +144,8 @@ I'm sorry that I've been taking such a long break from the tutorials, but after
So thanks a lot, and happy coding! <3
***
[^1]: As you might be able to see now, this concept is called type *casting* because it's like we're putting the vehicle into a mold (or a *cast*) to reshape it into a different type.
[^2]: I was originally planning on including that in this tutorial already, but I noticed that that might be a bit too much after all, so I'll be doing it next time instead.
[^2]: I was originally planning on including that in this tutorial already, but I noticed that that might be a bit too much after all, so I'll be doing it next time instead.

View file

@ -1,12 +1,3 @@
---
layout: blog
title: "☕ Java Tutorial, Part 7: Overriding Methods"
description: In this Java tutorial for beginners, we cover overriding methods, calling superclass methods and toString().
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1199339701640945664
archived: true
---
So it's been a hot minute since the last tutorial, and I apologize for that. However, it seems like there are some people that actually use these tutorials to properly learn Java, and so I didn't want to leave you all hanging.
Today's tutorial is going to cover method overrides, which are another awesome object orientation concept that will help you out greatly when programming.
@ -229,6 +220,8 @@ Note that you can find some methods and constants you might need in Java's defau
As always, happy coding!
***
[^1]: Annotations are another rather advanced topic that almost never comes up when using Java. They can be useful sometimes, but you'll hardly ever have a use for them.
[^2]: Which, in this case, would obviously be a bit of a nonsensical order to display this information in. But you get the idea.
[^2]: Which, in this case, would obviously be a bit of a nonsensical order to display this information in. But you get the idea.

View file

@ -1,18 +1,9 @@
---
layout: blog
title: 😢 Lows
description: About depression and what it feels like when I don't know what to do with myself
tags: [Miscellaneous]
discuss: https://twitter.com/Ellpeck/status/1186028260838334471
archived: true
---
So some of you might be disappointed that this *isn't* the next Java tutorial. Well, today and the last couple of days, I haven't been feeling like working on those, because.. I've been depressed again. I never know how to describe it, or how to say it without seeming like it's just.. something I say when I'm too lazy to work on things.
So some of you might be disappointed that this *isn't* the next Java tutorial. Well, today and the last couple of days, I haven't been feeling like working on those, because.. I've been depressed again. I never know how to describe it, or how to say it without seeming like it's just.. something I say when I'm too lazy to work on things.
This post will probably be a little all over the place, because that's also the mood that my head is currently in, but I'll try to explain to you what it feels like to me to have a low low follow a high high, mood-wise.
# Highs
When I say that I'm depressed, it means something different than when I say that I'm suffering from depression. Because, for me, depression isn't a constant state. Before depression hits, I have long periods of highs, long periods of what non-depressed people would probably just call.. normal moods.
When I say that I'm depressed, it means something different than when I say that I'm suffering from depression. Because, for me, depression isn't a constant state. Before depression hits, I have long periods of highs, long periods of what non-depressed people would probably just call.. normal moods.
I get up in the mornings, I enjoy breakfast, I go to University, I do my daily chores, I sit down at my computer, I code, I play some games, and then I go to bed. Normal days, really.
@ -23,8 +14,8 @@ And then a low hits. And the longer the high has been going on for, the longer I
I wake up at noon. I stay in bed. I check my phone. Hours pass. I think to myself "What am I doing?" I check my phone. After a while, I force myself to get up; I might even take a shower. I find some cookies in the back of my fridge; those'll be good enough for breakfast, I think to myself. I sit down at my computer. I watch some videos. "What am I doing?" Maybe some more videos. "What am I doing? I don't know what to do." I start Minecraft. "This sounds like fun!" I play for five minutes. I close the game again. "What am I doing?" I watch some videos. I start The Sims 4. I play for half an hour, and then I close the game again. "What am I doing?" I watch some more YouTube videos. I listen to some music. Should I do my coursework now? Not in the mood. I open IntelliJ. Let's work on some code. I glance at a couple of files, and then I close it again. "What am I doing?"
Take that whole description, and slow it down by about 200%. That's what a low day feels like to me. I feel like every single hour; every single *minute* even, is filled with doubt and emptiness and just... nothing.
Take that whole description, and slow it down by about 200%. That's what a low day feels like to me. I feel like every single hour; every single *minute* even, is filled with doubt and emptiness and just... nothing.
This is so hard to explain for me because I also don't.. see myself in these low phases. I don't look at myself. I don't observe what I'm doing. It's like I'm not even there; it's like I'm not inside my own body, doing these activities with it. It's like it's just doing everything on some sort of weird auto-pilot mode.
So until that passes, I probably won't be working on any tutorials, or anything, really. Let's hope it passes fairly soon, because I'm honestly sick of forcing myself to eat cookies for breakfast. It might sound great, but eating something when you have absolutely no desire to eat things is... quite unpleasant, really.
So until that passes, I probably won't be working on any tutorials, or anything, really. Let's hope it passes fairly soon, because I'm honestly sick of forcing myself to eat cookies for breakfast. It might sound great, but eating something when you have absolutely no desire to eat things is... quite unpleasant, really.

129
blog/posts.json Normal file
View file

@ -0,0 +1,129 @@
[{
"name": "Blogs are Cool, I Think",
"summary": "The first post and how I created it",
"id": "blogs_are_cool",
"date": "2/17/2019",
"discuss": "https://twitter.com/Ellpeck/status/1096937184601538566",
"archived": true
},
{
"name": "Why You Should Mod Minecraft",
"summary": "About what makes Minecraft modding great and why you should probably try it if you enjoy programming",
"id": "why_you_should_mod_minecraft",
"date": "2/17/2019",
"discuss": "https://twitter.com/Ellpeck/status/1097177774337462272"
},
{
"name": "Kindling the Reading Flame",
"summary": "About the Kindle, Harry Potter and what I like and dislike about them",
"id": "reading",
"date": "3/22/2019",
"discuss": "https://twitter.com/Ellpeck/status/1109102077911973888"
},
{
"name": "Small Projects",
"summary": "Why creating a small, unplanned project is sometimes good for you",
"id": "small_projects",
"date": "5/1/2019",
"discuss": "https://twitter.com/Ellpeck/status/1123651624201871360"
},
{
"name": "About Cross-Platform and Motivation",
"summary": "How moving from Java to C# taught me how horrible it is to create a cross-platform application with little to no knowledge or documentation",
"id": "cross_platform_trainwreck",
"date": "7/6/2019",
"discuss": "https://twitter.com/Ellpeck/status/1147502654236573697",
"archived": true
},
{
"name": "Big Projects",
"summary": "How a once small project I even created a post about turned into the first game I'm selling: Foe Frenzy",
"id": "big_projects",
"date": "9/15/2019",
"discuss": "https://twitter.com/Ellpeck/status/1173247686654517249"
},
{
"name": "How to make a Rock Bottom mod",
"summary": "My adventures back into a game I stopped working on about two years ago and how I start on a mod for it",
"id": "rock_bottom_mod",
"date": "10/3/2019",
"discuss": "https://twitter.com/Ellpeck/status/1180092634410487808"
},
{
"name": "Java Tutorial, Part 1: Hello World",
"summary": "The first part of my post series for programming beginners where I explain how to write code in Java.",
"id": "java_1",
"date": "10/10/2019",
"discuss": "https://twitter.com/Ellpeck/status/1182080078827737088"
},
{
"name": "Java Tutorial, Part 2: Intro to Conditions and Loops",
"summary": "The second part of my post series for programming beginners. This one is all about conditions and loops.",
"id": "java_2",
"date": "10/10/2019",
"discuss": "https://twitter.com/Ellpeck/status/1182354544707198976"
},
{
"name": "Java Tutorial, Part 3: (Static) Methods",
"summary": "In this Java tutorial for beginners, we cover what (static) methods, parameters and return types are.",
"id": "java_3",
"date": "10/11/2019",
"discuss": "https://twitter.com/Ellpeck/status/1182775985885847558"
},
{
"name": "Java Tutorial, Part 4: Classes and Objects",
"summary": "In this Java tutorial for beginners, we cover the basics of creating classes with a constructor, some fields and some methods and creating objects of them.",
"id": "java_4",
"date": "10/14/2019",
"discuss": "https://twitter.com/Ellpeck/status/1183857460660101133"
},
{
"name": "Java Tutorial, Part 5: Things I Left Out So Far",
"summary": "In this Java tutorial for beginners, we cover some shorthands, some more data types, the difference between pass-by-reference and pass-by-value, null, as well as arrays and lists.",
"id": "java_5",
"date": "10/17/2019",
"discuss": "https://twitter.com/Ellpeck/status/1184894859133509632"
},
{
"name": "Lows",
"summary": "About depression and what it feels like when I don't know what to do with myself",
"id": "lows",
"date": "10/20/2019",
"discuss": "https://twitter.com/Ellpeck/status/1186028260838334471",
"archived": true
},
{
"name": "Java Tutorial, Part 6: Inheritance",
"summary": "In this Java tutorial for beginners, we cover classes extending other classes and the instanceof keyword.",
"id": "java_6",
"date": "10/31/2019",
"discuss": "https://twitter.com/Ellpeck/status/1189904487722487809"
},
{
"name": "Java Tutorial, Part 7: Overriding Methods",
"summary": "In this Java tutorial for beginners, we cover overriding methods, calling superclass methods and toString().",
"id": "java_7",
"date": "11/26/2019",
"discuss": "https://twitter.com/Ellpeck/status/1199339701640945664"
},
{
"name": "But Do You Really Care?",
"summary": "On taking a break from social media",
"id": "but_do_you_really_care",
"date": "5/6/2020"
},
{
"name": "Oh God, Please Don't Port Actually Additions",
"summary": "As Actually Additions celebrates its fifth birthday, I break down what I like and dislike about it.",
"id": "actually_additions",
"date": "5/10/2020",
"discuss": "https://twitter.com/Ellpeck/status/1259600490377216002"
},
{
"name": "The Future of Actually Additions",
"summary": "Not wanting to accept the fate of Actually Additions, someone has come to its rescue. 1.16, here we come?",
"id": "future_actually_additions",
"date": "11/23/2020",
"discuss": "https://twitter.com/Ellpeck/status/1330938597785169925"
}
]

19
blog/reading.md Normal file
View file

@ -0,0 +1,19 @@
Recently, my boyfriend gave me his old Amazon Kindle (because he got one of the newer models). This inspired me, after about four or five years of not really picking up a book outside of school, to start reading for fun again. The first book that I "picked up" was Harry Potter and the.. stone.. of the wise ("Harry Potter and the Philosopher's Stone" apparently).
# The book
I've never written a book review before, but since Harry Potter is kind of a really popular genre and this is the first time I read one of the books, I wanted to give my opinion on it.
Now usually, I don't really enjoy the fantasy genre. Something about it is just a bit uninteresting to me, and I don't necessarily enjoy reading something that's unrelated to (my) reality. I usually need entertainment to be somewhat relatable to me and my life, and fantasy and science fiction don't always do that for me; I don't really enjoy things like Star Wars, but I do enjoy, for example, the Netflix show Black Mirror, because it touches topics that I do come in contact with in my own life.
But because the first Harry Potter book introduced the entire thing in such a great way, making the reader follow along with Harry's journey of _also_ figuring out all of the magic stuff that is new to both him and the reader, it felt like a lot better of an introduction to me.
Reading the first three quarters or so of the book, I honestly had a blast. The story was being told so well and all of the details and emotions were depicted so extensively, the places were described with a depth that made me be able to envision them perfectly in my head.
But then, to my (negative) surprise, suddenly, towards the last couple of chapters of the book, the tone shifted. All of a sudden, the story was being told in such a rushed, quick way; especially what should've been the climax of the book. To me, it felt like the author was getting scared of missing her deadline and stopped writing in the way that I had started to love so much.
I would definitely say that I enjoyed the book (which is saying quite a lot, because fantasy is definitely not my kind of genre), and I plan on also reading the other entries in the series, but to me, it felt like the later in the book I was, the more the quality of what I was reading was declining, which was such a bummer to me because J.K. Rowling seems to be a _really_ good author.
_Also, regarding the stuff that's happening with whatever J.K. is saying right now: If she or anyone else thinks it's okay to retroactively pretend like there's diversity where there simply isn't any: In my opinion, it's not okay. Just accept that your writing in that regard just isn't up to the standard of what it should be in the 21st century. Characters shouldn't be gay, black or another minority for the sake of "showing diversity" or "making a statement", but because diversity like that just happens to exist in the real world._
# The Kindle
There's honestly not much to say about the Kindle, because everything that I could say can be easily summed up into this: _I absolutely love it_. It's one of the older generation Paperwhites (maybe even the first one, I'm not sure), and the e-ink is amazing, the menus are easy to navigate, being able to change the font is great. It's just all round an awesome experience, especially because, with Amazon Prime, which pretty much everyone seems to have, you have Prime Reading, which allows you to read quite a big amount of books for free (without even having to get Kindle Unlimited).
Seriously, if you enjoy reading, but don't enjoy carrying heavy books around with you while you're traveling, I really think you should get a Kindle.

View file

Before

Width:  |  Height:  |  Size: 632 KiB

After

Width:  |  Height:  |  Size: 632 KiB

View file

Before

Width:  |  Height:  |  Size: 380 KiB

After

Width:  |  Height:  |  Size: 380 KiB

View file

Before

Width:  |  Height:  |  Size: 630 KiB

After

Width:  |  Height:  |  Size: 630 KiB

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

View file

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 5 KiB

View file

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 145 KiB

View file

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View file

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

View file

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View file

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View file

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

View file

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View file

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 158 KiB

View file

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 126 KiB

View file

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

View file

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 121 KiB

View file

Before

Width:  |  Height:  |  Size: 4.3 MiB

After

Width:  |  Height:  |  Size: 4.3 MiB

View file

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

View file

@ -1,12 +1,4 @@
---
layout: blog
title: ⬇️ How to make a Rock Bottom mod
description: My adventures back into a game I stopped working on about two years ago and how I start on a mod for it
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1180092634410487808
---
So it's been a hot minute since I stopped working on my first big game project, [Rock Bottom](https://rockbottomgame.com). Since then, I've changed a lot, but the game hasn't changed that much: For a long time, the project was vacant, until I decided to make it open source. From that point on, a couple of my friends started working on it, adding some new features and fixing some bugs, until it seemingly fell back into vacancy over the last couple of weeks.
So it's been a hot minute since I stopped working on my first big game project, [Rock Bottom](https://rockbottomgame.com). Since then, I've changed a lot, but the game hasn't changed that much: For a long time, the project was vacant, until I decided to make it open source. From that point on, a couple of my friends started working on it, adding some new features and fixing some bugs, until it seemingly fell back into vacancy over the last couple of weeks.
So let's port my recent Minecraft mod, [Nature's Aura](https://www.curseforge.com/minecraft/mc-mods/natures-aura), to Rock Bottom!
@ -21,7 +13,7 @@ Okay, finding [a build of the game](https://github.com/RockBottomGame/RockBottom
Hm. Okay.
So something's already broken.
![](rbm_1.png)
![](blog/res/rock_bottom_mod/1.png =100%x*)
It looks like here
```
@ -35,7 +27,7 @@ That didn't seem to fix it either. Huh. Taking a look at [the maven](https://mav
Okay, it's now the next day and it looks like the maven has been fixed, which is nice. So all the compile issues are finally resolved, I put the build into the `/gamedata` folder like explained in the tutorial, I renamed the examplemod to `NaturesAura`, and I can now finally try running the game!
![](rbm_2.png)
![](blog/res/rock_bottom_mod/2.png =100%x*)
Ah! That worked quite well in the end.
# Actually making something
@ -84,7 +76,7 @@ public void preInit(IGameInstance game, IApiHandler apiHandler, IEventHandler ev
So far, so good. Let's figure out how to add a texture to the thing.
I somewhat remember that I made a horrible json-based asset system (instead of just loading all of the assets in the mod's jar automatically), so I'm going to try to add my tile to the `assets.json` file the example mod provided me with and also add a texture into the actual file system.
![](rbm_3.png)
![](blog/res/rock_bottom_mod/3.png =100%x*)
This is the folder structure I decided on. I also created a quick golden version of the game's leaves texture by going to the [asset repository](https://github.com/RockBottomGame/Assets), stealing the leaves texture and recoloring it to be golden-ish.
Also, I put this in the assets file, but I have no idea if that's actually the right path. We'll find out.
@ -109,7 +101,7 @@ public static final Tile GOLDEN_LEAVES = new TileGoldenLeaves(NaturesAura.create
```
*Crisis averted*.
![](rbm_4.png)
![](blog/res/rock_bottom_mod/4.png =100%x*)
Yaaay, it... worked? *Somewhat?*
You're probably yelling at your screen by now, but yes, I finally noticed it as well: My assets path says `examplemod` instead of `naturesaura`. Easy fix, though.
@ -127,7 +119,7 @@ While I'm at it though, I can also add a localization entry for the golden leave
Let's try again.
![](rbm_5.png)
![](blog/res/rock_bottom_mod/5.png =100%x*)
Ta-da! Success, at last.
After some investigation, I realized that Rock Bottom's normal leaves can be walked through, so let's see how to make that happen. Typing `@Override` while in the `TileGoldenLeaves` class causes my IDE to list all of the methods I can override. Among them are two that interest me:
@ -144,13 +136,13 @@ public BoundBox getBoundBox(IWorld world, TileState state, int x, int y, TileLay
```
It seems like this is what I have to do to make the tile walk-through...able. Let's try it out.
![](rbm_6.png)
![](blog/res/rock_bottom_mod/6.png =100%x*)
Yay, that seems to have worked. Great.
# Making an item
Now that I have somewhat of a grip of this whole Rock Bottom stuff again, I'm quickly going to make an item. I won't bore you with the details as it's pretty similar to making a tile, but the gist of it is this: I made an `ItemGoldPowder` class that extends `ItemBasic`, and I initialized and registered an instance of that in my newly created `Items` class, of which I created an instance in my mod class's `preInit` method so that it gets initialized at the right time. Also, I did all of the annoying asset mumbo jumbo.
![](rbm_7.png)
![](blog/res/rock_bottom_mod/7.png =100%x*)
*Oh, C#, you've ruined me.*
# Making stuff happen
@ -172,7 +164,7 @@ While writing this code, I quickly remembered that Rock Bottom has a tile state
Let's try it out! ...yea, no. The Java version that gradle uses to compile a Rock Bottom mod isn't new enough yet: You can't use the `var` keyword. Oh, my poor, poor C# soul. So let's swap that `var` out for a `TileState`.
![](rbm_8.gif)
![](blog/res/rock_bottom_mod/8.gif =100%x*)
Yay, it works! *Except that, in the gif, the mouse position is weirdly offset for some reason. It's correct in person, I promise!*
# Conclusion
@ -180,6 +172,6 @@ So yea, that was the start of my adventure back into Java, back into my old game
I think it's important to remember that, as a developer (especially an indie developer), you don't have to code everything perfectly or work stuff out correctly the first try. I mean, heck, this is my own game, and I completely forgot how to make a mod for it. But it was fun to figure it out again, and to get back into something I made two years ago.
Oh, also, if you really want, [here's a build of the mod](NaturesAuraRockBottom-0.1.jar) that you can try out yourself, as the game is now actually open source and available to everyone! I created this jar with the command `gradlew build`, and all you have to do to run it is [download the game](https://github.com/RockBottomGame/RockBottom/releases), run it once, and then stick the mod jar into its `mods` folder. It really doesn't do that much right now, though, so I don't know why you'd bother.
Oh, also, if you really want, [here's a build of the mod](https://ellpeck.de/blog/res/rock_bottom_mod/NaturesAuraRockBottom-0.1.jar) that you can try out yourself, as the game is now actually open source and available to everyone! I created this jar with the command `gradlew build`, and all you have to do to run it is [download the game](https://github.com/RockBottomGame/RockBottom/releases), run it once, and then stick the mod jar into its `mods` folder. It really doesn't do that much right now, though, so I don't know why you'd bother.
As always, thanks for reading!
As always, thanks for reading!

View file

@ -1,30 +1,22 @@
---
layout: blog
title: 🗡️ Small Projects
description: Why creating a small, unplanned project is sometimes good for you
tags: [Programming]
discuss: https://twitter.com/Ellpeck/status/1123651624201871360
---
As it turns out, I struggle a lot with maintaining interest and motivation for working on bigger projects like my [other game](https://rockbottom.ellpeck.de/) or my Minecraft mods. However, an easy fix for that would be to just start less big projects and focus more on smaller ones, like **Foe Frenzy**. Foe Frenzy is a game I've been working on for about a month now.
![](contrib.png)
![](blog/res/small_projects/contrib.png =100%x*)
The basic gameplay is finished, as is enough content for my friends to have been testing it for the last week or so and saying that they enjoy it quite a bit, both visually and gameplay-wise. I thought I'd make a blog post about my process of working on it, showing what it's about and what I did this time around to make sure that I don't get burnt out with it.
![](overview.png)
![](blog/res/small_projects/overview.png =100%x*)
_Foe Frenzy is a fast-paced fighting game where you battle up to three of your friends with random, short-lasting items in an attempt to be the last survivor._
# The Artstyle
Not every developer has this problem, but I know a lot do: The inability to make good-looking art. Well, I have this same problem too.
A lot of times, I'll find myself getting stuck on making art for my game projects and getting burnt out through trying too hard to force myself to make good-looking art.
A lot of times, I'll find myself getting stuck on making art for my game projects and getting burnt out through trying too hard to force myself to make good-looking art.
So, this time around, what I did instead of doing that all over again, I just decided to go with _simple art_ instead. For example, as you can see, all the tiles in the world only have 8x8 pixels, and all of them follow a really simple pattern: The top and left side are slightly darker, giving the world a really tiled feel and making the levels seem like they were made with actual building bricks. As well as that, the character movement animations are _really_ simple.
![](wobble.gif)
![](blog/res/small_projects/wobble.gif =100%x*)
![](water_wobble.gif)
![](blog/res/small_projects/water_wobble.gif =100%x*)
Both of those aren't even real animations per se, because what they really are is just the player's static texture rotating around a sin wave that is centered on the player's feet. It looks cute, though.
@ -35,7 +27,7 @@ What I did for this game instead is just kind of... let the code take me where i
For example, the map parsing system is really simple: It consists of an XML file, which stores all the important information about a map like its name and the positions that players spawn in, and a png file.
![](map.png)
![](blog/res/small_projects/map.png =100%x*)
Each pixel in the file determines which tile will be put at its location. In this instance, black is deep water, blue is shallow water, yellow is sand and green is grass. And the cool thing is that this is really easy to deal with (reading pixels is a simple thing that's present in almost every game framework), because changing something on the map just takes an image editing program, no custom map editor needed.
@ -53,18 +45,18 @@ Because I had this clear plan in mind before starting the game, and because it's
# So yea...
that's what I've been doing for the last month, and that's why [my other projects](https://minecraft.curseforge.com/projects/natures-aura) have been suffering a little bit. But it's been really fun, and I might even have something to actually release as a real, finished game some time in the near-ish future. It's also been making me feel accomplished, because I've already been able to have my friends test the game out, and they say it's been fun which means that I already accomplished a big part of what I wanted to accomplish with this game.
Keep updated about the game on [my Discord](https://link.ellpeck.de/discordweb) as well as [my Twitter](https://twitter.com/Ellpeck), and I hope you enjoyed reading about the game and my development process so far.
Keep updated about the game on [my Discord](https://ellpeck.de/discord) as well as [my Twitter](https://twitter.com/Ellpeck), and I hope you enjoyed reading about the game and my development process so far.
To finish off, here are some more pictures of the game for your enjoyment.
![](cave.png)
![](blog/res/small_projects/cave.png =100%x*)
A cave being lit up by torches and lava. This is where a rubber hammer can spawn that you can use to knock the other players into the lava.
![](map_select.png)
![](blog/res/small_projects/map_select.png =100%x*)
The map selection screen, where each player can choose the map that they'd like to play most.
![](flame_thrower.gif)
![](blog/res/small_projects/flame_thrower.gif =100%x*)
The favorite item I've added so far: The flamethrower.
![](win.gif)
Killing the last person alive and winning
![](blog/res/small_projects/win.gif =100%x*)
Killing the last person alive and winning

View file

@ -1,11 +1,3 @@
---
layout: blog
title: ⚙️ Why You Should Mod Minecraft
description: About what makes Minecraft modding great and why you should probably try it if you enjoy programming
tags: [Minecraft, Programming]
discuss: https://twitter.com/Ellpeck/status/1097177774337462272
---
So... for the last couple of years, the main thing I've been doing in my free time is game development and modding Minecraft, but the latter far more often and more consistently. I've learned a lot while doing this, but not only when it comes to programming and game development, but also when it comes to a lot of other things.
So in this post, I want to introduce you to what's so great about Minecraft modding and, honestly, why you should try doing it as well.
@ -42,11 +34,11 @@ So keep on going, no matter what people say, because you're probably awesome.
# Basically No Obligations
When making a game, or a "real" product in general, a lot of the time, you're bound to certain obligations: Either it's legal ones, or maybe you've done a Kickstarter, maybe the thing you make actually costs you quite a bit of money because you have a whole development team, stuff like that.
Well with Minecraft modding, the only thing you have to deal with is people asking you when you'll *finally* update to the next version. But if you're sick of that, or sick of anything else, you can just stop, take a break, and do something else entirely for a while.
Well with Minecraft modding, the only thing you have to deal with is people asking you when you'll *finally* update to the next version. But if you're sick of that, or sick of anything else, you can just stop, take a break, and do something else entirely for a while.
People might judge, but the important thing is: They don't have a right to judge, because you can do whatever you want. It's a hobby thing, so it's your thing.
# So yea,
this is all of the stuff I could think of that inspires me to keep going with Minecraft Modding. It's been a really awesome journey so far and I'm excited to keep going, to create more things and to see more things that other people created.
Thanks for reading! <3
Thanks for reading! <3

View file

@ -10,84 +10,119 @@
<meta name="description" content="I accept commissions for Minecraft mods. If you want a mod of any size and complexity made, this is the place to go!">
<meta name="keywords" content="Ellpeck, Minecraft, Mods, Modding, Commission, Forge, Plugin">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto&display=swap">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">
<link rel="stylesheet" href="style.css">
<link rel="icon" href="../favicon.ico">
<meta property="og:title" content="Ellpeck's Mod Commissions">
<meta property="og:description" content="I accept commissions for Minecraft mods. If you want a mod of any size and complexity made, this is the place to go!">
<meta property="og:image" content="https://ellpeck.de/res/logoSmall.png">
<meta property="og:image" content="https://www.ellpeck.de/res/logoSmall.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@Ellpeck">
<meta name="twitter:creator" content="@Ellpeck">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-150032076-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
let gtag = function () {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'UA-150032076-2');
</script>
</head>
<body>
<div class="par">
<h1>💬 About Me</h1>
<h1>About Me</h1>
<div class="row">
<div class="col-md-auto">
<img class="rounded" width="180" height="180" src="../res/me.jpeg">
<img class="rounded" width="180" height="180" src="../res/me.png">
</div>
<div class="col">
<p>Hi, I'm Ellpeck, a student and programmer from Germany. I've been making Minecraft mods for over 6 years, and during that time, I created some popular mods like <a href="https://www.curseforge.com/minecraft/mc-mods/actually-additions">Actually Additions</a> and <a href="https://www.curseforge.com/minecraft/mc-mods/natures-aura">Nature's Aura</a>. If you want to know more about my projects, you should check out <a href="https://ellpeck.de">my website</a>.</p>
<p>Recently, I started accepting commissions for mods as well. If you want a Minecraft mod of any size and complexity made, I can do that for you. You can check out the <a href="#terms">terms and pricing</a> below. ❤️</p>
<p>Recently, I started accepting commissions for mods as well. If you want a Minecraft mod of any size and complexity made, I can do that for you. ❤️</p>
</div>
</div>
</div>
<div class="par">
<h1>💾 Past Commissions</h1>
<div id="mods"></div>
<script src="mods.js"></script>
<h1>Past Commissions</h1>
<div class="mod-info">
<img src="media/slingshot.png" style="object-position: bottom">
<div class="mod-caption">
<h2><a href="https://www.curseforge.com/minecraft/mc-mods/slingshot">Slingshot</a></h2>
<p class="d-none d-sm-block">Slingshot allows you to shoot different items with your slingshot for different effects</p>
</div>
</div>
<div class="test test-left">
<p>A pleasant, kind, and easy to work with modder. He produces high quality work and is, in my opinion, well worth the money.</p>
<p class="test-name">Violet</p>
</div>
<div class="mod-info">
<img src="media/nyx.png" style="object-position: top">
<div class="mod-caption">
<h2><a href="https://www.curseforge.com/minecraft/mc-mods/nyx">Nyx</a></h2>
<p class="d-none d-sm-block">Nyx is a mod that transforms and improves Minecraft's time of darkness by adding elements and events themed around the moon, stars, and night sky</p>
</div>
</div>
<div class="test test-right">
Ellpeck has proven time and again to be very talented and open-minded when it comes to mod commissions. Easy and enjoyable to work with, and very patient when it comes to working out any inconsistencies. Im happy to have collaborated with him!
<p class="test-name">Drakallen</p>
</div>
<div class="mod-info">
<img src="media/enchantmentstorage.png">
<div class="mod-caption">
<h2><a href="https://www.curseforge.com/minecraft/mc-mods/enchantment-storage">Enchantment Storage</a></h2>
<p class="d-none d-sm-block">Stores and automatically converts your enchanted books into a limitless repository of knowledge</p>
</div>
</div>
<div class="test test-left">
Working with Ellpeck was an immense pleasure, he was attentive and convivial during the entire process. Upon release, I was assured any and all problems would be handled immediately, although I have yet to encounter a single issue. Brilliant work and highly recommended.
<p class="test-name">Zilch</p>
</div>
</div>
<div class="par">
<span id="terms"></span>
<h1>📜 Terms and Pricing</h1>
<a id="terms"></a>
<h1>Terms and Pricing</h1>
<p>Here is all the information you need if you want to commission me to make a mod for you:</p>
<ul>
<li>I create Minecraft Forge mods only.</li>
<li>I do not create ports of existing mods or content.</li>
<li>I work in Minecraft versions 1.12.2 and upwards only.</li>
<li>The source code will be hosted on GitHub, and you will be able to see the progress through the commit history. You have the choice of whether this repository should be kept private.</li>
<li>While the rights to the mod idea, including names, behaviors, and your design choices, and any assets you may contribute, will remain with you, the implementation (any code I create) will be owned by me. I generally choose a very permissive license like <a href="https://choosealicense.com/licenses/mit/">MIT</a> with your consideration. This means we will essentially share ownership of the finished product.</li>
<li>You will have the choice of whether I send you the mod jar or publish the mod on CurseForge or Modrinth. If the mod is published on CurseForge or Modrinth, you will get up to 50% of the revenue generated through the mod.</li>
<li>After the mod is completed, bug fixes are included for free, but feature updates and Minecraft version updates are not. However, both can be requested at a later date as a separate commission.</li>
<li>I don't maintain mods for multiple Minecraft versions simultaneously, so you will have to select a single version for which you want the mod created and maintained.</li>
<li>I charge an average of €30 (<a href="https://www.google.com/search?q=30+euro+in+dollar">about $30</a>) an hour.
<li>I work in Minecraft Versions 1.12.2 and upwards only.</li>
<li>No ports of existing mods or content.</li>
<li>No content that can't be created using "traditional" Java code (coremods).</li>
<li>You will have the choice of whether you want to receive the source code privately or whether I should publish it on GitHub.</li>
<li>You will have the choice of whether you want to be sent the mod jar or whether I should publish the mod on CurseForge. If the mod is published on CurseForge, you will get up to 50% of the share of Curse Points generated through the mod.</li>
<li>After the mod is completed, bug fixes are included for free, but feature updates and Minecraft version updates are not. They can be requested at a later date for a small fee though.</li>
<li>I charge between 10€ ($11) and 30€ ($33) an hour.
<ul>
<li>I estimate the total amount of time it will take based on the size and complexity of the mod beforehand.</li>
<li>I request half of the estimated amount to be paid before I start working on the mod, the other half once the work is completed. That way, there is security for both of us.</li>
<li>If a feature takes much more time than expected, I will raise the price of the second payment. I will not do this without explaining why this is necessary.</li>
<li>I request half of the estimated amount to be paid before I start working on the mod, the other half once I'm finished. That way, there's security for both of us.</li>
<li>If a feature takes much more time than expected, I might raise the second payment's price slightly. Of course, if I do this, I will also provide an explanation as to why this is necessary.</li>
</ul>
</li>
<li>If I cannot complete the project for any reason, I will refund the paid amount. If you abandon the agreement before the work is completed, you will not receive a refund.</li>
<li>You have to be at least 18 years old, and you have to pay with your own PayPal account. I do not accept other forms of payment.</li>
<li>You have to be at least 18 years old, and has to pay with their own PayPal account. I don't accept other forms of payment.</li>
</ul>
</div>
<div class="par">
<h1>✉️ Contact</h1>
<div class="alert alert-warning" role="alert">
<strong>My commissions are currently closed.</strong>
<br>Unfortunately, I don't have an estimate of when they will reopen. Please don't contact me until they do.
</div>
<!--
<h1>Contact</h1>
<p>If you're interested, you can easily contact me by joining my Discord server and messaging me privately from there. Alternatively, you can also <a href="mailto:me@ellpeck.de">send me an email</a>.</p>
<a href="https://link.ellpeck.de/discordweb"><img class="discord-img" src="../res/discord.png"></a>
-->
<a href="https://ellpeck.de/discord"><img class="discord-img" src="../res/discord.png"></a>
</div>
<div class="footer">
<a href="https://git.ellpeck.de/Ellpeck/Web">&copy; 2021-2024 Ellpeck</a> &ndash; <a href="https://ellpeck.de/impressum">Impressum</a> &ndash; <a href="https://ellpeck.de/privacy">Privacy</a> &ndash; <a href="https://status.ellpeck.de">Status</a>
<a href="https://git.ellpeck.de/Ellpeck/Web">&copy; 2021 Ellpeck</a> &ndash; <a href="https://ellpeck.de/#impressum">Impressum</a> &ndash; <a href="https://ellpeck.de/#privacy">Privacy</a>
</div>
</body>
</body>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

View file

Before

Width:  |  Height:  |  Size: 521 KiB

After

Width:  |  Height:  |  Size: 521 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 423 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 552 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 667 KiB

View file

@ -1,77 +0,0 @@
const data = [{
id: "nyx",
name: "Nyx",
description: "Nyx is a mod that transforms and improves Minecraft's time of darkness by adding elements and events themed around the moon, stars, and night sky",
testimonial: "Ellpeck has proven time and again to be very talented and open-minded when it comes to mod commissions. Easy and enjoyable to work with, and very patient when it comes to working out any inconsistencies. I'm happy to have collaborated with him!",
commissioner: "Drakallen"
},
{
id: "slingshot",
name: "Slingshot",
description: "Slingshot allows you to shoot different items with your slingshot for different effects",
testimonial: "A pleasant, kind, and easy to work with modder. He produces high quality work and is, in my opinion, well worth the money.",
commissioner: "Violet"
},
{
id: "enchantment-storage",
name: "Enchantment Storage",
description: "Stores and automatically converts your enchanted books into a limitless repository of knowledge",
testimonial: "Working with Ellpeck was an immense pleasure, he was attentive and convivial during the entire process. Upon release, I was assured any and all problems would be handled immediately, although I have yet to encounter a single issue. Brilliant work and highly recommended.",
commissioner: "Zilch"
},
{
id: "more-flower-bushes",
name: "More Flower Bushes",
description: "A simple mod that adds 8 new two block tall flower bushes to decorate with",
testimonial: "Thanks to Ellpeck for making the code for my little mod idea because I can't code for the life of me. Not only did he deliver incredibly fast, he also made sure that everything was done to my satisfaction. It was well worth my money and I look forward to our continued cooperation.",
commissioner: "Rallen"
},
{
id: "craftable-deeds",
name: "Craftable Deeds",
description: "A mod that allows claiming (and stealing) land using special map items",
testimonial: "This has been an incredibly lovely job done, quick and to my liking and completely worth my money. I would work with Ellpeck again without hesitation.",
commissioner: "DB20xx"
},
{
id: "natures-starlight",
name: "Nature's Starlight",
description: "A crossover mod between Nature's Aura and Astral Sorcery",
testimonial: "Pleasant to work with, friendly throughout, a bit of a stickler for the details but that just means that the end product is going to be that much better.",
commissioner: "flabort"
},
{
id: "sketchbook-attributes",
name: "SketchBook Attributes",
description: "A mod that adds an RPG-style levelup system with multiple attributes",
testimonial: "Great to work with! Ellpeck was friendly and managed to make exactly what I had imagined, and worked way faster than I had ever imagined. The finished product came out just as I had hoped, and it was a joy to work with him the entire time.",
commissioner: "sketchlayer"
},
{
id: "voodoo-dolls",
name: "Voodoo Dolls",
description: "Voodoo Dolls adds dolls that curse the player when placed on the ground! Great for streamers.",
testimonial: "Ellpeck totally nailed my commission for Voodoo Dolls! Totally professional yet friendly experience... now my only trouble is thinking of more wild projects for him to work on! Absolute joy to work with.",
commissioner: "generikb"
}
];
let content = "";
let left = true;
for (let mod of data) {
content += /*html*/ `
<div class="mod-info">
<img src="media/${mod.id}.png" style="object-position: top">
<div class="mod-caption">
<h2><a href="https://www.curseforge.com/minecraft/mc-mods/${mod.id}">${mod.name}</a></h2>
<p class="d-none d-sm-block">${mod.description}</p>
</div>
</div>
<div class="test test-${left ? "left" : "right"}">
${mod.testimonial}
<p class="test-name">${mod.commissioner}</p>
</div>
`;
left = !left;
}
$("#mods").html(content);

View file

@ -1,6 +1,5 @@
body {
font-family: Roboto, sans-serif;
font-display: swap;
font-family: Roboto;
}
.par {
@ -24,7 +23,7 @@ body {
.mod-caption {
position: absolute;
bottom: 10px;
bottom: 8px;
color: white;
text-align: center;
left: 50%;

BIN
foefrenzy/docs/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

214
foefrenzy/docs/tutorial.md Normal file
View file

@ -0,0 +1,214 @@
# Creating Custom Maps
Foe Frenzy has a simple system in place that allows you to create your own maps using a simple image editing software as well as a text editor. To play a map, all you have to do is put it into a special folder and the game will automatically load it up. If you want to play a custom map in Multiplayer, you need to make sure that all players have the map installed.
## Where to Put Map Files
All files that the game uses are stored in `Documents/Foe Frenzy` on Windows or `~/Foe Frenzy` on Linux. After launching the game for the first time, a `Maps` folder and a `SpawnPools` folder will be generated. This is the location where custom maps live.
## Creating a Map
When creating a Map, two files are required:
- `Maps/MapName.xml`: This is a file containing information about the map, like which tile is which, where items can spawn, where players can spawn and so on.
Note that the example file included has some more comments inside of it that explain what the different parts of the file do.
- `Maps/Textures/MapName.png`: This file represents the actual layout of the map. You can edit it in an image editor of your choice. Each pixel represents one tile on the map, and the colors of the pixels represent what tiles should be placed there. The size of the image is the same as the size of the finished map.
Note that, further down on this page, there is some information about which colors the game's default tiles have in the map image.
Below is the file as well as the image for an example map with some comments that explain the structure in greater detail. To get started making your own map, it would be easiest to copy this information.
```xml
<?xml version="1.0"?>
<!-- XML header information, don't change this -->
<RawMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- A short description of the map that displays when it's selected to be played -->
<Description>A test custom map</Description>
<!-- The amount of seconds it takes until an item spawner spawns an item -->
<ItemSpawnerDelay>5</ItemSpawnerDelay>
<!-- The weather effect that is displayed on the map. Possible values are Snow and Rain -->
<WeatherEffect>Snow</WeatherEffect>
<!-- The type of music that should be displayed on the map. Scroll down for reference on all types -->
<MusicTheme>Lava</MusicTheme>
<!-- The map's global light modifier. This is the amount of "sunlight" that the map has, where 255 for each R, G, B value means "full light" and 0 means "no light". -->
<LightModifier>
<B>255</B>
<G>255</G>
<R>255</R>
<A>255</A>
</LightModifier>
<!-- The intensity of lights (like torches) on the map, 1 means full intensity, 0 means that they give off no light at all -->
<LightIntensity>0</LightIntensity>
<!-- The tile that is placed outside the borders of the map for visual purposes if the map is smaller than the screen size -->
<FillerTile>Grass</FillerTile>
<!-- The structure that is placed on top of the filler tile -->
<FillerStructure>Tree</FillerStructure>
<!-- Tile properties are custom combinations of tiles and structures that can be placed in specific locations using the map image. If multiple tile properties are required, an entire RawTileProperty can be copied and pasted below any number of times. -->
<TileProperties>
<RawTileProperty>
<!-- The color specified in the map image file to make this specific property occur in the map -->
<Color>
<B>151</B>
<G>255</G>
<R>151</R>
<A>255</A>
</Color>
<Tile>Grass</Tile>
<Structure>Vine</Structure>
</RawTileProperty>
</TileProperties>
<!-- This is the list of item spawners, their locations and the spawn pools they spawn from. Scroll down for reference on spawn pools. -->
<ItemSpawners>
<RawItemSpawner>
<Location>
<X>11</X>
<Y>10</Y>
</Location>
<Pool>Test</Pool>
</RawItemSpawner>
<RawItemSpawner>
<Location>
<X>25</X>
<Y>10</Y>
</Location>
<Pool>Test</Pool>
</RawItemSpawner>
</ItemSpawners>
<!-- This is the list of structure spawners. Structure spawners are basically instructions on how to randomly spawn a set of structures onto different tiles of the map. -->
<StructureSpawners>
<!-- The first spawner in this list randomly spawns Rock structures on Sand tiles. The Amount field determines how many tries the spawning should have. -->
<RawStructureSpawner>
<ValidPositions>
<string>Sand</string>
</ValidPositions>
<Structure>Rock</Structure>
<Amount>40</Amount>
</RawStructureSpawner>
<RawStructureSpawner>
<ValidPositions>
<string>Grass</string>
</ValidPositions>
<Structure>Tree</Structure>
<Amount>60</Amount>
</RawStructureSpawner>
</StructureSpawners>
<!-- These are the spawn points for the four players. When spawning, the spawn points are shuffled so that players don't spawn in the same order every time. -->
<SpawnPoints>
<Point>
<X>1</X>
<Y>8</Y>
</Point>
<Point>
<X>27</X>
<Y>4</Y>
</Point>
<Point>
<X>6</X>
<Y>18</Y>
</Point>
<Point>
<X>25</X>
<Y>15</Y>
</Point>
</SpawnPoints>
</RawMap>
```
![](docs/map.png =100%x*)
## Creating a Spawn Pool
When creating a map, the items that can spawn at any given spawn point are referenced by their Spawn Pool. A spawn pool is basically just a list of items mapped to weights, where a higher weight means that the item will spawn more often, and a lower weight means that the item will spawn less often.
Spawn pools are stored in `SpawnPools/PoolName.xml`. Note that the example file included has some more comments inside of it that explain what the different parts of the file do. Also note that, further down on this page, there is a list of the game's default spawn pools.
Below is the file for an example spawn pool with some comments that explain the structure in greater detail. To get started making your own spawn pool, it would be easiest to copy this information.
```xml
<?xml version="1.0"?>
<!-- XML header information, don't change this -->
<RawPool xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- These are the entries that this spawn pool has -->
<Entries>
<!-- Each entry contains the name of an item that should be spawned, as well as the weight that item should have. Scroll down for information on what the weight value means. -->
<RawPoolEntry>
<Item>Arrow</Item>
<Weight>10</Weight>
</RawPoolEntry>
<RawPoolEntry>
<Item>Bomb</Item>
<Weight>15</Weight>
</RawPoolEntry>
<RawPoolEntry>
<Item>Sword</Item>
<Weight>15</Weight>
</RawPoolEntry>
<RawPoolEntry>
<Item>LeatherArmor</Item>
<Weight>10</Weight>
</RawPoolEntry>
<RawPoolEntry>
<Item>RubberHammer</Item>
<Weight>5</Weight>
</RawPoolEntry>
<RawPoolEntry>
<Item>Spear</Item>
<Weight>15</Weight>
</RawPoolEntry>
<RawPoolEntry>
<Item>Potion</Item>
<Weight>3</Weight>
</RawPoolEntry>
</Entries>
</RawPool>
```
## Tile Names And Colors
Each tile color is written as (R, G, B). The alpha value (A) is always 255.
- Rock (255, 255, 255)
- Grass (0, 255, 0)
- Sand (255, 255, 0)
- Water (0, 0, 255)
- DeepWater (0, 0, 96)
- Dirt (127, 51, 0)
- RockWall (0, 0, 0)
- RockWallFront (81, 81, 81)
- Lava (255, 0, 0)
- Snow (208, 219, 221)
- Ice (96, 96, 255)
- FallGrass (156, 98, 43)
## Structure Names
- Rock
- Tree (automatically changes to snow or fall tree based on the tile below)
- Torch
- Cactus
- GrassTuft (automatically generates on grass as decoration)
- Flower (automatically generates on grass as decoration)
- Vine
- JungleTree
## Item Names
- Bomb
- Sword
- Arrow
- Wall
- RubberHammer
- Pickaxe
- Dynamite
- Spear
- Potion
- FlameThrower
- LeatherArmor
- Feather
- SpeedBoots
- Torch
- Shield
- AntiSlipBoots
## Default Spawn Pools
- All (Most of the game's items)
- Low (Items that are considered lower tier)
- Cave (All items except long-range weapons like arrows)
- CaveLow (Cave items that are considered lower tier)
- Lighting (Lighting items like torches)
- Pickaxe (Items to destroy rocks with like pickaxes, bombs and dynamite)
- Ice (Most of the game's items, including flame thrower, anti-slip boots and other ice stuff)
## Music Themes
- Lava
- Beach
- Cold
- Forest
- Desert

BIN
foefrenzy/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

161
foefrenzy/index.html Normal file
View file

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Foe Frenzy</title>
<meta name="author" content="Ellpeck">
<meta name="description" content="A fast-paced fighting game where you battle up to three of your friends with random, short-lasting items">
<meta name="keywords" content="Ellpeck, Foe Frenzy, Steam, Discord, itch, itch.io, Battle, 2d, Top Down, Pixelart, MonoGame, Fighting, Game">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">
<link rel="stylesheet" href="style.css">
<link rel="icon" href="favicon.ico">
<meta property="og:title" content="Foe Frenzy">
<meta property="og:description" content="A fast-paced fighting game where you battle up to three of your friends with random, short-lasting items">
<meta property="og:image" content="https://www.ellpeck.de/foefrenzy/media/logo.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@Ellpeck">
<meta name="twitter:creator" content="@Ellpeck">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-150032076-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
let gtag = function () {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'UA-150032076-2');
</script>
</head>
<body>
<div class="main rounded">
<img src="media/banner.png" class="banner rounded" alt="Foe Frenzy Logo">
<p>Foe Frenzy is a fast-paced fighting game where you battle up to three of your friends with random, short-lasting items in an attempt to be the last survivor.</p>
<h1>Get the Game</h1>
<p>You can buy Foe Frenzy for <strong>$6.99</strong> on any of the following platforms.</p>
<div class="centered">
<a class="btn btn-success store-button" role="button" href="https://store.steampowered.com/app/1194170/">
<img src="media/steam.png" class="store-img" alt="Buy on Steam">
</a>
<a class="btn btn-success store-button" role="button" href="https://discordapp.com/store/skus/606152985181028352/">
<img src="media/discord.png" class="store-img" alt="Buy on Discord">
</a>
<a class="btn btn-success store-button" role="button" href="https://ellpeck.itch.io/foefrenzy">
<img src="media/itch.png" class="store-img" alt="Buy on itch.io">
</a>
</div>
<h1>Trailer</h1>
<div class="trailer-div">
<iframe class="trailer rounded" src="https://www.youtube.com/embed/rLac7AjWo7w" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<h1>Screenshots</h1>
<div id="carousel" class="carousel slide" data-ride="carousel" data-interval="3000">
<ol class="carousel-indicators">
<li data-target="#carousel" data-slide-to="0" class="active"></li>
<li data-target="#carousel" data-slide-to="1"></li>
<li data-target="#carousel" data-slide-to="2"></li>
<li data-target="#carousel" data-slide-to="3"></li>
<li data-target="#carousel" data-slide-to="4"></li>
<li data-target="#carousel" data-slide-to="5"></li>
<li data-target="#carousel" data-slide-to="6"></li>
<li data-target="#carousel" data-slide-to="7"></li>
<li data-target="#carousel" data-slide-to="8"></li>
</ol>
<div class="carousel-inner rounded">
<div class="carousel-item active">
<img class="d-block w-100 rounded" src="media/screenshots/new/05-10-2020_16-40-58.png" alt="Screenshot of the main menu">
</div>
<div class="carousel-item">
<img class="d-block w-100 rounded" src="media/screenshots/new/05-10-2020_16-34-56.png" alt="Screenshot of the player selection menu">
</div>
<div class="carousel-item">
<img class="d-block w-100 rounded" src="media/screenshots/new/05-10-2020_16-36-36.png" alt="Screenshot of a cave map">
</div>
<div class="carousel-item">
<img class="d-block w-100 rounded" src="media/screenshots/new/05-10-2020_16-39-19.png" alt="Screenshot of an ice map">
</div>
<div class="carousel-item">
<img class="d-block w-100 rounded" src="media/screenshots/new/05-10-2020_16-44-47.png" alt="Screenshot of the tiebreaker screen">
</div>
<div class="carousel-item">
<img class="d-block w-100 rounded" src="media/screenshots/new/05-10-2020_16-42-20.png" alt="Screenshot of a desert map">
</div>
<div class="carousel-item">
<img class="d-block w-100 rounded" src="media/screenshots/new/05-10-2020_16-40-18.png" alt="Screenshot of the win screen">
</div>
<div class="carousel-item">
<img class="d-block w-100 rounded" src="media/screenshots/new/05-10-2020_16-35-28.png" alt="Screenshot of the map select screen">
</div>
<div class="carousel-item">
<img class="d-block w-100 rounded" src="media/screenshots/new/05-10-2020_16-41-17.png" alt="Screenshot of the achievements screen">
</div>
</div>
<a class="carousel-control-prev" href="#carousel" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carousel" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
<h1>Features</h1>
<p>Foe Frenzy is a fast-paced fighting game where you battle up to three of your friends with random, short-lasting items in an attempt to be the last survivor.</p>
<p><img src="media/description/BattleBanner.png" alt="Battle Your Friends" width="100%"><br>Battle up to three of your friends locally or using online play. Pick up weapons, armor, healing items and more and use them to damage your enemies before they run out!</p>
<p>Play locally with up to two players on one keyboard and additional controllers, or use Steam, Discord or IP-based Multiplayer to battle over the internet!</p>
<p><img src="media/description/MapsBanner.png" alt="Play Tons of Maps" width="100%"><br>Use the terrain to your advantage on over 14 different maps. Run through hot deserts and wet swamps and chop through vines and jump down cliffs to reach the best weapons; stumble through caves where your enemies lurk in the dark and make yourself vulnerable by swimming through lakes!</p>
<p>Select the map you&#39;re best at and hope that it gets picked over the ones that your friends chose!</p>
<p><img src="media/description/ItemsBanner.png" alt="Choose Your Weapons" width="100%"><br>Fight with over 15 different items, from swords, bows and leather armor to flamethrowers and teleporters. Each item only lasts a short time, so choose carefully what move to make next!</p>
<p>Pick up random effect items that cause a disadvantage to your opponents, but have a small chance of causing you trouble too. Slow down your friends, invert their controls, or make yourself invincible!</p>
<p><img src="media/description/CustomizeBanner.png" alt="Customize" width="100%"><br>Pick the color and the look of your battler. Unlock Achievements to gain access to more character designs!</p>
<p>Once you&#39;re really good, enable expert mode for yourself for a greater challenge against your friends - lower HP, item durability and speed will make it more difficult for you to win!</p>
<p><img src="media/description/WinBanner.png" alt="Win in Time" width="100%"><br>Defeat your friends before the timer runs out to win! The results screen shows how your friends were killed, and who killed them, so make your actions count!</p>
<p>If the timer reaches a minute remaining, the game goes into Tiebreaker mode: Each player only has a single health point remaining until the end. Kill your last opponent in this exciting battle and emerge victorious!</p>
<h1>About the Project</h1>
<p>
Foe Frenzy is a game created by <a href="https://ellpeck.de">Ellpeck</a>, a student and indie game developer from Germany. It started as a small project inspired by Mario Kart and similar games, because the short-lasting battle items you can use in those games allow for fast and fun gameplay.
</p>
<p>
Development on the project started early in 2019, back when Foe Frenzy was still considered a small side project. Ellpeck made <a href="https://ellpeck.de/blog-small_projects">a blog post</a> about the process of Foe Frenzy's early creation in which he described how creating small projects is easier. After a while of developing the game, Ellpeck took a break from it due to lack of motivation. When he came back to it about two months later, he decided to turn Foe Frenzy into a bigger project, which included redesigning the art for the game, as well as the plan to turn it into a commercial project. Shortly after the rework, he made <a href="https://ellpeck.de/blog-big_projects">a second blog post</a> about this decision.
</p>
<p>With Foe Frenzy, Ellpeck hopes to have created a game that brings fun and banter to many friend groups' gaming meetups.</p>
<h1>Press</h1>
<p>
If you want to create a video or write an article about Foe Frenzy, you are more than welcome to! If you want to have it featured on this site, you can send an e-mail to <a href="mailto:me@ellpeck.de">me@ellpeck.de</a>.
</p>
<p>If you're a games journalist or a let's player and you would like to request a key for the game, you can also send an e-mail to the address above.</p>
<h2>Assets</h2>
<p>You're free to use the following images for your video or article about Foe Frenzy. Just right-click any of the images you would like to use and select <code>Save image as...</code> to save them.</p>
<div class="assets">
<img src="media/press/banner720.png" class="asset" alt="The game's banner in 16:9">
<img src="media/press/banner.png" class="asset" alt="The game's banner as a strip">
<img src="media/press/logo.png" class="asset" alt="The game's logo">
<img src="media/press/name.png" class="asset" alt="The game's logo and name">
</div>
<p><small>Note that the gray background on some of the images simply exists to make them stand out from this site's background color. It's not actually part of the images themselves.</small></p>
<p class="footer"><a href="https://git.ellpeck.de/Ellpeck/Web">&copy; 2019 Ellpeck</a> &ndash; <a href="https://ellpeck.de/#impressum">Impressum</a> &ndash; <a href="https://ellpeck.de/#privacy">Privacy</a></p>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

BIN
foefrenzy/media/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Some files were not shown because too many files have changed in this diff Show more