games / reflections on Minecraft
27
Cargo.lock
generated
|
@ -697,6 +697,12 @@ dependencies = [
|
|||
"url",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "glob"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
|
||||
|
||||
[[package]]
|
||||
name = "half"
|
||||
version = "2.4.1"
|
||||
|
@ -1140,6 +1146,16 @@ dependencies = [
|
|||
"pkg-config",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libwebp-sys"
|
||||
version = "0.9.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "54cd30df7c7165ce74a456e4ca9732c603e8dc5e60784558c1c6dc047f876733"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"glob",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libz-sys"
|
||||
version = "1.1.20"
|
||||
|
@ -2167,6 +2183,7 @@ dependencies = [
|
|||
"tracing-subscriber",
|
||||
"treehouse-format",
|
||||
"ulid",
|
||||
"webp",
|
||||
"xmlparser",
|
||||
]
|
||||
|
||||
|
@ -2347,6 +2364,16 @@ dependencies = [
|
|||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "webp"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8f53152f51fb5af0c08484c33d16cca96175881d1f3dec068c23b31a158c2d99"
|
||||
dependencies = [
|
||||
"image",
|
||||
"libwebp-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "weezl"
|
||||
version = "0.1.8"
|
||||
|
|
|
@ -6,3 +6,6 @@ resolver = "2"
|
|||
tracing = "0.1.40"
|
||||
|
||||
treehouse-format = { path = "crates/treehouse-format" }
|
||||
|
||||
[profile.dev]
|
||||
package.webp.opt-level = 3
|
||||
|
|
|
@ -17,6 +17,8 @@ You have been warned.
|
|||
The following commands require [`just`](https://github.com/casey/just).
|
||||
Running a development server requires [`cargo-watch`](https://github.com/watchexec/cargo-watch).
|
||||
|
||||
**abcd**
|
||||
|
||||
To serve the website on `http://localhost:8080` for development:
|
||||
|
||||
```sh
|
||||
|
|
|
@ -1,41 +1,11 @@
|
|||
% id = "01H9R1NKAXQMXWBA9Z65E4CG2T"
|
||||
+ sorry, nothing to see here in this section yet!
|
||||
%% title = "Gaming."
|
||||
|
||||
% id = "01J09B24M33NAE3D4VHKTR361J"
|
||||
- (I'm just waiting for DELTARUNE Chapters 3 and 4 to come out to kickstart my theory-crafting)
|
||||
% id = "01JGSNPRR7AMX41ADKYNVPJF6F"
|
||||
+ I don't really have an introduction for this section but it is about video games, alright
|
||||
|
||||
% id = "01H9R1NKAX7F0AEF374RWD4026"
|
||||
- it's just here for permalinking purposes. for now.
|
||||
% id = "01JGSNPRR75RRGHJ97DHMFZ1F2"
|
||||
- I'm sorry
|
||||
|
||||
% id = "01H9R1NKAX4A800PZ7N5KJKTQH"
|
||||
- soon... I may put something here.
|
||||
|
||||
% id = "games/oneshot"
|
||||
+ :page: *OneShot*
|
||||
|
||||
% id = "01HA4HJKR3PBM0NJH7MZMYK6V9"
|
||||
- buy: [Steam](https://store.steampowered.com/app/420530/OneShot/)
|
||||
|
||||
% id = "01HA4HJKR376KH3E2WE1W00EWM"
|
||||
- on little cat feet
|
||||
|
||||
% id = "games/the-talos-principle"
|
||||
+ :page: *The Talos Principle*
|
||||
|
||||
% id = "01H9R1NKAXN8NKBPYBEZASA1RA"
|
||||
- buy: [Steam](https://store.steampowered.com/app/257510/The_Talos_Principle/)
|
||||
|
||||
% id = "01H9R1NKAXN8NE8NMAKGHWY9Q3"
|
||||
- in the beginning there were Words, and the Words made the World
|
||||
|
||||
% id = "01H9R1NKAXXY867YZGSQQCEFFB"
|
||||
- I am the Words
|
||||
|
||||
% id = "01H9R1NKAX8SMHYY1N7KY1W3R3"
|
||||
- the Words are everything
|
||||
|
||||
% id = "01H9R1NKAXSH3E52YMT32C99DA"
|
||||
- where the Words end, the World ends
|
||||
|
||||
% id = "01H9R1NKAXEXX9F30V75PDMEY7"
|
||||
- you cannot go forward in an absence of space
|
||||
% content.link = "games/minecraft-zen"
|
||||
id = "01JGSP12V7FWG6B7H2BD16W4ZD"
|
||||
+ :page: reflections on Minecraft
|
||||
|
|
626
content/games/minecraft-zen.tree
Normal file
|
@ -0,0 +1,626 @@
|
|||
%% title = "reflections on Minecraft"
|
||||
|
||||
% id = "01JGRJPSTR8SPPTVCGCP26YGF7"
|
||||
- Minecraft has been with me for around 14 years by now; a majority of my life! I first started playing around beta `1.3_01`.
|
||||
|
||||
% id = "01JGRJPSTRTX038F2JBF0P59DK"
|
||||
- my first ever experience playing Minecraft was quite funny: I booted up a new world, got scared of a skeleton, and shut down the game.
|
||||
|
||||
% id = "01JGRJPSTRKVQ931Y6ZSDJW99Z"
|
||||
- I returned a few days later to find the game has updated to beta `1.4_01`, and had given it another shot.
|
||||
|
||||
% id = "01JGRJPSTRYV3BRNWYCFWB7C9C"
|
||||
- I won't go into the full story of how I played Minecraft over the years.
|
||||
just know there's been a lot of ups and downs.
|
||||
|
||||
% id = "01JGRJPSTR5WTHH6YHKF06670D"
|
||||
- this Christmas [a friend of mine][def:person/olekolek1000]---Olek---decided to host a Minecraft server for us to play on.
|
||||
|
||||
% id = "01JGRJPSTREXDD94950A69RC99"
|
||||
- I think there have been around 16 of us through the lifetime of the server;
|
||||
various people from various groups, no real coherence to it all.
|
||||
|
||||
just People.
|
||||
|
||||
% id = "01JGRJPSTRX1EY7X47CKENP3M2"
|
||||
- I was a moderator on this server, though didn't need to do much moderating because everyone was pretty chill.
|
||||
|
||||
% id = "01JGSA36C1THMHVMZXG4RCKH2Y"
|
||||
- ### zen
|
||||
|
||||
% id = "01JGRJPSTRRSG964HNJJS3FE30"
|
||||
- before the server even started, I decided to set out with a sort of "zen" for myself to follow, to make the game more enjoyable and sustainable.
|
||||
the guidelines were:
|
||||
|
||||
% id = "01JGRJPSTR5ADVNJR32EXBR143"
|
||||
- *abuse the Pareto principle*---20% of work gets you 80% of the results
|
||||
|
||||
% id = "01JGRJPSTR0R5Q4TNPDN5MWY29"
|
||||
- *build aesthetically, not functionally*---we spend too much time on building farms and minmaxing the game
|
||||
|
||||
% id = "01JGRJPSTRW8RTZV2D3HHXKTQG"
|
||||
- *symbolic over literal*---build small things representing big concepts
|
||||
|
||||
% id = "01JGRJPSTRPN999R7Z3SYQ9PM2"
|
||||
- *reflections turned into buildings*---build things from your shower thoughts
|
||||
|
||||
% id = "01JGRJPSTR3YG6E3MJC0MD9RMJ"
|
||||
- *have a theme* as an anchor point to get back to when you're out of ideas
|
||||
|
||||
% id = "01JGRJPSTR40NGJ66VC06H8CMH"
|
||||
- *it's better together*---anyone can join the fun
|
||||
|
||||
% id = "01JGRJPSTRZE8H91XGS5GC3R59"
|
||||
- out of this zen, I had a vision to create a little artist collective from our Minecraft server.
|
||||
I shared it on the Discord in case anyone wanted to join in.
|
||||
|
||||
% id = "01JGRJPSTR1R6R2HYNTKKRVRQK"
|
||||
- unfortunately zero people were on board with this... so it never went anywhere.
|
||||
but it's fun to imagine what _could_ have been a server of people who actually wanted to follow these principles.
|
||||
|
||||
% id = "01JGRJPSTR7C718EA1VKYQFFW6"
|
||||
- ### friend groups
|
||||
|
||||
% id = "01JGRJPSTRBXCG4AMAYAQEHKXT"
|
||||
- 16 people played over the lifetime of the server, and a few smaller groups formed.
|
||||
for a given person, they mostly only played with folks they interact with on a daily basis.
|
||||
|
||||
% id = "01JGRJPSTR0F1T367Q7WW07BK6"
|
||||
- some joined Olek's voice chat group and interacted with everyone else that way, some didn't.
|
||||
|
||||
% id = "01JGSAV721JJ0R9EAVXTD2KVG5"
|
||||
- a few folks dropped out after a couple days, probably because they had better things to do.
|
||||
|
||||
% id = "01JGRJPSTR1E9GH5BJGF1V8FHQ"
|
||||
- one group of two people emerged pretty much immediately to speedrun the game as much as possible, though they were stopped by The End being closed off.
|
||||
|
||||
% id = "01JGRJPSTR12FH5PASZA1JW8NN"
|
||||
+ so instead... they decided to go around the world, destroying End Portals as a prank :oh:
|
||||
|
||||
% id = "01JGRJPSTRQ8V18GQQP5R3NFGM"
|
||||
- for the curious, they used [this method](https://minecraft.wiki/w/Tutorial:Breaking_bedrock#Huge_Mushrooms).
|
||||
although it's been a long time since it was patched out of the game (we were playing on 1.21.4), Olek decided to reenable this bug in Paper, to...
|
||||
enter the Nether roof. oof {~oof {~oof {~oof~}~}~} :oh:
|
||||
|
||||
% id = "01JGRJPSTR8DAK7K58ZS24GEP4"
|
||||
- somewhat silly decision considering you can [phase through the bedrock instead](https://minecraft.wiki/w/Tutorial:Breaking_bedrock#Phasing_through_bedrock).
|
||||
|
||||
% id = "01JGRJPSTRW0MK3T3RMME5Y9EH"
|
||||
- in all cases, this group isolated itself from the others _way_ more than any other did, which spelled disaster for the server in the long run;
|
||||
they ended up looking at their own selfish desires much more than at sharing the fun with everybody else.
|
||||
|
||||
% id = "01JGSC4K515MSY1K9Z2AJXNJER"
|
||||
- I mean, coming across 3 End Portals and seeing the portal room is glitched is kind of funny, but...
|
||||
|
||||
it also feels like a bit of an ass move once you know the full story, doesn't it.
|
||||
|
||||
% id = "01JGRJPSTRNMYAKWT96Q2N2JCM"
|
||||
- that's one lesson learned for moderating a server in the future---it's okay if smaller groups form, but you should still be fostering a _shared community_ among everyone.
|
||||
there shouldn't be any reason for secret uprising groups like this to exist, because it ruins the fun.
|
||||
|
||||
% id = "01JGRJPSTR6R11N3ACDGYZTPJM"
|
||||
- ### approach to projects
|
||||
|
||||
% id = "01JGRJPSTR526WPNCE19CZ61PJ"
|
||||
- an interesting thing I realised was that how you play Minecraft reflects your ability to handle projects.
|
||||
|
||||
% id = "01JGRJPSTRSMT2EF5HSRGRVB8H"
|
||||
- and by "projects" I mean anything involving creative hobbies.
|
||||
|
||||
% id = "01JGRJPSTRQXNHSNWWSK7FVF0D"
|
||||
- if you recall my [zen][branch:01JGRJPSTRRSG964HNJJS3FE30] from earlier in the post, I said I would try to build small rather than large.
|
||||
|
||||
% id = "01JGRNC1F4J6PAFEZH47Y9ZCGK"
|
||||
- this is basically how I approach projects.
|
||||
when a project requires too much upfront work to get it working and iterate upon it, it's unlikely I'll finish it.
|
||||
|
||||
% id = "01JGRNC1F4FTVGTQF6SMVHX922"
|
||||
- I can't find the blog post that came up with this metaphor... but the idea is to not build a cathedral, and instead build mountain houses and make paths between them.
|
||||
which translates _so literally_ onto Minecraft it's kind of insane.
|
||||
|
||||
% id = "01JGRNC1F4YKWHNM2GR0CAA6T1"
|
||||
- a couple of my close friends built something small but dropped out very quickly.
|
||||
this basically seems to reflect how they handle projects, too---at least from an outside perspective.
|
||||
|
||||
% id = "01JGRNC1F4886P85VT80CXQHCS"
|
||||
- it's hard to say what's going on inside their heads though, so I'm absolutely not judging!
|
||||
|
||||
% id = "01JGRNC1F4P3CH19DWF7TDWQFS"
|
||||
- ### Dark Souls
|
||||
|
||||
% id = "01JGRNC1F4BG9N3Z7KTGZTJS8C"
|
||||
- one thing I decided to do in this playthrough was to Never Wear Armour.
|
||||
|
||||
% id = "01JGSC4K5192T9NEBKVGKT72JQ"
|
||||
- monsters didn't seem challenging enough otherwise.
|
||||
|
||||
% id = "01JGSA36C2Y1BZZNCJ55SJXNQV"
|
||||
- I also decided that I would not upgrade from Iron to Diamond tools until I really _needed_ them, with regards to durability.
|
||||
|
||||
% id = "01JGSA36C29RJ8WJV5T2VH9F86"
|
||||
- this decision was driven by the fact that in previous playthroughs, I would often fixate on getting the best possible gear, without actually accomplishing anything.
|
||||
|
||||
% id = "01JGSA36C210ZTHGZFXCH4ABYD"
|
||||
- and I think playing the game with the best gear early gets too easy and boring!
|
||||
|
||||
% id = "01JGSAV721110C8XAD501YHVKC"
|
||||
- thanks to this, my first Diamond tool was... a shovel.
|
||||
I needed to dig out lots of dirt blocks on top of a mountain, and getting a better shovel seemed more sensible than burning my limited Iron supply on more and more crappy ones.
|
||||
|
||||
% id = "01JGSC4K51XE028W9X57RBNZZM"
|
||||
- the last handicap I applied, was to avoid using any means of transport faster than going somewhere by foot. (boats are allowed because they're about as fast.)
|
||||
|
||||
% id = "01JGSC4K510F3BFE0Y5A473HQZ"
|
||||
- that means [Elytra](https://minecraft.wiki/w/Elytra) and [Minecarts](https://minecraft.wiki/w/Minecart_Improvements) were out of the question, too.
|
||||
|
||||
% id = "01JGSC90XF88HYAF46FDM7TH7A"
|
||||
- the point of this was to make local things local, and avoid going on long travels unless really needed.
|
||||
and when I did travel, I'd be taking in my surroundings at a leisurely pace, rather than speeding through the skies.
|
||||
|
||||
% id = "01JGSM7X7XE9RRQY414VCT5EV8"
|
||||
- in case I ever wanted to take a breath of fresh air, I could also take this in the opposite direction: go somewhere _really_ far, such that coming back to my previous home would be too much effort.
|
||||
|
||||
% id = "01JGSA36C2D3AEGA267A0ER9FE"
|
||||
- I gotta say, it was really fun playing like this! without armour, and playing on Hard difficulty, caving becomes somewhat of an _actual_ challenge---you have to strategise how you want to approach the monsters in a cave, lure them out, kill them off one by one, and _not die_ in the process.
|
||||
|
||||
% id = "01JGSA36C2HB573J0CTZVANY6G"
|
||||
- it also _finally_ convinced me to start using a shield more often.
|
||||
I did have to install the [Vanilla Tweak](https://vanillatweaks.net/) that lowers the shield though, because the default _definitely_ obscures too much of your viewport.
|
||||
|
||||
% id = "01JGSA36C2VP3TK9MHW8BQPY0J"
|
||||
- with this, fighting skeletons quickly turned into something of a Souls-like---one bad, greedy move and a third of your health goes down!
|
||||
|
||||
% id = "01JGSA36C2G38F46G6GRRXGJEW"
|
||||
- other mobs were not _as_ fun as they didn't require using a shield, but I still found it somewhat challenging to resist the urge to run up to a zombie and suck up all the damage.
|
||||
|
||||
% id = "01JGSA36C2KRKY99E7B1QMBZ0J"
|
||||
- I think a cool part about this was that I never forgot to put on my armour after dying this way.
|
||||
|
||||
% id = "01JGSC90XFC1TCAKHEQZFM1PDP"
|
||||
- being able to always pick up _all_ your items after death is really cool, too---whereas if you had a full inventory + armour, your inventory would fill up and you wouldn't be able to pick up the armour.
|
||||
|
||||
% id = "01JGSM7X7XTGKDN18PVG71C6GT"
|
||||
- the tool ideas on the other hand helped me _not_ waste my time upgrading tools right off the bat, and instead helped me focus on making as many builds as possible.
|
||||
|
||||
% id = "01JGSM95XQQBNMYZ50Z19XRHCE"
|
||||
- the traveling one was kind of a pain, because sometimes I wanted to build with materials I did not have access to yet, but I made few such travels, and got as many materials per travel as possible.
|
||||
|
||||
% id = "01JGSA36C2ARSNC4QZFE5F24QY"
|
||||
- ### hotbar layout
|
||||
|
||||
% id = "01JGSA36C2Y0E3WQ5NEZWEPK4N"
|
||||
- going back to the shield for a second, in previous playthroughs I would normally hold torches in my offhand for easy placement. now because I needed to wield a shield, that had to change. so here's the hotbar I came up with:
|
||||
|
||||
``` =html
|
||||
<style>
|
||||
.games-minecraft-zen-hotbar-layout {
|
||||
& .pic {
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
display: block;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
& td {
|
||||
padding: 0;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
{.games-minecraft-zen-hotbar-layout}
|
||||
| ![sword][pic:mc_iron_sword]{title="Sword"} | ![pickaxe][pic:mc_iron_pickaxe]{title="Pickaxe"} | ![torches][pic:mc_torch]{title="Torches"} | ![axe][pic:mc_iron_axe]{title="Axe"} | ![food][pic:mc_cooked_beef]{title="Food"} | ![shovel][pic:mc_iron_shovel]{title="Shovel"} | | | |
|
||||
|
||||
% id = "01JGSA36C2KXFJYXWEX5T4JQK3"
|
||||
- the empty slots are free for use by any items.
|
||||
I also regularly swapped food, torches, and the shovel for water buckets or building blocks.
|
||||
|
||||
% id = "01JGSA36C2VGWQSBPTGJ15QYHE"
|
||||
- here's the reasoning behind this placement:
|
||||
|
||||
% id = "01JGSA36C2MS3BPMPTK2H0NB0M"
|
||||
- you quickly need to pull out your sword if something attacks you, and the `<kbd>1</kbd>`{=html} key is very convenient as a "panic" button.
|
||||
|
||||
% id = "01JGSA36C2MW0SZXEZRZKP9CH8"
|
||||
- the pickaxe is also used pretty often, and you use it in tandem with torches when mining.
|
||||
hence they're next to each other.
|
||||
|
||||
% id = "01JGSA36C2RPJ1HYF8RTF2M5N4"
|
||||
- there needs to be a non-tool item next to the axe, so that you can break leaves without using up your axe's durability.
|
||||
that's food, because hunger in this game is a bitch.
|
||||
|
||||
% id = "01JGSMFMQVCF8FHMX18DQG22R4"
|
||||
- I opted for items on _both_ sides, because I like the fact that I can scroll either up _or_ down to put away my axe, and it works equally well.
|
||||
|
||||
% id = "01JGSC4K51AWCZ6CSVVE5TMCG6"
|
||||
- one disadvantage of it though is that your hot bar looks like a hot mess.
|
||||
but I assure you... it _is_ neat and orderly ---w---
|
||||
|
||||
% id = "01JGSA36C28XX6VR30F0R3MB9C"
|
||||
- ### unpopular opinion: Phantoms are Good
|
||||
|
||||
% id = "01JGSC4K51VH3C68NV7Q9PS36B"
|
||||
- [Phantoms](https://minecraft.wiki/w/Phantom) get a lot of flak for being really annoying, but this playthrough I realised something.
|
||||
|
||||
% id = "01JGSA36C21XA2N908PP15BNBE"
|
||||
- the existence of [Phantoms](https://minecraft.wiki/w/Phantom) forced me to think about sleeping more.
|
||||
which I'm really thankful for, because with my handicaps, had I not slept while traveling, if I die, _I fucking die._
|
||||
|
||||
% id = "01JGSA36C2J2G3J8C8V5YS9YSX"
|
||||
- so yeah! opinion changed: Phantoms are actually a good mob that forces you to set your respawn point every so often while traveling, so that you don't have to travel back thousands of blocks to fetch your items.
|
||||
|
||||
% id = "01JGSA36C26YQTJ5KDXT2KRCPJ"
|
||||
- just one flaw is that if you place down a temporary bed and then destroy it, you do not set your respawn point.
|
||||
oh well.
|
||||
|
||||
I guess one could call that a skill issue.
|
||||
|
||||
% id = "01JGRNC1F4MMR1SC5D9V9D1HXC"
|
||||
- ### builds
|
||||
|
||||
% id = "01JGRNC1F49VGQS33DZ0DNDBEX"
|
||||
- I think I've been rambling long enough now.
|
||||
it's time to showcase my builds!
|
||||
|
||||
% id = "01JGRNC1F4M2CCEFQH70N05P8C"
|
||||
- #### meow cottage (15 December)
|
||||
|
||||
this was one of the first builds on the server! it's a little = ---w--- = house.
|
||||
|
||||
![an oak wooden house in the shape of a cat. the roof is cat ear-shaped, and the building has whiskers on either side. there's a sign at the front that says "meow cottage." the windows are built out of fences, and there are potted plants on the windowsills---from the left, a poppy, a dandelion, an oak sapling, and a cornflower, referencing my red-yellow-green-blue accent colors. there's a placeholder path in front of the house, and bamboo shoots on either side of the path. the house is situated on a small lake, which is surrounded by a forest and a jungle.][pic:01JGRRPV5XTGQC1KGD5WM210KS]
|
||||
|
||||
% id = "01JGSA36C2WK5KWTJQ7YMFGFXA"
|
||||
- #### treehouse (15 December)
|
||||
|
||||
following my philosophy of building small, on the same day, I built a little outpost on a tall jungle tree, from which you can see the entire town.
|
||||
|
||||
![a treehouse in the distance. it is also cat-themed, with cat ears and whiskers, but the building materials are bamboo and dark oak. there's a path that leads down to the treehouse, and there's a house on the left side of the path.][pic:01JGRWZEQDHR1MHYR2WRQH7QG5]
|
||||
|
||||
I don't have any screenshots of it from that era, so there's a lot more civilisation around now than there used to be back then ---w---
|
||||
|
||||
including that unfinished house to the left.
|
||||
|
||||
% id = "01JGSA36C2D03T6GM06D1XNCB8"
|
||||
- soon enough, more people moved into the town, and my little lake became overcrowded...
|
||||
|
||||
![the meow cottage again; there are buildings all around it. somebody stole the poppy and folded my windowsills...][pic:01JGSD5RR8ZASVQXFFXKR88868]
|
||||
|
||||
wanting to maintain my peace and quiet, I decided to move out somewhere further away.
|
||||
|
||||
% id = "01JGRNC1F4BR62X3CTXXQBA6BF"
|
||||
- #### meow house (16--19 December)
|
||||
|
||||
somewhere far north, I found a lone mountain in a sparse jungle.
|
||||
this felt like a nice place to build a refuge, so I started building a Japanese-style house...
|
||||
|
||||
![in-progress construction of the house at the top of a mountain. the house is built with a cherry color palette---dark purple framing, light pink roofs, and white walls. the walls have windows built out of fences to give off a shoji-style look, even if poorly imitated. there are various trees around the house, grown for their building materials.][pic:01JGRS8S4BW88NP0D0QTSXET0W]
|
||||
|
||||
but what would a furry's house be without any furry elements to it. >:3
|
||||
|
||||
![final version of the house. it has a pair of fluffy cat ears on the roof. the house is lit with hanging lanterns, imitating chōchin. there's also now a stone path leading to the house.][pic:01JGRSWN3XD2E9Q3GN30981TGP]
|
||||
|
||||
% id = "01JGSA36C2G9H57Q1PX6KMN6BR"
|
||||
- my original plan was to build the roofs from mangrove wood, to imitate the Japanese white-and-red color scheme, but turns out mangrove swamps are really frickin' rare!
|
||||
so I went with pink instead. I'm quite happy with how it came out in the end!
|
||||
|
||||
% id = "01JGSA36C202MDT562ZKFEESYM"
|
||||
- somebody did manage to find a mangrove swamp later on, and you can observe an eency bit of my experimentation with that wood to the left---I built a little mineshaft next to my house from mangrove planks, but honestly...
|
||||
I'm glad I went with the pink for the house. :3
|
||||
|
||||
% id = "01JGSA36C274HA9HR8TND0ZJZP"
|
||||
- #### zen garden (21 December)
|
||||
|
||||
what would a traditional Japanese house be without a zen garden?
|
||||
|
||||
![a zen garden to the back of the house. it most prominently features a blossoming cherry tree in the center, on a lone little island... to the right, there is another island with a couple dripleaves growing out of it. there are two natural-looking cliff-like rocks in the back and the front, and a cat head-shaped sculpture on the left.][pic:01JGRTD9JTAYF77TP30G7NYX2P]
|
||||
|
||||
I mean, if I'm gonna be medidating here, I need a place to focus, right?
|
||||
so this little zen garden is precisely that. :3
|
||||
|
||||
% id = "01JGSA36C2PTK0HJF0SB0KMQWR"
|
||||
- I'm really happy with how this little place came out.
|
||||
the color palette is gorgeous; the vibrant greens of the jungle grass, contrasting with the delicate pinks of the cherry tree, on top the gray gravel and stone further accentuating the vibrant colors.
|
||||
|
||||
% id = "01JGSA36C2J3A4D9T1JG47N5YH"
|
||||
- I especially like the bamboo log fence.
|
||||
it's such a nice little lime-ish accent among the in-your-face vibrant green.
|
||||
|
||||
% id = "01JGSA36C2Q9QZHR538YEGRK0C"
|
||||
- #### pond (22 December?)
|
||||
|
||||
I also really wanted a pond next to my house, to give it a slight hint of blue.
|
||||
|
||||
![a pond with a cherry tree next to it. there are dripleaves growing in the water][pic:01JGRTWC2FE82Q35FGQW32Q85P]
|
||||
|
||||
it came out kinda meh.
|
||||
it's a shame Minecraft doesn't have proper pink lilies...
|
||||
|
||||
% id = "01JGSA36C2GW9092W01H3P07R5"
|
||||
- there's also water flowing out the left side, though it's not very visible in the screenshot.
|
||||
|
||||
% id = "01JGSA36C256J5EQ68ZG8K1EEE"
|
||||
- I once had an axolotl in this pond, but the little motherfucker just kept getting out of the water and swimming down the waterfall, so he lives in a bucket now, stashed in a chest inside my house.
|
||||
|
||||
% id = "01JGSA36C24X8BRCTFH9FGN95X"
|
||||
- one thing I really don't like about Minecraft is that water and lava are about the only ambient sounds in the overworld... if you're standing among the grass, it's eerily quiet, whereas IRL you'd probably hear some wind, and a _load_ of bugs in the background.
|
||||
|
||||
% id = "01JGSA36C282X1HA1K2JGS1RWT"
|
||||
- so unfortunately my little pond and zen garden feel pretty plasticky and dead inside. :<
|
||||
|
||||
% id = "01JGSA36C2HE5HAWJGKB488Z5S"
|
||||
- #### cherry grove (22--29 December)
|
||||
|
||||
along the path from the main city to my house, I planted a dense cherry grove.
|
||||
|
||||
it took a few days to grow, and there was Christmas inbetween where I was visiting my family, hence the long time span.
|
||||
|
||||
![the gravel road to my house. it is surrounded by cherry trees on either side. there are lots of lilacs growing under the trees.][pic:01JGRV8W7XXDBZTB46JX216XEE]
|
||||
|
||||
% id = "01JGSMFMQVFN4ZWR0GTXNGPJ3B"
|
||||
- at night though, this place turns quite magical...
|
||||
|
||||
![the cherry grove at night, lit by many lanterns hanging from the trees.][pic:01JGRVEDRF2FNSTVP9M4V0AER8]
|
||||
|
||||
% id = "01JGSA36C2MSCJTSD8APFPFG1P"
|
||||
- this view alone was enough to convince me to start playing on Moody brightness.
|
||||
it looks _so good_.
|
||||
|
||||
% id = "01JGSA36C2NY0KKCKK8BMRX2R2"
|
||||
- among the cherry trees, you may find a well...
|
||||
|
||||
![a stone brick well among the cherry trees.][pic:01JGRVNV2AQ0AD3E9CE9AH8PHB]
|
||||
|
||||
...and if you jump inside...
|
||||
|
||||
![an overgrown cave with two rabbit statues inside---one bigger, one smaller.][pic:01JGRVSXG8792K660498YE0ZS8]
|
||||
|
||||
% id = "01JGSA36C2EFNCJDVA49Y3QXAM"
|
||||
+ I really wanted to add a puzzle to this place, but it was among the last things I had built, so I quickly ran out of steam.
|
||||
|
||||
% id = "01JGSA36C29V3HQ7WZ3TQB3SC9"
|
||||
- in particular, I wanted to build a secret room where you'd be able to play out melodies with a virtual flute, opening up passages to various secret places.
|
||||
the redstone was too much for me to handle at that point though.
|
||||
|
||||
% id = "01JGSA36C29T4A86Y7N8XTA68D"
|
||||
- now we're getting to the silly part of the screenshots. brace yourselves!
|
||||
|
||||
% id = "01JGRNC1F4946XGCASYXSNVC4M"
|
||||
- #### graffiti (31 December)
|
||||
|
||||
on New Year's Eve, we built _this_ with [ezioleq][def:person/ezioleq]:
|
||||
|
||||
![the boykisser on a map][pic:01JGRW9M3E0YNBY0SN6YT1PN0N]
|
||||
|
||||
% id = "01JGSA36C2CC5YM8E5CY5B776P"
|
||||
- then I plastered it all over town.
|
||||
|
||||
``` =html
|
||||
<style>
|
||||
.games-minecraft-zen-boykisser-gallery {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
text-align: center;
|
||||
gap: 0.8rem;
|
||||
|
||||
& .pic {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
::: games-minecraft-zen-boykisser-gallery
|
||||
|
||||
![][pic:01JGSDKAQ870V71XV9SSNE50R8]
|
||||
obviously, there's one in my bedroom.
|
||||
|
||||
![][pic:01JGSDKWCET10GM0FD5M751VRH]
|
||||
there's one on the train station... the sign reads "SOUTH CENTRE."
|
||||
|
||||
![][pic:01JGSDMD581MF4MRTAWG376FGY]
|
||||
on the tree in the town square.
|
||||
|
||||
![][pic:01JGSDN6XF8QWGEKSR4A944SXK]
|
||||
on the ceiling in Olek's bedroom.
|
||||
|
||||
![][pic:01JGSDNRT56D1AC8W4CKT5HDFP]
|
||||
in a friend's house.
|
||||
though, it seems like his is Australian.
|
||||
|
||||
![][pic:01JGSDP9RBJ6B47TVGGBKPB306]
|
||||
in someone's house.
|
||||
must be Australian too.
|
||||
|
||||
![][pic:01JGSDPTY3Z0HW5V9DQNDWQR1W]
|
||||
in another someone's house.
|
||||
|
||||
![][pic:01JGSDR74AQ4MKGC5J23KVTT9C]
|
||||
in the walls of the [gord](https://en.wikipedia.org/wiki/Gord_%28archaeology%29) at the spawn.
|
||||
|
||||
![][pic:01JGSDRMYSBRZMAMHBAJ2QV4N0]
|
||||
and on my treehouse, of course.
|
||||
|
||||
:::
|
||||
|
||||
% id = "01JGRNC1F44MMXE1ZP8X1C7HPJ"
|
||||
- #### billboard (2 January)
|
||||
|
||||
the last thing I built was this.
|
||||
|
||||
![a huge billboard over the whole town saying COMES][pic:01JGRXJWQH689TJ4HXT00TTJ6G]
|
||||
|
||||
whoever knows what this is a reference to, congratulations!
|
||||
|
||||
myself, I hold no regrets.
|
||||
|
||||
% id = "01JGRNC1F479Y7MNFR41ESGG7J"
|
||||
- it's surprising some of these builds are so big, considering my idea of building small.
|
||||
|
||||
% id = "01JGRNC1F45J3NF4P6QB0M0NZ5"
|
||||
+ at the same time none of them took longer than a couple days to build, with the meow house being the longest.
|
||||
those ears, man!
|
||||
|
||||
% id = "01JGSNFPYQ10F8MMJDJMT33JZP"
|
||||
- I didn't use Schematica or anything; I was using screenshots and later our [BlueMap](https://bluemap.bluecolored.de/) as a reference.
|
||||
getting them to match perfectly was a load of pain.
|
||||
|
||||
% id = "01JGSNFPYQ04B5GQVHYSECEQZN"
|
||||
- but when you look at the scale of some YouTubers' builds... yeah they are pretty small things aren't they.
|
||||
|
||||
% id = "01JGSNFPYQNSCRQWM91KH8D9R4"
|
||||
- at the same time, I love them!
|
||||
they feel human.
|
||||
they feel cozy.
|
||||
like something you could have IRL.
|
||||
|
||||
% id = "01JGSNFPYQ5JMTD3WCGX87Y5DJ"
|
||||
- it's also really surprising how many raw materials can go into a single "small" build like these.
|
||||
you should try building one yourself to see what I mean.
|
||||
|
||||
% id = "01JGSA36C29EA28JX2KPS7M9KC"
|
||||
- ### other fun screenshots
|
||||
|
||||
% id = "01JGSJAG5NGGGEJRRNX8GQ4QJ4"
|
||||
- ![six people (including me) standing around a bell and ringing it][pic:01JGSFNNTRKZB17EKTHD22N5KW]
|
||||
|
||||
DON DON DON DON DON DON DON DON DON DON DON DON
|
||||
|
||||
% id = "01JGSJAG5NEEFDH998H8B8MXG5"
|
||||
- ![a diagnonal bridge made out of bamboo rafts][pic:01JGSEYKWFDN0EC4NGKECC16KV]
|
||||
|
||||
Now That's a Bridge.
|
||||
|
||||
% id = "01JGSJAG5NC9G77DSP8ZQC7ZHW"
|
||||
- ![a huge toilet in my friend's house][pic:01JGSF8C5G4BK4QJCNND1B6NMJ]
|
||||
|
||||
Now That's a Throne.
|
||||
|
||||
% id = "01JGSJAG5N4VX6W329K41MMDKW"
|
||||
- ![a powered rail loop connected to an upwards slope, with a lever that opens the loop. there are a bunch of signs around it.][pic:01JGSFCQBDN6V47SE8SC7WRMAN]
|
||||
|
||||
> POLISH BRANCH of CERN - accelerator
|
||||
|
||||
> PARTICLE ACCELERATOR
|
||||
|
||||
> HADRON COLLIDER
|
||||
|
||||
> ACCELERATION DOESN'T KILL YOU\
|
||||
> seriously, it doesn't kill you\
|
||||
> (no balls)
|
||||
|
||||
% id = "01JGSJAG5N6ZRQ99053F84541D"
|
||||
+ ![me looking at a piece of mangrove wood][pic:01JGSFVHMA9FFJX42DHNYE5T6W]
|
||||
|
||||
"this tree [sic] looks like a beetroot"
|
||||
|
||||
% id = "01JGSJAG5NX4229RCSXJN4F73E"
|
||||
- the signs on the chests in the back read:
|
||||
|
||||
> gravedigger\
|
||||
> (graver)
|
||||
|
||||
> dirt\
|
||||
> ( erth )
|
||||
|
||||
> plank\
|
||||
> (dock)
|
||||
|
||||
> unreal slate\
|
||||
> unreal slate
|
||||
|
||||
> other\
|
||||
> stone
|
||||
|
||||
> comes\
|
||||
> stone
|
||||
|
||||
> log4j
|
||||
|
||||
> shinies
|
||||
|
||||
there's a lot of extremely obtuse wordplay in some of these, I'm not even gonna try to explain it.
|
||||
|
||||
% id = "01JGSJAG5NQV3W5CB219WYQGR2"
|
||||
- ![vines floating in a chopped down section of a jungle][pic:01JGSG2VJZ48G56GQ33R444J35]
|
||||
|
||||
chopping down a forest ain't easy work; sometimes even the vines covering the trees have to go for a break.
|
||||
|
||||
% id = "01JGSJAG5N0KPYR1GXPNEY7JQ7"
|
||||
- ![ezioleq and I building the boykisser map art; surprisingly enough, it's real. I'm holding the map in my offhand. the boykisser looks very chunky and unfinished.][pic:01JGSG5RA3KE9CECSW2V0FWMP4]
|
||||
|
||||
boykisser (chunky edition)
|
||||
|
||||
% id = "01JGSJAG5NB8SRQNSEBFK97TCC"
|
||||
- ![I am currently at the top of the right pole of the COMES billboard. right now, I was just taking a nap in my comfortable bed][pic:01JGSG9WYPRH9A751JR7MT8QDS]
|
||||
|
||||
"pretty sure that's an OSHA violation"
|
||||
|
||||
[~"this is my house, dude"~](https://youtu.be/vZ3Pi1QBAlQ?t=41){.secret}
|
||||
|
||||
% id = "01JGSJAG5N2DZV8WVNTS8KSEKR"
|
||||
+ ![the town square; a fountain with popbob's trollface head at the top, surrounded by trees][pic:01JGSGDFPVW85NZ8DYT9D31TA6]
|
||||
|
||||
not even our server could escape popbob's wrath.
|
||||
|
||||
% id = "01JGSJAG5NAB26HG574ZHWYQBP"
|
||||
- (that grid of grass blocks up above is [Parkour Civilisation](https://www.youtube.com/watch?v=2pFwQiwRbcg) by the way)
|
||||
|
||||
% id = "01JGSAV721JMAA4S69SVCWDATS"
|
||||
- ### reflections on Minecraft, the product
|
||||
|
||||
% id = "01JGSJAG5NHZKW3Q78R28GDXF5"
|
||||
- there's been a lot of videos popping up on YouTube saying how Minecraft is changing for the worse, how Mojang is too afraid to change the game, or how they're adding useless features...
|
||||
|
||||
% id = "01JGSAV721PES710TDEQSQEXPR"
|
||||
- I think after playing the game _this_ way, I understand the broad strokes Mojang has been painting a lot better, and I can confidently say,
|
||||
|
||||
## Minecraft is fine just the way it is!
|
||||
|
||||
and Mojang is doing a good job expanding the game.
|
||||
|
||||
% id = "01JGSAV721345N1Q8FA21QV02C"
|
||||
- this just _feels_ like the right way to play the game.
|
||||
casually, at your own leisure.
|
||||
not minmaxing---but chilling out!
|
||||
|
||||
that's their target audience, and they're doing a great job catering towards it.
|
||||
|
||||
% id = "01JGSAV721W5MB07Q10JB7FNYR"
|
||||
- being the biggest game in the world puts you in a lot of pressure.
|
||||
you can say Mojang is afraid to change the game in fear of alienating too many players or making it inaccessible, but have you ever considered:
|
||||
|
||||
% id = "01JGSAV721EKEXR2SR3BBQD6EE"
|
||||
- maybe you're simply bored because you got too good?
|
||||
|
||||
% id = "01JGSJAG5NCJD534TEHVQ30H87"
|
||||
- maybe, just maybe, you're not creative enough to enjoy it anymore?
|
||||
|
||||
% id = "01JGSJAG5NMEXKKXA7SGEHC869"
|
||||
- maybe it would be worth it to reignite this spark of creativity?
|
||||
embark on a theme?
|
||||
|
||||
% id = "01JGSAV721GSZB53C7QFAN4XC8"
|
||||
- so... why not chill out a bit?
|
||||
|
||||
% id = "01JGSAV721CKJDMG3BS2X1EHZ0"
|
||||
- ultimately, Minecraft is supposed to be a game where you can bring out your creativity and build your awesome little place.
|
||||
so why not do just that?
|
||||
|
||||
% id = "01JGRNC1F4SKXQ7HAYGXWAKQ4S"
|
||||
- overall, my playthrough lasted 20 days this time.
|
||||
feels quite long; almost a month!
|
||||
|
||||
% id = "01JGRNC1F425KWBDT9YDB81ST6"
|
||||
+ [Prism Launcher](https://prismlauncher.org/) tells me I spent around 92 hours in game, which is quite a bit! though you should consider a bunch of it is AFK, so my real play time is probably more in the 20--40h range.
|
||||
|
||||
% id = "01JGSAV721X14XW5RWQ6QRTN0H"
|
||||
- (if you play Minecraft and you're not using Prism Launcher, you really should! it's way better and soooo much leaner than Mojang's launcher.)
|
||||
|
||||
% id = "01JGSA36C283BTZ710CZJZ1T57"
|
||||
- honestly I'd love to do something like this again, but with completely random people, and with all folks being on board with this "builders-first" philosophy.
|
||||
|
||||
% id = "01JGSA36C29SXK3VM76PBQWAKR"
|
||||
- if you'd be interested... please [let me know][branch:hello]!
|
|
@ -13,7 +13,7 @@
|
|||
- warped, distorted, manipulated to build a world stuck in a finite platter of scattered bits
|
||||
|
||||
% id = "01H9R1NKBBTCXBS5EAQCCBAK4H"
|
||||
- almost as if you're [living in a simulation][branch:music/album/the-flashbulb/our-simulacra], an imperfect world bounded by [the Hidden Words][branch:games/the-talos-principle]
|
||||
- almost as if you're [living in a simulation][branch:music/album/the-flashbulb/our-simulacra], an imperfect world bounded by [the Hidden Words](https://store.steampowered.com/app/257510/The_Talos_Principle/){.secret}
|
||||
|
||||
% id = "01H9R1NKBBJX611BEVRW9MJ9D3"
|
||||
- track list
|
||||
|
@ -22,7 +22,7 @@
|
|||
+ #### When It Happens, It Moves All by Itself
|
||||
|
||||
% id = "01HA4HJKRJXHZ2KEYACKDH7RRA"
|
||||
- enter the [World Machine][branch:games/oneshot]
|
||||
- enter the [World Machine](https://store.steampowered.com/app/420530/OneShot/){.secret}
|
||||
|
||||
% id = "01HA4HJKRJWMSRBEPDHV4XGNE3"
|
||||
+ in a dusty old room, a machine stands alone. you hear an odd crackling coming from the inside.
|
||||
|
|
|
@ -25,6 +25,23 @@ if you've been wondering what I've been up to, you've come to the right place.
|
|||
if you want to read any of the posts, follow the links.
|
||||
it's like that by design.
|
||||
|
||||
% tags = ["games"]
|
||||
id = "01JGSNTVGFX416HFWKFYKR9HZM"
|
||||
- ### [reflections on Minecraft][page:games/minecraft-zen]
|
||||
|
||||
% id = "01JGSNTVGFTWWK7M9CA40MAH8F"
|
||||
- this holiday season, my friend set up a Minecraft server and invited a bunch of folks to have some good ol' block game fun!
|
||||
|
||||
% id = "01JGSNYHZNE5N7SH4R4Q0QSTC1"
|
||||
- this is a retrospect on that playthrough.
|
||||
I was playing in a somewhat unusual way for me, learned lots of new lessons, had lots of reflections along the way...
|
||||
so this is a post that summarises most of it.
|
||||
Builds Included.
|
||||
|
||||
% id = "01JGSNYHZNX9WZFHYFXVPJXQ97"
|
||||
- now that the holidays are over, and I'm out of block game steam, I'll need to move onto something else.
|
||||
who knows what that might be?
|
||||
|
||||
% tags = ["design", "philosophy"]
|
||||
id = "01JG6Y6JNRQA4SSK3TEZ0RRTEB"
|
||||
- ### [design for the free soul][page:design/for-the-free-soul]
|
||||
|
|
|
@ -32,4 +32,5 @@ tracing.workspace = true
|
|||
tracing-chrome = "0.7.2"
|
||||
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
||||
ulid = "1.0.0"
|
||||
webp = "0.3.0"
|
||||
xmlparser = "0.13.6"
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
use std::sync::Arc;
|
||||
use std::{io::Cursor, sync::Arc};
|
||||
|
||||
use axum::{
|
||||
body::Bytes,
|
||||
debug_handler,
|
||||
extract::{Query, State},
|
||||
extract::{DefaultBodyLimit, Query, State},
|
||||
response::IntoResponse,
|
||||
routing::post,
|
||||
Json, Router,
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use tracing::info;
|
||||
|
||||
use crate::{
|
||||
dirs::Dirs,
|
||||
|
@ -18,10 +19,11 @@ use crate::{
|
|||
pub fn router<S>(dirs: Arc<Dirs>) -> Router<S> {
|
||||
Router::new()
|
||||
.route("/", post(picture_upload))
|
||||
.layer(DefaultBodyLimit::disable())
|
||||
.with_state(dirs)
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct PictureUpload {
|
||||
label: String,
|
||||
format: String,
|
||||
|
@ -31,6 +33,16 @@ struct PictureUpload {
|
|||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
|
||||
enum Compression {
|
||||
Lossless,
|
||||
GameScreenshot,
|
||||
}
|
||||
|
||||
impl Compression {
|
||||
pub fn output_format(self) -> Option<&'static str> {
|
||||
match self {
|
||||
Compression::Lossless => None,
|
||||
Compression::GameScreenshot => Some("image/webp"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
|
@ -40,12 +52,48 @@ enum Response {
|
|||
Error(String),
|
||||
}
|
||||
|
||||
fn compress(image_data: &[u8], compression: Compression) -> anyhow::Result<Vec<u8>> {
|
||||
match compression {
|
||||
Compression::Lossless => Ok(image_data.to_vec()),
|
||||
Compression::GameScreenshot => {
|
||||
info!("decompressing original image");
|
||||
let decompressed = image::ImageReader::new(Cursor::new(image_data))
|
||||
.with_guessed_format()?
|
||||
.decode()?
|
||||
.to_rgba8();
|
||||
|
||||
info!("compressing to webp");
|
||||
let compressed = webp::Encoder::new(
|
||||
&decompressed,
|
||||
webp::PixelLayout::Rgba,
|
||||
decompressed.width(),
|
||||
decompressed.height(),
|
||||
)
|
||||
.encode(85.0)
|
||||
.to_vec();
|
||||
Ok(compressed)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn write_compressed(
|
||||
image_data: &[u8],
|
||||
compression: Compression,
|
||||
edit_path: EditPath,
|
||||
) -> anyhow::Result<()> {
|
||||
let compressed = compress(image_data, compression)?;
|
||||
Edit::Write(edit_path, compressed).apply().await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[debug_handler]
|
||||
async fn picture_upload(
|
||||
State(dirs): State<Arc<Dirs>>,
|
||||
Query(mut params): Query<PictureUpload>,
|
||||
image: Bytes,
|
||||
) -> impl IntoResponse {
|
||||
info!(?params, "uploading picture");
|
||||
|
||||
let ulid = ulid::Generator::new()
|
||||
.generate_with_source(&mut rand::thread_rng())
|
||||
.expect("failed to generate ulid");
|
||||
|
@ -57,16 +105,15 @@ async fn picture_upload(
|
|||
let file_name = VPathBuf::new(format!(
|
||||
"{ulid}-{}.{}",
|
||||
params.label,
|
||||
get_extension(¶ms.format).unwrap_or("unknown")
|
||||
get_extension(params.compression.output_format().unwrap_or(¶ms.format))
|
||||
.unwrap_or("unknown")
|
||||
));
|
||||
let Some(edit_path) = vfs::query::<EditPath>(&dirs.pic, &file_name) else {
|
||||
return Json(Response::Error(format!("{file_name} is not editable")));
|
||||
};
|
||||
|
||||
let result = match params.compression {
|
||||
Compression::Lossless => Edit::Write(edit_path, image.to_vec()).apply().await,
|
||||
};
|
||||
|
||||
let result = write_compressed(&image, params.compression, edit_path).await;
|
||||
info!(?result, "done processing");
|
||||
Json(match result {
|
||||
Ok(()) => Response::Ulid(ulid.to_string()),
|
||||
Err(error) => Response::Error(error.to_string()),
|
||||
|
|
|
@ -105,12 +105,6 @@ pub struct JavaScript {
|
|||
pub import_roots: Vec<ImportRoot>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||
pub enum Markup {
|
||||
Markdown,
|
||||
Djot,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
#[instrument(name = "Config::autopopulate_emoji", skip(self))]
|
||||
pub fn autopopulate_emoji(&mut self, dir: &dyn Dir) -> anyhow::Result<()> {
|
||||
|
|
|
@ -247,7 +247,7 @@ impl<'a> Writer<'a> {
|
|||
Container::Image(..) => {
|
||||
self.img_alt_text += 1;
|
||||
if self.img_alt_text == 1 {
|
||||
out.push_str(r#"<img class="pic""#);
|
||||
out.push_str(r#"<img class="pic" loading="lazy""#);
|
||||
} else {
|
||||
return Ok(());
|
||||
}
|
||||
|
|
|
@ -56,6 +56,7 @@ class PictureUpload extends HTMLElement {
|
|||
<label for="compression">compression</label>
|
||||
<select name="compression">
|
||||
<option value="Lossless">lossless</option>
|
||||
<option value="GameScreenshot">game screenshot</option>
|
||||
</select>
|
||||
</p>
|
||||
|
||||
|
|
BIN
static/pic/01JGRQWM3PQ1BQC3D1Y6MSKVN1-meow-cottage-current.webp
Normal file
After Width: | Height: | Size: 490 KiB |
BIN
static/pic/01JGRRPV5XTGQC1KGD5WM210KS-meow-cottage-original.webp
Normal file
After Width: | Height: | Size: 921 KiB |
BIN
static/pic/01JGRS8S4BW88NP0D0QTSXET0W-meow-house-wip.webp
Normal file
After Width: | Height: | Size: 1.1 MiB |
BIN
static/pic/01JGRSWN3XD2E9Q3GN30981TGP-meow-house.webp
Normal file
After Width: | Height: | Size: 820 KiB |
BIN
static/pic/01JGRTD9JTAYF77TP30G7NYX2P-meow-house-zen-garden.webp
Normal file
After Width: | Height: | Size: 898 KiB |
BIN
static/pic/01JGRTWC2FE82Q35FGQW32Q85P-meow-house-pond.webp
Normal file
After Width: | Height: | Size: 714 KiB |
BIN
static/pic/01JGRV8W7XXDBZTB46JX216XEE-cherry-grove.webp
Normal file
After Width: | Height: | Size: 975 KiB |
BIN
static/pic/01JGRVEDRF2FNSTVP9M4V0AER8-cherry-grove-night.webp
Normal file
After Width: | Height: | Size: 552 KiB |
BIN
static/pic/01JGRVNV2AQ0AD3E9CE9AH8PHB-cherry-grove-well.webp
Normal file
After Width: | Height: | Size: 364 KiB |
BIN
static/pic/01JGRVSXG8792K660498YE0ZS8-animal-well.webp
Normal file
After Width: | Height: | Size: 225 KiB |
BIN
static/pic/01JGRW9M3E0YNBY0SN6YT1PN0N-boykisser.webp
Normal file
After Width: | Height: | Size: 206 KiB |
BIN
static/pic/01JGRWZEQDHR1MHYR2WRQH7QG5-treehouse.webp
Normal file
After Width: | Height: | Size: 909 KiB |
BIN
static/pic/01JGRXJWQH689TJ4HXT00TTJ6G-comes.webp
Normal file
After Width: | Height: | Size: 832 KiB |
After Width: | Height: | Size: 724 KiB |
BIN
static/pic/01JGSDKAQ870V71XV9SSNE50R8-boykisser-bedroom.webp
Normal file
After Width: | Height: | Size: 145 KiB |
After Width: | Height: | Size: 738 KiB |
BIN
static/pic/01JGSDMD581MF4MRTAWG376FGY-boykisser-town-square.webp
Normal file
After Width: | Height: | Size: 490 KiB |
After Width: | Height: | Size: 191 KiB |
After Width: | Height: | Size: 179 KiB |
After Width: | Height: | Size: 171 KiB |
After Width: | Height: | Size: 239 KiB |
BIN
static/pic/01JGSDR74AQ4MKGC5J23KVTT9C-boykisser-gord.webp
Normal file
After Width: | Height: | Size: 275 KiB |
BIN
static/pic/01JGSDRMYSBRZMAMHBAJ2QV4N0-boykisser-treehouse.webp
Normal file
After Width: | Height: | Size: 698 KiB |
BIN
static/pic/01JGSEYKWFDN0EC4NGKECC16KV-bridge.webp
Normal file
After Width: | Height: | Size: 558 KiB |
BIN
static/pic/01JGSF30JTDFGX4F95RZPA24PT-endermans-refuge.webp
Normal file
After Width: | Height: | Size: 199 KiB |
BIN
static/pic/01JGSF8C5G4BK4QJCNND1B6NMJ-throne.webp
Normal file
After Width: | Height: | Size: 300 KiB |
BIN
static/pic/01JGSFCQBDN6V47SE8SC7WRMAN-hadron-collider.webp
Normal file
After Width: | Height: | Size: 785 KiB |
BIN
static/pic/01JGSFNNTRKZB17EKTHD22N5KW-bell.webp
Normal file
After Width: | Height: | Size: 359 KiB |
BIN
static/pic/01JGSFVHMA9FFJX42DHNYE5T6W-beetroot.webp
Normal file
After Width: | Height: | Size: 345 KiB |
BIN
static/pic/01JGSG2VJZ48G56GQ33R444J35-vines.webp
Normal file
After Width: | Height: | Size: 882 KiB |
BIN
static/pic/01JGSG5RA3KE9CECSW2V0FWMP4-boykisser-wip.webp
Normal file
After Width: | Height: | Size: 590 KiB |
BIN
static/pic/01JGSG9WYPRH9A751JR7MT8QDS-osha.webp
Normal file
After Width: | Height: | Size: 735 KiB |
BIN
static/pic/01JGSGDFPVW85NZ8DYT9D31TA6-popbob.webp
Normal file
After Width: | Height: | Size: 859 KiB |
BIN
static/pic/mc_cooked_beef-+pixel.png
Normal file
After Width: | Height: | Size: 197 B |
BIN
static/pic/mc_iron_axe-+pixel.png
Normal file
After Width: | Height: | Size: 178 B |
BIN
static/pic/mc_iron_pickaxe-+pixel.png
Normal file
After Width: | Height: | Size: 182 B |
BIN
static/pic/mc_iron_shovel-+pixel.png
Normal file
After Width: | Height: | Size: 155 B |
BIN
static/pic/mc_iron_sword-+pixel.png
Normal file
After Width: | Height: | Size: 196 B |
BIN
static/pic/mc_torch-+pixel.png
Normal file
After Width: | Height: | Size: 138 B |