Compare commits

..

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

808 changed files with 23807 additions and 146225 deletions

View File

@ -1,30 +0,0 @@
name: Notify failure
description: Sends a notification that compiling a build has failed
inputs:
BOT_USERNAME:
description: 'Username to use for the discord bot message'
default: 'CC BuildBot'
required: false
type: string
BOT_AVATAR:
description: 'URL to use for the avatar of the discord bot message'
default: 'https://static.classicube.net/img/cc-cube-small.png'
required: false
type: string
NOTIFY_MESSAGE:
description: 'Notification message to send'
required: true
type: string
WEBHOOK_URL:
description: 'Discord webhook URL'
required: true
type: string
runs:
using: "composite"
steps:
- name: Notify failure
shell: sh
if: ${{ inputs.WEBHOOK_URL != '' }}
run: |
curl ${{ inputs.WEBHOOK_URL }} -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "{\"username\": \"${{ inputs.BOT_USERNAME }}\", \"avatar_url\": \"${{ inputs.BOT_AVATAR }}\", \"content\": \"${{ inputs.NOTIFY_MESSAGE }}\" }"

View File

@ -1,19 +0,0 @@
name: Notify success
description: Sends a notification that a workflow has finished
inputs:
DESTINATION_URL:
description: 'Webhook notification URL'
type: string
WORKFLOW_NAME:
description: 'Workflow name'
required: true
type: string
runs:
using: "composite"
steps:
- name: Notify failure
if: ${{ inputs.DESTINATION_URL != '' }}
shell: sh
run: |
curl ${{ inputs.DESTINATION_URL }}/${{ inputs.WORKFLOW_NAME }}/${{ github.sha }}

View File

@ -1,20 +0,0 @@
name: Upload binary
description: Uploads a compiled binary
inputs:
SOURCE_FILE:
description: 'Path to file to upload'
required: true
type: string
DEST_NAME:
description: 'Name to use for the uploaded artifact'
required: true
type: string
runs:
using: "composite"
steps:
- uses: actions/upload-artifact@v4
with:
name: ${{ inputs.DEST_NAME }}
path: ${{ inputs.SOURCE_FILE }}
if-no-files-found: error

137
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,137 @@
name: Build
on: [push, pull_request]
jobs:
build_on_ubuntu:
name: Build ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit) on Ubuntu
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
config:
- { plat: "Linux", bits: 64 }
- { plat: "Linux", bits: 32 }
- { plat: "Windows", bits: 64 }
- { plat: "Windows", bits: 32 }
steps:
- uses: actions/checkout@v2
- name: Install Shared Dependencies
run: |
sudo apt-get -y update &&
sudo apt-get -y install build-essential
# Install platform specific dependencies
- name: Install Dependencies for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Linux' && matrix.config.bits == 64
run: |
sudo apt-get -y install libx11-dev libxi-dev libgl1-mesa-dev
- name: Install Dependencies for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Linux' && matrix.config.bits == 32
run: |
sudo dpkg --add-architecture i386 \
&& sudo apt-get -y update \
&& sudo apt-get -y install gcc-multilib libx11-dev:i386 libxi-dev:i386 libgl1-mesa-dev:i386
- name: Install Dependencies for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Windows' && matrix.config.bits == 64
run: |
sudo apt-get -y install gcc-mingw-w64-x86-64
- name: Install Dependencies for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Windows' && matrix.config.bits == 32
run: |
sudo apt-get -y install gcc-mingw-w64-i686
# Build
- name: Build for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Linux' && matrix.config.bits == 64
run: |
cd src
make linux
- name: Build for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Linux' && matrix.config.bits == 32
run: |
cd src
# Note, this overwrites the previous flags
make linux CFLAGS="-m32" LDFLAGS="-m32"
- name: Build for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Windows' && matrix.config.bits == 64
run: |
cd src
make mingw CC="x86_64-w64-mingw32-gcc"
- name: Build for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Windows' && matrix.config.bits == 32
run: |
cd src
make mingw CC="i686-w64-mingw32-gcc"
build_on_windows:
name: Build ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit) on Windows
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
config:
- { plat: "Windows", bits: 64 }
- { plat: "Windows", bits: 32 }
steps:
- uses: actions/checkout@v2
- name: Setup MSBuild
uses: microsoft/setup-msbuild@v1.1
# Build
- name: Build for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Windows' && matrix.config.bits == 64
run: |
msbuild src\ClassiCube.vcxproj `
-property:Configuration=Debug -property:Platform=x64 `
-property:WindowsTargetPlatformVersion=10 -property:PlatformToolset=v142
- name: Build for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Windows' && matrix.config.bits == 32
run: |
msbuild src\ClassiCube.vcxproj `
-property:Configuration=Debug -property:Platform=Win32 `
-property:WindowsTargetPlatformVersion=10 -property:PlatformToolset=v142
build_on_mac:
name: Build ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit) on Mac
runs-on: macOS-latest
strategy:
fail-fast: false
matrix:
config:
- { plat: "Mac", bits: 64 }
# "ld: warning: ignoring file ..., missing required architecture i386 in file ..."
# "Undefined symbols for architecture i386"
# - { plat: "Mac", bits: 32 }
steps:
- uses: actions/checkout@v2
# Build
- name: Build for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Mac' && matrix.config.bits == 64
run: |
cd src
# fix for "error: implicit declaration of function 'CGDisplayBitsPerPixel'"
sed -i '' 's|#include <Cocoa/Cocoa.h>|&\'$'\nextern size_t CGDisplayBitsPerPixel(CGDirectDisplayID display);|' interop_cocoa.m
make mac_x64
- name: Build for ${{ matrix.config.plat }} (${{ matrix.config.bits }} bit)
if: matrix.config.plat == 'Mac' && matrix.config.bits == 32
run: |
cd src
make mac_x32

View File

@ -1,58 +0,0 @@
name: Build latest (3DS)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-3ds
cancel-in-progress: true
jobs:
build-3DS:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: devkitpro/devkitarm:latest
steps:
- uses: actions/checkout@v4
- name: Compile 3DS build
id: compile
run: |
make 3ds
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-3ds.cia'
DEST_NAME: 'ClassiCube-3ds.cia'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-3ds.3dsx'
DEST_NAME: 'ClassiCube-3ds.3dsx'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-3ds.elf'
DEST_NAME: 'ClassiCube-3ds.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: '3ds'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 3DS build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,122 +0,0 @@
name: Build latest (Android2)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-android
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/saschpe/android-ndk:34-jdk17.0.8_7-ndk25.2.9519653-cmake3.22.1
steps:
- uses: actions/checkout@v4
- name: Retrieve dependencies
shell: bash
run: |
mkdir build-tools
wget https://github.com/ClassiCube/rpi-compiling-stuff/raw/main/build-tools.zip
unzip build-tools.zip -d build-tools
chmod +x build-tools/aapt
chmod +x build-tools/dx
chmod +x build-tools/zipalign
- name: Compile android builds
shell: bash
id: compile
env:
COMMON_FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -Werror"
DROID_FLAGS: "-fPIC -shared -fvisibility=hidden -rdynamic -funwind-tables"
LIBS: "-lGLESv2 -lEGL -lm -llog"
SRCS: "src/*.c src/android/*.c third_party/bearssl/*.c"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"${GITHUB_SHA::9}\"
DROID_FLAGS="-fPIC -shared -s -O1 -fvisibility=hidden -rdynamic -funwind-tables"
ROOT_DIR=$PWD
NDK_ROOT="/opt/android-sdk-linux/ndk/25.2.9519653/toolchains/llvm/prebuilt/linux-x86_64/bin"
TOOLS_ROOT=$ROOT_DIR/build-tools
SDK_ROOT="/opt/android-sdk-linux/platforms/android-34"
$NDK_ROOT/armv7a-linux-androideabi19-clang ${{ env.SRCS }} $COMMON_FLAGS $DROID_FLAGS -march=armv5 -rtlib=libgcc -L $ROOT_DIR/build-tools/runtime ${{ env.LIBS }} $LATEST_FLAG -o cc-droid-arm_16
$NDK_ROOT/armv7a-linux-androideabi19-clang ${{ env.SRCS }} $COMMON_FLAGS $DROID_FLAGS -mfpu=vfp3-d16 ${{ env.LIBS }} $LATEST_FLAG -o cc-droid-arm_32
$NDK_ROOT/aarch64-linux-android21-clang ${{ env.SRCS }} $COMMON_FLAGS $DROID_FLAGS ${{ env.LIBS }} $LATEST_FLAG -o cc-droid-arm_64
$NDK_ROOT/i686-linux-android21-clang ${{ env.SRCS }} $COMMON_FLAGS $DROID_FLAGS ${{ env.LIBS }} $LATEST_FLAG -o cc-droid-x86_32
$NDK_ROOT/x86_64-linux-android21-clang ${{ env.SRCS }} $COMMON_FLAGS $DROID_FLAGS ${{ env.LIBS }} $LATEST_FLAG -o cc-droid-x86_64
cd $ROOT_DIR/android/app/src/main
# copy required native libraries
mkdir lib lib/armeabi lib/armeabi-v7a lib/arm64-v8a lib/x86 lib/x86_64
cp $ROOT_DIR/cc-droid-arm_16 lib/armeabi/libclassicube.so
cp $ROOT_DIR/cc-droid-arm_32 lib/armeabi-v7a/libclassicube.so
cp $ROOT_DIR/cc-droid-arm_64 lib/arm64-v8a/libclassicube.so
cp $ROOT_DIR/cc-droid-x86_32 lib/x86/libclassicube.so
cp $ROOT_DIR/cc-droid-x86_64 lib/x86_64/libclassicube.so
# The following commands are for manually building an .apk, see
# https://spin.atomicobject.com/2011/08/22/building-android-application-bundles-apks-by-hand/
# https://github.com/cnlohr/rawdrawandroid/blob/master/Makefile
# https://stackoverflow.com/questions/41132753/how-can-i-build-an-android-apk-without-gradle-on-the-command-line
# https://github.com/skanti/Android-Manual-Build-Command-Line/blob/master/hello-jni/Makefile
# https://github.com/skanti/Android-Manual-Build-Command-Line/blob/master/hello-jni/CMakeLists.txt
# compile java files into multiple .class files
cd $ROOT_DIR/android/app/src/main/java/com/classicube
javac *.java -d $ROOT_DIR/android/app/src/main/obj -classpath $SDK_ROOT/android.jar --release 8
cd $ROOT_DIR/android/app/src/main
# get debug signing key
echo -n "${{ secrets.ANDROID_SIGNING_KEY_BASE64 }}" | base64 --decode > debug.keystore
# compile the multiple .class files into one .dex file
$TOOLS_ROOT/dx --dex --output=classes.dex ./obj
# create initial .apk with packaged version of resources
$TOOLS_ROOT/aapt package -f -M AndroidManifest.xml -S res -F cc-unsigned.apk -I $SDK_ROOT/android.jar
# and add all the required files
$TOOLS_ROOT/aapt add -f cc-unsigned.apk classes.dex lib/armeabi/libclassicube.so lib/armeabi-v7a/libclassicube.so lib/arm64-v8a/libclassicube.so lib/x86/libclassicube.so lib/x86_64/libclassicube.so
# sign the apk with debug key (https://stackoverflow.com/questions/16711233/)
# Note per https://developer.android.com/tools/zipalign
# - if using apksigner, zipalign must be called before apksigner
# - if using jarsigner, zipalign must be called after jarsigner
$TOOLS_ROOT/zipalign -f 4 cc-unsigned.apk cc-signed.apk
$TOOLS_ROOT/apksigner sign --ks debug.keystore --ks-pass pass:android cc-signed.apk
cp cc-signed.apk $ROOT_DIR/src/cc.apk
# old v1 only version (doesn't work properly now)
#cp cc-unsigned.apk cc-signed.apk
#jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore debug.keystore -storepass android -keypass android cc-signed.apk androiddebugkey
# jarsigner -verbose
# create aligned .apk file
#$TOOLS_ROOT/zipalign -f 4 cc-signed.apk $ROOT_DIR/src/cc.apk
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'src/cc.apk'
DEST_NAME: 'cc.apk'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'android'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce android build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,68 +0,0 @@
name: Build latest (Dreamcast)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-dreamcast
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/kos-builds/kos-dc:sha-20149ee-14.2.0
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
shell: bash
run: |
apt-get update
apt-get -y install genisoimage
wget https://github.com/ClassiCube/rpi-compiling-stuff/raw/main/cdi4dc -O /opt/toolchains/dc/kos/utils/cdi4dc
chmod +x /opt/toolchains/dc/kos/utils/cdi4dc
- name: Compile Dreamcast build
id: compile
shell: bash
run: |
export PATH=/opt/toolchains/dc/kos/utils/:$PATH
make dreamcast
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-dc.cdi'
DEST_NAME: 'ClassiCube-dc.cdi'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-dc.iso'
DEST_NAME: 'ClassiCube-dc.iso'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-dc.elf'
DEST_NAME: 'ClassiCube-dc.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'dreamcast'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Dreamcast build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,81 +0,0 @@
name: Build latest (FreeBSD)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-freebsd
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: empterdose/freebsd-cross-build:11.4
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: apk add bash wget curl
- name: Retrieve OpenGL and X11 dev files (64 bit)
run: |
mkdir freebsd64
cd freebsd64
wget https://github.com/ClassiCube/rpi-compiling-stuff/raw/main/freebsd64.zip
unzip freebsd64.zip
- name: Retrieve OpenGL and X11 dev files (32 bit)
run: |
mkdir freebsd32
cd freebsd32
wget https://github.com/ClassiCube/rpi-compiling-stuff/raw/main/freebsd32.zip
unzip freebsd32.zip
- name: Compile FreeBSD builds
id: compile
shell: bash
env:
LIBS: "-lm -lpthread -lX11 -lXi -lGL -lexecinfo"
SRCS: "src/*.c third_party/bearssl/*.c"
FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -Werror -fvisibility=hidden -rdynamic -Werror"
PLAT32_FLAGS: "-fno-pie -fcf-protection=none -I freebsd32/include -L freebsd32/lib"
PLAT64_FLAGS: "-fno-pie -fcf-protection=none -I freebsd64/include -L freebsd64/lib"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"${GITHUB_SHA::9}\"
i386-freebsd11-clang ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.PLAT32_FLAGS }} $LATEST_FLAG -o cc-fbsd32-gl1 ${{ env.LIBS }}
x86_64-freebsd11-clang ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.PLAT64_FLAGS }} $LATEST_FLAG -o cc-fbsd64-gl1 ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-fbsd32-gl1'
DEST_NAME: 'ClassiCube-FreeBSD-32'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-fbsd64-gl1'
DEST_NAME: 'ClassiCube-FreeBSD-64'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'freebsd'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce FreeBSD build(s)'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,48 +0,0 @@
name: Build latest (GBA)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-gba
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: devkitpro/devkitarm:latest
steps:
- uses: actions/checkout@v4
- name: Compile GBA build
id: compile
run: |
make gba
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-gba.gba'
DEST_NAME: 'ClassiCube-gba.gba'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-gba.elf'
DEST_NAME: 'ClassiCube-gba.elf'
# NOTE: Not uploaded to website downloads at present
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce GBA build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,52 +0,0 @@
name: Build latest (GameCube)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-gc
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/extremscorner/libogc2:latest
steps:
- uses: actions/checkout@v4
- name: Compile GameCube build
id: compile
run: |
make gamecube
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-gc.dol'
DEST_NAME: 'ClassiCube-gc.dol'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-gc.elf'
DEST_NAME: 'ClassiCube-gc.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'gc'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce GameCube build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,51 +0,0 @@
name: Build latest (Haiku)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-haiku
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: haiku/cross-compiler:x86_64-r1beta4
steps:
- uses: actions/checkout@v4
- name: Compile haiku build
id: compile
env:
LIBS: "-lm -lGL -lnetwork -lstdc++ -lbe -lgame -ltracker"
SRCS: "src/*.c src/Platform_BeOS.cpp src/Window_BeOS.cpp third_party/bearssl/*.c"
COMMON_FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -Werror"
run: |
x86_64-unknown-haiku-gcc ${{ env.SRCS }} -o ClassiCube-haiku ${{ env.COMMON_FLAGS }} ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-haiku'
DEST_NAME: 'ClassiCube-haiku'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'haiku'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Haiku build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,49 +0,0 @@
name: Build latest (iOS)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-ios
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: macOS-14
steps:
- uses: actions/checkout@v4
- name: Compile iOS build
id: compile
run: |
cd misc/ios
sudo xcode-select -s /Applications/Xcode_15.0.1.app/Contents/Developer
xcodebuild -sdk iphoneos -configuration Release CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
cd build/Release-iphoneos
mkdir Payload
mv ClassiCube.app Payload/ClassiCube.app
zip -r cc.ipa Payload
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'misc/ios/build/Release-iphoneos/cc.ipa'
DEST_NAME: 'cc.ipa'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'ios'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce iOS build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,150 +0,0 @@
name: Build latest (Linux)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
- ModernLighting
- AngledLighting
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-linux
cancel-in-progress: true
jobs:
#============================================
# =============== 32 BIT LINUX ==============
# ===========================================
build-32:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ubuntu:20.04
steps:
- uses: actions/checkout@v4
- name: Install packages
shell: bash
run: |
apt-get -y update
apt-get -y install gcc-multilib wget curl unzip
- name: Retrieve dependencies
shell: bash
run: |
wget https://github.com/ClassiCube/rpi-compiling-stuff/raw/main/linux32.zip
unzip linux32.zip
- name: Compile 32 bit Linux builds
shell: bash
id: compile
env:
LIBS: "-lX11 -lXi -lpthread -lGL -lm -ldl"
SRCS: "src/*.c third_party/bearssl/*.c"
FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -Werror -fvisibility=hidden -rdynamic -Werror"
NIX32_FLAGS: "-no-pie -fno-pie -m32 -fcf-protection=none -L ./lib -Wl,--unresolved-symbols=ignore-in-shared-libs"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"${GITHUB_SHA::9}\"
gcc ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.NIX32_FLAGS }} $LATEST_FLAG -o cc-nix32-gl1 ${{ env.LIBS }}
gcc ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.NIX32_FLAGS }} $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL2 -o cc-nix32-gl2 ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-nix32-gl1'
DEST_NAME: 'ClassiCube-Linux32-OpenGL'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-nix32-gl2'
DEST_NAME: 'ClassiCube-Linux32-ModernGL'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'linux32'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 32 bit Linux build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'
#============================================
# =============== 64 BIT LINUX ==============
# ===========================================
build-64:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ubuntu:20.04
steps:
- uses: actions/checkout@v4
- name: Install packages
shell: bash
run: |
apt-get -y update
apt-get -y install gcc wget curl unzip
- name: Retrieve dependencies
shell: bash
run: |
wget https://github.com/ClassiCube/rpi-compiling-stuff/raw/main/linux64.zip
unzip linux64.zip
- name: Compile 64 bit Linux builds
shell: bash
id: compile
env:
LIBS: "-lX11 -lXi -lpthread -lGL -lm -ldl"
SRCS: "src/*.c third_party/bearssl/*.c"
FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -Werror -fvisibility=hidden -rdynamic -Werror"
NIX64_FLAGS: "-no-pie -fno-pie -m64 -fcf-protection=none -rdynamic -L ./lib -Wl,--unresolved-symbols=ignore-in-shared-libs"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"${GITHUB_SHA::9}\"
gcc ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.NIX64_FLAGS }} $LATEST_FLAG -o cc-nix64-gl1 ${{ env.LIBS }}
gcc ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.NIX64_FLAGS }} $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL2 -o cc-nix64-gl2 ${{ env.LIBS }}
#gcc ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.NIX64_FLAGS }} $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL2 -DCC_WIN_BACKEND=CC_WIN_BACKEND_SDL2 -o cc-sdl64-gl2 -lSDL2 ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-nix64-gl1'
DEST_NAME: 'ClassiCube-Linux64-OpenGL'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-nix64-gl2'
DEST_NAME: 'ClassiCube-Linux64-ModernGL'
# - uses: ./.github/actions/upload_build
# if: ${{ always() && steps.compile.outcome == 'success' }}
# with:
# SOURCE_FILE: 'cc-sdl64-gl2'
# DEST_NAME: 'ClassiCube-Linux64-SDL2'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'linux64'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 64 bit Linux build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,99 +0,0 @@
name: Build latest (macOS 32 bit)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-mac32
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/classicube/minimal-osxcross:latest
credentials:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
- name: Compile 32 bit macOS builds
shell: bash
id: compile
env:
LIBS: "-framework Security -framework Cocoa -framework OpenGL -framework IOKit -lobjc -lgcc_s.1"
SRCS: "src/*.c src/Window_cocoa.m third_party/bearssl/*.c"
FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -fvisibility=hidden -rdynamic"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"${GITHUB_SHA::9}\"
PATH=$PATH:/usr/local/compiler/target/bin
i386-apple-darwin8-clang ${{ env.SRCS }} ${{ env.FLAGS }} $LATEST_FLAG -o cc-mac32-gl1 ${{ env.LIBS }}
i386-apple-darwin8-clang ${{ env.SRCS }} ${{ env.FLAGS }} $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL2 -o cc-mac32-gl2 ${{ env.LIBS }}
- name: Compile 32 bit macOS builds (PowerPC)
shell: bash
id: compile_ppc
env:
LIBS: "-framework Security -framework Cocoa -framework OpenGL -framework IOKit -lobjc"
SRCS: "src/*.c src/Window_cocoa.m third_party/bearssl/*.c"
FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -fvisibility=hidden -static-libgcc -Wl,-no_compact_unwind -isystem /usr/local/compiler/ppc/target/SDK/MacOSX10.5.sdk -Wl,-syslibroot /usr/local/compiler/ppc/target/SDK/MacOSX10.5.sdk"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"${GITHUB_SHA::9}\"
mkdir -p /home/minty/repos/osxcross-ppc-test/target/bin
ln -s /usr/local/compiler/ppc/target/bin/powerpc64-apple-darwin9-as /home/minty/repos/osxcross-ppc-test/target/bin/powerpc64-apple-darwin9-as
PATH=$PATH:/usr/local/compiler/ppc/target/bin
powerpc-apple-darwin9-base-gcc *${{ env.SRCS }} ${{ env.FLAGS }} $LATEST_FLAG -o cc-mac32-ppc -mmacosx-version-min=10.2.0 -m32 ${{ env.LIBS }}
- name: Generate combined Intel + PowerPC build
shell: bash
id: gen_universal
run: |
PATH=$PATH:/usr/local/compiler/target/bin
i386-apple-darwin8-lipo -create -output cc-mac32-universal cc-mac32-gl1 cc-mac32-ppc
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-mac32-gl1'
DEST_NAME: 'ClassiCube-mac32-OpenGL'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-mac32-gl2'
DEST_NAME: 'ClassiCube-mac32-ModernGL'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile_ppc.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-mac32-ppc'
DEST_NAME: 'ClassiCube-mac32-PPC'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.gen_universal.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-mac32-universal'
DEST_NAME: 'ClassiCube-mac32'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'mac32'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 32 bit macOS build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,71 +0,0 @@
name: Build latest (macOS 64 bit)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
- AngledLighting
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-mac64
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: macOS-latest
steps:
- uses: actions/checkout@v4
- name: Compile 64 bit macOS builds
shell: bash
id: compile
env:
LIBS: "-framework Security -framework Cocoa -framework OpenGL -framework IOKit -lobjc"
SRCS: "src/*.c src/Window_cocoa.m third_party/bearssl/*.c"
FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -fvisibility=hidden -rdynamic"
ARM64_FLAGS: "-DCC_GFX_BACKEND=CC_GFX_BACKEND_GL2 -arch arm64"
INTEL64_FLAGS: "-arch x86_64"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"$(git rev-parse --short "$GITHUB_SHA")\"
MACOSX_DEPLOYMENT_TARGET=10.5 clang ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.INTEL64_FLAGS }} $LATEST_FLAG -o cc-mac64-gl1 ${{ env.LIBS }}
MACOSX_DEPLOYMENT_TARGET=10.5 clang ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.INTEL64_FLAGS }} $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL2 -o cc-mac64-gl2 ${{ env.LIBS }}
clang ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.ARM64_FLAGS }} $LATEST_FLAG -o cc-mac-arm64 ${{ env.LIBS }}
# https://wiki.freepascal.org/Code_Signing_for_macOS#Ad_hoc_signing
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-mac64-gl1'
DEST_NAME: 'ClassiCube-mac64-OpenGL'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-mac64-gl2'
DEST_NAME: 'ClassiCube-mac64-ModernGL'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-mac-arm64'
DEST_NAME: 'ClassiCube-mac-ARM64'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'mac64'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 64 bit macOS builds'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,60 +0,0 @@
name: Build latest (Mac Classic)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-mac-classic
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/autc04/retro68
steps:
- uses: actions/checkout@v4
- name: Compile Mac classic build
id: compile
run: |
make macclassic_ppc RETRO68=/Retro68-build/toolchain
make macclassic_68k RETRO68=/Retro68-build/toolchain
make macclassic_68k RETRO68=/Retro68-build/toolchain ARCH_68040=1
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-ppc.dsk'
DEST_NAME: 'ClassiCube-ppc.dsk'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-68k.dsk'
DEST_NAME: 'ClassiCube-68k.dsk'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-68040.dsk'
DEST_NAME: 'ClassiCube-68040.dsk'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'macclassic'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Mac Classic build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,51 +0,0 @@
name: Build latest (MS DOS)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-msdos
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/volkertb/debian-djgpp
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
apt-get update
apt-get -y install curl
- name: Compile MS dos build
id: compile
run: |
make CC=gcc dos
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'CCDOS.EXE'
DEST_NAME: 'ClassiCube.exe'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'msdos'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce MS DOS build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,64 +0,0 @@
name: Build latest (N64)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-n64
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/dragonminded/libdragon:preview
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
apt-get update
apt-get -y install curl
- name: Compile N64 build
id: compile
run: |
REAL_DIR=`pwd`
cd /tmp
git clone -b opengl https://github.com/DragonMinded/libdragon.git --depth=1
cd libdragon
make install
make tools-install
cd $REAL_DIR
make n64
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'build-n64/ClassiCube-n64.elf'
DEST_NAME: 'ClassiCube-n64.elf'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-n64.z64'
DEST_NAME: 'ClassiCube-n64.z64'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'n64'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce N64 build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,71 +0,0 @@
name: Build latest (NDS)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-nds
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: skylyrac/blocksds:dev-latest
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
apt-get update
apt-get -y install curl
- name: Compile NDS build
id: compile
run: |
make ds
export BUILD_NONET=1
make ds
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube.nds'
DEST_NAME: 'ClassiCube.nds'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'build/nds/cc-arm9.elf'
DEST_NAME: 'ClassiCube.elf'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-nonet.nds'
DEST_NAME: 'ClassiCube-nonet.nds'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'build/nds_nonet/cc-arm9.elf'
DEST_NAME: 'ClassiCube-nonet.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'nds'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce NDS build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,66 +0,0 @@
name: Build latest (NetBSD)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-netbsd
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/cross-rs/x86_64-unknown-netbsd:edge
steps:
- uses: actions/checkout@v3
- name: Install prerequisites
run: |
apt-get update
apt-get -y install zip wget
- name: Retrieve OpenGL and X11 dev files (64 bit)
run: |
mkdir netbsd64
cd netbsd64
wget https://github.com/ClassiCube/rpi-compiling-stuff/raw/main/netbsd64.zip
unzip netbsd64.zip
- name: Compile NetBSD builds
id: compile
shell: bash
env:
LIBS: "-lm -lpthread -lX11 -lXi -lGL -lexecinfo"
SRCS: "src/*.c third_party/bearssl/*.c"
FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -Werror -Wl,-R/usr/X11R7/lib -fvisibility=hidden -rdynamic -Werror"
PLAT64_FLAGS: "-fno-pie -fcf-protection=none -I netbsd64/include -L netbsd64/lib -Wl,--unresolved-symbols=ignore-in-shared-libs"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"${GITHUB_SHA::9}\"
x86_64-unknown-netbsd-gcc ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.PLAT64_FLAGS }} $LATEST_FLAG -o cc-netbsd64-gl1 ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-netbsd64-gl1'
DEST_NAME: 'ClassiCube-NetBSD-64'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'netbsd'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce NetBSD build(s)'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,70 +0,0 @@
name: Build latest (PS1)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-ps1
cancel-in-progress: true
jobs:
build-PS1:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/classicube/minimal-psn00b:latest
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
apt-get update
apt-get install -y curl
- name: Compile PS1 build
id: compile
run: |
export PSN00BSDK_ROOT=/usr/local/psnoob
make ps1
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'build/ps1/ClassiCube-ps1.elf'
DEST_NAME: 'ClassiCube-PS1.elf'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-ps1.exe'
DEST_NAME: 'ClassiCube-PS1.exe'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-ps1.bin'
DEST_NAME: 'ClassiCube-PS1.bin'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-ps1.cue'
DEST_NAME: 'ClassiCube-PS1.cue'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'ps1'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce PS1 build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,56 +0,0 @@
name: Build latest (PS2)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-ps2
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/ps2dev/ps2sdk:latest
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
apk add make mpc1 curl
- name: Compile PS2 build
id: compile
run: |
make ps2
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-ps2.elf'
DEST_NAME: 'ClassiCube-ps2.elf'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-ps2-min.elf'
DEST_NAME: 'ClassiCube-ps2-min.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'ps2'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce PS2 build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,67 +0,0 @@
name: Build latest (PS3)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-ps3
cancel-in-progress: true
jobs:
build-PS3:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/classicube/minimal-psl1ght:latest
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
apt-get update
apt-get install -y curl
- name: Compile PS3 build
id: compile
run: |
export PS3DEV=/usr/local/ps3dev
export PSL1GHT=/usr/local/ps3dev
export PATH=$PATH:$PS3DEV/bin
export PATH=$PATH:$PS3DEV/ppu/bin
make ps3
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-PS3.elf'
DEST_NAME: 'ClassiCube-PS3.elf'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-PS3.self'
DEST_NAME: 'ClassiCube-PS3.self'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-PS3.pkg'
DEST_NAME: 'ClassiCube-PS3.pkg'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'ps3'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce PS3 build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,56 +0,0 @@
name: Build latest (PSP)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-psp
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: pspdev/pspdev:latest
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
apk add curl curl-dev
- name: Compile PSP build
id: compile
run: |
make psp
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'EBOOT.PBP'
DEST_NAME: 'EBOOT.PBP'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-psp.elf'
DEST_NAME: 'ClassiCube-psp.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'psp'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce PSP build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,116 +0,0 @@
name: Build latest (RPI)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-rpi
cancel-in-progress: true
jobs:
#============================================
# ================ 32 BIT RPI ===============
# ===========================================
build-RPI32:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: dockcross/linux-armv6-lts
steps:
- uses: actions/checkout@v4
- name: Retrieve OpenGL and X11 dev files
run: |
mkdir rpi
cd rpi
wget https://github.com/ClassiCube/rpi-compiling-stuff/raw/main/rpi32.zip
unzip rpi32.zip
- name: Compile RPI 32 bit build
id: compile
env:
LIBS: "-lGLESv2 -lEGL -lX11 -lXi -lm -lpthread -ldl -lrt"
SRCS: "src/*.c third_party/bearssl/*.c"
FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -Werror -fvisibility=hidden -rdynamic"
RPI32_FLAGS: "-DCC_BUILD_RPI -I rpi/include -L rpi/lib -Wl,--unresolved-symbols=ignore-in-shared-libs"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"$GITHUB_SHA\"
$CC ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.RPI32_FLAGS }} $LATEST_FLAG -o cc-rpi32 ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-rpi32'
DEST_NAME: 'cc-rpi32'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'rpi32'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce RPI 32 bit build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'
#============================================
# ================ 64 BIT RPI ===============
# ===========================================
build-RPI64:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: dockcross/linux-arm64-lts
steps:
- uses: actions/checkout@v4
- name: Retrieve OpenGL and X11 dev files
run: |
mkdir rpi
cd rpi
wget https://github.com/ClassiCube/rpi-compiling-stuff/raw/main/rpi64.zip
unzip rpi64.zip
- name: Compile RPI 64 bit build
id: compile
env:
LIBS: "-lGLESv2 -lEGL -lX11 -lXi -lm -lpthread -ldl -lrt"
SRCS: "src/*.c third_party/bearssl/*.c"
FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn -Werror -fvisibility=hidden -rdynamic"
RPI64_FLAGS: "-DCC_BUILD_RPI -I rpi/include -L rpi/lib -Wl,--unresolved-symbols=ignore-in-shared-libs"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"$GITHUB_SHA\"
$CC ${{ env.SRCS }} ${{ env.FLAGS }} ${{ env.RPI64_FLAGS }} $LATEST_FLAG -o cc-rpi64 ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-rpi64'
DEST_NAME: 'cc-rpi64'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'rpi64'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce RPI 64 bit build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,63 +0,0 @@
name: Build latest (Saturn)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-saturn
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ijacquez/yaul:latest
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
apt-get --allow-releaseinfo-change update
apt-get install -y curl
- name: Compile Saturn build
id: compile
run: |
make saturn
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'build/saturn/ClassiCube-saturn.elf'
DEST_NAME: 'ClassiCube-saturn.elf'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-saturn.iso'
DEST_NAME: 'ClassiCube-saturn.iso'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-saturn.cue'
DEST_NAME: 'ClassiCube-saturn.cue'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'saturn'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Saturn build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,52 +0,0 @@
name: Build latest (Switch)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-switch
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: devkitpro/devkita64:latest
steps:
- uses: actions/checkout@v4
- name: Compile Switch build
id: compile
run: |
make switch
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-switch.nro'
DEST_NAME: 'ClassiCube-switch.nro'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-switch.elf'
DEST_NAME: 'ClassiCube-switch.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'switch'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Switch build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,82 +0,0 @@
name: Build latest (Symbian)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
- ModernLighting
- AngledLighting
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-symbian
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Download Symbian SDK
run: Invoke-WebRequest https://nnp.nnchan.ru/dl/symbiansr1_gcce_workflow.zip -OutFile symbiansdk.zip
- name: Extract Symbian SDK
run: Expand-Archive symbiansdk.zip -DestinationPath .
- name: Compile Symbian build
id: compile
run: |
$SDK = "$pwd/SDK/"
$Env:EPOCROOT = "$SDK".Substring(2)
$Env:SBS_GCCE441BIN = "$pwd/GCCE/bin"
cmd /c "$SDK/epoc32/tools/sbs\bin\sbs.bat -b misc/symbian/bld.inf -c armv5_urel_gcce -f - -m $SDK/epoc32/build/ClassiCube/makefile -j 4"
cd misc/symbian
(Get-Content ClassiCube.pkg).Replace('$(EPOCROOT)', "$SDK").Replace('$(PLATFORM)', 'armv5').Replace('$(TARGET)', 'urel') | Set-Content ClassiCube.pkg
cmd /c "$SDK/epoc32/tools/makesis.exe ClassiCube.pkg ClassiCube.sis"
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'misc/symbian/ClassiCube.sis'
DEST_NAME: 'ClassiCube-Symbian.sis'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'SDK/epoc32/release/armv5/urel/ClassiCube_s60v5.exe'
DEST_NAME: 'ClassiCube_s60v5.exe'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'SDK/epoc32/release/armv5/urel/ClassiCube_s60v3.exe'
DEST_NAME: 'ClassiCube_s60v3.exe'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'SDK/epoc32/release/armv5/urel/ClassiCube_s60v5.exe.sym'
DEST_NAME: 'ClassiCube_s60v5.elf'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'SDK/epoc32/release/armv5/urel/ClassiCube_s60v3.exe.sym'
DEST_NAME: 'ClassiCube_s60v3.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'symbian'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Symbian build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,52 +0,0 @@
name: Build latest (Vita)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-vita
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: vitasdk/vitasdk:latest
steps:
- uses: actions/checkout@v4
- name: Compile Vita build
id: compile
run: |
make vita
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-vita.vpk'
DEST_NAME: 'ClassiCube-vita.vpk'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-vita.elf'
DEST_NAME: 'ClassiCube-vita.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'vita'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Vita build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,48 +0,0 @@
name: Build latest (Webclient)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-webclient
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: trzeci/emscripten-fastcomp:1.39.0
steps:
- uses: actions/checkout@v4
- name: Compiles webclient
id: compile
env:
SRCS: "src/*.c src/webclient/*.c"
run: |
emcc ${{ env.SRCS }} -o ClassiCube.js -s WASM=0 -s NO_EXIT_RUNTIME=1 -s LEGACY_VM_SUPPORT=1 -s ALLOW_MEMORY_GROWTH=1 -s ABORTING_MALLOC=0 -s ENVIRONMENT=web -s TOTAL_STACK=256Kb --js-library src/webclient/interop_web.js -Os -g2 -s SINGLE_FILE
sed -i 's#eventHandler.useCapture);#{ useCapture: eventHandler.useCapture, passive: false });#g' ClassiCube.js
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube.js'
DEST_NAME: 'ClassiCube.js'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'webclient'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Webclient'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,65 +0,0 @@
name: Build latest (Wii)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-wii
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: devkitpro/devkitppc:latest
steps:
- uses: actions/checkout@v4
- name: Compile Wii build
id: compile
run: |
make wii
- name: Create Wii homebrew
run: |
mkdir -p wiitest/apps/ClassiCube
cp ClassiCube-wii.dol wiitest/apps/ClassiCube/boot.dol
cp misc/wii/icon.png wiitest/apps/ClassiCube/icon.png
cp misc/wii/meta.xml wiitest/apps/ClassiCube/meta.xml
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-wii.dol'
DEST_NAME: 'ClassiCube-wii.dol'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-wii.elf'
DEST_NAME: 'ClassiCube-wii.elf'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'wiitest'
DEST_NAME: 'ClassiCube-Wii-Homebrew'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'wii'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Wii build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,58 +0,0 @@
name: Build latest (WiiU)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-wiiu
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: devkitpro/devkitppc:latest
steps:
- uses: actions/checkout@v4
- name: Compile Wii U build
id: compile
run: |
make wiiu
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-wiiu.wuhb'
DEST_NAME: 'ClassiCube-wiiu.wuhb'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-wiiu.rpx'
DEST_NAME: 'ClassiCube-wiiu.rpx'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-wiiu.elf'
DEST_NAME: 'ClassiCube-wiiu.elf'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'wiiu'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce WiiU build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,92 +0,0 @@
name: Build latest (Windows ARM32/64)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-windows-arm
cancel-in-progress: true
jobs:
#============================================
# ============== ARM32 WINDOWS ==============
# ===========================================
build-32:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: dockcross/windows-armv7
steps:
- uses: actions/checkout@v4
- name: Compile ARM32 Windows builds
shell: bash
id: compile
env:
LIBS: "-lwinmm -limagehlp"
SRCS: "src/*.c third_party/bearssl/*.c"
COMMON_FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn"
WIN32_FLAGS: "-mwindows -nostartfiles -Wl,-emain_real -DCC_NOMAIN -DCC_GFX_BACKEND=CC_GFX_BACKEND_D3D11"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"${GITHUB_SHA::9}\"
armv7-w64-mingw32-gcc ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.WIN32_FLAGS }} -o cc-arm32-d3d11.exe $LATEST_FLAG ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-arm32-d3d11.exe'
DEST_NAME: 'ClassiCube-arm32-Direct3D11.exe'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 32 bit Windows-ARM build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'
#============================================
# ============== ARM64 WINDOWS ==============
# ===========================================
build-64:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: dockcross/windows-arm64
steps:
- uses: actions/checkout@v4
- name: Compile ARM64 Windows builds
shell: bash
id: compile
env:
LIBS: "-lwinmm -limagehlp"
SRCS: "src/*.c third_party/bearssl/*.c"
COMMON_FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn"
WIN64_FLAGS: "-mwindows -nostartfiles -Wl,-emain_real -DCC_NOMAIN -DCC_GFX_BACKEND=CC_GFX_BACKEND_D3D11"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"${GITHUB_SHA::9}\"
aarch64-w64-mingw32-gcc ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.WIN64_FLAGS }} -o cc-arm64-d3d11.exe $LATEST_FLAG ${{ env.LIBS }}
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 64 bit Windows build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-arm64-d3d11.exe'
DEST_NAME: 'ClassiCube-arm64-Direct3D11.exe'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 64 bit Windows-ARM build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,151 +0,0 @@
name: Build latest (Windows)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
- ModernLighting
- AngledLighting
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-windows
cancel-in-progress: true
jobs:
#============================================
# ============== 32 BIT WINDOWS =============
# ===========================================
build-32:
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install packages
shell: bash
run: |
sudo apt-get -y install gcc-mingw-w64-i686
- name: Compile 32 bit Windows builds
shell: bash
id: compile
env:
LIBS: "-lwinmm -limagehlp"
SRCS: "src/*.c third_party/bearssl/*.c"
COMMON_FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn"
WIN32_FLAGS: "-mwindows -nostartfiles -Wl,-e_main_real -DCC_NOMAIN src/CCicon_32.res"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"$(git rev-parse --short "$GITHUB_SHA")\"
cp misc/windows/CCicon_32.res src/CCicon_32.res
i686-w64-mingw32-gcc ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.WIN32_FLAGS }} -o cc-w32-d3d9.exe $LATEST_FLAG ${{ env.LIBS }}
i686-w64-mingw32-gcc ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.WIN32_FLAGS }} -o cc-w32-ogl.exe $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL1 ${{ env.LIBS }}
i686-w64-mingw32-gcc ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.WIN32_FLAGS }} -o cc-w32-d3d11.exe $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_D3D11 ${{ env.LIBS }}
# mingw defaults to i686, but some really old CPUs only support i586
i686-w64-mingw32-gcc ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.WIN32_FLAGS }} -march=i586 -o cc-w9x-ogl.exe $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL1 -DCC_BUILD_NOSTDLIB ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-w32-d3d9.exe'
DEST_NAME: 'ClassiCube-Win32-Direct3D9.exe'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-w32-ogl.exe'
DEST_NAME: 'ClassiCube-Win32-OpenGL.exe'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-w32-d3d11.exe'
DEST_NAME: 'ClassiCube-Win32-Direct3D11.exe'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-w9x-ogl.exe'
DEST_NAME: 'ClassiCube-Win9x.exe'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'win32'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 32 bit Windows build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'
#============================================
# ============== 64 BIT WINDOWS =============
# ===========================================
build-64:
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install packages
shell: bash
run: |
sudo apt-get -y install gcc-mingw-w64-x86-64
- name: Compile 64 bit Windows builds
shell: bash
id: compile
env:
LIBS: "-lwinmm -limagehlp"
SRCS: "src/*.c third_party/bearssl/*.c"
COMMON_FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn"
WIN64_FLAGS: "-mwindows -nostartfiles -Wl,-emain_real -DCC_NOMAIN src/CCicon_64.res"
run: |
LATEST_FLAG=-DCC_COMMIT_SHA=\"$(git rev-parse --short "$GITHUB_SHA")\"
cp misc/windows/CCicon_64.res src/CCicon_64.res
x86_64-w64-mingw32-gcc ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.WIN64_FLAGS }} -o cc-w64-d3d9.exe $LATEST_FLAG ${{ env.LIBS }}
x86_64-w64-mingw32-gcc ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.WIN64_FLAGS }} -o cc-w64-ogl.exe $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL1 ${{ env.LIBS }}
x86_64-w64-mingw32-gcc ${{ env.SRCS }} ${{ env.COMMON_FLAGS }} ${{ env.WIN64_FLAGS }} -o cc-w64-d3d11.exe $LATEST_FLAG -DCC_GFX_BACKEND=CC_GFX_BACKEND_D3D11 ${{ env.LIBS }}
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-w64-d3d9.exe'
DEST_NAME: 'ClassiCube-Win64-Direct3D9.exe'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-w64-ogl.exe'
DEST_NAME: 'ClassiCube-Win64-OpenGL.exe'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-w64-d3d11.exe'
DEST_NAME: 'ClassiCube-Win64-Direct3D11.exe'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'win64'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce 64 bit Windows build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,57 +0,0 @@
name: Build latest (Xbox)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-xbox
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: ghcr.io/xboxdev/nxdk:git-e955705a
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
apk add curl curl-dev
- name: Compile Xbox build
id: compile
run: |
eval $(/usr/src/nxdk/bin/activate -s)
make xbox
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-xbox.xbe'
DEST_NAME: 'ClassiCube-xbox.xbe'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-xbox.iso'
DEST_NAME: 'ClassiCube-xbox.iso'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'xbox'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Xbox build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,60 +0,0 @@
name: Build latest (Xbox 360)
# trigger via either push to selected branches or on manual run
on:
push:
branches:
- main
- master
workflow_dispatch:
concurrency:
group: ${{ github.ref }}-xbox360
cancel-in-progress: true
jobs:
build:
timeout-minutes: 10
runs-on: ubuntu-latest
container:
image: free60/libxenon
steps:
- uses: actions/checkout@v4
- name: Install prerequisites
run: |
sed -i -e 's/archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
apt-get update
apt-get install -y curl
- name: Compile 360 build
id: compile
run: |
export DEVKITXENON=/usr/local/xenon
export PATH=$PATH:$DEVKITXENON/bin:$DEVKITXENON/usr/bin
make xbox360
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-xbox360.elf'
DEST_NAME: 'ClassiCube-xbox360.elf'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'ClassiCube-xbox360.elf32'
DEST_NAME: 'ClassiCube-xbox360.elf32'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'xbox360'
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce Xbox 360 build'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

View File

@ -1,222 +0,0 @@
name: Produce release
on: [workflow_dispatch]
concurrency:
group: ${{ github.ref }}-release
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Download resources
- name: Retrieve classicube texture pack
run: |
wget https://www.classicube.net/static/default.zip
- name: Retrieve classicube audio pack
run: |
wget https://www.classicube.net/static/audio.zip
# Download windows artifacts
- name: Retrieve Windows binaries
run: |
wget https://cdn.classicube.net/client/latest/ClassiCube.64.exe -O cc-w64.exe
wget https://cdn.classicube.net/client/latest/ClassiCube.exe -O cc-w32.exe
wget https://cdn.classicube.net/client/latest/cc-w9x.exe -O cc-w9x.exe
# Download Linux artifacts
- name: Retrieve Linux binaries
run: |
wget https://cdn.classicube.net/client/latest/ClassiCube -O cc-linux-64
wget https://cdn.classicube.net/client/latest/ClassiCube.32 -O cc-linux-32
# Download macOS artifacts
- name: Retrieve macOS binaries
run: |
wget https://cdn.classicube.net/client/latest/ClassiCube.64.osx -O cc-mac-64
wget https://cdn.classicube.net/client/latest/ClassiCube.osx -O cc-mac-32
# Download RPI artifacts
- name: Retrieve RPI binaries
run: |
wget https://cdn.classicube.net/client/latest/cc-rpi64 -O cc-rpi-64
wget https://cdn.classicube.net/client/latest/ClassiCube.rpi -O cc-rpi-32
# Download FreeBSD artifacts
- name: Retrieve FreeBSD binaries
run: |
wget https://cdn.classicube.net/client/latest/cc-freebsd-64 -O cc-freebsd-64
wget https://cdn.classicube.net/client/latest/cc-freebsd-32 -O cc-freebsd-32
# Download NetBSD artifacts
- name: Retrieve NetBSD binaries
run: |
wget https://cdn.classicube.net/client/latest/cc-netbsd-64 -O cc-netbsd-64
# Download haiku artifacts
- name: Retrieve haiku binaries
run: |
wget https://cdn.classicube.net/client/latest/cc-haiku-64 -O cc-haiku-64
- name: Generate builds
id: compile
shell: bash
run: |
mkdir ClassiCube
mkdir ClassiCube/audio
mkdir ClassiCube/texpacks
cp audio.zip ClassiCube/audio/classicube.zip
cp default.zip ClassiCube/texpacks/classicube.zip
# ./ClassiCube
make_unix_tar() {
cp $2 ClassiCube/ClassiCube
chmod +x ClassiCube/ClassiCube
tar -zcvf $1 ClassiCube
rm ClassiCube/ClassiCube
}
# ./ClassiCube
make_windows_zip() {
cp $2 ClassiCube/ClassiCube.exe
zip -r $1 ClassiCube
rm ClassiCube/ClassiCube.exe
}
# Generate haiku builds
make_unix_tar cc-haiku64.tar.gz cc-haiku-64
# Generate NetBSD builds
make_unix_tar cc-netbsd64.tar.gz cc-netbsd-64
# Generate FreeBSD builds
make_unix_tar cc-freebsd32.tar.gz cc-freebsd-32
make_unix_tar cc-freebsd64.tar.gz cc-freebsd-64
# Generate RPI builds
make_unix_tar cc-rpi32.tar.gz cc-rpi-32
make_unix_tar cc-rpi64.tar.gz cc-rpi-64
# Generate macOS builds
make_unix_tar cc-mac32.tar.gz cc-mac-32
make_unix_tar cc-mac64.tar.gz cc-mac-64
# Generate Windows builds
make_windows_zip cc-win32.zip cc-w32.exe
make_windows_zip cc-win64.zip cc-w64.exe
# Generate Linux builds
# NOTE: Must be last since it adds linux specific file
cp misc/linux/install-desktop-entry.sh ClassiCube/install-desktop-entry.sh
chmod +x ClassiCube/install-desktop-entry.sh
make_unix_tar cc-linux32.tar.gz cc-linux-32
make_unix_tar cc-linux64.tar.gz cc-linux-64
# Generate Linux release files
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-linux32.tar.gz'
DEST_NAME: 'cc-linux32.tar.gz'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-linux64.tar.gz'
DEST_NAME: 'cc-linux64.tar.gz'
# Generate macOS release files
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-mac32.tar.gz'
DEST_NAME: 'cc-mac32.tar.gz'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-mac64.tar.gz'
DEST_NAME: 'cc-mac64.tar.gz'
# Generate Windows release files
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-win32.zip'
DEST_NAME: 'cc-win32.zip'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-win64.zip'
DEST_NAME: 'cc-win64.zip'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-w9x.exe'
DEST_NAME: 'cc-win9x.exe'
# Generate RPI release files
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-rpi32.tar.gz'
DEST_NAME: 'cc-rpi32.tar.gz'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-rpi64.tar.gz'
DEST_NAME: 'cc-rpi64.tar.gz'
# Generate FreeBSD release files
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-freebsd32.tar.gz'
DEST_NAME: 'cc-freebsd32.tar.gz'
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-freebsd64.tar.gz'
DEST_NAME: 'cc-freebsd64.tar.gz'
# Generate NetBSD release files
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-netbsd64.tar.gz'
DEST_NAME: 'cc-netbsd64.tar.gz'
# Generate haiku release files
- uses: ./.github/actions/upload_build
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
SOURCE_FILE: 'cc-haiku64.tar.gz'
DEST_NAME: 'cc-haiku64.tar.gz'
- uses: ./.github/actions/notify_success
if: ${{ always() && steps.compile.outcome == 'success' }}
with:
DESTINATION_URL: '${{ secrets.NOTIFY_URL }}'
WORKFLOW_NAME: 'release'
# Log any failure
- uses: ./.github/actions/notify_failure
if: failure()
with:
NOTIFY_MESSAGE: 'Failed to produce release'
WEBHOOK_URL: '${{ secrets.WEBHOOK_URL }}'

155
.gitignore vendored
View File

@ -1,7 +1,7 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# Visual studio User-specific files
# User-specific files
*.suo
*.user
*.sln.docstates
@ -11,8 +11,6 @@
*.VC.VC.opendb
# Android build results
android/app/.cxx/
android/.cxx/
android/.idea/
android/.gradle/
android/build/
@ -21,50 +19,19 @@ android/app/.externalNativeBuild/
android/local.properties
*.iml
#XCode stuff
project.xcworkspace/
xcuserdata/
# Nintendo Console build results
build-nds/
build-dsi/
build-n64/
classicube.nds
# SEGA console build results
IP.BIN
ISO_FILES/
cd/
# Microsoft console build results
build-360/
main.exe
main.lib
misc/xbox/ps_coloured.inl
misc/xbox/ps_textured.inl
misc/xbox/vs_coloured.inl
misc/xbox/vs_textured.inl
# Sony console build results
EBOOT.PBP
PARAM.SFO
param.sfo
eboot.bin
pkg.gp4
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
build/
bld/
[Bb]in/
[Oo]bj/
[Oo]utput/
[Pp]rofilingSessions/
src/.vs/
# ClassiCube game files
src/audio
src/texpacks
src/maps
@ -74,43 +41,9 @@ src/options.txt
src/ClassiCube*
src/screenshots
src/fontscache.txt
# ClassiCube game files
audio
texpacks
maps
texturecache
logs
options.txt
ClassiCube*
screenshots
fontscache.txt
# DOS files
CWSDPMI.EXE
CWSDPMI.SWP
OPTIONS.TXT
CCDOS.EXE
# Android source files need to be included
!android/app/src/main/java/com/classicube
# Flatpak wrapper needs to be included
!misc/flatpak/ClassiCubeLauncher
# UWP files needs to be included
!misc/UWP/ClassiCube-UWP.sln
!misc/UWP/ClassiCube-UWP.vcxproj
!misc/UWP/ClassiCube-UWP.vcxproj.filters
# CMake files
CMakeFiles/
CMakeCache.txt
src/.vs/
#GCC object files
*.o
# Build dependency files
*.d
# Roslyn cache directories
*.ide/
@ -128,12 +61,6 @@ TestResult.xml
[Rr]eleasePS/
dlldata.c
# Mac classic
retro68scripts/
# PS2
openvcl/
*_i.c
*_p.c
*_i.h
@ -158,11 +85,9 @@ openvcl/
*.pidb
*.svclog
*.scc
*.map
# Binary files
*.bin
*.elf
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
@ -177,14 +102,61 @@ ipch/
*.vsp
*.vspx
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding addin-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
@ -211,6 +183,11 @@ ClientBin/
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
@ -220,6 +197,14 @@ Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# Eclipse
.cproject
.project
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/

371
Makefile
View File

@ -1,371 +0,0 @@
SOURCE_DIR = src
BUILD_DIR = build
C_SOURCES = $(wildcard $(SOURCE_DIR)/*.c)
OBJECTS = $(patsubst %.c, $(BUILD_DIR)/%.o, $(C_SOURCES))
BUILD_DIRS = $(BUILD_DIR) $(BUILD_DIR)/src
##############################
# Configurable flags and names
##############################
# Flags passed to the C compiler
CFLAGS = -pipe -fno-math-errno -Werror -Wno-error=missing-braces -Wno-error=strict-aliasing
# Flags passed to the linker
LDFLAGS = -g -rdynamic
# Name of the main executable
ENAME = ClassiCube
# Name of the final target file
# (usually this is the executable, but e.g. is the app bundle on macOS)
TARGET := $(ENAME)
# Enables dependency tracking (https://make.mad-scientist.net/papers/advanced-auto-dependency-generation/)
# This ensures that changing a .h file automatically results in the .c files using it being auto recompiled when next running make
# On older systems the required GCC options may not be supported - in which case just change TRACK_DEPENDENCIES to 0
TRACK_DEPENDENCIES=1
# link using C Compiler by default
LINK = $(CC)
# Whether to add BearSSL source files to list of files to compile
BEARSSL=1
# Optimization level in release builds
OPT_LEVEL=1
#################################################################
# Determine shell command used to remove files (for "make clean")
#################################################################
ifndef RM
# No prefined RM variable, try to guess OS default
ifeq ($(OS),Windows_NT)
RM = del
else
RM = rm -f
endif
endif
###########################################################
# If target platform isn't specified, default to current OS
###########################################################
ifndef $(PLAT)
ifeq ($(OS),Windows_NT)
PLAT = mingw
else
PLAT = $(shell uname -s | tr '[:upper:]' '[:lower:]')
endif
endif
#########################################################
# Setup environment appropriate for the specific platform
#########################################################
ifeq ($(PLAT),web)
CC = emcc
OEXT = .html
CFLAGS = -g
LDFLAGS = -g -s WASM=1 -s NO_EXIT_RUNTIME=1 -s ABORTING_MALLOC=0 -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_STACK=256Kb --js-library $(SOURCE_DIR)/webclient/interop_web.js
BUILD_DIR = build/web
BEARSSL = 0
BUILD_DIRS += $(BUILD_DIR)/src/webclient
C_SOURCES += $(wildcard src/webclient/*.c)
endif
ifeq ($(PLAT),mingw)
CC = gcc
OEXT = .exe
CFLAGS += -DUNICODE
LDFLAGS = -g
LIBS = -mwindows -lwinmm
BUILD_DIR = build/win
endif
ifeq ($(PLAT),linux)
# -lm may be needed for __builtin_sqetf (in cases where it isn't replaced by a CPU instruction intrinsic)
LIBS = -lX11 -lXi -lpthread -lGL -ldl -lm
BUILD_DIR = build/linux
# Detect MCST LCC, where -O3 is about equivalent to -O1
ifeq ($(shell $(CC) -dM -E -xc - < /dev/null | grep -o __MCST__),__MCST__)
OPT_LEVEL=3
endif
endif
ifeq ($(PLAT),sunos)
LIBS = -lsocket -lX11 -lXi -lGL
BUILD_DIR = build/solaris
endif
ifeq ($(PLAT),hp-ux)
CC = gcc
CFLAGS += -std=c99 -D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=600 -D_DEFAULT_SOURCE -D_BSD_SOURCE
LDFLAGS =
LIBS = -lm -lX11 -lXi -lXext -L/opt/graphics/OpenGL/lib/hpux32 -lGL -lpthread
BUILD_DIR = build/hpux
endif
ifeq ($(PLAT),darwin)
OBJECTS += $(BUILD_DIR)/src/Window_cocoa.o
LIBS =
LDFLAGS = -rdynamic -framework Security -framework Cocoa -framework OpenGL -framework IOKit -lobjc
BUILD_DIR = build/macos
TARGET = $(ENAME).app
endif
ifeq ($(PLAT),freebsd)
CFLAGS += -I /usr/local/include
LDFLAGS = -L /usr/local/lib -rdynamic
LIBS = -lexecinfo -lGL -lX11 -lXi -lpthread
BUILD_DIR = build/freebsd
endif
ifeq ($(PLAT),openbsd)
CFLAGS += -I /usr/X11R6/include -I /usr/local/include
LDFLAGS = -L /usr/X11R6/lib -L /usr/local/lib -rdynamic
LIBS = -lexecinfo -lGL -lX11 -lXi -lpthread
BUILD_DIR = build/openbsd
endif
ifeq ($(PLAT),netbsd)
CFLAGS += -I /usr/X11R7/include -I /usr/pkg/include
LDFLAGS = -L /usr/X11R7/lib -L /usr/pkg/lib -rdynamic -Wl,-R/usr/X11R7/lib
LIBS = -lexecinfo -lGL -lX11 -lXi -lpthread
BUILD_DIR = build/netbsd
endif
ifeq ($(PLAT),dragonfly)
CFLAGS += -I /usr/local/include
LDFLAGS = -L /usr/local/lib -rdynamic
LIBS = -lexecinfo -lGL -lX11 -lXi -lpthread
BUILD_DIR = build/flybsd
endif
ifeq ($(PLAT),haiku)
OBJECTS += $(BUILD_DIR)/src/Platform_BeOS.o $(BUILD_DIR)/src/Window_BeOS.o
CFLAGS = -pipe -fno-math-errno
LDFLAGS = -g
LINK = $(CXX)
LIBS = -lGL -lnetwork -lbe -lgame -ltracker
BUILD_DIR = build/haiku
endif
ifeq ($(PLAT),beos)
OBJECTS += $(BUILD_DIR)/src/Platform_BeOS.o $(BUILD_DIR)/src/Window_BeOS.o
CFLAGS = -pipe
LDFLAGS = -g
LINK = $(CXX)
LIBS = -lGL -lnetwork -lbe -lgame -ltracker
BUILD_DIR = build/beos
TRACK_DEPENDENCIES = 0
BEARSSL = 0
endif
ifeq ($(PLAT),serenityos)
LIBS = -lgl -lSDL2
BUILD_DIR = build/serenity
endif
ifeq ($(PLAT),irix)
CC = gcc
LIBS = -lGL -lX11 -lXi -lpthread -ldl
BUILD_DIR = build/irix
endif
ifeq ($(PLAT),rpi)
CFLAGS += -DCC_BUILD_RPI
LIBS = -lpthread -lX11 -lXi -lEGL -lGLESv2 -ldl
BUILD_DIR = build/rpi
endif
ifeq ($(PLAT),riscos)
LIBS =
LDFLAGS = -g
BUILD_DIR = build/riscos
endif
ifeq ($(PLAT),wince)
CC = arm-mingw32ce-gcc
OEXT = .exe
CFLAGS += -march=armv5te -DUNICODE -D_WIN32_WCE -std=gnu99
LDFLAGS = -g
LIBS = -lcoredll -lws2
BUILD_DIR = build/wince
endif
ifdef BUILD_SDL2
CFLAGS += -DCC_WIN_BACKEND=CC_WIN_BACKEND_SDL2
LIBS += -lSDL2
endif
ifdef BUILD_SDL3
CFLAGS += -DCC_WIN_BACKEND=CC_WIN_BACKEND_SDL3
LIBS += -lSDL3
endif
ifdef BUILD_TERMINAL
CFLAGS += -DCC_WIN_BACKEND=CC_WIN_BACKEND_TERMINAL -DCC_GFX_BACKEND=CC_GFX_BACKEND_SOFTGPU
LIBS := $(subst mwindows,mconsole,$(LIBS))
endif
ifeq ($(BEARSSL),1)
BUILD_DIRS += $(BUILD_DIR)/third_party/bearssl
C_SOURCES += $(wildcard third_party/bearssl/*.c)
endif
ifdef RELEASE
CFLAGS += -O$(OPT_LEVEL)
else
CFLAGS += -g
endif
default: $(PLAT)
# Build for the specified platform
web:
$(MAKE) $(TARGET) PLAT=web
linux:
$(MAKE) $(TARGET) PLAT=linux
mingw:
$(MAKE) $(TARGET) PLAT=mingw
sunos:
$(MAKE) $(TARGET) PLAT=sunos
hp-ux:
$(MAKE) $(TARGET) PLAT=hp-ux
darwin:
$(MAKE) $(TARGET) PLAT=darwin
freebsd:
$(MAKE) $(TARGET) PLAT=freebsd
openbsd:
$(MAKE) $(TARGET) PLAT=openbsd
netbsd:
$(MAKE) $(TARGET) PLAT=netbsd
dragonfly:
$(MAKE) $(TARGET) PLAT=dragonfly
haiku:
$(MAKE) $(TARGET) PLAT=haiku
beos:
$(MAKE) $(TARGET) PLAT=beos
serenityos:
$(MAKE) $(TARGET) PLAT=serenityos
irix:
$(MAKE) $(TARGET) PLAT=irix
riscos:
$(MAKE) $(TARGET) PLAT=riscos
wince:
$(MAKE) $(TARGET) PLAT=wince
# Default overrides
sdl2:
$(MAKE) $(TARGET) BUILD_SDL2=1
sdl3:
$(MAKE) $(TARGET) BUILD_SDL3=1
terminal:
$(MAKE) $(TARGET) BUILD_TERMINAL=1
release:
$(MAKE) $(TARGET) RELEASE=1
# Some builds require more complex handling, so are moved to
# separate makefiles to avoid having one giant messy makefile
32x:
$(MAKE) -f misc/32x/Makefile
saturn:
$(MAKE) -f misc/saturn/Makefile
dreamcast:
$(MAKE) -f misc/dreamcast/Makefile
psp:
$(MAKE) -f misc/psp/Makefile
vita:
$(MAKE) -f misc/vita/Makefile
ps1:
$(MAKE) -f misc/ps1/Makefile
ps2:
$(MAKE) -f misc/ps2/Makefile
ps3:
$(MAKE) -f misc/ps3/Makefile
ps4:
$(MAKE) -f misc/ps4/Makefile
xbox:
$(MAKE) -f misc/xbox/Makefile
xbox360:
$(MAKE) -f misc/xbox360/Makefile
n64:
$(MAKE) -f misc/n64/Makefile
gba:
$(MAKE) -f misc/gba/Makefile
ds:
$(MAKE) -f misc/nds/Makefile
3ds:
$(MAKE) -f misc/3ds/Makefile
gamecube:
$(MAKE) -f misc/gc/Makefile
wii:
$(MAKE) -f misc/wii/Makefile
wiiu:
$(MAKE) -f misc/wiiu/Makefile
switch:
$(MAKE) -f misc/switch/Makefile
os/2:
$(MAKE) -f misc/os2/Makefile
dos:
$(MAKE) -f misc/msdos/Makefile
macclassic_68k:
$(MAKE) -f misc/macclassic/Makefile_68k
macclassic_ppc:
$(MAKE) -f misc/macclassic/Makefile_ppc
amiga_gcc:
$(MAKE) -f misc/amiga/Makefile_68k
amiga:
$(MAKE) -f misc/amiga/Makefile
atari_st:
$(MAKE) -f misc/atari_st/Makefile
# Cleans up all build .o files
clean:
$(RM) $(OBJECTS)
#################################################
# Source files and executable compilation section
#################################################
# Auto creates directories for build files (.o and .d files)
$(BUILD_DIRS):
mkdir -p $@
# Main executable (typically just 'ClassiCube' or 'ClassiCube.exe')
$(ENAME): $(BUILD_DIRS) $(OBJECTS)
$(LINK) $(LDFLAGS) -o $@$(OEXT) $(OBJECTS) $(EXTRA_LIBS) $(LIBS)
@echo "----------------------------------------------------"
@echo "Successfully compiled executable file: $(ENAME)"
@echo "----------------------------------------------------"
# macOS app bundle
$(ENAME).app : $(ENAME)
mkdir -p $(TARGET)/Contents/MacOS
mkdir -p $(TARGET)/Contents/Resources
cp $(ENAME) $(TARGET)/Contents/MacOS/$(ENAME)
cp misc/macOS/Info.plist $(TARGET)/Contents/Info.plist
cp misc/macOS/appicon.icns $(TARGET)/Contents/Resources/appicon.icns
# === Compiling with dependency tracking ===
# NOTE: Tracking dependencies might not work on older systems - disable this if so
ifeq ($(TRACK_DEPENDENCIES), 1)
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(patsubst %.o, %.d, $(OBJECTS))
$(DEPFILES):
$(BUILD_DIR)/%.o : %.c $(BUILD_DIR)/%.d
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o : %.cpp $(BUILD_DIR)/%.d
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o : %.m $(BUILD_DIR)/%.d
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(DEPFLAGS) -c $< -o $@
include $(wildcard $(DEPFILES))
# === Compiling WITHOUT dependency tracking ===
else
$(BUILD_DIR)/%.o : %.c
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o : %.cpp
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
endif
# EXTRA_CFLAGS and EXTRA_LIBS are not defined in the makefile intentionally -
# define them on the command line as a simple way of adding CFLAGS/LIBS

View File

@ -22,6 +22,7 @@ set(${CMAKE_C_FLAGS}, "${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -Wall -Werror")
add_library(classicube SHARED
../../src/Program.c
../../src/IsometricDrawer.c
../../src/Builder.c
../../src/ExtMath.c
@ -30,6 +31,7 @@ add_library(classicube SHARED
../../src/Camera.c
../../src/Game.c
../../src/GameVersion.c
../../src/Window_Android.c
../../src/_ftbase.c
../../src/Graphics_GL2.c
../../src/Deflate.c
@ -45,8 +47,9 @@ add_library(classicube SHARED
../../src/Vorbis.c
../../src/Protocol.c
../../src/World.c
../../src/SelOutlineRenderer.c
../../src/PickedPosRenderer.c
../../src/Platform_Posix.c
../../src/Platform_Android.c
../../src/LScreens.c
../../src/_truetype.c
../../src/_ftglyph.c
@ -94,141 +97,12 @@ add_library(classicube SHARED
../../src/EnvRenderer.c
../../src/Animations.c
../../src/LBackend.c
../../src/SystemFonts.c
../../src/Commands.c
../../src/EntityRenderers.c
../../src/Audio_SLES.c
../../src/TouchUI.c
../../src/LBackend_Android.c
../../src/InputHandler.c
../../src/MenuOptions.c
../../src/FancyLighting.c
../../src/Queue.c
../../src/SSL.c
../../src/Certs.c
../../src/android/Platform_Android.c
../../src/android/Window_Android.c
../../third_party/bearssl/aes_big_cbcdec.c
../../third_party/bearssl/aes_big_cbcenc.c
../../third_party/bearssl/aes_big_ctr.c
../../third_party/bearssl/aes_big_ctrcbc.c
../../third_party/bearssl/aes_big_dec.c
../../third_party/bearssl/aes_big_enc.c
../../third_party/bearssl/aes_common.c
../../third_party/bearssl/aesctr_drbg.c
../../third_party/bearssl/aes_x86ni.c
../../third_party/bearssl/aes_x86ni_cbcdec.c
../../third_party/bearssl/aes_x86ni_cbcenc.c
../../third_party/bearssl/aes_x86ni_ctr.c
../../third_party/bearssl/aes_x86ni_ctrcbc.c
../../third_party/bearssl/asn1enc.c
../../third_party/bearssl/ccm.c
../../third_party/bearssl/ccopy.c
../../third_party/bearssl/chacha20_ct.c
../../third_party/bearssl/chacha20_sse2.c
../../third_party/bearssl/dec32be.c
../../third_party/bearssl/dec32le.c
../../third_party/bearssl/dec64be.c
../../third_party/bearssl/dec64le.c
../../third_party/bearssl/dig_oid.c
../../third_party/bearssl/dig_size.c
../../third_party/bearssl/ec_all_m31.c
../../third_party/bearssl/ec_c25519_i31.c
../../third_party/bearssl/ec_c25519_m31.c
../../third_party/bearssl/ec_c25519_m62.c
../../third_party/bearssl/ec_c25519_m64.c
../../third_party/bearssl/ec_curve25519.c
../../third_party/bearssl/ec_default.c
../../third_party/bearssl/ecdsa_atr.c
../../third_party/bearssl/ecdsa_default_vrfy_asn1.c
../../third_party/bearssl/ecdsa_default_vrfy_raw.c
../../third_party/bearssl/ecdsa_i31_bits.c
../../third_party/bearssl/ecdsa_i31_vrfy_asn1.c
../../third_party/bearssl/ecdsa_i31_vrfy_raw.c
../../third_party/bearssl/ec_p256_m31.c
../../third_party/bearssl/ec_p256_m62.c
../../third_party/bearssl/ec_p256_m64.c
../../third_party/bearssl/ec_prime_i31.c
../../third_party/bearssl/ec_secp256r1.c
../../third_party/bearssl/ec_secp384r1.c
../../third_party/bearssl/ec_secp521r1.c
../../third_party/bearssl/enc32be.c
../../third_party/bearssl/enc32le.c
../../third_party/bearssl/enc64be.c
../../third_party/bearssl/enc64le.c
../../third_party/bearssl/gcm.c
../../third_party/bearssl/ghash_ctmul64.c
../../third_party/bearssl/ghash_ctmul.c
../../third_party/bearssl/ghash_pclmul.c
../../third_party/bearssl/hmac.c
../../third_party/bearssl/hmac_ct.c
../../third_party/bearssl/hmac_drbg.c
../../third_party/bearssl/i31_add.c
../../third_party/bearssl/i31_bitlen.c
../../third_party/bearssl/i31_decmod.c
../../third_party/bearssl/i31_decode.c
../../third_party/bearssl/i31_decred.c
../../third_party/bearssl/i31_encode.c
../../third_party/bearssl/i31_fmont.c
../../third_party/bearssl/i31_iszero.c
../../third_party/bearssl/i31_moddiv.c
../../third_party/bearssl/i31_modpow2.c
../../third_party/bearssl/i31_modpow.c
../../third_party/bearssl/i31_montmul.c
../../third_party/bearssl/i31_mulacc.c
../../third_party/bearssl/i31_muladd.c
../../third_party/bearssl/i31_ninv31.c
../../third_party/bearssl/i31_reduce.c
../../third_party/bearssl/i31_rshift.c
../../third_party/bearssl/i31_sub.c
../../third_party/bearssl/i31_tmont.c
../../third_party/bearssl/i32_div32.c
../../third_party/bearssl/i62_modpow2.c
../../third_party/bearssl/md5.c
../../third_party/bearssl/md5sha1.c
../../third_party/bearssl/multihash.c
../../third_party/bearssl/poly1305_ctmul.c
../../third_party/bearssl/poly1305_ctmulq.c
../../third_party/bearssl/prf.c
../../third_party/bearssl/prf_md5sha1.c
../../third_party/bearssl/prf_sha256.c
../../third_party/bearssl/prf_sha384.c
../../third_party/bearssl/rsa_default_pkcs1_vrfy.c
../../third_party/bearssl/rsa_default_priv.c
../../third_party/bearssl/rsa_default_pub.c
../../third_party/bearssl/rsa_i31_pkcs1_vrfy.c
../../third_party/bearssl/rsa_i31_priv.c
../../third_party/bearssl/rsa_i31_pub.c
../../third_party/bearssl/rsa_i62_pkcs1_vrfy.c
../../third_party/bearssl/rsa_i62_priv.c
../../third_party/bearssl/rsa_i62_pub.c
../../third_party/bearssl/rsa_pkcs1_sig_unpad.c
../../third_party/bearssl/sha1.c
../../third_party/bearssl/sha2big.c
../../third_party/bearssl/sha2small.c
../../third_party/bearssl/ssl_client.c
../../third_party/bearssl/ssl_client_default_rsapub.c
../../third_party/bearssl/ssl_client_full.c
../../third_party/bearssl/ssl_engine.c
../../third_party/bearssl/ssl_engine_default_aescbc.c
../../third_party/bearssl/ssl_engine_default_aesccm.c
../../third_party/bearssl/ssl_engine_default_aesgcm.c
../../third_party/bearssl/ssl_engine_default_chapol.c
../../third_party/bearssl/ssl_engine_default_ec.c
../../third_party/bearssl/ssl_engine_default_ecdsa.c
../../third_party/bearssl/ssl_engine_default_rsavrfy.c
../../third_party/bearssl/ssl_hashes.c
../../third_party/bearssl/ssl_hs_client.c
../../third_party/bearssl/ssl_io.c
../../third_party/bearssl/ssl_rec_cbc.c
../../third_party/bearssl/ssl_rec_ccm.c
../../third_party/bearssl/ssl_rec_chapol.c
../../third_party/bearssl/ssl_rec_gcm.c
../../third_party/bearssl/x509_minimal.c
../../third_party/bearssl/x509_minimal_full.c
)
# add lib dependencies
target_link_libraries(classicube
android
EGL
GLESv2
log)
log
OpenSLES)

View File

@ -2,8 +2,8 @@
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.classicube.android.client"
android:versionCode="1370"
android:versionName="1.3.7">
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />

View File

@ -1,57 +0,0 @@
package com.classicube;
import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.View;
public class CCMotionListener implements View.OnGenericMotionListener {
MainActivity activity;
public CCMotionListener(MainActivity activity) {
this.activity = activity;
}
// https://developer.android.com/develop/ui/views/touch-and-input/game-controllers/controller-input#java
@Override
public boolean onGenericMotion(View view, MotionEvent event) {
if (event.getAction() != MotionEvent.ACTION_MOVE) return false;
boolean source_joystick = (event.getSource() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK;
boolean source_gamepad = (event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD;
if (source_joystick || source_gamepad) {
int historySize = event.getHistorySize();
for (int i = 0; i < historySize; i++) {
processJoystickInput(event, i);
}
processJoystickInput(event, -1);
return true;
}
return false;
}
void processJoystickInput(MotionEvent event, int historyPos) {
float x1 = getAxisValue(event, MotionEvent.AXIS_X, historyPos);
float y1 = getAxisValue(event, MotionEvent.AXIS_Y, historyPos);
float x2 = getAxisValue(event, MotionEvent.AXIS_Z, historyPos);
float y2 = getAxisValue(event, MotionEvent.AXIS_RZ, historyPos);
if (x1 != 0 || y1 != 0)
pushAxisMovement(MainActivity.CMD_GPAD_AXISL, x1, y1);
if (x2 != 0 || y2 != 0)
pushAxisMovement(MainActivity.CMD_GPAD_AXISR, x2, y2);
}
float getAxisValue(MotionEvent event, int axis, int historyPos) {
float value = historyPos < 0 ? event.getAxisValue(axis) :
event.getHistoricalAxisValue(axis, historyPos);
// Deadzone detection
if (value >= -0.25f && value <= 0.25f) value = 0;
return value;
}
void pushAxisMovement(int axis, float x, float y) {
activity.pushCmd(axis, (int)(x * 4096), (int)(y * 4096));
}
}

View File

@ -1,108 +0,0 @@
package com.classicube;
import android.text.Editable;
import android.text.Selection;
import android.text.SpannableStringBuilder;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
public class CCView extends SurfaceView {
SpannableStringBuilder kbText;
MainActivity activity;
public CCView(MainActivity activity) {
// setFocusable, setFocusableInTouchMode - API level 1
super(activity);
this.activity = activity;
setFocusable(true);
setFocusableInTouchMode(true);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return activity.handleTouchEvent(ev) || super.dispatchTouchEvent(ev);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo attrs) {
// BaseInputConnection, IME_ACTION_GO, IME_FLAG_NO_EXTRACT_UI - API level 3
attrs.actionLabel = null;
attrs.inputType = MainActivity.calcKeyboardType(activity.keyboardType);
attrs.imeOptions = MainActivity.calcKeyboardOptions(activity.keyboardType);
kbText = new SpannableStringBuilder(activity.keyboardText);
InputConnection ic = new BaseInputConnection(this, true) {
boolean inited;
void updateText() {
activity.pushCmd(MainActivity.CMD_KEY_TEXT, kbText.toString());
}
@Override
public Editable getEditable() {
if (!inited) {
// needed to set selection, otherwise random crashes later with backspacing
// set selection to end, so backspacing after opening keyboard with text still works
Selection.setSelection(kbText, kbText.toString().length());
inited = true;
}
return kbText;
}
@Override
public boolean setComposingText(CharSequence text, int newCursorPosition) {
boolean success = super.setComposingText(text, newCursorPosition);
updateText();
return success;
}
@Override
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
boolean success = super.deleteSurroundingText(beforeLength, afterLength);
updateText();
return success;
}
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
boolean success = super.commitText(text, newCursorPosition);
updateText();
return success;
}
@Override
public boolean sendKeyEvent(KeyEvent ev) {
// getSelectionStart - API level 1
if (ev.getAction() != KeyEvent.ACTION_DOWN) return super.sendKeyEvent(ev);
int code = ev.getKeyCode();
int uni = ev.getUnicodeChar();
// start is -1 sometimes, and trying to insert/delete there crashes
int start = Selection.getSelectionStart(kbText);
if (start == -1) start = kbText.toString().length();
if (code == KeyEvent.KEYCODE_ENTER) {
// enter maps to \n but that should not be intercepted
} else if (code == KeyEvent.KEYCODE_DEL) {
if (start <= 0) return false;
kbText.delete(start - 1, start);
updateText();
return false;
} else if (uni != 0) {
kbText.insert(start, String.valueOf((char) uni));
updateText();
return false;
}
return super.sendKeyEvent(ev);
}
};
//String text = MainActivity.this.keyboardText;
//if (text != null) ic.setComposingText(text, 0);
return ic;
}
}

View File

@ -1,14 +1,14 @@
package com.classicube;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.lang.reflect.Method;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
@ -23,31 +23,30 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.provider.Settings.Secure;
import android.text.Editable;
import android.text.InputType;
import android.text.Selection;
import android.text.SpannableStringBuilder;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
// This class contains all the glue/interop code for bridging ClassiCube to the java Android world.
// Some functionality is only available on later Android versions - try {} catch {} is used in such places
// to ensure that the game can still run on earlier Android versions (albeit with reduced functionality)
@ -58,7 +57,6 @@ import javax.net.ssl.X509TrustManager;
// implements InputQueue.Callback
public class MainActivity extends Activity
{
public boolean launcher;
// ==================================================================
// ---------------------------- COMMANDS ----------------------------
// ==================================================================
@ -74,29 +72,21 @@ public class MainActivity extends Activity
NativeCmdArgs args = freeCmds.poll();
return args != null ? args : new NativeCmdArgs();
}
public void pushCmd(int cmd) {
void pushCmd(int cmd) {
NativeCmdArgs args = getCmdArgs();
args.cmd = cmd;
pending.add(args);
}
public void pushCmd(int cmd, int a1) {
void pushCmd(int cmd, int a1) {
NativeCmdArgs args = getCmdArgs();
args.cmd = cmd;
args.arg1 = a1;
pending.add(args);
}
public void pushCmd(int cmd, int a1, int a2) {
NativeCmdArgs args = getCmdArgs();
args.cmd = cmd;
args.arg1 = a1;
args.arg2 = a2;
pending.add(args);
}
public void pushCmd(int cmd, int a1, int a2, int a3, int a4) {
void pushCmd(int cmd, int a1, int a2, int a3, int a4) {
NativeCmdArgs args = getCmdArgs();
args.cmd = cmd;
args.arg1 = a1;
@ -106,65 +96,45 @@ public class MainActivity extends Activity
pending.add(args);
}
public void pushCmd(int cmd, String text) {
void pushCmd(int cmd, String text) {
NativeCmdArgs args = getCmdArgs();
args.cmd = cmd;
args.str = text;
pending.add(args);
}
public void pushCmd(int cmd, int a1, String str) {
void pushCmd(int cmd, Surface surface) {
NativeCmdArgs args = getCmdArgs();
args.cmd = cmd;
args.arg1 = a1;
args.str = str;
pending.add(args);
}
public void pushCmd(int cmd, SurfaceHolder holder) {
NativeCmdArgs args = getCmdArgs();
Rect rect = holder.getSurfaceFrame();
args.cmd = cmd;
args.sur = holder.getSurface();
args.arg1 = rect.width();
args.arg2 = rect.height();
args.cmd = cmd;
args.sur = surface;
pending.add(args);
}
public final static int CMD_KEY_DOWN = 0;
public final static int CMD_KEY_UP = 1;
public final static int CMD_KEY_CHAR = 2;
public final static int CMD_POINTER_DOWN = 3;
public final static int CMD_POINTER_UP = 4;
public final static int CMD_POINTER_MOVE = 5;
final static int CMD_KEY_DOWN = 0;
final static int CMD_KEY_UP = 1;
final static int CMD_KEY_CHAR = 2;
final static int CMD_POINTER_DOWN = 3;
final static int CMD_POINTER_UP = 4;
final static int CMD_POINTER_MOVE = 5;
final static int CMD_WIN_CREATED = 6;
final static int CMD_WIN_DESTROYED = 7;
final static int CMD_WIN_RESIZED = 8;
final static int CMD_WIN_REDRAW = 9;
public final static int CMD_WIN_CREATED = 6;
public final static int CMD_WIN_DESTROYED = 7;
public final static int CMD_WIN_RESIZED = 8;
public final static int CMD_WIN_REDRAW = 9;
final static int CMD_APP_START = 10;
final static int CMD_APP_STOP = 11;
final static int CMD_APP_RESUME = 12;
final static int CMD_APP_PAUSE = 13;
final static int CMD_APP_DESTROY = 14;
public final static int CMD_APP_START = 10;
public final static int CMD_APP_STOP = 11;
public final static int CMD_APP_RESUME = 12;
public final static int CMD_APP_PAUSE = 13;
public final static int CMD_APP_DESTROY = 14;
final static int CMD_GOT_FOCUS = 15;
final static int CMD_LOST_FOCUS = 16;
final static int CMD_CONFIG_CHANGED = 17;
final static int CMD_LOW_MEMORY = 18;
public final static int CMD_GOT_FOCUS = 15;
public final static int CMD_LOST_FOCUS = 16;
public final static int CMD_CONFIG_CHANGED = 17;
public final static int CMD_LOW_MEMORY = 18;
public final static int CMD_KEY_TEXT = 19;
public final static int CMD_OFD_RESULT = 20;
public final static int CMD_UI_CREATED = 21;
public final static int CMD_UI_CLICKED = 22;
public final static int CMD_UI_CHANGED = 23;
public final static int CMD_UI_STRING = 24;
public final static int CMD_GPAD_AXISL = 25;
public final static int CMD_GPAD_AXISR = 26;
final static int CMD_KEY_TEXT = 19;
final static int CMD_OFD_RESULT = 20;
// ====================================================================
@ -351,13 +321,10 @@ public class MainActivity extends Activity
case CMD_POINTER_DOWN: processPointerDown(c.arg1, c.arg2, c.arg3, c.arg4); break;
case CMD_POINTER_UP: processPointerUp( c.arg1, c.arg2, c.arg3, c.arg4); break;
case CMD_POINTER_MOVE: processPointerMove(c.arg1, c.arg2, c.arg3, c.arg4); break;
case CMD_GPAD_AXISL: processJoystickL(c.arg1, c.arg2); break;
case CMD_GPAD_AXISR: processJoystickR(c.arg1, c.arg2); break;
case CMD_WIN_CREATED: processSurfaceCreated(c.sur, c.arg1, c.arg2); break;
case CMD_WIN_CREATED: processSurfaceCreated(c.sur); break;
case CMD_WIN_DESTROYED: processSurfaceDestroyed(); break;
case CMD_WIN_RESIZED: processSurfaceResized(c.arg1, c.arg2); break;
case CMD_WIN_RESIZED: processSurfaceResized(c.sur); break;
case CMD_WIN_REDRAW: processSurfaceRedrawNeeded(); break;
case CMD_APP_START: processOnStart(); break;
@ -389,12 +356,9 @@ public class MainActivity extends Activity
native void processPointerUp( int id, int x, int y, int isMouse);
native void processPointerMove(int id, int x, int y, int isMouse);
native void processJoystickL(int x, int y);
native void processJoystickR(int x, int y);
native void processSurfaceCreated(Surface sur, int w, int h);
native void processSurfaceCreated(Surface sur);
native void processSurfaceDestroyed();
native void processSurfaceResized(int w, int h);
native void processSurfaceResized(Surface sur);
native void processSurfaceRedrawNeeded();
native void processOnStart();
@ -421,43 +385,20 @@ public class MainActivity extends Activity
// static to persist across activity destroy/create
static final Semaphore winDestroyedSem = new Semaphore(0, true);
SurfaceHolder.Callback callback;
public View curView;
public void setActiveView(View view) {
// setContentView, requestFocus - API level 1
curView = view;
setContentView(view);
curView.requestFocus();
if (fullscreen) setUIVisibility(FULLSCREEN_FLAGS);
hookMotionListener(view);
}
void hookMotionListener(View view) {
try {
CCMotionListener listener = new CCMotionListener(this);
view.setOnGenericMotionListener(listener);
} catch (Exception ex) {
// Unsupported on android 12
} catch (NoClassDefFoundError ex) {
// Unsupported on android 12
}
}
CCView curView;
// SurfaceHolder.Callback - API level 1
class CCSurfaceCallback implements SurfaceHolder.Callback {
public void surfaceCreated(SurfaceHolder holder) {
// getSurface - API level 1
Log.i("CC_WIN", "win created " + holder.getSurface());
Rect r = holder.getSurfaceFrame();
MainActivity.this.pushCmd(CMD_WIN_CREATED, holder);
MainActivity.this.pushCmd(CMD_WIN_CREATED, holder.getSurface());
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// getSurface - API level 1
Log.i("CC_WIN", "win changed " + holder.getSurface());
Rect r = holder.getSurfaceFrame();
MainActivity.this.pushCmd(CMD_WIN_RESIZED, holder);
MainActivity.this.pushCmd(CMD_WIN_RESIZED, holder.getSurface());
}
public void surfaceDestroyed(SurfaceHolder holder) {
@ -508,11 +449,107 @@ public class MainActivity extends Activity
void attachSurface() {
// setContentView, requestFocus, getHolder, addCallback, RGBX_8888 - API level 1
createSurfaceCallback();
CCView view = new CCView(this);
view.getHolder().addCallback(callback);
view.getHolder().setFormat(PixelFormat.RGBX_8888);
curView = new CCView(this);
curView.getHolder().addCallback(callback);
curView.getHolder().setFormat(PixelFormat.RGBX_8888);
setContentView(curView);
curView.requestFocus();
if (fullscreen) setUIVisibility(FULLSCREEN_FLAGS);
}
setActiveView(view);
class CCView extends SurfaceView {
SpannableStringBuilder kbText;
public CCView(Context context) {
// setFocusable, setFocusableInTouchMode - API level 1
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return MainActivity.this.handleTouchEvent(ev) || super.dispatchTouchEvent(ev);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo attrs) {
// BaseInputConnection, IME_ACTION_GO, IME_FLAG_NO_EXTRACT_UI - API level 3
attrs.actionLabel = null;
attrs.inputType = MainActivity.this.getKeyboardType();
attrs.imeOptions = MainActivity.this.getKeyboardOptions();
kbText = new SpannableStringBuilder(MainActivity.this.keyboardText);
InputConnection ic = new BaseInputConnection(this, true) {
boolean inited;
void updateText() { MainActivity.this.pushCmd(CMD_KEY_TEXT, kbText.toString()); }
@Override
public Editable getEditable() {
if (!inited) {
// needed to set selection, otherwise random crashes later with backspacing
// set selection to end, so backspacing after opening keyboard with text still works
Selection.setSelection(kbText, kbText.toString().length());
inited = true;
}
return kbText;
}
@Override
public boolean setComposingText(CharSequence text, int newCursorPosition) {
boolean success = super.setComposingText(text, newCursorPosition);
updateText();
return success;
}
@Override
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
boolean success = super.deleteSurroundingText(beforeLength, afterLength);
updateText();
return success;
}
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
boolean success = super.commitText(text, newCursorPosition);
updateText();
return success;
}
@Override
public boolean sendKeyEvent(KeyEvent ev) {
// getSelectionStart - API level 1
if (ev.getAction() != KeyEvent.ACTION_DOWN) return super.sendKeyEvent(ev);
int code = ev.getKeyCode();
int uni = ev.getUnicodeChar();
// start is -1 sometimes, and trying to insert/delete there crashes
int start = Selection.getSelectionStart(kbText);
if (start == -1) start = kbText.toString().length();
if (code == KeyEvent.KEYCODE_ENTER) {
// enter maps to \n but that should not be intercepted
} else if (code == KeyEvent.KEYCODE_DEL) {
if (start <= 0) return false;
kbText.delete(start - 1, start);
updateText();
return false;
} else if (uni != 0) {
kbText.insert(start, String.valueOf((char)uni));
updateText();
return false;
}
return super.sendKeyEvent(ev);
}
};
//String text = MainActivity.this.keyboardText;
//if (text != null) ic.setComposingText(text, 0);
return ic;
}
}
@ -618,9 +655,8 @@ public class MainActivity extends Activity
if (curView == null) return;
// Try to avoid restarting input if possible
CCView view = (CCView)curView;
if (view.kbText != null) {
String curText = view.kbText.toString();
if (curView.kbText != null) {
String curText = curView.kbText.toString();
if (text.equals(curText)) return;
}
@ -632,9 +668,9 @@ public class MainActivity extends Activity
input.restartInput(curView);
}
public static int calcKeyboardType(int kbType) {
public int getKeyboardType() {
// TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_TEXT_VARIATION_PASSWORD - API level 3
int type = kbType & 0xFF;
int type = keyboardType & 0xFF;
if (type == 2) return InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
if (type == 1) return InputType.TYPE_CLASS_NUMBER; // KEYBOARD_TYPE_NUMERIC
@ -642,9 +678,9 @@ public class MainActivity extends Activity
return InputType.TYPE_CLASS_TEXT;
}
public static int calcKeyboardOptions(int kbType) {
public int getKeyboardOptions() {
// IME_ACTION_GO, IME_FLAG_NO_EXTRACT_UI - API level 3
if ((kbType & 0x100) != 0) {
if ((keyboardType & 0x100) != 0) {
return EditorInfo.IME_ACTION_SEND | EditorInfo.IME_FLAG_NO_EXTRACT_UI;
} else {
return EditorInfo.IME_ACTION_GO | EditorInfo.IME_FLAG_NO_EXTRACT_UI;
@ -914,100 +950,108 @@ public class MainActivity extends Activity
// ======================================================================
// -------------------------------- SSL ---------------------------------
// -------------------------------- HTTP --------------------------------
// ======================================================================
static X509TrustManager trust;
static CertificateFactory certFactory;
static ArrayList<X509Certificate> chain = new ArrayList<X509Certificate>();
// Implements java Android side of the Android HTTP backend (See Http.c)
static HttpURLConnection conn;
static InputStream src;
static byte[] readCache = new byte[8192];
static X509TrustManager CreateTrust() throws Exception {
TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
// Load default Trust Anchor certificates
factory.init((KeyStore)null);
TrustManager[] trustManagers = factory.getTrustManagers();
for (int i = 0; i < trustManagers.length; i++)
{
// Should be first entry, e.g. X509TrustManagerImpl
if (trustManagers[i] instanceof X509TrustManager)
return (X509TrustManager)trustManagers[i];
}
return null;
}
public static int sslCreateTrust() {
public static int httpInit(String url, String method) {
try {
trust = CreateTrust();
return 1;
} catch (Exception ex) {
ex.printStackTrace();
conn = (HttpURLConnection)new URL(url).openConnection();
conn.setDoInput(true);
conn.setRequestMethod(method);
conn.setInstanceFollowRedirects(true);
httpAddMethodHeaders(method);
return 0;
}
}
public static void sslAddCert(byte[] data) {
try {
if (certFactory == null) certFactory = CertificateFactory.getInstance("X.509");
if (certFactory == null) return;
InputStream in = new ByteArrayInputStream(data);
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(in);
chain.add(cert);
} catch (Exception ex) {
ex.printStackTrace();
return httpOnError(ex);
}
}
static void httpAddMethodHeaders(String method) {
if (!method.equals("HEAD")) return;
public static int sslVerifyChain() {
int result = -200;
// Ever since dropbox switched to to chunked transfer encoding,
// sending a HEAD request to dropbox always seems to result in the
// next GET request failing with 'Unexpected status line' ProtocolException
// Seems to be a known issue: https://github.com/square/okhttp/issues/3689
// Simplest workaround is to ask for connection to be closed after HEAD request
httpSetHeader("connection", "close");
}
public static void httpSetHeader(String name, String value) {
conn.setRequestProperty(name, value);
}
public static int httpSetData(byte[] data) {
try {
X509Certificate[] certs = new X509Certificate[chain.size()];
for (int i = 0; i < chain.size(); i++) certs[i] = chain.get(i);
trust.checkServerTrusted(certs, "INV");
// standard java checks auth type, but android doesn't
// See https://issues.chromium.org/issues/40955801
result = 0;
conn.setDoOutput(true);
conn.getOutputStream().write(data);
conn.getOutputStream().flush();
return 0;
} catch (Exception ex) {
ex.printStackTrace();
return httpOnError(ex);
}
chain.clear();
return result;
}
public static int httpPerform() {
int len;
try {
conn.connect();
// Some implementations also provide this as getHeaderField(0), but some don't
httpParseHeader("HTTP/1.1 " + conn.getResponseCode() + " MSG");
// Legitimate webservers aren't going to reply with over 200 headers
for (int i = 0; i < 200; i++) {
String key = conn.getHeaderFieldKey(i);
String val = conn.getHeaderField(i);
if (key == null && val == null) break;
if (key == null) {
httpParseHeader(val);
} else {
httpParseHeader(key + ":" + val);
}
}
// ======================================================================
// --------------------------- Legacy window ----------------------------
// ======================================================================
Canvas cur_canvas;
public int[] legacy_lockCanvas(int l, int t, int r, int b) {
CCView surface = (CCView)curView;
Rect rect = new Rect(l, t, r, b);
cur_canvas = surface.getHolder().lockCanvas(rect);
src = conn.getInputStream();
while ((len = src.read(readCache)) > 0) {
httpAppendData(readCache, len);
}
int w = (r - l);
int h = (b - t);
return new int[w * h];
}
public void legacy_unlockCanvas(int l, int t, int r, int b, int[] buf) {
CCView surface = (CCView)curView;
int w = (r - l);
int h = (b - t);
// TODO avoid need to swap R/B
for (int i = 0; i < buf.length; i++)
{
int color = buf[i];
int R = color & 0x00FF0000;
int B = color & 0x000000FF;
buf[i] = (color & 0xFF00FF00) | (B << 16) | (R >> 16);
httpFinish();
return 0;
} catch (Exception ex) {
return httpOnError(ex);
}
cur_canvas.drawBitmap(buf, 0, w, l, t, w, h, false, null);
surface.getHolder().unlockCanvasAndPost(cur_canvas);
cur_canvas = null;
}
static void httpFinish() {
conn = null;
try {
src.close();
} catch (Exception ex) { }
src = null;
}
// TODO: Should we prune this list?
static List<String> errors = new ArrayList<String>();
static int httpOnError(Exception ex) {
ex.printStackTrace();
httpFinish();
errors.add(ex.getMessage());
return -errors.size(); // don't want 0 as an error code
}
public static String httpDescribeError(int res) {
res = -res - 1;
return res >= 0 && res < errors.size() ? errors.get(res) : null;
}
native static void httpParseHeader(String header);
native static void httpAppendData(byte[] data, int len);
}

View File

@ -4,15 +4,13 @@
* AndrewPH - Advice on how to improve ui of both client and launcher, multiple
suggestions, and hosting the automatic build bot for ClassiCube.
* 123DMWM - many suggestions, and assistance in identifying bugs and their causes.
* video_error - Allowing remote use of an macOS machine, pointing out many flaws in the plugin API.
The macOS port would not have been possible without you, thanks!
* video_error - Allowing remote use of an OSX machine, pointing out many flaws in the plugin API.
The OSX port would not have been possible without you, thanks!
* Jerralish - reverse engineering and documenting the original classic map generation algorithm.
* Cybertoon - Adding water animation, better metal step/dig sounds, identifying multiple flaws
* FabTheZen - suggestions about how to improve user experience, testing.
* Cheesse - multiple suggestions, testing ClassicalSharp on AMD graphics cards.
* Hemsindor - testing ClassicalSharp on macOS.
* headshotnoby - developing the Switch port.
* Beyond_5D - identifying many differences from original Classic
* shinovon - developing the Symbian port.
* Hemsindor - testing ClassicalSharp on OSX.
And a big thanks to everyone else in the ClassiCube community (who I didn't mention here),
who in the past have provided many suggestions and assisted in identifying bugs.

View File

@ -16,10 +16,10 @@ Common compilation errors
Add ```-lrt``` when compiling. Occurs when using glibc versions before 2.17.
#### fatal error: execinfo.h: No such file or directory
Define `CC_BACKTRACE_BUILTIN` when compiling. Usually occurs when using musl.
Install ```libexecinfo``` package. Occurs when using musl.
#### Undefined reference to 'backtrace'
Define `CC_BACKTRACE_BUILTIN` when compiling. Usually occurs when using musl.
Add ```-lexecinfo``` when compiling. Occurs when using musl.
Webclient patches
---------------------

View File

@ -133,7 +133,7 @@ if __name__ == "__main__":
```
#### static/classisphere.js
Download `cs.classicube.net/client/latest/ClassiCube.js` for this
Download `cs.classicube.net/c_client/latest/ClassiCube.js` for this
#### static/default.zip
Download `classicube.net/static/default.zip` for this

View File

@ -1,34 +1,24 @@
Hosting your own version of the ClassiCube webclient is relatively straightforward
Only the following 3 files are required:
1) A web page to initialise the game .js and display the game
So you want to host your own version of the webclient? It's pretty easy to do, you need 3 files:
1) A web page to initialise the .js and display the game
2) The game .js file
3) The default texture pack
TODO: more advanced sample (authentication, custom game.js, skin server)
### Example setup
For example, let's assume your website is setup like this:
For example, let's assume our site is setup like this:
* `example.com/play.html`
* `example.com/static/classisphere.js`
* `example.com/static/default.zip`
For simplicitly,
1) Download `cs.classicube.net/client/latest/ClassiCube.js`, then upload it to `static/classisphere.js` on the webserver
1) Download `cs.classicube.net/c_client/latest/ClassiCube.js`, then upload it to `static/classisphere.js` on the webserver
2) Download `classicube.net/static/default.zip`, then upload it to `static/default.zip` on the webserver
The play.html page is the trickiest part, because how to implement this is website-specific. (depends on how the website is styled, what webserver is used, what programming language is used to generate the html, etc)
#### Changing where the game downloads the texture pack from
There should be this piece of code somewhere in the .JS file: `function _interop_AsyncDownloadTexturePack(rawPath) {`
A bit below that, there should be `var url = '/static/default.zip';` - change that to the desired URL.
The play.html page is the trickiest part, because how to implement this is website-specific. (depends on how your website is styled, what webserver you use, what programming language is used to generate the html, etc)
#### Embedding the game in play.html
The following HTML code is required to be somewhere in the webpage:
You are required to have this HTML code somewhere in the page:
```HTML
<!-- the canvas *must not* have any border or padding, or mouse coords will be wrong -->
<canvas id="canvas" style="display:block; border:0; padding:0; background-color: black;"

View File

@ -1,6 +1,6 @@
## Introduction
### Introduction
The 2D GUI works by showing multiple 'screens' or 'layers' on top of each other. Each 'screen' usually contains one or more widgets. (e.g. a 'ButtonWidget' for a 'Close' button)
The 2D gui works by showing multiple 'screens' or 'layers' on top of each other. Each 'screen' usually contains one or more widgets. (e.g. a 'ButtonWidget' for a 'Close' button)
Here's an example of multiple screens:
@ -11,143 +11,52 @@ The example above consists of three screens:
2. `ChatScreen` - Text widgets in the bottom left area (Only one is currently used though)
3. `HUDScreen` - Text in the top left and hotbar at the bottom
TODO: Explain event processing architecture
### Screen interface
TODO: Explain pointer IDs. maybe a separate input-architecture.md file?
`Init` - Where you initialise stuff that lasts for the entire duration the screen is open, e.g. hooking into events.
TODO: Explain dynamic vertex buffer
`Free` - Where you undo the allocating/event hooking you did in Init.
## Screen interface
`ContextRecreated` - Where you actually allocate stuff like textures of widgets and the screen's dynamic vertex buffer. It's where you should call stuff like ButtonWidget_SetConst, TextWidget_SetConst, etc.
#### `void Init(void* screen)`
`ContextLost` - Where you destroy what you allocated in `ContextRecreated`. You **MUST** destroy all the textures/vertex buffers that you allocated, as otherwise you will get an error later with 'recreating context failed' with the Direct3D9 backend when you next try to resize the window or go fullscreen.
Where you initialise state and objects that lasts for the entire duration the screen is open
`Layout` - Where you reposition all the elements (i.e. widgets + anything else) of this screen. (Will always be called when initially showing this screen and whenever window resizes)
E.g. Hooking into events
`HandlesInputDown/HandlesInputUp` - Called whenever a keyboard or mouse button is pressed/released.
#### `void Free(void* screen)`
`HandlesKeyPress` - Called when a key character is entered on the keyboard. (e.g. you'd get '$' here if user pressed 4 while holding shift)
Where you undo the allocating/event hooking you did in `Init`.
`HandlesTextChanged` - Called when the text changes in the on-screen keyboard. (i.e. KeyPress but for mobile text input)
#### `void ContextRecreated(void* screen)`
`HandlesMouseScroll` - Called when the wheel is scrolled on the mouse.
Where you allocate resources used for rendering, such as fonts, textures of widgets, and the screen's dynamic vertex buffer.
`HandlesPointerDown/HandlesPointerUp/HandlesPointerMove` - Called whenever the left mouse or a touch finger is pressed/released/moved.
E.g. where you should call `ButtonWidget_SetConst`, `TextWidget_SetConst`, etc.
`BuildMesh` - Where you fill out the screen's dynamic vertex buffer with the vertices of all the widgets. This gets called just before `Render` whenever s->dirty is set to true. (pointer/input events automatically set s->dirty to true for the next frame)
#### `void ContextLost(void* screen)`
`Update` - Called just before `Render` every frame and also provides the elapsed time since last render. Typically you'd use this to update simple stuff that depends on accumulated time. (e.g. whether the flashing caret should appear or not for input widgets)
Where you destroy/release all that resources that were allocated in `ContextRecreated`.
`Render` - Called every frame and is where you actually draw the widgets and other stuff on-screen. Don't forget to call Gfx_SetTexturing(true) before rendering widgets and Gfx_SetTexturing(false) once you're done.
Note: You **MUST** destroy all the textures/vertex buffers that you allocated, as otherwise you will get an error later with 'recreating context failed' with the Direct3D9 backend when you next try to resize the window or go fullscreen. TODO: rewrite this note
### Screen members
#### `void Layout(void* screen)`
`VTABLE` - Set to a ScreenVTABLE instance which implements all of the `Screen interface` functions
Where you reposition all the elements (i.e. widgets + anything else) of this screen.
`grabsInput` - Whether this screen grabs all input. If any screen grabs all input, then the mouse cursor becomes visible, W/A/S/D stops causing player movement, etc.
Note: This is called when initially showing this screen, and whenever the window is resized
`blocksWorld` - Whether this screen completely and opaquely covers the game world behind it. (e.g. loading screen and disconnect screen)
#### `int HandlesInputDown(void* screen, int button)`
`closable` - Whether this screen is automatically closed when pressing Escape. (Usually should be true for screens that are menus, e.g. pause screen)
Called whenever a input button (keyboard/mouse/gamepad) is pressed.
`dirty` - Whether this screen will have `BuildMesh` called on the next frame
#### `void OnInputUp(void* screen, int button)`
`maxVertices` - The maximum number of vertices that this screen's dynamic vertex buffer may use
Called whenever a input button (keyboard/mouse/gamepad) is released.
`vb` - This screen's dynamic vertex buffer
#### `int HandlesKeyPress(void* screen, char keyChar)`
Called when a key character is entered on the keyboard.
E.g. you'd get '$' here if user pressed 4 while holding shift)
#### `int HandlesTextChanged(void* screen, const cc_string* str)`
Called when the text changes in the on-screen keyboard. (i.e. KeyPress but for mobile text input)
#### `int HandlesMouseScroll(void* screen, float wheelDelta)`
Called when the wheel is scrolled on the mouse.
#### `int HandlesPointerDown(void* screen, int pointerID, int x, int y)`
Called whenever the left mouse or a touch finger is pressed.
#### `void OnPointerUp(void* screen, int pointerID, int x, int y)`
Called whenever the left mouse or a touch finger is released.
#### `int HandlesPointerMove(void* screen, int pointerID, int x, int y)`
Called whenever the left mouse or a touch finger is moved.
#### `void BuildMesh(void* screen)`
Where you fill out the screen's dynamic vertex buffer with the vertices of all the widgets.
Note: This gets called just before `Render()` whenever the `dirty` field is set to `true`.
Note: Pointer/Input events automatically set the `dirty` field to `true` for the next frame
#### `void Update(void* screen, double delta)`
Called just before `Render()` every frame and also provides the elapsed time since last render.
Typically you'd use this to update simple stuff that depends on accumulated time.
(E.g. whether the flashing caret should appear or not for input widgets)
#### `void Render(void* screen)`
Called every frame and is where you actually draw the widgets and other stuff on-screen.
## Screen members
#### `struct ScreenVTABLE* VTABLE`
Set to a `ScreenVTABLE` instance which implements all of the `Screen interface` functions
#### `cc_bool grabsInput`
Whether this screen grabs all input.
Note: If any screen grabs all input, then the mouse cursor becomes visible, W/A/S/D stops causing player movement, etc.
#### `cc_bool blocksWorld`
Whether this screen completely and opaquely covers the game world behind it.
E.g. loading screen and disconnect screen
#### `cc_bool closable`
Whether this screen is automatically closed when pressing Escape.
Note: Usually should be true for screens that are menus (e.g. pause screen)
#### `cc_bool dirty`
Whether this screen will have `BuildMesh()` called on the next frame
Note: This should be set to `true` whenever any event/actions that might alter the screen's appearance occurs TODO explain when automatically called?
#### `int maxVertices`
The maximum number of vertices that this screen's dynamic vertex buffer may use
#### `GfxResourceID vb`
This screen's dynamic vertex buffer
#### `struct Widget** widgets;`
Pointer to the array of pointers to widgets that are contained in this screen
#### `int numWidgets;`
The number of widgets that are contained in this screen
## Screen notes
### Screen notes
* When the screen is shown via `Gui_Add`, the following functions are called
1) Init
@ -165,13 +74,3 @@ The number of widgets that are contained in this screen
3) Layout
Note: Whenever `default.png` (font texture) changes, `Gui_Refresh` is called for all screens. Therefore, fonts should usually be allocated/freed in `ContextRecreated/ContextLost` instead of `Init/Free` to ensure that the screen still looks correct after the texture pack changes.
TODO: Move this note earlier?
# Putting it altogether
TODO Add example of screen
Simple menu example that grabs all input
More complicated example too

View File

@ -1,124 +1,119 @@
The overall source code is structured where each .c represents a particular module. These modules are:
TODO: explain multiple backends for some Modules
## 2D modules
|Module|Functionality|
|File|Functionality|
|--------|-------|
|Bitmap|Represents a 2D array of pixels (and encoding/decoding to PNG)
|Drawer2D|Contains a variety of drawing operations on bitmaps (including text and fonts)
|PackedCol|32 bit RGBA color in a format suitable for using as color component of a vertex
|SystemFonts|Drawing, measuring, and retrieving the list of platform/system specific fonts
|Bitmap.c|Represents a 2D array of pixels (and encoding/decoding to PNG)
|Drawer2D.c|Contains a variety of drawing operations on bitmaps (including text and fonts)
|PackedCol.c|32 bit RGBA color in a format suitable for using as color component of a vertex
## Audio modules
|Module|Functionality|
|File|Functionality|
|--------|-------|
|Audio|Playing music and dig/place/step sounds, and abstracts a PCM audio playing API
|Vorbis| Decodes [ogg vorbis](https://xiph.org/vorbis/) audio into PCM audio samples
|Audio.c|Playing music and dig/place/step sounds, and abstracts a PCM audio playing API
|Vorbis.c| Decodes [ogg vorbis](https://xiph.org/vorbis/) audio into PCM audio samples
## Entity modules
|Module|Functionality|
|File|Functionality|
|--------|-------|
|Entity|Represents an in-game entity, and manages updating and rendering all entities
|EntityComponents|Various components that can be used by entities (e.g. tilt, animation, hacks state)
|Model|Contains the list of entity models, and provides relevant methods for entity models
|Particle|Represents particle effects, and manages rendering and spawning particles
|Entity.c|Represents an in-game entity, and manages updating and rendering all entities
|EntityComponents.c|Various components that can be used by entities (e.g. tilt, animation, hacks state)
|Model.c|Contains the list of entity models, and provides relevant methods for entity models
|Particle.c|Represents particle effects, and manages rendering and spawning particles
## Game modules
|File|Functionality|
|--------|-------|
|Block|Stores properties and data for blocks (e.g. collide type, draw type, sound type)
|BlockPhysics|Implements simple block physics for singleplayer
|Camera|Represents a camera (can be first or third person)
|Chat|Manages sending, adding, logging and handling chat
|Game|Manages the overall game loop, state, and variables (e.g. renders a frame, runs scheduled tasks)
|Input|Manages keyboard, mouse, and touch state and events, and implements base handlers for them
|Inventory|Manages inventory hotbar, and ordering of blocks in the inventory menu
|Block.c|Stores properties and data for blocks (e.g. collide type, draw type, sound type)
|BlockPhysics.c|Implements simple block physics for singleplayer
|Camera.c|Represents a camera (can be first or third person)
|Chat.c|Manages sending, adding, logging and handling chat
|Game.c|Manages the overall game loop, state, and variables (e.g. renders a frame, runs scheduled tasks)
|Input.c|Manages keyboard, mouse, and touch state and events, and implements base handlers for them
|Inventory.c|Manages inventory hotbar, and ordering of blocks in the inventory menu
## Game gui modules
|File|Functionality|
|--------|-------|
|Gui|Describes and manages the 2D GUI elements on screen
|IsometricDrawer|Draws 2D isometric blocks for the hotbar and inventory UIs
|Menus|Contains all 2D non-menu screens (e.g. inventory, HUD, loading, chat)
|Screens|Contains all 2D menu screens (e.g. pause menu, keys list menu, font list menu)
|Widgets|Contains individual GUI widgets (e.g. button, label)
|Gui.c|Describes and manages the 2D GUI elements on screen
|IsometricDrawer.c|Draws 2D isometric blocks for the hotbar and inventory UIs
|Menus.c|Contains all 2D non-menu screens (e.g. inventory, HUD, loading, chat)
|Screens.c|Contains all 2D menu screens (e.g. pause menu, keys list menu, font list menu)
|Widgets.c|Contains individual GUI widgets (e.g. button, label)
## Graphics modules
|Module|Functionality|
|File|Functionality|
|--------|-------|
|Builder|Converts a 16x16x16 chunk into a mesh of vertices
|Drawer|Draws the vertices for a cuboid region
|Graphics|Abstracts a 3D graphics rendering API
|Builder.c|Converts a 16x16x16 chunk into a mesh of vertices
|Drawer.c|Draws the vertices for a cuboid region
|Graphics.c|Abstracts a 3D graphics rendering API
## I/O modules
|Module|Functionality|
|File|Functionality|
|--------|-------|
|Deflate|Decodes and encodes data compressed using DEFLATE (in addition to GZIP/ZLIB headers)
|Stream|Abstract reading and writing data to/from various sources in a streaming manner
|Deflate.c|Decodes and encodes data compressed using DEFLATE (in addition to GZIP/ZLIB headers)
|Stream.c|Abstract reading and writing data to/from various sources in a streaming manner
## Launcher modules
|Module|Functionality|
|File|Functionality|
|--------|-------|
|Launcher|Manages the overall launcher loop, state, and variables (e.g. resets pixels in areas, marks areas as needing to be redrawn)
|LBackend|Handles the rendering of widgets and forwarding input events to screens/menus
|LScreens|Contains all the menus in the launcher (e.g. servers list, updates menu, main menu)
|LWeb|Responsible for launcher related web requests (e.g. signing in, fetching servers list)
|LWidgets|Contains individual launcher GUI widgets (e.g. button, label, input textbox)
|Resources|Responsible for checking, downloading, and creating the default assets (e.g. default.zip, sounds)
|Launcher.c|Manages the overall launcher loop, state, and variables (e.g. resets pixels in areas, marks areas as needing to be redrawn)
|LScreens.c|Contains all the menus in the launcher (e.g. servers list, updates menu, main menu)
|LWeb.c|Responsible for launcher related web requests (e.g. signing in, fetching servers list)
|LWidgets.c|Contains individual launcher GUI widgets (e.g. button, label, input textbox)
|Resources.c|Responsible for checking, downloading, and creating the default assets (e.g. default.zip, sounds)
## Map modules
|Module|Description|
|File|Description|
|--------|-------|
|Formats|Imports/exports a world from/to several map file formats (e.g. .cw, .dat, .lvl)
|Generator|Generates a new world in either a flatgrass or Minecraft Classic style
|Lighting|Gets lighting colors at coordinates in the world
|World|Manages fixed size 3D array of blocks and associated environment metadata
|Formats.c|Imports/exports a world from/to several map file formats (e.g. .cw, .dat, .lvl)
|Generator.c|Generates a new world in either a flatgrass or Minecraft Classic style
|Lighting.c|Gets lighting colors at coordinates in the world
|World.c|Manages fixed size 3D array of blocks and associated environment metadata
## Math/Physics modules
|Module|Description|
|File|Description|
|--------|-------|
|ExtMath|Math functions, math constants, and a Random Number Generator
|Physics|AABBs and geometry intersection
|Picking|Performs raytracing to e.g. determine the picked/selected block in the world
|Vectors|Contains vector,matrix,and frustum culling
|ExtMath.c|Math functions, math constants, and a Random Number Generator
|Physics.c|AABBs and geometry intersection
|Picking.c|Performs raytracing to e.g. determine the picked/selected block in the world
|Vectors.c|Contains vector,matrix,and frustum culling
## Network modules
|Module|Description|
|File|Description|
|--------|-------|
|Http|Performs GET and POST requests in the background
|Protocol|Implements Minecraft Classic, CPE, and WoM environment protocols
|Server|Manages a connection to a singleplayer or multiplayer server
|SSL|Performs SSL/TLS encryption and decryption
|Http.c|Performs GET and POST requests in the background
|Protocol.c|Implements Minecraft Classic, CPE, and WoM environment protocols
|Server.c|Manages a connection to a singleplayer or multiplayer server
## Platform modules
|Module|Description|
|File|Description|
|--------|-------|
|Logger|Manages logging to client.log, and dumping state in both intentional and unhandled crashes
|Platform|Abstracts platform specific functionality. (e.g. opening a file, allocating memory, starting a thread)
|Program|Parses command line arguments, and then starts either the Game or Launcher
|Window|Abstracts creating and managing a window (e.g. setting titlebar text, entering fullscreen)
|Logger.c|Manages logging to client.log, and dumping state in both intentional and unhandled crashes
|Platform.c|Abstracts platform specific functionality. (e.g. opening a file, allocating memory, starting a thread)
|Program.c|Parses command line arguments, and then starts either the Game or Launcher
|Window.c|Abstracts creating and managing a window (e.g. setting titlebar text, entering fullscreen)
## Rendering modules
|Module|Description|
|File|Description|
|--------|-------|
|AxisLinesRenderer|Renders 3 lines showing direction of each axis
|EnvRenderer|Renders environment of the world (clouds, sky, skybox, world sides/edges, etc)
|HeldBlockRenderer|Renders the block currently being held in bottom right corner
|MapRenderer|Renders the blocks of the world by diving it into chunks, and manages sorting/updating these chunks
|SelOutlineRenderer|Renders an outline around the block currently being looked at
|SelectionBox|Renders and stores selection boxes
|AxisLinesRenderer.c|Renders 3 lines showing direction of each axis
|EnvRenderer.c|Renders environment of the world (clouds, sky, skybox, world sides/edges, etc)
|HeldBlockRenderer.c|Renders the block currently being held in bottom right corner
|MapRenderer.c|Renders the blocks of the world by diving it into chunks, and manages sorting/updating these chunks
|PickedPosRenderer.c|Renders an outline around the block currently being looked at
|SelectionBox.c|Renders and stores selection boxes
## Texture pack modules
|Module|Functionality|
|File|Functionality|
|--------|-------|
|Animations|Everything relating to texture animations (including default water/lava ones)
|TexturePack|Everything relating to texture packs (e.g. extracting .zip, terrain atlas, etc)
|Animations.c|Everything relating to texture animations (including default water/lava ones)
|TexturePack.c|Everything relating to texture packs (e.g. extracting .zip, terrain atlas, etc)
## Utility modules
|Module|Functionality|
|File|Functionality|
|--------|-------|
|Event|Contains all events and provies helper methods for using events
|Options|Retrieves options from and sets options in options.txt
|String|Implements operations for a string with a buffer, length, and capacity
|Utils|Various general utility functions
|Event.c|Contains all events and provies helper methods for using events
|Options.c|Retrieves options from and sets options in options.txt
|String.c|Implements operations for a string with a buffer, length, and capacity
|Utils.c|Various general utility functions

View File

@ -1,72 +0,0 @@
Although ClassiCube strives to be as platform independent as possible, in some cases it will need to use system specific code
For instance:
* Texture creation for 3D graphics rendering
* Buffer allocation for audio output
* High resolution time measurement
* Window creation
For simplicity, related system specific code is grouped together as a Module (e.g. `Audio`), which can then be implemented using a backend (e.g. `WinMM`, `OpenAL`, `OpenSL ES`, etc)
#### Note: By default, ClassiCube automatically selects the recommended backends for the system. <br> It is recommended that you do *NOT* change the backends unless you know exactly what you are doing.
Some systems may provide multiple potential backends for a Module. For example on Windows:
* OpenGL could be used instead of Direct3D 9 for the 3D rendering backend
* SDL could be used instead of the native WinAPI for the window backend
TODO finish this
TODO introduction (explaining platform specific modules, and how classicube has to integrate with one of them)
There are two ways of changing the backend that gets used for the system:
1) Changing the default defines in `Core.h`
2) Using additional compilation flags to override default module backend(s)
3) Adding `-DCC_BUILD_MANUAL` to compilation flags and then manually defining all module backends via additional compilation flags
When manually compiling the source code, 1) is usually the easiest. <br>
For automated scripts compiling every single commit, 2) is the recommended approach
TODO: Move this into table
### 3D Graphics backends (`CC_GFX_BACKEND`)
* CC_GFX_BACKEND_SOFTGPU - Software rasteriser
* CC_GFX_BACKEND_D3D9 - Direct3D 9
* CC_GFX_BACKEND_D3D11 - Direct3D 11
* CC_GFX_BACKEND_GL1 - OpenGL 1.2/1.5
* CC_GFX_BACKEND_GL2 - OpenGL 2 (shaders)
The OpenGL backend can be further customised:
* CC_BUILD_GL11 (must be using CC_GFX_BACKEND_GL1)
* CC_BUILD_GLES (must be using CC_GFX_BACKEND_GL2)
### OpenGL context backends
* CC_BUILD_EGL
* CC_BUILD_WGL
### HTTP backends (`CC_NET_BACKEND`)
* CC_NET_BACKEND_BUILTIN - custom HTTP client
* CC_NET_BACKEND_LIBCURL
* CC_BUILD_CFNETWORK
### SSL backends (`CC_SSL_BACKEND`)
* CC_SSL_BACKEND_NONE
* CC_SSL_BACKEND_BEARSSL
* CC_SSL_BACKEND_SCHANNEL
### Window backends (`CC_WIN_BACKEND`)
* CC_WIN_BACKEND_TERMINAL
* CC_WIN_BACKEND_SDL2
* CC_WIN_BACKEND_SDL3
* CC_WIN_BACKEND_X11
* CC_WIN_BACKEND_WIN32
### Audio backends (`CC_AUD_BACKEND`)
* CC_AUD_BACKEND_OPENAL
* CC_AUD_BACKEND_WINMM
* CC_AUD_BACKEND_OPENSLES
### Platform backends
* CC_BUILD_POSIX
* CC_BUILD_WIN
TODO fill in rest

View File

@ -1,14 +1,14 @@
This document details how to compile a basic plugin in Visual Studio, MinGW, or GCC/Clang.
This document details how to compile a basic plugin in Visual Studio, MinGW, or GCC.
To find the functions and variables available for use in plugins, look for `CC_API`/`CC_VAR` in the .h files.
To find the functions and variables available for use in plugins, look for CC_API/CC_VAR in the .h files.
[Source code of some actual plugins](https://github.com/ClassiCube/ClassiCube-Plugins/)
[Source code of some actual plugins](https://github.com/UnknownShadow200/ClassiCube-Plugins/)
### Setup
You need to download and install either Visual Studio, MinGW, or GCC/Clang.
You need to download and install either Visual Studio, MinGW, or GCC.
*Note: MinGW/GCC/Clang are relatively small, while Visual Studio is gigabytes in size.
*Note: MinGW/GCC are relatively small, while Visual Studio is gigabytes in size.
If you're just trying to compile a plugin on Windows you might want to use MinGW. See main readme.*
I assume your directory is structured like this:
@ -16,11 +16,10 @@ I assume your directory is structured like this:
src/...
TestPlugin.c
```
Or in other words, in a directory somewhere, you have a file named `TestPlugin.c`, and then a sub-directory named `src` which contains the game's source code.
Or in other words, in a directory somewhere, you have a file named ```TestPlugin.c```, and then a sub-directory named ```src``` which contains the game's source code.
### Basic plugin
```C
#include "src/PluginAPI.h"
#include "src/Chat.h"
#include "src/Game.h"
#include "src/String.h"
@ -30,22 +29,56 @@ static void TestPlugin_Init(void) {
Chat_Add(&msg);
}
PLUGIN_EXPORT int Plugin_ApiVersion = 1;
PLUGIN_EXPORT struct IGameComponent Plugin_Component = { TestPlugin_Init };
int Plugin_ApiVersion = 1;
struct IGameComponent Plugin_Component = { TestPlugin_Init };
```
Here's a basic plugin that shows "Hello world" in chat when the game starts.
Here's the idea for a basic plugin that shows "Hello world" in chat when the game starts. Alas, this won't compile...
Note that `src/PluginAPI.h` must always be included as the first header.
### Basic plugin boilerplate
```C
#ifdef _WIN32
#define CC_API __declspec(dllimport)
#define CC_VAR __declspec(dllimport)
#define EXPORT __declspec(dllexport)
#else
#define CC_API
#define CC_VAR
#define EXPORT __attribute__((visibility("default")))
#endif
#include "src/Chat.h"
#include "src/Game.h"
#include "src/String.h"
static void TestPlugin_Init(void) {
cc_string msg = String_FromConst("Hello world!");
Chat_Add(&msg);
}
EXPORT int Plugin_ApiVersion = 1;
EXPORT struct IGameComponent Plugin_Component = { TestPlugin_Init };
```
With this boilerplate, we're ready to compile the plugin.
All plugins require this boilerplate, so feel free to copy and paste it.
---
### Writing plugins in C++
When including headers from ClassiCube, they **must** be surrounded with `extern "C"`, i.e.
```C
extern "C" {
#include "src/Chat.h"
#include "src/Game.h"
#include "src/String.h"
}
```
Otherwise you will get obscure `Undefined reference` errors when compiling.
Exported plugin functions **must** be surrounded with `extern "C"`, i.e.
```C
extern "C" {
PLUGIN_EXPORT int Plugin_ApiVersion = 1;
PLUGIN_EXPORT struct IGameComponent Plugin_Component = { TestPlugin_Init };
EXPORT int Plugin_ApiVersion = 1;
EXPORT struct IGameComponent Plugin_Component = { TestPlugin_Init };
}
```
Otherwise your plugin will not load. (you'll see `error getting plugin version` in-game)
@ -79,64 +112,50 @@ Plugin compilation instructions differs depending on the compiler and operating
## Compiling - Linux
### Using gcc or clang
#### Compiling
`cc TestPlugin.c -o TestPlugin.so -shared -fPIC`
```cc TestPlugin.c -o TestPlugin.so -shared -fPIC```
Then put `TestPlugin.so` into your game's `plugins` folder. Done.
Then put ```TestPlugin.so``` into your game's ```plugins``` folder. Done.
### Cross compiling for Windows 32 bit using mingw-w64
#### Setup
1) Create `ClassiCube.exe` by either:
1) Compiling the game, see `Cross compiling for windows (32 bit)` in [main readme](/readme.md#cross-compiling-for-windows-32-bit)
2) Downloading 32 bit ClassiCube from https://www.classicube.net/download/#dl-win
2) Install the `mingw-w64-tools` package (if it isn't already)
3) Generate the list of exported symbols from `ClassiCube.exe` by running:
* `gendef ClassiCube.exe`
4) Create a linkable library from the exported symbols list by running:
* `i686-w64-mingw32-dlltool -d ClassiCube.def -l libClassiCube.a -D ClassiCube.exe`
1) Compile the game, see ```Cross compiling for windows``` in main readme
2) Rename compiled executable to ClassiCube.exe
3) Install the ```mingw-w64-tools``` package
TODO: this also works for mingw. clean this up.
TODO: also document alternate method of compiling the game using --out-implib
#### Compiling
`i686-w64-mingw32-gcc TestPlugin.c -o TestPlugin.dll -s -shared -L . -lClassiCube`
First, generate list of exported symbols:
Then put `TestPlugin.dll` into your game's `plugins` folder. Done.
```gendef src/ClassiCube.exe```
Next create a linkable library:
```i686-w64-mingw32-dlltool -d ClassiCube.def -l libClassiCube.a -D ClassiCube.exe```
Finally compile the plugin:
```i686-w64-mingw32-gcc TestPlugin.c -o TestPlugin.dll -s -shared -L . -lClassiCube```
Then put ```TestPlugin.dll``` into your game's ```plugins``` folder. Done.
### Cross compiling for Windows 64 bit using mingw-w64
#### Setup
1) Create `ClassiCube.exe` by either:
1) Compiling the game, see `Cross compiling for windows (64 bit)` in [main readme](/readme.md#cross-compiling-for-windows-64-bit)
2) Downloading 64 bit ClassiCube from https://www.classicube.net/download/#dl-win
2) Install the `mingw-w64-tools` package (if it isn't already)
3) Generate the list of exported symbols from `ClassiCube.exe` by running:
* `gendef ClassiCube.exe`
4) Create a linkable library from the exported symbols list by running:
* `x86_64-w64-mingw32-dlltool -d ClassiCube.def -l libClassiCube.a -D ClassiCube.exe`
TODO: also document alternate method of compiling the game using --out-implib
#### Compiling
`x86_64-w64-mingw32-gcc TestPlugin.c -o TestPlugin.dll -s -shared -L . -lClassiCube`
Then put `TestPlugin.dll` into your game's `plugins` folder. Done.
Repeat the steps of *Cross compiling for Windows 32 bit*, but replace ```i686-w64-mingw32``` with ```x86_64-w64-mingw32```
## Compiling - macOS
### Using gcc or clang
#### Compiling
`cc TestPlugin.c -o TestPlugin.dylib -undefined dynamic_lookup`
```cc TestPlugin.c -o TestPlugin.dylib -undefined dynamic_lookup```
Then put `TestPlugin.dylib` into your game's `plugins` folder. Done.
Then put ```TestPlugin.dylib``` into your game's ```plugins``` folder. Done.
## Compiling - Windows
@ -145,7 +164,7 @@ TODO more detailed when I have some more time...
#### Setup
1) Compile the game, see `Compiling - Windows > using Visual Studio` in main readme
1) Compile the game, see ```Cross compiling for windows``` in main readme
2) Find the `ClassiCube.lib` that was generated when compiling the game. Usually it is in either `src\x64\Debug` or `src\x86\Debug`.
3) Add a new `Empty Project` to the ClassiCube solution, then add the plugin .c files to it
@ -158,14 +177,14 @@ The simplest way of linking to the `.lib` file is simply adding the following co
```C
#ifdef _MSC_VER
#ifdef _WIN64
#pragma comment(lib, "[GAME SRC FOLDER]/x64/Debug/ClassiCube.lib")
#pragma comment(lib, "[GAME SOURCE]/x64/Debug/ClassiCube.lib")
#else
#pragma comment(lib, "[GAME SRC FOLDER]/x86/Debug/ClassiCube.lib")
#pragma comment(lib, "[GAME SOURCE]/x86/Debug/ClassiCube.lib")
#endif
#endif
```
replacing `[GAME SRC FOLDER]` with the full path of `src` folder (e.g. `C:/Dev/ClassiCube/src`)
replacing `[GAME SOURCE]` with the full path of `src` folder (e.g. `C:/Dev/ClassiCube/src`)
#### Configuration - alternative #2
@ -184,46 +203,33 @@ TODO: may need to configure include directories
#### Compiling
Build the project. There should be a line in the build output that tells you where you can find the .dll file like this:
`
```
Project1.vcxproj -> C:\classicube-dev\testplugin\src\x64\Debug\TestPlugin.dll
`
```
Then put `TestPlugin.dll` into your game's `plugins` folder. Done.
Then put ```TestPlugin.dll``` into your game's ```plugins``` folder. Done.
### Using mingw-w64
#### Setup
1) Create `ClassiCube.exe` by either:
1) Compiling the game, see `Compiling for windows (MinGW-w64)` in [main readme](/readme.md#using-mingw-w64)
2) Downloading ClassiCube from https://www.classicube.net/download/#dl-win
2) Generate the list of exported symbols in `ClassiCube.exe` by running:
* `gendef ClassiCube.exe`
3) Create a linkable library from the exported symbols list by running:
* `dlltool -d ClassiCube.def -l libClassiCube.a -D ClassiCube.exe`
Generate the list of exported symbols of `ClassiCube.exe`
```gendef src/ClassiCube.exe```
Next create a linkable library from the exported symbols list:
```dlltool -d ClassiCube.def -l libClassiCube.a -D ClassiCube.exe```
#### Compiling
`gcc TestPlugin.c -o TestPlugin.dll -s -shared -L . -lClassiCube`
```gcc TestPlugin.c -o TestPlugin.dll -s -shared -L . -lClassiCube```
Then put `TestPlugin.dll` into your game's `plugins` folder. Done.
Then put ```TestPlugin.dll``` into your game's ```plugins``` folder. Done.
## Notes for compiling for Windows
## Compiling - other notes
### Ensuring your plugin works when the ClassiCube exe isn't named ClassiCube.exe
##### Ultra small dlls - mingw
If you **ONLY** use code from the game (no external libraries and no C standard library functions), add ```-nostartfiles -Wl,--entry=0``` to the compile flags
If you follow the prior compilation instructions, the compiled DLL will have a runtime dependancy on `ClassiCube.exe`
However, this means that if the executable is e.g. named `ClassiCube (2).exe` instead. the plugin DLL will fail to load
To avoid this problem, you must
1) Stop linking to `ClassiCube` (e.g. for `MinGW`, remove the ` -L . -lClassiCube`)
2) Load all functions and variables exported from ClassiCube via `GetProcAddress` instead
This is somewhat tedious to do - see [here](https://github.com/ClassiCube/ClassiCube-Plugins/) for some examples of plugins which do this
#### Compiling ultra small plugin DLLs - MinGW
If you **ONLY** use code from the game (no external libraries and no C standard library functions):
* You can add `-nostartfiles -Wl,--entry=0` to the compile flags to reduce the DLL size (e.g from 11 to 4 kb)
This isn't necessary to do though, and plugin DLLs work completely fine without doing this.
This step isn't necessary, the dll works fine without it. But it does reduce the size of the dll from 11 to 4 kb.

View File

@ -1,23 +1,69 @@
Although most of the code is platform-independent, some per-platform functionality is required.
By default `Core.h` tries to automatically define appropriate backends for your system. Define ```CC_BUILD_MANUAL``` to disable this.
Note: Updating doesn't work properly in Windows 95 or Windows 98
By default I try to automatically define appropriate backends for your OS in Core.h. Define ```CC_BUILD_MANUAL``` to disable this.
## Before you start
* IEEE floating-point support is required. (Can be emulated in software, but will affect performance)
* The `int` data type must be 32-bits.
* 32-bit addressing (or more) is required.
* IEEE floating support is required.
* int must be 32-bits. 32-bit addressing (or more) is required.
* Support for 8/16/32/64 integer types is required. (your compiler must support 64-bit arithmetic)
* At least around 2 MB of RAM is required at a minimum
* At least 128 kb for main thread stack size
In summary, the codebase can theroetically be ported to any modern-ish hardware, but not stuff like a UNIVAC machine, the SuperFX chip on the SNES, or an 8-bit microcontroller.
In other words, the codebase can theroetically be ported to any modern-ish hardware, but not stuff like a UNIVAC machine, the SuperFX chip on the SNES, or an 8-bit microcontroller.
## Supported platforms
**Note:** Some of these machines are just virtual machines. Should still work on real hardware though.
#### Tier 1 support
These platforms are regularly tested on and have executables automatically compiled for. (see buildbot.sh)
|Platform|Machine|Notes|
|--------|-------|-----|
|Windows x86/x64 | Windows 7 |
|macOS x86/x64 | macOS 10.12 |
|Linux x86/x64 | Xubuntu 14 |
|Web client | Chrome |
#### Tier 2 support
These machines are far less frequently tested on, but are otherwise same as tier 1 support.
|Platform|Machine|Notes|
|--------|-------|-----|
|Windows x86 | Windows 2000 |
|Windows x86 | 98 + KernelEX | Updating doesn't work
|Windows x64 | Windows 10 |
|ReactOS | ReactOS |
|Linux x64 | Arch linux |
|Linux x64 | Linux Mint |
|Linux x64 | Kubuntu |
|Linux x64 | Debian |
|Linux x64 | Fedora |
|Linux x86/x64 | Lubuntu |
|Web client | Firefox |
|Web client | Safari |
|Web client | Edge | Cursor doesn't seem to disappear
#### Tier 3 support
The game has been compiled and run on these platforms before. It may or may not still compile for them.
I don't really test these platforms at all, only when I suspect some changes to the code might impact them.
|Platform|Machine|Notes|
|--------|-------|-----|
|macOS x86 | macOS 10.4 |
|FreeBSD x86 | FreeBSD | x64 should work too |
|NetBSD x86 | NetBSD | x64 should work too |
|OpenBSD x86 | OpenBSD | x64 should work too |
|Solaris x86 | OpenIndiana | x64 should work too |
|macOS PPC | macOS 10.3 | PPC64 completely untested |
|Linux PPC | Debian | Issues with colour channels incorrectly swapped? |
|Linux ARM | Raspberry pi | ARM64 should work too |
|Linux SPARC | Debian | Didn't really work due to lack of 24-bit colours |
|Linux Alpha | Debian |
|HaikuOS | Nightly | Requires SDL for windowing
## Porting
Listed below are the requirements for implementing each platform-dependent file.<br>
When porting to other platforms, you should try to leverage existing backends when possible.<br>
Listed below are the requirements for implementing each platform-dependent file.
You should try to take advantage of existing backends when porting to other platforms.
Only cross platform backends are listed below.
### Platform
@ -45,8 +91,8 @@ Create a window, show a dialog window, set window contents, keyboard/mouse input
Also monitor size, clipboard, cursor, raw relative mouse movement (optional)
Define:
- ```DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 ``` - Use X11/XLib (unix-ish) (glX)
- ```DEFAULT_WIN_BACKEND CC_WIN_BACKEND_SDL2``` - Use SDL2 library (SDL2)
- ```CC_BUILD_X11``` - Use X11/XLib (unix-ish) (glX)
- ```CC_BUILD_SDL``` - Use SDL library (SDL)
If using OpenGL, also OpenGL context management
@ -64,29 +110,23 @@ posix note: Register access is highly dependent on OS and architecture.
Play multiple audio streams with varying sample rates
Define:
- ```DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL``` - use OpenAL
- ```CC_BUILD_OPENAL``` - use OpenAL
- ```CC_BUILD_NOAUDIO``` - stub audio implementation (silent)
### 3D Graphics
Texturing, depth buffer, alpha, etc (See Graphics.h for full list)
Define:
- ```DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1``` - Use legacy OpenGL (1.5/1.2 + ARB_VERTEX_BUFFER_OBJECT)
- ```CC_BUILD_GL11``` - Use OpenGL 1.1 features only
- ```DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL2``` - Use modern OpenGL shaders
- ```CC_BUILD_GLES``` - Makes these shaders compatible with OpenGL ES
- ```DEFAULT_GFX_BACKEND CC_GFX_BACKEND_SOFTGPU``` - Use built in software rasteriser
- ```CC_BUILD_D3D9``` - Use Direct3D9
- ```CC_BUILD_GL``` - Use OpenGL (1.5/1.2 + ARB_VERTEX_BUFFER_OBJECT)
- ```CC_BUILD_GL11``` - Use OpenGL 1.1 features only
- ```CC_BUILD_GLMODERN``` - Use modern OpenGL shaders
- ```CC_BUILD_GLES``` - Makes these shaders compatible with OpenGL ES
### HTTP
### Http
HTTP, HTTPS, and setting request/getting response headers
Define:
- ```DEFAULT_NET_BACKEND CC_NET_BACKEND_BUILTIN``` - use built in simple HTTP backend
- ```CC_BUILD_CURL``` - use libcurl for http
Supporting connection reuse is highly recommended. (but not required)
### SSL
SSL and TLS support, plus basic certificate validation
Define:
- ```DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL``` - use BearSSL for SSL/TLS

View File

@ -3,7 +3,7 @@
ClassiCube uses a custom string type rather than the standard C `char*` string in most places
ClassiCube strings (`cc_string`) are a struct with the following fields:
- `buffer` -> Pointer to 8 bit characters (unsigned [code page 437 indices](https://en.wikipedia.org/wiki/Code_page_437#Character_set))
- `buffer` -> Pointer to 8 bit characters (unsigned code page 437 indices)
- `length` -> Number of characters currently used
- `capacity` -> Maximum number of characters (i.e buffer size)
@ -20,29 +20,6 @@ Some general guidelines to keep in mind when it comes to `cc_string` strings:
- Strings are not garbage collected or reference counted<br>
(i.e. you are responsible for managing the lifetime of strings)
## Usage examples
Initialisating a string from readonly text:
```C
cc_string str = String_FromConst("ABC");
```
Initialising a string from temporary memory on the stack:
```C
// str will be able to store at most 200 characters in it
char strBuffer[200];
cc_string str = String_FromArray(strBuffer);
```
Initialising a string from persistent memory on the heap:
```C
// str will be able to store at most 200 characters in it
char* str = Mem_Alloc(1, 200, "String buffer");
cc_string str = String_Init(str, 0, 200);
```
# Converting to/from other string representations
## C String conversion
### C string -> cc_string
@ -102,42 +79,37 @@ The following functions are provided to convert `cc_string` strings into operati
### cc_string -> Windows string
`Platform_EncodeString` converts a `cc_string` into a null terminated `WCHAR` and `CHAR` string
`Platform_EncodeUtf16` converts a `cc_string` into a null terminated `WCHAR` string
#### Example
```C
void SetWorkingDir(cc_string* title) {
cc_winstring str;
Platform_EncodeUtf16(&str, title);
SetCurrentDirectoryW(str.uni);
// it's recommended that you DON'T use the ansi format whenever possible
//SetCurrentDirectoryA(str.ansi);
WCHAR buffer[NATIVE_STR_LEN];
Platform_EncodeUtf16(buffer, title);
SetCurrentDirectoryW(buffer);
}
```
### cc_string -> UTF8 string
### cc_string -> Unix string
`String_EncodeUtf8` converts a `cc_string` into a null terminated UTF8-encoded `char*` string
`Platform_EncodeUtf8` converts a `cc_string` into a null terminated UTF8-encoded `char*` string
#### Example
```C
void SetWorkingDir(cc_string* title) {
char buffer[NATIVE_STR_LEN];
String_EncodeUtf8(buffer, title);
Platform_EncodeUtf8(buffer, title);
chdir(buffer);
}
```
# API
## API
I'm lazy so I will just link to [String.h](/src/String.h)
If you'd rather I provided a more detailed reference here, please let me know.
TODO
# Comparisons to other string implementations
# Extra details
## C comparison
@ -227,103 +199,11 @@ string::compare -> String_Compare
std::sprintf -> String_Format1/2/3/4
```
# Detailed lifetime examples
Managing the lifetime of strings is important, as not properly managing them can cause issues.
## lifetime examples
For example, consider the following function:
```C
const cc_string* GetString(void);
Stack allocated returning example
void PrintSomething(void) {
cc_string* str = GetString();
// .. other code ..
Chat_Add(str);
}
```
Mem_Alloc/Mem_Free and function example
Without knowing the lifetime of the string returned from `GetString`, using it might either:
* Work just fine
* Sometimes work fine
* Cause a subtle issue
* Cause a major problem
ptodo rearrange
### Constant string return example
```C
const cc_string* GetString(void) {
static cc_string str = String_FromConst("ABC");
return &str;
}
```
This will work fine - as long as the caller does not modify the returned string at all
### Stack allocated string return example
```C
const cc_string* GetString(void) {
char strBuffer[1024];
cc_string str = String_FromArray(strBuffer);
String_AppendConst(&str, "ABC");
return &str;
}
```
This will **almost certainly cause problems** - after `GetString` returns, the contents of both `str` and `strBuffer` may be changed to arbitary values (as once `GetString` returns, their contents are then eligible to be overwritten by other stack allocated variables)
As a general rule, you should **NEVER** return a string allocated on the stack
### Dynamically allocated string return example
```C
const cc_string* GetString(void) {
char* buffer = Mem_Alloc(1024, 1, "string buffer");
cc_string* str = Mem_Alloc(1, sizeof(cc_string), "string");
*str = String_Init(buffer, 0, 1024);
String_AppendConst(str, "ABC");
return str;
}
```
This will work fine - however, now you also need to remember to `Mem_Free` both the string and its buffer to avoid a memory leak
As a general rule, you should avoid returning a dynamically allocated string
### UNSAFE mutable string return example
```C
char global_buffer[1024];
cc_string global_str = String_FromArray(global_buffer);
const cc_string* GetString(void) {
return &global_str;
}
```
Depending on what functions are called in-between `GetString` and `Chat_Add`, `global_str` or its contents may be modified - which can result in an unexpected value being displayed in chat
This potential issue is not just theoretical - it has actually resulted in several real bugs in ClassiCube itself
As a general rule, for unsafe functions returning a string that may be mutated behind your back, you should try to maintain a reference to the string for as short of time as possible
### Reducing string lifetime issues
In general, for functions that produce strings, you should try to leave the responsibility of managing the string's lifetime up to the calling function to avoid these pitfalls
The example from before could instead be rewritten like so:
```C
void GetString(cc_string* str);
void PrintSomething(void) {
char strBuffer[256];
cc_string str = String_InitArray(strBuffer);
GetString(&str);
// .. other code ..
Chat_Add(&str);
}
```
UNSAFE and mutating characters example

View File

@ -6,29 +6,29 @@
* Private variables don't really have a consistent style.
### Types
* Explicit integer size typedefs are provided in `Core.h` for when needed. Otherwise just use int.
* Explicit integer typedefs are provided in ```Core.h``` for when needed. Otherwise just use int.
* A few common simple structs are typedef-ed, but are rarely otherwise.
* `cc_bool` is an alias for 8 bit unsigned integer
* `PackedCol` field order differs depending on the underlying 3D graphics API
* ```cc_bool``` is an alias for 8 bit unsigned integer
* ```PackedCol``` field order differs depending on the underlying 3D graphics API
Note: The explicit integer size typedefs may not have been defined if you aren't compiling using GCC/Clang/MSVC, so for other compilers you may need to add them into `Core.h`
I may not have defined the appropriate types for your compiler, so you may need to modify ```Core.h```
### Strings
A custom string type (`cc_string`) is used rather than `char*` strings in most places (see [strings](strings.md) page for more details)
A custom string type (`cc_string`) is used rather than `char*` strings in most places (see [strings](doc/strings.md) page for more details)
*Note: Several functions will take raw `char*` for performance, but this is not encouraged*
*Note: Several functions will take raw ```char*``` for performance, but this is not encouraged*
#### String arguments
String arguments are annotated to indicate storage and readonly requirements. These are:
- `const cc_string*` - String is not modified at all
- `cc_string*` - Characters in string may be modified
- `STRING_REF` - Macro annotation indicating a **reference is kept to the characters**
- ```const cc_string*``` - String is not modified at all
- ```cc_string*``` - Characters in string may be modified
- ```STRING_REF``` - Macro annotation indicating a **reference is kept to the characters**
To make it extra clear, functions with `STRING_REF` arguments usually also have `_UNSAFE_` as part of their name.
To make it extra clear, functions with ```STRING_REF``` arguments usually also have ```_UNSAFE_``` as part of their name.
For example, consider the function `cc_string Substring_UNSAFE(STRING_REF const cc_string* str, length)`
For example, consider the function ```cc_string Substring_UNSAFE(STRING_REF const cc_string* str, length)```
The *input string* is not modified at all. However, the characters of the *returned string* points to the characters of the *input string*, so modifying the characters in the *input string* also modifies the *returned string*.
In general, use of `const cc_string*` is preferred when possible, and `STRING_REF` as little as possible.
In general, use of ```const String*``` is preferred when possible, and ```STRING_REF``` as little as possible.

View File

@ -0,0 +1,785 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
9A62ADF5286D906F00E5E3DE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A62ADF4286D906F00E5E3DE /* Assets.xcassets */; };
9A89D4F227F802F600FF3F80 /* LWidgets.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D37827F802F500FF3F80 /* LWidgets.c */; };
9A89D4F327F802F600FF3F80 /* Graphics_GL2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D37A27F802F500FF3F80 /* Graphics_GL2.c */; };
9A89D4F427F802F600FF3F80 /* Vorbis.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D37C27F802F500FF3F80 /* Vorbis.c */; };
9A89D4F527F802F600FF3F80 /* _ftsynth.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D37D27F802F500FF3F80 /* _ftsynth.c */; };
9A89D4F627F802F600FF3F80 /* Platform_Android.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D37F27F802F500FF3F80 /* Platform_Android.c */; };
9A89D4F727F802F600FF3F80 /* Game.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38027F802F500FF3F80 /* Game.c */; };
9A89D4F827F802F600FF3F80 /* Window_Android.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38127F802F500FF3F80 /* Window_Android.c */; };
9A89D4F927F802F600FF3F80 /* Http_Worker.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38227F802F500FF3F80 /* Http_Worker.c */; };
9A89D4FB27F802F600FF3F80 /* TexturePack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38427F802F500FF3F80 /* TexturePack.c */; };
9A89D4FC27F802F600FF3F80 /* Graphics_D3D9.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38527F802F500FF3F80 /* Graphics_D3D9.c */; };
9A89D4FD27F802F600FF3F80 /* ExtMath.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38627F802F500FF3F80 /* ExtMath.c */; };
9A89D4FE27F802F600FF3F80 /* Inventory.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38B27F802F500FF3F80 /* Inventory.c */; };
9A89D4FF27F802F600FF3F80 /* Gui.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38C27F802F500FF3F80 /* Gui.c */; };
9A89D50027F802F600FF3F80 /* _truetype.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38E27F802F500FF3F80 /* _truetype.c */; };
9A89D50127F802F600FF3F80 /* LBackend.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38F27F802F500FF3F80 /* LBackend.c */; };
9A89D50227F802F600FF3F80 /* Block.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39127F802F500FF3F80 /* Block.c */; };
9A89D50327F802F600FF3F80 /* Platform_Posix.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39227F802F500FF3F80 /* Platform_Posix.c */; };
9A89D50427F802F600FF3F80 /* Model.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39627F802F500FF3F80 /* Model.c */; };
9A89D50527F802F600FF3F80 /* LScreens.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39827F802F500FF3F80 /* LScreens.c */; };
9A89D50627F802F600FF3F80 /* Builder.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39927F802F500FF3F80 /* Builder.c */; };
9A89D50727F802F600FF3F80 /* Particle.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39B27F802F500FF3F80 /* Particle.c */; };
9A89D50827F802F600FF3F80 /* PackedCol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39C27F802F500FF3F80 /* PackedCol.c */; };
9A89D54F27F802F600FF3F80 /* Deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47227F802F500FF3F80 /* Deflate.c */; };
9A89D55027F802F600FF3F80 /* Entity.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47427F802F500FF3F80 /* Entity.c */; };
9A89D55127F802F600FF3F80 /* IsometricDrawer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47527F802F500FF3F80 /* IsometricDrawer.c */; };
9A89D55227F802F600FF3F80 /* Logger.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47627F802F500FF3F80 /* Logger.c */; };
9A89D55327F802F600FF3F80 /* _psaux.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47727F802F500FF3F80 /* _psaux.c */; };
9A89D55427F802F600FF3F80 /* Bitmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47827F802F500FF3F80 /* Bitmap.c */; };
9A89D55527F802F600FF3F80 /* HeldBlockRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47927F802F500FF3F80 /* HeldBlockRenderer.c */; };
9A89D55627F802F600FF3F80 /* EnvRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47A27F802F500FF3F80 /* EnvRenderer.c */; };
9A89D55727F802F600FF3F80 /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47B27F802F500FF3F80 /* Makefile */; };
9A89D55827F802F600FF3F80 /* Graphics_GL1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47E27F802F500FF3F80 /* Graphics_GL1.c */; };
9A89D55927F802F600FF3F80 /* interop_ios.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47F27F802F600FF3F80 /* interop_ios.m */; };
9A89D55A27F802F600FF3F80 /* Program.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48127F802F600FF3F80 /* Program.c */; };
9A89D55B27F802F600FF3F80 /* _type1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48227F802F600FF3F80 /* _type1.c */; };
9A89D55C27F802F600FF3F80 /* Animations.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48527F802F600FF3F80 /* Animations.c */; };
9A89D55D27F802F600FF3F80 /* _psmodule.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48627F802F600FF3F80 /* _psmodule.c */; };
9A89D55E27F802F600FF3F80 /* World.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48727F802F600FF3F80 /* World.c */; };
9A89D55F27F802F600FF3F80 /* _sfnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48827F802F600FF3F80 /* _sfnt.c */; };
9A89D56027F802F600FF3F80 /* _ftbitmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48A27F802F600FF3F80 /* _ftbitmap.c */; };
9A89D56127F802F600FF3F80 /* Menus.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48B27F802F600FF3F80 /* Menus.c */; };
9A89D56227F802F600FF3F80 /* _ftbase.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48C27F802F600FF3F80 /* _ftbase.c */; };
9A89D56327F802F600FF3F80 /* _autofit.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48D27F802F600FF3F80 /* _autofit.c */; };
9A89D56427F802F600FF3F80 /* String.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49227F802F600FF3F80 /* String.c */; };
9A89D56527F802F600FF3F80 /* Generator.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49427F802F600FF3F80 /* Generator.c */; };
9A89D56627F802F600FF3F80 /* Drawer2D.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49527F802F600FF3F80 /* Drawer2D.c */; };
9A89D56727F802F600FF3F80 /* Drawer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49827F802F600FF3F80 /* Drawer.c */; };
9A89D56827F802F600FF3F80 /* Lighting.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49927F802F600FF3F80 /* Lighting.c */; };
9A89D56927F802F600FF3F80 /* Window_Carbon.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49A27F802F600FF3F80 /* Window_Carbon.c */; };
9A89D56A27F802F600FF3F80 /* Physics.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49B27F802F600FF3F80 /* Physics.c */; };
9A89D56B27F802F600FF3F80 /* Server.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49E27F802F600FF3F80 /* Server.c */; };
9A89D56C27F802F600FF3F80 /* _ftinit.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4A027F802F600FF3F80 /* _ftinit.c */; };
9A89D56D27F802F600FF3F80 /* Window_X11.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4A127F802F600FF3F80 /* Window_X11.c */; };
9A89D56E27F802F600FF3F80 /* Platform_WinApi.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4A327F802F600FF3F80 /* Platform_WinApi.c */; };
9A89D56F27F802F600FF3F80 /* Input.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4A627F802F600FF3F80 /* Input.c */; };
9A89D57227F802F600FF3F80 /* Picking.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4AA27F802F600FF3F80 /* Picking.c */; };
9A89D57327F802F600FF3F80 /* Utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4AB27F802F600FF3F80 /* Utils.c */; };
9A89D57427F802F600FF3F80 /* MapRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4AE27F802F600FF3F80 /* MapRenderer.c */; };
9A89D57527F802F600FF3F80 /* AxisLinesRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4AF27F802F600FF3F80 /* AxisLinesRenderer.c */; };
9A89D57627F802F600FF3F80 /* _pshinter.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4B127F802F600FF3F80 /* _pshinter.c */; };
9A89D57827F802F600FF3F80 /* Protocol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4B327F802F600FF3F80 /* Protocol.c */; };
9A89D57927F802F600FF3F80 /* Event.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4B527F802F600FF3F80 /* Event.c */; };
9A89D57A27F802F600FF3F80 /* Graphics_D3D11.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4B727F802F600FF3F80 /* Graphics_D3D11.c */; };
9A89D57B27F802F600FF3F80 /* _ftglyph.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4BB27F802F600FF3F80 /* _ftglyph.c */; };
9A89D57C27F802F600FF3F80 /* Chat.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4BC27F802F600FF3F80 /* Chat.c */; };
9A89D57D27F802F600FF3F80 /* _smooth.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4BD27F802F600FF3F80 /* _smooth.c */; };
9A89D57E27F802F600FF3F80 /* Resources.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4BE27F802F600FF3F80 /* Resources.c */; };
9A89D57F27F802F600FF3F80 /* LWeb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4C427F802F600FF3F80 /* LWeb.c */; };
9A89D58027F802F600FF3F80 /* Formats.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4C627F802F600FF3F80 /* Formats.c */; };
9A89D58127F802F600FF3F80 /* PickedPosRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4C927F802F600FF3F80 /* PickedPosRenderer.c */; };
9A89D58327F802F600FF3F80 /* EntityComponents.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4CC27F802F600FF3F80 /* EntityComponents.c */; };
9A89D58427F802F600FF3F80 /* Camera.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4CF27F802F600FF3F80 /* Camera.c */; };
9A89D58527F802F600FF3F80 /* Platform_Web.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4D027F802F600FF3F80 /* Platform_Web.c */; };
9A89D58627F802F600FF3F80 /* Screens.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4D127F802F600FF3F80 /* Screens.c */; };
9A89D58727F802F600FF3F80 /* SelectionBox.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4D227F802F600FF3F80 /* SelectionBox.c */; };
9A89D58927F802F600FF3F80 /* _cff.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4DA27F802F600FF3F80 /* _cff.c */; };
9A89D58A27F802F600FF3F80 /* BlockPhysics.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4DB27F802F600FF3F80 /* BlockPhysics.c */; };
9A89D58B27F802F600FF3F80 /* Launcher.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4DD27F802F600FF3F80 /* Launcher.c */; };
9A89D58C27F802F600FF3F80 /* Window_Win.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4DF27F802F600FF3F80 /* Window_Win.c */; };
9A89D58D27F802F600FF3F80 /* Options.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E327F802F600FF3F80 /* Options.c */; };
9A89D58E27F802F600FF3F80 /* Window_SDL.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E427F802F600FF3F80 /* Window_SDL.c */; };
9A89D58F27F802F600FF3F80 /* Audio.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E727F802F600FF3F80 /* Audio.c */; };
9A89D59027F802F600FF3F80 /* Stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E827F802F600FF3F80 /* Stream.c */; };
9A89D59127F802F600FF3F80 /* Vectors.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E927F802F600FF3F80 /* Vectors.c */; };
9A89D59227F802F600FF3F80 /* Http_Web.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4EB27F802F600FF3F80 /* Http_Web.c */; };
9A89D59327F802F600FF3F80 /* Window_Web.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4EC27F802F600FF3F80 /* Window_Web.c */; };
9A89D59427F802F600FF3F80 /* Widgets.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4EE27F802F600FF3F80 /* Widgets.c */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
9A62ADF4286D906F00E5E3DE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = ClassiCube/Assets.xcassets; sourceTree = "<group>"; };
9A89D35727F802B100FF3F80 /* ClassiCube.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ClassiCube.app; sourceTree = BUILT_PRODUCTS_DIR; };
9A89D36827F802B400FF3F80 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9A89D37827F802F500FF3F80 /* LWidgets.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LWidgets.c; sourceTree = "<group>"; };
9A89D37927F802F500FF3F80 /* AxisLinesRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AxisLinesRenderer.h; sourceTree = "<group>"; };
9A89D37A27F802F500FF3F80 /* Graphics_GL2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Graphics_GL2.c; sourceTree = "<group>"; };
9A89D37B27F802F500FF3F80 /* MapRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MapRenderer.h; sourceTree = "<group>"; };
9A89D37C27F802F500FF3F80 /* Vorbis.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Vorbis.c; sourceTree = "<group>"; };
9A89D37D27F802F500FF3F80 /* _ftsynth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftsynth.c; sourceTree = "<group>"; };
9A89D37E27F802F500FF3F80 /* Protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Protocol.h; sourceTree = "<group>"; };
9A89D37F27F802F500FF3F80 /* Platform_Android.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Platform_Android.c; sourceTree = "<group>"; };
9A89D38027F802F500FF3F80 /* Game.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Game.c; sourceTree = "<group>"; };
9A89D38127F802F500FF3F80 /* Window_Android.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Window_Android.c; sourceTree = "<group>"; };
9A89D38227F802F500FF3F80 /* Http_Worker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Http_Worker.c; sourceTree = "<group>"; };
9A89D38427F802F500FF3F80 /* TexturePack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = TexturePack.c; sourceTree = "<group>"; };
9A89D38527F802F500FF3F80 /* Graphics_D3D9.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Graphics_D3D9.c; sourceTree = "<group>"; };
9A89D38627F802F500FF3F80 /* ExtMath.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ExtMath.c; sourceTree = "<group>"; };
9A89D38727F802F500FF3F80 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utils.h; sourceTree = "<group>"; };
9A89D38827F802F500FF3F80 /* Picking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Picking.h; sourceTree = "<group>"; };
9A89D38927F802F500FF3F80 /* Input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Input.h; sourceTree = "<group>"; };
9A89D38A27F802F500FF3F80 /* _HttpBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _HttpBase.h; sourceTree = "<group>"; };
9A89D38B27F802F500FF3F80 /* Inventory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Inventory.c; sourceTree = "<group>"; };
9A89D38C27F802F500FF3F80 /* Gui.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Gui.c; sourceTree = "<group>"; };
9A89D38D27F802F500FF3F80 /* Core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Core.h; sourceTree = "<group>"; };
9A89D38E27F802F500FF3F80 /* _truetype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _truetype.c; sourceTree = "<group>"; };
9A89D38F27F802F500FF3F80 /* LBackend.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LBackend.c; sourceTree = "<group>"; };
9A89D39027F802F500FF3F80 /* LWeb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LWeb.h; sourceTree = "<group>"; };
9A89D39127F802F500FF3F80 /* Block.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Block.c; sourceTree = "<group>"; };
9A89D39227F802F500FF3F80 /* Platform_Posix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Platform_Posix.c; sourceTree = "<group>"; };
9A89D39327F802F500FF3F80 /* Formats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Formats.h; sourceTree = "<group>"; };
9A89D39427F802F500FF3F80 /* Resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Resources.h; sourceTree = "<group>"; };
9A89D39527F802F500FF3F80 /* Chat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Chat.h; sourceTree = "<group>"; };
9A89D39627F802F500FF3F80 /* Model.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Model.c; sourceTree = "<group>"; };
9A89D39727F802F500FF3F80 /* Http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Http.h; sourceTree = "<group>"; };
9A89D39827F802F500FF3F80 /* LScreens.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LScreens.c; sourceTree = "<group>"; };
9A89D39927F802F500FF3F80 /* Builder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Builder.c; sourceTree = "<group>"; };
9A89D39A27F802F500FF3F80 /* _PlatformBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _PlatformBase.h; sourceTree = "<group>"; };
9A89D39B27F802F500FF3F80 /* Particle.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Particle.c; sourceTree = "<group>"; };
9A89D39C27F802F500FF3F80 /* PackedCol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PackedCol.c; sourceTree = "<group>"; };
9A89D47227F802F500FF3F80 /* Deflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Deflate.c; sourceTree = "<group>"; };
9A89D47327F802F500FF3F80 /* Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = "<group>"; };
9A89D47427F802F500FF3F80 /* Entity.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Entity.c; sourceTree = "<group>"; };
9A89D47527F802F500FF3F80 /* IsometricDrawer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = IsometricDrawer.c; sourceTree = "<group>"; };
9A89D47627F802F500FF3F80 /* Logger.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Logger.c; sourceTree = "<group>"; };
9A89D47727F802F500FF3F80 /* _psaux.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _psaux.c; sourceTree = "<group>"; };
9A89D47827F802F500FF3F80 /* Bitmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Bitmap.c; sourceTree = "<group>"; };
9A89D47927F802F500FF3F80 /* HeldBlockRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = HeldBlockRenderer.c; sourceTree = "<group>"; };
9A89D47A27F802F500FF3F80 /* EnvRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = EnvRenderer.c; sourceTree = "<group>"; };
9A89D47B27F802F500FF3F80 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
9A89D47C27F802F500FF3F80 /* Screens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Screens.h; sourceTree = "<group>"; };
9A89D47D27F802F500FF3F80 /* SelectionBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionBox.h; sourceTree = "<group>"; };
9A89D47E27F802F500FF3F80 /* Graphics_GL1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Graphics_GL1.c; sourceTree = "<group>"; };
9A89D47F27F802F600FF3F80 /* interop_ios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = interop_ios.m; sourceTree = "<group>"; };
9A89D48027F802F600FF3F80 /* Camera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Camera.h; sourceTree = "<group>"; };
9A89D48127F802F600FF3F80 /* Program.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Program.c; sourceTree = "<group>"; };
9A89D48227F802F600FF3F80 /* _type1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _type1.c; sourceTree = "<group>"; };
9A89D48327F802F600FF3F80 /* _GraphicsBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _GraphicsBase.h; sourceTree = "<group>"; };
9A89D48427F802F600FF3F80 /* EntityComponents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityComponents.h; sourceTree = "<group>"; };
9A89D48527F802F600FF3F80 /* Animations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Animations.c; sourceTree = "<group>"; };
9A89D48627F802F600FF3F80 /* _psmodule.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _psmodule.c; sourceTree = "<group>"; };
9A89D48727F802F600FF3F80 /* World.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = World.c; sourceTree = "<group>"; };
9A89D48827F802F600FF3F80 /* _sfnt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _sfnt.c; sourceTree = "<group>"; };
9A89D48927F802F600FF3F80 /* _WindowBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WindowBase.h; sourceTree = "<group>"; };
9A89D48A27F802F600FF3F80 /* _ftbitmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftbitmap.c; sourceTree = "<group>"; };
9A89D48B27F802F600FF3F80 /* Menus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Menus.c; sourceTree = "<group>"; };
9A89D48C27F802F600FF3F80 /* _ftbase.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftbase.c; sourceTree = "<group>"; };
9A89D48D27F802F600FF3F80 /* _autofit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _autofit.c; sourceTree = "<group>"; };
9A89D48E27F802F600FF3F80 /* PickedPosRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PickedPosRenderer.h; sourceTree = "<group>"; };
9A89D48F27F802F600FF3F80 /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = "<group>"; };
9A89D49027F802F600FF3F80 /* Errors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Errors.h; sourceTree = "<group>"; };
9A89D49127F802F600FF3F80 /* Widgets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Widgets.h; sourceTree = "<group>"; };
9A89D49227F802F600FF3F80 /* String.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = String.c; sourceTree = "<group>"; };
9A89D49327F802F600FF3F80 /* Audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Audio.h; sourceTree = "<group>"; };
9A89D49427F802F600FF3F80 /* Generator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Generator.c; sourceTree = "<group>"; };
9A89D49527F802F600FF3F80 /* Drawer2D.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Drawer2D.c; sourceTree = "<group>"; };
9A89D49627F802F600FF3F80 /* Vectors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vectors.h; sourceTree = "<group>"; };
9A89D49727F802F600FF3F80 /* Stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Stream.h; sourceTree = "<group>"; };
9A89D49827F802F600FF3F80 /* Drawer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Drawer.c; sourceTree = "<group>"; };
9A89D49927F802F600FF3F80 /* Lighting.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Lighting.c; sourceTree = "<group>"; };
9A89D49A27F802F600FF3F80 /* Window_Carbon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Window_Carbon.c; sourceTree = "<group>"; };
9A89D49B27F802F600FF3F80 /* Physics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Physics.c; sourceTree = "<group>"; };
9A89D49C27F802F600FF3F80 /* Options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Options.h; sourceTree = "<group>"; };
9A89D49D27F802F600FF3F80 /* BlockPhysics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockPhysics.h; sourceTree = "<group>"; };
9A89D49E27F802F600FF3F80 /* Server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Server.c; sourceTree = "<group>"; };
9A89D49F27F802F600FF3F80 /* Launcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Launcher.h; sourceTree = "<group>"; };
9A89D4A027F802F600FF3F80 /* _ftinit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftinit.c; sourceTree = "<group>"; };
9A89D4A127F802F600FF3F80 /* Window_X11.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Window_X11.c; sourceTree = "<group>"; };
9A89D4A227F802F600FF3F80 /* Inventory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Inventory.h; sourceTree = "<group>"; };
9A89D4A327F802F600FF3F80 /* Platform_WinApi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Platform_WinApi.c; sourceTree = "<group>"; };
9A89D4A427F802F600FF3F80 /* Gui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gui.h; sourceTree = "<group>"; };
9A89D4A527F802F600FF3F80 /* Constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = "<group>"; };
9A89D4A627F802F600FF3F80 /* Input.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Input.c; sourceTree = "<group>"; };
9A89D4A927F802F600FF3F80 /* Game.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Game.h; sourceTree = "<group>"; };
9A89D4AA27F802F600FF3F80 /* Picking.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Picking.c; sourceTree = "<group>"; };
9A89D4AB27F802F600FF3F80 /* Utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Utils.c; sourceTree = "<group>"; };
9A89D4AC27F802F600FF3F80 /* ExtMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExtMath.h; sourceTree = "<group>"; };
9A89D4AD27F802F600FF3F80 /* TexturePack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TexturePack.h; sourceTree = "<group>"; };
9A89D4AE27F802F600FF3F80 /* MapRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = MapRenderer.c; sourceTree = "<group>"; };
9A89D4AF27F802F600FF3F80 /* AxisLinesRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = AxisLinesRenderer.c; sourceTree = "<group>"; };
9A89D4B027F802F600FF3F80 /* LWidgets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LWidgets.h; sourceTree = "<group>"; };
9A89D4B127F802F600FF3F80 /* _pshinter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _pshinter.c; sourceTree = "<group>"; };
9A89D4B327F802F600FF3F80 /* Protocol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Protocol.c; sourceTree = "<group>"; };
9A89D4B427F802F600FF3F80 /* Vorbis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vorbis.h; sourceTree = "<group>"; };
9A89D4B527F802F600FF3F80 /* Event.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Event.c; sourceTree = "<group>"; };
9A89D4B627F802F600FF3F80 /* Deflate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Deflate.h; sourceTree = "<group>"; };
9A89D4B727F802F600FF3F80 /* Graphics_D3D11.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Graphics_D3D11.c; sourceTree = "<group>"; };
9A89D4B827F802F600FF3F80 /* Entity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Entity.h; sourceTree = "<group>"; };
9A89D4B927F802F600FF3F80 /* Particle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Particle.h; sourceTree = "<group>"; };
9A89D4BA27F802F600FF3F80 /* PackedCol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PackedCol.h; sourceTree = "<group>"; };
9A89D4BB27F802F600FF3F80 /* _ftglyph.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftglyph.c; sourceTree = "<group>"; };
9A89D4BC27F802F600FF3F80 /* Chat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Chat.c; sourceTree = "<group>"; };
9A89D4BD27F802F600FF3F80 /* _smooth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _smooth.c; sourceTree = "<group>"; };
9A89D4BE27F802F600FF3F80 /* Resources.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Resources.c; sourceTree = "<group>"; };
9A89D4BF27F802F600FF3F80 /* Builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Builder.h; sourceTree = "<group>"; };
9A89D4C027F802F600FF3F80 /* LScreens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LScreens.h; sourceTree = "<group>"; };
9A89D4C127F802F600FF3F80 /* Model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Model.h; sourceTree = "<group>"; };
9A89D4C227F802F600FF3F80 /* BlockID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockID.h; sourceTree = "<group>"; };
9A89D4C327F802F600FF3F80 /* Block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Block.h; sourceTree = "<group>"; };
9A89D4C427F802F600FF3F80 /* LWeb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LWeb.c; sourceTree = "<group>"; };
9A89D4C527F802F600FF3F80 /* LBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LBackend.h; sourceTree = "<group>"; };
9A89D4C627F802F600FF3F80 /* Formats.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Formats.c; sourceTree = "<group>"; };
9A89D4C727F802F600FF3F80 /* Funcs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Funcs.h; sourceTree = "<group>"; };
9A89D4C827F802F600FF3F80 /* World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = World.h; sourceTree = "<group>"; };
9A89D4C927F802F600FF3F80 /* PickedPosRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PickedPosRenderer.c; sourceTree = "<group>"; };
9A89D4CB27F802F600FF3F80 /* Menus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Menus.h; sourceTree = "<group>"; };
9A89D4CC27F802F600FF3F80 /* EntityComponents.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = EntityComponents.c; sourceTree = "<group>"; };
9A89D4CD27F802F600FF3F80 /* Animations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Animations.h; sourceTree = "<group>"; };
9A89D4CE27F802F600FF3F80 /* Graphics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Graphics.h; sourceTree = "<group>"; };
9A89D4CF27F802F600FF3F80 /* Camera.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Camera.c; sourceTree = "<group>"; };
9A89D4D027F802F600FF3F80 /* Platform_Web.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Platform_Web.c; sourceTree = "<group>"; };
9A89D4D127F802F600FF3F80 /* Screens.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Screens.c; sourceTree = "<group>"; };
9A89D4D227F802F600FF3F80 /* SelectionBox.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SelectionBox.c; sourceTree = "<group>"; };
9A89D4D427F802F600FF3F80 /* Logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Logger.h; sourceTree = "<group>"; };
9A89D4D527F802F600FF3F80 /* IsometricDrawer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IsometricDrawer.h; sourceTree = "<group>"; };
9A89D4D627F802F600FF3F80 /* EnvRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EnvRenderer.h; sourceTree = "<group>"; };
9A89D4D727F802F600FF3F80 /* _GLShared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _GLShared.h; sourceTree = "<group>"; };
9A89D4D827F802F600FF3F80 /* Bitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bitmap.h; sourceTree = "<group>"; };
9A89D4D927F802F600FF3F80 /* HeldBlockRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeldBlockRenderer.h; sourceTree = "<group>"; };
9A89D4DA27F802F600FF3F80 /* _cff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _cff.c; sourceTree = "<group>"; };
9A89D4DB27F802F600FF3F80 /* BlockPhysics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BlockPhysics.c; sourceTree = "<group>"; };
9A89D4DC27F802F600FF3F80 /* Server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Server.h; sourceTree = "<group>"; };
9A89D4DD27F802F600FF3F80 /* Launcher.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Launcher.c; sourceTree = "<group>"; };
9A89D4DE27F802F600FF3F80 /* Lighting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lighting.h; sourceTree = "<group>"; };
9A89D4DF27F802F600FF3F80 /* Window_Win.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Window_Win.c; sourceTree = "<group>"; };
9A89D4E027F802F600FF3F80 /* Platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Platform.h; sourceTree = "<group>"; };
9A89D4E127F802F600FF3F80 /* Drawer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Drawer.h; sourceTree = "<group>"; };
9A89D4E227F802F600FF3F80 /* _D3D11Shaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _D3D11Shaders.h; sourceTree = "<group>"; };
9A89D4E327F802F600FF3F80 /* Options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Options.c; sourceTree = "<group>"; };
9A89D4E427F802F600FF3F80 /* Window_SDL.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Window_SDL.c; sourceTree = "<group>"; };
9A89D4E527F802F600FF3F80 /* Physics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Physics.h; sourceTree = "<group>"; };
9A89D4E627F802F600FF3F80 /* Generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Generator.h; sourceTree = "<group>"; };
9A89D4E727F802F600FF3F80 /* Audio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Audio.c; sourceTree = "<group>"; };
9A89D4E827F802F600FF3F80 /* Stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Stream.c; sourceTree = "<group>"; };
9A89D4E927F802F600FF3F80 /* Vectors.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Vectors.c; sourceTree = "<group>"; };
9A89D4EA27F802F600FF3F80 /* Drawer2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Drawer2D.h; sourceTree = "<group>"; };
9A89D4EB27F802F600FF3F80 /* Http_Web.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Http_Web.c; sourceTree = "<group>"; };
9A89D4EC27F802F600FF3F80 /* Window_Web.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Window_Web.c; sourceTree = "<group>"; };
9A89D4ED27F802F600FF3F80 /* String.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = String.h; sourceTree = "<group>"; };
9A89D4EE27F802F600FF3F80 /* Widgets.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Widgets.c; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
9A89D35427F802B100FF3F80 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
9A89D34E27F802B100FF3F80 = {
isa = PBXGroup;
children = (
9A62ADF4286D906F00E5E3DE /* Assets.xcassets */,
9A89D36827F802B400FF3F80 /* Info.plist */,
9A89D37727F802F500FF3F80 /* src */,
9A89D35827F802B100FF3F80 /* Products */,
);
sourceTree = "<group>";
};
9A89D35827F802B100FF3F80 /* Products */ = {
isa = PBXGroup;
children = (
9A89D35727F802B100FF3F80 /* ClassiCube.app */,
);
name = Products;
sourceTree = "<group>";
};
9A89D37727F802F500FF3F80 /* src */ = {
isa = PBXGroup;
children = (
9A89D47B27F802F500FF3F80 /* Makefile */,
9A89D48D27F802F600FF3F80 /* _autofit.c */,
9A89D4DA27F802F600FF3F80 /* _cff.c */,
9A89D48C27F802F600FF3F80 /* _ftbase.c */,
9A89D48A27F802F600FF3F80 /* _ftbitmap.c */,
9A89D4BB27F802F600FF3F80 /* _ftglyph.c */,
9A89D4A027F802F600FF3F80 /* _ftinit.c */,
9A89D37D27F802F500FF3F80 /* _ftsynth.c */,
9A89D47727F802F500FF3F80 /* _psaux.c */,
9A89D4B127F802F600FF3F80 /* _pshinter.c */,
9A89D48627F802F600FF3F80 /* _psmodule.c */,
9A89D48827F802F600FF3F80 /* _sfnt.c */,
9A89D4BD27F802F600FF3F80 /* _smooth.c */,
9A89D38E27F802F500FF3F80 /* _truetype.c */,
9A89D48227F802F600FF3F80 /* _type1.c */,
9A89D48527F802F600FF3F80 /* Animations.c */,
9A89D4E727F802F600FF3F80 /* Audio.c */,
9A89D4AF27F802F600FF3F80 /* AxisLinesRenderer.c */,
9A89D47827F802F500FF3F80 /* Bitmap.c */,
9A89D39127F802F500FF3F80 /* Block.c */,
9A89D4DB27F802F600FF3F80 /* BlockPhysics.c */,
9A89D39927F802F500FF3F80 /* Builder.c */,
9A89D4CF27F802F600FF3F80 /* Camera.c */,
9A89D4BC27F802F600FF3F80 /* Chat.c */,
9A89D47227F802F500FF3F80 /* Deflate.c */,
9A89D49827F802F600FF3F80 /* Drawer.c */,
9A89D49527F802F600FF3F80 /* Drawer2D.c */,
9A89D47427F802F500FF3F80 /* Entity.c */,
9A89D4CC27F802F600FF3F80 /* EntityComponents.c */,
9A89D47A27F802F500FF3F80 /* EnvRenderer.c */,
9A89D4B527F802F600FF3F80 /* Event.c */,
9A89D38627F802F500FF3F80 /* ExtMath.c */,
9A89D4C627F802F600FF3F80 /* Formats.c */,
9A89D38027F802F500FF3F80 /* Game.c */,
9A89D49427F802F600FF3F80 /* Generator.c */,
9A89D38527F802F500FF3F80 /* Graphics_D3D9.c */,
9A89D4B727F802F600FF3F80 /* Graphics_D3D11.c */,
9A89D47E27F802F500FF3F80 /* Graphics_GL1.c */,
9A89D37A27F802F500FF3F80 /* Graphics_GL2.c */,
9A89D38C27F802F500FF3F80 /* Gui.c */,
9A89D47927F802F500FF3F80 /* HeldBlockRenderer.c */,
9A89D4EB27F802F600FF3F80 /* Http_Web.c */,
9A89D38227F802F500FF3F80 /* Http_Worker.c */,
9A89D4A627F802F600FF3F80 /* Input.c */,
9A89D38B27F802F500FF3F80 /* Inventory.c */,
9A89D47527F802F500FF3F80 /* IsometricDrawer.c */,
9A89D4DD27F802F600FF3F80 /* Launcher.c */,
9A89D38F27F802F500FF3F80 /* LBackend.c */,
9A89D49927F802F600FF3F80 /* Lighting.c */,
9A89D47627F802F500FF3F80 /* Logger.c */,
9A89D39827F802F500FF3F80 /* LScreens.c */,
9A89D4C427F802F600FF3F80 /* LWeb.c */,
9A89D37827F802F500FF3F80 /* LWidgets.c */,
9A89D4AE27F802F600FF3F80 /* MapRenderer.c */,
9A89D48B27F802F600FF3F80 /* Menus.c */,
9A89D39627F802F500FF3F80 /* Model.c */,
9A89D4E327F802F600FF3F80 /* Options.c */,
9A89D39C27F802F500FF3F80 /* PackedCol.c */,
9A89D39B27F802F500FF3F80 /* Particle.c */,
9A89D49B27F802F600FF3F80 /* Physics.c */,
9A89D4C927F802F600FF3F80 /* PickedPosRenderer.c */,
9A89D4AA27F802F600FF3F80 /* Picking.c */,
9A89D37F27F802F500FF3F80 /* Platform_Android.c */,
9A89D39227F802F500FF3F80 /* Platform_Posix.c */,
9A89D4D027F802F600FF3F80 /* Platform_Web.c */,
9A89D4A327F802F600FF3F80 /* Platform_WinApi.c */,
9A89D48127F802F600FF3F80 /* Program.c */,
9A89D4B327F802F600FF3F80 /* Protocol.c */,
9A89D4BE27F802F600FF3F80 /* Resources.c */,
9A89D4D127F802F600FF3F80 /* Screens.c */,
9A89D4D227F802F600FF3F80 /* SelectionBox.c */,
9A89D49E27F802F600FF3F80 /* Server.c */,
9A89D4E827F802F600FF3F80 /* Stream.c */,
9A89D49227F802F600FF3F80 /* String.c */,
9A89D38427F802F500FF3F80 /* TexturePack.c */,
9A89D4AB27F802F600FF3F80 /* Utils.c */,
9A89D4E927F802F600FF3F80 /* Vectors.c */,
9A89D37C27F802F500FF3F80 /* Vorbis.c */,
9A89D4EE27F802F600FF3F80 /* Widgets.c */,
9A89D38127F802F500FF3F80 /* Window_Android.c */,
9A89D49A27F802F600FF3F80 /* Window_Carbon.c */,
9A89D4E427F802F600FF3F80 /* Window_SDL.c */,
9A89D4EC27F802F600FF3F80 /* Window_Web.c */,
9A89D4DF27F802F600FF3F80 /* Window_Win.c */,
9A89D4A127F802F600FF3F80 /* Window_X11.c */,
9A89D48727F802F600FF3F80 /* World.c */,
9A89D4E227F802F600FF3F80 /* _D3D11Shaders.h */,
9A89D4D727F802F600FF3F80 /* _GLShared.h */,
9A89D48327F802F600FF3F80 /* _GraphicsBase.h */,
9A89D38A27F802F500FF3F80 /* _HttpBase.h */,
9A89D39A27F802F500FF3F80 /* _PlatformBase.h */,
9A89D48927F802F600FF3F80 /* _WindowBase.h */,
9A89D4CD27F802F600FF3F80 /* Animations.h */,
9A89D49327F802F600FF3F80 /* Audio.h */,
9A89D37927F802F500FF3F80 /* AxisLinesRenderer.h */,
9A89D4D827F802F600FF3F80 /* Bitmap.h */,
9A89D4C327F802F600FF3F80 /* Block.h */,
9A89D4C227F802F600FF3F80 /* BlockID.h */,
9A89D49D27F802F600FF3F80 /* BlockPhysics.h */,
9A89D4BF27F802F600FF3F80 /* Builder.h */,
9A89D48027F802F600FF3F80 /* Camera.h */,
9A89D39527F802F500FF3F80 /* Chat.h */,
9A89D4A527F802F600FF3F80 /* Constants.h */,
9A89D38D27F802F500FF3F80 /* Core.h */,
9A89D4B627F802F600FF3F80 /* Deflate.h */,
9A89D4E127F802F600FF3F80 /* Drawer.h */,
9A89D4EA27F802F600FF3F80 /* Drawer2D.h */,
9A89D4B827F802F600FF3F80 /* Entity.h */,
9A89D48427F802F600FF3F80 /* EntityComponents.h */,
9A89D4D627F802F600FF3F80 /* EnvRenderer.h */,
9A89D49027F802F600FF3F80 /* Errors.h */,
9A89D47327F802F500FF3F80 /* Event.h */,
9A89D4AC27F802F600FF3F80 /* ExtMath.h */,
9A89D39327F802F500FF3F80 /* Formats.h */,
9A89D4C727F802F600FF3F80 /* Funcs.h */,
9A89D4A927F802F600FF3F80 /* Game.h */,
9A89D4E627F802F600FF3F80 /* Generator.h */,
9A89D4CE27F802F600FF3F80 /* Graphics.h */,
9A89D4A427F802F600FF3F80 /* Gui.h */,
9A89D4D927F802F600FF3F80 /* HeldBlockRenderer.h */,
9A89D39727F802F500FF3F80 /* Http.h */,
9A89D38927F802F500FF3F80 /* Input.h */,
9A89D4A227F802F600FF3F80 /* Inventory.h */,
9A89D4D527F802F600FF3F80 /* IsometricDrawer.h */,
9A89D49F27F802F600FF3F80 /* Launcher.h */,
9A89D4C527F802F600FF3F80 /* LBackend.h */,
9A89D4DE27F802F600FF3F80 /* Lighting.h */,
9A89D4D427F802F600FF3F80 /* Logger.h */,
9A89D4C027F802F600FF3F80 /* LScreens.h */,
9A89D39027F802F500FF3F80 /* LWeb.h */,
9A89D4B027F802F600FF3F80 /* LWidgets.h */,
9A89D37B27F802F500FF3F80 /* MapRenderer.h */,
9A89D4CB27F802F600FF3F80 /* Menus.h */,
9A89D4C127F802F600FF3F80 /* Model.h */,
9A89D49C27F802F600FF3F80 /* Options.h */,
9A89D4BA27F802F600FF3F80 /* PackedCol.h */,
9A89D4B927F802F600FF3F80 /* Particle.h */,
9A89D4E527F802F600FF3F80 /* Physics.h */,
9A89D48E27F802F600FF3F80 /* PickedPosRenderer.h */,
9A89D38827F802F500FF3F80 /* Picking.h */,
9A89D4E027F802F600FF3F80 /* Platform.h */,
9A89D37E27F802F500FF3F80 /* Protocol.h */,
9A89D39427F802F500FF3F80 /* Resources.h */,
9A89D47C27F802F500FF3F80 /* Screens.h */,
9A89D47D27F802F500FF3F80 /* SelectionBox.h */,
9A89D4DC27F802F600FF3F80 /* Server.h */,
9A89D49727F802F600FF3F80 /* Stream.h */,
9A89D4ED27F802F600FF3F80 /* String.h */,
9A89D4AD27F802F600FF3F80 /* TexturePack.h */,
9A89D38727F802F500FF3F80 /* Utils.h */,
9A89D49627F802F600FF3F80 /* Vectors.h */,
9A89D4B427F802F600FF3F80 /* Vorbis.h */,
9A89D49127F802F600FF3F80 /* Widgets.h */,
9A89D48F27F802F600FF3F80 /* Window.h */,
9A89D4C827F802F600FF3F80 /* World.h */,
9A89D47F27F802F600FF3F80 /* interop_ios.m */,
);
path = src;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
9A89D35627F802B100FF3F80 /* ClassiCube */ = {
isa = PBXNativeTarget;
buildConfigurationList = 9A89D36D27F802B400FF3F80 /* Build configuration list for PBXNativeTarget "ClassiCube" */;
buildPhases = (
9A89D35327F802B100FF3F80 /* Sources */,
9A89D35427F802B100FF3F80 /* Frameworks */,
9A89D35527F802B100FF3F80 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = ClassiCube;
productName = CCIOS2;
productReference = 9A89D35727F802B100FF3F80 /* ClassiCube.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
9A89D34F27F802B100FF3F80 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1010;
ORGANIZATIONNAME = ClassiCube;
TargetAttributes = {
9A89D35627F802B100FF3F80 = {
CreatedOnToolsVersion = 10.1;
};
};
};
buildConfigurationList = 9A89D35227F802B100FF3F80 /* Build configuration list for PBXProject "CCIOS" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 9A89D34E27F802B100FF3F80;
productRefGroup = 9A89D35827F802B100FF3F80 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
9A89D35627F802B100FF3F80 /* ClassiCube */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
9A89D35527F802B100FF3F80 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9A62ADF5286D906F00E5E3DE /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
9A89D35327F802B100FF3F80 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9A89D57A27F802F600FF3F80 /* Graphics_D3D11.c in Sources */,
9A89D50727F802F600FF3F80 /* Particle.c in Sources */,
9A89D56C27F802F600FF3F80 /* _ftinit.c in Sources */,
9A89D58F27F802F600FF3F80 /* Audio.c in Sources */,
9A89D55227F802F600FF3F80 /* Logger.c in Sources */,
9A89D58E27F802F600FF3F80 /* Window_SDL.c in Sources */,
9A89D4FF27F802F600FF3F80 /* Gui.c in Sources */,
9A89D55027F802F600FF3F80 /* Entity.c in Sources */,
9A89D58327F802F600FF3F80 /* EntityComponents.c in Sources */,
9A89D57327F802F600FF3F80 /* Utils.c in Sources */,
9A89D58427F802F600FF3F80 /* Camera.c in Sources */,
9A89D59227F802F600FF3F80 /* Http_Web.c in Sources */,
9A89D57C27F802F600FF3F80 /* Chat.c in Sources */,
9A89D50527F802F600FF3F80 /* LScreens.c in Sources */,
9A89D56727F802F600FF3F80 /* Drawer.c in Sources */,
9A89D4F327F802F600FF3F80 /* Graphics_GL2.c in Sources */,
9A89D55C27F802F600FF3F80 /* Animations.c in Sources */,
9A89D58D27F802F600FF3F80 /* Options.c in Sources */,
9A89D57927F802F600FF3F80 /* Event.c in Sources */,
9A89D55B27F802F600FF3F80 /* _type1.c in Sources */,
9A89D58127F802F600FF3F80 /* PickedPosRenderer.c in Sources */,
9A89D56027F802F600FF3F80 /* _ftbitmap.c in Sources */,
9A89D50327F802F600FF3F80 /* Platform_Posix.c in Sources */,
9A89D58027F802F600FF3F80 /* Formats.c in Sources */,
9A89D4FB27F802F600FF3F80 /* TexturePack.c in Sources */,
9A89D50827F802F600FF3F80 /* PackedCol.c in Sources */,
9A89D50227F802F600FF3F80 /* Block.c in Sources */,
9A89D57227F802F600FF3F80 /* Picking.c in Sources */,
9A89D4FC27F802F600FF3F80 /* Graphics_D3D9.c in Sources */,
9A89D59127F802F600FF3F80 /* Vectors.c in Sources */,
9A89D58A27F802F600FF3F80 /* BlockPhysics.c in Sources */,
9A89D56127F802F600FF3F80 /* Menus.c in Sources */,
9A89D4F727F802F600FF3F80 /* Game.c in Sources */,
9A89D55627F802F600FF3F80 /* EnvRenderer.c in Sources */,
9A89D58927F802F600FF3F80 /* _cff.c in Sources */,
9A89D4F627F802F600FF3F80 /* Platform_Android.c in Sources */,
9A89D4F227F802F600FF3F80 /* LWidgets.c in Sources */,
9A89D55327F802F600FF3F80 /* _psaux.c in Sources */,
9A89D50427F802F600FF3F80 /* Model.c in Sources */,
9A89D54F27F802F600FF3F80 /* Deflate.c in Sources */,
9A89D56E27F802F600FF3F80 /* Platform_WinApi.c in Sources */,
9A89D56327F802F600FF3F80 /* _autofit.c in Sources */,
9A89D55F27F802F600FF3F80 /* _sfnt.c in Sources */,
9A89D55527F802F600FF3F80 /* HeldBlockRenderer.c in Sources */,
9A89D4FD27F802F600FF3F80 /* ExtMath.c in Sources */,
9A89D56427F802F600FF3F80 /* String.c in Sources */,
9A89D57D27F802F600FF3F80 /* _smooth.c in Sources */,
9A89D50127F802F600FF3F80 /* LBackend.c in Sources */,
9A89D56827F802F600FF3F80 /* Lighting.c in Sources */,
9A89D57827F802F600FF3F80 /* Protocol.c in Sources */,
9A89D55427F802F600FF3F80 /* Bitmap.c in Sources */,
9A89D56D27F802F600FF3F80 /* Window_X11.c in Sources */,
9A89D50627F802F600FF3F80 /* Builder.c in Sources */,
9A89D55127F802F600FF3F80 /* IsometricDrawer.c in Sources */,
9A89D57B27F802F600FF3F80 /* _ftglyph.c in Sources */,
9A89D55827F802F600FF3F80 /* Graphics_GL1.c in Sources */,
9A89D59427F802F600FF3F80 /* Widgets.c in Sources */,
9A89D56927F802F600FF3F80 /* Window_Carbon.c in Sources */,
9A89D55927F802F600FF3F80 /* interop_ios.m in Sources */,
9A89D55A27F802F600FF3F80 /* Program.c in Sources */,
9A89D58527F802F600FF3F80 /* Platform_Web.c in Sources */,
9A89D4F527F802F600FF3F80 /* _ftsynth.c in Sources */,
9A89D55D27F802F600FF3F80 /* _psmodule.c in Sources */,
9A89D56F27F802F600FF3F80 /* Input.c in Sources */,
9A89D4F827F802F600FF3F80 /* Window_Android.c in Sources */,
9A89D57E27F802F600FF3F80 /* Resources.c in Sources */,
9A89D4F427F802F600FF3F80 /* Vorbis.c in Sources */,
9A89D56227F802F600FF3F80 /* _ftbase.c in Sources */,
9A89D58C27F802F600FF3F80 /* Window_Win.c in Sources */,
9A89D56B27F802F600FF3F80 /* Server.c in Sources */,
9A89D50027F802F600FF3F80 /* _truetype.c in Sources */,
9A89D57F27F802F600FF3F80 /* LWeb.c in Sources */,
9A89D55727F802F600FF3F80 /* Makefile in Sources */,
9A89D59327F802F600FF3F80 /* Window_Web.c in Sources */,
9A89D56627F802F600FF3F80 /* Drawer2D.c in Sources */,
9A89D57427F802F600FF3F80 /* MapRenderer.c in Sources */,
9A89D57627F802F600FF3F80 /* _pshinter.c in Sources */,
9A89D56A27F802F600FF3F80 /* Physics.c in Sources */,
9A89D58727F802F600FF3F80 /* SelectionBox.c in Sources */,
9A89D4FE27F802F600FF3F80 /* Inventory.c in Sources */,
9A89D56527F802F600FF3F80 /* Generator.c in Sources */,
9A89D57527F802F600FF3F80 /* AxisLinesRenderer.c in Sources */,
9A89D55E27F802F600FF3F80 /* World.c in Sources */,
9A89D58627F802F600FF3F80 /* Screens.c in Sources */,
9A89D4F927F802F600FF3F80 /* Http_Worker.c in Sources */,
9A89D58B27F802F600FF3F80 /* Launcher.c in Sources */,
9A89D59027F802F600FF3F80 /* Stream.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
9A89D36B27F802B400FF3F80 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
9A89D36C27F802B400FF3F80 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.1;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
9A89D36E27F802B400FF3F80 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.classicube.client.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
9A89D36F27F802B400FF3F80 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.classicube.client.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
9A89D35227F802B100FF3F80 /* Build configuration list for PBXProject "CCIOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9A89D36B27F802B400FF3F80 /* Debug */,
9A89D36C27F802B400FF3F80 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
9A89D36D27F802B400FF3F80 /* Build configuration list for PBXNativeTarget "ClassiCube" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9A89D36E27F802B400FF3F80 /* Debug */,
9A89D36F27F802B400FF3F80 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 9A89D34F27F802B100FF3F80 /* Project object */;
}

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,108 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"filename" : "CC_80.png",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"filename" : "CC_120.png",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"filename" : "CC_120.png",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"filename" : "CC_180.png",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"filename" : "CC_40.png",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"filename" : "CC_80.png",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"filename" : "CC_76.png",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"filename" : "CC_152.png",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"filename" : "CC_167.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "CC_1024.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -18,18 +18,8 @@
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.games</string>
<key>GCSupportsGameMode</key>
<true/>
<key>LSSupportsGameMode</key>
<true/>
<key>UIFileSharingEnabled</key>
<true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>LSRequiresIPhoneOS</key>
<false/>
<true/>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Saving screenshot</string>
<key>UILaunchStoryboardName</key>
@ -148,4 +138,4 @@
</dict>
</array>
</dict>
</plist>
</plist>

View File

@ -1,4 +1,4 @@
Copyright (c) 2014 - 2024, UnknownShadow200
Copyright (c) 2014 - 2022, UnknownShadow200
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@ -150,59 +150,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
==============================================================================
BearSSL license
==============================================================================
Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
==============================================================================
BearSSL license
==================
Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
FreeType license
==================
The FreeType Project LICENSE

View File

@ -1,130 +0,0 @@
#ifndef __32X_H__
#define __32X_H__
/* Create a 5:5:5 RGB color */
#define COLOR(r,g,b) (((r)&0x1F)|((g)&0x1F)<<5|((b)&0x1F)<<10)
#define MARS_CRAM (*(volatile unsigned short *)0x20004200)
#define MARS_FRAMEBUFFER (*(volatile unsigned short *)0x24000000)
#define MARS_OVERWRITE_IMG (*(volatile unsigned short *)0x24020000)
#define MARS_SDRAM (*(volatile unsigned short *)0x26000000)
#define MARS_SYS_INTMSK (*(volatile unsigned short *)0x20004000)
#define MARS_SYS_DMACTR (*(volatile unsigned short *)0x20004006)
#define MARS_SYS_DMASAR (*(volatile unsigned long *)0x20004008)
#define MARS_SYS_DMADAR (*(volatile unsigned long *)0x2000400C)
#define MARS_SYS_DMALEN (*(volatile unsigned short *)0x20004010)
#define MARS_SYS_DMAFIFO (*(volatile unsigned short *)0x20004012)
#define MARS_SYS_VRESI_CLR (*(volatile unsigned short *)0x20004014)
#define MARS_SYS_VINT_CLR (*(volatile unsigned short *)0x20004016)
#define MARS_SYS_HINT_CLR (*(volatile unsigned short *)0x20004018)
#define MARS_SYS_CMDI_CLR (*(volatile unsigned short *)0x2000401A)
#define MARS_SYS_PWMI_CLR (*(volatile unsigned short *)0x2000401C)
#define MARS_SYS_COMM0 (*(volatile unsigned short *)0x20004020) /* Master SH2 communication */
#define MARS_SYS_COMM2 (*(volatile unsigned short *)0x20004022)
#define MARS_SYS_COMM4 (*(volatile unsigned short *)0x20004024) /* Slave SH2 communication */
#define MARS_SYS_COMM6 (*(volatile unsigned short *)0x20004026)
#define MARS_SYS_COMM8 (*(volatile unsigned short *)0x20004028) /* controller 1 current value */
#define MARS_SYS_COMM10 (*(volatile unsigned short *)0x2000402A) /* controller 2 current value */
#define MARS_SYS_COMM12 (*(volatile unsigned long *)0x2000402C) /* vcount current value */
#define MARS_PWM_CTRL (*(volatile unsigned short *)0x20004030)
#define MARS_PWM_CYCLE (*(volatile unsigned short *)0x20004032)
#define MARS_PWM_LEFT (*(volatile unsigned short *)0x20004034)
#define MARS_PWM_RIGHT (*(volatile unsigned short *)0x20004036)
#define MARS_PWM_MONO (*(volatile unsigned short *)0x20004038)
#define MARS_VDP_DISPMODE (*(volatile unsigned short *)0x20004100)
#define MARS_VDP_FILLEN (*(volatile unsigned short *)0x20004104)
#define MARS_VDP_FILADR (*(volatile unsigned short *)0x20004106)
#define MARS_VDP_FILDAT (*(volatile unsigned short *)0x20004108)
#define MARS_VDP_FBCTL (*(volatile unsigned short *)0x2000410A)
#define MARS_SH2_ACCESS_VDP 0x8000
#define MARS_68K_ACCESS_VDP 0x0000
#define MARS_PAL_FORMAT 0x0000
#define MARS_NTSC_FORMAT 0x8000
#define MARS_VDP_PRIO_68K 0x0000
#define MARS_VDP_PRIO_32X 0x0080
#define MARS_224_LINES 0x0000
#define MARS_240_LINES 0x0040
#define MARS_VDP_MODE_OFF 0x0000
#define MARS_VDP_MODE_256 0x0001
#define MARS_VDP_MODE_32K 0x0002
#define MARS_VDP_MODE_RLE 0x0003
#define MARS_VDP_VBLK 0x8000
#define MARS_VDP_HBLK 0x4000
#define MARS_VDP_PEN 0x2000
#define MARS_VDP_FEN 0x0002
#define MARS_VDP_FS 0x0001
#define SH2_CCTL_CP 0x10
#define SH2_CCTL_TW 0x08
#define SH2_CCTL_CE 0x01
#define SH2_FRT_TIER (*(volatile unsigned char *)0xFFFFFE10)
#define SH2_FRT_FTCSR (*(volatile unsigned char *)0xFFFFFE11)
#define SH2_FRT_FRCH (*(volatile unsigned char *)0xFFFFFE12)
#define SH2_FRT_FRCL (*(volatile unsigned char *)0xFFFFFE13)
#define SH2_FRT_OCRH (*(volatile unsigned char *)0xFFFFFE14)
#define SH2_FRT_OCRL (*(volatile unsigned char *)0xFFFFFE15)
#define SH2_FRT_TCR (*(volatile unsigned char *)0xFFFFFE16)
#define SH2_FRT_TOCR (*(volatile unsigned char *)0xFFFFFE17)
#define SH2_FRT_ICRH (*(volatile unsigned char *)0xFFFFFE18)
#define SH2_FRT_ICRL (*(volatile unsigned char *)0xFFFFFE19)
#define SH2_DMA_SAR0 (*(volatile unsigned long *)0xFFFFFF80)
#define SH2_DMA_DAR0 (*(volatile unsigned long *)0xFFFFFF84)
#define SH2_DMA_TCR0 (*(volatile unsigned long *)0xFFFFFF88)
#define SH2_DMA_CHCR0 (*(volatile unsigned long *)0xFFFFFF8C)
#define SH2_DMA_VCR0 (*(volatile unsigned long *)0xFFFFFFA0)
#define SH2_DMA_DRCR0 (*(volatile unsigned char *)0xFFFFFE71)
#define SH2_DMA_SAR1 (*(volatile unsigned long *)0xFFFFFF90)
#define SH2_DMA_DAR1 (*(volatile unsigned long *)0xFFFFFF94)
#define SH2_DMA_TCR1 (*(volatile unsigned long *)0xFFFFFF98)
#define SH2_DMA_CHCR1 (*(volatile unsigned long *)0xFFFFFF9C)
#define SH2_DMA_VCR1 (*(volatile unsigned long *)0xFFFFFFA8)
#define SH2_DMA_DRCR1 (*(volatile unsigned char *)0xFFFFFE72)
#define SH2_DMA_DMAOR (*(volatile unsigned long *)0xFFFFFFB0)
#define SH2_INT_IPRA (*(volatile unsigned short *)0xFFFFFEE2)
#define SEGA_CTRL_UP 0x0001
#define SEGA_CTRL_DOWN 0x0002
#define SEGA_CTRL_LEFT 0x0004
#define SEGA_CTRL_RIGHT 0x0008
#define SEGA_CTRL_B 0x0010
#define SEGA_CTRL_C 0x0020
#define SEGA_CTRL_A 0x0040
#define SEGA_CTRL_START 0x0080
#define SEGA_CTRL_Z 0x0100
#define SEGA_CTRL_Y 0x0200
#define SEGA_CTRL_X 0x0400
#define SEGA_CTRL_MODE 0x0800
#define SEGA_CTRL_TYPE 0xF000
#define SEGA_CTRL_THREE 0x0000
#define SEGA_CTRL_SIX 0x1000
#define SEGA_CTRL_NONE 0xF000
#ifdef __cplusplus
extern "C" {
#endif
/* global functions in sh2_crt0.s */
extern void fast_memcpy(void *dst, void *src, int len);
extern void CacheControl(int mode);
extern void CacheClearLine(void* ptr);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,119 +0,0 @@
ifdef $(GENDEV)
ROOTDIR = $(GENDEV)
else
ROOTDIR = /opt/toolchains/sega
endif
.SUFFIXES:
#---------------------------------------------------------------------------------
# Configurable options
#---------------------------------------------------------------------------------
TARGET = ClassiCube-32x
BUILD_DIR = build/32x
SOURCE_DIRS = src src/32x misc/32x
#---------------------------------------------------------------------------------
# Compilable files
#---------------------------------------------------------------------------------
C_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c))
S_FILES = misc/32x/sh2_crt0.s
OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.s=%.o)))
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(OBJS:%.o=%.d)
#---------------------------------------------------------------------------------
# Code generation
#---------------------------------------------------------------------------------
LDSCRIPTSDIR = $(ROOTDIR)/ldscripts
LIBS = $(LIBPATH) -lc -lgcc -lgcc-Os-4-200 -lnosys
LIBPATH = -L$(ROOTDIR)/sh-elf/lib -L$(ROOTDIR)/sh-elf/lib/gcc/sh-elf/4.6.2 -L$(ROOTDIR)/sh-elf/sh-elf/lib
INCPATH = -I$(ROOTDIR)/sh-elf/include -I$(ROOTDIR)/sh-elf/sh-elf/include
SHCCFLAGS = -m2 -mb -Ofast -Wall -g -c -fomit-frame-pointer -DPLAT_32X -ffunction-sections -fdata-sections
SHHWFLAGS = -m2 -mb -O1 -Wall -g -c -fomit-frame-pointer
SHLDFLAGS = -T $(LDSCRIPTSDIR)/mars.ld -nostdlib -Wl,--gc-sections
SHASFLAGS = --big
MDLDFLAGS = -T $(LDSCRIPTSDIR)/md.ld --oformat binary
MDASFLAGS = -m68000 --register-prefix-optional
#---------------------------------------------------------------------------------
# Compiler tools
#---------------------------------------------------------------------------------
SHPREFIX = $(ROOTDIR)/sh-elf/bin/sh-elf-
SHCC = $(SHPREFIX)gcc
SHAS = $(SHPREFIX)as
SHLD = $(SHPREFIX)ld
SHOBJC = $(SHPREFIX)objcopy
MDPREFIX = $(ROOTDIR)/m68k-elf/bin/m68k-elf-
MDAS = $(MDPREFIX)as
MDLD = $(MDPREFIX)ld
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
all: $(BUILD_DIR) $(BUILD_DIR)/m68k_crt0.bin $(BUILD_DIR)/m68k_crt1.bin $(TARGET).bin
clean:
rm -f $(BUILD_DIR)/*.o $(BUILD_DIR)/*.bin $(TARGET).bin $(TARGET).elf
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# binary generation
#---------------------------------------------------------------------------------
$(TARGET).bin: $(TARGET).elf
$(SHOBJC) -O binary $< $(BUILD_DIR)/temp.bin
dd if=$(BUILD_DIR)/temp.bin of=$@ bs=64K conv=sync
$(TARGET).elf: $(OBJS)
$(SHCC) $(SHLDFLAGS) $(OBJS) $(LIBS) -o $(TARGET).elf
$(BUILD_DIR)/m68k_crt0.o: misc/32x/m68k_crt0.s
$(MDAS) $(MDASFLAGS) $< -o $@
$(BUILD_DIR)/m68k_crt0.bin: $(BUILD_DIR)/m68k_crt0.o
$(MDLD) $(MDLDFLAGS) $< -o $@
$(BUILD_DIR)/m68k_crt1.o: misc/32x/m68k_crt1.s
$(MDAS) $(MDASFLAGS) $< -o $@
$(BUILD_DIR)/m68k_crt1.bin: $(BUILD_DIR)/m68k_crt1.o
$(MDLD) $(MDLDFLAGS) $< -o $@
#---------------------------------------------------------------------------------
# object generation
#---------------------------------------------------------------------------------
$(BUILD_DIR)/%.o: src/%.c
$(SHCC) $(SHCCFLAGS) $(INCPATH) $(DEPFLAGS) $< -o $@
$(BUILD_DIR)/%.o: src/32x/%.c
$(SHCC) $(SHCCFLAGS) $(INCPATH) $(DEPFLAGS) $< -o $@
$(BUILD_DIR)/%.o: misc/32x/%.c
$(SHCC) $(SHCCFLAGS) $(INCPATH) $(DEPFLAGS) $< -o $@
$(BUILD_DIR)/%.o: misc/32x/%.s
$(SHAS) $(SHASFLAGS) $(INCPATH) $< -o $@
#---------------------------------------------------------------------------------
# Dependency tracking
#---------------------------------------------------------------------------------
$(DEPFILES):
include $(wildcard $(DEPFILES))

View File

@ -1,256 +0,0 @@
/*
* Licensed under the BSD license
*
* debug_32x.c - Debug screen functions.
*
* Copyright (c) 2005 Marcus R. Brown <mrbrown@ocgnet.org>
* Copyright (c) 2005 James Forshaw <tyranid@gmail.com>
* Copyright (c) 2005 John Kelley <ps2dev@kelley.ca>
*
* Altered for 32X by Chilly Willy
*/
#include "32x.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
static int init = 0;
static unsigned short fgc = 0, bgc = 0;
static unsigned char fgs = 0, bgs = 0;
static unsigned short currentFB = 0;
void Hw32xSetFGColor(int s, int r, int g, int b)
{
volatile unsigned short *palette = &MARS_CRAM;
fgs = s;
fgc = COLOR(r, g, b);
palette[fgs] = fgc;
}
void Hw32xSetBGColor(int s, int r, int g, int b)
{
volatile unsigned short *palette = &MARS_CRAM;
bgs = s;
bgc = COLOR(r, g, b);
palette[bgs] = bgc;
}
void Hw32xInit(int vmode, int lineskip)
{
volatile unsigned short *frameBuffer16 = &MARS_FRAMEBUFFER;
int i;
// Wait for the SH2 to gain access to the VDP
while ((MARS_SYS_INTMSK & MARS_SH2_ACCESS_VDP) == 0) ;
if (vmode == MARS_VDP_MODE_32K)
{
// Set 16-bit direct mode, 224 lines
MARS_VDP_DISPMODE = MARS_224_LINES | MARS_VDP_MODE_32K;
// init both framebuffers
// Flip the framebuffer selection bit and wait for it to take effect
MARS_VDP_FBCTL = currentFB ^ 1;
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
// rewrite line table
for (i=0; i<224/(lineskip+1); i++)
{
if (lineskip)
{
int j = lineskip + 1;
while (j)
{
frameBuffer16[i*(lineskip+1) + (lineskip + 1 - j)] = i*320 + 0x100; /* word offset of line */
j--;
}
}
else
{
if (i<200)
frameBuffer16[i] = i*320 + 0x100; /* word offset of line */
else
frameBuffer16[i] = 200*320 + 0x100; /* word offset of line */
}
}
// clear screen
for (i=0x100; i<0x10000; i++)
frameBuffer16[i] = 0;
// Flip the framebuffer selection bit and wait for it to take effect
MARS_VDP_FBCTL = currentFB ^ 1;
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
// rewrite line table
for (i=0; i<224/(lineskip+1); i++)
{
if (lineskip)
{
int j = lineskip + 1;
while (j)
{
frameBuffer16[i*(lineskip+1) + (lineskip + 1 - j)] = i*320 + 0x100; /* word offset of line */
j--;
}
}
else
{
if (i<200)
frameBuffer16[i] = i*320 + 0x100; /* word offset of line */
else
frameBuffer16[i] = 200*320 + 0x100; /* word offset of line */
}
}
// clear screen
for (i=0x100; i<0x10000; i++)
frameBuffer16[i] = 0;
}
Hw32xSetFGColor(255,31,31,31);
Hw32xSetBGColor(0,0,0,0);
init = vmode;
}
void Hw32xScreenClear()
{
int i;
int l = (init == MARS_VDP_MODE_256) ? 320*224/2 + 0x100 : 320*200 + 0x100;
volatile unsigned short *frameBuffer16 = &MARS_FRAMEBUFFER;
// clear screen
for (i=0x100; i<l; i++)
frameBuffer16[i] = 0;
// Flip the framebuffer selection bit and wait for it to take effect
MARS_VDP_FBCTL = currentFB ^ 1;
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
// clear screen
for (i=0x100; i<l; i++)
frameBuffer16[i] = 0;
Hw32xSetFGColor(255,31,31,31);
Hw32xSetBGColor(0,0,0,0);
}
void Hw32xDelay(int ticks)
{
unsigned long ct = MARS_SYS_COMM12 + ticks;
while (MARS_SYS_COMM12 < ct) ;
}
void Hw32xScreenFlip(int wait)
{
// Flip the framebuffer selection bit
MARS_VDP_FBCTL = currentFB ^ 1;
if (wait)
{
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
}
}
void Hw32xFlipWait()
{
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
}
// MD Command support code ---------------------------------------------
unsigned short HwMdReadPad(int port)
{
if (port == 0)
return MARS_SYS_COMM8;
else if (port == 1)
return MARS_SYS_COMM10;
else
return SEGA_CTRL_NONE;
}
unsigned char HwMdReadSram(unsigned short offset)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = offset;
MARS_SYS_COMM0 = 0x0100; // Read SRAM
while (MARS_SYS_COMM0) ;
return MARS_SYS_COMM2 & 0x00FF;
}
void HwMdWriteSram(unsigned char byte, unsigned short offset)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = offset;
MARS_SYS_COMM0 = 0x0200 | byte; // Write SRAM
while (MARS_SYS_COMM0) ;
}
int HwMdReadMouse(int port)
{
unsigned int mouse1, mouse2;
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM0 = 0x0300|port; // tells 68000 to read mouse
while (MARS_SYS_COMM0 == (0x0300|port)) ; // wait for mouse value
mouse1 = MARS_SYS_COMM0;
mouse2 = MARS_SYS_COMM2;
MARS_SYS_COMM0 = 0; // tells 68000 we got the mouse value
return (int)((mouse1 << 16) | mouse2);
}
void HwMdClearScreen(void)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM0 = 0x0400; // Clear Screen (Name Table B)
while (MARS_SYS_COMM0) ;
}
void HwMdSetOffset(unsigned short offset)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = offset;
MARS_SYS_COMM0 = 0x0500; // Set offset (into either Name Table B or VRAM)
while (MARS_SYS_COMM0) ;
}
void HwMdSetNTable(unsigned short word)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = word;
MARS_SYS_COMM0 = 0x0600; // Set word at offset in Name Table B
while (MARS_SYS_COMM0) ;
}
void HwMdSetVram(unsigned short word)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = word;
MARS_SYS_COMM0 = 0x0700; // Set word at offset in VRAM
while (MARS_SYS_COMM0) ;
}
void HwMdPuts(char *str, int color, int x, int y)
{
HwMdSetOffset(((y<<6) | x) << 1);
while (*str)
HwMdSetNTable(((*str++ - 0x20) & 0xFF) | color);
}
void HwMdPutc(char chr, int color, int x, int y)
{
HwMdSetOffset(((y<<6) | x) << 1);
HwMdSetNTable(((chr - 0x20) & 0xFF) | color);
}
// Slave SH2 support code ----------------------------------------------
void slave(void)
{
while (1) ;
}

View File

@ -1,30 +0,0 @@
#ifndef HW_32X_H
#define HW_32X_H
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
extern void Hw32xSetFGColor(int s, int r, int g, int b);
extern void Hw32xSetBGColor(int s, int r, int g, int b);
extern void Hw32xInit(int vmode, int lineskip);
extern int Hw32xScreenGetX();
extern int Hw32xScreenGetY();
extern void Hw32xScreenSetXY(int x, int y);
extern void Hw32xScreenClear();
extern void Hw32xDelay(int ticks);
extern void Hw32xScreenFlip(int wait);
extern void Hw32xFlipWait();
extern unsigned short HwMdReadPad(int port);
extern unsigned char HwMdReadSram(unsigned short offset);
extern void HwMdWriteSram(unsigned char byte, unsigned short offset);
extern int HwMdReadMouse(int port);
extern void HwMdClearScreen(void);
extern void HwMdSetOffset(unsigned short offset);
extern void HwMdSetNTable(unsigned short word);
extern void HwMdSetVram(unsigned short word);
extern void HwMdPuts(char *str, int color, int x, int y);
extern void HwMdPutc(char chr, int color, int x, int y);
#endif

View File

@ -1,98 +0,0 @@
| SEGA 32X support code for the 68000
| by Chilly Willy
| First part of rom header
.text
| Initial exception vectors. When the console is first turned on, it is
| in MegaDrive mode. All vectors just point to the code to start up the
| Mars adapter. After the adapter is enabled, none of these vectors will
| appear as the adapter uses its own vector table to route exceptions to
| the jump table. 0x3F0 is where the 68000 starts at for the 32X.
.long 0x01000000,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
| Standard MegaDrive ROM header at 0x100
.ascii "SEGA 32X Example" /* SEGA must be the first four chars for TMSS */
.ascii "(C)2024 "
.ascii "ClassiCube 32X " /* export name */
.ascii " "
.ascii " "
.ascii "ClassiCube 32X " /* domestic (Japanese) name */
.ascii " "
.ascii " "
.ascii "GM MK-0000 -00"
.word 0x0000 /* checksum - not needed */
.ascii "J6 "
.long 0x00000000,0x0007FFFF /* ROM start, end */
.long 0x00FF0000,0x00FFFFFF /* RAM start, end */
.ifdef HAS_SAVE_RAM
.ascii "RA" /* External RAM */
.byte 0xF8 /* don't clear + odd bytes */
.byte 0x20 /* SRAM */
.long 0x00200001,0x0020FFFF /* SRAM start, end */
.else
.ascii " " /* no SRAM */
.endif
.ascii " "
.ascii " "
.ifdef MYTH_HOMEBREW
.ascii "MYTH3900" /* memo indicates Myth native executable */
.else
.ascii " " /* memo */
.endif
.ascii " "
.ascii " "
.ascii "F " /* enable any hardware configuration */
| Mars exception vector jump table at 0x200
jmp 0x880800.l /* reset = hot start */
jsr 0x880806.l /* EX_BusError */
jsr 0x880806.l /* EX_AddrError */
jsr 0x880806.l /* EX_IllInstr */
jsr 0x880806.l /* EX_DivByZero */
jsr 0x880806.l /* EX_CHK */
jsr 0x880806.l /* EX_TrapV */
jsr 0x880806.l /* EX_Priviledge */
jsr 0x880806.l /* EX_Trace */
jsr 0x880806.l /* EX_LineA */
jsr 0x880806.l /* EX_LineF */
.space 72 /* reserved */
jsr 0x880806.l /* EX_Spurious */
jsr 0x880806.l /* EX_Level1 */
jsr 0x880806.l /* EX_Level2 */
jsr 0x880806.l /* EX_Level3 */
jmp 0x88080C.l /* EX_Level4 HBlank */
jsr 0x880806.l /* EX_Level5 */
jmp 0x880812.l /* EX_Level6 VBlank */
jsr 0x880806.l /* EX_Level7 */
jsr 0x880806.l /* EX_Trap0 */
jsr 0x880806.l /* EX_Trap1 */
jsr 0x880806.l /* EX_Trap2 */
jsr 0x880806.l /* EX_Trap3 */
jsr 0x880806.l /* EX_Trap4 */
jsr 0x880806.l /* EX_Trap5 */
jsr 0x880806.l /* EX_Trap6 */
jsr 0x880806.l /* EX_Trap7 */
jsr 0x880806.l /* EX_Trap8 */
jsr 0x880806.l /* EX_Trap9 */
jsr 0x880806.l /* EX_TrapA */
jsr 0x880806.l /* EX_TrapB */
jsr 0x880806.l /* EX_TrapC */
jsr 0x880806.l /* EX_TrapD */
jsr 0x880806.l /* EX_TrapE */
jsr 0x880806.l /* EX_TrapF */
.space 166 /* reserved */

File diff suppressed because it is too large Load Diff

View File

@ -1,727 +0,0 @@
! SEGA 32X support code for SH2
! by Chilly Willy
! Rom header and SH2 init/exception code - must be first in object list
.text
! Standard MD Header at 0x000
.incbin "build/32x/m68k_crt0.bin", 0, 0x3C0
! Standard Mars Header at 0x3C0
.ascii "ClassiCube 32X " /* module name (16 chars) */
.long 0x00000000 /* version */
.long __text_end-0x02000000 /* Source (in ROM) */
.long 0x00000000 /* Destination (in SDRAM) */
.long __data_size /* Size */
.long 0x06000240 /* Master SH2 Jump */
.long 0x06000244 /* Slave SH2 Jump */
.long 0x06000000 /* Master SH2 VBR */
.long 0x06000120 /* Slave SH2 VBR */
! Standard MD startup code at 0x3F0
.incbin "build/32x/m68k_crt1.bin"
.data
! Master Vector Base Table at 0x06000000
.long mstart /* 0, Cold Start PC */
.long 0x0603FC00 /* 1, Cold Start SP */
.long mstart /* 2, Manual Reset PC */
.long 0x0603FC00 /* 3, Manual Reset SP */
.long main_err /* 4, Illegal instruction */
.long _wdt_handler/* 5, reserved - repurposed for WDT */
.long main_err /* 6, Invalid slot instruction */
.long 0x20100400 /* 7, reserved */
.long 0x20100420 /* 8, reserved */
.long main_err /* 9, CPU address error */
.long main_err /* 10, DMA address error */
.long main_err /* 11, NMI vector */
.long main_err /* 12, User break vector */
.space 76 /* reserved */
.long main_err /* TRAPA #32 */
.long main_err /* TRAPA #33 */
.long main_err /* TRAPA #34 */
.long main_err /* TRAPA #35 */
.long main_err /* TRAPA #36 */
.long main_err /* TRAPA #37 */
.long main_err /* TRAPA #38 */
.long main_err /* TRAPA #39 */
.long main_err /* TRAPA #40 */
.long main_err /* TRAPA #41 */
.long main_err /* TRAPA #42 */
.long main_err /* TRAPA #43 */
.long main_err /* TRAPA #44 */
.long main_err /* TRAPA #45 */
.long main_err /* TRAPA #46 */
.long main_err /* TRAPA #47 */
.long main_err /* TRAPA #48 */
.long main_err /* TRAPA #49 */
.long main_err /* TRAPA #50 */
.long main_err /* TRAPA #51 */
.long main_err /* TRAPA #52 */
.long main_err /* TRAPA #53 */
.long main_err /* TRAPA #54 */
.long main_err /* TRAPA #55 */
.long main_err /* TRAPA #56 */
.long main_err /* TRAPA #57 */
.long main_err /* TRAPA #58 */
.long main_err /* TRAPA #59 */
.long main_err /* TRAPA #60 */
.long main_err /* TRAPA #61 */
.long main_err /* TRAPA #62 */
.long main_err /* TRAPA #63 */
.long main_irq /* Level 1 IRQ */
.long main_irq /* Level 2 & 3 IRQ's */
.long main_irq /* Level 4 & 5 IRQ's */
.long main_irq /* PWM interupt */
.long main_irq /* Command interupt */
.long main_irq /* H Blank interupt */
.long main_irq /* V Blank interupt */
.long main_irq /* Reset Button */
! Slave Vector Base Table at 0x06000120
.long sstart /* Cold Start PC */
.long 0x06040000 /* Cold Start SP */
.long sstart /* Manual Reset PC */
.long 0x06040000 /* Manual Reset SP */
.long slav_err /* Illegal instruction */
.long 0x00000000 /* reserved */
.long slav_err /* Invalid slot instruction */
.long 0x20100400 /* reserved */
.long 0x20100420 /* reserved */
.long slav_err /* CPU address error */
.long slav_err /* DMA address error */
.long slav_err /* NMI vector */
.long slav_err /* User break vector */
.space 76 /* reserved */
.long slav_err /* TRAPA #32 */
.long slav_err /* TRAPA #33 */
.long slav_err /* TRAPA #34 */
.long slav_err /* TRAPA #35 */
.long slav_err /* TRAPA #36 */
.long slav_err /* TRAPA #37 */
.long slav_err /* TRAPA #38 */
.long slav_err /* TRAPA #39 */
.long slav_err /* TRAPA #40 */
.long slav_err /* TRAPA #41 */
.long slav_err /* TRAPA #42 */
.long slav_err /* TRAPA #43 */
.long slav_err /* TRAPA #44 */
.long slav_err /* TRAPA #45 */
.long slav_err /* TRAPA #46 */
.long slav_err /* TRAPA #47 */
.long slav_err /* TRAPA #48 */
.long slav_err /* TRAPA #49 */
.long slav_err /* TRAPA #50 */
.long slav_err /* TRAPA #51 */
.long slav_err /* TRAPA #52 */
.long slav_err /* TRAPA #53 */
.long slav_err /* TRAPA #54 */
.long slav_err /* TRAPA #55 */
.long slav_err /* TRAPA #56 */
.long slav_err /* TRAPA #57 */
.long slav_err /* TRAPA #58 */
.long slav_err /* TRAPA #59 */
.long slav_err /* TRAPA #60 */
.long slav_err /* TRAPA #61 */
.long slav_err /* TRAPA #62 */
.long slav_err /* TRAPA #63 */
.long slav_irq /* Level 1 IRQ */
.long slav_irq /* Level 2 & 3 IRQ's */
.long slav_irq /* Level 4 & 5 IRQ's */
.long slav_irq /* PWM interupt */
.long slav_irq /* Command interupt */
.long slav_irq /* H Blank interupt */
.long slav_irq /* V Blank interupt */
.long slav_irq /* Reset Button */
! The main SH2 starts here at 0x06000240
mstart:
bra mcont
nop
! The slave SH2 starts here at 0x06000244
sstart:
bra scont
nop
! Each section of code below has its own data table so that the code
! can be extended without worrying about the offsets becoming too big.
! This results in duplicate entries, but not so many that we care. :)
mcont:
! clear interrupt flags
mov.l _master_int_clr,r1
mov.w r0,@-r1 /* PWM INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* CMD INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* H INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* V INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* VRES INT clear */
mov.w r0,@r1
mov.l _master_stk,r15
! purge cache and turn it off
mov.l _master_cctl,r0
mov #0x10,r1
mov.b r1,@r0
! clear bss
mov #0,r0
mov.l _master_bss_start,r1
mov.l _master_bss_end,r2
0:
mov.l r0,@r1
cmp/eq r1,r2
bf/s 0b
add #4,r1
! wait for 68000 to finish init
mov.l _master_sts,r0
mov.l _master_ok,r1
1:
mov.l @r0,r2
nop
nop
cmp/eq r1,r2
bt 1b
! do all initializers
mov.l _master_do_init,r0
jsr @r0
nop
! let Slave SH2 run
mov #0,r1
mov.l r1,@(4,r0) /* clear slave status */
mov #0x80,r0
mov.l _master_adapter,r1
mov.b r0,@r1 /* set FM */
mov #0x00,r0
mov.b r0,@(1,r1) /* set int enables */
mov #0x20,r0
ldc r0,sr /* allow ints */
! purge cache, turn it on, and run main()
mov.l _master_cctl,r0
mov #0x11,r1
mov.b r1,@r0
mov.l _master_go,r0
jsr @r0
nop
! do all finishers
mov.l _master_do_fini,r0
jsr @r0
nop
2:
bra 2b
nop
.align 2
_master_int_clr:
.long 0x2000401E /* one word passed last int clr reg */
_master_stk:
.long 0x0603FC00 /* Cold Start SP */
_master_sts:
.long 0x20004020
_master_ok:
.ascii "M_OK"
_master_adapter:
.long 0x20004000
_master_cctl:
.long 0xFFFFFE92
_master_go:
.long _main
_master_bss_start:
.long __bss_start
_master_bss_end:
.long __bss_end
_master_do_init:
.long __INIT_SECTION__
_master_do_fini:
.long __FINI_SECTION__
scont:
! clear interrupt flags
mov.l _slave_int_clr,r1
mov.w r0,@-r1 /* PWM INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* CMD INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* H INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* V INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* VRES INT clear */
mov.w r0,@r1
mov.l _slave_stk,r15
! wait for Master SH2 and 68000 to finish init
mov.l _slave_sts,r0
mov.l _slave_ok,r1
1:
mov.l @r0,r2
nop
nop
cmp/eq r1,r2
bt 1b
mov.l _slave_adapter,r1
mov #0x00,r0
mov.b r0,@(1,r1) /* set int enables (different from master despite same address!) */
mov #0x20,r0
ldc r0,sr /* allow ints */
! purge cache, turn it on, and run slave()
mov.l _slave_cctl,r0
mov #0x11,r1
mov.b r1,@r0
mov.l _slave_go,r0
jmp @r0
nop
.align 2
_slave_int_clr:
.long 0x2000401E /* one word passed last int clr reg */
_slave_stk:
.long 0x06040000 /* Cold Start SP */
_slave_sts:
.long 0x20004024
_slave_ok:
.ascii "S_OK"
_slave_adapter:
.long 0x20004000
_slave_cctl:
.long 0xFFFFFE92
_slave_go:
.long _slave
! Master exception handler
main_err:
rte
nop
! Master IRQ handler
main_irq:
mov.l r0,@-r15
stc sr,r0 /* SR holds IRQ level in I3-I0 */
shlr2 r0
and #0x38,r0
cmp/eq #0x28,r0
bt main_h_irq
cmp/eq #0x18,r0
bt main_pwm_irq
cmp/eq #0x30,r0
bt main_v_irq
cmp/eq #0x20,r0
bt main_cmd_irq
cmp/eq #0x38,r0
bt main_vres_irq
mov.l @r15+,r0
rte
nop
main_v_irq:
mov.l r1,@-r15
mov.l mvi_mars_adapter,r1
mov.w r0,@(0x16,r1) /* clear V IRQ */
nop
nop
nop
nop
! handle V IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
mvi_mars_adapter:
.long 0x20004000
main_h_irq:
mov.l r1,@-r15
mov.l mhi_mars_adapter,r1
mov.w r0,@(0x18,r1) /* clear H IRQ */
nop
nop
nop
nop
! handle H IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
mhi_mars_adapter:
.long 0x20004000
main_cmd_irq:
mov.l r1,@-r15
mov.l mci_mars_adapter,r1
mov.w r0,@(0x1A,r1) /* clear CMD IRQ */
nop
nop
nop
nop
! handle CMD IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
mci_mars_adapter:
.long 0x20004000
main_pwm_irq:
mov.l r1,@-r15
mov.l mpi_mars_adapter,r1
mov.w r0,@(0x1C,r1) /* clear PWM IRQ */
nop
nop
nop
nop
! handle PWM IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
mpi_mars_adapter:
.long 0x20004000
main_vres_irq:
mov.l mvri_mars_adapter,r1
mov.w r0,@(0x14,r1) /* clear VRES IRQ */
nop
nop
nop
nop
mov #0x0F,r0
shll2 r0
shll2 r0
ldc r0,sr /* disallow ints */
mov.l mvri_master_stk,r15
mov.l mvri_master_vres,r0
jmp @r0
nop
.align 2
mvri_mars_adapter:
.long 0x20004000
mvri_master_stk:
.long 0x0603FC00 /* Cold Start SP */
mvri_master_vres:
.long main_reset
! Slave exception handler
slav_err:
rte
nop
! Slave IRQ handler
slav_irq:
mov.l r0,@-r15
stc sr,r0 /* SR holds IRQ level I3-I0 */
shlr2 r0
and #0x38,r0
cmp/eq #0x28,r0
bt slav_h_irq
cmp/eq #0x18,r0
bt slav_pwm_irq
cmp/eq #0x30,r0
bt slav_v_irq
cmp/eq #0x20,r0
bt slav_cmd_irq
cmp/eq #0x38,r0
bt slav_vres_irq
mov.l @r15+,r0
rte
nop
slav_v_irq:
mov.l r1,@-r15
mov.l svi_mars_adapter,r1
mov.w r0,@(0x16,r1) /* clear V IRQ */
nop
nop
nop
nop
! handle V IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
svi_mars_adapter:
.long 0x20004000
slav_h_irq:
mov.l r1,@-r15
mov.l shi_mars_adapter,r1
mov.w r0,@(0x18,r1) /* clear H IRQ */
nop
nop
nop
nop
! handle H IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
shi_mars_adapter:
.long 0x20004000
slav_cmd_irq:
mov.l r1,@-r15
mov.l sci_mars_adapter,r1
mov.w r0,@(0x1A,r1) /* clear CMD IRQ */
nop
nop
nop
nop
! handle CMD IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
sci_mars_adapter:
.long 0x20004000
slav_pwm_irq:
mov.l r1,@-r15
mov.l spi_mars_adapter,r1
mov.w r0,@(0x1C,r1) /* clear PWM IRQ */
nop
nop
nop
nop
! handle PWM IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
spi_mars_adapter:
.long 0x20004000
slav_vres_irq:
mov.l svri_mars_adapter,r1
mov.w r0,@(0x14,r1) /* clear VRES IRQ */
nop
nop
nop
nop
mov #0x0F,r0
shll2 r0
shll2 r0
ldc r0,sr /* disallow ints */
mov.l svri_slave_stk,r15
mov.l svri_slave_vres,r0
jmp @r0
nop
.align 2
svri_mars_adapter:
.long 0x20004000
svri_slave_stk:
.long 0x06040000 /* Cold Start SP */
svri_slave_vres:
.long slav_reset
! Fast memcpy function - copies longs, runs from sdram for speed
! On entry: r4 = dst, r5 = src, r6 = len (in longs)
.align 4
.global _fast_memcpy
_fast_memcpy:
mov.l @r5+,r3
mov.l r3,@r4
dt r6
bf/s _fast_memcpy
add #4,r4
rts
nop
! Cache clear line function
! On entry: r4 = ptr - should be 16 byte aligned
.align 4
.global _CacheClearLine
_CacheClearLine:
mov.l _cache_flush,r0
or r0,r4
mov #0,r0
mov.l r0,@r4
rts
nop
.align 2
_cache_flush:
.long 0x40000000
! Cache control function
! On entry: r4 = cache mode => 0x10 = CP, 0x08 = TW, 0x01 = CE
.align 4
.global _CacheControl
_CacheControl:
mov.l _sh2_cctl,r0
mov.b r4,@r0
rts
nop
.align 2
_sh2_cctl:
.long 0xFFFFFE92
.align 2
.text
main_reset:
! do any master SH2 specific reset code here
mov.l slav_st,r0
mov.l slav_ok,r1
0:
mov.l @r0,r2
nop
nop
cmp/eq r1,r2
bf 0b /* wait for slave */
! recopy rom data to sdram
mov.l rom_header,r1
mov.l @r1,r2 /* src relative to start of rom */
mov.l @(4,r1),r3 /* dst relative to start of sdram */
mov.l @(8,r1),r4 /* size (longword aligned) */
mov.l rom_start,r1
add r1,r2
mov.l sdram_start,r1
add r1,r3
shlr2 r4 /* number of longs */
add #-1,r4
1:
mov.l @r2+,r0
mov.l r0,@r3
add #4,r3
dt r4
bf 1b
mov.l main_st,r0
mov.l main_ok,r1
mov.l r1,@r0 /* tell everyone reset complete */
mov.l main_go,r0
jmp @r0
nop
slav_reset:
! do any slave SH2 specific reset code here
mov.l slav_st,r0
mov.l slav_ok,r1
mov.l r1,@r0 /* tell master to start reset */
mov.l main_st,r0
mov.l main_ok,r1
0:
mov.l @r0,r2
nop
nop
cmp/eq r1,r2
bf 0b /* wait for master to do the work */
mov.l slav_go,r0
jmp @r0
nop
.align 2
main_st:
.long 0x20004020
main_ok:
.ascii "M_OK"
main_go:
.long mstart
rom_header:
.long 0x220003D4
rom_start:
.long 0x22000000
sdram_start:
.long 0x26000000
slav_st:
.long 0x20004024
slav_ok:
.ascii "S_OK"
slav_go:
.long sstart
.global _start
_start:

View File

@ -1,132 +0,0 @@
ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro)
endif
.SUFFIXES:
#---------------------------------------------------------------------------------
# Configurable options
#---------------------------------------------------------------------------------
# Name of the final output
TARGET = ClassiCube-3ds
# List of directories containing source code
SOURCE_DIRS = src src/3ds third_party/bearssl
# List of directories containing shader files
SHDR_DIRS = misc/3ds
# Directory where object files are placed
BUILD_DIR = build/3ds
APP_ICON = misc/3ds/icon.png
APP_TITLE = ClassiCube
APP_DESCRIPTION = Simple block building sandbox
APP_AUTHOR = ClassiCube team
CIA_BANNER_BIN = misc/3ds/banner.bin
CIA_ICON_BIN = misc/3ds/icon.bin
CIA_SPEC_RSF = misc/3ds/spec.rsf
#---------------------------------------------------------------------------------
# Compilable files
#---------------------------------------------------------------------------------
S_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.S))
C_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c))
OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.S=%.o)))
PICAFILES := $(foreach dir,$(SHDR_DIRS),$(notdir $(wildcard $(dir)/*.v.pica)))
OBJS += $(addprefix $(BUILD_DIR)/, $(PICAFILES:.v.pica=.shbin.o))
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(OBJS:%.o=%.d)
#---------------------------------------------------------------------------------
# Code generation
#---------------------------------------------------------------------------------
ARCH = -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft
CFLAGS = -g -Wall -O2 -mword-relocations -ffunction-sections $(ARCH) $(INCLUDE) -D__3DS__ -DPLAT_3DS
ASFLAGS = -g $(ARCH)
LDFLAGS = -specs=3dsx.specs -g $(ARCH)
LIBS = -lctru -lm
INCLUDES=
CTRULIB = $(DEVKITPRO)/libctru
INCLUDES += $(foreach dir, $(CTRULIB), -I$(dir)/include)
LDFLAGS += $(foreach dir,$(CTRULIB), -L$(dir)/lib)
#---------------------------------------------------------------------------------
# Compiler tools
#---------------------------------------------------------------------------------
PREFIX := $(DEVKITPRO)/devkitARM/bin/arm-none-eabi-
ARM_AS := $(PREFIX)as
ARM_CC := $(PREFIX)gcc
ARM_CXX := $(PREFIX)g++
_DSXTOOL := $(DEVKITPRO)/tools/bin/3dsxtool
SMDHTOOL := $(DEVKITPRO)/tools/bin/smdhtool
PICASSO := $(DEVKITPRO)/tools/bin/picasso
BIN2S := $(DEVKITPRO)/tools/bin/bin2s
#---------------------------------------------------------------------------------
# Main targets
#---------------------------------------------------------------------------------
default: $(BUILD_DIR) $(TARGET).cia
clean:
rm $(TARGET).cia $(TARGET).3dsx $(TARGET).elf $(OBJS)
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# Executable generation
#---------------------------------------------------------------------------------
$(TARGET).elf: $(OBJS)
$(ARM_CC) $(LDFLAGS) $^ -o $@ $(LIBS)
$(BUILD_DIR).smdh: $(APP_ICON)
$(SMDHTOOL) --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@
$(TARGET).3dsx: $(TARGET).elf $(BUILD_DIR).smdh
$(_DSXTOOL) $< $@ --smdh=$(BUILD_DIR).smdh
$(BUILD_DIR)/makerom:
wget https://github.com/3DSGuy/Project_CTR/releases/download/makerom-v0.18.3/makerom-v0.18.3-ubuntu_x86_64.zip -O $(BUILD_DIR)/makerom.zip
unzip $(BUILD_DIR)/makerom.zip -d $(BUILD_DIR)
chmod +x $(BUILD_DIR)/makerom
$(TARGET).cia : $(TARGET).3dsx $(BUILD_DIR)/makerom
$(BUILD_DIR)/makerom -f cia -o $(TARGET).cia -elf $(TARGET).elf -rsf $(CIA_SPEC_RSF) -icon $(CIA_ICON_BIN) -banner $(CIA_BANNER_BIN) -exefslogo -target t
#---------------------------------------------------------------------------------
# Object generation
#---------------------------------------------------------------------------------
$(BUILD_DIR)/%.o: src/%.c
$(ARM_CC) $(CFLAGS) $(INCLUDES) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: src/3ds/%.c
$(ARM_CC) $(CFLAGS) $(INCLUDES) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: third_party/bearssl/%.c
$(ARM_CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
$(BUILD_DIR)/%.shbin: misc/3ds/%.v.pica
$(PICASSO) $< -o $@
$(BUILD_DIR)/%.shbin.o: $(BUILD_DIR)/%.shbin
$(BIN2S) $< | $(ARM_CC) -x assembler-with-cpp -c - -o $@
#---------------------------------------------------------------------------------
# Dependency tracking
#---------------------------------------------------------------------------------
$(DEPFILES):
include $(wildcard $(DEPFILES))

View File

@ -1,15 +0,0 @@
To see debug log messages in Citra:
1) Make sure log level set to "Debug.Emulated:Debug"
---
Commands used to generate the .bin files:
`bannertool makebanner -i banner.png -a audio.wav -o banner.bin`
`bannertool makesmdh -s ClassiCube -l ClassiCube -p UnknownShadow200 -i icon.png -o icon.bin`
----
Debug log messages output to debug service, so may be possible to see from console via remote gdb

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@ -1,34 +0,0 @@
; Vertex shader for rendering coloured vertices for PICA200 GPU on the Nintendo 3DS
; ==================================================================================
; Uniforms (layout common to all shaders)
.alias MVP_0 c0
.alias MVP_1 c1
.alias MVP_2 c2
.alias MVP_3 c3
.alias TEX_OFFSET c4
; Constants (initialised in Graphics_3DS.c)
.alias ONE_DIV_255 c5
; Outputs
.out out_pos position
.out out_col color
; Inputs (defined as aliases for convenience)
.alias in_pos v0
.alias in_col v1
.proc main
; out_pos = MVP * in_pos
dp4 out_pos.x, MVP_0, in_pos
dp4 out_pos.y, MVP_1, in_pos
dp4 out_pos.z, MVP_2, in_pos
dp4 out_pos.w, MVP_3, in_pos
; out_col = in_col * ONE_DIV_255
mul out_col, ONE_DIV_255, in_col
end
.end

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,38 +0,0 @@
; Vertex shader for rendering textured vertices with an offset for PICA200 GPU on the Nintendo 3DS
; ==================================================================================
; Uniforms (layout common to all shaders)
.alias MVP_0 c0
.alias MVP_1 c1
.alias MVP_2 c2
.alias MVP_3 c3
.alias TEX_OFFSET c4
; Constants (initialised in Graphics_3DS.c)
.alias ONE_DIV_255 c5
; Outputs
.out out_pos position
.out out_col color
.out out_tex texcoord0
; Inputs (defined as aliases for convenience)
.alias in_pos v0
.alias in_col v1
.alias in_tex v2
.proc main
; out_pos = MVP * in_pos
dp4 out_pos.x, MVP_0, in_pos
dp4 out_pos.y, MVP_1, in_pos
dp4 out_pos.z, MVP_2, in_pos
dp4 out_pos.w, MVP_3, in_pos
; out_col = in_col * ONE_DIV_255
mul out_col, ONE_DIV_255, in_col
; out_tex = in_tex + tex_offset
add out_tex, TEX_OFFSET, in_tex
end
.end

View File

@ -1,204 +0,0 @@
# https://github.com/msikma/3ds-tpl
# https://gist.github.com/jakcron/9f9f02ffd94d98a72632
BasicInfo:
Title : ClassiCube
CompanyCode : "00"
ProductCode : CCBE
ContentType : Application
Logo : Nintendo
TitleInfo:
UniqueId : 0x00CCBE
Category : Application
CardInfo:
MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB / 4GB
MediaType : Card1 # Card1 / Card2
CardDevice : NorFlash # NorFlash(Pick this if you use savedata) / None
Option:
UseOnSD : true # true if App is to be installed to SD
FreeProductCode : true # Removes limitations on ProductCode
MediaFootPadding : false # If true CCI files are created with padding
EnableCrypt : false # Enables encryption for NCCH and CIA
EnableCompress : true # Compresses exefs code
AccessControlInfo:
#UseExtSaveData : true
#ExtSaveDataId: 0xff3ff
#UseExtendedSaveDataAccessControl: true
#AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606]
SystemControlInfo:
SaveDataSize: 128KB
RemasterVersion: 0
StackSize: 0x40000
AccessControlInfo:
FileSystemAccess:
- Debug
- DirectSdmc
- DirectSdmcWrite
IdealProcessor : 0
AffinityMask : 1
Priority : 16
SystemMode : 80MB
MaxCpu : 0x9E # Default
DisableDebug : false
EnableForceDebug : false
CanWriteSharedPage : false
CanUsePrivilegedPriority : false
CanUseNonAlphabetAndNumber : false
PermitMainFunctionArgument : false
CanShareDeviceMemory : false
RunnableOnSleep : false
SpecialMemoryArrange : false
CoreVersion : 2
DescVersion : 2
ReleaseKernelMajor : "02"
ReleaseKernelMinor : "33"
MemoryType : Application
HandleTableSize: 512
# New3DS Exclusive Process Settings
SystemModeExt : 124MB # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode
CpuSpeed : 804MHz # 268MHz(Default)/804MHz
EnableL2Cache : true # false(default)/true
CanAccessCore2 : true
# Virtual Address Mappings
IORegisterMapping:
- 1ff50000-1ff57fff # DSP memory
- 1ff70000-1ff77fff
MemoryMapping:
- 1f000000-1f5fffff # VRAM
SystemCallAccess:
ArbitrateAddress: 34
Break: 60
CancelTimer: 28
ClearEvent: 25
ClearTimer: 29
CloseHandle: 35
ConnectToPort: 45
ControlMemory: 1
CreateAddressArbiter: 33
CreateEvent: 23
CreateMemoryBlock: 30
CreateMutex: 19
CreateSemaphore: 21
CreateThread: 8
CreateTimer: 26
DuplicateHandle: 39
ExitProcess: 3
ExitThread: 9
GetCurrentProcessorNumber: 17
GetHandleInfo: 41
GetProcessId: 53
GetProcessIdOfThread: 54
GetProcessIdealProcessor: 6
GetProcessInfo: 43
GetResourceLimit: 56
GetResourceLimitCurrentValues: 58
GetResourceLimitLimitValues: 57
GetSystemInfo: 42
GetSystemTick: 40
GetThreadContext: 59
GetThreadId: 55
GetThreadIdealProcessor: 15
GetThreadInfo: 44
GetThreadPriority: 11
MapMemoryBlock: 31
OutputDebugString: 61
QueryMemory: 2
ReleaseMutex: 20
ReleaseSemaphore: 22
SendSyncRequest1: 46
SendSyncRequest2: 47
SendSyncRequest3: 48
SendSyncRequest4: 49
SendSyncRequest: 50
SetThreadPriority: 12
SetTimer: 27
SignalEvent: 24
SleepThread: 10
UnmapMemoryBlock: 32
WaitSynchronization1: 36
WaitSynchronizationN: 37
InterruptNumbers:
# Service List
# Maximum 34 services (32 if firmware is prior to 9.3.0)
ServiceAccessControl:
- APT:U
- $hioFIO
- $hostio0
- $hostio1
- ac:u
- boss:U
- cam:u
- cecd:u
- cfg:u
- dlp:FKCL
- dlp:SRVR
- dsp::DSP
- frd:u
- fs:USER
- gsp::Gpu
- hid:USER
- mic:u
- ndm:u
- news:s
- nwm::UDS
- ptm:u
- pxi:dev
- soc:U
- gsp::Lcd
- y2r:u
- ldr:ro
- ir:USER
- ir:u
- csnd:SND
- am:u
- ns:s
SystemControlInfo:
# Modules that run services listed above should be included below
# Maximum 48 dependencies
# If a module is listed that isn't present on the 3DS, the title will get stuck at the logo (3ds waves)
# So act, nfc and qtm are commented for 4.x support. Uncomment if you need these.
# <module name>:<module titleid>
Dependency:
ac: 0x0004013000002402L
am: 0x0004013000001502L
boss: 0x0004013000003402L
camera: 0x0004013000001602L
cecd: 0x0004013000002602L
cfg: 0x0004013000001702L
codec: 0x0004013000001802L
csnd: 0x0004013000002702L
dlp: 0x0004013000002802L
dsp: 0x0004013000001a02L
friends: 0x0004013000003202L
gpio: 0x0004013000001b02L
gsp: 0x0004013000001c02L
hid: 0x0004013000001d02L
i2c: 0x0004013000001e02L
ir: 0x0004013000003302L
mcu: 0x0004013000001f02L
mic: 0x0004013000002002L
ndm: 0x0004013000002b02L
news: 0x0004013000003502L
nim: 0x0004013000002c02L
nwm: 0x0004013000002d02L
pdn: 0x0004013000002102L
ps: 0x0004013000003102L
ptm: 0x0004013000002202L
ro: 0x0004013000003702L
socket: 0x0004013000002e02L
spi: 0x0004013000002302L

View File

@ -1,38 +0,0 @@
; Vertex shader for rendering textured vertices for PICA200 GPU on the Nintendo 3DS
; ==================================================================================
; Uniforms (layout common to all shaders)
.alias MVP_0 c0
.alias MVP_1 c1
.alias MVP_2 c2
.alias MVP_3 c3
.alias TEX_OFFSET c4
; Constants (initialised in Graphics_3DS.c)
.alias ONE_DIV_255 c5
; Outputs
.out out_pos position
.out out_col color
.out out_tex texcoord0
; Inputs (defined as aliases for convenience)
.alias in_pos v0
.alias in_col v1
.alias in_tex v2
.proc main
; out_pos = MVP * in_pos
dp4 out_pos.x, MVP_0, in_pos
dp4 out_pos.y, MVP_1, in_pos
dp4 out_pos.z, MVP_2, in_pos
dp4 out_pos.w, MVP_3, in_pos
; out_col = in_col * ONE_DIV_255
mul out_col, ONE_DIV_255, in_col
; out_tex = in_tex
mov out_tex, in_tex
end
.end

1
misc/CCicon.rc Normal file
View File

@ -0,0 +1 @@
1 ICON "CCicon.ico"

Binary file not shown.

View File

@ -0,0 +1,21 @@
* Blocks over 256 are not saved or loaded at all.
* Custom block information for blocks over 256 is not saved or loaded at all.
* /hold 0 prevents you deleting blocks until you change to another.
* Sometimes when holding air and your own model is a block model, you crash.
* Labels and buttons overlap in launcher with some fonts. (e.g. Lucida Console)
* terrain.png with width under 16 insta-crash the game
* catbox.moe texture packs/terrain.png links insta-crash the game
* Sometimes you randomly crash reading leveldatachunk packet on OSX
* Models with size of over 2 are not supported at all
* Direct3D9 backend uses an ill-formed vertex format that works by accident
* Alt text doesn't update its Y position if you click on chat
* Menu inputs (save, edit hotkey, water level, etc) are reset on window resize
* Chat input caret is reset on window resize
* Position in chat (if you scrolled up into history) is reset on window resize
* Two blank lines get shown in chat when you type /client cuboid
* Alt text is closed on window resize
* Changing server texture packs sometimes still retains textures from previous one
* Crashes at startup when another process has exclusively acquired Direct3D9 device
* Can't bind controls to mouse buttons
* Does not work at all on 64 bit macOS
* Making a gas block undeletable doesn't prevent placing blocks over it

View File

@ -0,0 +1,5 @@
Here lies ClassicalSharp, the original C# client. (works with Mono and .NET framework 2.0)
It has unfixed bugs and missing features. There's no reason to use it anymore.
For licensing, please see license.txt inside ClassicalSharp.zip.
Absolutely no support or assistance will be provided for ClassicalSharp.

View File

@ -84,12 +84,12 @@ static const char PS_SOURCE[] =
" if (color.a < 0.5) { discard; return color; } \n" \
"#endif \n" \
"#ifdef PS_FOG_LINEAR \n" \
" float depth = input.position.w; \n" \
" float depth = input.position.z * input.position.w; \n" \
" float fog = saturate((fogEnd - depth) / fogEnd); \n" \
" color.rgb = lerp(fogColor, color.rgb, fog); \n" \
"#endif \n" \
"#ifdef PS_FOG_DENSITY \n" \
" float depth = input.position.w; \n" \
" float depth = input.position.z * input.position.w; \n" \
" float fog = saturate(exp(fogDensity * depth)); \n" \
" color.rgb = lerp(fogColor, color.rgb, fog); \n" \
"#endif \n" \

View File

@ -1,51 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.32002.261
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ClassiCube-UWP", "ClassiCube-UWP.vcxproj", "{A901236D-C8EF-4041-966F-46F17511E342}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|ARM.ActiveCfg = Debug|ARM
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|ARM.Build.0 = Debug|ARM
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|ARM.Deploy.0 = Debug|ARM
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|ARM64.ActiveCfg = Debug|ARM64
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|ARM64.Build.0 = Debug|ARM64
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|ARM64.Deploy.0 = Debug|ARM64
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|x64.ActiveCfg = Debug|x64
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|x64.Build.0 = Debug|x64
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|x64.Deploy.0 = Debug|x64
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|x86.ActiveCfg = Debug|Win32
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|x86.Build.0 = Debug|Win32
{A901236D-C8EF-4041-966F-46F17511E342}.Debug|x86.Deploy.0 = Debug|Win32
{A901236D-C8EF-4041-966F-46F17511E342}.Release|ARM.ActiveCfg = Release|ARM
{A901236D-C8EF-4041-966F-46F17511E342}.Release|ARM.Build.0 = Release|ARM
{A901236D-C8EF-4041-966F-46F17511E342}.Release|ARM.Deploy.0 = Release|ARM
{A901236D-C8EF-4041-966F-46F17511E342}.Release|ARM64.ActiveCfg = Release|ARM64
{A901236D-C8EF-4041-966F-46F17511E342}.Release|ARM64.Build.0 = Release|ARM64
{A901236D-C8EF-4041-966F-46F17511E342}.Release|ARM64.Deploy.0 = Release|ARM64
{A901236D-C8EF-4041-966F-46F17511E342}.Release|x64.ActiveCfg = Release|x64
{A901236D-C8EF-4041-966F-46F17511E342}.Release|x64.Build.0 = Release|x64
{A901236D-C8EF-4041-966F-46F17511E342}.Release|x64.Deploy.0 = Release|x64
{A901236D-C8EF-4041-966F-46F17511E342}.Release|x86.ActiveCfg = Release|Win32
{A901236D-C8EF-4041-966F-46F17511E342}.Release|x86.Build.0 = Release|Win32
{A901236D-C8EF-4041-966F-46F17511E342}.Release|x86.Deploy.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AB4A9C28-F91F-439E-8D2E-E54273138ADC}
EndGlobalSection
EndGlobal

View File

@ -1,432 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Globals">
<ProjectGuid>{a901236d-c8ef-4041-966f-46f17511e342}</ProjectGuid>
<RootNamespace>ClassiCube_UWP</RootNamespace>
<DefaultLanguage>en-US</DefaultLanguage>
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
<AppContainerApplication>true</AppContainerApplication>
<ApplicationType>Windows Store</ApplicationType>
<WindowsTargetPlatformVersion Condition=" '$(WindowsTargetPlatformVersion)' == '' ">10.0.20348.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>
<ApplicationTypeRevision>10.0</ApplicationTypeRevision>
<AppxPackageSigningEnabled>false</AppxPackageSigningEnabled>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM">
<Configuration>Debug</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM">
<Configuration>Release</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v142</PlatformToolset>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v142</PlatformToolset>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v142</PlatformToolset>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v142</PlatformToolset>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<ClCompile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<LanguageStandard>stdcpp17</LanguageStandard>
<CompileAs>Default</CompileAs>
<CompileAsWinRT>false</CompileAsWinRT>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<ClCompile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<LanguageStandard>stdcpp17</LanguageStandard>
<CompileAs>Default</CompileAs>
<CompileAsWinRT>false</CompileAsWinRT>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<ClCompile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<LanguageStandard>stdcpp17</LanguageStandard>
<CompileAs>Default</CompileAs>
<CompileAsWinRT>false</CompileAsWinRT>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<ClCompile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<LanguageStandard>stdcpp17</LanguageStandard>
<CompileAs>Default</CompileAs>
<CompileAsWinRT>false</CompileAsWinRT>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<LanguageStandard>stdcpp17</LanguageStandard>
<CompileAs>Default</CompileAs>
<CompileAsWinRT>false</CompileAsWinRT>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<LanguageStandard>stdcpp17</LanguageStandard>
<CompileAs>Default</CompileAs>
<CompileAsWinRT>false</CompileAsWinRT>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<LanguageStandard>stdcpp17</LanguageStandard>
<CompileAs>Default</CompileAs>
<CompileAsWinRT>false</CompileAsWinRT>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<LanguageStandard>stdcpp17</LanguageStandard>
<CompileAs>Default</CompileAs>
<CompileAsWinRT>false</CompileAsWinRT>
</ClCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\src\Animations.c" />
<ClCompile Include="..\..\src\Audio.c" />
<ClCompile Include="..\..\src\Audio_OpenAL.c" />
<ClCompile Include="..\..\src\AxisLinesRenderer.c" />
<ClCompile Include="..\..\src\Bitmap.c" />
<ClCompile Include="..\..\src\Block.c" />
<ClCompile Include="..\..\src\BlockPhysics.c" />
<ClCompile Include="..\..\src\Builder.c" />
<ClCompile Include="..\..\src\Camera.c" />
<ClCompile Include="..\..\src\Certs.c" />
<ClCompile Include="..\..\src\Chat.c" />
<ClCompile Include="..\..\src\Commands.c" />
<ClCompile Include="..\..\src\Deflate.c" />
<ClCompile Include="..\..\src\Drawer.c" />
<ClCompile Include="..\..\src\Drawer2D.c" />
<ClCompile Include="..\..\src\Entity.c" />
<ClCompile Include="..\..\src\EntityComponents.c" />
<ClCompile Include="..\..\src\EntityRenderers.c" />
<ClCompile Include="..\..\src\EnvRenderer.c" />
<ClCompile Include="..\..\src\Event.c" />
<ClCompile Include="..\..\src\ExtMath.c" />
<ClCompile Include="..\..\src\FancyLighting.c" />
<ClCompile Include="..\..\src\Formats.c" />
<ClCompile Include="..\..\src\Game.c" />
<ClCompile Include="..\..\src\GameVersion.c" />
<ClCompile Include="..\..\src\Generator.c" />
<ClCompile Include="..\..\src\Graphics_D3D11.c" />
<ClCompile Include="..\..\src\Gui.c" />
<ClCompile Include="..\..\src\HeldBlockRenderer.c" />
<ClCompile Include="..\..\src\Http_Worker.c" />
<ClCompile Include="..\..\src\Input.c" />
<ClCompile Include="..\..\src\InputHandler.c" />
<ClCompile Include="..\..\src\Inventory.c" />
<ClCompile Include="..\..\src\IsometricDrawer.c" />
<ClCompile Include="..\..\src\Launcher.c" />
<ClCompile Include="..\..\src\LBackend.c" />
<ClCompile Include="..\..\src\LBackend_Android.c" />
<ClCompile Include="..\..\src\Lighting.c" />
<ClCompile Include="..\..\src\Logger.c" />
<ClCompile Include="..\..\src\LScreens.c" />
<ClCompile Include="..\..\src\LWeb.c" />
<ClCompile Include="..\..\src\LWidgets.c" />
<ClCompile Include="..\..\src\MapRenderer.c" />
<ClCompile Include="..\..\src\MenuOptions.c" />
<ClCompile Include="..\..\src\Menus.c" />
<ClCompile Include="..\..\src\Model.c" />
<ClCompile Include="..\..\src\Options.c" />
<ClCompile Include="..\..\src\PackedCol.c" />
<ClCompile Include="..\..\src\Particle.c" />
<ClCompile Include="..\..\src\Physics.c" />
<ClCompile Include="..\..\src\Picking.c" />
<ClCompile Include="..\..\src\Protocol.c" />
<ClCompile Include="..\..\src\Queue.c" />
<ClCompile Include="..\..\src\Resources.c" />
<ClCompile Include="..\..\src\Screens.c" />
<ClCompile Include="..\..\src\SelectionBox.c" />
<ClCompile Include="..\..\src\SelOutlineRenderer.c" />
<ClCompile Include="..\..\src\Server.c" />
<ClCompile Include="..\..\src\SSL.c" />
<ClCompile Include="..\..\src\Stream.c" />
<ClCompile Include="..\..\src\String.c" />
<ClCompile Include="..\..\src\SystemFonts.c" />
<ClCompile Include="..\..\src\TexturePack.c" />
<ClCompile Include="..\..\src\TouchUI.c" />
<ClCompile Include="..\..\src\Utils.c" />
<ClCompile Include="..\..\src\UWP\Platform_UWP.cpp" />
<ClCompile Include="..\..\src\UWP\Window_UWP.cpp" />
<ClCompile Include="..\..\src\Vectors.c" />
<ClCompile Include="..\..\src\Vorbis.c" />
<ClCompile Include="..\..\src\Widgets.c" />
<ClCompile Include="..\..\src\World.c" />
<ClCompile Include="..\..\third_party\bearssl\aesctr_drbg.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_big_cbcdec.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_big_cbcenc.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_big_ctr.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_big_ctrcbc.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_big_dec.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_big_enc.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_common.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni_cbcdec.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni_cbcenc.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni_ctr.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni_ctrcbc.c" />
<ClCompile Include="..\..\third_party\bearssl\asn1enc.c" />
<ClCompile Include="..\..\third_party\bearssl\ccm.c" />
<ClCompile Include="..\..\third_party\bearssl\ccopy.c" />
<ClCompile Include="..\..\third_party\bearssl\chacha20_ct.c" />
<ClCompile Include="..\..\third_party\bearssl\chacha20_sse2.c" />
<ClCompile Include="..\..\third_party\bearssl\dec32be.c" />
<ClCompile Include="..\..\third_party\bearssl\dec32le.c" />
<ClCompile Include="..\..\third_party\bearssl\dec64be.c" />
<ClCompile Include="..\..\third_party\bearssl\dec64le.c" />
<ClCompile Include="..\..\third_party\bearssl\dig_oid.c" />
<ClCompile Include="..\..\third_party\bearssl\dig_size.c" />
<ClCompile Include="..\..\third_party\bearssl\ecdsa_atr.c" />
<ClCompile Include="..\..\third_party\bearssl\ecdsa_default_vrfy_asn1.c" />
<ClCompile Include="..\..\third_party\bearssl\ecdsa_default_vrfy_raw.c" />
<ClCompile Include="..\..\third_party\bearssl\ecdsa_i31_bits.c" />
<ClCompile Include="..\..\third_party\bearssl\ecdsa_i31_vrfy_asn1.c" />
<ClCompile Include="..\..\third_party\bearssl\ecdsa_i31_vrfy_raw.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_all_m31.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_c25519_i31.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_c25519_m31.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_c25519_m62.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_c25519_m64.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_curve25519.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_default.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_p256_m31.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_p256_m62.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_p256_m64.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_prime_i31.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_secp256r1.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_secp384r1.c" />
<ClCompile Include="..\..\third_party\bearssl\ec_secp521r1.c" />
<ClCompile Include="..\..\third_party\bearssl\enc32be.c" />
<ClCompile Include="..\..\third_party\bearssl\enc32le.c" />
<ClCompile Include="..\..\third_party\bearssl\enc64be.c" />
<ClCompile Include="..\..\third_party\bearssl\enc64le.c" />
<ClCompile Include="..\..\third_party\bearssl\gcm.c" />
<ClCompile Include="..\..\third_party\bearssl\ghash_ctmul.c" />
<ClCompile Include="..\..\third_party\bearssl\ghash_ctmul64.c" />
<ClCompile Include="..\..\third_party\bearssl\ghash_pclmul.c" />
<ClCompile Include="..\..\third_party\bearssl\hmac.c" />
<ClCompile Include="..\..\third_party\bearssl\hmac_ct.c" />
<ClCompile Include="..\..\third_party\bearssl\hmac_drbg.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_add.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_bitlen.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_decmod.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_decode.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_decred.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_encode.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_fmont.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_iszero.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_moddiv.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_modpow.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_modpow2.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_montmul.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_mulacc.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_muladd.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_ninv31.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_reduce.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_rshift.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_sub.c" />
<ClCompile Include="..\..\third_party\bearssl\i31_tmont.c" />
<ClCompile Include="..\..\third_party\bearssl\i32_div32.c" />
<ClCompile Include="..\..\third_party\bearssl\i62_modpow2.c" />
<ClCompile Include="..\..\third_party\bearssl\md5.c" />
<ClCompile Include="..\..\third_party\bearssl\md5sha1.c" />
<ClCompile Include="..\..\third_party\bearssl\multihash.c" />
<ClCompile Include="..\..\third_party\bearssl\poly1305_ctmul.c" />
<ClCompile Include="..\..\third_party\bearssl\poly1305_ctmulq.c" />
<ClCompile Include="..\..\third_party\bearssl\prf.c" />
<ClCompile Include="..\..\third_party\bearssl\prf_md5sha1.c" />
<ClCompile Include="..\..\third_party\bearssl\prf_sha256.c" />
<ClCompile Include="..\..\third_party\bearssl\prf_sha384.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_default_pkcs1_vrfy.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_default_priv.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_default_pub.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_i31_pkcs1_vrfy.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_i31_priv.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_i31_pub.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_i62_pkcs1_vrfy.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_i62_priv.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_i62_pub.c" />
<ClCompile Include="..\..\third_party\bearssl\rsa_pkcs1_sig_unpad.c" />
<ClCompile Include="..\..\third_party\bearssl\sha1.c" />
<ClCompile Include="..\..\third_party\bearssl\sha2big.c" />
<ClCompile Include="..\..\third_party\bearssl\sha2small.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_client.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_client_default_rsapub.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_client_full.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_engine.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_aescbc.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_aesccm.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_aesgcm.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_chapol.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_ec.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_ecdsa.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_rsavrfy.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_hashes.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_hs_client.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_io.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_rec_cbc.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_rec_ccm.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_rec_chapol.c" />
<ClCompile Include="..\..\third_party\bearssl\ssl_rec_gcm.c" />
<ClCompile Include="..\..\third_party\bearssl\x509_minimal.c" />
<ClCompile Include="..\..\third_party\bearssl\x509_minimal_full.c" />
</ItemGroup>
<ItemGroup>
<Image Include="Assets\Square150x150Logo.scale-200.png">
<DeploymentContent>true</DeploymentContent>
</Image>
<Image Include="Assets\Square44x44Logo.scale-200.png">
<DeploymentContent>true</DeploymentContent>
</Image>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,445 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Common">
<UniqueIdentifier>a901236d-c8ef-4041-966f-46f17511e342</UniqueIdentifier>
</Filter>
<Filter Include="BearSSL">
<UniqueIdentifier>{93fa4266-80e4-4bbf-a7fa-c47e07da5098}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\src\Animations.c" />
<ClCompile Include="..\..\src\Audio.c" />
<ClCompile Include="..\..\src\AxisLinesRenderer.c" />
<ClCompile Include="..\..\src\Bitmap.c" />
<ClCompile Include="..\..\src\Block.c" />
<ClCompile Include="..\..\src\BlockPhysics.c" />
<ClCompile Include="..\..\src\Builder.c" />
<ClCompile Include="..\..\src\Camera.c" />
<ClCompile Include="..\..\src\Chat.c" />
<ClCompile Include="..\..\src\Commands.c" />
<ClCompile Include="..\..\src\Deflate.c" />
<ClCompile Include="..\..\src\Drawer.c" />
<ClCompile Include="..\..\src\Drawer2D.c" />
<ClCompile Include="..\..\src\Entity.c" />
<ClCompile Include="..\..\src\EntityComponents.c" />
<ClCompile Include="..\..\src\EntityRenderers.c" />
<ClCompile Include="..\..\src\EnvRenderer.c" />
<ClCompile Include="..\..\src\Event.c" />
<ClCompile Include="..\..\src\ExtMath.c" />
<ClCompile Include="..\..\src\FancyLighting.c" />
<ClCompile Include="..\..\src\Formats.c" />
<ClCompile Include="..\..\src\Game.c" />
<ClCompile Include="..\..\src\GameVersion.c" />
<ClCompile Include="..\..\src\Generator.c" />
<ClCompile Include="..\..\src\Gui.c" />
<ClCompile Include="..\..\src\HeldBlockRenderer.c" />
<ClCompile Include="..\..\src\Http_Worker.c" />
<ClCompile Include="..\..\src\Input.c" />
<ClCompile Include="..\..\src\InputHandler.c" />
<ClCompile Include="..\..\src\Inventory.c" />
<ClCompile Include="..\..\src\IsometricDrawer.c" />
<ClCompile Include="..\..\src\Launcher.c" />
<ClCompile Include="..\..\src\LBackend.c" />
<ClCompile Include="..\..\src\LBackend_Android.c" />
<ClCompile Include="..\..\src\Lighting.c" />
<ClCompile Include="..\..\src\Logger.c" />
<ClCompile Include="..\..\src\LScreens.c" />
<ClCompile Include="..\..\src\LWeb.c" />
<ClCompile Include="..\..\src\LWidgets.c" />
<ClCompile Include="..\..\src\MapRenderer.c" />
<ClCompile Include="..\..\src\MenuOptions.c" />
<ClCompile Include="..\..\src\Menus.c" />
<ClCompile Include="..\..\src\Model.c" />
<ClCompile Include="..\..\src\Options.c" />
<ClCompile Include="..\..\src\PackedCol.c" />
<ClCompile Include="..\..\src\Particle.c" />
<ClCompile Include="..\..\src\Physics.c" />
<ClCompile Include="..\..\src\Picking.c" />
<ClCompile Include="..\..\src\Protocol.c" />
<ClCompile Include="..\..\src\Queue.c" />
<ClCompile Include="..\..\src\Resources.c" />
<ClCompile Include="..\..\src\Screens.c" />
<ClCompile Include="..\..\src\SelectionBox.c" />
<ClCompile Include="..\..\src\SelOutlineRenderer.c" />
<ClCompile Include="..\..\src\Server.c" />
<ClCompile Include="..\..\src\SSL.c" />
<ClCompile Include="..\..\src\Stream.c" />
<ClCompile Include="..\..\src\String.c" />
<ClCompile Include="..\..\src\SystemFonts.c" />
<ClCompile Include="..\..\src\TexturePack.c" />
<ClCompile Include="..\..\src\TouchUI.c" />
<ClCompile Include="..\..\src\Utils.c" />
<ClCompile Include="..\..\src\Vectors.c" />
<ClCompile Include="..\..\src\Vorbis.c" />
<ClCompile Include="..\..\src\Widgets.c" />
<ClCompile Include="..\..\src\World.c" />
<ClCompile Include="..\..\src\Graphics_D3D11.c" />
<ClCompile Include="..\..\src\UWP\Platform_UWP.cpp" />
<ClCompile Include="..\..\src\UWP\Window_UWP.cpp" />
<ClCompile Include="..\..\src\Audio_OpenAL.c" />
<ClCompile Include="..\..\src\Certs.c" />
<ClCompile Include="..\..\third_party\bearssl\aes_big_cbcdec.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_big_cbcenc.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_big_ctr.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_big_ctrcbc.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_big_dec.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_big_enc.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_common.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni_cbcdec.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni_cbcenc.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni_ctr.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aes_x86ni_ctrcbc.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\aesctr_drbg.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\asn1enc.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ccm.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ccopy.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\chacha20_ct.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\chacha20_sse2.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\dec32be.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\dec32le.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\dec64be.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\dec64le.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\dig_oid.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\dig_size.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_all_m31.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_c25519_i31.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_c25519_m31.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_c25519_m62.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_c25519_m64.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_curve25519.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_default.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_p256_m31.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_p256_m62.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_p256_m64.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_prime_i31.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_secp256r1.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_secp384r1.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ec_secp521r1.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ecdsa_atr.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ecdsa_default_vrfy_asn1.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ecdsa_default_vrfy_raw.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ecdsa_i31_bits.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ecdsa_i31_vrfy_asn1.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ecdsa_i31_vrfy_raw.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\enc32be.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\enc32le.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\enc64be.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\enc64le.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\gcm.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ghash_ctmul.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ghash_ctmul64.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ghash_pclmul.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\hmac.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\hmac_ct.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\hmac_drbg.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_add.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_bitlen.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_decmod.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_decode.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_decred.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_encode.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_fmont.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_iszero.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_moddiv.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_modpow.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_modpow2.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_montmul.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_mulacc.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_muladd.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_ninv31.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_reduce.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_rshift.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_sub.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i31_tmont.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i32_div32.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\i62_modpow2.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\md5.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\md5sha1.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\multihash.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\poly1305_ctmul.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\poly1305_ctmulq.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\prf.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\prf_md5sha1.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\prf_sha256.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\prf_sha384.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_default_pkcs1_vrfy.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_default_priv.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_default_pub.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_i31_pkcs1_vrfy.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_i31_priv.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_i31_pub.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_i62_pkcs1_vrfy.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_i62_priv.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_i62_pub.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\rsa_pkcs1_sig_unpad.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\sha1.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\sha2big.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\sha2small.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_client.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_client_default_rsapub.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_client_full.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_engine.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_aescbc.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_aesccm.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_aesgcm.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_chapol.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_ec.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_ecdsa.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_engine_default_rsavrfy.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_hashes.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_hs_client.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_io.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_rec_cbc.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_rec_ccm.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_rec_chapol.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\ssl_rec_gcm.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\x509_minimal.c">
<Filter>BearSSL</Filter>
</ClCompile>
<ClCompile Include="..\..\third_party\bearssl\x509_minimal_full.c">
<Filter>BearSSL</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Image Include="Assets\Square44x44Logo.scale-200.png" />
<Image Include="Assets\Square150x150Logo.scale-200.png" />
</ItemGroup>
</Project>

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
IgnorableNamespaces="uap mp">
<Identity
Name="64f1d536-965b-4190-90d3-47d861786f88"
Publisher="CN=ClassiCube"
Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="64f1d536-965b-4190-90d3-47d861786f88" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>ClassiCube-UWP</DisplayName>
<PublisherDisplayName>ClassiCube</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="ClassiCube_UWP.App">
<uap:VisualElements
DisplayName="ClassiCube-UWP"
Description="ClassiCube-UWP"
BackgroundColor="transparent" Square44x44Logo="Assets\Square44x44Logo.png" Square150x150Logo="Assets\Square150x150Logo.png">
<uap:DefaultTile>
<uap:ShowNameOnTiles>
<uap:ShowOn Tile="square150x150Logo"/>
</uap:ShowNameOnTiles>
</uap:DefaultTile>
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
</Capabilities>
</Package>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

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