Compare commits

..

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

238 changed files with 4940 additions and 5565 deletions

View file

@ -1,32 +0,0 @@
on:
push:
branches: [master]
jobs:
web:
runs-on: ubuntu-latest
env:
BUNDLE_GEMFILE: ${{ github.workspace }}/main/Gemfile
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: cd main && 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"' main/_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

29
.htaccess Normal file
View file

@ -0,0 +1,29 @@
Options -Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule (.*) $1.html [L]
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">

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'''
}
}
}
}

58
actaddmanual/index.html Normal file
View file

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<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://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="sidebar">
<!-- 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>
<div id="content">
<div id="entries">
<!-- Cookie notification -->
<script src="../scripts/cookieinfo.js"></script>
</div>
<script src="index.js"></script>
</div>
<div id="footer">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5754829579653773" data-ad-slot="1438750467" data-ad-format="horizontal" data-full-width-responsive="true"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</body>
</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,22 +46,20 @@ 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,10 +73,19 @@ body {
padding: 15px;
}
.anchor {
display: block;
position: relative;
top: -40px;
visibility: hidden;
}
.sellout {
display: flex;
align-items: center;
flex-direction: column;
display: block;
position: relative;
margin-left: auto;
margin-right: auto;
text-align: center;
}
@media (max-width: 768px) {

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.

View file

@ -1,18 +1,10 @@
---
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.

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.

View file

@ -1,12 +1,3 @@
---
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

View file

@ -1,28 +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.*
***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
## 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?
@ -40,11 +18,11 @@ MiKeY and Rid are going to port Actually Additions to **Forge** for **Minecraft
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*?
@ -61,6 +39,6 @@ MiKeY has expressed great interest in helping me overhaul the features that I di
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. ❤️

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!
@ -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.

View file

@ -1,12 +1,3 @@
---
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.
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.
@ -161,6 +152,8 @@ 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 `=`.

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!

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
@ -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.

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,6 +155,8 @@ 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.

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.
@ -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.

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.

View file

@ -1,12 +1,3 @@
---
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.
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.

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,11 +1,3 @@
---
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 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!

View file

@ -1,18 +1,10 @@
---
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._
@ -22,9 +14,9 @@ A lot of times, I'll find myself getting stuck on making art for my game project
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)
![](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.

128
commissions/index.html Normal file
View file

@ -0,0 +1,128 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ellpeck's Mod Commissions</title>
<meta name="author" content="Ellpeck">
<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://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://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://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>
<div class="row">
<div class="col-md-auto">
<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. ❤️</p>
</div>
</div>
</div>
<div class="par">
<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">
<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 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 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>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>
<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://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 Ellpeck</a> &ndash; <a href="https://ellpeck.de/#impressum">Impressum</a> &ndash; <a href="https://ellpeck.de/#privacy">Privacy</a>
</div>
</body>

View file

Before

Width:  |  Height:  |  Size: 521 KiB

After

Width:  |  Height:  |  Size: 521 KiB

View file

Before

Width:  |  Height:  |  Size: 401 KiB

After

Width:  |  Height:  |  Size: 401 KiB

View file

Before

Width:  |  Height:  |  Size: 944 KiB

After

Width:  |  Height:  |  Size: 944 KiB

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%;

View file

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
foefrenzy/media/discord.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
foefrenzy/media/itch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View file

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

BIN
foefrenzy/media/steam.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

103
foefrenzy/style.css Normal file
View file

@ -0,0 +1,103 @@
body {
position: relative;
background-image: url("media/background.png");
background-repeat: no-repeat;
background-attachment: fixed;
background-size: cover;
font-family: Roboto;
}
.main {
width: 50%;
display: block;
margin-top: 50px;
margin-bottom: 50px;
margin-left: auto;
margin-right: auto;
padding: 40px;
background-color: white;
}
.banner {
width: 100%;
height: auto;
margin-bottom: 20px;
}
.centered {
text-align: center;
}
.store-button {
margin: 5px;
}
.store-img {
width: 160px;
height: auto;
}
.btn {
border-radius: 0px;
}
h1 {
margin-top: 20px;
}
.trailer-div {
position: relative;
width: 100%;
height: 0;
padding-bottom: 56.25%;
}
.trailer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.assets {
text-align: center;
}
.asset {
width: 40%;
height: auto;
margin: 10px;
background-color: #BBBBBB;
}
li {
margin-top: 5px;
}
.footer {
margin-top: 40px;
}
#tutorial {
image-rendering: pixelated;
}
@media (max-width: 1200px) {
.main {
width: 80%;
}
}
@media (max-width: 768px) {
.store-img {
width: 100px;
}
}
@media (max-width: 510px) {
.main {
width: 90%;
padding: 20px;
}
}

250
index.html Normal file
View file

@ -0,0 +1,250 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ellpeck.de</title>
<meta name="author" content="Ellpeck">
<meta name="description" content="Ellpeck's little internet place">
<meta name="keywords" content="Ellpeck, Actually Additions, Rock Bottom, Programming, Minecraft, Game Development, Nature's Aura, C#, Java, Blog, Tutorial, Foe Frenzy">
<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/prettify.css">
<link rel="stylesheet" href="style/style.css">
<link rel="icon" href="favicon.ico">
<meta property="og:title" content="Ellpeck.de">
<meta property="og:description" content="Ellpeck's little internet place">
<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://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="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/prettify.js"></script>
<script src="scripts/util.js"></script>
<script src="scripts/main.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 data-spy="scroll" data-target="#navbar">
<!-- Navbar -->
<nav class="navbar fixed-top navbar-expand-lg navbar-light bg-light rounded-bottom" id="navbar">
<script src="scripts/navbar.js"></script>
<!-- Navbar brand and logo -->
<a class="navbar-brand mb-0 h1" href="#">
<img src="res/logo.png" width="40" height="40" alt=""> Ellpeck.de
</a>
<!-- Responsive navbar menu opener -->
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar-content">
<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">
<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>
</div>
<span class="navbar-text">
<div class="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>
</div>
</span>
</div>
</nav>
<!-- Content -->
<div class="container main">
<!-- Cookie notification -->
<script src="scripts/cookieinfo.js"></script>
<div id="main">
<div class="no-blog">
<!-- Home -->
<div class="jumbotron">
<div class="container">
<div class="row">
<div class="col-md-auto">
<img src="res/me.png" class="rounded-circle" width="200" height="200" id="navbar-image">
</div>
<div class="col">
<h1 class="display-4" id="intro-text"></h1>
<script src="scripts/greet.js"></script>
<p class="lead">Welcome to my little website! I'm Ellpeck, a student and programmer from Germany. I do a lot of stuff, actually. My life is pretty busy.</p>
<!-- Sponsor buttons -->
<div class="sellout">
<iframe src="https://github.com/sponsors/Ellpeck/button" title="Sponsor Ellpeck" height="32" width="116" style="border: 0; margin-right: 10px;"></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>
</div>
</div>
</div>
</div>
<!-- Projects -->
<a class="anchor" id="projects"></a>
<div class="list-display rounded">
<h1>Projects</h1>
<p>
Here is a list of some of the things that you might know me from. If you want to have a more in-depth look at everything I do, check out some of the sites linked in the <a href="#social">Social</a> section.
</p>
<div id="project-list">
<em>The content that should be here is dynamically generated. Please enable JavaScript if you see this.</em>
</div>
<script src="scripts/projects.js"></script>
</div>
<!-- Social -->
<a class="anchor" id="social"></a>
<div class="list-display rounded">
<h1>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>
<div class="row">
<div class="col">
<div id="social-list">
<em>The content that should be here is dynamically generated. Please enable JavaScript if you see this.</em>
</div>
Additionally, here are some miscellaneous platforms:
<ul>
<li>My Nintendo Switch friend code is <strong>SW-5281-8834-6801</strong></li>
<li>If you want to play my Mario Maker 2 levels, my ID is <strong>8BH-566-4WF</strong></li>
<li>If you play The Sims 4, you can check out my builds on the gallery by searching for <strong>Ellpeck</strong></li>
</ul>
</div>
<div class="col-md-auto" id="discord-div">
<em>The content that should be here is dynamically generated. Please enable JavaScript if you see this.</em>
</div>
</div>
<script src="scripts/social.js"></script>
</div>
<!-- About -->
<a class="anchor" id="about"></a>
<div class="list-display rounded">
<h1>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">
<em>The content that should be here is dynamically generated. Please enable JavaScript if you see this.</em>
</div>
<script src="scripts/about.js"></script>
</div>
<!-- Blog -->
<a class="anchor" id="blog"></a>
<div class="list-display rounded">
<h1>Blog</h1>
<p>
Occasionally I enjoy writing stuff. So here's some of the stuff I've written. Just click on any of the headers to open the post. Alternatively, you can subscribe to this blog using <a href="/rss.xml">RSS</a>, <a href="/atom.xml">Atom</a> or <a href="/feed.json">JSON</a>.
</p>
<div id="blog-list">
<em>The content that should be here is dynamically generated. Please enable JavaScript if you see this.</em>
</div>
<button type="button" class="btn btn-link" id="blog-archive-button">Show archived posts</button>
<div id="blog-archive">
<em>The content that should be here is dynamically generated. Please enable JavaScript if you see this.</em>
</div>
<script src="scripts/blog.js"></script>
</div>
</div>
</div>
</div>
<!-- Footer -->
<div class="footer rounded-top">
<span class="text-muted"><a href="https://git.ellpeck.de/Ellpeck/Web">&copy; 2018-2021 Ellpeck</a> &ndash; <a href="#impressum">Impressum</a> &ndash; <a href="#privacy">Privacy</a></span>
<div class="quote">
<span id="quote-text"></span>
<script src="scripts/quote.js"></script>
<img src="res/blobheart.png" id="blobheart">
</div>
</div>
<!-- Impressum -->
<div class="modal fade" id="impressum-modal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Impressum</h5>
<button type="button" class="close" data-dismiss="modal">&times;</button>
</div>
<div class="modal-body">
<p>
Julian Schubert
<br>Kastanienweg 27
<br>52074 Aachen
</p>
<p>
Telefon: 0241 45093753
<br>E-Mail: me@ellpeck.de
</p>
<p>Die obenstehende Person ist ebenfalls verantwortlich für den Inhalt (gem. § 55 Abs. 2 RStV).</p>
</div>
</div>
</div>
</div>
<!-- Privacy -->
<div class="modal fade" id="privacy-modal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Privacy</h5>
<button type="button" class="close" data-dismiss="modal">&times;</button>
</div>
<div class="modal-body">
<p>This site uses cookies to store information about your browsing activity.</p>
<p>Ellpeck.de stores the following information:</p>
<ul>
<li>A cookie named <code>dark</code> with the value <code>true</code> or <code>false</code> that stores if you have dark mode enabled</li>
<li>A cookie named <code>notification</code> with the value <code>true</code> or <code>false</code> that stores if you have already closed the cookie notification that displays at the top of the page</li>
</ul>
<p>Due to widgets and embeds, additional information will be stored by other sites. Please refer to those sites' privacy policies for more information:</p>
<ul>
<li>Google uses cookies to serve ads based on a user's prior visits to this website. You may opt out of personal advertising by visiting <a href="https://www.google.com/settings/ads">Ad Settings</a>. For more information, see <a href="http://www.google.com/policies/privacy/partners/">how Google uses data when you use its partners' sites or apps</a>.</li>
<li>Discord uses cookies for its widget embed. For more information, see <a href="https://discordapp.com/privacy">their privacy policy</a>.</li>
<li>Twitter uses cookies for its tweet embeds. For more information, see <a href="https://twitter.com/en/privacy">their privacy policy</a>.</li>
</ul>
<p>
Transparency is very important to us, and as such, if you have any doubts about the security of this website, you can view its source code <a href="https://git.ellpeck.de/Ellpeck/Web">on Gitea</a>.
<br>Keep in mind that you can also review or delete stored cookies for any site at any time in your browser's settings.
</p>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -1,36 +0,0 @@
ExpiresActive On
ExpiresDefault A31536000
ExpiresByType text/html A600
ExpiresByType text/javascript A2592000
ExpiresByType application/javascript A2592000
Options +MultiViews -Indexes
ErrorDocument 404 /404.html
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]
# 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]

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

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,50 +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": "Well, it actually isn't as interesting of a story as some of you might hope. Long story short, when I was little (and was, apparently, very bad at English), I decided to make a YouTube channel called \"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. When a friend of mine came along and started trying to pronounce that name, instead of saying each individual letter on its own, he started pronouncing it like a word: Ell-Peg. ...Ellpeck. I liked that pronounciation and so I stuck with the 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, Python and PHP, and I can just about get something to happen in C 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 to make it a bit easier, including my own library, MLEM, which you can read about in the <a href=\"#projects\">Projects</a> section."
},
{
"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: Don't. I'll do it when I feel like it."
},
{
"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>. I don't have a job on the side or anything, though."
},
{
"q": "Are you for hire?",
"a": "You can commission me to make a Minecraft mod for you. You can find more information on my <a href=\"https://ellpeck.de/commissions\">commissions page</a>. For other work, you can check out my page on <a href=\"https://www.linkedin.com/in/ellpeck/\">LinkedIn</a>."
},
{
"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,157 +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"
},
{
"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": "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"
},
{
"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": "CurseForge page",
"link": "https://minecraft.curseforge.com/projects/natures-aura"
},
{
"name": "Modrinth page",
"link": "https://modrinth.com/mod/natures-aura"
},
{
"name": "Report an issue",
"link": "https://github.com/Ellpeck/NaturesAura/issues"
}
],
"icon": "na"
},
{
"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": "CurseForge page",
"link": "https://www.curseforge.com/minecraft/mc-mods/pretty-pipes"
},
{
"name": "Modrinth page",
"link": "https://modrinth.com/mod/pretty-pipes"
},
{
"name": "Report an issue",
"link": "https://github.com/Ellpeck/PrettyPipes/issues"
}
],
"icon": "pp"
},
{
"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"
},
{
"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"
},
{
"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"
},
{
"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"
},
{
"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"
}
]

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,31 +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",
"hide": true
},
{
"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",
"hide": true
},
{
"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",
"hide": true
},
{
"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",
"hide": true
},
{
"name": "💖 Help Others Instead",
"text":"I don't currently need additional monetary support, but thank you so much for considering supporting me! If you need a way to get rid of your extra cash, 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>.",
"hide": false
}
]

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>

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