Sacrificed by Klemmbaustein

You are dying. Your only chance of survival is summoning a demon.
- Complete all tasks before the time runs out.
- Make sure to satisfy your customers.
A hectic game about quickly moving around items. Summon a demon to cure your illness.
This game was created using my own game engine.
| Game Source Code | https://github.com/Klemmbaustein/ldjam55 |
| Engine Source Code | https://github.com/Klemmbaustein/Klemmgine |
| Itch.io page | https://klemmbaustein.itch.io/sacrificed |
| Original URL | https://ldjam.com/events/ludum-dare/55/sacrificed |
Ratings
| Overall | 67th | 3.87⭐ | 25🧑⚖️ |
| Fun | 59th | 3.848⭐ | 25🧑⚖️ |
| Innovation | 178th | 3.318⭐ | 24🧑⚖️ |
| Theme | 75th | 4.022⭐ | 25🧑⚖️ |
| Graphics | 99th | 3.848⭐ | 25🧑⚖️ |
| Audio | 86th | 3.591⭐ | 24🧑⚖️ |
| Humor | 112th | 3.275⭐ | 22🧑⚖️ |
| Mood | 29th | 4.065⭐ | 25🧑⚖️ |
| Given | 29🗳️ | 15🗨️ |
Very atmospheric game! I got really absorbed into the routine of running the shop while handling the side hustle of summoning demons. The little buzz from the lamp while you whizz through the store and the lighting really brought out a special mood, I liked how you designed that. I also liked how the area got more and more demonic over time, that was a cool progression! Overall very well done, great job!
```
Starting...
- Starting SDL2 - SDL2 started (No error)
- Starting GLEW - GLEW started (No error)
Log: [Error]: ------------------------------------[Error]------------------------------------
Log: [Error]: Crash
Log: [Error]: Status:
terminate called after throwing an instance of 'int'
[1] 77402 IOT instruction ./Sacrificed
```
```
Thread 1 "Sacrificed" received signal SIGILL, Illegal instruction.
0x00005555557a7209 in JPH::CollisionDispatch::sInit() ()
(gdb) bt
#0 0x00005555557a7209 in JPH::CollisionDispatch::sInit() ()
#1 0x000055555577ed82 in JPH::RegisterTypesInternal(unsigned long) ()
#2 0x0000555555665a97 in JoltPhysics::Init() ()
#3 0x00005555556707dc in PhysicsSubsystem::PhysicsSubsystem() ()
#4 0x00005555555be882 in Application::Initialize(int, char**) ()
#5 0x00007ffff76186ca in __libc_start_call_main (main=main@entry=0x555555598660 <main>, argc=argc@entry=1, argv=argv@entry=0x7fffffffe1c8) at ../sysdeps/nptl/libc_start_call_main.h:58
#6 0x00007ffff7618785 in __libc_start_main_impl (main=0x555555598660 <main>, argc=1, argv=0x7fffffffe1c8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
stack_end=0x7fffffffe1b8) at ../csu/libc-start.c:360
#7 0x00005555555a0995 in _start ()
```
I can recompile the engine and game so it works without AVX2, if that is the problem.
I tried recompiling the code, but I got blocking warnings when compiling assimp, so I gave up :-)
I recompiled the game, it should now work without AVX2. I don't know how well it will run on your CPU though.
Here is the GitHub release:
https://github.com/Klemmbaustein/ldjam55/releases/tag/no-avx2
Unfortunately, with the no-avx2 version, I still get a crash at startup:
```
ace@ANTEC Sacrificed % ./Sacrificed
Starting...
- Starting SDL2 - SDL2 started (No error)
- Starting GLEW - GLEW started (No error)
Log: [Error]: ------------------------------------[Error]------------------------------------
Log: [Error]: Crash
Log: [Error]: Status: Loading Scene
terminate called after throwing an instance of 'int'
[1] 2352 IOT instruction ./Sacrificed
ace@ANTEC Sacrificed %
```
... not in the same place, though:
```
Thread 1 "Sacrificed" received signal SIGILL, Illegal instruction.
0x0000555555742cb5 in JPH::AABBTreeToBuffer<JPH::TriangleCodecIndexed8BitPackSOA4Flags, JPH::NodeCodecQuadTreeHalfFloat<1> >::Convert(std::vector<JPH::Float3, JPH::STLAllocator<JPH::Float3> > const&, JPH::AABBTreeBuilder::Node const*, char const*&) ()
(gdb) bt
#0 0x0000555555742cb5 in JPH::AABBTreeToBuffer<JPH::TriangleCodecIndexed8BitPackSOA4Flags, JPH::NodeCodecQuadTreeHalfFloat<1> >::Convert(std::vector<JPH::Float3, JPH::STLAllocator<JPH::Float3> > const&, JPH::AABBTreeBuilder::Node const*, char const*&) ()
#1 0x000055555573f469 in JPH::MeshShape::MeshShape(JPH::MeshShapeSettings const&, JPH::Result<JPH::Ref<JPH::Shape> >&) ()
#2 0x00005555556499d5 in CreateJoltShapeFromBody(Physics::PhysicsBody*) ()
#3 0x000055555564a5fb in JoltPhysics::CreateShape(Physics::PhysicsBody*) ()
#4 0x000055555564a7dd in JoltPhysics::RegisterBody(Physics::PhysicsBody*) ()
#5 0x00005555556532c2 in CollisionComponent::Load(ModelGenerator::ModelData const&, Transform) ()
#6 0x000055555564d19c in MeshObject::LoadFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) ()
#7 0x000055555564d5a6 in MeshObject::OnPropertySet() ()
#8 0x00005555555e55b6 in Scene::LoadSceneInternally(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) ()
#9 0x00005555555e6326 in Scene::LoadNewScene(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool) ()
#10 0x00005555555bef64 in Application::Initialize(int, char**) ()
#11 0x00007ffff76186ca in __libc_start_call_main (main=main@entry=0x5555555986a0 <main>, argc=argc@entry=1, argv=argv@entry=0x7fffffffe198) at ../sysdeps/nptl/libc_start_call_main.h:58
#12 0x00007ffff7618785 in __libc_start_main_impl (main=0x5555555986a0 <main>, argc=1, argv=0x7fffffffe198, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
stack_end=0x7fffffffe188) at ../csu/libc-start.c:360
#13 0x00005555555a0925 in _start ()
(gdb)
```
I'm rather surprised not having run into these kind of problems earlier with other game (This is the first time!).
Your custom engine is solid and your game runs fine on my machine, well done.
I'm always happy to see people using their own engine!
The game is hard, though ; I only made it to tuesday :-)
Considering the dark/evening/foggy mood, the sound effects are a little too "dry", and might benefit from a little reverb ; and the whole mood would be greatly improved by simply adding a looped low-pass filtered+reverb white noise. This would make the whole audio atmosphere "blend" together!
This is quite featureful compared to the typical
"custom game engine" entry; I noticed particle effects, models, textures, positional sound, rigid-body
physics, and a camera raycast. I would have thought this was a Unity game,
had I not read the description.
Random thoughts on the game itself:
- Blurry texture upscaling is pretty ugly to my eyes. I think using something like GL_NEAREST would
be much nicer visually, even if the "pixelated" look lacks realism
- The "electrical hum" sound should always be the same frequency everywhere, assuming
the shed isn't in a different country from the shop
- The twist was funny and caught me off-guard, since I wasn't reading the task list and just wanted
to click the customer to figure out what they wanted
- That time limit is just a liiitle bit too tight, I think. When you're _constantly_ moving from one
second to the next, you start to get super frustrated at the little things like getting caught on
corners or the ever-so-slightly-too-short raycast distance when trying to reach the magazines
- For how stressed I was by the end, I was hoping for a bit more of a satisfying ending :P
Good job!
- I agree, pixelated looks better. Nearest filtering even is the default filtering option in the editor. The last few projects I've made in my game engine had a pixelated look, so I wanted to try something different.
- Fair.
- I came up with the twist as soon as I implemented the customers into the game but wasn't really sure if I had the time to implement it. It was worth it though in the end.
- I agree. When my friend playtested the game he told me the game was too easy in the early parts of the game, but I think I might've gone a little too much in the opposite direction...
- I didn't really know how to end the game and didn't have enough time to come up with something more.
I personally like the ultra-filtered look for this game, it makes it more creepy somehow, and while pixelated textures would make it look more modern/artsy/nice that would make the creepy atmosphere less prevalent in my eyes.
And EXTRA impressive that you made the engine yourself! It feels really polished as far as features goes that are in this game.
Great work!
I love seeing submissions where people use their own engine, awesome job! I tried the Linux version, but unfortunately I couldn't get it to work. First, it dynamically links with sndio but doesn't ship with it, so I had to build it myself (sndio isn't provided by Fedora, but sndio runs atop alsa so you could get away with static linking). But after I did that, it failed to start due to a GLEW error, probably because I'm on Wayland. I guess [this issue](https://github.com/nigels-com/glew/issues/172) might be relevant, as even running it through Xwayland didn't fix the error. It seems some people found workarounds in the linked issues at the end.
Anyways, the Windows build worked through Wine so I was able to play :)
The problem with libsndio seems to be related to [this GitHub issue](https://github.com/kcat/openal-soft/issues/989). I'll look into it
The GLEW thing seems odd. For me it works both on Wayland Cinnamon and on WSLg which also uses Wayland. Can you describe the error further?
```
Starting...
- Starting SDL2 - SDL2 started (No error)
- Starting GLEW - GLEW Init Error:
No GLX display
Press Enter to continue
```
I tried running it directly, and through an dedicated Xwayland window. For reference, here's my system info:
```
Operating System: Fedora Linux 40
KDE Plasma Version: 6.0.3
KDE Frameworks Version: 6.0.0
Qt Version: 6.6.2
Kernel Version: 6.8.7-300.fc40.x86_64 (64-bit)
Graphics Platform: Wayland
Processors: 24 × AMD Ryzen 9 7900 12-Core Processor
Memory: 61.9 GiB of RAM
Graphics Processor: NVIDIA GeForce RTX 4090/PCIe/SSE2
Manufacturer: Gigabyte Technology Co., Ltd.
Product Name: B650M K
```

Really great atmosphere. Goldeneye vibes. The droning from the lights was a great touch and I really liked how each day more ritual-related stuff started showing up.
It was challenging but not frustrating. It was probably good that I looked around on the first day before customers made things more hectic, so that I already knew about the stuff in the shed before I needed it. It actually took me a little while to realise there was a backroom with the actual pentagram :')
I only failed a day once. It was nice that things were the same on the retry so that I knew not to drop the drill and serve the customer at the very end, when I could just sacrifice the drill first and then the customer wouldn't need to be served due to the, uh, circumstances... I also appreciated the time to breathe between days.
Can't really criticise anything except the ending could've had more to it, but that's a big ask for LD, and this was already impressive for a jam, fair amount of modelling work! Appreciate at least a nod to consequences for killing the customer in the end text.
Very cool, really nice job.