
NecroFactory
A downloadable game for Windows and Linux
Your regiciding brother has killed you! Fortunately with a witch's poison that turned you into a lich... and you know what, being dead and not having to be king any more is actually kind of great - lots of time to tend to your bergonias! If only he hadn't found out and sent guards to trample your flowers. Now its time to build your strength in the only way a powerful lich does - waging war by creating a factory line of undead!
NecroFactory is a traditional roguelike with elements of tower defence and factory building. In order to make your way though, you must set up small factories to raise undead and then kill them with your defences, with the goal of creating better equipment and stronger killing lines.
This game was made inside one full week for the 7 Day Roguelike Challenge of 2025. Per the rules, this game wasn't completely from scratch - I build upon the foundations of my many previous 7DRL entries. This is my 17th entry in this challenge!
Check out the daily development log here!
Updated | 23 days ago |
Status | Released |
Platforms | Windows, Linux |
Author | Numeron |
Tags | Seven Day Roguelike Challenge, Dungeon Crawler, factory, Pixel Art, Roguelike, Singleplayer, Tactical, Top-Down, Tower Defense, Turn-based |
Average session | About an hour |
Languages | English |
Inputs | Keyboard, Mouse |
Accessibility | Subtitles |
Comments
Log in with itch.io to leave a comment.
Game wont start up for me
Crash log:
Oops! Something went wrong!
Please email this log to numeronreactor@gmail.com
Exception caught at high level by JME: Uncaught exception thrown in Thread[#23,jME3 Main,5,main]
toolbox.logging.ExceptionLogger$CapturedException: Captured Throwable for logging
at toolbox.logging.ExceptionLogger.log(ExceptionLogger.java:97)
at app.ApplicationCore$JMEApplication.handleError(ApplicationCore.java:732)
at com.jme3.system.lwjgl.LwjglAbstractDisplay$1.uncaughtException(LwjglAbstractDisplay.java:99)
at java.base/java.lang.Thread.dispatchUncaughtException(Thread.java:2840)
Caused by: java.lang.RuntimeException: Something went wrong handling the ErrorScreen
at app.Application.onAbortFrame(Application.java:76)
at app.ApplicationCore$JMEApplication.update(ApplicationCore.java:711)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:153)
at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:217)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:234)
at java.base/java.lang.Thread.run(Thread.java:1575)
Caused by: app.ApplicationCore$AbortFrameException: Something went wrong rendering a View: ErrorScreen.primary
at app.View.render(View.java:94)
at app.ErrorScreen.render(ErrorScreen.java:87)
at app.ScreenManager.render(ScreenManager.java:76)
at app.Application.render(Application.java:62)
at app.ApplicationCore$JMEApplication.update(ApplicationCore.java:702)
... 4 more
Caused by: com.jme3.renderer.RendererException: Cannot recompile shader source
at com.jme3.renderer.opengl.GLRenderer.updateShaderSourceData(GLRenderer.java:1335)
at com.jme3.renderer.opengl.GLRenderer.updateShaderData(GLRenderer.java:1471)
at com.jme3.renderer.opengl.GLRenderer.setShader(GLRenderer.java:1535)
at com.jme3.material.logic.DefaultTechniqueDefLogic.render(DefaultTechniqueDefLogic.java:94)
at com.jme3.material.Technique.render(Technique.java:166)
at com.jme3.material.Material.render(Material.java:1026)
at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:614)
at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:266)
at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:302)
at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:905)
at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:779)
at app.graphics.SpriteBatch.flush(SpriteBatch.java:1553)
at app.graphics.SpriteBatch.end(SpriteBatch.java:223)
at app.View2d$1.postFrame(View2d.java:29)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:1114)
at app.View.render(View.java:88)
... 8 more
- Application Core -
App Version: NecroFactory 0.3.0
JME Version: jMonkeyEngine 3.3.2-stable (HEAD 1a05e3f 2020-04-27)
Core: AppCore-LWJGL2
LWJGL Version: 2.9.3 (64 bit)
OpenGL Version: 4.6 (Compatibility Profile) Mesa 24.3.4-arch1.1
OpenGL Profile: Compatibility
GLSL Version: 4.60
Graphics Vendor: Intel
Graphics Renderer: Mesa Intel(R) Graphics (ADL GT2)
OpenGL Limits: {VertexTextureUnits=32, FragmentTextureUnits=32, FragmentUniformVectors=4096, VertexUniformVectors=4096, VertexAttributes=16, FrameBufferSamples=16, FrameBufferAttachments=8, FrameBufferMrtAttachments=8, RenderBufferSize=16384, TextureSize=16384, CubemapSize=16384, ColorTextureSamples=16, DepthTextureSamples=16, TextureAnisotropy=16, UniformBufferObjectMaxVertexBlocks=15, UniformBufferObjectMaxFragmentBlocks=15, UniformBufferObjectMaxGeometryBlocks=15, UniformBufferObjectMaxBlockSize=65536, ShaderStorageBufferObjectMaxBlockSize=134217728, ShaderStorageBufferObjectMaxVertexBlocks=16, ShaderStorageBufferObjectMaxFragmentBlocks=16, ShaderStorageBufferObjectMaxGeometryBlocks=16, ShaderStorageBufferObjectMaxTessControlBlocks=16, ShaderStorageBufferObjectMaxTessEvaluationBlocks=16, ShaderStorageBufferObjectMaxCombineBlocks=80}
Audio Device: OpenAL Soft
Audio Vendor: OpenAL Community
Audio Renderer: OpenAL Soft
Audio Version: 1.1 ALSOFT 1.15.1
Display Mode: WINDOWED
Monitor: :0.0 (not used for this display mode)
Color Depth: -1 (not used for this display mode)
Refresh Rate: 144 (not used for this display mode)
V-Sync: false
FPS Limit: None
Antialias: false
JME Raw: [DepthBits:24,MinHeight:0,DisableJoysticks:true,Icons:[Ljava.awt.image.BufferedImage;@2e389e53,SwapBuffers:true,Resizable:true,decorated:true,Height:768,BitsPerPixel:-1,Width:1024,UseInput:true,FrameRate:-1,monitorId::0.0,Title:NecroFactory 0.3.0,GammaCorrection:false,AudioRenderer:LWJGL,MinWidth:0,VSync:false,Samples:2,StencilBits:8,SettingsDialogImage:/com/jme3/app/Monkey.png,Renderer:LWJGL-OpenGL2,OpenCLPlatformChooser:com.jme3.opencl.DefaultPlatformChooser,Frequency:144,Fullscreen:false,OpenCL:false]
- Application -
Window Resolution: 1024, 768
Pixel Resolution: 512, 384
Gui Zoom: x2 (Auto)
Audio Channels Used: 0 / 64
Master Volume: 0.5
Effects Volume: 0.5 * Master = 0.25
Music Volume: 0.5 * Master = 0.25
Ambience Volume: 0.5 * Master = 0.25
Available Mods:
numeron.game 1.0.0
numeron.splash 1.0.0
engine.core 1.0.0
Loaded Mods:
engine.core 1.0.0: numeron.game 1.0.0 (critical): numeron.splash 1.0.0:
Installed Mods:
engine.core 1.0.0: SUCCESS
numeron.game 1.0.0 (critical): SUCCESS
numeron.splash 1.0.0: SUCCESS
Mod variables: toolbox.config.ConfigObject@34e15216[{}]
Current Screen: app.ErrorScreen
Current Phase: null
Phase Queue: 0
Cursor State: VISIBLE
Cursor Type: ANIMATED
Cursor Zoom: Match GUI Zoom
Cursor Location: 0, 0 (GUI: 0, 0)
Key Bindings:
Recent Key History: None
Asset Manager: DesktopAssetManager
Asset Locators:
ClasspathLocator: /
Stored fonts: 2
Stored renderers: 0
Stored textures: 0
Stored images: 0
Stored cursors: 0
- Mod: Engine Core -
Unique Name: engine.core
Display Name: Engine Core
Version: 1.0.0
App Compatibility: * (Compatible)
Author: Numeron
Source Directory: toolbox.Resource$ClasspathResource@17fb8fa0[source: java.net.URLClassLoader@246b179d, path: mods/engine_core/]
Working Directory: ./output/NecroFactory/mods/engine.core/1.0.0
Exports: <None>
Imports: <None>
- Mod: Necro Factory -
Unique Name: numeron.game
Display Name: Necro Factory
Version: 1.0.0
App Compatibility: * (Compatible)
Author: Numeron
Source Directory: toolbox.Resource$ClasspathResource@4b681c14[source: java.net.URLClassLoader@246b179d, path: mods/numeron_game/]
Working Directory: ./output/NecroFactory/mods/numeron.game/1.0.0
Exports: <None>
Imports: <None>
- Mod: Numeron Reactor Splash -
Unique Name: numeron.splash
Display Name: Numeron Reactor Splash
Version: 1.0.0
App Compatibility: * (Compatible)
Author: Numeron
Source Directory: toolbox.Resource$ClasspathResource@34f88841[source: java.net.URLClassLoader@246b179d, path: mods/numeron_splash/]
Working Directory: ./output/NecroFactory/mods/numeron.splash/1.0.0
Exports: <None>
Imports: <None>
- Operating System -
Linux 6.13.6-zen1-1-zen amd64
Processor ID: null
Available Cores: 12
Adelaide Time: 14-Mar-2025 21:38 Central Standard Time (South Australia)
UTC Time: 14-Mar-2025 11:08 Universal Standard Time (UTC)
System Time: 14-Mar-2025 12:08 Central European Standard Time
Internet Connectivity: true
Keyboard Locale: en_US
Caps Lock: false
Num Lock: true
Scroll Lock: false
Kana Lock: false
Graphics Device 1: Display Screen
Resolution: 1920, 1080
Bit Depth: Unknown
Refresh Rate: 144
Running Something Fullscreen: false
Fullscreen Supported: true
- Java -
Version: 23.0.2
Vendor: Arch Linux https://openjdk.org/
Specification: Java Virtual Machine Specification Oracle Corporation 23
Virtual Machine: OpenJDK 64-Bit Server VM Arch Linux 23.0.2
VM Arguments: None
Security Manager: false
Uptime: 0h 0m 1s 416ms
Memory Limit: 3924.0 Megabytes
Allocated Memory: 248.0 Megabytes
Free Memory: 224.91855 Megabytes
Used Memory: 23.081451 Megabytes
- Threads -
Signal Dispatcher (RUNNING)
Stack unavailable
DestroyJavaVM (RUNNING)
Stack unavailable
Notification Thread (RUNNING)
Stack unavailable
Reference Handler (RUNNING)
java.base@23.0.2/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
java.base@23.0.2/java.lang.ref.Reference.processPendingReferences(Reference.java:246)
java.base@23.0.2/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:208)
Common-Cleaner (TIMED_WAITING)
java.base@23.0.2/jdk.internal.misc.Unsafe.park(Native Method)
java.base@23.0.2/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:269)
java.base@23.0.2/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1852)
java.base@23.0.2/java.lang.ref.ReferenceQueue.await(ReferenceQueue.java:79)
java.base@23.0.2/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:151)
java.base@23.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:229)
java.base@23.0.2/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:140)
java.base@23.0.2/java.lang.Thread.runWith(Thread.java:1588)
java.base@23.0.2/java.lang.Thread.run(Thread.java:1575)
java.base@23.0.2/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:186)
Finalizer (WAITING)
java.base@23.0.2/java.lang.Object.wait0(Native Method)
java.base@23.0.2/java.lang.Object.wait(Object.java:378)
java.base@23.0.2/java.lang.Object.wait(Object.java:352)
java.base@23.0.2/java.lang.ref.NativeReferenceQueue.await(NativeReferenceQueue.java:48)
java.base@23.0.2/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:166)
java.base@23.0.2/java.lang.ref.NativeReferenceQueue.remove(NativeReferenceQueue.java:89)
java.base@23.0.2/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:173)
jME3 Audio Decoder (TIMED_WAITING)
java.base@23.0.2/java.lang.Thread.sleepNanos0(Native Method)
java.base@23.0.2/java.lang.Thread.sleepNanos(Thread.java:496)
java.base@23.0.2/java.lang.Thread.sleep(Thread.java:527)
com.jme3.audio.openal.ALAudioRenderer.run(ALAudioRenderer.java:303)
java.base@23.0.2/java.lang.Thread.runWith(Thread.java:1588)
java.base@23.0.2/java.lang.Thread.run(Thread.java:1575)
jME3 Main (RUNNING)
java.base@23.0.2/java.lang.Thread.dumpThreads(Native Method)
java.base@23.0.2/java.lang.Thread.getAllStackTraces(Thread.java:2460)
toolbox.logging.SystemInfoCollector.printThreadDetails(SystemInfoCollector.java:347)
toolbox.logging.ExceptionLogger.logInternal(ExceptionLogger.java:181)
toolbox.logging.ExceptionLogger.log(ExceptionLogger.java:102)
app.ApplicationCore$JMEApplication.handleError(ApplicationCore.java:732)
com.jme3.system.lwjgl.LwjglAbstractDisplay$1.uncaughtException(LwjglAbstractDisplay.java:99)
java.base@23.0.2/java.lang.Thread.dispatchUncaughtException(Thread.java:2840)
AWT-XAWT (RUNNING)
java.desktop@23.0.2/sun.awt.X11.XToolkit.waitForEvents(Native Method)
java.desktop@23.0.2/sun.awt.X11.XToolkit.run(XToolkit.java:687)
java.desktop@23.0.2/sun.awt.X11.XToolkit.run(XToolkit.java:651)
java.base@23.0.2/java.lang.Thread.runWith(Thread.java:1588)
java.base@23.0.2/java.lang.Thread.run(Thread.java:1575)
Java2D Disposer (WAITING)
java.base@23.0.2/jdk.internal.misc.Unsafe.park(Native Method)
java.base@23.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:371)
java.base@23.0.2/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:519)
java.base@23.0.2/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:4023)
java.base@23.0.2/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3969)
java.base@23.0.2/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1712)
java.base@23.0.2/java.lang.ref.ReferenceQueue.await(ReferenceQueue.java:75)
java.base@23.0.2/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:166)
java.base@23.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:246)
java.desktop@23.0.2/sun.java2d.Disposer.run(Disposer.java:145)
java.base@23.0.2/java.lang.Thread.runWith(Thread.java:1588)
java.base@23.0.2/java.lang.Thread.run(Thread.java:1575)
process reaper (TIMED_WAITING)
java.base@23.0.2/jdk.internal.misc.Unsafe.park(Native Method)
java.base@23.0.2/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:410)
java.base@23.0.2/java.util.concurrent.LinkedTransferQueue$DualNode.await(LinkedTransferQueue.java:452)
java.base@23.0.2/java.util.concurrent.SynchronousQueue$Transferer.xferLifo(SynchronousQueue.java:194)
java.base@23.0.2/java.util.concurrent.SynchronousQueue.xfer(SynchronousQueue.java:235)
java.base@23.0.2/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:338)
java.base@23.0.2/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1069)
java.base@23.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.base@23.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
java.base@23.0.2/java.lang.Thread.runWith(Thread.java:1588)
java.base@23.0.2/java.lang.Thread.run(Thread.java:1575)
java.base@23.0.2/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:186)
- Classpath -
NecroFactory.jar
- Working Directory -
Path: /home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/
Exists: true
Directory: true
Total space: 488080.28 Megabytes
Free space: 375529.44 Megabytes
Usable space: 374201.56 Megabytes
Directory Contents: /home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/error_20250314_1202_13.log
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/error_20250314_1202_13_1.log
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/error_20250314_1208_48.log
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/error_20250314_1208_48_1.log
- Application Directory -
Path: /home/lynn/.config/itch/apps/necrofactory 2/
Exists: true
Directory: true
Total space: 488080.28 Megabytes
Free space: 375529.44 Megabytes
Usable space: 374201.56 Megabytes
Directory Contents: /home/lynn/.config/itch/apps/necrofactory 2/
/home/lynn/.config/itch/apps/necrofactory 2/NecroFactory.jar
/home/lynn/.config/itch/apps/necrofactory 2/Readme.txt
/home/lynn/.config/itch/apps/necrofactory 2/libopenal64.so
/home/lynn/.config/itch/apps/necrofactory 2/liblwjgl64.so
/home/lynn/.config/itch/apps/necrofactory 2/.itch/
/home/lynn/.config/itch/apps/necrofactory 2/.itch/receipt.json.gz
/home/lynn/.config/itch/apps/necrofactory 2/.itch/runlock.json
/home/lynn/.config/itch/apps/necrofactory 2/.itch/temp/
/home/lynn/.config/itch/apps/necrofactory 2/output/
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/error_20250314_1202_13.log
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/error_20250314_1202_13_1.log
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/error_20250314_1208_48.log
/home/lynn/.config/itch/apps/necrofactory 2/output/NecroFactory/logs/error_20250314_1208_48_1.log
This is a shader compilation issue that only seems to affect Linux users, should be fixed in latest version!
i cant download the new version, it doesnt show for me.
Sorry, I understand I might have caused some confusion with this, but I revised the versioning so v2->v1.1, v3->v1.2, newest version v1.3
i can only download V1.0 (exe) and already have V1.0 (jar)
I had fun with this. I'm a sucker for factory sims. Impressive amount of polish and depth. Well done!
Thanks for playing, that's a boss killer all right!
And with V2 game crashes on death.
Log:
Caused by: app.BaseErrorScreen$ErrorSource: Server shutdown
... 13 more
Caused by: toolbox.network.DisconnectDetails: Cannot invoke "server.engine.mobile.Hero.addResource(base.engine.item.ItemType, int)" because the return value of "server.engine.World.getHero()" is null
at toolbox.network.ServiceLong$LongServiceThread.run(ServiceLong.java:215)
at toolbox.sync.CallbackRunnable.run(CallbackRunnable.java:17)
Many thanks again, fixed for V3! This was present in the original version too, but doesn't happen every time - it was caused by receiving resources after death
A bit unexpected twist, feels hardcore at beginning(mostly from non refundable bulldozing), but very cool like almost all your game!
But warning: by clicking+skip-turn too fast I got crash...
Log:
Caused by: app.ApplicationCore$AbortFrameException: Something went wrong while handling mouse button events
at app.InputManager$1.onMouseButtonEvent(InputManager.java:177)
at com.jme3.input.InputManager.processQueue(InputManager.java:841)
at com.jme3.input.InputManager.update(InputManager.java:917)
at com.jme3.app.LegacyApplication.update(LegacyApplication.java:724)
at app.ApplicationCore$JMEApplication.update(ApplicationCore.java:670)
... 4 more
Caused by: java.lang.NullPointerException: Cannot invoke "toolbox.Compass.getTranslateX()" because "direction" is null
at app.mods.game.screen.GameScreen.lambda$2(GameScreen.java:649)
at app.mods.game.layer.dungeon.CardinalSelector.onKeyEvent(CardinalSelector.java:113)
at app.mods.game.layer.dungeon.SelectorNode.lambda$1(SelectorNode.java:91)
at app.shapes.MySpatial.dispatchKeyEvent(MySpatial.java:571)
at app.mods.game.layer.DungeonLayer3.onKeyEvent(DungeonLayer3.java:765)
at app.mods.game.screen.GameScreen.onKeyEvent(GameScreen.java:453)
at app.ScreenManager.onKeyEvent(ScreenManager.java:115)
at app.InputManager.triggerKeyEvent(InputManager.java:283)
at app.InputManager.access$3(InputManager.java:244)
at app.InputManager$1.onMouseButtonEvent(InputManager.java:173)
*Opening build menu while also skipping turn also crash game.
Hello many thanks for reporting! Fixed and fixed!
You captioned fix as post challenge, but JAM still accepts edit aren't?
I like game, and it's a bit sad to me, to see so important fixes as postjam...
Thanks for the support! unfortunately my slot is closed. The rules give 7 days to do the job, where you can start whenever you want on the first weekend, and finish the same time on the next weekend - the jam on itch stays open to accept entries from later starters in late timzones. It's all good though - from past experience I know people play the bug fix version anyway.
I overestimate final boss a bit... And prepare a lot of h-kits and turrets before throne room...
Soo tasty but so small... I already wait for next year...