From abef6da56913f1c55528103e60a50451a39628b1 Mon Sep 17 00:00:00 2001 From: WlodekM Date: Sun, 16 Jun 2024 10:35:45 +0300 Subject: initial commit --- readme.md | 443 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 443 insertions(+) create mode 100644 readme.md (limited to 'readme.md') diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..0412f44 --- /dev/null +++ b/readme.md @@ -0,0 +1,443 @@ +ClassiCube is a custom Minecraft Classic compatible client written in C from scratch.
+**It is not affiliated with (or supported by) Mojang AB, Minecraft, or Microsoft in any way.** + +# What ClassiCube is + +ClassiCube aims to replicate the 2009 Minecraft Classic client while offering **optional** enhancements to improve gameplay. ClassiCube can run on [many systems](#supported-systems), including desktop, web, mobile, and even some consoles. +
+Features (click to expand) + +* Much better performance and minimal memory usage compared to original Minecraft Classic +* Optional enhancements including custom blocks, models, and environment colors +* Partially supports some features of Minecraft Classic versions before 0.30 +* Works with effectively all graphics cards that support OpenGL or Direct3D 9 +* Runs on Windows, macOS, Linux, Android, iOS, and in a web browser +* Also runs on OpenBSD, FreeBSD, NetBSD, Solaris, Haiku, IRIX, SerenityOS +* Although in various stages of early development, also runs on various consoles + +
+ +ClassiCube is not trying to replicate modern Minecraft versions. It will never support survival, logging in with Minecraft accounts or connecting to Minecraft servers. + +You can **download ClassiCube** [from here](https://www.classicube.net/download/) and the very latest builds [from here](https://www.classicube.net/nightlies/). + +![classic](https://github.com/ClassiCube/ClassiCube/assets/6509348/eedee53f-f53e-456f-b51c-92c62079eee0) + +![enhanced](https://github.com/ClassiCube/ClassiCube/assets/6509348/b2fe0e2b-5d76-41ab-909f-048d0ad15f37) + + +# We need your help + +ClassiCube strives to replicate the original Minecraft Classic experience by **strictly following a [clean room](https://en.wikipedia.org/wiki/Clean_room_design) reverse engineering approach**. + +If you're interested in documenting or verifying the behaviour of the original Minecraft Classic, please get in contact with me. (`unknownshadow200` on Discord) + + +# How to play +Initially, you will need to run ClassiCube.exe to download the required assets from minecraft.net and classicube.net.
+Just click 'OK' to the dialog menu that appears when you start the launcher. + +**Singleplayer** +Run ClassiCube.exe, then click Singleplayer at the main menu. + +**Multiplayer** +Run ClassiCube.exe. You can connect to LAN/locally hosted servers, and classicube.net servers if you have a [ClassiCube account](https://www.classicube.net/). + +**Note:** When running from within VirtualBox, disable Mouse Integration, otherwise the camera will not work properly + +#### *Stuck on OpenGL 1.1?* +The most common reason for being stuck on OpenGL 1.1 is non-working GPU drivers - so if possible, you should try either installing or updating the drivers for your GPU. + +Otherwise: +* On Windows, you can still run the OpenGL build of ClassiCube anyways. (You can try downloading and using the MESA software renderer from [here](http://download.qt.io/development_releases/prebuilt/llvmpipe/windows/) for slightly better performance though) +* On other operating systems, you will have to [compile the game yourself](#Compiling). Don't forget to add `-DCC_BUILD_GL11` to the compilation command line so that the compiled game supports OpenGL 1.1. + +# Supported systems + +ClassiCube runs on: +* Windows - 95 and later +* macOS - 10.5 or later (but can be compiled to work with 10.3/10.4 though) +* Linux - needs `libcurl` and `libopenal` +* Android - 2.3 or later +* iOS - 8.0 or later +* Most web browsers (even runs on IE11) + +And also runs on: +* Raspberry Pi - needs libcurl and libopenal +* FreeBSD - needs libexecinfo, curl and openal-soft packages (if you have a GitHub account, can [download from here](https://github.com/ClassiCube/ClassiCube/actions/workflows/build_freebsd.yml)) +* NetBSD - needs libexecinfo, curl and openal-soft packages (if you have a GitHub account, can [download from here](https://github.com/ClassiCube/ClassiCube/actions/workflows/build_netbsd.yml)) +* OpenBSD - needs libexecinfo, curl and openal packages +* Solaris - needs curl and openal packages +* Haiku - needs openal package (if you have a GitHub account, can [download from here](https://github.com/ClassiCube/ClassiCube/actions/workflows/build_haiku.yml)) +* BeOS - untested on actual hardware +* IRIX - needs curl and openal packages +* SerenityOS - needs SDL2 +* Classic Mac OS (System 7 and later) +* Dreamcast - unfinished, but renders (can [download from here](https://www.classicube.net/download/dreamcast)) +* Switch - unfinished, but usable (can [download from here](https://www.classicube.net/download/switch)) +* Wii U - unfinished, major issues (if you have a GitHub account, can [download from here](https://github.com/ClassiCube/ClassiCube/actions/workflows/build_wiiu.yml)), **untested on real hardware**) +* Wii - unfinished, but usable (can [download from here](https://www.classicube.net/download/wii)) +* GameCube - unfinished, but usable (can [download from here](https://www.classicube.net/download/gamecube)) +* Nintendo 64 - unfinished, moderate rendering issues (can [download from here](https://www.classicube.net/download/n64)) +* 3DS - unfinished, but usable (can [download from here](https://www.classicube.net/download/3ds)) +* DS/DSi - unfinished, rendering issues (can [download from here](https://www.classicube.net/download/nds)) +* PS Vita - unfinished, rendering issues (can [download from here](https://www.classicube.net/download/vita)) +* PSP - unfinished, rendering issues (can [download from here](https://www.classicube.net/download/psp)) +* PS3 - unfinished, rendering issues (can [download from here](https://www.classicube.net/download/ps3)) +* PS2 - unfinished, major rendering and **stability issues** (can [download from here](https://www.classicube.net/download/ps2)) +* PS1 - unfinished, major rendering and **stability issues** +* Xbox 360 - completely unfinished (if you have a GitHub account, can [download from here](https://github.com/ClassiCube/ClassiCube/actions/workflows/build_xbox360.yml)), **untested on real hardware**) +* Xbox - unfinished, major rendering issues (can [download from here](https://www.classicube.net/download/xbox)) + +# Compiling + +*Note: The various instructions below automatically compile ClassiCube with the recommended defaults for the platform.
+If you (not recommended) want to override the defaults (e.g. to compile OpenGL build on Windows), see [here](doc/overriding-defaults.md) for details.* + +## Compiling - Windows + +##### Using Visual Studio +Open ClassiCube.sln *(File -> Open -> Project/Solution)* and compile it *(Build -> Build Solution)*. + +If you get a `The Windows SDK version 5.1 was not found` compilation error, [see here for how to fix](doc/compile-fixes.md#visual-studio-unsupported-platform-toolset) + +##### Using Visual Studio (command line) +1. Use 'Developer Tools for Visual Studio' from Start Menu +2. Navigate to the directory with ClassiCube's source code +3. Enter `cl.exe *.c /link user32.lib gdi32.lib winmm.lib dbghelp.lib shell32.lib comdlg32.lib /out:ClassiCube.exe` + +##### Using MinGW-w64 +I am assuming you used the installer from https://sourceforge.net/projects/mingw-w64/ +1. Install MinGW-W64 +2. Use either *Run Terminal* from Start Menu or run *mingw-w64.bat* in the installation folder +3. Navigate to the directory with ClassiCube's source code +4. Enter `gcc -fno-math-errno *.c -o ClassiCube.exe -mwindows -lwinmm -limagehlp` + +##### Using MinGW +I am assuming you used the installer from https://osdn.net/projects/mingw/ +1. Install MinGW. You need mingw32-base-bin and msys-base-bin packages. +2. Run *msys.bat* in the *C:\MinGW\msys\1.0* folder. +2. Navigate to the directory with ClassiCube's source code +4. Enter `gcc -fno-math-errno *.c -o ClassiCube.exe -mwindows -lwinmm -limagehlp` + +##### Using TCC (Tiny C Compiler) +Setting up TCC: +1. Download and extract `tcc-0.9.27-win64-bin.zip` from https://bellard.org/tcc/ +2. In TCC's `lib/kernel32.def`, add missing `RtlCaptureContext` at line 554 (In between `RtlAddFunctionTable` and `RtlDeleteFunctionTable`) +3. Download `winapi-full-for-0.9.27.zip` from https://bellard.org/tcc/ +4. Copy `winapi` folder and `_mingw_dxhelper.h` from `winapi-full-for-0.9.27.zip` into TCC's `include` folder + +Compiling with TCC: +1. Navigate to the directory with ClassiCube's source code +2. In `ExtMath.c`, change `fabsf` to `fabs` and `sqrtf` to `sqrt` +3. Enter `tcc.exe -o ClassiCube.exe *.c -lwinmm -limagehlp -lgdi32 -luser32 -lcomdlg32 -lshell32`
+(Note: You may need to specify the full path to `tcc.exe` instead of just `tcc.exe`) + +## Compiling - Linux + +##### Using gcc/clang + +Install appropriate libs as required. For ubuntu these are: libx11-dev, libxi-dev and libgl1-mesa-dev + +```gcc -fno-math-errno *.c -o ClassiCube -rdynamic -lpthread -lX11 -lXi -lGL -ldl``` + +##### Cross compiling for Windows (32 bit): + +```i686-w64-mingw32-gcc -fno-math-errno *.c -o ClassiCube.exe -mwindows -lwinmm -limagehlp``` + +##### Cross compiling for Windows (64 bit): + +```x86_64-w64-mingw32-gcc -fno-math-errno src/*.c -o ClassiCube.exe -mwindows -lwinmm -limagehlp``` + +##### Raspberry Pi +Although the regular linux compiliation flags will work fine, to take full advantage of the hardware: + +```gcc -fno-math-errno *.c -o ClassiCube -DCC_BUILD_RPI -rdynamic -lpthread -lX11 -lXi -lEGL -lGLESv2 -ldl``` + +## Compiling - macOS + +```cc -fno-math-errno *.c interop_cocoa.m -o ClassiCube -framework Cocoa -framework OpenGL -framework IOKit -lobjc``` + +Note: You may need to install Xcode before you can compile ClassiCube + +##### Using Xcode GUI + +Open the `misc/macOS/CCMAC.xcodeproj` project in Xcode, and then compile it + +## Compiling - for Android + +NOTE: If you are distributing a modified version, **please change the package ID from `com.classicube.android.client` to something else** - otherwise Android users won't be able to have both ClassiCube and your modified version installed at the same time on their Android device + +##### Using Android Studio GUI + +Open `android` folder in Android Studio (TODO explain more detailed) + +##### Using command line (gradle) + +Run `gradlew` in android folder (TODO explain more detailed) + +## Compiling - for iOS + +iOS version will have issues as it's incomplete and only tested in iOS Simulator + +NOTE: If you are distributing a modified version, **please change the bundle ID from `com.classicube.ios.client` to something else** - otherwise iOS users won't be able to have both ClassiCube and your modified version installed at the same time on their iOS device + +##### Using Xcode GUI + +Open the `ios/CCIOS.xcodeproj` project in Xcode, and then compile it + +##### Using command line (Xcode) + +`xcodebuild -sdk iphoneos -configuration Debug` (TODO explain more detailed) + +## Compiling - webclient + +```emcc *.c -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_STACK=1Mb --js-library interop_web.js``` + +The generated javascript file has some issues. [See here for how to fix](doc/compile-fixes.md#webclient-patches) + +For more details on how to integrate into a website, see [here](doc/hosting-webclient.md) + +
+

Compiling - consoles

+ +All console ports needs assistance from someone experienced with homebrew development - if you're interested, please get in contact with me. (`unknownshadow200` on Discord) + +
+

Nintendo consoles (click to expand)

+ +#### Switch + +Run `make switch`. You'll need [libnx](https://github.com/switchbrew/libnx) and [mesa](https://github.com/devkitPro/mesa) + +**NOTE: It is highly recommended that you install the precompiled devkitpro packages from [here](https://devkitpro.org/wiki/Getting_Started) - you need the `switch-dev` group and the `switch-mesa switch-glm` packages)** + +#### Wii U + +Run `make wiiu`. You'll need [wut](https://github.com/devkitPro/wut/) + +**NOTE: It is highly recommended that you install the precompiled devkitpro packages from [here](https://devkitpro.org/wiki/Getting_Started) - you need the `wiiu-dev` group)** + +#### 3DS + +Run `make 3ds`. You'll need [libctru](https://github.com/devkitPro/libctru) + +**NOTE: It is highly recommended that you install the precompiled devkitpro packages from [here](https://devkitpro.org/wiki/Getting_Started) - you need the `3ds-dev` group)** + +#### Wii + +Run `make wii`. You'll need [libogc](https://github.com/devkitPro/libogc) + +**NOTE: It is highly recommended that you install the precompiled devkitpro packages from [here](https://devkitpro.org/wiki/Getting_Started) - you need the `wii-dev` group)** + +#### GameCube + +Run `make gamecube`. You'll need [libogc](https://github.com/devkitPro/libogc) + +**NOTE: It is highly recommended that you install the precompiled devkitpro packages from [here](https://devkitpro.org/wiki/Getting_Started) - you need the `gamecube-dev` group)** + +#### Nintendo DS/DSi + +Run `make ds`. You'll need [BlocksDS](https://github.com/blocksds/sdk) + +#### Nintendo 64 + +Run `make n64`. You'll need the opengl branch of [libdragon](https://github.com/DragonMinded/libdragon/tree/opengl) + +
+ + +
+

Sony consoles (click to expand)

+ +#### PlayStation Vita + +Run `make vita`. You'll need [vitasdk](https://vitasdk.org/) + +#### PlayStation Portable + +Run `make psp`. You'll need [pspsdk](https://github.com/pspdev/pspsdk) + +**NOTE: It is recommended that you install the precompiled pspsdk version from [here](https://github.com/pspdev/pspdev/releases)** + +#### PlayStation 3 + +Run `make ps3`. You'll need [PSL1GHT](https://github.com/ps3dev/PSL1GHT) + +#### PlayStation 2 + +Run `make ps2`. You'll need [ps2sdk](https://github.com/ps2dev/ps2sdk) + +#### PlayStation 1 + +Run `make ps1`. You'll need [PSn00bSDK](https://github.com/Lameguy64/PSn00bSDK/) + +
+ + +
+

Microsoft consoles (click to expand)

+ +#### Xbox 360 + +Run `make 360`. You'll need [libxenon](https://github.com/Free60Project/libxenon) + +#### Xbox (original) + +Run `make xbox`. You'll need [nxdk](https://github.com/XboxDev/nxdk) + +
+ + +
+

SEGA consoles (click to expand)

+ +### SEGA consoles + +#### Dreamcast + +Run `make dreamcast`. You'll need [KallistiOS](https://github.com/KallistiOS/KallistiOS) + +#### Saturn + +Run `make saturn`. You'll need [libyaul](https://github.com/yaul-org/libyaul) + +
+ +
+ + +
+

Compiling - other platforms (click to expand)

+ +#### FreeBSD + +Install libxi, libexecinfo, curl and openal-soft package if needed + +```cc *.c -o ClassiCube -I /usr/local/include -L /usr/local/lib -lm -lpthread -lX11 -lXi -lGL -lexecinfo``` + +#### OpenBSD + +Install libexecinfo, curl and openal package if needed + +```cc *.c -o ClassiCube -I /usr/X11R6/include -I /usr/local/include -L /usr/X11R6/lib -L /usr/local/lib -lm -lpthread -lX11 -lXi -lGL -lexecinfo``` + +#### NetBSD + +Install libexecinfo, curl and openal-soft package if needed + +```cc *.c -o ClassiCube -I /usr/X11R7/include -I /usr/pkg/include -L /usr/X11R7/lib -L /usr/pkg/lib -lpthread -lX11 -lXi -lGL -lexecinfo``` + +#### DragonflyBSD + +```cc *.c -o ClassiCube -I /usr/local/include -L /usr/local/lib -lm -lpthread -lX11 -lXi -lGL -lexecinfo``` + +#### Solaris + +```gcc -fno-math-errno *.c -o ClassiCube -lsocket -lX11 -lXi -lGL``` + +#### Haiku + +Install openal_devel package if needed + +```cc -fno-math-errno *.c interop_BeOS.cpp -o ClassiCube -lGL -lnetwork -lstdc++ -lbe -lgame -ltracker``` + +#### BeOS + +```cc -fno-math-errno *.c interop_BeOS.cpp -o ClassiCube -lGL -lbe -lgame -ltracker``` + +#### IRIX + +```gcc -fno-math-errno -lGL -lX11 -lXi -lpthread -ldl``` + +#### SerenityOS + +Install SDL2 port if needed + +```cc *.c -o ClassiCube -lgl -lSDL2``` + +#### Classic Mac OS + +Install Retro68 to compile (supports both M68k and PowerPC compiling) + +```make macclassic_68k``` or ```make macclassic_ppc``` + +The PowerPC build will usually perform much better + +#### Other systems + +You'll have to write the necessary code. You should read `portability.md` in doc folder. + +
+ +## Documentation + +Functions and variables in .h files are mostly documented. + +Further information (e.g. style) for ClassiCube's source code can be found in the doc and misc folders. + +#### Known compilation errors + +[Fixes for compilation errors when using musl or old glibc for C standard library](doc/compile-fixes.md#common-compilation-errors) + +#### Tips +* Press escape (after joining a world) or pause to switch to the pause menu. +* Pause menu -> Options -> Controls lists all of the key combinations used by the client. +* Note that toggling 'vsync' to on will minimise CPU usage, while off will maximimise chunk loading speed. +* Press F to cycle view distance. A smaller number of visible chunks can improve performance. + +* If the server has disabled hacks, key combinations such as fly and speed will not do anything. +* To see the list of built in commands, type `/client`. +* To see help for a given built in command, type `/client help `. + + +
+

Open source technologies (click to expand)

+ +* [curl](https://curl.se/) - HTTP/HTTPS for linux and macOS +* [FreeType](https://www.freetype.org/) - Font handling for all platforms +* [GCC](https://gcc.gnu.org/) - Compiles client for linux +* [MinGW-w64](http://mingw-w64.org/doku.php) - Compiles client for windows +* [Clang](https://clang.llvm.org/) - Compiles client for macOS +* [Emscripten](https://emscripten.org/) - Compiles client for web +* [RenderDoc](https://renderdoc.org/) - Graphics debugging +* [BearSSL](https://www.bearssl.org/) - SSL/TLS support on consoles +* [libnx](https://github.com/switchbrew/libnx) - Backend for Switch +* [Ryujinx](https://github.com/Ryujinx/Ryujinx) - Emulator used to test Switch port +* [wut](https://github.com/devkitPro/wut/) - Backend for Wii U +* [Cemu](https://github.com/cemu-project/Cemu) - Emulator used to test Wii U port +* [libctru](https://github.com/devkitPro/libctru) - Backend for 3DS +* [citro3D](https://github.com/devkitPro/citro3d) - Rendering backend for 3DS +* [Citra](https://github.com/citra-emu/citra) - Emulator used to test 3DS port +* [libogc](https://github.com/devkitPro/libogc) - Backend for Wii and GameCube +* [libfat](https://github.com/devkitPro/libfat) - Filesystem backend for Wii/GC +* [Dolphin](https://github.com/dolphin-emu/dolphin) - Emulator used to test Wii/GC port +* [libdragon](https://github.com/DragonMinded/libdragon) - Backend for Nintendo 64 +* [ares](https://github.com/ares-emulator/ares) - Emulator used to test Nintendo 64 port +* [BlocksDS](https://github.com/blocksds/sdk) - Backend for Nintendo DS +* [melonDS](https://github.com/melonDS-emu/melonDS) - Emulator used to test Nintendo DS port +* [vitasdk](https://github.com/vitasdk) - Backend for PS Vita +* [Vita3K](https://github.com/Vita3K/Vita3K) - Emulator used to test Vita port +* [pspsdk](https://github.com/pspdev/pspsdk) - Backend for PSP +* [PPSSPP](https://github.com/hrydgard/ppsspp) - Emulator used to test PSP port +* [PSL1GHT](https://github.com/ps3dev/PSL1GHT) - Backend for PS3 +* [RPCS3](https://github.com/RPCS3/rpcs3) - Emulator used to test PS3 port +* [ps2sdk](https://github.com/ps2dev/ps2sdk) - Backend for PS2 +* [PCSX2](https://github.com/PCSX2/pcsx2) - Emulator used to test PS2 port +* [PSn00bSDK](https://github.com/Lameguy64/PSn00bSDK/) - Backend for PS1 +* [duckstation](https://github.com/stenzek/duckstation) - Emulator used to test PS1 port +* [libxenon](https://github.com/Free60Project/libxenon) - Backend for Xbox 360 +* [nxdk](https://github.com/XboxDev/nxdk) - Backend for Xbox +* [xemu](https://github.com/xemu-project/xemu) - Emulator used to test Xbox port +* [cxbx-reloaded](https://github.com/Cxbx-Reloaded/Cxbx-Reloaded) - Emulator used to test Xbox port +* [KallistiOS](https://github.com/KallistiOS/KallistiOS) - Backend for Dreamcast +* [GLdc](https://github.com/Kazade/GLdc) - Basis of rendering backend for Dreamcast +* [flycast](https://github.com/flyinghead/flycast) - Emulator used to test Dreamcast port +* [libyaul](https://github.com/yaul-org/libyaul) - Backend for Saturn +* [mednafen](https://mednafen.github.io/) - Emulator used to test Saturn port + +
+ +## Sound Credits +ClassiCube uses sounds from [Freesound.org](https://freesound.org)
+Full credits are listed in [doc/sound-credits.md](doc/sound-credits.md) -- cgit 1.4.1-2-gfad0